| 
									
										
										
										
											2023-03-24 19:21:15 +01:00
										 |  |  | <script lang="ts"> | 
					
						
							| 
									
										
										
										
											2023-12-12 17:08:59 +01:00
										 |  |  |   import { Store, UIEventSource } from "../Logic/UIEventSource" | 
					
						
							|  |  |  |   import { Map as MlMap } from "maplibre-gl" | 
					
						
							|  |  |  |   import MaplibreMap from "./Map/MaplibreMap.svelte" | 
					
						
							|  |  |  |   import FeatureSwitchState from "../Logic/State/FeatureSwitchState" | 
					
						
							|  |  |  |   import MapControlButton from "./Base/MapControlButton.svelte" | 
					
						
							|  |  |  |   import ToSvelte from "./Base/ToSvelte.svelte" | 
					
						
							|  |  |  |   import If from "./Base/If.svelte" | 
					
						
							|  |  |  |   import type { Feature } from "geojson" | 
					
						
							|  |  |  |   import SelectedElementView from "./BigComponents/SelectedElementView.svelte" | 
					
						
							|  |  |  |   import LayerConfig from "../Models/ThemeConfig/LayerConfig" | 
					
						
							|  |  |  |   import ThemeViewState from "../Models/ThemeViewState" | 
					
						
							|  |  |  |   import type { MapProperties } from "../Models/MapProperties" | 
					
						
							|  |  |  |   import Geosearch from "./BigComponents/Geosearch.svelte" | 
					
						
							|  |  |  |   import Translations from "./i18n/Translations" | 
					
						
							| 
									
										
										
										
											2024-01-03 18:24:00 +01:00
										 |  |  |   import { CogIcon, EyeIcon, HeartIcon, MenuIcon, XCircleIcon } from "@rgossiaux/svelte-heroicons/solid" | 
					
						
							| 
									
										
										
										
											2023-12-12 17:08:59 +01:00
										 |  |  |   import Tr from "./Base/Tr.svelte" | 
					
						
							|  |  |  |   import CommunityIndexView from "./BigComponents/CommunityIndexView.svelte" | 
					
						
							|  |  |  |   import FloatOver from "./Base/FloatOver.svelte" | 
					
						
							|  |  |  |   import Constants from "../Models/Constants" | 
					
						
							|  |  |  |   import TabbedGroup from "./Base/TabbedGroup.svelte" | 
					
						
							|  |  |  |   import UserRelatedState from "../Logic/State/UserRelatedState" | 
					
						
							|  |  |  |   import LoginToggle from "./Base/LoginToggle.svelte" | 
					
						
							|  |  |  |   import LoginButton from "./Base/LoginButton.svelte" | 
					
						
							|  |  |  |   import CopyrightPanel from "./BigComponents/CopyrightPanel" | 
					
						
							|  |  |  |   import DownloadPanel from "./DownloadFlow/DownloadPanel.svelte" | 
					
						
							|  |  |  |   import ModalRight from "./Base/ModalRight.svelte" | 
					
						
							|  |  |  |   import { Utils } from "../Utils" | 
					
						
							|  |  |  |   import Hotkeys from "./Base/Hotkeys" | 
					
						
							|  |  |  |   import LevelSelector from "./BigComponents/LevelSelector.svelte" | 
					
						
							|  |  |  |   import ExtraLinkButton from "./BigComponents/ExtraLinkButton" | 
					
						
							|  |  |  |   import SelectedElementTitle from "./BigComponents/SelectedElementTitle.svelte" | 
					
						
							|  |  |  |   import ThemeIntroPanel from "./BigComponents/ThemeIntroPanel.svelte" | 
					
						
							|  |  |  |   import type { RasterLayerPolygon } from "../Models/RasterLayers" | 
					
						
							|  |  |  |   import { AvailableRasterLayers } from "../Models/RasterLayers" | 
					
						
							|  |  |  |   import RasterLayerOverview from "./Map/RasterLayerOverview.svelte" | 
					
						
							|  |  |  |   import IfHidden from "./Base/IfHidden.svelte" | 
					
						
							|  |  |  |   import { onDestroy } from "svelte" | 
					
						
							|  |  |  |   import MapillaryLink from "./BigComponents/MapillaryLink.svelte" | 
					
						
							|  |  |  |   import OpenIdEditor from "./BigComponents/OpenIdEditor.svelte" | 
					
						
							|  |  |  |   import OpenBackgroundSelectorButton from "./BigComponents/OpenBackgroundSelectorButton.svelte" | 
					
						
							|  |  |  |   import StateIndicator from "./BigComponents/StateIndicator.svelte" | 
					
						
							|  |  |  |   import ShareScreen from "./BigComponents/ShareScreen.svelte" | 
					
						
							|  |  |  |   import UploadingImageCounter from "./Image/UploadingImageCounter.svelte" | 
					
						
							|  |  |  |   import PendingChangesIndicator from "./BigComponents/PendingChangesIndicator.svelte" | 
					
						
							|  |  |  |   import Cross from "../assets/svg/Cross.svelte" | 
					
						
							|  |  |  |   import LanguagePicker from "./InputElement/LanguagePicker.svelte" | 
					
						
							|  |  |  |   import Mastodon from "../assets/svg/Mastodon.svelte" | 
					
						
							|  |  |  |   import Bug from "../assets/svg/Bug.svelte" | 
					
						
							|  |  |  |   import Liberapay from "../assets/svg/Liberapay.svelte" | 
					
						
							|  |  |  |   import OpenJosm from "./Base/OpenJosm.svelte" | 
					
						
							|  |  |  |   import Min from "../assets/svg/Min.svelte" | 
					
						
							|  |  |  |   import Plus from "../assets/svg/Plus.svelte" | 
					
						
							|  |  |  |   import Filter from "../assets/svg/Filter.svelte" | 
					
						
							|  |  |  |   import Add from "../assets/svg/Add.svelte" | 
					
						
							|  |  |  |   import Community from "../assets/svg/Community.svelte" | 
					
						
							|  |  |  |   import Download from "../assets/svg/Download.svelte" | 
					
						
							|  |  |  |   import Share from "../assets/svg/Share.svelte" | 
					
						
							|  |  |  |   import Favourites from "./Favourites/Favourites.svelte" | 
					
						
							|  |  |  |   import ImageOperations from "./Image/ImageOperations.svelte" | 
					
						
							| 
									
										
										
										
											2023-12-15 01:46:01 +01:00
										 |  |  |   import VisualFeedbackPanel from "./BigComponents/VisualFeedbackPanel.svelte" | 
					
						
							| 
									
										
										
										
											2023-12-18 01:58:58 +01:00
										 |  |  |   import { Orientation } from "../Sensors/Orientation" | 
					
						
							| 
									
										
										
										
											2023-12-18 01:30:02 +01:00
										 |  |  |   import GeolocationControl from "./BigComponents/GeolocationControl.svelte" | 
					
						
							|  |  |  |   import Compass_arrow from "../assets/svg/Compass_arrow.svelte" | 
					
						
							| 
									
										
										
										
											2023-12-19 22:21:34 +01:00
										 |  |  |   import ReverseGeocoding from "./BigComponents/ReverseGeocoding.svelte" | 
					
						
							|  |  |  |   import FilterPanel from "./BigComponents/FilterPanel.svelte" | 
					
						
							| 
									
										
										
										
											2023-12-20 02:50:08 +01:00
										 |  |  |   import PrivacyPolicy from "./BigComponents/PrivacyPolicy.svelte" | 
					
						
							|  |  |  |   import { BBox } from "../Logic/BBox" | 
					
						
							| 
									
										
										
										
											2023-12-05 18:35:18 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-12 17:08:59 +01:00
										 |  |  |   export let state: ThemeViewState | 
					
						
							|  |  |  |   let layout = state.layout | 
					
						
							|  |  |  |   let maplibremap: UIEventSource<MlMap> = state.map | 
					
						
							|  |  |  |   let selectedElement: UIEventSource<Feature> = new UIEventSource<Feature>(undefined) | 
					
						
							| 
									
										
										
										
											2024-01-01 03:29:57 +01:00
										 |  |  |   selectedElement.addCallbackAndRun(se => console.log("Selected element", se)) | 
					
						
							| 
									
										
										
										
											2023-12-16 01:29:42 +01:00
										 |  |  |   let compass = Orientation.singleton.alpha | 
					
						
							|  |  |  |   let compassLoaded = Orientation.singleton.gotMeasurement | 
					
						
							| 
									
										
										
										
											2023-12-16 01:42:45 +01:00
										 |  |  |   Orientation.singleton.startMeasurements() | 
					
						
							| 
									
										
										
										
											2023-12-19 23:02:02 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-19 22:08:00 +01:00
										 |  |  |   state.selectedElement.addCallback((selected) => { | 
					
						
							| 
									
										
										
										
											2023-12-12 17:08:59 +01:00
										 |  |  |     if (!selected) { | 
					
						
							| 
									
										
										
										
											2023-12-06 17:27:30 +01:00
										 |  |  |       selectedElement.setData(selected) | 
					
						
							|  |  |  |       return | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2023-12-12 17:08:59 +01:00
										 |  |  |     if (selected !== selectedElement.data) { | 
					
						
							| 
									
										
										
										
											2023-12-06 17:27:30 +01:00
										 |  |  |       // We first set the selected element to 'undefined' to force the popup to close... | 
					
						
							|  |  |  |       selectedElement.setData(undefined) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     // ... we give svelte some time to update with requestAnimationFrame ... | 
					
						
							|  |  |  |     window.requestAnimationFrame(() => { | 
					
						
							| 
									
										
										
										
											2023-12-21 01:46:18 +01:00
										 |  |  |       // ... and we force a fresh popup window | 
					
						
							| 
									
										
										
										
											2023-12-12 17:08:59 +01:00
										 |  |  |       selectedElement.setData(selected) | 
					
						
							| 
									
										
										
										
											2023-12-06 17:27:30 +01:00
										 |  |  |     }) | 
					
						
							|  |  |  |   }) | 
					
						
							| 
									
										
										
										
											2023-11-30 01:41:41 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-03 18:24:00 +01:00
										 |  |  |   let selectedLayer: Store<LayerConfig> = state.selectedElement.mapD((element) => { | 
					
						
							|  |  |  |       if (element.properties.id.startsWith("current_view")) { | 
					
						
							|  |  |  |         return currentViewLayer | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2024-01-11 02:20:57 +01:00
										 |  |  |       if(element.properties.id === "location_track"){ | 
					
						
							|  |  |  |         return layout.layers.find(l => l.id === "gps_track") | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2024-01-03 18:24:00 +01:00
										 |  |  |       return state.layout.getMatchingLayer(element.properties) | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2023-12-19 22:08:00 +01:00
										 |  |  |   ) | 
					
						
							| 
									
										
										
										
											2023-12-12 17:08:59 +01:00
										 |  |  |   let currentZoom = state.mapProperties.zoom | 
					
						
							|  |  |  |   let showCrosshair = state.userRelatedState.showCrosshair | 
					
						
							| 
									
										
										
										
											2023-12-20 02:50:08 +01:00
										 |  |  |   let visualFeedback = state.visualFeedback | 
					
						
							|  |  |  |   let viewport: UIEventSource<HTMLDivElement> = new UIEventSource<HTMLDivElement>(undefined) | 
					
						
							| 
									
										
										
										
											2023-12-21 17:36:43 +01:00
										 |  |  |   let mapproperties: MapProperties = state.mapProperties | 
					
						
							| 
									
										
										
										
											2023-12-22 18:50:22 +01:00
										 |  |  |   state.mapProperties.installCustomKeyboardHandler(viewport) | 
					
						
							| 
									
										
										
										
											2024-01-03 18:24:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-21 17:36:43 +01:00
										 |  |  |   function updateViewport() { | 
					
						
							|  |  |  |     const rect = viewport.data?.getBoundingClientRect() | 
					
						
							|  |  |  |     if (!rect) { | 
					
						
							|  |  |  |       return | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     const mlmap = state.map.data | 
					
						
							|  |  |  |     if (!mlmap) { | 
					
						
							|  |  |  |       return undefined | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     const topLeft = mlmap.unproject([rect.left, rect.top]) | 
					
						
							|  |  |  |     const bottomRight = mlmap.unproject([rect.right, rect.bottom]) | 
					
						
							|  |  |  |     const bbox = new BBox([ | 
					
						
							|  |  |  |       [topLeft.lng, topLeft.lat], | 
					
						
							|  |  |  |       [bottomRight.lng, bottomRight.lat], | 
					
						
							|  |  |  |     ]) | 
					
						
							|  |  |  |     state.visualFeedbackViewportBounds.setData(bbox) | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-30 15:24:30 +01:00
										 |  |  |   viewport.addCallbackAndRunD((_) => { | 
					
						
							| 
									
										
										
										
											2023-12-21 17:36:43 +01:00
										 |  |  |     updateViewport() | 
					
						
							|  |  |  |   }) | 
					
						
							| 
									
										
										
										
											2023-12-30 15:24:30 +01:00
										 |  |  |   mapproperties.bounds.addCallbackAndRunD((_) => { | 
					
						
							| 
									
										
										
										
											2023-12-21 17:36:43 +01:00
										 |  |  |     updateViewport() | 
					
						
							| 
									
										
										
										
											2023-12-20 02:50:08 +01:00
										 |  |  |   }) | 
					
						
							| 
									
										
										
										
											2023-12-12 17:08:59 +01:00
										 |  |  |   let featureSwitches: FeatureSwitchState = state.featureSwitches | 
					
						
							|  |  |  |   let availableLayers = state.availableLayers | 
					
						
							|  |  |  |   let currentViewLayer = layout.layers.find((l) => l.id === "current_view") | 
					
						
							|  |  |  |   let rasterLayer: Store<RasterLayerPolygon> = state.mapProperties.rasterLayer | 
					
						
							| 
									
										
										
										
											2023-12-06 17:27:30 +01:00
										 |  |  |   let rasterLayerName = | 
					
						
							| 
									
										
										
										
											2023-12-12 17:08:59 +01:00
										 |  |  |     rasterLayer.data?.properties?.name ?? AvailableRasterLayers.maptilerDefaultLayer.properties.name | 
					
						
							| 
									
										
										
										
											2023-12-06 17:27:30 +01:00
										 |  |  |   onDestroy( | 
					
						
							|  |  |  |     rasterLayer.addCallbackAndRunD((l) => { | 
					
						
							| 
									
										
										
										
											2023-12-12 17:08:59 +01:00
										 |  |  |       rasterLayerName = l.properties.name | 
					
						
							| 
									
										
										
										
											2024-01-03 18:24:00 +01:00
										 |  |  |     }), | 
					
						
							| 
									
										
										
										
											2023-12-12 17:08:59 +01:00
										 |  |  |   ) | 
					
						
							|  |  |  |   let previewedImage = state.previewedImage | 
					
						
							| 
									
										
										
										
											2023-12-30 15:24:30 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-26 22:30:27 +01:00
										 |  |  |   let debug = state.featureSwitches.featureSwitchIsDebugging | 
					
						
							| 
									
										
										
										
											2023-12-30 15:24:30 +01:00
										 |  |  |   debug.addCallbackAndRun((dbg) => { | 
					
						
							|  |  |  |     if (dbg) { | 
					
						
							| 
									
										
										
										
											2023-12-26 22:30:27 +01:00
										 |  |  |       document.body.classList.add("debug") | 
					
						
							| 
									
										
										
										
											2023-12-30 15:24:30 +01:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2023-12-26 22:30:27 +01:00
										 |  |  |       document.body.classList.remove("debug") | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   }) | 
					
						
							| 
									
										
										
										
											2023-12-12 17:08:59 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   function forwardEventToMap(e: KeyboardEvent) { | 
					
						
							|  |  |  |     const mlmap = state.map.data | 
					
						
							| 
									
										
										
										
											2023-12-15 01:46:01 +01:00
										 |  |  |     if (!mlmap) { | 
					
						
							| 
									
										
										
										
											2023-12-12 17:08:59 +01:00
										 |  |  |       return | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2023-12-15 01:46:01 +01:00
										 |  |  |     if (!mlmap.keyboard.isEnabled()) { | 
					
						
							| 
									
										
										
										
											2023-12-12 17:08:59 +01:00
										 |  |  |       return | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     const animation = mlmap.keyboard?.keydown(e) | 
					
						
							|  |  |  |     animation?.cameraAnimation(mlmap) | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2023-03-24 19:21:15 +01:00
										 |  |  | </script> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-14 20:44:01 +02:00
										 |  |  | <div class="absolute top-0 left-0 h-screen w-screen overflow-hidden"> | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |   <MaplibreMap map={maplibremap} /> | 
					
						
							| 
									
										
										
										
											2023-03-24 19:21:15 +01:00
										 |  |  | </div> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-20 02:50:08 +01:00
										 |  |  | {#if $visualFeedback} | 
					
						
							| 
									
										
										
										
											2023-12-21 01:46:18 +01:00
										 |  |  |   <div | 
					
						
							| 
									
										
										
										
											2023-12-30 15:24:30 +01:00
										 |  |  |     class="pointer-events-none absolute top-0 left-0 flex h-screen w-screen items-center justify-center overflow-hidden" | 
					
						
							| 
									
										
										
										
											2023-12-21 01:46:18 +01:00
										 |  |  |   > | 
					
						
							| 
									
										
										
										
											2023-12-30 15:24:30 +01:00
										 |  |  |     <div | 
					
						
							|  |  |  |       bind:this={$viewport} | 
					
						
							|  |  |  |       class:border={$visualFeedback} | 
					
						
							|  |  |  |       style="border: 2px solid #ff000044; width: 300px; height: 300px" | 
					
						
							|  |  |  |     /> | 
					
						
							| 
									
										
										
										
											2023-12-20 02:50:08 +01:00
										 |  |  |   </div> | 
					
						
							|  |  |  | {/if} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-14 20:44:01 +02:00
										 |  |  | <div class="pointer-events-none absolute top-0 left-0 w-full"> | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |   <!-- Top components --> | 
					
						
							| 
									
										
										
										
											2023-12-21 17:36:43 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-30 15:24:30 +01:00
										 |  |  |   <div class="pointer-events-auto float-right mt-1 flex flex-col px-1 max-[480px]:w-full sm:m-2"> | 
					
						
							| 
									
										
										
										
											2023-12-21 17:36:43 +01:00
										 |  |  |     <If condition={state.visualFeedback}> | 
					
						
							| 
									
										
										
										
											2024-01-03 18:24:00 +01:00
										 |  |  |       {#if $selectedElement === undefined} | 
					
						
							|  |  |  |         <div class="w-fit"> | 
					
						
							|  |  |  |           <VisualFeedbackPanel {state} /> | 
					
						
							|  |  |  |         </div> | 
					
						
							| 
									
										
										
										
											2024-01-01 03:29:57 +01:00
										 |  |  |       {/if} | 
					
						
							| 
									
										
										
										
											2023-12-21 17:36:43 +01:00
										 |  |  |     </If> | 
					
						
							|  |  |  |     <If condition={state.featureSwitches.featureSwitchSearch}> | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |       <Geosearch | 
					
						
							|  |  |  |         bounds={state.mapProperties.bounds} | 
					
						
							| 
									
										
										
										
											2023-12-21 01:46:18 +01:00
										 |  |  |         on:searchCompleted={() => { | 
					
						
							|  |  |  |           state.map?.data?.getCanvas()?.focus() | 
					
						
							|  |  |  |         }} | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |         perLayer={state.perLayer} | 
					
						
							| 
									
										
										
										
											2023-12-06 17:27:30 +01:00
										 |  |  |         selectedElement={state.selectedElement} | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |       /> | 
					
						
							| 
									
										
										
										
											2023-12-21 17:36:43 +01:00
										 |  |  |     </If> | 
					
						
							|  |  |  |   </div> | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |   <div class="float-left m-1 flex flex-col sm:mt-2"> | 
					
						
							| 
									
										
										
										
											2023-12-21 01:46:18 +01:00
										 |  |  |     <MapControlButton | 
					
						
							|  |  |  |       on:click={() => state.guistate.themeIsOpened.setData(true)} | 
					
						
							|  |  |  |       on:keydown={forwardEventToMap} | 
					
						
							|  |  |  |     > | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |       <div class="m-0.5 mx-1 flex cursor-pointer items-center max-[480px]:w-full sm:mx-1 md:mx-2"> | 
					
						
							|  |  |  |         <img class="mr-0.5 block h-6 w-6 sm:mr-1 md:mr-2 md:h-8 md:w-8" src={layout.icon} /> | 
					
						
							|  |  |  |         <b class="mr-1"> | 
					
						
							|  |  |  |           <Tr t={layout.title} /> | 
					
						
							|  |  |  |         </b> | 
					
						
							|  |  |  |       </div> | 
					
						
							|  |  |  |     </MapControlButton> | 
					
						
							| 
									
										
										
										
											2023-12-14 18:25:35 +01:00
										 |  |  |     <MapControlButton | 
					
						
							|  |  |  |       arialabel={Translations.t.general.labels.menu} | 
					
						
							| 
									
										
										
										
											2023-12-15 01:46:01 +01:00
										 |  |  |       on:click={() => state.guistate.menuIsOpened.setData(true)} | 
					
						
							|  |  |  |       on:keydown={forwardEventToMap} | 
					
						
							| 
									
										
										
										
											2023-12-14 18:25:35 +01:00
										 |  |  |     > | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |       <MenuIcon class="h-8 w-8 cursor-pointer" /> | 
					
						
							|  |  |  |     </MapControlButton> | 
					
						
							|  |  |  |     {#if currentViewLayer?.tagRenderings && currentViewLayer.defaultIcon()} | 
					
						
							|  |  |  |       <MapControlButton | 
					
						
							|  |  |  |         on:click={() => { | 
					
						
							| 
									
										
										
										
											2024-01-03 18:24:00 +01:00
										 |  |  |           state.selectedElement.setData(state.currentView.features?.data?.[0]) | 
					
						
							| 
									
										
										
										
											2023-12-15 01:46:01 +01:00
										 |  |  |         }} | 
					
						
							| 
									
										
										
										
											2023-12-14 18:25:35 +01:00
										 |  |  |         on:keydown={forwardEventToMap} | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |       > | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |         <ToSvelte | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |           construct={() => currentViewLayer.defaultIcon().SetClass("w-8 h-8 cursor-pointer")} | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |         /> | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |       </MapControlButton> | 
					
						
							|  |  |  |     {/if} | 
					
						
							|  |  |  |     <ToSvelte | 
					
						
							|  |  |  |       construct={() => new ExtraLinkButton(state, layout.extraLink).SetClass("pointer-events-auto")} | 
					
						
							|  |  |  |     /> | 
					
						
							| 
									
										
										
										
											2023-10-19 12:23:13 +02:00
										 |  |  |     <UploadingImageCounter featureId="*" showThankYou={false} {state} /> | 
					
						
							| 
									
										
										
										
											2023-10-16 14:27:05 +02:00
										 |  |  |     <PendingChangesIndicator {state} /> | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |     <If condition={state.featureSwitchIsTesting}> | 
					
						
							|  |  |  |       <div class="alert w-fit">Testmode</div> | 
					
						
							|  |  |  |     </If> | 
					
						
							|  |  |  |   </div> | 
					
						
							| 
									
										
										
										
											2023-12-21 01:46:18 +01:00
										 |  |  |   <div class="flex w-full flex-col items-center justify-center"> | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |     <!-- Flex and w-full are needed for the positioning --> | 
					
						
							|  |  |  |     <!-- Centermessage --> | 
					
						
							|  |  |  |     <StateIndicator {state} /> | 
					
						
							| 
									
										
										
										
											2023-12-21 17:36:43 +01:00
										 |  |  |     <ReverseGeocoding {state} /> | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |   </div> | 
					
						
							| 
									
										
										
										
											2023-03-24 19:21:15 +01:00
										 |  |  | </div> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-14 20:44:01 +02:00
										 |  |  | <div class="pointer-events-none absolute bottom-0 left-0 mb-4 w-screen"> | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |   <!-- bottom controls --> | 
					
						
							|  |  |  |   <div class="flex w-full items-end justify-between px-4"> | 
					
						
							| 
									
										
										
										
											2023-10-09 01:26:12 +02:00
										 |  |  |     <div class="flex flex-col"> | 
					
						
							| 
									
										
										
										
											2023-10-11 01:41:42 +02:00
										 |  |  |       <If condition={featureSwitches.featureSwitchEnableLogin}> | 
					
						
							|  |  |  |         {#if state.lastClickObject.hasPresets || state.lastClickObject.hasNoteLayer} | 
					
						
							| 
									
										
										
										
											2023-10-16 14:27:05 +02:00
										 |  |  |           <button | 
					
						
							|  |  |  |             class="pointer-events-auto w-fit" | 
					
						
							|  |  |  |             on:click={() => { | 
					
						
							|  |  |  |               state.openNewDialog() | 
					
						
							|  |  |  |             }} | 
					
						
							| 
									
										
										
										
											2023-12-12 17:08:59 +01:00
										 |  |  |             on:keydown={forwardEventToMap} | 
					
						
							| 
									
										
										
										
											2023-10-16 14:27:05 +02:00
										 |  |  |           > | 
					
						
							| 
									
										
										
										
											2023-10-11 01:41:42 +02:00
										 |  |  |             {#if state.lastClickObject.hasPresets} | 
					
						
							|  |  |  |               <Tr t={Translations.t.general.add.title} /> | 
					
						
							|  |  |  |             {:else} | 
					
						
							|  |  |  |               <Tr t={Translations.t.notes.addAComment} /> | 
					
						
							|  |  |  |             {/if} | 
					
						
							|  |  |  |           </button> | 
					
						
							|  |  |  |         {/if} | 
					
						
							|  |  |  |       </If> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-09 01:26:12 +02:00
										 |  |  |       <div class="flex"> | 
					
						
							|  |  |  |         <!-- bottom left elements --> | 
					
						
							| 
									
										
										
										
											2023-10-11 01:41:42 +02:00
										 |  |  |         <If condition={state.featureSwitches.featureSwitchFilter}> | 
					
						
							| 
									
										
										
										
											2023-12-21 01:46:18 +01:00
										 |  |  |           <MapControlButton | 
					
						
							|  |  |  |             arialabel={Translations.t.general.labels.filter} | 
					
						
							|  |  |  |             on:click={() => state.guistate.openFilterView()} | 
					
						
							|  |  |  |             on:keydown={forwardEventToMap} | 
					
						
							| 
									
										
										
										
											2023-12-14 18:25:35 +01:00
										 |  |  |           > | 
					
						
							| 
									
										
										
										
											2023-11-30 01:41:41 +01:00
										 |  |  |             <Filter class="h-6 w-6" /> | 
					
						
							| 
									
										
										
										
											2023-10-11 01:41:42 +02:00
										 |  |  |           </MapControlButton> | 
					
						
							|  |  |  |         </If> | 
					
						
							|  |  |  |         <If condition={state.featureSwitches.featureSwitchBackgroundSelection}> | 
					
						
							|  |  |  |           <OpenBackgroundSelectorButton hideTooltip={true} {state} /> | 
					
						
							|  |  |  |         </If> | 
					
						
							| 
									
										
										
										
											2023-10-09 01:26:12 +02:00
										 |  |  |         <a | 
					
						
							|  |  |  |           class="bg-black-transparent pointer-events-auto h-fit max-h-12 cursor-pointer self-end overflow-hidden rounded-2xl pl-1 pr-2 text-white opacity-50 hover:opacity-100" | 
					
						
							|  |  |  |           on:click={() => { | 
					
						
							| 
									
										
										
										
											2023-10-16 14:27:05 +02:00
										 |  |  |             state.guistate.themeViewTab.setData("copyright") | 
					
						
							|  |  |  |             state.guistate.themeIsOpened.setData(true) | 
					
						
							|  |  |  |           }} | 
					
						
							| 
									
										
										
										
											2023-10-09 01:26:12 +02:00
										 |  |  |         > | 
					
						
							|  |  |  |           © OpenStreetMap, <span class="w-24">{rasterLayerName}</span> | 
					
						
							|  |  |  |         </a> | 
					
						
							|  |  |  |       </div> | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |     </div> | 
					
						
							| 
									
										
										
										
											2023-12-15 01:46:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |     <div class="flex flex-col items-end"> | 
					
						
							|  |  |  |       <!-- bottom right elements --> | 
					
						
							|  |  |  |       <If condition={state.floors.map((f) => f.length > 1)}> | 
					
						
							|  |  |  |         <div class="pointer-events-auto mr-0.5"> | 
					
						
							|  |  |  |           <LevelSelector | 
					
						
							|  |  |  |             floors={state.floors} | 
					
						
							|  |  |  |             layerState={state.layerState} | 
					
						
							|  |  |  |             zoom={state.mapProperties.zoom} | 
					
						
							|  |  |  |           /> | 
					
						
							|  |  |  |         </div> | 
					
						
							|  |  |  |       </If> | 
					
						
							| 
									
										
										
										
											2023-12-21 01:46:18 +01:00
										 |  |  |       <MapControlButton | 
					
						
							|  |  |  |         arialabel={Translations.t.general.labels.zoomIn} | 
					
						
							|  |  |  |         on:click={() => mapproperties.zoom.update((z) => z + 1)} | 
					
						
							|  |  |  |         on:keydown={forwardEventToMap} | 
					
						
							| 
									
										
										
										
											2023-12-14 18:25:35 +01:00
										 |  |  |       > | 
					
						
							| 
									
										
										
										
											2023-12-01 15:23:28 +01:00
										 |  |  |         <Plus class="h-8 w-8" /> | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |       </MapControlButton> | 
					
						
							| 
									
										
										
										
											2023-12-21 01:46:18 +01:00
										 |  |  |       <MapControlButton | 
					
						
							|  |  |  |         arialabel={Translations.t.general.labels.zoomOut} | 
					
						
							|  |  |  |         on:click={() => mapproperties.zoom.update((z) => z - 1)} | 
					
						
							|  |  |  |         on:keydown={forwardEventToMap} | 
					
						
							| 
									
										
										
										
											2023-12-14 18:25:35 +01:00
										 |  |  |       > | 
					
						
							| 
									
										
										
										
											2023-12-01 15:23:28 +01:00
										 |  |  |         <Min class="h-8 w-8" /> | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |       </MapControlButton> | 
					
						
							|  |  |  |       <If condition={featureSwitches.featureSwitchGeolocation}> | 
					
						
							| 
									
										
										
										
											2023-12-20 02:50:08 +01:00
										 |  |  |         <div class="relative m-0"> | 
					
						
							| 
									
										
										
										
											2023-12-21 01:46:18 +01:00
										 |  |  |           <MapControlButton | 
					
						
							|  |  |  |             arialabel={Translations.t.general.labels.jumpToLocation} | 
					
						
							|  |  |  |             on:click={() => state.geolocationControl.handleClick()} | 
					
						
							|  |  |  |             on:keydown={forwardEventToMap} | 
					
						
							| 
									
										
										
										
											2023-12-18 01:30:02 +01:00
										 |  |  |           > | 
					
						
							| 
									
										
										
										
											2023-12-21 01:46:18 +01:00
										 |  |  |             <GeolocationControl {state} /> | 
					
						
							|  |  |  |             <!-- h-8 w-8 + p-0.5 sm:p-1 + 2px border => 9 sm: 10 in total--> | 
					
						
							| 
									
										
										
										
											2023-12-18 01:30:02 +01:00
										 |  |  |           </MapControlButton> | 
					
						
							| 
									
										
										
										
											2023-12-16 01:29:42 +01:00
										 |  |  |           {#if $compassLoaded} | 
					
						
							| 
									
										
										
										
											2023-12-21 01:46:18 +01:00
										 |  |  |             <div class="absolute top-0 left-0 m-0.5 h-0 w-0 sm:m-1"> | 
					
						
							|  |  |  |               <Compass_arrow | 
					
						
							|  |  |  |                 class="compass_arrow" | 
					
						
							|  |  |  |                 style={`rotate: calc(${-$compass}deg + 45deg); transform-origin: 50% 50%;`} | 
					
						
							|  |  |  |               /> | 
					
						
							| 
									
										
										
										
											2023-12-16 01:29:42 +01:00
										 |  |  |             </div> | 
					
						
							|  |  |  |           {/if} | 
					
						
							|  |  |  |         </div> | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |       </If> | 
					
						
							| 
									
										
										
										
											2023-05-18 15:44:54 +02:00
										 |  |  |     </div> | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |   </div> | 
					
						
							| 
									
										
										
										
											2023-03-24 19:21:15 +01:00
										 |  |  | </div> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-30 13:44:27 +01:00
										 |  |  | <LoginToggle ignoreLoading={true} {state}> | 
					
						
							| 
									
										
										
										
											2023-12-20 02:50:08 +01:00
										 |  |  |   {#if ($showCrosshair === "yes" && $currentZoom >= 17) || $showCrosshair === "always" || $visualFeedback} | 
					
						
							| 
									
										
										
										
											2023-11-16 03:32:04 +01:00
										 |  |  |     <div | 
					
						
							|  |  |  |       class="pointer-events-none absolute top-0 left-0 flex h-full w-full items-center justify-center" | 
					
						
							|  |  |  |     > | 
					
						
							|  |  |  |       <Cross class="h-4 w-4" /> | 
					
						
							|  |  |  |     </div> | 
					
						
							|  |  |  |   {/if} | 
					
						
							| 
									
										
										
										
											2023-12-21 01:46:18 +01:00
										 |  |  |   <svelte:fragment slot="error" /> | 
					
						
							|  |  |  |   <!-- Add in an empty container to remove errors --> | 
					
						
							| 
									
										
										
										
											2023-10-15 01:05:09 +02:00
										 |  |  | </LoginToggle> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-19 22:08:00 +01:00
										 |  |  | <If condition={state.previewedImage.map((i) => i !== undefined)}> | 
					
						
							| 
									
										
										
										
											2023-12-06 17:27:30 +01:00
										 |  |  |   <FloatOver extraClasses="p-1" on:close={() => state.previewedImage.setData(undefined)}> | 
					
						
							| 
									
										
										
										
											2023-12-05 18:35:18 +01:00
										 |  |  |     <div | 
					
						
							| 
									
										
										
										
											2023-12-19 22:08:00 +01:00
										 |  |  |       class="absolute right-4 top-4 h-8 w-8 cursor-pointer rounded-full bg-white/50 transition-colors duration-200 hover:bg-white" | 
					
						
							| 
									
										
										
										
											2023-12-05 18:35:18 +01:00
										 |  |  |       on:click={() => previewedImage.setData(undefined)} | 
					
						
							| 
									
										
										
										
											2023-12-06 17:27:30 +01:00
										 |  |  |       slot="close-button" | 
					
						
							| 
									
										
										
										
											2023-12-05 18:35:18 +01:00
										 |  |  |     > | 
					
						
							|  |  |  |       <XCircleIcon /> | 
					
						
							|  |  |  |     </div> | 
					
						
							| 
									
										
										
										
											2023-12-07 21:57:20 +01:00
										 |  |  |     <ImageOperations image={$previewedImage} /> | 
					
						
							| 
									
										
										
										
											2023-12-05 18:35:18 +01:00
										 |  |  |   </FloatOver> | 
					
						
							|  |  |  | </If> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-19 22:08:00 +01:00
										 |  |  | {#if $selectedElement !== undefined && $selectedLayer !== undefined && !$selectedLayer.popupInFloatover} | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |   <!-- right modal with the selected element view --> | 
					
						
							|  |  |  |   <ModalRight | 
					
						
							|  |  |  |     on:close={() => { | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |       selectedElement.setData(undefined) | 
					
						
							|  |  |  |     }} | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |   > | 
					
						
							| 
									
										
										
										
											2023-12-12 17:08:59 +01:00
										 |  |  |     <div slot="close-button" /> | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |     <div class="normal-background absolute flex h-full w-full flex-col"> | 
					
						
							| 
									
										
										
										
											2023-12-06 17:27:30 +01:00
										 |  |  |       <SelectedElementTitle {state} layer={$selectedLayer} selectedElement={$selectedElement} /> | 
					
						
							|  |  |  |       <SelectedElementView {state} layer={$selectedLayer} selectedElement={$selectedElement} /> | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |     </div> | 
					
						
							|  |  |  |   </ModalRight> | 
					
						
							| 
									
										
										
										
											2023-12-06 17:27:30 +01:00
										 |  |  | {/if} | 
					
						
							| 
									
										
										
										
											2023-03-28 05:13:48 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-06 17:27:30 +01:00
										 |  |  | {#if $selectedElement !== undefined && $selectedLayer !== undefined && $selectedLayer.popupInFloatover} | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |   <!-- Floatover with the selected element, if applicable --> | 
					
						
							|  |  |  |   <FloatOver | 
					
						
							|  |  |  |     on:close={() => { | 
					
						
							| 
									
										
										
										
											2024-01-11 04:00:56 +01:00
										 |  |  |       state.selectedElement.setData(undefined) | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |     }} | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |   > | 
					
						
							| 
									
										
										
										
											2023-12-21 01:46:18 +01:00
										 |  |  |     <div class="flex h-full w-full"> | 
					
						
							| 
									
										
										
										
											2023-12-06 17:27:30 +01:00
										 |  |  |       <SelectedElementView {state} layer={$selectedLayer} selectedElement={$selectedElement} /> | 
					
						
							|  |  |  |     </div> | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |   </FloatOver> | 
					
						
							| 
									
										
										
										
											2023-12-06 17:27:30 +01:00
										 |  |  | {/if} | 
					
						
							| 
									
										
										
										
											2023-05-05 01:00:15 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-06 01:33:08 +02:00
										 |  |  | <If condition={state.guistate.themeIsOpened}> | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |   <!-- Theme menu --> | 
					
						
							| 
									
										
										
										
											2023-10-11 01:41:42 +02:00
										 |  |  |   <FloatOver on:close={() => state.guistate.themeIsOpened.setData(false)}> | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |     <span slot="close-button"><!-- Disable the close button --></span> | 
					
						
							| 
									
										
										
										
											2023-10-16 14:27:05 +02:00
										 |  |  |     <TabbedGroup | 
					
						
							|  |  |  |       condition1={state.featureSwitches.featureSwitchFilter} | 
					
						
							|  |  |  |       tab={state.guistate.themeViewTabIndex} | 
					
						
							|  |  |  |     > | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |       <div slot="post-tablist"> | 
					
						
							|  |  |  |         <XCircleIcon | 
					
						
							|  |  |  |           class="mr-2 h-8 w-8" | 
					
						
							|  |  |  |           on:click={() => state.guistate.themeIsOpened.setData(false)} | 
					
						
							|  |  |  |         /> | 
					
						
							|  |  |  |       </div> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       <div class="flex" slot="title0"> | 
					
						
							|  |  |  |         <img class="block h-4 w-4" src={layout.icon} /> | 
					
						
							|  |  |  |         <Tr t={layout.title} /> | 
					
						
							|  |  |  |       </div> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       <div class="m-4 h-full" slot="content0"> | 
					
						
							|  |  |  |         <ThemeIntroPanel {state} /> | 
					
						
							|  |  |  |       </div> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       <div class="flex" slot="title1"> | 
					
						
							|  |  |  |         <If condition={state.featureSwitches.featureSwitchEnableExport}> | 
					
						
							| 
									
										
										
										
											2023-12-01 15:23:28 +01:00
										 |  |  |           <Download class="h-4 w-4" /> | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |           <Tr t={Translations.t.general.download.title} /> | 
					
						
							|  |  |  |         </If> | 
					
						
							|  |  |  |       </div> | 
					
						
							| 
									
										
										
										
											2023-12-19 22:21:34 +01:00
										 |  |  |       <div class="m-4" slot="content1"> | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |         <DownloadPanel {state} /> | 
					
						
							|  |  |  |       </div> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-19 22:21:34 +01:00
										 |  |  |       <div slot="title2"> | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |         <Tr t={Translations.t.general.attribution.title} /> | 
					
						
							|  |  |  |       </div> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-19 22:21:34 +01:00
										 |  |  |       <ToSvelte construct={() => new CopyrightPanel(state)} slot="content2" /> | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-19 22:21:34 +01:00
										 |  |  |       <div class="flex" slot="title3"> | 
					
						
							| 
									
										
										
										
											2023-12-01 15:23:28 +01:00
										 |  |  |         <Share class="h-4 w-4" /> | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |         <Tr t={Translations.t.general.sharescreen.title} /> | 
					
						
							|  |  |  |       </div> | 
					
						
							| 
									
										
										
										
											2023-12-19 22:21:34 +01:00
										 |  |  |       <div class="m-2" slot="content3"> | 
					
						
							| 
									
										
										
										
											2023-09-16 18:52:42 +02:00
										 |  |  |         <ShareScreen {state} /> | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |       </div> | 
					
						
							|  |  |  |     </TabbedGroup> | 
					
						
							|  |  |  |   </FloatOver> | 
					
						
							| 
									
										
										
										
											2023-03-28 05:13:48 +02:00
										 |  |  | </If> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-19 22:21:34 +01:00
										 |  |  | <If condition={state.guistate.filtersPanelIsOpened}> | 
					
						
							|  |  |  |   <FloatOver on:close={() => state.guistate.filtersPanelIsOpened.setData(false)}> | 
					
						
							| 
									
										
										
										
											2023-12-19 23:02:02 +01:00
										 |  |  |     <FilterPanel {state} /> | 
					
						
							| 
									
										
										
										
											2023-12-19 22:21:34 +01:00
										 |  |  |   </FloatOver> | 
					
						
							|  |  |  | </If> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-18 15:44:54 +02:00
										 |  |  | <IfHidden condition={state.guistate.backgroundLayerSelectionIsOpened}> | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |   <!-- background layer selector --> | 
					
						
							| 
									
										
										
										
											2023-11-09 16:30:26 +01:00
										 |  |  |   <FloatOver | 
					
						
							| 
									
										
										
										
											2023-10-16 14:27:05 +02:00
										 |  |  |     on:close={() => { | 
					
						
							|  |  |  |       state.guistate.backgroundLayerSelectionIsOpened.setData(false) | 
					
						
							|  |  |  |     }} | 
					
						
							|  |  |  |   > | 
					
						
							| 
									
										
										
										
											2023-12-15 01:46:01 +01:00
										 |  |  |     <div class="h-full p-2"> | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |       <RasterLayerOverview | 
					
						
							|  |  |  |         {availableLayers} | 
					
						
							|  |  |  |         map={state.map} | 
					
						
							|  |  |  |         mapproperties={state.mapProperties} | 
					
						
							|  |  |  |         userstate={state.userRelatedState} | 
					
						
							|  |  |  |         visible={state.guistate.backgroundLayerSelectionIsOpened} | 
					
						
							|  |  |  |       /> | 
					
						
							|  |  |  |     </div> | 
					
						
							|  |  |  |   </FloatOver> | 
					
						
							| 
									
										
										
										
											2023-05-18 15:44:54 +02:00
										 |  |  | </IfHidden> | 
					
						
							| 
									
										
										
										
											2023-03-28 05:13:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | <If condition={state.guistate.menuIsOpened}> | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |   <!-- Menu page --> | 
					
						
							| 
									
										
										
										
											2023-10-16 14:27:05 +02:00
										 |  |  |   <FloatOver on:close={() => state.guistate.menuIsOpened.setData(false)}> | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |     <span slot="close-button"><!-- Hide the default close button --></span> | 
					
						
							| 
									
										
										
										
											2023-10-16 14:27:05 +02:00
										 |  |  |     <TabbedGroup | 
					
						
							|  |  |  |       condition1={featureSwitches.featureSwitchEnableLogin} | 
					
						
							|  |  |  |       condition2={state.featureSwitches.featureSwitchCommunityIndex} | 
					
						
							|  |  |  |       tab={state.guistate.menuViewTabIndex} | 
					
						
							|  |  |  |     > | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |       <div slot="post-tablist"> | 
					
						
							|  |  |  |         <XCircleIcon | 
					
						
							|  |  |  |           class="mr-2 h-8 w-8" | 
					
						
							|  |  |  |           on:click={() => state.guistate.menuIsOpened.setData(false)} | 
					
						
							|  |  |  |         /> | 
					
						
							|  |  |  |       </div> | 
					
						
							|  |  |  |       <div class="flex" slot="title0"> | 
					
						
							|  |  |  |         <Tr t={Translations.t.general.menu.aboutMapComplete} /> | 
					
						
							|  |  |  |       </div> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       <div class="links-as-button links-w-full m-2 flex flex-col gap-y-1" slot="content0"> | 
					
						
							|  |  |  |         <Tr t={Translations.t.general.aboutMapComplete.intro} /> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         <a class="flex" href={Utils.HomepageLink()}> | 
					
						
							| 
									
										
										
										
											2023-11-30 01:41:41 +01:00
										 |  |  |           <Add class="h-6 w-6" /> | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |           <Tr t={Translations.t.general.backToIndex} /> | 
					
						
							|  |  |  |         </a> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         <a class="flex" href="https://github.com/pietervdvn/MapComplete/issues" target="_blank"> | 
					
						
							| 
									
										
										
										
											2023-11-30 01:41:41 +01:00
										 |  |  |           <Bug class="h-6 w-6" /> | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |           <Tr t={Translations.t.general.attribution.openIssueTracker} /> | 
					
						
							|  |  |  |         </a> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         <a class="flex" href="https://en.osm.town/@MapComplete" target="_blank"> | 
					
						
							| 
									
										
										
										
											2023-12-01 15:23:28 +01:00
										 |  |  |           <Mastodon class="h-6 w-6" /> | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |           <Tr t={Translations.t.general.attribution.followOnMastodon} /> | 
					
						
							|  |  |  |         </a> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         <a class="flex" href="https://liberapay.com/pietervdvn/" target="_blank"> | 
					
						
							| 
									
										
										
										
											2023-11-19 04:38:34 +01:00
										 |  |  |           <Liberapay class="h-6 w-6" /> | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |           <Tr t={Translations.t.general.attribution.donate} /> | 
					
						
							|  |  |  |         </a> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-21 01:46:18 +01:00
										 |  |  |         <button | 
					
						
							|  |  |  |           class="small soft flex" | 
					
						
							|  |  |  |           on:click={() => state.guistate.communityIndexPanelIsOpened.setData(true)} | 
					
						
							|  |  |  |         > | 
					
						
							| 
									
										
										
										
											2023-12-20 02:50:08 +01:00
										 |  |  |           <Community class="h-6 w-6" /> | 
					
						
							|  |  |  |           <Tr t={Translations.t.communityIndex.title} /> | 
					
						
							|  |  |  |         </button> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         <If condition={featureSwitches.featureSwitchEnableLogin}> | 
					
						
							|  |  |  |           <OpenIdEditor mapProperties={state.mapProperties} /> | 
					
						
							|  |  |  |           <OpenJosm {state} /> | 
					
						
							|  |  |  |           <MapillaryLink large={false} mapProperties={state.mapProperties} /> | 
					
						
							|  |  |  |         </If> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-21 01:46:18 +01:00
										 |  |  |         <button | 
					
						
							|  |  |  |           class="small soft flex" | 
					
						
							|  |  |  |           on:click={() => state.guistate.privacyPanelIsOpened.setData(true)} | 
					
						
							| 
									
										
										
										
											2023-12-20 02:50:08 +01:00
										 |  |  |         > | 
					
						
							| 
									
										
										
										
											2023-12-21 01:46:18 +01:00
										 |  |  |           <EyeIcon class="h-6 w-6 pr-1" /> | 
					
						
							| 
									
										
										
										
											2023-12-20 02:50:08 +01:00
										 |  |  |           <Tr t={Translations.t.privacy.title} /> | 
					
						
							|  |  |  |         </button> | 
					
						
							|  |  |  |         <div class="m-2 flex flex-col"> | 
					
						
							|  |  |  |           <ToSvelte construct={Hotkeys.generateDocumentationDynamic} /> | 
					
						
							|  |  |  |         </div> | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |         {Constants.vNumber} | 
					
						
							|  |  |  |       </div> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       <div class="flex" slot="title1"> | 
					
						
							|  |  |  |         <CogIcon class="h-6 w-6" /> | 
					
						
							|  |  |  |         <Tr t={UserRelatedState.usersettingsConfig.title.GetRenderValue({})} /> | 
					
						
							|  |  |  |       </div> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       <div class="links-as-button" slot="content1"> | 
					
						
							|  |  |  |         <!-- All shown components are set by 'usersettings.json', which happily uses some special visualisations created specifically for it --> | 
					
						
							|  |  |  |         <LoginToggle {state}> | 
					
						
							|  |  |  |           <div class="flex flex-col" slot="not-logged-in"> | 
					
						
							| 
									
										
										
										
											2023-11-19 01:05:15 +01:00
										 |  |  |             <LanguagePicker availableLanguages={layout.language} /> | 
					
						
							| 
									
										
										
										
											2023-07-15 18:20:09 +02:00
										 |  |  |             <Tr cls="alert" t={Translations.t.userinfo.notLoggedIn} /> | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |             <LoginButton clss="primary" osmConnection={state.osmConnection} /> | 
					
						
							|  |  |  |           </div> | 
					
						
							|  |  |  |           <SelectedElementView | 
					
						
							|  |  |  |             highlightedRendering={state.guistate.highlightedUserSetting} | 
					
						
							|  |  |  |             layer={UserRelatedState.usersettingsConfig} | 
					
						
							|  |  |  |             selectedElement={{ | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |               type: "Feature", | 
					
						
							|  |  |  |               properties: {}, | 
					
						
							|  |  |  |               geometry: { type: "Point", coordinates: [0, 0] }, | 
					
						
							|  |  |  |             }} | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |             {state} | 
					
						
							|  |  |  |             tags={state.userRelatedState.preferencesAsTags} | 
					
						
							|  |  |  |           /> | 
					
						
							|  |  |  |         </LoginToggle> | 
					
						
							|  |  |  |       </div> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       <div class="flex" slot="title2"> | 
					
						
							| 
									
										
										
										
											2023-11-30 00:39:55 +01:00
										 |  |  |         <HeartIcon class="h-6 w-6" /> | 
					
						
							| 
									
										
										
										
											2023-12-05 18:35:18 +01:00
										 |  |  |         <Tr t={Translations.t.favouritePoi.tab} /> | 
					
						
							| 
									
										
										
										
											2023-11-30 00:39:55 +01:00
										 |  |  |       </div> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-19 22:08:00 +01:00
										 |  |  |       <div class="m-2 flex flex-col" slot="content2"> | 
					
						
							| 
									
										
										
										
											2023-12-05 18:35:18 +01:00
										 |  |  |         <h3> | 
					
						
							|  |  |  |           <Tr t={Translations.t.favouritePoi.title} /> | 
					
						
							|  |  |  |         </h3> | 
					
						
							|  |  |  |         <Favourites {state} /> | 
					
						
							| 
									
										
										
										
											2023-11-30 00:39:55 +01:00
										 |  |  |       </div> | 
					
						
							| 
									
										
										
										
											2023-12-20 02:50:08 +01:00
										 |  |  |     </TabbedGroup> | 
					
						
							|  |  |  |   </FloatOver> | 
					
						
							|  |  |  | </If> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <If condition={state.guistate.privacyPanelIsOpened}> | 
					
						
							|  |  |  |   <FloatOver on:close={() => state.guistate.privacyPanelIsOpened.setData(false)}> | 
					
						
							| 
									
										
										
										
											2023-12-21 01:46:18 +01:00
										 |  |  |     <div class="flex h-full flex-col overflow-hidden"> | 
					
						
							|  |  |  |       <h2 class="low-interaction m-0 flex items-center p-4"> | 
					
						
							| 
									
										
										
										
											2023-12-20 02:50:08 +01:00
										 |  |  |         <EyeIcon class="w-6 pr-2" /> | 
					
						
							|  |  |  |         <Tr t={Translations.t.privacy.title} /> | 
					
						
							|  |  |  |       </h2> | 
					
						
							|  |  |  |       <div class="overflow-auto p-4"> | 
					
						
							|  |  |  |         <PrivacyPolicy /> | 
					
						
							|  |  |  |       </div> | 
					
						
							|  |  |  |     </div> | 
					
						
							|  |  |  |   </FloatOver> | 
					
						
							|  |  |  | </If> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <If condition={state.guistate.communityIndexPanelIsOpened}> | 
					
						
							|  |  |  |   <FloatOver on:close={() => state.guistate.communityIndexPanelIsOpened.setData(false)}> | 
					
						
							| 
									
										
										
										
											2023-12-21 01:46:18 +01:00
										 |  |  |     <div class="flex h-full flex-col overflow-hidden"> | 
					
						
							|  |  |  |       <h2 class="low-interaction m-0 flex items-center p-4"> | 
					
						
							| 
									
										
										
										
											2023-12-01 15:23:28 +01:00
										 |  |  |         <Community class="h-6 w-6" /> | 
					
						
							| 
									
										
										
										
											2023-07-28 01:02:31 +02:00
										 |  |  |         <Tr t={Translations.t.communityIndex.title} /> | 
					
						
							| 
									
										
										
										
											2023-12-20 02:50:08 +01:00
										 |  |  |       </h2> | 
					
						
							|  |  |  |       <div class="overflow-auto p-4"> | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |         <CommunityIndexView location={state.mapProperties.location} /> | 
					
						
							|  |  |  |       </div> | 
					
						
							| 
									
										
										
										
											2023-12-20 02:50:08 +01:00
										 |  |  |     </div> | 
					
						
							| 
									
										
										
										
											2023-06-15 16:12:46 +02:00
										 |  |  |   </FloatOver> | 
					
						
							| 
									
										
										
										
											2023-03-28 05:13:48 +02:00
										 |  |  | </If> |