{"version":3,"file":"pages-locations.js","mappings":"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","sources":["webpack://silverstripe-base/./themes/app/src/scripts/common/map-styles.js","webpack://silverstripe-base/./themes/app/src/pages/locations.js"],"sourcesContent":["export const mapStyles = [\n {\n elementType: \"geometry\",\n stylers: [\n {\n color: \"#f5f5f5\",\n },\n ],\n },\n {\n elementType: \"labels.icon\",\n stylers: [\n {\n visibility: \"off\",\n },\n ],\n },\n {\n elementType: \"labels.text.fill\",\n stylers: [\n {\n color: \"#616161\",\n },\n ],\n },\n {\n elementType: \"labels.text.stroke\",\n stylers: [\n {\n color: \"#f5f5f5\",\n },\n ],\n },\n {\n featureType: \"administrative\",\n elementType: \"geometry\",\n stylers: [\n {\n visibility: \"off\",\n },\n ],\n },\n {\n featureType: \"administrative.land_parcel\",\n elementType: \"labels.text.fill\",\n stylers: [\n {\n color: \"#bdbdbd\",\n },\n ],\n },\n {\n featureType: \"poi\",\n stylers: [\n {\n visibility: \"off\",\n },\n ],\n },\n {\n featureType: \"poi\",\n elementType: \"geometry\",\n stylers: [\n {\n color: \"#eeeeee\",\n },\n ],\n },\n {\n featureType: \"poi\",\n elementType: \"labels.text.fill\",\n stylers: [\n {\n color: \"#757575\",\n },\n ],\n },\n {\n featureType: \"poi.park\",\n elementType: \"geometry\",\n stylers: [\n {\n color: \"#e5e5e5\",\n },\n ],\n },\n {\n featureType: \"poi.park\",\n elementType: \"labels.text.fill\",\n stylers: [\n {\n color: \"#9e9e9e\",\n },\n ],\n },\n {\n featureType: \"road\",\n elementType: \"geometry\",\n stylers: [\n {\n color: \"#ffffff\",\n },\n ],\n },\n {\n featureType: \"road\",\n elementType: \"labels.icon\",\n stylers: [\n {\n visibility: \"off\",\n },\n ],\n },\n {\n featureType: \"road.arterial\",\n elementType: \"labels.text.fill\",\n stylers: [\n {\n color: \"#757575\",\n },\n ],\n },\n {\n featureType: \"road.highway\",\n elementType: \"geometry\",\n stylers: [\n {\n color: \"#dadada\",\n },\n ],\n },\n {\n featureType: \"road.highway\",\n elementType: \"labels.text.fill\",\n stylers: [\n {\n color: \"#616161\",\n },\n ],\n },\n {\n featureType: \"road.local\",\n elementType: \"labels.text.fill\",\n stylers: [\n {\n color: \"#9e9e9e\",\n },\n ],\n },\n {\n featureType: \"transit\",\n stylers: [\n {\n visibility: \"off\",\n },\n ],\n },\n {\n featureType: \"transit.line\",\n elementType: \"geometry\",\n stylers: [\n {\n color: \"#e5e5e5\",\n },\n ],\n },\n {\n featureType: \"transit.station\",\n elementType: \"geometry\",\n stylers: [\n {\n color: \"#eeeeee\",\n },\n ],\n },\n {\n featureType: \"water\",\n elementType: \"geometry\",\n stylers: [\n {\n color: \"#d5d1db\",\n },\n ],\n },\n {\n featureType: \"water\",\n elementType: \"labels.text.fill\",\n stylers: [\n {\n color: \"#9e9e9e\",\n },\n ],\n },\n];\n","import { on } from \"delegated-events\";\nimport { mapStyles } from \"@common/map-styles\";\nimport \"simplebar\";\nimport \"simplebar/dist/simplebar.css\";\n\nconst data = JSON.parse(document.getElementById(\"map-locations\").textContent);\nconst mapSidebar = document.querySelector(\".map-sidebar\");\n\nconst state = {\n currentInfoWindow: null,\n locations: [],\n};\n\nasync function setupMap(mapEl) {\n const google = window.google;\n\n const { Map } = await google.maps.importLibrary(\"maps\");\n const { LatLngBounds, Size } = await google.maps.importLibrary(\"core\");\n const { Marker } = await google.maps.importLibrary(\"marker\");\n const { InfoWindow } = await google.maps.importLibrary(\"streetView\");\n\n const map = new Map(mapEl, {\n minZoom: 3,\n mapTypeId: google.maps.MapTypeId.ROADMAP,\n disableDefaultUI: true,\n zoomControl: true,\n scrollwheel: false,\n styles: mapStyles,\n });\n\n const handleDeselectLocation = () => {\n state.currentInfoWindow?.close();\n state.currentInfoWindow = null;\n mapSidebar.querySelector(\".map-location-item.is-selected\")?.classList.remove(\"is-selected\");\n };\n\n const handleSelectLocation = (id) => {\n const location = state.locations.find((x) => x.id === id);\n const marker = location.marker;\n const infoWindow = location.infoWindow;\n\n map.panTo(marker.getPosition());\n map.panBy(0, -20);\n\n infoWindow.open({\n anchor: marker,\n map,\n });\n\n handleDeselectLocation();\n\n state.currentInfoWindow = infoWindow;\n\n const sidebarLocation = mapSidebar.querySelector(`.map-location-item[data-id=\"${id}\"]`);\n\n sidebarLocation.classList.add(\"is-selected\");\n\n if (mapSidebar.getAttribute(\"aria-expanded\") === \"true\") {\n sidebarLocation.scrollIntoView({ behavior: \"smooth\", block: \"nearest\" });\n }\n };\n\n const bounds = new LatLngBounds();\n\n data.forEach((location) => {\n const marker = new Marker({\n icon: {\n url: location.is_featured\n ? \"/_resources/themes/app/dist/images/map-marker-dark.png\"\n : \"/_resources/themes/app/dist/images/map-marker.png\",\n scaledSize: new Size(70, 84),\n },\n position: {\n lat: location.lat,\n lng: location.lng,\n },\n map,\n });\n\n const infoWindow = new InfoWindow({\n content: location.content,\n minWidth: 300,\n });\n\n infoWindow.addListener(\"closeclick\", () => {\n handleDeselectLocation();\n });\n\n marker.addListener(\"click\", () => {\n handleSelectLocation(location.id);\n });\n\n marker.addListener(\"mouseover\", () => {\n marker.setZIndex(20);\n });\n\n marker.addListener(\"mouseout\", () => {\n marker.setZIndex();\n });\n\n bounds.extend(marker.getPosition());\n\n state.locations.push({\n id: location.id,\n marker,\n infoWindow,\n });\n });\n\n let offset = 0;\n\n if (window.matchMedia(\"(min-width: 1024px)\").matches) {\n offset = mapSidebar.offsetWidth;\n mapSidebar.setAttribute(\"aria-expanded\", \"true\");\n }\n\n map.fitBounds(bounds, { left: offset });\n\n mapEl.parentNode.classList.remove(\"opacity-0\");\n\n on(\"click\", \".map-location-item\", (e) => {\n const clickedId = parseInt(e.currentTarget.dataset.id);\n\n handleSelectLocation(clickedId);\n });\n\n on(\"click\", \".map-sidebar-toggle\", () => {\n if (mapSidebar.getAttribute(\"aria-expanded\") === \"false\") {\n mapSidebar.setAttribute(\"aria-expanded\", \"true\");\n } else if (mapSidebar.getAttribute(\"aria-expanded\") === \"true\") {\n mapSidebar.setAttribute(\"aria-expanded\", \"false\");\n }\n });\n\n on(\"click\", \".map-info-window-close\", () => {\n handleDeselectLocation();\n });\n}\n\nconst mapEl = document.getElementById(\"google-map\");\n\nif (mapEl) {\n setupMap(mapEl);\n}\n"],"names":["mapStyles","elementType","stylers","color","visibility","featureType","data","JSON","parse","document","getElementById","textContent","mapSidebar","querySelector","state","currentInfoWindow","locations","mapEl","async","google","window","Map","maps","importLibrary","LatLngBounds","Size","Marker","InfoWindow","map","minZoom","mapTypeId","MapTypeId","ROADMAP","disableDefaultUI","zoomControl","scrollwheel","styles","handleDeselectLocation","close","classList","remove","handleSelectLocation","id","location","find","x","marker","infoWindow","panTo","getPosition","panBy","open","anchor","sidebarLocation","add","getAttribute","scrollIntoView","behavior","block","bounds","forEach","icon","url","is_featured","scaledSize","position","lat","lng","content","minWidth","addListener","setZIndex","extend","push","offset","matchMedia","matches","offsetWidth","setAttribute","fitBounds","left","parentNode","on","e","clickedId","parseInt","currentTarget","dataset","setupMap"],"sourceRoot":""}