main
scss 966 lines 25.8 KB
Raw
1 @use '../../shared/main';
2
3 :root {
4 height: 100dvh; // workarounded chrome109-mobile's problem with sticky-bottom bar moving when scrolling
5
6 --bg: #fff;
7 --text: #555;
8 --text-high-contrast: #111;
9 --link: var(--button-bg);
10 --ghost-contrast: #8882;
11 --ghost-contrast-alt: #eee;
12 --faint-contrast: #ddd;
13 --mild-contrast: #aaa;
14 --good-contrast: #444;
15 --button-bg: #6080aa;
16 --button-text: #eaeaea;
17 --focus-color: #468;
18 --separator: " – "; // fallback
19 --success: #7c7;
20 --warning: #cc7;
21 --error: #c77;
22 @supports (content: "" / "") {
23 --separator: " – " / ""; // skip for screen-reader
24 }
25 .highlightedText { color: #0006; text-shadow: 0 0 3px #0006; }
26 .theme-dark {
27 --bg: #000;
28 --text: #999;
29 --text-high-contrast: #eee;
30 --link: #8ac;
31 --ghost-contrast-alt: #181818;
32 --faint-contrast: #2d2d2d;
33 --good-contrast: #aaa;
34 --button-bg: #345;
35 --button-text: #999;
36 --success: #272;
37 --warning: #772;
38 --error: #a22;
39
40 color-scheme: dark;
41 .highlightedText { color: #fff; text-shadow: 0 0 3px #fff; }
42 .dialog-closer { background: #633 }
43 .dialog-icon {
44 color: #ccc;
45 .icon { color: #aaa; }
46 }
47 #root .dialog-backdrop { background: #333b; }
48 .error-msg { color: #b88; background-color: #623; }
49 button.toggled, a.toggled { color: #eee;
50 text-shadow: 0 0 3px #fff;
51 }
52 }
53 }
54 body {
55 background-color: var(--bg);
56 margin: 0;
57 font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
58 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
59 -webkit-font-smoothing: antialiased;
60 -moz-osx-font-smoothing: grayscale;
61 }
62 body, button, select, input { font-size: 12pt; }
63 .list-wrapper {
64 max-width: 54em;
65 margin: auto;
66 min-height: 100vh;
67 display: flex;
68 flex-direction: column;
69 }
70 body, input {
71 color: var(--text);
72 }
73 code {
74 font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace;
75 }
76 input:not([type=checkbox],[type=range]), select, textarea {
77 padding: 0.3em 0.4em;
78 border-radius: 0.5em;
79 background: var(--bg);
80 border-color: var(--mild-contrast);
81 color: var(--good-contrast);
82 max-width: 100%; box-sizing: border-box; // avoid scrolling
83 width: 100%;
84 }
85 input[type=range] {
86 width: calc(100% - 1px); // chrome116 on android shows a scrollbar because of that 1px
87 }
88 input[type=checkbox] {
89 transform: scale(1.7);
90 accent-color: var(--link); // don't use a dark color here, or chrome on android will fail at using a contrasty color for the checkmark
91 }
92 textarea { font-size: 14pt }
93 label input[type=checkbox] {
94 margin-right: .8em;
95 }
96 select { text-align: center; } // it is surely cooler on the options dialog
97
98 .hidden { display: none !important }
99
100 [class^="fa-"]:before, [class*=" fa-"]:before { /* don't need extra margin on fontello icons */
101 margin: 0;
102 }
103 img.file-icon { height: 1em; }
104 .file-icon {
105 background-size: contain;
106 background-repeat: no-repeat;
107 background-position: center;
108 vertical-align: text-bottom;
109 }
110
111 [role=button] .icon {
112 margin-right: 0.5em;
113 }
114 .icon.mirror:before { transform: scaleX(-1); }
115 a {
116 text-decoration: none;
117 color: var(--link);
118 }
119 button {
120 background-color: var(--button-bg);
121 color: var(--button-text);
122 padding: .4em .6em;
123 display: inline-flex; align-items: center; justify-content: center; // get closer results between chrome and safari
124 &.small { padding: .1em .4em; min-height: 30px; }
125 .icon { margin: -.2em 0; }
126 .font-icon { vertical-align: middle; }
127 border: transparent;
128 text-decoration: none;
129 border-radius: 0.3em;
130 vertical-align: middle;
131 cursor: pointer;
132 &:hover { outline: 1px solid var(--mild-contrast); }
133 transition: background-color .5s;
134 &[disabled] {
135 background-color: var(--faint-contrast);
136 }
137 }
138 button.toggled {
139 color: #fff;
140 text-shadow: 0 0 3px #fff;
141 }
142 button.success {
143 transition: all .3s;
144 background-color: var(--success);
145 @extend .highlightedText;
146 }
147 a[role=button].success {
148 transition: all .3s;
149 color: var(--success);
150 text-shadow: 0 0 3px var(--text-high-contrast);
151 }
152 a.toggled {
153 color: #223;
154 text-shadow: 0 0 5px #223;
155 }
156 button, .breadcrumb { /* consistent focus color */
157 &:focus-visible {
158 outline: 3px solid var(--focus-color);
159 }
160 }
161 a>button { width: 100%; height: 100%; } /* link buttons, fill parent space */
162 input, select, ul a {
163 &:focus {
164 border-radius: .3em;
165 border-color: transparent;
166 outline: 2px solid var(--focus-color);
167 }
168 }
169
170 .icon-button {
171 padding: .1em;
172 font-size: 108%; height: 1.8em; // same height as text buttons (31px)
173 width: 2em;
174 }
175
176 .error-msg {
177 background-color: #faa;
178 color: #833;
179 padding: .5em 1em;
180 }
181 .hide-back {
182 background-color: var(--bg);
183 }
184 header {
185 @extend .hide-back;
186 position: sticky;
187 top: 0;
188 padding: .2em .1em;
189 z-index: 3; // necessary to not be covered by checkboxes
190 }
191
192 kbd {
193 background-color: #eee;
194 border-radius: 3px;
195 border: 1px solid #b4b4b4;
196 box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2), 0 2px 0 0 rgba(255, 255, 255, 0.7) inset;
197 color: #333;
198 display: inline-block;
199 font-size: 0.85em;
200 font-weight: 700;
201 line-height: 1;
202 padding: 2px 4px;
203 white-space: nowrap;
204 margin-right: .5em;
205 }
206 .drop-over {
207 box-shadow: 0 0 .3em .3em var(--warning);
208 }
209
210 .upload-send { @extend .ani-attention }
211
212 .sliding {
213 transition: flex .5s, flex-basis 0.5s ease, opacity 0.5s ease;
214 overflow: hidden !important;
215 }
216 .hide-sliding {
217 white-space: nowrap;
218 margin: 0 !important;
219 flex: 0 !important;
220 }
221
222 .ani-working { animation:2s blink infinite }
223
224 @keyframes spin {
225 100% { transform: rotate(360deg); }
226 }
227 @keyframes fade-in {
228 0% {opacity: 0}
229 100% {opacity: 1}
230 }
231 .ani-attention { animation: attention 2s ease infinite; }
232 @keyframes attention {
233 3% { transform: rotate(2deg); }
234 6% { transform: rotate(-2deg); }
235 9% { transform: rotate(0); }
236 }
237
238
239 .spinner, .icon.spinner:before {
240 animation: 1.5s spin infinite linear;
241 display: inline-flex; justify-content: center; align-items: center; width: min-content;
242 }
243
244 .breadcrumb {
245 padding: 0.1em 0.6em 0.2em;
246 line-height: 1.8em;
247 border-radius: 0.7em;
248 background-color: var(--button-bg);
249 color: var(--button-text);
250
251 border-top: 1px solid #666;
252 margin-right: -0.1em;
253 &:nth-child(-n+3) .icon {
254 padding: 0 0.2em;
255 height: 1em; // effective only on file-icon
256 }
257 }
258 #folder-stats, #filter-bar>span {
259 font-size: 90%;
260 }
261 #folder-stats {
262 margin-left: .5em;
263 line-height: 2em;
264 float: right;
265 .icon {
266 margin-right: .3em;
267 }
268 }
269 #filter {
270 flex: 1;
271 box-sizing: border-box;
272 }
273 #filter-bar {
274 display: flex;
275 align-items: center;
276 gap: .8em;
277 margin: 0.2em 0 0;
278 padding: 2px 0 1px 3px;
279 height: 1.8em; /* necessary to animate displaying */
280 input[type=checkbox] { margin-top: .3em; }
281 span:empty { display:none } /* avoid flex-gap */
282 }
283 #login-options {
284 font-size: smaller;
285 input[type=checkbox] {
286 transform: scale(1.5);
287 }
288 }
289
290 ul.dir {
291 padding: 0;
292 margin: 0;
293 clear: both;
294 &>p { text-align: center; }
295 li {
296 display: block;
297 list-style-type: none;
298 padding: 0.3em 0.3em 0.4em;
299 border-bottom: 1px solid var(--faint-contrast);
300 &:nth-of-type(odd) { background-color: var(--ghost-contrast); }
301
302 .container-folder { font-size: smaller }
303
304 input[type=checkbox] {
305 margin-right: 1em;
306 }
307 .link-wrapper {
308 @media (hover: none) {
309 .popup-menu-button { display: none }
310 }
311 @media (hover: hover) {
312 &:not(:hover):not(:focus,:focus-within) .popup-menu-button { opacity: .001; } // use opacity, as jaws is not setting :focus
313 &:hover { padding: 1em; margin: -1em; // add margin to avoid leaving the hover unintentionally. Using this on @media(hover:none) will result in some taps to be missed. It happened on a long folder with no spaces in the name to wrap.
314 .popup-menu-button { z-index: 1} // without this, attempting to hover from the name to the menu-button will easily lose the :hover if a comment is present
315 }
316 }
317 a {
318 &:last-of-type {
319 word-break: break-word;
320 padding-right: .5em;
321 }
322 .icon {
323 margin-right: .5em;
324 display: inline-block;
325 text-align: center;
326 }
327 img.icon, video.icon { // same alignment as font icons
328 vertical-align: bottom;
329 position: relative;
330 top: 1px;
331 }
332 &:hover {
333 text-decoration: underline;
334 }
335 }
336 }
337 .entry-panel {
338 float: right;
339 padding-top: 0.3em;
340 display: flex;
341 align-items: center;
342 .icon-button {
343 margin: -3px 0 -3px 0.4em;
344 font-size: 0.7em;
345 width: 2.4em;
346 }
347 .entry-details {
348 font-size: 90%;
349 margin-left: 4px;
350 font-variant-numeric: tabular-nums; /* trick to get stuff aligned */
351
352 .entry-size-unit {
353 margin-left: .3em;
354 }
355 }
356 }
357
358 &>div:last-of-type { clear:both }
359 &.page-separator {
360 margin-top: .7em;
361 position: relative;
362 &::before {
363 content: attr(label);
364 position: absolute;
365 top: -1.5em;
366 font-size: smaller;
367 margin-left: calc(50% - 1em);
368 opacity: .9;
369 }
370 }
371 }
372 }
373 .entry-comment {
374 display: inline;
375 white-space: pre-wrap;
376 word-break: break-word;
377 margin-bottom: .5em; // affecting only the layout of the current-folder-comment
378 &::before, &::after {
379 font-size: 1.5em;
380 font-family: serif;
381 line-height: 1px;
382 position: relative;
383 }
384 &::before {
385 content: "“";
386 margin-right: 0.1em;
387 top: 0.2em;
388 }
389 &::after {
390 content: "„";
391 top: -0.1em;
392 margin-left: 0.1em;
393 }
394 }
395
396 #menu-bar {
397 display: flex;
398 justify-content: space-evenly;
399 flex-wrap: wrap;
400 &>* {
401 flex: 1;
402 margin: 0.1em; // using margin instead of gap because of the 0-width element that would produce extra gap
403 &:first-child { margin-left: 0 }
404 &:last-child { margin-right: 0 }
405 }
406 button {
407 padding: 0.5em 0; // fallback
408 padding: min(1vh, 0.5em) 0; // avoid wasting too much vertical space, and no need for horizontal padding as we are using flex to grow
409 }
410 }
411 #search-clear-button { margin-right: .5em }
412 #searched {
413 margin-bottom: 0.2em;
414 margin-top: 0.3em;
415 }
416 #user-panel {
417 display:flex;
418 flex-direction: column;
419 gap: 1em;
420 a>button {
421 width: 100%;
422 }
423 }
424
425 ul { padding-left: 2em }
426
427 button .icon + .label {
428 cursor: inherit;
429 margin-left: .4em;
430 }
431
432 .dialog-backdrop.working {
433 font-size: 5em;
434 animation: 1s fade-in;
435 }
436 .dialog-content {
437 padding: .2em; /* give space for focus outline */
438 }
439 .dialog-alert .dialog-content {
440 text-align: center;
441 white-space: pre-wrap;
442 p { text-align: left; display: inline-block; }
443 ul { text-align: left; } // bullet points should be aligned
444 }
445
446 .dialog {
447 min-width: 11em;
448 --color: var(--button-bg);
449 }
450 .dialog-icon .icon {
451 margin-left: -1px; font-size:95%;
452 margin-top: 0.4em; // useful for and affecting only img icons
453 border-radius: 0.6em 0;
454 }
455
456 #paging {
457 position: sticky;
458 bottom: 0;
459 display: flex;
460 gap: .3em;
461 background-color: var(--bg);
462 padding: 0 0.2em 0.2em;
463 &>button { z-index: 1; }
464 button { box-shadow: 0 0 .3em .3em #0003; }
465 #paging-middle {
466 padding: 0 0.5em;
467 margin: 0 -0.3em;
468 display: flex;
469 gap: .5em;
470 flex: 1;
471 min-width: 0;
472 overflow-x: auto;
473 }
474 #paging-middle>button {
475 flex: 1;
476 min-width: unset;
477 padding-top: 0; padding-bottom: 0; /* reduce vertically in case a horizontal scrolling bar is needed */
478 }
479 button {
480 background: var(--button-bg);
481 text-align: center;
482 white-space: nowrap;
483 padding: .5em; /* fit more buttons on screen */
484 }
485 #alphabet-paging {
486 position: relative;
487 z-index: 2;
488 display: flex;
489 margin-left: .2em;
490 &.open #alphabet-paging-toggle {
491 min-width: 2.4em;
492 }
493 }
494 #alphabet-paging-toggle {
495 min-width: 2.8em;
496 }
497 #alphabet-paging-bar {
498 position: absolute;
499 right: 100%;
500 bottom: 0;
501 display: flex;
502 gap: .2em;
503 max-width: calc(100vw - 5.5em);
504 overflow-x: auto;
505 padding: .2em .2em .2em .5em;
506 background: var(--bg);
507 box-shadow: -.2em 0 .3em .2em var(--bg);
508 button {
509 min-width: 2.2em;
510 padding: .5em .6em;
511 }
512 }
513 }
514
515 .upload-toolbar {
516 @extend .hide-back;
517 position: sticky;
518 top: -4px; padding-top: 1px; // workaround: without this, the scrolling list behind is visible above (vertically, not z-index)
519 z-index: 3; // necessary to not be covered by icon-buttons
520 box-shadow: 0 0 .3em .3em var(--bg);
521 }
522 .upload-hashing::before,
523 .upload-progress::before { content: var(--separator); }
524 .entry-size::after { content: var(--separator) }
525
526 .upload-progress {
527 min-width: 4em;
528 display: inline-block;
529 margin-left: 0.5em;
530 }
531 .upload-progress-bar {
532 display: block;
533 width: 100%;
534 }
535 .upload-list {
536 margin-top: .5em;
537 td:nth-child(1) { width: 0; }
538 td:nth-child(2) { text-align: right; width: 0; white-space: nowrap; padding-left: 0.5em; }
539 td:nth-child(3) { padding: .2em .5em; word-break: break-word; }
540 }
541 .upload-list-menu-button {
542 display: none;
543 }
544 .upload-action-menu {
545 margin-top: 0;
546 padding-top: 0;
547 border-top: none;
548 }
549 .upload-action-properties {
550 margin-bottom: 1em;
551 }
552 .nowrap { white-space: nowrap }
553
554 .login-dialog {
555 form {
556 display: flex;
557 flex-direction: column;
558 gap: 1.2em;
559 }
560 label {
561 display: block;
562 margin-bottom: .5em;
563 margin-left: .1em;
564 }
565 .password-field {
566 position: relative;
567 input { padding-right: 2.2em; }
568 }
569 .password-eye {
570 position: absolute;
571 right: .5em;
572 top: 50%;
573 transform: translateY(-50%);
574 border: 0;
575 background: none;
576 outline: none;
577 padding: 0;
578 cursor: pointer;
579 line-height: 1;
580 }
581 .submit { text-align: right; }
582 }
583 #search-dialog form {
584 display: flex;
585 flex-direction: column;
586 gap: 1em;
587 .submit { text-align: right; }
588 }
589
590 form label+input { margin-top: .2em; }
591
592 .miss-perm { margin: 0 0.3em }
593
594 .popup-menu-button {
595 font-size: .8em; padding: .2em .3em; position: absolute; opacity: .8; white-space: nowrap;
596 &:hover,&:focus { opacity: 1 }
597 .icon { margin-right: 0.1em; }
598 }
599
600 .file-dialog .dialog { min-width: 13em; } /* more room for title */
601 .file-dialog-properties {
602 word-break: break-word;
603 line-height: 1.5em;
604 margin: 0;
605 dt { font-weight: bold; }
606 dd { margin-left: 1.5em; }
607 }
608 .file-menu {
609 margin-top: 1em;
610 padding-top: 1em;
611 border-top: 1px solid var(--faint-contrast);
612
613 display: flex;
614 flex-direction: column;
615 gap: .7em 1em;
616 a {
617 display: flex;
618 align-items: flex-start;
619 label {
620 cursor: pointer;
621 margin-top: .1em;
622 small { display: block }
623 }
624 .icon { margin-right: 0.5em; }
625 &:hover { @extend .highlightedText }
626 }
627 }
628
629 .unauthorized { text-align: center }
630
631 .toast-content {
632 a { color: var(--bg); text-decoration: underline; }
633 .horiz-sep { display: none }
634 }
635
636 #clipBar {
637 position: sticky; bottom: 0;
638 background: var(--bg);
639 box-shadow: 0 0 .3em .3em var(--bg);
640
641 display: flex; align-items: center; gap: 0.5em;
642 margin: 0 1px;
643 }
644 #clipboard-content {
645 text-align: left;
646 li:first-of-type { margin-top: .5em }
647 }
648
649 #focus-typing {
650 position: fixed;
651 top: 0;
652 right: 0;
653 background: var(--bg);
654 z-index: 3;
655 padding: .1em .5em;
656 border: 1px solid currentColor;
657 margin: -1px;
658 }
659 .focus-typing-mismatch {
660 color: var(--error);
661 }
662
663 .tiles-mode {
664 max-width: none;
665 @media (min-width: 42em) {
666 margin: 0 1em;
667 }
668 --tile-size: 5;
669 --name-lines: 3;
670 --name-height: calc(4.7em + var(--tile-size) * .4em + 1.2em * var(--name-lines));
671 --tile-width: calc(5em + 1em * var(--tile-size));
672
673 ul.dir {
674 display: grid;
675 grid-template-columns: repeat(auto-fill, minmax(var(--tile-width),1fr));
676 grid-auto-rows: calc(var(--name-height) + 1.3em);
677 gap: 0 20px;
678
679 li {
680 text-align: center;
681 position: relative;
682 display: flex;
683 flex-direction: column;
684 border-bottom: none;
685 overflow-x: clip;
686 padding: .5em 0 0;
687
688 .link-wrapper {
689 &:not(:hover) {
690 max-height: var(--name-height);
691 display: block;
692 display: -webkit-box;
693 overflow: hidden;
694 -webkit-line-clamp: calc(var(--name-lines) + 1); // + icon's line
695 -webkit-box-orient: vertical;
696 }
697 a {
698 &:last-of-type { padding: 0; }
699 span { display: block; }
700 .icon.icon { font-size: calc(1.2rem + .6rem * var(--tile-size)); }
701 img.icon, video.icon {
702 width: auto;
703 height: 1em;
704 padding: 0.1em 0;
705 }
706 .icon {
707 font-size: 4rem;
708 display: block;
709 margin: auto; // good for both font and img icons
710 }
711 }
712
713 &:hover {
714 overflow: visible;
715 display: block;
716 z-index: 1;
717 .icon::before { text-decoration: none; }
718 }
719 }
720 .link-wrapper:hover {
721 padding: 0; margin: 0;
722 }
723 &:nth-of-type(odd) {
724 background-color: inherit; // to avoid checkerboard effect
725 }
726 .entry-panel {
727 justify-content: center;
728 font-size: 10pt;
729 }
730 .entry-details {
731 font-size: 80%;
732 }
733 &.page-separator {
734 margin-top: 0;
735 &::before { content: ''; }
736 }
737 input[type=checkbox] {
738 margin: 0;
739 position: absolute;
740 top: 0.3em;
741 right: 1em;
742 }
743
744 .link-wrapper a { display: inline-block } // avoid overlapping name and details
745 &:hover {
746 --bg: var(--ghost-contrast-alt);
747 background: var(--bg); // highlight whole tile
748 .link-wrapper, .entry-panel {
749 z-index: 1; background: var(--bg); // cover underlying elements of other tiles, in case it's overflowing
750 }
751 input[type=checkbox] { z-index: 2; } // over link-wrapper, but not over header
752 .entry-panel {
753 padding-bottom: 0.3em;
754 }
755 }
756 .entry-comment {
757 max-height: 1.2em;
758 overflow: hidden;
759 margin: 0;
760 &:hover {
761 max-height: none;
762 overflow: auto;
763 }
764 }
765 }
766 }
767 .entry-size::after {
768 content: none;
769 }
770 .entry-ts { display: none; }
771 .popup-menu-button {
772 position: absolute;
773 top: 0;
774 left: 0;
775 }
776 #filter-bar {
777 margin-bottom: 1em;
778 }
779 #paging { z-index: 1 } // avoid being covered by hovered elements
780
781 }
782
783 #root // heavier selector
784 .file-show {
785 backdrop-filter: none; background: #888e; // less GPU, as file-show can stay on for long
786
787 &>div {
788 height: 100%;
789 width: 100%;
790 @media (max-width: 30em) { // portrait mobile
791 flex-direction: column-reverse !important; // bar at the bottom, easier on the thumb
792 }
793 }
794
795 .folder, .entry-comment { font-size: small; margin-bottom: 0; }
796 .showing-container {
797 width: 100%;
798 height: 100%;
799 display: flex;
800 flex-direction: column;
801 justify-content: center;
802 align-items: center;
803 position: relative;
804 }
805 .meta-tags {
806 position: relative;
807 width: 100%;
808 text-align: center;
809 display: flex;
810 justify-content: center;
811 text-shadow: 1px 1px 0 #000, -1px 1px 0 #000, -1px -1px 0 #000, 1px -1px 0 #000;
812 &>div { position: absolute;
813 margin: 1em;
814 }
815 }
816 .showing {
817 max-width: calc(100% - 4vw); // fallback
818 max-width: calc(100% - min(4vw, var(--nav-size)) * 2); // avoid overlapping of controls and nav buttons
819 max-height: 100%;
820 }
821 .cover {
822 position: absolute;
823 width: 100%; height: 100%;
824 background-repeat: no-repeat;
825 background-size: contain;
826 background-position: center;
827 z-index: -1; // otherwise firefox (forgot to finished this comment)
828 opacity: .4;
829 transition: opacity 1s;
830 &.none { opacity: 0; }
831 }
832 audio.showing { min-width: 60%; transition: opacity 1s; }
833 .cover:not(.none)+audio { opacity: .7; }
834 audio.showing, // even on mobile, we need the whole thing to control it decently, and nav-s don't seem to be a problem
835 img.showing { max-width: 100% } // we are ok with overlapping for simple images
836 .main {
837 flex: 1; position: relative; max-height: 100%;
838 overflow: hidden; // without this <video> can make me go beyond the screen limit
839 }
840 .freeY, .fullWidth {
841 .main { overflow-y: auto; }
842 .showing { max-height: initial; margin: auto; }
843 .showing-container { overflow: auto; align-items: flex-start; justify-content: flex-start; }
844 }
845 .fullWidth {
846 .showing-container, .showing { width: 100%; }
847 }
848 --nav-size: 25vh; // big
849 @supports (width: min(1px,2px)) {
850 --nav-size: min(25vh, 25vw, 13em);
851 }
852 .nav {
853 position: absolute;
854 width: .5em; // closer to the edge
855 font-size: var(--nav-size);
856 height: 1em; line-height: 1em; // ensure same height on android
857 cursor: pointer;
858 opacity: .3;
859 -webkit-text-stroke: 2px black;
860 user-select: none;
861 transition: opacity .3s;
862 &:hover { opacity: .7; }
863 &.nav-hidden:not(:hover) { opacity: .3 }
864 }
865 .bar {
866 padding: .5em; // fallback
867 padding: .5em min(2vw, 1em);
868 background: var(--bg);
869 opacity: .8;
870 flex-wrap: wrap;
871 &,&>.controls {
872 display: flex;
873 align-items: center;
874 justify-content: flex-end;
875 gap: .5em;
876 }
877
878 .entry-details { font-size: smaller; margin-left: 1em; }
879 .entry-ts { display: inherit; font-size: smaller; }
880 .entry-size::after { display: none }
881 }
882 }
883 .file-show-help {
884 kbd { margin: .5em }
885 kbd:first-of-type { margin-top: 1em; }
886 }
887
888 @media (min-width: 42em) {
889 body {
890 /* Works on Firefox */
891 scrollbar-width: thin;
892 scrollbar-color: var(--button-bg) var(--ghost-contrast);
893
894 /* Works on Chrome, Edge, and Safari */
895 &::-webkit-scrollbar {
896 width: 12px;
897 }
898 &::-webkit-scrollbar-track {
899 background: var(--ghost-contrast);
900 }
901 &::-webkit-scrollbar-thumb {
902 background-color: var(--button-bg);
903 border-radius: 20px;
904 border: 1px solid var(--ghost-contrast)
905 }
906 }
907 button { padding: .4em .8em; }
908 audio.showing { zoom: 1.5 }
909 }
910 @media (max-width: 42em) {
911 :root { --ghost-contrast: #8883; } /* phones have different curve */
912 body, button, select { font-size: 14pt; }
913 #menu-bar, #filter-bar, #clipBar, #search-clear-button {
914 .icon + .label { display: none } /* icons only */
915 }
916 #filter-bar {
917 margin-top: 0.4em;
918 button { // make it same size of top bar
919 width: 17.6vw;
920 height: 2.3em;
921 }
922 }
923 .breadcrumb {
924 word-break: break-all; // solves with very long names without spaces. 'break-word' is nicer but doesn't handle worst cases like /gear/mininova/x/LOOPMASTERS%204Gig%20Pack/LOOPMASTERS_2015/BASS_HOUSE_AND_GARAGE_2_DEMOS/SOUNDS_AND_FX/
925 .icon {
926 font-size:24px;
927 }
928 }
929 #root>.tiles-mode {
930 margin: 0;
931 }
932 }
933
934 @media (max-width: 30em) {
935 .upload-list-inline-actions {
936 display: none;
937 }
938 .upload-list-menu-button {
939 display: inline-block;
940 }
941 .upload-list-size {
942 display: none;
943 }
944 }
945
946 @media (max-height: 600px) and (orientation: landscape) {
947 .file-dialog {
948 .dialog-content {
949 display: flex;
950 gap: 3em;
951 margin: 1em;
952 .file-menu { // move divisor to left
953 margin-top: 0;
954 padding-top: 0;
955 border-top: none;
956 margin-left: 2em;
957 padding-left: 2em;
958 border-left: 1px solid var(--faint-contrast);
959 }
960 }
961 }
962 }
963
964 @media (pointer: coarse) {
965 #root>.tiles-mode .file-menu-button { font-size: 1em; margin-top: 0.3em; } // easier to tap
966 }