{"version":3,"sources":["util.js","Head.js","img/pin.png","Map.js","LocationList.js","SingleLocationMap.js","SingleLocation.js","App.js","index.js"],"names":["getLocations","filter","data","f","l","images","length","type","totem_type","format","is_big_screen","city","find","d","city_id","totems","locs","forEach","push","TYPE","value","label","FORMAT","reactSelectTheme","theme","colors","primary","primary25","primary50","primary75","neutral0","neutral90","neutral5","neutral80","neutral10","neutral70","neutral20","neutral60","neutral30","neutral50","neutral40","Header","props","React","useState","collapsed","setCollapsed","cityOptions","setFilter","screens","reduce","s","Wrap","className","onClick","setTimeout","window","MAP","resize","classNamePrefix","options","t","onChange","styled","header","markerPinImage","Image","src","markerPin","width","height","markerPinImageSmall","markerImages","markerImagesSmall","startCenter","calcBounds","margin","loc","location","min","max","Math","Map","ReactMapboxGl","minZoom","maxZoom","accessToken","MyMap","setLocation","hover","setHover","locationBounds","setLocationBounds","locations","useEffect","bounds","document","documentElement","clientWidth","innerWidth","fitBounds","style","onStyleLoad","m","center","maxBounds","containerStyle","coordinates","offset","fontSize","name","id","layout","map","totem_id","onMouseEnter","onMouseLeave","div","LocationList","Location","city_name","image","main","LocationWrap","loading","alt","zoom","preventDefault","e","SingleLocation","showStatus","showThumbs","img","large","draggable","onDragStart","Body","Back","xmlns","viewBox","cx","cy","r","fill","stroke","transform","strokeWidth","strokeLinecap","screen_width","screen_height","ad_duration","motion_type","qs","queryString","parse","search","App","setData","setCityOptions","setLocationAndUrl","history","pushState","a","axios","result","locId","parseInt","is_installed","c","load","isNaN","isFinite","addEventListener","removeEventListener","GlobalStyle","createGlobalStyle","ReactDOM","render","getElementById"],"mappings":"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","file":"static/js/main.10238823.chunk.js","sourcesContent":["export function getLocations(filter, data) {\n let f = (l) =>\n l.images.length > 0 &&\n (filter.type == null || filter.type === l.totem_type) &&\n (filter.format == null ||\n filter.format === (l.is_big_screen ? 'big' : 'citylight'));\n if (filter.city != null) {\n return data.find((d) => d.city_id == filter.city)?.totems?.filter(f) || [];\n } else {\n let locs = [];\n data.forEach((d) => locs.push(...d.totems.filter(f)));\n return locs;\n }\n}\n","import React from 'react';\nimport styled from 'styled-components';\nimport Select from 'react-select';\nimport { getLocations } from './util';\n\nlet TYPE = [\n { value: null, label: 'Tip: Svi' },\n { value: 'indoor', label: 'Indoor' },\n { value: 'outdoor', label: 'Outdoor' },\n];\n\nlet FORMAT = [\n { value: null, label: 'Format: Svi' },\n { value: 'citylight', label: 'Digitalni citylight' },\n { value: 'big', label: 'Veliki format' },\n];\n\nlet reactSelectTheme = theme => ({\n ...theme,\n colors: {\n ...theme.colors,\n primary: '#0cd459',\n primary25: '#0cd459',\n primary50: '#0cd459',\n primary75: '#0cd459',\n neutral0: theme.colors.neutral90,\n neutral5: theme.colors.neutral80,\n neutral10: theme.colors.neutral70,\n neutral20: theme.colors.neutral60,\n neutral30: theme.colors.neutral50,\n neutral40: theme.colors.neutral40,\n neutral50: theme.colors.neutral30,\n neutral60: theme.colors.neutral20,\n neutral70: theme.colors.neutral10,\n neutral80: theme.colors.neutral5,\n neutral90: theme.colors.neutral0,\n },\n});\n\nexport default function Header(props) {\n let [collapsed, setCollapsed] = React.useState(true);\n let { data, cityOptions, filter, setFilter } = props;\n\n let locs = getLocations(filter, data);\n let screens = locs.reduce((s, l) => s + l.screens, 0)\n\n return (\n {\n setCollapsed(true);\n setTimeout(() => {\n if (window.MAP) window.MAP.resize();\n }, 500);\n }}\n >\n Ukupno { screens } oglasnih površina\n t.value === filter.city)}\n onChange={({ value }) => setFilter({ ...filter, city: value })}\n theme={reactSelectTheme}\n />\n t.value === filter.type)}\n onChange={({ value }) => setFilter({ ...filter, type: value })}\n theme={reactSelectTheme}\n />\n t.value === filter.format)}\n onChange={({ value }) => setFilter({ ...filter, format: value })}\n theme={reactSelectTheme}\n />\n \n );\n}\n\nlet Wrap = styled.header`\n display: flex;\n justify-content: center;\n padding: 20px;\n align-items: center;\n transition: height 0.1s ease-in-out;\n\n .react-select__option {\n color: white;\n }\n\n .react-select__menu-list, .react-select__control {\n background: #262626;\n }\n\n .react-select__option:hover {\n }\n\n h1 {\n color: white;\n font-size: 1.2em;\n position: absolute;\n left: 30px;\n }\n\n @media (max-width: 1200px) {\n flex-direction: column;\n flex-basis: 250px;\n height: 250px;\n min-height: 250px;\n\n h1 {\n position: static;\n margin-bottom: 20px;\n }\n }\n\n .select {\n width: 200px;\n height: 40px;\n margin: 2px;\n }\n`;\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAABACAYAAABcIPRGAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpCRjNFQkNGRENDMDkxMUU1OTk4RUFCMEYzMTFFRERDOCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpCRjNFQkNGRUNDMDkxMUU1OTk4RUFCMEYzMTFFRERDOCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkJGM0VCQ0ZCQ0MwOTExRTU5OThFQUIwRjMxMUVEREM4IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkJGM0VCQ0ZDQ0MwOTExRTU5OThFQUIwRjMxMUVEREM4Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+3hES6QAABcpJREFUeNrUWmtMXEUY/e4+2OXRtUWBpQaBoFYpaEITrRAsbWJi/OGLmJQq+IhJtYmPJrWN0jQiVlNNbPyp8VHrA40xxWpMU5IG20ptDTGWhrS28pDgFlDa8GaBXc+3DGSBfd07093LSU6m5d6ZPefO3PnmmzsaKUBq2+Y8FBvBe8A14C2giy+BfvA/cABsB8+CJ5mjxV97ZX9bkxC9GkU1WAMWGmhiDPwJ/AQ8CjMzcTEA4QUoXgGfAe2kBn+Db7MZvb2i6RDuRPEauBN00LVBB/g8TBxVagDii1F8K8Z3PPAl+ByMjEgbgPgtKD4GnRRfXAAfhYn2SDdZoojfLp5GvMWT6O0WaCgz1AOo+DKK/ZR4jIP3oyeOx2wA4jejaCDzYAgsh4mzUQ1A/FoUZ8AUMhe6wBKYuBL2HYB4nh6/MaF4Rp4IehFf4h3gWjIvHhbDe+kQwoUcMXUlk7lxmWcoDKWhxT2wcxmIZ7jBbQt6AE8/E0V3guZ7I+DVbS56YXSuB7YsI/GM68HH+B828YcnVLZuQceusa6mHEt64P89vkG6MPMP+QKpgTLwMv6AJtb1vSpatEJ6VVIpPeuooAzNteDagH+IPppspgZvC83AigLw07iBe2CTitbSNCe9n1xD6203h7zOhl51PkgbbYX00vhBGvFPqEjGNvE7sF6+JY3eSa4KKz4YfA/fqxlPBoNRxgZul23lPnsRbbDF3gzfy3UUoNAiEnApPJ5UFpc6oZbcbGClTAsOTGQl1nzd9biOY34SNIx0NrBCpoUMiyswbRqZarmuJFZYZFuY9E8npG7wanRYpoFB/wgNG5gSuQ7XlcQIG/hLpgUOSs3T7brrcR0FAe0SGzgt28qHk8d0ieF7uY4CnGYD0i11+Prp3YkfY76f7+U6CnCM57Ej/D6R5G7b596TNI1nuwvLBTtWRaEwhev7Jg5jPXRKhXjWfGQuHziA4kkVrd5oWUU1SeVUgTVPtmU2xHh8VwNj/qD3BPX6rqhajX6GfOCpOQOlKH5RvWifiw+Kl9Hz6yAYaAnOiVs5QC6ThOZ3iC9ZnBPXL6OM7I1Q2yrf0+yGltlxRmhdaABdwgN19zIwsFtoXdIDbKIJxSETiz8kNFJIAwK8pT5uQvHjQhtFNACH3SZ9oeuFNorWA4FoD7aaSHyr0BQysw8JxIUiUTEpweL5q+U6PP1z4fKBkBAVak3w9GvDiY9oQOA9sCmB4puEhoibQxGBoZSF4g8wK87i+8A78fT7oqWUESEaqA6syeIH/q3qaOJjMhAU4PbE0cCexQFLyoDAW2BjHMQ3it+KCbo2dPA+uEQOfds1En8evHvu85FyA8JEgVgRpisWPwjeBfG6dkl0b2yJH6gMpLjqwG1V6hVvyIAw0Yxiq0IDW0WbFBcDwsSnKOoUiK8TbRmC1WjFouJibeXhfztHS68r9KVZC4y04egc//WmFy42ZmZmWjOzsq729/frPnam6RDMkbgcvBcsFTNRKlk06tueQ2Pr9G1yp7QOU9b+HoSs+eSKxXeCv4F8MuX4uba2dikDEJ2GoopmP8NuCHe/367R5V25NFGYGpN4Z/soufd1kzYVdbvlEvgV7wHBTEfMBiCch9aLIvrG9AHEl2IlT20eefMjf25O6pyg7L1dZBnTNVp4afEFuANGBiIaEOK/Ax/SOx5nXDbyvJ5PU+7QKYTd46Xsuk6yDhn+LtDDQxgmuiLNQpVGxAdmBAhzv9lF9r6lJyf5b248eQnxDD6QsjfaNCoVYW2DU+SuX2giIB5/42sKsCqaAT5q9qcqE4rFTy3ugXAvcQaKD8BHZH5tOt0+b0gB+CzT0xj/p/RMo/wVf5swkpaAlJLnWV5icKRugPhpQ4EMRvgg1ANghQhmdxCpOSsQAnzw5AT4M/gDRPcqXU4HBTiOxHxq/VYwF+RDU26ROzsFHYvm8mERcQdEzsvHxzzgRZo9mn8egj16tPwvwADDitqxy3kzKAAAAABJRU5ErkJggg==\"","import React from 'react';\nimport ReactMapboxGl, { Layer, Feature, Popup } from 'react-mapbox-gl';\nimport styled from 'styled-components';\nimport 'mapbox-gl/dist/mapbox-gl.css';\nimport markerPin from './img/pin.png';\nimport { getLocations } from './util';\n\nlet markerPinImage = new Image();\nmarkerPinImage.src = markerPin;\nmarkerPinImage.width = 48;\nmarkerPinImage.height = 64;\n\nlet markerPinImageSmall = new Image();\nmarkerPinImageSmall.src = markerPin;\nmarkerPinImageSmall.width = 36;\nmarkerPinImageSmall.height = 48;\n\nlet markerImages = ['pin', markerPinImage];\nlet markerImagesSmall = ['smallpin', markerPinImageSmall];\n\nlet startCenter = [16.70214, 44.75974];\n\nfunction calcBounds(data, margin = 0.1, loc = (d) => d.location) {\n if (data.length === 0) return undefined;\n let min = [loc(data[0])[0], loc(data[0])[1]],\n max = min;\n data.forEach((d) => {\n let l = loc(d);\n min = [Math.min(min[0], l[0]), Math.min(min[1], l[1])];\n max = [Math.max(max[0], l[0]), Math.max(max[1], l[1])];\n });\n let d = [(max[0] - min[0]) * margin, (max[1] - min[1]) * margin];\n return [\n [min[0] - d[0], min[1] - d[1]],\n [max[0] + d[0], max[1] + d[1]],\n ];\n}\n\nlet Map = ReactMapboxGl({\n minZoom: 7,\n maxZoom: 16,\n accessToken:\n 'pk.eyJ1Ijoic3RldmVzY2hhcnBpcm8iLCJhIjoiY2s1NWNmYXg2MGYzdTNrbDhuZnpjZmVzbiJ9.cG_1CuNF6k9pvzWjCD-LcA',\n});\n\nexport default function MyMap(props) {\n let { data, filter, setFilter, setLocation } = props;\n\n let [ hover, setHover ] = React.useState(null); // { location, name }\n let [ locationBounds, setLocationBounds ] = React.useState();\n\n let locations = getLocations(filter, data);\n\n React.useEffect(() => {\n let bounds = calcBounds(locations)\n setLocationBounds(bounds, 0.2);\n setTimeout(() => {\n let vw = Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0)\n if (vw > 1000 && window.MAP) {\n window.MAP.fitBounds(bounds);\n }\n }, 1000);\n }, [data.length, filter]);\n\n return (\n \n (window.MAP = m)}\n center={startCenter}\n fitBounds={locationBounds}\n maxBounds={calcBounds(data, 0.3)}\n containerStyle={{\n height: '100%',\n width: '100%',\n }}\n >\n { hover && \n { hover.name }\n }\n \n {locations.map(loc => {\n let { totem_id, name, location } = loc;\n return (\n { setHover({name, location}); setLocationBounds(null); }}\n onMouseLeave={() => setHover(null)}\n onClick={() => setLocation(loc)}\n />\n )})}\n \n\n \n {data.map(({ city_id, name, location }) => (\n { setHover({name, location}); setLocationBounds(null); }}\n onMouseLeave={() => setHover(null)}\n onClick={() => setFilter({...filter, city: city_id})}/>\n ))}\n \n \n \n );\n}\n\nlet Wrap = styled.div`\n &.hover canvas {\n cursor: pointer;\n }\n`;\n","import styled from 'styled-components';\nimport Map from './Map';\nimport { getLocations } from './util';\n\nexport default function LocationList(props) {\n let { data, filter, setFilter, setLocation } = props;\n return (\n \n \n \n {getLocations(filter, data).map((l) => (\n props.setLocation(l)}\n name={l.name}\n city={l.city_name}\n image={l.images[0]?.main}\n />\n ))}\n \n \n \n \n \n \n );\n}\n\nlet Wrap = styled.div`\n .photos > div {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n align-content: flex-start;\n background: white;\n padding-top: 20px;\n padding-bottom: 60px;\n }\n\n @media (min-width: 1001px) {\n display: flex;\n flex: 1;\n align-items: stretch;\n\n .photos {\n display: flex;\n flex: 1;\n flex-direction: column;\n }\n\n .photos > div {\n flex: 1 1 auto;\n height: 0px;\n overflow-y: auto;\n }\n\n .map {\n flex: 1;\n }\n\n .mapbox-map {\n width: 100%;\n height: 100%;\n }\n }\n\n @media (max-width: 1000px) {\n .mapbox-map {\n display: none;\n }\n }\n`;\n\nfunction Location(props) {\n let { name, city, image, onClick } = props;\n return (\n \n \n \n \n { city }\n {name}\n \n );\n}\n\nlet LocationWrap = styled.div`\n cursor: pointer;\n box-sizing: border-box;\n width: 100%;\n padding: 10px 20px;\n\n img {\n width: 100%;\n height: 100%;\n position: absolute;\n object-fit: cover;\n top: 0;\n left: 0;\n transition: transform 0.4s ease-in-out;\n }\n\n &:hover img {\n transform: scale(1.1);\n }\n\n &:hover {\n color: #0cd459;\n }\n\n .img-wrap {\n width: 100%;\n padding-top: 56.25%; /* 16 : 9 */\n position: relative;\n overflow: hidden;\n margin-bottom: 10px;\n }\n\n .name {\n margin-top: 5px;\n font-size: 18px;\n }\n\n .city {\n text-transform: uppercase;\n font-weight: bold;\n font-size: 11px;\n letter-spacing: 1.1px;\n color: #707070;\n }\n\n @media (min-width: 500px) {\n width: 50%;\n padding: 12px;\n }\n\n @media (min-width: 1001px) {\n width: calc(50% - 30px);\n padding: 10px;\n\n &:nth-child(odd) {\n margin: 0 10px 0 20px;\n }\n\n &:nth-child(even) {\n margin: 0 20px 0 10px;\n }\n }\n`;\n","import React from 'react';\nimport ReactMapboxGl, { Layer, Feature } from 'react-mapbox-gl';\nimport 'mapbox-gl/dist/mapbox-gl.css';\nimport markerPin from './img/pin.png';\n\nlet markerPinImage = new Image();\nmarkerPinImage.src = markerPin;\nmarkerPinImage.width = 48;\nmarkerPinImage.height = 64;\n\nlet markerImages = ['pin', markerPinImage];\n\nlet Map = ReactMapboxGl({\n minZoom: 7,\n maxZoom: 16,\n accessToken:\n 'pk.eyJ1Ijoic3RldmVzY2hhcnBpcm8iLCJhIjoiY2s1NWNmYXg2MGYzdTNrbDhuZnpjZmVzbiJ9.cG_1CuNF6k9pvzWjCD-LcA',\n});\n\nexport default function MyMap(props) {\n return (\n \n \n \n \n \n );\n}\n","import styled from 'styled-components';\nimport { Carousel } from 'react-responsive-carousel';\nimport MyMap from './SingleLocationMap';\nimport \"react-responsive-carousel/lib/styles/carousel.min.css\";\n\nlet preventDefault = e => e.preventDefault();\n\nexport default function SingleLocation(props) {\n let l = props.location;\n\n return (\n \n \n \n { l.images.map(img => ) }\n \n \n props.setLocation(null)}>\n \n \n \n \n \n \n Sve lokacije\n\n { l.name }\n \n \n Grad\n { l.city_name }\n \n\n \n Rezolucija\n { l.screen_width }x{ l.screen_height }px\n \n\n \n Trajanje\n { l.ad_duration } sekundi\n \n\n \n Tip\n { l.motion_type || 'Full motion' }\n \n \n\n \n \n \n \n \n \n );\n}\n\nlet Wrap = styled.div`\n background: white;\n height: 100%;\n\n .inner {\n max-width: 1000px;\n margin: 0 auto;\n position: relative;\n }\n\n .location-carousel {\n width: 100%;\n\n .slide img {\n user-select: none;\n }\n\n .carousel.carousel-slider .control-arrow {\n width: 60px;\n }\n }\n\n @media (min-width: 1000px) {\n padding-top: 25px;\n }\n`;\n\nlet Body = styled.div`\n max-width: 1000px;\n margin: 0 auto;\n padding-top: 20px;\n\n h1 {\n font-size: 30px;\n color: #6c6c7a;\n font-weight: 300;\n }\n\n .info {\n margin-top: 25px;\n flex-wrap: wrap;\n display: flex;\n\n @media (min-width: 700px) {\n flex-wrap: nowrap;\n }\n }\n\n .info-item {\n margin-top: 10px;\n\n @media (min-width: 700px) {\n margin-top: 0;\n margin-right: 60px;\n }\n }\n\n .info-item > div:first-child {\n text-transform: uppercase;\n font-weight: bold;\n font-size: 12px;\n margin-bottom: 5px;\n }\n\n .info-item > div:last-child {\n font-weight: 300;\n font-size: 1.2em;\n color: #6c6c7a;\n }\n\n @media (max-width: 699px) {\n .info-item {\n width: 50%;\n }\n }\n\n .map {\n margin-top: 30px;\n width: 100%;\n height: 300px;\n }\n\n @media (max-width: 1000px) {\n h1, .info {\n padding: 0 25px;\n }\n }\n`;\n\nlet Back = styled.div`\n display: flex;\n align-items: center;\n cursor: pointer;\n user-select: none;\n color: #9999A5;\n text-decoration: none;\n height: 20px;\n margin-bottom: 20px;\n font-size: 16px;\n width: 160px;\n\n svg {\n margin-right: 10px;\n }\n\n .color {\n stroke: #9999A5;\n }\n\n &:hover, &:active {\n color: #0CD459;\n }\n\n &:hover .color, &:active .color {\n stroke: #0CD459;\n }\n\n @media (max-width: 1000px) {\n margin-left: 25px;\n }\n`;\n\n","import React from 'react';\nimport axios from 'axios';\nimport { createGlobalStyle } from 'styled-components';\nimport Head from './Head';\nimport LocationList from './LocationList';\nimport SingleLocation from './SingleLocation';\nimport queryString from 'query-string';\n\nconst qs = queryString.parse(window.location.search);\n\nexport default function App() {\n const [location, setLocation] = React.useState(null);\n const [data, setData] = React.useState([]);\n const [cityOptions, setCityOptions] = React.useState([]);\n const [filter, setFilter] = React.useState({\n city: null,\n type: null,\n format: null,\n });\n\n React.useEffect(() => {\n async function load() {\n let result = await axios('/api/totem/city/');\n let data = result.data.filter((d) => d.location != null);\n let locId = parseInt(qs.id);\n data.forEach((d) => {\n d.location = [d.location[1], d.location[0]];\n d.totems.forEach((t) => {\n t.location = [t.location[1], t.location[0]];\n t.city_name = d.name;\n if (t.totem_id === locId) setLocation(t);\n });\n d.totems = d.totems.filter(t => t.is_installed);\n });\n setData(data);\n let cityOptions = [\n { value: null, label: 'Svi gradovi' },\n ...data.map((c) => ({ value: c.city_id, label: c.name })),\n ];\n setCityOptions(cityOptions);\n }\n load();\n }, []);\n\n React.useEffect(() => {\n let f = e => {\n const qs = queryString.parse(window.location.search);\n let id = parseInt(qs.id);\n if (isNaN(id) || !isFinite(id)) return setLocation(null);\n data.forEach(d => {\n d.totems.forEach(t => {\n if (t.totem_id === id) setLocation(t);\n });\n });\n };\n window.addEventListener('popstate', f);\n return () => {\n window.removeEventListener('popstate', f);\n };\n }, [data]);\n\n function setLocationAndUrl(l) {\n setLocation(l);\n if (l == null) {\n window.history.pushState(null, null, '/locations/');\n } else {\n window.history.pushState(null, null, `/locations/?id=${l.totem_id}`);\n }\n }\n\n return (\n <>\n \n {location == null && (\n <>\n
{ hover.name }