:root{--bg:#f6f7fb;--surface:#fff;--border:#e6e9ef;--border-strong:#d0d4dc;--text:#323338;--muted:#676879;--primary:#0073ea;--primary-hover:#0060b9;--danger:#e2445c;--radius:10px;--shadow:0 2px 8px #0000000f;--font:"Segoe UI", system-ui, -apple-system, BlinkMacSystemFont, sans-serif;--sidebar-w:240px;--bottom-h:64px;--tap:44px}*,:before,:after{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{font-family:var(--font);color:var(--text);background:var(--bg);-webkit-font-smoothing:antialiased}button,input,select,textarea{font:inherit;color:inherit}h1,h2,h3{margin:0;font-weight:600}p{margin:0}.muted{color:var(--muted)}.small{font-size:.85rem}.nowrap{white-space:nowrap}.spacer{flex:1}.sr-only{clip:rect(0, 0, 0, 0);border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.btn{min-height:var(--tap);border:1px solid var(--border-strong);background:var(--surface);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:8px;justify-content:center;align-items:center;gap:6px;padding:0 14px;display:inline-flex}.btn:hover{background:#f0f1f5}.btn-primary{background:var(--primary);border-color:var(--primary);color:#fff}.btn-primary:hover{background:var(--primary-hover)}.btn-danger{color:var(--danger);background:#fff0f2;border-color:#f5b5bf}.btn-ghost{background:0 0;border-color:#0000}.btn-sm{min-height:32px;padding:0 10px;font-size:.85rem}.btn-block{width:100%}.btn:disabled{opacity:.45;cursor:not-allowed}.icon-btn{width:var(--tap);padding:0;font-size:1.4rem;line-height:1}.link-btn{color:var(--primary);cursor:pointer;text-align:left;background:0 0;border:none;padding:0;font-weight:600}.link-btn:hover{text-decoration:underline}.danger-text{color:var(--danger)!important}.gate{background:linear-gradient(160deg,#f6f7fb,#e8eef8);place-items:center;min-height:100%;padding:24px;display:grid}.gate-card{background:var(--surface);border:1px solid var(--border);width:min(400px,100%);box-shadow:var(--shadow);border-radius:16px;flex-direction:column;gap:12px;padding:28px 24px;display:flex}.gate-logo{background:var(--primary);color:#fff;border-radius:12px;place-items:center;width:48px;height:48px;font-weight:700;display:grid}.gate .error{color:var(--danger);font-size:.9rem}.gate .hint{color:var(--muted);text-align:center;font-size:.75rem}.field{flex-direction:column;gap:6px;font-size:.9rem;display:flex}.field>span,.field legend{color:var(--muted);font-size:.8rem;font-weight:600}.field input,.field select,.field textarea{min-height:var(--tap);border:1px solid var(--border-strong);background:#fff;border-radius:8px;padding:10px 12px}.field textarea{resize:vertical;min-height:88px}.field-row{grid-template-columns:1fr 1fr;gap:12px;display:grid}@media (width<=520px){.field-row{grid-template-columns:1fr}}.app-shell{min-height:100%;display:flex}.app-loading{min-height:100%;color:var(--muted);place-items:center;display:grid}.app-loading.error{color:var(--danger)}.sidebar{width:var(--sidebar-w);background:var(--surface);border-right:1px solid var(--border);flex-direction:column;gap:20px;height:100vh;padding:20px 14px;display:flex;position:sticky;top:0}.brand{align-items:center;gap:10px;padding:0 6px;display:flex}.brand-mark{background:var(--primary);color:#fff;border-radius:10px;place-items:center;width:40px;height:40px;font-weight:700;display:grid}.side-nav{flex-direction:column;gap:4px;display:flex}.side-nav button{text-align:left;cursor:pointer;min-height:var(--tap);background:0 0;border:none;border-radius:8px;padding:12px;font-weight:500}.side-nav button:hover{background:#f0f3f8}.side-nav button.active{color:var(--primary);background:#e7f1fd}.side-project{background:var(--bg);border-radius:10px;margin-top:auto;padding:12px}.main{flex-direction:column;flex:1;min-width:0;display:flex}.topbar{background:var(--surface);border-bottom:1px solid var(--border);z-index:5;justify-content:space-between;align-items:center;padding:16px 24px;display:flex;position:sticky;top:0}.content{padding:16px;padding-bottom:calc(16px + var(--bottom-h));flex:1}@media (width>=900px){.content{padding:24px}.mobile-only{display:none!important}}@media (width<=899px){.desktop-only{display:none!important}.app-shell{flex-direction:column}}.bottom-tabs{height:var(--bottom-h);background:var(--surface);border-top:1px solid var(--border);z-index:20;padding-bottom:env(safe-area-inset-bottom);grid-template-columns:repeat(3,1fr);display:grid;position:fixed;bottom:0;left:0;right:0}.bottom-tabs button{color:var(--muted);cursor:pointer;background:0 0;border:none;flex-direction:column;justify-content:center;align-items:center;gap:2px;font-size:.75rem;display:flex}.bottom-tabs button.active{color:var(--primary);font-weight:600}.tab-icon{font-size:1.1rem;line-height:1}.view-header{flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:12px;margin-bottom:16px;display:flex}.toolbar-actions{flex-wrap:wrap;gap:8px;display:flex}.inline-form{flex-wrap:wrap;gap:8px;margin-bottom:20px;display:flex}.inline-form input{min-width:160px;min-height:var(--tap);border:1px solid var(--border-strong);background:#fff;border-radius:8px;flex:1;padding:10px 12px}.empty,.empty-group{text-align:center;padding:24px}.status-pill{white-space:nowrap;border-radius:999px;align-items:center;padding:4px 10px;font-size:.75rem;font-weight:600;line-height:1.2;display:inline-flex}.status-pill-wrap{display:inline-block;position:relative}.status-pill-btn{cursor:pointer;border:none}.status-menu{z-index:30;background:var(--surface);border:1px solid var(--border);border-radius:10px;min-width:200px;margin:0;padding:6px;list-style:none;position:absolute;top:calc(100% + 4px);left:0;box-shadow:0 8px 24px #0000001f}.status-menu button{cursor:pointer;text-align:left;background:0 0;border:none;border-radius:6px;align-items:center;gap:8px;width:100%;padding:8px 10px;font-size:.85rem;display:flex}.status-menu button:hover,.status-menu button.active{background:#f0f3f8}.status-swatch{border-radius:3px;flex-shrink:0;width:12px;height:12px}.status-legend{background:var(--surface);border:1px solid var(--border);border-radius:10px;flex-wrap:wrap;gap:10px 14px;margin-bottom:14px;padding:10px 12px;display:flex}.legend-item{color:var(--muted);align-items:center;gap:6px;font-size:.78rem;display:inline-flex}.legend-swatch{border-radius:3px;width:12px;height:12px}.status-edit-row{flex-wrap:wrap;align-items:center;gap:12px;display:flex}.status-select-fallback{border:1px solid var(--border-strong);background:#fff;border-radius:8px;min-height:36px;padding:6px 10px}.job-group{background:var(--surface);border:1px solid var(--border);box-shadow:var(--shadow);border-radius:12px;margin-bottom:16px;overflow:hidden}.job-group-header{border-bottom:1px solid var(--border);background:#f0f3f8;padding:12px 16px}.job-group-header h3{align-items:center;gap:10px;font-size:1rem;display:flex}.group-count{min-width:24px;height:24px;color:var(--muted);background:#e0e4ec;border-radius:999px;justify-content:center;align-items:center;padding:0 8px;font-size:.75rem;font-weight:600;display:inline-flex}.table-scroll{-webkit-overflow-scrolling:touch;overflow-x:auto}.jobs-table{border-collapse:collapse;width:100%;min-width:720px;font-size:.9rem}.jobs-table th,.jobs-table td{border-bottom:1px solid var(--border);text-align:left;vertical-align:middle;padding:10px 12px}.jobs-table th{text-transform:uppercase;letter-spacing:.03em;color:var(--muted);background:#fafbfc;font-size:.75rem;font-weight:600;position:sticky;top:0}.jobs-table th.sortable{vertical-align:middle;padding:0}.jobs-table th.sortable.sorted{color:var(--text)}.th-sort-btn{width:100%;min-height:var(--tap);color:inherit;font:inherit;text-transform:uppercase;letter-spacing:.03em;text-align:inherit;cursor:pointer;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;background:0 0;border:none;justify-content:flex-start;align-items:center;gap:4px;margin:0;padding:10px 12px;font-size:.75rem;font-weight:600;display:inline-flex}.jobs-table th.num .th-sort-btn{justify-content:flex-end}.th-sort-btn:hover,.th-sort-btn:focus-visible{color:var(--text);outline:none}.th-sort-btn:focus-visible{box-shadow:inset 0 0 0 2px var(--primary);border-radius:4px}.sort-ind{opacity:.85;min-width:.9em;font-size:.7em;line-height:1;display:inline-block}.jobs-table tr:last-child td{border-bottom:none}.jobs-table tr:hover td{background:#f8fafc}.jobs-table .num{text-align:right;font-variant-numeric:tabular-nums}.notes-cell{text-overflow:ellipsis;white-space:nowrap;max-width:220px;color:var(--muted);font-size:.85rem;overflow:hidden}.job-name{font-weight:600}.actions-col{white-space:nowrap;width:1%}.row-actions{justify-content:flex-end;gap:2px;display:flex}.modal-backdrop{z-index:50;background:#14182473;place-items:center;padding:16px;display:grid;position:fixed;inset:0}.modal{background:var(--surface);border-radius:14px;flex-direction:column;width:min(520px,100%);max-height:min(90vh,720px);display:flex;overflow:auto;box-shadow:0 16px 48px #0003}.modal-header{border-bottom:1px solid var(--border);background:var(--surface);z-index:1;justify-content:space-between;align-items:center;padding:16px 18px;display:flex;position:sticky;top:0}.modal-body{flex-direction:column;gap:14px;padding:18px;display:flex}.modal-footer{flex-wrap:wrap;align-items:center;gap:8px;padding-top:8px;display:flex}.cal-nav{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.cal-month-label{text-align:center;min-width:140px;font-size:1.05rem}.cal-grid-wrap{background:var(--surface);border:1px solid var(--border);box-shadow:var(--shadow);border-radius:12px;overflow:hidden}.cal-weekdays{border-bottom:1px solid var(--border);background:#f0f3f8;grid-template-columns:repeat(7,1fr);display:grid}.cal-weekday{text-align:center;color:var(--muted);text-transform:uppercase;padding:10px 4px;font-size:.75rem;font-weight:600}.cal-weeks{flex-direction:column;display:flex}.cal-week{border-bottom:1px solid var(--border);position:relative}.cal-week:last-child{border-bottom:none}.cal-week-days{grid-template-columns:repeat(7,1fr);display:grid;position:absolute;inset:0}.cal-day{border-right:1px solid var(--border);min-height:100%;padding:6px 8px}.cal-day:last-child{border-right:none}.cal-day.out-month{background:#fafbfc}.cal-day.out-month .cal-day-num{color:#b0b3bd}.cal-day.is-today .cal-day-num{background:var(--primary);color:#fff;border-radius:999px;place-items:center;width:24px;height:24px;display:inline-grid}.cal-day-num{color:var(--text);font-size:.8rem;font-weight:600}.cal-week-events{pointer-events:none;position:absolute;left:0;right:0}.cal-event{cursor:pointer;pointer-events:auto;color:#fff;text-align:left;white-space:nowrap;text-overflow:ellipsis;border:none;height:20px;padding:0 6px;font-size:.7rem;font-weight:600;position:absolute;overflow:hidden;box-shadow:0 1px 2px #0000001f}.cal-event:hover{filter:brightness(.92);z-index:2}.cal-event-label{text-overflow:ellipsis;display:block;overflow:hidden}@media (width<=600px){.cal-weekday{padding:8px 2px;font-size:.65rem}.cal-event{padding:0 4px;font-size:.62rem}.cal-day{padding:4px}}.tl-scroll{-webkit-overflow-scrolling:touch;background:var(--surface);border:1px solid var(--border);box-shadow:var(--shadow);border-radius:12px;max-height:min(70vh,640px);overflow:auto}.tl-inner{min-width:100%}.tl-header,.tl-row{border-bottom:1px solid var(--border);min-height:40px;display:flex}.tl-header{z-index:2;background:#f0f3f8;min-height:36px;position:sticky;top:0}.tl-label-col{border-right:1px solid var(--border);background:inherit;z-index:1;text-overflow:ellipsis;white-space:nowrap;flex-shrink:0;width:140px;padding:8px 12px;font-size:.85rem;font-weight:600;position:sticky;left:0;overflow:hidden}.tl-row .tl-label-col{background:var(--surface)}.tl-row:hover .tl-label-col,.tl-row:hover .tl-chart-col{background:#f8fafc}.tl-chart-col{flex:1;min-height:40px;position:relative}.tl-month-tick{color:var(--muted);white-space:nowrap;font-size:.7rem;font-weight:600;position:absolute;top:8px}.tl-bar{color:#fff;text-overflow:ellipsis;white-space:nowrap;cursor:pointer;text-align:left;border:none;border-radius:6px;height:20px;padding:0 6px;font-size:.7rem;font-weight:600;position:absolute;top:10px;overflow:hidden}.tl-bar:hover{filter:brightness(.92)}.tl-today-line{background:var(--danger);opacity:.55;pointer-events:none;z-index:1;width:2px;position:absolute;top:0;bottom:0}
