@gradeui/ui 0.10.0 → 1.0.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/accordion.md +1 -1
- package/components/ui/ai-chat-composer.md +37 -0
- package/components/ui/ai-chat.md +68 -22
- package/components/ui/alert.md +0 -21
- package/components/ui/app-shell.md +135 -18
- package/components/ui/avatar.md +12 -1
- package/components/ui/badge.md +2 -2
- package/components/ui/breadcrumb.md +49 -2
- package/components/ui/button.md +35 -3
- package/components/ui/calendar.md +1 -1
- package/components/ui/callout.md +45 -0
- package/components/ui/card.md +16 -1
- package/components/ui/carousel.md +56 -0
- package/components/ui/chart.md +1 -1
- package/components/ui/checkbox.md +1 -0
- package/components/ui/collapsible.md +1 -1
- package/components/ui/command.md +1 -1
- package/components/ui/date-picker.md +1 -1
- package/components/ui/dialog.md +13 -2
- package/components/ui/dropdown-menu.md +7 -1
- package/components/ui/flex.md +1 -1
- package/components/ui/grid.md +1 -1
- package/components/ui/hover-card.md +1 -1
- package/components/ui/input.md +1 -1
- package/components/ui/label.md +1 -0
- package/components/ui/map.md +2 -2
- package/components/ui/media-surface.md +50 -7
- package/components/ui/multi-select.md +114 -0
- package/components/ui/popover.md +8 -1
- package/components/ui/progress.md +1 -0
- package/components/ui/radio-group.md +1 -1
- package/components/ui/resizable.md +1 -1
- package/components/ui/row.md +1 -1
- package/components/ui/scroll-area.md +1 -1
- package/components/ui/select.md +1 -1
- package/components/ui/separator.md +1 -1
- package/components/ui/sheet.md +7 -1
- package/components/ui/side-menu.md +0 -40
- package/components/ui/sidebar.md +121 -0
- package/components/ui/simple-tabs.md +0 -27
- package/components/ui/skeleton.md +1 -1
- package/components/ui/slider.md +1 -1
- package/components/ui/sortable.md +101 -0
- package/components/ui/stack.md +19 -1
- package/components/ui/switch.md +1 -1
- package/components/ui/table.md +1 -0
- package/components/ui/tabs.md +19 -2
- package/components/ui/textarea.md +1 -1
- package/components/ui/toast.md +2 -2
- package/components/ui/toggle-group.md +12 -5
- package/components/ui/toolbar.md +167 -0
- package/components/ui/tooltip.md +1 -1
- package/components/ui/video-player.md +2 -2
- package/dist/contracts.d.mts +14 -0
- package/dist/contracts.d.ts +14 -0
- package/dist/contracts.js +63 -0
- package/dist/contracts.js.map +1 -0
- package/dist/contracts.mjs +63 -0
- package/dist/contracts.mjs.map +1 -0
- package/dist/index.d.mts +1327 -179
- package/dist/index.d.ts +1327 -179
- package/dist/index.js +111 -49
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +111 -49
- package/dist/index.mjs.map +1 -1
- package/dist/map/google.js +1 -0
- package/dist/map/google.js.map +1 -1
- package/dist/map/google.mjs +1 -0
- package/dist/map/google.mjs.map +1 -1
- package/dist/map/mapbox.js +1 -0
- package/dist/map/mapbox.js.map +1 -1
- package/dist/map/mapbox.mjs +1 -0
- package/dist/map/mapbox.mjs.map +1 -1
- package/dist/map/maplibre.js +1 -0
- package/dist/map/maplibre.js.map +1 -1
- package/dist/map/maplibre.mjs +1 -0
- package/dist/map/maplibre.mjs.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/tailwind-preset.js +1 -1
- package/dist/tailwind-preset.js.map +1 -1
- package/dist/tailwind-preset.mjs +1 -1
- package/dist/tailwind-preset.mjs.map +1 -1
- package/package.json +24 -9
package/dist/map/google.js
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
|
+
"use client";
|
|
1
2
|
'use strict';var T=[{featureType:"poi",stylers:[{visibility:"off"}]},{featureType:"transit",stylers:[{visibility:"simplified"}]}],v=[{elementType:"geometry",stylers:[{color:"#1a1a1a"}]},{elementType:"labels.text.stroke",stylers:[{color:"#1a1a1a"}]},{elementType:"labels.text.fill",stylers:[{color:"#9ca3af"}]},{featureType:"poi",stylers:[{visibility:"off"}]},{featureType:"road",elementType:"geometry",stylers:[{color:"#262626"}]},{featureType:"road",elementType:"labels.text.fill",stylers:[{color:"#9ca3af"}]},{featureType:"water",elementType:"geometry",stylers:[{color:"#0f172a"}]},{featureType:"transit",stylers:[{visibility:"simplified"},{color:"#3a3a3a"}]}],c=m=>m==="dark"?v:T,k=async(m,a,i)=>{if(!a.apiKey)throw i.onError({code:"api-key-missing",message:'@gradeui/ui Map: provider="google" requires an `apiKey` prop.'}),new Error("google apiKey missing");let g;try{let e=await import('@googlemaps/js-api-loader');g=e.Loader??e.default?.Loader;}catch(e){throw i.onError({code:"sdk-missing",message:'@gradeui/ui Map: `@googlemaps/js-api-loader` is not installed. Run `pnpm add @googlemaps/js-api-loader` to use provider="google".',cause:e}),e}let f=new g({apiKey:a.apiKey,version:"weekly",libraries:["maps","marker"]}),o;try{o=await f.load();}catch(e){throw i.onError({code:"provider-init-failed",message:"@gradeui/ui Map: Google Maps loader failed.",cause:e}),e}let u=a.appearance==="satellite",t=new o.maps.Map(m,{center:{lat:a.center[1],lng:a.center[0]},zoom:a.zoom,mapTypeId:u?o.maps.MapTypeId.HYBRID:o.maps.MapTypeId.ROADMAP,mapId:a.mapId,styles:u?void 0:c(a.appearance==="dark"?"dark":"light"),disableDefaultUI:!a.interactive,gestureHandling:a.interactive?"auto":"none",keyboardShortcuts:a.interactive});if(a.bounds){let e=new o.maps.LatLngBounds({lat:a.bounds[0][1],lng:a.bounds[0][0]},{lat:a.bounds[1][1],lng:a.bounds[1][0]});t.fitBounds(e);}await new Promise(e=>{o.maps.event.addListenerOnce(t,"idle",()=>e());}),i.onLoad();let p=new globalThis.Map;return {setCenter:e=>t.setCenter({lat:e[1],lng:e[0]}),setZoom:e=>t.setZoom(e),setBounds:(e,r)=>{let s=new o.maps.LatLngBounds({lat:e[1],lng:e[0]},{lat:r[1],lng:r[0]});t.fitBounds(s);},setAppearance:e=>{e==="satellite"?(t.setMapTypeId(o.maps.MapTypeId.HYBRID),t.setOptions({styles:void 0})):(t.setMapTypeId(o.maps.MapTypeId.ROADMAP),t.setOptions({styles:c(e)}));},setInteractive:e=>{t.setOptions({disableDefaultUI:!e,gestureHandling:e?"auto":"none",keyboardShortcuts:e});},flyTo:(e,r)=>{t.panTo({lat:e[1],lng:e[0]}),r?.zoom!=null&&t.setZoom(r.zoom);},panTo:e=>t.panTo({lat:e[1],lng:e[0]}),fitBounds:(e,r)=>{if(e.length===0)return;let s=new o.maps.LatLngBounds;for(let[n,d]of e)s.extend({lat:d,lng:n});t.fitBounds(s,r?.paddingPx??40);},getCenter:()=>{let e=t.getCenter();return e?[e.lng(),e.lat()]:[0,0]},getZoom:()=>t.getZoom()??0,getBounds:()=>{let e=t.getBounds();if(!e)return [[0,0],[0,0]];let r=e.getSouthWest(),s=e.getNorthEast();return [[r.lng(),r.lat()],[s.lng(),s.lat()]]},addMarker:(e,r,s)=>{let n=document.createElement("div");n.dataset.gdsPart="map-marker",n.dataset.gdsState="idle",n.style.cursor="pointer",s==="center"&&(n.style.transform="translateY(50%)"),n.addEventListener("mouseenter",()=>i.onMarkerHover(e)),n.addEventListener("mouseleave",()=>i.onMarkerHover(null)),n.addEventListener("click",l=>{i.onMarkerClick(e,y.coords,l);});let d=new o.maps.marker.AdvancedMarkerElement({map:t,position:{lat:r[1],lng:r[0]},content:n}),y={element:n,coords:r,setHovered:l=>{n.dataset.gdsState=l?"hovered":"idle",d.zIndex=l?10:1;},setPosition:l=>{y.coords=l,d.position={lat:l[1],lng:l[0]};},remove:()=>{d.map=null,p.delete(e);}};return p.set(e,{marker:d,handle:y}),y},destroy:()=>{p.forEach(({marker:e})=>{e.map=null;}),p.clear();},instance:t}};exports.createGoogleAdapter=k;//# sourceMappingURL=google.js.map
|
|
2
3
|
//# sourceMappingURL=google.js.map
|
package/dist/map/google.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../components/ui/map/adapters/google.ts"],"names":["GOOGLE_LIGHT_STYLES","GOOGLE_DARK_STYLES","stylesFor","appearance","createGoogleAdapter","container","opts","callbacks","LoaderCtor","mod","err","loader","google","isSat","map","b","resolve","markers","coords","zoom","sw","ne","enabled","fopts","list","fbopts","lng","lat","c","id","anchor","element","e","handle","marker","hovered","next"],"mappings":"aAUA,IAAMA,CAAAA,CAAiC,CAErC,CAAE,WAAA,CAAa,MAAO,OAAA,CAAS,CAAC,CAAE,UAAA,CAAY,KAAM,CAAC,CAAE,CAAA,CACvD,CAAE,WAAA,CAAa,SAAA,CAAW,QAAS,CAAC,CAAE,UAAA,CAAY,YAAa,CAAC,CAAE,CACpE,CAAA,CAEMC,CAAAA,CAAgC,CACpC,CAAE,WAAA,CAAa,WAAY,OAAA,CAAS,CAAC,CAAE,KAAA,CAAO,SAAU,CAAC,CAAE,CAAA,CAC3D,CAAE,YAAa,oBAAA,CAAsB,OAAA,CAAS,CAAC,CAAE,KAAA,CAAO,SAAU,CAAC,CAAE,CAAA,CACrE,CAAE,WAAA,CAAa,kBAAA,CAAoB,QAAS,CAAC,CAAE,MAAO,SAAU,CAAC,CAAE,CAAA,CACnE,CAAE,YAAa,KAAA,CAAO,OAAA,CAAS,CAAC,CAAE,UAAA,CAAY,KAAM,CAAC,CAAE,CAAA,CACvD,CACE,WAAA,CAAa,MAAA,CACb,YAAa,UAAA,CACb,OAAA,CAAS,CAAC,CAAE,KAAA,CAAO,SAAU,CAAC,CAChC,CAAA,CACA,CACE,WAAA,CAAa,MAAA,CACb,YAAa,kBAAA,CACb,OAAA,CAAS,CAAC,CAAE,KAAA,CAAO,SAAU,CAAC,CAChC,CAAA,CACA,CACE,WAAA,CAAa,OAAA,CACb,YAAa,UAAA,CACb,OAAA,CAAS,CAAC,CAAE,KAAA,CAAO,SAAU,CAAC,CAChC,EACA,CACE,WAAA,CAAa,UACb,OAAA,CAAS,CAAC,CAAE,UAAA,CAAY,YAAa,EAAG,CAAE,KAAA,CAAO,SAAU,CAAC,CAC9D,CACF,EAEMC,CAAAA,CAAaC,CAAAA,EACjBA,IAAe,MAAA,CAASF,CAAAA,CAAqBD,EAElCI,CAAAA,CAAsC,MACjDC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,GACG,CACH,GAAI,CAACD,CAAAA,CAAK,OACR,MAAAC,CAAAA,CAAU,QAAQ,CAChB,IAAA,CAAM,iBAAA,CACN,OAAA,CACE,+DACJ,CAAC,EACK,IAAI,KAAA,CAAM,uBAAuB,CAAA,CAIzC,IAAIC,EACJ,GAAI,CACF,IAAMC,CAAAA,CAAM,MAAM,OAAiC,2BAA2B,CAAA,CAE9ED,CAAAA,CAAcC,EAAY,MAAA,EAAWA,CAAAA,CAAY,SAAS,OAC5D,CAAA,MAASC,CAAAA,CAAK,CACZ,MAAAH,CAAAA,CAAU,QAAQ,CAChB,IAAA,CAAM,cACN,OAAA,CACE,mIAAA,CACF,MAAOG,CACT,CAAC,CAAA,CACKA,CACR,CAEA,IAAMC,EAAS,IAAIH,CAAAA,CAAW,CAC5B,MAAA,CAAQF,CAAAA,CAAK,OACb,OAAA,CAAS,QAAA,CACT,SAAA,CAAW,CAAC,MAAA,CAAQ,QAAQ,CAC9B,CAAC,CAAA,CAGGM,EACJ,GAAI,CACFA,EAAS,MAAMD,CAAAA,CAAO,OACxB,CAAA,MAASD,EAAK,CACZ,MAAAH,EAAU,OAAA,CAAQ,CAChB,KAAM,sBAAA,CACN,OAAA,CAAS,6CAAA,CACT,KAAA,CAAOG,CACT,CAAC,EACKA,CACR,CAEA,IAAMG,CAAAA,CAAQP,CAAAA,CAAK,aAAe,WAAA,CAE5BQ,CAAAA,CAAM,IAAIF,CAAAA,CAAO,IAAA,CAAK,GAAA,CAAIP,EAAW,CACzC,MAAA,CAAQ,CAAE,GAAA,CAAKC,CAAAA,CAAK,OAAO,CAAC,CAAA,CAAG,GAAA,CAAKA,CAAAA,CAAK,MAAA,CAAO,CAAC,CAAE,CAAA,CACnD,IAAA,CAAMA,EAAK,IAAA,CACX,SAAA,CAAWO,EACPD,CAAAA,CAAO,IAAA,CAAK,SAAA,CAAU,MAAA,CACtBA,CAAAA,CAAO,IAAA,CAAK,UAAU,OAAA,CAC1B,KAAA,CAAON,EAAK,KAAA,CACZ,MAAA,CAAQO,EACJ,MAAA,CACAX,CAAAA,CAAUI,CAAAA,CAAK,UAAA,GAAe,MAAA,CAAS,MAAA,CAAS,OAAO,CAAA,CAC3D,gBAAA,CAAkB,CAACA,CAAAA,CAAK,WAAA,CACxB,gBAAiBA,CAAAA,CAAK,WAAA,CAAc,MAAA,CAAS,MAAA,CAC7C,iBAAA,CAAmBA,CAAAA,CAAK,WAC1B,CAAC,CAAA,CAED,GAAIA,CAAAA,CAAK,MAAA,CAAQ,CACf,IAAMS,CAAAA,CAAI,IAAIH,CAAAA,CAAO,IAAA,CAAK,YAAA,CACxB,CAAE,GAAA,CAAKN,CAAAA,CAAK,OAAO,CAAC,CAAA,CAAE,CAAC,CAAA,CAAG,GAAA,CAAKA,EAAK,MAAA,CAAO,CAAC,EAAE,CAAC,CAAE,EACjD,CAAE,GAAA,CAAKA,EAAK,MAAA,CAAO,CAAC,CAAA,CAAE,CAAC,CAAA,CAAG,GAAA,CAAKA,EAAK,MAAA,CAAO,CAAC,EAAE,CAAC,CAAE,CACnD,CAAA,CACAQ,CAAAA,CAAI,SAAA,CAAUC,CAAC,EACjB,CAEA,MAAM,IAAI,OAAA,CAAeC,GAAY,CACnCJ,CAAAA,CAAO,KAAK,KAAA,CAAM,eAAA,CAAgBE,CAAAA,CAAK,MAAA,CAAQ,IAAME,CAAAA,EAAS,EAChE,CAAC,EACDT,CAAAA,CAAU,MAAA,GAGV,IAAMU,CAAAA,CAAU,IAAI,UAAA,CAAW,GAAA,CAiH/B,OA/GiC,CAC/B,SAAA,CAAYC,CAAAA,EACVJ,EAAI,SAAA,CAAU,CAAE,IAAKI,CAAAA,CAAO,CAAC,CAAA,CAAG,GAAA,CAAKA,CAAAA,CAAO,CAAC,CAAE,CAAC,CAAA,CAClD,QAAUC,CAAAA,EAASL,CAAAA,CAAI,QAAQK,CAAI,CAAA,CACnC,SAAA,CAAW,CAACC,CAAAA,CAAIC,CAAAA,GAAO,CACrB,IAAMN,CAAAA,CAAI,IAAIH,CAAAA,CAAO,IAAA,CAAK,aACxB,CAAE,GAAA,CAAKQ,CAAAA,CAAG,CAAC,CAAA,CAAG,GAAA,CAAKA,EAAG,CAAC,CAAE,EACzB,CAAE,GAAA,CAAKC,EAAG,CAAC,CAAA,CAAG,IAAKA,CAAAA,CAAG,CAAC,CAAE,CAC3B,CAAA,CACAP,EAAI,SAAA,CAAUC,CAAC,EACjB,CAAA,CACA,aAAA,CAAgBZ,CAAAA,EAAe,CACzBA,CAAAA,GAAe,WAAA,EACjBW,EAAI,YAAA,CAAaF,CAAAA,CAAO,KAAK,SAAA,CAAU,MAAM,EAC7CE,CAAAA,CAAI,UAAA,CAAW,CAAE,MAAA,CAAQ,MAAU,CAAC,IAEpCA,CAAAA,CAAI,YAAA,CAAaF,EAAO,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA,CAC9CE,CAAAA,CAAI,UAAA,CAAW,CAAE,MAAA,CAAQZ,CAAAA,CAAUC,CAAU,CAAE,CAAC,GAEpD,CAAA,CACA,cAAA,CAAiBmB,GAAY,CAC3BR,CAAAA,CAAI,WAAW,CACb,gBAAA,CAAkB,CAACQ,CAAAA,CACnB,eAAA,CAAiBA,EAAU,MAAA,CAAS,MAAA,CACpC,kBAAmBA,CACrB,CAAC,EACH,CAAA,CACA,KAAA,CAAO,CAACJ,EAAQK,CAAAA,GAAU,CACxBT,EAAI,KAAA,CAAM,CAAE,IAAKI,CAAAA,CAAO,CAAC,CAAA,CAAG,GAAA,CAAKA,CAAAA,CAAO,CAAC,CAAE,CAAC,CAAA,CACxCK,GAAO,IAAA,EAAQ,IAAA,EAAMT,EAAI,OAAA,CAAQS,CAAAA,CAAM,IAAI,EACjD,CAAA,CACA,KAAA,CAAQL,GAAWJ,CAAAA,CAAI,KAAA,CAAM,CAAE,GAAA,CAAKI,CAAAA,CAAO,CAAC,CAAA,CAAG,GAAA,CAAKA,EAAO,CAAC,CAAE,CAAC,CAAA,CAC/D,SAAA,CAAW,CAACM,CAAAA,CAAMC,CAAAA,GAAW,CAC3B,GAAID,CAAAA,CAAK,MAAA,GAAW,CAAA,CAAG,OACvB,IAAMT,EAAI,IAAIH,CAAAA,CAAO,KAAK,YAAA,CAC1B,IAAA,GAAW,CAACc,CAAAA,CAAKC,CAAG,CAAA,GAAKH,CAAAA,CAAMT,CAAAA,CAAE,MAAA,CAAO,CAAE,GAAA,CAAAY,CAAAA,CAAK,IAAAD,CAAI,CAAC,EACpDZ,CAAAA,CAAI,SAAA,CAAUC,CAAAA,CAAGU,CAAAA,EAAQ,SAAA,EAAa,EAAE,EAC1C,CAAA,CACA,SAAA,CAAW,IAAM,CACf,IAAMG,EAAId,CAAAA,CAAI,SAAA,EAAU,CACxB,OAAOc,CAAAA,CAAI,CAACA,EAAE,GAAA,EAAI,CAAGA,EAAE,GAAA,EAAK,EAAI,CAAC,CAAA,CAAG,CAAC,CACvC,CAAA,CACA,OAAA,CAAS,IAAMd,CAAAA,CAAI,OAAA,IAAa,CAAA,CAChC,SAAA,CAAW,IAAM,CACf,IAAMC,CAAAA,CAAID,CAAAA,CAAI,SAAA,EAAU,CACxB,GAAI,CAACC,CAAAA,CAAG,OAAO,CACb,CAAC,EAAG,CAAC,CAAA,CACL,CAAC,CAAA,CAAG,CAAC,CACP,EACA,IAAMK,CAAAA,CAAKL,EAAE,YAAA,EAAa,CACpBM,EAAKN,CAAAA,CAAE,YAAA,GACb,OAAO,CACL,CAACK,CAAAA,CAAG,GAAA,GAAOA,CAAAA,CAAG,GAAA,EAAK,CAAA,CACnB,CAACC,CAAAA,CAAG,GAAA,EAAI,CAAGA,CAAAA,CAAG,KAAK,CACrB,CACF,CAAA,CACA,SAAA,CAAW,CAACQ,CAAAA,CAAIX,CAAAA,CAAQY,CAAAA,GAAW,CACjC,IAAMC,CAAAA,CAAU,SAAS,aAAA,CAAc,KAAK,EAC5CA,CAAAA,CAAQ,OAAA,CAAQ,QAAU,YAAA,CAC1BA,CAAAA,CAAQ,OAAA,CAAQ,QAAA,CAAW,MAAA,CAC3BA,CAAAA,CAAQ,MAAM,MAAA,CAAS,SAAA,CAInBD,IAAW,QAAA,GACbC,CAAAA,CAAQ,MAAM,SAAA,CAAY,iBAAA,CAAA,CAG5BA,CAAAA,CAAQ,gBAAA,CAAiB,YAAA,CAAc,IAAMxB,EAAU,aAAA,CAAcsB,CAAE,CAAC,CAAA,CACxEE,CAAAA,CAAQ,iBAAiB,YAAA,CAAc,IAAMxB,CAAAA,CAAU,aAAA,CAAc,IAAI,CAAC,EAC1EwB,CAAAA,CAAQ,gBAAA,CAAiB,QAAUC,CAAAA,EAAM,CACvCzB,EAAU,aAAA,CAAcsB,CAAAA,CAAII,CAAAA,CAAO,MAAA,CAAQD,CAAC,EAC9C,CAAC,CAAA,CAED,IAAME,EAAS,IAAItB,CAAAA,CAAO,KAAK,MAAA,CAAO,qBAAA,CAAsB,CAC1D,GAAA,CAAAE,CAAAA,CACA,QAAA,CAAU,CAAE,GAAA,CAAKI,CAAAA,CAAO,CAAC,CAAA,CAAG,GAAA,CAAKA,EAAO,CAAC,CAAE,EAC3C,OAAA,CAASa,CACX,CAAC,CAAA,CAEKE,CAAAA,CAAuB,CAC3B,OAAA,CAAAF,CAAAA,CACA,OAAAb,CAAAA,CACA,UAAA,CAAaiB,CAAAA,EAAY,CACvBJ,CAAAA,CAAQ,OAAA,CAAQ,SAAWI,CAAAA,CAAU,SAAA,CAAY,OACjDD,CAAAA,CAAO,MAAA,CAASC,EAAU,EAAA,CAAK,EACjC,CAAA,CACA,WAAA,CAAcC,CAAAA,EAAS,CACrBH,EAAO,MAAA,CAASG,CAAAA,CAChBF,EAAO,QAAA,CAAW,CAAE,IAAKE,CAAAA,CAAK,CAAC,CAAA,CAAG,GAAA,CAAKA,CAAAA,CAAK,CAAC,CAAE,EACjD,CAAA,CACA,OAAQ,IAAM,CACZF,EAAO,GAAA,CAAM,IAAA,CACbjB,CAAAA,CAAQ,MAAA,CAAOY,CAAE,EACnB,CACF,CAAA,CAEA,OAAAZ,EAAQ,GAAA,CAAIY,CAAAA,CAAI,CAAE,MAAA,CAAAK,CAAAA,CAAQ,MAAA,CAAAD,CAAO,CAAC,CAAA,CAC3BA,CACT,CAAA,CACA,OAAA,CAAS,IAAM,CACbhB,CAAAA,CAAQ,QAAQ,CAAC,CAAE,MAAA,CAAAiB,CAAO,CAAA,GAAM,CAC9BA,EAAO,GAAA,CAAM,KACf,CAAC,CAAA,CACDjB,CAAAA,CAAQ,QAGV,CAAA,CACA,QAAA,CAAUH,CACZ,CAGF","file":"google.js","sourcesContent":["import type {\n AdapterFactory,\n AdapterInstance,\n Coords,\n MarkerHandle,\n} from \"../types\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyStyles = any[];\n\nconst GOOGLE_LIGHT_STYLES: AnyStyles = [\n // Neutral light preset — POIs hidden, transit muted.\n { featureType: \"poi\", stylers: [{ visibility: \"off\" }] },\n { featureType: \"transit\", stylers: [{ visibility: \"simplified\" }] },\n];\n\nconst GOOGLE_DARK_STYLES: AnyStyles = [\n { elementType: \"geometry\", stylers: [{ color: \"#1a1a1a\" }] },\n { elementType: \"labels.text.stroke\", stylers: [{ color: \"#1a1a1a\" }] },\n { elementType: \"labels.text.fill\", stylers: [{ color: \"#9ca3af\" }] },\n { featureType: \"poi\", stylers: [{ visibility: \"off\" }] },\n {\n featureType: \"road\",\n elementType: \"geometry\",\n stylers: [{ color: \"#262626\" }],\n },\n {\n featureType: \"road\",\n elementType: \"labels.text.fill\",\n stylers: [{ color: \"#9ca3af\" }],\n },\n {\n featureType: \"water\",\n elementType: \"geometry\",\n stylers: [{ color: \"#0f172a\" }],\n },\n {\n featureType: \"transit\",\n stylers: [{ visibility: \"simplified\" }, { color: \"#3a3a3a\" }],\n },\n];\n\nconst stylesFor = (appearance: \"light\" | \"dark\"): AnyStyles =>\n appearance === \"dark\" ? GOOGLE_DARK_STYLES : GOOGLE_LIGHT_STYLES;\n\nexport const createGoogleAdapter: AdapterFactory = async (\n container,\n opts,\n callbacks\n) => {\n if (!opts.apiKey) {\n callbacks.onError({\n code: \"api-key-missing\",\n message:\n '@gradeui/ui Map: provider=\"google\" requires an `apiKey` prop.',\n });\n throw new Error(\"google apiKey missing\");\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let LoaderCtor: any;\n try {\n const mod = await import(/* webpackIgnore: true */ \"@googlemaps/js-api-loader\");\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n LoaderCtor = (mod as any).Loader ?? (mod as any).default?.Loader;\n } catch (err) {\n callbacks.onError({\n code: \"sdk-missing\",\n message:\n '@gradeui/ui Map: `@googlemaps/js-api-loader` is not installed. Run `pnpm add @googlemaps/js-api-loader` to use provider=\"google\".',\n cause: err,\n });\n throw err;\n }\n\n const loader = new LoaderCtor({\n apiKey: opts.apiKey,\n version: \"weekly\",\n libraries: [\"maps\", \"marker\"],\n });\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let google: any;\n try {\n google = await loader.load();\n } catch (err) {\n callbacks.onError({\n code: \"provider-init-failed\",\n message: \"@gradeui/ui Map: Google Maps loader failed.\",\n cause: err,\n });\n throw err;\n }\n\n const isSat = opts.appearance === \"satellite\";\n\n const map = new google.maps.Map(container, {\n center: { lat: opts.center[1], lng: opts.center[0] },\n zoom: opts.zoom,\n mapTypeId: isSat\n ? google.maps.MapTypeId.HYBRID\n : google.maps.MapTypeId.ROADMAP,\n mapId: opts.mapId,\n styles: isSat\n ? undefined\n : stylesFor(opts.appearance === \"dark\" ? \"dark\" : \"light\"),\n disableDefaultUI: !opts.interactive,\n gestureHandling: opts.interactive ? \"auto\" : \"none\",\n keyboardShortcuts: opts.interactive,\n });\n\n if (opts.bounds) {\n const b = new google.maps.LatLngBounds(\n { lat: opts.bounds[0][1], lng: opts.bounds[0][0] },\n { lat: opts.bounds[1][1], lng: opts.bounds[1][0] }\n );\n map.fitBounds(b);\n }\n\n await new Promise<void>((resolve) => {\n google.maps.event.addListenerOnce(map, \"idle\", () => resolve());\n });\n callbacks.onLoad();\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) =>\n map.setCenter({ lat: coords[1], lng: coords[0] }),\n setZoom: (zoom) => map.setZoom(zoom),\n setBounds: (sw, ne) => {\n const b = new google.maps.LatLngBounds(\n { lat: sw[1], lng: sw[0] },\n { lat: ne[1], lng: ne[0] }\n );\n map.fitBounds(b);\n },\n setAppearance: (appearance) => {\n if (appearance === \"satellite\") {\n map.setMapTypeId(google.maps.MapTypeId.HYBRID);\n map.setOptions({ styles: undefined });\n } else {\n map.setMapTypeId(google.maps.MapTypeId.ROADMAP);\n map.setOptions({ styles: stylesFor(appearance) });\n }\n },\n setInteractive: (enabled) => {\n map.setOptions({\n disableDefaultUI: !enabled,\n gestureHandling: enabled ? \"auto\" : \"none\",\n keyboardShortcuts: enabled,\n });\n },\n flyTo: (coords, fopts) => {\n map.panTo({ lat: coords[1], lng: coords[0] });\n if (fopts?.zoom != null) map.setZoom(fopts.zoom);\n },\n panTo: (coords) => map.panTo({ lat: coords[1], lng: coords[0] }),\n fitBounds: (list, fbopts) => {\n if (list.length === 0) return;\n const b = new google.maps.LatLngBounds();\n for (const [lng, lat] of list) b.extend({ lat, lng });\n map.fitBounds(b, fbopts?.paddingPx ?? 40);\n },\n getCenter: () => {\n const c = map.getCenter();\n return c ? [c.lng(), c.lat()] : [0, 0];\n },\n getZoom: () => map.getZoom() ?? 0,\n getBounds: () => {\n const b = map.getBounds();\n if (!b) return [\n [0, 0],\n [0, 0],\n ];\n const sw = b.getSouthWest();\n const ne = b.getNorthEast();\n return [\n [sw.lng(), sw.lat()],\n [ne.lng(), ne.lat()],\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 // Google AdvancedMarker anchors the *bottom-center* of `content` to\n // the coord by default. For \"center\" anchor, shift content down so\n // the visual midpoint lands on the coord.\n if (anchor === \"center\") {\n element.style.transform = \"translateY(50%)\";\n }\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 google.maps.marker.AdvancedMarkerElement({\n map,\n position: { lat: coords[1], lng: coords[0] },\n content: element,\n });\n\n const handle: MarkerHandle = {\n element,\n coords,\n setHovered: (hovered) => {\n element.dataset.gdsState = hovered ? \"hovered\" : \"idle\";\n marker.zIndex = hovered ? 10 : 1;\n },\n setPosition: (next) => {\n handle.coords = next;\n marker.position = { lat: next[1], lng: next[0] };\n },\n remove: () => {\n marker.map = null;\n markers.delete(id);\n },\n };\n\n markers.set(id, { marker, handle });\n return handle;\n },\n destroy: () => {\n markers.forEach(({ marker }) => {\n marker.map = null;\n });\n markers.clear();\n // Google Map has no explicit destroy(); GC handles it once the\n // container DOM node is removed.\n },\n instance: map,\n };\n\n return adapter;\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../../components/ui/map/adapters/google.ts"],"names":["GOOGLE_LIGHT_STYLES","GOOGLE_DARK_STYLES","stylesFor","appearance","createGoogleAdapter","container","opts","callbacks","LoaderCtor","mod","err","loader","google","isSat","map","b","resolve","markers","coords","zoom","sw","ne","enabled","fopts","list","fbopts","lng","lat","c","id","anchor","element","e","handle","marker","hovered","next"],"mappings":"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","file":"google.js","sourcesContent":["import type {\n AdapterFactory,\n AdapterInstance,\n Coords,\n MarkerHandle,\n} from \"../types\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyStyles = any[];\n\nconst GOOGLE_LIGHT_STYLES: AnyStyles = [\n // Neutral light preset — POIs hidden, transit muted.\n { featureType: \"poi\", stylers: [{ visibility: \"off\" }] },\n { featureType: \"transit\", stylers: [{ visibility: \"simplified\" }] },\n];\n\nconst GOOGLE_DARK_STYLES: AnyStyles = [\n { elementType: \"geometry\", stylers: [{ color: \"#1a1a1a\" }] },\n { elementType: \"labels.text.stroke\", stylers: [{ color: \"#1a1a1a\" }] },\n { elementType: \"labels.text.fill\", stylers: [{ color: \"#9ca3af\" }] },\n { featureType: \"poi\", stylers: [{ visibility: \"off\" }] },\n {\n featureType: \"road\",\n elementType: \"geometry\",\n stylers: [{ color: \"#262626\" }],\n },\n {\n featureType: \"road\",\n elementType: \"labels.text.fill\",\n stylers: [{ color: \"#9ca3af\" }],\n },\n {\n featureType: \"water\",\n elementType: \"geometry\",\n stylers: [{ color: \"#0f172a\" }],\n },\n {\n featureType: \"transit\",\n stylers: [{ visibility: \"simplified\" }, { color: \"#3a3a3a\" }],\n },\n];\n\nconst stylesFor = (appearance: \"light\" | \"dark\"): AnyStyles =>\n appearance === \"dark\" ? GOOGLE_DARK_STYLES : GOOGLE_LIGHT_STYLES;\n\nexport const createGoogleAdapter: AdapterFactory = async (\n container,\n opts,\n callbacks\n) => {\n if (!opts.apiKey) {\n callbacks.onError({\n code: \"api-key-missing\",\n message:\n '@gradeui/ui Map: provider=\"google\" requires an `apiKey` prop.',\n });\n throw new Error(\"google apiKey missing\");\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let LoaderCtor: any;\n try {\n const mod = await import(\"@googlemaps/js-api-loader\");\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n LoaderCtor = (mod as any).Loader ?? (mod as any).default?.Loader;\n } catch (err) {\n callbacks.onError({\n code: \"sdk-missing\",\n message:\n '@gradeui/ui Map: `@googlemaps/js-api-loader` is not installed. Run `pnpm add @googlemaps/js-api-loader` to use provider=\"google\".',\n cause: err,\n });\n throw err;\n }\n\n const loader = new LoaderCtor({\n apiKey: opts.apiKey,\n version: \"weekly\",\n libraries: [\"maps\", \"marker\"],\n });\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let google: any;\n try {\n google = await loader.load();\n } catch (err) {\n callbacks.onError({\n code: \"provider-init-failed\",\n message: \"@gradeui/ui Map: Google Maps loader failed.\",\n cause: err,\n });\n throw err;\n }\n\n const isSat = opts.appearance === \"satellite\";\n\n const map = new google.maps.Map(container, {\n center: { lat: opts.center[1], lng: opts.center[0] },\n zoom: opts.zoom,\n mapTypeId: isSat\n ? google.maps.MapTypeId.HYBRID\n : google.maps.MapTypeId.ROADMAP,\n mapId: opts.mapId,\n styles: isSat\n ? undefined\n : stylesFor(opts.appearance === \"dark\" ? \"dark\" : \"light\"),\n disableDefaultUI: !opts.interactive,\n gestureHandling: opts.interactive ? \"auto\" : \"none\",\n keyboardShortcuts: opts.interactive,\n });\n\n if (opts.bounds) {\n const b = new google.maps.LatLngBounds(\n { lat: opts.bounds[0][1], lng: opts.bounds[0][0] },\n { lat: opts.bounds[1][1], lng: opts.bounds[1][0] }\n );\n map.fitBounds(b);\n }\n\n await new Promise<void>((resolve) => {\n google.maps.event.addListenerOnce(map, \"idle\", () => resolve());\n });\n callbacks.onLoad();\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) =>\n map.setCenter({ lat: coords[1], lng: coords[0] }),\n setZoom: (zoom) => map.setZoom(zoom),\n setBounds: (sw, ne) => {\n const b = new google.maps.LatLngBounds(\n { lat: sw[1], lng: sw[0] },\n { lat: ne[1], lng: ne[0] }\n );\n map.fitBounds(b);\n },\n setAppearance: (appearance) => {\n if (appearance === \"satellite\") {\n map.setMapTypeId(google.maps.MapTypeId.HYBRID);\n map.setOptions({ styles: undefined });\n } else {\n map.setMapTypeId(google.maps.MapTypeId.ROADMAP);\n map.setOptions({ styles: stylesFor(appearance) });\n }\n },\n setInteractive: (enabled) => {\n map.setOptions({\n disableDefaultUI: !enabled,\n gestureHandling: enabled ? \"auto\" : \"none\",\n keyboardShortcuts: enabled,\n });\n },\n flyTo: (coords, fopts) => {\n map.panTo({ lat: coords[1], lng: coords[0] });\n if (fopts?.zoom != null) map.setZoom(fopts.zoom);\n },\n panTo: (coords) => map.panTo({ lat: coords[1], lng: coords[0] }),\n fitBounds: (list, fbopts) => {\n if (list.length === 0) return;\n const b = new google.maps.LatLngBounds();\n for (const [lng, lat] of list) b.extend({ lat, lng });\n map.fitBounds(b, fbopts?.paddingPx ?? 40);\n },\n getCenter: () => {\n const c = map.getCenter();\n return c ? [c.lng(), c.lat()] : [0, 0];\n },\n getZoom: () => map.getZoom() ?? 0,\n getBounds: () => {\n const b = map.getBounds();\n if (!b) return [\n [0, 0],\n [0, 0],\n ];\n const sw = b.getSouthWest();\n const ne = b.getNorthEast();\n return [\n [sw.lng(), sw.lat()],\n [ne.lng(), ne.lat()],\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 // Google AdvancedMarker anchors the *bottom-center* of `content` to\n // the coord by default. For \"center\" anchor, shift content down so\n // the visual midpoint lands on the coord.\n if (anchor === \"center\") {\n element.style.transform = \"translateY(50%)\";\n }\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 google.maps.marker.AdvancedMarkerElement({\n map,\n position: { lat: coords[1], lng: coords[0] },\n content: element,\n });\n\n const handle: MarkerHandle = {\n element,\n coords,\n setHovered: (hovered) => {\n element.dataset.gdsState = hovered ? \"hovered\" : \"idle\";\n marker.zIndex = hovered ? 10 : 1;\n },\n setPosition: (next) => {\n handle.coords = next;\n marker.position = { lat: next[1], lng: next[0] };\n },\n remove: () => {\n marker.map = null;\n markers.delete(id);\n },\n };\n\n markers.set(id, { marker, handle });\n return handle;\n },\n destroy: () => {\n markers.forEach(({ marker }) => {\n marker.map = null;\n });\n markers.clear();\n // Google Map has no explicit destroy(); GC handles it once the\n // container DOM node is removed.\n },\n instance: map,\n };\n\n return adapter;\n};\n"]}
|
package/dist/map/google.mjs
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
|
+
"use client";
|
|
1
2
|
var T=[{featureType:"poi",stylers:[{visibility:"off"}]},{featureType:"transit",stylers:[{visibility:"simplified"}]}],v=[{elementType:"geometry",stylers:[{color:"#1a1a1a"}]},{elementType:"labels.text.stroke",stylers:[{color:"#1a1a1a"}]},{elementType:"labels.text.fill",stylers:[{color:"#9ca3af"}]},{featureType:"poi",stylers:[{visibility:"off"}]},{featureType:"road",elementType:"geometry",stylers:[{color:"#262626"}]},{featureType:"road",elementType:"labels.text.fill",stylers:[{color:"#9ca3af"}]},{featureType:"water",elementType:"geometry",stylers:[{color:"#0f172a"}]},{featureType:"transit",stylers:[{visibility:"simplified"},{color:"#3a3a3a"}]}],c=m=>m==="dark"?v:T,k=async(m,a,i)=>{if(!a.apiKey)throw i.onError({code:"api-key-missing",message:'@gradeui/ui Map: provider="google" requires an `apiKey` prop.'}),new Error("google apiKey missing");let g;try{let e=await import('@googlemaps/js-api-loader');g=e.Loader??e.default?.Loader;}catch(e){throw i.onError({code:"sdk-missing",message:'@gradeui/ui Map: `@googlemaps/js-api-loader` is not installed. Run `pnpm add @googlemaps/js-api-loader` to use provider="google".',cause:e}),e}let f=new g({apiKey:a.apiKey,version:"weekly",libraries:["maps","marker"]}),o;try{o=await f.load();}catch(e){throw i.onError({code:"provider-init-failed",message:"@gradeui/ui Map: Google Maps loader failed.",cause:e}),e}let u=a.appearance==="satellite",t=new o.maps.Map(m,{center:{lat:a.center[1],lng:a.center[0]},zoom:a.zoom,mapTypeId:u?o.maps.MapTypeId.HYBRID:o.maps.MapTypeId.ROADMAP,mapId:a.mapId,styles:u?void 0:c(a.appearance==="dark"?"dark":"light"),disableDefaultUI:!a.interactive,gestureHandling:a.interactive?"auto":"none",keyboardShortcuts:a.interactive});if(a.bounds){let e=new o.maps.LatLngBounds({lat:a.bounds[0][1],lng:a.bounds[0][0]},{lat:a.bounds[1][1],lng:a.bounds[1][0]});t.fitBounds(e);}await new Promise(e=>{o.maps.event.addListenerOnce(t,"idle",()=>e());}),i.onLoad();let p=new globalThis.Map;return {setCenter:e=>t.setCenter({lat:e[1],lng:e[0]}),setZoom:e=>t.setZoom(e),setBounds:(e,r)=>{let s=new o.maps.LatLngBounds({lat:e[1],lng:e[0]},{lat:r[1],lng:r[0]});t.fitBounds(s);},setAppearance:e=>{e==="satellite"?(t.setMapTypeId(o.maps.MapTypeId.HYBRID),t.setOptions({styles:void 0})):(t.setMapTypeId(o.maps.MapTypeId.ROADMAP),t.setOptions({styles:c(e)}));},setInteractive:e=>{t.setOptions({disableDefaultUI:!e,gestureHandling:e?"auto":"none",keyboardShortcuts:e});},flyTo:(e,r)=>{t.panTo({lat:e[1],lng:e[0]}),r?.zoom!=null&&t.setZoom(r.zoom);},panTo:e=>t.panTo({lat:e[1],lng:e[0]}),fitBounds:(e,r)=>{if(e.length===0)return;let s=new o.maps.LatLngBounds;for(let[n,d]of e)s.extend({lat:d,lng:n});t.fitBounds(s,r?.paddingPx??40);},getCenter:()=>{let e=t.getCenter();return e?[e.lng(),e.lat()]:[0,0]},getZoom:()=>t.getZoom()??0,getBounds:()=>{let e=t.getBounds();if(!e)return [[0,0],[0,0]];let r=e.getSouthWest(),s=e.getNorthEast();return [[r.lng(),r.lat()],[s.lng(),s.lat()]]},addMarker:(e,r,s)=>{let n=document.createElement("div");n.dataset.gdsPart="map-marker",n.dataset.gdsState="idle",n.style.cursor="pointer",s==="center"&&(n.style.transform="translateY(50%)"),n.addEventListener("mouseenter",()=>i.onMarkerHover(e)),n.addEventListener("mouseleave",()=>i.onMarkerHover(null)),n.addEventListener("click",l=>{i.onMarkerClick(e,y.coords,l);});let d=new o.maps.marker.AdvancedMarkerElement({map:t,position:{lat:r[1],lng:r[0]},content:n}),y={element:n,coords:r,setHovered:l=>{n.dataset.gdsState=l?"hovered":"idle",d.zIndex=l?10:1;},setPosition:l=>{y.coords=l,d.position={lat:l[1],lng:l[0]};},remove:()=>{d.map=null,p.delete(e);}};return p.set(e,{marker:d,handle:y}),y},destroy:()=>{p.forEach(({marker:e})=>{e.map=null;}),p.clear();},instance:t}};export{k as createGoogleAdapter};//# sourceMappingURL=google.mjs.map
|
|
2
3
|
//# sourceMappingURL=google.mjs.map
|
package/dist/map/google.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../components/ui/map/adapters/google.ts"],"names":["GOOGLE_LIGHT_STYLES","GOOGLE_DARK_STYLES","stylesFor","appearance","createGoogleAdapter","container","opts","callbacks","LoaderCtor","mod","err","loader","google","isSat","map","b","resolve","markers","coords","zoom","sw","ne","enabled","fopts","list","fbopts","lng","lat","c","id","anchor","element","e","handle","marker","hovered","next"],"mappings":"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","file":"google.mjs","sourcesContent":["import type {\n AdapterFactory,\n AdapterInstance,\n Coords,\n MarkerHandle,\n} from \"../types\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyStyles = any[];\n\nconst GOOGLE_LIGHT_STYLES: AnyStyles = [\n // Neutral light preset — POIs hidden, transit muted.\n { featureType: \"poi\", stylers: [{ visibility: \"off\" }] },\n { featureType: \"transit\", stylers: [{ visibility: \"simplified\" }] },\n];\n\nconst GOOGLE_DARK_STYLES: AnyStyles = [\n { elementType: \"geometry\", stylers: [{ color: \"#1a1a1a\" }] },\n { elementType: \"labels.text.stroke\", stylers: [{ color: \"#1a1a1a\" }] },\n { elementType: \"labels.text.fill\", stylers: [{ color: \"#9ca3af\" }] },\n { featureType: \"poi\", stylers: [{ visibility: \"off\" }] },\n {\n featureType: \"road\",\n elementType: \"geometry\",\n stylers: [{ color: \"#262626\" }],\n },\n {\n featureType: \"road\",\n elementType: \"labels.text.fill\",\n stylers: [{ color: \"#9ca3af\" }],\n },\n {\n featureType: \"water\",\n elementType: \"geometry\",\n stylers: [{ color: \"#0f172a\" }],\n },\n {\n featureType: \"transit\",\n stylers: [{ visibility: \"simplified\" }, { color: \"#3a3a3a\" }],\n },\n];\n\nconst stylesFor = (appearance: \"light\" | \"dark\"): AnyStyles =>\n appearance === \"dark\" ? GOOGLE_DARK_STYLES : GOOGLE_LIGHT_STYLES;\n\nexport const createGoogleAdapter: AdapterFactory = async (\n container,\n opts,\n callbacks\n) => {\n if (!opts.apiKey) {\n callbacks.onError({\n code: \"api-key-missing\",\n message:\n '@gradeui/ui Map: provider=\"google\" requires an `apiKey` prop.',\n });\n throw new Error(\"google apiKey missing\");\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let LoaderCtor: any;\n try {\n const mod = await import(/* webpackIgnore: true */ \"@googlemaps/js-api-loader\");\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n LoaderCtor = (mod as any).Loader ?? (mod as any).default?.Loader;\n } catch (err) {\n callbacks.onError({\n code: \"sdk-missing\",\n message:\n '@gradeui/ui Map: `@googlemaps/js-api-loader` is not installed. Run `pnpm add @googlemaps/js-api-loader` to use provider=\"google\".',\n cause: err,\n });\n throw err;\n }\n\n const loader = new LoaderCtor({\n apiKey: opts.apiKey,\n version: \"weekly\",\n libraries: [\"maps\", \"marker\"],\n });\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let google: any;\n try {\n google = await loader.load();\n } catch (err) {\n callbacks.onError({\n code: \"provider-init-failed\",\n message: \"@gradeui/ui Map: Google Maps loader failed.\",\n cause: err,\n });\n throw err;\n }\n\n const isSat = opts.appearance === \"satellite\";\n\n const map = new google.maps.Map(container, {\n center: { lat: opts.center[1], lng: opts.center[0] },\n zoom: opts.zoom,\n mapTypeId: isSat\n ? google.maps.MapTypeId.HYBRID\n : google.maps.MapTypeId.ROADMAP,\n mapId: opts.mapId,\n styles: isSat\n ? undefined\n : stylesFor(opts.appearance === \"dark\" ? \"dark\" : \"light\"),\n disableDefaultUI: !opts.interactive,\n gestureHandling: opts.interactive ? \"auto\" : \"none\",\n keyboardShortcuts: opts.interactive,\n });\n\n if (opts.bounds) {\n const b = new google.maps.LatLngBounds(\n { lat: opts.bounds[0][1], lng: opts.bounds[0][0] },\n { lat: opts.bounds[1][1], lng: opts.bounds[1][0] }\n );\n map.fitBounds(b);\n }\n\n await new Promise<void>((resolve) => {\n google.maps.event.addListenerOnce(map, \"idle\", () => resolve());\n });\n callbacks.onLoad();\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) =>\n map.setCenter({ lat: coords[1], lng: coords[0] }),\n setZoom: (zoom) => map.setZoom(zoom),\n setBounds: (sw, ne) => {\n const b = new google.maps.LatLngBounds(\n { lat: sw[1], lng: sw[0] },\n { lat: ne[1], lng: ne[0] }\n );\n map.fitBounds(b);\n },\n setAppearance: (appearance) => {\n if (appearance === \"satellite\") {\n map.setMapTypeId(google.maps.MapTypeId.HYBRID);\n map.setOptions({ styles: undefined });\n } else {\n map.setMapTypeId(google.maps.MapTypeId.ROADMAP);\n map.setOptions({ styles: stylesFor(appearance) });\n }\n },\n setInteractive: (enabled) => {\n map.setOptions({\n disableDefaultUI: !enabled,\n gestureHandling: enabled ? \"auto\" : \"none\",\n keyboardShortcuts: enabled,\n });\n },\n flyTo: (coords, fopts) => {\n map.panTo({ lat: coords[1], lng: coords[0] });\n if (fopts?.zoom != null) map.setZoom(fopts.zoom);\n },\n panTo: (coords) => map.panTo({ lat: coords[1], lng: coords[0] }),\n fitBounds: (list, fbopts) => {\n if (list.length === 0) return;\n const b = new google.maps.LatLngBounds();\n for (const [lng, lat] of list) b.extend({ lat, lng });\n map.fitBounds(b, fbopts?.paddingPx ?? 40);\n },\n getCenter: () => {\n const c = map.getCenter();\n return c ? [c.lng(), c.lat()] : [0, 0];\n },\n getZoom: () => map.getZoom() ?? 0,\n getBounds: () => {\n const b = map.getBounds();\n if (!b) return [\n [0, 0],\n [0, 0],\n ];\n const sw = b.getSouthWest();\n const ne = b.getNorthEast();\n return [\n [sw.lng(), sw.lat()],\n [ne.lng(), ne.lat()],\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 // Google AdvancedMarker anchors the *bottom-center* of `content` to\n // the coord by default. For \"center\" anchor, shift content down so\n // the visual midpoint lands on the coord.\n if (anchor === \"center\") {\n element.style.transform = \"translateY(50%)\";\n }\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 google.maps.marker.AdvancedMarkerElement({\n map,\n position: { lat: coords[1], lng: coords[0] },\n content: element,\n });\n\n const handle: MarkerHandle = {\n element,\n coords,\n setHovered: (hovered) => {\n element.dataset.gdsState = hovered ? \"hovered\" : \"idle\";\n marker.zIndex = hovered ? 10 : 1;\n },\n setPosition: (next) => {\n handle.coords = next;\n marker.position = { lat: next[1], lng: next[0] };\n },\n remove: () => {\n marker.map = null;\n markers.delete(id);\n },\n };\n\n markers.set(id, { marker, handle });\n return handle;\n },\n destroy: () => {\n markers.forEach(({ marker }) => {\n marker.map = null;\n });\n markers.clear();\n // Google Map has no explicit destroy(); GC handles it once the\n // container DOM node is removed.\n },\n instance: map,\n };\n\n return adapter;\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../../components/ui/map/adapters/google.ts"],"names":["GOOGLE_LIGHT_STYLES","GOOGLE_DARK_STYLES","stylesFor","appearance","createGoogleAdapter","container","opts","callbacks","LoaderCtor","mod","err","loader","google","isSat","map","b","resolve","markers","coords","zoom","sw","ne","enabled","fopts","list","fbopts","lng","lat","c","id","anchor","element","e","handle","marker","hovered","next"],"mappings":"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","file":"google.mjs","sourcesContent":["import type {\n AdapterFactory,\n AdapterInstance,\n Coords,\n MarkerHandle,\n} from \"../types\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyStyles = any[];\n\nconst GOOGLE_LIGHT_STYLES: AnyStyles = [\n // Neutral light preset — POIs hidden, transit muted.\n { featureType: \"poi\", stylers: [{ visibility: \"off\" }] },\n { featureType: \"transit\", stylers: [{ visibility: \"simplified\" }] },\n];\n\nconst GOOGLE_DARK_STYLES: AnyStyles = [\n { elementType: \"geometry\", stylers: [{ color: \"#1a1a1a\" }] },\n { elementType: \"labels.text.stroke\", stylers: [{ color: \"#1a1a1a\" }] },\n { elementType: \"labels.text.fill\", stylers: [{ color: \"#9ca3af\" }] },\n { featureType: \"poi\", stylers: [{ visibility: \"off\" }] },\n {\n featureType: \"road\",\n elementType: \"geometry\",\n stylers: [{ color: \"#262626\" }],\n },\n {\n featureType: \"road\",\n elementType: \"labels.text.fill\",\n stylers: [{ color: \"#9ca3af\" }],\n },\n {\n featureType: \"water\",\n elementType: \"geometry\",\n stylers: [{ color: \"#0f172a\" }],\n },\n {\n featureType: \"transit\",\n stylers: [{ visibility: \"simplified\" }, { color: \"#3a3a3a\" }],\n },\n];\n\nconst stylesFor = (appearance: \"light\" | \"dark\"): AnyStyles =>\n appearance === \"dark\" ? GOOGLE_DARK_STYLES : GOOGLE_LIGHT_STYLES;\n\nexport const createGoogleAdapter: AdapterFactory = async (\n container,\n opts,\n callbacks\n) => {\n if (!opts.apiKey) {\n callbacks.onError({\n code: \"api-key-missing\",\n message:\n '@gradeui/ui Map: provider=\"google\" requires an `apiKey` prop.',\n });\n throw new Error(\"google apiKey missing\");\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let LoaderCtor: any;\n try {\n const mod = await import(\"@googlemaps/js-api-loader\");\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n LoaderCtor = (mod as any).Loader ?? (mod as any).default?.Loader;\n } catch (err) {\n callbacks.onError({\n code: \"sdk-missing\",\n message:\n '@gradeui/ui Map: `@googlemaps/js-api-loader` is not installed. Run `pnpm add @googlemaps/js-api-loader` to use provider=\"google\".',\n cause: err,\n });\n throw err;\n }\n\n const loader = new LoaderCtor({\n apiKey: opts.apiKey,\n version: \"weekly\",\n libraries: [\"maps\", \"marker\"],\n });\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let google: any;\n try {\n google = await loader.load();\n } catch (err) {\n callbacks.onError({\n code: \"provider-init-failed\",\n message: \"@gradeui/ui Map: Google Maps loader failed.\",\n cause: err,\n });\n throw err;\n }\n\n const isSat = opts.appearance === \"satellite\";\n\n const map = new google.maps.Map(container, {\n center: { lat: opts.center[1], lng: opts.center[0] },\n zoom: opts.zoom,\n mapTypeId: isSat\n ? google.maps.MapTypeId.HYBRID\n : google.maps.MapTypeId.ROADMAP,\n mapId: opts.mapId,\n styles: isSat\n ? undefined\n : stylesFor(opts.appearance === \"dark\" ? \"dark\" : \"light\"),\n disableDefaultUI: !opts.interactive,\n gestureHandling: opts.interactive ? \"auto\" : \"none\",\n keyboardShortcuts: opts.interactive,\n });\n\n if (opts.bounds) {\n const b = new google.maps.LatLngBounds(\n { lat: opts.bounds[0][1], lng: opts.bounds[0][0] },\n { lat: opts.bounds[1][1], lng: opts.bounds[1][0] }\n );\n map.fitBounds(b);\n }\n\n await new Promise<void>((resolve) => {\n google.maps.event.addListenerOnce(map, \"idle\", () => resolve());\n });\n callbacks.onLoad();\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) =>\n map.setCenter({ lat: coords[1], lng: coords[0] }),\n setZoom: (zoom) => map.setZoom(zoom),\n setBounds: (sw, ne) => {\n const b = new google.maps.LatLngBounds(\n { lat: sw[1], lng: sw[0] },\n { lat: ne[1], lng: ne[0] }\n );\n map.fitBounds(b);\n },\n setAppearance: (appearance) => {\n if (appearance === \"satellite\") {\n map.setMapTypeId(google.maps.MapTypeId.HYBRID);\n map.setOptions({ styles: undefined });\n } else {\n map.setMapTypeId(google.maps.MapTypeId.ROADMAP);\n map.setOptions({ styles: stylesFor(appearance) });\n }\n },\n setInteractive: (enabled) => {\n map.setOptions({\n disableDefaultUI: !enabled,\n gestureHandling: enabled ? \"auto\" : \"none\",\n keyboardShortcuts: enabled,\n });\n },\n flyTo: (coords, fopts) => {\n map.panTo({ lat: coords[1], lng: coords[0] });\n if (fopts?.zoom != null) map.setZoom(fopts.zoom);\n },\n panTo: (coords) => map.panTo({ lat: coords[1], lng: coords[0] }),\n fitBounds: (list, fbopts) => {\n if (list.length === 0) return;\n const b = new google.maps.LatLngBounds();\n for (const [lng, lat] of list) b.extend({ lat, lng });\n map.fitBounds(b, fbopts?.paddingPx ?? 40);\n },\n getCenter: () => {\n const c = map.getCenter();\n return c ? [c.lng(), c.lat()] : [0, 0];\n },\n getZoom: () => map.getZoom() ?? 0,\n getBounds: () => {\n const b = map.getBounds();\n if (!b) return [\n [0, 0],\n [0, 0],\n ];\n const sw = b.getSouthWest();\n const ne = b.getNorthEast();\n return [\n [sw.lng(), sw.lat()],\n [ne.lng(), ne.lat()],\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 // Google AdvancedMarker anchors the *bottom-center* of `content` to\n // the coord by default. For \"center\" anchor, shift content down so\n // the visual midpoint lands on the coord.\n if (anchor === \"center\") {\n element.style.transform = \"translateY(50%)\";\n }\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 google.maps.marker.AdvancedMarkerElement({\n map,\n position: { lat: coords[1], lng: coords[0] },\n content: element,\n });\n\n const handle: MarkerHandle = {\n element,\n coords,\n setHovered: (hovered) => {\n element.dataset.gdsState = hovered ? \"hovered\" : \"idle\";\n marker.zIndex = hovered ? 10 : 1;\n },\n setPosition: (next) => {\n handle.coords = next;\n marker.position = { lat: next[1], lng: next[0] };\n },\n remove: () => {\n marker.map = null;\n markers.delete(id);\n },\n };\n\n markers.set(id, { marker, handle });\n return handle;\n },\n destroy: () => {\n markers.forEach(({ marker }) => {\n marker.map = null;\n });\n markers.clear();\n // Google Map has no explicit destroy(); GC handles it once the\n // container DOM node is removed.\n },\n instance: map,\n };\n\n return adapter;\n};\n"]}
|
package/dist/map/mapbox.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"use client";
|
|
1
2
|
'use strict';var p={light:"mapbox://styles/mapbox/light-v11",dark:"mapbox://styles/mapbox/dark-v11",satellite:"mapbox://styles/mapbox/satellite-streets-v12"},k="https://unpkg.com/mapbox-gl@3/dist/mapbox-gl.css",f="gds-mapbox-gl-css";function h(){if(typeof document>"u"||document.getElementById(f))return;let m=document.createElement("link");m.id=f,m.rel="stylesheet",m.href=k,document.head.appendChild(m);}var x=async(m,a,i)=>{if(!a.accessToken)throw i.onError({code:"api-key-missing",message:'@gradeui/ui Map: provider="mapbox" requires an `accessToken` prop.'}),new Error("mapbox accessToken missing");h();let l;try{l=await import('mapbox-gl'),l.default&&(l=l.default);}catch(e){throw i.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}l.accessToken=a.accessToken;let y=a.styleUrl??p[a.appearance],n=new l.Map({container:m,style:y,center:a.center,zoom:a.zoom,interactive:a.interactive});a.bounds&&n.fitBounds([a.bounds[0],a.bounds[1]],{animate:false}),await new Promise(e=>{n.once("load",()=>e());}),i.onLoad(),n.on("error",e=>{let t=String(e?.error?.message??e?.message??"Mapbox error"),s=t.toLowerCase().includes("style");i.onError({code:s?"style-load-failed":"tile-load-failed",message:t,cause:e?.error??e});});let u=new globalThis.Map;return {setCenter:e=>n.setCenter(e),setZoom:e=>n.setZoom(e),setBounds:(e,t)=>n.fitBounds([e,t],{animate:false}),setAppearance:e=>{let t=a.styleUrl??p[e];n.setStyle(t,{diff:false});},setInteractive:e=>{let t=["scrollZoom","boxZoom","dragRotate","dragPan","keyboard","doubleClickZoom","touchZoomRotate"];for(let s of t){let o=n[s];o&&(e?o.enable():o.disable());}},flyTo:(e,t)=>n.flyTo({center:e,zoom:t?.zoom,duration:t?.durationMs??800}),panTo:(e,t)=>n.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[r,g]of e)r<s&&(s=r),g<o&&(o=g),r>c&&(c=r),g>d&&(d=g);n.fitBounds([[s,o],[c,d]],{padding:t?.paddingPx??40,duration:t?.durationMs??800});},getCenter:()=>{let e=n.getCenter();return [e.lng,e.lat]},getZoom:()=>n.getZoom(),getBounds:()=>{let e=n.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",()=>i.onMarkerHover(e)),o.addEventListener("mouseleave",()=>i.onMarkerHover(null)),o.addEventListener("click",r=>{i.onMarkerClick(e,d.coords,r);});let c=new l.Marker({element:o,anchor:s==="center"?"center":"bottom"}).setLngLat(t).addTo(n),d={element:o,coords:t,setHovered:r=>{o.dataset.gdsState=r?"hovered":"idle",o.style.zIndex=r?"10":"1";},setPosition:r=>{d.coords=r,c.setLngLat(r);},remove:()=>{c.remove(),u.delete(e);}};return u.set(e,{marker:c,handle:d}),d},destroy:()=>{u.forEach(({marker:e})=>e.remove()),u.clear(),n.remove();},instance:n}};
|
|
2
3
|
exports.createMapboxAdapter=x;//# sourceMappingURL=mapbox.js.map
|
|
3
4
|
//# sourceMappingURL=mapbox.js.map
|
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(/* webpackIgnore: true */ \"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,CAAAA,CAAkB,kDAAA,CAClBC,CAAAA,CAAc,mBAAA,CAEpB,SAASC,CAAAA,EAAkB,CAEzB,GADI,OAAO,QAAA,CAAa,GAAA,EACpB,QAAA,CAAS,cAAA,CAAeD,CAAW,CAAA,CAAG,OAC1C,IAAME,CAAAA,CAAO,SAAS,aAAA,CAAc,MAAM,CAAA,CAC1CA,CAAAA,CAAK,GAAKF,CAAAA,CACVE,CAAAA,CAAK,GAAA,CAAM,YAAA,CACXA,CAAAA,CAAK,IAAA,CAAOH,CAAAA,CACZ,QAAA,CAAS,KAAK,WAAA,CAAYG,CAAI,EAChC,KAEaC,CAAAA,CAAsC,MACjDC,CAAAA,CACAC,CAAAA,CACAC,IACG,CACH,GAAI,CAACD,CAAAA,CAAK,WAAA,CACR,MAAAC,CAAAA,CAAU,OAAA,CAAQ,CAChB,IAAA,CAAM,iBAAA,CACN,OAAA,CACE,oEACJ,CAAC,CAAA,CACK,IAAI,KAAA,CAAM,4BAA4B,EAG9CL,CAAAA,EAAgB,CAGhB,IAAIM,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAW,aAAa,WAAW,CAAA,CAC/BA,CAAAA,CAAS,OAAA,GAASA,EAAWA,CAAAA,CAAS,OAAA,EAC5C,CAAA,MAASC,CAAAA,CAAK,CACZ,MAAAF,CAAAA,CAAU,OAAA,CAAQ,CAChB,IAAA,CAAM,aAAA,CACN,OAAA,CACE,mGAAA,CACF,MAAOE,CACT,CAAC,CAAA,CACKA,CACR,CAEAD,CAAAA,CAAS,WAAA,CAAcF,CAAAA,CAAK,WAAA,CAE5B,IAAMI,CAAAA,CAAWJ,CAAAA,CAAK,QAAA,EAAYP,CAAAA,CAAcO,CAAAA,CAAK,UAAU,CAAA,CAEzDK,CAAAA,CAAM,IAAIH,CAAAA,CAAS,GAAA,CAAI,CAC3B,SAAA,CAAAH,EACA,KAAA,CAAOK,CAAAA,CACP,MAAA,CAAQJ,CAAAA,CAAK,OACb,IAAA,CAAMA,CAAAA,CAAK,IAAA,CACX,WAAA,CAAaA,CAAAA,CAAK,WACpB,CAAC,CAAA,CAEGA,EAAK,MAAA,EACPK,CAAAA,CAAI,SAAA,CAAU,CAACL,EAAK,MAAA,CAAO,CAAC,CAAA,CAAGA,CAAAA,CAAK,OAAO,CAAC,CAAC,CAAA,CAAG,CAAE,OAAA,CAAS,KAAM,CAAC,CAAA,CAGpE,MAAM,IAAI,OAAA,CAAeM,CAAAA,EAAY,CACnCD,CAAAA,CAAI,IAAA,CAAK,MAAA,CAAQ,IAAMC,GAAS,EAClC,CAAC,CAAA,CACDL,CAAAA,CAAU,MAAA,EAAO,CAGjBI,CAAAA,CAAI,GAAG,OAAA,CAAU,CAAA,EAAW,CAC1B,IAAME,EAAM,MAAA,CAAO,CAAA,EAAG,KAAA,EAAO,OAAA,EAAW,GAAG,OAAA,EAAW,cAAc,CAAA,CAC9DC,CAAAA,CAAUD,CAAAA,CAAI,WAAA,EAAY,CAAE,QAAA,CAAS,OAAO,CAAA,CAClDN,CAAAA,CAAU,OAAA,CAAQ,CAChB,KAAMO,CAAAA,CAAU,mBAAA,CAAsB,kBAAA,CACtC,OAAA,CAASD,EACT,KAAA,CAAO,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,UAAUK,CAAM,CAAA,CAC3C,OAAA,CAAUC,CAAAA,EAASN,CAAAA,CAAI,OAAA,CAAQM,CAAI,CAAA,CACnC,UAAW,CAACC,CAAAA,CAAIC,CAAAA,GAAOR,CAAAA,CAAI,UAAU,CAACO,CAAAA,CAAIC,CAAE,CAAA,CAAG,CAAE,OAAA,CAAS,KAAM,CAAC,CAAA,CACjE,aAAA,CAAgBC,CAAAA,EAAe,CAC7B,IAAMC,EAAOf,CAAAA,CAAK,QAAA,EAAYP,CAAAA,CAAcqB,CAAU,EACtDT,CAAAA,CAAI,QAAA,CAASU,CAAAA,CAAM,CAAE,KAAM,KAAM,CAAC,EACpC,CAAA,CACA,cAAA,CAAiBC,CAAAA,EAAY,CAC3B,IAAMC,EAAW,CACf,YAAA,CACA,SAAA,CACA,YAAA,CACA,UACA,UAAA,CACA,iBAAA,CACA,iBACF,CAAA,CACA,QAAWC,CAAAA,IAAKD,CAAAA,CAAU,CACxB,IAAME,CAAAA,CAAMd,CAAAA,CAAIa,CAAC,CAAA,CACbC,IAAMH,CAAAA,CAAUG,CAAAA,CAAI,MAAA,EAAO,CAAIA,EAAI,OAAA,EAAQ,EACjD,CACF,CAAA,CACA,MAAO,CAACT,CAAAA,CAAQU,CAAAA,GACdf,CAAAA,CAAI,KAAA,CAAM,CACR,MAAA,CAAQK,CAAAA,CACR,KAAMU,CAAAA,EAAO,IAAA,CACb,QAAA,CAAUA,CAAAA,EAAO,UAAA,EAAc,GACjC,CAAC,CAAA,CACH,MAAO,CAACV,CAAAA,CAAQW,CAAAA,GACdhB,CAAAA,CAAI,KAAA,CAAMK,CAAAA,CAAQ,CAAE,QAAA,CAAUW,GAAO,UAAA,EAAc,GAAI,CAAC,CAAA,CAC1D,UAAW,CAACC,CAAAA,CAAMC,CAAAA,GAAW,CAC3B,GAAID,CAAAA,CAAK,MAAA,GAAW,CAAA,CAAG,OACvB,IAAIE,CAAAA,CAAO,CAAA,CAAA,CAAA,CACTC,CAAAA,CAAQ,IACRC,CAAAA,CAAO,EAAA,CAAA,CAAA,CACPC,CAAAA,CAAQ,EAAA,CAAA,CAAA,CACV,OAAW,CAACC,CAAAA,CAAKC,CAAG,CAAA,GAAKP,EACnBM,CAAAA,CAAMJ,CAAAA,GAAMA,CAAAA,CAAOI,CAAAA,CAAAA,CACnBC,CAAAA,CAAMJ,CAAAA,GAAOA,CAAAA,CAAQI,CAAAA,CAAAA,CACrBD,EAAMF,CAAAA,GAAMA,CAAAA,CAAOE,CAAAA,CAAAA,CACnBC,CAAAA,CAAMF,IAAOA,CAAAA,CAAQE,CAAAA,CAAAA,CAE3BxB,CAAAA,CAAI,SAAA,CACF,CACE,CAACmB,CAAAA,CAAMC,CAAK,CAAA,CACZ,CAACC,CAAAA,CAAMC,CAAK,CACd,EACA,CACE,OAAA,CAASJ,CAAAA,EAAQ,SAAA,EAAa,GAC9B,QAAA,CAAUA,CAAAA,EAAQ,UAAA,EAAc,GAClC,CACF,EACF,CAAA,CACA,SAAA,CAAW,IAAM,CACf,IAAMO,CAAAA,CAAIzB,CAAAA,CAAI,WAAU,CACxB,OAAO,CAACyB,CAAAA,CAAE,IAAKA,CAAAA,CAAE,GAAG,CACtB,CAAA,CACA,QAAS,IAAMzB,CAAAA,CAAI,OAAA,EAAQ,CAC3B,SAAA,CAAW,IAAM,CACf,IAAM0B,EAAI1B,CAAAA,CAAI,SAAA,EAAU,CACxB,OAAO,CACL,CAAC0B,CAAAA,CAAE,OAAA,EAAQ,CAAGA,EAAE,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,aAAA,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,aAAA,CAAc+B,CAAE,CAAC,CAAA,CACxEE,EAAQ,gBAAA,CAAiB,YAAA,CAAc,IAAMjC,CAAAA,CAAU,cAAc,IAAI,CAAC,CAAA,CAC1EiC,CAAAA,CAAQ,iBAAiB,OAAA,CAAUC,CAAAA,EAAM,CACvClC,CAAAA,CAAU,aAAA,CAAc+B,CAAAA,CAAII,CAAAA,CAAO,MAAA,CAAQD,CAAC,EAC9C,CAAC,CAAA,CAED,IAAME,EAAS,IAAInC,CAAAA,CAAS,MAAA,CAAO,CACjC,QAAAgC,CAAAA,CACA,MAAA,CAAQD,CAAAA,GAAW,QAAA,CAAW,QAAA,CAAW,QAC3C,CAAC,CAAA,CACE,UAAUvB,CAAM,CAAA,CAChB,KAAA,CAAML,CAAG,EAEN+B,CAAAA,CAAuB,CAC3B,OAAA,CAAAF,CAAAA,CACA,OAAAxB,CAAAA,CACA,UAAA,CAAa4B,CAAAA,EAAY,CACvBJ,CAAAA,CAAQ,OAAA,CAAQ,QAAA,CAAWI,CAAAA,CAAU,UAAY,MAAA,CACjDJ,CAAAA,CAAQ,KAAA,CAAM,MAAA,CAASI,EAAU,IAAA,CAAO,IAC1C,CAAA,CACA,WAAA,CAAcvB,GAAS,CACrBqB,CAAAA,CAAO,MAAA,CAASrB,CAAAA,CAChBsB,CAAAA,CAAO,SAAA,CAAUtB,CAAI,EACvB,EACA,MAAA,CAAQ,IAAM,CACZsB,CAAAA,CAAO,QAAO,CACd5B,CAAAA,CAAQ,MAAA,CAAOuB,CAAE,EACnB,CACF,CAAA,CAEA,OAAAvB,CAAAA,CAAQ,GAAA,CAAIuB,CAAAA,CAAI,CAAE,MAAA,CAAAK,EAAQ,MAAA,CAAAD,CAAO,CAAC,CAAA,CAC3BA,CACT,CAAA,CACA,OAAA,CAAS,IAAM,CACb3B,EAAQ,OAAA,CAAQ,CAAC,CAAE,MAAA,CAAA4B,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.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"]}
|
package/dist/map/mapbox.mjs
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"use client";
|
|
1
2
|
var p={light:"mapbox://styles/mapbox/light-v11",dark:"mapbox://styles/mapbox/dark-v11",satellite:"mapbox://styles/mapbox/satellite-streets-v12"},k="https://unpkg.com/mapbox-gl@3/dist/mapbox-gl.css",f="gds-mapbox-gl-css";function h(){if(typeof document>"u"||document.getElementById(f))return;let m=document.createElement("link");m.id=f,m.rel="stylesheet",m.href=k,document.head.appendChild(m);}var x=async(m,a,i)=>{if(!a.accessToken)throw i.onError({code:"api-key-missing",message:'@gradeui/ui Map: provider="mapbox" requires an `accessToken` prop.'}),new Error("mapbox accessToken missing");h();let l;try{l=await import('mapbox-gl'),l.default&&(l=l.default);}catch(e){throw i.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}l.accessToken=a.accessToken;let y=a.styleUrl??p[a.appearance],n=new l.Map({container:m,style:y,center:a.center,zoom:a.zoom,interactive:a.interactive});a.bounds&&n.fitBounds([a.bounds[0],a.bounds[1]],{animate:false}),await new Promise(e=>{n.once("load",()=>e());}),i.onLoad(),n.on("error",e=>{let t=String(e?.error?.message??e?.message??"Mapbox error"),s=t.toLowerCase().includes("style");i.onError({code:s?"style-load-failed":"tile-load-failed",message:t,cause:e?.error??e});});let u=new globalThis.Map;return {setCenter:e=>n.setCenter(e),setZoom:e=>n.setZoom(e),setBounds:(e,t)=>n.fitBounds([e,t],{animate:false}),setAppearance:e=>{let t=a.styleUrl??p[e];n.setStyle(t,{diff:false});},setInteractive:e=>{let t=["scrollZoom","boxZoom","dragRotate","dragPan","keyboard","doubleClickZoom","touchZoomRotate"];for(let s of t){let o=n[s];o&&(e?o.enable():o.disable());}},flyTo:(e,t)=>n.flyTo({center:e,zoom:t?.zoom,duration:t?.durationMs??800}),panTo:(e,t)=>n.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[r,g]of e)r<s&&(s=r),g<o&&(o=g),r>c&&(c=r),g>d&&(d=g);n.fitBounds([[s,o],[c,d]],{padding:t?.paddingPx??40,duration:t?.durationMs??800});},getCenter:()=>{let e=n.getCenter();return [e.lng,e.lat]},getZoom:()=>n.getZoom(),getBounds:()=>{let e=n.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",()=>i.onMarkerHover(e)),o.addEventListener("mouseleave",()=>i.onMarkerHover(null)),o.addEventListener("click",r=>{i.onMarkerClick(e,d.coords,r);});let c=new l.Marker({element:o,anchor:s==="center"?"center":"bottom"}).setLngLat(t).addTo(n),d={element:o,coords:t,setHovered:r=>{o.dataset.gdsState=r?"hovered":"idle",o.style.zIndex=r?"10":"1";},setPosition:r=>{d.coords=r,c.setLngLat(r);},remove:()=>{c.remove(),u.delete(e);}};return u.set(e,{marker:c,handle:d}),d},destroy:()=>{u.forEach(({marker:e})=>e.remove()),u.clear(),n.remove();},instance:n}};
|
|
2
3
|
export{x as createMapboxAdapter};//# sourceMappingURL=mapbox.mjs.map
|
|
3
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(/* webpackIgnore: true */ \"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.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"]}
|
package/dist/map/maplibre.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"use client";
|
|
1
2
|
'use strict';var p="2pMfyvhpuKonkf7h8HzH",y=()=>p.length>0;var k={light:"dataviz-light",dark:"dataviz-dark",satellite:"satellite"},h=(i,o)=>`https://api.maptiler.com/maps/${k[i]}/style.json?key=${encodeURIComponent(o)}`,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,o,c)=>{b();let m;try{m=await import('maplibre-gl'),m.default&&(m=m.default);}catch(e){throw c.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=o.tilerKey??p;process.env.NODE_ENV!=="production"&&!o.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=o.styleUrl??h(o.appearance,f),n=new m.Map({container:i,style:M,center:o.center,zoom:o.zoom,interactive:o.interactive,attributionControl:{compact:true}});o.bounds&&n.fitBounds([o.bounds[0],o.bounds[1]],{animate:false}),await new Promise(e=>{n.once("load",()=>e());}),c.onLoad(),n.on("error",e=>{let t=String(e?.error?.message??e?.message??"MapLibre error"),s=t.toLowerCase().includes("style");c.onError({code:s?"style-load-failed":"tile-load-failed",message:t,cause:e?.error??e});});let u=new globalThis.Map;return {setCenter:e=>n.setCenter(e),setZoom:e=>n.setZoom(e),setBounds:(e,t)=>n.fitBounds([e,t],{animate:false}),setAppearance:e=>{let t=o.styleUrl??h(e,f);n.setStyle(t,{diff:false});},setInteractive:e=>{let t=["scrollZoom","boxZoom","dragRotate","dragPan","keyboard","doubleClickZoom","touchZoomRotate"];for(let s of t){let r=n[s];r&&(e?r.enable():r.disable());}},flyTo:(e,t)=>n.flyTo({center:e,zoom:t?.zoom,duration:t?.durationMs??800}),panTo:(e,t)=>n.panTo(e,{duration:t?.durationMs??600}),fitBounds:(e,t)=>{if(e.length===0)return;let s=1/0,r=1/0,l=-1/0,d=-1/0;for(let[a,g]of e)a<s&&(s=a),g<r&&(r=g),a>l&&(l=a),g>d&&(d=g);n.fitBounds([[s,r],[l,d]],{padding:t?.paddingPx??40,duration:t?.durationMs??800});},getCenter:()=>{let e=n.getCenter();return [e.lng,e.lat]},getZoom:()=>n.getZoom(),getBounds:()=>{let e=n.getBounds();return [[e.getWest(),e.getSouth()],[e.getEast(),e.getNorth()]]},addMarker:(e,t,s)=>{let r=document.createElement("div");r.dataset.gdsPart="map-marker",r.dataset.gdsState="idle",r.style.cursor="pointer",r.addEventListener("mouseenter",()=>c.onMarkerHover(e)),r.addEventListener("mouseleave",()=>c.onMarkerHover(null)),r.addEventListener("click",a=>{c.onMarkerClick(e,d.coords,a);});let l=new m.Marker({element:r,anchor:s==="center"?"center":"bottom"}).setLngLat(t).addTo(n),d={element:r,coords:t,setHovered:a=>{r.dataset.gdsState=a?"hovered":"idle",r.style.zIndex=a?"10":"1";},setPosition:a=>{d.coords=a,l.setLngLat(a);},remove:()=>{l.remove(),u.delete(e);}};return u.set(e,{marker:l,handle:d}),d},destroy:()=>{u.forEach(({marker:e})=>e.remove()),u.clear(),n.remove();},instance:n}};
|
|
2
3
|
exports.createMaplibreAdapter=R;//# sourceMappingURL=maplibre.js.map
|
|
3
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(/* webpackIgnore: true */ \"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 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,3 +1,4 @@
|
|
|
1
|
+
"use client";
|
|
1
2
|
var p="2pMfyvhpuKonkf7h8HzH",y=()=>p.length>0;var k={light:"dataviz-light",dark:"dataviz-dark",satellite:"satellite"},h=(i,o)=>`https://api.maptiler.com/maps/${k[i]}/style.json?key=${encodeURIComponent(o)}`,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,o,c)=>{b();let m;try{m=await import('maplibre-gl'),m.default&&(m=m.default);}catch(e){throw c.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=o.tilerKey??p;process.env.NODE_ENV!=="production"&&!o.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=o.styleUrl??h(o.appearance,f),n=new m.Map({container:i,style:M,center:o.center,zoom:o.zoom,interactive:o.interactive,attributionControl:{compact:true}});o.bounds&&n.fitBounds([o.bounds[0],o.bounds[1]],{animate:false}),await new Promise(e=>{n.once("load",()=>e());}),c.onLoad(),n.on("error",e=>{let t=String(e?.error?.message??e?.message??"MapLibre error"),s=t.toLowerCase().includes("style");c.onError({code:s?"style-load-failed":"tile-load-failed",message:t,cause:e?.error??e});});let u=new globalThis.Map;return {setCenter:e=>n.setCenter(e),setZoom:e=>n.setZoom(e),setBounds:(e,t)=>n.fitBounds([e,t],{animate:false}),setAppearance:e=>{let t=o.styleUrl??h(e,f);n.setStyle(t,{diff:false});},setInteractive:e=>{let t=["scrollZoom","boxZoom","dragRotate","dragPan","keyboard","doubleClickZoom","touchZoomRotate"];for(let s of t){let r=n[s];r&&(e?r.enable():r.disable());}},flyTo:(e,t)=>n.flyTo({center:e,zoom:t?.zoom,duration:t?.durationMs??800}),panTo:(e,t)=>n.panTo(e,{duration:t?.durationMs??600}),fitBounds:(e,t)=>{if(e.length===0)return;let s=1/0,r=1/0,l=-1/0,d=-1/0;for(let[a,g]of e)a<s&&(s=a),g<r&&(r=g),a>l&&(l=a),g>d&&(d=g);n.fitBounds([[s,r],[l,d]],{padding:t?.paddingPx??40,duration:t?.durationMs??800});},getCenter:()=>{let e=n.getCenter();return [e.lng,e.lat]},getZoom:()=>n.getZoom(),getBounds:()=>{let e=n.getBounds();return [[e.getWest(),e.getSouth()],[e.getEast(),e.getNorth()]]},addMarker:(e,t,s)=>{let r=document.createElement("div");r.dataset.gdsPart="map-marker",r.dataset.gdsState="idle",r.style.cursor="pointer",r.addEventListener("mouseenter",()=>c.onMarkerHover(e)),r.addEventListener("mouseleave",()=>c.onMarkerHover(null)),r.addEventListener("click",a=>{c.onMarkerClick(e,d.coords,a);});let l=new m.Marker({element:r,anchor:s==="center"?"center":"bottom"}).setLngLat(t).addTo(n),d={element:r,coords:t,setHovered:a=>{r.dataset.gdsState=a?"hovered":"idle",r.style.zIndex=a?"10":"1";},setPosition:a=>{d.coords=a,l.setLngLat(a);},remove:()=>{l.remove(),u.delete(e);}};return u.set(e,{marker:l,handle:d}),d},destroy:()=>{u.forEach(({marker:e})=>e.remove()),u.clear(),n.remove();},instance:n}};
|
|
2
3
|
export{R as createMaplibreAdapter};//# sourceMappingURL=maplibre.mjs.map
|
|
3
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(/* webpackIgnore: true */ \"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 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"]}
|