droppy
Version:
Self-hosted file storage
1,554 lines (1,326 loc) • 33.8 kB
CSS
@charset "UTF-8";
/* ============================= Global styles ============================= */
body, div, a, header, input, button, label, li, nav, p, section, span, ul, figure, figcaption, img {
box-sizing: border-box;
font-family: inherit;
font-size: 100%;
line-height: normal;
font-weight: inherit;
text-size-adjust: 100%;
vertical-align: baseline;
-webkit-touch-callout: none;
margin: 0;
padding: 0;
border: 0;
}
svg { fill: currentColor }
svg use > svg { all: inherit } /* https://bugzilla.mozilla.org/show_bug.cgi?id=1298557 */
button { color: inherit }
li { list-style: none }
a { text-decoration: none; background: transparent }
:focus, a:active, a:hover { outline: none }
select, textarea { font-family: inherit; font-size: 100%; margin: 0 }
button, input { line-height: normal }
::-moz-focus-inner { border: none; padding: 0; outline: none }
::-moz-focus-outer { border: none }
::selection { background: #05a; color: #fff }
input::placeholder { color: #999; opacity: 1 }
/* de-style inputs[type=search] in Safari */
input[type="search"] {
-webkit-appearance: textfield;
}
input[type="search"]::-webkit-search-decoration,
input[type="search"]::-webkit-search-cancel-button,
input[type="search"]::-webkit-search-results-button,
input[type="search"]::-webkit-search-results-decoration {
display: none;
}
@media screen and (max-resolution: 1.99dppx) {
nav, .path, .tip:before {
-moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased;
}
}
/* =============================== Animations ============================== */
@keyframes shake {
0%, 50%, 100% { transform: translateX(-5px) }
25%, 75% { transform: translateX(5px) }
}
@keyframes spin {
from { transform: rotate(0deg) }
to { transform: rotate(359deg) }
}
/* ============================ Main Page Layout =========================== */
main {
position: absolute;
left: 0; right: 0; top: 0; bottom: 0;
flex-direction: column;
}
nav {
background: #181818;
text-align: center;
order: 1;
flex: 0 0 1.5rem;
display: flex;
white-space: nowrap;
user-select: none;
}
/* ================================== View ================================= */
.view {
position: absolute;
bottom: 0; left: 0; right: 0; top: 0;
display: flex;
flex-direction: column;
}
.content-container {
position: relative;
overflow: auto;
flex: 1;
order: 2;
}
.view.left { left:0; right:50% }
.view.right { left:50%; right:0 }
.view.right .content.directory { border-left: 1px solid #ccc }
.view.left .prefs, .view.left .about, .view.left .logout { display: none }
.content {
left: 0;
width: 100%;
transition: transform .175s;
transform: translateX(0);
}
.content.directory {
background: #eee;
display: flex;
flex-direction: column;
}
.content.media, .content.document {
height: 100%;
background: #0a0a0a;
position: absolute;
overflow: hidden;
}
.content.back { z-index: 0; position:absolute; transform: translateX(-100%) }
.content.forward { z-index: 0; position:absolute; transform: translateX(100%) }
/* ================================== Path ================================= */
.path {
box-shadow: 0 0 .5em rgba(0,0,0,.15);
overflow: hidden;
white-space: nowrap;
width: 100%;
z-index: 1;
flex: 0 0 1.5rem;
order: 1;
font-size: .9rem;
position: relative;
}
.path .triangle {
position: absolute;
height: 1.5rem;
width: 1.5rem;
right: -.88rem;
}
.path .home {
height: .8rem;
width: .8rem;
position: relative;
top: -2px;
vertical-align: middle;
}
.path li {
color: #ccc;
cursor: pointer;
display: inline-block;
line-height: 1.5rem;
opacity: 0;
position: relative;
transform: translateX(-2em);
transition: .2s;
}
.path li.in { opacity: 1; transform: translateX(0) }
.path li .triangle { transition: .2s }
@media (min-width: 1024px) { .path li { padding: 0 .4em 0 1.6em } }
@media (max-width: 1023px) { .path li { padding: 0 .2em 0 1.4em } }
.path li:hover .home { fill: #fff }
.path li:first-of-type { padding-left: .5em }
.path li:nth-child(odd) { background: #404040 }
.path li:nth-child(odd) .triangle { fill: #404040 }
.path li:nth-child(even) { background: #2d2d2d }
.path li:nth-child(even) .triangle { fill: #2d2d2d }
.path li:nth-child(odd):hover { background: #812; color: #fff }
.path li:nth-child(odd):hover .triangle { fill: #812 }
.path li:nth-child(even):hover { background: #25a; color: #fff }
.path li:nth-child(even):hover .triangle { fill: #25a }
.path li:nth-child(1) { z-index: 16 }
.path li:nth-child(2) { z-index: 15 }
.path li:nth-child(3) { z-index: 14 }
.path li:nth-child(4) { z-index: 13 }
.path li:nth-child(5) { z-index: 12 }
.path li:nth-child(6) { z-index: 11 }
.path li:nth-child(7) { z-index: 10 }
.path li:nth-child(8) { z-index: 9 }
.path li:nth-child(9) { z-index: 8 }
.path li:nth-child(10) { z-index: 7 }
.path li:nth-child(11) { z-index: 6 }
.path li:nth-child(12) { z-index: 5 }
.path li:nth-child(13) { z-index: 4 }
.path li:nth-child(14) { z-index: 3 }
.path li:nth-child(15) { z-index: 2 }
.path li:nth-child(16) { z-index: 1 }
.path li.dirty { color: #f71 }
.path li.saved { background: #361 }
.path li.saved svg { fill: #361 }
.path li.save-failed { background: #b44 }
.path li.save-failed svg { fill: #b44 }
.path li.dirty:after { content: "*"; position: absolute; }
.path li a {
max-width: calc(100vw - 4rem);
overflow: hidden;
display: inline-block;
white-space: nowrap;
text-overflow: ellipsis;
line-height: 1.5rem;
}
.view.left .path li a, .view.right .path li a {
max-width: calc(50vw - 4rem);
}
/* ========================= File/Folder Display =========================== */
.paste-button {
background: #333;
text-align: center;
position: absolute;
white-space: nowrap;
z-index: 445;
color: #bbb;
padding: 0 .25em;
right: 0;
top: 1.5rem;
cursor: pointer;
transition: opacity .3s, visibility 0s .3s;
user-select: none;
opacity: 0; visibility: hidden;
line-height: 1.5rem;
}
.paste-button.in { opacity: 1; visibility: visible; transition: opacity .3s }
.paste-button .triangle {
position: absolute;
transform: rotate(180deg);
fill: #333;
}
.paste-button .triangle {
position: absolute;
height: 1.5rem;
width: 1.5rem;
left: -.875rem;
}
.paste-button svg.paste {
display: inline-block;
vertical-align: middle;
position: relative;
top: -.05em;
margin-right: .25em;
}
.paste-button:hover svg.triangle {fill: #25a }
.paste-button:hover { background: #25a; color: #fff }
.paste-button .filename { color: #fff }
#overlay {
background: #000;
position: absolute;
left: 0; right: 0; top: 0; bottom: 0;
z-index: 31;
opacity: 0;
visibility: hidden;
user-select: none;
transition: .15s;
}
#overlay.in { opacity: .4; visibility: visible }
.file-header {
display: flex;
order: -1;
color: #555;
font-size: .8rem;
height: 1.3em;
border-bottom: 1px solid #bbb;
background: #e0e0e0;
user-select: none;
align-items: center;
padding: 0 .1rem;
}
.file-header span {
white-space: nowrap;
cursor: pointer;
}
.file-header .triangle {
height: .5em;
width: .5em;
margin-left: .25em;
transition: .3s;
}
.file-header .down .triangle { transform: rotate(90deg); top: -.15em }
.file-header .up .triangle { transform: rotate(270deg); top: -.05em }
.file-header .active { color: #000 }
.header-name, .entry-link, .inline-namer {
flex: 1 1;
overflow: hidden;
}
.header-name {
margin-left: .25rem;
}
.header-mtime, .mtime {
flex: 0 0 6rem;
justify-content: flex-end;
white-space: nowrap;
}
.header-size, .size {
flex: 0 0 6rem;
display: inline-block;
justify-content: flex-end;
white-space: nowrap;
}
.header-line-buttons, .line-buttons {
flex: 0 0 4.5rem;
justify-content: flex-end;
}
.readonly .header-line-buttons, .readonly .line-buttons {
flex: 0 0 3.5rem;
}
.line-buttons svg {
cursor: pointer;
fill: #555;
padding: 0 1px;
margin: .15rem 0;
}
.line-buttons span:hover svg, .line-buttons a:hover svg { fill: #000 }
.line-buttons svg.menu {width: .75rem}
.icon-play svg, .icon-view svg {
width: 24px; height: 24px;
margin-top: .25rem;
visibility: hidden;
cursor: pointer;
}
.playable:not(.playing):hover .icon-play svg,
.viewable:hover .icon-view svg {
visibility: visible;
}
.playable:not(.playing):hover .sprite,
.viewable:hover .sprite {
background: none;
}
.data-row {
display: flex;
padding: 0 .1rem;
}
.data-row.editing.invalid input { color: #d22 }
.data-row.editing .entry-link { display: none }
.data-row, .data-row a { color: #333 }
.data-row:not(.playing):not(.animating):not(.editing):hover,
.data-row:not(.playing):not(.animating):not(.editing).active {
background: #e3e3e3;
}
.data-row.playing {
background: #05a;
}
.data-row.playing a.entry-link, .playing span { color: #fff }
.data-row.playing svg { fill: #ccc }
.data-row.playing svg:hover { fill: #fff }
.data-row.editing { background: #f8f8f8 }
.data-row > *, .file-header > *, .line-buttons > * {
display: flex;
align-items: center;
align-self: stretch;
}
.entry-link {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
cursor: pointer;
display: block; /* needed for ellipsis */
line-height: 1.3 /* fix centering because of display:block */;
}
.error-link {
cursor: default ;
color: #f44 ;
}
.inline-namer {
background: transparent;
padding: .1rem 0;
}
/* Hide certain list elements when width gets too small */
@media (max-width: 639px) {
.header-line-buttons, .line-buttons { flex: 0 0 4rem }
.line-buttons svg { padding: 0 }
.header-size, .size { flex: 0 0 3.25rem }
.header-mtime, .mtime { display: none }
}
@media (max-width: 319px) {
.header-size, .size { display: none }
.line-buttons { flex: 0 0 3.5rem }
}
/* Hide them sooner when the view is split */
@media (max-width: 1365px) {
.left .header-line-buttons, .right .header-line-buttons,
.left .line-buttons, .right .line-buttons { flex: 0 0 3.5rem }
.left .line-buttons svg, .right .line-buttons svg { padding: 0 }
.left .header-size, .right .header-size,
.left .size, .right .size { flex: 0 0 3.25rem }
.left .header-mtime, .right .header-mtime,
.left .mtime, .right .mtime { display: none }
}
@media (max-width: 799px) {
.left .header-size, .right .header-size,
.left .size, .right .size { display: none }
.left .line-buttons, .right .line-buttons { flex: 0 0 3rem }
}
/* ============================= Empty Folder ============================== */
.empty, .noresults {
text-align: center;
cursor: pointer;
overflow: hidden;
padding: 1em 0;
order: 2;
}
.empty svg {
height: 70px;
width: 70px;
transition: .3s;
position: relative;
bottom: -12px;
}
.empty .text {
position: relative;
top: -25px;
opacity: 0;
transition: .3s;
}
.noresults { color: #333 }
.empty { color: #666 }
.empty:hover svg { opacity: 1; bottom: 0; fill: #333 }
.empty:hover .text { opacity: 1; top: -5px; color: #333 }
/* ================================= Icons ================================= */
.sprite {
flex: 0 0 24px;
height: 24px;
background-size: 240px 216px;
align-self: center;
}
@media (min-width: 1024px) { .sprite { transform: scale(1.4); margin: 0 .4em } }
@media (max-width: 1023px) { .sprite { transform: scale(1.2); margin: .05em .2em } }
@media (max-width: 639px) { .sprite { transform: scale(1); margin: .05em .1em } }
.spinner {
position: absolute;
right: 0;
top: 0;
z-index: 16;
height: 1.5rem;
width: 1.5rem;
visibility: hidden;
pointer-events: none;
fill: #bbb;
}
.spinner.in { visibility: visible; animation: spin .75s infinite linear }
@media (max-width: 639px) { .spinner { height: 1.25rem; width: 1.25rem; top: 0 } }
/* ============================= View Nav ============================== */
.view-nav {
display: flex;
flex: 0 0 1.5rem;
user-select: none;
justify-content: space-between;
}
.view-nav-left, .view-nav-right {
display: flex;
}
.button {
width: 2rem;
background: transparent;
color: #ccc;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
}
.search {
display: none;
align-items: center;
position: relative;
color: rgba(255,255,255,.8);
font-size: .8rem;
}
.view[data-type="directory"] .search {
display: flex;
}
.view[data-type="directory"] .content-container {
background: #eee;
}
.search svg {
left: 0;
top: .4rem;
fill: $greya;
cursor: pointer;
}
.search input {
background: transparent;
padding: .125rem 0;
margin-left: .25rem;
width: 0;
color: #fff;
transition: width .1s;
}
.search.toggled-on input {
width: 6rem;
border-bottom: 1px solid #ccc;
}
.search:hover svg, .search input:hover + svg, .search input:focus + svg,
.search input:active + svg {
fill: #fff;
}
@media (max-width: 800px) {
.view.left .button, .view.right .button { width: 1.5rem }
}
@media (max-width: 530px) {
.view.left .button, .view.right .button { width: auto; margin: 0 1px }
}
@media (max-width: 400px) {
.button { width: 1.5rem }
}
.button + .button { border-left: none }
.af:hover { color: rgb(102,166,255) }
.ad:hover { color: rgb(255,102,252) }
.cf:hover { color: rgb(102,255,235) }
.cd:hover { color: rgb(102,255,125) }
.about:hover { color: rgb(148,102,255) }
.prefs:hover { color: rgb(255,212,102) }
.logout:hover { color: rgb(255, 82, 82) }
.newview:hover { color: rgb(255,166,100) }
.reload:hover { color: rgb( 70,140,240) }
.reload { display: none; }
.nowatch .view[data-type="directory"] .reload { display: flex; }
.button.disabled { color: #444 ; cursor: not-allowed }
.button.disabled:hover { color: #444 ; background: transparent }
.button.disabled:hover svg { fill: #444 }
/* ============================ Entry Menu ============================ */
#entry-menu {
background: #eee;
border-radius: 4px;
box-shadow: 0 8px 24px rgba(0,0,0,.3);
opacity: 0;
position: absolute;
overflow: hidden;
user-select: none;
visibility: hidden;
cursor: pointer;
z-index: 32;
}
#entry-menu.in { opacity: 1; visibility: visible }
html:not(.mobile) #entry-menu a:hover,
html:not(.mobile) #entry-menu a.active {
background: #05a;
color: #fff;
}
#entry-menu a {
padding: .25em .35em;
color: #333;
display: flex;
align-items: center;
}
#entry-menu svg {
margin-right: .25em;
float: left;
}
#entry-menu a.play, #entry-menu.type-folder a.edit {
display: none;
}
#entry-menu.type-audio .play {
display: block;
}
.readonly a.rename, .readonly a.copy, .readonly a.cut, .readonly a.delete,
.readonly .af, .readonly .ad, .readonly .cf, .readonly .cd,
.readonly .movefile, .readonly .copyfile, .public .logout,
.readonly .sidebar .save, .readonly .delete-file {
display: none ;
}
/* ============================ Media View ============================ */
.pswp__container {
transition: .25s;
}
.pswp__bg {
background: #0a0a0a ;
}
.pswp__top-bar {
background: rgba(0,0,0,.6) ;
height: 1.4rem ;
pointer-events: none;
color: #e6e6e6;
z-index: 1;
}
.pswp__button {
opacity: 1;
background: none ;
}
.pswp__button svg {
pointer-events: none;
}
.pswp__counter {
opacity: 1 ;
color: inherit ;
font-size: 1rem ;
font-family: sans-serif;
line-height: 1.5rem ;
}
.pswp__top-bar .pswp__button, .pswp__counter {
pointer-events: auto;
background: none;
opacity: 1;
}
.pswp__top-bar, .pswp__ui {
transition: all .4s ease-in-out ;
}
.pswp__ui--idle {
transform: translateY(-1.5rem) ;
}
.pswp__top-bar svg {
height: 34px;
width: 34px;
}
.pswp__button--zoom:hover { color: #f82 }
.pswp__button--close:hover { color: #d44 }
.pswp__button--fs:hover { color: #ff4 }
.fit-h:hover { color: #18f }
.fit-v:hover { color: #5c5 }
.autonext, .loop { color: #666 }
.on { color: #fff }
.pswp__button--arrow--left:before,
.pswp__button--arrow--right:before {
background: none ;
content: normal ;
}
.pswp__button--arrow--left, .pswp__button--arrow--right {
width: 3em;
cursor: pointer;
color: rgba(255,255,255,.5);
stroke: rgba(0,0,0,.5);
stroke-width: 8;
top: 1.4rem ;
height: calc(100% - 2.8rem) ;
margin-top: 0 ;
}
.pswp__button--arrow--left svg, .pswp__button--arrow--right svg {
height: 2em;
width: 2em;
position: absolute;
transition: .25s;
}
.pswp__button--arrow--left svg { transform: rotate(270deg) translateX(50%); left: -.25em }
.pswp__button--arrow--right svg { transform: rotate(90deg) translateX(-50%); right: -.25em }
.pswp__button--arrow--left:hover svg { height: 2.5em; width: 2.5em; left: -.5em; color: #fff; stroke: #000 }
.pswp__button--arrow--right:hover svg { height: 2.5em; width: 2.5em; right: -.5em; color: #fff; stroke: #000 }
.pswp__item {
overflow-x: hidden ;
overflow-y: auto ;
}
/* ================================= Video ================================= */
.plyr__video-wrapper {
background: none ;
}
.plyr--video .plyr__controls {
padding: .1rem 0 ;
background: rgba(0,0,0,.6) ;
}
.plyr__volume {
margin-right: .25rem ;
}
:fullscreen .plyr__video-wrapper--fixed-ratio {
height: 100vh ;
padding-bottom: 0 ;
}
video {
height: calc(100vh - 3rem) ;
}
:fullscreen video {
height: 100vh ;
}
/* ============================ Document ============================ */
.view[data-type="document"] ::-webkit-scrollbar {
background: transparent ;
max-width: 6px ;
max-height: 6px ;
}
.view[data-type="document"] ::-webkit-scrollbar-thumb {
background: rgba(128,128,128,.5) ;
}
.view[data-type="document"] ::-webkit-scrollbar-thumb:hover {
background: #18f ;
}
.CodeMirror {
line-height: 1.2em ;
height: 100% ;
width: 100% ;
}
/* Need some weight to override some themes */
.content div.CodeMirror { font-size: 16px }
.CodeMirror, .CodeMirror-diaglog input {
font-family: SFMono-Regular, "Source Code Pro", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace ;
}
.CodeMirror-scrollbar-filler { background: transparent }
.CodeMirror-lines { padding: 0 }
.CodeMirror-dialog-top { border-bottom: 1px solid #383838; top: 0 }
.CodeMirror-dialog-bottom { border-top: 1px solid #383838; bottom: 0 }
.CodeMirror-dialog {
position: absolute;
left: 0; right: 0;
background: #282828;
z-index: 15;
padding: .1em .8em;
overflow: hidden;
color: #aaa;
white-space: nowrap;
}
.CodeMirror-dialog input {
border: none;
outline: none;
background: transparent;
width: 20em ;
color: #eee;
}
.CodeMirror-dialog button {
background: #181818;
padding: .05rem .2rem;
color: #eee;
}
.CodeMirror-dialog button:hover {
background: #383838;
}
.sidebar {
position: absolute;
top: .25em;
right: 0;
width: 2.5em;
user-select: none;
}
.sidebar > li {
position: relative;
z-index: 5;
}
.sidebar svg {
fill: rgba(128,128,128,.5);
margin-left: .75em;
}
.sidebar span {
display: block;
text-align: center;
opacity: 0;
font-size: .7em;
position: relative;
top: -.3em;
}
.sidebar > li:hover { cursor: pointer }
.sidebar > li:hover span { color: #fff; opacity: 1 }
.sidebar > .exit:hover svg { fill: #d44 }
.sidebar > .save:hover svg { fill: #5c5 }
.sidebar > .dl:hover svg { fill: #71f }
.sidebar > .ww:hover svg { fill: #18f }
.sidebar > .syntax:hover svg, .sidebar > .syntax.in svg { fill: #f82 }
.sidebar > .syntax.in span { color: #fff; opacity: 1 }
.sidebar > .find:hover svg { fill: #a4c }
.sidebar > .full:hover svg { fill: #ff4 }
.mode-select {
background: #282828;
border: none;
box-shadow: 0 8px 16px rgba(0,0,0,.6);
border-radius: 2px;
color: #ccc;
font-size: .8em;
margin-top: -2.85em;
padding: .7em 3em .7em .5em;
position: absolute;
right: 0;
visibility: hidden;
z-index: 4;
appearance: none;
}
.mode-select.in { visibility: visible }
/* ============================ Upload Progress ============================ */
.upload-info {
background: #181818;
color: #eee;
transition: flex-basis .2s;
width: 100%;
position: relative;
display: flex;
flex: 0 0 0;
order: 4;
}
.upload-info.in { flex-basis: 1.5em }
.upload-info > span {
line-height: 1.5em;
position: relative;
z-index: 2;
}
.upload-percentage {
flex: 0 0 2em;
text-align: center;
margin: 0 .5em;
}
.upload-title {
flex: 1;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
}
.upload-time {
text-align: right;
white-space: nowrap;
margin: 0 .25em;
}
.upload-cancel {
transition: color .2s;
cursor: pointer;
flex: 0 0 1.25em;
text-align: center;
}
.upload-bar {
position: absolute;
background: #05a;
top: 0; bottom: 0; left: 0;
transition: width .2s;
width: 0;
z-index: 1;
}
.upload-info svg {
vertical-align: middle;
transition: fill .15s;
position: relative;
top: -.1em;
margin-right: .25em;
}
.upload-cancel:hover { color: #f44 }
.upload-cancel:hover svg.remove { fill: #f44 }
.file { display: none }
/* =============================== Audio Panel =============================== */
.audio-bar {
background: #181818;
box-shadow: 0 0 .5em rgba(0,0,0,.2);
flex: 0 0 0;
order: 3;
display: flex;
position: relative;
transition: flex-basis .15s;
width: 100%;
user-select: none;
overflow: hidden;
}
.audio-bar.in { flex-basis: 1.5em }
.audio-icon {
z-index: 4;
flex: 0 0 1.5em;
}
.audio-icon:first-of-type { margin-left: .25em }
@media (max-width: 639px) { .audio-icon { flex-basis: 1.25em } }
.audio-icon svg {
fill: rgba(255,255,255,.55);
height: 1.125em;
width: 1.125em;
margin: .0625em .125em;
padding: .125em;
pointer-events: none;
}
@media (max-width: 639px) { .audio-icon svg { height: 1em; width: 1em; margin: .125em } }
.audio-icon:hover svg { fill: #fff }
.audio-icon.active svg {
fill: #fff;
background: rgba(255,255,255,.3);
border-radius: 4px;
}
.volume-slider {
z-index: 4;
height: .75em;
transition: flex-basis .2s;
flex: 0 0 0;
margin: .375em 0;
}
.volume-slider.in { flex-basis: 4em; box-shadow: 0 0 0 1px #eee }
.volume-slider-inner {
background: #eee;
height: .75em;
}
.audio-title {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
line-height: 1.5em;
color: #fff;
flex: 1;
z-index: 4;
cursor: default;
}
.seekbar {
position: absolute;
left: 0; right: 0; bottom: 0; top: 0;
transition: .2s;
overflow: visible;
}
.seekbar-played {
position: absolute;
width: 0;
background: #05a;
height: 100%;
z-index: 2;
}
.seekbar-loaded {
position: absolute;
width: 0;
height: 100%;
background: #282d38;
z-index: 1;
}
.audio-bar .time {
z-index: 4;
text-align: right;
margin-right: .25em;
display: block;
color: #999;
line-height: 1.5em;
cursor: default;
}
.time > * { pointer-events: none }
.time-cur, .time-max { color: #fff }
@media (max-width: 639px) { .time-max, .time-sep { visibility: hidden } }
/* =============================== About box =============================== */
#about-box {
background: #eee;
border-radius: 6px;
box-shadow: 0 8px 24px rgba(0,0,0,.3);
color: #333;
height: 150px;
top: 50%;
left: 50%;
opacity: 0;
visibility: hidden;
position: fixed;
transition: .15s, visibility 0s .15s;
transform: translate(-50%, -50%);
width: 300px;
text-align: center;
z-index: 64;
}
#about-box.in { opacity: 1; visibility: visible; transition: .15s }
#about-title {
font-size: 1.3em;
padding: .5em 0 .25em;
}
#about-engine {
font-size: .8em;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
padding-bottom: .25em;
}
#about-copy {
bottom: 0;
font-size: .7em;
margin-bottom: .2em;
width: 300px;
position: absolute;
}
#about-copy a {
padding: 0 .3em;
color: #000;
border: 1px solid transparent;
}
#about-fork {
font-size: .7em;
color: #333;
border-radius: .4em;
}
#about-fork .github {
display: inline-block;
vertical-align: middle;
height: 1em;
margin: 0 .25em .25em 0;
}
#about-fork:hover, #about-fork:hover svg, #about-copy a:hover {
color: #05a;
fill: #05a;
border-radius: 4px;
text-decoration: underline;
}
/* ================================= Prefs ================================ */
#prefs-box {
background: #eee;
border-radius: 6px;
box-shadow: 0 8px 24px rgba(0,0,0,.3);
color: #555;
max-height: 95%;
left: 50%;
top: 50%;
position: fixed;
transition: .15s, visibility 0s .15s;
transform: translate(-50%, -50%);
z-index: 64;
padding: .5em;
overflow-y: auto;
opacity: 0;
visibility: hidden;
}
#prefs-box.in { opacity: 1; visibility: visible; transition: .15s }
@media (min-width: 800px) { #prefs-box { width: 24em } }
@media (max-width: 799px) { #prefs-box { width: 80% } }
#prefs-box li:hover { background: #ddd; color: #000; }
.list-prefs li { display: flex; padding: .125em .25em; border-radius: 3px }
.list-prefs li:first-of-type { margin-top: 0 }
.list-prefs label {
display: inline-block;
white-space: nowrap;
line-height: 1.33em;
flex: 1;
}
@media (max-width: 639px) {
#prefs-box { font-size: .8em }
.list-prefs li {
flex-direction: column;
height: auto;
}
.list-prefs label {
width: 100%;
text-align: center;
margin-bottom: .25em;
line-height: 1em;
}
.list-prefs select {
width: 100%;
margin-bottom: .25em;
}
}
#prefs-box select {
padding: 0 .25em;
border-radius: 3px;
border:none;
color: #555;
background-color: #fff;
background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2NDAiIGhlaWdodD0iNjQwIiB2aWV3Qm94PSIwIDAgNjQwIDY0MCI+PHBhdGggc3R5bGU9ImZpbGw6ICM5OTkiIGQ9Ik0zMjAgMGwtMTQ3LjIgMjMzLjZoMjk0LjM2OGwtMTQ3LjE2OC0yMzMuNnpNMzIwLjAzMiA2NDBsMTQ3LjE2OC0yMzMuNi0yOTQuNC0wLjAzMiAxNDcuMjMyIDIzMy42MzJ6Ij48L3BhdGg+PC9zdmc+");
background-size: 1em;
background-repeat: no-repeat;
background-position: right;
flex: 1;
appearance: none;
}
#prefs-box li:hover select { color: #000 }
.list-user { padding:.3em 0 }
.list-user:before {
content: "Users";
border-bottom: 1px solid #aaa;
margin-bottom: 1px;
color: #333;
padding: .125em;
display: block;
}
.list-user li {
padding: 0 .25em;
line-height: 1.2em;
display: flex;
align-items: center;
justify-content: center;
}
.username {
flex: 1;
display: flex;
align-items: center;
}
.username svg { margin-right: .5rem }
.delete-user {
cursor: pointer;
flex: 0 0 1rem;
display: flex;
}
.delete-user:hover { color: #f44 }
.add-user {
cursor: pointer;
text-align: center;
user-select: none;
}
.add-user svg {
height: .8em;
width: .8em;
margin-right: .25em;
}
/* ============================== Login Form =============================== */
#login-box {
color: #aaa;
background: #181818;
border-radius: 6px;
height: 11rem;
width: 24rem;
position: absolute;
text-align: center;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
box-shadow: 0 .25rem 1rem #000;
border: 1px solid #333;
}
@media (max-width: 639px), (max-height: 399px) {
#login-box {
border-radius: 0;
box-shadow: none;
font-size: .7em;
top: 50%;
left: 50%;
height: 100%;
width: 100%;
margin: 0;
}
}
#form {
position: absolute;
width: 100%;
height: 100%;
}
#firstrun-title {
font-size: 1.3em;
margin-top: 1.5em;
width: 100%;
}
#login-info-box {
line-height: 2.25rem;
background: #202020;
color: #ddd;
border-bottom: 1px solid #333;
border-radius: 5px 5px 0 0;
transition: background .2s;
position: absolute;
top: 0;
width: 100%;
}
#login-info-box svg {
width: 1.4rem;
height: 1.4rem;
display: inline-block;
vertical-align: middle;
margin: 0 .25rem;
}
#login-info-box.error { background: #911; color: #fff }
@media (max-width: 639px), (max-height: 399px) { #login-info-box { border-radius: 0 } }
#login-info {
line-height: 1.75rem;
}
#fields {
position: absolute;
left: 50%;
top: 50%;
width: 80%;
transform: translate(-50%, -50%);
}
#fields input {
background: #202020;
color: #fff;
padding: 0 10px;
height: 2rem;
width: 100%;
border-radius: 3px;
border: 1px solid #383838;
}
#fields input::placeholder { color: #666; opacity: 1 }
#fields input:focus {
background: #282828;
border: 1px solid #404040;
}
#fields input + input {
margin-top: .3rem;
}
#login-box .bottom {
position: absolute;
bottom: 0;
width: 100%;
height: 2.25rem;
display: flex;
background: #202020;
border-top: 1px solid #333;
border-radius: 0 0 5px 5px;
}
#remember, #submit {
line-height: 2.25rem;
background: transparent;
bottom: 0;
cursor: pointer;
user-select: none;
white-space: nowrap;
flex: 1;
}
#remember svg, #submit svg {
display: inline-block;
vertical-align: middle;
position: relative;
top: -.05rem;
margin: 0 .25rem;
}
#remember:hover, #remember:focus, #submit:hover, #submit:focus { color: #fff }
#submit svg { margin-right: .35em }
#remember:not(.checked) svg { fill: transparent }
@media (max-width: 639px), (max-height: 399px) {
#remember, #submit {
border-radius: 0;
}
}
/* =============================== Info Box ================================ */
.info-box {
border-radius: 6px;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
position: absolute;
transition: .15s, visibility 0s .15s;
z-index: 40;
display: flex;
opacity: 0;
color: #333;
background: #eee;
visibility: hidden;
box-shadow: 0 8px 24px rgba(0,0,0,.3);
max-width: 96%;
}
.info-box.in { opacity: 1; visibility: visible; transition: .15s }
.info-box .icon {
display: flex;
width: 3rem;
border-radius: 6px 0 0 6px;
justify-content: center;
align-items: center;
color: #fff;
}
.info-box.link .icon { background: #05a }
.info-box.error .icon { background: #f44 }
.info-box .icon svg {
height: 2em;
width: 2em;
}
.info-box.link span { display: none }
.info-box.error .link-out { display: none }
.info-box span, .link-out {
color: #444;
}
.link-out {
white-space: nowrap;
padding: .25em .5rem;
position: relative;
}
.link-out:after {
content: "";
position: absolute;
right: 0; top: 0; bottom: 0;
width: .5rem;
background: linear-gradient(to right, rgba(255,255,255,0), rgba(255,255,255,1))
}
.info-box span {
flex: 1;
line-height: 1.25em;
padding: .5em;
}
.info-box .link-out {
flex: 1;
line-height: 2.5em;
overflow: hidden;
backface-visibility: hidden;
}
.link-options {
font-size: .8rem;
white-space: nowrap;
justify-content: center;
background: #05a;
color: #fff;
border-radius: 0 6px 6px 0;
cursor: pointer;
user-select: none;
}
.info-box.error .link-options { display: none }
.link-options svg {
margin: 0 .5em 0 .75em;
transition: opacity .2s;
}
.link-options .dl-link:not(.checked) svg { opacity: 0; }
.link-options > div {
height: 1.5rem;
display: flex;
align-items: center;
padding-right: 1em;
}
.link-options > div:first-of-type { border-top-right-radius: 6px }
.link-options > div:last-of-type { border-bottom-right-radius: 6px }
.link-options > div:hover {
background: rgba(255,255,255,.2);
}
/* =========================== Drop Select Menu ============================ */
#drop-select {
position: fixed;
left: 50%;
top: 50%;
width: 12em;
z-index: 34;
transform: translate(-50%, -50%);
background: #fff;
box-shadow: 0 8px 24px rgba(0,0,0,.3);
border-radius: 6px;
visibility: hidden;
opacity: 0;
display: flex;
flex-direction: row;
}
#drop-select.in { opacity: 1; visibility: visible }
#drop-select span {
cursor: pointer;
display: inline-block;
text-align: center;
flex: 1;
line-height: 2em;
}
html:not(.mobile) #drop-select span:hover,
html:not(.mobile) #drop-select span.active {
background: #05a; color: #fff;
}
.movefile:hover, .movefile.active { border-radius: 6px 0 0 6px }
.viewfile:hover, .viewfile.active { border-radius: 0 6px 6px 0 }
.readonly .viewfile:hover, .readonly .viewfile.active { border-radius: 6px }
@media (max-width: 639px) {
#drop-select {
flex-direction: column;
width: 3.5em;
font-size: .8em;
line-height: 1.75em;
}
#drop-select .movefile:hover { border-radius: 6px 6px 0 0 }
#drop-select .viewfile:hover { border-radius: 0 0 6px 6px }
}
/* ============================= Misc Elements ============================= */
.dropzone {
position: absolute;
left: 0; right: 0; bottom: 0; top: 1.5rem;
z-index: 5;
opacity: 0;
visibility: hidden;
pointer-events: none;
background: rgba(0,0,0,.3);
display: flex;
align-items: center;
justify-content: center;
}
@media (max-width: 639px) { .dropzone { top: 1.25rem } }
.dropzone.in { opacity: .9; visibility: visible }
.dropzone svg {
height: 50%;
width: 50%;
fill: #fff;
}
.shake { animation: shake .3s }
.no-transition { transition: none }
.ce {
position: fixed;
overflow: hidden;
width: 1px;
height: 1px;
right: -1px;
bottom: -1px;
}
.pdf-container {
display: flex;
flex-direction: column;
}
.pdf-container > canvas {
padding: 1px;
}