mirror of
				https://github.com/flynx/ImageGrid.git
				synced 2025-10-31 19:30:07 +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 :                                             */
 |