diff --git a/src/client/src/App.d.ts b/src/client/src/App.d.ts new file mode 100644 index 0000000..7c021e6 --- /dev/null +++ b/src/client/src/App.d.ts @@ -0,0 +1,4 @@ +import React from "react"; + +declare const App: React.FC; +export default App; diff --git a/src/client/src/api/ApiStore/store.ts b/src/client/src/api/ApiStore/store.ts index 6efae5c..91129bd 100644 --- a/src/client/src/api/ApiStore/store.ts +++ b/src/client/src/api/ApiStore/store.ts @@ -21,6 +21,7 @@ import { GetCityResponse, GetSightArticleResponse, } from "./types"; +// @ts-ignore import { orderStationsByRoute } from "../../utils/routeStationsUtils"; class ApiStore { diff --git a/src/client/src/api/ApiStore/types.ts b/src/client/src/api/ApiStore/types.ts index c6c0372..73e5b2b 100644 --- a/src/client/src/api/ApiStore/types.ts +++ b/src/client/src/api/ApiStore/types.ts @@ -5,6 +5,7 @@ export type GetContextResponse = { }; endStopId: string; nearestSightId: string; + nearestStationId?: string | null; rawCoordinates: { latitude: number; longitude: number; @@ -105,6 +106,7 @@ export type GetRouteSightsResponse = { icon?: string; alt_icon?: string; is_default_icon?: boolean; + short_name?: string; }[]; export type GetRouteStationsResponse = { diff --git a/src/client/src/api/apiConfig.d.ts b/src/client/src/api/apiConfig.d.ts new file mode 100644 index 0000000..09a2263 --- /dev/null +++ b/src/client/src/api/apiConfig.d.ts @@ -0,0 +1,9 @@ +import { AxiosInstance } from "axios"; + +export declare const apiBaseURL: string; +export declare const geoBaseURL: string; +export declare const weatherBaseURL: string; +export declare const getMediaUrl: (id: string) => string; +export declare const apiInstance: AxiosInstance; +export declare const geoInstance: AxiosInstance; +export declare const weatherInstance: AxiosInstance; diff --git a/src/client/src/assets/Constants.d.ts b/src/client/src/assets/Constants.d.ts new file mode 100644 index 0000000..2d9c18e --- /dev/null +++ b/src/client/src/assets/Constants.d.ts @@ -0,0 +1,8 @@ +export declare const UP_SCALE: number; +export declare const PATH_WIDTH: number; +export declare const STATION_RADIUS: number; +export declare const STATION_OUTLINE_WIDTH: number; +export declare const SIGHT_SIZE: number; +export declare const SCALE_FACTOR: number; +export declare const BACKGROUND_COLOR: number; +export declare const PATH_COLOR: number; diff --git a/src/client/src/components/OverlayScrollbarsWrapper.d.ts b/src/client/src/components/OverlayScrollbarsWrapper.d.ts new file mode 100644 index 0000000..26e322e --- /dev/null +++ b/src/client/src/components/OverlayScrollbarsWrapper.d.ts @@ -0,0 +1,13 @@ +import React from "react"; + +export declare const OverlayScrollbarsWrapper: React.ForwardRefExoticComponent< + React.PropsWithChildren<{ + className?: string; + onScroll?: (event: Event) => void; + overflowX?: string; + overflowY?: string; + scrollbarVisibility?: string; + [key: string]: any; + }> & + React.RefAttributes +>; diff --git a/src/client/src/components/ReactMarkdown/index.tsx b/src/client/src/components/ReactMarkdown/index.tsx index b870722..53da0b7 100644 --- a/src/client/src/components/ReactMarkdown/index.tsx +++ b/src/client/src/components/ReactMarkdown/index.tsx @@ -1,4 +1,4 @@ -import React from "react"; +import "react"; import ReactMarkdown from "react-markdown"; import rehypeRaw from "rehype-raw"; import "./ReactMarkdown.css"; diff --git a/src/client/src/components/map/InfiniteCanvas.tsx b/src/client/src/components/map/InfiniteCanvas.tsx index 314a2ec..1661cec 100644 --- a/src/client/src/components/map/InfiniteCanvas.tsx +++ b/src/client/src/components/map/InfiniteCanvas.tsx @@ -1,12 +1,8 @@ import { FederatedPointerEvent, FederatedWheelEvent } from "pixi.js"; -import { ReactNode, useEffect, useState, useRef, useCallback } from "react"; +import { ReactNode, useEffect, useState, useRef } from "react"; import { useTransform } from "./transformContext"; import { BACKGROUND_COLOR, SCALE_FACTOR } from "../../assets/Constants"; import { useApplication } from "@pixi/react"; -import { useGeolocation } from "../../context/GeolocationContext"; -import ContentAPI from "../../api/content/content.api"; -import React from "react"; -import { useGeolocationStore } from "../../stores/hooks/useGeolocationStore"; import { useCameraAnimationStore } from "../../stores"; import { observer } from "mobx-react-lite"; import debounce from "lodash/debounce"; @@ -25,7 +21,6 @@ export const InfiniteCanvas = observer( setIsAutoMode, userActivityTimestamp, updateUserActivity, - autoModeStartTimestamp, setAutoModeStartTimestamp, } = useTransform(); const [loaded, setLoaded] = useState(false); @@ -49,17 +44,14 @@ export const InfiniteCanvas = observer( position: { x: number; y: number }; } | null>(null); // Keep these for backward compatibility, but we'll use pinchStartData for calculations - const [initialPinchDistance, setInitialPinchDistance] = useState< - number | null - >(null); - const [initialPinchMidpoint, setInitialPinchMidpoint] = useState<{ + const [, setInitialPinchDistance] = useState(null); + const [, setInitialPinchMidpoint] = useState<{ x: number; y: number; } | null>(null); const [scaleMin, setScaleMin] = useState(0.1); // Default min scale const [scaleMax, setScaleMax] = useState(3); // Default max scale - const store = useGeolocationStore(); const cameraAnimationStore = useCameraAnimationStore(); // Add debounced version of syncState to reduce jittering @@ -269,13 +261,14 @@ export const InfiniteCanvas = observer( setInitialPinchMidpoint(null); pinchStartData.current = null; - if (isDragging) { - const newPosition = { - x: startPosition.x - startMousePosition.x + e.globalX, - y: startPosition.y - startMousePosition.y + e.globalY, - }; - setPosition(newPosition); - syncStateDebounced(newPosition, scale); + if (isDragging) { + const newPosition = { + x: startPosition.x - startMousePosition.x + e.globalX, + y: startPosition.y - startMousePosition.y + e.globalY, + }; + setPosition(newPosition); + syncStateDebounced(newPosition, scale); + } } e.stopPropagation(); }; diff --git a/src/client/src/components/map/Map.tsx b/src/client/src/components/map/Map.tsx index 9fcaa24..87cf3af 100644 --- a/src/client/src/components/map/Map.tsx +++ b/src/client/src/components/map/Map.tsx @@ -1,31 +1,20 @@ -import React, { +import { useCallback, useEffect, - useRef, useState, useMemo, } from "react"; import { observer } from "mobx-react-lite"; -import { Application, extend } from "@pixi/react"; +import { extend } from "@pixi/react"; import { Container, Graphics, Sprite, Text } from "pixi.js"; import { MapDataProvider, useMapData } from "./MapDataContext"; import { TransformProvider, useTransform } from "./transformContext"; -import { InfiniteCanvas } from "./InfiniteCanvas"; -import { TravelPath } from "./TravelPath"; -import { Station } from "./Station"; -import { SightsLayer } from "./Sight"; +// @ts-ignore import Loader from "../Loader"; -import { - BACKGROUND_COLOR, - BUS_COLOR, - STATION_OUTLINE_WIDTH, - STATION_RADIUS, - UP_SCALE, -} from "./Constants"; +import { UP_SCALE } from "./Constants"; import "../../styles/MapLayer.css"; -import { useGeolocationStore, useCameraAnimationStore } from "../../stores"; +import { useCameraAnimationStore } from "../../stores"; import { coordinatesToLocal } from "./utils"; -import { TramIcon } from "./TramIcon"; import { SCALE_FACTOR } from "../../assets/Constants"; import { apiStore } from "../../api/ApiStore/store"; import WebGLMap from "./WebGLMap"; @@ -42,7 +31,7 @@ export function Map() { ); } -function rotatePoint(x, y, originX, originY, angle) { +function rotatePoint(x: number, y: number, originX: number, originY: number, angle: number) { const cos = Math.cos(angle); const sin = Math.sin(angle); const dx = x - originX; @@ -53,8 +42,6 @@ function rotatePoint(x, y, originX, originY, angle) { } const RouteMap = observer(() => { - const store = useGeolocationStore(); - const { contextData } = store; const { routeData, stationData, @@ -77,7 +64,6 @@ const RouteMap = observer(() => { scale, } = useTransform(); const cameraAnimationStore = useCameraAnimationStore(); - const parentRef = useRef(null); const [rotationAngle, setRotationAngle] = useState(0); @@ -143,7 +129,7 @@ const RouteMap = observer(() => { const rotationOriginY = 0; const transformGeoToMapLocal = useCallback( - (latitude, longitude) => { + (latitude: number, longitude: number) => { if (centerLat === undefined || centerLon === undefined) { return { x: 0, y: 0 }; } @@ -239,99 +225,6 @@ const RouteMap = observer(() => { transformedStations, ]); - const drawActualBusPos = useCallback( - (g: Graphics) => { - g.clear(); - if (transformedCurrentCoordinates) { - g.circle( - transformedCurrentCoordinates.x, - transformedCurrentCoordinates.y, - STATION_RADIUS / scale < 10 - ? 10 - : STATION_RADIUS / scale > 20 - ? 20 - : STATION_RADIUS / scale - ); - g.fill({ color: BUS_COLOR }); - g.stroke({ color: BACKGROUND_COLOR, width: STATION_OUTLINE_WIDTH }); - } - }, - [transformedCurrentCoordinates, scale] - ); - - const scaledPoints = useMemo(() => { - if (!routeData?.path) return []; - - return routeData.path.map(([latitude, longitude]) => { - const { x, y } = transformGeoToMapLocal(latitude, longitude); - return rotatePoint(x, y, rotationOriginX, rotationOriginY, rotationAngle); - }); - }, [ - routeData?.path, - transformGeoToMapLocal, - rotationOriginX, - rotationOriginY, - rotationAngle, - ]); - - const transformedStationsEn = useMemo(() => { - if (!stationDataEn) return []; - - return stationDataEn.map((station) => { - const { x, y } = transformGeoToMapLocal( - station.latitude, - station.longitude - ); - const rotatedCoords = rotatePoint( - x, - y, - rotationOriginX, - rotationOriginY, - rotationAngle - ); - return { - ...station, - longitude: rotatedCoords.x, - latitude: rotatedCoords.y, - }; - }); - }, [ - stationDataEn, - transformGeoToMapLocal, - rotationOriginX, - rotationOriginY, - rotationAngle, - ]); - - const transformedStationsZh = useMemo(() => { - if (!stationDataZh) return []; - - return stationDataZh.map((station) => { - const { x, y } = transformGeoToMapLocal( - station.latitude, - station.longitude - ); - const rotatedCoords = rotatePoint( - x, - y, - rotationOriginX, - rotationOriginY, - rotationAngle - ); - return { - ...station, - longitude: rotatedCoords.x, - latitude: rotatedCoords.y, - }; - }); - }, [ - stationDataZh, - transformGeoToMapLocal, - rotationOriginX, - rotationOriginY, - rotationAngle, - ]); - if ( !routeData || !stationData || diff --git a/src/client/src/components/map/Sight.tsx b/src/client/src/components/map/Sight.tsx index 5db65c5..2058b3d 100644 --- a/src/client/src/components/map/Sight.tsx +++ b/src/client/src/components/map/Sight.tsx @@ -1,5 +1,4 @@ // SightsLayer.tsx -import React from "react"; import { Graphics, Assets, Texture, TextStyle } from "pixi.js"; import { useCallback, useEffect, useState, useMemo } from "react"; import { useTransform } from "./transformContext"; @@ -9,7 +8,6 @@ import { useGeolocationStore } from "../../stores"; // Импортируем us const BASE_ICON_SIZE = 30; const CLUSTER_RADIUS_BASE = 10; -const CLUSTER_COLOR = 0x1a73e8; type Cluster = { id: string; @@ -150,7 +148,7 @@ function SingleSight({ readonly sight: SightData; onSightClick: (sightId: string) => void; }) { - const { scale } = useTransform(); + useTransform(); const [texture, setTexture] = useState(Texture.EMPTY); const store = useGeolocationStore(); const { setIsGovernorWidgetOpen } = store; @@ -197,7 +195,7 @@ function SightCluster({ }) { const store = useGeolocationStore(); const { setIsGovernorWidgetOpen } = store; - const { scale } = useTransform(); + useTransform(); const radius = CLUSTER_RADIUS_BASE; const [texture, setTexture] = useState(Texture.EMPTY); const fontSize = 14; @@ -334,7 +332,7 @@ export function SightsLayer({ sights, pathPoints, }: Readonly) { - const { scale } = useTransform(); + useTransform(); const distanceThreshold = BASE_ICON_SIZE * 3; const store = useGeolocationStore(); // Получаем доступ к MobX хранилищу diff --git a/src/client/src/components/map/TramIcon.tsx b/src/client/src/components/map/TramIcon.tsx index ecbc5de..d83bfbc 100644 --- a/src/client/src/components/map/TramIcon.tsx +++ b/src/client/src/components/map/TramIcon.tsx @@ -1,5 +1,4 @@ -import React from "react"; -import { Texture, Assets, Graphics } from "pixi.js"; +import { Texture, Assets } from "pixi.js"; import { useEffect, useState, useMemo, useRef } from "react"; import { useTransform } from "./transformContext"; import { lerp, lerpAngle } from "../../utils/animationUtils"; @@ -11,8 +10,6 @@ const basePath = new URL( const tramPath = new URL("../../assets/tramPosition/Tram.svg", import.meta.url) .href; -// Константы анимации (как в HTML файле) -const ANIMATION_DURATION = 1200; // 1.2 секунды const LERP_SPEED = 0.1; // Скорость интерполяции (10% каждый кадр) // Функция для проверки расстояния до ближайшей точки маршрута @@ -101,7 +98,7 @@ const getDistanceToStations = ( offset_x?: number; offset_y?: number; }[], - debug: boolean = false + _debug: boolean = false ) => { if (!stations || stations.length === 0) { return Infinity; diff --git a/src/client/src/components/map/TramIconWebGL.tsx b/src/client/src/components/map/TramIconWebGL.tsx index dc2a5f9..df7a452 100644 --- a/src/client/src/components/map/TramIconWebGL.tsx +++ b/src/client/src/components/map/TramIconWebGL.tsx @@ -1,5 +1,5 @@ import React, { useEffect, useState, useRef } from "react"; -import { lerp, lerpAngle } from "../../utils/animationUtils"; +import { lerpAngle } from "../../utils/animationUtils"; import tramBase from "../../assets/tramPosition/Tram Base.svg"; import tramSvg from "../../assets/tramPosition/Tram_Second.svg"; import { getMediaUrl } from "../../api/apiConfig"; diff --git a/src/client/src/components/map/WebGLMap.tsx b/src/client/src/components/map/WebGLMap.tsx index 9419098..57bae01 100644 --- a/src/client/src/components/map/WebGLMap.tsx +++ b/src/client/src/components/map/WebGLMap.tsx @@ -18,8 +18,6 @@ import { BUS_COLOR, BASE_ICON_SIZE, CLUSTER_RADIUS_BASE, - CLUSTER_COLOR, - ACTIVE_STATION_COLOR, } from "./Constants"; import { SCALE_FACTOR } from "../../assets/Constants"; import { apiStore } from "../../api/ApiStore/store"; @@ -40,7 +38,7 @@ const YELLOW_ICON_FILTER = const clamp = (value: number, min: number, max: number) => Math.min(max, Math.max(min, value)); -const debugWebglLog = (...args: unknown[]) => { +const debugWebglLog = (..._args: unknown[]) => { if (!DEBUG_WEBGL_ROUTE_MAP) return; }; @@ -424,7 +422,7 @@ export const WebGLMap = observer(() => { }, []); const clampPosition = useCallback( - (pos: { x: number; y: number }, currentScale: number) => { + (pos: { x: number; y: number }, _currentScale: number) => { return pos; }, [], @@ -1165,7 +1163,6 @@ export const WebGLMap = observer(() => { gl.enableVertexAttribArray(attribs.a_pos); gl.vertexAttribPointer(attribs.a_pos, 2, gl.FLOAT, false, 0, 0); - const vcount = routePath.length / 2; let tramSegIndex = getCurrentSegIndex(); const dpr = Math.max(1, window.devicePixelRatio || 1); @@ -1452,53 +1449,6 @@ export const WebGLMap = observer(() => { const toPointsArray = (arr: number[]) => new Float32Array(arr); - const pathPts: { x: number; y: number }[] = []; - for (let i = 0; i < routePath.length; i += 2) - pathPts.push({ x: routePath[i], y: routePath[i + 1] }); - const getSeg = (px: number, py: number) => { - if (pathPts.length < 2) return -1; - let best = -1, - bestD = Infinity; - for (let i = 0; i < pathPts.length - 1; i++) { - const p1 = pathPts[i], - p2 = pathPts[i + 1]; - const dx = p2.x - p1.x, - dy = p2.y - p1.y; - const len2 = dx * dx + dy * dy; - if (!len2) continue; - const t = ((px - p1.x) * dx + (py - p1.y) * dy) / len2; - const tt = Math.max(0, Math.min(1, t)); - const cx = p1.x + tt * dx, - cy = p1.y + tt * dy; - const d = Math.hypot(px - cx, py - cy); - if (d < bestD) { - bestD = d; - best = i; - } - } - return best; - }; - - let tramSegForStations = -1; - { - const cLat = routeData?.center_latitude, - cLon = routeData?.center_longitude; - const tram = apiStore?.context?.currentCoordinates as any; - if (tram && cLat !== undefined && cLon !== undefined) { - const loc = coordinatesToLocal( - tram.latitude - cLat, - tram.longitude - cLon, - ); - const wx = loc.x * UP_SCALE, - wy = loc.y * UP_SCALE; - const cosR = Math.cos(rotationAngle), - sinR = Math.sin(rotationAngle); - const tx = wx * cosR - wy * sinR, - ty = wx * sinR + wy * cosR; - tramSegForStations = getSeg(tx, ty); - } - } - let activeStationIndex = -1; const tramCoords = apiStore?.context?.currentCoordinates; if ( @@ -1719,10 +1669,10 @@ export const WebGLMap = observer(() => { const sin = Math.sin(rotationAngle); const startStationData = stationData.find( - (station) => station.id.toString() === apiStore.context?.startStopId, + (station: any) => station.id.toString() === apiStore.context?.startStopId, ); const endStationData = stationData.find( - (station) => station.id.toString() === apiStore.context?.endStopId, + (station: any) => station.id.toString() === apiStore.context?.endStopId, ); const terminalStations: number[] = []; @@ -2331,11 +2281,10 @@ export const WebGLMap = observer(() => { ? { right: 0, transform: "none" } : { left: "50%", transform: "translateX(-50%)" }; - const apiBaseUrl = apiBaseURL; const isMediaIdEmptyResult = isMediaIdEmpty(station?.icon); const iconSrc = isMediaIdEmptyResult ? null - : `${apiBaseUrl}/media/${station?.icon}/download`; + : buildMediaDownloadUrl(mediaBaseUrl, station!.icon!, mediaToken); const iconSizePx = Math.round(primaryFontSize * 1.2); return ( diff --git a/src/client/src/components/map/transformContext.tsx b/src/client/src/components/map/transformContext.tsx index 33e129f..0bde258 100644 --- a/src/client/src/components/map/transformContext.tsx +++ b/src/client/src/components/map/transformContext.tsx @@ -4,9 +4,7 @@ import React, { useContext, useState, useCallback, - useRef, } from "react"; -import { UP_SCALE } from "./Constants"; const TransformContext = createContext<{ position: { x: number; y: number }; diff --git a/src/client/src/components/widgets/ThreeView.tsx b/src/client/src/components/widgets/ThreeView.tsx index 79abd24..1ff998e 100644 --- a/src/client/src/components/widgets/ThreeView.tsx +++ b/src/client/src/components/widgets/ThreeView.tsx @@ -231,7 +231,6 @@ export const ThreeView: React.FC = ({ height = "100%", onLoad, onError, - onAspectRatioCalculated, controlRef, }) => { return ( @@ -244,7 +243,7 @@ export const ThreeView: React.FC = ({ }} camera={{ position: [0, 0, 5], fov: 40 }} style={{ width: "100%", height: "100%" }} - onError={(e) => onError?.(e.message)} + onError={(e: any) => onError?.(e.message)} > @@ -269,7 +268,7 @@ export const ThreeView: React.FC = ({ void) | null ) { @@ -140,7 +113,7 @@ class CameraAnimationStore { public followTram( tramMapPos: CameraPosition, screenCenter: CameraPosition, - stations: Station[] = [] + _stations: Station[] = [] ) { // Анимация начинается с текущего зума и плавно переходит к максимальному зуму // для плавного приближения к желтой точке при слежении diff --git a/src/client/src/styles/SideMenu.css b/src/client/src/styles/SideMenu.css index 5e09e49..37f815f 100644 --- a/src/client/src/styles/SideMenu.css +++ b/src/client/src/styles/SideMenu.css @@ -215,6 +215,8 @@ transition: transform 0.3s ease-out, opacity 0.3s ease-out; + display: flex; + flex-direction: column; } .side-menu-sights.slide-in { @@ -227,7 +229,8 @@ } .side-menu-sights-block { - height: calc(100% - 20px); + flex: 1; + min-height: 0; margin-left: 20px; margin-top: 8px; touch-action: none; @@ -236,6 +239,7 @@ max-width: calc(100% - 20px); box-sizing: border-box; overflow-x: hidden; + overflow-y: auto; } .side-menu-sight { diff --git a/src/pages/Route/DemoPage/index.tsx b/src/pages/Route/DemoPage/index.tsx index 3f27850..b786642 100644 --- a/src/pages/Route/DemoPage/index.tsx +++ b/src/pages/Route/DemoPage/index.tsx @@ -1,4 +1,4 @@ -import React, { useEffect } from "react"; +import { useEffect } from "react"; import { useParams } from "react-router-dom"; import { apiStore } from "../../../client/src/api/ApiStore/store"; import App from "../../../client/src/App"; diff --git a/src/widgets/SightTabs/LeftWidgetTab/index.tsx b/src/widgets/SightTabs/LeftWidgetTab/index.tsx index fd3b407..02b22c1 100644 --- a/src/widgets/SightTabs/LeftWidgetTab/index.tsx +++ b/src/widgets/SightTabs/LeftWidgetTab/index.tsx @@ -9,7 +9,6 @@ import { SelectArticleModal, UploadMediaDialog, Language, - articlesStore, } from "@shared"; import { LanguageSwitcher, @@ -85,31 +84,7 @@ export const LeftWidgetTab = observer( ) => { setIsSelectArticleDialogOpen(false); - const ruArticle = await articlesStore.getArticle(articleId, "ru"); - const enArticle = await articlesStore.getArticle(articleId, "en"); - const zhArticle = await articlesStore.getArticle(articleId, "zh"); - - updateSightInfo("ru", { - left: { - heading: ruArticle.data.heading, - body: ruArticle.data.body, - media: ruArticle.data.media || [], - }, - }); - updateSightInfo("en", { - left: { - heading: enArticle.data.heading, - body: enArticle.data.body, - media: enArticle.data.media || [], - }, - }); - updateSightInfo("zh", { - left: { - heading: zhArticle.data.heading, - body: zhArticle.data.body, - media: zhArticle.data.media || [], - }, - }); + await editSightStore.getLeftArticle(articleId); updateSightInfo( languageStore.language, diff --git a/tsconfig.tsbuildinfo b/tsconfig.tsbuildinfo index b73e52b..b4c467c 100644 --- a/tsconfig.tsbuildinfo +++ b/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"root":["./src/main.tsx","./src/vite-env.d.ts","./src/app/globalerrorboundary.tsx","./src/app/index.tsx","./src/app/router/index.tsx","./src/entities/index.ts","./src/entities/navigation/index.ts","./src/entities/navigation/model/index.ts","./src/entities/navigation/ui/index.tsx","./src/features/index.ts","./src/features/navigation/index.ts","./src/features/navigation/ui/index.tsx","./src/pages/index.ts","./src/pages/article/index.ts","./src/pages/article/articlecreatepage/index.tsx","./src/pages/article/articleeditpage/index.tsx","./src/pages/article/articlelistpage/index.tsx","./src/pages/article/articlepreviewpage/previewleftwidget.tsx","./src/pages/article/articlepreviewpage/previewrightwidget.tsx","./src/pages/article/articlepreviewpage/index.tsx","./src/pages/carrier/index.ts","./src/pages/carrier/carriercreatepage/index.tsx","./src/pages/carrier/carriereditpage/index.tsx","./src/pages/carrier/carrierlistpage/index.tsx","./src/pages/city/index.ts","./src/pages/city/citycreatepage/index.tsx","./src/pages/city/cityeditpage/index.tsx","./src/pages/city/citylistpage/index.tsx","./src/pages/city/citypreviewpage/index.tsx","./src/pages/country/index.ts","./src/pages/country/countryaddpage/index.tsx","./src/pages/country/countrycreatepage/index.tsx","./src/pages/country/countryeditpage/index.tsx","./src/pages/country/countrylistpage/index.tsx","./src/pages/country/countrypreviewpage/index.tsx","./src/pages/createsightpage/index.tsx","./src/pages/devicespage/index.tsx","./src/pages/editsightpage/index.tsx","./src/pages/loginpage/index.tsx","./src/pages/mainpage/index.tsx","./src/pages/mappage/index.tsx","./src/pages/mappage/mapstore.ts","./src/pages/media/index.ts","./src/pages/media/mediacreatepage/index.tsx","./src/pages/media/mediaeditpage/index.tsx","./src/pages/media/medialistpage/index.tsx","./src/pages/media/mediapreviewpage/index.tsx","./src/pages/route/linekedstations.tsx","./src/pages/route/index.ts","./src/pages/route/routecreatepage/index.tsx","./src/pages/route/routeeditpage/index.tsx","./src/pages/route/routelistpage/index.tsx","./src/pages/route/route-preview/constants.ts","./src/pages/route/route-preview/infinitecanvas.tsx","./src/pages/route/route-preview/leftsidebar.tsx","./src/pages/route/route-preview/mapdatacontext.tsx","./src/pages/route/route-preview/rightsidebar.tsx","./src/pages/route/route-preview/sight.tsx","./src/pages/route/route-preview/sightinfowidget.tsx","./src/pages/route/route-preview/station.tsx","./src/pages/route/route-preview/transformcontext.tsx","./src/pages/route/route-preview/travelpath.tsx","./src/pages/route/route-preview/widgets.tsx","./src/pages/route/route-preview/index.tsx","./src/pages/route/route-preview/types.ts","./src/pages/route/route-preview/utils.ts","./src/pages/route/route-preview/web-gl/languageselector.tsx","./src/pages/route/route-preview/webgl-prototype/webglroutemapprototype.tsx","./src/pages/sight/linkedstations.tsx","./src/pages/sight/index.ts","./src/pages/sight/sightlistpage/index.tsx","./src/pages/sightpage/index.tsx","./src/pages/snapshot/index.ts","./src/pages/snapshot/snapshotcreatepage/index.tsx","./src/pages/snapshot/snapshotlistpage/index.tsx","./src/pages/station/linkedsights.tsx","./src/pages/station/index.ts","./src/pages/station/stationcreatepage/index.tsx","./src/pages/station/stationeditpage/index.tsx","./src/pages/station/stationlistpage/index.tsx","./src/pages/station/stationpreviewpage/index.tsx","./src/pages/user/index.ts","./src/pages/user/usercreatepage/index.tsx","./src/pages/user/usereditpage/index.tsx","./src/pages/user/userlistpage/index.tsx","./src/pages/vehicle/index.ts","./src/pages/vehicle/vehiclecreatepage/index.tsx","./src/pages/vehicle/vehicleeditpage/index.tsx","./src/pages/vehicle/vehiclelistpage/index.tsx","./src/pages/vehicle/vehiclepreviewpage/index.tsx","./src/shared/index.tsx","./src/shared/api/index.tsx","./src/shared/api/mobxfetch/index.ts","./src/shared/config/constants.tsx","./src/shared/config/index.ts","./src/shared/const/index.ts","./src/shared/const/mediatypes.ts","./src/shared/hooks/index.ts","./src/shared/hooks/useselectedcity.ts","./src/shared/lib/gltfcachemanager.ts","./src/shared/lib/index.ts","./src/shared/lib/decodejwt/index.ts","./src/shared/lib/mui/theme.ts","./src/shared/lib/permissions/index.ts","./src/shared/modals/index.ts","./src/shared/modals/articleselectorcreatedialog/index.tsx","./src/shared/modals/previewmediadialog/index.tsx","./src/shared/modals/selectarticledialog/index.tsx","./src/shared/modals/selectmediadialog/index.tsx","./src/shared/modals/uploadmediadialog/index.tsx","./src/shared/store/index.ts","./src/shared/store/articlesstore/index.tsx","./src/shared/store/authstore/api.ts","./src/shared/store/authstore/index.tsx","./src/shared/store/carrierstore/index.tsx","./src/shared/store/citystore/index.ts","./src/shared/store/countrystore/index.ts","./src/shared/store/createsightstore/index.tsx","./src/shared/store/devicesstore/index.tsx","./src/shared/store/editsightstore/index.tsx","./src/shared/store/languagestore/index.tsx","./src/shared/store/mediastore/index.tsx","./src/shared/store/menustore/index.ts","./src/shared/store/modelloadingstore/index.ts","./src/shared/store/routestore/index.ts","./src/shared/store/selectedcitystore/index.ts","./src/shared/store/sightsstore/index.tsx","./src/shared/store/snapshotstore/index.ts","./src/shared/store/stationsstore/index.ts","./src/shared/store/testingmodestore/api.ts","./src/shared/store/testingmodestore/index.ts","./src/shared/store/userstore/api.ts","./src/shared/store/userstore/index.ts","./src/shared/store/vehiclestore/api.ts","./src/shared/store/vehiclestore/index.ts","./src/shared/store/vehiclestore/types.ts","./src/shared/ui/animatedcirclebutton.tsx","./src/shared/ui/index.ts","./src/shared/ui/backbutton/index.tsx","./src/shared/ui/coordinatesinput/index.tsx","./src/shared/ui/input/index.tsx","./src/shared/ui/loadingspinner/index.tsx","./src/shared/ui/modal/index.tsx","./src/shared/ui/modelloadingindicator/index.tsx","./src/shared/ui/multiselect/index.tsx","./src/shared/ui/searchinput/index.tsx","./src/shared/ui/tabpanel/index.tsx","./src/widgets/index.ts","./src/widgets/cityselector/index.tsx","./src/widgets/createbutton/index.tsx","./src/widgets/deletemodal/index.tsx","./src/widgets/devicestable/devicelogsmodal.tsx","./src/widgets/devicestable/vehiclesessionsmodal.tsx","./src/widgets/devicestable/index.tsx","./src/widgets/imageuploadcard/index.tsx","./src/widgets/languageswitcher/index.tsx","./src/widgets/layout/index.tsx","./src/widgets/layout/ui/appbar.tsx","./src/widgets/layout/ui/drawer.tsx","./src/widgets/layout/ui/drawerheader.tsx","./src/widgets/leaveagree/index.tsx","./src/widgets/mediaarea/index.tsx","./src/widgets/mediaareaforsight/index.tsx","./src/widgets/mediaviewer/threeview.tsx","./src/widgets/mediaviewer/threeviewerrorboundary.tsx","./src/widgets/mediaviewer/index.tsx","./src/widgets/modelviewer3d/index.tsx","./src/widgets/reactmarkdown/index.tsx","./src/widgets/reactmarkdowneditor/index.tsx","./src/widgets/savewithoutcityagree/index.tsx","./src/widgets/sightedit/index.tsx","./src/widgets/sightheader/index.ts","./src/widgets/sightheader/ui/index.tsx","./src/widgets/sighttabs/index.ts","./src/widgets/sighttabs/createinformationtab/mediauploadbox.tsx","./src/widgets/sighttabs/createinformationtab/index.tsx","./src/widgets/sighttabs/createlefttab/index.tsx","./src/widgets/sighttabs/createrighttab/index.tsx","./src/widgets/sighttabs/informationtab/index.tsx","./src/widgets/sighttabs/leftwidgettab/index.tsx","./src/widgets/sighttabs/rightwidgettab/sightframepreview.tsx","./src/widgets/sighttabs/rightwidgettab/sightframethreeview.tsx","./src/widgets/sighttabs/rightwidgettab/sightframethreeviewicons.tsx","./src/widgets/sighttabs/rightwidgettab/index.tsx","./src/widgets/sightstable/index.tsx","./src/widgets/snapshotrestore/index.tsx","./src/widgets/testingmodebanner/index.tsx","./src/widgets/videopreviewcard/index.tsx","./src/widgets/modals/editstationmodal.tsx","./src/widgets/modals/index.ts","./src/widgets/modals/editstationtransfersmodal/index.tsx","./src/widgets/modals/selectarticledialog/index.tsx"],"version":"5.8.3"} \ No newline at end of file +{"root":["./src/main.tsx","./src/vite-env.d.ts","./src/app/globalerrorboundary.tsx","./src/app/index.tsx","./src/app/router/index.tsx","./src/client/src/app.d.ts","./src/client/src/api/apiconfig.d.ts","./src/client/src/api/apistore/api.ts","./src/client/src/api/apistore/index.ts","./src/client/src/api/apistore/store.ts","./src/client/src/api/apistore/types.ts","./src/client/src/assets/constants.d.ts","./src/client/src/components/overlayscrollbarswrapper.d.ts","./src/client/src/components/simulationsettings.tsx","./src/client/src/components/threeviewerrorboundary.tsx","./src/client/src/components/reactmarkdown/index.tsx","./src/client/src/components/touchablelayout/index.tsx","./src/client/src/components/map/constants.tsx","./src/client/src/components/map/infinitecanvas.tsx","./src/client/src/components/map/map.tsx","./src/client/src/components/map/mapdatacontext.tsx","./src/client/src/components/map/sight.tsx","./src/client/src/components/map/station.tsx","./src/client/src/components/map/tramicon.tsx","./src/client/src/components/map/tramiconwebgl.tsx","./src/client/src/components/map/travelpath.tsx","./src/client/src/components/map/webglmap.tsx","./src/client/src/components/map/custom.d.ts","./src/client/src/components/map/transformcontext.tsx","./src/client/src/components/map/types.tsx","./src/client/src/components/map/utils.tsx","./src/client/src/components/widgets/panoramview.tsx","./src/client/src/components/widgets/threeview.tsx","./src/client/src/components/widgets/threeviewicons.tsx","./src/client/src/context/geolocationcontext.tsx","./src/client/src/hooks/useanimatedposition.ts","./src/client/src/hooks/useroutefollowingposition.ts","./src/client/src/stores/cameraanimationstore.ts","./src/client/src/stores/colorstore.ts","./src/client/src/stores/geolocationstore.ts","./src/client/src/stores/index.ts","./src/client/src/stores/hooks/usecameraanimationstore.ts","./src/client/src/stores/hooks/usecolorstore.ts","./src/client/src/stores/hooks/usegeolocationstore.ts","./src/client/src/utils/routepathanimator.ts","./src/client/src/utils/animationutils.ts","./src/entities/index.ts","./src/entities/navigation/index.ts","./src/entities/navigation/model/index.ts","./src/entities/navigation/ui/index.tsx","./src/features/index.ts","./src/features/navigation/index.ts","./src/features/navigation/ui/index.tsx","./src/pages/index.ts","./src/pages/article/index.ts","./src/pages/article/articlecreatepage/index.tsx","./src/pages/article/articleeditpage/index.tsx","./src/pages/article/articlelistpage/index.tsx","./src/pages/article/articlepreviewpage/previewleftwidget.tsx","./src/pages/article/articlepreviewpage/previewrightwidget.tsx","./src/pages/article/articlepreviewpage/index.tsx","./src/pages/carrier/index.ts","./src/pages/carrier/carriercreatepage/index.tsx","./src/pages/carrier/carriereditpage/index.tsx","./src/pages/carrier/carrierlistpage/index.tsx","./src/pages/city/index.ts","./src/pages/city/citycreatepage/index.tsx","./src/pages/city/cityeditpage/index.tsx","./src/pages/city/citylistpage/index.tsx","./src/pages/city/citypreviewpage/index.tsx","./src/pages/country/index.ts","./src/pages/country/countryaddpage/index.tsx","./src/pages/country/countrycreatepage/index.tsx","./src/pages/country/countryeditpage/index.tsx","./src/pages/country/countrylistpage/index.tsx","./src/pages/country/countrypreviewpage/index.tsx","./src/pages/createsightpage/index.tsx","./src/pages/devicespage/index.tsx","./src/pages/editsightpage/index.tsx","./src/pages/loginpage/index.tsx","./src/pages/mainpage/index.tsx","./src/pages/mappage/index.tsx","./src/pages/mappage/mapstore.ts","./src/pages/media/index.ts","./src/pages/media/mediacreatepage/index.tsx","./src/pages/media/mediaeditpage/index.tsx","./src/pages/media/medialistpage/index.tsx","./src/pages/media/mediapreviewpage/index.tsx","./src/pages/route/linekedstations.tsx","./src/pages/route/index.ts","./src/pages/route/demopage/index.tsx","./src/pages/route/routecreatepage/index.tsx","./src/pages/route/routeeditpage/index.tsx","./src/pages/route/routelistpage/index.tsx","./src/pages/route/route-preview/constants.ts","./src/pages/route/route-preview/infinitecanvas.tsx","./src/pages/route/route-preview/leftsidebar.tsx","./src/pages/route/route-preview/mapdatacontext.tsx","./src/pages/route/route-preview/rightsidebar.tsx","./src/pages/route/route-preview/sight.tsx","./src/pages/route/route-preview/sightinfowidget.tsx","./src/pages/route/route-preview/station.tsx","./src/pages/route/route-preview/transformcontext.tsx","./src/pages/route/route-preview/travelpath.tsx","./src/pages/route/route-preview/widgets.tsx","./src/pages/route/route-preview/index.tsx","./src/pages/route/route-preview/types.ts","./src/pages/route/route-preview/utils.ts","./src/pages/route/route-preview/web-gl/languageselector.tsx","./src/pages/route/route-preview/webgl-prototype/webglroutemapprototype.tsx","./src/pages/sight/linkedstations.tsx","./src/pages/sight/index.ts","./src/pages/sight/sightlistpage/index.tsx","./src/pages/sightpage/index.tsx","./src/pages/snapshot/index.ts","./src/pages/snapshot/snapshotcreatepage/index.tsx","./src/pages/snapshot/snapshotlistpage/index.tsx","./src/pages/station/linkedsights.tsx","./src/pages/station/index.ts","./src/pages/station/stationcreatepage/index.tsx","./src/pages/station/stationeditpage/index.tsx","./src/pages/station/stationlistpage/index.tsx","./src/pages/station/stationpreviewpage/index.tsx","./src/pages/user/index.ts","./src/pages/user/usercreatepage/index.tsx","./src/pages/user/usereditpage/index.tsx","./src/pages/user/userlistpage/index.tsx","./src/pages/vehicle/index.ts","./src/pages/vehicle/vehiclecreatepage/index.tsx","./src/pages/vehicle/vehicleeditpage/index.tsx","./src/pages/vehicle/vehiclelistpage/index.tsx","./src/pages/vehicle/vehiclepreviewpage/index.tsx","./src/shared/index.tsx","./src/shared/api/index.tsx","./src/shared/api/mobxfetch/index.ts","./src/shared/config/constants.tsx","./src/shared/config/index.ts","./src/shared/const/index.ts","./src/shared/const/mediatypes.ts","./src/shared/hooks/index.ts","./src/shared/hooks/useselectedcity.ts","./src/shared/lib/gltfcachemanager.ts","./src/shared/lib/index.ts","./src/shared/lib/decodejwt/index.ts","./src/shared/lib/mui/theme.ts","./src/shared/lib/permissions/index.ts","./src/shared/modals/index.ts","./src/shared/modals/articleselectorcreatedialog/index.tsx","./src/shared/modals/previewmediadialog/index.tsx","./src/shared/modals/selectarticledialog/index.tsx","./src/shared/modals/selectmediadialog/index.tsx","./src/shared/modals/uploadmediadialog/index.tsx","./src/shared/store/index.ts","./src/shared/store/articlesstore/index.tsx","./src/shared/store/authstore/api.ts","./src/shared/store/authstore/index.tsx","./src/shared/store/carrierstore/index.tsx","./src/shared/store/citystore/index.ts","./src/shared/store/countrystore/index.ts","./src/shared/store/createsightstore/index.tsx","./src/shared/store/devicesstore/index.tsx","./src/shared/store/editsightstore/index.tsx","./src/shared/store/languagestore/index.tsx","./src/shared/store/mediastore/index.tsx","./src/shared/store/menustore/index.ts","./src/shared/store/modelloadingstore/index.ts","./src/shared/store/routestore/index.ts","./src/shared/store/selectedcitystore/index.ts","./src/shared/store/sightsstore/index.tsx","./src/shared/store/snapshotstore/index.ts","./src/shared/store/stationsstore/index.ts","./src/shared/store/testingmodestore/api.ts","./src/shared/store/testingmodestore/index.ts","./src/shared/store/userstore/api.ts","./src/shared/store/userstore/index.ts","./src/shared/store/vehiclestore/api.ts","./src/shared/store/vehiclestore/index.ts","./src/shared/store/vehiclestore/types.ts","./src/shared/ui/animatedcirclebutton.tsx","./src/shared/ui/index.ts","./src/shared/ui/backbutton/index.tsx","./src/shared/ui/coordinatesinput/index.tsx","./src/shared/ui/input/index.tsx","./src/shared/ui/loadingspinner/index.tsx","./src/shared/ui/modal/index.tsx","./src/shared/ui/modelloadingindicator/index.tsx","./src/shared/ui/multiselect/index.tsx","./src/shared/ui/searchinput/index.tsx","./src/shared/ui/tabpanel/index.tsx","./src/widgets/index.ts","./src/widgets/cityselector/index.tsx","./src/widgets/createbutton/index.tsx","./src/widgets/deletemodal/index.tsx","./src/widgets/devicestable/devicelogsmodal.tsx","./src/widgets/devicestable/vehiclesessionsmodal.tsx","./src/widgets/devicestable/index.tsx","./src/widgets/imageuploadcard/index.tsx","./src/widgets/languageswitcher/index.tsx","./src/widgets/layout/index.tsx","./src/widgets/layout/ui/appbar.tsx","./src/widgets/layout/ui/drawer.tsx","./src/widgets/layout/ui/drawerheader.tsx","./src/widgets/leaveagree/index.tsx","./src/widgets/mediaarea/index.tsx","./src/widgets/mediaareaforsight/index.tsx","./src/widgets/mediaviewer/threeview.tsx","./src/widgets/mediaviewer/threeviewerrorboundary.tsx","./src/widgets/mediaviewer/index.tsx","./src/widgets/modelviewer3d/index.tsx","./src/widgets/reactmarkdown/index.tsx","./src/widgets/reactmarkdowneditor/index.tsx","./src/widgets/savewithoutcityagree/index.tsx","./src/widgets/sightedit/index.tsx","./src/widgets/sightheader/index.ts","./src/widgets/sightheader/ui/index.tsx","./src/widgets/sighttabs/index.ts","./src/widgets/sighttabs/createinformationtab/mediauploadbox.tsx","./src/widgets/sighttabs/createinformationtab/index.tsx","./src/widgets/sighttabs/createlefttab/index.tsx","./src/widgets/sighttabs/createrighttab/index.tsx","./src/widgets/sighttabs/informationtab/index.tsx","./src/widgets/sighttabs/leftwidgettab/index.tsx","./src/widgets/sighttabs/rightwidgettab/sightframepreview.tsx","./src/widgets/sighttabs/rightwidgettab/sightframethreeview.tsx","./src/widgets/sighttabs/rightwidgettab/sightframethreeviewicons.tsx","./src/widgets/sighttabs/rightwidgettab/index.tsx","./src/widgets/sightstable/index.tsx","./src/widgets/snapshotrestore/index.tsx","./src/widgets/testingmodebanner/index.tsx","./src/widgets/videopreviewcard/index.tsx","./src/widgets/modals/editstationmodal.tsx","./src/widgets/modals/index.ts","./src/widgets/modals/editstationtransfersmodal/index.tsx","./src/widgets/modals/selectarticledialog/index.tsx"],"version":"5.8.3"} \ No newline at end of file