{"version":3,"sources":["../../components/ui/map/demo-config.ts","../../components/ui/map/adapters/maplibre.ts"],"names":["GRADE_DEMO_MAPTILER_KEY","isDemoKeyConfigured","MAPTILER_STYLES","buildMaptilerStyleUrl","appearance","key","MAPLIBRE_CSS_HREF","CSS_LINK_ID","ensureMaplibreCss","link","createMaplibreAdapter","container","opts","callbacks","maplibregl","err","tilerKey","styleUrl","map","resolve","msg","isStyle","markers","coords","zoom","sw","ne","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":"maplibre.mjs","sourcesContent":["/**\n * Public, referrer-locked MapTiler API key for the @gradeui/ui demo.\n *\n * This key is intentionally hard-coded and ships in the published bundle.\n * Safety comes from MapTiler's referrer restriction — the key only works\n * for requests originating from `gradeui.com`, `*.gradeui.com`, and\n * `localhost`. Outside those origins MapTiler returns 403 and the\n * adapter emits `onError({ code: \"tile-load-failed\", ... })`.\n *\n * Consumers using `<Map provider=\"maplibre\">` from any other domain\n * MUST supply their own MapTiler key via the `tilerKey` prop:\n *\n *   <Map provider=\"maplibre\" tilerKey={env.MAPTILER_KEY} ... />\n *\n * Rotating: replace the value below, run `pnpm changeset` (patch bump),\n * publish. No env vars, no CI secrets, one-line PR.\n *\n * Setup checklist when registering the key:\n *   1. Create a MapTiler account (free tier — 100k req/mo).\n *   2. Dashboard → Account → Keys → Create new key.\n *   3. Set \"Allowed origins\" — MapTiler wants BARE HOSTNAMES (not full URLs;\n *      no protocol, no port). Add each on its own line:\n *        - localhost\n *        - 127.0.0.1\n *        - gradeui.com\n *        - *.gradeui.com\n *   4. Paste below, replacing `YOUR_KEY_HERE`.\n *   5. Commit + changeset.\n */\n// Annotated as `string` (not the inferred literal type) so the runtime\n// comparisons in `isDemoKeyConfigured` aren't flagged by TypeScript as\n// tautologies. Without this, `KEY !== \"YOUR_KEY_HERE\"` narrows to a\n// constant boolean at compile time.\nexport const GRADE_DEMO_MAPTILER_KEY: string = \"2pMfyvhpuKonkf7h8HzH\";\n\n/**\n * Whether the demo key has actually been pasted in (vs left as the\n * `YOUR_KEY_HERE` placeholder). Used by the adapter to emit a\n * dev-only console warning when the placeholder is detected.\n */\nexport const isDemoKeyConfigured = (): boolean =>\n  GRADE_DEMO_MAPTILER_KEY !== \"YOUR_KEY_HERE\" && GRADE_DEMO_MAPTILER_KEY.length > 0;\n","import type {\n  AdapterFactory,\n  AdapterInstance,\n  Coords,\n  MarkerHandle,\n} from \"../types\";\nimport { GRADE_DEMO_MAPTILER_KEY, isDemoKeyConfigured } from \"../demo-config\";\n\nconst MAPTILER_STYLES: Record<\"light\" | \"dark\" | \"satellite\", string> = {\n  light: \"dataviz-light\",\n  dark: \"dataviz-dark\",\n  satellite: \"satellite\",\n};\n\nconst buildMaptilerStyleUrl = (\n  appearance: \"light\" | \"dark\" | \"satellite\",\n  key: string\n): string =>\n  `https://api.maptiler.com/maps/${MAPTILER_STYLES[appearance]}/style.json?key=${encodeURIComponent(key)}`;\n\nconst MAPLIBRE_CSS_HREF = \"https://unpkg.com/maplibre-gl@4/dist/maplibre-gl.css\";\nconst CSS_LINK_ID = \"gds-maplibre-gl-css\";\n\nfunction ensureMaplibreCss() {\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 = MAPLIBRE_CSS_HREF;\n  document.head.appendChild(link);\n}\n\nexport const createMaplibreAdapter: AdapterFactory = async (\n  container,\n  opts,\n  callbacks\n) => {\n  ensureMaplibreCss();\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  let maplibregl: any;\n  try {\n    maplibregl = await import(\"maplibre-gl\");\n    // ESM/CJS interop\n    if (maplibregl.default) maplibregl = maplibregl.default;\n  } catch (err) {\n    callbacks.onError({\n      code: \"sdk-missing\",\n      message:\n        '@gradeui/ui Map: `maplibre-gl` is not installed. Run `pnpm add maplibre-gl` (or your package manager\\'s equivalent) to use provider=\"maplibre\".',\n      cause: err,\n    });\n    throw err;\n  }\n\n  const tilerKey = opts.tilerKey ?? GRADE_DEMO_MAPTILER_KEY;\n\n  if (\n    process.env.NODE_ENV !== \"production\" &&\n    !opts.tilerKey &&\n    !isDemoKeyConfigured()\n  ) {\n    // eslint-disable-next-line no-console\n    console.warn(\n      \"@gradeui/ui Map: no `tilerKey` prop and the bundled MapTiler demo key is unset. \" +\n        \"Tile requests will 403. Set `tilerKey` or paste a key into demo-config.ts.\"\n    );\n  }\n\n  const styleUrl = opts.styleUrl ?? buildMaptilerStyleUrl(opts.appearance, tilerKey);\n\n  const map = new maplibregl.Map({\n    container,\n    style: styleUrl,\n    center: opts.center,\n    zoom: opts.zoom,\n    interactive: opts.interactive,\n    attributionControl: { compact: true },\n  });\n\n  // Tools — shared vocabulary (types.ts). MapLibre had NO zoom buttons\n  // before this (scroll/pinch only); \"auto\"/\"zoom\" now adds the\n  // navigation control (zoom only, no compass — rotation isn't part of\n  // the Grade map contract) docked to the requested corner, which\n  // MapLibre takes verbatim.\n  if (opts.tools === \"zoom\" || (opts.tools === \"auto\" && opts.interactive)) {\n    map.addControl(\n      new maplibregl.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 ?? \"MapLibre 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 ?? buildMaptilerStyleUrl(appearance, tilerKey);\n      // setStyle keeps existing markers (they're not source-attached).\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 maplibregl.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"]}