mirror of
				https://github.com/flynx/ImageGrid.git
				synced 2025-11-03 21:00:14 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			433 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			CSS
		
	
	
	
	
	
			
		
		
	
	
			433 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			CSS
		
	
	
	
	
	
/**********************************************************************
 | 
						|
*
 | 
						|
* 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 :                                             */
 |