{"version":3,"sources":["../../components/ui/map/adapters/mapbox.ts"],"names":["MAPBOX_STYLES","MAPBOX_CSS_HREF","CSS_LINK_ID","ensureMapboxCss","link","createMapboxAdapter","container","opts","callbacks","mapboxgl","err","styleUrl","map","resolve","msg","isStyle","markers","coords","zoom","sw","ne","appearance","next","enabled","handlers","k","ctl","fopts","popts","list","fbopts","west","south","east","north","lng","lat","c","b","id","anchor","element","e","handle","marker","hovered"],"mappings":"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","file":"mapbox.mjs","sourcesContent":["import type {\n  AdapterFactory,\n  AdapterInstance,\n  Coords,\n  MarkerHandle,\n} from \"../types\";\n\nconst MAPBOX_STYLES: Record<\"light\" | \"dark\" | \"satellite\", string> = {\n  light: \"mapbox://styles/mapbox/light-v11\",\n  dark: \"mapbox://styles/mapbox/dark-v11\",\n  satellite: \"mapbox://styles/mapbox/satellite-streets-v12\",\n};\n\nconst MAPBOX_CSS_HREF = \"https://unpkg.com/mapbox-gl@3/dist/mapbox-gl.css\";\nconst CSS_LINK_ID = \"gds-mapbox-gl-css\";\n\nfunction ensureMapboxCss() {\n  if (typeof document === \"undefined\") return;\n  if (document.getElementById(CSS_LINK_ID)) return;\n  const link = document.createElement(\"link\");\n  link.id = CSS_LINK_ID;\n  link.rel = \"stylesheet\";\n  link.href = MAPBOX_CSS_HREF;\n  document.head.appendChild(link);\n}\n\nexport const createMapboxAdapter: AdapterFactory = async (\n  container,\n  opts,\n  callbacks\n) => {\n  if (!opts.accessToken) {\n    callbacks.onError({\n      code: \"api-key-missing\",\n      message:\n        '@gradeui/ui Map: provider=\"mapbox\" requires an `accessToken` prop.',\n    });\n    throw new Error(\"mapbox accessToken missing\");\n  }\n\n  ensureMapboxCss();\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  let mapboxgl: any;\n  try {\n    mapboxgl = await import(\"mapbox-gl\");\n    if (mapboxgl.default) mapboxgl = mapboxgl.default;\n  } catch (err) {\n    callbacks.onError({\n      code: \"sdk-missing\",\n      message:\n        '@gradeui/ui Map: `mapbox-gl` is not installed. Run `pnpm add mapbox-gl` to use provider=\"mapbox\".',\n      cause: err,\n    });\n    throw err;\n  }\n\n  mapboxgl.accessToken = opts.accessToken;\n\n  const styleUrl = opts.styleUrl ?? MAPBOX_STYLES[opts.appearance];\n\n  const map = new mapboxgl.Map({\n    container,\n    style: styleUrl,\n    center: opts.center,\n    zoom: opts.zoom,\n    interactive: opts.interactive,\n  });\n\n  // Tools — shared vocabulary (types.ts); same shape as the maplibre\n  // adapter: zoom-only navigation control docked to the requested corner.\n  if (opts.tools === \"zoom\" || (opts.tools === \"auto\" && opts.interactive)) {\n    map.addControl(\n      new mapboxgl.NavigationControl({ showCompass: false }),\n      opts.toolsPosition,\n    );\n  }\n\n  if (opts.bounds) {\n    map.fitBounds([opts.bounds[0], opts.bounds[1]], { animate: false });\n  }\n\n  await new Promise<void>((resolve) => {\n    map.once(\"load\", () => resolve());\n  });\n  callbacks.onLoad();\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  map.on(\"error\", (e: any) => {\n    const msg = String(e?.error?.message ?? e?.message ?? \"Mapbox error\");\n    const isStyle = msg.toLowerCase().includes(\"style\");\n    callbacks.onError({\n      code: isStyle ? \"style-load-failed\" : \"tile-load-failed\",\n      message: msg,\n      cause: e?.error ?? e,\n    });\n  });\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  const markers = new globalThis.Map<string, { marker: any; handle: MarkerHandle }>();\n\n  const adapter: AdapterInstance = {\n    setCenter: (coords) => map.setCenter(coords),\n    setZoom: (zoom) => map.setZoom(zoom),\n    setBounds: (sw, ne) => map.fitBounds([sw, ne], { animate: false }),\n    setAppearance: (appearance) => {\n      const next = opts.styleUrl ?? MAPBOX_STYLES[appearance];\n      map.setStyle(next, { diff: false });\n    },\n    setInteractive: (enabled) => {\n      const handlers = [\n        \"scrollZoom\",\n        \"boxZoom\",\n        \"dragRotate\",\n        \"dragPan\",\n        \"keyboard\",\n        \"doubleClickZoom\",\n        \"touchZoomRotate\",\n      ] as const;\n      for (const k of handlers) {\n        const ctl = map[k];\n        if (ctl) (enabled ? ctl.enable() : ctl.disable());\n      }\n    },\n    flyTo: (coords, fopts) =>\n      map.flyTo({\n        center: coords,\n        zoom: fopts?.zoom,\n        duration: fopts?.durationMs ?? 800,\n      }),\n    panTo: (coords, popts) =>\n      map.panTo(coords, { duration: popts?.durationMs ?? 600 }),\n    fitBounds: (list, fbopts) => {\n      if (list.length === 0) return;\n      let west = Infinity,\n        south = Infinity,\n        east = -Infinity,\n        north = -Infinity;\n      for (const [lng, lat] of list) {\n        if (lng < west) west = lng;\n        if (lat < south) south = lat;\n        if (lng > east) east = lng;\n        if (lat > north) north = lat;\n      }\n      map.fitBounds(\n        [\n          [west, south],\n          [east, north],\n        ],\n        {\n          padding: fbopts?.paddingPx ?? 40,\n          duration: fbopts?.durationMs ?? 800,\n        }\n      );\n    },\n    getCenter: () => {\n      const c = map.getCenter();\n      return [c.lng, c.lat];\n    },\n    getZoom: () => map.getZoom(),\n    getBounds: () => {\n      const b = map.getBounds();\n      return [\n        [b.getWest(), b.getSouth()],\n        [b.getEast(), b.getNorth()],\n      ];\n    },\n    addMarker: (id, coords, anchor) => {\n      const element = document.createElement(\"div\");\n      element.dataset.gdsPart = \"map-marker\";\n      element.dataset.gdsState = \"idle\";\n      element.style.cursor = \"pointer\";\n\n      element.addEventListener(\"mouseenter\", () => callbacks.onMarkerHover(id));\n      element.addEventListener(\"mouseleave\", () => callbacks.onMarkerHover(null));\n      element.addEventListener(\"click\", (e) => {\n        callbacks.onMarkerClick(id, handle.coords, e);\n      });\n\n      const marker = new mapboxgl.Marker({\n        element,\n        anchor: anchor === \"center\" ? \"center\" : \"bottom\",\n      })\n        .setLngLat(coords)\n        .addTo(map);\n\n      const handle: MarkerHandle = {\n        element,\n        coords,\n        setHovered: (hovered) => {\n          element.dataset.gdsState = hovered ? \"hovered\" : \"idle\";\n          element.style.zIndex = hovered ? \"10\" : \"1\";\n        },\n        setPosition: (next) => {\n          handle.coords = next;\n          marker.setLngLat(next);\n        },\n        remove: () => {\n          marker.remove();\n          markers.delete(id);\n        },\n      };\n\n      markers.set(id, { marker, handle });\n      return handle;\n    },\n    destroy: () => {\n      markers.forEach(({ marker }) => marker.remove());\n      markers.clear();\n      map.remove();\n    },\n    instance: map,\n  };\n\n  return adapter;\n};\n"]}