@gradeui/ui 3.0.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/ui/button.md +11 -7
- package/components/ui/combobox.md +46 -0
- package/components/ui/data-view.md +59 -0
- package/components/ui/dropdown-menu.md +1 -0
- package/components/ui/logo.md +8 -6
- package/components/ui/map.md +9 -0
- package/components/ui/media-surface.md +1 -0
- package/components/ui/property-list.md +43 -0
- package/components/ui/sidebar.md +2 -1
- package/components/ui/swatch.md +88 -0
- package/dist/contracts.js +6 -6
- package/dist/contracts.js.map +1 -1
- package/dist/contracts.mjs +6 -6
- package/dist/contracts.mjs.map +1 -1
- package/dist/index.d.mts +902 -415
- package/dist/index.d.ts +902 -415
- package/dist/index.js +609 -72
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +609 -72
- package/dist/index.mjs.map +1 -1
- package/dist/map/google.d.mts +1 -1
- package/dist/map/google.d.ts +1 -1
- package/dist/map/google.js +1 -1
- package/dist/map/google.js.map +1 -1
- package/dist/map/google.mjs +1 -1
- package/dist/map/google.mjs.map +1 -1
- package/dist/map/leaflet.d.mts +1 -1
- package/dist/map/leaflet.d.ts +1 -1
- package/dist/map/leaflet.js +2 -2
- package/dist/map/leaflet.js.map +1 -1
- package/dist/map/leaflet.mjs +2 -2
- package/dist/map/leaflet.mjs.map +1 -1
- package/dist/map/mapbox.d.mts +1 -1
- package/dist/map/mapbox.d.ts +1 -1
- package/dist/map/mapbox.js +2 -2
- package/dist/map/mapbox.js.map +1 -1
- package/dist/map/mapbox.mjs +2 -2
- package/dist/map/mapbox.mjs.map +1 -1
- package/dist/map/maplibre.d.mts +1 -1
- package/dist/map/maplibre.d.ts +1 -1
- package/dist/map/maplibre.js +1 -1
- package/dist/map/maplibre.js.map +1 -1
- package/dist/map/maplibre.mjs +1 -1
- package/dist/map/maplibre.mjs.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/{types-BxywIwvG.d.mts → types-B45Uirkp.d.mts} +23 -0
- package/dist/{types-BxywIwvG.d.ts → types-B45Uirkp.d.ts} +23 -0
- package/package.json +2 -1
- package/styles/globals.css +306 -95
package/dist/map/mapbox.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"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.js","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 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"]}
|
|
1
|
+
{"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.js","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"]}
|
package/dist/map/mapbox.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
var p={light:"mapbox://styles/mapbox/light-v11",dark:"mapbox://styles/mapbox/dark-v11",satellite:"mapbox://styles/mapbox/satellite-streets-v12"},
|
|
3
|
-
export{
|
|
2
|
+
var p={light:"mapbox://styles/mapbox/light-v11",dark:"mapbox://styles/mapbox/dark-v11",satellite:"mapbox://styles/mapbox/satellite-streets-v12"},h="https://unpkg.com/mapbox-gl@3/dist/mapbox-gl.css",f="gds-mapbox-gl-css";function k(){if(typeof document>"u"||document.getElementById(f))return;let m=document.createElement("link");m.id=f,m.rel="stylesheet",m.href=h,document.head.appendChild(m);}var b=async(m,r,l)=>{if(!r.accessToken)throw l.onError({code:"api-key-missing",message:'@gradeui/ui Map: provider="mapbox" requires an `accessToken` prop.'}),new Error("mapbox accessToken missing");k();let d;try{d=await import('mapbox-gl'),d.default&&(d=d.default);}catch(e){throw l.onError({code:"sdk-missing",message:'@gradeui/ui Map: `mapbox-gl` is not installed. Run `pnpm add mapbox-gl` to use provider="mapbox".',cause:e}),e}d.accessToken=r.accessToken;let y=r.styleUrl??p[r.appearance],o=new d.Map({container:m,style:y,center:r.center,zoom:r.zoom,interactive:r.interactive});(r.tools==="zoom"||r.tools==="auto"&&r.interactive)&&o.addControl(new d.NavigationControl({showCompass:false}),r.toolsPosition),r.bounds&&o.fitBounds([r.bounds[0],r.bounds[1]],{animate:false}),await new Promise(e=>{o.once("load",()=>e());}),l.onLoad(),o.on("error",e=>{let t=String(e?.error?.message??e?.message??"Mapbox error"),s=t.toLowerCase().includes("style");l.onError({code:s?"style-load-failed":"tile-load-failed",message:t,cause:e?.error??e});});let u=new globalThis.Map;return {setCenter:e=>o.setCenter(e),setZoom:e=>o.setZoom(e),setBounds:(e,t)=>o.fitBounds([e,t],{animate:false}),setAppearance:e=>{let t=r.styleUrl??p[e];o.setStyle(t,{diff:false});},setInteractive:e=>{let t=["scrollZoom","boxZoom","dragRotate","dragPan","keyboard","doubleClickZoom","touchZoomRotate"];for(let s of t){let n=o[s];n&&(e?n.enable():n.disable());}},flyTo:(e,t)=>o.flyTo({center:e,zoom:t?.zoom,duration:t?.durationMs??800}),panTo:(e,t)=>o.panTo(e,{duration:t?.durationMs??600}),fitBounds:(e,t)=>{if(e.length===0)return;let s=1/0,n=1/0,c=-1/0,i=-1/0;for(let[a,g]of e)a<s&&(s=a),g<n&&(n=g),a>c&&(c=a),g>i&&(i=g);o.fitBounds([[s,n],[c,i]],{padding:t?.paddingPx??40,duration:t?.durationMs??800});},getCenter:()=>{let e=o.getCenter();return [e.lng,e.lat]},getZoom:()=>o.getZoom(),getBounds:()=>{let e=o.getBounds();return [[e.getWest(),e.getSouth()],[e.getEast(),e.getNorth()]]},addMarker:(e,t,s)=>{let n=document.createElement("div");n.dataset.gdsPart="map-marker",n.dataset.gdsState="idle",n.style.cursor="pointer",n.addEventListener("mouseenter",()=>l.onMarkerHover(e)),n.addEventListener("mouseleave",()=>l.onMarkerHover(null)),n.addEventListener("click",a=>{l.onMarkerClick(e,i.coords,a);});let c=new d.Marker({element:n,anchor:s==="center"?"center":"bottom"}).setLngLat(t).addTo(o),i={element:n,coords:t,setHovered:a=>{n.dataset.gdsState=a?"hovered":"idle",n.style.zIndex=a?"10":"1";},setPosition:a=>{i.coords=a,c.setLngLat(a);},remove:()=>{c.remove(),u.delete(e);}};return u.set(e,{marker:c,handle:i}),i},destroy:()=>{u.forEach(({marker:e})=>e.remove()),u.clear(),o.remove();},instance:o}};
|
|
3
|
+
export{b as createMapboxAdapter};//# sourceMappingURL=mapbox.mjs.map
|
|
4
4
|
//# sourceMappingURL=mapbox.mjs.map
|
package/dist/map/mapbox.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"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 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"]}
|
|
1
|
+
{"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":"AAOA,IAAMA,CAAAA,CAAgE,CACpE,KAAA,CAAO,kCAAA,CACP,KAAM,iCAAA,CACN,SAAA,CAAW,8CACb,CAAA,CAEMC,EAAkB,kDAAA,CAClBC,CAAAA,CAAc,mBAAA,CAEpB,SAASC,GAAkB,CAEzB,GADI,OAAO,QAAA,CAAa,KACpB,QAAA,CAAS,cAAA,CAAeD,CAAW,CAAA,CAAG,OAC1C,IAAME,CAAAA,CAAO,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA,CAC1CA,CAAAA,CAAK,EAAA,CAAKF,CAAAA,CACVE,EAAK,GAAA,CAAM,YAAA,CACXA,CAAAA,CAAK,IAAA,CAAOH,CAAAA,CACZ,QAAA,CAAS,IAAA,CAAK,WAAA,CAAYG,CAAI,EAChC,CAEO,IAAMC,CAAAA,CAAsC,MACjDC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,GACG,CACH,GAAI,CAACD,CAAAA,CAAK,WAAA,CACR,MAAAC,EAAU,OAAA,CAAQ,CAChB,IAAA,CAAM,iBAAA,CACN,QACE,oEACJ,CAAC,CAAA,CACK,IAAI,MAAM,4BAA4B,CAAA,CAG9CL,CAAAA,EAAgB,CAGhB,IAAIM,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAW,MAAM,OAAO,WAAW,CAAA,CAC/BA,EAAS,OAAA,GAASA,CAAAA,CAAWA,CAAAA,CAAS,OAAA,EAC5C,OAASC,CAAAA,CAAK,CACZ,MAAAF,CAAAA,CAAU,QAAQ,CAChB,IAAA,CAAM,aAAA,CACN,OAAA,CACE,oGACF,KAAA,CAAOE,CACT,CAAC,CAAA,CACKA,CACR,CAEAD,CAAAA,CAAS,WAAA,CAAcF,CAAAA,CAAK,YAE5B,IAAMI,CAAAA,CAAWJ,CAAAA,CAAK,QAAA,EAAYP,EAAcO,CAAAA,CAAK,UAAU,CAAA,CAEzDK,CAAAA,CAAM,IAAIH,CAAAA,CAAS,GAAA,CAAI,CAC3B,UAAAH,CAAAA,CACA,KAAA,CAAOK,CAAAA,CACP,MAAA,CAAQJ,EAAK,MAAA,CACb,IAAA,CAAMA,CAAAA,CAAK,IAAA,CACX,YAAaA,CAAAA,CAAK,WACpB,CAAC,CAAA,CAAA,CAIGA,EAAK,KAAA,GAAU,MAAA,EAAWA,CAAAA,CAAK,KAAA,GAAU,QAAUA,CAAAA,CAAK,WAAA,GAC1DK,CAAAA,CAAI,UAAA,CACF,IAAIH,CAAAA,CAAS,iBAAA,CAAkB,CAAE,WAAA,CAAa,KAAM,CAAC,CAAA,CACrDF,CAAAA,CAAK,aACP,CAAA,CAGEA,CAAAA,CAAK,MAAA,EACPK,CAAAA,CAAI,UAAU,CAACL,CAAAA,CAAK,MAAA,CAAO,CAAC,EAAGA,CAAAA,CAAK,MAAA,CAAO,CAAC,CAAC,EAAG,CAAE,OAAA,CAAS,KAAM,CAAC,EAGpE,MAAM,IAAI,OAAA,CAAeM,CAAAA,EAAY,CACnCD,CAAAA,CAAI,IAAA,CAAK,MAAA,CAAQ,IAAMC,GAAS,EAClC,CAAC,CAAA,CACDL,EAAU,MAAA,EAAO,CAGjBI,CAAAA,CAAI,EAAA,CAAG,OAAA,CAAU,CAAA,EAAW,CAC1B,IAAME,EAAM,MAAA,CAAO,CAAA,EAAG,KAAA,EAAO,OAAA,EAAW,GAAG,OAAA,EAAW,cAAc,CAAA,CAC9DC,CAAAA,CAAUD,EAAI,WAAA,EAAY,CAAE,QAAA,CAAS,OAAO,EAClDN,CAAAA,CAAU,OAAA,CAAQ,CAChB,IAAA,CAAMO,EAAU,mBAAA,CAAsB,kBAAA,CACtC,OAAA,CAASD,CAAAA,CACT,MAAO,CAAA,EAAG,KAAA,EAAS,CACrB,CAAC,EACH,CAAC,CAAA,CAGD,IAAME,CAAAA,CAAU,IAAI,UAAA,CAAW,GAAA,CAmH/B,OAjHiC,CAC/B,SAAA,CAAYC,CAAAA,EAAWL,CAAAA,CAAI,SAAA,CAAUK,CAAM,CAAA,CAC3C,OAAA,CAAUC,CAAAA,EAASN,CAAAA,CAAI,QAAQM,CAAI,CAAA,CACnC,SAAA,CAAW,CAACC,EAAIC,CAAAA,GAAOR,CAAAA,CAAI,SAAA,CAAU,CAACO,EAAIC,CAAE,CAAA,CAAG,CAAE,OAAA,CAAS,KAAM,CAAC,CAAA,CACjE,aAAA,CAAgBC,CAAAA,EAAe,CAC7B,IAAMC,CAAAA,CAAOf,CAAAA,CAAK,QAAA,EAAYP,EAAcqB,CAAU,CAAA,CACtDT,CAAAA,CAAI,QAAA,CAASU,EAAM,CAAE,IAAA,CAAM,KAAM,CAAC,EACpC,CAAA,CACA,cAAA,CAAiBC,CAAAA,EAAY,CAC3B,IAAMC,CAAAA,CAAW,CACf,YAAA,CACA,SAAA,CACA,aACA,SAAA,CACA,UAAA,CACA,iBAAA,CACA,iBACF,EACA,IAAA,IAAWC,CAAAA,IAAKD,CAAAA,CAAU,CACxB,IAAME,CAAAA,CAAMd,CAAAA,CAAIa,CAAC,CAAA,CACbC,IAAMH,CAAAA,CAAUG,CAAAA,CAAI,MAAA,EAAO,CAAIA,CAAAA,CAAI,OAAA,EAAQ,EACjD,CACF,EACA,KAAA,CAAO,CAACT,CAAAA,CAAQU,CAAAA,GACdf,EAAI,KAAA,CAAM,CACR,MAAA,CAAQK,CAAAA,CACR,KAAMU,CAAAA,EAAO,IAAA,CACb,QAAA,CAAUA,CAAAA,EAAO,YAAc,GACjC,CAAC,CAAA,CACH,KAAA,CAAO,CAACV,CAAAA,CAAQW,CAAAA,GACdhB,CAAAA,CAAI,KAAA,CAAMK,EAAQ,CAAE,QAAA,CAAUW,CAAAA,EAAO,UAAA,EAAc,GAAI,CAAC,CAAA,CAC1D,SAAA,CAAW,CAACC,CAAAA,CAAMC,CAAAA,GAAW,CAC3B,GAAID,EAAK,MAAA,GAAW,CAAA,CAAG,OACvB,IAAIE,EAAO,CAAA,CAAA,CAAA,CACTC,CAAAA,CAAQ,CAAA,CAAA,CAAA,CACRC,CAAAA,CAAO,KACPC,CAAAA,CAAQ,EAAA,CAAA,CAAA,CACV,IAAA,GAAW,CAACC,EAAKC,CAAG,CAAA,GAAKP,CAAAA,CACnBM,CAAAA,CAAMJ,IAAMA,CAAAA,CAAOI,CAAAA,CAAAA,CACnBC,CAAAA,CAAMJ,CAAAA,GAAOA,EAAQI,CAAAA,CAAAA,CACrBD,CAAAA,CAAMF,CAAAA,GAAMA,CAAAA,CAAOE,GACnBC,CAAAA,CAAMF,CAAAA,GAAOA,CAAAA,CAAQE,CAAAA,CAAAA,CAE3BxB,CAAAA,CAAI,SAAA,CACF,CACE,CAACmB,EAAMC,CAAK,CAAA,CACZ,CAACC,CAAAA,CAAMC,CAAK,CACd,CAAA,CACA,CACE,OAAA,CAASJ,GAAQ,SAAA,EAAa,EAAA,CAC9B,QAAA,CAAUA,CAAAA,EAAQ,YAAc,GAClC,CACF,EACF,CAAA,CACA,UAAW,IAAM,CACf,IAAMO,CAAAA,CAAIzB,EAAI,SAAA,EAAU,CACxB,OAAO,CAACyB,EAAE,GAAA,CAAKA,CAAAA,CAAE,GAAG,CACtB,CAAA,CACA,OAAA,CAAS,IAAMzB,CAAAA,CAAI,SAAQ,CAC3B,SAAA,CAAW,IAAM,CACf,IAAM0B,CAAAA,CAAI1B,CAAAA,CAAI,SAAA,EAAU,CACxB,OAAO,CACL,CAAC0B,CAAAA,CAAE,OAAA,GAAWA,CAAAA,CAAE,QAAA,EAAU,CAAA,CAC1B,CAACA,CAAAA,CAAE,OAAA,EAAQ,CAAGA,CAAAA,CAAE,UAAU,CAC5B,CACF,CAAA,CACA,UAAW,CAACC,CAAAA,CAAItB,CAAAA,CAAQuB,CAAAA,GAAW,CACjC,IAAMC,CAAAA,CAAU,QAAA,CAAS,cAAc,KAAK,CAAA,CAC5CA,CAAAA,CAAQ,OAAA,CAAQ,QAAU,YAAA,CAC1BA,CAAAA,CAAQ,OAAA,CAAQ,QAAA,CAAW,OAC3BA,CAAAA,CAAQ,KAAA,CAAM,MAAA,CAAS,SAAA,CAEvBA,EAAQ,gBAAA,CAAiB,YAAA,CAAc,IAAMjC,CAAAA,CAAU,cAAc+B,CAAE,CAAC,CAAA,CACxEE,CAAAA,CAAQ,iBAAiB,YAAA,CAAc,IAAMjC,CAAAA,CAAU,aAAA,CAAc,IAAI,CAAC,CAAA,CAC1EiC,CAAAA,CAAQ,gBAAA,CAAiB,OAAA,CAAUC,CAAAA,EAAM,CACvClC,CAAAA,CAAU,cAAc+B,CAAAA,CAAII,CAAAA,CAAO,MAAA,CAAQD,CAAC,EAC9C,CAAC,CAAA,CAED,IAAME,CAAAA,CAAS,IAAInC,CAAAA,CAAS,MAAA,CAAO,CACjC,OAAA,CAAAgC,EACA,MAAA,CAAQD,CAAAA,GAAW,QAAA,CAAW,QAAA,CAAW,QAC3C,CAAC,CAAA,CACE,SAAA,CAAUvB,CAAM,EAChB,KAAA,CAAML,CAAG,CAAA,CAEN+B,CAAAA,CAAuB,CAC3B,OAAA,CAAAF,CAAAA,CACA,MAAA,CAAAxB,CAAAA,CACA,UAAA,CAAa4B,CAAAA,EAAY,CACvBJ,CAAAA,CAAQ,QAAQ,QAAA,CAAWI,CAAAA,CAAU,SAAA,CAAY,MAAA,CACjDJ,EAAQ,KAAA,CAAM,MAAA,CAASI,CAAAA,CAAU,IAAA,CAAO,IAC1C,CAAA,CACA,WAAA,CAAcvB,CAAAA,EAAS,CACrBqB,EAAO,MAAA,CAASrB,CAAAA,CAChBsB,CAAAA,CAAO,SAAA,CAAUtB,CAAI,EACvB,CAAA,CACA,MAAA,CAAQ,IAAM,CACZsB,CAAAA,CAAO,MAAA,EAAO,CACd5B,CAAAA,CAAQ,OAAOuB,CAAE,EACnB,CACF,CAAA,CAEA,OAAAvB,CAAAA,CAAQ,GAAA,CAAIuB,CAAAA,CAAI,CAAE,OAAAK,CAAAA,CAAQ,MAAA,CAAAD,CAAO,CAAC,EAC3BA,CACT,CAAA,CACA,OAAA,CAAS,IAAM,CACb3B,CAAAA,CAAQ,OAAA,CAAQ,CAAC,CAAE,OAAA4B,CAAO,CAAA,GAAMA,CAAAA,CAAO,MAAA,EAAQ,CAAA,CAC/C5B,CAAAA,CAAQ,KAAA,EAAM,CACdJ,EAAI,MAAA,GACN,CAAA,CACA,QAAA,CAAUA,CACZ,CAGF","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"]}
|
package/dist/map/maplibre.d.mts
CHANGED
package/dist/map/maplibre.d.ts
CHANGED
package/dist/map/maplibre.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
'use strict';var p="2pMfyvhpuKonkf7h8HzH",y=()=>p.length>0;var k={light:"dataviz-light",dark:"dataviz-dark",satellite:"satellite"},h=(i,
|
|
2
|
+
'use strict';var p="2pMfyvhpuKonkf7h8HzH",y=()=>p.length>0;var k={light:"dataviz-light",dark:"dataviz-dark",satellite:"satellite"},h=(i,n)=>`https://api.maptiler.com/maps/${k[i]}/style.json?key=${encodeURIComponent(n)}`,v="https://unpkg.com/maplibre-gl@4/dist/maplibre-gl.css",E="gds-maplibre-gl-css";function b(){if(typeof document>"u"||document.getElementById(E))return;let i=document.createElement("link");i.id=E,i.rel="stylesheet",i.href=v,document.head.appendChild(i);}var R=async(i,n,m)=>{b();let l;try{l=await import('maplibre-gl'),l.default&&(l=l.default);}catch(e){throw m.onError({code:"sdk-missing",message:'@gradeui/ui Map: `maplibre-gl` is not installed. Run `pnpm add maplibre-gl` (or your package manager\'s equivalent) to use provider="maplibre".',cause:e}),e}let f=n.tilerKey??p;process.env.NODE_ENV!=="production"&&!n.tilerKey&&!y()&&console.warn("@gradeui/ui Map: no `tilerKey` prop and the bundled MapTiler demo key is unset. Tile requests will 403. Set `tilerKey` or paste a key into demo-config.ts.");let M=n.styleUrl??h(n.appearance,f),r=new l.Map({container:i,style:M,center:n.center,zoom:n.zoom,interactive:n.interactive,attributionControl:{compact:true}});(n.tools==="zoom"||n.tools==="auto"&&n.interactive)&&r.addControl(new l.NavigationControl({showCompass:false}),n.toolsPosition),n.bounds&&r.fitBounds([n.bounds[0],n.bounds[1]],{animate:false}),await new Promise(e=>{r.once("load",()=>e());}),m.onLoad(),r.on("error",e=>{let t=String(e?.error?.message??e?.message??"MapLibre error"),s=t.toLowerCase().includes("style");m.onError({code:s?"style-load-failed":"tile-load-failed",message:t,cause:e?.error??e});});let u=new globalThis.Map;return {setCenter:e=>r.setCenter(e),setZoom:e=>r.setZoom(e),setBounds:(e,t)=>r.fitBounds([e,t],{animate:false}),setAppearance:e=>{let t=n.styleUrl??h(e,f);r.setStyle(t,{diff:false});},setInteractive:e=>{let t=["scrollZoom","boxZoom","dragRotate","dragPan","keyboard","doubleClickZoom","touchZoomRotate"];for(let s of t){let o=r[s];o&&(e?o.enable():o.disable());}},flyTo:(e,t)=>r.flyTo({center:e,zoom:t?.zoom,duration:t?.durationMs??800}),panTo:(e,t)=>r.panTo(e,{duration:t?.durationMs??600}),fitBounds:(e,t)=>{if(e.length===0)return;let s=1/0,o=1/0,c=-1/0,d=-1/0;for(let[a,g]of e)a<s&&(s=a),g<o&&(o=g),a>c&&(c=a),g>d&&(d=g);r.fitBounds([[s,o],[c,d]],{padding:t?.paddingPx??40,duration:t?.durationMs??800});},getCenter:()=>{let e=r.getCenter();return [e.lng,e.lat]},getZoom:()=>r.getZoom(),getBounds:()=>{let e=r.getBounds();return [[e.getWest(),e.getSouth()],[e.getEast(),e.getNorth()]]},addMarker:(e,t,s)=>{let o=document.createElement("div");o.dataset.gdsPart="map-marker",o.dataset.gdsState="idle",o.style.cursor="pointer",o.addEventListener("mouseenter",()=>m.onMarkerHover(e)),o.addEventListener("mouseleave",()=>m.onMarkerHover(null)),o.addEventListener("click",a=>{m.onMarkerClick(e,d.coords,a);});let c=new l.Marker({element:o,anchor:s==="center"?"center":"bottom"}).setLngLat(t).addTo(r),d={element:o,coords:t,setHovered:a=>{o.dataset.gdsState=a?"hovered":"idle",o.style.zIndex=a?"10":"1";},setPosition:a=>{d.coords=a,c.setLngLat(a);},remove:()=>{c.remove(),u.delete(e);}};return u.set(e,{marker:c,handle:d}),d},destroy:()=>{u.forEach(({marker:e})=>e.remove()),u.clear(),r.remove();},instance:r}};
|
|
3
3
|
exports.createMaplibreAdapter=R;//# sourceMappingURL=maplibre.js.map
|
|
4
4
|
//# sourceMappingURL=maplibre.js.map
|
package/dist/map/maplibre.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"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.js","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 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"]}
|
|
1
|
+
{"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.js","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"]}
|
package/dist/map/maplibre.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
var p="2pMfyvhpuKonkf7h8HzH",y=()=>p.length>0;var k={light:"dataviz-light",dark:"dataviz-dark",satellite:"satellite"},h=(i,
|
|
2
|
+
var p="2pMfyvhpuKonkf7h8HzH",y=()=>p.length>0;var k={light:"dataviz-light",dark:"dataviz-dark",satellite:"satellite"},h=(i,n)=>`https://api.maptiler.com/maps/${k[i]}/style.json?key=${encodeURIComponent(n)}`,v="https://unpkg.com/maplibre-gl@4/dist/maplibre-gl.css",E="gds-maplibre-gl-css";function b(){if(typeof document>"u"||document.getElementById(E))return;let i=document.createElement("link");i.id=E,i.rel="stylesheet",i.href=v,document.head.appendChild(i);}var R=async(i,n,m)=>{b();let l;try{l=await import('maplibre-gl'),l.default&&(l=l.default);}catch(e){throw m.onError({code:"sdk-missing",message:'@gradeui/ui Map: `maplibre-gl` is not installed. Run `pnpm add maplibre-gl` (or your package manager\'s equivalent) to use provider="maplibre".',cause:e}),e}let f=n.tilerKey??p;process.env.NODE_ENV!=="production"&&!n.tilerKey&&!y()&&console.warn("@gradeui/ui Map: no `tilerKey` prop and the bundled MapTiler demo key is unset. Tile requests will 403. Set `tilerKey` or paste a key into demo-config.ts.");let M=n.styleUrl??h(n.appearance,f),r=new l.Map({container:i,style:M,center:n.center,zoom:n.zoom,interactive:n.interactive,attributionControl:{compact:true}});(n.tools==="zoom"||n.tools==="auto"&&n.interactive)&&r.addControl(new l.NavigationControl({showCompass:false}),n.toolsPosition),n.bounds&&r.fitBounds([n.bounds[0],n.bounds[1]],{animate:false}),await new Promise(e=>{r.once("load",()=>e());}),m.onLoad(),r.on("error",e=>{let t=String(e?.error?.message??e?.message??"MapLibre error"),s=t.toLowerCase().includes("style");m.onError({code:s?"style-load-failed":"tile-load-failed",message:t,cause:e?.error??e});});let u=new globalThis.Map;return {setCenter:e=>r.setCenter(e),setZoom:e=>r.setZoom(e),setBounds:(e,t)=>r.fitBounds([e,t],{animate:false}),setAppearance:e=>{let t=n.styleUrl??h(e,f);r.setStyle(t,{diff:false});},setInteractive:e=>{let t=["scrollZoom","boxZoom","dragRotate","dragPan","keyboard","doubleClickZoom","touchZoomRotate"];for(let s of t){let o=r[s];o&&(e?o.enable():o.disable());}},flyTo:(e,t)=>r.flyTo({center:e,zoom:t?.zoom,duration:t?.durationMs??800}),panTo:(e,t)=>r.panTo(e,{duration:t?.durationMs??600}),fitBounds:(e,t)=>{if(e.length===0)return;let s=1/0,o=1/0,c=-1/0,d=-1/0;for(let[a,g]of e)a<s&&(s=a),g<o&&(o=g),a>c&&(c=a),g>d&&(d=g);r.fitBounds([[s,o],[c,d]],{padding:t?.paddingPx??40,duration:t?.durationMs??800});},getCenter:()=>{let e=r.getCenter();return [e.lng,e.lat]},getZoom:()=>r.getZoom(),getBounds:()=>{let e=r.getBounds();return [[e.getWest(),e.getSouth()],[e.getEast(),e.getNorth()]]},addMarker:(e,t,s)=>{let o=document.createElement("div");o.dataset.gdsPart="map-marker",o.dataset.gdsState="idle",o.style.cursor="pointer",o.addEventListener("mouseenter",()=>m.onMarkerHover(e)),o.addEventListener("mouseleave",()=>m.onMarkerHover(null)),o.addEventListener("click",a=>{m.onMarkerClick(e,d.coords,a);});let c=new l.Marker({element:o,anchor:s==="center"?"center":"bottom"}).setLngLat(t).addTo(r),d={element:o,coords:t,setHovered:a=>{o.dataset.gdsState=a?"hovered":"idle",o.style.zIndex=a?"10":"1";},setPosition:a=>{d.coords=a,c.setLngLat(a);},remove:()=>{c.remove(),u.delete(e);}};return u.set(e,{marker:c,handle:d}),d},destroy:()=>{u.forEach(({marker:e})=>e.remove()),u.clear(),r.remove();},instance:r}};
|
|
3
3
|
export{R as createMaplibreAdapter};//# sourceMappingURL=maplibre.mjs.map
|
|
4
4
|
//# sourceMappingURL=maplibre.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"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 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"]}
|
|
1
|
+
{"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"]}
|