/********************************************************************** * * 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 : */