├── .gitignore ├── .prettierrc ├── .vscode └── settings.json ├── LICENSE ├── README.md ├── eslint.config.mjs ├── markdown-loader.js ├── nginx-config ├── package.json ├── patches └── @restart+ui+1.9.4.patch ├── pnpm-lock.yaml ├── samples └── complex.gpx ├── sitemap-generator ├── .gitignore ├── index.ts ├── objects.ts └── tsconfig.json ├── src ├── actions │ ├── authActions.ts │ ├── changesetsActions.ts │ ├── drawingLineActions.ts │ ├── drawingPointActions.ts │ ├── elevationChartActions.ts │ ├── galleryActions.ts │ ├── index.ts │ ├── l10nActions.ts │ ├── mainActions.ts │ ├── mapActions.ts │ ├── mapDetailsActions.ts │ ├── mapsActions.ts │ ├── objectsActions.ts │ ├── osmActions.ts │ ├── routePlannerActions.ts │ ├── rpcActions.ts │ ├── searchActions.ts │ ├── toastsActions.ts │ ├── trackViewerActions.ts │ ├── trackingActions.ts │ ├── websocketActions.ts │ └── wikiActions.ts ├── cancelRegister.ts ├── categories.json ├── clipboardUtils.ts ├── components │ ├── AboutModal.tsx │ ├── AccountModal.tsx │ ├── Ad.tsx │ ├── AsyncComponent.tsx │ ├── AsyncLoadingIndicator.tsx │ ├── AsyncModal.tsx │ ├── Attribution.tsx │ ├── AuthProviders.tsx │ ├── ChangesetDetails.tsx │ ├── ChangesetsMenu.tsx │ ├── ChangesetsResult.tsx │ ├── Checkbox.tsx │ ├── CookieConsent.tsx │ ├── CopyrightButton.tsx │ ├── CurrentDrawingPropertiesModal.tsx │ ├── DateTime.tsx │ ├── DeleteButton.tsx │ ├── DocumentModal.tsx │ ├── DrawingLinePointSelection.tsx │ ├── DrawingLineResult.tsx │ ├── DrawingLineSelection.tsx │ ├── DrawingLinesResult.tsx │ ├── DrawingLinesTool.tsx │ ├── DrawingPointSelection.tsx │ ├── DrawingPointsResult.tsx │ ├── DrawingPointsTool.tsx │ ├── DrawingPropertiesModal.tsx │ ├── DrawingRecentColors.tsx │ ├── ElevationChart.tsx │ ├── ElevationChartActivePoint.tsx │ ├── ElevationInfo.tsx │ ├── EmbedMapModal.tsx │ ├── Emoji.tsx │ ├── ErrorCatcher.tsx │ ├── ExportMapFeaturesModal.tsx │ ├── ExportMapModal.tsx │ ├── HomeLocationPickingMenu.tsx │ ├── HomeLocationPickingResult.tsx │ ├── Hotline.ts │ ├── InfoBar.tsx │ ├── Layers.tsx │ ├── LegendModal.tsx │ ├── LegendOutdoorModal.tsx │ ├── LocationResult.tsx │ ├── LoginModal.tsx │ ├── Main.tsx │ ├── MapContextMenu.tsx │ ├── MapControls.tsx │ ├── MapDetailsMenu.tsx │ ├── MapDetailsTool.tsx │ ├── MapSettingsModal.tsx │ ├── MapSwitchButton.tsx │ ├── MaplibreLayer.tsx │ ├── MapsMenu.tsx │ ├── MapsModal.tsx │ ├── MaptilerAttribution.tsx │ ├── ObjectDetails.tsx │ ├── ObjectSelection.tsx │ ├── ObjectsMenu.tsx │ ├── ObjectsResult.tsx │ ├── OpenInExternalAppMenuButton.tsx │ ├── OpenInExternalAppMenuItems.tsx │ ├── ProjectPointModal.tsx │ ├── RemoveAdsModal.tsx │ ├── RichMarker.tsx │ ├── RoutePlannerMenu.tsx │ ├── RoutePlannerResult.tsx │ ├── ScaledTileLayer.tsx │ ├── SearchMenu.tsx │ ├── SearchResults.tsx │ ├── Selection.tsx │ ├── SelectionTool.tsx │ ├── Toast.tsx │ ├── Toasts.tsx │ ├── ToolMenu.tsx │ ├── TrackViewerDetails.tsx │ ├── TrackViewerMenu.tsx │ ├── TrackViewerResult.tsx │ ├── TrackViewerUploadModal.tsx │ ├── TrackingSelection.tsx │ ├── TranslationProvider.tsx │ ├── WikiLayer.tsx │ ├── gallery │ │ ├── GalleryEditForm.tsx │ │ ├── GalleryFilterModal.tsx │ │ ├── GalleryLayer.tsx │ │ ├── GalleryModals.tsx │ │ ├── GalleryPicker.tsx │ │ ├── GalleryPositionPickingMenu.tsx │ │ ├── GalleryResult.tsx │ │ ├── GalleryShowPositionMenu.tsx │ │ ├── GalleryUploadItem.tsx │ │ ├── GalleryUploadModal.tsx │ │ ├── GalleryViewerModal.tsx │ │ ├── RecentTags.tsx │ │ ├── galleryLayerWorker.ts │ │ └── galleryTileRenderrer.ts │ ├── mainMenu │ │ ├── DrawingSubmenu.tsx │ │ ├── GallerySubmenu.tsx │ │ ├── HelpSubmenu.tsx │ │ ├── LanguageSubmenu.tsx │ │ ├── MainMenu.tsx │ │ ├── MainMenuButton.tsx │ │ ├── OfflineSubmenu.tsx │ │ ├── SocialButtons.tsx │ │ ├── SubmenuHeader.tsx │ │ ├── TrackingSubmenu.tsx │ │ └── submenu.ts │ ├── parameterizedShading │ │ ├── DataWriter.ts │ │ ├── Shading.tsx │ │ ├── ShadingComponentControl.tsx │ │ ├── ShadingControl.tsx │ │ ├── ShadingLayer.tsx │ │ └── shadingLayerWorker.ts │ ├── supportUsModal │ │ ├── AsyncSupportUsModal.tsx │ │ ├── SupportUsModal.tsx │ │ └── translations │ │ │ ├── SupportUsMessages.ts │ │ │ ├── cs.tsx │ │ │ ├── en.tsx │ │ │ ├── hu.tsx │ │ │ ├── it.tsx │ │ │ └── sk.tsx │ ├── tracking │ │ ├── AccessToken.tsx │ │ ├── AccessTokenForm.tsx │ │ ├── AccessTokens.tsx │ │ ├── Device.tsx │ │ ├── DeviceForm.tsx │ │ ├── Devices.tsx │ │ ├── TrackedDevice.tsx │ │ ├── TrackedDeviceForm.tsx │ │ ├── TrackedDevices.tsx │ │ ├── TrackingModal.tsx │ │ ├── TrackingPoint.tsx │ │ └── TrackingResult.tsx │ ├── useAttributionInfo.ts │ ├── useHtmlMeta.ts │ └── withContextTooltip.tsx ├── constants.ts ├── coordinatesParser.ts ├── dateUtils.ts ├── distanceFormatter.ts ├── documents │ ├── attribution.md │ ├── dvePercenta.md │ ├── exports.it.md │ ├── exports.md │ ├── freemap.md │ ├── garmin.md │ ├── index.tsx │ ├── osm.md │ ├── outdoorShadingAttribution.md │ ├── privacyPolicy.md │ └── shortcuts.md ├── export │ ├── fetchPictures.ts │ ├── garminExport.ts │ ├── garminExportProcessorHandler.ts │ ├── geojsonExportProcessorHandler.ts │ ├── gpxExportProcessorHandler.ts │ ├── gpxExporter.ts │ └── upload.ts ├── externalUrlUtils.ts ├── fbLoader.ts ├── fixedPopperConfig.ts ├── galleryUtils.ts ├── gapiLoader.ts ├── garminLoginMessageHandler.ts ├── geoutils.ts ├── globalErrorHandler.ts ├── hooks │ ├── reduxSelectHook.ts │ ├── useBecomePremium.ts │ ├── useCheckboxInputState.ts │ ├── useDateTimeFormat.ts │ ├── useEffectiveChosenLanguage.ts │ ├── useGpxDropHandler.ts │ ├── useLazy.ts │ ├── useMap.ts │ ├── useMenuHandler.ts │ ├── useMouseCursor.ts │ ├── useNumberFormat.ts │ ├── useOnline.ts │ ├── usePictureDropHandler.ts │ ├── useScrollClasses.ts │ ├── useShareFile.ts │ ├── useShow.ts │ ├── useStartFinishPoints.ts │ └── useTextInputState.ts ├── httpRequest.ts ├── imagePreview.ts ├── images │ ├── 1x1-black.png │ ├── 1x1-transparent.png │ ├── 1x1-white.png │ ├── cursors │ │ ├── marker.svg │ │ └── pencil.svg │ ├── freemap-logo-print.png │ ├── freemap-logo-small.png │ ├── freemap-logo.png │ ├── logo.jpg │ ├── marker-icon-2x-green.png │ ├── marker-icon-2x-red.png │ ├── marker-icon-green.png │ ├── marker-icon-red.png │ ├── missing-tile-256x256.png │ ├── poiIcons │ │ ├── aerodrome.svg │ │ ├── alpine_hut.svg │ │ ├── apartment.svg │ │ ├── arch.svg │ │ ├── archaeological_site.svg │ │ ├── arts_centre.svg │ │ ├── artwork.svg │ │ ├── atm.svg │ │ ├── attraction.svg │ │ ├── bank.svg │ │ ├── bar.svg │ │ ├── bare_rock.svg │ │ ├── basic_hut.svg │ │ ├── bbq.svg │ │ ├── beach_resort.svg │ │ ├── beehive.svg │ │ ├── bell_tower.svg │ │ ├── bench.svg │ │ ├── bicycle.svg │ │ ├── bicycle_parking.svg │ │ ├── bicycle_repair_station.svg │ │ ├── biergarten.svg │ │ ├── bird_hide.svg │ │ ├── board.svg │ │ ├── boat_rental.svg │ │ ├── boundary_stone.svg │ │ ├── building.svg │ │ ├── bunker.svg │ │ ├── bureau_de_change.svg │ │ ├── bus_station.svg │ │ ├── bus_stop.svg │ │ ├── bust.svg │ │ ├── butcher.svg │ │ ├── cafe.svg │ │ ├── camp_site.svg │ │ ├── car_repair.svg │ │ ├── car_wash.svg │ │ ├── casino.svg │ │ ├── castle.svg │ │ ├── cattle_grid.svg │ │ ├── cave_entrance.svg │ │ ├── chalet.svg │ │ ├── charging_station.svg │ │ ├── chimney.svg │ │ ├── church.svg │ │ ├── cinema.svg │ │ ├── city_gate.svg │ │ ├── cliff.svg │ │ ├── climbing.svg │ │ ├── community_centre.svg │ │ ├── confectionery.svg │ │ ├── convenience.svg │ │ ├── courthouse.svg │ │ ├── cross.svg │ │ ├── cycle_barrier.svg │ │ ├── dentist.svg │ │ ├── doctors.svg │ │ ├── drinking_spring.svg │ │ ├── drinking_water.svg │ │ ├── dyke.svg │ │ ├── earth_bank.svg │ │ ├── education │ │ │ ├── college.svg │ │ │ ├── nursery.svg │ │ │ ├── school.svg │ │ │ └── university.svg │ │ ├── elevator.svg │ │ ├── embankment-half.svg │ │ ├── embankment.svg │ │ ├── emergency_phone.svg │ │ ├── excrement_bags.svg │ │ ├── fast_food.svg │ │ ├── fell.svg │ │ ├── ferry.svg │ │ ├── fire_station.svg │ │ ├── firepit.svg │ │ ├── fishing.svg │ │ ├── fixme.svg │ │ ├── ford.svg │ │ ├── forester's_lodge.svg │ │ ├── fort.svg │ │ ├── fortress.svg │ │ ├── fountain.svg │ │ ├── free_flying.svg │ │ ├── fuel.svg │ │ ├── gate.svg │ │ ├── golf.svg │ │ ├── grapes.svg │ │ ├── grave.svg │ │ ├── guest_house.svg │ │ ├── guidepost.svg │ │ ├── guidepost_x.svg │ │ ├── guidepost_xx.svg │ │ ├── gully.svg │ │ ├── highway-arrow.svg │ │ ├── highway-arrow.svg.2021_11_11_21_50_55.0.svg │ │ ├── horse.svg │ │ ├── horse_riding.svg │ │ ├── hospital.svg │ │ ├── hostel.svg │ │ ├── hot_spring.svg │ │ ├── hotel.svg │ │ ├── hunting_stand.svg │ │ ├── hut.svg │ │ ├── ice_cream.svg │ │ ├── internet_cafe.svg │ │ ├── kissing_gate.svg │ │ ├── lean_to.svg │ │ ├── library.svg │ │ ├── lift_gate.svg │ │ ├── lighthouse.svg │ │ ├── manger.svg │ │ ├── manor.svg │ │ ├── map.svg │ │ ├── mast_other.svg │ │ ├── memorial.svg │ │ ├── memorial_stone.svg │ │ ├── military_area.svg │ │ ├── mine.svg │ │ ├── miniature_golf.svg │ │ ├── monument.svg │ │ ├── motel.svg │ │ ├── motorcycle_barrier.svg │ │ ├── motorcycle_parking.svg │ │ ├── museum.svg │ │ ├── national_park_area.svg │ │ ├── nightclub.svg │ │ ├── no_bicycle.svg │ │ ├── no_bicycle_alt.svg │ │ ├── no_bicycle_foot.svg │ │ ├── no_foot.svg │ │ ├── not_drinking_spring.svg │ │ ├── obelisk.svg │ │ ├── office.svg │ │ ├── orchard.svg │ │ ├── outdoor_seating.svg │ │ ├── palace.svg │ │ ├── parking.svg │ │ ├── parking_tickets.svg │ │ ├── peak.svg │ │ ├── pharmacy.svg │ │ ├── picnic_shelter.svg │ │ ├── picnic_site.svg │ │ ├── picnic_table.svg │ │ ├── place_of_worship.svg │ │ ├── plant_nursery.svg │ │ ├── plaque.svg │ │ ├── playground.svg │ │ ├── police.svg │ │ ├── post_box.svg │ │ ├── post_office.svg │ │ ├── power_pole.svg │ │ ├── power_tower.svg │ │ ├── prison.svg │ │ ├── protected_area.svg │ │ ├── pub.svg │ │ ├── public_bath.svg │ │ ├── public_bookcase.svg │ │ ├── public_transport.svg │ │ ├── public_transport_tickets.svg │ │ ├── quarry.svg │ │ ├── recycling.svg │ │ ├── refitted_drinking_spring.svg │ │ ├── refitted_not_drinking_spring.svg │ │ ├── refitted_spring.svg │ │ ├── rental_bicycle.svg │ │ ├── rental_car.svg │ │ ├── restaurant.svg │ │ ├── rock.svg │ │ ├── ruins.svg │ │ ├── saddle.svg │ │ ├── sand.svg │ │ ├── sauna.svg │ │ ├── scree.svg │ │ ├── scrub.svg │ │ ├── shelter-alt.svg │ │ ├── shelter.svg │ │ ├── shooting.svg │ │ ├── shop │ │ │ ├── alcohol.svg │ │ │ ├── art.svg │ │ │ ├── bag.svg │ │ │ ├── bakery.svg │ │ │ ├── beauty.svg │ │ │ ├── bed.svg │ │ │ ├── beverages.svg │ │ │ ├── bicycle.svg │ │ │ ├── book.svg │ │ │ ├── bookmaker.svg │ │ │ ├── butcher.svg │ │ │ ├── car.svg │ │ │ ├── car_parts.svg │ │ │ ├── car_repair.svg │ │ │ ├── carpet.svg │ │ │ ├── charity.svg │ │ │ ├── chemist.svg │ │ │ ├── clothes.svg │ │ │ ├── coffee.svg │ │ │ ├── computer.svg │ │ │ ├── confectionery.svg │ │ │ ├── convenience.svg │ │ │ ├── copyshop.svg │ │ │ ├── dairy.svg │ │ │ ├── deli.svg │ │ │ ├── department_store.svg │ │ │ ├── diy.svg │ │ │ ├── electronics.svg │ │ │ ├── fabric.svg │ │ │ ├── florist.svg │ │ │ ├── furniture.svg │ │ │ ├── garden_centre.svg │ │ │ ├── gift.svg │ │ │ ├── greengrocer.svg │ │ │ ├── hairdresser.svg │ │ │ ├── hifi.svg │ │ │ ├── houseware.svg │ │ │ ├── interior_decoration.svg │ │ │ ├── jewelry.svg │ │ │ ├── laundry.svg │ │ │ ├── marketplace.svg │ │ │ ├── massage.svg │ │ │ ├── medical_supply.svg │ │ │ ├── mobile_phone.svg │ │ │ ├── music.svg │ │ │ ├── musical_instrument.svg │ │ │ ├── newsagent.svg │ │ │ ├── optician.svg │ │ │ ├── outdoor.svg │ │ │ ├── paint.svg │ │ │ ├── perfumery.svg │ │ │ ├── pet.svg │ │ │ ├── photo.svg │ │ │ ├── seafood.svg │ │ │ ├── second_hand.svg │ │ │ ├── shoes.svg │ │ │ ├── sports.svg │ │ │ ├── stationery.svg │ │ │ ├── supermarket.svg │ │ │ ├── tea.svg │ │ │ ├── ticket.svg │ │ │ ├── tobacco.svg │ │ │ ├── toys.svg │ │ │ ├── trade.svg │ │ │ ├── travel_agency.svg │ │ │ ├── tyres.svg │ │ │ ├── variety_store.svg │ │ │ ├── vending_machine.svg │ │ │ ├── video.svg │ │ │ └── video_games.svg │ │ ├── shower.svg │ │ ├── sinkhole.svg │ │ ├── ski.svg │ │ ├── social_facility.svg │ │ ├── solar.svg │ │ ├── solar_small.svg │ │ ├── sport │ │ │ ├── archery.svg │ │ │ ├── baseball.svg │ │ │ ├── canoe.svg │ │ │ ├── cricket.svg │ │ │ ├── diving.svg │ │ │ ├── golf.svg │ │ │ ├── gym.svg │ │ │ ├── gymnasium.svg │ │ │ ├── hillclimbing.svg │ │ │ ├── horse_racing.svg │ │ │ ├── iceskating.svg │ │ │ ├── jetski.svg │ │ │ ├── leisure_centre.svg │ │ │ ├── minature_golf.svg │ │ │ ├── motorracing.svg │ │ │ ├── playground.svg │ │ │ ├── sailing.svg │ │ │ ├── shooting.svg │ │ │ ├── skiing_crosscountry.svg │ │ │ ├── skiing_downhill.svg │ │ │ ├── snooker.svg │ │ │ ├── soccer.svg │ │ │ ├── stadium.svg │ │ │ ├── swimming_indoor.svg │ │ │ ├── swimming_outdoor.svg │ │ │ ├── tennis.svg │ │ │ └── windsurfing.svg │ │ ├── spring.svg │ │ ├── station.svg │ │ ├── statue.svg │ │ ├── steps.svg │ │ ├── stile.svg │ │ ├── stone.svg │ │ ├── stump.svg │ │ ├── stump_single.svg │ │ ├── supermarket.svg │ │ ├── taxi.svg │ │ ├── telephone.svg │ │ ├── temp_water.svg │ │ ├── theatre.svg │ │ ├── toilets.svg │ │ ├── toll_booth.svg │ │ ├── tower_bell_tower.svg │ │ ├── tower_communication.svg │ │ ├── tower_observation.svg │ │ ├── tower_other.svg │ │ ├── townhall.svg │ │ ├── traffic_signals.svg │ │ ├── tree.svg │ │ ├── tree2.svg │ │ ├── tree_protected.svg │ │ ├── university.svg │ │ ├── vehicle_inspection.svg │ │ ├── veterinary.svg │ │ ├── viewpoint.svg │ │ ├── waste_basket.svg │ │ ├── waste_disposal.svg │ │ ├── water_park.svg │ │ ├── water_tower.svg │ │ ├── water_well.svg │ │ ├── water_works.svg │ │ ├── waterfall.svg │ │ ├── watering_place.svg │ │ ├── waterway-arrow.svg │ │ ├── wayside_shrine.svg │ │ ├── weather_shelter.svg │ │ ├── wilderness_hut.svg │ │ └── zoo.svg │ ├── rovas_reklama.svg │ └── spinnerbar.gif ├── index.ejs ├── index.tsx ├── keyboardHandler.ts ├── l10nInjector.tsx ├── langUtils.ts ├── leafletElementHolder.ts ├── legend │ ├── data │ │ └── layers │ │ │ └── poi │ │ │ ├── accomodation │ │ │ ├── bar │ │ │ │ └── list.png │ │ │ ├── cafe │ │ │ │ └── list.png │ │ │ ├── camping │ │ │ │ └── list.png │ │ │ ├── fast_food │ │ │ │ └── list.png │ │ │ ├── guest_house │ │ │ │ └── list.png │ │ │ ├── hostel │ │ │ │ └── list.png │ │ │ ├── hotel │ │ │ │ └── list.png │ │ │ ├── motel │ │ │ │ └── list.png │ │ │ ├── pub │ │ │ │ └── list.png │ │ │ └── restaurant │ │ │ │ └── list.png │ │ │ ├── cycling │ │ │ ├── bicycle │ │ │ │ └── list.png │ │ │ ├── bicycle_parking │ │ │ │ └── list.png │ │ │ ├── bicycle_rental │ │ │ │ └── list.png │ │ │ └── stand │ │ │ │ └── list.png │ │ │ ├── education │ │ │ ├── college │ │ │ │ └── list.png │ │ │ ├── driving_school │ │ │ │ └── list.png │ │ │ ├── kindergarten │ │ │ │ └── list.png │ │ │ ├── school │ │ │ │ └── list.png │ │ │ └── university │ │ │ │ └── list.png │ │ │ ├── health │ │ │ ├── clinic │ │ │ │ └── list.png │ │ │ ├── dentist │ │ │ │ └── list.png │ │ │ ├── doctor │ │ │ │ └── list.png │ │ │ ├── emergency │ │ │ │ └── list.png │ │ │ ├── hospital │ │ │ │ └── list.png │ │ │ ├── pharmacy │ │ │ │ └── list.png │ │ │ └── veterinary │ │ │ │ └── list.png │ │ │ ├── hiking │ │ │ ├── alpine_hut │ │ │ │ └── list.png │ │ │ ├── attraction │ │ │ │ └── list.png │ │ │ ├── feeding │ │ │ │ └── list.png │ │ │ ├── fireplace │ │ │ │ └── list.png │ │ │ ├── hunting_stand │ │ │ │ └── list.png │ │ │ ├── map │ │ │ │ └── list.png │ │ │ ├── picnic_site │ │ │ │ └── list.png │ │ │ ├── ranger_house │ │ │ │ └── list.png │ │ │ ├── shelter │ │ │ │ └── list.png │ │ │ ├── stand │ │ │ │ └── list.png │ │ │ ├── tower_observation │ │ │ │ └── list.png │ │ │ └── wilderness_hut │ │ │ │ └── list.png │ │ │ ├── landmark │ │ │ ├── battlefield │ │ │ │ └── list.png │ │ │ ├── castle │ │ │ │ └── list.png │ │ │ ├── chapel │ │ │ │ └── list.png │ │ │ ├── chateau │ │ │ │ └── list.png │ │ │ ├── memorial │ │ │ │ └── list.png │ │ │ ├── monument │ │ │ │ └── list.png │ │ │ ├── museum │ │ │ │ └── list.png │ │ │ ├── place_of_worship │ │ │ │ └── list.png │ │ │ ├── ruins │ │ │ │ └── list.png │ │ │ ├── sculpture │ │ │ │ └── list.png │ │ │ ├── wayside_cross │ │ │ │ └── list.png │ │ │ └── wayside_shrine │ │ │ │ └── list.png │ │ │ ├── leisure │ │ │ ├── golf_course │ │ │ │ └── list.png │ │ │ └── miniature_golf │ │ │ │ └── list.png │ │ │ ├── nature │ │ │ ├── boundary_monument │ │ │ │ └── list.png │ │ │ ├── boundary_protected_site │ │ │ │ └── list.png │ │ │ ├── boundary_reserve │ │ │ │ └── list.png │ │ │ ├── cave_entrance │ │ │ │ └── list.png │ │ │ ├── peak │ │ │ │ └── list.png │ │ │ ├── protected_tree │ │ │ │ └── list.png │ │ │ ├── spring │ │ │ │ └── list.png │ │ │ ├── viewpoint │ │ │ │ └── list.png │ │ │ └── waterfall │ │ │ │ └── list.png │ │ │ ├── other │ │ │ ├── adit │ │ │ │ └── list.png │ │ │ ├── bunker │ │ │ │ └── list.png │ │ │ ├── chimney │ │ │ │ └── list.png │ │ │ ├── mineshaft │ │ │ │ └── list.png │ │ │ ├── prison │ │ │ │ └── list.png │ │ │ ├── tower_communication │ │ │ │ └── list.png │ │ │ ├── water_tower │ │ │ │ └── list.png │ │ │ ├── water_well │ │ │ │ └── list.png │ │ │ ├── windmill │ │ │ │ └── list.png │ │ │ └── zoo │ │ │ │ └── list.png │ │ │ ├── place │ │ │ ├── city │ │ │ │ └── list.png │ │ │ ├── county │ │ │ │ └── list.png │ │ │ ├── hamlet │ │ │ │ └── list.png │ │ │ ├── locality │ │ │ │ └── list.png │ │ │ ├── region │ │ │ │ └── list.png │ │ │ ├── suburb │ │ │ │ └── list.png │ │ │ ├── town │ │ │ │ └── list.png │ │ │ └── village │ │ │ │ └── list.png │ │ │ ├── power │ │ │ ├── fossil │ │ │ │ └── list.png │ │ │ ├── hydro │ │ │ │ └── list.png │ │ │ ├── nuclear │ │ │ │ └── list.png │ │ │ └── wind │ │ │ │ └── list.png │ │ │ ├── services │ │ │ ├── atm │ │ │ │ └── list.png │ │ │ ├── bank │ │ │ │ └── list.png │ │ │ ├── car_wash │ │ │ │ └── list.png │ │ │ ├── drinking_water │ │ │ │ └── list.png │ │ │ ├── firestation │ │ │ │ └── list.png │ │ │ ├── fuel │ │ │ │ └── list.png │ │ │ ├── library │ │ │ │ └── list.png │ │ │ ├── parking │ │ │ │ └── list.png │ │ │ ├── police │ │ │ │ └── list.png │ │ │ ├── post_office │ │ │ │ └── list.png │ │ │ ├── taxi │ │ │ │ └── list.png │ │ │ ├── telephone │ │ │ │ └── list.png │ │ │ ├── toilets │ │ │ │ └── list.png │ │ │ └── townhall │ │ │ │ └── list.png │ │ │ ├── shopping │ │ │ ├── alcohol │ │ │ │ └── list.png │ │ │ ├── bakery │ │ │ │ └── list.png │ │ │ ├── books │ │ │ │ └── list.png │ │ │ ├── butcher │ │ │ │ └── list.png │ │ │ ├── car │ │ │ │ └── list.png │ │ │ ├── car_repair │ │ │ │ └── list.png │ │ │ ├── chemist │ │ │ │ └── list.png │ │ │ ├── clothes │ │ │ │ └── list.png │ │ │ ├── computer │ │ │ │ └── list.png │ │ │ ├── confectionery │ │ │ │ └── list.png │ │ │ ├── convenience │ │ │ │ └── list.png │ │ │ ├── department_store │ │ │ │ └── list.png │ │ │ ├── doityourself │ │ │ │ └── list.png │ │ │ ├── dry_cleaning │ │ │ │ └── list.png │ │ │ ├── electronics │ │ │ │ └── list.png │ │ │ ├── erotic │ │ │ │ └── list.png │ │ │ ├── florist │ │ │ │ └── list.png │ │ │ ├── furniture │ │ │ │ └── list.png │ │ │ ├── garden_centre │ │ │ │ └── list.png │ │ │ ├── general │ │ │ │ └── list.png │ │ │ ├── greengrocer │ │ │ │ └── list.png │ │ │ ├── hairdresser │ │ │ │ └── list.png │ │ │ ├── hardware │ │ │ │ └── list.png │ │ │ ├── ice_cream │ │ │ │ └── list.png │ │ │ ├── jewelry │ │ │ │ └── list.png │ │ │ ├── kiosk │ │ │ │ └── list.png │ │ │ ├── laundry │ │ │ │ └── list.png │ │ │ ├── mall │ │ │ │ └── list.png │ │ │ ├── marketplace │ │ │ │ └── list.png │ │ │ ├── newsagent │ │ │ │ └── list.png │ │ │ ├── optician │ │ │ │ └── list.png │ │ │ ├── organic │ │ │ │ └── list.png │ │ │ ├── outdoor │ │ │ │ └── list.png │ │ │ ├── shoes │ │ │ │ └── list.png │ │ │ ├── sports │ │ │ │ └── list.png │ │ │ ├── stationery │ │ │ │ └── list.png │ │ │ ├── supermarket │ │ │ │ └── list.png │ │ │ ├── toys │ │ │ │ └── list.png │ │ │ └── video │ │ │ │ └── list.png │ │ │ ├── sport │ │ │ ├── 10pin │ │ │ │ └── list.png │ │ │ ├── archery │ │ │ │ └── list.png │ │ │ ├── athletics │ │ │ │ └── list.png │ │ │ ├── baseball │ │ │ │ └── list.png │ │ │ ├── basketball │ │ │ │ └── list.png │ │ │ ├── beachvolleyball │ │ │ │ └── list.png │ │ │ ├── boules │ │ │ │ └── list.png │ │ │ ├── bowls │ │ │ │ └── list.png │ │ │ ├── canoe │ │ │ │ └── list.png │ │ │ ├── climbing │ │ │ │ └── list.png │ │ │ ├── cycling │ │ │ │ └── list.png │ │ │ ├── dog_racing │ │ │ │ └── list.png │ │ │ ├── ecycle_charging │ │ │ │ └── list.png │ │ │ ├── equestrian │ │ │ │ └── list.png │ │ │ ├── football │ │ │ │ └── list.png │ │ │ ├── golf │ │ │ │ └── list.png │ │ │ ├── gym │ │ │ │ └── list.png │ │ │ ├── gymnastics │ │ │ │ └── list.png │ │ │ ├── hanggliding │ │ │ │ └── list.png │ │ │ ├── hockey │ │ │ │ └── list.png │ │ │ ├── horse_racing │ │ │ │ └── list.png │ │ │ ├── motor │ │ │ │ └── list.png │ │ │ ├── multi │ │ │ │ └── list.png │ │ │ ├── paragliding │ │ │ │ └── list.png │ │ │ ├── shooting │ │ │ │ └── list.png │ │ │ ├── skateboard │ │ │ │ └── list.png │ │ │ ├── skating │ │ │ │ └── list.png │ │ │ ├── skiing │ │ │ │ └── list.png │ │ │ ├── soccer │ │ │ │ └── list.png │ │ │ ├── swimming │ │ │ │ └── list.png │ │ │ ├── table_tennis │ │ │ │ └── list.png │ │ │ ├── team_handball │ │ │ │ └── list.png │ │ │ ├── tennis │ │ │ │ └── list.png │ │ │ ├── volleyball │ │ │ │ └── list.png │ │ │ └── water_ski │ │ │ │ └── list.png │ │ │ └── transport │ │ │ ├── airport │ │ │ └── list.png │ │ │ ├── border_control │ │ │ └── list.png │ │ │ ├── bus_station │ │ │ └── list.png │ │ │ ├── bus_stop │ │ │ └── list.png │ │ │ ├── halt │ │ │ └── list.png │ │ │ ├── helipad │ │ │ └── list.png │ │ │ ├── level_crossing │ │ │ └── list.png │ │ │ ├── traffic_signals │ │ │ └── list.png │ │ │ ├── train │ │ │ └── list.png │ │ │ └── tram_stop │ │ │ └── list.png │ ├── files │ │ └── img │ │ │ └── legend │ │ │ ├── highway_trunk.jpg │ │ │ ├── hwy-mwy.png │ │ │ ├── hwy-pri.png │ │ │ ├── hwy-res.png │ │ │ ├── hwy-sec.png │ │ │ ├── hwy-ser.png │ │ │ ├── hwy-ter.png │ │ │ ├── hwy-tr2.png │ │ │ └── hwy-tr4.png │ └── index.json ├── locationChangeHandler.ts ├── mapDefinitions.tsx ├── mapUtils.ts ├── maplibre-language.ts ├── middlewares │ ├── errorHandlingMiddleware.ts │ ├── processorMiddleware.ts │ ├── statePersistingMiddleware.ts │ ├── trackingMiddleware.ts │ └── webSocketMiddleware.ts ├── navigationUtils.ts ├── oldFreemapUtils.ts ├── osm │ ├── osmNameResolver.ts │ ├── osmTagToIconMapping.ts │ ├── osmTagToNameMapping-cs.ts │ ├── osmTagToNameMapping-en.ts │ ├── osmTagToNameMapping-hu.ts │ ├── osmTagToNameMapping-it.ts │ ├── osmTagToNameMapping-sk.ts │ ├── osmTagToNameMappingType.ts │ ├── types.ts │ └── useOsmNameResolver.ts ├── osmLoginMessageHandler.ts ├── pica-gpu │ ├── gl-helper.ts │ ├── index.ts │ ├── resize.ts │ └── shaders.ts ├── processors.ts ├── processors │ ├── authDeleteAccountProcessor.ts │ ├── authDisconnectProcessor.ts │ ├── authDisconnectProcessorHandler.ts │ ├── authInitProcessor.ts │ ├── authLogoutProcessor.ts │ ├── authWithFacebookProcessor.ts │ ├── authWithFacebookProcessorHandler.ts │ ├── authWithGarmin2Processor.ts │ ├── authWithGarmin2ProcessorHandler.ts │ ├── authWithGarminProcessor.ts │ ├── authWithGarminProcessorHandler.ts │ ├── authWithGoogleProcessor.ts │ ├── authWithGoogleProcessorHandler.ts │ ├── authWithOsm2Processor.ts │ ├── authWithOsm2ProcessorHandler.ts │ ├── authWithOsmProcessor.ts │ ├── authWithOsmProcessorHandler.ts │ ├── cancelProcessor.ts │ ├── changesetsProcessor.ts │ ├── convertToDrawingProcessor.ts │ ├── cookieConsentProcessor.ts │ ├── deleteProcessor.ts │ ├── elevationChartProcessor.ts │ ├── elevationChartProcessorHandler.ts │ ├── errorProcessor.ts │ ├── exportMapFeaturesProcessor.ts │ ├── fetchPurchasesProcessor.ts │ ├── galleryDeletePictureProcessor.ts │ ├── galleryFetchUsersProcessor.ts │ ├── galleryItemUploadProcessor.ts │ ├── galleryItemUploadProcessorHandler.ts │ ├── galleryMakeAllPremiumOrFreeProcessor.ts │ ├── galleryQuickAddTagProcessor.ts │ ├── galleryRequestImageProcessor.ts │ ├── galleryRequestImagesByOrderProcessor.ts │ ├── galleryRequestImagesByRadiusProcessor.ts │ ├── gallerySavePictureProcessor.ts │ ├── gallerySetItemForPositionPickingProcessor.ts │ ├── galleryShowImageGaProcessor.ts │ ├── galleryShowOnTheMapProcessor.ts │ ├── gallerySubmitCommentProcessor.ts │ ├── gallerySubmitStarsProcessor.ts │ ├── galleryUploadModalProcessor.ts │ ├── l10nSetLanguageProcessor.ts │ ├── legacyMapWarningProcessor.ts │ ├── legendProcessor.ts │ ├── locateProcessor.ts │ ├── loginResponseHandler.ts │ ├── mapDetailsProcessor.ts │ ├── mapDetailsProcessorHandler.ts │ ├── mapExportProcessor.ts │ ├── mapExportProcessorHandler.ts │ ├── mapRefocusProcessor.ts │ ├── mapTypeGaProcessor.ts │ ├── mapsDeleteProcessor.ts │ ├── mapsLoadListProcessor.ts │ ├── mapsLoadProcessor.ts │ ├── mapsSaveProcessor.ts │ ├── measurementProcessor.ts │ ├── objectsFetchProcessor.ts │ ├── openInExternalAppProcessor.ts │ ├── osmLoadNodeProcessor.ts │ ├── osmLoadRelationProcessor.ts │ ├── osmLoadWayProcessor.ts │ ├── purchaseProcessor.ts │ ├── routePlannerFindRouteProcessor.ts │ ├── routePlannerFindRouteProcessorHandler.ts │ ├── routePlannerRefocusMapProcessor.ts │ ├── routePlannerSetFromCurrentPositionProcessor.ts │ ├── routePlannerToggleElevationChartProcessor.ts │ ├── rpcProcessors.ts │ ├── saveHomeLocationProcessor.ts │ ├── saveSettingsProcessor.ts │ ├── searchHighlightProcessor.ts │ ├── searchProcessor.ts │ ├── setActiveModalProcessor.ts │ ├── setToolProcessor.ts │ ├── toasts.ts │ ├── toastsAddProcessor.ts │ ├── toastsCancelTypeProcessor.ts │ ├── toastsRemoveProcessor.ts │ ├── toastsRestartTimeoutProcessor.ts │ ├── toastsStopTimeoutProcessor.ts │ ├── trackViewerDownloadTrackProcessor.ts │ ├── trackViewerGpxLoadProcessor.ts │ ├── trackViewerSetTrackDataProcessor.ts │ ├── trackViewerToggleElevationChartProcessor.ts │ ├── trackViewerUploadTrackProcessor.ts │ ├── trackingAccessTokenProcessors.ts │ ├── trackingDeviceProcessors.ts │ ├── trackingFollowProcessors.ts │ ├── urlProcessor.ts │ ├── wikiLayerProcessor.ts │ └── wikiLoadPreviewProcessor.ts ├── reducers.ts ├── reducers │ ├── authReducer.ts │ ├── changesetsReducer.ts │ ├── drawingLinesReducer.ts │ ├── drawingPointsReducer.ts │ ├── elevationChartReducer.ts │ ├── galleryReducer.ts │ ├── l10nReducer.ts │ ├── mainReducer.ts │ ├── mapDetailsReducer.ts │ ├── mapReducer.ts │ ├── mapsReducer.ts │ ├── objectsReducer.ts │ ├── routePlannerReducer.ts │ ├── searchReducer.ts │ ├── toastsReducer.ts │ ├── trackViewerReducer.ts │ ├── trackingReducer.ts │ ├── websocketReducer.ts │ └── wikiReducer.ts ├── selectors │ └── mainSelectors.ts ├── static │ ├── .htaccess │ ├── ads.txt │ ├── authCallback.html │ ├── browserconfig.xml │ ├── dropboxAuthCallback.html │ ├── favicon.ico │ ├── favicons │ │ ├── apple-touch-icon-1024x1024.png │ │ ├── apple-touch-icon-114x114.png │ │ ├── apple-touch-icon-120x120.png │ │ ├── apple-touch-icon-144x144.png │ │ ├── apple-touch-icon-152x152.png │ │ ├── apple-touch-icon-167x167.png │ │ ├── apple-touch-icon-180x180.png │ │ ├── apple-touch-icon-57x57.png │ │ ├── apple-touch-icon-60x60.png │ │ ├── apple-touch-icon-72x72.png │ │ ├── apple-touch-icon-76x76.png │ │ ├── apple-touch-icon-precomposed.png │ │ ├── apple-touch-icon.png │ │ ├── apple-touch-startup-image-1125x2436.png │ │ ├── apple-touch-startup-image-1136x640.png │ │ ├── apple-touch-startup-image-1242x2208.png │ │ ├── apple-touch-startup-image-1242x2688.png │ │ ├── apple-touch-startup-image-1334x750.png │ │ ├── apple-touch-startup-image-1536x2048.png │ │ ├── apple-touch-startup-image-1620x2160.png │ │ ├── apple-touch-startup-image-1668x2224.png │ │ ├── apple-touch-startup-image-1668x2388.png │ │ ├── apple-touch-startup-image-1792x828.png │ │ ├── apple-touch-startup-image-2048x1536.png │ │ ├── apple-touch-startup-image-2048x2732.png │ │ ├── apple-touch-startup-image-2160x1620.png │ │ ├── apple-touch-startup-image-2208x1242.png │ │ ├── apple-touch-startup-image-2224x1668.png │ │ ├── apple-touch-startup-image-2388x1668.png │ │ ├── apple-touch-startup-image-2436x1125.png │ │ ├── apple-touch-startup-image-2688x1242.png │ │ ├── apple-touch-startup-image-2732x2048.png │ │ ├── apple-touch-startup-image-640x1136.png │ │ ├── apple-touch-startup-image-750x1334.png │ │ ├── apple-touch-startup-image-828x1792.png │ │ ├── favicon-16x16.png │ │ ├── favicon-32x32.png │ │ ├── favicon-48x48.png │ │ ├── firefox_app_128x128.png │ │ ├── firefox_app_512x512.png │ │ ├── firefox_app_60x60.png │ │ ├── mstile-144x144.png │ │ ├── mstile-150x150.png │ │ ├── mstile-310x150.png │ │ ├── mstile-310x310.png │ │ └── mstile-70x70.png │ ├── freemap-logo-128.png │ ├── freemap-logo-192.png │ ├── freemap-logo-256.png │ ├── freemap-logo-384.png │ ├── freemap-logo-512.png │ ├── freemap-logo-96.png │ ├── freemap-logo.jpg │ ├── freemap-logo.png │ ├── garminAuthCallback.html │ ├── google075ab6750584f8ae.html │ ├── manifest.webmanifest │ ├── nm6hmm18y4m4cx21u2z4u5b4eamsgs.html │ ├── offline.html │ ├── pay_by_square.png │ ├── purchaseCallback.html │ ├── robots.txt │ └── shading.wgsl ├── store.ts ├── stringUtils.ts ├── styles │ ├── bootstrap-override.scss │ ├── changesets.scss │ ├── elevationChart.scss │ ├── gallery.scss │ ├── index.scss │ ├── leaflet.scss │ ├── react-tags.scss │ ├── search.scss │ ├── toasts.scss │ └── trackViewer.scss ├── subcategories.ts ├── sw │ ├── sw.ts │ └── upload-sw.ts ├── toolDefinitions.tsx ├── translations │ ├── cs-shared.ts │ ├── cs.tsx │ ├── en-shared.ts │ ├── en.tsx │ ├── hu-shared.ts │ ├── hu.tsx │ ├── it-shared.ts │ ├── it.tsx │ ├── messagesInterface.ts │ ├── sharedMessagesInterface.ts │ ├── sk-shared.ts │ └── sk.tsx ├── transportTypeDefs.tsx ├── typeUtils.ts ├── types │ ├── auth.ts │ ├── common.ts │ ├── osm.ts │ ├── overpass.ts │ └── trackingTypes.ts ├── urlMapUtils.ts └── workerPool.ts ├── ssl ├── Freemap_CA.crt ├── freemap.sk.key ├── freemap.sk.pem └── freemap.xdb ├── tsconfig.json ├── typings └── global.d.ts └── webpack.config.ts /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | **/.DS_Store 4 | npm-debug.log 5 | sitemap 6 | sitemap.tgz 7 | 8 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "plugins": ["prettier-plugin-organize-imports"] 4 | } 5 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.tabSize": 2, 3 | "files.trimTrailingWhitespace": true, 4 | "files.insertFinalNewline": true, 5 | "html.format.preserveNewLines": false, 6 | "workbench.colorCustomizations": { 7 | "activityBar.background": "#382C0E", 8 | "titleBar.activeBackground": "#4E3D14", 9 | "titleBar.activeForeground": "#FCFAF5" 10 | }, 11 | "editor.formatOnSave": true, 12 | "typescript.tsdk": "node_modules/typescript/lib", 13 | "eslint.validate": [ 14 | "javascript", 15 | "javascriptreact", 16 | "typescript", 17 | "typescriptreact" 18 | ], 19 | "typescript.tsserver.maxTsServerMemory": 4096, 20 | "prettier.configPath": ".prettierrc" 21 | } 22 | -------------------------------------------------------------------------------- /markdown-loader.js: -------------------------------------------------------------------------------- 1 | import { marked, parse } from 'marked'; 2 | 3 | const renderer = { 4 | link({ href, title, text }) { 5 | const ext = href.match('^https?://') 6 | ? ' target="_blank" rel="noopener noreferrer"' 7 | : ''; 8 | 9 | return `${text}`; 10 | }, 11 | }; 12 | 13 | marked.use({ renderer }); 14 | 15 | export default function markdownLoader(markdown) { 16 | return parse(markdown, this.getOptions()); 17 | } 18 | -------------------------------------------------------------------------------- /sitemap-generator/.gitignore: -------------------------------------------------------------------------------- 1 | *.js 2 | -------------------------------------------------------------------------------- /sitemap-generator/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "esModuleInterop": true, 5 | "allowSyntheticDefaultImports": true, 6 | "moduleResolution": "node", 7 | "target": "es6", 8 | "sourceMap": true 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/actions/changesetsActions.ts: -------------------------------------------------------------------------------- 1 | import { createAction } from '@reduxjs/toolkit'; 2 | 3 | export interface Changeset { 4 | id: number; 5 | userName: string; 6 | description: string; 7 | closedAt: Date; 8 | centerLat: number; 9 | centerLon: number; 10 | } 11 | 12 | export type ChangesetParams = { 13 | days?: number | null; 14 | authorName?: string | null; 15 | }; 16 | 17 | export const changesetsSet = createAction('CHANGESETS_SET'); 18 | 19 | export const changesetsSetParams = createAction( 20 | 'CHANGESETS_SET_PARAMS', 21 | ); 22 | -------------------------------------------------------------------------------- /src/actions/elevationChartActions.ts: -------------------------------------------------------------------------------- 1 | import { createAction } from '@reduxjs/toolkit'; 2 | import { Feature, LineString } from 'geojson'; 3 | import { ElevationProfilePoint } from '../reducers/elevationChartReducer.js'; 4 | 5 | export const elevationChartSetTrackGeojson = createAction>( 6 | 'ELEVATION_CHART_SET_TRACK_GEOJSON', 7 | ); 8 | 9 | export const elevationChartClose = createAction('ELEVATION_CHART_CLOSE'); 10 | 11 | export const elevationChartSetActivePoint = 12 | createAction( 13 | 'ELEVATION_CHART_SET_ACTIVE_POINT', 14 | ); 15 | 16 | export const elevationChartSetElevationProfile = createAction< 17 | ElevationProfilePoint[] 18 | >('ELEVATION_CHART_SET_ELEVATION_PROFILE_POINTS'); 19 | -------------------------------------------------------------------------------- /src/actions/l10nActions.ts: -------------------------------------------------------------------------------- 1 | import { createAction } from '@reduxjs/toolkit'; 2 | 3 | export const l10nSetChosenLanguage = createAction<{ 4 | language: string | null; 5 | noSave?: boolean; 6 | }>('L10N_SET_CHOSEN_LANGUAGE'); 7 | 8 | export const l10nSetLanguage = createAction('L10N_SET_LANGUAGE'); 9 | -------------------------------------------------------------------------------- /src/actions/mapDetailsActions.ts: -------------------------------------------------------------------------------- 1 | import { createAction } from '@reduxjs/toolkit'; 2 | 3 | export const mapDetailsSetUserSelectedPosition = createAction<{ 4 | lat: number; 5 | lon: number; 6 | }>('MAP_DETAILS_SET_USER_SELECTED_POSITION'); 7 | -------------------------------------------------------------------------------- /src/actions/objectsActions.ts: -------------------------------------------------------------------------------- 1 | import { createAction } from '@reduxjs/toolkit'; 2 | 3 | export interface ObjectsResult { 4 | id: number; 5 | lat: number; 6 | lon: number; 7 | tags: Record; 8 | type: 'node' | 'way' | 'relation'; 9 | } 10 | 11 | export type MarkerType = 'pin' | 'square' | 'ring'; 12 | 13 | export const objectsSetFilter = createAction('OBJECTS_SET_FILTER'); 14 | 15 | export const objectsSetResult = 16 | createAction('OBJECTS_SET_RESULT'); 17 | 18 | export const setSelectedIcon = createAction('SET_SELECTED_ICON'); 19 | -------------------------------------------------------------------------------- /src/actions/osmActions.ts: -------------------------------------------------------------------------------- 1 | import { createAction } from '@reduxjs/toolkit'; 2 | 3 | type Detail = { 4 | id: number; 5 | focus: boolean; 6 | showToast?: boolean; 7 | }; 8 | 9 | export const osmLoadNode = createAction('OSM_LOAD_NODE'); 10 | 11 | export const osmLoadWay = createAction('OSM_LOAD_WAY'); 12 | 13 | export const osmLoadRelation = createAction('OSM_LOAD_RELATION'); 14 | 15 | export const osmClear = createAction('OSM_CLEAR'); 16 | -------------------------------------------------------------------------------- /src/actions/rpcActions.ts: -------------------------------------------------------------------------------- 1 | import { createAction } from '@reduxjs/toolkit'; 2 | 3 | interface RpcResponseBase { 4 | method: string; 5 | params: unknown; 6 | tag?: unknown; 7 | } 8 | 9 | export interface RpcResultResponse extends RpcResponseBase { 10 | type: 'result'; 11 | result: unknown; 12 | } 13 | 14 | export interface RpcErrorResponse extends RpcResponseBase { 15 | type: 'error'; 16 | error: { 17 | code: number; 18 | message: string; 19 | data?: unknown; 20 | }; 21 | } 22 | 23 | export const rpcCall = createAction<{ 24 | method: string; 25 | params: unknown; 26 | tag?: unknown; 27 | }>('RPC_CALL'); 28 | 29 | export const rpcResponse = createAction( 30 | 'RPC_RESPONSE', 31 | ); 32 | 33 | export const rpcEvent = createAction<{ 34 | method: string; 35 | params: unknown; 36 | }>('RPC_EVENT'); 37 | -------------------------------------------------------------------------------- /src/actions/websocketActions.ts: -------------------------------------------------------------------------------- 1 | import { createAction } from '@reduxjs/toolkit'; 2 | 3 | export const wsOpen = createAction('WS_OPEN'); 4 | 5 | export const wsClose = createAction('WS_CLOSE'); 6 | 7 | export const wsSend = createAction<{ 8 | message: unknown; 9 | tag?: unknown; 10 | }>('WS_SEND'); 11 | 12 | export const wsStateChanged = createAction<{ 13 | state: number; 14 | code?: number; 15 | timestamp: number; 16 | }>('WS_STATE_CHANGED'); 17 | 18 | export const wsReceived = createAction('WS_RECEIVED'); 19 | 20 | export const wsInvalidState = createAction('WS_INVALID_STATE'); 21 | -------------------------------------------------------------------------------- /src/actions/wikiActions.ts: -------------------------------------------------------------------------------- 1 | import { createAction } from '@reduxjs/toolkit'; 2 | 3 | export interface WikiPoint { 4 | id: string; 5 | lat: number; 6 | lon: number; 7 | name: string; 8 | wikipedia: string; 9 | } 10 | 11 | export interface WikiPreview { 12 | title: string; 13 | extract: string; 14 | thumbnail?: { source: string; width: number; height: number }; 15 | lang: string; 16 | langTitle: string; // TODO maybe it is same as title 17 | } 18 | 19 | export const wikiSetPoints = createAction('WIKI_SET_POINTS'); 20 | 21 | export const wikiSetPreview = createAction( 22 | 'WIKI_SET_PREVIEW', 23 | ); 24 | 25 | export const wikiLoadPreview = createAction('WIKI_LOAD_PREVIEW'); 26 | -------------------------------------------------------------------------------- /src/cancelRegister.ts: -------------------------------------------------------------------------------- 1 | import { UnknownAction } from '@reduxjs/toolkit'; 2 | 3 | export type ActionCreatorMatchable = { 4 | match: (action: UnknownAction) => boolean; 5 | }; 6 | 7 | export interface CancelItem { 8 | cancelActions: ActionCreatorMatchable[]; 9 | cancel: () => void; 10 | } 11 | 12 | export const cancelRegister = new Set(); 13 | -------------------------------------------------------------------------------- /src/clipboardUtils.ts: -------------------------------------------------------------------------------- 1 | import { Dispatch } from 'redux'; 2 | import { toastsAdd } from './actions/toastsActions.js'; 3 | 4 | export function copyToClipboard( 5 | dispatch: Dispatch, 6 | text: string, 7 | ): Promise { 8 | return window.navigator.clipboard.writeText(text).then( 9 | () => { 10 | dispatch( 11 | toastsAdd({ 12 | messageKey: 'general.copyOk', 13 | style: 'success', 14 | }), 15 | ); 16 | }, 17 | (err) => { 18 | dispatch( 19 | toastsAdd({ 20 | messageKey: 'general.operationError', 21 | messageParams: { err }, 22 | style: 'danger', 23 | }), 24 | ); 25 | }, 26 | ); 27 | } 28 | -------------------------------------------------------------------------------- /src/components/AsyncLoadingIndicator.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | 3 | export function AsyncLoadingIndicator(): ReactElement { 4 | return ; 5 | } 6 | -------------------------------------------------------------------------------- /src/components/AsyncModal.tsx: -------------------------------------------------------------------------------- 1 | import { ComponentType, ReactElement, useMemo } from 'react'; 2 | import { useLazy } from '../hooks/useLazy.js'; 3 | import { ShowProps, useShow } from '../hooks/useShow.js'; 4 | 5 | type Props> = { 6 | show: boolean; 7 | factory: () => Promise<{ default: T }>; 8 | }; 9 | 10 | export function AsyncModal({ 11 | show, 12 | factory, 13 | }: Props>): ReactElement | null { 14 | const Modal = useLazy( 15 | useMemo(() => factory, [factory]), 16 | show, 17 | ); 18 | 19 | return useShow(show) && Modal ? : null; 20 | } 21 | -------------------------------------------------------------------------------- /src/components/Checkbox.tsx: -------------------------------------------------------------------------------- 1 | import { FaRegCheckSquare, FaRegSquare } from 'react-icons/fa'; 2 | 3 | type Props = { 4 | value: boolean; 5 | }; 6 | 7 | export function Checkbox({ value }: Props) { 8 | return value ? : ; 9 | } 10 | -------------------------------------------------------------------------------- /src/components/DeleteButton.tsx: -------------------------------------------------------------------------------- 1 | import type { ReactElement } from 'react'; 2 | import { Button } from 'react-bootstrap'; 3 | import { FaTrash } from 'react-icons/fa'; 4 | import { useDispatch } from 'react-redux'; 5 | import { deleteFeature } from '../actions/mainActions.js'; 6 | import { useMessages } from '../l10nInjector.js'; 7 | 8 | export function DeleteButton(): ReactElement { 9 | const m = useMessages(); 10 | 11 | const dispatch = useDispatch(); 12 | 13 | return ( 14 | 28 | ); 29 | } 30 | -------------------------------------------------------------------------------- /src/components/DrawingRecentColors.tsx: -------------------------------------------------------------------------------- 1 | import { Button } from 'react-bootstrap'; 2 | import { useAppSelector } from '../hooks/reduxSelectHook.js'; 3 | 4 | type Props = { 5 | onColor: (color: string) => void; 6 | }; 7 | 8 | export function DrawingRecentColors({ onColor }: Props) { 9 | const recentColors = useAppSelector( 10 | (state) => state.main.drawingRecentColors, 11 | ); 12 | 13 | return ( 14 | <> 15 | {recentColors.map((color) => ( 16 |