feat: implement full breadcrumb path navigation in Files tab

- Add breadcrumbPath array to app state for tracking folder hierarchy
- Rewrite updateBreadcrumb() to render full path: Home > folder > subfolder
- Each breadcrumb segment is clickable to navigate back to that level
- Current folder shown in bold (non-clickable), parent folders as links
- Reset breadcrumb path on tab switch, home navigation, and initial load
- Update navigateFolder/selectFolder to push to breadcrumb path
- Enhanced breadcrumb CSS with hover effects and dark mode support
This commit is contained in:
Diocrafts
2026-02-21 00:19:04 +01:00
parent a1a3bd1b2b
commit 269a5fe940
52 changed files with 6809 additions and 6683 deletions
+299
View File
@@ -0,0 +1,299 @@
*{box-sizing:border-box;margin:0;padding:0;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif}
body{background:#f5f7fa;color:#1e293b;min-height:100vh;display:flex;flex-direction:column}
.hidden{display:none !important}
.show-block{display:block !important}
.show-flex{display:flex !important}
.link-reset-flex{text-decoration:none;color:inherit;display:flex;align-items:center;gap:14px}
.width-zero{width:0%}
.mt-14{margin-top:14px}
.toggle-row-strong{margin-top:10px;padding:12px 0;border-top:1px solid #e2e8f0}
.icon-muted-right{color:#64748b;margin-right:6px}
.h2-space-between{justify-content:space-between}
.flex-gap-6{display:flex;gap:6px}
.oidc-discover-wrap{margin-bottom:12px}
.secret-icon{color:#059669}
.small-muted{font-weight:400;color:#94a3b8}
.summary-icon-right{margin-right:6px}
.oidc-actions{display:flex;gap:10px;margin-top:24px;justify-content:flex-end}
.modal-title-icon{color:#ff5e3a;margin-right:8px}
.quota-input-row{display:flex;gap:10px;align-items:center}
.flex-1{flex:1}
.select-qm-unit{width:90px;padding:10px 14px;border:2px solid #e2e8f0;border-radius:10px;font-size:14px;background:#f8fafc}
.form-row{display:flex;gap:14px}
.select-cu-role{width:100%;padding:10px 14px;border:2px solid #e2e8f0;border-radius:10px;font-size:14px;background:#f8fafc}
.quota-row{display:flex;gap:6px}
.select-cu-quota-unit{width:70px;padding:10px 8px;border:2px solid #e2e8f0;border-radius:10px;font-size:13px;background:#f8fafc}
.alert-no-margin{margin-top:0}
.table-loading-cell{text-align:center;padding:28px;color:#94a3b8}
.table-status-error{color:#991b1b;padding:20px}
.table-status-empty{text-align:center;padding:28px;color:#94a3b8}
.user-self-badge{color:#94a3b8;font-weight:400}
.badge-admin-icon-small{font-size:10px}
.quota-progress-fixed{width:80px}
.user-last-login-cell{font-size:12px;color:#94a3b8}
/* ── Scrollbar ── */
::-webkit-scrollbar{width:8px}
::-webkit-scrollbar-track{background:transparent}
::-webkit-scrollbar-thumb{background:rgba(0,0,0,.15);border-radius:4px}
::-webkit-scrollbar-thumb:hover{background:rgba(0,0,0,.25)}
*{scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.15) transparent}
/* ── Top Header Bar ── */
.admin-header{
background:linear-gradient(135deg,#2a3042 0%,#232838 100%);
padding:0 32px;height:64px;display:flex;align-items:center;justify-content:space-between;
box-shadow:0 2px 12px rgba(0,0,0,.15);position:sticky;top:0;z-index:100;
}
.admin-header-left{display:flex;align-items:center;gap:14px}
.admin-logo{
width:38px;height:38px;background:linear-gradient(135deg,#ff5e3a,#ff2d55);border-radius:11px;
display:flex;align-items:center;justify-content:center;
box-shadow:0 3px 10px rgba(255,94,58,.35);
}
.admin-logo svg{width:20px;height:20px;fill:#fff}
.admin-title-text{font-size:17px;font-weight:700;color:#fff;letter-spacing:.3px}
.admin-title-separator{font-size:17px;color:rgba(255,255,255,.5);font-weight:400;margin-left:6px}
.admin-header-right a{
color:rgba(255,255,255,.65);text-decoration:none;font-size:13px;font-weight:500;
display:flex;align-items:center;gap:6px;transition:color .2s;
}
.admin-header-right a:hover{color:#fff}
/* ── Container ── */
.admin-container{max-width:1080px;margin:0 auto;padding:28px 24px 60px;width:100%}
/* ── Tabs ── */
.admin-tabs{display:flex;gap:6px;margin-bottom:28px;background:#fff;border-radius:14px;padding:6px;box-shadow:0 1px 4px rgba(0,0,0,.06)}
.admin-tab{
padding:10px 22px;cursor:pointer;font-weight:600;font-size:13.5px;color:#64748b;
border:none;background:none;border-radius:10px;transition:all .2s;display:flex;align-items:center;gap:8px;
}
.admin-tab:hover{color:#1e293b;background:#f8fafc}
.admin-tab.active{color:#fff;background:linear-gradient(135deg,#ff5e3a,#ff2d55);box-shadow:0 3px 12px rgba(255,94,58,.25)}
.admin-tab.active i{color:#fff}
.admin-tab i{font-size:14px;width:16px;text-align:center}
.tab-content{display:none}
.tab-content.active{display:block}
/* ── Cards ── */
.admin-card{background:#fff;border-radius:16px;box-shadow:0 1px 4px rgba(0,0,0,.06),0 0 0 1px rgba(0,0,0,.03);padding:28px;margin-bottom:22px}
.admin-card h2{font-size:16px;font-weight:700;margin-bottom:20px;color:#1e293b;display:flex;align-items:center;gap:10px}
.admin-card h2 i{color:#ff5e3a;font-size:17px}
#main-content,
#ds-warn-card,
#ds-danger-card,
#registration-warning,
#oidc-form,
#secret-hint,
#password-warning,
#quota-modal,
#create-user-modal,
#reset-pw-modal{display:none}
/* ── Stats Grid ── */
.stats-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:14px;margin-bottom:22px}
.stat-card{
padding:20px;background:#f8fafc;border-radius:14px;text-align:center;
border:1px solid #e2e8f0;transition:transform .15s,box-shadow .15s;
}
.stat-card:hover{transform:translateY(-2px);box-shadow:0 4px 12px rgba(0,0,0,.06)}
.stat-value{font-size:1.75rem;font-weight:800;color:#1e293b}
.stat-label{font-size:11.5px;color:#94a3b8;text-transform:uppercase;letter-spacing:.06em;margin-top:4px;font-weight:600}
.stat-card.warn{border-color:#fbbf24;background:#fffbeb}
.stat-card.danger{border-color:#ef4444;background:#fef2f2}
.text-blue{color:#3b82f6!important}
.text-green{color:#059669!important}
.text-orange{color:#d97706!important}
.text-red{color:#dc2626!important}
/* ── Progress bar ── */
.progress-bar{width:100%;height:8px;background:#e2e8f0;border-radius:4px;overflow:hidden}
.progress-fill{height:100%;border-radius:4px;transition:width .5s ease}
.progress-fill.green{background:linear-gradient(90deg,#059669,#10b981)}
.progress-fill.orange{background:linear-gradient(90deg,#d97706,#f59e0b)}
.progress-fill.red{background:linear-gradient(90deg,#dc2626,#ef4444)}
/* ── Table ── */
.table-wrap{overflow-x:auto;border-radius:12px;border:1px solid #e2e8f0}
table{width:100%;border-collapse:collapse;font-size:13.5px}
th{text-align:left;padding:12px 16px;background:#f8fafc;color:#94a3b8;font-size:11px;text-transform:uppercase;letter-spacing:.06em;font-weight:700;white-space:nowrap;border-bottom:1px solid #e2e8f0}
td{padding:14px 16px;border-bottom:1px solid #f1f5f9;vertical-align:middle}
tr:last-child td{border-bottom:none}
tr:hover{background:#fafbfd}
.user-info{display:flex;flex-direction:column;gap:2px}
.user-name{font-weight:600;color:#1e293b}
.user-email{font-size:12px;color:#94a3b8}
/* ── Badges ── */
.badge{display:inline-flex;align-items:center;gap:4px;font-size:11px;padding:3px 10px;border-radius:20px;font-weight:600}
.badge-admin{background:#dbeafe;color:#1d4ed8}
.badge-user{background:#f1f5f9;color:#64748b}
.badge-active{background:#d1fae5;color:#065f46}
.badge-inactive{background:#fee2e2;color:#991b1b}
.badge-oidc{background:#ede9fe;color:#6d28d9}
.badge-env{background:#fef3c7;color:#92400e;font-size:10px;padding:1px 6px;margin-left:4px}
/* ── Buttons ── */
.btn{
padding:8px 18px;border:none;border-radius:10px;font-size:13px;font-weight:600;
cursor:pointer;transition:all .15s;white-space:nowrap;display:inline-flex;align-items:center;gap:6px;
}
.btn-sm{padding:6px 12px;font-size:12px;border-radius:8px}
.btn-primary{background:linear-gradient(135deg,#ff5e3a,#ff2d55);color:#fff;box-shadow:0 2px 8px rgba(255,94,58,.25)}
.btn-primary:hover{box-shadow:0 4px 14px rgba(255,94,58,.35);transform:translateY(-1px)}
.btn-secondary{background:#fff;color:#334155;border:1px solid #e2e8f0}
.btn-secondary:hover{background:#f8fafc;border-color:#cbd5e1}
.btn-danger{background:#fef2f2;color:#991b1b;border:1px solid #fecaca}
.btn-danger:hover{background:#fee2e2}
.btn-success{background:#ecfdf5;color:#065f46;border:1px solid #a7f3d0}
.btn-success:hover{background:#d1fae5}
.btn:disabled{opacity:.4;cursor:not-allowed;transform:none!important}
.actions-row{display:flex;gap:6px;flex-wrap:wrap}
/* ── Forms ── */
.form-group{margin-bottom:16px}
.form-group label{display:block;font-size:13px;font-weight:600;margin-bottom:4px;color:#334155}
.form-group input[type="text"],.form-group input[type="password"],.form-group input[type="url"],.form-group input[type="number"],.form-group select{
width:100%;padding:10px 14px;border:2px solid #e2e8f0;border-radius:10px;font-size:14px;
background:#f8fafc;transition:all .2s;font-family:inherit;color:#1e293b;
}
.form-group input:focus,.form-group select:focus{outline:none;border-color:#ff5e3a;background:#fff;box-shadow:0 0 0 3px rgba(255,94,58,.1)}
.form-group small{color:#94a3b8;font-size:12px;display:block;margin-top:3px}
.toggle-row{display:flex;align-items:center;justify-content:space-between;padding:10px 0}
.toggle-row label{font-size:14px;font-weight:500;color:#334155}
.switch{position:relative;width:44px;height:24px;flex-shrink:0}
.switch input{opacity:0;width:0;height:0}
.slider{position:absolute;cursor:pointer;inset:0;background:#d1d5db;border-radius:24px;transition:.3s}
.slider:before{content:"";position:absolute;height:18px;width:18px;left:3px;bottom:3px;background:#fff;border-radius:50%;transition:.3s;box-shadow:0 1px 3px rgba(0,0,0,.15)}
.switch input:checked+.slider{background:linear-gradient(135deg,#ff5e3a,#ff2d55)}
.switch input:checked+.slider:before{transform:translateX(20px)}
.readonly-field{
display:flex;align-items:center;gap:8px;background:#f8fafc;border:2px solid #e2e8f0;border-radius:10px;
padding:10px 14px;font-family:'SF Mono',Monaco,Consolas,monospace;font-size:13px;word-break:break-all;color:#334155;
}
.readonly-field button{
flex-shrink:0;padding:6px 10px;border:1px solid #e2e8f0;border-radius:8px;background:#fff;cursor:pointer;
font-size:12px;transition:all .15s;color:#64748b;
}
.readonly-field button:hover{background:#f1f5f9;color:#334155}
/* ── Alerts ── */
.alert{padding:12px 16px;border-radius:10px;font-size:13px;margin-top:14px;display:none;font-weight:500}
.alert-success{background:#ecfdf5;color:#065f46;border:1px solid #a7f3d0;display:block}
.alert-error{background:#fef2f2;color:#991b1b;border:1px solid #fecaca;display:block}
.alert-info{background:#eff6ff;color:#1e40af;border:1px solid #bfdbfe;display:block}
.warning{background:#fffbeb;border:1px solid #fde68a;border-radius:10px;padding:10px 14px;font-size:13px;color:#92400e;margin-top:8px;display:flex;align-items:center;gap:6px;font-weight:500}
/* ── Discovery ── */
.discovery-result{margin:12px 0;padding:14px;border-radius:10px;font-size:13px}
.discovery-result.ok{background:#ecfdf5;border:1px solid #a7f3d0;color:#065f46}
.discovery-result.fail{background:#fef2f2;border:1px solid #fecaca;color:#991b1b}
.discovery-result dt{font-weight:700;margin-top:6px}
.discovery-result dd{margin-left:0;word-break:break-all}
/* ── Details ── */
details{margin-top:14px;border-top:1px solid #e2e8f0;padding-top:12px}
details summary{cursor:pointer;font-weight:600;font-size:14px;color:#64748b;padding:6px 0;user-select:none;transition:color .2s}
details summary:hover{color:#ff5e3a}
details[open] summary{margin-bottom:14px;color:#ff5e3a}
/* ── Modal ── */
.modal-overlay{position:fixed;inset:0;background:rgba(0,0,0,.45);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;z-index:1000}
.modal{background:#fff;border-radius:20px;padding:28px;width:420px;max-width:90vw;box-shadow:0 20px 60px rgba(0,0,0,.2);animation:modalIn .2s ease-out}
@keyframes modalIn{from{opacity:0;transform:scale(.95) translateY(10px)}to{opacity:1;transform:scale(1) translateY(0)}}
.modal h3{margin-bottom:18px;font-size:17px;color:#1e293b;display:flex;align-items:center}
.modal-actions{display:flex;gap:8px;justify-content:flex-end;margin-top:18px}
/* ── Quota bar inline ── */
.quota-bar{display:flex;align-items:center;gap:10px}
.quota-bar .progress-bar{flex:1;height:6px}
.quota-text{font-size:12px;color:#94a3b8;white-space:nowrap}
/* ── Access / Loading ── */
#access-denied{display:none;text-align:center;padding:80px 20px}
#access-denied .access-icon{width:80px;height:80px;background:#fef2f2;border-radius:50%;display:flex;align-items:center;justify-content:center;margin:0 auto 20px}
#access-denied .access-icon i{font-size:32px;color:#ef4444}
#access-denied h2{color:#991b1b;margin-bottom:8px;font-size:20px}
#access-denied p{color:#64748b;margin-bottom:20px;font-size:14px}
#access-denied a{display:inline-flex;align-items:center;gap:6px;padding:10px 24px;background:linear-gradient(135deg,#ff5e3a,#ff2d55);color:#fff;text-decoration:none;border-radius:10px;font-weight:600;font-size:14px;box-shadow:0 3px 12px rgba(255,94,58,.3);transition:all .2s}
#access-denied a:hover{transform:translateY(-1px);box-shadow:0 5px 18px rgba(255,94,58,.4)}
#loading{text-align:center;padding:80px;color:#94a3b8;font-size:15px}
#loading i{font-size:32px;color:#ff5e3a;display:block;margin-bottom:12px;animation:spin 1s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}
/* ── Pagination ── */
.pagination{display:flex;align-items:center;justify-content:space-between;margin-top:14px;font-size:13px;color:#94a3b8;padding:0 4px}
.pagination button{padding:6px 14px}
/* ── Dark Mode ── */
[data-theme="dark"] body{background:#0f172a;color:#e2e8f0}
[data-theme="dark"] ::-webkit-scrollbar-thumb{background:rgba(255,255,255,.15)}
[data-theme="dark"] *{scrollbar-color:rgba(255,255,255,.15) transparent}
[data-theme="dark"] .admin-tabs{background:#1e293b;box-shadow:0 1px 4px rgba(0,0,0,.2)}
[data-theme="dark"] .admin-tab{color:#94a3b8}
[data-theme="dark"] .admin-tab:hover{color:#f1f5f9;background:#162032}
[data-theme="dark"] .admin-card{background:#1e293b;box-shadow:0 1px 4px rgba(0,0,0,.2),0 0 0 1px rgba(255,255,255,.03)}
[data-theme="dark"] .admin-card h2{color:#f1f5f9}
[data-theme="dark"] .stat-card{background:#162032;border-color:#334155}
[data-theme="dark"] .stat-card:hover{box-shadow:0 4px 12px rgba(0,0,0,.15)}
[data-theme="dark"] .stat-value{color:#f1f5f9}
[data-theme="dark"] .stat-label{color:#64748b}
[data-theme="dark"] .stat-card.warn{border-color:#92400e;background:#422006}
[data-theme="dark"] .stat-card.danger{border-color:#991b1b;background:#3b1111}
[data-theme="dark"] .progress-bar{background:#334155}
[data-theme="dark"] .table-wrap{border-color:#334155}
[data-theme="dark"] th{background:#162032;color:#64748b;border-bottom-color:#334155}
[data-theme="dark"] td{border-bottom-color:#334155;color:#e2e8f0}
[data-theme="dark"] tr:hover{background:#162032}
[data-theme="dark"] .user-name{color:#f1f5f9}
[data-theme="dark"] .user-email{color:#64748b}
[data-theme="dark"] .badge-admin{background:#1e3a5f;color:#60a5fa}
[data-theme="dark"] .badge-user{background:#334155;color:#94a3b8}
[data-theme="dark"] .badge-active{background:#052e16;color:#86efac}
[data-theme="dark"] .badge-inactive{background:#3b1111;color:#fca5a5}
[data-theme="dark"] .badge-oidc{background:#2e1065;color:#c4b5fd}
[data-theme="dark"] .btn-secondary{background:#1e293b;color:#e2e8f0;border-color:#334155}
[data-theme="dark"] .btn-secondary:hover{background:#334155;border-color:#475569}
[data-theme="dark"] .btn-danger{background:#3b1111;color:#fca5a5;border-color:#991b1b}
[data-theme="dark"] .btn-danger:hover{background:#4a1515}
[data-theme="dark"] .btn-success{background:#052e16;color:#86efac;border-color:#065f46}
[data-theme="dark"] .btn-success:hover{background:#064e27}
[data-theme="dark"] .form-group label{color:#94a3b8}
[data-theme="dark"] .form-group input[type="text"],
[data-theme="dark"] .form-group input[type="password"],
[data-theme="dark"] .form-group input[type="url"],
[data-theme="dark"] .form-group input[type="number"],
[data-theme="dark"] .form-group select{background:#0f172a;border-color:#334155;color:#e2e8f0}
[data-theme="dark"] .form-group input:focus,
[data-theme="dark"] .form-group select:focus{border-color:#ff5e3a;background:#0f172a;box-shadow:0 0 0 3px rgba(255,94,58,.15)}
[data-theme="dark"] .form-group small{color:#64748b}
[data-theme="dark"] .toggle-row label{color:#94a3b8}
[data-theme="dark"] .slider{background:#475569}
[data-theme="dark"] .readonly-field{background:#0f172a;border-color:#334155;color:#e2e8f0}
[data-theme="dark"] .readonly-field button{background:#1e293b;border-color:#334155;color:#94a3b8}
[data-theme="dark"] .readonly-field button:hover{background:#334155;color:#f1f5f9}
[data-theme="dark"] .warning{background:#422006;border-color:#92400e;color:#fbbf24}
[data-theme="dark"] .alert-success{background:#052e16;color:#86efac;border-color:#065f46}
[data-theme="dark"] .alert-error{background:#3b1111;color:#fca5a5;border-color:#991b1b}
[data-theme="dark"] .alert-info{background:#0c2d48;color:#93c5fd;border-color:#1d4ed8}
[data-theme="dark"] .discovery-result.ok{background:#052e16;border-color:#065f46;color:#86efac}
[data-theme="dark"] .discovery-result.fail{background:#3b1111;border-color:#991b1b;color:#fca5a5}
[data-theme="dark"] details{border-top-color:#334155}
[data-theme="dark"] details summary{color:#94a3b8}
[data-theme="dark"] details summary:hover{color:#ff5e3a}
[data-theme="dark"] details[open] summary{color:#ff5e3a}
[data-theme="dark"] .modal{background:#1e293b;box-shadow:0 20px 60px rgba(0,0,0,.4)}
[data-theme="dark"] .modal h3{color:#f1f5f9}
[data-theme="dark"] .modal-overlay{background:rgba(0,0,0,.6);backdrop-filter:blur(4px)}
[data-theme="dark"] .quota-text{color:#64748b}
[data-theme="dark"] .pagination{color:#64748b}
[data-theme="dark"] #access-denied h2{color:#fca5a5}
[data-theme="dark"] #access-denied p{color:#94a3b8}
[data-theme="dark"] #access-denied .access-icon{background:#3b1111}
[data-theme="dark"] #loading{color:#64748b}
[data-theme="dark"] .toggle-row{border-top-color:#334155}
+585
View File
@@ -0,0 +1,585 @@
/* Auth styles for OxiCloud */
.auth-container {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100vh;
width: 100%;
background-color: #f5f7fa;
}
.auth-panel {
width: 400px;
max-width: 90%;
margin: 0 auto;
background-color: white;
border-radius: 10px;
box-shadow: 0 5px 20px rgba(0,0,0,0.1);
padding: 30px;
text-align: center;
}
.auth-logo {
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 20px;
}
.auth-logo-icon {
width: 50px;
height: 50px;
background: linear-gradient(135deg, #ff5e3a 0%, #ff2d55 100%);
border-radius: 12px;
display: flex;
align-items: center;
justify-content: center;
margin-right: 10px;
box-shadow: 0 4px 12px rgba(255, 94, 58, 0.3);
}
.auth-logo-icon svg {
width: 30px;
height: 30px;
fill: white;
}
.auth-logo-text {
font-size: 24px;
font-weight: bold;
color: #2a3042;
}
.auth-title {
font-size: 20px;
font-weight: bold;
margin-bottom: 25px;
color: #2a3042;
}
.auth-form {
width: 100%;
text-align: left;
[dir='rtl'] & {
text-align: right;
}
}
.auth-input-group {
margin-bottom: 20px;
}
.auth-label {
display: block;
margin-bottom: 8px;
font-size: 14px;
color: #4b5563;
font-weight: 500;
}
.auth-input {
width: 100%;
padding: 12px 15px;
border-radius: 8px;
border: 1px solid #e2e8f0;
font-size: 14px;
background-color: #f9fafb;
transition: border-color 0.2s;
}
.auth-input:focus {
outline: none;
border-color: #ff5e3a;
box-shadow: 0 0 0 3px rgba(255, 94, 58, 0.1);
}
.auth-button {
width: 100%;
padding: 12px 15px;
border-radius: 10px;
background: linear-gradient(135deg, #ff5e3a 0%, #ff2d55 100%);
color: white;
font-weight: bold;
border: none;
cursor: pointer;
font-size: 16px;
transition: all 0.3s ease;
margin-top: 10px;
box-shadow: 0 4px 12px rgba(255, 94, 58, 0.3);
}
.auth-button:hover {
transform: translateY(-1px);
box-shadow: 0 6px 20px rgba(255, 94, 58, 0.4);
filter: brightness(1.05);
}
.auth-button:active {
transform: translateY(0);
box-shadow: 0 2px 8px rgba(255, 94, 58, 0.3);
}
.auth-button:disabled {
background-color: #f9a799;
cursor: not-allowed;
}
/* SSO / OIDC button */
.auth-button-oidc {
background: linear-gradient(135deg, #2d3748 0%, #4a5568 100%);
box-shadow: 0 4px 12px rgba(45, 55, 72, 0.3);
display: flex;
align-items: center;
justify-content: center;
gap: 10px;
}
.auth-button-oidc:hover {
box-shadow: 0 6px 20px rgba(45, 55, 72, 0.4);
}
.auth-button-oidc i {
font-size: 14px;
}
/* Divider between password and SSO login */
.auth-divider {
display: flex;
align-items: center;
margin: 20px 0;
color: #a0aec0;
font-size: 13px;
}
.auth-divider::before,
.auth-divider::after {
content: '';
flex: 1;
height: 1px;
background: #e2e8f0;
}
.auth-divider span {
padding: 0 12px;
}
/* OIDC-only mode: hide password form */
.auth-form.hidden {
display: none;
}
.auth-toggle {
margin-top: 20px;
font-size: 14px;
color: #718096;
}
.auth-toggle-link {
color: #ff5e3a;
cursor: pointer;
text-decoration: none;
font-weight: 500;
}
.auth-toggle-link:hover {
text-decoration: underline;
}
.auth-error {
background-color: #fee2e2;
color: #b91c1c;
padding: 10px 15px;
border-radius: 8px;
margin-bottom: 20px;
font-size: 14px;
display: none;
}
.auth-success {
background-color: #dcfce7;
color: #15803d;
padding: 10px 15px;
border-radius: 8px;
margin-bottom: 20px;
font-size: 14px;
display: none;
}
/* Admin setup panel styles */
.admin-setup-panel {
display: none;
}
.setup-steps {
margin-bottom: 25px;
display: flex;
justify-content: space-between;
}
.setup-step {
display: flex;
flex-direction: column;
align-items: center;
width: 30%;
}
.step-number {
width: 30px;
height: 30px;
background-color: #e2e8f0;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
color: #64748b;
font-weight: bold;
margin-bottom: 5px;
}
.step-number.active {
background-color: #ff5e3a;
color: white;
}
.step-title {
font-size: 12px;
color: #64748b;
}
.step-title.active {
color: #1e293b;
font-weight: 500;
}
/* Language selector panel styles */
.language-selector-panel {
text-align: center;
}
.language-subtitle {
color: #64748b;
font-size: 16px;
margin-bottom: 24px;
}
/* ====== Compact Language Picker ====== */
.lang-picker {
position: relative;
margin-bottom: 24px;
text-align: left;
}
.lang-picker-selected {
display: flex;
align-items: center;
padding: 14px 18px;
border: 2px solid #e2e8f0;
border-radius: 12px;
cursor: pointer;
background-color: #f9fafb;
transition: all 0.2s ease;
user-select: none;
}
.lang-picker-selected:hover {
border-color: #ff5e3a;
background-color: #fff;
}
.lang-picker.open .lang-picker-selected {
border-color: #ff5e3a;
background-color: #fff;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
box-shadow: 0 0 0 3px rgba(255, 94, 58, 0.1);
}
.lang-picker-flag {
font-size: 26px;
margin-right: 14px;
flex-shrink: 0;
}
.lang-picker-name {
font-size: 16px;
font-weight: 600;
color: #1e293b;
flex: 1;
}
.lang-picker-arrow {
color: #94a3b8;
font-size: 13px;
transition: transform 0.2s ease;
flex-shrink: 0;
}
.lang-picker.open .lang-picker-arrow {
transform: rotate(180deg);
}
/* Dropdown */
.lang-picker-dropdown {
display: none;
position: absolute;
top: 100%;
left: 0;
right: 0;
background: #fff;
border: 2px solid #ff5e3a;
border-top: 1px solid #f1f5f9;
border-bottom-left-radius: 12px;
border-bottom-right-radius: 12px;
box-shadow: 0 12px 32px rgba(0, 0, 0, 0.12);
z-index: 100;
overflow: hidden;
}
.lang-picker.open .lang-picker-dropdown {
display: block;
animation: langPickerSlideDown 0.2s ease;
}
@keyframes langPickerSlideDown {
from { opacity: 0; transform: translateY(-4px); }
to { opacity: 1; transform: translateY(0); }
}
/* Search inside dropdown */
.lang-picker-search {
position: relative;
padding: 10px 14px;
border-bottom: 1px solid #f1f5f9;
}
.lang-picker-search i {
position: absolute;
left: 26px;
top: 50%;
transform: translateY(-50%);
color: #94a3b8;
font-size: 13px;
}
.lang-picker-search input {
width: 100%;
padding: 8px 12px 8px 32px;
border: 1px solid #e2e8f0;
border-radius: 8px;
font-size: 14px;
outline: none;
box-sizing: border-box;
transition: border-color 0.2s;
}
.lang-picker-search input:focus {
border-color: #ff5e3a;
}
/* Scrollable list */
.lang-picker-list {
max-height: 240px;
overflow-y: auto;
padding: 6px;
}
.lang-picker-list::-webkit-scrollbar {
width: 6px;
}
.lang-picker-list::-webkit-scrollbar-track {
background: transparent;
}
.lang-picker-list::-webkit-scrollbar-thumb {
background: #cbd5e1;
border-radius: 3px;
}
.lang-picker-list::-webkit-scrollbar-thumb:hover {
background: #94a3b8;
}
/* Language item in dropdown */
.lang-picker-item {
display: flex;
align-items: center;
gap: 10px;
padding: 10px 12px;
border-radius: 8px;
cursor: pointer;
transition: all 0.12s ease;
}
.lang-picker-item:hover {
background: #f8fafc;
}
.lang-picker-item.selected {
background: #fff5f3;
}
.lang-picker-item-flag {
font-size: 22px;
flex-shrink: 0;
}
.lang-picker-item-name {
font-size: 15px;
font-weight: 500;
color: #1e293b;
}
.lang-picker-item-english {
font-size: 13px;
color: #94a3b8;
margin-left: auto;
}
.lang-picker-item-check {
color: #ff5e3a;
font-size: 13px;
flex-shrink: 0;
}
.lang-picker-empty {
text-align: center;
color: #94a3b8;
padding: 20px;
font-size: 14px;
}
@media (max-width: 480px) {
.auth-panel {
width: 90%;
padding: 20px;
}
.lang-picker-selected {
padding: 12px 14px;
}
.lang-picker-list {
max-height: 200px;
}
}
/* ============================================================
DARK MODE — Auth Pages
============================================================ */
[data-theme="dark"] .auth-container {
background-color: #0f172a;
}
[data-theme="dark"] .auth-panel {
background-color: #1e293b;
box-shadow: 0 5px 20px rgba(0, 0, 0, 0.3);
}
[data-theme="dark"] .auth-logo-text {
color: #f1f5f9;
}
[data-theme="dark"] .auth-title {
color: #f1f5f9;
}
[data-theme="dark"] .auth-label {
color: #94a3b8;
}
[data-theme="dark"] .auth-input {
background-color: #0f172a;
border-color: #334155;
color: #e2e8f0;
}
[data-theme="dark"] .auth-input:focus {
border-color: #ff5e3a;
background-color: #0f172a;
box-shadow: 0 0 0 3px rgba(255, 94, 58, 0.15);
}
[data-theme="dark"] .auth-input::placeholder {
color: #64748b;
}
[data-theme="dark"] .auth-error {
background-color: #3b1111;
color: #fca5a5;
}
[data-theme="dark"] .auth-success {
background-color: #052e16;
color: #86efac;
}
[data-theme="dark"] .auth-toggle {
color: #94a3b8;
}
[data-theme="dark"] .auth-divider {
color: #64748b;
}
[data-theme="dark"] .auth-divider::before,
[data-theme="dark"] .auth-divider::after {
background: #334155;
}
[data-theme="dark"] .language-subtitle {
color: #94a3b8;
}
[data-theme="dark"] .lang-picker-selected {
background-color: #0f172a;
border-color: #334155;
}
[data-theme="dark"] .lang-picker-selected:hover {
border-color: #ff5e3a;
background-color: #162032;
}
[data-theme="dark"] .lang-picker.open .lang-picker-selected {
border-color: #ff5e3a;
background-color: #162032;
}
[data-theme="dark"] .lang-picker-name {
color: #f1f5f9;
}
[data-theme="dark"] .lang-picker-arrow {
color: #64748b;
}
[data-theme="dark"] .lang-picker-dropdown {
background: #1e293b;
border-color: #ff5e3a;
border-top-color: #334155;
box-shadow: 0 12px 32px rgba(0, 0, 0, 0.3);
}
[data-theme="dark"] .lang-picker-search {
border-bottom-color: #334155;
}
[data-theme="dark"] .lang-picker-search input {
background-color: #0f172a;
border-color: #334155;
color: #e2e8f0;
}
[data-theme="dark"] .lang-picker-search input:focus {
border-color: #ff5e3a;
}
[data-theme="dark"] .lang-picker-search input::placeholder {
color: #64748b;
}
[data-theme="dark"] .lang-picker-list::-webkit-scrollbar-thumb {
background: #475569;
}
[data-theme="dark"] .lang-picker-item:hover {
background: #162032;
}
[data-theme="dark"] .lang-picker-item.selected {
background: #2a1a15;
}
[data-theme="dark"] .lang-picker-item-name {
color: #f1f5f9;
}
[data-theme="dark"] .lang-picker-item-english {
color: #64748b;
}
[data-theme="dark"] .lang-picker-empty {
color: #64748b;
}
/* Setup steps */
[data-theme="dark"] .step-number {
background-color: #334155;
color: #94a3b8;
}
[data-theme="dark"] .step-title {
color: #94a3b8;
}
+126
View File
@@ -0,0 +1,126 @@
/* Styles for the favorites feature */
/* Favorite indicator */
.favorite-indicator {
position: absolute;
top: 10px;
right: 10px;
width: 25px;
height: 25px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
color: #ccc;
cursor: pointer;
z-index: 5;
transition: all 0.2s ease;
[dir='rtl'] & {
left: 10px;
right: unset;
}
}
.favorite-indicator:hover {
transform: scale(1.1);
}
.favorite-indicator.active {
color: #ffc107;
text-shadow: 0 0 5px rgba(255, 193, 7, 0.5);
}
/* Styles for the favorites view items */
.favorite-item {
position: relative;
}
/* Adjustments for grid view */
.file-card.favorite-item {
border-left: 3px solid #ffc107;
[dir='rtl'] & {
border-right: 3px solid #ffc107;
border-left: unset;
}
}
/* Adjustments for list view */
.list-header.favorites-header {
grid-template-columns: 30px minmax(200px, 2fr) 1fr 1fr 120px;
}
.file-item.favorite-item {
position: relative;
grid-template-columns: 30px minmax(200px, 2fr) 1fr 1fr 120px;
}
.file-item.favorite-item .favorite-indicator {
position: relative;
top: 0;
right: 0;
width: 30px;
height: 30px;
}
/* Styles for the favorites-specific empty state */
.favorites-empty-state {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 50px 20px;
text-align: center;
color: #6c757d;
}
.favorites-empty-state i {
font-size: 48px;
color: #ffc107;
margin-bottom: 20px;
opacity: 0.6;
}
.favorites-empty-state p {
margin-bottom: 10px;
max-width: 400px;
}
/* Animation for the favorite star */
@keyframes favorite-pulse {
0% { transform: scale(1); }
50% { transform: scale(1.2); }
100% { transform: scale(1); }
}
.favorite-indicator.active {
animation: favorite-pulse 0.3s ease;
}
/* ── Star badge on file/folder cards (normal view) ── */
/* Grid view: keep interactive star button behavior from style.css */
.file-card .favorite-star {
pointer-events: auto;
z-index: 12;
}
.file-card .favorite-star.active i,
.file-card .favorite-star.active svg {
animation: favorite-pulse 0.3s ease;
}
/* List view: small star next to the name */
.favorite-star-inline {
color: #ffc107;
font-size: 11px;
margin-left: 6px;
vertical-align: middle;
filter: drop-shadow(0 0 1px rgba(255, 193, 7, 0.4));
[dir='rtl'] & {
margin-left: 0;
margin-right: 6px;
}
}
+226
View File
@@ -0,0 +1,226 @@
/* OxiCloud Inline Viewer Styles */
.inline-viewer-modal {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 9999;
background-color: rgba(0, 0, 0, 0.85);
display: none;
opacity: 0;
transition: opacity 0.3s ease;
pointer-events: none;
}
.inline-viewer-modal.active {
display: flex !important;
opacity: 1;
align-items: center;
justify-content: center;
pointer-events: all;
}
.inline-viewer-content {
width: 90%;
height: 90%;
max-width: 1200px;
background-color: #fff;
border-radius: 8px;
overflow: hidden;
display: flex;
flex-direction: column;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
}
.inline-viewer-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 12px 16px;
background-color: #f8f9fa;
border-bottom: 1px solid #e2e8f0;
}
.inline-viewer-title {
font-size: 18px;
font-weight: 500;
color: #2d3748;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.inline-viewer-close {
background: none;
border: none;
font-size: 18px;
cursor: pointer;
color: #718096;
width: 36px;
height: 36px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
transition: background-color 0.2s;
}
.inline-viewer-close:hover {
background-color: #e2e8f0;
color: #4a5568;
}
.inline-viewer-container {
flex-grow: 1;
overflow: auto;
background-color: #f0f3f7;
display: flex;
align-items: center;
justify-content: center;
position: relative;
}
.inline-viewer-toolbar {
display: flex;
justify-content: space-between;
align-items: center;
padding: 12px 16px;
background-color: #f8f9fa;
border-top: 1px solid #e2e8f0;
}
.inline-viewer-download {
background-color: #ff5e3a;
color: white;
border: none;
border-radius: 4px;
padding: 8px 16px;
font-size: 14px;
font-weight: 500;
cursor: pointer;
display: flex;
align-items: center;
gap: 8px;
transition: background-color 0.2s;
}
.inline-viewer-download:hover {
background-color: #e74c3c;
}
.inline-viewer-controls {
display: flex;
gap: 8px;
}
.inline-viewer-controls button {
background-color: #f1f5f9;
border: 1px solid #cbd5e1;
border-radius: 4px;
width: 36px;
height: 36px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
color: #64748b;
transition: all 0.2s;
}
.inline-viewer-controls button:hover {
background-color: #e2e8f0;
color: #334155;
}
/* Image viewer */
.inline-viewer-image {
max-width: 100%;
max-height: 100%;
object-fit: contain;
transform-origin: center;
transition: transform 0.2s ease;
}
/* PDF viewer */
.inline-viewer-pdf,
.inline-viewer-pdf-fallback {
width: 100%;
height: 100%;
border: none;
}
/* Only show fallback if object fails */
.inline-viewer-pdf + .inline-viewer-pdf-fallback {
display: none;
}
.inline-viewer-pdf:not([data]),
.inline-viewer-pdf[data=""] + .inline-viewer-pdf-fallback {
display: block;
}
/* Loading indicator */
.inline-viewer-loader {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
font-size: 36px;
color: #64748b;
}
/* Error and unsupported message */
.inline-viewer-message {
padding: 32px;
text-align: center;
max-width: 400px;
}
.inline-viewer-icon {
font-size: 64px;
color: #cbd5e1;
margin-bottom: 24px;
}
.inline-viewer-text {
color: #64748b;
line-height: 1.6;
}
.inline-viewer-text p {
margin: 0 0 16px;
}
/* Text viewer */
.inline-viewer-text-content {
width: 100%;
height: 100%;
margin: 0;
padding: 16px 24px;
font-family: 'Courier New', Consolas, Monaco, monospace;
font-size: 14px;
line-height: 1.6;
color: #2d3748;
background-color: #fff;
overflow: auto;
white-space: pre-wrap;
word-wrap: break-word;
box-sizing: border-box;
text-align: left;
tab-size: 4;
}
/* Responsive adjustments */
@media (max-width: 768px) {
.inline-viewer-content {
width: 100%;
height: 100%;
border-radius: 0;
}
.inline-viewer-controls {
display: none;
}
}
+148
View File
@@ -0,0 +1,148 @@
*{box-sizing:border-box;margin:0;padding:0;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif}
body{background:#f5f7fa;color:#1e293b;min-height:100vh;display:flex;flex-direction:column}
.link-reset-flex{text-decoration:none;color:inherit;display:flex;align-items:center;gap:14px}
.width-zero{width:0%}
#main-content{display:none}
/* ── Scrollbar ── */
::-webkit-scrollbar{width:8px}
::-webkit-scrollbar-track{background:transparent}
::-webkit-scrollbar-thumb{background:rgba(0,0,0,.15);border-radius:4px}
*{scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.15) transparent}
/* ── Header ── */
.profile-header{
background:linear-gradient(135deg,#2a3042 0%,#232838 100%);
padding:0 32px;height:64px;display:flex;align-items:center;justify-content:space-between;
box-shadow:0 2px 12px rgba(0,0,0,.15);position:sticky;top:0;z-index:100;
}
.profile-header-left{display:flex;align-items:center;gap:14px}
.profile-logo{
width:38px;height:38px;background:linear-gradient(135deg,#ff5e3a,#ff2d55);border-radius:11px;
display:flex;align-items:center;justify-content:center;
box-shadow:0 3px 10px rgba(255,94,58,.35);
}
.profile-logo svg{width:20px;height:20px;fill:#fff}
.profile-title-text{font-size:17px;font-weight:700;color:#fff;letter-spacing:.3px}
.profile-title-separator{font-size:17px;color:rgba(255,255,255,.5);font-weight:400;margin-left:6px}
.profile-header-right a{
color:rgba(255,255,255,.65);text-decoration:none;font-size:13px;font-weight:500;
display:flex;align-items:center;gap:6px;transition:color .2s;
}
.profile-header-right a:hover{color:#fff}
/* ── Container ── */
.profile-container{max-width:720px;margin:0 auto;padding:32px 24px 60px;width:100%}
/* ── Card ── */
.profile-card{background:#fff;border-radius:16px;box-shadow:0 1px 4px rgba(0,0,0,.06),0 0 0 1px rgba(0,0,0,.03);padding:32px;margin-bottom:22px}
.profile-card h2{font-size:16px;font-weight:700;margin-bottom:20px;color:#1e293b;display:flex;align-items:center;gap:10px}
.profile-card h2 i{color:#ff5e3a;font-size:17px}
/* ── Avatar Section ── */
.avatar-section{display:flex;align-items:center;gap:24px;margin-bottom:8px}
.avatar-large{
width:88px;height:88px;border-radius:50%;
background:linear-gradient(135deg,#ff5e3a,#ff2d55);
display:flex;align-items:center;justify-content:center;
color:#fff;font-size:32px;font-weight:700;letter-spacing:1px;
box-shadow:0 6px 20px rgba(255,94,58,.3);flex-shrink:0;
}
.avatar-info h1{font-size:22px;font-weight:700;color:#1e293b;margin-bottom:4px}
.avatar-info .email{font-size:14px;color:#64748b;margin-bottom:8px}
.avatar-info .role-badge{
display:inline-flex;align-items:center;gap:5px;font-size:12px;font-weight:600;
padding:4px 12px;border-radius:20px;
}
.role-badge-admin{background:#dbeafe;color:#1d4ed8}
.role-badge-user{background:#f1f5f9;color:#64748b}
/* ── Info Grid ── */
.info-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px}
@media(max-width:560px){.info-grid{grid-template-columns:1fr}}
.info-item{padding:16px;background:#f8fafc;border-radius:12px;border:1px solid #e2e8f0}
.info-item .info-label{font-size:11.5px;color:#94a3b8;text-transform:uppercase;letter-spacing:.06em;font-weight:700;margin-bottom:4px;display:flex;align-items:center;gap:6px}
.info-item .info-label i{font-size:12px;color:#cbd5e1}
.info-item .info-value{font-size:15px;font-weight:600;color:#1e293b}
/* ── Storage ── */
.storage-section{margin-top:4px}
.storage-stats{display:grid;grid-template-columns:1fr 1fr 1fr;gap:14px;margin-bottom:16px}
@media(max-width:560px){.storage-stats{grid-template-columns:1fr}}
.storage-stat{text-align:center;padding:16px;background:#f8fafc;border-radius:12px;border:1px solid #e2e8f0}
.storage-stat .stat-value{font-size:1.5rem;font-weight:800;color:#1e293b}
.storage-stat .stat-label{font-size:11px;color:#94a3b8;text-transform:uppercase;letter-spacing:.06em;font-weight:600;margin-top:2px}
.storage-bar-wrap{margin-top:4px}
.storage-bar{height:10px;background:#e2e8f0;border-radius:5px;overflow:hidden}
.storage-fill{height:100%;border-radius:5px;transition:width .6s ease}
.storage-fill.green{background:linear-gradient(90deg,#059669,#10b981)}
.storage-fill.orange{background:linear-gradient(90deg,#d97706,#f59e0b)}
.storage-fill.red{background:linear-gradient(90deg,#dc2626,#ef4444)}
.storage-text{font-size:12px;color:#94a3b8;text-align:right;margin-top:6px}
/* ── Change Password ── */
.form-group{margin-bottom:16px}
.form-group label{display:block;font-size:13px;font-weight:600;margin-bottom:4px;color:#334155}
.form-group input{
width:100%;padding:10px 14px;border:2px solid #e2e8f0;border-radius:10px;font-size:14px;
background:#f8fafc;transition:all .2s;font-family:inherit;color:#1e293b;
}
.form-group input:focus{outline:none;border-color:#ff5e3a;background:#fff;box-shadow:0 0 0 3px rgba(255,94,58,.1)}
.form-group small{color:#94a3b8;font-size:12px;display:block;margin-top:3px}
.btn{
padding:10px 22px;border:none;border-radius:10px;font-size:14px;font-weight:600;
cursor:pointer;transition:all .15s;white-space:nowrap;display:inline-flex;align-items:center;gap:6px;
}
.btn-primary{background:linear-gradient(135deg,#ff5e3a,#ff2d55);color:#fff;box-shadow:0 2px 8px rgba(255,94,58,.25)}
.btn-primary:hover{box-shadow:0 4px 14px rgba(255,94,58,.35);transform:translateY(-1px)}
.btn-primary:disabled{opacity:.4;cursor:not-allowed;transform:none!important}
.alert{padding:12px 16px;border-radius:10px;font-size:13px;margin-top:14px;font-weight:500}
.alert-success{background:#ecfdf5;color:#065f46;border:1px solid #a7f3d0}
.alert-error{background:#fef2f2;color:#991b1b;border:1px solid #fecaca}
/* ── Loading / Error ── */
#loading{text-align:center;padding:80px;color:#94a3b8;font-size:15px}
#loading i{font-size:32px;color:#ff5e3a;display:block;margin-bottom:12px;animation:spin 1s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}
#auth-error{display:none;text-align:center;padding:80px 20px}
#auth-error .err-icon{width:80px;height:80px;background:#fef2f2;border-radius:50%;display:flex;align-items:center;justify-content:center;margin:0 auto 20px}
#auth-error .err-icon i{font-size:32px;color:#ef4444}
#auth-error h2{color:#991b1b;margin-bottom:8px;font-size:20px}
#auth-error p{color:#64748b;margin-bottom:20px;font-size:14px}
#auth-error a{display:inline-flex;align-items:center;gap:6px;padding:10px 24px;background:linear-gradient(135deg,#ff5e3a,#ff2d55);color:#fff;text-decoration:none;border-radius:10px;font-weight:600;font-size:14px;box-shadow:0 3px 12px rgba(255,94,58,.3);transition:all .2s}
#auth-error a:hover{transform:translateY(-1px);box-shadow:0 5px 18px rgba(255,94,58,.4)}
/* ── Dark Mode ── */
[data-theme="dark"] body{background:#0f172a;color:#e2e8f0}
[data-theme="dark"] ::-webkit-scrollbar-thumb{background:rgba(255,255,255,.15)}
[data-theme="dark"] *{scrollbar-color:rgba(255,255,255,.15) transparent}
[data-theme="dark"] .profile-card{background:#1e293b;box-shadow:0 1px 4px rgba(0,0,0,.2),0 0 0 1px rgba(255,255,255,.03)}
[data-theme="dark"] .profile-card h2{color:#f1f5f9}
[data-theme="dark"] .avatar-info h1{color:#f1f5f9}
[data-theme="dark"] .avatar-info .email{color:#94a3b8}
[data-theme="dark"] .role-badge-admin{background:#1e3a5f;color:#60a5fa}
[data-theme="dark"] .role-badge-user{background:#334155;color:#94a3b8}
[data-theme="dark"] .info-item{background:#162032;border-color:#334155}
[data-theme="dark"] .info-item .info-label{color:#64748b}
[data-theme="dark"] .info-item .info-label i{color:#475569}
[data-theme="dark"] .info-item .info-value{color:#f1f5f9}
[data-theme="dark"] .storage-stat{background:#162032;border-color:#334155}
[data-theme="dark"] .storage-stat .stat-value{color:#f1f5f9}
[data-theme="dark"] .storage-stat .stat-label{color:#64748b}
[data-theme="dark"] .storage-bar{background:#334155}
[data-theme="dark"] .storage-text{color:#64748b}
[data-theme="dark"] .form-group label{color:#94a3b8}
[data-theme="dark"] .form-group input{background:#0f172a;border-color:#334155;color:#e2e8f0}
[data-theme="dark"] .form-group input:focus{border-color:#ff5e3a;background:#0f172a;box-shadow:0 0 0 3px rgba(255,94,58,.15)}
[data-theme="dark"] .form-group small{color:#64748b}
[data-theme="dark"] .alert-success{background:#052e16;color:#86efac;border-color:#065f46}
[data-theme="dark"] .alert-error{background:#3b1111;color:#fca5a5;border-color:#991b1b}
[data-theme="dark"] #auth-error{background:transparent}
[data-theme="dark"] #auth-error .err-icon{background:#3b1111}
[data-theme="dark"] #auth-error h2{color:#fca5a5}
[data-theme="dark"] #auth-error p{color:#94a3b8}
[data-theme="dark"] #loading{color:#64748b}
+92
View File
@@ -0,0 +1,92 @@
/* Styles for the recent files feature */
/* Recent indicator */
.recent-indicator {
position: absolute;
top: 10px;
right: 10px;
width: 25px;
height: 25px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
color: #6c757d;
z-index: 5;
[dir='rtl'] & {
left: 10px;
right: unset;
}
}
/* Styles for the recent view items */
.recent-item {
position: relative;
}
/* Adjustments for grid view */
.file-card.recent-item {
border-left: 3px solid #6c757d;
[dir='rtl'] & {
border-right: 3px solid #6c757d;
border-left: unset;
}
}
/* Adjustments for list view */
.list-header.recent-header {
grid-template-columns: 30px minmax(200px, 2fr) 1fr 1fr 120px;
}
.file-item.recent-item {
position: relative;
grid-template-columns: 30px minmax(200px, 2fr) 1fr 1fr 120px;
}
.file-item.recent-item .recent-indicator {
position: relative;
top: 0;
right: 0;
width: 30px;
height: 30px;
}
/* Styles for the recent-specific empty state */
.recents-empty-state {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 50px 20px;
text-align: center;
color: #6c757d;
}
.recents-empty-state i {
font-size: 48px;
color: #6c757d;
margin-bottom: 20px;
opacity: 0.6;
}
.recents-empty-state p {
margin-bottom: 10px;
max-width: 400px;
}
/* Tooltip for access time */
.recent-item .file-info {
cursor: help;
}
/* Animation for recent files */
.recent-item {
animation: recent-fade-in 0.3s ease;
}
@keyframes recent-fade-in {
from { opacity: 0; transform: translateY(10px); }
to { opacity: 1; transform: translateY(0); }
}
+420
View File
@@ -0,0 +1,420 @@
.page-description {
color: #718096;
font-size: 16px;
margin-top: -15px;
margin-bottom: 25px;
}
.shared-page-container {
max-width: 1280px;
margin: 20px auto;
padding: 0 20px;
}
.shared-header {
margin-bottom: 25px;
}
.shared-header h2 {
font-size: 24px;
color: #2d3748;
margin-bottom: 8px;
}
.shared-header p {
color: #718096;
font-size: 16px;
}
/* In-app Shared view (index.html dynamic container) */
.shared-view-container .shared-header {
margin-bottom: 20px;
}
.shared-view-container .shared-filters {
display: flex;
align-items: center;
justify-content: flex-start;
gap: 12px;
flex-wrap: wrap;
margin-bottom: 0;
padding: 15px;
background-color: #f8f9fa;
box-shadow: 0 1px 3px rgba(0,0,0,0.05);
border-radius: 10px 10px 0 0;
border-bottom: 1px solid #e0e6ed;
font-weight: 600;
color: #2d3748;
}
.shared-view-container .shared-custom-select {
position: relative;
}
.shared-view-container .shared-select-toggle {
display: flex;
align-items: center;
gap: 10px;
width: 100%;
padding: 10px 40px 10px 16px;
border-radius: 12px;
border: 2px solid #e2e8f0;
background-color: #f8fafc;
font-size: 14px;
font-weight: 500;
color: #1a202c;
cursor: pointer;
min-width: 170px;
height: 44px;
transition: all 0.2s ease;
text-align: left;
}
.shared-view-container .shared-select-toggle:hover {
border-color: #cbd5e0;
background-color: #fff;
}
.shared-view-container .shared-custom-select.open .shared-select-toggle {
border-color: #ff5e3a;
background-color: #fff;
box-shadow: 0 0 0 4px rgba(255, 94, 58, 0.1);
}
.shared-view-container .shared-select-arrow {
position: absolute;
right: 14px;
top: 50%;
transform: translateY(-50%);
font-size: 10px;
color: #718096;
transition: transform 0.2s ease;
pointer-events: none;
}
.shared-view-container .shared-custom-select.open .shared-select-arrow {
transform: translateY(-50%) rotate(180deg);
}
.shared-view-container .shared-select-dropdown {
position: absolute;
top: calc(100% + 6px);
left: 0;
min-width: 100%;
background-color: white;
border-radius: 12px;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
border: 1px solid #e2e8f0;
opacity: 0;
visibility: hidden;
transform: translateY(-10px);
transition: all 0.2s ease;
z-index: 1000;
overflow: hidden;
}
.shared-view-container .shared-custom-select.open .shared-select-dropdown {
opacity: 1;
visibility: visible;
transform: translateY(0);
}
.shared-view-container .shared-select-option {
display: flex;
align-items: center;
padding: 12px 16px;
cursor: pointer;
font-size: 14px;
font-weight: 400;
color: #4a5568;
transition: background-color 0.15s ease;
}
.shared-view-container .shared-select-option:hover {
background-color: #f7fafc;
}
.shared-view-container .shared-select-option.active {
background-color: #fff5f3;
color: #ff5e3a;
font-weight: 500;
}
.shared-filters {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 0;
flex-wrap: wrap;
gap: 15px;
background-color: #f8f9fa;
border-radius: 10px 10px 0 0;
padding: 15px;
border-bottom: 1px solid #e0e6ed;
box-shadow: 0 1px 3px rgba(0,0,0,0.05);
font-weight: 600;
color: #2d3748;
}
.filter-group {
display: flex;
align-items: center;
gap: 10px;
}
.filter-group label {
font-size: 14px;
color: #4a5568;
font-weight: 500;
}
.filter-group select {
padding: 8px 12px;
border: 1px solid #e2e8f0;
border-radius: 6px;
background-color: white;
font-size: 14px;
min-width: 120px;
}
.search-box {
display: flex;
gap: 10px;
}
.search-box input {
padding: 8px 15px;
border: 1px solid #e2e8f0;
border-radius: 6px;
font-size: 14px;
width: 250px;
}
.shared-list-container {
background-color: white;
border-radius: 0 0 10px 10px;
box-shadow: 0 1px 3px rgba(0,0,0,0.05);
overflow: hidden;
margin-bottom: 25px;
}
.shared-list,
.shared-table {
width: 100%;
border-collapse: collapse;
}
.shared-list thead th,
.shared-table thead th {
padding: 15px;
text-align: left;
font-weight: 600;
color: #2d3748;
background-color: #f8f9fa;
border-bottom: 1px solid #e0e6ed;
}
.shared-list tbody td,
.shared-table tbody td {
padding: 15px;
border-bottom: 1px solid #f0f0f0;
vertical-align: middle;
}
.shared-item-name {
display: flex;
align-items: center;
gap: 10px;
}
.shared-item-actions {
display: flex;
gap: 10px;
}
.shared-list .action-btn,
.shared-table .action-btn {
width: 32px;
height: 32px;
border: 1px solid #e2e8f0;
border-radius: 6px;
background-color: white;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
transition: all 0.2s;
}
.shared-list .action-btn:hover,
.shared-table .action-btn:hover {
background-color: #f0f8ff;
border-color: #90cdf4;
}
.action-icon {
font-size: 14px;
}
#empty-shared-state.empty-state {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 50px 20px;
background-color: transparent;
border-radius: 0;
box-shadow: none;
text-align: center;
color: #6c757d;
}
#empty-shared-state p {
margin-bottom: 10px;
max-width: 400px;
}
@media (max-width: 768px) {
.shared-filters {
flex-direction: column;
align-items: flex-start;
}
.shared-list thead th:nth-child(4),
.shared-list thead th:nth-child(5),
.shared-list tbody td:nth-child(4),
.shared-list tbody td:nth-child(5),
.shared-table thead th:nth-child(4),
.shared-table thead th:nth-child(5),
.shared-table tbody td:nth-child(4),
.shared-table tbody td:nth-child(5) {
display: none;
}
}
[data-theme="dark"] .shared-filters {
background-color: #162032;
color: #94a3b8;
border-bottom-color: #334155;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
}
[data-theme="dark"] .shared-view-container .shared-select-toggle {
background-color: #1e293b;
border-color: #334155;
color: #cbd5e1;
}
[data-theme="dark"] .shared-view-container .shared-filters {
background-color: #162032;
color: #94a3b8;
border-bottom-color: #334155;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
}
[data-theme="dark"] .shared-view-container .shared-select-toggle:hover {
background-color: #334155;
border-color: #475569;
}
[data-theme="dark"] .shared-view-container .shared-custom-select.open .shared-select-toggle {
border-color: #ff5e3a;
box-shadow: 0 0 0 4px rgba(255, 94, 58, 0.15);
background-color: #1e293b;
}
[data-theme="dark"] .shared-view-container .shared-select-arrow {
color: #94a3b8;
}
[data-theme="dark"] .shared-view-container .shared-select-dropdown {
background-color: #1e293b;
border-color: #334155;
box-shadow: 0 8px 30px rgba(0, 0, 0, 0.5);
}
[data-theme="dark"] .shared-view-container .shared-select-option {
color: #cbd5e1;
}
[data-theme="dark"] .shared-view-container .shared-select-option:hover {
background-color: #334155;
}
[data-theme="dark"] .shared-view-container .shared-select-option.active {
background-color: rgba(255, 94, 58, 0.1);
color: #ff5e3a;
}
[data-theme="dark"] .filter-group label {
color: #94a3b8;
}
[data-theme="dark"] .filter-group select {
background-color: #1e293b;
border-color: #334155;
color: #e2e8f0;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%2394a3b8' d='M6 8L1 3h10z'/%3E%3C/svg%3E");
}
[data-theme="dark"] .filter-group select:focus {
border-color: #ff5e3a;
box-shadow: 0 0 0 3px rgba(255, 94, 58, 0.15);
}
[data-theme="dark"] .search-box input {
background-color: #1e293b;
border-color: #334155;
color: #e2e8f0;
}
[data-theme="dark"] .search-box input::placeholder {
color: #64748b;
}
[data-theme="dark"] .shared-list-container {
background-color: #1e293b;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
}
[data-theme="dark"] .shared-list thead th,
[data-theme="dark"] .shared-table thead th {
background-color: #162032;
color: #94a3b8;
border-bottom-color: #334155;
}
[data-theme="dark"] .shared-list tbody td,
[data-theme="dark"] .shared-table tbody td {
border-bottom-color: #334155;
color: #e2e8f0;
}
[data-theme="dark"] .shared-list tbody tr:hover,
[data-theme="dark"] .shared-table tbody tr:hover {
background-color: #162032;
}
[data-theme="dark"] .page-description {
color: #94a3b8;
}
[data-theme="dark"] #empty-shared-state.empty-state {
background-color: transparent;
box-shadow: none;
color: #64748b;
}
[data-theme="dark"] #empty-shared-state p {
color: #94a3b8;
}
[data-theme="dark"] .shared-list .action-btn,
[data-theme="dark"] .shared-table .action-btn {
color: #94a3b8;
}
[data-theme="dark"] .shared-list .action-btn:hover,
[data-theme="dark"] .shared-table .action-btn:hover {
color: #ff5e3a;
}
+68
View File
@@ -0,0 +1,68 @@
.trash-item {
position: relative;
}
.trash-actions {
position: absolute;
top: 10px;
right: 10px;
display: none;
gap: 8px;
}
.file-card.trash-item:hover .trash-actions,
.file-item.trash-item:hover .actions-cell {
display: flex;
}
.trash-actions button,
.actions-cell button {
background: #fff;
border: 1px solid #ddd;
border-radius: 4px;
padding: 4px 8px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
width: 30px;
height: 30px;
transition: all 0.2s;
}
.trash-actions button:hover,
.actions-cell button:hover {
background: #f0f0f0;
}
.btn-restore {
color: #4caf50;
}
.btn-delete {
color: #f44336;
}
.actions-cell {
display: flex;
gap: 8px;
justify-content: flex-start;
align-items: center;
}
.btn-danger {
background-color: #f44336;
color: white;
}
[data-theme="dark"] .trash-actions button,
[data-theme="dark"] .actions-cell button {
background: #1e293b;
border-color: #334155;
color: #e2e8f0;
}
[data-theme="dark"] .trash-actions button:hover,
[data-theme="dark"] .actions-cell button:hover {
background: #334155;
}