:root{--bg:#f4f6f9;--surface:#fff;--surface-2:#f8fafc;--text:#0f172a;--muted:#64748b;--border:#e2e8f0;--primary:#2563eb;--primary-dark:#1d4ed8;--danger:#dc2626;--success:#059669;--warning:#d97706;--shadow:0 10px 30px #0f172a14;--radius:14px;--sidebar-width:260px}*{box-sizing:border-box}body,html{background:var(--bg);color:var(--text);margin:0;padding:0;font-family:Inter,Segoe UI,Roboto,Arial,sans-serif}a{color:inherit;text-decoration:none}button,input,select,textarea{font:inherit}button{cursor:pointer}.app-shell{grid-template-columns:var(--sidebar-width) 1fr;min-height:100vh;display:grid}.sidebar{color:#e2e8f0;background:#0f172a;height:100vh;padding:1.25rem;position:sticky;top:0;overflow:auto}.sidebar-brand{margin-bottom:1.5rem;font-size:1.2rem;font-weight:700}.sidebar-nav{flex-direction:column;gap:.35rem;display:flex}.nav-link{color:#cbd5e1;border-radius:10px;padding:.75rem .9rem;display:block}.nav-link.active,.nav-link:hover{color:#fff;background:#2563eb40}.main-area{min-width:0}.topbar{background:var(--surface);border-bottom:1px solid var(--border);z-index:20;justify-content:space-between;gap:1rem;padding:1rem 1.25rem;position:sticky;top:0}.topbar,.topbar-user{align-items:center;display:flex}.topbar-user{flex-wrap:wrap;gap:.75rem}.content{padding:1.25rem}.page-header{flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:1rem;margin-bottom:1.25rem;display:flex}.page-header h1{margin:0 0 .35rem;font-size:1.6rem}.page-header p{color:var(--muted);margin:0}.grid{gap:1rem;display:grid}.grid-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-2{grid-template-columns:repeat(2,minmax(0,1fr))}.card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);padding:1rem}.stat-label{color:var(--muted);font-size:.9rem}.stat-value{margin-top:.4rem;font-size:1.5rem;font-weight:700}.table-wrap{overflow-x:auto}table{border-collapse:collapse;width:100%}td,th{text-align:left;border-bottom:1px solid var(--border);vertical-align:top;padding:.75rem .6rem}th{color:var(--muted);font-size:.85rem}.btn,th{font-weight:600}.btn{background:var(--primary);color:#fff;border:none;border-radius:10px;justify-content:center;align-items:center;gap:.4rem;padding:.65rem 1rem;display:inline-flex}.btn:hover{background:var(--primary-dark)}.btn:disabled{opacity:.6;cursor:not-allowed}.btn-secondary{color:var(--text);background:#e2e8f0}.btn-secondary:hover{background:#cbd5e1}.btn-danger{background:var(--danger)}.btn-ghost{color:var(--text);border:1px solid var(--border);background:0 0}.form-grid{gap:.85rem;display:grid}.form-row{gap:.35rem;display:grid}.form-row label{color:var(--muted);font-size:.9rem}.form-row input,.form-row select,.form-row textarea{border:1px solid var(--border);background:#fff;border-radius:10px;width:100%;padding:.7rem .8rem}.form-actions{flex-wrap:wrap;gap:.6rem;display:flex}.badge{background:#e2e8f0;border-radius:999px;align-items:center;padding:.2rem .6rem;font-size:.8rem;display:inline-flex}.badge-success{color:#065f46;background:#d1fae5}.badge-warning{color:#92400e;background:#fef3c7}.badge-danger{color:#991b1b;background:#fee2e2}.alert{border-radius:10px;margin-bottom:1rem;padding:.85rem 1rem}.alert-error{color:#991b1b;background:#fee2e2}.alert-info{color:#1e40af;background:#dbeafe}.empty{color:var(--muted);padding:1rem 0}.progress{background:#e2e8f0;border-radius:999px;height:10px;overflow:hidden}.progress>span{background:linear-gradient(90deg,#2563eb,#06b6d4);height:100%;display:block}.login-page{background:radial-gradient(circle at top left,#2563eb2e,transparent 35%),radial-gradient(circle at bottom right,#06b6d426,transparent 30%),var(--bg);place-items:center;min-height:100vh;padding:1rem;display:grid}.login-card{width:min(420px,100%)}.mobile-toggle{border:1px solid var(--border);background:#fff;border-radius:10px;padding:.55rem .8rem;display:none}.sidebar-backdrop{display:none}.permission-matrix{overflow-x:auto}.permission-matrix table{min-width:720px}.checkbox-cell{text-align:center}@media (width<=1100px){.grid-4{grid-template-columns:repeat(2,minmax(0,1fr))}}.grid-3{grid-template-columns:repeat(3,minmax(0,1fr))}.money{font-variant-numeric:tabular-nums;letter-spacing:.02em;white-space:nowrap}.money-success{color:var(--success)}.money-warning{color:var(--warning)}.statistics-delta{color:var(--muted);margin:.4rem 0 0;font-size:.875rem}.statistics-chart-header{flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:.5rem;margin-bottom:.5rem;display:flex}.statistics-chart-header h3{margin:0;font-size:1rem}.statistics-chart-legend{color:var(--muted);flex-wrap:wrap;gap:.75rem;font-size:.8rem;display:flex}.statistics-legend-current:before,.statistics-legend-previous:before{content:"";vertical-align:middle;border-radius:999px;width:.75rem;height:.2rem;margin-right:.35rem;display:inline-block}.statistics-legend-current:before{background:var(--primary)}.statistics-legend-previous:before{background:#94a3b8}.statistics-chart-svg{width:100%;height:auto;display:block}.statistics-chart-grid{stroke:#e2e8f0;stroke-width:1px}.statistics-chart-axis{fill:var(--muted);font-size:11px}.statistics-chart-line-current{stroke:var(--primary);stroke-width:2.5px;stroke-linecap:round;stroke-linejoin:round}.statistics-chart-line-previous{stroke:#94a3b8;stroke-width:2px;stroke-dasharray:6 4;stroke-linecap:round;stroke-linejoin:round}.report-photos{margin-top:.75rem}.report-photos-grid{grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:.75rem;margin-bottom:.75rem;display:grid}.report-photo-item{border:1px solid var(--border);background:#f8fafc;border-radius:8px;margin:0;overflow:hidden}.report-photo-link{aspect-ratio:4/3;background:#e2e8f0;display:block;overflow:hidden}.report-photo-link img{-o-object-fit:cover;object-fit:cover;width:100%;height:100%;display:block}.report-photo-caption{color:var(--muted);justify-content:space-between;align-items:center;gap:.5rem;padding:.4rem .5rem;font-size:.75rem;display:flex}.report-photo-caption span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.report-photos-actions{flex-wrap:wrap;align-items:center;gap:.75rem;display:flex}.report-photos-hint{color:var(--muted);font-size:.8rem}.funding-check{cursor:pointer;width:1.15rem;height:1.15rem}.external-links{flex-wrap:wrap;gap:.75rem;margin-bottom:1rem;display:flex}.row-received td{background:#f0fdf4}.timeline-date{margin-top:.45rem;font-size:1.15rem;font-weight:700}.timeline-phase-progress,.timeline-summary,.timeline-summary-note{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:1rem;display:flex}.timeline-percent{color:var(--primary);font-size:2rem;font-weight:800}.timeline-summary-note{color:var(--muted);margin-top:.8rem;font-size:.9rem}.timeline-track{padding-top:2rem;padding-bottom:1.5rem}.timeline-track-line{background:var(--border);border-radius:999px;height:8px;margin:.5rem 0 1rem;position:relative}.timeline-track-progress{background:linear-gradient(90deg,#2563eb,#06b6d4);border-radius:999px;position:absolute;inset:0 auto 0 0}.timeline-marker{border:3px solid var(--surface);background:var(--primary);width:18px;height:18px;box-shadow:0 0 0 2px var(--primary);border-radius:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}.timeline-marker-start{left:0}.timeline-marker-release{left:100%}.timeline-track-labels{min-height:3.5rem;color:var(--muted);font-size:.85rem;position:relative}.timeline-track-labels>div{flex-direction:column;gap:.2rem;display:flex;position:absolute}.timeline-track-labels>div:first-child{left:0}.timeline-track-label-zbt{text-align:center;transform:translate(-50%)}.timeline-track-label-release{text-align:right;right:0}.timeline-track-labels strong{color:var(--text)}.timesheet-toolbar{flex-direction:column;gap:.75rem;display:flex}.timesheet-hint{color:var(--muted);margin:0;font-size:.9rem}.timesheet-wrap{--timesheet-name-width:13.5rem;--timesheet-position-width:7.5rem;--timesheet-day-width:2.5rem;--timesheet-total-width:4rem;border:1px solid var(--border);background:var(--surface);border-radius:10px;max-height:min(75vh,900px);overflow:auto}.timesheet-table{table-layout:fixed;border-collapse:separate;border-spacing:0;width:max-content;max-width:none;font-size:.82rem}.timesheet-table col.timesheet-name-col{width:var(--timesheet-name-width)}.timesheet-table col.timesheet-position-col{width:var(--timesheet-position-width)}.timesheet-table col.timesheet-day-col{width:var(--timesheet-day-width)}.timesheet-table col.timesheet-total-col{width:var(--timesheet-total-width)}.timesheet-table td,.timesheet-table th{box-sizing:border-box;border:0;border-right:1px solid var(--border);border-bottom:1px solid var(--border);vertical-align:middle;text-align:center;white-space:nowrap;background:var(--surface);margin:0;padding:.35rem .25rem;overflow:hidden}.timesheet-table thead th{z-index:5;color:var(--muted);background:#f8fafc;padding:.45rem .25rem;font-weight:700;position:sticky;top:0}.timesheet-table tfoot td{z-index:4;background:#f8fafc;font-weight:600;position:sticky;bottom:0}.timesheet-name-col{width:var(--timesheet-name-width);min-width:var(--timesheet-name-width);max-width:var(--timesheet-name-width);text-align:left;white-space:normal}.timesheet-position-col{width:var(--timesheet-position-width);min-width:var(--timesheet-position-width);max-width:var(--timesheet-position-width);text-align:left;white-space:normal;overflow-wrap:anywhere}.timesheet-day-col{width:var(--timesheet-day-width);min-width:var(--timesheet-day-width);max-width:var(--timesheet-day-width);padding-left:.1rem;padding-right:.1rem}.timesheet-total-col{width:var(--timesheet-total-width);min-width:var(--timesheet-total-width);max-width:var(--timesheet-total-width);font-variant-numeric:tabular-nums;background:#eff6ff;font-weight:700}.timesheet-table tbody .timesheet-total-col,.timesheet-table tfoot .timesheet-total-col,.timesheet-table thead .timesheet-total-col{background:#eff6ff}.timesheet-sticky-col,.timesheet-sticky-col-2{z-index:3;position:sticky}.timesheet-sticky-col{left:0;box-shadow:3px 0 #e2e8f0f2}.timesheet-sticky-col-2{left:var(--timesheet-name-width);box-shadow:3px 0 6px -4px #0f172a47}.timesheet-table tfoot .timesheet-sticky-col,.timesheet-table tfoot .timesheet-sticky-col-2,.timesheet-table thead .timesheet-sticky-col,.timesheet-table thead .timesheet-sticky-col-2{z-index:6;background:#f8fafc}.timesheet-table tbody .timesheet-sticky-col,.timesheet-table tbody .timesheet-sticky-col-2{background:var(--surface)}.timesheet-employee{text-align:left;white-space:normal;flex-direction:column;align-items:flex-start;gap:.2rem;line-height:1.25;display:flex}.timesheet-employee strong{overflow-wrap:anywhere;font-size:.86rem;display:block}.timesheet-employee small{color:var(--muted);font-size:.74rem}.timesheet-fill-btn{white-space:nowrap;margin-top:.1rem;padding:.18rem .4rem;font-size:.7rem;line-height:1.2}.timesheet-weekend{background:#eef2f7}.timesheet-table tfoot .timesheet-weekend,.timesheet-table thead .timesheet-weekend{background:#e2e8f0}.timesheet-table tbody td.timesheet-weekend{background:#f1f5f9}.timesheet-input{box-sizing:border-box;width:100%;max-width:100%;color:var(--text);font-variant-numeric:tabular-nums;text-align:center;background:0 0;border:1px solid #0000;border-radius:5px;margin:0;padding:.28rem 0;font-size:.78rem;line-height:1.15;display:block}.timesheet-input::placeholder{color:#94a3b8}.timesheet-input:focus,.timesheet-input:hover{border-color:var(--primary);background:#fff;outline:none}.timesheet-saving .timesheet-input{background:#eff6ff;border-color:#2563eb73}.btn-compact{padding:.4rem .55rem;font-size:.8rem}.payroll-periods{flex-direction:column;gap:1.5rem;display:flex}.payroll-period-header{flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:1rem;margin-bottom:.85rem;display:flex}.payroll-period-header h3{margin:0 0 .35rem}.payroll-period-header p{color:var(--muted);margin:.2rem 0}.payroll-amount-input{text-align:right;font-variant-numeric:tabular-nums;width:8.5rem;max-width:100%}.payroll-amount-cell{justify-content:flex-end;align-items:center;gap:.35rem;width:100%;display:inline-flex}.payroll-amount-input-warning{border-color:var(--warning);background:#fff7ed}.payroll-amount-warning-text{color:var(--warning)}.payroll-limit-badge{background:var(--warning);color:#fff;cursor:help;border-radius:999px;flex-shrink:0;justify-content:center;align-items:center;width:1.15rem;height:1.15rem;font-size:.75rem;font-weight:700;line-height:1;display:inline-flex}.payroll-override-hint{color:var(--warning);font-size:.75rem;display:block}.payroll-rate-link{color:var(--primary);font-weight:600}.payroll-rate-link:hover{text-decoration:underline}@media (width<=860px){.app-shell,.grid-3{grid-template-columns:1fr}.sidebar{z-index:40;width:min(86vw,300px);transition:transform .2s;position:fixed;inset:0 auto 0 0;transform:translate(-105%)}.sidebar.open{transform:translate(0)}.sidebar-backdrop{z-index:30;background:#0f172a73;display:block;position:fixed;inset:0}.mobile-toggle{display:inline-flex}.grid-2,.grid-4{grid-template-columns:1fr}.content{padding:1rem}.topbar{padding:.85rem 1rem}}
