diff --git a/public/css/style.css b/public/css/style.css index f3f5329..b5f5ad2 100644 --- a/public/css/style.css +++ b/public/css/style.css @@ -1,168 +1,332 @@ +/* ===== Modern MC Report System ===== */ +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap'); + :root { - --p: #4f46e5; --ph: #4338ca; --pl: #eef2ff; - --s: #10b981; --w: #f59e0b; --d: #ef4444; --i: #3b82f6; - --g50: #f9fafb; --g100: #f3f4f6; --g200: #e5e7eb; --g300: #d1d5db; - --g400: #9ca3af; --g500: #6b7280; --g600: #4b5563; --g700: #374151; - --g800: #1f2937; --g900: #111827; - --sw: 240px; --r: 8px; --sh: 0 1px 3px rgba(0,0,0,.1); + --p: #6366f1; --pd: #4f46e5; --pl: #eef2ff; --pg: linear-gradient(135deg,#6366f1,#8b5cf6); + --s: #10b981; --sd: #059669; --sg: linear-gradient(135deg,#10b981,#34d399); + --w: #f59e0b; --wd: #d97706; --wg: linear-gradient(135deg,#f59e0b,#fbbf24); + --d: #ef4444; --dd: #dc2626; --dg: linear-gradient(135deg,#ef4444,#f87171); + --i: #3b82f6; --id: #2563eb; --ig: linear-gradient(135deg,#3b82f6,#60a5fa); + --g0: #ffffff; --g1: #f8fafc; --g2: #f1f5f9; --g3: #e2e8f0; --g4: #cbd5e1; + --g5: #94a3b8; --g6: #64748b; --g7: #475569; --g8: #334155; --g9: #1e293b; --g10: #0f172a; + --sw: 250px; --r: 10px; --rl: 14px; --rr: 9999px; + --sh-sm: 0 1px 2px rgba(0,0,0,.05); + --sh: 0 1px 3px rgba(0,0,0,.08),0 2px 8px rgba(0,0,0,.04); + --sh-md: 0 4px 6px rgba(0,0,0,.06),0 8px 24px rgba(0,0,0,.04); + --sh-lg: 0 10px 30px rgba(0,0,0,.08),0 20px 60px rgba(0,0,0,.04); + --sh-xl: 0 20px 60px rgba(0,0,0,.12); } + *{margin:0;padding:0;box-sizing:border-box} -body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Noto Sans SC',sans-serif;background:var(--g50);color:var(--g800);line-height:1.6;min-height:100vh} +body{ + font-family:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI','Noto Sans SC',sans-serif; + background:var(--g1);color:var(--g8);line-height:1.6;min-height:100vh; + -webkit-font-smoothing:antialiased; +} .hidden{display:none!important} -#app{min-height:100vh} -#public-page{min-height:100vh;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#1e1b4b 0%,#312e81 40%,#4c1d95 100%);padding:20px} -.pub-card{background:white;border-radius:16px;padding:36px 32px;width:440px;max-width:90vw;box-shadow:0 20px 60px rgba(0,0,0,.35)} -.pub-card .logo{text-align:center;margin-bottom:28px} -.pub-card .logo i{font-size:44px;color:var(--p)} -.pub-card .logo h2{margin-top:10px;font-size:20px;color:var(--g800)} -.pub-card .logo p{color:var(--g500);font-size:13px;margin-top:2px} -.pub-card.wide{width:620px} +/* ===== Top Bar ===== */ +#top-bar{ + background:rgba(15,23,42,.95);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px); + color:white;position:sticky;top:0;z-index:200;border-bottom:1px solid rgba(255,255,255,.08); +} +.top-bar-inner{max-width:1280px;margin:0 auto;display:flex;align-items:center;justify-content:space-between;padding:0 28px;height:52px} +.top-logo{color:white;text-decoration:none;font-size:17px;font-weight:700;display:flex;align-items:center;gap:10px;letter-spacing:-.5px} +.top-logo i{font-size:22px;background:var(--pg);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text} +#top-auth{display:flex;gap:10px;align-items:center} -.form-group{margin-bottom:14px} -.form-group label{display:block;font-size:13px;font-weight:600;color:var(--g700);margin-bottom:4px} -.form-group input,.form-group select,.form-group textarea{width:100%;padding:9px 12px;border:1px solid var(--g300);border-radius:var(--r);font-size:14px;transition:.2s;background:white;color:var(--g800)} +/* ===== Public Pages ===== */ +#public-page{ + min-height:100vh;display:flex;align-items:center;justify-content:center; + background:linear-gradient(135deg,#0f172a 0%,#1e1b4b 35%,#312e81 70%,#4c1d95 100%); + position:relative;overflow:hidden; +} +#public-page::before{ + content:'';position:absolute;top:-50%;left:-50%;width:200%;height:200%; + background:radial-gradient(circle at 20% 50%,rgba(99,102,241,.15) 0%,transparent 40%), + radial-gradient(circle at 80% 20%,rgba(139,92,246,.1) 0%,transparent 40%), + radial-gradient(circle at 40% 80%,rgba(16,185,129,.08) 0%,transparent 40%); + pointer-events:none; +} +.pub-card{ + background:rgba(255,255,255,.97);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px); + border-radius:20px;padding:44px 40px;width:460px;max-width:92vw; + box-shadow:0 24px 80px rgba(0,0,0,.3),0 0 0 1px rgba(255,255,255,.1); + position:relative;z-index:1; +} +.pub-card .logo{text-align:center;margin-bottom:32px} +.pub-card .logo i{font-size:48px;background:var(--pg);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text} +.pub-card .logo h2{margin-top:12px;font-size:24px;font-weight:800;color:var(--g9);letter-spacing:-1px} +.pub-card .logo p{color:var(--g5);font-size:14px;margin-top:4px} +.pub-card.wide{width:580px} + +/* ===== Forms ===== */ +.form-group{margin-bottom:16px} +.form-group label{display:block;font-size:12.5px;font-weight:600;color:var(--g7);margin-bottom:5px;letter-spacing:.3px;text-transform:uppercase} +.form-group input,.form-group select,.form-group textarea{ + width:100%;padding:11px 14px;border:1.5px solid var(--g3);border-radius:var(--r); + font-size:14px;transition:all .2s;background:var(--g1);color:var(--g9);font-family:inherit; +} +.form-group input:focus,.form-group select:focus,.form-group textarea:focus{ + outline:none;border-color:var(--p);box-shadow:0 0 0 4px rgba(99,102,241,.1);background:white; +} .form-group textarea{min-height:80px;resize:vertical} -.form-group input:focus,.form-group select:focus,.form-group textarea:focus{outline:none;border-color:var(--p);box-shadow:0 0 0 3px rgba(79,70,229,.1)} -.form-group .help{font-size:11px;color:var(--g400);margin-top:2px} +.form-group .help{font-size:11px;color:var(--g5);margin-top:3px} -.btn{display:inline-flex;align-items:center;gap:6px;padding:9px 18px;border:none;border-radius:var(--r);font-size:14px;font-weight:500;cursor:pointer;transition:.2s;white-space:nowrap;text-decoration:none} -.btn:disabled{opacity:.5;cursor:not-allowed} -.btn-p{background:var(--p);color:white} -.btn-p:hover:not(:disabled){background:var(--ph)} -.btn-s{background:var(--s);color:white}.btn-s:hover:not(:disabled){background:#059669} -.btn-w{background:var(--w);color:white}.btn-w:hover:not(:disabled){background:#d97706} -.btn-d{background:var(--d);color:white}.btn-d:hover:not(:disabled){background:#dc2626} -.btn-i{background:var(--i);color:white}.btn-i:hover:not(:disabled){background:#2563eb} -.btn-o{background:transparent;border:1px solid var(--g300);color:var(--g700)} -.btn-o:hover:not(:disabled){background:var(--g100)} -.btn-sm{padding:5px 10px;font-size:12px}.btn-lg{padding:11px 22px;font-size:15px} +/* ===== Buttons ===== */ +.btn{ + display:inline-flex;align-items:center;gap:7px;padding:10px 20px; + border:none;border-radius:var(--r);font-size:14px;font-weight:600; + cursor:pointer;transition:all .2s;white-space:nowrap;text-decoration:none;font-family:inherit; +} +.btn:disabled{opacity:.45;cursor:not-allowed;pointer-events:none} +.btn-p{background:var(--pg);color:white;box-shadow:0 2px 8px rgba(99,102,241,.3)} +.btn-p:hover:not(:disabled){box-shadow:0 4px 16px rgba(99,102,241,.4);transform:translateY(-1px)} +.btn-s{background:var(--sg);color:white;box-shadow:0 2px 8px rgba(16,185,129,.3)} +.btn-s:hover:not(:disabled){box-shadow:0 4px 16px rgba(16,185,129,.4);transform:translateY(-1px)} +.btn-w{background:var(--wg);color:white;box-shadow:0 2px 8px rgba(245,158,11,.3)} +.btn-w:hover:not(:disabled){box-shadow:0 4px 16px rgba(245,158,11,.4);transform:translateY(-1px)} +.btn-d{background:var(--dg);color:white;box-shadow:0 2px 8px rgba(239,68,68,.3)} +.btn-d:hover:not(:disabled){box-shadow:0 4px 16px rgba(239,68,68,.4);transform:translateY(-1px)} +.btn-i{background:var(--ig);color:white;box-shadow:0 2px 8px rgba(59,130,246,.3)} +.btn-i:hover:not(:disabled){box-shadow:0 4px 16px rgba(59,130,246,.4);transform:translateY(-1px)} +.btn-o{background:transparent;border:1.5px solid var(--g3);color:var(--g7)} +.btn-o:hover:not(:disabled){background:var(--g2);border-color:var(--g4)} +.btn-sm{padding:6px 13px;font-size:12.5px}.btn-lg{padding:12px 26px;font-size:15px} .w-full{width:100%;justify-content:center} +/* ===== Layout ===== */ #main-layout{display:flex;min-height:100vh} -#sidebar{width:var(--sw);background:var(--g900);color:white;display:flex;flex-direction:column;position:fixed;top:0;left:0;bottom:0;z-index:100} -.sidebar-header{padding:14px 18px;font-size:15px;font-weight:700;display:flex;align-items:center;gap:8px;border-bottom:1px solid var(--g700)} -.sidebar-header i{font-size:22px;color:var(--p)} -#sidebar-nav{flex:1;padding:8px 0;overflow-y:auto} -.nav-item{display:flex;align-items:center;gap:10px;padding:10px 18px;color:var(--g400);cursor:pointer;transition:.2s;font-size:13px;border-left:3px solid transparent} -.nav-item:hover{color:white;background:rgba(255,255,255,.05)} -.nav-item.active{color:white;background:rgba(79,70,229,.15);border-left-color:var(--p)} -.nav-item i{width:18px;text-align:center} -.sidebar-footer{padding:12px 14px;border-top:1px solid var(--g700)} -.user-info{display:flex;align-items:center;gap:8px;padding:6px 4px;margin-bottom:8px} -.user-info .av{width:32px;height:32px;border-radius:50%;background:var(--p);display:flex;align-items:center;justify-content:center;font-size:13px;font-weight:600;flex-shrink:0} +#sidebar{ + width:var(--sw);background:linear-gradient(180deg,#0f172a 0%,#1e293b 100%); + color:white;display:flex;flex-direction:column;position:fixed;top:0;left:0;bottom:0; + z-index:100;border-right:1px solid rgba(255,255,255,.06); +} +.sidebar-header{ + padding:18px 22px;font-size:16px;font-weight:700;display:flex;align-items:center; + gap:10px;border-bottom:1px solid rgba(255,255,255,.08);letter-spacing:-.5px; +} +.sidebar-header i{font-size:24px;background:var(--pg);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text} +#sidebar-nav{flex:1;padding:10px 0;overflow-y:auto} +.nav-item{ + display:flex;align-items:center;gap:11px;padding:11px 22px;color:var(--g5); + cursor:pointer;transition:all .15s;font-size:13.5px;font-weight:500; + border-left:3px solid transparent;margin:1px 0; +} +.nav-item:hover{color:white;background:rgba(255,255,255,.04)} +.nav-item.active{color:white;background:rgba(99,102,241,.12);border-left-color:var(--p);font-weight:600} +.nav-item i{width:20px;text-align:center;font-size:15px} +.sidebar-footer{padding:14px 16px;border-top:1px solid rgba(255,255,255,.08)} +.user-info{display:flex;align-items:center;gap:10px;padding:8px 4px;margin-bottom:10px} +.user-info .av{ + width:36px;height:36px;border-radius:var(--r);background:var(--pg); + display:flex;align-items:center;justify-content:center;font-size:14px;font-weight:700;flex-shrink:0; +} .user-info .dt{flex:1;min-width:0} .user-info .dt .nm{font-size:13px;font-weight:600;color:white} -.user-info .dt .rl{font-size:11px;color:var(--g400)} +.user-info .dt .rl{font-size:11px;color:var(--g5)} -#main-content{flex:1;margin-left:var(--sw)} -#page-header{display:flex;align-items:center;justify-content:space-between;padding:14px 22px;background:white;border-bottom:1px solid var(--g200);position:sticky;top:0;z-index:50} -#page-title{font-size:18px;font-weight:700} -#page-actions{display:flex;gap:8px;align-items:center} -#page-content{padding:20px 22px} +#main-content{flex:1;margin-left:var(--sw);background:var(--g1);min-height:100vh} +#page-header{ + display:flex;align-items:center;justify-content:space-between; + padding:18px 32px;background:rgba(255,255,255,.9);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px); + border-bottom:1px solid var(--g2);position:sticky;top:0;z-index:50; +} +#page-title{font-size:22px;font-weight:800;color:var(--g9);letter-spacing:-.5px} +#page-actions{display:flex;gap:10px;align-items:center} +#page-content{padding:28px 32px} -.card{background:white;border-radius:var(--r);box-shadow:var(--sh);margin-bottom:16px} -.card-h{padding:12px 18px;border-bottom:1px solid var(--g200);font-size:14px;font-weight:600;display:flex;align-items:center;justify-content:space-between} -.card-b{padding:16px 18px} -.card-f{padding:10px 18px;border-top:1px solid var(--g200);font-size:12px;color:var(--g500)} +/* ===== Cards ===== */ +.card{ + background:white;border-radius:var(--rl);box-shadow:var(--sh); + margin-bottom:20px;border:1px solid var(--g2);overflow:hidden;transition:box-shadow .2s; +} +.card:hover{box-shadow:var(--sh-md)} +.card-h{ + padding:15px 22px;border-bottom:1px solid var(--g2);font-size:14px;font-weight:700; + display:flex;align-items:center;justify-content:space-between;color:var(--g8); +} +.card-b{padding:20px 22px} +.card-f{padding:12px 22px;border-top:1px solid var(--g2);font-size:12px;color:var(--g5)} -.stats-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:14px;margin-bottom:20px} -.stat-card{background:white;border-radius:var(--r);padding:18px;box-shadow:var(--sh);display:flex;align-items:center;gap:14px} -.stat-card .si{width:44px;height:44px;border-radius:10px;display:flex;align-items:center;justify-content:center;font-size:18px;flex-shrink:0} -.stat-card .sv{font-size:26px;font-weight:700;line-height:1.2} -.stat-card .sl{font-size:12px;color:var(--g500)} +/* ===== Stats ===== */ +.stats-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:18px;margin-bottom:24px} +.stat-card{ + background:white;border-radius:var(--rl);padding:22px;box-shadow:var(--sh); + display:flex;align-items:center;gap:18px;border:1px solid var(--g2); + transition:transform .2s,box-shadow .2s; +} +.stat-card:hover{transform:translateY(-2px);box-shadow:var(--sh-md)} +.stat-card .si{ + width:52px;height:52px;border-radius:14px;display:flex;align-items:center;justify-content:center; + font-size:20px;flex-shrink:0; +} +.stat-card .sv{font-size:30px;font-weight:800;line-height:1.1;color:var(--g9);letter-spacing:-1px} +.stat-card .sl{font-size:12.5px;color:var(--g5);margin-top:2px;font-weight:500} +/* ===== Table ===== */ .table-wrap{overflow-x:auto} -table{width:100%;border-collapse:collapse;font-size:13px} -thead th{background:var(--g50);padding:9px 12px;text-align:left;font-weight:600;font-size:11px;text-transform:uppercase;color:var(--g500);border-bottom:2px solid var(--g200);white-space:nowrap} -tbody td{padding:9px 12px;border-bottom:1px solid var(--g100);vertical-align:middle} -tbody tr:hover{background:var(--g50)} +table{width:100%;border-collapse:collapse;font-size:13.5px} +thead th{ + background:var(--g1);padding:11px 16px;text-align:left;font-weight:600;font-size:11px; + text-transform:uppercase;color:var(--g5);border-bottom:2px solid var(--g2); + white-space:nowrap;letter-spacing:.5px; +} +tbody td{padding:12px 16px;border-bottom:1px solid var(--g2);vertical-align:middle} +tbody tr{transition:background .15s} +tbody tr:hover{background:var(--g1)} +tbody tr:last-child td{border-bottom:none} -.badge{display:inline-block;padding:2px 9px;border-radius:20px;font-size:11px;font-weight:600;white-space:nowrap} -.bg-pending{background:#fef3c7;color:#92400e}.bg-processing{background:#ede9fe;color:#5b21b6} -.bg-resolved{background:#d1fae5;color:#065f46}.bg-rejected{background:#fee2e2;color:#991b1b} -.bg-closed{background:var(--g200);color:var(--g700)}.bg-report{background:#fce7f3;color:#9d174d} -.bg-suggestion{background:#dbeafe;color:#1e40af}.bg-low{background:#d1fae5;color:#065f46} -.bg-medium{background:#fef3c7;color:#92400e}.bg-high{background:#fee2e2;color:#991b1b} +/* ===== Badges ===== */ +.badge{display:inline-block;padding:3px 11px;border-radius:var(--rr);font-size:11.5px;font-weight:600;white-space:nowrap;letter-spacing:.2px} +.bg-pending{background:#fef9c3;color:#854d0e} +.bg-processing{background:#ede9fe;color:#6d28d9} +.bg-awaiting_info{background:#fed7aa;color:#9a3412} +.bg-resolved{background:#d1fae5;color:#065f46} +.bg-rejected{background:#fee2e2;color:#991b1b} +.bg-closed{background:var(--g2);color:var(--g7)} +.bg-report{background:#fce7f3;color:#9d174d} +.bg-suggestion{background:#dbeafe;color:#1e40af} +.bg-appeal{background:#fef3c7;color:#92400e} +.bg-low{background:#e0f2fe;color:#0369a1} +.bg-medium{background:#fef9c3;color:#854d0e} +.bg-high{background:#fee2e2;color:#991b1b} .bg-urgent{background:#fecaca;color:#7f1d1d} -.bg-owner{background:#ef4444;color:white}.bg-admin{background:#3b82f6;color:white} -.bg-player{background:var(--g300);color:var(--g700)} +.bg-owner{background:var(--dg);color:white} +.bg-admin{background:var(--ig);color:white} +.bg-player{background:var(--g3);color:var(--g7)} -.filter-bar{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:14px} -.filter-bar select,.filter-bar input{padding:7px 10px;border:1px solid var(--g300);border-radius:var(--r);font-size:13px;background:white} -.filter-bar input{min-width:180px} +/* ===== Filters ===== */ +.filter-bar{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-bottom:18px} +.filter-bar select,.filter-bar input{ + padding:9px 14px;border:1.5px solid var(--g3);border-radius:var(--r); + font-size:13px;background:white;color:var(--g8);transition:border-color .2s;font-family:inherit; +} +.filter-bar select:focus,.filter-bar input:focus{outline:none;border-color:var(--p)} +.filter-bar input{min-width:200px} -#modal-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.5);display:flex;align-items:center;justify-content:center;z-index:1000;padding:20px} -.modal-box{background:white;border-radius:12px;width:600px;max-width:100%;max-height:85vh;display:flex;flex-direction:column;box-shadow:0 8px 30px rgba(0,0,0,.2)} -.modal-h{display:flex;align-items:center;justify-content:space-between;padding:14px 18px;border-bottom:1px solid var(--g200)} -.modal-h h3{font-size:15px;font-weight:600} -.modal-h button{background:none;border:none;font-size:22px;cursor:pointer;color:var(--g500);line-height:1} -.modal-h button:hover{color:var(--g800)} -.modal-b{padding:18px;overflow-y:auto;flex:1} -.modal-f{display:flex;gap:8px;justify-content:flex-end;padding:12px 18px;border-top:1px solid var(--g200)} +/* ===== Modal ===== */ +#modal-overlay{ + position:fixed;top:0;left:0;right:0;bottom:0; + background:rgba(15,23,42,.6);backdrop-filter:blur(4px); + display:flex;align-items:center;justify-content:center;z-index:1000;padding:24px; +} +#modal-overlay.hidden{display:none} +.modal-box{ + background:white;border-radius:16px;width:620px;max-width:100%;max-height:82vh; + display:flex;flex-direction:column;box-shadow:var(--sh-xl);animation:modalIn .2s ease-out; +} +@keyframes modalIn{from{opacity:0;transform:scale(.96) translateY(10px)}to{opacity:1;transform:scale(1) translateY(0)}} +.modal-h{ + display:flex;align-items:center;justify-content:space-between; + padding:18px 24px;border-bottom:1px solid var(--g2); +} +.modal-h h3{font-size:16px;font-weight:700;color:var(--g9)} +.modal-h button{background:none;border:none;font-size:24px;cursor:pointer;color:var(--g5);padding:0 4px;line-height:1;transition:color .15s} +.modal-h button:hover{color:var(--g8)} +.modal-b{padding:24px;overflow-y:auto;flex:1} +.modal-f{display:flex;gap:10px;justify-content:flex-end;padding:14px 24px;border-top:1px solid var(--g2)} -.detail-grid{display:grid;grid-template-columns:2fr 1fr;gap:18px} -.detail-section{margin-bottom:18px} -.detail-section h4{font-size:13px;font-weight:600;color:var(--g700);margin-bottom:8px;padding-bottom:6px;border-bottom:1px solid var(--g200)} -.detail-row{display:flex;padding:5px 0;font-size:13px} -.detail-row .lbl{width:90px;color:var(--g500);flex-shrink:0} -.detail-row .val{flex:1} +/* ===== Detail ===== */ +.detail-grid{display:grid;grid-template-columns:2fr 1fr;gap:22px} +.detail-section{margin-bottom:20px} +.detail-section h4{ + font-size:12px;font-weight:700;color:var(--g7);margin-bottom:10px;padding-bottom:8px; + border-bottom:1px solid var(--g2);text-transform:uppercase;letter-spacing:.5px; +} +.detail-row{display:flex;padding:6px 0;font-size:13.5px} +.detail-row .lbl{width:100px;color:var(--g5);flex-shrink:0;font-weight:500} +.detail-row .val{flex:1;color:var(--g8)} -.timeline{position:relative;padding-left:22px} -.timeline::before{content:'';position:absolute;left:7px;top:0;bottom:0;width:2px;background:var(--g200)} -.timeline-item{position:relative;margin-bottom:14px} -.timeline-item::before{content:'';position:absolute;left:-19px;top:18px;width:10px;height:10px;border-radius:50%;background:var(--p);border:2px solid white;box-shadow:var(--sh)} -.timeline-item .th{display:flex;align-items:center;gap:6px;margin-bottom:2px;font-size:11px;color:var(--g500)} -.timeline-item .th .tn{font-weight:600;color:var(--g700)} -.timeline-item .tc{background:var(--g50);padding:9px 12px;border-radius:var(--r);font-size:13px;line-height:1.6;white-space:pre-wrap} -.timeline-item.staff .tc{background:var(--pl)} +/* ===== Timeline ===== */ +.timeline{position:relative;padding-left:26px} +.timeline::before{content:'';position:absolute;left:9px;top:0;bottom:0;width:2px;background:var(--g3);border-radius:1px} +.timeline-item{position:relative;margin-bottom:16px} +.timeline-item::before{ + content:'';position:absolute;left:-22px;top:20px; + width:11px;height:11px;border-radius:50%; + background:var(--p);border:3px solid white;box-shadow:0 0 0 2px var(--pl); +} +.timeline-item .th{display:flex;align-items:center;gap:8px;margin-bottom:4px;font-size:12px;color:var(--g5)} +.timeline-item .th .tn{font-weight:600;color:var(--g7)} +.timeline-item .tc{ + background:var(--g1);padding:12px 16px;border-radius:var(--r); + font-size:13.5px;line-height:1.7;white-space:pre-wrap;border:1px solid var(--g2); +} +.timeline-item.staff .tc{background:var(--pl);border-color:rgba(99,102,241,.2)} -.empty{text-align:center;padding:50px 20px;color:var(--g500)} -.empty i{font-size:40px;margin-bottom:10px;color:var(--g300)} +/* ===== Empty / Loading / Alert ===== */ +.empty{text-align:center;padding:60px 24px;color:var(--g5)} +.empty i{font-size:44px;margin-bottom:12px;color:var(--g3)} +.empty p{font-size:14px} +.alert{padding:12px 18px;border-radius:var(--r);font-size:13.5px;margin-bottom:14px;border:1px solid transparent} +.alert-s{background:#d1fae5;color:#065f46;border-color:#a7f3d0} +.alert-e{background:#fee2e2;color:#991b1b;border-color:#fecaca} +.alert-i{background:#dbeafe;color:#1e40af;border-color:#bfdbfe} +.loading{text-align:center;padding:48px;color:var(--g5)} +.loading i{font-size:32px;animation:spin 1s linear infinite} +@keyframes spin{to{transform:rotate(360deg)}} -.alert{padding:10px 14px;border-radius:var(--r);font-size:13px;margin-bottom:12px} -.alert-s{background:#d1fae5;color:#065f46;border:1px solid #a7f3d0} -.alert-e{background:#fee2e2;color:#991b1b;border:1px solid #fecaca} -.alert-i{background:#dbeafe;color:#1e40af;border:1px solid #bfdbfe} - -.loading{text-align:center;padding:40px;color:var(--g500)} -.loading i{font-size:28px;animation:spin 1s linear infinite} -@keyframes spin{from{transform:rotate(0deg)}to{transform:rotate(360deg)}} - -.grid-2{display:grid;grid-template-columns:1fr 1fr;gap:14px} -.grid-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:14px} +/* ===== Utilities ===== */ +.grid-2{display:grid;grid-template-columns:1fr 1fr;gap:16px} +.grid-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:16px} .mt-2{margin-top:8px}.mt-4{margin-top:16px}.mb-4{margin-bottom:16px} .flex{display:flex}.g2{gap:8px}.g4{gap:16px}.aic{align-items:center}.jcb{justify-content:space-between} -.ts{font-size:12px}.tm{color:var(--g500)}.fb{font-weight:700}.tc{text-align:center}.tr{text-align:right} +.ts{font-size:12px}.tm{color:var(--g5)}.fb{font-weight:700}.tc{text-align:center}.tr{text-align:right} -.file-upload{border:2px dashed var(--g300);border-radius:var(--r);padding:24px;text-align:center;cursor:pointer;transition:.2s} +/* ===== File Upload ===== */ +.file-upload{ + border:2px dashed var(--g3);border-radius:var(--r);padding:32px;text-align:center; + cursor:pointer;transition:all .2s;background:var(--g1); +} .file-upload:hover{border-color:var(--p);background:var(--pl)} -.file-upload i{font-size:28px;color:var(--g400);margin-bottom:6px} -.file-upload p{font-size:13px;color:var(--g500)} -.file-list{display:flex;flex-wrap:wrap;gap:8px;margin-top:8px} -.file-item{display:flex;align-items:center;gap:6px;background:var(--g100);padding:4px 10px;border-radius:var(--r);font-size:12px} -.file-item button{background:none;border:none;color:var(--d);cursor:pointer;font-size:14px} +.file-upload i{font-size:32px;color:var(--g4);margin-bottom:8px} +.file-upload p{font-size:14px;color:var(--g5)} +.file-list{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px} +.file-item{ + display:flex;align-items:center;gap:8px;background:var(--g1); + padding:6px 12px;border-radius:var(--r);font-size:12.5px;border:1px solid var(--g2); +} +.file-item button{background:none;border:none;color:var(--d);cursor:pointer;font-size:15px;padding:2px} -.tab-nav{display:flex;gap:0;border-bottom:1px solid var(--g200);margin-bottom:14px} -.tab-nav button{padding:8px 18px;border:none;background:none;font-size:13px;font-weight:500;color:var(--g500);cursor:pointer;border-bottom:2px solid transparent;transition:.2s} -.tab-nav button:hover{color:var(--g700)} +/* ===== Tab Nav ===== */ +.tab-nav{display:flex;gap:0;border-bottom:2px solid var(--g2);margin-bottom:18px} +.tab-nav button{ + padding:10px 22px;border:none;background:none;font-size:13.5px;font-weight:600; + color:var(--g5);cursor:pointer;border-bottom:3px solid transparent;transition:all .2s; + margin-bottom:-2px;font-family:inherit; +} +.tab-nav button:hover{color:var(--g7)} .tab-nav button.active{color:var(--p);border-bottom-color:var(--p)} +/* ===== Footer ===== */ +#page-footer{background:var(--g10);color:var(--g5);padding:18px 28px;font-size:13px;text-align:center} +.footer-inner{max-width:1280px;margin:0 auto;display:flex;justify-content:center;gap:28px;flex-wrap:wrap} +.footer-inner a{color:var(--g4);text-decoration:none;transition:color .2s} +.footer-inner a:hover{color:white} +#app{min-height:calc(100vh - 52px);display:flex;flex-direction:column} +#public-page,#main-layout{flex:1} + +/* ===== Install Page ===== */ +#install-steps .card{max-width:640px;margin:0 auto 20px} + +/* ===== Responsive ===== */ @media(max-width:768px){ #sidebar{width:60px;overflow:hidden} #sidebar .sidebar-header span,#sidebar .nav-item span,#sidebar .user-info .dt{display:none} - .sidebar-header{padding:14px 12px;justify-content:center} - .nav-item{padding:10px 12px;justify-content:center} + .sidebar-header{padding:18px 12px;justify-content:center} + .nav-item{padding:11px 12px;justify-content:center} #main-content{margin-left:60px} + #page-content{padding:20px 16px} + #page-header{padding:16px 20px} .detail-grid{grid-template-columns:1fr} .grid-2,.grid-3{grid-template-columns:1fr} + .pub-card{padding:32px 24px} + .top-bar-inner{padding:0 16px} } -#top-bar{background:var(--g900);color:white;position:sticky;top:0;z-index:200} -.top-bar-inner{max-width:1200px;margin:0 auto;display:flex;align-items:center;justify-content:space-between;padding:0 20px;height:48px} -.top-logo{color:white;text-decoration:none;font-size:16px;font-weight:700;display:flex;align-items:center;gap:8px} -.top-logo i{font-size:20px;color:var(--p)} -#top-auth{display:flex;gap:8px} -#page-footer{background:var(--g900);color:var(--g400);padding:16px 20px;font-size:13px;text-align:center} -.footer-inner{max-width:1200px;margin:0 auto;display:flex;justify-content:center;gap:24px;flex-wrap:wrap} -#app{min-height:calc(100vh - 48px);display:flex;flex-direction:column} -#public-page,#main-layout{flex:1} + +/* ===== Scrollbar ===== */ +::-webkit-scrollbar{width:6px} +::-webkit-scrollbar-track{background:transparent} +::-webkit-scrollbar-thumb{background:var(--g4);border-radius:3px} +::-webkit-scrollbar-thumb:hover{background:var(--g5)} diff --git a/public/js/pages/login.js b/public/js/pages/login.js index b20f3de..9a4c654 100644 --- a/public/js/pages/login.js +++ b/public/js/pages/login.js @@ -1,21 +1,18 @@ const LoginPage = { render() { return ` -
- +
+
-
- 还没有账号?立即注册 - | - 匿名提交 -
-
- 演示: owner/admin123   admin/admin123   player1/player123 +
+ 还没有账号?立即注册 + | + 匿名提交
`; }, diff --git a/public/js/pages/register.js b/public/js/pages/register.js index 9d20dad..dd190b4 100644 --- a/public/js/pages/register.js +++ b/public/js/pages/register.js @@ -4,8 +4,8 @@ const RegisterPage = { async render() { try { this.captcha = await API.get('/captcha'); } catch { this.captcha = null; } return ` -
- +
+