Files
FileRise/public/css/styles.css

2416 lines
68 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* ===========================================================
GENERAL STYLES & BASE LAYOUT
=========================================================== */
/* Reserve stable space for header + main */
:root { --header-h: 55px; }
.header-container { min-height: var(--header-h); }
img.logo{ width:50px; height:50px; display:block; } /* belt & suspenders for logo sizing */
/* Hidden-but-reserved utility (no clicks) */
.is-visually-hidden {
visibility: hidden;
pointer-events: none;
}
/* After auth: show app, hide login */
#fr-login-tip {
min-height: 40px; /* reserve space */
max-width: 520px;
margin: 8px auto 0;
border-radius: 8px;
padding: 10px 12px;
text-align: left;
margin-bottom: 10px;
}
.main-wrapper{
display:flex; /* or grid—flex is fine here */
gap:5px;
align-items:flex-start;
}
/* GENERAL STYLES */
body {
font-family: 'Roboto', sans-serif;
background-color: #f5f5f5;
margin: 0;
transition: background-color 0.3s, color 0.3s;
}body {
letter-spacing: 0.2px;
overflow-x: hidden;
}.custom-dash {
display: inline-block;
transform: scaleX(1.5);
padding-left: 2px !important;
padding-right: 2px !important;
}/* CONTAINER */
.container,
.container-fluid {
margin-top: 10px;
padding-right: 4px !important;
padding-left: 4px !important;
}@media (min-width: 1300px) {
.container-fluid {
padding-left: 20px !important;
padding-right: 20px !important;
}}
@media (max-width: 600px) {
.zones-toggle { left: 85px !important; }
}
/* Optional tokens */
:root{
--filr-accent-500:#008CB4; /* base */
--filr-accent-600:#00789A; /* hover */
--filr-accent-700:#006882; /* active/border */
--filr-accent-ring:rgba(0,140,180,.4);
}
/* Button */
.btn-color-folder{
display:inline-flex; align-items:center; gap:6px;
background:var(--filr-accent-500);
border:1px solid var(--filr-accent-700);
color:#fff; /* ensure white text */
}
.btn-color-folder .material-icons{
color:currentColor; /* makes icon white too */
}
.btn-color-folder:hover,
.btn-color-folder:focus-visible{
background:var(--filr-accent-600);
border-color:var(--filr-accent-700);
}
.btn-color-folder:active{
background:var(--filr-accent-700);
}
.btn-color-folder:focus-visible{
outline:2px solid var(--filr-accent-ring);
outline-offset:2px;
}
/* Dark mode: start slightly deeper so it doesn't glow */
.dark-mode .btn-color-folder{
background:var(--filr-accent-600);
border-color:var(--filr-accent-700);
color:#fff;
}
.dark-mode .btn-color-folder:hover,
.dark-mode .btn-color-folder:focus-visible{
background:var(--filr-accent-700);
}
/* ===========================================================
HEADER & NAVIGATION
=========================================================== */
/************************************************************/
/* FLEXBOX HEADER: LOGO, TITLE, BUTTONS FIXED */
/************************************************************/
.btn-login {
margin-top: 10px;
}/* Color overrides */
.orange-icon {
color: #2196F3 !important;
font-size: 34px !important;
transform: translateY(-3px) !important;
}.red-icon {
width: 34px !important;
display: inline-block !important;
font-size: 34px !important;
color: red !important;
transform: translateY(-3px) !important;
}.header-container {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
height: 55px;
padding: 10px 20px;
background-color: #2196F3;
transition: background-color 0.3s ease;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
}.dark-mode .header-container {
background-color: #1f1f1f;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.7);
}#darkModeIcon {
color: #fff;
}.header-logo {
max-height: 50px;
width: auto;
display: block;
}.header-logo svg {
height: 50px;
width: auto;
}.dark-mode header {
background-color: #1f1f1f;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.7);
}.header-left {
display: flex;
align-items: center;
flex: 1;
min-width: 100px;
}.header-title {
position: absolute;
left: 50%;
transform: translateX(-50%);
text-align: center;
white-space: nowrap;
}.header-title h1 {
font-size: 2rem;
color: #fff;
margin: 0;
}.header-buttons {
display: flex;
align-items: center;
justify-content: flex-end;
flex: 1;
min-width: 150px;
gap: 0px;
}.header-buttons button {
background: none;
border: none;
cursor: pointer;
color: #fff;
transition: background-color 0.2s ease, box-shadow 0.2s ease;
}.header-buttons button:not(#userDropdownToggle) {
border-radius: 50%;
padding: 9px;
}#userDropdownToggle {
border-radius: 4px !important;
padding: 6px 10px !important;
}
#headerDropArea.header-drop-zone{
display: flex;
justify-content: flex-end; /* buttons to the right */
align-items: center;
min-height: 40px; /* so the label has room */
}
.header-buttons button:hover {
background-color: rgba(255, 255, 255, 0.2);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
color: #fff;
}@media (max-width: 600px) {
header {
flex-direction: column;
text-align: center;
height: auto;
padding: 10px;
}.header-left,
.header-buttons {
justify-content: center;
flex: unset;
}.header-title {
order: 1;
width: 100%;
margin-bottom: 10px;
position: relative;
left: auto;
transform: none;
}.header-buttons {
order: 2;
flex-wrap: wrap;
justify-content: center;
}}
.header-buttons button i {
font-size: 24px;
}.dark-mode-toggle {
background-color: #424242;
border: 1px solid #fff;
color: #fff;
padding: 6px 14px;
border-radius: 6px;
cursor: pointer;
font-size: 0.9em;
transition: background 0.3s;
}.dark-mode-toggle:hover {
background-color: rgba(255, 255, 255, 0.2);
}/* Folder Help Tooltip - Light Mode */
.folder-help-tooltip {
background-color: #fff;
color: #333;
border: 1px solid #ccc;
border-radius: 4px;
padding: 10px;
box-shadow: 2px 2px 6px rgba(0, 0, 0, 0.2);
}/* Folder Help Tooltip - Dark Mode */
.dark-mode .folder-help-tooltip {
background-color: #333 !important;
color: #eee !important;
border: 1px solid #555 !important;
}#folderHelpBtn i.material-icons.folder-help-icon {
-webkit-text-fill-color: orange !important;
color: inherit !important;
padding-right: 10px !important;
}.dark-mode #folderHelpBtn i.material-icons.folder-help-icon {
-webkit-text-fill-color: #ffa500 !important;
padding-right: 10px !important;
}/************************************************************/
/* RESPONSIVE HEADER FIXES */
/************************************************************/
@media (max-width: 790px) {
.header-container {
flex-wrap: wrap;
height: auto;
}.header-title {
text-align: center;
flex-basis: 100%;
order: 2;
}.header-right {
order: 3;
flex-basis: 100%;
justify-content: center;
margin-top: 10px;
}}
@media (max-width: 600px) {
.header-container {
flex-direction: column;
text-align: center;
}.header-left {
justify-content: center;
flex-basis: 100%;
}.header-title {
font-size: 1.7rem;
margin-top: 5px;
}.header-buttons {
flex-direction: row;
justify-content: center;
gap: 5px;
margin-top: 5px;
}}
/* ===========================================================
MATERIAL ICONS
=========================================================== */
.material-icons {
font-size: 24px;
vertical-align: middle;
color: white;
}.material-icons.folder-icon,
.material-icons.gallery-icon {
color: black;
margin-right: 5px;
}.dark-mode .material-icons.folder-icon,
.dark-mode .material-icons.gallery-icon {
color: white;
margin-right: 5px;
}.remove-file-btn {
width: 24px;
height: 24px;
line-height: 24px;
text-align: center;
background: transparent;
border: none;
color: red;
cursor: pointer;
margin-right: 0px;
padding: 0;
border-radius: 50%;
transition: background-color 0.3s;
}.remove-file-btn:hover {
background-color: red;
color: white;
}/* ===========================================================
FORMS & LOGIN
=========================================================== */
.remember-me-container {
margin-top: 20px !important;
}#loginForm {
margin: 0 auto;
max-width: 400px;
background: white;
padding: 20px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
border-radius: 4px;
}.dark-mode #loginForm {
background-color: #2c2c2c;
color: #e0e0e0;
padding: 20px;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(255, 255, 255, 0.2);
}.dark-mode #loginForm input {
background-color: #333;
color: #fff;
border: 1px solid #555;
}.dark-mode #loginForm label {
color: #ddd;
}.dark-mode #loginForm button {
background-color: #007bff;
color: white;
border: none;
}.dark-mode #loginForm button:hover {
background-color: #0056b3;
}/* ===========================================================
CARDS & MODALS
=========================================================== */
#restoreFilesModal .modal-content {
position: fixed !important;
top: 50% !important;
left: 50% !important;
transform: translate(-50%, -50%) !important;
margin: 0 !important;
z-index: 10000 !important;
width: 95% !important;
max-width: 800px !important;
background: transparent !important;
}/* Ensure the inner modal content still has a white background */
#restoreFilesModal .modal-content {
background: #fff !important;
padding: 20px;
border: 1px solid #ccc;
border-radius: 4px;
}/* Override modal content for dark mode */
.dark-mode #restoreFilesModal .modal-content {
background: #2c2c2c !important;
border: 1px solid #555 !important;
color: #f0f0f0;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.6) !important;
}/* Custom styling for restore modal buttons */
#restoreSelectedBtn,
#restoreAllBtn,
#deleteTrashSelectedBtn,
#deleteAllBtn,
#closeRestoreModal {
padding: 10px 20px !important;
font-size: 16px !important;
border-radius: 4px !important;
transition: background-color 0.3s ease !important;
border: none !important;
margin-bottom: 10px !important;
}/* Primary button - Restore Selected */
#restoreSelectedBtn {
background-color: #007bff !important;
color: #ffffff !important;
}#restoreSelectedBtn:hover {
background-color: #0056b3 !important;
color: #ffffff !important;
}/* Secondary button - Restore All */
#restoreAllBtn {
background-color: #6c757d !important;
color: #ffffff !important;
}#restoreAllBtn:hover {
background-color: #5a6268 !important;
color: #ffffff !important;
}/* Warning button - Delete Selected */
#deleteTrashSelectedBtn {
background-color: #ffc107 !important;
color: #212529 !important;
}#deleteTrashSelectedBtn:hover {
background-color: #e0a800 !important;
color: #212529 !important;
}/* Danger button - Delete All */
#deleteAllBtn {
background-color: #dc3545 !important;
color: #ffffff !important;
}#deleteAllBtn:hover {
background-color: #c82333 !important;
color: #ffffff !important;
}/* Dark button - Close Restore Modal */
#closeRestoreModal {
background-color: #343a40 !important;
color: #ffffff !important;
}#closeRestoreModal:hover {
background-color: #23272b !important;
color: #ffffff !important;
}.modal {
display: none;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
z-index: 1050;
}.modal .modal-content {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background: #fff;
padding: 20px;
border: 1px solid #ccc;
border-radius: 4px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
max-width: 400px;
width: 90%;
overflow-y: auto;
white-space: normal;
word-wrap: break-word;
overflow-wrap: break-word;
height: auto;
max-height: 90vh;
}@media (max-width: 600px) {
.modal .modal-content {
transform: translate(-50%, -70%);
}}
.dark-mode .modal .modal-content {
background-color: #2c2c2c;
color: #e0e0e0;
border-color: #444;
}.editor-close-btn {
position: absolute;
top: 10px;
right: 10px;
display: flex;
justify-content: center;
align-items: center;
font-size: 20px;
font-weight: bold;
cursor: pointer;
z-index: 1000;
width: 32px;
height: 32px;
border-radius: 50%;
text-align: center;
line-height: 30px;
color: #ff4d4d;
background-color: rgba(255, 255, 255, 0.9);
border: 2px solid transparent;
transition: all 0.3s ease-in-out;
}.editor-close-btn:hover {
color: white;
background-color: #ff4d4d;
box-shadow: 0px 0px 6px rgba(255, 77, 77, 0.8);
transform: scale(1.05);
}.dark-mode .editor-close-btn {
background-color: rgba(0, 0, 0, 0.7);
color: #ff6666;
}.dark-mode .editor-close-btn:hover {
background-color: #ff6666;
color: #000;
}/* Editor Modal */
.editor-modal {
position: fixed;
top: 2%;
left: 5%;
width: 90vw;
height: 90vh;
background-color: #fff;
padding: 10px 20px 20px 20px;
border: 1px solid #ccc;
border-radius: 4px !important;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2) !important;
z-index: 1100 !important;
display: flex !important;
flex-direction: column !important;
overflow: hidden !important;
resize: both !important;
}/* Editor Textarea */
.editor-textarea {
flex-grow: 1 !important;
width: 100% !important;
resize: none !important;
overflow: auto !important;
}.dark-mode .editor-modal {
background-color: #2c2c2c;
color: #e0e0e0;
border-color: #444;
}@media (max-width: 768px) {
.editor-modal {
top: 0%;
left: 0%;
transform: translate(4%, 4%) !important;
width: 90vw !important;
max-height: 90vh;
padding: 15px;
min-width: auto !important;
}}
.editor-header {
display: flex;
align-items: center;
justify-content: space-between;
height: 33px;
padding: 0 10px;
margin-bottom: 7px;
}.editor-title {
margin: 0;
line-height: 33px;
}.dark-mode .editor-header {
background-color: #2c2c2c;
}@media (max-width: 600px) {
.editor-title {
font-size: 1.2rem;
max-width: 95%;
}}
.editor-controls {
text-align: right;
margin-right: 30px;
margin-bottom: 5px;
}.editor-footer {
margin-top: 5px;
text-align: right;
}/* ===========================================================
LOGOUT & USER CONTROLS
=========================================================== */
.modal-content .button-container {
display: flex !important;
justify-content: flex-end;
gap: 5px;
margin-top: 20px;
}.logout-container {
position: absolute;
top: 10px;
right: 10px;
display: flex;
flex-direction: column;
align-items: flex-end;
gap: 5px;
}#uploadBtn {
font-size: 20px;
padding: 10px 22px;
align-items: center;
}.card-body.d-flex.flex-column {
padding: 0.75rem !important;
}#customChooseBtn {
background-color: #9E9E9E;
color: #fff;
border: none;
border-radius: 4px;
padding: 8px 18px;
font-size: 16px;
cursor: pointer;
white-space: nowrap;
}@media (max-width: 768px) {
#customChooseBtn {
font-size: 14px;
padding: 6px 14px;
}}
/* ===========================================================
UPLOAD PROGRESS STYLES
=========================================================== */
.pause-resume-btn {
background: none;
border: none;
padding: 0;
margin: 0;
cursor: pointer;
outline: none;
margin-right: 5px;
}.material-icons.pauseResumeBtn {
color: black !important;
padding: 4px;
border-radius: 4px;
transition: background-color 0.2s ease, color 0.2s ease;
}.dark-mode .material-icons.pauseResumeBtn {
color: white !important;
}.dark-mode .material-icons.pauseResumeBtn:hover {
background-color: rgba(255, 215, 0, 0.3);
color: #fff;
}body:not(.dark-mode) .material-icons.pauseResumeBtn:hover {
background-color: rgba(0, 0, 0, 0.1);
color: #000;
}#uploadProgressContainer ul {
list-style: none;
padding: 0;
margin: 0;
}#uploadProgressContainer li {
display: flex;
align-items: center;
margin-bottom: 10px;
flex-wrap: wrap;
}#uploadProgressContainer .file-preview {
width: 32px !important;
height: 32px !important;
margin-right: 0;
flex-shrink: 0;
}#uploadProgressContainer .file-preview img {
width: 32px !important;
height: 32px !important;
object-fit: cover;
}#uploadProgressContainer .file-name {
margin: 0 20px 0 2px;
flex-grow: 1;
word-break: break-word;
}#uploadProgressContainer .progress {
background-color: #e9ecef;
border-radius: 5px;
overflow: hidden;
margin: 5px 0 10px;
height: 24px;
width: 250px;
}#uploadProgressContainer .progress-bar {
background-color: #007bff;
height: 100%;
line-height: 24px;
color: #000;
text-align: center;
transition: width 0.4s ease;
font-size: 0.9rem;
}#uploadProgressContainer {
margin-top: 20px;
}/* ===========================================================
RESPONSIVE ADJUSTMENTS (General Small Screens)
=========================================================== */
@media (max-width: 768px) {
.logout-container {
position: static;
align-items: flex-end;
text-align: right;
margin-top: 10px;
}.logout-container button {
width: auto;
min-width: 120px;
}.hide-small {
display: none;
}}
@media (min-width: 768px) and (max-width: 991px) {
.hide-medium {
display: none !important;
}}
/* ===========================================================
BUTTON STYLES (MATERIAL THEME) & Preserve Bootstrap colors
=========================================================== */
.btn {
font-size: 0.9rem;
border: none;
border-radius: 4px;
padding: 8px 16px;
cursor: pointer;
white-space: nowrap;
text-decoration: none;
display: inline-block;
}.btn:hover {
opacity: 0.9;
}#deleteSelectedBtn {
background-color: #f44336;
color: white;
}#deleteSelectedBtn:hover {
background-color: #d32f2f;
}#copySelectedBtn {
background-color: #9E9E9E;
color: white;
}#copySelectedBtn:hover {
background-color: #757575;
}#moveSelectedBtn {
background-color: #ff9800;
color: white;
}#moveSelectedBtn:hover {
background-color: #fb8c00;
}#downloadZipBtn {
background-color: #009688;
color: white;
}#downloadZipBtn:hover {
background-color: #00796B;
}#createBtn {
background-color: #007bff;
color: white;
}.dark-mode .dropdown-menu {
background-color: #2c2c2c !important;
border-color: #444 !important;
color: #e0e0e0!important;
}.dark-mode .dropdown-menu .dropdown-item {
color: #e0e0e0 !important;
}.dropdown-item:hover {
background-color: rgba(0,0,0,0.05);
}.dark-mode .dropdown-item:hover {
background-color: rgba(255,255,255,0.1);
}#fileList button.edit-btn {
background-color: #007bff;
color: white;
}.rename-btn .material-icons,
#renameFolderBtn .material-icons {
color: black !important;
}/* ===========================================================
FILE LIST & TABLE STYLES
=========================================================== */
#fileList table {
background-color: transparent;
border-collapse: collapse !important;
border-spacing: 0 !important;
table-layout: auto !important;
width: 100% !important;
}#fileList table tr:nth-child(even) {
background-color: transparent;
}
/* --- File list rows: match folder-tree hover/selected --- */
:root {
--filr-row-hover-bg: rgba(122,179,255,.14);
--filr-row-selected-bg: rgba(122,179,255,.24);
}
/* Let cell corners round like a pill */
#fileList table {
border-collapse: separate;
border-spacing: 0;
}
/* ===== Reset any conflicting backgrounds (Bootstrap etc.) inside #fileList only ===== */
#fileList table tbody tr,
#fileList table tbody tr > td {
background-color: transparent !important;
}
/* Kill Bootstrap hover/zebra just for this table */
#fileList table.table-hover tbody tr:hover > * { background-color: transparent !important; }
#fileList table.table-striped > tbody > tr:nth-of-type(odd) > * { background-color: transparent !important; }
/* ===== Our look, scoped to the table we tagged in JS ===== */
#fileList table.filr-table tbody tr,
#fileList table.filr-table tbody td {
transition: background-color .12s ease;
}
/* Hover (when not selected) */
#fileList table.filr-table tbody tr:hover:not(.selected, .row-selected, .selected-row, .is-selected) > td {
background: var(--filr-row-hover-bg) !important;
}
/* Selected (support a few legacy class names just in case) */
#fileList table.filr-table tbody tr.selected > td,
#fileList table.filr-table tbody tr.row-selected > td,
#fileList table.filr-table tbody tr.selected-row > td,
#fileList table.filr-table tbody tr.is-selected > td {
background: var(--filr-row-selected-bg) !important;
box-shadow: inset 0 0 0 1px rgba(122,179,255,.45);
}
/* Rounded “pill” ends on hover/selected */
#fileList table.filr-table tbody tr:hover:not(.selected, .row-selected, .selected-row, .is-selected) > td:first-child,
#fileList table.filr-table tbody tr.selected > td:first-child,
#fileList table.filr-table tbody tr.row-selected > td:first-child,
#fileList table.filr-table tbody tr.selected-row > td:first-child,
#fileList table.filr-table tbody tr.is-selected > td:first-child {
border-top-left-radius: 8px;
border-bottom-left-radius: 8px;
}
#fileList table.filr-table tbody tr:hover:not(.selected, .row-selected, .selected-row, .is-selected) > td:last-child,
#fileList table.filr-table tbody tr.selected > td:last-child,
#fileList table.filr-table tbody tr.row-selected > td:last-child,
#fileList table.filr-table tbody tr.selected-row > td:last-child,
#fileList table.filr-table tbody tr.is-selected > td:last-child {
border-top-right-radius: 8px;
border-bottom-right-radius: 8px;
}
/* Keyboard focus visibility */
#fileList table.filr-table tbody tr:focus-within > td {
outline: 2px solid #8ab4f8;
outline-offset: -2px;
border-top-left-radius: 8px; border-bottom-left-radius: 8px;
border-top-right-radius: 8px; border-bottom-right-radius: 8px;
}
.dark-mode #fileList table.filr-table tbody tr:hover:not(.selected, .row-selected, .selected-row, .is-selected) > td {
background: var(--filr-row-hover-bg) !important;
}
.dark-mode #fileList table.filr-table tbody tr.selected > td,
.dark-mode #fileList table.filr-table tbody tr.row-selected > td,
.dark-mode #fileList table.filr-table tbody tr.selected-row > td,
.dark-mode #fileList table.filr-table tbody tr.is-selected > td {
background: var(--filr-row-selected-bg) !important;
}
#fileList table.filr-table {
--bs-table-hover-color: inherit;
--bs-table-striped-color: inherit;
}
#fileList table.table-hover tbody tr:hover,
#fileList table.table-hover tbody tr:hover > td {
color: inherit !important;
}
.dark-mode #fileList table.filr-table tbody td a,
.dark-mode #fileList table.filr-table tbody td a:hover {
color: inherit !important;
}
:root{
--filr-row-outline: rgba(122,179,255,.45);
--filr-row-outline-hover: rgba(122,179,255,.35);
}
#fileList table.filr-table > :not(caption) > * > * { border: 0 !important; }
#fileList table.filr-table td,
#fileList table.filr-table th { box-shadow: none !important; }
#fileList table.filr-table tbody tr.selected > td,
#fileList table.filr-table tbody tr.row-selected > td,
#fileList table.filr-table tbody tr.selected-row > td,
#fileList table.filr-table tbody tr.is-selected > td {
background: var(--filr-row-selected-bg) !important;
box-shadow:
inset 0 1px 0 var(--filr-row-outline),
inset 0 -1px 0 var(--filr-row-outline);
}
#fileList table.filr-table tbody tr.selected > td:first-child,
#fileList table.filr-table tbody tr.row-selected > td:first-child,
#fileList table.filr-table tbody tr.selected-row > td:first-child,
#fileList table.filr-table tbody tr.is-selected > td:first-child {
box-shadow:
inset 1px 0 0 var(--filr-row-outline),
inset 0 1px 0 var(--filr-row-outline),
inset 0 -1px 0 var(--filr-row-outline);
border-top-left-radius: 8px; border-bottom-left-radius: 8px;
}
#fileList table.filr-table tbody tr.selected > td:last-child,
#fileList table.filr-table tbody tr.row-selected > td:last-child,
#fileList table.filr-table tbody tr.selected-row > td:last-child,
#fileList table.filr-table tbody tr.is-selected > td:last-child {
box-shadow:
inset -1px 0 0 var(--filr-row-outline),
inset 0 1px 0 var(--filr-row-outline),
inset 0 -1px 0 var(--filr-row-outline);
border-top-right-radius: 8px; border-bottom-right-radius: 8px;
}
#fileList table.filr-table tbody tr:hover:not(.selected, .row-selected, .selected-row, .is-selected) > td {
background: var(--filr-row-hover-bg) !important;
box-shadow:
inset 0 1px 0 var(--filr-row-outline-hover),
inset 0 -1px 0 var(--filr-row-outline-hover);
}
#fileList table.filr-table tbody tr:hover:not(.selected, .row-selected, .selected-row, .is-selected) > td:first-child {
box-shadow:
inset 1px 0 0 var(--filr-row-outline-hover),
inset 0 1px 0 var(--filr-row-outline-hover),
inset 0 -1px 0 var(--filr-row-outline-hover);
border-top-left-radius: 8px; border-bottom-left-radius: 8px;
}
#fileList table.filr-table tbody tr:hover:not(.selected, .row-selected, .selected-row, .is-selected) > td:last-child {
box-shadow:
inset -1px 0 0 var(--filr-row-outline-hover),
inset 0 1px 0 var(--filr-row-outline-hover),
inset 0 -1px 0 var(--filr-row-outline-hover);
border-top-right-radius: 8px; border-bottom-right-radius: 8px;
}
#fileList table.filr-table tbody tr:focus-within > td { outline: none; }
#fileList table.filr-table tbody tr:focus-within > td:first-child,
#fileList table.filr-table tbody tr:focus-within > td:last-child {
outline: 2px solid #8ab4f8; outline-offset: -2px;
}
#fileListTitle {
white-space: normal !important;
word-wrap: break-word !important;
overflow-wrap: break-word !important;
max-width: 100% !important;
display: block !important;
text-align: left !important;
}@media (max-width: 600px) {
#fileListTitle {
font-size: 1.4rem !important;
}}
#fileList table tr {
box-shadow: none;
border: none !important;
outline: none !important;
}.dark-mode #fileList table tr {
box-shadow: none;
border: none !important;
outline: none !important;
}#fileList table th,
#fileList table td {
border: none !important;
white-space: nowrap;
}#fileList table th[data-column="name"],
#fileList table td:nth-child(2) {
white-space: normal !important;
word-wrap: break-word !important;
overflow-wrap: break-word !important;
word-break: break-word !important;
text-align: left !important;
line-height: 1.2 !important;
vertical-align: middle !important;
padding: 8px 10px !important;
max-width: 250px !important;
min-width: 120px !important;
}@media (min-width: 500px) {
#fileList table th[data-column="name"],
#fileList table td:nth-child(2) {
max-width: 250px !important;
min-width: 120px !important;
}}
@media (min-width: 1024px) {
#fileList table th[data-column="name"],
#fileList table td:nth-child(2) {
max-width: 280px !important;
min-width: 120px !important;
}}
@media (min-width: 1440px) {
#fileList table th[data-column="name"],
#fileList table td:nth-child(2) {
max-width: 510px !important;
min-width: 240px !important;
}}
#fileList table th:not([data-column="name"]),
#fileList table td:not(:nth-child(2)) {
white-space: nowrap !important;
}#fileList table td {
vertical-align: middle !important;
padding: 8px 10px !important;
}:root {
--file-row-height: 48px;
}#fileList table.table tbody tr {
height: auto !important;
min-height: var(--file-row-height) !important;
}#fileList table.table tbody td:not(.file-name-cell) {
height: var(--file-row-height) !important;
line-height: var(--file-row-height) !important;
padding-top: 0 !important;
padding-bottom: 0 !important;
vertical-align: middle;
}#fileList table.table tbody td.file-name-cell {
white-space: normal;
word-break: break-word;
line-height: 1.2em !important;
height: auto !important;
}/* ===========================================================
HEADINGS & FORM LABELS
=========================================================== */
h2 {
font-size: 2em;
}.form-group {
margin-bottom: 10px;
}label {
font-size: 0.9rem;
}/* ===========================================================
UTILITY CLASSES
=========================================================== */
.align-items-center {
display: flex;
align-items: center;
}.table th button {
background: none;
border: none;
color: inherit;
cursor: pointer;
padding: 0;
}
#uploadForm {
display: none;
}
.folder-actions {
display: flex;
justify-content: center;
align-items: center;
gap: 2px;
flex-wrap: wrap;
white-space: normal;
margin: 0; /* no hacks needed */
}
@media (min-width: 600px) and (max-width: 992px) {
.folder-actions {
white-space: nowrap;
}}
.folder-actions .btn {
padding: 10px 12px;
font-size: 0.85rem;
line-height: 1.1;
border-radius: 6px;
}.folder-actions .material-icons {
font-size: 24px;
vertical-align: -2px;
}.folder-actions .btn {
font-size: 0.85rem;
line-height: 1.1;
border-radius: 6px;
transform: scale(1);
transform-origin: center;
transition: transform 120ms ease, box-shadow 120ms ease;
will-change: transform;
}.folder-actions .material-icons {
font-size: 20px;
vertical-align: -2px;
transition: transform 120ms ease;
}.folder-actions .btn:hover,
.folder-actions .btn:focus-visible {
transform: scale(1.06);
box-shadow: 0 2px 8px rgba(0,0,0,0.12);
}.folder-actions .btn:hover .material-icons,
.folder-actions .btn:focus-visible .material-icons {
transform: scale(1.05);
}.folder-actions .btn:focus-visible {
outline: 2px solid rgba(33,150,243,0.6);
outline-offset: 2px;
}@media (prefers-reduced-motion: reduce) {
.folder-actions .btn,
.folder-actions .material-icons {
transition: none;
}}
#moveFolderBtn {
background-color: #ff9800;
border-color: #ff9800;
color: #fff;
}.row-selected {
background-color: #f2f2f2 !important;
}.dark-mode .row-selected {
background-color: #444 !important;
color: #fff !important;
}.custom-prev-next-btn {
background-color: #e0e0e0;
color: #000;
border: none;
padding: 6px 12px;
font-size: 14px;
border-radius: 4px;
margin: 0 4px;
cursor: pointer;
}.custom-prev-next-btn:hover:not(:disabled) {
background-color: #d5d5d5;
}.dark-mode .custom-prev-next-btn {
background-color: #444;
color: #fff;
border: none;
}.dark-mode .custom-prev-next-btn:hover:not(:disabled) {
background-color: #555;
}#customToast {
position: fixed;
bottom: 20px;
right: 20px;
background: #333;
color: #fff;
padding: 15px;
border-radius: 4px;
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3);
opacity: 0;
transition: opacity 0.5s ease;
z-index: 9999;
min-width: 250px;
display: none;
}#customToast.show {
opacity: 0.9;
}.button-wrap {
display: flex;
flex-wrap: nowrap;
row-gap: 5px;
column-gap: 0px;
}@media (max-width: 500px) {
.button-wrap {
width: 100%;
}}
.button-wrap .btn {
align-items: center;
height: 32px !important;
font-size: 14px !important;
}.button-wrap .btn i.material-icons {
font-size: 16px !important;
line-height: 1 !important;
vertical-align: middle !important;
}#fileListContainer {
border: 1px solid #e0e0e0;
background: white;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
border-radius: 8px;
max-width: 100%;
padding-bottom: 10px !important;
padding-left: 5px !important;
padding-right: 5px !important;
margin: 0 auto 20px;
}@media (max-width: 750px) {
#fileListContainer {
width: 99%;
}}
.dark-mode #fileListContainer {
background-color: #2c2c2c;
color: #e0e0e0;
border: 1px solid #444;
border-radius: 8px;
}#fileListContainer>h2,
#fileListContainer>.file-list-actions,
#fileListContainer>#fileList {
margin-left: 15px;
}@media (max-width: 768px) {
#fileListContainer>h2,
#fileListContainer>.file-list-actions,
#fileListContainer>#fileList {
margin-left: 1px;
}}
.col-12.col-md-4.text-left {
margin-left: -17px;
}@media (max-width: 600px) {
.col-12.col-md-4.text-left {
margin-left: -15px;
}}
#fileListTitle {
font-size: 1.8em;
margin-top: 10px;
margin-bottom: 10px;
}.file-list-actions {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 10px;
margin-bottom: 20px;
}.file-list-actions .action-btn {
flex: 0 1 auto;
}.modal-footer {
margin-top: 15px;
text-align: right;
}.modal-input {
width: 100%;
margin-top: 10px;
}@media (max-width: 600px) {
#fileListTitle {
font-size: 1.4em;
}.file-list-actions {
flex-direction: column;
align-items: stretch;
}.file-list-actions .action-btn {
width: 100%;
}.modal-content {
width: 95%;
margin: 20% auto;
}}
/* Desktop-only subtle grow on hover for toolbar actions */
@media (hover:hover) and (pointer:fine) {
/* list your action IDs here */
#uploadBtn,
#createBtn,
#deleteSelectedBtn,
#copySelectedBtn,
#moveSelectedBtn,
#downloadZipBtn,
#extractZipBtn,
#customChooseBtn {
transition: transform 120ms ease, box-shadow 120ms ease;
transform-origin: center;
will-change: transform;
}
#uploadBtn:hover,
#createBtn:hover,
#deleteSelectedBtn:hover,
#copySelectedBtn:hover,
#moveSelectedBtn:hover,
#downloadZipBtn:hover,
#extractZipBtn:hover,
#customChooseBtn:hover {
transform: scale(1.08);
box-shadow: 0 2px 10px rgba(0,0,0,.12);
}
#uploadBtn:active,
#createBtn:active,
#deleteSelectedBtn:active,
#copySelectedBtn:active,
#moveSelectedBtn:active,
#downloadZipBtn:active,
#extractZipBtn:active,
#customChooseBtn:active {
transform: scale(1.04);
}
/* keyboard focus parity */
#uploadBtn:focus-visible,
#createBtn:focus-visible,
#deleteSelectedBtn:focus-visible,
#copySelectedBtn:focus-visible,
#moveSelectedBtn:focus-visible,
#downloadZipBtn:focus-visible,
#extractZipBtn:focus-visible,
#customChooseBtn:focus-visible {
outline: none;
transform: scale(1.08);
box-shadow: 0 0 0 3px rgba(0,123,255,.25);
}
}
/* Respect reduced motion */
@media (prefers-reduced-motion: reduce) {
#uploadBtn, #createBtn, #deleteSelectedBtn,
#copySelectedBtn, #moveSelectedBtn,
#downloadZipBtn, #extractZipBtn, #customChooseBtn {
transition: none !important;
transform: none !important;
box-shadow: none !important;
}
}
/* File table: make action buttons smaller (scoped to this btn-group) */
.btn-group.btn-group-sm[aria-label="File actions"] .btn {
padding: .2rem !important; /* tighter than BS .25/.5 */
width: 32px; /* square, compact */
height: 32px;
line-height: 1 !important;
display: inline-flex;
align-items: center;
justify-content: center;
}
/* shrink the icon glyphs */
.btn-group.btn-group-sm[aria-label="File actions"] .btn .material-icons,
.btn-group.btn-group-sm[aria-label="File actions"] .btn .material-symbols-rounded {
font-size: 20px !important; /* down from 24px */
line-height: 1 !important;
}
/* optional: tighten spacing between buttons */
.btn-group.btn-group-sm[aria-label="File actions"] .btn + .btn {
margin-left: 2px; /* BS btn-group removes gaps; tweak if needed */
}
/* subtle hover grow for file action buttons */
.btn-group.btn-group-sm[aria-label="File actions"] .btn {
transition: transform 120ms ease, box-shadow 120ms ease;
transform-origin: center;
transform: translateZ(0); /* promote to its own layer for smoother anim */
will-change: transform;
}
.btn-group.btn-group-sm[aria-label="File actions"] .btn:hover {
transform: scale(1.12);
box-shadow: 0 0 0 2px rgba(0,0,0,0.04); /* optional halo */
}
.btn-group.btn-group-sm[aria-label="File actions"] .btn:active {
transform: scale(1.06); /* a touch smaller while pressed */
}
/* keyboard focus should get the same love */
.btn-group.btn-group-sm[aria-label="File actions"] .btn:focus-visible {
transform: scale(1.12);
outline: none; /* remove default outline… */
box-shadow: 0 0 0 3px rgba(0,123,255,.25); /* …replace with accessible ring */
}
/* (optional) slightly scale the glyph too — not required since parent scales */
.btn-group.btn-group-sm[aria-label="File actions"] .btn .material-icons,
.btn-group.btn-group-sm[aria-label="File actions"] .btn .material-symbols-rounded {
transition: transform 120ms ease;
}
.btn-group.btn-group-sm[aria-label="File actions"] .btn:hover .material-icons,
.btn-group.btn-group-sm[aria-label="File actions"] .btn:hover .material-symbols-rounded {
transform: scale(1.02);
}
/* respect reduced motion */
@media (prefers-reduced-motion: reduce) {
.btn-group.btn-group-sm[aria-label="File actions"] .btn,
.btn-group.btn-group-sm[aria-label="File actions"] .btn .material-icons,
.btn-group.btn-group-sm[aria-label="File actions"] .btn .material-symbols-rounded {
transition: none !important;
transform: none !important;
}
}
/* ===========================================================
FOLDER TREE STYLES
=========================================================== */
/* Make breadcrumb links look clickable */
.breadcrumb-link {
cursor: pointer;
color: #007bff;
text-decoration: underline;
}.breadcrumb-link:hover {
color: #0056b3;
}.breadcrumb-link.selected {
background-color: #e9ecef;
font-weight: bold;
padding: 2px 4px;
border-radius: 4px;
}.folder-tree {
list-style-type: none;
padding-left: 5px;
margin: 0;
}.folder-tree.collapsed {
display: none;
}.folder-tree.expanded {
display: block;
}.folder-item {
margin: 2px 0;
display: block;
}.folder-toggle {
cursor: pointer;
margin-right: 5px;
display: inline-block;
width: 25px;
text-align: right;
}.folder-indent-placeholder {
display: inline-block;
width: 5px;
}#folderTreeContainer {
display: block;
margin-left: 10px;
}.folder-option {
cursor: pointer;
}.folder-option:hover {
background-color: #f0f0f0;
padding: 2px 4px;
}.folder-option.selected {
background-color: #d0d0d0;
border-radius: 4px;
padding: 2px 4px;
}.dark-mode .folder-option.selected {
background-color: #444;
color: #fff;
border-radius: 4px;
padding: 2px 4px;
}.dark-mode .folder-option:hover {
background-color: #333;
color: #fff;
padding: 2px 4px;
}/* ===========================================================
FILE MANAGER INLINE STYLE REMOVAL - New Classes
=========================================================== */
.image-modal-header {
display: flex;
align-items: center;
justify-content: center;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
height: 25px;
padding: 5px;
margin-bottom: 10px;
max-width: 90%;
}.image-preview-modal-content {
max-width: fit-content !important;
max-height: 90vh;
background: #fff;
padding: 20px !important;
border-radius: 4px;
overflow: hidden !important;
margin: auto;
position: relative;
display: inline-flex !important;
flex-direction: column;
align-items: center;
justify-content: center;
}@media (max-width: 600px) {
.image-preview-modal-content {
max-width: fit-content !important;
padding: 5px !important;
overflow: hidden !important;
display: inline-flex !important;
}}
.dark-mode .image-preview-modal-content {
background: #2c2c2c;
border-color: #444;
}.image-modal-img {
max-width: 100%;
max-height: 80vh;
object-fit: contain;
display: block;
margin: 0 auto;
}.close-image-modal {
position: absolute;
top: 10px;
right: 15px;
font-size: 24px;
font-weight: bold;
cursor: pointer;
z-index: 1000;
color: #ff4d4d;
background-color: rgba(255, 255, 255, 0.8);
border-radius: 50%;
width: 32px;
height: 32px;
display: flex;
justify-content: center;
align-items: center;
line-height: 1;
padding-bottom: 2px;
transition: all 0.3s ease-in-out;
}.close-image-modal:hover {
color: white;
background-color: #ff4d4d;
box-shadow: 0px 0px 6px rgba(255, 77, 77, 0.8);
transform: scale(1.05);
}.share-modal-content {
width: 600px !important;
max-width: 90vw !important;
/* ensures it doesn't exceed the viewport width */
}.dark-mode .close-image-modal {
background-color: rgba(0, 0, 0, 0.6);
color: #ff6666;
}.dark-mode .close-image-modal:hover {
background-color: #ff6666;
color: #000;
}.dark-mode .image-preview-modal-content {
background: #2c2c2c;
border-color: #444;
}.page-indicator {
margin: 0 8px;
white-space: nowrap;
}.clickable-row {
cursor: pointer;
}.file-icon {
color: #333;
margin-right: 0;
margin-left: 0;
font-size: 32px;
}.dark-mode .file-icon {
color: white;
}.bottom-select {
display: inline-block;
width: auto !important;
font-size: 16px !important;
height: 28px !important;
padding: 2px 8px !important;
line-height: 1.2 !important;
border-radius: 4px !important;
vertical-align: middle !important;
}.label-inline {
display: inline-flex;
align-items: center;
height: 28px !important;
font-size: 16px !important;
line-height: 1.2;
margin-bottom: 0;
}.items-per-page-text {
display: inline-flex;
align-items: center;
height: 28px !important;
font-size: 16px !important;
line-height: 1.2;
margin-left: 8px;
}/* ===========================================================
UPLOAD MODULE INLINE STYLE REMOVAL - New Classes
=========================================================== */
.upload-instruction {
margin-bottom: 10px;
font-size: 16px;
}.upload-file-row {
display: flex;
align-items: center;
justify-content: center;
word-break: break-word;
}.file-info-wrapper {
display: flex;
flex-direction: column;
justify-content: center !important;
align-items: center !important;
margin-top: 10px;
}.file-info-container {
display: flex;
flex-wrap: wrap !important;
justify-content: center !important;
align-items: center;
flex-wrap: wrap;
gap: 5px;
}.file-preview-container {
display: flex !important;
flex-wrap: wrap !important;
justify-content: center !important;
align-items: center !important;
gap: 5px !important;
max-width: 100% !important;
text-align: center !important;
}.file-preview-img {
max-width: 100px;
max-height: 100px;
margin-right: 5px;
justify-content: center !important;
height: auto;
display: block !important;
}@media (max-width: 600px) {
.file-preview-container {
justify-content: center !important;
}}
.file-name-display {
vertical-align: middle;
margin-left: 5px;
}.upload-progress-wrapper {
max-height: 300px;
overflow-y: auto;
}.upload-progress-list {
list-style: none;
padding: 0;
}.upload-progress-item {
padding-top: 10px;
margin-bottom: 10px;
display: flex;
align-items: center;
flex-wrap: wrap;
}.upload-progress-extra {
padding-top: 10px;
margin-bottom: 10px;
display: flex;
}.upload-file-name {
flex-grow: 1;
margin-left: 5px;
word-break: break-word;
}.upload-progress-div {
flex: 0 0 250px;
margin-left: 5px;
}/* ===========================================================
DARK MODE STYLES
=========================================================== */
.dark-mode {
background-color: #121212;
color: #e0e0e0;
}.dark-mode .container {
background-color: transparent !important;
}.dark-mode .btn-primary {
background-color: #007bff;
color: #fff;
border-color: #007bff;
}.dark-mode .btn-secondary {
background-color: #6c757d;
color: #fff;
border-color: #6c757d;
}.dark-mode .btn-danger {
background-color: #dc3545;
color: #fff;
border-color: #dc3545;
}.dark-mode .modal .modal-content,
.dark-mode .editor-modal {
background-color: #2c2c2c;
color: #e0e0e0;
border: 1px solid #444;
}.dark-mode table {
background-color: #2c2c2c;
color: #e0e0e0;
}.dark-mode #uploadProgressContainer .progress {
background-color: #333;
}.dark-mode #uploadProgressContainer .progress-bar {
background-color: #007bff;
color: #e0e0e0;
}.dark-mode-toggle {
background-color: transparent !important;
border: 1px solid transparent !important;
color: white !important;
padding: 6px 12px !important;
border-radius: 6px !important;
font-size: 0.9em !important;
font-weight: 500 !important;
cursor: pointer !important;
transition: background 0.3s, border 0.3s !important;
}.dark-mode-toggle:hover {
background-color: rgba(255, 255, 255, 0.15) !important;
}.dark-mode-toggle:active {
background-color: rgba(255, 255, 255, 0.25) !important;
}.dark-mode .dark-mode-toggle {
background-color: transparent !important;
color: white !important;
}.dark-mode .dark-mode-toggle:hover {
background-color: rgba(255, 255, 255, 0.15) !important;
}.dark-mode-toggle:focus {
outline: none !important;
box-shadow: none !important;
}.folder-help-details {
margin-top: 2px;
font-size: 12px;
color: #555;
background-color: #f9f9f9;
border: 1px solid #ddd;
border-radius: 4px;
padding: 10px;
}.folder-help-summary {
cursor: pointer;
list-style: none;
color: #000;
background: #f9f9f9;
padding: 2px;
display: inline-block;
}.folder-help-icon {
vertical-align: middle;
color: #d96601;
font-size: 24px !important;
}.folder-help-list {
margin: 0;
padding-left: 20px;
}.dark-mode .folder-help-details {
color: #ddd;
background-color: #2c2c2c;
border-color: #444;
}.dark-mode .folder-help-summary {
color: #ddd;
background: #2c2c2c;
}.dark-mode .folder-help-icon {
color: #f6a72c;
font-size: 20px;
}.dark-mode .CodeMirror {
background: #1e1e1e !important;
color: #ffffff !important;
}.dark-mode .CodeMirror-cursor {
border-left: 2px solid #ffffff !important;
}.dark-mode .CodeMirror-gutters {
background: #252526 !important;
border-right: 1px solid #444 !important;
}.dark-mode .CodeMirror-linenumber {
color: #aaaaaa !important;
}.dark-mode .CodeMirror-selected {
background: rgba(255, 255, 255, 0.2) !important;
}.dark-mode .CodeMirror-matchingbracket {
background-color: rgba(255, 255, 255, 0.1) !important;
border-bottom: 1px solid #ffffff !important;
}.zoom_in,
.zoom_out,
.rotate_left,
.rotate_right {
background: rgba(80, 80, 80, 0.6) !important;
border: none !important;
color: white !important;
cursor: pointer !important;
border-radius: 4px !important;
transition: background 0.3s ease, box-shadow 0.3s ease !important;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3) !important;
transform: translateY(-10px);
}.gallery-nav-btn {
background: rgba(80, 80, 80, 0.6) !important;
border: none !important;
color: white !important;
font-size: 48px !important;
cursor: pointer !important;
padding: 10px 15px !important;
border-radius: 4px !important;
transition: background 0.3s ease, box-shadow 0.3s ease !important;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3) !important;
}.gallery-nav-btn:hover,
.zoom_in:hover,
.zoom_out:hover,
.rotate_left:hover,
.rotate_right:hover {
background: rgba(80, 80, 80, 0.8) !important;
box-shadow: 0 3px 6px rgba(0, 0, 0, 0.4) !important;
}.drop-hover {
background-color: #e0e0e0;
border: 1px dashed #666;
}.dark-mode .drop-hover {
background-color: rgba(255, 255, 255, 0.1) !important;
border-bottom: 1px dashed #ffffff !important;
}#restoreFilesList li {
display: flex !important;
align-items: center !important;
margin-bottom: 5px;
}#restoreFilesList li input[type="checkbox"] {
margin: 0 !important;
transform: translateY(-3px) !important;
}#restoreFilesList li label {
margin-left: 8px !important;
}.dark-mode #fileContextMenu {
background-color: #2c2c2c !important;
border: 1px solid #555 !important;
color: #e0e0e0 !important;
}.dark-mode #fileContextMenu div {
color: #e0e0e0 !important;
}#folderContextMenu {
font-family: Arial, sans-serif;
font-size: 14px;
}.dark-mode #folderContextMenu {
background-color: #2c2c2c;
border-color: #555;
color: #e0e0e0;
}.drop-target-sidebar {
display: none;
background-color: #f8f9fa;
border-right: 2px dashed #1565C0;
margin-top: 10px;
margin-left: 10px;
}@media (min-width: 769px) {
.drop-target-sidebar {
display: block;
}}
.drop-target-sidebar.active,
.drag-header.active {
width: 350px;
height: 750px;
}
/* Fixed-width sidebar (always 350px) */
#sidebarDropArea{
width: 350px;
min-width: 350px;
max-width: 350px;
flex: 0 0 350px;
box-sizing: border-box;
}
.main-column {
flex: 1;
transition: margin-left 0.3s ease;
}#uploadFolderRow {
display: flex;
flex-wrap: nowrap;
gap: 1rem;
}@media (max-width: 768px) {
#uploadFolderRow {
gap: 0px;
}}
#leftCol,
#rightCol {
display: flex;
justify-content: center;
min-width: 370px;
align-self: flex-start;
}#leftCol {
flex: 0 1 60%;
}#rightCol {
flex: 0 1 40%;
}@media (max-width: 768px) {
.main-wrapper {
flex-direction: column;
}.drop-target-sidebar {
display: none !important;
}#uploadFolderRow {
flex-wrap: wrap;
}#leftCol, #rightCol {
flex: 0 1 100% !important;
}#rightCol {
margin-bottom: 0;
}}
#sidebarDropArea.highlight,
#uploadFolderRow.highlight {
border: 2px dashed #1565C0;
background-color: #eef;
}.drag-header {
cursor: grab;
user-select: none;
position: relative;
}.drag-header::after {
content: '⋮⋮';
position: absolute;
right: 10px;
top: 50%;
transform: translateY(-50%);
font-size: 16px;
color: #1565C0;
pointer-events: none;
}.dragging {
transform: scale(1.05);
box-shadow: 0 20px 30px rgba(0, 0, 0, 0.3);
transition: transform 0.2s ease, box-shadow 0.2s ease;
z-index: 10000;
}#uploadCard,
#folderManagementCard {
transition: transform 0.3s ease, opacity 0.3s ease;
width: 100%;
margin-bottom: 20px;
min-height: 320px;
}#uploadFolderRow.highlight {
min-height: 320px;
margin-bottom: 20px;
}#sidebarDropArea,
#uploadFolderRow {
background-color: transparent;
}
.dark-mode #sidebarDropArea,
.dark-mode #uploadFolderRow {
background-color: transparent;
}.dark-mode #sidebarDropArea.highlight,
.dark-mode #uploadFolderRow.highlight {
background-color: #333;
border: 2px dashed #555;
color: #fff;
}.drop-target-sidebar.highlight {
margin-top: 10px;
}.drop-target-sidebar:not(.highlight) {
border: none !important;
}.dragging:focus {
outline: none;
}.card {
background-color: #fff;
color: #000;
border: 1px solid #ddd;
max-width: 900px;
width: 100%;
margin: 0 auto;
}.dark-mode .card {
background-color: #2c2c2c;
color: #e0e0e0;
border: 1px solid #444;
}.card-header {
font-size: 1.2rem;
font-weight: bold;
}.custom-folder-card-body {
padding-top: 5px !important;
padding-right: 0 !important;
padding-left: 0 !important;
}#addUserModal,
#removeUserModal {
z-index: 5000 !important;
}#customConfirmModal {
z-index: 12000 !important;
}.admin-panel-content {
background: #fff;
color: #000;
}.dark-mode .admin-panel-content {
background: #2c2c2c;
color: #e0e0e0;
border: 1px solid #444;
}.dark-mode .admin-panel-content input,
.dark-mode .admin-panel-content select,
.dark-mode .admin-panel-content textarea {
background: #3a3a3a;
color: #e0e0e0;
border: 1px solid #555;
}.dark-mode .admin-panel-content label {
color: #e0e0e0;
}#openChangePasswordModalBtn {
width: max-content;
padding: 6px 12px;
font-size: 14px;
}#changePasswordModal {
z-index: 9999;
}@keyframes spin {
0% { transform: rotate(0deg);
}100% {
transform: rotate(360deg);
}}
.spinning {
animation: spin 1s linear infinite;
}.download-spinner {
font-size: 48px;
animation: spin 2s linear infinite;
color: var(--download-spinner-color, #000);
}body:not(.dark-mode) {
--download-spinner-color: #000;
}.dark-mode {
--download-spinner-color: #fff;
}.rise-effect {
transform: translateY(-20px);
transition: transform 0.3s ease;
}.toggle-modal-btn,
.collapse-btn {
background: none;
border: none;
outline: none;
cursor: pointer;
padding: 8px;
font-size: 24px;
color: #616161;
border-radius: 50%;
transition: background 0.3s ease;
}.toggle-modal-btn:hover,
.collapse-btn:hover {
background: rgba(0, 0, 0, 0.1);
}.toggle-modal-btn:focus,
.collapse-btn:focus {
outline: none;
}.header-drop-zone {
width: 66px;
height: 36px;
align-items: center;
justify-content: center;
gap: 5px;
display: inline-flex;
}.header-drop-zone.drag-active {
border: 2px dashed #1565C0;
background-color: #eef;
background-color: transparent;
transition: width 0.3s ease;
box-sizing: border-box;
}.dark-mode .header-drop-zone.drag-active {
background-color: #333;
border: 2px dashed #555;
color: #fff;
}.header-drop-zone.drag-active:empty::before {
content: "Drop Zone";
font-size: 10px;
padding-right: 6px;
color: #aaa;
}/* Disable text selection on rows to prevent accidental copying when shift-clicking */
#fileList tbody tr.clickable-row {
-webkit-user-select: none; /* Safari */
-moz-user-select: none; /* Firefox */
-ms-user-select: none; /* IE10+/Edge */
user-select: none; /* Standard */
}#fileSummary {
color: black;
}@media only screen and (max-width: 600px) {
#fileSummary,
#rowHeightSliderContainer,
#viewSliderContainer {
float: none !important;
margin: 0 auto !important;
text-align: center !important;
display: block !important;
}}
#viewSliderContainer label,
#viewSliderContainer span {
line-height: 1;
margin: 0;
padding: 0;
}.dark-mode #fileSummary {
color: white;
}#searchIcon {
border-radius: 4px;
padding: 4px 8px;
}.dark-mode #searchIcon {
background-color: #444;
border: 1px solid #555;
color: #fff;
}.dark-mode #searchInput {
background-color: #333;
color: #e0e0e0;
border: 1px solid #555;
}.btn-icon {
background: transparent;
border: none;
padding: 6px 8px;
margin: 0;
display: inline-flex;
align-items: center;
justify-content: center;
cursor: pointer;
transition: background 0.2s, color 0.2s;
}.btn-icon .material-icons,
#searchIcon .material-icons {
font-size: 24px;
line-height: 1;
margin: 0;
padding: 0;
color: #333;
}.btn-icon:hover,
.btn-icon:focus {
background: rgba(0, 0, 0, 0.1);
outline: none;
}.dark-mode .btn-icon .material-icons,
.dark-mode #searchIcon .material-icons {
color: #fff;
}.dark-mode .btn-icon:hover,
.dark-mode .btn-icon:focus {
background: rgba(255, 255, 255, 0.1);
}.user-dropdown {
position: relative;
display: inline-block;
}.user-dropdown .user-menu {
display: none;
position: absolute;
right: 0;
margin-top: 0.25rem;
background: var(--bs-body-bg, #fff);
border: 1px solid #ccc;
border-radius: 4px;
min-width: 150px;
box-shadow: 0 2px 6px rgba(0,0,0,0.2);
z-index: 1000;
}.user-dropdown .user-menu.show {
display: block;
}.user-dropdown .user-menu .item {
padding: 0.5rem 0.75rem;
cursor: pointer;
white-space: nowrap;
}.user-dropdown .user-menu .item:hover {
background: #f5f5f5;
}.user-dropdown .dropdown-caret {
border-top: 5px solid currentColor;
border-left: 5px solid transparent;
border-right: 5px solid transparent;
display: inline-block;
vertical-align: middle;
margin-left: 0.25rem;
}.dark-mode .user-dropdown .user-menu {
background: #2c2c2c;
border-color: #444;
}.dark-mode .user-dropdown .user-menu .item {
color: #e0e0e0;
}.dark-mode .user-dropdown .user-menu .item:hover {
background: rgba(255,255,255,0.1);
}.user-dropdown .dropdown-username {
margin: 0 8px;
font-weight: 500;
vertical-align: middle;
white-space: nowrap;
}
.folder-strip-container {
display: flex;
padding-top: 0px !important;
flex-wrap: wrap;
gap: 10px 14px;
align-content: flex-start; /* multi-line wrap stays top-aligned */
padding: 6px 4px;
}
.folder-strip-container .folder-item {
display: flex;
padding-top: 0px !important;
flex-direction: column;
align-items: center; /* horizontal (cross-axis) center */
justify-content: center; /* vertical (main-axis) center */
min-width: 0;
gap: 2px !important;
padding: 6px 8px;
box-sizing: border-box;
border-radius: 10px;
color: inherit;
font-size: 0.85em;
transition: transform .12s ease, box-shadow .12s ease, background-color .12s ease;
}
.folder-strip-container .folder-item .folder-svg {
line-height: 0;
margin-bottom: 0px;
}
.folder-strip-container .folder-item .folder-svg svg {
width: 48px;
height: 48px;
display: block;
}
.folder-strip-container .folder-name {
display: block;
width: 100%;
max-width: 100%;
white-space: normal;
overflow-wrap: anywhere;
word-break: break-word;
hyphens: auto;
text-align: center;
overflow: visible;
text-overflow: clip;
line-height: 1.2;
}
.folder-strip-container .folder-item:hover {
transform: translateY(-1px) scale(1.04);
background-color: rgba(0, 0, 0, 0.04); /* light mode */
box-shadow: 0 4px 10px rgba(0, 0, 0, .15);
}
/* Dark mode hover */
body.dark-mode .folder-strip-container .folder-item:hover {
background-color: rgba(255, 255, 255, 0.06);
box-shadow: 0 6px 16px rgba(0, 0, 0, .45);
}
/* Optional: keyboard focus */
.folder-strip-container .folder-item:focus-visible {
outline: 2px solid #8ab4f8;
outline-offset: 2px;
}
:root {
--perm-caret: #444;
}/* light */
.dark-mode {
--perm-caret: #ccc;
}/* dark */
#zonesToggleFloating,
#sidebarToggleFloating {
transition:
transform 160ms cubic-bezier(.2,.0,.2,1),
box-shadow 160ms cubic-bezier(.2,.0,.2,1),
border-color 160ms cubic-bezier(.2,.0,.2,1),
background-color 160ms cubic-bezier(.2,.0,.2,1);
}:root {
--toggle-icon-color: #333;
}.dark-mode {
--toggle-icon-color: #eee;
}#zonesToggleFloating .material-icons,
#zonesToggleFloating .material-icons-outlined,
#sidebarToggleFloating .material-icons,
#sidebarToggleFloating .material-icons-outlined {
color: var(--toggle-icon-color);
font-size: 22px;
line-height: 1;
display: block;
}#zonesToggleFloating:hover,
#sidebarToggleFloating:hover {
transform: translateY(-1px);
box-shadow: 0 6px 16px rgba(0,0,0,.14);
border-color: #cfcfcf;
}#zonesToggleFloating:active,
#sidebarToggleFloating:active {
transform: translateY(0) scale(.96);
box-shadow: 0 3px 8px rgba(0,0,0,.12);
}#zonesToggleFloating:focus-visible,
#sidebarToggleFloating:focus-visible {
outline: none;
box-shadow:
0 6px 16px rgba(0,0,0,.14),
0 0 0 3px rgba(25,118,210,.25); /* soft brandy ring */
}#zonesToggleFloating::after,
#sidebarToggleFloating::after {
content: '';
position: absolute;
inset: 0;
border-radius: inherit;
background: radial-gradient(circle, rgba(0,0,0,.12) 0%, rgba(0,0,0,0) 60%);
transform: scale(0);
opacity: 0;
transition: transform 300ms ease, opacity 450ms ease;
pointer-events: none;
}#zonesToggleFloating:active::after,
#sidebarToggleFloating:active::after {
transform: scale(1.4);
opacity: 1;
}#zonesToggleFloating.is-collapsed,
#sidebarToggleFloating.is-collapsed {
background: #fafafa;
border-color: #e2e2e2;
}
/* media modal polish */
.media-modal { background: var(--panel-bg, #121212); }
.media-header-bar .btn { padding: 6px 10px; }
.gallery-nav-btn { color: #fff; opacity: 0.85; }
.gallery-nav-btn:hover { opacity: 1; transform: scale(1.05); }
/* badges */
.status-badge {
display: inline-block;
margin-left: 6px;
padding: 2px 6px;
font-size: 11px;
line-height: 1.3;
border-radius: 999px;
border: 1px solid rgba(255,255,255,.15);
background: rgba(255,255,255,.08);
color: #fff;
}
.status-badge.watched {
border-color: rgba(34,197,94,.45); /* green-ish */
background: rgba(34,197,94,.15);
}
.status-badge.progress {
border-color: rgba(234,88,12,.55); /* amber-ish */
background: rgba(234,88,12,.18);
}
#downloadProgressModal .modal-body,
#downloadProgressModal .rise-modal-body,
#downloadProgressModal .modal-content {
min-height: 88px;
overflow: hidden;
}
#downloadProgressText {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
#downloadProgressBarOuter { height: 10px; }
/* ===== Folder Tree theme + structure ===== */
#folderTreeContainer {
/* Theme vars (light mode defaults) */
--filr-folder-front: #f6b84e;
--filr-folder-back: #ffd36e;
--filr-folder-stroke:#a87312;
--filr-paper-fill: #ffffff;
--filr-paper-stroke: #9fb3d6; /* slightly darker for sharper paper */
/* Sizes */
--row-h: 28px;
--twisty: 24px;
--twisty-gap: -5px;
--icon-size: 24px;
--icon-gap: 6px;
--indent: 10px;
}
#folderTreeContainer .folder-item { position: static; padding-left: 0; }
#folderTreeContainer .folder-item > .folder-tree { margin-left: var(--indent); }
#folderTreeContainer .folder-row {
position: relative;
display: flex;
align-items: center;
min-height: var(--row-h);
height: auto;
padding-left: calc(var(--twisty) + var(--twisty-gap));
}
/* Chevron + spacer (centered vertically) */
#folderTreeContainer .folder-row > button.folder-toggle,
#folderTreeContainer .folder-row > .folder-spacer {
position: absolute; left: 0; top: 50%; transform: translateY(-50%);
width: var(--twisty); height: var(--twisty);
display: inline-flex; align-items: center; justify-content: center;
border: 1px solid transparent; border-radius: 6px;
background: transparent; cursor: pointer;
}
#folderTreeContainer .folder-row > button.folder-toggle::before {
content: "▸"; font-size: calc(var(--twisty) * 0.8); line-height: 1;
}
#folderTreeContainer li[role="treeitem"][aria-expanded="true"]
> .folder-row > button.folder-toggle::before,
#rootRow[aria-expanded="true"] > button.folder-toggle::before { content: "▾"; }
#folderTreeContainer .folder-row > button.folder-toggle:hover {
border-color: color-mix(in srgb, #7ab3ff 35%, transparent);
}
/* Row "pill" that hugs content and wraps */
#folderTreeContainer .folder-option {
display: inline-flex;
flex: 0 1 auto; /* don't stretch full width */
align-items: center;
gap: var(--icon-gap);
height: auto;
min-height: var(--row-h);
padding: 0 8px;
border-radius: 8px;
line-height: 1.2;
user-select: none;
max-width: 100%;
white-space: normal; /* allow wrapping */
}
#folderTreeContainer .folder-option:hover {
background: rgba(122,179,255,.14);
}
#folderTreeContainer .folder-option.selected {
background: rgba(122,179,255,.24);
box-shadow: inset 0 0 0 1px rgba(122,179,255,.45);
}
/* Label must be shrinkable so wrapping works */
#folderTreeContainer .folder-label {
flex: 1 1 120px;
min-width: 0;
white-space: normal;
overflow-wrap: anywhere;
word-break: break-word;
line-height: 1.2;
}
/* Icon box */
#folderTreeContainer .folder-icon {
flex: 0 0 var(--icon-size);
width: var(--icon-size); height: var(--icon-size);
display: inline-flex; align-items: center; justify-content: center;
}
#folderTreeContainer .folder-icon svg {
width: 100%; height: 100%; display: block;
shape-rendering: geometricPrecision;
}
/* Make folder tree outline match folder strip */
#folderTreeContainer .folder-icon .folder-front,
#folderTreeContainer .folder-icon .folder-back {
fill: currentColor;
stroke: var(--filr-folder-stroke);
stroke-width: .5;
paint-order: fill stroke;
stroke-linejoin: round;
stroke-linecap: round;
vector-effect: non-scaling-stroke;
}
#folderTreeContainer .folder-icon .folder-front { color: var(--filr-folder-front); }
#folderTreeContainer .folder-icon .folder-back { color: var(--filr-folder-back); }
#folderTreeContainer .folder-icon .paper {
fill: var(--filr-paper-fill);
stroke: var(--filr-paper-stroke);
stroke-width: 1.5;
paint-order: stroke fill;
}
#folderTreeContainer .folder-icon .paper-fold { fill: var(--filr-paper-stroke); }
#folderTreeContainer .folder-icon .paper-line {
stroke: var(--filr-paper-stroke); stroke-width: 1.5;
stroke-linecap: round; fill: none; opacity: .95;
}
#folderTreeContainer .folder-icon .lip-highlight {
fill: none; vector-effect: non-scaling-stroke;
}
#folderTreeContainer .folder-icon,
#folderTreeContainer .folder-label { transform: none !important; }
/* ===== File List Strip color the shared folderSVG() ===== */
.folder-strip-container .folder-svg svg {
display: block;
shape-rendering: crispEdges;
}
.folder-strip-container .folder-item {
/* defaults — overridden per-tile via inline CSS vars set in JS */
--filr-folder-front: #f6b84e;
--filr-folder-back: #ffd36e;
--filr-folder-stroke: #a87312;
}
.folder-strip-container .folder-svg .folder-front,
.folder-strip-container .folder-svg .folder-back {
fill: currentColor;
stroke: var(--filr-folder-stroke);
stroke-width: .5;
paint-order: fill stroke;
stroke-linejoin: round;
stroke-linecap: round;
}
.folder-strip-container .folder-svg .folder-front { color: var(--filr-folder-front); }
.folder-strip-container .folder-svg .folder-back { color: var(--filr-folder-back); }
.folder-strip-container .folder-svg .paper {
fill: #fff;
stroke: #b2c2db; /* light mode */
stroke-width: 1;
vector-effect: non-scaling-stroke;
}
.folder-strip-container .folder-svg .paper-fold { fill: #b2c2db; }
.folder-strip-container .folder-svg .paper-line {
stroke: #b2c2db; stroke-width: 1; stroke-linecap: round; fill: none;
vector-effect: non-scaling-stroke;
}
.folder-strip-container .folder-svg .lip-highlight {
fill: none;
vector-effect: non-scaling-stroke;
}
#folderTreeContainer .folder-icon .folder-front,
#folderTreeContainer .folder-icon .folder-back,
.folder-strip-container .folder-svg .folder-front,
.folder-strip-container .folder-svg .folder-back,
#folderTreeContainer .folder-icon .lip-highlight,
.folder-strip-container .folder-svg .lip-highlight {
stroke-linejoin: round;
stroke-linecap: round;
}
/* Make sure were not forcing crispEdges anywhere */
.folder-strip-container .folder-svg svg,
#folderTreeContainer .folder-icon svg { shape-rendering: geometricPrecision !important; }
@media (max-resolution: 1.5dppx) {
#folderTreeContainer .folder-icon .folder-front,
#folderTreeContainer .folder-icon .folder-back { stroke-width: .6; }
}
/* Scribble (the handwriting line) */
#folderTreeContainer .folder-icon .paper-ink,
.folder-strip-container .folder-svg .paper-ink {
stroke: #4da3ff;
stroke-width: .9;
stroke-linecap: round;
stroke-linejoin: round;
fill: none;
opacity: .85;
paint-order: normal;
}
/* tree @ 24px icon */
#folderTreeContainer .folder-icon .folder-front,
#folderTreeContainer .folder-icon .folder-back,
#folderTreeContainer .folder-icon .paper-line,
#folderTreeContainer .folder-icon .paper-ink,
#folderTreeContainer .folder-icon .lip-highlight { stroke-width: .6px; }
/* strip @ 48px icon (2× bigger), halve stroke width to look the same */
.folder-strip-container .folder-svg .folder-front,
.folder-strip-container .folder-svg .folder-back,
.folder-strip-container .folder-svg .paper-line,
.folder-strip-container .folder-svg .paper-ink,
.folder-strip-container .folder-svg .lip-highlight { stroke-width: 1.1px; }