diff --git a/public/index.html b/public/index.html index 73941bd..ccfc258 100644 --- a/public/index.html +++ b/public/index.html @@ -1,4 +1,4 @@ - +
@@ -30,1724 +30,4 @@ } html{font-size:15px} body{font-family:'Outfit',sans-serif;background:var(--bg-primary);color:var(--text-primary);min-height:100vh;overflow-x:hidden} -body::before{content:'';position:fixed;inset:0;background:radial-gradient(ellipse 80% 60% at 20% 10%,rgba(26,63,199,.05) 0%,transparent 60%),radial-gradient(ellipse 60% 50% at 80% 90%,rgba(224,92,26,.04) 0%,transparent 60%);pointer-events:none;z-index:0} - -/* ============================================================ - SPLASH SCREEN - ============================================================ */ -#splash{ - position:fixed;inset:0;z-index:9999;background:#03040a; - display:flex;flex-direction:column;align-items:center;justify-content:center; - overflow:hidden; -} -#splash.fade-out{ - animation:splashFadeOut .7s cubic-bezier(.4,0,1,1) forwards; -} -@keyframes splashFadeOut{ - 0%{opacity:1;transform:scale(1)} - 100%{opacity:0;transform:scale(1.05);pointer-events:none} -} - -/* Particle streaks */ -.streak{ - position:absolute;height:1px;width:200px; - background:linear-gradient(90deg,transparent,rgba(30,75,216,.4),transparent); - border-radius:1px; - animation:streakMove linear infinite; - pointer-events:none; -} -@keyframes streakMove{ - from{transform:translateX(-300px)} - to{transform:translateX(110vw)} -} - -/* Radial glow behind content */ -.splash-bg-glow{ - position:absolute;width:600px;height:600px;border-radius:50%; - background:radial-gradient(ellipse,rgba(30,75,216,.12) 0%,rgba(224,92,26,.06) 40%,transparent 70%); - animation:glowBreath 3s ease-in-out infinite; - pointer-events:none; -} -@keyframes glowBreath{ - 0%,100%{transform:scale(1);opacity:.7} - 50%{transform:scale(1.12);opacity:1} -} - -/* Ring around animated dragon */ -.splash-ring{ - position:absolute;width:300px;height:300px;border-radius:50%; - border:1px solid rgba(30,75,216,.2); - animation:ringPulse 2.5s ease-in-out infinite; - pointer-events:none; -} -.splash-ring-2{ - width:380px;height:380px;border-color:rgba(224,92,26,.1); - animation-delay:.6s; -} -@keyframes ringPulse{ - 0%,100%{transform:scale(1);opacity:.5} - 50%{transform:scale(1.05);opacity:1} -} - -/* Main content */ -.splash-content{ - position:relative;z-index:2; - display:flex;flex-direction:column;align-items:center;gap:0; - animation:splashContentIn .9s cubic-bezier(.22,1,.36,1) both; -} -@keyframes splashContentIn{ - from{opacity:0;transform:translateY(28px)} - to{opacity:1;transform:translateY(0)} -} - -/* Animated dragon GIF */ -.splash-anim{ - width:220px;height:220px;object-fit:contain; - /* GIF is white — filter makes it show correctly on dark bg */ - filter:drop-shadow(0 0 40px rgba(30,75,216,.6)) drop-shadow(0 0 80px rgba(224,92,26,.3)); - animation:dragonFloat 4s ease-in-out infinite; - margin-bottom:-.5rem; -} -@keyframes dragonFloat{ - 0%,100%{transform:translateY(0) rotate(0deg)} - 33%{transform:translateY(-8px) rotate(.5deg)} - 66%{transform:translateY(-4px) rotate(-.3deg)} -} - -/* Wild Dragon wordmark — not used, dragon icon only */ -.splash-wordmark{ display:none; } -@keyframes wordmarkIn{ - from{opacity:0;transform:translateY(10px) scale(.97)} - to{opacity:1;transform:translateY(0) scale(1)} -} - -/* Dragon Wind subtitle */ -.splash-product{ - margin-top:.9rem; - font-family:'JetBrains Mono',monospace; - font-size:.72rem;letter-spacing:.35em;text-transform:uppercase; - background:linear-gradient(90deg,var(--dragon),var(--dragon-bright),#ffb07a,var(--dragon-bright),var(--dragon)); - background-size:200% auto; - -webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text; - animation:shimmer 3s linear infinite, wordmarkIn .8s .4s both; -} -@keyframes shimmer{ - to{background-position:200% center} -} - -/* Loading bar */ -.splash-progress-wrap{ - margin-top:2rem; - width:200px;height:2px;background:rgba(255,255,255,.06);border-radius:2px;overflow:hidden; - animation:wordmarkIn .6s .55s both; -} -.splash-progress-bar{ - height:100%;width:0%;border-radius:2px; - background:linear-gradient(90deg,var(--blue),var(--dragon-bright)); - transition:width .08s linear; -} - -/* Version stamp */ -.splash-version{ - position:absolute;bottom:1.5rem; - font-family:'JetBrains Mono',monospace;font-size:.6rem; - color:rgba(255,255,255,.12);letter-spacing:.12em; -} - -/* ============================================================ - LOGIN - ============================================================ */ -.login-screen{position:fixed;inset:0;z-index:1000;display:flex;align-items:center;justify-content:center;background:var(--bg-primary)} -.login-screen.hidden{display:none} -.login-box{width:400px;background:var(--bg-card);border:1px solid var(--border);border-radius:18px;padding:2.5rem 2rem;text-align:center;position:relative;z-index:1;box-shadow:0 24px 80px rgba(0,0,0,.4)} - -/* Dragon icon in login */ -.login-icon-wrap{display:flex;flex-direction:column;align-items:center;gap:.5rem;margin-bottom:1.5rem} -.login-dragon-icon{display:none} -.login-wordmark{display:none} -.login-vpm-text{font-family:'Outfit',sans-serif;font-size:2.4rem;font-weight:800;letter-spacing:-.04em;color:var(--text-primary);line-height:1} -.login-vpm-sub{font-size:.62rem;color:var(--text-dim);text-transform:uppercase;letter-spacing:.18em;margin-top:.3rem} - -.login-product{font-size:.65rem;color:var(--text-dim);text-transform:uppercase;letter-spacing:.18em;margin-top:.25rem} -.login-field{width:100%;padding:.75rem 1rem;font-family:'Outfit',sans-serif;font-size:.9rem;background:var(--bg-secondary);border:1px solid var(--border);border-radius:10px;color:var(--text-primary);outline:none;transition:all .2s;margin-bottom:.75rem} -.login-field:focus{border-color:var(--blue);box-shadow:0 0 0 3px rgba(30,75,216,.15)} -.login-field::placeholder{color:var(--text-dim)} -.login-btn{width:100%;padding:.8rem;margin-top:.5rem;font-family:'Outfit',sans-serif;font-size:.9rem;font-weight:700;color:#fff;background:linear-gradient(135deg,var(--blue),var(--blue-bright));border:none;border-radius:10px;cursor:pointer;transition:all .2s} -.login-btn:hover{transform:translateY(-1px);box-shadow:0 6px 24px rgba(30,75,216,.35)} -.login-btn:disabled{opacity:.4;cursor:not-allowed;transform:none;box-shadow:none} -.login-error{margin-top:.75rem;font-size:.8rem;color:var(--error);min-height:1.2em} - -/* ============================================================ - APP SHELL - ============================================================ */ -.app{position:relative;z-index:1} -.app.hidden{display:none} - -/* HEADER */ -.header{display:flex;align-items:center;justify-content:space-between;padding:.8rem 2rem;border-bottom:1px solid var(--border);background:rgba(6,8,14,.9);backdrop-filter:blur(20px);position:sticky;top:0;z-index:100} -.header-left{display:flex;align-items:center;gap:.85rem;min-width:0;flex:1} -.header-dragon{display:none} -.header-wordmark{display:none} -.header-vpm-text{font-family:'Outfit',sans-serif;font-size:1.25rem;font-weight:800;letter-spacing:-.03em;color:var(--text-primary);flex-shrink:0} -[data-theme="light"] .header{background:rgba(240,242,247,.9)} -.header-product-tag{font-family:'JetBrains Mono',monospace;font-size:.58rem;color:var(--dragon-bright);text-transform:uppercase;letter-spacing:.15em;background:var(--dragon-glow);border:1px solid rgba(224,92,26,.25);border-radius:4px;padding:.15rem .45rem;flex-shrink:0} -.header-right{display:flex;align-items:center;gap:.85rem;flex-shrink:0} -.header-user{font-size:.75rem;color:var(--text-secondary);font-family:'JetBrains Mono',monospace} -.btn-logout{padding:.35rem .85rem;font-family:'Outfit',sans-serif;font-size:.72rem;font-weight:600;background:var(--bg-secondary);border:1px solid var(--border);border-radius:6px;color:var(--text-secondary);cursor:pointer;transition:all .15s} -.btn-logout:hover{border-color:var(--error);color:var(--error)} -.theme-toggle{width:32px;height:32px;border-radius:8px;border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-secondary);cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:.95rem;transition:all .2s} -.theme-toggle:hover{border-color:var(--blue);color:var(--blue-bright)} - -/* FOOTER */ -.app-footer{text-align:center;padding:2rem 2rem 1.5rem;border-top:1px solid var(--border);margin-top:3rem} -.app-footer-text{font-size:.68rem;color:var(--text-dim);line-height:1.8;letter-spacing:.02em} -.app-footer-text strong{color:var(--text-secondary);font-weight:600} -.app-footer-divider{display:inline-block;margin:0 .5rem;opacity:.35} - -/* NAV TABS */ -.nav-tabs{display:flex;padding:0 2rem;border-bottom:1px solid var(--border);background:var(--bg-secondary)} -.nav-tab{padding:.65rem 1.1rem;font-size:.78rem;font-weight:600;color:var(--text-dim);cursor:pointer;border-bottom:2px solid transparent;transition:all .15s;white-space:nowrap;user-select:none;-webkit-user-select:none} -.nav-tab:hover{color:var(--text-secondary)} -.nav-tab.active{color:var(--blue-bright);border-bottom-color:var(--blue-bright)} -.nav-tab.admin-tab.active{color:var(--warning);border-bottom-color:var(--warning)} - -/* PAGES */ -.page{display:none;max-width:760px;margin:0 auto;padding:2rem 2rem} -.page.active{display:block} - -/* SECTION TITLE */ -.section-title{font-size:.68rem;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:var(--text-dim);margin-bottom:1rem;display:flex;align-items:center;gap:.55rem} -.section-title::before{content:'';width:3px;height:13px;background:linear-gradient(to bottom,var(--blue),var(--dragon));border-radius:2px} - -/* UPLOAD MODE */ -.mode-bar{display:flex;gap:.5rem;margin-bottom:1.25rem} -.mode-btn{flex:1;padding:.65rem;border:1px solid var(--border);border-radius:10px;background:var(--bg-card);color:var(--text-secondary);cursor:pointer;font-family:'Outfit',sans-serif;font-size:.82rem;font-weight:600;transition:all .2s;display:flex;align-items:center;justify-content:center;gap:.5rem} -.mode-btn:hover{border-color:var(--border-bright);background:var(--bg-card-hover)} -.mode-btn.active-http{border-color:var(--blue-bright);background:var(--accent-glow);color:var(--blue-bright)} -.mode-btn.active-udp{border-color:var(--dragon-bright);background:var(--dragon-glow);color:var(--dragon-bright)} -.mode-badge{font-size:.62rem;padding:.12rem .4rem;border-radius:4px;font-weight:700;text-transform:uppercase;background:rgba(255,255,255,.06)} -.mode-desc{font-size:.78rem;color:var(--text-dim);margin-bottom:1.5rem;padding:.65rem .9rem;background:var(--bg-card);border:1px solid var(--border);border-radius:8px;line-height:1.5} - -/* FOLDER TREE SELECTOR */ -.folder-tree-box{background:var(--bg-card);border:1px solid var(--border);border-radius:10px;overflow:hidden;margin-bottom:.55rem} -.folder-tree-row{display:flex;align-items:center;gap:.5rem;padding:.42rem .75rem;cursor:pointer;transition:background .12s;user-select:none;border-bottom:1px solid var(--border)} -.folder-tree-row:last-child{border-bottom:none} -.folder-tree-row:hover{background:var(--bg-card-hover)} -.folder-tree-row.active{background:var(--accent-glow);border-left:3px solid var(--blue-bright)} -.folder-tree-row.active .ftr-name{color:var(--blue-bright)} -.folder-tree-row .ftr-icon{font-size:.78rem;flex-shrink:0;width:16px;text-align:center} -.folder-tree-row .ftr-name{font-family:'JetBrains Mono',monospace;font-size:.76rem;color:var(--text-secondary);flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} -.folder-tree-row .ftr-rm{font-size:.6rem;width:16px;height:16px;display:inline-flex;align-items:center;justify-content:center;border-radius:50%;background:transparent;border:none;color:inherit;cursor:pointer;opacity:.4;transition:all .15s;flex-shrink:0} -.folder-tree-row .ftr-rm:hover{opacity:1;background:var(--error-bg);color:var(--error)} -.folder-tree-children{padding-left:1.2rem} -/* keep add-row / chip styles for admin panel reuse */ -.tree-chip{display:none}.tree-chip-none{display:none}.tree-root-bar{display:none} -.add-row{display:flex;gap:.4rem;align-items:center} -.add-input{flex:1;padding:.38rem .7rem;font-family:'JetBrains Mono',monospace;font-size:.76rem;background:var(--bg-secondary);border:1px solid var(--border);border-radius:8px;color:var(--text-primary);outline:none;transition:all .2s} -.add-input:focus{border-color:var(--blue);box-shadow:0 0 0 3px rgba(30,75,216,.12)} -.add-input::placeholder{color:var(--text-dim)} -.btn-small{padding:.38rem .8rem;font-family:'Outfit',sans-serif;font-size:.72rem;font-weight:600;background:var(--blue);color:#fff;border:none;border-radius:8px;cursor:pointer;transition:all .15s;white-space:nowrap} -.btn-small:hover{background:var(--blue-bright)} -.tree-toggle{display:inline-flex;align-items:center;gap:.4rem;padding:.32rem .75rem;margin-top:.55rem;font-size:.7rem;font-weight:600;background:var(--bg-secondary);border:1px solid var(--border);border-radius:6px;color:var(--text-secondary);cursor:pointer;transition:all .15s;user-select:none} -.tree-toggle:hover{border-color:var(--border-bright);color:var(--text-primary)} -.tree-toggle .arrow{transition:transform .2s;display:inline-block;font-size:.55rem} -.tree-toggle.open .arrow{transform:rotate(90deg)} -.tree-panel{max-height:0;overflow:hidden;transition:max-height .35s ease,opacity .25s ease;opacity:0} -.tree-panel.open{max-height:2000px;opacity:1} -.tree-inner{margin-top:.7rem;padding:1rem;background:var(--bg-card);border:1px solid var(--border);border-radius:10px;max-height:380px;overflow-y:auto} - -/* DROP ZONE */ -.drop-zone{border:2px dashed var(--border);border-radius:14px;padding:2.5rem;text-align:center;cursor:pointer;transition:all .25s;background:var(--bg-card);margin-bottom:1.25rem;position:relative} -.drop-zone:hover,.drop-zone.drag-over{border-color:var(--blue-bright);background:var(--accent-glow)} -.drop-zone-icon{font-size:2rem;margin-bottom:.65rem;display:block} -.drop-zone-label{font-size:.92rem;font-weight:600;color:var(--text-secondary);margin-bottom:.3rem} -.drop-zone-sub{font-size:.76rem;color:var(--text-dim)} -#file-input{display:none} - -/* FILE LIST */ -.file-list{margin-bottom:1.25rem} -.file-item{display:flex;align-items:center;gap:.75rem;padding:.6rem .85rem;background:var(--bg-card);border:1px solid var(--border);border-radius:10px;margin-bottom:.4rem;transition:all .2s} -.file-item:hover{border-color:var(--border-bright)} -.file-icon{font-size:1.05rem;flex-shrink:0} -.file-info{flex:1;min-width:0} -.file-name{font-size:.8rem;font-weight:600;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis} -.file-size{font-size:.68rem;color:var(--text-dim);font-family:'JetBrains Mono',monospace} -.file-status{font-size:.72rem;font-weight:600;flex-shrink:0} -.file-status.pending{color:var(--text-dim)} -.file-status.uploading{color:var(--blue-bright)} -.file-status.done{color:var(--success)} -.file-status.error{color:var(--error)} -.file-remove{width:22px;height:22px;border-radius:50%;border:none;background:transparent;color:var(--text-dim);cursor:pointer;font-size:.68rem;display:flex;align-items:center;justify-content:center;transition:all .15s;flex-shrink:0} -.file-remove:hover{background:var(--error-bg);color:var(--error)} -.file-progress{height:3px;background:var(--border);border-radius:2px;margin-top:.3rem;overflow:hidden} -.file-progress-bar{height:100%;background:linear-gradient(90deg,var(--blue),var(--blue-bright));border-radius:2px;transition:width .3s} -.file-progress-bar.udp{background:linear-gradient(90deg,var(--dragon),var(--dragon-bright))} - -/* UPLOAD BUTTON */ -.btn-upload{width:100%;padding:.9rem;font-family:'Outfit',sans-serif;font-size:.98rem;font-weight:700;color:#fff;border:none;border-radius:12px;cursor:pointer;transition:all .2s;letter-spacing:.02em;background:linear-gradient(135deg,var(--blue),var(--blue-bright))} -.btn-upload:hover:not(:disabled){transform:translateY(-2px);box-shadow:0 8px 28px rgba(30,75,216,.4)} -.btn-upload:disabled{opacity:.4;cursor:not-allowed;transform:none;box-shadow:none} -.btn-upload.udp{background:linear-gradient(135deg,var(--dragon),var(--dragon-bright))} -.btn-upload.udp:hover:not(:disabled){box-shadow:0 8px 28px rgba(224,92,26,.4)} - -/* STATS */ -.upload-stats{display:grid;grid-template-columns:repeat(3,1fr);gap:.75rem;margin-top:1.5rem} -.stat-card{background:var(--bg-card);border:1px solid var(--border);border-radius:10px;padding:.85rem;text-align:center} -.stat-value{font-size:1.4rem;font-weight:700;color:var(--text-primary);font-family:'JetBrains Mono',monospace} -.stat-label{font-size:.65rem;color:var(--text-dim);text-transform:uppercase;letter-spacing:.09em;margin-top:.2rem} - -/* AMPP MONITOR */ -.job-list{display:flex;flex-direction:column;gap:.45rem} -.job-item{background:var(--bg-card);border:1px solid var(--border);border-radius:10px;padding:.75rem .95rem;display:flex;align-items:center;gap:.75rem;transition:border-color .15s} -.job-item:hover{border-color:var(--border-bright)} -.job-dot{width:9px;height:9px;border-radius:50%;flex-shrink:0} -.job-dot.running{background:var(--blue-bright);box-shadow:0 0 6px var(--blue-bright);animation:pulse 1.5s infinite} -.job-dot.completed{background:var(--success)} -.job-dot.failed{background:var(--error)} -.job-dot.queued{background:var(--warning)} -.job-dot.unknown{background:var(--text-dim)} -@keyframes pulse{0%,100%{opacity:1}50%{opacity:.4}} -.job-info{flex:1;min-width:0} -.job-name{font-size:.8rem;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} -.job-meta{font-size:.68rem;color:var(--text-dim);font-family:'JetBrains Mono',monospace;margin-top:.12rem} -.job-status{font-size:.7rem;font-weight:600;flex-shrink:0;padding:.18rem .55rem;border-radius:5px} -.job-status.running{background:var(--accent-glow);color:var(--blue-bright)} -.job-status.completed{background:var(--success-bg);color:var(--success)} -.job-status.failed{background:var(--error-bg);color:var(--error)} -.job-status.queued{background:var(--warning-bg);color:var(--warning)} -.refresh-btn{padding:.32rem .75rem;font-size:.7rem;font-weight:600;background:var(--bg-secondary);border:1px solid var(--border);border-radius:6px;color:var(--text-secondary);cursor:pointer;transition:all .15s} -.refresh-btn:hover{border-color:var(--border-bright);color:var(--text-primary)} - -/* ADMIN */ -.admin-tabs{display:flex;border-bottom:1px solid var(--border);margin-bottom:1.5rem;flex-wrap:wrap} -.admin-tab{padding:.5rem 1rem;font-size:.76rem;font-weight:600;color:var(--text-dim);cursor:pointer;border-bottom:2px solid transparent;transition:all .15s;user-select:none;-webkit-user-select:none} -.admin-tab:hover{color:var(--text-secondary)} -.admin-tab.active{color:var(--blue-bright);border-bottom-color:var(--blue-bright)} -.admin-panel{display:none} -.admin-panel.active{display:block} -/* EXTENSION INSTALL GUIDE */ -.ext-steps{display:flex;flex-direction:column;gap:.88rem;margin-bottom:1.5rem} -.ext-step{display:flex;gap:1rem;align-items:flex-start} -.ext-step-num{flex-shrink:0;width:28px;height:28px;border-radius:50%;background:var(--blue);color:#fff;font-size:.78rem;font-weight:700;display:flex;align-items:center;justify-content:center;margin-top:.1rem} -.ext-step-body{flex:1} -.ext-step-body strong{display:block;font-size:.88rem;color:var(--text-primary);margin-bottom:.25rem} -.ext-step-body p{font-size:.82rem;color:var(--text-secondary);margin:0;line-height:1.55} -.ext-step-body code{background:var(--bg-secondary);border:1px solid var(--border);border-radius:4px;padding:.1rem .4rem;font-family:'Courier New',monospace;font-size:.8rem;color:var(--blue-bright)} -.ext-note{background:var(--bg-secondary);border:1px solid var(--border);border-left:3px solid var(--dragon);border-radius:8px;padding:1rem 1.1rem;font-size:.82rem;color:var(--text-secondary);line-height:1.6} - -/* FORMS */ -.form-group{margin-bottom:1rem} -.form-label{display:block;font-size:.72rem;font-weight:700;color:var(--text-secondary);margin-bottom:.38rem;text-transform:uppercase;letter-spacing:.06em} -.form-input{width:100%;padding:.62rem .88rem;font-family:'Outfit',sans-serif;font-size:.86rem;background:var(--bg-secondary);border:1px solid var(--border);border-radius:8px;color:var(--text-primary);outline:none;transition:all .2s} -.form-input:focus{border-color:var(--blue);box-shadow:0 0 0 3px rgba(30,75,216,.12)} -.form-input::placeholder{color:var(--text-dim)} -.form-input[type="password"]{letter-spacing:.1em} -.form-hint{font-size:.68rem;color:var(--text-dim);margin-top:.28rem} -.form-row{display:grid;grid-template-columns:1fr 1fr;gap:.75rem} -.btn-row{display:flex;gap:.75rem;margin-top:1.2rem;flex-wrap:wrap} -.btn-primary{padding:.62rem 1.4rem;font-family:'Outfit',sans-serif;font-size:.84rem;font-weight:700;color:#fff;background:linear-gradient(135deg,var(--blue),var(--blue-bright));border:none;border-radius:9px;cursor:pointer;transition:all .2s} -.btn-primary:hover{transform:translateY(-1px);box-shadow:0 4px 16px rgba(30,75,216,.35)} -.btn-primary:disabled{opacity:.4;cursor:not-allowed;transform:none} -.btn-secondary{padding:.62rem 1.4rem;font-family:'Outfit',sans-serif;font-size:.84rem;font-weight:600;background:var(--bg-secondary);border:1px solid var(--border);border-radius:9px;color:var(--text-secondary);cursor:pointer;transition:all .2s} -.btn-secondary:hover{border-color:var(--border-bright);color:var(--text-primary)} -.btn-danger{padding:.62rem 1.4rem;font-family:'Outfit',sans-serif;font-size:.84rem;font-weight:600;background:transparent;border:1px solid var(--error);border-radius:9px;color:var(--error);cursor:pointer;transition:all .2s} -.btn-danger:hover{background:var(--error-bg)} - -/* STATUS */ -.status-msg{padding:.65rem .95rem;border-radius:8px;font-size:.8rem;font-weight:600;margin-top:.75rem;display:none} -.status-msg.success{background:var(--success-bg);color:var(--success);border:1px solid rgba(34,197,94,.2);display:block} -.status-msg.error{background:var(--error-bg);color:var(--error);border:1px solid rgba(239,68,68,.2);display:block} -.status-msg.loading{background:var(--accent-glow);color:var(--blue-bright);border:1px solid rgba(30,75,216,.2);display:block} - -/* USER TABLE */ -.user-table{width:100%;border-collapse:collapse} -.user-table th{text-align:left;font-size:.68rem;font-weight:700;text-transform:uppercase;letter-spacing:.09em;color:var(--text-dim);padding:.48rem .72rem;border-bottom:1px solid var(--border)} -.user-table td{padding:.62rem .72rem;font-size:.8rem;border-bottom:1px solid var(--border);vertical-align:middle} -.user-table tr:hover td{background:var(--bg-card-hover)} -.role-badge{display:inline-flex;padding:.18rem .52rem;border-radius:5px;font-size:.66rem;font-weight:700;text-transform:uppercase} -.role-badge.admin{background:var(--dragon-glow);color:var(--dragon-bright)} -.role-badge.user{background:var(--accent-glow);color:var(--blue-bright)} - -/* RELAY STATUS */ -.relay-status-indicator{display:flex;align-items:center;gap:.5rem;padding:.48rem .85rem;border-radius:8px;border:1px solid var(--border);background:var(--bg-card);font-size:.78rem;font-weight:600;margin-bottom:1rem} -.relay-dot{width:9px;height:9px;border-radius:50%;flex-shrink:0} -.relay-dot.green{background:var(--success);box-shadow:0 0 6px var(--success)} -.relay-dot.red{background:var(--error)} -.relay-dot.grey{background:var(--text-dim)} - -/* TOASTS */ -.toast-container{position:fixed;bottom:1.5rem;right:1.5rem;z-index:9999;display:flex;flex-direction:column;gap:.45rem;pointer-events:none} -.toast{padding:.7rem 1.15rem;border-radius:10px;font-size:.8rem;font-weight:600;border:1px solid;backdrop-filter:blur(12px);opacity:0;transform:translateY(8px);transition:all .25s;pointer-events:none;max-width:300px} -.toast.show{opacity:1;transform:translateY(0)} -.toast.success{background:rgba(34,197,94,.1);border-color:rgba(34,197,94,.25);color:var(--success)} -.toast.error{background:rgba(239,68,68,.1);border-color:rgba(239,68,68,.25);color:var(--error)} -.toast.info{background:rgba(30,75,216,.1);border-color:rgba(30,75,216,.25);color:var(--blue-bright)} -.dl-item{display:flex;align-items:center;gap:8px;padding:8px 10px;color:var(--text-primary);text-decoration:none;border-radius:6px;font-size:.85rem;font-weight:600;white-space:nowrap}.dl-item:hover{background:var(--bg-hover)}.dl-item span{margin-left:auto;color:var(--text-dim);font-size:.75rem} - - - - - -
-
-
-
-
-
-