:root{--bg:#f4f6f8;--surface:#ffffff;--border:#dde3ea;--text:#1c2733;--text-muted:#5b6b7c;--primary:#1d4ed8;--primary-hover:#1e40af;--danger:#b42318;--danger-bg:#fef3f2;--ok:#067647;--radius:10px}*{box-sizing:border-box}body{margin:0;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;background:var(--bg);color:var(--text);line-height:1.5}a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}.auth-page{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:24px}.auth-card{width:100%;max-width:380px;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:32px 28px}.auth-card h1{margin:4px 0;font-size:1.35rem}.auth-hint{margin:0 0 20px;color:var(--text-muted);font-size:.9rem}.brand{font-weight:700;letter-spacing:.08em;color:var(--primary);margin:0}.login-form{gap:14px}.field,.login-form{display:flex;flex-direction:column}.field{gap:4px}.field label{font-size:.85rem;font-weight:600}.field input,.filter-input,.filter-select{padding:9px 10px;border:1px solid var(--border);border-radius:8px;font-size:.95rem;font-family:inherit;background:var(--surface);color:var(--text)}.field input:focus,.filter-input:focus,.filter-select:focus{outline:2px solid var(--primary);outline-offset:1px}.form-error{margin:0;padding:10px 12px;border-radius:8px;background:var(--danger-bg);color:var(--danger);font-size:.9rem}button{font-family:inherit;cursor:pointer}.btn-primary{padding:10px 16px;border:none;border-radius:8px;background:var(--primary);color:#fff;font-weight:600;font-size:.95rem}.btn-primary:hover:not(:disabled){background:var(--primary-hover)}.btn-primary:disabled{opacity:.6;cursor:wait}.btn-secondary{padding:7px 14px;border:1px solid var(--border);border-radius:8px;background:var(--surface);color:var(--text);font-size:.9rem}.btn-secondary:hover{background:var(--bg)}.app-header{background:var(--surface);border-bottom:1px solid var(--border)}.app-header-inner{max-width:1040px;margin:0 auto;padding:12px 20px;display:flex;align-items:center;gap:24px}.app-nav{flex:1 1}.app-nav a{font-weight:600;color:var(--text)}.app-user{display:flex;align-items:center;gap:12px;color:var(--text-muted);font-size:.9rem}.app-main{max-width:1040px;margin:0 auto;padding:28px 20px 48px}.page-title{margin:0 0 4px;font-size:1.4rem}.page-subtitle{margin:0 0 20px;color:var(--text-muted)}.projects-toolbar{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:20px}.filter-input{flex:1 1;min-width:220px}.project-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));grid-gap:16px;gap:16px}.project-card{display:block;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:18px;color:var(--text)}.project-card:hover{border-color:var(--primary);text-decoration:none}.project-card h2{margin:0 0 8px;font-size:1.05rem}.project-card p{margin:0;color:var(--text-muted);font-size:.9rem}.badge{display:inline-block;padding:2px 10px;border-radius:999px;font-size:.78rem;font-weight:600;margin-bottom:10px}.badge-planning{background:#eff8ff;color:#175cd3}.badge-active{background:#ecfdf3;color:var(--ok)}.badge-paused{background:#fffaeb;color:#b54708}.badge-completed{background:#eef4ff;color:#363f72}.badge-canceled{background:#fef3f2;color:var(--danger)}.detail-header{display:flex;align-items:baseline;gap:12px;flex-wrap:wrap;margin-bottom:4px}.detail-header h1{margin:0;font-size:1.4rem}.detail-meta{margin:0 0 20px;color:var(--text-muted);font-size:.92rem;display:flex;gap:16px;flex-wrap:wrap}.env-list{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);overflow:hidden}.env-row{display:flex;justify-content:space-between;align-items:center;padding:12px 18px;border-bottom:1px solid var(--border)}.env-row:last-child{border-bottom:none}.env-order{color:var(--text-muted);font-size:.85rem;margin-right:10px}.photos-title{margin-top:28px}.upload-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:18px;display:flex;flex-direction:column;gap:12px;margin-bottom:20px}.upload-card-empty p{margin:0;color:var(--text-muted)}.upload-fields{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));grid-gap:12px;gap:12px}.photos-section{margin-top:4px}.photos-toolbar{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:16px}.photos-tabs{display:inline-flex;border:1px solid var(--border);border-radius:8px;overflow:hidden}.photos-tab{padding:8px 14px;border:none;background:var(--surface);font-size:.9rem;font-weight:600;color:var(--text-muted)}.photos-tab.active{background:var(--primary);color:#fff}.photo-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));grid-gap:14px;gap:14px}.photo-card{margin:0;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);overflow:hidden;display:flex;flex-direction:column}.photo-card img{width:100%;aspect-ratio:4/3;object-fit:cover;background:var(--bg);display:block}.photo-card figcaption{padding:10px 12px;display:flex;flex-direction:column;gap:2px;font-size:.82rem;color:var(--text-muted)}.photo-card figcaption strong{font-size:.9rem;color:var(--text)}.photo-actions{display:flex;align-items:center;gap:10px;margin-top:6px}.btn-danger{padding:4px 10px;border:1px solid var(--border);border-radius:6px;background:var(--surface);color:var(--danger);font-size:.8rem;font-weight:600}.btn-danger:hover:not(:disabled){background:var(--danger-bg)}.pagination{display:flex;align-items:center;justify-content:center;gap:16px;margin-top:18px;color:var(--text-muted);font-size:.9rem}.timeline{display:flex;flex-direction:column;gap:24px}.timeline-day h3{margin:0 0 10px;font-size:1rem}.timeline-count{color:var(--text-muted);font-weight:400;font-size:.85rem}.state-loading{color:var(--text-muted);font-size:.95rem}.plans-section{margin-top:4px}.upload-hint{margin:0;color:var(--text-muted);font-size:.85rem}.plan-list{display:flex;flex-direction:column;gap:12px;margin-bottom:20px}.plan-row{display:flex;align-items:center;gap:14px;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:12px 14px}.plan-thumb{width:92px;height:64px;object-fit:cover;border-radius:8px;border:1px solid var(--border);background:var(--bg);flex-shrink:0;display:block}.plan-thumb-fallback,.plan-thumb-pdf{background:var(--bg);color:var(--text-muted);font-size:.75rem;font-weight:600;display:flex;align-items:center;justify-content:center}.plan-row-info{display:flex;flex-direction:column;gap:2px;flex:1 1;min-width:0}.plan-row-info strong{font-size:.95rem}.plan-row-info span{color:var(--text-muted);font-size:.82rem}.plan-viewer{margin-top:8px;display:flex;flex-direction:column;gap:10px}.plan-viewer-toolbar{display:flex;align-items:center;gap:14px;flex-wrap:wrap}.plan-viewer-name{font-size:1rem}.plan-page-picker{font-size:.85rem;color:var(--text-muted)}.plan-page-picker,.plan-zoom-controls{display:inline-flex;align-items:center;gap:8px}.plan-zoom-value{min-width:48px;text-align:center;font-feature-settings:"tnum";font-variant-numeric:tabular-nums;font-size:.9rem;color:var(--text-muted)}.plan-marker-bar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:10px 14px}.plan-marker-bar label{font-size:.85rem;font-weight:600}.plan-marker-bar select{padding:7px 10px;border:1px solid var(--border);border-radius:8px;font-size:.9rem;font-family:inherit;background:var(--surface);color:var(--text);max-width:320px}.plan-marker-hint{color:var(--primary);font-size:.85rem;font-weight:600}.plan-canvas-container{position:relative;overflow:hidden;background:#c9ced4;border:1px solid var(--border);border-radius:var(--radius);min-height:420px;height:560px;touch-action:none;cursor:-webkit-grab;cursor:grab}.plan-canvas-container:active{cursor:-webkit-grabbing;cursor:grabbing}.plan-canvas-container.pinning{cursor:crosshair}.plan-content{position:absolute;left:0;top:0;transform-origin:0 0;background:#fff;box-shadow:0 1px 4px rgba(0,0,0,.25);-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-user-drag:none}.plan-pin-wrapper{position:absolute;z-index:5}.plan-pin{display:block;transform:translate(-50%,-100%);border:2px solid #fff;border-radius:50% 50% 50% 4px;background:var(--primary);box-shadow:0 1px 4px rgba(0,0,0,.4);padding:0}.plan-pin:hover{background:var(--primary-hover)}.plan-pin-popover{position:absolute;left:10px;top:0;width:220px;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);box-shadow:0 4px 16px rgba(0,0,0,.18);padding:10px;display:flex;flex-direction:column;gap:4px;font-size:.82rem;color:var(--text-muted);z-index:10}.plan-pin-popover img{width:100%;height:110px;object-fit:cover;border-radius:6px;background:var(--bg)}.plan-pin-popover strong{color:var(--text);font-size:.9rem}.plan-pin-popover .btn-danger{margin-top:6px;align-self:flex-start}.state-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:40px 28px;text-align:center;display:flex;flex-direction:column;align-items:center;gap:8px}.state-card h1{margin:0;font-size:1.2rem}.state-card p{margin:0 0 12px;color:var(--text-muted);max-width:480px}.back-link{font-size:.9rem}@media (max-width:600px){.app-header-inner{gap:12px}.app-user span{display:none}}.compare-section{margin-top:4px}.compare-toolbar{align-items:center;justify-content:space-between;margin-bottom:16px}.compare-filters,.compare-toolbar{display:flex;gap:12px;flex-wrap:wrap}.compare-filters{align-items:flex-end}.compare-filter{display:flex;flex-direction:column;gap:4px;font-size:.85rem;font-weight:600}.compare-filter input,.compare-filter select{padding:8px 10px;border:1px solid var(--border);border-radius:8px;font-size:.9rem;font-family:inherit;background:var(--surface);color:var(--text)}.compare-filter input:focus,.compare-filter select:focus{outline:2px solid var(--primary);outline-offset:1px}.compare-view{display:flex;flex-direction:column;gap:10px}.compare-control-bar{display:flex;align-items:center;gap:14px;flex-wrap:wrap;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:10px 14px}.compare-columns{display:grid;grid-template-columns:1fr 1fr;grid-gap:14px;gap:14px}.compare-column{display:flex;flex-direction:column;gap:8px;min-width:0}.compare-canvas{position:relative;overflow:hidden;background:#c9ced4;border:1px solid var(--border);border-radius:var(--radius);height:480px;touch-action:none;cursor:-webkit-grab;cursor:grab}.compare-canvas:active{cursor:-webkit-grabbing;cursor:grabbing}.compare-canvas-empty{height:480px;justify-content:center}.compare-content{position:absolute;left:0;top:0;transform-origin:0 0;background:#fff;box-shadow:0 1px 4px rgba(0,0,0,.25);-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-user-drag:none}.compare-pin{position:absolute;transform:translate(-50%,-100%);border:2px solid #fff;border-radius:50% 50% 50% 4px;background:var(--primary);box-shadow:0 1px 4px rgba(0,0,0,.4);z-index:5;pointer-events:none;padding:0}.compare-hint,.compare-photo-caption{margin:0;color:var(--text-muted);font-size:.85rem}.compare-photo-caption{display:flex;flex-direction:column;gap:2px}.compare-photo-caption strong{color:var(--text);font-size:.9rem}.before-after-figure{margin:0;display:flex;flex-direction:column;gap:8px}.before-after{position:relative;height:480px;border:1px solid var(--border);border-radius:var(--radius);overflow:hidden;background:var(--bg);touch-action:none;cursor:ew-resize}.ba-img{position:absolute;inset:0;width:100%;height:100%;object-fit:contain;-webkit-user-select:none;-moz-user-select:none;user-select:none}.ba-img-before{z-index:2}.ba-divider{position:absolute;top:0;bottom:0;width:2px;background:#fff;box-shadow:0 0 0 1px rgba(0,0,0,.25);z-index:3;transform:translateX(-1px)}.ba-handle{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:36px;height:36px;border-radius:50%;background:var(--primary);border:2px solid #fff;box-shadow:0 1px 6px rgba(0,0,0,.35);cursor:ew-resize;padding:0}.ba-handle:focus-visible{outline:3px solid var(--primary);outline-offset:2px}.ba-label{position:absolute;top:10px;z-index:4;padding:4px 10px;border-radius:999px;background:rgba(28,39,51,.75);color:#fff;font-size:.8rem;font-weight:600}.ba-label-before{left:10px}.ba-label-after{right:10px}.before-after-footer{display:flex;align-items:center;gap:12px}.ba-percent{color:var(--text-muted);font-size:.9rem;font-feature-settings:"tnum";font-variant-numeric:tabular-nums}.timeline-compare-btn{margin-left:10px;padding:4px 10px;font-size:.8rem}@media (max-width:900px){.compare-columns{grid-template-columns:1fr}.before-after,.compare-canvas{height:340px}}.annotations-viewer{margin-top:4px;display:flex;flex-direction:column;gap:12px}.annotations-toolbar{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}.annotations-photo-title{font-size:1rem}.annotation-create-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:14px 16px;display:flex;flex-direction:column;gap:12px}.annotation-create-hint{margin:0;color:var(--text-muted);font-size:.85rem}.annotation-create-fields{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));grid-gap:12px;gap:12px}.annotation-create-footer{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}.annotation-draft-status{color:var(--text-muted);font-size:.85rem}.annotations-layout{display:grid;grid-template-columns:minmax(0,1fr) 300px;grid-gap:14px;gap:14px;align-items:start}.annotation-stage{position:relative;display:inline-block;max-width:100%;align-self:start}.annotation-photo{display:block;max-width:100%;max-height:560px;width:auto;height:auto;border-radius:var(--radius);border:1px solid var(--border);background:var(--surface);-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-user-drag:none}.annotation-overlay{position:absolute;inset:0}.annotation-overlay.creating{cursor:crosshair;touch-action:none}.annotation-pin{position:absolute;transform:translate(-50%,-50%);width:30px;height:30px;border-radius:50%;border:2px solid #fff;box-shadow:0 1px 5px rgba(0,0,0,.45);padding:0;display:flex;align-items:center;justify-content:center}.annotation-pin.selected{outline:3px solid rgba(29,78,216,.7);outline-offset:2px}.annotation-number{color:#fff;font-size:.78rem;font-weight:700;line-height:1}.annotation-rect{position:absolute;border:2px solid;border-radius:4px;padding:0;background:transparent}.annotation-rect.selected{outline:3px solid rgba(29,78,216,.7);outline-offset:2px}.annotation-rect .annotation-number{position:absolute;left:4px;top:4px;padding:2px 7px;border-radius:999px;background:inherit}.annotation-rect.draft{border-style:dashed;border-color:var(--primary);background:rgba(29,78,216,.12);pointer-events:none}.annotation-detail{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:14px 16px;min-height:120px}.annotation-detail-head{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:8px}.annotation-detail-card{display:flex;flex-direction:column;gap:10px}.annotation-detail-card h3{margin:0;font-size:1.05rem}.annotation-meta{margin:0;display:grid;grid-template-columns:1fr 1fr;grid-gap:8px 12px;gap:8px 12px}.annotation-meta dt{font-size:.75rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--text-muted)}.annotation-description,.annotation-meta dd{margin:0;font-size:.9rem}.annotation-description{color:var(--text);white-space:pre-wrap}.annotation-detail-empty h3{margin:0 0 4px;font-size:1rem}.annotation-detail-empty p{margin:0;color:var(--text-muted);font-size:.88rem}.annotations-panel{display:flex;flex-direction:column;gap:16px}.annotation-counters{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));grid-gap:12px;gap:12px}.annotation-counter{background:var(--surface);border:1px solid var(--border);border-left-width:4px;border-radius:var(--radius);padding:12px 16px;display:flex;flex-direction:column;gap:2px}.annotation-counter-value{font-size:1.4rem;font-weight:700}.annotation-counter-label{color:var(--text-muted);font-size:.85rem}.annotation-count-open{border-left-color:var(--danger)}.annotation-count-in-progress{border-left-color:#b54708}.annotation-count-resolved{border-left-color:var(--ok)}.annotations-filters{display:flex;gap:10px;flex-wrap:wrap}.annotation-badge{display:inline-block;padding:2px 10px;border-radius:999px;font-size:.75rem;font-weight:600;white-space:nowrap}.annotation-open{background:#fef3f2;color:var(--danger)}.annotation-in-progress{background:#fffaeb;color:#b54708}.annotation-resolved{background:#ecfdf3;color:var(--ok)}.annotation-list{display:flex;flex-direction:column;gap:10px}.annotation-row{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:12px 16px;display:flex;align-items:flex-start;justify-content:space-between;gap:14px;flex-wrap:wrap}.annotation-row-main{display:flex;flex-direction:column;gap:4px;min-width:0;flex:1 1}.annotation-row-title{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.annotation-kind-tag{font-size:.75rem;color:var(--text-muted);border:1px solid var(--border);border-radius:999px;padding:1px 8px}.annotation-row-meta{margin:0;color:var(--text-muted);font-size:.82rem}.annotation-row-description{margin:0;font-size:.88rem}.annotation-row-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.annotation-row-actions .btn-secondary{text-decoration:none}@media (max-width:900px){.annotations-layout{grid-template-columns:1fr}}.dashboard-section,.report-section{display:flex;flex-direction:column;gap:14px}.report-notice{border:1px solid #b2ccff;background:#eff4ff;color:#1e3a8a}.report-download-error,.report-notice{margin:0;padding:10px 14px;border-radius:8px;font-size:.9rem}.report-download-error{background:var(--danger-bg);color:var(--danger)}.report-subtitle{margin:8px 0 0;font-size:1rem}.report-group h4{margin:4px 0 10px;font-size:.95rem}.report-photo{margin:0;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);overflow:hidden}.report-photo img{display:block;width:100%;aspect-ratio:4/3;object-fit:cover;background:var(--bg)}.report-photo figcaption{display:flex;flex-direction:column;padding:8px 10px;font-size:.8rem;color:var(--text-muted)}.report-webp-note{color:#b54708}.report-count-zero{color:var(--text-muted)}.report-annotation-meta{display:block;color:var(--text-muted);font-size:.8rem}.dashboard-cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(170px,1fr));grid-gap:12px;gap:12px}.dashboard-card{display:flex;flex-direction:column;gap:4px;padding:14px 16px;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius)}.dashboard-card-wide{grid-column:span 2}@media (max-width:480px){.dashboard-card-wide{grid-column:auto}}.dashboard-card-label{font-size:.8rem;font-weight:600;color:var(--text-muted)}.dashboard-card-value{font-size:1.6rem;line-height:1.2}.dashboard-card-hint,.dashboard-card-text{font-size:.85rem;color:var(--text-muted)}.dashboard-card-text{color:var(--text)}.dashboard-columns{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));grid-gap:14px;gap:14px}.dashboard-panel{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:8px 16px 16px}.dashboard-alert{margin:8px 0 0;padding:8px 12px;border-radius:8px;background:#fffaeb;color:#b54708;font-size:.85rem}.bar-list,.dashboard-env-list{list-style:none;margin:10px 0 0;padding:0;display:flex;flex-direction:column;gap:10px}.dashboard-env{display:flex;flex-direction:column;gap:4px;padding:8px 10px;border-radius:8px;border:1px solid transparent}.dashboard-env.stale{border-color:#fecdca;background:var(--danger-bg)}.dashboard-env-head{display:flex;align-items:center;justify-content:space-between;gap:8px}.dashboard-env-name{font-weight:600}.dashboard-env-meta{font-size:.8rem;color:var(--text-muted)}.bar-row{display:flex;align-items:center;gap:10px}.bar-label{flex:0 0 130px;font-size:.85rem}.bar-track{flex:1 1;height:10px;background:var(--bg);border-radius:999px;overflow:hidden}.bar-fill{display:block;height:100%;background:var(--primary);border-radius:999px}.bar-open{background:var(--danger)}.bar-in-progress{background:#b54708}.bar-resolved{background:var(--ok)}.bar-value{flex:0 0 auto;min-width:56px;text-align:right;font-size:.85rem;font-feature-settings:"tnum";font-variant-numeric:tabular-nums}.dashboard-footer{display:flex;justify-content:flex-end}