*{box-sizing:border-box} body{margin:0;background:#f0f2f5;color:#2c2c2c;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif} button,input,select{font:inherit} code{background:#e8e8e8;border-radius:4px;padding:1px 4px} .app{min-height:100vh;padding:16px} .layout{display:grid;grid-template-columns:minmax(0,1fr) 300px;gap:16px;max-width:1360px;margin:0 auto} .header{margin-bottom:12px} .header h1{margin:0 0 6px;font-size:24px;letter-spacing:-0.02em;color:#1a1a1a;font-weight:700} .header p{margin:0;color:#5a5a5a;line-height:1.6;font-size:14px} .canvas-shell,.card{background:#ffffff;border:1px solid rgba(0,0,0,0.08);border-radius:8px;box-shadow:0 4px 12px rgba(0,0,0,0.04)} .canvas-shell{padding:12px;overflow:auto;position:relative;cursor:grab;user-select:none;touch-action:none} .map-canvas{display:block;border-radius:8px;background:#f8f9fa} .sidebar{display:flex;flex-direction:column;gap:12px} .card{padding:14px} .label,.card-title{display:block;margin-bottom:12px;color:#1a1a1a;font-size:14px;font-weight:600} .inline-label{margin-top:12px} .input{width:100%;border:1px solid rgba(0,0,0,0.15);background:#fff;color:#2c2c2c;border-radius:8px;padding:10px 12px;outline:none;transition:border-color 0.2s} .input:focus{border-color:#1a73e8;box-shadow:0 0 0 3px rgba(26,115,232,0.15)} .primary-button,.mode-button{border:0;border-radius:8px;padding:10px 12px;cursor:pointer;font-weight:600;transition:background 0.2s} .primary-button{margin-top:12px;width:100%;background:#1a73e8;color:#fff} .primary-button:hover{background:#1557b0} .mode-grid{display:grid;grid-template-columns:1fr 1fr;gap:6px} .mode-button{background:#f1f3f4;color:#3c4043;border:1px solid transparent} .mode-button:hover{background:#e8eaed} .mode-button.active{background:#e8f0fe;color:#1a73e8;border:1px solid #1a73e8} .checkbox-row{display:flex;gap:8px;align-items:center;margin-top:12px;color:#3c4043;font-size:14px;cursor:pointer} .stats{display:flex;flex-direction:column;gap:8px} .stat-row{display:flex;justify-content:space-between;gap:12px;color:#5f6368;font-size:13px;align-items:baseline} .stat-row strong{color:#202124;font-family:ui-monospace,monospace} .legend{color:#5f6368;font-size:13px;line-height:1.6} .legend p{margin:8px 0 0} @media (max-width:1100px){.layout{grid-template-columns:1fr}} .legend-grid{display:flex;flex-direction:column;gap:8px;margin-top:12px} .legend-row{display:grid;grid-template-columns:32px 1fr;gap:8px;align-items:center;min-height:22px} /* Layered GIS style CSS equivalents */ .legend-line{display:inline-block;width:28px;height:4px;border-radius:2px;} .express-line{background:#6eb982; border:1px solid #508c64;} .road-line{background:#f5e182; border:1px solid #beaf8c;} /* Fishbone Railway Style */ .rail-line{background:#6e6e6e; height:1.5px; position:relative; border:none; margin-top:2px; border-radius:0} .rail-line::after{content:"";position:absolute;top:-2.5px;left:0;right:0;height:7px;background:repeating-linear-gradient(90deg, transparent, transparent 5px, #6e6e6e 5px, #6e6e6e 6px);} .river-major{background:#a0cdf0; border:none; height:3px;} .old-road-line{background:#fff; border:1px solid #dcdcdc; height:3px; border-top:none;} .legend-swatch{display:inline-block;width:24px;height:14px;border-radius:4px;background:#f5f5f5} .border-swatch{border:2px dashed rgba(110,90,110,1);box-shadow:inset 0 0 0 1px rgba(255,255,255,1), 0 0 0 1px rgba(255,255,255,1)} .cbd-swatch{background:#f0dccd; border:1px solid rgba(0,0,0,0.1)} .legend-icon{display:inline-block;width:14px;height:14px;justify-self:center;border:2px solid #fff;border-radius:50%;box-shadow:0 0 0 1px rgba(0,0,0,0.15)} .city-icon{background:#f06e6e;} .satellite-icon{background:#d75f91;} .station-icon{background:#fff;border-color:#444;} .industry-icon{background:#8caaa0; border-radius:3px;} .castle-icon{background:#b44646; border-radius:3px;} .port-icon{width:0;height:0;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:14px solid #4682c8;border-top:0;box-shadow:none;background:transparent;border-radius:0} .newtown-icon{width:0;height:0;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:14px solid #b4d2f0;border-top:0;box-shadow:none;background:transparent;border-radius:0} .map-tooltip{position:absolute;z-index:20;pointer-events:none;min-width:200px;max-width:280px;background:rgba(255,255,255,0.98);border:1px solid rgba(0,0,0,0.1);border-radius:8px;box-shadow:0 10px 30px rgba(0,0,0,0.1);padding:10px 12px;color:#2c2c2c;font-size:12px;line-height:1.5;opacity:0;transform:translateY(4px);transition:opacity 0.15s ease, transform 0.15s ease;font-weight:500} .map-tooltip.visible{opacity:1;transform:translateY(0)} .generation-progress{position:absolute;inset:24px auto auto 24px;z-index:30;min-width:300px;max-width:440px;background:rgba(255,255,255,0.96);border:1px solid rgba(0,0,0,0.12);border-radius:12px;box-shadow:0 14px 36px rgba(0,0,0,0.14);padding:14px 16px;color:#202124;font-size:13px;line-height:1.5} .generation-progress.hidden{display:none} .progress-title{font-weight:700;margin-bottom:4px} .progress-stage{color:#5f6368;margin-bottom:10px} .progress-timings{display:flex;flex-direction:column;gap:4px;font-family:ui-monospace,monospace;font-size:12px;color:#3c4043} .progress-timing-row{display:flex;justify-content:space-between;gap:16px;border-top:1px solid rgba(0,0,0,0.06);padding-top:4px} .canvas-shell.panning{cursor:grabbing} .canvas-shell.panning .map-canvas{pointer-events:none}