// map.jsx — stylized offline neighborhood map + category pins. Exported to window. function MapTiles({ dark }) { // palette const land = dark ? '#0C1422' : '#E7ECF3'; const block = dark ? '#121C2E' : '#EFF3F8'; const blockStroke = dark ? '#1A2840' : '#E0E6EF'; const park = dark ? '#13301F' : '#D8EEDD'; const water = dark ? '#0E2440' : '#CCDFF5'; const road = dark ? '#26344F' : '#FFFFFF'; const roadEdge = dark ? '#1A2740' : '#E4EAF2'; const major = dark ? '#2E3F60' : '#FCE9C7'; const majorEdge = dark ? '#3A4E76' : '#F2D49A'; return ( {/* city blocks */} {/* park + water */} {/* roads — casing then fill */} {/* major boulevard (diagonal) */} {/* horizontal main */} {/* vertical main */} {/* secondary streets */} {/* roundabout */} ); } // rounded-square category pin function MapPin({ report, selected, onClick, scale = 1 }) { const c = CATS[report.cat] || CATS.lainnya; const done = report.status === 'selesai'; const sz = 30 * scale; return ( ); } function UserDot() { return ( ); } // Full map surface with pins function GsMap({ reports, selectedId, onSelect, dark, vignette = false, showUser = false, onBlank, style = {} }) { return (
onBlank && onBlank()} style={{ position: 'relative', width: '100%', height: '100%', overflow: 'hidden', background: dark ? '#0C1422' : '#E7ECF3', ...style }}> {showUser && } {reports.map(r => ( ))} {vignette && (
)}
); } Object.assign(window, { GsMap, MapTiles, MapPin });