2024-10-27 11:01:12 +03:00
|
|
|
/**********************************************************************
|
|
|
|
|
*
|
|
|
|
|
* Modern experimental ribbon layout...
|
|
|
|
|
*
|
|
|
|
|
*
|
|
|
|
|
********************************************************* Settings ***/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/********************************************************** Viewer ***/
|
|
|
|
|
.viewer {
|
|
|
|
|
position: relative;
|
|
|
|
|
width: 100vw;
|
|
|
|
|
height: 100vh;
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
|
|
|
|
|
/*border: solid blue 1px;*/
|
|
|
|
|
box-sizing: border-box;
|
|
|
|
|
|
|
|
|
|
user-select: none;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* XXX this is a stub for printing help/docs... */
|
|
|
|
|
@media print {
|
|
|
|
|
|
|
|
|
|
.viewer {
|
|
|
|
|
display: none;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/****************************************** Ribbon set and locator ***/
|
|
|
|
|
.ribbon-set {
|
|
|
|
|
position: absolute;
|
|
|
|
|
display: block;
|
|
|
|
|
|
|
|
|
|
top: 50%;
|
|
|
|
|
left: 50%;
|
|
|
|
|
|
|
|
|
|
/* NOTE: this needs for scaling/zooming to behave correctly and not
|
|
|
|
|
shift the element, when its dimensions change...
|
|
|
|
|
...this is because .ribbon-set will both be used for scaling
|
|
|
|
|
and aligning... */
|
|
|
|
|
transform-origin: top left;
|
|
|
|
|
|
|
|
|
|
will-change: transform;
|
|
|
|
|
}
|
|
|
|
|
.ribbon-locator {
|
|
|
|
|
position: relative;
|
|
|
|
|
|
|
|
|
|
top: 0;
|
|
|
|
|
left: 0;
|
|
|
|
|
|
|
|
|
|
will-change: transform;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/********************************************************** Ribbon ***/
|
|
|
|
|
/* XXX for some reason setting image size in vmin stops this from
|
|
|
|
|
stretching in width... */
|
|
|
|
|
.shadow,
|
|
|
|
|
.ribbon {
|
|
|
|
|
position: relative;
|
|
|
|
|
display: block;
|
|
|
|
|
/* XXX BUG: setting this will mess up new ribbon creation....
|
|
|
|
|
display: inline-block;*/
|
|
|
|
|
height: auto;
|
|
|
|
|
/*min-width: 0px;*/
|
|
|
|
|
width: auto;
|
|
|
|
|
overflow: visible;
|
|
|
|
|
white-space: nowrap;
|
|
|
|
|
font-size: 0;
|
|
|
|
|
|
|
|
|
|
float: left;
|
|
|
|
|
clear: both;
|
|
|
|
|
|
|
|
|
|
background: var(--ribbon-background-color);
|
|
|
|
|
|
|
|
|
|
margin-top: var(--ribbon-margin);
|
|
|
|
|
margin-bottom: var(--ribbon-margin);
|
|
|
|
|
|
|
|
|
|
will-change: transform;
|
|
|
|
|
}
|
|
|
|
|
.ribbon:empty {
|
|
|
|
|
display: none;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* XXX would be good to make this sticky -- always visible... */
|
|
|
|
|
.ribbon[title]:before {
|
|
|
|
|
display: block;
|
|
|
|
|
position: absolute;
|
|
|
|
|
content: attr(title);
|
|
|
|
|
|
|
|
|
|
font-size: 52pt;
|
|
|
|
|
font-style: italic;
|
|
|
|
|
font-weight: bold;
|
|
|
|
|
|
|
|
|
|
color: white;
|
|
|
|
|
text-shadow: black 2px 2px 15px;
|
|
|
|
|
|
|
|
|
|
top: -2pt;
|
|
|
|
|
right: 100%;
|
|
|
|
|
margin-right: 20pt;
|
|
|
|
|
}
|
|
|
|
|
.single-image-mode .ribbon[title]:before {
|
|
|
|
|
display: none;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.base-ribbon-marker {
|
|
|
|
|
position: absolute;
|
|
|
|
|
height: 100%;
|
|
|
|
|
|
|
|
|
|
color: transparent;
|
|
|
|
|
font-size: 20pt;
|
|
|
|
|
font-weight: bold;
|
|
|
|
|
}
|
|
|
|
|
.base-ribbon-marker:after {
|
|
|
|
|
content: "base ribbon";
|
|
|
|
|
|
|
|
|
|
display: block;
|
|
|
|
|
|
|
|
|
|
position: absolute;
|
|
|
|
|
width: var(--image-tile-size);
|
|
|
|
|
bottom: 0px;
|
|
|
|
|
left: 0px;
|
|
|
|
|
padding: 5px;
|
|
|
|
|
box-sizing: border-box;
|
|
|
|
|
|
|
|
|
|
z-index: 1000;
|
|
|
|
|
|
|
|
|
|
color: white;
|
|
|
|
|
background: black;
|
|
|
|
|
opacity: 0.2;
|
|
|
|
|
|
|
|
|
|
font-size: 20pt;
|
|
|
|
|
font-weight: bold;
|
|
|
|
|
|
|
|
|
|
transform-origin: bottom left;
|
|
|
|
|
transform: rotate(-90deg);
|
|
|
|
|
}
|
|
|
|
|
.single-image-mode.viewer .base-ribbon-marker {
|
|
|
|
|
display: none;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*********************************************************** Image ***/
|
|
|
|
|
.marker,
|
|
|
|
|
.current-marker,
|
|
|
|
|
.mark,
|
|
|
|
|
.image {
|
|
|
|
|
position: relative;
|
|
|
|
|
display: inline-block;
|
|
|
|
|
vertical-align: middle;
|
|
|
|
|
text-align:left;
|
|
|
|
|
width: var(--image-tile-size);
|
|
|
|
|
height: var(--image-tile-size);
|
|
|
|
|
font-size: 12pt;
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
|
|
|
|
|
box-sizing: border-box;
|
|
|
|
|
color: white;
|
|
|
|
|
/* XXX do we need this???
|
|
|
|
|
text-shadow:
|
|
|
|
|
black 0.1em 0.1em 0.4em,
|
|
|
|
|
black 0.1em 0.1em; */
|
|
|
|
|
|
|
|
|
|
/* NOTE: we can't set the bg color here because it will get
|
|
|
|
|
affected by filters... */
|
|
|
|
|
background: no-repeat 50% transparent;
|
|
|
|
|
background-size: contain;
|
|
|
|
|
border: solid var(--image-border) transparent;
|
|
|
|
|
|
|
|
|
|
/* XXX we are taking care of this in code -- see if we can use this */
|
|
|
|
|
image-orientation: none;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.image {
|
|
|
|
|
padding: var(--single-image-indicator-size);
|
|
|
|
|
background-color: var(--image-background-color);
|
|
|
|
|
}
|
|
|
|
|
.single-image-mode .image {
|
|
|
|
|
background-color: none;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.image div {
|
|
|
|
|
display: block;
|
|
|
|
|
position: absolute;
|
|
|
|
|
|
|
|
|
|
max-width: var(--image-tile-size);
|
|
|
|
|
width: auto;
|
|
|
|
|
max-height: var(--image-tile-size);
|
|
|
|
|
height: auto;
|
|
|
|
|
|
|
|
|
|
left: 50%;
|
|
|
|
|
top: 50%;
|
|
|
|
|
transform: translate(-50%,-50%);
|
|
|
|
|
|
|
|
|
|
white-space: normal;
|
|
|
|
|
text-align: center;
|
|
|
|
|
text-overflow: ellipsis;
|
|
|
|
|
/*font-size: 2vh;*/
|
|
|
|
|
|
|
|
|
|
pointer-events: none;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.crisp-resize .image {
|
|
|
|
|
image-rendering: -webkit-optimize-contrast;
|
|
|
|
|
image-rendering: crisp-edges;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
.current.image {
|
|
|
|
|
border: solid 5px red;
|
|
|
|
|
}
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/* NOTE: this is essentially a ribbon... */
|
|
|
|
|
.shadow {
|
|
|
|
|
position: absolute;
|
|
|
|
|
overflow: visible;
|
|
|
|
|
|
|
|
|
|
width: auto;
|
|
|
|
|
height: auto;
|
|
|
|
|
margin: 0px;
|
|
|
|
|
|
|
|
|
|
background: black;
|
|
|
|
|
|
|
|
|
|
-webkit-transition: all 0.1s ease-in;
|
|
|
|
|
-moz-transition: all 0.1s ease-in;
|
|
|
|
|
-ms-transition: all 0.1s ease-in;
|
|
|
|
|
-o-transition: all 0.1s ease-in;
|
|
|
|
|
transition: all 0.1s ease-in;
|
|
|
|
|
}
|
|
|
|
|
.shadow {
|
|
|
|
|
-webkit-transform-origin: 0 0;
|
|
|
|
|
-moz-transform-origin: 0 0;
|
|
|
|
|
-ms-transform-origin: 0 0;
|
|
|
|
|
-o-transform-origin: 0 0;
|
|
|
|
|
transform-origin: 0 0;
|
|
|
|
|
}
|
|
|
|
|
.image.moving {
|
|
|
|
|
visibility: hidden;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.current-marker {
|
|
|
|
|
display: none;
|
|
|
|
|
position: absolute;
|
|
|
|
|
border: solid 5px red;
|
|
|
|
|
background: none;
|
|
|
|
|
z-index: 100;
|
|
|
|
|
|
|
|
|
|
top: 0;
|
|
|
|
|
left: 0;
|
|
|
|
|
margin-top: calc(-1 * var(--image-tile-size) / 2);
|
|
|
|
|
margin-left: calc(-1 * var(--image-tile-size) / 2);
|
|
|
|
|
|
|
|
|
|
/* pass events through... (do we need IE10-?) */
|
|
|
|
|
pointer-events: none;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.marker {
|
|
|
|
|
width: 50px;
|
|
|
|
|
border: none;
|
|
|
|
|
background: no-repeat 50% transparent;
|
|
|
|
|
background-color: transparent;
|
|
|
|
|
color: white;
|
|
|
|
|
}
|
|
|
|
|
.marker:after {
|
|
|
|
|
display: block;
|
|
|
|
|
position: absolute;
|
|
|
|
|
content: "marker";
|
|
|
|
|
font-size: 32px;
|
|
|
|
|
font-weight: bold;
|
|
|
|
|
text-align: center;
|
|
|
|
|
overflow: visible;
|
|
|
|
|
|
|
|
|
|
width: 200px;
|
|
|
|
|
height: 32px;
|
|
|
|
|
top: 50%;
|
|
|
|
|
margin-top: -16px;
|
|
|
|
|
left: 50%;
|
|
|
|
|
margin-left: -100px;
|
|
|
|
|
|
|
|
|
|
transform-origin: center center;
|
|
|
|
|
transform: rotate(270deg) scaleY(1) scaleX(1);
|
|
|
|
|
|
|
|
|
|
opacity: 0.5;
|
|
|
|
|
}
|
|
|
|
|
.single-image-mode.viewer .marker {
|
|
|
|
|
display: none;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* single image mode transitions */
|
|
|
|
|
/* XXX still buggy and not too needed...
|
|
|
|
|
.single-image-mode.viewer .image {
|
|
|
|
|
position: absolute;
|
|
|
|
|
top: 0px;
|
|
|
|
|
left: 0px;
|
|
|
|
|
|
|
|
|
|
opacity: 0;
|
|
|
|
|
|
|
|
|
|
.transition(opacity);
|
|
|
|
|
}
|
|
|
|
|
.single-image-mode.viewer .current.image {
|
|
|
|
|
opacity: 1;
|
|
|
|
|
}
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* image turning... */
|
|
|
|
|
/* NOTE: need to account for proportions after turning... */
|
|
|
|
|
.image[orientation="90"] {
|
|
|
|
|
transform: rotate(90deg) scaleY(1) scaleX(1);
|
|
|
|
|
}
|
|
|
|
|
.image[orientation="180"] {
|
|
|
|
|
transform: rotate(180deg) scaleY(1) scaleX(1);
|
|
|
|
|
}
|
|
|
|
|
.image[orientation="270"] {
|
|
|
|
|
transform: rotate(270deg) scaleY(1) scaleX(1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Flipped vertically only... */
|
|
|
|
|
/* NOTE: wee need to do all possible combinations here as we can't
|
|
|
|
|
combine different parts of a transform attr from different
|
|
|
|
|
classes */
|
|
|
|
|
.image[flipped*="vertical"] {
|
|
|
|
|
transform: rotate(0deg) scaleY(1) scaleX(-1);
|
|
|
|
|
}
|
|
|
|
|
.image[orientation="90"][flipped="vertical"] {
|
|
|
|
|
transform: rotate(90deg) scaleY(1) scaleX(-1)
|
|
|
|
|
}
|
|
|
|
|
.image[orientation="180"][flipped="vertical"] {
|
|
|
|
|
transform: rotate(180deg) scaleY(1) scaleX(-1)
|
|
|
|
|
}
|
|
|
|
|
.image[orientation="270"][flipped="vertical"] {
|
|
|
|
|
transform: rotate(270deg) scaleY(1) scaleX(-1)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Flipped horizontally only... */
|
|
|
|
|
.image[flipped*="horizontal"] {
|
|
|
|
|
transform: rotate(0deg) scaleY(-1) scaleX(1);
|
|
|
|
|
}
|
|
|
|
|
.image[orientation="90"][flipped="horizontal"] {
|
|
|
|
|
.transform(90deg, -1)
|
|
|
|
|
}
|
|
|
|
|
.image[orientation="180"][flipped="horizontal"] {
|
|
|
|
|
.transform(180deg, -1)
|
|
|
|
|
}
|
|
|
|
|
.image[orientation="270"][flipped="horizontal"] {
|
|
|
|
|
.transform(270deg, -1)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Flipped vertically and horizontally... */
|
|
|
|
|
.image[flipped*="vertical"][flipped*="horizontal"] {
|
|
|
|
|
transform: rotate(0deg) scaleY(-1) scaleX(-1)
|
|
|
|
|
}
|
|
|
|
|
.image[orientation="90"][flipped*="vertical"][flipped*="horizontal"] {
|
|
|
|
|
transform: rotate(90deg) scaleY(-1) scaleX(-1)
|
|
|
|
|
}
|
|
|
|
|
.image[orientation="180"][flipped*="vertical"][flipped*="horizontal"] {
|
|
|
|
|
transform: rotate(180deg) scaleY(-1) scaleX(-1)
|
|
|
|
|
}
|
|
|
|
|
.image[orientation="270"][flipped*="vertical"][flipped*="horizontal"] {
|
|
|
|
|
transform: rotate(270deg) scaleY(-1) scaleX(-1)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* image separators... */
|
|
|
|
|
.ribbon-image-separators.viewer .image {
|
|
|
|
|
box-shadow:
|
|
|
|
|
9px 4px 0 -8px rgba(128,128,128,0.2),
|
|
|
|
|
-9px 4px 0 -8px rgba(128,128,128,0.2);
|
|
|
|
|
}
|
|
|
|
|
.ribbon-image-separators.viewer .image[orientation="90"],
|
|
|
|
|
.ribbon-image-separators.viewer .image[orientation="270"] {
|
|
|
|
|
box-shadow:
|
|
|
|
|
4px 9px 0 -8px rgba(128,128,128,0.2),
|
|
|
|
|
4px -9px 0 -8px rgba(128,128,128,0.2);
|
|
|
|
|
}
|
|
|
|
|
.ribbon-image-separators.single-image-mode.viewer .image {
|
|
|
|
|
box-shadow: none;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* default backgrounds */
|
|
|
|
|
/* XXX not sure if we need these...
|
|
|
|
|
.image {
|
|
|
|
|
background-image: url(images/loading.gif);
|
|
|
|
|
}
|
|
|
|
|
.image[orientation="90"] {
|
|
|
|
|
background-image: url(images/loading-90deg.gif);
|
|
|
|
|
}
|
|
|
|
|
.image[orientation="180"] {
|
|
|
|
|
background-image: url(images/loading-180deg.gif);
|
|
|
|
|
}
|
|
|
|
|
.image[orientation="270"] {
|
|
|
|
|
background-image: url(images/loading-270deg.gif);
|
|
|
|
|
}
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* separator test */
|
|
|
|
|
/*
|
|
|
|
|
.image.red+.image:not(.red):before {
|
|
|
|
|
display: inline-block;
|
|
|
|
|
position: relative;
|
|
|
|
|
content: "";
|
|
|
|
|
top:0px;
|
|
|
|
|
left: -50px;
|
|
|
|
|
width: 100px;
|
|
|
|
|
height: 100%;
|
|
|
|
|
|
|
|
|
|
background-color: yellow;
|
|
|
|
|
}
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**********************************************************************
|
|
|
|
|
* vim:set spell ft=css : */
|