diff --git a/CHANGELOG.md b/CHANGELOG.md index 4cc95e5..82fca0e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Changelog +## Changes 11/14/2025 (v1.9.7) + +release(v1.9.7): harden client path guard and refine header/folder strip CSS + +- Tighten isSafeFolderPath() to reject dot-prefixed/invalid segments (client-side defense-in-depth on folder paths). +- Rework header layout: consistent logo sizing, centered title, cleaner button alignment, and better small-screen stacking. +- Polish user dropdown and icon buttons: improved hover/focus states, dark-mode colors, and rounded menu corners. +- Update folder strip tiles: cap tile width, allow long folder names to wrap neatly, and fine-tune text/icon alignment. +- Tweak folder tree rows: better label wrapping, vertical alignment, and consistent SVG folder icon rendering. +- Small CSS cleanup and normalization (body, main wrapper, media modal/progress styles) without changing behavior. + +--- + ## Changes 11/14/2025 (v1.9.6) release(v1.9.6): hardened resumable uploads, menu/tag UI polish and hidden temp folders (closes #67) diff --git a/public/css/styles.css b/public/css/styles.css index 89979be..4a49496 100644 --- a/public/css/styles.css +++ b/public/css/styles.css @@ -1,134 +1,73 @@ -/* =========================================================== - 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 */ +:root{--header-h: 55px;} +.header-container{min-height: var(--header-h);} +img.logo{width:50px; height:50px; display:block;} +.is-visually-hidden{visibility: hidden; + pointer-events: none;} +#userPanelModal .modal-content, +#adminPanelModal .modal-content, +#userPermissionsModal .modal-content, +#userFlagsModal .modal-content{border-radius: var(--menu-radius);} +#fr-login-tip{min-height: 40px; max-width: 520px; margin: 8px auto 0; border-radius: var(--menu-radius); padding: 10px 12px; text-align: left; - margin-bottom: 10px; -} -.main-wrapper{ - display:flex; /* or grid—flex is fine here */ + margin-bottom: 10px;} +.main-wrapper{display:flex; gap:5px; - align-items:flex-start; -} - - - - -/* GENERAL STYLES */ -body { - font-family: 'Roboto', sans-serif; + align-items:flex-start;} +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; + 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: 2px !important;} +.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); + padding-left: 4px !important;} +@media (min-width: 1300px) { + .container-fluid{padding-left: 20px !important; + padding-right: 20px !important;} } - -/* Button */ -.btn-color-folder{ - display:inline-flex; align-items:center; gap:6px; +@media (max-width: 600px) { + .zones-toggle{left: 85px !important;} +} +:root{--filr-accent-500:#008CB4; + --filr-accent-600:#00789A; + --filr-accent-700:#006882; + --filr-accent-ring:rgba(0,140,180,.4);} +.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 */ -} - + color:#fff;} +.btn-color-folder .material-icons{color:currentColor;} .btn-color-folder:hover, -.btn-color-folder:focus-visible{ - background:var(--filr-accent-600); +.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 .btn-color-folder{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; -} + 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; +.dark-mode .btn-color-folder:focus-visible{background:var(--filr-accent-700);} +.btn-login{margin-top: 10px;} +.orange-icon{color: #2196F3 !important; font-size: 34px !important; - transform: translateY(-3px) !important; - }.red-icon { - width: 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; + transform: translateY(-3px) !important;} +.header-container{display: flex; align-items: center; justify-content: space-between; width: 100%; @@ -136,177 +75,126 @@ body { 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; + 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; + 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; + min-width: 100px;} +.header-title{position: absolute; left: 50%; transform: translateX(-50%); text-align: center; - white-space: nowrap; - }.header-title h1 { - font-size: 2rem; + white-space: nowrap;} +.header-title h1{font-size: 2rem; color: #fff; - margin: 0; - }.header-buttons { - display: flex; + 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; + 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 */ + 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; align-items: center; - min-height: 40px; /* so the label has room */ - } - .header-buttons button:hover { - background-color: rgba(122,179,255,.14); + min-height: 40px;} +.header-buttons button:hover{background-color: rgba(122,179,255,.14); box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); - color: #fff; - }@media (max-width: 600px) { - header { - flex-direction: column; + 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; + 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; + 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; + 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; + transition: background 0.3s;} +.dark-mode-toggle:hover{background-color: rgba(255, 255, 255, 0.2);} +.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; + box-shadow: 2px 2px 6px rgba(0, 0, 0, 0.2);} +.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; + 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; + padding-right: 10px !important;} +.dark-mode #folderHelpBtn i.material-icons.folder-help-icon{-webkit-text-fill-color: #ffa500 !important; + padding-right: 10px !important;} +@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; + 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; + 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; + margin-top: 5px;} +} +.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; + 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; @@ -317,46 +205,30 @@ body { 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; + transition: background-color 0.3s;} +.remove-file-btn:hover{background-color: red; + color: white;} +.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: var(--menu-radius); - }.dark-mode #loginForm { - background-color: #2c2c2c; + border-radius: var(--menu-radius);} +.dark-mode #loginForm{background-color: #2c2c2c; color: #e0e0e0; padding: 20px; border-radius: var(--menu-radius); - box-shadow: 0 2px 4px rgba(255, 255, 255, 0.2); - }.dark-mode #loginForm input { - background-color: #333; + 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; + 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; + border: none;} +.dark-mode #loginForm button:hover{background-color: #0056b3;} +#restoreFilesModal .modal-content{position: fixed !important; top: 50% !important; left: 50% !important; transform: translate(-50%, -50%) !important; @@ -364,77 +236,54 @@ body { 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; + background: transparent !important;} +#restoreFilesModal .modal-content{background: #fff !important; padding: 20px; border: 1px solid #ccc; - border-radius: var(--menu-radius); - }/* Override modal content for dark mode */ - .dark-mode #restoreFilesModal .modal-content { - background: #2c2c2c !important; + border-radius: var(--menu-radius);} +.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, + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.6) !important;} +#restoreSelectedBtn, #restoreAllBtn, #deleteTrashSelectedBtn, #deleteAllBtn, - #closeRestoreModal { - padding: 10px 20px !important; + #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; + margin-bottom: 10px !important;} +#restoreSelectedBtn{background-color: #007bff !important; + color: #ffffff !important;} +#restoreSelectedBtn:hover{background-color: #0056b3 !important; + color: #ffffff !important;} +#restoreAllBtn{background-color: #6c757d !important; + color: #ffffff !important;} +#restoreAllBtn:hover{background-color: #5a6268 !important; + color: #ffffff !important;} +#deleteTrashSelectedBtn{background-color: #ffc107 !important; + color: #212529 !important;} +#deleteTrashSelectedBtn:hover{background-color: #e0a800 !important; + color: #212529 !important;} +#deleteAllBtn{background-color: #dc3545 !important; + color: #ffffff !important;} +#deleteAllBtn:hover{background-color: #c82333 !important; + color: #ffffff !important;} +#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; + z-index: 1050;} +.modal .modal-content{position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); @@ -450,18 +299,14 @@ body { 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; + 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; + border-color: #444;} +.editor-close-btn{position: absolute; top: 10px; right: 10px; display: flex; @@ -479,21 +324,16 @@ body { 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; + 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; + 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{position: fixed; top: 2%; left: 5%; width: 90vw; @@ -507,425 +347,274 @@ body { display: flex !important; flex-direction: column !important; overflow: hidden !important; - resize: both !important; - }/* Editor Textarea */ - .editor-textarea { - flex-grow: 1 !important; + resize: both !important;} +.editor-textarea{flex-grow: 1 !important; width: 100% !important; resize: none !important; - overflow: auto !important; - }.dark-mode .editor-modal { - background-color: #2c2c2c; + overflow: auto !important;} +.dark-mode .editor-modal{background-color: #2c2c2c; color: #e0e0e0; - border-color: #444; - }@media (max-width: 768px) { - .editor-modal { - top: 0%; + 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; + 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-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; + margin-bottom: 5px;} +.editor-footer{margin-top: 5px; + text-align: right;} +.modal-content .button-container{display: flex !important; justify-content: flex-end; gap: 5px; - margin-top: 20px; - }.logout-container { - position: absolute; + 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; + 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; + 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; + white-space: nowrap;} +@media (max-width: 768px) { + #customChooseBtn{font-size: 14px; + padding: 6px 14px;} +} +.pause-resume-btn{background: none; border: none; padding: 0; margin: 0; cursor: pointer; outline: none; - margin-right: 5px; - }.material-icons.pauseResumeBtn { - color: black !important; + 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; + 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; + margin: 0;} +#uploadProgressContainer li{display: flex; align-items: center; margin-bottom: 10px; - flex-wrap: wrap; - }#uploadProgressContainer .file-preview { - width: 32px !important; + 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; + flex-shrink: 0;} +#uploadProgressContainer .file-preview img{width: 32px !important; height: 32px !important; - object-fit: cover; - }#uploadProgressContainer .file-name { - margin: 0 20px 0 2px; + object-fit: cover;} +#uploadProgressContainer .file-name{margin: 0 20px 0 2px; flex-grow: 1; - word-break: break-word; - }#uploadProgressContainer .progress { - background-color: #e9ecef; + 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; + 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; + font-size: 0.9rem;} +#uploadProgressContainer{margin-top: 20px;} +@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; + 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;} +} +.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; + 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; + 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;} +#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 ===== */ + width: 100% !important;} +#fileList table tr:nth-child(even){background-color: transparent;} +:root{--filr-row-hover-bg: rgba(122,179,255,.14); + --filr-row-selected-bg: rgba(122,179,255,.24);} +#fileList table{border-collapse: separate; + border-spacing: 0;} #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 tbody tr > td{background-color: transparent !important;} +#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;} #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 td{transition: background-color .12s ease;} +#fileList table.filr-table tbody tr:hover:not(.selected, .row-selected, .selected-row, .is-selected) > td{background: var(--filr-row-hover-bg) !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 0 0 1px rgba(122,179,255,.45); -} - -/* Rounded “pill” ends on hover/selected */ +#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);} #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.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; +#fileList table.filr-table tbody tr.is-selected > td:last-child{border-top-right-radius: 8px; + border-bottom-right-radius: 8px;} +#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; -} + 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; -} - +.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; -} - +#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; } +.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 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; +#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); -} + 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: +#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; -} + 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: +#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; + 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 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: + 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; } + 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; +#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; + 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; + 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; + 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; @@ -934,155 +623,107 @@ body { vertical-align: middle !important; padding: 8px 10px !important; max-width: 250px !important; - min-width: 120px !important; - }@media (min-width: 500px) { + 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 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 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; + #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; + 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; + height: auto !important;} +h2{font-size: 2em;} +.form-group{margin-bottom: 10px;} +label{font-size: 0.9rem;} +.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; + 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; + margin: 0;} +@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; + 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; + 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) { + 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; + .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: #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; + 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; + border: none;} +.dark-mode .custom-prev-next-btn:hover:not(:disabled){background-color: #555;} +#customToast{position: fixed; bottom: 20px; right: 20px; background: #333; @@ -1094,29 +735,22 @@ body { transition: opacity 0.5s ease; z-index: 9999; min-width: 250px; - display: none; - }#customToast.show { - opacity: 0.9; - }.button-wrap { - display: flex; + 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; + 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; + 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; + vertical-align: middle !important;} +#fileListContainer{border: 1px solid #e0e0e0; background: white; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); border-radius: var(--menu-radius); @@ -1124,69 +758,48 @@ body { 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; + 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: var(--menu-radius); - }#fileListContainer>h2, + border-radius: var(--menu-radius);} +#fileListContainer>h2, #fileListContainer>.file-list-actions, - #fileListContainer>#fileList { - margin-left: 15px; - }@media (max-width: 768px) { + #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; + #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; + 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 */ + 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;} +} @media (hover:hover) and (pointer:fine) { - /* list your action IDs here */ #uploadBtn, #createBtn, #deleteSelectedBtn, @@ -1194,12 +807,9 @@ body { #moveSelectedBtn, #downloadZipBtn, #extractZipBtn, - #customChooseBtn { - transition: transform 120ms ease, box-shadow 120ms ease; + #customChooseBtn{transition: transform 120ms ease, box-shadow 120ms ease; transform-origin: center; - will-change: transform; - } - + will-change: transform;} #uploadBtn:hover, #createBtn:hover, #deleteSelectedBtn:hover, @@ -1207,11 +817,8 @@ body { #moveSelectedBtn:hover, #downloadZipBtn:hover, #extractZipBtn:hover, - #customChooseBtn:hover { - transform: scale(1.08); - box-shadow: 0 2px 10px rgba(0,0,0,.12); - } - + #customChooseBtn:hover{transform: scale(1.08); + box-shadow: 0 2px 10px rgba(0,0,0,.12);} #uploadBtn:active, #createBtn:active, #deleteSelectedBtn:active, @@ -1219,11 +826,7 @@ body { #moveSelectedBtn:active, #downloadZipBtn:active, #extractZipBtn:active, - #customChooseBtn:active { - transform: scale(1.04); - } - - /* keyboard focus parity */ + #customChooseBtn:active{transform: scale(1.04);} #uploadBtn:focus-visible, #createBtn:focus-visible, #deleteSelectedBtn:focus-visible, @@ -1231,154 +834,86 @@ body { #moveSelectedBtn:focus-visible, #downloadZipBtn:focus-visible, #extractZipBtn:focus-visible, - #customChooseBtn:focus-visible { - outline: none; + #customChooseBtn:focus-visible{outline: none; transform: scale(1.08); - box-shadow: 0 0 0 3px rgba(0,123,255,.25); - } + 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; + #downloadZipBtn, #extractZipBtn, #customChooseBtn{transition: none !important; transform: none !important; - box-shadow: 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 */ +.btn-group.btn-group-sm[aria-label="File actions"] .btn{padding: .2rem !important; + width: 32px; height: 32px; line-height: 1 !important; display: inline-flex; align-items: center; - justify-content: center; -} - -/* shrink the icon glyphs */ + justify-content: center;} .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; +.btn-group.btn-group-sm[aria-label="File actions"] .btn .material-symbols-rounded{font-size: 20px !important; + line-height: 1 !important;} +.btn-group.btn-group-sm[aria-label="File actions"] .btn + .btn{margin-left: 2px;} +.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 */ + transform: translateZ(0); + 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);} +.btn-group.btn-group-sm[aria-label="File actions"] .btn:active{transform: scale(1.06);} +.btn-group.btn-group-sm[aria-label="File actions"] .btn:focus-visible{transform: scale(1.12); + outline: none; + box-shadow: 0 0 0 3px rgba(0,123,255,.25);} .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 .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 */ +.btn-group.btn-group-sm[aria-label="File actions"] .btn:hover .material-symbols-rounded{transform: scale(1.02);} @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; - } + .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; +.breadcrumb-link{cursor: pointer; color: #007bff; - text-decoration: underline; - }.breadcrumb-link:hover { - color: #0056b3; - }.breadcrumb-link.selected { - background-color: #e9ecef; + 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; + 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: 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; + 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; + 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; + 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; + padding: 2px 4px;} +.image-modal-header{display: flex; align-items: center; justify-content: center; white-space: nowrap; @@ -1387,9 +922,8 @@ body { height: 25px; padding: 5px; margin-bottom: 10px; - max-width: 90%; - }.image-preview-modal-content { - max-width: fit-content !important; + max-width: 90%;} +.image-preview-modal-content{max-width: fit-content !important; max-height: 90vh; background: #fff; padding: 20px !important; @@ -1400,26 +934,19 @@ body { 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; + 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%; + display: inline-flex !important;} +} +.image-modal-img{max-width: 100%; max-height: 80vh; object-fit: contain; display: block; - margin: 0 auto; - }.close-image-modal { - position: absolute; + margin: 0 auto;} +.close-image-modal{position: absolute; top: 10px; right: 15px; font-size: 24px; @@ -1436,165 +963,121 @@ body { align-items: center; line-height: 1; padding-bottom: 2px; - transition: all 0.3s ease-in-out; - }.close-image-modal:hover { - color: white; + 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; + transform: scale(1.05);} +.share-modal-content{width: 600px !important; + max-width: 90vw !important;} +.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; + 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; + 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; + 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; + margin-left: 8px;} +.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; + 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; + 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; + 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; + 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; + 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; + flex-wrap: wrap;} +.upload-progress-extra{padding-top: 10px; margin-bottom: 10px; - display: flex; - }.upload-file-name { - flex-grow: 1; + 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; + word-break: break-word;} +.upload-progress-div{flex: 0 0 250px; + margin-left: 5px;} +.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; + border-color: #007bff;} +.dark-mode .btn-secondary{background-color: #6c757d; color: #fff; - border-color: #6c757d; - }.dark-mode .btn-danger { - background-color: #dc3545; + 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; + 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 #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; @@ -1602,80 +1085,60 @@ body { 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; + 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; + 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; + 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; + 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, + 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; + .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; + transform: translateY(-10px);} +.gallery-nav-btn{background: rgba(80, 80, 80, 0.6) !important; border: none !important; color: white !important; font-size: 48px !important; @@ -1683,39 +1146,29 @@ body { 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, + 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; + .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; - } - /* ===== File context menu (CSS-only visuals) ===== */ -/* Context menu visual design */ -.filr-menu{ - position: fixed; + margin-bottom: 5px;} +#restoreFilesList li input[type="checkbox"]{margin: 0 !important; + transform: translateY(-3px) !important;} +#restoreFilesList li label{margin-left: 8px !important;} +.filr-menu{position: fixed; z-index: 9999; min-width: 220px; max-width: min(320px, 90vw); - height: auto; /* don't stretch */ - max-height: calc(100vh - 16px);/* never exceed viewport; adds scroll if needed */ + height: auto; + max-height: calc(100vh - 16px); overflow: auto; padding: 6px; border-radius: 10px; @@ -1724,268 +1177,174 @@ body { color: var(--ctx-fg, #1a1a1a); box-shadow: 0 8px 24px rgba(0,0,0,.18), - 0 2px 6px rgba(0,0,0,.10); -} - -/* Light/Dark tokens (inherit from body.dark-mode you already use) */ -.filr-menu { --ctx-bg:#fff; --ctx-fg:#1a1a1a; --ctx-sep:rgba(0,0,0,.08); } -.dark-mode .filr-menu { --ctx-bg:#2c2c2c; --ctx-fg:#eaeaea; --ctx-sep:rgba(255,255,255,.12); } - -/* Items */ -.filr-menu .mi{ - display: flex; + 0 2px 6px rgba(0,0,0,.10);} +.filr-menu{--ctx-bg:#fff; --ctx-fg:#1a1a1a; --ctx-sep:rgba(0,0,0,.08);} +.dark-mode .filr-menu{--ctx-bg:#2c2c2c; --ctx-fg:#eaeaea; --ctx-sep:rgba(255,255,255,.12);} +.filr-menu .mi{display: flex; align-items: center; gap: 10px; width: 100%; padding: 8px 10px; border: 0; background: transparent; - color: inherit; /* text color follows theme */ + color: inherit; text-align: left; cursor: pointer; border-radius: 8px; - user-select: none; -} -.filr-menu .mi:focus{ outline: none; } + user-select: none;} +.filr-menu .mi:focus{outline: none;} .filr-menu .mi:hover, -.filr-menu .mi:focus-visible{ - background: var(--filr-row-hover-bg, rgba(122,179,255,.14)); - box-shadow: inset 0 0 0 1px var(--filr-row-outline-hover, rgba(122,179,255,.35)); -} - -/* Icons = Material Icons font; inherit color so light mode isn't white */ -.filr-menu .mi .material-icons{ - font-size: 18px; +.filr-menu .mi:focus-visible{background: var(--filr-row-hover-bg, rgba(122,179,255,.14)); + box-shadow: inset 0 0 0 1px var(--filr-row-outline-hover, rgba(122,179,255,.35));} +.filr-menu .mi .material-icons{font-size: 18px; line-height: 1; - color: currentColor; /* critical: icon color matches text (light/dark) */ -} - -/* Labels */ -.filr-menu .mi span{ flex: 1 1 auto; } - -/* Separators */ -.filr-menu .sep{ - height: 1px; + color: currentColor;} +.filr-menu .mi span{flex: 1 1 auto;} +.filr-menu .sep{height: 1px; margin: 6px 4px; - background: var(--ctx-sep); -} - -/* Ensure no weird default colors on hover from BS inside the menu */ -.filr-menu, .filr-menu *{ - --bs-body-color: inherit; - --bs-dropdown-link-hover-color: inherit; -} - -.dark-mode #fileContextMenu { - background: #2c2c2c; + background: var(--ctx-sep);} +.filr-menu, .filr-menu *{--bs-body-color: inherit; + --bs-dropdown-link-hover-color: inherit;} +.dark-mode #fileContextMenu{background: #2c2c2c; border-color: #555; - box-shadow: 0 8px 24px rgba(0,0,0,.45); -} - -#fileContextMenu { z-index: 1039; } /* below typical modal stacks */ -#fileContextMenu[hidden] { display:none !important; pointer-events:none !important; } - -/* Share file-menu visuals with folder menu */ -#folderContextMenu.filr-menu { - max-height: min(calc(100vh - 16px), 420px); - overflow-y: auto; -} - -/* Ensure icons adapt to theme */ -#folderContextMenu .material-icons { color: currentColor; opacity: .9; } - .drop-target-sidebar { - display: none; + box-shadow: 0 8px 24px rgba(0,0,0,.45);} +#fileContextMenu{z-index: 1039;} +#fileContextMenu[hidden]{display:none !important; pointer-events:none !important;} +#folderContextMenu.filr-menu{max-height: min(calc(100vh - 16px), 420px); + overflow-y: auto;} +#folderContextMenu .material-icons{color: currentColor; opacity: .9;} +.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; + margin-left: 10px;} +@media (min-width: 769px) { + .drop-target-sidebar{display: block;} +} +.drop-target-sidebar.active, + .drag-header.active{width: 350px; + height: 750px;} +#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; + 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; + 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; + 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: 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); + 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; - } - :root { --menu-radius: 12px; } - -.filr-menu { border-radius: var(--menu-radius); } - -/* Cards: match the menu rounding */ + z-index: 10000;} +:root{--menu-radius: 12px;} +.filr-menu{border-radius: var(--menu-radius);} #uploadCard, -#folderManagementCard { - transition: transform 0.3s ease, opacity 0.3s ease; +#folderManagementCard{transition: transform 0.3s ease, opacity 0.3s ease; width: 100%; margin-bottom: 20px; min-height: 320px; border-radius: var(--menu-radius); - overflow: hidden; /* ensures children don’t poke past rounded edges */ + overflow: hidden; border: 1px solid var(--card-border, #e5e7eb); background: var(--card-bg, #fff); - box-shadow: 0 8px 24px rgba(0,0,0,.08); -} - -/* Dark mode polish */ + box-shadow: 0 8px 24px rgba(0,0,0,.08);} body.dark-mode #uploadCard, -body.dark-mode #folderManagementCard { - border-color: var(--card-border-dark, #3a3a3a); +body.dark-mode #folderManagementCard{border-color: var(--card-border-dark, #3a3a3a); background: var(--card-bg-dark, #2c2c2c); - box-shadow: 0 12px 28px rgba(0,0,0,.35); -} - - #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; + box-shadow: 0 12px 28px rgba(0,0,0,.35);} +#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: #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; + 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; + 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; + 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, + border: 1px solid #444;} +.dark-mode .admin-panel-content input, .dark-mode .admin-panel-content select, - .dark-mode .admin-panel-content textarea { - background: #3a3a3a; + .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; + 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; + 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; + 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; @@ -1993,73 +1352,56 @@ body.dark-mode #folderManagementCard { 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; + 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; + 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; + 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"; + 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) { + color: #aaa;} +#fileList tbody tr.clickable-row{-webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none;} +#fileSummary{color: black;} +@media only screen and (max-width: 600px) { #fileSummary, #rowHeightSliderContainer, - #viewSliderContainer { - float: none !important; + #viewSliderContainer{float: none !important; margin: 0 auto !important; text-align: center !important; - display: block !important; - }} - - #viewSliderContainer label, - #viewSliderContainer span { - line-height: 1; + 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; + 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: #fff;} +.dark-mode #searchInput{background-color: #333; color: #e0e0e0; - border: 1px solid #555; - }.btn-icon { - background: transparent; + border: 1px solid #555;} +.btn-icon{background: transparent; border: none; padding: 6px 8px; margin: 0; @@ -2067,32 +1409,26 @@ body.dark-mode #folderManagementCard { 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; + 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: var(--filr-row-hover-bg) !important; + color: #333;} +.btn-icon:hover, + .btn-icon:focus{background: var(--filr-row-hover-bg) !important; outline: none; box-shadow: inset 0 1px 0 var(--filr-row-outline-hover), - inset 0 -1px 0 var(--filr-row-outline-hover); - }.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; + inset 0 -1px 0 var(--filr-row-outline-hover);} +.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; @@ -2101,87 +1437,52 @@ body.dark-mode #folderManagementCard { border-radius: var(--menu-radius); 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; + 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 .dropdown-caret { - border-top: 5px solid currentColor; + white-space: nowrap;} +.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; - }.user-dropdown .dropdown-username { - margin: 0 8px; + margin-left: 0.25rem;} +.dark-mode .user-dropdown .user-menu{background: #2c2c2c; + border-color: #444;} +.dark-mode .user-dropdown .user-menu .item{color: #e0e0e0;} +.user-dropdown .dropdown-username{margin: 0 8px; font-weight: 500; vertical-align: middle; - white-space: nowrap; - } - - -/* container polish to match menus */ -.user-dropdown .user-menu { - border-radius: var(--menu-radius); - overflow: hidden; /* keep hover corners crisp */ - backdrop-filter: saturate(140%) blur(2px); -} - -/* items: same hover treatment as context menu */ -.user-dropdown .user-menu .item { - padding: 0.5rem 0.75rem; + white-space: nowrap;} +.user-dropdown .user-menu{border-radius: var(--menu-radius); + overflow: hidden; + backdrop-filter: saturate(140%) blur(2px);} +.user-dropdown .user-menu .item{padding: 0.5rem 0.75rem; cursor: pointer; white-space: nowrap; - transition: background-color .12s ease, box-shadow .12s ease; -} - -/* blue hover + inset hairline outline */ -.user-dropdown .user-menu .item:hover { - background: var(--filr-row-hover-bg) !important; + transition: background-color .12s ease, box-shadow .12s ease;} +.user-dropdown .user-menu .item:hover{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); -} - -/* optional: round the first/last hover edges like the menu */ -.user-dropdown .user-menu .item:first-child:hover { - border-top-left-radius: var(--menu-radius); - border-top-right-radius: var(--menu-radius); -} -.user-dropdown .user-menu .item:last-child:hover { - border-bottom-left-radius: var(--menu-radius); - border-bottom-right-radius: var(--menu-radius); -} - -/* dark mode keeps the same hue; base surface stays dark */ -.dark-mode .user-dropdown .user-menu { - background: #2c2c2c; - border-color: #444; -} - -.folder-strip-container { - display: flex; + inset 0 -1px 0 var(--filr-row-outline-hover);} +.user-dropdown .user-menu .item:first-child:hover{border-top-left-radius: var(--menu-radius); + border-top-right-radius: var(--menu-radius);} +.user-dropdown .user-menu .item:last-child:hover{border-bottom-left-radius: var(--menu-radius); + border-bottom-right-radius: var(--menu-radius);} +.dark-mode .user-dropdown .user-menu{background: #2c2c2c; + border-color: #444;} +.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; + align-content: flex-start; + 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 */ + align-items: center; + justify-content: center; min-width: 0; gap: 2px !important; padding: 6px 8px; @@ -2190,92 +1491,62 @@ body.dark-mode #folderManagementCard { 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; + max-width: 180px;} +.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; + display: block;} +.folder-strip-container .folder-name{display: block; width: 100%; max-width: 100%; - white-space: normal; + white-space: normal !important; 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: translateX(2px); + line-height: 1.2;} +.folder-strip-container .folder-item:hover{transform: translateY(-1px) scale(1.04); + background-color: rgba(0, 0, 0, 0.04); + box-shadow: 0 4px 10px rgba(0, 0, 0, .15);} +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);} +.folder-strip-container .folder-item:focus-visible{outline: 2px solid #8ab4f8; + outline-offset: 2px;} +:root{--perm-caret: #444;} +.dark-mode{--perm-caret: #ccc;} +#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, + 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); + #sidebarToggleFloating .material-icons-outlined{color: var(--toggle-icon-color); font-size: 22px; line-height: 1; - display: block; - }#zonesToggleFloating:hover, - #sidebarToggleFloating:hover { - transform: translateY(-1px); + 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; + 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: ''; + 0 0 0 3px rgba(25,118,210,.25);} +#zonesToggleFloating::after, + #sidebarToggleFloating::after{content: ''; position: absolute; inset: 0; border-radius: inherit; @@ -2283,25 +1554,18 @@ body.dark-mode .folder-strip-container .folder-item:hover { 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: #2c2c2c; } -.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; + 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{background: #2c2c2c;} +.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);} +.status-badge{display: inline-block; margin-left: 6px; padding: 2px 6px; font-size: 11px; @@ -2309,85 +1573,53 @@ body.dark-mode .folder-strip-container .folder-item:hover { 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); -} + color: #fff;} +.status-badge.watched{border-color: rgba(34,197,94,.45); + background: rgba(34,197,94,.15);} +.status-badge.progress{border-color: rgba(234,88,12,.55); + background: rgba(234,88,12,.18);} #downloadProgressModal .modal-body, #downloadProgressModal .rise-modal-body, -#downloadProgressModal .modal-content { - min-height: 88px; +#downloadProgressModal .modal-content{min-height: 88px; + overflow: hidden;} +#downloadProgressText{white-space: nowrap; 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; + text-overflow: ellipsis;} +#downloadProgressBarOuter{height: 10px;} +#folderTreeContainer{--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 */ + --filr-paper-stroke: #9fb3d6; - /* 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; + --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) */ + padding-left: calc(var(--twisty) + var(--twisty-gap));} #folderTreeContainer .folder-row > button.folder-toggle, -#folderTreeContainer .folder-row > .folder-spacer { - position: absolute; left: 0; top: 50%; transform: translateY(-50%); +#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; -} + 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 */ +#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);} +#folderTreeContainer .folder-option{display: inline-flex; + flex: 0 1 auto; align-items: center; gap: var(--icon-gap); height: auto; @@ -2397,188 +1629,111 @@ body.dark-mode .folder-strip-container .folder-item:hover { 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 { + white-space: normal;} +#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);} +#folderTreeContainer .folder-label{ flex: 1 1 120px; min-width: 0; white-space: normal; overflow-wrap: anywhere; word-break: break-word; line-height: 1.2; + margin-top: 2px; } - -/* Icon box */ -#folderTreeContainer .folder-icon { - flex: 0 0 var(--icon-size); +#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 */ + display: inline-flex; align-items: center; justify-content: center;} +#folderTreeContainer .folder-icon svg{width: 100%; height: 100%; display: block; + shape-rendering: geometricPrecision;} #folderTreeContainer .folder-icon .folder-front, -#folderTreeContainer .folder-icon .folder-back { - fill: currentColor; +#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); + 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; -} - + 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; +#folderTreeContainer .folder-label{transform: none !important;} +.folder-strip-container .folder-svg svg{display: block; + shape-rendering: crispEdges;} +.folder-strip-container .folder-item{--filr-folder-front: #f6b84e; --filr-folder-back: #ffd36e; - --filr-folder-stroke: #a87312; -} + --filr-folder-stroke: #a87312;} .folder-strip-container .folder-svg .folder-front, -.folder-strip-container .folder-svg .folder-back { - fill: currentColor; +.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-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; 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; -} - + 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 we’re not forcing crispEdges anywhere */ +.folder-strip-container .folder-svg .lip-highlight{stroke-linejoin: round; + stroke-linecap: round;} .folder-strip-container .folder-svg svg, -#folderTreeContainer .folder-icon svg { shape-rendering: geometricPrecision !important; } - +#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; } + #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; +.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 */ + paint-order: normal;} #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 */ +#folderTreeContainer .folder-icon .lip-highlight{stroke-width: .6px;} .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; } -/* Locked folder look (keep subtle but clear) */ -#folderTreeContainer .folder-option.locked { - opacity: .9; - font-style: italic; -} - -/* Padlock styling inside the SVG */ -#folderTreeContainer .folder-icon .lock-body { - fill: var(--filr-folder-stroke, #6b6b6b); - opacity: .95; -} -#folderTreeContainer .folder-icon .lock-shackle { - fill: none; +.folder-strip-container .folder-svg .lip-highlight{stroke-width: 1.1px;} +#folderTreeContainer .folder-option.locked{opacity: .9; + font-style: italic;} +#folderTreeContainer .folder-icon .lock-body{fill: var(--filr-folder-stroke, #6b6b6b); + opacity: .95;} +#folderTreeContainer .folder-icon .lock-shackle{fill: none; stroke: var(--filr-folder-stroke, #6b6b6b); stroke-width: 1.4; - stroke-linecap: round; -} -#folderTreeContainer .folder-icon .lock-keyhole { - fill: rgba(0,0,0,.28); -} -body.dark-mode #folderTreeContainer .folder-icon .lock-keyhole { - fill: rgba(255,255,255,.28); -} - -#folderTreeContainer li.load-more { - padding: 4px 0 4px 28px; /* indent to line up with rows */ - list-style: none; -} - -#folderTreeContainer li.load-more > .btn.btn-ghost { - width: calc(100% - 8px); + stroke-linecap: round;} +#folderTreeContainer .folder-icon .lock-keyhole{fill: rgba(0,0,0,.28);} +body.dark-mode #folderTreeContainer .folder-icon .lock-keyhole{fill: rgba(255,255,255,.28);} +#folderTreeContainer li.load-more{padding: 4px 0 4px 28px; + list-style: none;} +#folderTreeContainer li.load-more > .btn.btn-ghost{width: calc(100% - 8px); margin: 0 4px; display: flex; align-items: center; @@ -2589,63 +1744,35 @@ body.dark-mode #folderTreeContainer .folder-icon .lock-keyhole { background: var(--tree-ghost-bg); color: var(--tree-ghost-fg); padding: 6px 10px; - font-size: 12.5px; -} - -#folderTreeContainer li.load-more > .btn.btn-ghost:hover { - background: var(--tree-ghost-hover-bg); -} - -#folderTreeContainer li.load-more > .btn.btn-ghost:focus-visible { - outline: 2px solid #8ab4f8; - outline-offset: 2px; -} - -/* tiny spinner when busy */ -#folderTreeContainer li.load-more > .btn[aria-busy="true"]::before { - content: ""; + font-size: 12.5px;} +#folderTreeContainer li.load-more > .btn.btn-ghost:hover{background: var(--tree-ghost-hover-bg);} +#folderTreeContainer li.load-more > .btn.btn-ghost:focus-visible{outline: 2px solid #8ab4f8; + outline-offset: 2px;} +#folderTreeContainer li.load-more > .btn[aria-busy="true"]::before{content: ""; width: 12px; height: 12px; border-radius: 50%; border: 2px solid currentColor; border-right-color: transparent; display: inline-block; - animation: filr-spin .8s linear infinite; + animation: filr-spin .8s linear infinite;} +@keyframes filr-spin { + to{transform: rotate(360deg);} } -@keyframes filr-spin { to { transform: rotate(360deg); } } - -/* Resumable upload resume hint banner */ -#resumableDraftBanner.upload-resume-banner { - margin: 8px 12px 12px; /* space from card edges & content below */ -} - -.upload-resume-banner-inner { - display: flex; +#resumableDraftBanner.upload-resume-banner{margin: 8px 12px 12px;} +.upload-resume-banner-inner{display: flex; align-items: center; gap: 8px; - padding: 8px 12px; border-radius: 10px; - - /* Soft background that should work in light & dark */ background: rgba(255, 152, 0, 0.06); border: 1px solid rgba(255, 152, 0, 0.55); - - font-size: 0.9rem; -} - -/* Icon spacing + base style */ -.upload-resume-banner-inner .material-icons { - font-size: 20px; + font-size: 0.9rem;} +.upload-resume-banner-inner .material-icons, +.folder-badge .material-icons{font-size: 20px; margin-right: 6px; vertical-align: middle; - - /* Make sure the icon itself is transparent */ background-color: transparent; - color: #111; /* dark icon for light mode */ -} - -/* Dark mode: just change the icon color */ -.dark-mode .upload-resume-banner-inner .material-icons { - background-color: transparent; /* stay transparent */ - color: #f5f5f5; /* light icon for dark mode */ -} \ No newline at end of file + color: #111;} +.dark-mode .upload-resume-banner-inner .material-icons, +.dark-mode .folder-badge .material-icons{background-color: transparent; + color: #f5f5f5;} \ No newline at end of file diff --git a/public/js/adminPanel.js b/public/js/adminPanel.js index f8e564d..d892b68 100644 --- a/public/js/adminPanel.js +++ b/public/js/adminPanel.js @@ -465,7 +465,7 @@ export function openAdminPanel() { background:${dark ? "#2c2c2c" : "#fff"}; color:${dark ? "#e0e0e0" : "#000"}; padding:20px; max-width:1100px; width:50%; - border-radius:8px; position:relative; + position:relative; max-height:90vh; overflow:auto; border:1px solid ${dark ? "#555" : "#ccc"}; `; @@ -1525,7 +1525,6 @@ export function openUserPermissionsModal() { padding: 20px; width: clamp(980px, 92vw, 1280px); max-width: none; - border-radius: 8px; position: relative; max-height: 90vh; overflow: auto; @@ -1654,7 +1653,7 @@ export async function openUserFlagsModal() {