:root{--bg:#f4f6fb;--bg-dark:#0d1222;--card:#fff;--border:#e5e8f2;--text:#1a2238;--text-soft:#5d6b8a;--primary:#4f46e5;--primary-soft:#eceefb;--danger:#ef4444;--ok:#22c55e;--shadow:0 6px 24px rgba(26,34,56,.08);--radius:14px}[data-theme=dark]{--bg:#0f1117;--bg-dark:#080a10;--card:#181b25;--border:#2a2e3a;--text:#e4e7ef;--text-soft:#8b90a0;--primary:#6d72f7;--primary-soft:#1e2048;--danger:#f87171;--ok:#4ade80;--shadow:0 6px 24px rgba(0,0,0,.35)}*{box-sizing:border-box}body,html{margin:0;padding:0;background:var(--bg);color:var(--text);font-family:Segoe UI,system-ui,-apple-system,sans-serif;min-height:100vh}button{cursor:pointer;border:none;background:none}button,input,select,textarea{font-family:inherit}a{color:var(--primary);text-decoration:none}.btn{display:inline-flex;align-items:center;gap:6px;padding:9px 16px;border-radius:10px;font-size:14px;font-weight:600;transition:all .18s ease;border:1px solid transparent}.btn-primary{background:var(--primary);color:#fff;box-shadow:0 4px 14px rgba(79,70,229,.35)}.btn-primary:hover{transform:translateY(-1px);box-shadow:0 6px 18px rgba(79,70,229,.45)}.btn-ghost{background:transparent;color:var(--text-soft);border-color:var(--border)}.btn-ghost:hover{background:var(--primary-soft);color:var(--primary)}.btn-danger{background:#fee2e2;color:var(--danger)}.btn-danger:hover{background:#fecaca}.btn-sm{padding:5px 10px;font-size:12px;border-radius:8px}.icon-btn{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:8px;color:var(--text-soft);transition:all .15s ease}.icon-btn:hover{background:var(--primary-soft);color:var(--primary)}.auth-wrap{min-height:100vh;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#1a1f3c,#312e81 50%,#4f46e5);padding:20px}.auth-card{background:var(--card);border-radius:22px;box-shadow:0 20px 60px rgba(0,0,0,.35);width:100%;max-width:430px;padding:40px;animation:authIn .5s ease both}@keyframes authIn{0%{opacity:0;transform:translateY(24px) scale(.98)}to{opacity:1;transform:none}}.auth-logo{display:flex;align-items:center;gap:10px;font-size:24px;font-weight:800;color:var(--text);margin-bottom:6px}.auth-logo .logo-mark{width:38px;height:38px;border-radius:11px;background:linear-gradient(135deg,var(--primary),#7c3aed);display:flex;align-items:center;justify-content:center;color:#fff;font-size:19px}.auth-sub{color:var(--text-soft);font-size:14px;margin-bottom:26px}.auth-form{display:flex;flex-direction:column;gap:14px}.auth-form label{font-size:13px;font-weight:600;color:var(--text-soft)}.auth-form input{padding:12px 14px;border:1.5px solid var(--border);border-radius:10px;font-size:14px;outline:none;transition:border-color .15s,box-shadow .15s}.auth-form input:focus{border-color:var(--primary);box-shadow:0 0 0 3px rgba(79,70,229,.15)}.auth-error{background:#fef2f2;color:#b91c1c;padding:10px 14px;border-radius:10px;font-size:13px;animation:shake .3s}@keyframes shake{0%,to{transform:none}30%{transform:translateX(-5px)}60%{transform:translateX(5px)}}.auth-foot{margin-top:18px;font-size:13px;color:var(--text-soft);text-align:center}.app-shell{display:flex;flex-direction:column;min-height:100vh}.topbar{gap:14px;padding:12px 22px;background:var(--card);border-bottom:1px solid var(--border);position:-webkit-sticky;position:sticky;top:0;z-index:40}.brand,.topbar{display:flex;align-items:center}.brand{gap:9px;font-weight:800;font-size:17px}.brand .logo-mark{width:30px;height:30px;border-radius:9px;font-size:14px}.logo-mark{background:linear-gradient(135deg,var(--primary),#7c3aed);display:flex;align-items:center;justify-content:center;color:#fff}.view-tabs{display:flex;gap:4px;margin-left:12px;flex-wrap:wrap}.view-tab{padding:7px 13px;border-radius:9px;font-size:13px;font-weight:600;color:var(--text-soft);transition:all .15s ease}.view-tab.active,.view-tab:hover{color:var(--primary)}.view-tab.active{background:var(--primary-soft)}.topbar-right{margin-left:auto;gap:10px}.topbar-right,.user-chip{display:flex;align-items:center}.user-chip{gap:9px;padding:5px 12px 5px 6px;background:var(--bg);border-radius:999px}.avatar{width:28px;height:28px;border-radius:50%;background:linear-gradient(135deg,#4f46e5,#06b6d4);color:#fff;font-size:12px;font-weight:700;display:flex;align-items:center;justify-content:center;flex-shrink:0}.user-chip .name{font-size:13px;font-weight:600}.app-body{display:flex;flex:1 1}.sidebar{width:290px;flex-shrink:0;background:var(--card);border-right:1px solid var(--border);padding:18px 14px;gap:16px;overflow-y:auto}.sidebar,.sidebar-section{display:flex;flex-direction:column}.sidebar-section{gap:8px}.sidebar-title{font-size:11px;text-transform:uppercase;letter-spacing:.08em;color:var(--text-soft);font-weight:700}.room-card{background:var(--bg);border-radius:var(--radius);padding:13px 14px;display:flex;flex-direction:column;gap:6px}.room-name{font-weight:700;font-size:15px}.room-meta{display:flex;gap:6px;align-items:center;flex-wrap:wrap}.code-chip{background:var(--primary-soft);color:var(--primary);font-weight:700;letter-spacing:.14em;padding:3px 10px;border-radius:8px;font-size:12px;cursor:pointer;transition:all .15s ease}.code-chip:hover{background:var(--primary);color:#fff}.room-members{display:flex}.room-members .avatar{border:2px solid #fff;margin-left:-8px}.room-members .avatar:first-child{margin-left:0}.member-count{font-size:11px;color:var(--text-soft)}.project-item{display:flex;align-items:center;gap:10px;padding:9px 11px;border-radius:11px;transition:all .15s ease;cursor:pointer;border:1px solid transparent}.project-item:hover{background:var(--bg)}.project-item.active{background:var(--primary-soft);border-color:var(--primary)}.project-dot{width:11px;height:11px;border-radius:4px;flex-shrink:0}.project-name{font-weight:600;font-size:13.5px;flex:1 1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.project-due{font-size:11px;color:var(--text-soft)}.project-progress{height:4px;background:var(--border);border-radius:4px;overflow:hidden}.project-progress>div{height:100%;background:var(--ok);border-radius:4px;transition:width .4s ease}.project-item-actions{display:none}.project-item:hover .project-item-actions{display:flex}.main-content{flex:1 1;padding:22px;overflow-x:auto}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;color:var(--text-soft);gap:10px;padding:60px 20px;text-align:center}.empty-state .big{font-size:44px}.view-anim{animation:viewIn .35s ease both}@keyframes viewIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}.modal-overlay{position:fixed;inset:0;background:rgba(13,18,34,.55);-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);display:flex;align-items:center;justify-content:center;z-index:100;padding:18px;animation:fadeIn .18s ease}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.modal{background:var(--card);border-radius:20px;padding:26px;width:100%;max-width:520px;max-height:88vh;overflow-y:auto;box-shadow:0 24px 70px rgba(0,0,0,.3);animation:modalIn .25s cubic-bezier(.3,1.4,.6,1) both}@keyframes modalIn{0%{opacity:0;transform:translateY(22px) scale(.97)}to{opacity:1;transform:none}}.modal-title{font-size:18px;font-weight:800;margin:0 0 16px}.modal form{display:flex;flex-direction:column;gap:12px}.modal label{font-size:12.5px;font-weight:700;color:var(--text-soft)}.modal input,.modal select,.modal textarea{padding:10px 12px;border:1.5px solid var(--border);border-radius:10px;font-size:14px;outline:none;transition:border-color .15s,box-shadow .15s;background:#fff}.modal input:focus,.modal select:focus,.modal textarea:focus{border-color:var(--primary);box-shadow:0 0 0 3px rgba(79,70,229,.13)}.modal textarea{resize:vertical;min-height:70px}.modal .row2{display:grid;grid-template-columns:1fr 1fr;grid-gap:12px;gap:12px}.modal-actions{display:flex;gap:9px;justify-content:flex-end;margin-top:8px}.modal-error{background:#fef2f2;color:#b91c1c;padding:9px 13px;border-radius:10px;font-size:13px}.color-pick{display:flex;gap:8px;flex-wrap:wrap}.color-pick button{width:26px;height:26px;border-radius:8px;border:2px solid transparent;transition:transform .12s}.color-pick button.sel{border-color:var(--text);transform:scale(1.12)}.kanban-board{display:flex;gap:14px;align-items:flex-start;min-height:70vh}.kanban-col{background:#eef1f9;border-radius:16px;width:262px;flex-shrink:0;padding:12px;display:flex;flex-direction:column;gap:10px;transition:outline .18s}.kanban-col.drag-over{outline:2px dashed var(--primary);outline-offset:2px}.kanban-col-header{display:flex;align-items:center;gap:8px;padding:2px 4px}.kanban-col-header .dot{width:10px;height:10px;border-radius:4px}.kanban-col-header h3{margin:0;font-size:13.5px;font-weight:700;flex:1 1}.kanban-col-header .count{background:var(--card);border-radius:999px;font-size:11px;font-weight:700;padding:2px 9px;color:var(--text-soft)}.kanban-card{background:var(--card);border-radius:12px;padding:12px 13px;box-shadow:0 2px 8px rgba(26,34,56,.07);cursor:-webkit-grab;cursor:grab;display:flex;flex-direction:column;gap:8px;animation:cardIn .3s ease both;border-left:3px solid transparent;transition:box-shadow .15s,transform .15s}.kanban-card:hover{box-shadow:0 6px 18px rgba(26,34,56,.13);transform:translateY(-1px)}.kanban-card.dragging{opacity:.45;cursor:-webkit-grabbing;cursor:grabbing}@keyframes cardIn{0%{opacity:0;transform:scale(.96) translateY(6px)}to{opacity:1;transform:none}}.kanban-card h4{margin:0;font-size:13.5px;font-weight:700}.kanban-card .desc{font-size:12px;color:var(--text-soft);line-height:1.4}.chips{display:flex;gap:5px;flex-wrap:wrap}.chip{font-size:10.5px;font-weight:700;padding:2.5px 8px;border-radius:999px}.chip-date{background:var(--bg);color:var(--text-soft)}.chip-date.overdue{background:#fee2e2;color:var(--danger)}.kanban-card .progress-track{height:4px;background:var(--border);border-radius:4px;overflow:hidden}.kanban-card .progress-track>div{height:100%;background:var(--ok);transition:width .35s ease}.kanban-add{display:flex;align-items:center;gap:6px;justify-content:center;padding:8px;border-radius:10px;color:var(--text-soft);font-size:12.5px;font-weight:600;transition:all .15s}.kanban-add:hover{background:var(--primary-soft);color:var(--primary)}.gantt-wrap{background:var(--card);border-radius:18px;padding:18px;box-shadow:var(--shadow);overflow-x:auto}.gantt-scale{position:relative;height:40px;margin-left:210px;border-bottom:1px solid var(--border)}.gantt-tick{position:absolute;top:0;bottom:0;font-size:10px;color:var(--text-soft);border-left:1px solid var(--border);padding:3px 5px}.gantt-tick.block{font-weight:700;color:var(--text)}.gantt-row{display:flex;align-items:center;position:relative;height:46px}.gantt-label{width:210px;flex-shrink:0;font-size:12.5px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding-right:12px}.gantt-track{flex:1 1;position:relative;height:100%}.gantt-bar{position:absolute;top:50%;transform:translateY(-50%);height:24px;border-radius:8px;min-width:26px;cursor:pointer;overflow:hidden;animation:barGrow .45s ease both}@keyframes barGrow{0%{opacity:0;transform:translateY(-50%) scaleX(.6)}to{opacity:1}}.gantt-bar .fill{height:100%;opacity:.28}.gantt-bar .name{position:absolute;inset:0;display:flex;align-items:center;padding:0 9px;font-size:11px;font-weight:700;color:#fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.gantt-today{position:absolute;top:40px;bottom:0;width:2px;background:var(--danger);z-index:5}.gantt-empty{padding:40px;text-align:center;color:var(--text-soft)}.timeline-wrap{position:relative;padding:8px 0 20px}.timeline-line{position:absolute;left:118px;top:0;bottom:0;width:3px;background:linear-gradient(var(--primary),#06b6d4);border-radius:3px}.timeline-item{display:flex;gap:26px;align-items:flex-start;margin-bottom:18px;animation:timelineIn .4s ease both}@keyframes timelineIn{0%{opacity:0;transform:translateX(-14px)}to{opacity:1;transform:none}}.timeline-date{width:96px;text-align:right;font-size:12px;font-weight:700;color:var(--text-soft);padding-top:4px}.timeline-dot{width:15px;height:15px;border-radius:50%;margin-top:3px;flex-shrink:0;box-shadow:0 0 0 4px var(--card)}.timeline-card{flex:1 1;background:var(--card);border-radius:13px;padding:12px 15px;box-shadow:var(--shadow);transition:transform .15s}.timeline-card:hover{transform:translateX(3px)}.timeline-card h4{margin:0 0 4px;font-size:14px}.timeline-card p{margin:0;font-size:12px;color:var(--text-soft)}.calendar-wrap{background:var(--card);border-radius:18px;padding:18px;box-shadow:var(--shadow)}.calendar-head{display:flex;align-items:center;gap:12px;margin-bottom:12px}.calendar-head h2{margin:0;font-size:17px;flex:1 1}.calendar-grid{display:grid;grid-template-columns:repeat(7,1fr);grid-gap:6px;gap:6px}.calendar-dayname{font-size:11px;font-weight:700;color:var(--text-soft);text-align:center;padding:4px 0;text-transform:uppercase}.calendar-cell{min-height:96px;border-radius:11px;background:var(--bg);padding:6px;display:flex;flex-direction:column;gap:4px;border:1.5px solid transparent;transition:border-color .2s}.calendar-cell.other{opacity:.45}.calendar-cell.today{border-color:var(--primary)}.calendar-cell .num{font-size:11.5px;font-weight:700;color:var(--text-soft)}.cal-task{font-size:10.5px;font-weight:600;border-radius:6px;padding:2.5px 6px;color:#fff;cursor:pointer;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;animation:cardIn .25s ease both}.list-wrap{background:var(--card);border-radius:18px;box-shadow:var(--shadow);overflow:hidden}.list-table{width:100%;border-collapse:collapse}.list-table th{text-align:left;font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-soft);padding:13px 16px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}.list-table td,.list-table th{border-bottom:1px solid var(--border)}.list-table td{padding:12px 16px;font-size:13px;vertical-align:middle}.list-table tr{transition:background .15s}.list-table tbody tr:hover{background:var(--bg)}.list-table select{border:1.5px solid var(--border);border-radius:8px;padding:4px 8px;font-size:12px;background:#fff}.row-actions{display:flex;gap:4px}.stats-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));grid-gap:14px;gap:14px;margin-bottom:18px}.stat-card{background:var(--card);border-radius:16px;padding:16px;box-shadow:var(--shadow);display:flex;flex-direction:column;gap:4px;animation:statIn .4s ease both}@keyframes statIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}.stat-card .value{font-size:27px;font-weight:800}.stat-card .label{font-size:12px;color:var(--text-soft);font-weight:600}.stats-panels{display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));grid-gap:14px;gap:14px}.panel{background:var(--card);border-radius:16px;padding:18px;box-shadow:var(--shadow)}.panel h3{margin:0 0 14px;font-size:14.5px}.bar-row{display:flex;align-items:center;gap:10px;margin-bottom:9px}.bar-row .bar-label{width:96px;font-size:12px;font-weight:600;color:var(--text-soft)}.bar-track{flex:1 1;height:11px;background:var(--bg);border-radius:6px;overflow:hidden}.bar-fill{height:100%;border-radius:6px;transition:width .6s ease}.bar-row .bar-val{font-size:12px;font-weight:800;width:34px;text-align:right}.donut-wrap{display:flex;align-items:center;gap:20px}.donut{transform:rotate(-90deg);animation:donutIn .7s ease both}@keyframes donutIn{0%{opacity:0;transform:rotate(-90deg) scale(.85)}to{opacity:1;transform:rotate(-90deg) scale(1)}}.donut-legend{display:flex;flex-direction:column;gap:7px}.legend-item{display:flex;align-items:center;gap:8px;font-size:12.5px;font-weight:600}.legend-item .swatch{width:12px;height:12px;border-radius:4px}.admin-head{display:flex;align-items:center;gap:12px;margin-bottom:18px}.admin-head h1{margin:0;font-size:20px}.table-wrap{background:var(--card);border-radius:16px;box-shadow:var(--shadow);overflow:hidden;margin-bottom:18px}.admin-search{padding:9px 14px;border:1.5px solid var(--border);border-radius:10px;font-size:13px;outline:none;min-width:220px}.badge{font-size:11px;font-weight:700;padding:3px 10px;border-radius:999px}.badge.user{background:var(--primary-soft);color:var(--primary)}.badge.admin,.badge.superadmin{background:#fef3c7;color:#b45309}.badge.online{background:#dcfce7;color:#15803d}.badge.offline{background:var(--bg);color:var(--text-soft)}.spinner-page{min-height:100vh;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#1a1f3c,#312e81)}.spinner{width:42px;height:42px;border-radius:50%;border:4px solid hsla(0,0%,100%,.25);border-top-color:#fff;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(1turn)}}.toast{position:fixed;bottom:20px;left:50%;transform:translateX(-50%);background:var(--bg-dark);color:#fff;padding:11px 20px;border-radius:12px;font-size:13.5px;font-weight:600;z-index:200;box-shadow:0 10px 30px rgba(0,0,0,.3);animation:toastIn .25s ease both}@keyframes toastIn{0%{opacity:0;transform:translateX(-50%) translateY(12px)}to{opacity:1;transform:translateX(-50%)}}@media (max-width:1040px){.sidebar{width:240px}.view-tabs{display:none}.topbar .view-tabs-mini{display:flex}}@media (max-width:860px){.app-body{flex-direction:column}.sidebar{width:100%;flex-direction:row;overflow-x:auto}}.theme-toggle{width:34px;height:34px;border-radius:10px;display:flex;align-items:center;justify-content:center;font-size:16px;background:var(--bg);border:1.5px solid var(--border);cursor:pointer;transition:all .2s ease;color:var(--text)}.theme-toggle:hover{background:var(--primary-soft);color:var(--primary);border-color:var(--primary)}[data-theme=dark] .spinner-page{background:linear-gradient(135deg,#080a10,#181b25 50%,#1e2048)}[data-theme=dark] .spinner{border-color:#6d72f7 hsla(0,0%,100%,.15) hsla(0,0%,100%,.15)}[data-theme=dark] .auth-wrap{background:linear-gradient(135deg,#080a10,#181b25 50%,#1e2048)}[data-theme=dark] .auth-card{box-shadow:0 20px 60px rgba(0,0,0,.55)}[data-theme=dark] .toast{background:#2a2e3a}[data-theme=dark] .kanban-col{background:#1e2130}[data-theme=dark] .calendar-wrap,[data-theme=dark] .gantt-wrap,[data-theme=dark] .list-wrap,[data-theme=dark] .panel,[data-theme=dark] .room-card,[data-theme=dark] .stat-card{background:#181b25}[data-theme=dark] .kanban-card{background:#1e2130}[data-theme=dark] .kanban-col-header .count{background:#252836}[data-theme=dark] .calendar-cell{background:#1e2130}[data-theme=dark] .timeline-card{background:#181b25}[data-theme=dark] .modal-overlay{background:rgba(0,0,0,.7)}[data-theme=dark] .modal{background:#181b25}[data-theme=dark] .modal input,[data-theme=dark] .modal select,[data-theme=dark] .modal textarea{background:#1e2130;color:var(--text);border-color:#2a2e3a}[data-theme=dark] .modal input:focus,[data-theme=dark] .modal select:focus,[data-theme=dark] .modal textarea:focus{border-color:var(--primary)}[data-theme=dark] .code-chip{background:#252836}[data-theme=dark] .auth-error,[data-theme=dark] .modal-error{background:#3b1515}[data-theme=dark] .table-wrap{background:#181b25}[data-theme=dark] .admin-search{background:#1e2130;border-color:#2a2e3a;color:var(--text)}[data-theme=dark] .list-table th{color:var(--text-soft);border-color:#2a2e3a}[data-theme=dark] .list-table td{border-color:#2a2e3a}[data-theme=dark] .list-table tbody tr:hover{background:#1e2130}[data-theme=dark] .list-table select{background:#1e2130;border-color:#2a2e3a;color:var(--text)}[data-theme=dark] .badge.user{background:#1e2048}[data-theme=dark] .badge.admin,[data-theme=dark] .badge.superadmin{background:#3b2f10}[data-theme=dark] .badge.online{background:#14352a}[data-theme=dark] .badge.offline,[data-theme=dark] .bar-track{background:#1e2130}[data-theme=dark] .project-item.active{background:#1e2048;border-color:var(--primary)}[data-theme=dark] .project-item:hover{background:#1e2130}[data-theme=dark] .donut circle:first-child{stroke:#2a2e3a}[data-theme=dark] .color-pick button.sel{border-color:var(--text)}