├── .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 |