draw-libre 0.5.1 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/panel/state.ts","../src/app/dom/index.ts","../src/components/panel/view.ts","../src/components/tooltip/index.ts","../src/app/observable/index.ts","../src/app/history/command.ts","../src/app/history/index.ts","../src/app/utils/helpers.ts","../src/app/utils/geo_constants.ts","../src/components/map/points/helpers.ts","../src/app/store/circular.ts","../src/app/store/index.ts","../src/app/store/init.ts","../src/app/utils/constants.ts","../src/components/map/fire-events.ts","../src/components/map/renderer/geojson-builder.ts","../src/components/map/renderer/index.ts","../src/components/panel/actions.ts","../src/components/panel/events.ts","../src/components/panel/observer.ts","../src/components/panel/index.ts","../src/components/cursor/constants.ts","../src/components/side-control/helpers.ts","../src/components/side-control/events.ts","../src/components/side-control/observer.ts","../src/components/side-control/view.ts","../src/components/side-control/index.ts","../src/components/map/mode/index.ts","../src/components/cursor/index.ts","../src/components/map/mouse-events/index.ts","../src/app/options/constants.ts","../src/app/options/index.ts","../src/components/map/points/commands/insert-point.ts","../src/components/map/utils.ts","../src/components/map/line/utils.ts","../src/components/map/line/commands/break-geometry.ts","../src/components/map/line/break-line.ts","../src/components/map/line/dynamic-line.ts","../src/components/map/line/transparent-line.ts","../src/components/map/line/index.ts","../src/components/map/tiles/utils.ts","../src/components/map/points/commands/close-geometry.ts","../src/components/map/points/first-point.ts","../src/components/map/points/commands/aux-to-primary.ts","../src/components/map/points/commands/move-point.ts","../src/components/map/points/aux-points.ts","../src/components/map/points/point-state.ts","../src/components/map/points/commands/add-point.ts","../src/components/map/points/commands/remove-point/auto.ts","../src/components/map/points/commands/remove-point/manual.ts","../src/components/map/points/commands/remove-point/index.ts","../src/components/map/points/point-topology-manager.ts","../src/components/map/points/index.ts","../src/components/map/tiles/events.ts","../src/components/map/tiles/layers.ts","../src/components/map/tiles/sources.ts","../src/components/map/tiles/index.ts","../src/app/history/map-adapter.ts","../src/index.ts"],"names":["UIState","value","id","DOM","tagName","className","container","element","node","target","type","callback","options","button","View","ctx","title","size","panel","locale","buttons","x","y","observer","BASE_Y_OFFSET_FROM_ELEMENT","BASE_X_OFFSET_FROM_ELEMENT","Tooltip","span","event","bottom","left","labelWidth","labelHeight","right","position","pos","Observable","args","CompoundCommand","payload","commands","cmd","i","Timeline","_Timeline","txn","timeline","uuidv4","getRandomHexChar","getUuidSection","length","section","getUuidSectionSize","idx","firstElement","lastElement","parts","throttle","fn","delay","lastArgs","shouldCall","execute","debounce","timeout","LINE_BASE","ELAYERS","ESOURCES","FIRST_POINT_RADIUS","FIRST_POINT_COLOR","FIRST_POINT_PAINT_BASE","AUXILIARY_POINT_PAINT_BASE","ON_LINE_POINT_PAINT_BASE","POLYGON_PAINT_BASE","LINE_PAINT_BASE","POINTS_PAINT_BASE","BREAK_PAINT_BASE","generateLayers","PointHelpers","p1","p2","mid","PointVisibility","map","PointsFilter","Circular","store","head","tail","threshold","current","auxId","ListNode","val","next","prev","Store","list","initStore","step","newNode","stepToInsert","ERRORS","buildStepSequence","initialSteps","closeGeometry","pointGeneration","steps","auxPoint","generateIdForSteps","stepsWithoutIds","fromArray","initialOptions","generateId","linkedListToArray","visitedNodes","result","EVENTS","MOBILE_WIDTH","FireEvents","mode","originalEvent","context","collectGeometryCoordinates","coordinates","getLine","getAllLines","getPolygon","getPoints","pointFeatures","getUnifiedFeatures","points","lines","polygons","Renderer","_Renderer","featureIdx","newCoord","line","polygon","feature","aux","prevIdx","unifiedSource","renderer","Actions","view","hasSomethingToRedo","Events","handler","btn","onClick","label","Observer","data","OFFSET_Y","Panel","width","height","point","dx","dy","visible","CURSORS","getButtonLabel","lineTitle","polygonTitle","breakTitle","lineButton","breakButton","polygonButton","placement","currentMode","active","disabled","lineVisible","polygonVisible","breakVisible","isBreak","Control","enrichedCtx","root","getInitialMode","DrawingMode","newMode","Cursor","#canvas","#initConsumers","cursor","mouseEvents","#mouseEventsObserver","MouseEvents","#firstPointMouseEnter","#firstPointMouseLeave","#lastPointMouseClick","#lastPointMouseUp","#lastPointMouseEnter","#lastPointMouseLeave","#pointMouseDown","#pointMouseUp","#pointMouseEnter","#pointMouseLeave","#lineMouseEnter","#lineMouseLeave","DEFAULT_OPTIONS","allStepsHaveIds","checkIfMissingIds","idGenerationIsOff","idsNotProvided","checkIfEnoughPointsToClose","checkIfPolygonIsClosed","firstLng","lastLng","firstLat","lastLat","checkInitialStepsOptionOnErrors","initOptions","generatePanelOptions","generateModeOptions","generateLayersOptions","generateLocaleOptions","InsertPointCommand","coords","segmentStart","isFeatureTriggered","layerIds","layer","queryPointId","queryPoint","getGeometryIndex","isRightClick","distance","point1","point2","checkIfPointIsOnLine","A","B","P","AB","AP","PB","isOnLine","visited","aPixel","bPixel","eventPixel","insertStepIfOnLine","updateUIAfterInsert","checkIfPointClicked","BreakGeometryCommand","clickCoords","originalHead","originalTail","newHead","newTail","newAuxBetweenHeadTail","LINE_BREAK_THROTTLE_TIME","LineBreakEvents","lineSource","lineBreakData","LINE_DYNAMIC_THROTTLE_TIME","DynamicLineEvents","lineClick","latLng","LINE_TRANSPARENT_THROTTLE_TIME","TransparentLineEvents","pointSource","LineEvents","firstPointCircleRadius","defaultPointCircleRadius","togglePointCircleRadius","removeTransparentLine","addTransparentLine","transparentLayer","CloseGeometryCommand","FirstPoint","baseEvents","#mouseDown","#tooltip","X_OFFSET","AuxToPrimaryCommand","clickedNode","prevPrimaryNode","nextPrimaryNode","prevAuxNode","nextAuxNode","lastAuxNode","prevAuxPoint","nextAuxPoint","MovePointCommand","selectedNode","start","prevAux","nextAux","prevPrimary","nextPrimary","midPoint","AuxPoints","pointState","topologyManager","lastEvent","startCoordinates","PointState","moved","AddPointCommand","coord","addedNode","auxNode","RemovePointAutoCommand","nodeId","wasCircular","wasRemovedHead","wasRemovedTail","auxBefore","auxAfter","beforePrimary","afterPrimary","after","restoredNode","primaryBefore","primaryAfter","meetsAuxInsertionThreshold","oldAuxPoint","isAuxiliary","removedNode","before","currentHead","notCircularNow","currentTail","RemovePointManualCommand","RemovePointCommand","PointTopologyManager","state","auxPoints","prevCoords","nextCoords","PointEvents","addedStep","geometryIndex","Layers","LAYERS_TO_RENDER","beneathLayerId","aboveLayerId","beneath","above","Sources","source","Tiles","MapTimelineAdapter","evt","DrawLibre","_DrawLibre","newStep"],"mappings":"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","file":"index.js","sourcesContent":["import type { LatLng } from \"#app/types\";\n\nexport class UIState {\n private _isHidden = true;\n private _anchor = { dx: 0, dy: 0 };\n private _pendingCoord: LatLng | null = null;\n private _rafId = 0;\n private _listenersActive = false;\n\n get isHidden() {\n return this._isHidden;\n }\n set isHidden(value: boolean) {\n this._isHidden = value;\n }\n\n get anchor() {\n return { ...this._anchor };\n }\n set anchor(value: { dx: number; dy: number }) {\n this._anchor = { ...value };\n }\n\n get pendingCoord() {\n return this._pendingCoord;\n }\n set pendingCoord(value: LatLng | null) {\n this._pendingCoord = value;\n }\n\n get rafId() {\n return this._rafId;\n }\n set rafId(id: number) {\n this._rafId = id;\n }\n\n get listenersActive() {\n return this._listenersActive;\n }\n set listenersActive(value: boolean) {\n this._listenersActive = value;\n }\n\n reset() {\n this._isHidden = true;\n this._anchor = { dx: 0, dy: 0 };\n this._pendingCoord = null;\n this._rafId = 0;\n this._listenersActive = false;\n }\n}\n","export class DOM {\n static create<K extends keyof HTMLElementTagNameMap>(\n tagName: K,\n className?: string,\n container?: HTMLElement,\n ): HTMLElementTagNameMap[K] {\n const element = window.document.createElement(tagName);\n if (className !== undefined) element.className = className;\n if (container) container.appendChild(element);\n return element;\n }\n\n static remove(node: HTMLElement) {\n if (node.parentNode) {\n node.parentNode.removeChild(node);\n }\n }\n\n static addEventListener(\n target: HTMLElement | Window | Document | undefined,\n type: string,\n callback: EventListenerOrEventListenerObject,\n options: {\n capture?: boolean;\n passive?: boolean;\n } = {},\n ) {\n if (!target) return;\n target.addEventListener(type, callback, options);\n }\n\n static removeEventListener(\n target: HTMLElement | Window | Document | undefined,\n type: string,\n callback: EventListenerOrEventListenerObject,\n options: {\n capture?: boolean;\n passive?: boolean;\n } = {},\n ) {\n if (!target) return;\n target.removeEventListener(type, callback, options);\n }\n\n static mouseButton(e: MouseEvent) {\n return e.button;\n }\n\n static addClassName(node: HTMLElement, className: string) {\n if (!node.classList.contains(className)) {\n node.classList.add(className);\n }\n }\n\n static removeClassName(node: HTMLElement, className: string) {\n if (node.classList.contains(className)) {\n node.classList.remove(className);\n }\n }\n\n static disableButton = (button: HTMLButtonElement | null) => {\n if (!button) return;\n button.setAttribute(\"disabled\", \"true\");\n button.setAttribute(\"aria-disabled\", \"true\");\n };\n\n static enableButton = (button: HTMLButtonElement | null) => {\n if (!button) return;\n button.removeAttribute(\"disabled\");\n button.removeAttribute(\"aria-disabled\");\n };\n}\n","import { DOM } from \"#app/dom\";\nimport type { ButtonType, PanelImpl } from \"#app/types\";\nimport { Context } from \".\";\n\nexport class View {\n private root: HTMLDivElement;\n private buttonContainer: HTMLDivElement;\n private buttons: Partial<Record<ButtonType, HTMLButtonElement>> = {};\n\n constructor(private readonly ctx: Pick<Context, \"map\" | \"options\">) {\n this.root = DOM.create(\"div\", \"mdl-dashboard-container\");\n this.buttonContainer = DOM.create(\"div\", \"mdl-dashboard\", this.root);\n\n this.renderButtons();\n ctx.map.getContainer().appendChild(this.root);\n }\n\n private createButton(type: ButtonType, title: string, size: PanelImpl[\"size\"], container: HTMLElement) {\n const button = DOM.create(\"button\", `mdl-panel-button mdl-panel-button-${size}`, container);\n button.setAttribute(\"data-type\", type);\n button.setAttribute(\"aria-label\", title);\n DOM.create(\"span\", `icon ${type} icon-${size}`, button);\n return button as HTMLButtonElement;\n }\n\n private renderButtons() {\n const { panel, locale } = this.ctx.options;\n const { buttons, size } = panel;\n\n (Object.keys(buttons) as ButtonType[]).forEach((type) => {\n if (!buttons[type].visible) return;\n\n const button = this.createButton(type, locale[type], size, this.buttonContainer);\n if (type === \"undo\" || type === \"redo\") {\n DOM.disableButton(button);\n }\n\n this.buttons[type] = button;\n });\n }\n\n public getButton = (type: ButtonType): HTMLButtonElement | null => {\n const button = this?.buttons?.[type];\n if (!button) {\n console.warn(`[PanelView] Button \"${type}\" not initialized`);\n }\n return button ?? null;\n };\n\n public getRoot = (): HTMLDivElement => {\n return this.root;\n };\n\n public show = () => {\n this.root.classList.remove(\"hidden\");\n };\n\n public hide = () => {\n this.root.classList.add(\"hidden\");\n };\n\n public setTransform = (x: number, y: number) => {\n this.root.style.transform = `translate(${x}px, ${y}px)`;\n };\n\n public observeResize = (callback: ResizeObserverCallback): ResizeObserver => {\n const observer = new ResizeObserver(callback);\n observer.observe(this.root);\n return observer;\n };\n\n public destroy = () => {\n this.root.remove();\n };\n}\n","import { HTMLEvent } from \"#app/types/helpers\";\nimport { DOM } from \"#app/dom\";\nimport \"./tooltip.css\";\n\ninterface CreateOptions {\n label: string;\n placement: \"left\" | \"bottom\";\n}\n\nconst BASE_Y_OFFSET_FROM_ELEMENT = 8;\nconst BASE_X_OFFSET_FROM_ELEMENT = 8;\n\ntype Position = {\n x: number;\n y: number;\n};\n\nexport class Tooltip {\n private container: HTMLElement | undefined;\n public label: HTMLElement | undefined;\n\n constructor() {\n this.container = undefined;\n }\n\n create = (options: CreateOptions) => {\n const container = DOM.create(\"div\", \"popup-container\", document.body);\n const span = DOM.create(\"span\", `popup-text popup-text-${options.placement}`, container);\n span.textContent = options.label;\n this.container = container;\n this.label = span;\n return this;\n };\n\n private activateAnimation = () => {\n const notActive = !this.label?.classList.value.includes(\"popup-text-active\");\n if (notActive) {\n this.label?.classList.add(\"popup-text-active\");\n }\n };\n\n private getLabelDimensions = () => {\n if (!this.label) return { width: 0, height: 0 };\n\n return {\n width: this.label.clientWidth,\n height: this.label.clientHeight,\n };\n };\n\n private getLeftPosition = (event: HTMLEvent<HTMLElement>): Position => {\n const { bottom, left } = event.target.getBoundingClientRect();\n const { width: labelWidth, height: labelHeight } = this.getLabelDimensions();\n\n return {\n x: left - BASE_X_OFFSET_FROM_ELEMENT - labelWidth,\n y: bottom - labelHeight - 2,\n };\n };\n\n private getBottomPosition = (event: HTMLEvent<HTMLElement>): Position => {\n const { bottom, left, right } = event.target.getBoundingClientRect();\n const { width: labelWidth } = this.getLabelDimensions();\n\n const elementCenterX = (right - left) / 2 + left;\n return {\n x: elementCenterX - labelWidth / 2,\n y: bottom + BASE_Y_OFFSET_FROM_ELEMENT,\n };\n };\n\n getPosition = (event: HTMLEvent<HTMLElement>, position: \"left\" | \"bottom\"): Position => {\n if (position === \"left\") {\n return this.getLeftPosition(event);\n }\n\n return this.getBottomPosition(event);\n };\n\n setPosition = (pos: Position) => {\n const { x, y } = pos;\n if (this.container) {\n this.container.style.left = `${x}px`;\n this.container.style.top = `${y}px`;\n }\n this.activateAnimation();\n };\n\n remove = () => {\n if (this.container) {\n DOM.remove(this.container);\n }\n };\n}\n","type Func<T> = (event: T) => any;\n\nexport type ChangeEvent<T> = {\n [K in keyof T]: {\n type: K;\n data?: T[K];\n };\n}[keyof T];\n\nexport class Observable<T> {\n observers: Set<Func<T>>;\n\n constructor() {\n this.observers = new Set<Func<T>>();\n }\n\n addObserver(observer: Func<T>) {\n this.observers.add(observer);\n }\n\n removeObserver(observer: Func<T>) {\n this.observers.delete(observer);\n }\n\n unsubscribe() {\n this.observers.clear();\n }\n\n notify(args: T) {\n this.observers.forEach((observer) => observer(args));\n }\n}\n","import { StoreChangeEventKeys } from \"#app/store/types\";\nimport { LiteralOrCustom } from \"#app/types/helpers\";\n\nexport interface Command {\n type: LiteralOrCustom<StoreChangeEventKeys>;\n payload?: any;\n execute: () => void;\n undo: () => void;\n}\n\nexport class CompoundCommand implements Command {\n constructor(\n public readonly type: LiteralOrCustom<StoreChangeEventKeys>,\n public readonly payload: any,\n private commands: Command[] = [],\n ) {}\n\n add(cmd: Command) {\n this.commands.push(cmd);\n }\n\n execute() {\n if (!this.commands) return;\n\n for (const cmd of this.commands) {\n cmd.execute();\n }\n }\n\n undo() {\n if (!this.commands) return;\n\n for (let i = this.commands.length - 1; i >= 0; i--) {\n const command = this.commands[i];\n command?.undo();\n }\n }\n}\n","import { Observable } from \"#app/observable\";\nimport { type Command, CompoundCommand } from \"./command\";\nimport type { TimelineChangeEvent } from \"./types\";\n\nexport class Timeline extends Observable<TimelineChangeEvent> {\n private transaction: CompoundCommand | null = null;\n private undoStack: Command[] = [];\n private redoStack: Command[] = [];\n\n private static instance: Timeline | null = null;\n\n static getInstance(): Timeline {\n if (!Timeline.instance) Timeline.instance = new Timeline();\n return Timeline.instance;\n }\n\n public commit = (cmd: Command) => {\n cmd.execute();\n if (this.transaction) {\n this.transaction.add(cmd);\n } else {\n this.undoStack.push(cmd);\n }\n\n this.redoStack.length = 0;\n this.pingConsumers();\n };\n\n public undo = () => {\n const cmd = this.undoStack.pop();\n if (!cmd) return;\n cmd.undo();\n this.redoStack.push(cmd);\n this.pingConsumers();\n return cmd;\n };\n\n public redo = () => {\n const cmd = this.redoStack.pop();\n if (!cmd) return null;\n cmd.execute();\n this.undoStack.push(cmd);\n this.pingConsumers();\n return cmd;\n };\n\n public beginTransaction = (type: string = \"compound\", payload: any = null) => {\n if (this.transaction) return;\n this.transaction = new CompoundCommand(type, payload);\n };\n\n public commitTransaction = () => {\n if (!this.transaction) return;\n const txn = this.transaction;\n this.transaction = null;\n\n this.undoStack.push(txn);\n this.pingConsumers();\n };\n\n public getRedoStackLength = () => {\n return this.redoStack.length;\n };\n\n public getUndoStackLength = () => {\n return this.undoStack.length;\n };\n\n public resetStacks = () => {\n this.undoStack = [];\n this.redoStack = [];\n this.notify({ type: \"REDO_STACK_CHANGED\", data: 0 });\n };\n\n pingConsumers = () => {\n this.notify({\n type: \"REDO_STACK_CHANGED\",\n data: this.redoStack.length,\n });\n\n this.notify({\n type: \"UNDO_STACK_CHANGED\",\n data: this.undoStack.length,\n });\n };\n}\n\nexport const timeline = Timeline.getInstance();\n","import type { AnyFunction } from \"#app/types/helpers\";\nimport type { Uuid } from \"#app/types/index\";\n\nexport const uuidv4 = (): Uuid => {\n if (\"crypto\" in window && \"randomUUID\" in window.crypto) {\n return window.crypto.randomUUID();\n }\n\n function getRandomHexChar() {\n const hexChars = \"0123456789abcdef\";\n return hexChars[Math.floor(Math.random() * 16)];\n }\n\n function getUuidSection(length: number) {\n let section = \"\";\n for (let i = 0; i < length; i++) {\n section += getRandomHexChar();\n }\n return section;\n }\n\n function getUuidSectionSize(idx: number) {\n const firstElement = idx === 0;\n const lastElement = idx === 4;\n\n if (firstElement) {\n return 8;\n }\n if (lastElement) {\n return 12;\n }\n\n return 4;\n }\n\n const parts = [];\n for (let i = 0; i < 5; i++) {\n parts.push(getUuidSection(getUuidSectionSize(i)));\n }\n\n return parts.join(\"-\") as Uuid;\n};\n\nexport const throttle = (fn: AnyFunction, delay: number) => {\n let lastArgs: any;\n let shouldCall = true;\n\n function execute() {\n if (shouldCall && lastArgs) {\n fn(...lastArgs);\n lastArgs = null;\n shouldCall = false;\n setTimeout(() => {\n shouldCall = true;\n execute();\n }, delay);\n }\n }\n\n return function (...args: any) {\n lastArgs = args;\n execute();\n };\n};\n\nexport const debounce = (fn: AnyFunction, delay: number) => {\n let timeout: number;\n\n return function (...args: any) {\n clearTimeout(timeout);\n timeout = window.setTimeout(() => {\n fn(...args);\n }, delay);\n };\n};\n","import type { RequiredDrawOptions } from \"#app/types/index\";\nimport type { AddLayerObject } from \"maplibre-gl\";\n\nexport const LINE_BASE = {\n type: \"FeatureCollection\",\n features: [\n {\n type: \"Feature\",\n properties: {},\n geometry: {\n type: \"LineString\",\n coordinates: [],\n },\n },\n ],\n};\n\nexport const ELAYERS = {\n LineDynamicLayer: \"mdl-line-dynamic-layer\",\n LineLayer: \"mdl-line-layer\",\n LineLayerTransparent: \"mdl-line-layer-transparent\",\n LineLayerBreak: \"mdl-line-break-layer\",\n PolygonLayer: \"mdl-polygon-layer\",\n PointsLayer: \"mdl-points-layer\",\n SinglePointLayer: \"mdl-single-point-layer\",\n FirstPointLayer: \"mdl-first-point-layer\",\n AuxiliaryPointLayer: \"mdl-auxiliary-point-layer\",\n} as const;\n\nexport const ESOURCES = {\n UnifiedSource: \"mdl-unified-source\",\n LineDynamicSource: \"mdl-line-dynamic-source\",\n LineSourceBreak: \"mdl-line-source-break\",\n SinglePointSource: \"mdl-single-point-source\",\n} as const;\n\nexport const FIRST_POINT_RADIUS = {\n large: 6.5,\n default: 5.5,\n};\n\nexport const FIRST_POINT_COLOR = {\n large: \"#FF6464\",\n default: \"#666666\",\n};\n\nexport const FIRST_POINT_PAINT_BASE = {\n \"circle-radius\": FIRST_POINT_RADIUS.default,\n \"circle-color\": \"#FEFFFE\",\n \"circle-stroke-color\": FIRST_POINT_COLOR.default,\n \"circle-stroke-width\": 3,\n};\n\nexport const AUXILIARY_POINT_PAINT_BASE = {\n \"circle-radius\": FIRST_POINT_RADIUS.default - 1.5,\n \"circle-color\": \"#FEFFFE\",\n \"circle-stroke-color\": \"#666666\",\n \"circle-stroke-width\": 2,\n};\n\nexport const ON_LINE_POINT_PAINT_BASE = {\n \"circle-radius\": FIRST_POINT_RADIUS.large,\n \"circle-color\": \"#FEFFFE\",\n \"circle-stroke-color\": \"#666666\",\n \"circle-stroke-width\": 3,\n};\n\nexport const POLYGON_PAINT_BASE = {\n \"fill-color\": \"grey\",\n \"fill-opacity\": 0.4,\n};\n\nexport const LINE_PAINT_BASE = {\n \"line-width\": 3,\n \"line-color\": \"grey\",\n \"line-opacity\": 0.7,\n};\n\nexport const POINTS_PAINT_BASE = {\n \"circle-radius\": FIRST_POINT_RADIUS.default,\n \"circle-color\": \"#FEFFFE\",\n \"circle-stroke-color\": \"#666666\",\n \"circle-stroke-width\": 3,\n};\n\nexport const BREAK_PAINT_BASE = {\n \"line-width\": 3,\n \"line-color\": \"#FF6464\",\n \"line-dasharray\": [3, 3],\n};\n\nexport const generateLayers = (options: RequiredDrawOptions) => {\n return [\n {\n id: ELAYERS.SinglePointLayer,\n source: ESOURCES.SinglePointSource,\n type: \"circle\",\n paint: options.layersPaint.onLinePoint,\n layout: {\n visibility: \"none\",\n },\n },\n {\n id: ELAYERS.PolygonLayer,\n source: ESOURCES.UnifiedSource,\n type: \"fill\",\n paint: options.layersPaint.polygon,\n layout: {\n visibility: \"none\",\n },\n filter: [\"==\", \"$type\", \"Polygon\"],\n },\n {\n id: ELAYERS.LineDynamicLayer,\n source: ESOURCES.LineDynamicSource,\n type: \"line\",\n paint: options.layersPaint.line,\n layout: {\n visibility: \"none\",\n },\n },\n {\n id: ELAYERS.LineLayer,\n source: ESOURCES.UnifiedSource,\n type: \"line\",\n paint: options.layersPaint.line,\n layout: {\n visibility: \"visible\",\n },\n filter: [\"==\", \"$type\", \"LineString\"],\n },\n {\n id: ELAYERS.LineLayerTransparent,\n source: ESOURCES.UnifiedSource,\n type: \"line\",\n paint: {\n \"line-width\": 4,\n \"line-color\": \"transparent\",\n },\n filter: [\"==\", \"$type\", \"LineString\"],\n },\n {\n id: ELAYERS.LineLayerBreak,\n source: ESOURCES.LineSourceBreak,\n type: \"line\",\n paint: options.layersPaint.breakLine,\n layout: {\n visibility: \"none\",\n },\n },\n {\n id: ELAYERS.PointsLayer,\n source: ESOURCES.UnifiedSource,\n type: \"circle\",\n paint: options.layersPaint.points,\n filter: [\"all\", [\"==\", \"$type\", \"Point\"], [\"==\", \"isFirst\", false], [\"==\", \"isAuxiliary\", false]],\n },\n {\n id: ELAYERS.FirstPointLayer,\n source: ESOURCES.UnifiedSource,\n type: \"circle\",\n paint: options.layersPaint.firstPoint,\n filter: [\"==\", [\"get\", \"isFirst\"], true],\n layout: {\n visibility: \"none\",\n },\n },\n {\n id: ELAYERS.AuxiliaryPointLayer,\n source: ESOURCES.UnifiedSource,\n type: \"circle\",\n paint: options.layersPaint.auxiliaryPoint,\n filter: [\"==\", [\"get\", \"isAuxiliary\"], true],\n },\n ] satisfies AddLayerObject[];\n};\n","import type { MapLayerMouseEvent } from \"maplibre-gl\";\nimport type { Step } from \"#app/types/index\";\n\nimport { ELAYERS } from \"#app/utils/geo_constants\";\nimport { uuidv4 } from \"#app/utils/helpers\";\n\nimport type { UnifiedMap } from \"#app/types/map\";\n\nexport const PointHelpers = {\n getMidpoint(p1: { lat: number; lng: number }, p2: { lat: number; lng: number }) {\n return {\n lat: (p1.lat + p2.lat) / 2,\n lng: (p1.lng + p2.lng) / 2,\n };\n },\n\n createAuxiliaryPoint(p1: Step, p2: Step) {\n const mid = PointHelpers.getMidpoint(p1, p2);\n const step = { lat: mid.lat, lng: mid.lng, isAuxiliary: true, id: uuidv4() };\n return step;\n },\n};\n\nexport const PointVisibility = {\n setFirstPointVisible(map: UnifiedMap) {\n map.setLayoutProperty(ELAYERS.FirstPointLayer, \"visibility\", \"visible\");\n },\n\n setFirstPointHidden(map: UnifiedMap) {\n map.setLayoutProperty(ELAYERS.FirstPointLayer, \"visibility\", \"none\");\n },\n\n setSinglePointVisible(event: MapLayerMouseEvent) {\n const map = event.target;\n map.setLayoutProperty(ELAYERS.SinglePointLayer, \"visibility\", \"visible\");\n },\n\n setSinglePointHidden(event: MapLayerMouseEvent) {\n const map = event.target;\n setTimeout(() => {\n map.setLayoutProperty(ELAYERS.SinglePointLayer, \"visibility\", \"none\");\n }, 33);\n },\n};\n\nexport const PointsFilter = {\n default(map: UnifiedMap) {\n map.setFilter(ELAYERS.PointsLayer, [\n \"all\",\n [\"==\", \"$type\", \"Point\"],\n [\"==\", \"isFirst\", false],\n [\"==\", \"isAuxiliary\", false],\n ]);\n },\n closedGeometry(map: UnifiedMap) {\n map.setFilter(ELAYERS.PointsLayer, [\"all\", [\"==\", \"$type\", \"Point\"], [\"==\", \"isAuxiliary\", false]]);\n },\n};\n","import type { RequiredDrawOptions } from \"#app/types\";\nimport type { ListNode, Store } from \".\";\n\nexport class Circular {\n constructor(\n private store: Store,\n private readonly options?: RequiredDrawOptions,\n ) {\n this.store = store;\n }\n public isCircular = (): boolean => {\n const { head, tail } = this.store;\n if (!head || !tail) return false;\n\n return head === tail.next && tail === head.prev;\n };\n\n public canBreak = (): boolean => {\n const { size } = this.store;\n\n const threshold = this.options?.pointGeneration === \"auto\" ? 3 : 2;\n return size <= threshold;\n };\n\n public canClose = (): boolean => {\n const { size } = this.store;\n\n const storeSize = this.options?.pointGeneration === \"auto\" ? size > 3 : size > 2;\n return storeSize && !this.isCircular();\n };\n\n // when we have 1 primary <--- 1 aux <--- 1 primary current will be an aux when 1 prim <--- 1 aux and a primary 1 aux <--- 1 prim\n // [aux] [primary]\n public break = (current: ListNode) => {\n if (!this.store.head) return;\n\n if (this.options?.pointGeneration === \"auto\") {\n // if the current node is an aux, then we need to make one step back for the tail and the head is the next node from the aux point\n if (current.val?.isAuxiliary) {\n const auxId = current.val?.id as string;\n this.store.head = current.next as ListNode;\n this.store.tail = current.prev as ListNode;\n this.store.removeNodeById(auxId);\n this.store.head.prev = null;\n this.store.tail.next = null;\n } else {\n const auxId = current.next?.val?.id as string;\n // else the tail is the current node and for the head we need to jump over the aux point so the next.next\n this.store.head = current.next?.next as ListNode;\n this.store.tail = current;\n this.store.removeNodeById(auxId);\n this.store.head.prev = null;\n this.store.tail.next = null;\n }\n } else {\n // no aux here, so the tail is the current node and the head is the next node\n this.store.head = current.next as ListNode;\n this.store.head.prev = null;\n this.store.tail = current;\n this.store.tail.next = null;\n }\n };\n\n public close = () => {\n const { head, tail } = this.store;\n if (!head || !tail) return;\n\n tail.next = head;\n head.prev = tail;\n };\n}\n","import type { RequiredDrawOptions, Step, StepId } from \"#app/types/index\";\nimport { Observable } from \"#app/observable\";\n\nimport { StoreChangeEvent } from \"./types\";\nimport { Circular } from \"./circular\";\nimport { initStore } from \"./init\";\n\nexport class ListNode {\n val: Step | null;\n prev: ListNode | null;\n next: ListNode | null;\n constructor(val: Step | null = null, next: ListNode | null = null, prev: ListNode | null = null) {\n this.val = val;\n this.prev = prev;\n this.next = next;\n }\n}\n\nexport class Store extends Observable<StoreChangeEvent> {\n head: ListNode | null;\n tail: ListNode | null;\n size: number;\n map: Map<StepId, ListNode>;\n public readonly circular: Circular;\n\n constructor(private readonly options?: RequiredDrawOptions) {\n super();\n let list = initStore(this.options);\n this.circular = new Circular(this, this.options);\n this.map = list ? list.map : new Map<StepId, ListNode>();\n this.head = list ? list.head : null;\n this.tail = list ? list.tail : null;\n this.size = list ? list.size : 0;\n }\n\n push = (step: Step) => {\n const newNode = new ListNode(step);\n if (!this.head) {\n this.head = this.tail = newNode;\n } else if (this.tail) {\n newNode.prev = this.tail;\n this.tail.next = newNode;\n this.tail = newNode;\n }\n\n this.map.set(step.id, newNode);\n this.size++;\n this.pingConsumers();\n return newNode;\n };\n\n public unshift = (step: Step) => {\n const newNode = new ListNode(step);\n\n newNode.next = this.head;\n this.head = newNode;\n\n if (this.circular.isCircular() && this.tail) {\n this.tail.next = newNode;\n newNode.prev = this.tail;\n }\n\n this.map.set(step.id, newNode);\n this.size++;\n this.pingConsumers();\n };\n\n public insertAfter = (node: ListNode, stepToInsert: Step) => {\n if (!node) return null;\n\n const newNode = new ListNode(stepToInsert);\n newNode.prev = node;\n newNode.next = node.next;\n\n const betweenHeadAndTail = this.tail === node && this.head === node.next;\n if (betweenHeadAndTail) {\n this.tail = newNode;\n this.head!.prev = newNode;\n }\n\n if (node.next) {\n node.next.prev = newNode;\n }\n\n node.next = newNode;\n this.map.set(stepToInsert.id, newNode);\n this.size++;\n this.pingConsumers();\n return newNode;\n };\n\n public removeNodeById(id: StepId): ListNode | null {\n const node = this.map.get(id);\n if (!node) return null;\n\n if (this.size === 1) {\n this.head = null;\n this.tail = null;\n } else {\n if (node.prev) {\n node.prev.next = node.next;\n }\n\n if (node.next) {\n node.next.prev = node.prev;\n }\n\n if (node === this.head) {\n this.head = node.next;\n if (this.head?.prev && this.tail) this.tail.next = this.head;\n }\n\n if (node === this.tail) {\n this.tail = node.prev;\n if (this.head && this.tail?.next) this.head.prev = this.tail;\n }\n }\n\n this.map.delete(id);\n this.size--;\n this.pingConsumers();\n\n return node;\n }\n\n public findStepById(id: StepId): ListNode[\"val\"] | null {\n const node = this.map.get(id);\n return node ? node.val : null;\n }\n\n public findNodeById(id: StepId): ListNode | null {\n const node = this.map.get(id);\n return node ? node : null;\n }\n\n public isLastPoint = (options: RequiredDrawOptions, id: StepId): boolean => {\n if (options.pointGeneration === \"auto\" && this.tail?.next === this.head) {\n return this.tail?.prev?.val?.id === id;\n }\n return this.tail?.val?.id === id;\n };\n\n public reset = () => {\n this.head = null;\n this.tail = null;\n this.size = 0;\n this.map.clear();\n this.notify({\n type: \"STORE_CLEARED\",\n });\n };\n\n public pingConsumers = () => {\n this.notify({\n type: \"STORE_MUTATED\",\n data: {\n head: this.head,\n tail: this.tail,\n size: this.size,\n },\n });\n };\n}\n","import { uuidv4 } from \"#app/utils/helpers\";\nimport type { Initial, LatLng, RequiredDrawOptions, Step } from \"#app/types/index\";\nimport { PointHelpers } from \"#components/map/points/helpers\";\n\nimport { ListNode, Store } from \".\";\n\nexport const ERRORS = {\n EMPTY_INITIAL_STATE:\n \"You passed an empty initial array in the options. Please either remove the 'initial' property or include at least one element in the array.\",\n MISSING_IDS:\n \"You set 'generateId' to false but did not provide IDs for all steps. Please ensure all steps have IDs or set 'generateId' to true.\",\n NOT_ENOUGH_POINTS_TO_CLOSE:\n \"At least three points are required to close a polygon or a line. Please add more points or set 'closeGeometry' to false.\",\n FIRST_LAST_POINT_NOT_EQUAL:\n \"The first and last points of a polygon or a closed linestring must be the same. Please ensure the first and last points are equal or set 'closeGeometry' to false.\",\n};\n\nfunction buildStepSequence(\n initialSteps: Step[],\n closeGeometry: Initial[\"closeGeometry\"],\n pointGeneration: RequiredDrawOptions[\"pointGeneration\"],\n): Store {\n const store = new Store();\n const steps = closeGeometry ? initialSteps.slice(0, -1) : initialSteps;\n\n steps.forEach((step, idx) => {\n store.push(step);\n\n // if we are at the end of the array and there's no next point\n // we need to create an auxiliary point with the first point\n // to close the geometry\n if (pointGeneration === \"auto\") {\n const isNextPointAvailable = steps[idx + 1];\n if (isNextPointAvailable) {\n const auxPoint = PointHelpers.createAuxiliaryPoint(step, steps[idx + 1] as Step);\n store.push(auxPoint);\n } else if (closeGeometry) {\n const auxPoint = PointHelpers.createAuxiliaryPoint(step, steps[0] as Step);\n store.push(auxPoint);\n }\n }\n });\n\n return store;\n}\n\nfunction generateIdForSteps(stepsWithoutIds: LatLng[]): Step[] {\n return stepsWithoutIds.map((step, idx) => {\n return { ...step, isAuxiliary: false, isFirst: idx === 0, id: uuidv4() };\n });\n}\n\nfunction fromArray(initialOptions: Initial, pointGeneration: RequiredDrawOptions[\"pointGeneration\"]): Store | null {\n const { steps: initialSteps, closeGeometry, generateId } = initialOptions;\n const steps = generateId ? generateIdForSteps(initialSteps) : initialSteps;\n const list = buildStepSequence(steps as Step[], closeGeometry, pointGeneration);\n\n if (closeGeometry && list.tail && list.head) {\n list.tail.next = list.head;\n list.head.prev = list.tail;\n }\n return list;\n}\n\nexport function initStore(options?: RequiredDrawOptions): Store | null {\n if (!options?.initial) return null;\n\n const emptyInitialOptions = options && options.initial && !options.initial.steps.length;\n if (emptyInitialOptions) {\n throw new Error(ERRORS[\"EMPTY_INITIAL_STATE\"]);\n }\n\n const initialOptionsProvided = options && options.initial.steps;\n if (initialOptionsProvided) {\n return fromArray(options.initial, options.pointGeneration);\n }\n\n return null;\n}\n\nexport function linkedListToArray(head: ListNode | null): Step[] {\n if (!head) return [];\n\n const visitedNodes = new Set<ListNode>();\n const result: Step[] = [];\n\n let current: ListNode | null = head;\n while (current !== null) {\n if (visitedNodes.has(current)) break;\n\n visitedNodes.add(current);\n result.push(current.val as Step);\n current = current.next;\n }\n\n return result;\n}\n","export const EVENTS = {\n RIGHTCLICKREMOVE: \"mdl:rightclickremove\",\n POINTENTER: \"mdl:pointenter\",\n POINT_LEAVE: \"mdl:pointleave\",\n MOVE_END: \"mdl:moveend\",\n ADD: \"mdl:add\",\n UNDO: \"mdl:undo\",\n REDO: \"mdl:redo\",\n REMOVE_ALL: \"mdl:removeall\",\n SAVE: \"mdl:save\",\n BREAK: \"mdl:break\",\n MODE_CHANGED: \"mdl:modechanged\",\n UNDO_STACK_CHANGED: \"mdl:undostackchanged\",\n REDO_STACK_CHANGED: \"mdl:redostackchanged\",\n} as const;\n\nexport const MOBILE_WIDTH = 768; // TODO put this inside options for the user to change\n","import type { UnifiedMap } from \"#app/types/map\";\nimport type { LatLng, StepId, Step } from \"#app/types/index\";\nimport { EVENTS } from \"#app/utils/constants\";\nimport type { DrawingMode } from \"./mode\";\nimport type { Mode } from \"./mode/types\";\nimport { TilesContext } from \"./tiles\";\n\nexport class FireEvents {\n static addPoint(step: Step & { total: number }, map: UnifiedMap, mode: DrawingMode) {\n map.fire(EVENTS.ADD, {\n id: step.id,\n coordinates: {\n lat: step.lat,\n lng: step.lng,\n },\n total: step.total,\n timestamp: Date.now(),\n mode: {\n geometry: mode.getMode(),\n closedGeometry: mode.getClosedGeometry(),\n },\n });\n }\n static movePoint(step: { end: LatLng; id: StepId; start: LatLng; total: number }, map: UnifiedMap) {\n map.fire(EVENTS.MOVE_END, {\n id: step.id,\n start_coordinates: {\n lat: step.start.lat,\n lng: step.start.lng,\n },\n end_coordinates: {\n lat: step.end.lat,\n lng: step.end.lng,\n },\n total: step.total,\n timestamp: Date.now(),\n });\n }\n static pointRemoveRightClick(step: Step & { total: number }, map: UnifiedMap) {\n map.fire(EVENTS.RIGHTCLICKREMOVE, {\n id: step.id,\n coordinates: {\n lat: step.lat,\n lng: step.lng,\n },\n total: step.total,\n timestamp: Date.now(),\n });\n }\n static enterPoint(step: Step & { total: number }, map: UnifiedMap) {\n map.fire(EVENTS.POINTENTER, {\n id: step.id,\n coordinates: {\n lat: step.lat,\n lng: step.lng,\n },\n total: step.total,\n timestamp: Date.now(),\n });\n }\n static leavePoint(step: Step & { total: number }, map: UnifiedMap) {\n map.fire(EVENTS.POINT_LEAVE, {\n id: step.id,\n coordinates: {\n lat: step.lat,\n lng: step.lng,\n },\n total: step.total,\n timestamp: Date.now(),\n });\n }\n static undo(step: Step & { total: number }, map: UnifiedMap, originalEvent?: Event) {\n map.fire(EVENTS.UNDO, {\n originalEvent,\n id: step.id,\n coordinates: {\n lat: step.lat,\n lng: step.lng,\n },\n total: step.total,\n timestamp: Date.now(),\n });\n }\n\n static redo(step: Step & { total: number }, map: UnifiedMap, originalEvent?: Event) {\n map.fire(EVENTS.REDO, {\n originalEvent,\n id: step.id,\n coordinates: {\n lat: step.lat,\n lng: step.lng,\n },\n total: step.total,\n timestamp: Date.now(),\n });\n }\n\n static modeChanged(map: UnifiedMap, mode: Mode | \"break\") {\n map.fire(EVENTS.MODE_CHANGED, {\n mode,\n });\n }\n static removeAllPoints(map: UnifiedMap, originalEvent: Event) {\n map.fire(EVENTS.REMOVE_ALL, { originalEvent });\n }\n static onSaveClick(context: Pick<TilesContext, \"map\" | \"mode\">, steps: Step[], originalEvent: Event) {\n const { map, mode } = context;\n\n map.fire(EVENTS.SAVE, {\n originalEvent,\n timestamp: Date.now(),\n steps,\n mode: {\n geometry: mode.getMode(),\n closedGeometry: mode.getClosedGeometry(),\n },\n });\n }\n static onLineBreak(map: UnifiedMap) {\n map.fire(EVENTS.BREAK);\n }\n\n static onUndoStackChange = (map: UnifiedMap, length?: number) => {\n map.fire(EVENTS.UNDO_STACK_CHANGED, { length });\n };\n\n static onRedoStackChange = (map: UnifiedMap, length?: number) => {\n map.fire(EVENTS.REDO_STACK_CHANGED, { length });\n };\n}\n","import { Store } from \"#app/store\";\n\nfunction collectGeometryCoordinates(store: Store): number[][] {\n const coordinates = [];\n let current = store.head;\n const visitedNodes = new Set();\n\n while (current !== null) {\n if (visitedNodes.has(current.val?.id)) {\n if (store.head && store.head.val) {\n coordinates.push([store.head.val.lng, store.head.val.lat]);\n }\n break;\n }\n visitedNodes.add(current.val?.id);\n\n if (current.val) {\n coordinates.push([current.val.lng, current.val.lat]);\n }\n current = current.next;\n }\n\n return coordinates;\n}\n\nexport function getLine(current: [number, number], next: [number, number]) {\n return {\n type: \"FeatureCollection\",\n features: [\n {\n type: \"Feature\",\n properties: {},\n geometry: {\n type: \"LineString\",\n coordinates: [current, next],\n },\n },\n ],\n };\n}\n\nfunction getAllLines(coordinates: number[][]) {\n return {\n type: \"FeatureCollection\",\n features: [\n {\n type: \"Feature\",\n properties: {},\n geometry: {\n type: \"LineString\",\n coordinates: coordinates,\n },\n },\n ],\n };\n}\n\nfunction getPolygon(coordinates: number[][]) {\n return {\n type: \"FeatureCollection\",\n features: [\n {\n type: \"Feature\",\n properties: {},\n geometry: {\n type: \"Polygon\",\n coordinates: [coordinates],\n },\n },\n ],\n };\n}\n\nfunction getPoints(store: Store) {\n let current = store.head;\n const pointFeatures = [];\n const visitedNodes = new Set();\n\n while (current !== null) {\n if (visitedNodes.has(current.val?.id)) {\n break;\n }\n if (current.val) {\n const val = current.val;\n const head = current.val.id === store.head?.val?.id;\n pointFeatures.push({\n type: \"Feature\",\n properties: { id: val.id, lat: val.lat, lng: val.lng, isFirst: head, isAuxiliary: val.isAuxiliary },\n geometry: {\n type: \"Point\",\n coordinates: [val.lng, val.lat],\n },\n });\n }\n visitedNodes.add(current.val?.id);\n current = current.next;\n }\n\n return {\n type: \"FeatureCollection\",\n features: pointFeatures,\n };\n}\n\n// CAUTION: render is dependent on this function\nexport function getUnifiedFeatures(\n store: Store,\n): GeoJSON.FeatureCollection<GeoJSON.LineString | GeoJSON.Polygon | GeoJSON.Point> {\n const points = getPoints(store).features;\n const coordinates = collectGeometryCoordinates(store);\n\n const lines = getAllLines(coordinates).features;\n const polygons = getPolygon(coordinates).features;\n\n return {\n type: \"FeatureCollection\",\n features: [...points, ...lines, ...polygons],\n } as GeoJSON.FeatureCollection<GeoJSON.LineString | GeoJSON.Polygon | GeoJSON.Point>;\n}\n","import type { GeoJSONSource } from \"maplibre-gl\";\n\nimport type { LatLng, RequiredDrawOptions } from \"#app/types/index\";\nimport type { UnifiedMap } from \"#app/types/map\";\nimport type { Store } from \"#app/store/index\";\nimport type { DrawingMode } from \"#components/map/mode\";\nimport { ESOURCES } from \"#app/utils/geo_constants\";\nimport { getUnifiedFeatures } from \"./geojson-builder\";\n\ninterface Context {\n map: UnifiedMap;\n store: Store;\n options: RequiredDrawOptions;\n mode: DrawingMode;\n}\n\nexport class Renderer {\n private static instance: Renderer | null = null;\n private ctx: Context | null = null;\n private unifiedGeoJSON: GeoJSON.FeatureCollection<GeoJSON.LineString | GeoJSON.Polygon | GeoJSON.Point>;\n\n constructor() {\n this.unifiedGeoJSON = {\n type: \"FeatureCollection\",\n features: [],\n };\n }\n\n public initialize(ctx: Context): Renderer | null {\n this.ctx = ctx;\n this.unifiedGeoJSON = getUnifiedFeatures(this.ctx.store);\n this.execute();\n\n return Renderer.instance;\n }\n\n public static getInstance(): Renderer {\n if (!Renderer.instance) {\n Renderer.instance = new Renderer();\n }\n return Renderer.instance;\n }\n\n private getContext(): Context {\n if (!this.ctx) {\n throw new Error(\"Somehow trolled with Renderer.getContext, check the Renderer.initialize\");\n }\n return this.ctx;\n }\n\n private updateLine(featureIdx: number, newCoord: LatLng) {\n const { mode } = this.getContext();\n\n // -2 because line is always the second to last feature. Check getUnifiedFeatures\n const line = this.unifiedGeoJSON.features.at(-2)?.geometry.coordinates;\n if (!line) return;\n line[featureIdx] = [newCoord.lng, newCoord.lat];\n\n if (mode.getClosedGeometry() && featureIdx === 0) {\n line[line.length - 1] = [newCoord.lng, newCoord.lat];\n }\n }\n\n private updatePolygon(featureIdx: number, newCoord: LatLng) {\n const { mode } = this.getContext();\n\n // -1 because polygon is always the last feature. Check getUnifiedFeatures\n const polygon = this.unifiedGeoJSON.features.at(-1)?.geometry.coordinates[0] as number[][];\n\n if (!polygon) return;\n polygon[featureIdx] = [newCoord.lng, newCoord.lat];\n\n if (mode.getClosedGeometry() && featureIdx === 0) {\n polygon[polygon.length - 1] = [newCoord.lng, newCoord.lat];\n }\n }\n\n private updatePoint(featureIdx: number, newCoord: LatLng) {\n // points are always the first feature. Check getUnifiedFeatures\n const feature = this.unifiedGeoJSON?.features?.[featureIdx];\n if (feature?.geometry?.coordinates) {\n feature.geometry.coordinates = [newCoord.lng, newCoord.lat];\n }\n }\n\n public executeOnMouseMove = (\n featureIdx: number,\n newCoord: LatLng,\n aux: { next: LatLng | null; prev: LatLng | null } | null,\n ) => {\n const { map, mode, options, store } = this.getContext();\n\n const prevIdx = featureIdx === 0 ? store.size - 1 : featureIdx - 1;\n\n this.updatePoint(featureIdx, newCoord);\n if (aux && aux.prev) {\n this.updatePoint(prevIdx, aux.prev);\n }\n if (aux && aux.next) {\n this.updatePoint(featureIdx + 1, aux.next);\n }\n\n this.updateLine(featureIdx, newCoord);\n if (aux && aux.prev) {\n this.updateLine(prevIdx, aux.prev);\n }\n if (aux && aux.next) {\n this.updateLine(featureIdx + 1, aux.next);\n }\n\n const polygonOptionChecked = options.modes.polygon.visible;\n\n if (polygonOptionChecked && mode.isPolygon()) {\n this.updatePolygon(featureIdx, newCoord);\n if (aux && aux.prev) {\n this.updatePolygon(prevIdx, aux.prev);\n }\n if (aux && aux.next) {\n this.updatePolygon(featureIdx + 1, aux.next);\n }\n }\n\n const unifiedSource = map.getSource(ESOURCES.UnifiedSource) as GeoJSONSource;\n if (unifiedSource) {\n unifiedSource.setData(this.unifiedGeoJSON);\n }\n };\n\n public execute() {\n const { map, store } = this.getContext();\n\n this.unifiedGeoJSON = getUnifiedFeatures(store);\n const unifiedSource = map.getSource(ESOURCES.UnifiedSource) as GeoJSONSource;\n\n if (unifiedSource) {\n unifiedSource.setData(this.unifiedGeoJSON);\n }\n }\n\n public resetGeometries = () => {\n const { map } = this.getContext();\n\n const unifiedSource = map.getSource(ESOURCES.UnifiedSource) as GeoJSONSource;\n if (unifiedSource) {\n unifiedSource.setData({\n type: \"FeatureCollection\",\n features: [],\n });\n }\n };\n}\n\nexport const renderer = Renderer.getInstance();\n","import { timeline } from \"#app/history\";\nimport { linkedListToArray } from \"#app/store/init\";\nimport { Step } from \"#app/types\";\nimport { FireEvents } from \"#components/map/fire-events\";\nimport { renderer } from \"#components/map/renderer\";\nimport { Context } from \".\";\nimport { View } from \"./view\";\n\nexport class Actions {\n constructor(private readonly ctx: Context & { view: View }) {}\n\n public clear = (event?: Event) => {\n const { mode, view, store, map } = this.ctx;\n store.reset();\n view.hide();\n mode.reset();\n timeline.resetStacks();\n renderer.resetGeometries();\n if (event) {\n FireEvents.removeAllPoints(map, event);\n }\n renderer.execute();\n };\n\n public undo = (event?: Event) => {\n const { store, map, view } = this.ctx;\n const hasSomethingToRedo = timeline.getRedoStackLength();\n\n // hasSomethingToRedo prevents from resetting the store when we still have something to redo and are trying to remove the last point by undoing\n if (store.size === 1 && hasSomethingToRedo) {\n store.reset();\n view.hide();\n } else {\n timeline.undo();\n }\n if (event) {\n FireEvents.undo({ ...(store.tail?.val as Step), total: store.size }, map, event);\n }\n renderer.execute();\n };\n\n public redo = (event?: Event) => {\n const { store, map } = this.ctx;\n\n timeline.redo();\n if (event) {\n FireEvents.redo({ ...(store.tail?.val as Step), total: store.size }, map, event);\n }\n renderer.execute();\n };\n\n public save = (event?: Event) => {\n const { store, options } = this.ctx;\n\n if (event) {\n FireEvents.onSaveClick(this.ctx, linkedListToArray(store.head), event);\n }\n if (options.panel.buttons.save.clearOnSave) {\n this.clear(event);\n }\n renderer.execute();\n };\n}\n","import type { ButtonType } from \"#app/types/index\";\nimport type { HTMLEvent } from \"#app/types/helpers\";\nimport { DOM } from \"#app/dom\";\nimport { Tooltip } from \"#components/tooltip\";\nimport { View } from \"./view\";\nimport { Context } from \".\";\nimport { Actions } from \"./actions\";\n\nexport class Events {\n private tooltip: Tooltip;\n private actions: Actions | null = null;\n\n constructor(private readonly ctx: Context & { view: View }) {\n this.tooltip = new Tooltip();\n this.actions = new Actions(this.ctx);\n }\n\n private addButtonListeners(type: ButtonType, handler: (e: Event) => void): void {\n const btn = this.ctx.view.getButton(type);\n if (!btn) return;\n DOM.addEventListener(btn, \"click\", handler);\n DOM.addEventListener(btn, \"mouseenter\", this.onMouseEnter);\n DOM.addEventListener(btn, \"mouseleave\", this.onMouseLeave);\n }\n\n private removeButtonListeners(type: ButtonType, onClick: (e: Event) => void): void {\n const btn = this.ctx.view.getButton(type);\n if (!btn) return;\n DOM.removeEventListener(btn, \"click\", onClick);\n DOM.removeEventListener(btn, \"mouseenter\", this.onMouseEnter);\n DOM.removeEventListener(btn, \"mouseleave\", this.onMouseLeave);\n }\n\n public initEvents(): void {\n this.addButtonListeners(\"undo\", this.onUndoClick);\n this.addButtonListeners(\"redo\", this.onRedoClick);\n this.addButtonListeners(\"delete\", this.onClearClick);\n this.addButtonListeners(\"save\", this.onSaveClick);\n }\n\n public removeEvents(): void {\n this.removeButtonListeners(\"undo\", this.onUndoClick);\n this.removeButtonListeners(\"redo\", this.onRedoClick);\n this.removeButtonListeners(\"delete\", this.onClearClick);\n this.removeButtonListeners(\"save\", this.onSaveClick);\n }\n\n private getButtonLabel = (type: ButtonType) => {\n const { options } = this.ctx;\n\n const LABELS: Record<ButtonType, string> = {\n undo: options.locale.undo,\n redo: options.locale.redo,\n delete: options.locale.delete,\n save: options.locale.save,\n };\n\n return LABELS[type];\n };\n\n private onMouseEnter = (event: Event) => {\n const target = event.target as HTMLElement;\n const type = target.getAttribute(\"data-type\") as ButtonType;\n if (type) {\n const label = this.getButtonLabel(type);\n\n this.tooltip\n .create({\n label,\n placement: \"bottom\",\n })\n .setPosition(this.tooltip.getPosition(event as HTMLEvent<HTMLElement>, \"bottom\"));\n }\n };\n\n private onMouseLeave = () => {\n this.tooltip.remove();\n };\n\n private onUndoClick = (e: Event): void => {\n this.actions?.undo(e);\n this.tooltip.remove();\n };\n\n private onRedoClick = (e: Event): void => {\n this.actions?.redo(e);\n this.tooltip.remove();\n };\n\n private onClearClick = (e: Event): void => {\n this.actions?.clear(e);\n this.tooltip.remove();\n };\n\n private onSaveClick = (e: Event): void => {\n this.actions?.save(e);\n this.tooltip.remove();\n };\n\n public api() {\n return this.actions;\n }\n}\n","import type { LatLng } from \"#app/types/index\";\nimport type { StoreChangeEvent } from \"#app/store/types\";\nimport type { DrawingModeChangeEvent } from \"#components/map/mode/types\";\nimport { DOM } from \"#app/dom\";\nimport { timeline } from \"#app/history\";\nimport { TimelineChangeEvent } from \"#app/history/types\";\nimport { Context } from \".\";\nimport { View } from \"./view\";\n\nexport class Observer {\n constructor(private readonly ctx: Context & { view: View; setPanelLocation: (coordinates: LatLng) => void }) {}\n\n public initConsumers() {\n this.ctx.store.addObserver(this.onStoreChangeConsumer);\n this.ctx.mode?.addObserver(this.onMapModeConsumer);\n timeline.addObserver(this.onTimelineChangeConsumer);\n }\n\n public removeConsumers() {\n this.ctx.store.removeObserver(this.onStoreChangeConsumer);\n this.ctx.mode?.removeObserver(this.onMapModeConsumer);\n timeline.removeObserver(this.onTimelineChangeConsumer);\n }\n\n private onTimelineChangeConsumer = (event: TimelineChangeEvent) => {\n const { type, data } = event;\n if (type === \"REDO_STACK_CHANGED\") {\n if (!data) {\n DOM.disableButton(this.ctx.view.getButton(\"redo\"));\n } else {\n DOM.enableButton(this.ctx.view.getButton(\"redo\"));\n }\n }\n\n if (type === \"UNDO_STACK_CHANGED\") {\n if (!data) {\n DOM.disableButton(this.ctx.view.getButton(\"undo\"));\n } else {\n DOM.enableButton(this.ctx.view.getButton(\"undo\"));\n }\n }\n };\n\n private onStoreChangeConsumer = (event: StoreChangeEvent) => {\n if (event.type === \"STORE_MUTATED\") {\n const { data } = event;\n if (data?.size === 0) {\n this.ctx.view.hide();\n } else {\n let current = Object.assign({}, data);\n\n // TODO why the hell do we need a loop here? We don't like loops\n while (current.tail) {\n if (current.tail?.val?.isAuxiliary) {\n current.tail = current.tail?.prev;\n } else {\n if (current.tail?.val) {\n this.ctx.setPanelLocation({\n lat: current.tail.val.lat,\n lng: current.tail.val.lng,\n });\n }\n break;\n }\n }\n }\n }\n };\n\n private onMapModeConsumer = (event: DrawingModeChangeEvent) => {\n const { store } = this.ctx;\n const { type, data } = event;\n if (type === \"MODE_CHANGED\" && !data) {\n this.ctx.view.hide();\n }\n if (type === \"MODE_CHANGED\" && data) {\n if (store.tail?.val) {\n this.ctx.setPanelLocation({\n lat: store.tail?.val?.lat,\n lng: store.tail?.val?.lng,\n });\n }\n }\n };\n}\n","import type { UnifiedMap } from \"#app/types/map\";\nimport type { LatLng, RequiredDrawOptions } from \"#app/types/index\";\nimport type { Store } from \"#app/store/index\";\nimport type { DrawingMode } from \"#components/map/mode\";\nimport { UIState } from \"./state\";\nimport { View } from \"./view\";\nimport { Events } from \"./events\";\nimport \"./panel.css\";\nimport { Observer } from \"./observer\";\n\nexport interface Context {\n map: UnifiedMap;\n mode: DrawingMode;\n options: RequiredDrawOptions;\n store: Store;\n}\n\nconst OFFSET_Y = 20;\n\nexport class Panel {\n private readonly view: View;\n private readonly state = new UIState();\n private readonly events: Events;\n private readonly observer: Observer;\n private resizeObserver!: ResizeObserver;\n\n private readonly onMapMove = () => this.schedulePositionUpdate();\n\n constructor(private readonly ctx: Context) {\n this.view = new View(ctx);\n this.events = new Events({\n ...ctx,\n view: this.view,\n });\n this.observer = new Observer({\n ...ctx,\n view: this.view,\n setPanelLocation: this.setPanelLocation,\n });\n\n this.init();\n }\n\n private init() {\n const { store } = this.ctx;\n this.resizeObserver = this.view.observeResize(this.measureAnchor);\n this.measureAnchor();\n if (store.tail?.val) this.setPanelLocation(store.tail.val);\n this.events.initEvents();\n this.observer.initConsumers();\n }\n\n public destroy() {\n this.observer.removeConsumers();\n this.events.removeEvents();\n if (this.state.listenersActive) {\n this.disableListeners();\n }\n this.resizeObserver.disconnect();\n cancelAnimationFrame(this.state.rafId);\n this.view.destroy();\n }\n\n private enableListeners() {\n if (this.state.listenersActive) return;\n const map = this.ctx.map;\n map.on(\"move\", this.onMapMove);\n map.on(\"zoom\", this.onMapMove);\n this.state.listenersActive = true;\n }\n\n private disableListeners() {\n if (!this.state.listenersActive) return;\n const map = this.ctx.map;\n map.off(\"move\", this.onMapMove);\n map.off(\"zoom\", this.onMapMove);\n this.state.listenersActive = false;\n }\n\n public setPanelLocation = (coordinates: LatLng) => {\n this.state.pendingCoord = coordinates;\n this.enableListeners();\n this.schedulePositionUpdate();\n this.show();\n };\n\n private measureAnchor = () => {\n const { width, height } = this.view.getRoot().getBoundingClientRect();\n this.state.anchor = { dx: -width / 2, dy: -height - OFFSET_Y };\n this.schedulePositionUpdate();\n };\n\n private schedulePositionUpdate = () => {\n if (this.state.rafId) return;\n this.state.rafId = requestAnimationFrame(() => {\n this.state.rafId = 0;\n if (this.state.pendingCoord) {\n const point = this.ctx.map.project(this.state.pendingCoord);\n const { dx, dy } = this.state.anchor;\n this.view.setTransform(point.x + dx, point.y + dy);\n }\n });\n };\n\n private setVisible(visible: boolean) {\n this.state.isHidden = !visible;\n if (visible) this.view.show();\n else this.view.hide();\n }\n\n public show = () => this.setVisible(true);\n public hide = () => this.setVisible(false);\n public api = () => this.events.api();\n}\n","export const CURSORS = {\n AUTO: \"auto\",\n DEFAULT: \"default\",\n POINTER: \"pointer\",\n CROSSHAIR: \"crosshair\",\n MOVE: \"move\",\n HELP: \"help\",\n GRAB: \"grab\",\n GRABBING: \"grabbing\",\n} as const;\n\nexport type TCursor = (typeof CURSORS)[keyof typeof CURSORS];\n","import { ControlType, RequiredDrawOptions } from \"#app/types/index\";\n\nexport const getButtonLabel = (type: ControlType, options: RequiredDrawOptions) => {\n const lineTitle = options.locale.line;\n const polygonTitle = options.locale.polygon;\n const breakTitle = options.locale.break;\n\n const LABELS = {\n line: lineTitle,\n polygon: polygonTitle,\n break: breakTitle,\n };\n\n return LABELS[type];\n};\n","import type { ControlType } from \"#app/types/index\";\nimport type { HTMLEvent } from \"#app/types/helpers\";\nimport { Tooltip } from \"#components/tooltip\";\nimport { CURSORS } from \"#components/cursor/constants\";\nimport { DOM } from \"#app/dom\";\n\nimport { getButtonLabel } from \"./helpers\";\nimport type { Context } from \".\";\nimport type { View } from \"./view\";\n\nexport class Events {\n private tooltip: Tooltip;\n\n constructor(private readonly ctx: Context & { view: View }) {\n this.tooltip = new Tooltip();\n this.initEvents();\n }\n\n initEvents() {\n const { lineButton, breakButton, polygonButton } = this.ctx.view;\n\n if (lineButton) {\n DOM.addEventListener(lineButton, \"click\", this.onLineClick);\n DOM.addEventListener(lineButton, \"mouseenter\", this.onButtonEnter as EventListenerOrEventListenerObject);\n DOM.addEventListener(lineButton, \"mouseleave\", this.onButtonLeave);\n }\n if (polygonButton) {\n DOM.addEventListener(polygonButton, \"click\", this.onPolygonClick);\n DOM.addEventListener(polygonButton, \"mouseenter\", this.onButtonEnter as EventListenerOrEventListenerObject);\n DOM.addEventListener(polygonButton, \"mouseleave\", this.onButtonLeave);\n }\n if (breakButton) {\n DOM.addEventListener(breakButton, \"click\", this.onBreakClick);\n DOM.addEventListener(breakButton, \"mouseenter\", this.onButtonEnter as EventListenerOrEventListenerObject);\n DOM.addEventListener(breakButton, \"mouseleave\", this.onButtonLeave);\n }\n }\n\n removeEvents() {\n const { lineButton, breakButton, polygonButton } = this.ctx.view;\n\n if (lineButton) {\n DOM.removeEventListener(lineButton, \"click\", this.onLineClick);\n DOM.removeEventListener(lineButton, \"mouseenter\", this.onButtonEnter as EventListenerOrEventListenerObject);\n DOM.removeEventListener(lineButton, \"mouseleave\", this.onButtonLeave);\n }\n if (polygonButton) {\n DOM.removeEventListener(polygonButton, \"click\", this.onPolygonClick);\n DOM.removeEventListener(polygonButton, \"mouseenter\", this.onButtonEnter as EventListenerOrEventListenerObject);\n DOM.removeEventListener(polygonButton, \"mouseleave\", this.onButtonLeave);\n }\n if (breakButton) {\n DOM.removeEventListener(breakButton, \"click\", this.onBreakClick);\n DOM.removeEventListener(breakButton, \"mouseenter\", this.onButtonEnter as EventListenerOrEventListenerObject);\n DOM.removeEventListener(breakButton, \"mouseleave\", this.onButtonLeave);\n }\n }\n\n remove() {\n this.removeEvents();\n this.tooltip.remove();\n }\n\n onButtonEnter = (event: HTMLEvent<HTMLButtonElement>) => {\n const { options } = this.ctx;\n\n const type = event.target.getAttribute(\"data-type\") as ControlType;\n\n if (type) {\n const label = getButtonLabel(type, options);\n const placement = \"left\";\n this.tooltip\n .create({\n label,\n placement,\n })\n .setPosition(this.tooltip.getPosition(event, placement));\n }\n };\n\n onButtonLeave = () => {\n this.tooltip.remove();\n };\n\n removeActiveClass = () => {\n const { lineButton, breakButton, polygonButton } = this.ctx.view;\n\n lineButton?.classList.remove(\"control-button-active\");\n polygonButton?.classList.remove(\"control-button-active\");\n breakButton?.classList.remove(\"control-button-active\");\n };\n\n onLineClick = () => {\n const { mode } = this.ctx;\n const { lineButton } = this.ctx.view;\n\n if (mode.getMode() === \"line\") return;\n\n this.removeActiveClass();\n lineButton?.classList.add(\"control-button-active\");\n mode.setMode(\"line\");\n };\n\n onPolygonClick = () => {\n const { mode } = this.ctx;\n const { polygonButton } = this.ctx.view;\n\n if (mode.getMode() === \"polygon\") return;\n\n this.removeActiveClass();\n polygonButton?.classList.add(\"control-button-active\");\n mode.setMode(\"polygon\");\n };\n\n onBreakClick = () => {\n const { map, mode } = this.ctx;\n const { breakButton } = this.ctx.view;\n\n this.removeActiveClass();\n breakButton?.classList.add(\"control-button-active\");\n mode.setBreak(true);\n map.getCanvasContainer().style.cursor = CURSORS.POINTER;\n };\n}\n","import { DOM } from \"#app/dom\";\nimport { FireEvents } from \"#components/map/fire-events\";\nimport { DrawingModeChangeEvent, Mode } from \"#components/map/mode/types\";\nimport { Context } from \".\";\nimport { View } from \"./view\";\n\nexport class Observer {\n constructor(private readonly ctx: Context & { view: View }) {\n this.initConsumers();\n }\n\n private initConsumers = () => {\n this.ctx.mode.addObserver(this.mapModeConsumer);\n };\n\n public remove = () => {\n this.ctx.mode.removeObserver(this.mapModeConsumer);\n };\n\n private resetAllState = () => {\n const { lineButton, breakButton, polygonButton } = this.ctx.view;\n\n lineButton?.classList.remove(\"control-button-active\");\n polygonButton?.classList.remove(\"control-button-active\");\n breakButton?.classList.remove(\"control-button-active\");\n };\n\n private checkActive = (button: HTMLElement) => {\n this.resetAllState();\n button.classList.add(\"control-button-active\");\n };\n\n private observeModeChange = (event: DrawingModeChangeEvent) => {\n const { data } = event;\n const { lineButton, breakButton, polygonButton } = this.ctx.view;\n\n const { mode } = this.ctx;\n FireEvents.modeChanged(this.ctx.map, data as Mode);\n\n if (!lineButton || !polygonButton || !breakButton) return;\n\n switch (data) {\n case \"line\":\n this.checkActive(lineButton);\n break;\n case \"polygon\":\n this.checkActive(polygonButton);\n break;\n default:\n break;\n }\n\n if (!data) {\n DOM.disableButton(breakButton);\n } else {\n if (mode.getClosedGeometry()) {\n DOM.enableButton(breakButton);\n }\n }\n };\n\n private observeGeometryChange = (event: DrawingModeChangeEvent) => {\n const { data } = event;\n const { lineButton, breakButton, polygonButton } = this.ctx.view;\n\n const { mode } = this.ctx;\n const currentMode = mode.getMode();\n\n if (breakButton) {\n data ? DOM.enableButton(breakButton) : DOM.disableButton(breakButton);\n }\n if (currentMode === \"polygon\" && lineButton) {\n data ? DOM.disableButton(lineButton) : DOM.enableButton(lineButton);\n }\n if (currentMode === \"line\" && polygonButton) {\n data ? DOM.disableButton(polygonButton) : DOM.enableButton(polygonButton);\n }\n };\n\n private mapModeConsumer = (event: DrawingModeChangeEvent) => {\n const { type, data } = event;\n\n if (type === \"MODE_CHANGED\") {\n this.observeModeChange(event);\n }\n if (type === \"CLOSED_GEOMETRY_CHANGED\") {\n this.observeGeometryChange(event);\n }\n if (type === \"BREAK_CHANGED\" && data) {\n const { breakButton } = this.ctx.view;\n\n this.checkActive(breakButton as HTMLElement);\n FireEvents.modeChanged(this.ctx.map, \"break\");\n }\n };\n}\n","import { DOM } from \"#app/dom\";\nimport { Context } from \".\";\n\nexport class View {\n private root: HTMLDivElement;\n public lineButton?: HTMLButtonElement;\n public polygonButton?: HTMLButtonElement;\n public breakButton?: HTMLButtonElement;\n\n constructor(private readonly ctx: Pick<Context, \"options\" | \"mode\">) {\n this.root = DOM.create(\"div\", \"mapboxgl-ctrl mapboxgl-ctrl-group maplibregl-ctrl maplibregl-ctrl-group\");\n this.createControl();\n }\n\n createControlButton = (\n type: \"line\" | \"polygon\" | \"break\",\n title: string,\n active: boolean,\n disabled?: boolean,\n ): HTMLButtonElement => {\n const size = this.ctx.options.panel.size;\n const button = DOM.create(\"button\", `control-button control-button-${size}`, this.root);\n button.setAttribute(\"aria-label\", title);\n button.setAttribute(\"data-type\", type);\n\n if (active) {\n button.classList.add(\"control-button-active\");\n }\n if (disabled) {\n DOM.disableButton(button);\n }\n DOM.create(\"span\", `icon ${type} icon-medium`, button);\n return button;\n };\n\n private createLineButton = () => {\n const { mode, options } = this.ctx;\n const lineVisible = this.ctx.options.modes.line.visible;\n const lineTitle = options.locale.line;\n if (lineVisible) {\n this.lineButton = this.createControlButton(\"line\", lineTitle, mode.getMode() === \"line\");\n }\n };\n\n private createPolygonButton = () => {\n const { mode, options } = this.ctx;\n\n const polygonVisible = this.ctx.options.modes.polygon.visible;\n const polygonTitle = options.locale.polygon;\n if (polygonVisible) {\n this.polygonButton = this.createControlButton(\"polygon\", polygonTitle, mode.getMode() === \"polygon\");\n }\n };\n\n private createBreakButton = () => {\n const { mode, options } = this.ctx;\n\n const breakVisible = this.ctx.options.modes.breakGeometry.visible;\n const breakTitle = options.locale.break;\n if (breakVisible) {\n const closedGeometry = this.ctx.options.initial?.closeGeometry;\n const disabled = !closedGeometry;\n const isBreak = mode.getBreak();\n this.breakButton = this.createControlButton(\"break\", breakTitle, isBreak, disabled);\n }\n };\n\n private createControl = () => {\n this.createLineButton();\n this.createPolygonButton();\n this.createBreakButton();\n };\n\n public getContainer = (): HTMLDivElement => {\n return this.root;\n };\n\n public destroy = () => {\n this.root.remove();\n };\n}\n","import type { RequiredDrawOptions } from \"#app/types/index\";\nimport { UnifiedMap } from \"#app/types/map\";\nimport { DrawingMode } from \"#components/map/mode\";\nimport { Events } from \"./events\";\nimport { Observer } from \"./observer\";\nimport { View } from \"./view\";\nimport \"./control.css\";\n\nexport interface Context {\n options: RequiredDrawOptions;\n mode: DrawingMode;\n map: UnifiedMap;\n}\n\nexport class Control {\n private readonly view: View;\n private readonly events: Events;\n private readonly observer: Observer;\n\n constructor(readonly ctx: Context) {\n this.view = new View(ctx);\n const enrichedCtx: Context & { view: View } = { ...ctx, view: this.view };\n\n this.events = new Events(enrichedCtx);\n this.observer = new Observer(enrichedCtx);\n this.init();\n }\n\n init() {\n const root = this.view.getContainer();\n this.ctx.map.getContainer().appendChild(root);\n }\n\n public getContainer(): HTMLDivElement {\n return this.view.getContainer();\n }\n\n public destroy() {\n this.events.remove();\n this.observer.remove();\n this.view.destroy();\n }\n}\n","import type { RequiredDrawOptions } from \"#app/types/index\";\nimport { Observable } from \"#app/observable\";\n\nimport type { DrawingModeChangeEvent, Mode } from \"./types\";\n\nfunction getInitialMode(options: RequiredDrawOptions): Mode {\n if (options.initial?.geometry) {\n return options.initial?.geometry;\n }\n\n if (options.modes.initial) {\n return options.modes.initial;\n }\n\n return null;\n}\n\nexport class DrawingMode extends Observable<DrawingModeChangeEvent> {\n private mode: Mode;\n private break: boolean;\n private closedGeometry: boolean;\n\n constructor(options: RequiredDrawOptions) {\n super();\n this.mode = getInitialMode(options);\n this.break = false;\n this.closedGeometry = options.initial?.closeGeometry ?? false;\n }\n\n getMode = (): Mode => {\n return this.mode;\n };\n\n setMode = (newMode: Mode) => {\n this.mode = newMode;\n this.setBreak(false);\n this.notify({\n type: \"MODE_CHANGED\",\n data: newMode,\n });\n };\n\n getBreak = (): boolean => {\n return this.break;\n };\n\n setBreak = (value: boolean) => {\n this.break = value;\n this.notify({\n type: \"BREAK_CHANGED\",\n data: value,\n });\n };\n\n getClosedGeometry = (): boolean => {\n return this.closedGeometry;\n };\n\n setClosedGeometry = (value: boolean) => {\n this.closedGeometry = value;\n this.notify({\n type: \"CLOSED_GEOMETRY_CHANGED\",\n data: this.closedGeometry,\n });\n };\n\n isPolygon = () => {\n return this.mode === \"polygon\" && this.getClosedGeometry();\n };\n\n reset = () => {\n this.setMode(this.getMode());\n this.setClosedGeometry(false);\n };\n\n pingConsumers = () => {\n this.notify({\n type: \"MODE_CHANGED\",\n data: this.getMode(),\n });\n this.notify({\n type: \"CLOSED_GEOMETRY_CHANGED\",\n data: this.getClosedGeometry(),\n });\n };\n}\n","import type { UnifiedMap } from \"#app/types/map\";\n\nimport { debounce } from \"#app/utils/helpers\";\nimport type { DrawingMode } from \"#components/map/mode\";\nimport type { Store } from \"#app/store/index\";\n\nimport type { MouseEvents } from \"../map/mouse-events\";\nimport type { MouseEventsChangeEvent } from \"../map/mouse-events/types\";\nimport { CURSORS, type TCursor } from \"./constants\";\nimport type { RequiredDrawOptions } from \"#app/types/index\";\n\ninterface Context {\n map: UnifiedMap;\n mode: DrawingMode;\n mouseEvents: MouseEvents;\n store: Store;\n options: RequiredDrawOptions;\n}\n\nexport class Cursor {\n #canvas: HTMLElement;\n\n constructor(private readonly ctx: Context) {\n this.#canvas = this.ctx.map.getCanvasContainer();\n this.#canvas.style.cursor = ctx.mode.getMode() ? CURSORS.CROSSHAIR : CURSORS.AUTO;\n this.#initConsumers();\n }\n\n set = (cursor: TCursor) => {\n this.#canvas.style.cursor = cursor;\n };\n\n get = () => this.#canvas.style.cursor;\n\n handleMouseLeave = debounce(() => {\n const { mouseEvents, mode } = this.ctx;\n if (mouseEvents.pointMouseDown) return;\n if (!mode.getMode()) {\n this.set(CURSORS.AUTO);\n return;\n }\n if (mode.getClosedGeometry()) {\n this.set(CURSORS.AUTO);\n } else {\n this.set(CURSORS.CROSSHAIR);\n }\n }, 10);\n\n handleFirstPointMouseEnter = debounce(() => {\n const { store } = this.ctx;\n\n if (store.circular.canClose()) {\n this.set(CURSORS.POINTER);\n }\n }, 10);\n\n #initConsumers() {\n const { mouseEvents } = this.ctx;\n\n mouseEvents.addObserver(this.#mouseEventsObserver);\n }\n\n remove() {\n const { mouseEvents } = this.ctx;\n\n mouseEvents.removeObserver(this.#mouseEventsObserver);\n }\n\n #mouseEventsObserver = (event: MouseEventsChangeEvent) => {\n const { mode, mouseEvents, store, options } = this.ctx;\n if (mode.getBreak()) return;\n\n const { type, data } = event;\n\n if (!data) return;\n\n switch (type) {\n case \"pointMouseDown\":\n this.set(CURSORS.GRABBING);\n break;\n case \"pointMouseUp\":\n this.set(CURSORS.GRAB);\n break;\n case \"pointMouseEnter\":\n if (mouseEvents.pointMouseDown) return;\n this.set(CURSORS.GRAB);\n break;\n case \"pointMouseLeave\":\n this.handleMouseLeave();\n break;\n case \"lineMouseEnter\":\n if (mouseEvents.pointMouseDown) return;\n this.set(CURSORS.POINTER);\n break;\n case \"lineMouseLeave\":\n this.handleMouseLeave();\n break;\n case \"firstPointMouseEnter\":\n this.handleFirstPointMouseEnter();\n break;\n case \"firstPointMouseLeave\":\n this.handleMouseLeave();\n break;\n case \"lastPointMouseEnter\":\n if (!store.circular.isCircular()) {\n this.set(CURSORS.POINTER);\n }\n break;\n case \"lastPointMouseLeave\":\n this.handleMouseLeave();\n break;\n default:\n break;\n }\n };\n}\n","import { Observable } from \"#app/observable\";\nimport { MouseEventsChangeEvent } from \"./types\";\n\nexport class MouseEvents extends Observable<MouseEventsChangeEvent> {\n #firstPointMouseEnter: boolean;\n #firstPointMouseLeave: boolean;\n #lastPointMouseClick: boolean;\n #lastPointMouseUp: boolean;\n #lastPointMouseEnter: boolean;\n #lastPointMouseLeave: boolean;\n #pointMouseDown: boolean;\n #pointMouseUp: boolean;\n #pointMouseEnter: boolean;\n #pointMouseLeave: boolean;\n #lineMouseEnter: boolean;\n #lineMouseLeave: boolean;\n\n constructor() {\n super();\n this.#firstPointMouseEnter = false;\n this.#firstPointMouseLeave = false;\n this.#lastPointMouseClick = false;\n this.#lastPointMouseUp = false;\n this.#lastPointMouseEnter = false;\n this.#lastPointMouseLeave = false;\n this.#pointMouseDown = false;\n this.#pointMouseUp = false;\n this.#pointMouseEnter = false;\n this.#pointMouseLeave = false;\n this.#lineMouseEnter = false;\n this.#lineMouseLeave = false;\n }\n\n get firstPointMouseEnter() {\n return this.#firstPointMouseEnter;\n }\n set firstPointMouseEnter(value) {\n this.#firstPointMouseEnter = value;\n this.notify({\n type: \"firstPointMouseEnter\",\n data: value,\n });\n }\n\n get firstPointMouseLeave() {\n return this.#firstPointMouseLeave;\n }\n set firstPointMouseLeave(value) {\n this.#firstPointMouseLeave = value;\n this.notify({\n type: \"firstPointMouseLeave\",\n data: value,\n });\n }\n\n get lastPointMouseClick() {\n return this.#lastPointMouseClick;\n }\n set lastPointMouseClick(value) {\n this.#lastPointMouseClick = value;\n this.notify({\n type: \"lastPointMouseClick\",\n data: value,\n });\n }\n\n get lastPointMouseUp() {\n return this.#lastPointMouseUp;\n }\n set lastPointMouseUp(value) {\n this.#lastPointMouseUp = value;\n this.notify({\n type: \"lastPointMouseUp\",\n data: value,\n });\n }\n\n get lastPointMouseEnter() {\n return this.#lastPointMouseEnter;\n }\n set lastPointMouseEnter(value) {\n this.#lastPointMouseEnter = value;\n this.notify({\n type: \"lastPointMouseEnter\",\n data: value,\n });\n }\n\n get lastPointMouseLeave() {\n return this.#lastPointMouseLeave;\n }\n set lastPointMouseLeave(value) {\n this.#lastPointMouseLeave = value;\n this.notify({\n type: \"lastPointMouseLeave\",\n data: value,\n });\n }\n\n get pointMouseDown() {\n return this.#pointMouseDown;\n }\n set pointMouseDown(value) {\n this.#pointMouseDown = value;\n this.notify({\n type: \"pointMouseDown\",\n data: value,\n });\n }\n\n get pointMouseUp() {\n return this.#pointMouseUp;\n }\n set pointMouseUp(value) {\n this.#pointMouseUp = value;\n this.notify({\n type: \"pointMouseUp\",\n data: value,\n });\n }\n\n get pointMouseEnter() {\n return this.#pointMouseEnter;\n }\n set pointMouseEnter(value) {\n this.#pointMouseEnter = value;\n this.notify({\n type: \"pointMouseEnter\",\n data: value,\n });\n }\n\n get pointMouseLeave() {\n return this.#pointMouseLeave;\n }\n set pointMouseLeave(value) {\n this.#pointMouseLeave = value;\n this.notify({\n type: \"pointMouseLeave\",\n data: value,\n });\n }\n\n get lineMouseEnter() {\n return this.#lineMouseEnter;\n }\n\n set lineMouseEnter(value) {\n this.#lineMouseEnter = value;\n this.notify({\n type: \"lineMouseEnter\",\n data: value,\n });\n }\n\n get lineMouseLeave() {\n return this.#lineMouseLeave;\n }\n\n set lineMouseLeave(value) {\n this.#lineMouseLeave = value;\n this.notify({\n type: \"lineMouseLeave\",\n data: value,\n });\n }\n}\n","import type { RequiredDrawOptions } from \"#app/types\";\nimport {\n ON_LINE_POINT_PAINT_BASE,\n FIRST_POINT_PAINT_BASE,\n POINTS_PAINT_BASE,\n LINE_PAINT_BASE,\n POLYGON_PAINT_BASE,\n BREAK_PAINT_BASE,\n} from \"#app/utils/geo_constants\";\n\nexport const DEFAULT_OPTIONS: RequiredDrawOptions = {\n pointGeneration: \"manual\",\n panel: {\n size: \"medium\",\n buttons: {\n undo: { visible: true },\n redo: { visible: true },\n delete: { visible: true },\n save: { visible: true, clearOnSave: true },\n },\n },\n modes: {\n initial: null,\n line: {\n visible: true,\n closeGeometry: true,\n },\n polygon: {\n visible: true,\n },\n breakGeometry: {\n visible: true,\n },\n },\n layersPaint: {\n onLinePoint: ON_LINE_POINT_PAINT_BASE,\n firstPoint: FIRST_POINT_PAINT_BASE,\n points: POINTS_PAINT_BASE,\n line: LINE_PAINT_BASE,\n polygon: POLYGON_PAINT_BASE,\n breakLine: BREAK_PAINT_BASE,\n },\n initial: null,\n dynamicLine: true,\n locale: {\n save: \"Save\",\n delete: \"Delete all\",\n undo: \"Undo\",\n redo: \"Redo\",\n line: \"Line\",\n polygon: \"Polygon\",\n break: \"Split\",\n closeLine: \"Close the line\",\n createPolygon: \"Create a polygon\",\n },\n};\n","import { ERRORS } from \"#app/store/init\";\nimport { Initial, DrawOptions, RequiredDrawOptions } from \"#app/types/index\";\nimport {\n ON_LINE_POINT_PAINT_BASE,\n FIRST_POINT_PAINT_BASE,\n POINTS_PAINT_BASE,\n LINE_PAINT_BASE,\n POLYGON_PAINT_BASE,\n BREAK_PAINT_BASE,\n AUXILIARY_POINT_PAINT_BASE,\n} from \"../utils/geo_constants\";\nimport { DEFAULT_OPTIONS } from \"./constants\";\n\nfunction allStepsHaveIds(steps: Initial[\"steps\"]): boolean {\n return steps.every((step) => \"id\" in step && step.id !== undefined);\n}\n\nfunction checkIfMissingIds(steps: Initial[\"steps\"], generateId: Initial[\"generateId\"]) {\n const idGenerationIsOff = !generateId;\n const idsNotProvided = !allStepsHaveIds(steps);\n if (idGenerationIsOff && idsNotProvided) {\n throw new Error(ERRORS[\"MISSING_IDS\"]);\n }\n}\n\nfunction checkIfEnoughPointsToClose(steps: Initial[\"steps\"], closeGeometry: Initial[\"closeGeometry\"]) {\n const minLengthToCloseGeometry = 3;\n if (closeGeometry && steps.length < minLengthToCloseGeometry) {\n throw new Error(ERRORS[\"NOT_ENOUGH_POINTS_TO_CLOSE\"]);\n }\n}\n\nfunction checkIfPolygonIsClosed(options: Initial) {\n const { closeGeometry, steps } = options;\n if (steps) {\n const firstLng = steps[0]?.lng;\n const lastLng = steps[steps.length - 1]?.lng;\n const firstLat = steps[0]?.lat;\n const lastLat = steps[steps.length - 1]?.lat;\n const firstAndLastNotEqual = firstLng !== lastLng || firstLat !== lastLat;\n if (firstAndLastNotEqual && closeGeometry) {\n throw new Error(ERRORS[\"FIRST_LAST_POINT_NOT_EQUAL\"]);\n }\n }\n}\n\nexport function checkInitialStepsOptionOnErrors(options: Initial): void {\n const { closeGeometry, generateId, steps } = options;\n // if we have ids for all steps and id generation is off\n checkIfMissingIds(steps, generateId);\n // If we want to close the geometry, we need at least 3 points\n checkIfEnoughPointsToClose(steps, closeGeometry);\n // If the geometry is a polygon, closeGeometry must be true.\n checkIfPolygonIsClosed(options);\n}\n\nexport function initOptions(options?: DrawOptions): RequiredDrawOptions {\n if (!options) {\n return DEFAULT_OPTIONS;\n }\n\n return {\n pointGeneration: options.pointGeneration ?? DEFAULT_OPTIONS.pointGeneration,\n panel: generatePanelOptions(options),\n modes: generateModeOptions(options),\n layersPaint: generateLayersOptions(options),\n initial: options.initial || DEFAULT_OPTIONS[\"initial\"],\n locale: generateLocaleOptions(options),\n dynamicLine: options.dynamicLine ?? DEFAULT_OPTIONS.dynamicLine,\n } as RequiredDrawOptions;\n}\nfunction generatePanelOptions(options: DrawOptions): RequiredDrawOptions[\"panel\"] {\n return {\n size: options.panel?.size || DEFAULT_OPTIONS.panel.size,\n buttons: {\n undo: {\n visible: options.panel?.buttons?.undo?.visible ?? DEFAULT_OPTIONS.panel.buttons.undo.visible,\n },\n redo: {\n visible: options.panel?.buttons?.redo?.visible ?? DEFAULT_OPTIONS.panel.buttons.redo.visible,\n },\n delete: {\n visible: options.panel?.buttons?.delete?.visible ?? DEFAULT_OPTIONS.panel.buttons.delete.visible,\n },\n save: {\n visible: options.panel?.buttons?.save?.visible ?? DEFAULT_OPTIONS.panel.buttons.save.visible,\n clearOnSave: options.panel?.buttons?.save?.clearOnSave ?? DEFAULT_OPTIONS.panel.buttons.save.clearOnSave,\n },\n },\n };\n}\n\nfunction generateModeOptions(options: DrawOptions): RequiredDrawOptions[\"modes\"] {\n return {\n initial: options.modes?.initial || DEFAULT_OPTIONS.modes.initial,\n line: {\n visible:\n options?.modes?.line?.visible !== undefined\n ? options.modes.line.visible\n : options?.initial?.geometry === \"line\" || DEFAULT_OPTIONS.modes.line.visible,\n closeGeometry: options?.modes?.line?.closeGeometry ?? DEFAULT_OPTIONS.modes.line.closeGeometry,\n },\n polygon: {\n visible:\n options?.modes?.polygon?.visible !== undefined\n ? options.modes.polygon.visible\n : options?.initial?.geometry === \"polygon\" || DEFAULT_OPTIONS.modes.polygon.visible,\n },\n breakGeometry: {\n visible: options?.modes?.breakGeometry?.visible ?? DEFAULT_OPTIONS.modes.breakGeometry.visible,\n },\n };\n}\n\nfunction generateLayersOptions(options: DrawOptions): RequiredDrawOptions[\"layersPaint\"] {\n return {\n onLinePoint: {\n \"circle-radius\": options.layersPaint?.onLinePoint?.[\"circle-radius\"] || ON_LINE_POINT_PAINT_BASE[\"circle-radius\"],\n \"circle-color\": options.layersPaint?.onLinePoint?.[\"circle-color\"] || ON_LINE_POINT_PAINT_BASE[\"circle-color\"],\n \"circle-stroke-color\":\n options.layersPaint?.onLinePoint?.[\"circle-stroke-color\"] || ON_LINE_POINT_PAINT_BASE[\"circle-stroke-color\"],\n \"circle-stroke-width\":\n options.layersPaint?.onLinePoint?.[\"circle-stroke-width\"] || ON_LINE_POINT_PAINT_BASE[\"circle-stroke-width\"],\n ...options.layersPaint?.onLinePoint,\n },\n firstPoint: {\n \"circle-radius\": options.layersPaint?.firstPoint?.[\"circle-radius\"] || FIRST_POINT_PAINT_BASE[\"circle-radius\"],\n \"circle-color\": options.layersPaint?.firstPoint?.[\"circle-color\"] || FIRST_POINT_PAINT_BASE[\"circle-color\"],\n \"circle-stroke-color\":\n options.layersPaint?.firstPoint?.[\"circle-stroke-color\"] || FIRST_POINT_PAINT_BASE[\"circle-stroke-color\"],\n \"circle-stroke-width\":\n options.layersPaint?.firstPoint?.[\"circle-stroke-width\"] || FIRST_POINT_PAINT_BASE[\"circle-stroke-width\"],\n ...options.layersPaint?.firstPoint,\n },\n points: {\n \"circle-radius\": options.layersPaint?.points?.[\"circle-radius\"] || POINTS_PAINT_BASE[\"circle-radius\"],\n \"circle-color\": options.layersPaint?.points?.[\"circle-color\"] || POINTS_PAINT_BASE[\"circle-color\"],\n \"circle-stroke-color\":\n options.layersPaint?.points?.[\"circle-stroke-color\"] || POINTS_PAINT_BASE[\"circle-stroke-color\"],\n \"circle-stroke-width\":\n options.layersPaint?.points?.[\"circle-stroke-width\"] || POINTS_PAINT_BASE[\"circle-stroke-width\"],\n ...options.layersPaint?.points,\n },\n auxiliaryPoint: {\n \"circle-radius\":\n options.layersPaint?.auxiliaryPoint?.[\"circle-radius\"] || AUXILIARY_POINT_PAINT_BASE[\"circle-radius\"],\n \"circle-color\":\n options.layersPaint?.auxiliaryPoint?.[\"circle-color\"] || AUXILIARY_POINT_PAINT_BASE[\"circle-color\"],\n \"circle-stroke-color\":\n options.layersPaint?.auxiliaryPoint?.[\"circle-stroke-color\"] ||\n AUXILIARY_POINT_PAINT_BASE[\"circle-stroke-color\"],\n \"circle-stroke-width\":\n options.layersPaint?.auxiliaryPoint?.[\"circle-stroke-width\"] ||\n AUXILIARY_POINT_PAINT_BASE[\"circle-stroke-width\"],\n ...options.layersPaint?.auxiliaryPoint,\n },\n line: {\n \"line-width\": options.layersPaint?.line?.[\"line-width\"] || LINE_PAINT_BASE[\"line-width\"],\n \"line-color\": options.layersPaint?.line?.[\"line-color\"] || LINE_PAINT_BASE[\"line-color\"],\n \"line-opacity\": options.layersPaint?.line?.[\"line-opacity\"] || LINE_PAINT_BASE[\"line-opacity\"],\n ...options.layersPaint?.line,\n },\n polygon: {\n \"fill-color\": options.layersPaint?.polygon?.[\"fill-color\"] || POLYGON_PAINT_BASE[\"fill-color\"],\n \"fill-opacity\": options.layersPaint?.polygon?.[\"fill-opacity\"] || POLYGON_PAINT_BASE[\"fill-opacity\"],\n ...options.layersPaint?.polygon,\n },\n breakLine: {\n \"line-width\": options.layersPaint?.breakLine?.[\"line-width\"] || BREAK_PAINT_BASE[\"line-width\"],\n \"line-color\": options.layersPaint?.breakLine?.[\"line-color\"] || BREAK_PAINT_BASE[\"line-color\"],\n \"line-dasharray\": options.layersPaint?.breakLine?.[\"line-dasharray\"] || BREAK_PAINT_BASE[\"line-dasharray\"],\n ...options.layersPaint?.breakLine,\n },\n };\n}\n\nfunction generateLocaleOptions(options: DrawOptions): RequiredDrawOptions[\"locale\"] {\n return {\n save: options.locale?.save ?? DEFAULT_OPTIONS.locale.save,\n delete: options.locale?.delete ?? DEFAULT_OPTIONS.locale.delete,\n undo: options.locale?.undo ?? DEFAULT_OPTIONS.locale.undo,\n redo: options.locale?.redo ?? DEFAULT_OPTIONS.locale.redo,\n line: options.locale?.line ?? DEFAULT_OPTIONS.locale.line,\n polygon: options.locale?.polygon ?? DEFAULT_OPTIONS.locale.polygon,\n break: options.locale?.break ?? DEFAULT_OPTIONS.locale.break,\n closeLine: options.locale?.closeLine ?? DEFAULT_OPTIONS.locale.closeLine,\n createPolygon: options.locale?.createPolygon ?? DEFAULT_OPTIONS.locale.createPolygon,\n };\n}\n","import { ListNode, Store } from \"#app/store\";\nimport type { LatLng, Step } from \"#app/types\";\nimport { uuidv4 } from \"#app/utils/helpers\";\nimport type { Command } from \"#app/history/command\";\n\ninterface Snapshot {\n insertedNode: ListNode | null;\n}\n\nexport class InsertPointCommand implements Command {\n type: string = \"STORE_POINT_INSERTED\";\n payload: { node: Step };\n private readonly step: Step;\n private snapshot: Snapshot = {\n insertedNode: null,\n };\n\n constructor(\n private readonly store: Store,\n coords: LatLng,\n private segmentStart: ListNode,\n ) {\n this.step = { id: uuidv4(), isAuxiliary: false, ...coords };\n this.payload = { node: this.step };\n }\n\n private restoreInsertedNode = (node: ListNode) => {\n const prev = node.prev;\n const next = node.next;\n\n if (prev) {\n prev.next = node;\n } else {\n this.store.head = node;\n }\n\n if (next) {\n next.prev = node;\n } else {\n this.store.tail = node;\n }\n\n const betweenHeadAndTail = this.store.tail === prev && this.store.head === next;\n if (betweenHeadAndTail) {\n this.store.tail = node;\n if (this.store.head) this.store.head.prev = node;\n }\n\n if (node.val && !this.store.map.has(node.val.id)) {\n this.store.map.set(node.val.id, node);\n this.store.size++;\n this.store.pingConsumers();\n }\n };\n\n execute = () => {\n if (this.snapshot.insertedNode) {\n this.restoreInsertedNode(this.snapshot.insertedNode);\n } else {\n this.snapshot.insertedNode = this.store.insertAfter(this.segmentStart, this.step);\n }\n\n this.store.notify({ type: \"STORE_POINT_INSERTED\" });\n };\n\n undo = () => {\n this.store.removeNodeById(this.step.id);\n };\n}\n","import type { MapLayerMouseEvent, MapMouseEvent, MapTouchEvent } from \"maplibre-gl\";\nimport type { Uuid } from \"#app/types/index\";\nimport type { UnifiedMap } from \"#app/types/map\";\nimport type { Store } from \"#app/store/index\";\nimport { ELAYERS } from \"#app/utils/geo_constants\";\n\nexport const isFeatureTriggered = (event: MapLayerMouseEvent, layerIds: string[]) => {\n const layers = event.target.queryRenderedFeatures(event.point, {\n layers: layerIds,\n });\n return layers.some((layer) => layerIds.includes(layer.layer.id));\n};\n\nexport const queryPointId = (map: UnifiedMap, point: MapMouseEvent[\"point\"]) => {\n const query = map.queryRenderedFeatures(point, {\n layers: [ELAYERS.PointsLayer, ELAYERS.FirstPointLayer, ELAYERS.AuxiliaryPointLayer, ELAYERS.SinglePointLayer],\n });\n\n const id = query?.[0]?.properties.id;\n return id;\n};\n\nexport const queryPoint = (map: UnifiedMap, point: MapMouseEvent[\"point\"]) => {\n const query = map.queryRenderedFeatures(point, {\n layers: [ELAYERS.PointsLayer, ELAYERS.FirstPointLayer, ELAYERS.AuxiliaryPointLayer, ELAYERS.SinglePointLayer],\n });\n return query?.[0];\n};\n\nexport const getGeometryIndex = (store: Store, id: Uuid) => {\n let current = store.head;\n let idx = 0;\n const visitedNodes = new Set();\n while (current !== null) {\n if (visitedNodes.has(current.val?.id)) {\n break;\n }\n if (current.val?.id === id) {\n return idx;\n }\n\n visitedNodes.add(current.val?.id);\n idx++;\n current = current.next;\n }\n return -1;\n};\n\nexport function isRightClick(event: MapLayerMouseEvent | MapTouchEvent): boolean {\n return (event.originalEvent as MouseEvent).button === 2;\n}\n","import type { MapLayerMouseEvent } from \"maplibre-gl\";\nimport type { Step, Point } from \"#app/types/index\";\nimport type { UnifiedMap } from \"#app/types/map\";\nimport type { Store } from \"#app/store/index\";\n\nimport { ELAYERS } from \"#app/utils/geo_constants\";\nimport { uuidv4 } from \"#app/utils/helpers\";\nimport { timeline } from \"#app/history\";\n\nimport { PointVisibility } from \"../points/helpers\";\nimport { InsertPointCommand } from \"../points/commands/insert-point\";\nimport { renderer } from \"../renderer\";\nimport { isFeatureTriggered } from \"../utils\";\nimport { TilesContext } from \"../tiles\";\n\n// √((x1​−x2​)²+(y1​−y2​)²​)\nconst distance = (point1: Point, point2: Point) =>\n Math.sqrt(Math.pow(point1.x - point2.x, 2) + Math.pow(point1.y - point2.y, 2));\n\nconst checkIfPointIsOnLine = (A: Point, B: Point, P: Point): boolean => {\n const EPSILON = 0.1;\n\n const AB = distance(A, B);\n const AP = distance(A, P);\n const PB = distance(P, B);\n\n if (Math.abs(AP + PB - AB) < EPSILON) {\n return true;\n }\n\n return false;\n};\n\nexport const isOnLine = (event: MapLayerMouseEvent, store: Store) => {\n let current = store.head;\n const visited = new Set();\n\n while (current !== null) {\n if (visited.has(current)) break;\n if (current?.next?.val && current?.val) {\n const map = event.target as UnifiedMap;\n const aPixel = map.project(current.val);\n const bPixel = map.project(current.next.val);\n const eventPixel = map.project(event.lngLat);\n if (checkIfPointIsOnLine(aPixel, bPixel, eventPixel)) {\n return current;\n }\n }\n visited.add(current);\n current = current.next;\n }\n return null;\n};\n\nexport const insertStepIfOnLine = (event: MapLayerMouseEvent, store: Store): Step | null => {\n const segmentStart = isOnLine(event, store);\n\n if (segmentStart) {\n const step = { ...event.lngLat, isAuxiliary: false, id: uuidv4() };\n timeline.commit(new InsertPointCommand(store, step, segmentStart));\n return step;\n }\n return null;\n};\n\nexport const updateUIAfterInsert = (event: MapLayerMouseEvent, context: Pick<TilesContext, \"store\">) => {\n const { store } = context;\n if (store.tail?.val) {\n PointVisibility.setSinglePointHidden(event);\n renderer.execute();\n }\n};\n\nexport const checkIfPointClicked = (event: MapLayerMouseEvent) => {\n return isFeatureTriggered(event, [ELAYERS.PointsLayer, ELAYERS.FirstPointLayer, ELAYERS.AuxiliaryPointLayer]);\n};\n","import type { ListNode, Store } from \"#app/store\";\nimport type { StoreChangeEventKeys } from \"#app/store/types\";\nimport type { RequiredDrawOptions } from \"#app/types\";\nimport type { DrawingMode } from \"#components/map/mode\";\nimport type { LatLng } from \"#app/types/index\";\nimport type { Command } from \"#app/history/command\";\n\ninterface Snapshot {\n originalHead: ListNode | null;\n originalTail: ListNode | null;\n newHead: ListNode | null;\n newTail: ListNode | null;\n newAuxBetweenHeadTail: ListNode | null;\n}\n\nexport class BreakGeometryCommand implements Command {\n type: StoreChangeEventKeys = \"STORE_BREAK_GEOMETRY\";\n\n private snapshot: Snapshot = {\n originalHead: null,\n originalTail: null,\n newHead: null,\n newTail: null,\n newAuxBetweenHeadTail: null,\n };\n\n constructor(\n private readonly store: Store,\n private readonly options: RequiredDrawOptions,\n private readonly mode: DrawingMode,\n private readonly current: ListNode,\n private readonly clickCoords: LatLng,\n ) {}\n\n private makeSnapshot = () => {\n this.snapshot.originalHead = this.store.head;\n this.snapshot.originalTail = this.store.tail;\n this.snapshot.newAuxBetweenHeadTail = this.current.val?.isAuxiliary ? this.current : this.current.next;\n };\n\n public execute = () => {\n this.makeSnapshot();\n\n this.store.circular.break(this.current);\n this.mode.setClosedGeometry(false);\n\n // save the new head and tail after breaking the geometry\n this.snapshot.newHead = this.store.head;\n this.snapshot.newTail = this.store.tail;\n\n // notify the panel to update the UI\n this.store.notify({ type: \"STORE_BREAK_GEOMETRY\", data: { coords: this.clickCoords } });\n };\n\n private restoreOriginalHeadTail = () => {\n const { originalHead, originalTail } = this.snapshot;\n this.store.head = originalHead;\n this.store.tail = originalTail;\n if (this.store.head) {\n this.store.head.prev = this.store.tail;\n }\n if (this.store.tail) {\n this.store.tail.next = this.store.head;\n }\n };\n\n private restoreAuxBetweenNewHeadTail = () => {\n const { newHead, newTail, newAuxBetweenHeadTail } = this.snapshot;\n\n if (newHead && newTail) {\n newTail.next = newAuxBetweenHeadTail;\n newAuxBetweenHeadTail!.prev = newTail;\n newAuxBetweenHeadTail!.next = newHead;\n newHead.prev = newAuxBetweenHeadTail;\n if (newAuxBetweenHeadTail?.val) {\n this.store.map.set(newAuxBetweenHeadTail?.val.id, newAuxBetweenHeadTail);\n this.store.size += 1;\n }\n }\n };\n\n public undo = () => {\n this.restoreOriginalHeadTail();\n this.store.circular.close();\n this.store.notify({ type: \"STORE_CLOSE_GEOMETRY\" });\n\n const { newHead, newTail } = this.snapshot;\n // restore old node connections. These are the nodes that were \"removed\" when breaking the geometry previously\n if (newHead && newTail) {\n if (this.options.pointGeneration === \"auto\") {\n this.restoreAuxBetweenNewHeadTail();\n } else {\n newTail.next = newHead;\n newHead.prev = newTail;\n }\n }\n this.mode.setClosedGeometry(true);\n // notify the panel to update the UI\n this.store.pingConsumers();\n };\n}\n","import { GeoJSONSource, MapLayerMouseEvent } from \"maplibre-gl\";\n\nimport type { ListNode } from \"#app/store/index\";\nimport { ELAYERS, ESOURCES } from \"#app/utils/geo_constants\";\nimport { throttle } from \"#app/utils/helpers\";\nimport { timeline } from \"#app/history\";\n\nimport { isOnLine } from \"./utils\";\nimport { FireEvents } from \"../fire-events\";\nimport { BreakGeometryCommand } from \"./commands/break-geometry\";\nimport { renderer } from \"../renderer\";\nimport { getLine } from \"../renderer/geojson-builder\";\nimport type { TilesContext } from \"../tiles\";\n\nconst LINE_BREAK_THROTTLE_TIME = 15;\n\nexport class LineBreakEvents {\n private current: ListNode | null;\n private throttledOnLineEnter: (event: MapLayerMouseEvent) => void;\n\n constructor(private readonly ctx: TilesContext) {\n this.current = null;\n this.throttledOnLineEnter = throttle(this.onLineEnterBreak, LINE_BREAK_THROTTLE_TIME);\n }\n\n public initBreakEvents = () => {\n this.ctx.map.on(\"click\", ELAYERS.LineLayer, this.geometryBreakOnClick);\n this.ctx.map.on(\"mouseenter\", ELAYERS.LineLayer, this.throttledOnLineEnter);\n this.ctx.map.on(\"mousemove\", ELAYERS.LineLayer, this.throttledOnLineEnter);\n this.ctx.map.on(\"mouseleave\", ELAYERS.LineLayer, this.onLineLeave);\n };\n\n public removeBreakEvents = () => {\n this.ctx.map.off(\"click\", ELAYERS.LineLayer, this.geometryBreakOnClick);\n this.ctx.map.off(\"mouseenter\", ELAYERS.LineLayer, this.throttledOnLineEnter);\n this.ctx.map.off(\"mousemove\", ELAYERS.LineLayer, this.throttledOnLineEnter);\n this.ctx.map.off(\"mouseleave\", ELAYERS.LineLayer, this.onLineLeave);\n };\n\n public hideBreakLine = () => {\n if (this.ctx.map.getLayoutProperty(ELAYERS.LineLayerBreak, \"visibility\") !== \"none\") {\n this.ctx.map.setLayoutProperty(ELAYERS.LineLayerBreak, \"visibility\", \"none\");\n }\n };\n\n public showBreakLine = () => {\n if (this.ctx.map.getLayoutProperty(ELAYERS.LineLayerBreak, \"visibility\") !== \"visible\") {\n this.ctx.map.setLayoutProperty(ELAYERS.LineLayerBreak, \"visibility\", \"visible\");\n }\n };\n\n private geometryBreakOnClick = (event: MapLayerMouseEvent) => {\n const { store, mode, map, options } = this.ctx;\n\n if (!this.current) return;\n timeline.commit(new BreakGeometryCommand(store, options, mode, this.current, event.lngLat));\n this.onLineLeave();\n mode.reset();\n renderer.execute();\n FireEvents.onLineBreak(map);\n };\n\n private getAutoGenerationPoints = (line: ListNode | null) => {\n let current: [number, number] | null = null;\n let next: [number, number] | null = null;\n\n if (line?.val?.isAuxiliary) {\n current = [line?.prev?.val?.lng, line?.prev?.val?.lat] as [number, number];\n next = [line?.next?.val?.lng, line?.next?.val?.lat] as [number, number];\n } else {\n current = [line?.val?.lng, line?.val?.lat] as [number, number];\n next = [line?.next?.next?.val?.lng, line?.next?.next?.val?.lat] as [number, number];\n }\n return { current, next };\n };\n\n private getLinePoints = (line: ListNode | null) => {\n if (this.ctx.options.pointGeneration === \"manual\") {\n const current = [line?.val?.lng, line?.val?.lat] as [number, number];\n const next = [line?.next?.val?.lng, line?.next?.val?.lat] as [number, number];\n return { current, next };\n }\n\n return this.getAutoGenerationPoints(line);\n };\n\n private onLineEnterBreak = (event: MapLayerMouseEvent) => {\n const { map, store } = this.ctx;\n\n const line = isOnLine(event, store);\n if (line?.val?.id !== this.current?.val?.id) {\n this.current = line;\n }\n\n const lineSource = map.getSource(ESOURCES.LineSourceBreak) as GeoJSONSource;\n const { current, next } = this.getLinePoints(this.current);\n\n const lineBreakData = getLine(current, next);\n if (!lineBreakData) return;\n\n lineSource.setData(lineBreakData as any);\n this.showBreakLine();\n };\n\n private onLineLeave = () => {\n setTimeout(() => {\n this.hideBreakLine();\n }, LINE_BREAK_THROTTLE_TIME + 10);\n };\n}\n","import type { GeoJSONSource, MapLayerMouseEvent, PointLike } from \"maplibre-gl\";\n\nimport type { LatLng } from \"#app/types/index\";\nimport { ELAYERS, ESOURCES, LINE_BASE } from \"#app/utils/geo_constants\";\nimport type { StoreChangeEvent } from \"#app/store/types\";\nimport { debounce, throttle } from \"#app/utils/helpers\";\nimport { EVENTS } from \"#app/utils/constants\";\n\nimport type { PointRightClickRemoveEvent, UndoEvent } from \"../types\";\nimport type { MouseEventsChangeEvent, MapMouseEvent } from \"../mouse-events/types\";\nimport { getLine } from \"../renderer/geojson-builder\";\nimport { isFeatureTriggered } from \"../utils\";\nimport type { TilesContext } from \"../tiles\";\n\nconst LINE_DYNAMIC_THROTTLE_TIME = 17; // 60 FPS\n\nexport class DynamicLineEvents {\n private visible: boolean;\n private firstPoint: LatLng | null = null;\n private secondPoint: LatLng | null = null;\n private lineFeature: any;\n private onMouseMoveThrottled: (event: MapLayerMouseEvent) => void;\n private onStoreEventsDebounced: (event: StoreChangeEvent) => void;\n\n constructor(private readonly ctx: TilesContext) {\n this.visible = true;\n this.onMouseMoveThrottled = throttle(this.onLineMove, LINE_DYNAMIC_THROTTLE_TIME);\n this.onStoreEventsDebounced = debounce(this.onStoreEventsConsumer, 10);\n this.initConsumers();\n this.initDynamicEvents();\n }\n\n private initConsumers() {\n this.ctx.store.addObserver(this.onStoreEventsDebounced);\n this.ctx.mouseEvents.addObserver(this.onMouseEventsConsumer);\n }\n\n public removeConsumers = () => {\n this.ctx.store.removeObserver(this.onStoreEventsDebounced);\n this.ctx.mouseEvents.removeObserver(this.onMouseEventsConsumer);\n };\n\n private onMouseEventsConsumer = (event: MouseEventsChangeEvent) => {\n const { store } = this.ctx;\n if (store.circular.isCircular()) {\n this.hide();\n return;\n }\n\n // this one is needed to turn off the dynamic line when the last point is clicked\n if (event.type === \"lastPointMouseClick\" && event.data) {\n this.hide();\n this.visible = false;\n }\n // this is needed to not trigger \"show\" function if the last point was clicked and we just hover a point or a line\n // doesn't matter, will rewrite this part\n if (!this.visible) return;\n\n // not sure about this, but looks like a good idea to hide the dynamic line on these events\n const HIDE_EVENTS = [\"pointMouseEnter\", \"lineMouseEnter\", \"pointMouseDown\"] as MapMouseEvent[];\n if (HIDE_EVENTS.includes(event.type) && event.data) {\n this.hide();\n }\n\n // if we hid the dynamic line there ^, then we obviously need to show it again\n if (event.type === \"pointMouseLeave\" || event.type === \"lineMouseLeave\") {\n const { store } = this.ctx;\n if (store.circular.isCircular()) return;\n if (event.data) {\n this.firstPoint = store.tail?.val as LatLng;\n this.secondPoint = store.tail?.val as LatLng;\n this.show();\n }\n }\n };\n\n private onStoreEventsConsumer = (event: StoreChangeEvent) => {\n const { store } = this.ctx;\n if (store.circular.isCircular()) {\n this.hide();\n\n return;\n }\n\n if (event.type === \"STORE_CLOSE_GEOMETRY\" || event.type === \"STORE_CLEARED\") {\n this.hide();\n } else if (event.type === \"STORE_BREAK_GEOMETRY\") {\n this.firstPoint = store.tail?.val as LatLng;\n this.secondPoint = event.data?.coords as LatLng;\n this.show();\n this.visible = true;\n } else if (event.type === \"STORE_POINT_ADD\") {\n if (store.size > 0) {\n this.firstPoint = store.tail?.val as LatLng;\n this.secondPoint = store.tail?.val as LatLng;\n this.show();\n this.visible = true;\n }\n }\n };\n\n private initDynamicEvents = () => {\n const { map } = this.ctx;\n map.on(\"click\", this.onMapClick);\n map.on(\"mousemove\", this.onMouseMoveThrottled);\n map.on(EVENTS.REMOVE_ALL, this.hide);\n map.on(EVENTS.UNDO, this.onUndoRedoClick);\n map.on(EVENTS.REDO, this.onUndoRedoClick);\n map.on(EVENTS.RIGHTCLICKREMOVE, this.onRightClickRemove);\n };\n\n public removeEvents = () => {\n const { map } = this.ctx;\n\n map.off(\"click\", this.onMapClick);\n map.off(\"mousemove\", this.onMouseMoveThrottled);\n map.off(EVENTS.REMOVE_ALL, this.hide);\n map.off(EVENTS.UNDO, this.onUndoRedoClick);\n map.off(EVENTS.REDO, this.onUndoRedoClick);\n map.off(EVENTS.RIGHTCLICKREMOVE, this.onRightClickRemove);\n };\n\n public hide = () => {\n const { map } = this.ctx;\n\n this.firstPoint = null;\n this.secondPoint = null;\n this.lineFeature = null;\n map.off(\"mousemove\", this.onMouseMoveThrottled);\n\n const lineSource = map.getSource(ESOURCES.LineDynamicSource) as GeoJSONSource;\n if (lineSource) {\n lineSource.setData(LINE_BASE as GeoJSON.FeatureCollection);\n }\n if (map.getLayer(ELAYERS.LineDynamicLayer)) {\n map.setLayoutProperty(ELAYERS.LineDynamicLayer, \"visibility\", \"none\");\n }\n };\n\n private show = () => {\n const { map, store } = this.ctx;\n\n if (store.size && this.firstPoint?.lat && this.firstPoint.lng && this.secondPoint?.lng && this.secondPoint?.lat) {\n const current = [this.firstPoint.lng, this.firstPoint.lat] as [number, number];\n const next = [this.secondPoint.lng, this.secondPoint.lat] as [number, number];\n\n this.lineFeature = getLine(current, next);\n\n map.setLayoutProperty(ELAYERS.LineDynamicLayer, \"visibility\", \"visible\");\n if (this.secondPoint) {\n this.renderLineOnMouseMove({ lng: this.secondPoint?.lng, lat: this.secondPoint?.lat });\n }\n }\n map.on(\"mousemove\", this.onMouseMoveThrottled);\n };\n\n private renderLineOnMouseMove = (newCoord: LatLng) => {\n if (!this.lineFeature) return;\n const { map } = this.ctx;\n\n this.lineFeature.features[0].geometry.coordinates[1] = [newCoord.lng, newCoord.lat];\n const lineSource = map.getSource(ESOURCES.LineDynamicSource) as GeoJSONSource;\n if (lineSource) {\n lineSource.setData(this.lineFeature);\n }\n };\n\n private onLineMove = (event: MapLayerMouseEvent) => {\n this.renderLineOnMouseMove(event.lngLat);\n };\n\n private onMapClick = (event: MapLayerMouseEvent) => {\n const { mode } = this.ctx;\n const lineClick = isFeatureTriggered(event, [ELAYERS.LineLayerTransparent, ELAYERS.LineLayer]);\n if (lineClick && mode.getBreak()) {\n this.secondPoint = { lng: event.lngLat.lng, lat: event.lngLat.lat };\n }\n\n if (lineClick) return;\n this.hide();\n };\n\n private onUndoRedoClick = (event: UndoEvent) => {\n const { store } = this.ctx;\n\n if (!store.circular.isCircular()) {\n const latLng = event.target.unproject({ x: event.originalEvent.x, y: event.originalEvent.y } as PointLike);\n this.firstPoint = store.tail?.val as LatLng;\n this.secondPoint = { lng: latLng.lng, lat: latLng.lat };\n this.show();\n }\n\n if (store.size === 0) {\n this.hide();\n }\n };\n\n private onRightClickRemove = (event: PointRightClickRemoveEvent) => {\n const { store } = this.ctx;\n if (!store.circular.isCircular()) {\n this.secondPoint = { lng: event.coordinates.lng, lat: event.coordinates.lat };\n this.firstPoint = store.tail?.val as LatLng;\n this.show();\n }\n if (store.size === 0) {\n this.hide();\n }\n };\n}\n","import type { GeoJSONSource, MapLayerMouseEvent } from \"maplibre-gl\";\n\nimport { ELAYERS, ESOURCES } from \"#app/utils/geo_constants\";\nimport { throttle } from \"#app/utils/helpers\";\n\nimport { FireEvents } from \"../fire-events\";\nimport { PointVisibility } from \"../points/helpers\";\nimport { checkIfPointClicked, insertStepIfOnLine, updateUIAfterInsert } from \"./utils\";\nimport { isFeatureTriggered } from \"../utils\";\nimport { TilesContext } from \"#components/map/tiles\";\n\nexport const LINE_TRANSPARENT_THROTTLE_TIME = 17;\n\nexport class TransparentLineEvents {\n private isThrottled: boolean;\n private lastEvent: MapLayerMouseEvent | null;\n\n constructor(private readonly ctx: TilesContext) {\n this.isThrottled = false;\n this.lastEvent = null;\n }\n\n initEvents() {\n this.ctx.map.on(\"click\", ELAYERS.LineLayerTransparent, this.onLineClick);\n this.ctx.map.on(\"mousemove\", ELAYERS.LineLayerTransparent, this.onLineMove);\n this.ctx.map.on(\"mouseenter\", ELAYERS.LineLayerTransparent, this.onLineEnter);\n this.ctx.map.on(\"mouseleave\", ELAYERS.LineLayerTransparent, this.onLineLeave);\n }\n\n removeEvents() {\n this.ctx.map.off(\"click\", ELAYERS.LineLayerTransparent, this.onLineClick);\n this.ctx.map.off(\"mousemove\", ELAYERS.LineLayerTransparent, this.onLineMove);\n this.ctx.map.off(\"mouseenter\", ELAYERS.LineLayerTransparent, this.onLineEnter);\n this.ctx.map.off(\"mouseleave\", ELAYERS.LineLayerTransparent, this.onLineLeave);\n }\n\n private onLineClick = (event: MapLayerMouseEvent) => {\n const { store, map, mode } = this.ctx;\n if (checkIfPointClicked(event)) return;\n const step = insertStepIfOnLine(event, store);\n if (step) {\n updateUIAfterInsert(event, this.ctx);\n FireEvents.addPoint({ ...step, total: store.size }, map, mode);\n }\n };\n\n private processMouseMove = (event: MapLayerMouseEvent) => {\n PointVisibility.setSinglePointVisible(event);\n if (event.target.getLayer(ELAYERS.SinglePointLayer)) {\n const map = event.target;\n const pointSource = map.getSource(ESOURCES.SinglePointSource) as GeoJSONSource;\n if (pointSource) {\n pointSource.setData({\n type: \"Feature\",\n geometry: {\n type: \"Point\",\n coordinates: [event.lngLat.lng, event.lngLat.lat],\n },\n properties: {},\n });\n }\n }\n };\n\n private onLineMove = throttle((event: MapLayerMouseEvent) => {\n if (isFeatureTriggered(event, [ELAYERS.PointsLayer, ELAYERS.FirstPointLayer])) return;\n if (this.ctx.mouseEvents.pointMouseDown || this.ctx.mouseEvents.pointMouseEnter) return;\n\n this.lastEvent = event;\n\n if (this.isThrottled) return;\n\n this.isThrottled = true;\n requestAnimationFrame(() => {\n if (!this.lastEvent) return;\n this.processMouseMove(this.lastEvent);\n this.isThrottled = false;\n });\n }, LINE_TRANSPARENT_THROTTLE_TIME);\n\n private onLineEnter = (event: MapLayerMouseEvent) => {\n if (this.ctx.mouseEvents.pointMouseDown || this.ctx.mouseEvents.pointMouseEnter) return;\n if (isFeatureTriggered(event, [ELAYERS.PointsLayer, ELAYERS.FirstPointLayer])) return;\n\n this.ctx.mouseEvents.lineMouseEnter = true;\n PointVisibility.setSinglePointVisible(event);\n };\n\n private onLineLeave = (event: MapLayerMouseEvent) => {\n if (this.ctx.mouseEvents.pointMouseDown || this.ctx.mouseEvents.pointMouseEnter) return;\n\n this.ctx.mouseEvents.lineMouseLeave = true;\n PointVisibility.setSinglePointHidden(event);\n };\n}\n","import { MOBILE_WIDTH } from \"#app/utils/constants\";\n\nimport type { DrawingModeChangeEvent } from \"../mode/types\";\nimport type { MouseEventsChangeEvent } from \"../mouse-events/types\";\nimport { LineBreakEvents } from \"./break-line\";\nimport { DynamicLineEvents } from \"./dynamic-line\";\nimport { TransparentLineEvents } from \"./transparent-line\";\nimport type { TilesContext } from \"../tiles\";\n\nexport class LineEvents {\n private break: LineBreakEvents;\n private transparent: TransparentLineEvents | null;\n private dynamic: DynamicLineEvents | null;\n private type: \"default\" | \"break\";\n\n constructor(private readonly ctx: TilesContext) {\n this.break = new LineBreakEvents(ctx);\n this.transparent = ctx.options.pointGeneration === \"manual\" ? new TransparentLineEvents(ctx) : null;\n this.dynamic = null;\n this.type = \"default\";\n }\n\n init() {\n this.initDynamicLine();\n this.initEvents();\n this.initConsumers();\n }\n\n private initDynamicLine = () => {\n if (window.innerWidth <= MOBILE_WIDTH) return;\n if (this.ctx.options.dynamicLine) {\n this.dynamic = new DynamicLineEvents(this.ctx);\n }\n };\n\n private initEvents() {\n const notBreakMode = !this.ctx.mode.getBreak();\n if (notBreakMode) {\n this.transparent?.initEvents();\n }\n }\n\n private initConsumers() {\n this.ctx.mode.addObserver(this.mapModeConsumer);\n this.ctx.mouseEvents.addObserver(this.mouseEventsConsumer);\n }\n\n remove() {\n this.removeConsumers();\n this.removeEvents();\n }\n\n private removeConsumers() {\n this.ctx.mode.removeObserver(this.mapModeConsumer);\n this.ctx.mouseEvents.removeObserver(this.mouseEventsConsumer);\n if (this.ctx.options.dynamicLine) {\n this.dynamic?.removeConsumers();\n }\n }\n\n private removeEvents() {\n this.break.removeBreakEvents();\n this.transparent?.removeEvents();\n if (this.ctx.options.dynamicLine) {\n this.dynamic?.removeEvents();\n this.dynamic?.hide();\n }\n }\n\n private mouseEventsConsumer = (event: MouseEventsChangeEvent) => {\n const { type, data } = event;\n const { mode } = this.ctx;\n if (!data || !mode.getBreak()) return;\n\n switch (type) {\n case \"pointMouseDown\":\n this.break.removeBreakEvents();\n this.break.hideBreakLine();\n break;\n case \"pointMouseUp\":\n this.break.initBreakEvents();\n break;\n default:\n break;\n }\n };\n\n private mapModeConsumer = (event: DrawingModeChangeEvent) => {\n const { type, data } = event;\n\n if (type === \"MODE_CHANGED\") {\n if (this.type === \"break\") {\n this.break.removeBreakEvents();\n this.transparent?.initEvents();\n this.type = \"default\";\n }\n }\n\n if (type === \"BREAK_CHANGED\" && data) {\n if (this.type === \"default\") {\n this.transparent?.removeEvents();\n this.break.initBreakEvents();\n this.type = \"break\";\n }\n }\n };\n}\n","import type { UnifiedMap } from \"#app/types/map\";\n\nimport { ELAYERS, FIRST_POINT_COLOR, FIRST_POINT_RADIUS, generateLayers } from \"#app/utils/geo_constants\";\nimport type { RequiredDrawOptions } from \"#app/types/index\";\n\nconst firstPointCircleRadius = (map: UnifiedMap) => {\n map.setPaintProperty(ELAYERS.FirstPointLayer, \"circle-radius\", FIRST_POINT_RADIUS.large);\n map.setPaintProperty(ELAYERS.FirstPointLayer, \"circle-stroke-color\", FIRST_POINT_COLOR.large);\n};\n\nconst defaultPointCircleRadius = (map: UnifiedMap) => {\n map.setPaintProperty(ELAYERS.FirstPointLayer, \"circle-radius\", FIRST_POINT_RADIUS.default);\n map.setPaintProperty(ELAYERS.FirstPointLayer, \"circle-stroke-color\", FIRST_POINT_COLOR.default);\n};\n\nexport const togglePointCircleRadius = (map: UnifiedMap, type: keyof typeof FIRST_POINT_RADIUS) => {\n if (type === \"large\") {\n firstPointCircleRadius(map);\n } else {\n defaultPointCircleRadius(map);\n }\n};\n\nexport const removeTransparentLine = (map: UnifiedMap) => {\n if (map.getLayer(ELAYERS.LineLayerTransparent)) {\n map.removeLayer(ELAYERS.LineLayerTransparent);\n }\n};\n\nexport const addTransparentLine = (map: UnifiedMap, options: RequiredDrawOptions) => {\n if (map.getLayer(ELAYERS.LineLayerTransparent)) return;\n const LAYERS_TO_RENDER = generateLayers(options);\n const transparentLayer = LAYERS_TO_RENDER.find((layer) => layer.id === ELAYERS.LineLayerTransparent);\n if (transparentLayer) {\n map.addLayer(transparentLayer);\n }\n};\n","import type { ListNode, Store } from \"#app/store\";\nimport type { StoreChangeEventKeys } from \"#app/store/types\";\nimport type { RequiredDrawOptions, Step, StepId } from \"#app/types\";\nimport type { DrawingMode } from \"#components/map/mode\";\nimport type { Command } from \"#app/history/command\";\n\nimport { PointHelpers } from \"../helpers\";\n\nexport class CloseGeometryCommand implements Command {\n type: StoreChangeEventKeys = \"STORE_CLOSE_GEOMETRY\";\n auxPointSnapshot: ListNode | null = null;\n\n constructor(\n private readonly store: Store,\n private readonly mode: DrawingMode,\n private readonly options: RequiredDrawOptions,\n ) {\n this.type = \"STORE_CLOSE_GEOMETRY\";\n }\n\n private restoreAuxPoint = () => {\n if (this.auxPointSnapshot?.val) {\n this.store.head!.prev = this.auxPointSnapshot;\n this.store.tail!.next = this.auxPointSnapshot;\n this.auxPointSnapshot.prev = this.store.tail;\n this.auxPointSnapshot.next = this.store.head;\n this.store.tail = this.auxPointSnapshot;\n this.store.map.set(this.auxPointSnapshot.val.id, this.auxPointSnapshot);\n this.store.size++;\n this.store.pingConsumers();\n }\n };\n\n public execute = () => {\n // adding aux point as the tail before closing the geometry\n if (this.options.pointGeneration === \"auto\" && this.store.tail?.val) {\n if (this.auxPointSnapshot) {\n this.restoreAuxPoint();\n } else {\n const auxPoint = PointHelpers.createAuxiliaryPoint(this.store.tail?.val, this.store.head?.val as Step);\n this.auxPointSnapshot = this.store.push(auxPoint);\n }\n }\n this.store.circular.close();\n this.mode.setClosedGeometry(true);\n this.store.notify({ type: this.type });\n };\n\n public undo = () => {\n if (this.options.pointGeneration === \"auto\") {\n this.store.removeNodeById(this.store.tail?.val?.id as StepId);\n }\n if (this.store.tail?.val && this.store.head?.val) {\n this.store.tail.next = null;\n this.store.head.prev = null;\n }\n this.mode.setClosedGeometry(false);\n this.store.notify({ type: \"STORE_BREAK_GEOMETRY\" });\n };\n}\n","import type { MapLayerMouseEvent } from \"maplibre-gl\";\n\nimport { ELAYERS } from \"#app/utils/geo_constants\";\nimport { Tooltip } from \"#components/tooltip\";\nimport { togglePointCircleRadius } from \"#components/map/tiles/utils\";\nimport type { StoreChangeEvent, StoreChangeEventKeys } from \"#app/store/types\";\nimport { timeline } from \"#app/history\";\n\nimport type { DrawingModeChangeEvent } from \"../mode/types\";\nimport { PointsFilter, PointVisibility } from \"./helpers\";\nimport type { PrimaryPointEvents } from \".\";\nimport { CloseGeometryCommand } from \"./commands/close-geometry\";\nimport type { TilesContext } from \"../tiles\";\nimport { renderer } from \"../renderer\";\n\nexport class FirstPoint {\n #mouseDown: boolean;\n #tooltip: Tooltip;\n\n constructor(\n private readonly ctx: TilesContext,\n private readonly baseEvents: PrimaryPointEvents,\n ) {\n this.#mouseDown = false;\n this.#tooltip = new Tooltip();\n\n this.initLayer();\n this.initEvents();\n }\n\n private initConsumers = () => {\n const { mode, store } = this.ctx;\n mode.addObserver(this.onMapModeChanggeConsumer);\n store.addObserver(this.onStoreChangeConsumer);\n };\n\n private removeConsumers = () => {\n const { mode, store } = this.ctx;\n mode.removeObserver(this.onMapModeChanggeConsumer);\n store.removeObserver(this.onStoreChangeConsumer);\n };\n\n public initLayer() {\n const { map } = this.ctx;\n if (map.getLayer(ELAYERS.FirstPointLayer)) {\n map.setLayoutProperty(ELAYERS.FirstPointLayer, \"visibility\", \"visible\");\n }\n }\n\n private initBaseEvents = () => {\n const { map } = this.ctx;\n\n map.on(\"mouseenter\", ELAYERS.FirstPointLayer, this.baseEvents.onPointMouseEnter);\n map.on(\"mouseleave\", ELAYERS.FirstPointLayer, this.baseEvents.onPointMouseLeave);\n map.on(\"mousedown\", ELAYERS.FirstPointLayer, this.baseEvents.onPointMouseDown);\n map.on(\"mouseup\", ELAYERS.FirstPointLayer, this.baseEvents.onPointMouseUp);\n map.on(\"touchend\", ELAYERS.FirstPointLayer, this.baseEvents.onPointMouseUp);\n map.on(\"touchstart\", ELAYERS.FirstPointLayer, this.baseEvents.onPointMouseDown);\n };\n\n private initEvents() {\n const { map } = this.ctx;\n\n map.on(\"click\", ELAYERS.FirstPointLayer, this.onFirstPointClick);\n map.on(\"mouseenter\", ELAYERS.FirstPointLayer, this.onFirstPointMouseEnter);\n map.on(\"mouseleave\", ELAYERS.FirstPointLayer, this.onFirstPointMouseLeave);\n map.on(\"mouseup\", ELAYERS.FirstPointLayer, this.onFirstPointMouseUp);\n map.on(\"mousedown\", ELAYERS.FirstPointLayer, this.onFirstPointMouseDown);\n this.initBaseEvents();\n this.initConsumers();\n }\n\n private removeBaseEvents = () => {\n const { map } = this.ctx;\n\n map.off(\"mouseenter\", ELAYERS.FirstPointLayer, this.baseEvents.onPointMouseEnter);\n map.off(\"mouseleave\", ELAYERS.FirstPointLayer, this.baseEvents.onPointMouseLeave);\n map.off(\"mousedown\", ELAYERS.FirstPointLayer, this.baseEvents.onPointMouseDown);\n map.off(\"mouseup\", ELAYERS.FirstPointLayer, this.baseEvents.onPointMouseUp);\n map.off(\"touchend\", ELAYERS.FirstPointLayer, this.baseEvents.onPointMouseUp);\n map.off(\"touchstart\", ELAYERS.FirstPointLayer, this.baseEvents.onPointMouseDown);\n };\n\n public removeEvents() {\n const { map } = this.ctx;\n\n map.off(\"click\", ELAYERS.FirstPointLayer, this.onFirstPointClick);\n map.off(\"mouseenter\", ELAYERS.FirstPointLayer, this.onFirstPointMouseEnter);\n map.off(\"mouseleave\", ELAYERS.FirstPointLayer, this.onFirstPointMouseLeave);\n map.off(\"mouseup\", ELAYERS.FirstPointLayer, this.onFirstPointMouseUp);\n this.removeBaseEvents();\n this.removeConsumers();\n }\n\n private onMapModeChanggeConsumer = (event: DrawingModeChangeEvent) => {\n const { map, options } = this.ctx;\n const { type, data } = event;\n\n if (type === \"MODE_CHANGED\") {\n if (data === \"line\" && !options.modes.line.closeGeometry) {\n PointVisibility.setFirstPointHidden(map);\n PointsFilter.closedGeometry(map);\n } else {\n PointVisibility.setFirstPointVisible(map);\n PointsFilter.default(map);\n }\n }\n };\n\n private onStoreChangeConsumer = (event: StoreChangeEvent) => {\n const { map, store } = this.ctx;\n const { type } = event;\n\n const events = [\n \"STORE_MUTATED\",\n \"STORE_POINT_INSERTED\",\n \"STORE_CLOSE_GEOMETRY\",\n \"STORE_BREAK_GEOMETRY\",\n \"STORE_CLEARED\",\n ] as StoreChangeEventKeys[];\n if (events.includes(type)) {\n if (store.circular.canClose()) {\n togglePointCircleRadius(map, \"large\");\n } else {\n togglePointCircleRadius(map, \"default\");\n }\n }\n };\n\n private onFirstPointClick = () => {\n const { store, mode, options } = this.ctx;\n\n if (store.circular.canClose()) {\n timeline.commit(new CloseGeometryCommand(store, mode, options));\n\n renderer.execute();\n }\n };\n\n private onFirstPointMouseDown = () => {\n this.#mouseDown = true;\n this.#tooltip.remove();\n };\n\n private onFirstPointMouseUp = () => {\n this.#mouseDown = false;\n };\n\n private onFirstPointMouseLeave = () => {\n const { mouseEvents } = this.ctx;\n\n if (this.#mouseDown) return;\n\n mouseEvents.firstPointMouseLeave = true;\n this.#tooltip.remove();\n };\n\n private getTitle = () => {\n const { mode, options } = this.ctx;\n\n if (mode.getMode() === \"line\" && options.modes.line.closeGeometry) {\n return options.locale.closeLine;\n }\n\n if (mode.getMode() === \"polygon\") {\n return options.locale.createPolygon;\n }\n\n return \"\";\n };\n\n private onFirstPointMouseEnter = (event: MapLayerMouseEvent) => {\n const { mode, mouseEvents, store } = this.ctx;\n mouseEvents.firstPointMouseEnter = true;\n if (mode.getClosedGeometry() || this.#mouseDown) return;\n if (store.circular.canClose()) {\n const { x, y } = event.originalEvent;\n if (x && y) {\n const Y_OFFSET = 14;\n\n this.#tooltip.create({ label: this.getTitle(), placement: \"bottom\" });\n\n const X_OFFSET = this.#tooltip.label ? this.#tooltip.label.clientWidth / 2 : 0;\n this.#tooltip.setPosition({ x: x - X_OFFSET, y: y + Y_OFFSET });\n }\n }\n };\n}\n","import type { ListNode, Store } from \"#app/store\";\nimport type { StoreChangeEventKeys } from \"#app/store/types\";\nimport type { Step } from \"#app/types\";\nimport type { Command } from \"#app/history/command\";\nimport { PointHelpers } from \"../helpers\";\n\ninterface Snapshot {\n clickedNode: ListNode;\n prevPrimaryNode: ListNode | null;\n nextPrimaryNode: ListNode | null;\n prevAuxNode: ListNode | null;\n nextAuxNode: ListNode | null;\n}\n\nexport class AuxToPrimaryCommand implements Command {\n type: StoreChangeEventKeys = \"STORE_AUX_TO_PRIMARY\";\n snapshot: Snapshot | null = null;\n constructor(\n private readonly store: Store,\n private readonly clickedNode: ListNode,\n ) {\n this.snapshot = this.makeSnapshot(this.clickedNode);\n }\n\n private makeSnapshot(clickedNode: ListNode): Snapshot {\n const prevPrimaryNode = clickedNode.prev;\n const nextPrimaryNode = clickedNode.next;\n const prevAuxNode = null;\n const nextAuxNode = null;\n\n return {\n clickedNode,\n prevPrimaryNode,\n nextPrimaryNode,\n prevAuxNode,\n nextAuxNode,\n };\n }\n\n private restorePreviousAux = (clickedNode: ListNode) => {\n if (!this.snapshot) return;\n let { prevPrimaryNode, prevAuxNode } = this.snapshot;\n\n if (prevPrimaryNode) prevPrimaryNode.next = prevAuxNode;\n if (prevAuxNode) prevAuxNode.prev = prevPrimaryNode;\n clickedNode.prev = prevAuxNode;\n if (prevAuxNode) prevAuxNode.next = clickedNode;\n\n if (prevAuxNode?.val?.id && !this.store.map.has(prevAuxNode.val.id)) {\n this.store.map.set(prevAuxNode?.val?.id, prevAuxNode);\n this.store.size++;\n }\n };\n\n private restoreNextAux = (clickedNode: ListNode) => {\n if (!this.snapshot) return;\n let { nextPrimaryNode, nextAuxNode } = this.snapshot;\n\n clickedNode.next = nextAuxNode;\n if (nextAuxNode) {\n nextAuxNode.prev = clickedNode;\n nextAuxNode.next = nextPrimaryNode;\n }\n if (nextPrimaryNode) {\n nextPrimaryNode.prev = nextAuxNode;\n }\n\n const wasDraggingLastPoint = clickedNode.next?.next === this.store.head;\n if (wasDraggingLastPoint) {\n const lastAuxNode = clickedNode.next;\n this.store.tail = lastAuxNode;\n if (this.store.head) {\n this.store.head.prev = lastAuxNode;\n }\n if (this.store.tail) {\n this.store.tail.next = this.store.head;\n }\n }\n\n if (nextAuxNode?.val?.id) {\n this.store.map.set(nextAuxNode.val?.id, nextAuxNode);\n this.store.size++;\n }\n };\n\n private addTwoAuxiliaryPoints = (clickedNode: ListNode) => {\n if (!this.snapshot) return;\n let { nextPrimaryNode, prevPrimaryNode } = this.snapshot;\n\n if (prevPrimaryNode) {\n if (this.snapshot.prevAuxNode) {\n this.restorePreviousAux(clickedNode);\n } else {\n const prevAuxPoint = PointHelpers.createAuxiliaryPoint(prevPrimaryNode.val as Step, clickedNode.val as Step);\n this.snapshot.prevAuxNode = this.store.insertAfter(prevPrimaryNode, prevAuxPoint);\n }\n }\n\n if (nextPrimaryNode) {\n if (this.snapshot.nextAuxNode) {\n this.restoreNextAux(clickedNode);\n } else {\n const nextAuxPoint = PointHelpers.createAuxiliaryPoint(clickedNode.val as Step, nextPrimaryNode.val as Step);\n this.snapshot.nextAuxNode = this.store.insertAfter(clickedNode, nextAuxPoint);\n }\n }\n };\n\n public execute = () => {\n if (!this.snapshot) return;\n const { clickedNode } = this.snapshot;\n\n if (clickedNode && clickedNode.val) {\n clickedNode.val.isAuxiliary = false;\n this.addTwoAuxiliaryPoints(clickedNode);\n }\n };\n\n private removeTwoAuxiliaryPoints = (clickedNode: ListNode | null) => {\n if (!clickedNode || !this.snapshot) return;\n const { prevAuxNode, nextAuxNode } = this.snapshot;\n\n if (prevAuxNode?.val?.isAuxiliary) {\n this.store.removeNodeById(prevAuxNode.val?.id);\n }\n if (nextAuxNode?.val?.isAuxiliary) {\n this.store.removeNodeById(nextAuxNode?.val.id);\n }\n };\n\n public undo = () => {\n if (!this.snapshot) return;\n const { clickedNode } = this.snapshot;\n if (clickedNode && clickedNode.val) {\n clickedNode.val.isAuxiliary = true;\n this.removeTwoAuxiliaryPoints(clickedNode);\n }\n };\n}\n","import { ListNode, Store } from \"#app/store\";\nimport type { StoreChangeEventKeys } from \"#app/store/types\";\nimport type { LatLng } from \"#app/types\";\nimport { UnifiedMap } from \"#app/types/map\";\nimport { FireEvents } from \"#components/map/fire-events\";\nimport type { Command } from \"#app/history/command\";\nimport { PointHelpers } from \"../helpers\";\n\nexport class MovePointCommand implements Command {\n type: StoreChangeEventKeys = \"STORE_POINT_MOVED\";\n end: LatLng;\n constructor(\n private readonly store: Store,\n private readonly selectedNode: ListNode,\n private readonly start: LatLng,\n private readonly map: UnifiedMap,\n ) {\n this.end = { lat: selectedNode.val!.lat, lng: selectedNode.val!.lng };\n }\n\n private updateNeighbors = (node: ListNode) => {\n const prevAux = node.prev;\n const nextAux = node.next;\n // pretty much a check for the pointGeneration === \"auto\"\n if (!prevAux?.val?.isAuxiliary && !nextAux?.val?.isAuxiliary) return;\n\n const prevPrimary = node.prev?.prev;\n const nextPrimary = node.next?.next;\n\n if (prevPrimary?.val && this.selectedNode?.val && prevAux) {\n const midPoint = PointHelpers.getMidpoint(this.selectedNode?.val, prevPrimary?.val);\n if (prevAux.val) {\n prevAux.val.lat = midPoint.lat;\n prevAux.val.lng = midPoint.lng;\n }\n }\n\n if (nextPrimary?.val && this.selectedNode?.val && nextAux) {\n const midPoint = PointHelpers.getMidpoint(this.selectedNode?.val, nextPrimary?.val);\n if (nextAux.val) {\n nextAux.val.lat = midPoint.lat;\n nextAux.val.lng = midPoint.lng;\n }\n }\n };\n\n public execute = () => {\n if (!this.selectedNode.val) return;\n const point = this.store.findStepById(this.selectedNode.val?.id);\n if (point) {\n point.lat = this.end.lat;\n point.lng = this.end.lng;\n this.updateNeighbors(this.selectedNode);\n\n this.store.notify({\n type: \"STORE_MUTATED\",\n data: this.store,\n });\n FireEvents.movePoint(\n {\n id: this.selectedNode.val.id,\n total: this.store.size,\n end: { lat: this.selectedNode.val.lat, lng: this.selectedNode.val.lng },\n start: this.start as LatLng,\n },\n this.map,\n );\n }\n };\n\n public undo = () => {\n if (!this.selectedNode.val) return;\n const point = this.store.findStepById(this.selectedNode.val?.id);\n if (point) {\n point.lat = this.start.lat;\n point.lng = this.start.lng;\n this.updateNeighbors(this.selectedNode);\n\n this.store.notify({\n type: \"STORE_MUTATED\",\n data: this.store,\n });\n FireEvents.movePoint(\n {\n id: this.selectedNode.val.id,\n total: this.store.size,\n end: this.start,\n start: this.end,\n },\n this.map,\n );\n }\n };\n}\n","import type { MapLayerMouseEvent, MapTouchEvent } from \"maplibre-gl\";\n\nimport type { LatLng } from \"#app/types/index\";\nimport { ELAYERS } from \"#app/utils/geo_constants\";\nimport { timeline } from \"#app/history\";\nimport { AuxToPrimaryCommand } from \"./commands/aux-to-primary\";\n\nimport { addTransparentLine } from \"../tiles/utils\";\nimport type { PrimaryPointEvents } from \".\";\nimport { MovePointCommand } from \"./commands/move-point\";\nimport type { PointState } from \"./point-state\";\nimport type { PointTopologyManager } from \"./point-topology-manager\";\nimport { renderer } from \"../renderer\";\nimport { isRightClick, queryPointId } from \"../utils\";\nimport { TilesContext } from \"../tiles\";\n\nexport class AuxPoints {\n constructor(\n private readonly ctx: TilesContext,\n private readonly baseEvents: PrimaryPointEvents,\n private readonly pointState: PointState,\n private readonly topologyManager: PointTopologyManager,\n ) {\n this.initEvents();\n }\n\n private initBaseEvents = () => {\n const { map } = this.ctx;\n\n map.on(\"mouseenter\", ELAYERS.AuxiliaryPointLayer, this.baseEvents.onPointMouseEnter);\n map.on(\"mouseleave\", ELAYERS.AuxiliaryPointLayer, this.baseEvents.onPointMouseLeave);\n map.on(\"mousedown\", ELAYERS.AuxiliaryPointLayer, this.baseEvents.onPointMouseDown);\n map.on(\"mouseup\", ELAYERS.PointsLayer, this.onMouseUp);\n map.on(\"touchend\", ELAYERS.PointsLayer, this.onMouseUp);\n map.on(\"touchstart\", ELAYERS.AuxiliaryPointLayer, this.baseEvents.onPointMouseDown);\n };\n\n private removeBaseEvents = () => {\n const { map } = this.ctx;\n\n map.off(\"mouseenter\", ELAYERS.AuxiliaryPointLayer, this.baseEvents.onPointMouseEnter);\n map.off(\"mouseleave\", ELAYERS.AuxiliaryPointLayer, this.baseEvents.onPointMouseLeave);\n map.off(\"mousedown\", ELAYERS.AuxiliaryPointLayer, this.baseEvents.onPointMouseDown);\n map.off(\"mouseup\", ELAYERS.PointsLayer, this.onMouseUp);\n map.off(\"touchend\", ELAYERS.PointsLayer, this.onMouseUp);\n map.off(\"touchstart\", ELAYERS.AuxiliaryPointLayer, this.baseEvents.onPointMouseDown);\n };\n\n private initEvents() {\n const { map } = this.ctx;\n\n map.on(\"mousedown\", ELAYERS.AuxiliaryPointLayer, this.onMouseDown);\n map.on(\"touchstart\", ELAYERS.AuxiliaryPointLayer, this.onMouseDown);\n // PointsLayer becasue aux is already false\n this.initBaseEvents();\n }\n\n public removeEvents() {\n const { map } = this.ctx;\n map.off(\"mousedown\", ELAYERS.AuxiliaryPointLayer, this.onMouseDown);\n map.off(\"touchstart\", ELAYERS.AuxiliaryPointLayer, this.onMouseDown);\n\n this.removeBaseEvents();\n }\n\n private onMouseDown = (event: MapLayerMouseEvent | MapTouchEvent) => {\n const { store, map } = this.ctx;\n\n if (isRightClick(event)) return;\n\n const id = queryPointId(map, event.point);\n const node = store.findNodeById(id);\n\n if (node) {\n timeline.beginTransaction(\"PointCompound\");\n timeline.commit(new AuxToPrimaryCommand(store, node));\n renderer.execute();\n }\n };\n\n private onMouseUp = () => {\n const { mouseEvents, store, panel, map, options } = this.ctx;\n\n mouseEvents.pointMouseUp = true;\n\n const selectedNode = this.pointState.getSelectedNode();\n const lastEvent = this.pointState.getLastEvent();\n const startCoordinates = this.pointState.getStartCoordinates();\n\n if (selectedNode && selectedNode.val) {\n if (lastEvent) {\n this.topologyManager.updateStore();\n this.pointState.clearLastEvent();\n }\n\n panel?.show();\n if (this.pointState.isMoved()) {\n timeline.commit(new MovePointCommand(store, selectedNode, startCoordinates as LatLng, map));\n timeline.commitTransaction();\n }\n this.pointState.partialReset();\n }\n\n if (mouseEvents) {\n mouseEvents.pointMouseDown = false;\n }\n\n addTransparentLine(map, options);\n };\n}\n","import { ListNode } from \"#app/store/index\";\nimport { LatLng, Step } from \"#app/types/index\";\nimport { MapLayerMouseEvent } from \"maplibre-gl\";\n\nexport class PointState {\n private selectedNode: ListNode | null = null;\n private selectedIdx: number | null = null;\n private startCoordinates: LatLng | null = null;\n private enteredStep: Step | null = null;\n private lastEvent: MapLayerMouseEvent | null = null;\n private moved: boolean = false;\n\n public getSelectedNode(): ListNode | null {\n return this.selectedNode;\n }\n\n public isMoved(): boolean {\n return this.moved;\n }\n\n public getSelectedIdx(): number | null {\n return this.selectedIdx;\n }\n\n public getStartCoordinates(): LatLng | null {\n return this.startCoordinates;\n }\n\n public getEnteredStep(): Step | null {\n return this.enteredStep;\n }\n\n public getLastEvent(): MapLayerMouseEvent | null {\n return this.lastEvent;\n }\n\n public setSelectedNode(node: ListNode | null): void {\n this.selectedNode = node;\n }\n\n public setSelectedIdx(idx: number | null): void {\n this.selectedIdx = idx;\n }\n\n public setStartCoordinates(coordinates: LatLng | null): void {\n this.startCoordinates = coordinates;\n }\n\n public setEnteredStep(step: Step | null): void {\n this.enteredStep = step;\n }\n\n public setLastEvent(event: MapLayerMouseEvent | null): void {\n this.lastEvent = event;\n }\n\n public setMoved(moved: boolean): void {\n this.moved = moved;\n }\n\n public clearLastEvent(): void {\n this.lastEvent = null;\n }\n\n public reset(): void {\n this.selectedNode = null;\n this.selectedIdx = null;\n this.startCoordinates = null;\n this.enteredStep = null;\n this.lastEvent = null;\n }\n\n public partialReset(): void {\n this.selectedNode = null;\n this.selectedIdx = null;\n this.startCoordinates = null;\n this.lastEvent = null;\n this.moved = false;\n }\n}\n","import type { Command } from \"#app/history/command\";\nimport { ListNode, Store } from \"#app/store\";\nimport type { StoreChangeEventKeys } from \"#app/store/types\";\nimport type { LatLng, RequiredDrawOptions, Step } from \"#app/types\";\nimport { uuidv4 } from \"#app/utils/helpers\";\nimport { PointHelpers } from \"../helpers\";\n\ninterface Snapshot {\n addedNode: ListNode | null;\n auxNode: ListNode | null;\n}\n\nexport class AddPointCommand implements Command {\n type: StoreChangeEventKeys = \"STORE_MUTATED\";\n snapshot: Snapshot = {\n addedNode: null,\n auxNode: null,\n };\n private readonly step: Step;\n\n constructor(\n private readonly store: Store,\n private readonly options: RequiredDrawOptions,\n coord: LatLng,\n ) {\n this.step = { id: uuidv4(), isAuxiliary: false, ...coord };\n }\n\n private restoreAddedNode = (addedNode: ListNode) => {\n if (addedNode.prev) {\n addedNode.prev.next = addedNode;\n } else {\n this.store.head = addedNode;\n }\n\n if (addedNode.next) {\n addedNode.next.prev = addedNode;\n } else {\n this.store.tail = addedNode;\n }\n\n this.snapshot.addedNode = addedNode;\n\n if (addedNode.val) {\n this.store.map.set(addedNode.val.id, addedNode);\n this.store.size++;\n this.store.pingConsumers();\n }\n };\n\n private restoreAuxNode = (auxNode: ListNode) => {\n if (auxNode.prev) {\n auxNode.prev.next = auxNode;\n } else {\n this.store.head = auxNode;\n }\n\n if (auxNode.next) {\n auxNode.next.prev = auxNode;\n } else {\n this.store.tail = auxNode;\n }\n\n this.snapshot.auxNode = auxNode;\n\n if (auxNode.val) {\n this.store.map.set(auxNode.val.id, auxNode);\n this.store.size++;\n this.store.pingConsumers();\n }\n };\n\n public execute = () => {\n if (this.snapshot.addedNode) {\n this.restoreAddedNode(this.snapshot.addedNode);\n } else {\n this.snapshot.addedNode = this.store.push(this.step);\n }\n\n // if pointGeneration is \"auto\" then we add an auxPoint\n if (this.options.pointGeneration === \"auto\" && this.store.tail?.prev?.val) {\n if (this.snapshot?.auxNode?.val) {\n this.restoreAuxNode(this.snapshot.auxNode);\n } else {\n const auxPoint = PointHelpers.createAuxiliaryPoint(this.store.tail?.val as Step, this.store.tail?.prev?.val);\n this.snapshot.auxNode = this.store.insertAfter(this.store.tail.prev, auxPoint);\n }\n }\n\n this.store.notify({\n type: \"STORE_POINT_ADD\",\n });\n };\n\n public undo = () => {\n this.store.removeNodeById(this.step.id);\n\n if (this.options.pointGeneration === \"auto\" && this?.snapshot.auxNode?.val) {\n this.store.removeNodeById(this?.snapshot.auxNode.val.id);\n }\n };\n\n public getStep = () => {\n return this.step;\n };\n}\n","import type { Command } from \"#app/history/command\";\nimport type { ListNode } from \"#app/store\";\nimport type { StoreChangeEventKeys } from \"#app/store/types\";\nimport type { Step, StepId } from \"#app/types\";\nimport { FireEvents } from \"#components/map/fire-events\";\nimport { TilesContext } from \"#components/map/tiles\";\nimport type { RemoveCommanContext } from \".\";\nimport { PointHelpers } from \"../../helpers\";\n\ninterface RemovedPointSnapshot {\n removedNode: ListNode;\n wasCircular: boolean;\n wasRemovedHead: boolean;\n wasRemovedTail: boolean;\n beforePrimary: ListNode | null;\n afterPrimary: ListNode | null;\n beforeAux: ListNode | null;\n afterAux: ListNode | null;\n newAux: ListNode | null;\n}\n\nexport class RemovePointAutoCommand implements Command {\n type: StoreChangeEventKeys = \"STORE_INBETWEEN_POINT_REMOVED\";\n // when we execute(remove) we need to create a new aux point in the place of the removed primary point and its aux points\n snapshot: RemovedPointSnapshot | null = null;\n\n constructor(private readonly ctx: RemoveCommanContext) {}\n\n private makeSnapshot(clickedNode: ListNode): RemovedPointSnapshot {\n const { store, nodeId } = this.ctx;\n const wasCircular = store.circular.isCircular();\n const wasRemovedHead = store.head?.val?.id === nodeId;\n const tail = wasCircular ? store.tail?.prev : store.tail;\n const wasRemovedTail = tail?.val?.id === nodeId;\n\n const auxBefore = clickedNode.prev;\n const auxAfter = clickedNode.next;\n const beforePrimary = clickedNode.prev?.prev ?? null;\n const afterPrimary = clickedNode.next?.next ?? null;\n\n return {\n removedNode: clickedNode,\n wasCircular,\n wasRemovedHead,\n wasRemovedTail,\n beforePrimary,\n afterPrimary,\n beforeAux: auxBefore,\n afterAux: auxAfter,\n newAux: null,\n };\n }\n\n public restoreNodeAfter = (after: ListNode, restoredNode: ListNode) => {\n if (!after || !restoredNode || !restoredNode.val) return;\n\n restoredNode.prev = after;\n restoredNode.next = after.next;\n\n if (after.next) {\n after.next.prev = restoredNode;\n }\n\n after.next = restoredNode;\n\n if (!this.ctx.store.map.has(restoredNode.val.id)) {\n this.ctx.store.map.set(restoredNode.val.id, restoredNode);\n this.ctx.store.size++;\n this.ctx.store.pingConsumers();\n }\n };\n\n private recalculateInBetweenRemoved(clickedNode: ListNode | null): void {\n if (!clickedNode || !this.snapshot) return;\n\n const { store } = this.ctx;\n const auxBefore = clickedNode.prev;\n const auxAfter = clickedNode.next;\n const primaryBefore = auxBefore?.prev;\n const primaryAfter = auxAfter?.next;\n\n if (auxBefore?.val?.isAuxiliary) {\n store.removeNodeById(auxBefore.val.id);\n }\n\n if (auxAfter?.val?.isAuxiliary) {\n store.removeNodeById(auxAfter.val.id);\n }\n\n // 5(in a circular and only 3 in a linear) is the minimum number of points needed to add an aux point after removal\n // head -> aux -> primary -> aux -> tail;\n // ^\n // removed\n // head -> aux -> tail;\n // ^ this needs to be added\n const meetsAuxInsertionThreshold = store.circular.isCircular() ? store.size >= 5 : store.size >= 3;\n if (primaryBefore?.val && primaryAfter?.val && meetsAuxInsertionThreshold) {\n // if we have already undo/redoed then we just insert the new aux point already created\n if (this.snapshot.newAux) {\n this.restoreNodeAfter(primaryBefore, this.snapshot.newAux);\n } else {\n const auxPoint = PointHelpers.createAuxiliaryPoint(primaryBefore.val, primaryAfter.val);\n this.snapshot.newAux = store.insertAfter(primaryBefore, auxPoint);\n }\n }\n }\n\n private breakGeometryIfNeeded = (ctx: Pick<TilesContext, \"store\" | \"options\">): boolean => {\n const { store } = ctx;\n\n if (store.circular.canBreak() && store.circular.isCircular()) {\n // if the last point is the aux one(we remove the middle point) then we need to\n // remove the aux point and just add a new one between the head and the tail\n if (store.tail?.val?.isAuxiliary) {\n const oldAuxPoint = store.tail;\n store.removeNodeById(store.tail.val.id);\n store.tail = oldAuxPoint?.prev as ListNode;\n const auxPoint = PointHelpers.createAuxiliaryPoint(store.tail?.val as Step, store.head?.val as Step);\n if (this.snapshot) this.snapshot.newAux = store.insertAfter(store.head as ListNode, auxPoint);\n }\n\n if (store.head) {\n store.head.prev = null;\n }\n if (store.tail) {\n store.tail.next = null;\n }\n\n return true;\n }\n return false;\n };\n\n public execute = () => {\n const clickedNode = this.ctx.store.findNodeById(this.ctx.nodeId);\n const isAuxiliary = clickedNode?.val?.isAuxiliary;\n if (!clickedNode || isAuxiliary) return;\n\n this.snapshot = this.makeSnapshot(clickedNode);\n this.recalculateInBetweenRemoved(clickedNode);\n // remove the primary node\n this.ctx.store.removeNodeById(this.ctx.nodeId);\n\n const ok = this.breakGeometryIfNeeded(this.ctx);\n if (ok) {\n this.ctx.mode.reset();\n }\n\n FireEvents.pointRemoveRightClick({ ...(clickedNode?.val as Step), total: this.ctx.store.size }, this.ctx.map);\n this.ctx.store.pingConsumers();\n };\n\n private restoreRemovedMiddleNode = (removedNode: ListNode) => {\n if (!this.snapshot) return;\n if (!removedNode.val) return;\n const { beforePrimary: before, afterPrimary: after, wasCircular } = this.snapshot;\n const { store, mode } = this.ctx;\n\n if (before) {\n before.next = removedNode;\n removedNode.prev = before;\n }\n\n if (after) {\n removedNode.next = after;\n after.prev = removedNode;\n }\n\n // this is the case when we have 3 primary and 3 aux points\n if (wasCircular && !this.ctx.store.circular.isCircular()) {\n const auxPoint = PointHelpers.createAuxiliaryPoint(store.tail?.val as Step, store.head?.val as Step);\n store.push(auxPoint);\n store.circular.close();\n mode.setClosedGeometry(true);\n }\n };\n\n private restoreRemovedHeadNode = (removedNode: ListNode) => {\n if (!this.snapshot || !removedNode?.val) return;\n\n const { wasCircular } = this.snapshot;\n const { store, mode } = this.ctx;\n const currentHead = this.ctx.store.head;\n\n if (currentHead) {\n removedNode.next = currentHead;\n currentHead.prev = removedNode;\n }\n store.head = removedNode;\n\n const notCircularNow = !store.circular.isCircular();\n if (wasCircular && notCircularNow) {\n store.circular.close();\n mode.setClosedGeometry(true);\n }\n };\n\n private restoreRemovedTailNode = (removedNode: ListNode) => {\n const { store, mode } = this.ctx;\n if (!this.snapshot) return;\n const { wasCircular } = this.snapshot;\n const currentTail = store.tail;\n\n if (currentTail) {\n currentTail.next = removedNode;\n removedNode.prev = currentTail;\n store.tail = removedNode;\n }\n const notCircularNow = !store.circular.isCircular();\n if (wasCircular && notCircularNow) {\n store.circular.close();\n mode.setClosedGeometry(true);\n }\n };\n\n private restoreAuxiliaryPoints(node: ListNode): void {\n if (!this.snapshot) return;\n if (node.prev?.val && node.val && this.snapshot?.beforeAux) {\n this.restoreNodeAfter(node.prev, this.snapshot?.beforeAux);\n if (this.snapshot.wasRemovedHead && this.snapshot.wasCircular) {\n this.ctx.store.tail = this.snapshot.beforeAux;\n }\n }\n\n if (node.next?.val && node.val && this.snapshot?.afterAux) {\n this.restoreNodeAfter(node, this.snapshot?.afterAux);\n if (this.snapshot.wasRemovedTail && this.snapshot.wasCircular) {\n this.ctx.store.tail = this.snapshot.afterAux;\n }\n }\n\n if (this.snapshot.wasCircular) {\n this.ctx.store.circular.close();\n }\n }\n\n public undo = () => {\n const { store } = this.ctx;\n\n if (!this.snapshot) return;\n const { removedNode: node, wasRemovedHead, wasRemovedTail, wasCircular } = this.snapshot;\n if (!node?.val) return;\n\n if (wasRemovedHead) {\n // first remove the aux point that was added before when we removed the primary node\n store.removeNodeById(store.head?.prev?.val?.id as StepId);\n this.restoreRemovedHeadNode(node);\n } else if (wasRemovedTail) {\n this.restoreRemovedTailNode(node);\n if (wasCircular && store.tail?.prev?.val?.isAuxiliary) {\n store.removeNodeById(store.tail?.prev?.val?.id as StepId);\n }\n } else {\n // first remove the aux point that was added before when we removed the primary node\n if (this.snapshot.newAux?.val?.id) {\n store.removeNodeById(this.snapshot.newAux?.val?.id);\n }\n this.restoreRemovedMiddleNode(node);\n }\n\n if (!store.map.has(this.ctx.nodeId)) {\n store.map.set(this.ctx.nodeId, node);\n store.size++;\n }\n\n this.restoreAuxiliaryPoints(node);\n store.pingConsumers();\n };\n}\n","import type { Command } from \"#app/history/command\";\nimport type { ListNode } from \"#app/store\";\nimport type { StoreChangeEventKeys } from \"#app/store/types\";\nimport type { Step } from \"#app/types\";\nimport { FireEvents } from \"#components/map/fire-events\";\nimport type { RemoveCommanContext } from \".\";\n\ninterface RemovedPointSnapshot {\n removedNode: ListNode;\n wasCircular: boolean;\n wasRemovedHead: boolean;\n wasRemovedTail: boolean;\n}\n\nexport class RemovePointManualCommand implements Command {\n type: StoreChangeEventKeys = \"STORE_INBETWEEN_POINT_REMOVED\";\n snapshot: RemovedPointSnapshot | null = null;\n\n constructor(private readonly ctx: RemoveCommanContext) {}\n\n private makeSnapshot(clickedNode: ListNode): RemovedPointSnapshot {\n const wasRemovedHead = this.ctx.store.head?.val?.id === this.ctx.nodeId;\n const wasRemovedTail = this.ctx.store.tail?.val?.id === this.ctx.nodeId;\n const wasCircular = this.ctx.store.circular.isCircular();\n\n return {\n removedNode: clickedNode,\n wasCircular,\n wasRemovedHead,\n wasRemovedTail,\n };\n }\n\n private breakGeometryIfNeeded = (ctx: Pick<RemoveCommanContext, \"store\">) => {\n const { store } = ctx;\n\n if (store.circular.canBreak() && store.circular.isCircular()) {\n if (store.head) {\n store.head.prev = null;\n }\n if (store.tail) {\n store.tail.next = null;\n }\n\n return true;\n }\n return false;\n };\n\n public execute = () => {\n const clickedNode = this.ctx.store.findNodeById(this.ctx.nodeId);\n\n if (!clickedNode?.val) return;\n\n this.snapshot = this.makeSnapshot(clickedNode);\n this.ctx.store.removeNodeById(this.ctx.nodeId);\n const ok = this.breakGeometryIfNeeded(this.ctx);\n if (ok) {\n this.ctx.mode.reset();\n }\n FireEvents.pointRemoveRightClick({ ...(clickedNode?.val as Step), total: this.ctx.store.size }, this.ctx.map);\n this.ctx.store.pingConsumers();\n };\n\n private closeGeometryIfNeeded = () => {\n const { store, mode } = this.ctx;\n\n const notCircularNow = !this.ctx.store.circular.isCircular();\n if (this.snapshot?.wasCircular && notCircularNow) {\n store.circular.close();\n mode.setClosedGeometry(true);\n }\n };\n\n private restoreRemovedMiddleNode = (removedNode: ListNode) => {\n if (!removedNode?.val) return;\n\n const { prev, next } = removedNode;\n\n if (prev) {\n prev.next = removedNode;\n removedNode.prev = prev;\n } else {\n this.ctx.store.head = removedNode;\n }\n\n if (next) {\n next.prev = removedNode;\n removedNode.next = next;\n } else {\n this.ctx.store.tail = removedNode;\n }\n };\n\n private restoreRemovedHeadNode = (removedNode: ListNode) => {\n const currentHead = this.ctx.store.head;\n if (!removedNode?.val) return;\n\n if (currentHead) {\n removedNode.next = currentHead;\n currentHead.prev = removedNode;\n }\n this.ctx.store.head = removedNode;\n };\n\n private restoreRemovedTailNode = (removedNode: ListNode) => {\n const currentTail = this.ctx.store.tail;\n\n if (currentTail) {\n currentTail.next = removedNode;\n removedNode.prev = currentTail;\n }\n this.ctx.store.tail = removedNode;\n };\n\n public undo = () => {\n if (!this.snapshot) return;\n const { removedNode, wasRemovedHead, wasRemovedTail } = this.snapshot;\n\n if (wasRemovedHead) {\n this.restoreRemovedHeadNode(removedNode);\n } else if (wasRemovedTail) {\n this.restoreRemovedTailNode(removedNode);\n } else {\n this.restoreRemovedMiddleNode(removedNode);\n }\n\n this.closeGeometryIfNeeded();\n\n if (!this.ctx.store.map.has(this.ctx.nodeId)) {\n this.ctx.store.map.set(this.ctx.nodeId, removedNode);\n this.ctx.store.size++;\n }\n\n this.ctx.store.pingConsumers();\n };\n}\n","import type { Command } from \"#app/history/command\";\nimport type { Store } from \"#app/store\";\nimport type { StoreChangeEventKeys } from \"#app/store/types\";\nimport type { RequiredDrawOptions } from \"#app/types\";\nimport type { UnifiedMap } from \"#app/types/map\";\nimport type { DrawingMode } from \"#components/map/mode\";\nimport { RemovePointAutoCommand } from \"./auto\";\nimport { RemovePointManualCommand } from \"./manual\";\n\nexport interface RemoveCommanContext {\n readonly store: Store;\n readonly map: UnifiedMap;\n readonly options: RequiredDrawOptions;\n readonly mode: DrawingMode;\n readonly nodeId: string;\n}\n\nexport class RemovePointCommand implements Command {\n type: StoreChangeEventKeys = \"STORE_INBETWEEN_POINT_REMOVED\";\n manualPointRemove: RemovePointManualCommand | null = null;\n autoPointRemove: RemovePointAutoCommand | null = null;\n constructor(private readonly ctx: RemoveCommanContext) {\n this.manualPointRemove = new RemovePointManualCommand(this.ctx);\n this.autoPointRemove = new RemovePointAutoCommand(this.ctx);\n }\n\n public execute = () => {\n if (this.ctx.options.pointGeneration === \"auto\") {\n this.autoPointRemove?.execute();\n } else {\n this.manualPointRemove?.execute();\n }\n };\n\n public undo = () => {\n if (this.ctx.options.pointGeneration === \"auto\") {\n this.autoPointRemove?.undo();\n } else {\n this.manualPointRemove?.undo();\n }\n };\n}\n","import type { MapLayerMouseEvent } from \"maplibre-gl\";\n\nimport type { ListNode } from \"#app/store/index\";\nimport type { LatLng, Step } from \"#app/types/index\";\n\nimport { PointHelpers } from \"./helpers\";\nimport type { PointState } from \"./point-state\";\nimport { AddPointCommand } from \"./commands/add-point\";\nimport { timeline } from \"#app/history\";\nimport { RemovePointCommand } from \"./commands/remove-point\";\nimport type { TilesContext } from \"../tiles\";\n\nexport class PointTopologyManager {\n constructor(\n private readonly ctx: TilesContext,\n private readonly state: PointState,\n ) {}\n\n private updateMainPoint(node: ListNode, event: MapLayerMouseEvent): void {\n if (node.val) {\n node.val.lat = event.lngLat.lat;\n node.val.lng = event.lngLat.lng;\n }\n }\n\n private updateAuxiliaryPoints(node: ListNode, event: MapLayerMouseEvent): void {\n const auxPoints = this.getAuxPointsLatLng(event);\n if (!auxPoints) return;\n\n this.updatePrevAuxPoint(node, auxPoints.prev);\n this.updateNextAuxPoint(node, auxPoints.next);\n }\n\n private updatePrevAuxPoint(node: ListNode, prevCoords: LatLng | null): void {\n if (node.prev?.val && prevCoords) {\n node.prev.val.lat = prevCoords.lat;\n node.prev.val.lng = prevCoords.lng;\n }\n }\n\n private updateNextAuxPoint(node: ListNode, nextCoords: LatLng | null): void {\n if (node.next?.val && nextCoords) {\n node.next.val.lat = nextCoords.lat;\n node.next.val.lng = nextCoords.lng;\n }\n }\n\n // we've got the reference to the selected node from the store and just updating the lat/lng when mouse up event happens\n public updateStore = () => {\n const lastEvent = this.state.getLastEvent();\n const selectedNode = this.state.getSelectedNode();\n\n if (!lastEvent || !selectedNode?.val) return;\n\n this.updateMainPoint(selectedNode, lastEvent);\n this.updateAuxiliaryPoints(selectedNode, lastEvent);\n };\n\n public getAuxPointsLatLng = (event: MapLayerMouseEvent) => {\n const selectedNode = this.state.getSelectedNode();\n if (!selectedNode) return null;\n\n const { options } = this.ctx;\n const prevPrimary = selectedNode?.prev?.prev;\n const nextPrimary = selectedNode?.next?.next;\n\n if (options.pointGeneration === \"auto\") {\n return {\n next: nextPrimary?.val ? PointHelpers.getMidpoint(nextPrimary.val, event.lngLat) : null,\n prev: prevPrimary?.val ? PointHelpers.getMidpoint(event.lngLat, prevPrimary.val) : null,\n } as const;\n }\n return null;\n };\n\n public addPoint(event: MapLayerMouseEvent): Step {\n const { store, options } = this.ctx;\n\n const cmd = new AddPointCommand(store, options, event.lngLat);\n timeline.commit(cmd);\n return cmd.getStep();\n }\n\n public removePoint(id: string): void {\n const { store, options, mode, map } = this.ctx;\n\n if (store.size === 1) {\n store.reset();\n } else {\n timeline.commit(new RemovePointCommand({ store, options, mode, map, nodeId: id }));\n }\n }\n}\n","import type { LatLng } from \"#app/types/index\";\nimport type { MapLayerMouseEvent, MapTouchEvent } from \"maplibre-gl\";\n\nimport { throttle } from \"#app/utils/helpers\";\nimport { ELAYERS } from \"#app/utils/geo_constants\";\nimport { timeline } from \"#app/history\";\nimport type { StoreChangeEvent } from \"#app/store/types\";\n\nimport { FireEvents } from \"../fire-events\";\nimport { PointVisibility } from \"./helpers\";\nimport { FirstPoint } from \"./first-point\";\nimport { removeTransparentLine, addTransparentLine } from \"../tiles/utils\";\nimport { AuxPoints } from \"./aux-points\";\nimport type { DrawingModeChangeEvent } from \"../mode/types\";\nimport { PointState } from \"./point-state\";\nimport { PointTopologyManager } from \"./point-topology-manager\";\nimport { MovePointCommand } from \"./commands/move-point\";\nimport { renderer } from \"../renderer\";\nimport { queryPointId, isFeatureTriggered, queryPoint, getGeometryIndex } from \"../utils\";\nimport type { TilesContext } from \"../tiles\";\n\nexport interface PrimaryPointEvents {\n onPointMouseEnter: (event: MapLayerMouseEvent) => void;\n onPointMouseLeave: (event: MapLayerMouseEvent) => void;\n onPointMouseDown: (event: MapLayerMouseEvent | MapTouchEvent) => void;\n onPointMouseUp: () => void;\n onMapMouseMove: (event: MapLayerMouseEvent) => void;\n}\n// TODO messy: clean this up\nexport class PointEvents {\n private events: PrimaryPointEvents;\n private firstPoint: FirstPoint | null;\n private auxPoints: AuxPoints | null;\n private pointState: PointState;\n private topologyManager: PointTopologyManager;\n\n constructor(private readonly ctx: TilesContext) {\n this.pointState = new PointState();\n this.topologyManager = new PointTopologyManager(ctx, this.pointState);\n\n this.events = {\n onPointMouseEnter: this.onPointMouseEnter,\n onPointMouseLeave: this.onPointMouseLeave,\n onPointMouseDown: this.onPointMouseDown,\n onPointMouseUp: this.onPointMouseUp,\n onMapMouseMove: this.onMapMouseMove,\n };\n this.firstPoint = new FirstPoint(this.ctx, this.events);\n this.auxPoints = new AuxPoints(this.ctx, this.events, this.pointState, this.topologyManager);\n }\n\n private initConsumers = () => {\n this.ctx.mode.addObserver(this.mapModeConsumer);\n this.ctx.store.addObserver(this.storeEventsConsumer);\n };\n\n private removeConsumers = () => {\n this.ctx.mode.removeObserver(this.mapModeConsumer);\n this.ctx.store.removeObserver(this.storeEventsConsumer);\n };\n\n public init = () => {\n const { map } = this.ctx;\n map.on(\"click\", this.onMapClick);\n map.on(\"dblclick\", this.onMapDblClick);\n\n map.on(\"mouseenter\", ELAYERS.PointsLayer, this.onPointMouseEnter);\n map.on(\"mouseleave\", ELAYERS.PointsLayer, this.onPointMouseLeave);\n map.on(\"mousedown\", ELAYERS.PointsLayer, this.onPointMouseDown);\n map.on(\"click\", ELAYERS.PointsLayer, this.onPointClick);\n map.on(\"mouseup\", ELAYERS.PointsLayer, this.onPointMouseUp);\n map.on(\"touchend\", ELAYERS.PointsLayer, this.onPointMouseUp);\n map.on(\"touchstart\", ELAYERS.PointsLayer, this.onPointMouseDown);\n\n this.initConsumers();\n };\n\n public remove = () => {\n const { map } = this.ctx;\n map.off(\"click\", this.onMapClick);\n map.off(\"dblclick\", this.onMapDblClick);\n map.off(\"mousemove\", this.onMapMouseMove);\n\n map.off(\"mouseenter\", ELAYERS.PointsLayer, this.onPointMouseEnter);\n map.off(\"mouseleave\", ELAYERS.PointsLayer, this.onPointMouseLeave);\n map.off(\"mousedown\", ELAYERS.PointsLayer, this.onPointMouseDown);\n map.off(\"click\", ELAYERS.PointsLayer, this.onPointClick);\n map.off(\"mouseup\", ELAYERS.PointsLayer, this.onPointMouseUp);\n map.off(\"touchend\", ELAYERS.PointsLayer, this.onPointMouseUp);\n map.off(\"touchstart\", ELAYERS.PointsLayer, this.onPointMouseDown);\n\n this.firstPoint?.removeEvents();\n this.auxPoints?.removeEvents();\n this.removeConsumers();\n };\n\n private onPointClick = (event: MapLayerMouseEvent) => {\n const { mouseEvents, store, map, options } = this.ctx;\n const id = queryPointId(map, event.point);\n\n if (store.isLastPoint(options, id)) {\n mouseEvents.lastPointMouseClick = true;\n mouseEvents.lastPointMouseUp = false;\n }\n };\n\n private onMapDblClick = (event: MapLayerMouseEvent) => {\n event.preventDefault();\n };\n\n private onPointRemove = (event: MapLayerMouseEvent | MapTouchEvent) => {\n const { store } = this.ctx;\n if (store.size === 1) {\n store.reset();\n this.ctx.panel.hide();\n } else {\n const id = queryPointId(this.ctx.map, event.point);\n const clickedNode = store.findNodeById(id);\n\n if (!clickedNode?.val) return;\n\n this.topologyManager.removePoint(clickedNode.val.id);\n }\n renderer.execute();\n };\n\n private onOwnGeometryLayersClick = (event: MapLayerMouseEvent) => {\n return isFeatureTriggered(event, [\n ELAYERS.PointsLayer,\n ELAYERS.FirstPointLayer,\n ELAYERS.LineLayerTransparent,\n ELAYERS.LineLayerBreak,\n ]);\n };\n\n private onMapClick = (event: MapLayerMouseEvent) => {\n const { mode, mouseEvents, map, store } = this.ctx;\n\n if (mode.getClosedGeometry()) return;\n if (this.onOwnGeometryLayersClick(event)) return;\n\n if (mouseEvents.lastPointMouseClick) {\n mouseEvents.lastPointMouseClick = false;\n }\n map.getCanvasContainer().style.cursor = \"grab\";\n const addedStep = this.topologyManager.addPoint(event);\n FireEvents.addPoint({ ...addedStep, total: store.size }, map, mode);\n PointVisibility.setSinglePointHidden(event);\n renderer.execute();\n };\n\n private onMoveLeftClickUp = (event: MapLayerMouseEvent) => {\n const mouseLeftClickUp = event.originalEvent.buttons === 0;\n if (mouseLeftClickUp) {\n this.onPointMouseUp();\n }\n };\n\n private onMapMouseMove = throttle((event: MapLayerMouseEvent) => {\n const { mouseEvents } = this.ctx;\n\n if (mouseEvents.pointMouseDown) {\n this.pointState.setLastEvent(event);\n\n if (!this.pointState.getSelectedNode()) return;\n\n this.onMoveLeftClickUp(this.pointState.getLastEvent() as MapLayerMouseEvent);\n const auxPoints = this.topologyManager.getAuxPointsLatLng(this.pointState.getLastEvent() as MapLayerMouseEvent);\n renderer.executeOnMouseMove(this.pointState.getSelectedIdx() as number, event.lngLat, auxPoints);\n this.pointState.setMoved(true);\n }\n }, 17);\n\n private onPointMouseEnter = (event: MapLayerMouseEvent) => {\n const { mouseEvents, map, store, options } = this.ctx;\n if (mouseEvents) {\n mouseEvents.pointMouseEnter = true;\n if (mouseEvents.pointMouseDown) return;\n }\n PointVisibility.setSinglePointHidden(event);\n const id = queryPointId(map, event.point);\n if (store.isLastPoint(options, id)) {\n mouseEvents.lastPointMouseEnter = true;\n mouseEvents.lastPointMouseLeave = false;\n }\n const step = store.findStepById(id);\n if (step) {\n this.pointState.setEnteredStep(step);\n FireEvents.enterPoint(Object.assign({}, step, { total: store.size }), map);\n }\n };\n\n private onPointMouseLeave = (event: MapLayerMouseEvent) => {\n const { mouseEvents, store, map, options } = this.ctx;\n\n if (mouseEvents) {\n mouseEvents.pointMouseEnter = false;\n if (event.originalEvent.buttons === 0) {\n mouseEvents.pointMouseLeave = true;\n }\n if (mouseEvents.pointMouseDown) return;\n }\n const id = queryPointId(map, event.point);\n if (store.isLastPoint(options, id)) {\n mouseEvents.lastPointMouseEnter = false;\n mouseEvents.lastPointMouseLeave = true;\n }\n FireEvents.leavePoint(\n Object.assign({}, this.pointState.getEnteredStep(), {\n total: store.size,\n }),\n map,\n );\n };\n\n private storeEventsConsumer = (event: StoreChangeEvent) => {\n if (event.type === \"STORE_MUTATED\") {\n if (event.data?.size === 0) {\n this.pointState.reset();\n }\n }\n };\n\n private mapModeConsumer = (event: DrawingModeChangeEvent) => {\n if (event.type === \"BREAK_CHANGED\" || event.type === \"MODE_CHANGED\") {\n this.pointState.reset();\n }\n };\n\n private hideLastPointPanel = () => {\n const { store, panel, options } = this.ctx;\n const selectedNode = this.pointState.getSelectedNode();\n\n if (!selectedNode?.val) return;\n\n if (store.isLastPoint(options, selectedNode.val.id)) {\n panel.hide();\n }\n };\n\n private setSelectedNode = (event: MapLayerMouseEvent | MapTouchEvent) => {\n const { store, map } = this.ctx;\n\n const id = queryPointId(map, event.point);\n const node = store.findNodeById(id);\n\n if (node) {\n this.pointState.setSelectedNode(node);\n }\n };\n\n private onPointMouseDown = (event: MapLayerMouseEvent | MapTouchEvent) => {\n event.preventDefault();\n\n this.pointState.clearLastEvent();\n\n const { mouseEvents, map, store } = this.ctx;\n\n if ((event.originalEvent as { button: number }).button === 2) {\n this.onPointRemove(event);\n return;\n }\n\n this.setSelectedNode(event);\n\n removeTransparentLine(map);\n this.hideLastPointPanel();\n\n const point = queryPoint(map, event.point);\n const geometryIndex = getGeometryIndex(store, point?.properties.id);\n this.pointState.setSelectedIdx(geometryIndex);\n\n if (mouseEvents) {\n mouseEvents.pointMouseDown = true;\n }\n\n this.pointState.setStartCoordinates(event.lngLat);\n\n map.on(\"mousemove\", this.onMapMouseMove);\n map.on(\"touchmove\", this.onMapMouseMove);\n };\n\n private onPointMouseUp = () => {\n const { mouseEvents, store, panel, map, options } = this.ctx;\n\n map.off(\"mousemove\", this.onMapMouseMove);\n map.off(\"touchmove\", this.onMapMouseMove);\n\n mouseEvents.pointMouseUp = true;\n\n const selectedNode = this.pointState.getSelectedNode();\n const lastEvent = this.pointState.getLastEvent();\n const startCoordinates = this.pointState.getStartCoordinates();\n\n if (selectedNode && !selectedNode.val?.isAuxiliary) {\n if (lastEvent) {\n this.topologyManager.updateStore();\n this.pointState.clearLastEvent();\n }\n\n panel?.show();\n\n if (this.pointState.isMoved()) {\n timeline.commit(new MovePointCommand(store, selectedNode, startCoordinates as LatLng, map));\n this.pointState.setMoved(false);\n }\n this.pointState.partialReset();\n }\n\n if (mouseEvents) {\n mouseEvents.pointMouseDown = false;\n }\n\n addTransparentLine(map, options);\n renderer.execute();\n };\n}\n","import { LineEvents } from \"../line\";\nimport { PointEvents } from \"../points\";\nimport { TilesContext } from \".\";\n\nexport class Events {\n private pointEvents: PointEvents;\n private lineEvents: LineEvents;\n\n constructor(private readonly ctx: TilesContext) {\n this.pointEvents = new PointEvents(this.ctx);\n this.lineEvents = new LineEvents(this.ctx);\n this.initEvents();\n }\n\n private initEvents = () => {\n this.lineEvents.init();\n this.pointEvents?.init();\n };\n\n public remove = () => {\n this.pointEvents?.remove();\n this.lineEvents?.remove();\n };\n}\n","import type { StoreChangeEvent, StoreChangeEventKeys } from \"#app/store/types\";\nimport { ELAYERS, generateLayers } from \"#app/utils/geo_constants\";\nimport { debounce } from \"#app/utils/helpers\";\nimport { TilesContext } from \".\";\n\nexport class Layers {\n constructor(private readonly ctx: TilesContext) {}\n\n public init() {\n this.add();\n this.swap(ELAYERS.LineLayer, ELAYERS.SinglePointLayer);\n this.swap(ELAYERS.LineLayerTransparent, ELAYERS.SinglePointLayer);\n this.swap(ELAYERS.LineLayerTransparent, ELAYERS.FirstPointLayer);\n this.swap(ELAYERS.LineLayerTransparent, ELAYERS.PointsLayer);\n this.swap(ELAYERS.PolygonLayer, ELAYERS.LineLayer);\n\n this.initConsumers();\n }\n\n private initConsumers = () => {\n this.ctx.store.addObserver(this.onStoreChange);\n };\n\n private removeConsumers = () => {\n this.ctx.store.removeObserver(this.onStoreChange);\n };\n\n private onStoreChange = debounce((event: StoreChangeEvent) => {\n const events = [\n \"STORE_MUTATED\",\n \"STORE_CLOSE_GEOMETRY\",\n \"STORE_BREAK_GEOMETRY\",\n \"STORE_CLEARED\",\n ] as StoreChangeEventKeys[];\n\n if (events.includes(event.type)) {\n const { map, store, mode } = this.ctx;\n\n const isPolygonMode = mode.getMode() === \"polygon\";\n\n if (isPolygonMode && store.circular.isCircular()) {\n map.setLayoutProperty(ELAYERS.PolygonLayer, \"visibility\", \"visible\");\n } else {\n map.setLayoutProperty(ELAYERS.PolygonLayer, \"visibility\", \"none\");\n }\n }\n }, 10);\n\n private add = () => {\n const LAYERS_TO_RENDER = generateLayers(this.ctx.options);\n\n for (const layer of LAYERS_TO_RENDER) {\n if (!this.ctx.map.getLayer(layer.id)) {\n this.ctx.map.addLayer(layer);\n }\n }\n };\n\n private swap = (beneathLayerId: string, aboveLayerId: string) => {\n const beneath = this.ctx.map.getLayer(beneathLayerId);\n const above = this.ctx.map.getLayer(aboveLayerId);\n\n if (beneath && above) {\n this.ctx.map.moveLayer(beneathLayerId, aboveLayerId);\n }\n };\n\n private removeLayers = () => {\n for (const layer of Object.values(ELAYERS)) {\n if (this.ctx.map.getLayer(layer)) {\n this.ctx.map.removeLayer(layer);\n }\n }\n };\n\n public remove = () => {\n this.removeConsumers();\n this.removeLayers();\n };\n}\n","import { ESOURCES } from \"#app/utils/geo_constants\";\nimport { TilesContext } from \".\";\n\nexport class Sources {\n constructor(private readonly ctx: Pick<TilesContext, \"map\">) {}\n\n init() {\n for (const source of Object.values(ESOURCES)) {\n if (!this.ctx.map.getSource(source)) {\n this.ctx.map.addSource(source, {\n type: \"geojson\",\n data: {\n type: \"FeatureCollection\",\n features: [],\n },\n promoteId: \"id\",\n });\n }\n }\n }\n\n remove() {\n for (const source of Object.values(ESOURCES)) {\n if (this.ctx.map.getSource(source)) {\n this.ctx.map.removeSource(source);\n }\n }\n }\n}\n","import type { Store } from \"#app/store\";\nimport type { RequiredDrawOptions } from \"#app/types\";\nimport type { UnifiedMap } from \"#app/types/map\";\nimport { Panel } from \"#components/panel\";\nimport { Control } from \"#components/side-control\";\nimport { DrawingMode } from \"../mode\";\nimport { MouseEvents } from \"../mouse-events\";\nimport { Events } from \"./events\";\nimport { Layers } from \"./layers\";\nimport { Sources } from \"./sources\";\n\nexport type TilesContext = {\n map: UnifiedMap;\n panel: Panel;\n store: Store;\n control: Control;\n options: RequiredDrawOptions;\n mouseEvents: MouseEvents;\n mode: DrawingMode;\n};\n\nexport class Tiles {\n private sources: Sources;\n private layers: Layers;\n private events: Events | undefined;\n\n constructor(private readonly ctx: TilesContext) {\n this.sources = new Sources(this.ctx);\n this.layers = new Layers(this.ctx);\n this.events = new Events(this.ctx);\n this.init();\n }\n\n private init = () => {\n // first add the sources then all the layers\n this.sources.init();\n this.layers.init();\n };\n\n public remove = () => {\n // first remove the layers then all the sources\n this.layers.remove();\n this.sources.remove();\n this.events?.remove();\n };\n}\n","import type { UnifiedMap } from \"#app/types/map\";\nimport { EVENTS } from \"#app/utils/constants\";\nimport { FireEvents } from \"#components/map/fire-events\";\nimport { timeline } from \".\";\nimport type { TimelineChangeEvent } from \"./types\";\n\nexport class MapTimelineAdapter {\n constructor(private map: UnifiedMap) {\n this.init();\n }\n\n private init() {\n timeline.addObserver(this.onTimelineEvent);\n }\n\n public destroy() {\n timeline.removeObserver(this.onTimelineEvent);\n }\n\n private onTimelineEvent = (evt: TimelineChangeEvent) => {\n switch (evt.type) {\n case \"UNDO_STACK_CHANGED\":\n FireEvents.onUndoStackChange(this.map, evt.data);\n break;\n case \"REDO_STACK_CHANGED\":\n FireEvents.onRedoStackChange(this.map, evt.data);\n break;\n }\n };\n}\n","import type { IControl, UnifiedMap } from \"#app/types/map\";\nimport type { DrawOptions, LatLng, RequiredDrawOptions, Step, StepId } from \"#app/types/index\";\nimport type {\n UndoEvent,\n PointAddEvent,\n PointRightClickRemoveEvent,\n PointEnterEvent,\n PointLeaveEvent,\n PointMoveEvent,\n RemoveAllEvent,\n SaveEvent,\n ModeChangeEvent,\n UndoStackChangeEvent,\n RedoStackChangeEvent,\n} from \"#components/map/types\";\n\nimport { Panel } from \"#components/panel\";\nimport { Control } from \"#components/side-control\";\nimport { DrawingMode } from \"#components/map/mode\";\nimport { Cursor } from \"#components/cursor\";\nimport { MouseEvents } from \"#components/map/mouse-events/index\";\nimport { uuidv4 } from \"#app/utils/helpers\";\nimport { DOM } from \"#app/dom\";\nimport { Store } from \"#app/store/index\";\nimport { renderer, Renderer } from \"#components/map/renderer\";\nimport { linkedListToArray } from \"#app/store/init\";\nimport { checkInitialStepsOptionOnErrors, initOptions } from \"#app/options\";\n\nimport \"./draw.css\";\nimport { Tiles } from \"#components/map/tiles\";\nimport { MapTimelineAdapter } from \"#app/history/map-adapter\";\n\nexport default class DrawLibre implements IControl {\n private container: HTMLElement | undefined;\n private store: Store | undefined;\n private mode: DrawingMode | undefined;\n private defaultOptions: RequiredDrawOptions;\n private tiles: Tiles | undefined;\n private panel: Panel | undefined;\n private control: Control | undefined;\n private cursor: Cursor | undefined;\n private mouseEvents: MouseEvents | undefined;\n private timelineAdapter: MapTimelineAdapter | undefined;\n\n private renderer: Renderer | null = null;\n static instance: DrawLibre | null = null;\n\n private constructor(options?: DrawOptions) {\n this.defaultOptions = initOptions(options);\n\n if (this.defaultOptions.initial) {\n checkInitialStepsOptionOnErrors(this.defaultOptions.initial);\n }\n }\n\n static getInstance(options?: DrawOptions): DrawLibre {\n if (!DrawLibre.instance) {\n DrawLibre.instance = new DrawLibre(options);\n }\n return DrawLibre.instance;\n }\n\n /**\n * DO NOT USE IMPLICITLY. PASS TO map.addControl().\n *\n * @example ```ts\n * const map = new Map();\n * const draw = DrawLibre.getInstance();\n * map.addControl(draw)\n * ```\n *\n * Register a control on the map and give it a chance to register event listeners\n *\n * @param map - the Map this control will be added to\n * @returns The control's container element. This should\n * be created by the control and returned by onAdd without being attached\n * to the DOM: the map will insert the control's element into the DOM\n * as necessary.\n */\n onAdd = (map: UnifiedMap) => {\n this.store = new Store(this.defaultOptions);\n this.mode = new DrawingMode(this.defaultOptions);\n this.renderer = renderer.initialize({\n map,\n store: this.store,\n options: this.defaultOptions,\n mode: this.mode,\n });\n this.mouseEvents = new MouseEvents();\n this.panel = new Panel({ map, mode: this.mode, options: this.defaultOptions, store: this.store });\n this.control = new Control({ options: this.defaultOptions, map, mode: this.mode });\n this.tiles = new Tiles({\n map,\n store: this.store,\n mode: this.mode,\n options: this.defaultOptions,\n control: this.control,\n panel: this.panel,\n mouseEvents: this.mouseEvents,\n });\n this.cursor = new Cursor({\n map,\n mode: this.mode,\n mouseEvents: this.mouseEvents,\n store: this.store,\n options: this.defaultOptions,\n });\n\n this.timelineAdapter = new MapTimelineAdapter(map);\n this.mode.pingConsumers();\n this.store.pingConsumers();\n this.container = this.control.getContainer();\n\n return this.container;\n };\n\n /**\n * DO NOT USE IMPLICITLY. PASS TO map.removeControl().\n *\n * @example ```ts\n * const map = new Map();\n * const draw = DrawLibre.getInstance();\n * map.removeControl(draw)\n * ```\n *\n * Unregister a control on the map and give it a chance to detach event listeners.\n *\n * @param map - the Map this control will be removed from\n */\n onRemove = () => {\n this.cursor?.remove();\n this.tiles?.remove();\n this.panel?.destroy();\n this.store?.reset();\n this.mode?.unsubscribe();\n this.control?.destroy();\n this.timelineAdapter?.destroy();\n\n if (this.container) {\n DOM.remove(this.container);\n }\n };\n\n /**\n * Adds a series of steps to the store. If a step ID is not provided, it will be automatically generated.\n *\n * @param step - The step to add to the store, which can be of type Step or LatLng.\n */\n public setSteps = (value: Step[] | LatLng[]) => {\n if (Array.isArray(value)) {\n for (const step of value) {\n const newStep = { ...step, id: (step as Step).id || uuidv4() };\n this.store?.push(newStep);\n }\n } else {\n throw new Error(\"Invalid argument. Expected an array of steps.\");\n }\n this.renderer?.execute();\n };\n\n /**\n * Retrieves a step from the store by its ID.\n *\n * @param id - The ID of the step to retrieve.\n * @returns The step with the specified ID, or null if not found.\n */\n public findStepById = (id: StepId) => {\n return this.store?.findStepById(id);\n };\n\n /**\n * Retrieves a node from the store by its ID.\n *\n * @param id - The ID of the node to retrieve.\n * @returns The node with the specified ID, or null if not found.\n */\n public findNodeById = (id: StepId) => {\n return this.store?.findNodeById(id);\n };\n\n /**\n * Retrieves all steps from the store, either as an array or as a linked list, based on the type specified.\n *\n * @param type - The type of collection to return, either \"array\" or \"ll\" (linked list).\n * @returns An array of all steps or the linked list of steps.\n */\n public getAllSteps = (type: \"array\" | \"linkedlist\" = \"array\") => {\n if (type === \"array\" && this.store) {\n return linkedListToArray(this.store.head);\n }\n if (type === \"linkedlist\") {\n return {\n head: this.store?.head,\n tail: this.store?.tail,\n size: this.store?.size,\n };\n }\n throw new Error(\"Invalid type specified. Use 'array' or 'linkedlist'.\");\n };\n\n public setOptions = (fn: (options: RequiredDrawOptions) => RequiredDrawOptions) => {\n this.defaultOptions = fn(this.defaultOptions);\n };\n\n public undo = (e: Event): void => {\n this.panel?.api()?.undo(e);\n };\n\n public redo = (e: Event): void => {\n this.panel?.api()?.redo(e);\n };\n\n public clear = (): void => {\n this.panel?.api()?.clear();\n };\n\n public save = (): void => {\n this.panel?.api()?.save();\n };\n\n public removeAllSteps = () => {\n this.store?.reset();\n this.panel?.destroy();\n this.renderer?.execute();\n };\n}\n\nexport type {\n DrawOptions,\n RequiredDrawOptions,\n PointAddEvent,\n PointRightClickRemoveEvent,\n PointEnterEvent,\n PointLeaveEvent,\n PointMoveEvent,\n RemoveAllEvent,\n SaveEvent,\n UndoEvent,\n ModeChangeEvent,\n UndoStackChangeEvent,\n RedoStackChangeEvent,\n UnifiedMap,\n};\n"]}
1
+ {"version":3,"sources":["../src/components/panel/state.ts","../src/app/dom/index.ts","../src/components/panel/view.ts","../src/components/tooltip/index.ts","../src/app/observable/index.ts","../src/app/history/command.ts","../src/app/history/index.ts","../src/app/utils/helpers.ts","../src/app/utils/geo_constants.ts","../src/components/map/points/helpers.ts","../src/app/store/circular.ts","../src/app/store/index.ts","../src/app/store/init.ts","../src/app/utils/constants.ts","../src/components/map/fire-events.ts","../src/components/map/renderer/geojson-builder.ts","../src/components/map/renderer/index.ts","../src/components/panel/actions.ts","../src/components/panel/events.ts","../src/components/panel/observer.ts","../src/components/panel/index.ts","../src/components/cursor/constants.ts","../src/components/side-control/helpers.ts","../src/components/side-control/events.ts","../src/components/side-control/observer.ts","../src/components/side-control/view.ts","../src/components/side-control/index.ts","../src/components/map/mode/index.ts","../src/components/cursor/index.ts","../src/components/map/mouse-events/index.ts","../src/app/options/constants.ts","../src/app/options/index.ts","../src/components/map/points/commands/insert-point.ts","../src/components/map/utils.ts","../src/components/map/line/utils.ts","../src/components/map/line/commands/break-geometry.ts","../src/components/map/line/break-line.ts","../src/components/map/line/dynamic-line.ts","../src/components/map/line/transparent-line.ts","../src/components/map/line/index.ts","../src/components/map/tiles/utils.ts","../src/components/map/points/commands/close-geometry.ts","../src/components/map/points/first-point.ts","../src/components/map/points/commands/aux-to-primary.ts","../src/components/map/points/commands/move-point.ts","../src/components/map/points/aux-points.ts","../src/components/map/points/point-state.ts","../src/components/map/points/commands/add-point.ts","../src/components/map/points/commands/remove-point/auto.ts","../src/components/map/points/commands/remove-point/manual.ts","../src/components/map/points/commands/remove-point/index.ts","../src/components/map/points/point-topology-manager.ts","../src/components/map/points/index.ts","../src/components/map/tiles/events.ts","../src/components/map/tiles/layers.ts","../src/components/map/tiles/sources.ts","../src/components/map/tiles/index.ts","../src/app/history/map-adapter.ts","../src/index.ts"],"names":["UIState","value","id","DOM","tagName","className","container","element","node","target","type","callback","options","button","View","ctx","title","size","panel","locale","buttons","x","y","observer","BASE_Y_OFFSET_FROM_ELEMENT","BASE_X_OFFSET_FROM_ELEMENT","Tooltip","span","event","bottom","left","labelWidth","labelHeight","right","position","pos","Observable","args","CompoundCommand","payload","commands","cmd","i","Timeline","_Timeline","txn","timeline","uuidv4","getRandomHexChar","getUuidSection","length","section","getUuidSectionSize","idx","firstElement","lastElement","parts","throttle","fn","delay","lastArgs","shouldCall","execute","debounce","timeout","LINE_BASE","ELAYERS","ESOURCES","FIRST_POINT_RADIUS","FIRST_POINT_COLOR","FIRST_POINT_PAINT_BASE","AUXILIARY_POINT_PAINT_BASE","ON_LINE_POINT_PAINT_BASE","POLYGON_PAINT_BASE","LINE_PAINT_BASE","POINTS_PAINT_BASE","BREAK_PAINT_BASE","generateLayers","PointHelpers","p1","p2","mid","PointVisibility","map","PointsFilter","Circular","store","head","tail","threshold","current","auxId","ListNode","val","next","prev","Store","list","initStore","step","newNode","stepToInsert","ERRORS","buildStepSequence","initialSteps","closeGeometry","pointGeneration","steps","auxPoint","generateIdForSteps","stepsWithoutIds","fromArray","initialOptions","generateId","linkedListToArray","visitedNodes","result","EVENTS","MOBILE_WIDTH","FireEvents","mode","originalEvent","context","collectGeometryCoordinates","coordinates","getLine","getAllLines","getPolygon","getPoints","pointFeatures","getUnifiedFeatures","points","lines","polygons","Renderer","_Renderer","featureIdx","newCoord","line","polygon","feature","aux","prevIdx","unifiedSource","renderer","Actions","view","hasSomethingToRedo","Events","handler","btn","onClick","label","Observer","data","OFFSET_Y","Panel","width","height","point","dx","dy","visible","CURSORS","getButtonLabel","lineTitle","polygonTitle","breakTitle","lineButton","breakButton","polygonButton","placement","currentMode","active","disabled","lineVisible","polygonVisible","breakVisible","isBreak","Control","enrichedCtx","root","getInitialMode","DrawingMode","newMode","Cursor","#canvas","#initConsumers","cursor","mouseEvents","#mouseEventsObserver","MouseEvents","#firstPointMouseEnter","#firstPointMouseLeave","#lastPointMouseClick","#lastPointMouseUp","#lastPointMouseEnter","#lastPointMouseLeave","#pointMouseDown","#pointMouseUp","#pointMouseEnter","#pointMouseLeave","#lineMouseEnter","#lineMouseLeave","DEFAULT_OPTIONS","allStepsHaveIds","checkIfMissingIds","idGenerationIsOff","idsNotProvided","checkIfEnoughPointsToClose","checkIfPolygonIsClosed","firstLng","lastLng","firstLat","lastLat","checkInitialStepsOptionOnErrors","initOptions","generatePanelOptions","generateModeOptions","generateLayersOptions","generateLocaleOptions","InsertPointCommand","coords","segmentStart","isFeatureTriggered","layerIds","layer","queryPointId","queryPoint","getGeometryIndex","isRightClick","distance","point1","point2","checkIfPointIsOnLine","A","B","P","AB","AP","PB","isOnLine","visited","aPixel","bPixel","eventPixel","insertStepIfOnLine","updateUIAfterInsert","checkIfPointClicked","hideDynamicLine","lineSource","BreakGeometryCommand","clickCoords","originalHead","originalTail","newHead","newTail","newAuxBetweenHeadTail","LINE_BREAK_THROTTLE_TIME","LineBreakEvents","lineBreakData","LINE_DYNAMIC_THROTTLE_TIME","DynamicLineEvents","lineClick","latLng","LINE_TRANSPARENT_THROTTLE_TIME","TransparentLineEvents","pointSource","LineEvents","firstPointCircleRadius","defaultPointCircleRadius","togglePointCircleRadius","removeTransparentLine","addTransparentLine","transparentLayer","CloseGeometryCommand","FirstPoint","baseEvents","X_OFFSET","AuxToPrimaryCommand","clickedNode","prevPrimaryNode","nextPrimaryNode","prevAuxNode","nextAuxNode","lastAuxNode","prevAuxPoint","nextAuxPoint","MovePointCommand","selectedNode","start","prevAux","nextAux","prevPrimary","nextPrimary","midPoint","AuxPoints","pointState","topologyManager","lastEvent","startCoordinates","PointState","moved","AddPointCommand","coord","addedNode","auxNode","RemovePointAutoCommand","nodeId","wasCircular","wasRemovedHead","wasRemovedTail","auxBefore","auxAfter","beforePrimary","afterPrimary","after","restoredNode","primaryBefore","primaryAfter","meetsAuxInsertionThreshold","oldAuxPoint","isAuxiliary","removedNode","before","currentHead","notCircularNow","currentTail","RemovePointManualCommand","RemovePointCommand","PointTopologyManager","state","auxPoints","prevCoords","nextCoords","PointEvents","addedStep","geometryIndex","Layers","LAYERS_TO_RENDER","beneathLayerId","aboveLayerId","beneath","above","Sources","source","Tiles","MapTimelineAdapter","evt","DrawLibre","_DrawLibre","newStep"],"mappings":"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","file":"index.js","sourcesContent":["import type { LatLng } from \"#app/types\";\n\nexport class UIState {\n private _isHidden = true;\n private _anchor = { dx: 0, dy: 0 };\n private _pendingCoord: LatLng | null = null;\n private _rafId = 0;\n private _listenersActive = false;\n\n get isHidden() {\n return this._isHidden;\n }\n set isHidden(value: boolean) {\n this._isHidden = value;\n }\n\n get anchor() {\n return { ...this._anchor };\n }\n set anchor(value: { dx: number; dy: number }) {\n this._anchor = { ...value };\n }\n\n get pendingCoord() {\n return this._pendingCoord;\n }\n set pendingCoord(value: LatLng | null) {\n this._pendingCoord = value;\n }\n\n get rafId() {\n return this._rafId;\n }\n set rafId(id: number) {\n this._rafId = id;\n }\n\n get listenersActive() {\n return this._listenersActive;\n }\n set listenersActive(value: boolean) {\n this._listenersActive = value;\n }\n\n reset() {\n this._isHidden = true;\n this._anchor = { dx: 0, dy: 0 };\n this._pendingCoord = null;\n this._rafId = 0;\n this._listenersActive = false;\n }\n}\n","export class DOM {\n static create<K extends keyof HTMLElementTagNameMap>(\n tagName: K,\n className?: string,\n container?: HTMLElement,\n ): HTMLElementTagNameMap[K] {\n const element = window.document.createElement(tagName);\n if (className !== undefined) element.className = className;\n if (container) container.appendChild(element);\n return element;\n }\n\n static remove(node: HTMLElement) {\n if (node.parentNode) {\n node.parentNode.removeChild(node);\n }\n }\n\n static addEventListener(\n target: HTMLElement | Window | Document | undefined,\n type: string,\n callback: EventListenerOrEventListenerObject,\n options: {\n capture?: boolean;\n passive?: boolean;\n } = {},\n ) {\n if (!target) return;\n target.addEventListener(type, callback, options);\n }\n\n static removeEventListener(\n target: HTMLElement | Window | Document | undefined,\n type: string,\n callback: EventListenerOrEventListenerObject,\n options: {\n capture?: boolean;\n passive?: boolean;\n } = {},\n ) {\n if (!target) return;\n target.removeEventListener(type, callback, options);\n }\n\n static mouseButton(e: MouseEvent) {\n return e.button;\n }\n\n static addClassName(node: HTMLElement, className: string) {\n if (!node.classList.contains(className)) {\n node.classList.add(className);\n }\n }\n\n static removeClassName(node: HTMLElement, className: string) {\n if (node.classList.contains(className)) {\n node.classList.remove(className);\n }\n }\n\n static disableButton = (button: HTMLButtonElement | null) => {\n if (!button) return;\n button.setAttribute(\"disabled\", \"true\");\n button.setAttribute(\"aria-disabled\", \"true\");\n };\n\n static enableButton = (button: HTMLButtonElement | null) => {\n if (!button) return;\n button.removeAttribute(\"disabled\");\n button.removeAttribute(\"aria-disabled\");\n };\n}\n","import { DOM } from \"#app/dom\";\nimport type { ButtonType, PanelImpl } from \"#app/types\";\nimport { Context } from \".\";\n\nexport class View {\n private root: HTMLDivElement;\n private buttonContainer: HTMLDivElement;\n private buttons: Partial<Record<ButtonType, HTMLButtonElement>> = {};\n\n constructor(private readonly ctx: Pick<Context, \"map\" | \"options\">) {\n this.root = DOM.create(\"div\", \"mdl-dashboard-container\");\n this.buttonContainer = DOM.create(\"div\", \"mdl-dashboard\", this.root);\n\n this.renderButtons();\n ctx.map.getContainer().appendChild(this.root);\n }\n\n private createButton(type: ButtonType, title: string, size: PanelImpl[\"size\"], container: HTMLElement) {\n const button = DOM.create(\"button\", `mdl-panel-button mdl-panel-button-${size}`, container);\n button.setAttribute(\"data-type\", type);\n button.setAttribute(\"aria-label\", title);\n DOM.create(\"span\", `icon ${type} icon-${size}`, button);\n return button as HTMLButtonElement;\n }\n\n private renderButtons() {\n const { panel, locale } = this.ctx.options;\n const { buttons, size } = panel;\n\n (Object.keys(buttons) as ButtonType[]).forEach((type) => {\n if (!buttons[type].visible) return;\n\n const button = this.createButton(type, locale[type], size, this.buttonContainer);\n if (type === \"undo\" || type === \"redo\") {\n DOM.disableButton(button);\n }\n\n this.buttons[type] = button;\n });\n }\n\n public getButton = (type: ButtonType): HTMLButtonElement | null => {\n const button = this?.buttons?.[type];\n if (!button) {\n console.warn(`[PanelView] Button \"${type}\" not initialized`);\n }\n return button ?? null;\n };\n\n public getRoot = (): HTMLDivElement => {\n return this.root;\n };\n\n public show = () => {\n this.root.classList.remove(\"hidden\");\n };\n\n public hide = () => {\n this.root.classList.add(\"hidden\");\n };\n\n public setTransform = (x: number, y: number) => {\n this.root.style.transform = `translate(${x}px, ${y}px)`;\n };\n\n public observeResize = (callback: ResizeObserverCallback): ResizeObserver => {\n const observer = new ResizeObserver(callback);\n observer.observe(this.root);\n return observer;\n };\n\n public destroy = () => {\n this.root.remove();\n };\n}\n","import { HTMLEvent } from \"#app/types/helpers\";\nimport { DOM } from \"#app/dom\";\nimport \"./tooltip.css\";\n\ninterface CreateOptions {\n label: string;\n placement: \"left\" | \"bottom\";\n}\n\nconst BASE_Y_OFFSET_FROM_ELEMENT = 8;\nconst BASE_X_OFFSET_FROM_ELEMENT = 8;\n\ntype Position = {\n x: number;\n y: number;\n};\n\nexport class Tooltip {\n private container: HTMLElement | undefined;\n public label: HTMLElement | undefined;\n\n constructor() {\n this.container = undefined;\n }\n\n create = (options: CreateOptions) => {\n const container = DOM.create(\"div\", \"popup-container\", document.body);\n const span = DOM.create(\"span\", `popup-text popup-text-${options.placement}`, container);\n span.textContent = options.label;\n this.container = container;\n this.label = span;\n return this;\n };\n\n private activateAnimation = () => {\n const notActive = !this.label?.classList.value.includes(\"popup-text-active\");\n if (notActive) {\n this.label?.classList.add(\"popup-text-active\");\n }\n };\n\n private getLabelDimensions = () => {\n if (!this.label) return { width: 0, height: 0 };\n\n return {\n width: this.label.clientWidth,\n height: this.label.clientHeight,\n };\n };\n\n private getLeftPosition = (event: HTMLEvent<HTMLElement>): Position => {\n const { bottom, left } = event.target.getBoundingClientRect();\n const { width: labelWidth, height: labelHeight } = this.getLabelDimensions();\n\n return {\n x: left - BASE_X_OFFSET_FROM_ELEMENT - labelWidth,\n y: bottom - labelHeight - 2,\n };\n };\n\n private getBottomPosition = (event: HTMLEvent<HTMLElement>): Position => {\n const { bottom, left, right } = event.target.getBoundingClientRect();\n const { width: labelWidth } = this.getLabelDimensions();\n\n const elementCenterX = (right - left) / 2 + left;\n return {\n x: elementCenterX - labelWidth / 2,\n y: bottom + BASE_Y_OFFSET_FROM_ELEMENT,\n };\n };\n\n getPosition = (event: HTMLEvent<HTMLElement>, position: \"left\" | \"bottom\"): Position => {\n if (position === \"left\") {\n return this.getLeftPosition(event);\n }\n\n return this.getBottomPosition(event);\n };\n\n setPosition = (pos: Position) => {\n const { x, y } = pos;\n if (this.container) {\n this.container.style.left = `${x}px`;\n this.container.style.top = `${y}px`;\n }\n this.activateAnimation();\n };\n\n remove = () => {\n if (this.container) {\n DOM.remove(this.container);\n }\n };\n}\n","type Func<T> = (event: T) => any;\n\nexport type ChangeEvent<T> = {\n [K in keyof T]: {\n type: K;\n data?: T[K];\n };\n}[keyof T];\n\nexport class Observable<T> {\n observers: Set<Func<T>>;\n\n constructor() {\n this.observers = new Set<Func<T>>();\n }\n\n addObserver(observer: Func<T>) {\n this.observers.add(observer);\n }\n\n removeObserver(observer: Func<T>) {\n this.observers.delete(observer);\n }\n\n unsubscribe() {\n this.observers.clear();\n }\n\n notify(args: T) {\n this.observers.forEach((observer) => observer(args));\n }\n}\n","import { StoreChangeEventKeys } from \"#app/store/types\";\nimport { LiteralOrCustom } from \"#app/types/helpers\";\n\nexport interface Command {\n type: LiteralOrCustom<StoreChangeEventKeys>;\n payload?: any;\n execute: () => void;\n undo: () => void;\n}\n\nexport class CompoundCommand implements Command {\n constructor(\n public readonly type: LiteralOrCustom<StoreChangeEventKeys>,\n public readonly payload: any,\n private commands: Command[] = [],\n ) {}\n\n add(cmd: Command) {\n this.commands.push(cmd);\n }\n\n execute() {\n if (!this.commands) return;\n\n for (const cmd of this.commands) {\n cmd.execute();\n }\n }\n\n undo() {\n if (!this.commands) return;\n\n for (let i = this.commands.length - 1; i >= 0; i--) {\n const command = this.commands[i];\n command?.undo();\n }\n }\n}\n","import { Observable } from \"#app/observable\";\nimport { type Command, CompoundCommand } from \"./command\";\nimport type { TimelineChangeEvent } from \"./types\";\n\nexport class Timeline extends Observable<TimelineChangeEvent> {\n private transaction: CompoundCommand | null = null;\n private undoStack: Command[] = [];\n private redoStack: Command[] = [];\n\n private static instance: Timeline | null = null;\n\n static getInstance(): Timeline {\n if (!Timeline.instance) Timeline.instance = new Timeline();\n return Timeline.instance;\n }\n\n public commit = (cmd: Command) => {\n cmd.execute();\n if (this.transaction) {\n this.transaction.add(cmd);\n } else {\n this.undoStack.push(cmd);\n }\n\n this.redoStack.length = 0;\n this.pingConsumers();\n };\n\n public undo = () => {\n const cmd = this.undoStack.pop();\n if (!cmd) return;\n cmd.undo();\n this.redoStack.push(cmd);\n this.pingConsumers();\n return cmd;\n };\n\n public redo = () => {\n const cmd = this.redoStack.pop();\n if (!cmd) return null;\n cmd.execute();\n this.undoStack.push(cmd);\n this.pingConsumers();\n return cmd;\n };\n\n public beginTransaction = (type: string = \"compound\", payload: any = null) => {\n if (this.transaction) return;\n this.transaction = new CompoundCommand(type, payload);\n };\n\n public commitTransaction = () => {\n if (!this.transaction) return;\n const txn = this.transaction;\n this.transaction = null;\n\n this.undoStack.push(txn);\n this.pingConsumers();\n };\n\n public getRedoStackLength = () => {\n return this.redoStack.length;\n };\n\n public getUndoStackLength = () => {\n return this.undoStack.length;\n };\n\n public resetStacks = () => {\n this.undoStack = [];\n this.redoStack = [];\n this.notify({ type: \"REDO_STACK_CHANGED\", data: 0 });\n };\n\n pingConsumers = () => {\n this.notify({\n type: \"REDO_STACK_CHANGED\",\n data: this.redoStack.length,\n });\n\n this.notify({\n type: \"UNDO_STACK_CHANGED\",\n data: this.undoStack.length,\n });\n };\n}\n\nexport const timeline = Timeline.getInstance();\n","import type { AnyFunction } from \"#app/types/helpers\";\nimport type { Uuid } from \"#app/types/index\";\n\nexport const uuidv4 = (): Uuid => {\n if (\"crypto\" in window && \"randomUUID\" in window.crypto) {\n return window.crypto.randomUUID();\n }\n\n function getRandomHexChar() {\n const hexChars = \"0123456789abcdef\";\n return hexChars[Math.floor(Math.random() * 16)];\n }\n\n function getUuidSection(length: number) {\n let section = \"\";\n for (let i = 0; i < length; i++) {\n section += getRandomHexChar();\n }\n return section;\n }\n\n function getUuidSectionSize(idx: number) {\n const firstElement = idx === 0;\n const lastElement = idx === 4;\n\n if (firstElement) {\n return 8;\n }\n if (lastElement) {\n return 12;\n }\n\n return 4;\n }\n\n const parts = [];\n for (let i = 0; i < 5; i++) {\n parts.push(getUuidSection(getUuidSectionSize(i)));\n }\n\n return parts.join(\"-\") as Uuid;\n};\n\nexport const throttle = (fn: AnyFunction, delay: number) => {\n let lastArgs: any;\n let shouldCall = true;\n\n function execute() {\n if (shouldCall && lastArgs) {\n fn(...lastArgs);\n lastArgs = null;\n shouldCall = false;\n setTimeout(() => {\n shouldCall = true;\n execute();\n }, delay);\n }\n }\n\n return function (...args: any) {\n lastArgs = args;\n execute();\n };\n};\n\nexport const debounce = (fn: AnyFunction, delay: number) => {\n let timeout: number;\n\n return function (...args: any) {\n clearTimeout(timeout);\n timeout = window.setTimeout(() => {\n fn(...args);\n }, delay);\n };\n};\n","import type { RequiredDrawOptions } from \"#app/types/index\";\nimport type { AddLayerObject } from \"maplibre-gl\";\n\nexport const LINE_BASE = {\n type: \"FeatureCollection\",\n features: [\n {\n type: \"Feature\",\n properties: {},\n geometry: {\n type: \"LineString\",\n coordinates: [],\n },\n },\n ],\n};\n\nexport const ELAYERS = {\n LineDynamicLayer: \"mdl-line-dynamic-layer\",\n LineLayer: \"mdl-line-layer\",\n LineLayerTransparent: \"mdl-line-layer-transparent\",\n LineLayerBreak: \"mdl-line-break-layer\",\n PolygonLayer: \"mdl-polygon-layer\",\n PointsLayer: \"mdl-points-layer\",\n SinglePointLayer: \"mdl-single-point-layer\",\n FirstPointLayer: \"mdl-first-point-layer\",\n AuxiliaryPointLayer: \"mdl-auxiliary-point-layer\",\n} as const;\n\nexport const ESOURCES = {\n UnifiedSource: \"mdl-unified-source\",\n LineDynamicSource: \"mdl-line-dynamic-source\",\n LineSourceBreak: \"mdl-line-source-break\",\n SinglePointSource: \"mdl-single-point-source\",\n} as const;\n\nexport const FIRST_POINT_RADIUS = {\n large: 6.5,\n default: 5.5,\n};\n\nexport const FIRST_POINT_COLOR = {\n large: \"#FF6464\",\n default: \"#666666\",\n};\n\nexport const FIRST_POINT_PAINT_BASE = {\n \"circle-radius\": FIRST_POINT_RADIUS.default,\n \"circle-color\": \"#FEFFFE\",\n \"circle-stroke-color\": FIRST_POINT_COLOR.default,\n \"circle-stroke-width\": 3,\n};\n\nexport const AUXILIARY_POINT_PAINT_BASE = {\n \"circle-radius\": FIRST_POINT_RADIUS.default - 1.5,\n \"circle-color\": \"#FEFFFE\",\n \"circle-stroke-color\": \"#666666\",\n \"circle-stroke-width\": 2,\n};\n\nexport const ON_LINE_POINT_PAINT_BASE = {\n \"circle-radius\": FIRST_POINT_RADIUS.large,\n \"circle-color\": \"#FEFFFE\",\n \"circle-stroke-color\": \"#666666\",\n \"circle-stroke-width\": 3,\n};\n\nexport const POLYGON_PAINT_BASE = {\n \"fill-color\": \"grey\",\n \"fill-opacity\": 0.4,\n};\n\nexport const LINE_PAINT_BASE = {\n \"line-width\": 3,\n \"line-color\": \"grey\",\n \"line-opacity\": 0.7,\n};\n\nexport const POINTS_PAINT_BASE = {\n \"circle-radius\": FIRST_POINT_RADIUS.default,\n \"circle-color\": \"#FEFFFE\",\n \"circle-stroke-color\": \"#666666\",\n \"circle-stroke-width\": 3,\n};\n\nexport const BREAK_PAINT_BASE = {\n \"line-width\": 3,\n \"line-color\": \"#FF6464\",\n \"line-dasharray\": [3, 3],\n};\n\nexport const generateLayers = (options: RequiredDrawOptions) => {\n return [\n {\n id: ELAYERS.SinglePointLayer,\n source: ESOURCES.SinglePointSource,\n type: \"circle\",\n paint: options.layersPaint.onLinePoint,\n layout: {\n visibility: \"none\",\n },\n },\n {\n id: ELAYERS.PolygonLayer,\n source: ESOURCES.UnifiedSource,\n type: \"fill\",\n paint: options.layersPaint.polygon,\n layout: {\n visibility: \"none\",\n },\n filter: [\"==\", \"$type\", \"Polygon\"],\n },\n {\n id: ELAYERS.LineDynamicLayer,\n source: ESOURCES.LineDynamicSource,\n type: \"line\",\n paint: options.layersPaint.line,\n layout: {\n visibility: \"none\",\n },\n },\n {\n id: ELAYERS.LineLayer,\n source: ESOURCES.UnifiedSource,\n type: \"line\",\n paint: options.layersPaint.line,\n layout: {\n visibility: \"visible\",\n },\n filter: [\"==\", \"$type\", \"LineString\"],\n },\n {\n id: ELAYERS.LineLayerTransparent,\n source: ESOURCES.UnifiedSource,\n type: \"line\",\n paint: {\n \"line-width\": 4,\n \"line-color\": \"transparent\",\n },\n filter: [\"==\", \"$type\", \"LineString\"],\n },\n {\n id: ELAYERS.LineLayerBreak,\n source: ESOURCES.LineSourceBreak,\n type: \"line\",\n paint: options.layersPaint.breakLine,\n layout: {\n visibility: \"none\",\n },\n },\n {\n id: ELAYERS.PointsLayer,\n source: ESOURCES.UnifiedSource,\n type: \"circle\",\n paint: options.layersPaint.points,\n filter: [\"all\", [\"==\", \"$type\", \"Point\"], [\"==\", \"isFirst\", false], [\"==\", \"isAuxiliary\", false]],\n },\n {\n id: ELAYERS.FirstPointLayer,\n source: ESOURCES.UnifiedSource,\n type: \"circle\",\n paint: options.layersPaint.firstPoint,\n filter: [\"==\", [\"get\", \"isFirst\"], true],\n layout: {\n visibility: \"none\",\n },\n },\n {\n id: ELAYERS.AuxiliaryPointLayer,\n source: ESOURCES.UnifiedSource,\n type: \"circle\",\n paint: options.layersPaint.auxiliaryPoint,\n filter: [\"==\", [\"get\", \"isAuxiliary\"], true],\n },\n ] satisfies AddLayerObject[];\n};\n","import type { MapLayerMouseEvent } from \"maplibre-gl\";\nimport type { Step } from \"#app/types/index\";\n\nimport { ELAYERS } from \"#app/utils/geo_constants\";\nimport { uuidv4 } from \"#app/utils/helpers\";\n\nimport type { UnifiedMap } from \"#app/types/map\";\n\nexport const PointHelpers = {\n getMidpoint(p1: { lat: number; lng: number }, p2: { lat: number; lng: number }) {\n return {\n lat: (p1.lat + p2.lat) / 2,\n lng: (p1.lng + p2.lng) / 2,\n };\n },\n\n createAuxiliaryPoint(p1: Step, p2: Step) {\n const mid = PointHelpers.getMidpoint(p1, p2);\n const step = { lat: mid.lat, lng: mid.lng, isAuxiliary: true, id: uuidv4() };\n return step;\n },\n};\n\nexport const PointVisibility = {\n setFirstPointVisible(map: UnifiedMap) {\n map.setLayoutProperty(ELAYERS.FirstPointLayer, \"visibility\", \"visible\");\n },\n\n setFirstPointHidden(map: UnifiedMap) {\n map.setLayoutProperty(ELAYERS.FirstPointLayer, \"visibility\", \"none\");\n },\n\n setSinglePointVisible(event: MapLayerMouseEvent) {\n const map = event.target;\n map.setLayoutProperty(ELAYERS.SinglePointLayer, \"visibility\", \"visible\");\n },\n\n setSinglePointHidden(event: MapLayerMouseEvent) {\n const map = event.target;\n setTimeout(() => {\n map.setLayoutProperty(ELAYERS.SinglePointLayer, \"visibility\", \"none\");\n }, 33);\n },\n};\n\nexport const PointsFilter = {\n default(map: UnifiedMap) {\n map.setFilter(ELAYERS.PointsLayer, [\n \"all\",\n [\"==\", \"$type\", \"Point\"],\n [\"==\", \"isFirst\", false],\n [\"==\", \"isAuxiliary\", false],\n ]);\n },\n closedGeometry(map: UnifiedMap) {\n map.setFilter(ELAYERS.PointsLayer, [\"all\", [\"==\", \"$type\", \"Point\"], [\"==\", \"isAuxiliary\", false]]);\n },\n};\n","import type { RequiredDrawOptions } from \"#app/types\";\nimport type { ListNode, Store } from \".\";\n\nexport class Circular {\n constructor(\n private store: Store,\n private readonly options?: RequiredDrawOptions,\n ) {\n this.store = store;\n }\n public isCircular = (): boolean => {\n const { head, tail } = this.store;\n if (!head || !tail) return false;\n\n return head === tail.next && tail === head.prev;\n };\n\n public canBreak = (): boolean => {\n const { size } = this.store;\n\n const threshold = this.options?.pointGeneration === \"auto\" ? 3 : 2;\n return size <= threshold;\n };\n\n public canClose = (): boolean => {\n const { size } = this.store;\n\n const storeSize = this.options?.pointGeneration === \"auto\" ? size > 3 : size > 2;\n return storeSize && !this.isCircular();\n };\n\n // when we have 1 primary <--- 1 aux <--- 1 primary current will be an aux when 1 prim <--- 1 aux and a primary 1 aux <--- 1 prim\n // [aux] [primary]\n public break = (current: ListNode) => {\n if (!this.store.head) return;\n\n if (this.options?.pointGeneration === \"auto\") {\n // if the current node is an aux, then we need to make one step back for the tail and the head is the next node from the aux point\n if (current.val?.isAuxiliary) {\n const auxId = current.val?.id as string;\n this.store.head = current.next as ListNode;\n this.store.tail = current.prev as ListNode;\n this.store.removeNodeById(auxId);\n this.store.head.prev = null;\n this.store.tail.next = null;\n } else {\n const auxId = current.next?.val?.id as string;\n // else the tail is the current node and for the head we need to jump over the aux point so the next.next\n this.store.head = current.next?.next as ListNode;\n this.store.tail = current;\n this.store.removeNodeById(auxId);\n this.store.head.prev = null;\n this.store.tail.next = null;\n }\n } else {\n // no aux here, so the tail is the current node and the head is the next node\n this.store.head = current.next as ListNode;\n this.store.head.prev = null;\n this.store.tail = current;\n this.store.tail.next = null;\n }\n };\n\n public close = () => {\n const { head, tail } = this.store;\n if (!head || !tail) return;\n\n tail.next = head;\n head.prev = tail;\n };\n}\n","import type { RequiredDrawOptions, Step, StepId } from \"#app/types/index\";\nimport { Observable } from \"#app/observable\";\n\nimport { StoreChangeEvent } from \"./types\";\nimport { Circular } from \"./circular\";\nimport { initStore } from \"./init\";\n\nexport class ListNode {\n val: Step | null;\n prev: ListNode | null;\n next: ListNode | null;\n constructor(val: Step | null = null, next: ListNode | null = null, prev: ListNode | null = null) {\n this.val = val;\n this.prev = prev;\n this.next = next;\n }\n}\n\nexport class Store extends Observable<StoreChangeEvent> {\n head: ListNode | null;\n tail: ListNode | null;\n size: number;\n map: Map<StepId, ListNode>;\n public readonly circular: Circular;\n\n constructor(private readonly options?: RequiredDrawOptions) {\n super();\n let list = initStore(this.options);\n this.circular = new Circular(this, this.options);\n this.map = list ? list.map : new Map<StepId, ListNode>();\n this.head = list ? list.head : null;\n this.tail = list ? list.tail : null;\n this.size = list ? list.size : 0;\n }\n\n push = (step: Step) => {\n const newNode = new ListNode(step);\n if (!this.head) {\n this.head = this.tail = newNode;\n } else if (this.tail) {\n newNode.prev = this.tail;\n this.tail.next = newNode;\n this.tail = newNode;\n }\n\n this.map.set(step.id, newNode);\n this.size++;\n this.pingConsumers();\n return newNode;\n };\n\n public unshift = (step: Step) => {\n const newNode = new ListNode(step);\n\n newNode.next = this.head;\n this.head = newNode;\n\n if (this.circular.isCircular() && this.tail) {\n this.tail.next = newNode;\n newNode.prev = this.tail;\n }\n\n this.map.set(step.id, newNode);\n this.size++;\n this.pingConsumers();\n };\n\n public insertAfter = (node: ListNode, stepToInsert: Step) => {\n if (!node) return null;\n\n const newNode = new ListNode(stepToInsert);\n newNode.prev = node;\n newNode.next = node.next;\n\n const betweenHeadAndTail = this.tail === node && this.head === node.next;\n if (betweenHeadAndTail) {\n this.tail = newNode;\n this.head!.prev = newNode;\n }\n\n if (node.next) {\n node.next.prev = newNode;\n }\n\n node.next = newNode;\n this.map.set(stepToInsert.id, newNode);\n this.size++;\n this.pingConsumers();\n return newNode;\n };\n\n public removeNodeById(id: StepId): ListNode | null {\n const node = this.map.get(id);\n if (!node) return null;\n\n if (this.size === 1) {\n this.head = null;\n this.tail = null;\n } else {\n if (node.prev) {\n node.prev.next = node.next;\n }\n\n if (node.next) {\n node.next.prev = node.prev;\n }\n\n if (node === this.head) {\n this.head = node.next;\n if (this.head?.prev && this.tail) this.tail.next = this.head;\n }\n\n if (node === this.tail) {\n this.tail = node.prev;\n if (this.head && this.tail?.next) this.head.prev = this.tail;\n }\n }\n\n this.map.delete(id);\n this.size--;\n this.pingConsumers();\n\n return node;\n }\n\n public findStepById(id: StepId): ListNode[\"val\"] | null {\n const node = this.map.get(id);\n return node ? node.val : null;\n }\n\n public findNodeById(id: StepId): ListNode | null {\n const node = this.map.get(id);\n return node ? node : null;\n }\n\n public isLastPoint = (options: RequiredDrawOptions, id: StepId): boolean => {\n if (options.pointGeneration === \"auto\" && this.tail?.next === this.head) {\n return this.tail?.prev?.val?.id === id;\n }\n return this.tail?.val?.id === id;\n };\n\n public reset = () => {\n this.head = null;\n this.tail = null;\n this.size = 0;\n this.map.clear();\n this.notify({\n type: \"STORE_CLEARED\",\n });\n };\n\n public pingConsumers = () => {\n this.notify({\n type: \"STORE_MUTATED\",\n data: {\n head: this.head,\n tail: this.tail,\n size: this.size,\n },\n });\n };\n}\n","import { uuidv4 } from \"#app/utils/helpers\";\nimport type { Initial, LatLng, RequiredDrawOptions, Step } from \"#app/types/index\";\nimport { PointHelpers } from \"#components/map/points/helpers\";\n\nimport { ListNode, Store } from \".\";\n\nexport const ERRORS = {\n EMPTY_INITIAL_STATE:\n \"You passed an empty initial array in the options. Please either remove the 'initial' property or include at least one element in the array.\",\n MISSING_IDS:\n \"You set 'generateId' to false but did not provide IDs for all steps. Please ensure all steps have IDs or set 'generateId' to true.\",\n NOT_ENOUGH_POINTS_TO_CLOSE:\n \"At least three points are required to close a polygon or a line. Please add more points or set 'closeGeometry' to false.\",\n FIRST_LAST_POINT_NOT_EQUAL:\n \"The first and last points of a polygon or a closed linestring must be the same. Please ensure the first and last points are equal or set 'closeGeometry' to false.\",\n};\n\nfunction buildStepSequence(\n initialSteps: Step[],\n closeGeometry: Initial[\"closeGeometry\"],\n pointGeneration: RequiredDrawOptions[\"pointGeneration\"],\n): Store {\n const store = new Store();\n const steps = closeGeometry ? initialSteps.slice(0, -1) : initialSteps;\n\n steps.forEach((step, idx) => {\n store.push(step);\n\n // if we are at the end of the array and there's no next point\n // we need to create an auxiliary point with the first point\n // to close the geometry\n if (pointGeneration === \"auto\") {\n const isNextPointAvailable = steps[idx + 1];\n if (isNextPointAvailable) {\n const auxPoint = PointHelpers.createAuxiliaryPoint(step, steps[idx + 1] as Step);\n store.push(auxPoint);\n } else if (closeGeometry) {\n const auxPoint = PointHelpers.createAuxiliaryPoint(step, steps[0] as Step);\n store.push(auxPoint);\n }\n }\n });\n\n return store;\n}\n\nfunction generateIdForSteps(stepsWithoutIds: LatLng[]): Step[] {\n return stepsWithoutIds.map((step, idx) => {\n return { ...step, isAuxiliary: false, isFirst: idx === 0, id: uuidv4() };\n });\n}\n\nfunction fromArray(initialOptions: Initial, pointGeneration: RequiredDrawOptions[\"pointGeneration\"]): Store | null {\n const { steps: initialSteps, closeGeometry, generateId } = initialOptions;\n const steps = generateId ? generateIdForSteps(initialSteps) : initialSteps;\n const list = buildStepSequence(steps as Step[], closeGeometry, pointGeneration);\n\n if (closeGeometry && list.tail && list.head) {\n list.tail.next = list.head;\n list.head.prev = list.tail;\n }\n return list;\n}\n\nexport function initStore(options?: RequiredDrawOptions): Store | null {\n if (!options?.initial) return null;\n\n const emptyInitialOptions = options && options.initial && !options.initial.steps.length;\n if (emptyInitialOptions) {\n throw new Error(ERRORS[\"EMPTY_INITIAL_STATE\"]);\n }\n\n const initialOptionsProvided = options && options.initial.steps;\n if (initialOptionsProvided) {\n return fromArray(options.initial, options.pointGeneration);\n }\n\n return null;\n}\n\nexport function linkedListToArray(head: ListNode | null): Step[] {\n if (!head) return [];\n\n const visitedNodes = new Set<ListNode>();\n const result: Step[] = [];\n\n let current: ListNode | null = head;\n while (current !== null) {\n if (visitedNodes.has(current)) break;\n\n visitedNodes.add(current);\n result.push(current.val as Step);\n current = current.next;\n }\n\n return result;\n}\n","export const EVENTS = {\n RIGHTCLICKREMOVE: \"mdl:rightclickremove\",\n POINTENTER: \"mdl:pointenter\",\n POINT_LEAVE: \"mdl:pointleave\",\n MOVE_END: \"mdl:moveend\",\n ADD: \"mdl:add\",\n UNDO: \"mdl:undo\",\n REDO: \"mdl:redo\",\n REMOVE_ALL: \"mdl:removeall\",\n SAVE: \"mdl:save\",\n BREAK: \"mdl:break\",\n MODE_CHANGED: \"mdl:modechanged\",\n UNDO_STACK_CHANGED: \"mdl:undostackchanged\",\n REDO_STACK_CHANGED: \"mdl:redostackchanged\",\n} as const;\n\nexport const MOBILE_WIDTH = 768; // TODO put this inside options for the user to change\n","import type { UnifiedMap } from \"#app/types/map\";\nimport type { LatLng, StepId, Step } from \"#app/types/index\";\nimport { EVENTS } from \"#app/utils/constants\";\nimport type { DrawingMode } from \"./mode\";\nimport type { Mode } from \"./mode/types\";\nimport { TilesContext } from \"./tiles\";\n\nexport class FireEvents {\n static addPoint(step: Step & { total: number }, map: UnifiedMap, mode: DrawingMode) {\n map.fire(EVENTS.ADD, {\n id: step.id,\n coordinates: {\n lat: step.lat,\n lng: step.lng,\n },\n total: step.total,\n timestamp: Date.now(),\n mode: {\n geometry: mode.getMode(),\n closedGeometry: mode.getClosedGeometry(),\n },\n });\n }\n static movePoint(step: { end: LatLng; id: StepId; start: LatLng; total: number }, map: UnifiedMap) {\n map.fire(EVENTS.MOVE_END, {\n id: step.id,\n start_coordinates: {\n lat: step.start.lat,\n lng: step.start.lng,\n },\n end_coordinates: {\n lat: step.end.lat,\n lng: step.end.lng,\n },\n total: step.total,\n timestamp: Date.now(),\n });\n }\n static pointRemoveRightClick(step: Step & { total: number }, map: UnifiedMap) {\n map.fire(EVENTS.RIGHTCLICKREMOVE, {\n id: step.id,\n coordinates: {\n lat: step.lat,\n lng: step.lng,\n },\n total: step.total,\n timestamp: Date.now(),\n });\n }\n static enterPoint(step: Step & { total: number }, map: UnifiedMap) {\n map.fire(EVENTS.POINTENTER, {\n id: step.id,\n coordinates: {\n lat: step.lat,\n lng: step.lng,\n },\n total: step.total,\n timestamp: Date.now(),\n });\n }\n static leavePoint(step: Step & { total: number }, map: UnifiedMap) {\n map.fire(EVENTS.POINT_LEAVE, {\n id: step.id,\n coordinates: {\n lat: step.lat,\n lng: step.lng,\n },\n total: step.total,\n timestamp: Date.now(),\n });\n }\n static undo(step: Step & { total: number }, map: UnifiedMap, originalEvent?: Event) {\n map.fire(EVENTS.UNDO, {\n originalEvent,\n id: step.id,\n coordinates: {\n lat: step.lat,\n lng: step.lng,\n },\n total: step.total,\n timestamp: Date.now(),\n });\n }\n\n static redo(step: Step & { total: number }, map: UnifiedMap, originalEvent?: Event) {\n map.fire(EVENTS.REDO, {\n originalEvent,\n id: step.id,\n coordinates: {\n lat: step.lat,\n lng: step.lng,\n },\n total: step.total,\n timestamp: Date.now(),\n });\n }\n\n static modeChanged(map: UnifiedMap, mode: Mode | \"break\") {\n map.fire(EVENTS.MODE_CHANGED, {\n mode,\n });\n }\n static removeAllPoints(map: UnifiedMap, originalEvent: Event) {\n map.fire(EVENTS.REMOVE_ALL, { originalEvent });\n }\n static onSaveClick(context: Pick<TilesContext, \"map\" | \"mode\">, steps: Step[], originalEvent: Event) {\n const { map, mode } = context;\n\n map.fire(EVENTS.SAVE, {\n originalEvent,\n timestamp: Date.now(),\n steps,\n mode: {\n geometry: mode.getMode(),\n closedGeometry: mode.getClosedGeometry(),\n },\n });\n }\n static onLineBreak(map: UnifiedMap) {\n map.fire(EVENTS.BREAK);\n }\n\n static onUndoStackChange = (map: UnifiedMap, length?: number) => {\n map.fire(EVENTS.UNDO_STACK_CHANGED, { length });\n };\n\n static onRedoStackChange = (map: UnifiedMap, length?: number) => {\n map.fire(EVENTS.REDO_STACK_CHANGED, { length });\n };\n}\n","import { Store } from \"#app/store\";\n\nfunction collectGeometryCoordinates(store: Store): number[][] {\n const coordinates = [];\n let current = store.head;\n const visitedNodes = new Set();\n\n while (current !== null) {\n if (visitedNodes.has(current.val?.id)) {\n if (store.head && store.head.val) {\n coordinates.push([store.head.val.lng, store.head.val.lat]);\n }\n break;\n }\n visitedNodes.add(current.val?.id);\n\n if (current.val) {\n coordinates.push([current.val.lng, current.val.lat]);\n }\n current = current.next;\n }\n\n return coordinates;\n}\n\nexport function getLine(current: [number, number], next: [number, number]) {\n return {\n type: \"FeatureCollection\",\n features: [\n {\n type: \"Feature\",\n properties: {},\n geometry: {\n type: \"LineString\",\n coordinates: [current, next],\n },\n },\n ],\n };\n}\n\nfunction getAllLines(coordinates: number[][]) {\n return {\n type: \"FeatureCollection\",\n features: [\n {\n type: \"Feature\",\n properties: {},\n geometry: {\n type: \"LineString\",\n coordinates: coordinates,\n },\n },\n ],\n };\n}\n\nfunction getPolygon(coordinates: number[][]) {\n return {\n type: \"FeatureCollection\",\n features: [\n {\n type: \"Feature\",\n properties: {},\n geometry: {\n type: \"Polygon\",\n coordinates: [coordinates],\n },\n },\n ],\n };\n}\n\nfunction getPoints(store: Store) {\n let current = store.head;\n const pointFeatures = [];\n const visitedNodes = new Set();\n\n while (current !== null) {\n if (visitedNodes.has(current.val?.id)) {\n break;\n }\n if (current.val) {\n const val = current.val;\n const head = current.val.id === store.head?.val?.id;\n pointFeatures.push({\n type: \"Feature\",\n properties: { id: val.id, lat: val.lat, lng: val.lng, isFirst: head, isAuxiliary: val.isAuxiliary },\n geometry: {\n type: \"Point\",\n coordinates: [val.lng, val.lat],\n },\n });\n }\n visitedNodes.add(current.val?.id);\n current = current.next;\n }\n\n return {\n type: \"FeatureCollection\",\n features: pointFeatures,\n };\n}\n\n// CAUTION: render is dependent on this function\nexport function getUnifiedFeatures(\n store: Store,\n): GeoJSON.FeatureCollection<GeoJSON.LineString | GeoJSON.Polygon | GeoJSON.Point> {\n const points = getPoints(store).features;\n const coordinates = collectGeometryCoordinates(store);\n\n const lines = getAllLines(coordinates).features;\n const polygons = getPolygon(coordinates).features;\n\n return {\n type: \"FeatureCollection\",\n features: [...points, ...lines, ...polygons],\n } as GeoJSON.FeatureCollection<GeoJSON.LineString | GeoJSON.Polygon | GeoJSON.Point>;\n}\n","import type { GeoJSONSource } from \"maplibre-gl\";\n\nimport type { LatLng, RequiredDrawOptions } from \"#app/types/index\";\nimport type { UnifiedMap } from \"#app/types/map\";\nimport type { Store } from \"#app/store/index\";\nimport type { DrawingMode } from \"#components/map/mode\";\nimport { ESOURCES } from \"#app/utils/geo_constants\";\nimport { getUnifiedFeatures } from \"./geojson-builder\";\n\ninterface Context {\n map: UnifiedMap;\n store: Store;\n options: RequiredDrawOptions;\n mode: DrawingMode;\n}\n\nexport class Renderer {\n private static instance: Renderer | null = null;\n private ctx: Context | null = null;\n private unifiedGeoJSON: GeoJSON.FeatureCollection<GeoJSON.LineString | GeoJSON.Polygon | GeoJSON.Point>;\n\n constructor() {\n this.unifiedGeoJSON = {\n type: \"FeatureCollection\",\n features: [],\n };\n }\n\n public initialize(ctx: Context): Renderer | null {\n this.ctx = ctx;\n this.unifiedGeoJSON = getUnifiedFeatures(this.ctx.store);\n this.execute();\n\n return Renderer.instance;\n }\n\n public static getInstance(): Renderer {\n if (!Renderer.instance) {\n Renderer.instance = new Renderer();\n }\n return Renderer.instance;\n }\n\n private getContext(): Context {\n if (!this.ctx) {\n throw new Error(\"Somehow trolled with Renderer.getContext, check the Renderer.initialize\");\n }\n return this.ctx;\n }\n\n private updateLine(featureIdx: number, newCoord: LatLng) {\n const { mode } = this.getContext();\n\n // -2 because line is always the second to last feature. Check getUnifiedFeatures\n const line = this.unifiedGeoJSON.features.at(-2)?.geometry.coordinates;\n if (!line) return;\n line[featureIdx] = [newCoord.lng, newCoord.lat];\n\n if (mode.getClosedGeometry() && featureIdx === 0) {\n line[line.length - 1] = [newCoord.lng, newCoord.lat];\n }\n }\n\n private updatePolygon(featureIdx: number, newCoord: LatLng) {\n const { mode } = this.getContext();\n\n // -1 because polygon is always the last feature. Check getUnifiedFeatures\n const polygon = this.unifiedGeoJSON.features.at(-1)?.geometry.coordinates[0] as number[][];\n\n if (!polygon) return;\n polygon[featureIdx] = [newCoord.lng, newCoord.lat];\n\n if (mode.getClosedGeometry() && featureIdx === 0) {\n polygon[polygon.length - 1] = [newCoord.lng, newCoord.lat];\n }\n }\n\n private updatePoint(featureIdx: number, newCoord: LatLng) {\n // points are always the first feature. Check getUnifiedFeatures\n const feature = this.unifiedGeoJSON?.features?.[featureIdx];\n if (feature?.geometry?.coordinates) {\n feature.geometry.coordinates = [newCoord.lng, newCoord.lat];\n }\n }\n\n public executeOnMouseMove = (\n featureIdx: number,\n newCoord: LatLng,\n aux: { next: LatLng | null; prev: LatLng | null } | null,\n ) => {\n const { map, mode, options, store } = this.getContext();\n\n const prevIdx = featureIdx === 0 ? store.size - 1 : featureIdx - 1;\n\n this.updatePoint(featureIdx, newCoord);\n if (aux && aux.prev) {\n this.updatePoint(prevIdx, aux.prev);\n }\n if (aux && aux.next) {\n this.updatePoint(featureIdx + 1, aux.next);\n }\n\n this.updateLine(featureIdx, newCoord);\n if (aux && aux.prev) {\n this.updateLine(prevIdx, aux.prev);\n }\n if (aux && aux.next) {\n this.updateLine(featureIdx + 1, aux.next);\n }\n\n const polygonOptionChecked = options.modes.polygon.visible;\n\n if (polygonOptionChecked && mode.isPolygon()) {\n this.updatePolygon(featureIdx, newCoord);\n if (aux && aux.prev) {\n this.updatePolygon(prevIdx, aux.prev);\n }\n if (aux && aux.next) {\n this.updatePolygon(featureIdx + 1, aux.next);\n }\n }\n\n const unifiedSource = map.getSource(ESOURCES.UnifiedSource) as GeoJSONSource;\n if (unifiedSource) {\n unifiedSource.setData(this.unifiedGeoJSON);\n }\n };\n\n public execute() {\n const { map, store } = this.getContext();\n\n this.unifiedGeoJSON = getUnifiedFeatures(store);\n const unifiedSource = map.getSource(ESOURCES.UnifiedSource) as GeoJSONSource;\n\n if (unifiedSource) {\n unifiedSource.setData(this.unifiedGeoJSON);\n }\n }\n\n public resetGeometries = () => {\n const { map } = this.getContext();\n\n const unifiedSource = map.getSource(ESOURCES.UnifiedSource) as GeoJSONSource;\n if (unifiedSource) {\n unifiedSource.setData({\n type: \"FeatureCollection\",\n features: [],\n });\n }\n };\n}\n\nexport const renderer = Renderer.getInstance();\n","import { timeline } from \"#app/history\";\nimport { linkedListToArray } from \"#app/store/init\";\nimport { Step } from \"#app/types\";\nimport { FireEvents } from \"#components/map/fire-events\";\nimport { renderer } from \"#components/map/renderer\";\nimport { Context } from \".\";\nimport { View } from \"./view\";\n\nexport class Actions {\n constructor(private readonly ctx: Context & { view: View }) {}\n\n public clear = (event?: Event) => {\n const { mode, view, store, map } = this.ctx;\n store.reset();\n view.hide();\n mode.reset();\n timeline.resetStacks();\n renderer.resetGeometries();\n if (event) {\n FireEvents.removeAllPoints(map, event);\n }\n renderer.execute();\n };\n\n public undo = (event?: Event) => {\n const { store, map, view } = this.ctx;\n const hasSomethingToRedo = timeline.getRedoStackLength();\n\n // hasSomethingToRedo prevents from resetting the store when we still have something to redo and are trying to remove the last point by undoing\n if (store.size === 1 && hasSomethingToRedo) {\n store.reset();\n view.hide();\n } else {\n timeline.undo();\n }\n if (event) {\n FireEvents.undo({ ...(store.tail?.val as Step), total: store.size }, map, event);\n }\n renderer.execute();\n };\n\n public redo = (event?: Event) => {\n const { store, map } = this.ctx;\n\n timeline.redo();\n if (event) {\n FireEvents.redo({ ...(store.tail?.val as Step), total: store.size }, map, event);\n }\n renderer.execute();\n };\n\n public save = (event?: Event) => {\n const { store, options } = this.ctx;\n\n if (event) {\n FireEvents.onSaveClick(this.ctx, linkedListToArray(store.head), event);\n }\n if (options.panel.buttons.save.clearOnSave) {\n this.clear(event);\n }\n renderer.execute();\n };\n}\n","import type { ButtonType } from \"#app/types/index\";\nimport type { HTMLEvent } from \"#app/types/helpers\";\nimport { DOM } from \"#app/dom\";\nimport { Tooltip } from \"#components/tooltip\";\nimport { View } from \"./view\";\nimport { Context } from \".\";\nimport { Actions } from \"./actions\";\n\nexport class Events {\n private tooltip: Tooltip;\n private actions: Actions | null = null;\n\n constructor(private readonly ctx: Context & { view: View }) {\n this.tooltip = new Tooltip();\n this.actions = new Actions(this.ctx);\n }\n\n private addButtonListeners(type: ButtonType, handler: (e: Event) => void): void {\n const btn = this.ctx.view.getButton(type);\n if (!btn) return;\n DOM.addEventListener(btn, \"click\", handler);\n DOM.addEventListener(btn, \"mouseenter\", this.onMouseEnter);\n DOM.addEventListener(btn, \"mouseleave\", this.onMouseLeave);\n }\n\n private removeButtonListeners(type: ButtonType, onClick: (e: Event) => void): void {\n const btn = this.ctx.view.getButton(type);\n if (!btn) return;\n DOM.removeEventListener(btn, \"click\", onClick);\n DOM.removeEventListener(btn, \"mouseenter\", this.onMouseEnter);\n DOM.removeEventListener(btn, \"mouseleave\", this.onMouseLeave);\n }\n\n public initEvents(): void {\n this.addButtonListeners(\"undo\", this.onUndoClick);\n this.addButtonListeners(\"redo\", this.onRedoClick);\n this.addButtonListeners(\"delete\", this.onClearClick);\n this.addButtonListeners(\"save\", this.onSaveClick);\n }\n\n public removeEvents(): void {\n this.removeButtonListeners(\"undo\", this.onUndoClick);\n this.removeButtonListeners(\"redo\", this.onRedoClick);\n this.removeButtonListeners(\"delete\", this.onClearClick);\n this.removeButtonListeners(\"save\", this.onSaveClick);\n }\n\n private getButtonLabel = (type: ButtonType) => {\n const { options } = this.ctx;\n\n const LABELS: Record<ButtonType, string> = {\n undo: options.locale.undo,\n redo: options.locale.redo,\n delete: options.locale.delete,\n save: options.locale.save,\n };\n\n return LABELS[type];\n };\n\n private onMouseEnter = (event: Event) => {\n const target = event.target as HTMLElement;\n const type = target.getAttribute(\"data-type\") as ButtonType;\n if (type) {\n const label = this.getButtonLabel(type);\n\n this.tooltip\n .create({\n label,\n placement: \"bottom\",\n })\n .setPosition(this.tooltip.getPosition(event as HTMLEvent<HTMLElement>, \"bottom\"));\n }\n };\n\n private onMouseLeave = () => {\n this.tooltip.remove();\n };\n\n private onUndoClick = (e: Event): void => {\n this.actions?.undo(e);\n this.tooltip.remove();\n };\n\n private onRedoClick = (e: Event): void => {\n this.actions?.redo(e);\n this.tooltip.remove();\n };\n\n private onClearClick = (e: Event): void => {\n this.actions?.clear(e);\n this.tooltip.remove();\n };\n\n private onSaveClick = (e: Event): void => {\n this.actions?.save(e);\n this.tooltip.remove();\n };\n\n public api() {\n return this.actions;\n }\n}\n","import type { LatLng } from \"#app/types/index\";\nimport type { StoreChangeEvent } from \"#app/store/types\";\nimport type { DrawingModeChangeEvent } from \"#components/map/mode/types\";\nimport { DOM } from \"#app/dom\";\nimport { timeline } from \"#app/history\";\nimport { TimelineChangeEvent } from \"#app/history/types\";\nimport { Context } from \".\";\nimport { View } from \"./view\";\n\nexport class Observer {\n constructor(private readonly ctx: Context & { view: View; setPanelLocation: (coordinates: LatLng) => void }) {}\n\n public initConsumers() {\n this.ctx.store.addObserver(this.onStoreChangeConsumer);\n this.ctx.mode?.addObserver(this.onMapModeConsumer);\n timeline.addObserver(this.onTimelineChangeConsumer);\n }\n\n public removeConsumers() {\n this.ctx.store.removeObserver(this.onStoreChangeConsumer);\n this.ctx.mode?.removeObserver(this.onMapModeConsumer);\n timeline.removeObserver(this.onTimelineChangeConsumer);\n }\n\n private onTimelineChangeConsumer = (event: TimelineChangeEvent) => {\n const { type, data } = event;\n if (type === \"REDO_STACK_CHANGED\") {\n if (!data) {\n DOM.disableButton(this.ctx.view.getButton(\"redo\"));\n } else {\n DOM.enableButton(this.ctx.view.getButton(\"redo\"));\n }\n }\n\n if (type === \"UNDO_STACK_CHANGED\") {\n if (!data) {\n DOM.disableButton(this.ctx.view.getButton(\"undo\"));\n } else {\n DOM.enableButton(this.ctx.view.getButton(\"undo\"));\n }\n }\n };\n\n private onStoreChangeConsumer = (event: StoreChangeEvent) => {\n if (event.type === \"STORE_MUTATED\") {\n const { data } = event;\n if (data?.size === 0) {\n this.ctx.view.hide();\n } else {\n let current = Object.assign({}, data);\n\n // TODO why the hell do we need a loop here? We don't like loops\n while (current.tail) {\n if (current.tail?.val?.isAuxiliary) {\n current.tail = current.tail?.prev;\n } else {\n if (current.tail?.val) {\n this.ctx.setPanelLocation({\n lat: current.tail.val.lat,\n lng: current.tail.val.lng,\n });\n }\n break;\n }\n }\n }\n }\n };\n\n private onMapModeConsumer = (event: DrawingModeChangeEvent) => {\n const { store } = this.ctx;\n const { type, data } = event;\n if (type === \"MODE_CHANGED\" && !data) {\n this.ctx.view.hide();\n }\n if (type === \"MODE_CHANGED\" && data) {\n if (this.ctx.store.circular.isCircular()) {\n if (this.ctx.options.pointGeneration === \"auto\") {\n if (store.tail?.prev?.val) {\n this.ctx.setPanelLocation({\n lat: store.tail.prev.val.lat,\n lng: store.tail.prev.val.lng,\n });\n }\n } else {\n if (store.tail?.val) {\n this.ctx.setPanelLocation({\n lat: store.tail.val.lat,\n lng: store.tail.val.lng,\n });\n }\n }\n } else {\n if (store.tail?.val) {\n this.ctx.setPanelLocation({\n lat: store.tail.val.lat,\n lng: store.tail.val.lng,\n });\n }\n }\n }\n };\n}\n","import type { UnifiedMap } from \"#app/types/map\";\nimport type { LatLng, RequiredDrawOptions } from \"#app/types/index\";\nimport type { Store } from \"#app/store/index\";\nimport type { DrawingMode } from \"#components/map/mode\";\nimport { UIState } from \"./state\";\nimport { View } from \"./view\";\nimport { Events } from \"./events\";\nimport \"./panel.css\";\nimport { Observer } from \"./observer\";\n\nexport interface Context {\n map: UnifiedMap;\n mode: DrawingMode;\n options: RequiredDrawOptions;\n store: Store;\n}\n\nconst OFFSET_Y = 20;\n\nexport class Panel {\n private readonly view: View;\n private readonly state = new UIState();\n private readonly events: Events;\n private readonly observer: Observer;\n private resizeObserver!: ResizeObserver;\n\n private readonly onMapMove = () => this.schedulePositionUpdate();\n\n constructor(private readonly ctx: Context) {\n this.view = new View(ctx);\n this.events = new Events({\n ...ctx,\n view: this.view,\n });\n this.observer = new Observer({\n ...ctx,\n view: this.view,\n setPanelLocation: this.setPanelLocation,\n });\n\n this.init();\n }\n\n private init() {\n const { store } = this.ctx;\n this.resizeObserver = this.view.observeResize(this.measureAnchor);\n this.measureAnchor();\n if (store.tail?.val) this.setPanelLocation(store.tail.val);\n this.events.initEvents();\n this.observer.initConsumers();\n }\n\n public destroy() {\n this.observer.removeConsumers();\n this.events.removeEvents();\n if (this.state.listenersActive) {\n this.disableListeners();\n }\n this.resizeObserver.disconnect();\n cancelAnimationFrame(this.state.rafId);\n this.view.destroy();\n }\n\n private enableListeners() {\n if (this.state.listenersActive) return;\n const map = this.ctx.map;\n map.on(\"move\", this.onMapMove);\n map.on(\"zoom\", this.onMapMove);\n this.state.listenersActive = true;\n }\n\n private disableListeners() {\n if (!this.state.listenersActive) return;\n const map = this.ctx.map;\n map.off(\"move\", this.onMapMove);\n map.off(\"zoom\", this.onMapMove);\n this.state.listenersActive = false;\n }\n\n public setPanelLocation = (coordinates: LatLng) => {\n this.state.pendingCoord = coordinates;\n this.enableListeners();\n this.schedulePositionUpdate();\n this.show();\n };\n\n private measureAnchor = () => {\n const { width, height } = this.view.getRoot().getBoundingClientRect();\n this.state.anchor = { dx: -width / 2, dy: -height - OFFSET_Y };\n this.schedulePositionUpdate();\n };\n\n private schedulePositionUpdate = () => {\n if (this.state.rafId) return;\n this.state.rafId = requestAnimationFrame(() => {\n this.state.rafId = 0;\n if (this.state.pendingCoord) {\n const point = this.ctx.map.project(this.state.pendingCoord);\n const { dx, dy } = this.state.anchor;\n this.view.setTransform(point.x + dx, point.y + dy);\n }\n });\n };\n\n private setVisible(visible: boolean) {\n this.state.isHidden = !visible;\n if (visible) this.view.show();\n else this.view.hide();\n }\n\n public show = () => this.setVisible(true);\n public hide = () => this.setVisible(false);\n public api = () => this.events.api();\n}\n","export const CURSORS = {\n AUTO: \"auto\",\n DEFAULT: \"default\",\n POINTER: \"pointer\",\n CROSSHAIR: \"crosshair\",\n MOVE: \"move\",\n HELP: \"help\",\n GRAB: \"grab\",\n GRABBING: \"grabbing\",\n} as const;\n\nexport type TCursor = (typeof CURSORS)[keyof typeof CURSORS];\n","import { ControlType, RequiredDrawOptions } from \"#app/types/index\";\n\nexport const getButtonLabel = (type: ControlType, options: RequiredDrawOptions) => {\n const lineTitle = options.locale.line;\n const polygonTitle = options.locale.polygon;\n const breakTitle = options.locale.break;\n\n const LABELS = {\n line: lineTitle,\n polygon: polygonTitle,\n break: breakTitle,\n };\n\n return LABELS[type];\n};\n","import type { ControlType } from \"#app/types/index\";\nimport type { HTMLEvent } from \"#app/types/helpers\";\nimport { Tooltip } from \"#components/tooltip\";\nimport { CURSORS } from \"#components/cursor/constants\";\nimport { DOM } from \"#app/dom\";\n\nimport { getButtonLabel } from \"./helpers\";\nimport type { Context } from \".\";\nimport type { View } from \"./view\";\n\nexport class Events {\n private tooltip: Tooltip;\n\n constructor(private readonly ctx: Context & { view: View }) {\n this.tooltip = new Tooltip();\n this.initEvents();\n }\n\n initEvents() {\n const { lineButton, breakButton, polygonButton } = this.ctx.view;\n\n if (lineButton) {\n DOM.addEventListener(lineButton, \"click\", this.onLineClick);\n DOM.addEventListener(lineButton, \"mouseenter\", this.onButtonEnter as EventListenerOrEventListenerObject);\n DOM.addEventListener(lineButton, \"mouseleave\", this.onButtonLeave);\n }\n if (polygonButton) {\n DOM.addEventListener(polygonButton, \"click\", this.onPolygonClick);\n DOM.addEventListener(polygonButton, \"mouseenter\", this.onButtonEnter as EventListenerOrEventListenerObject);\n DOM.addEventListener(polygonButton, \"mouseleave\", this.onButtonLeave);\n }\n if (breakButton) {\n DOM.addEventListener(breakButton, \"click\", this.onBreakClick);\n DOM.addEventListener(breakButton, \"mouseenter\", this.onButtonEnter as EventListenerOrEventListenerObject);\n DOM.addEventListener(breakButton, \"mouseleave\", this.onButtonLeave);\n }\n }\n\n removeEvents() {\n const { lineButton, breakButton, polygonButton } = this.ctx.view;\n\n if (lineButton) {\n DOM.removeEventListener(lineButton, \"click\", this.onLineClick);\n DOM.removeEventListener(lineButton, \"mouseenter\", this.onButtonEnter as EventListenerOrEventListenerObject);\n DOM.removeEventListener(lineButton, \"mouseleave\", this.onButtonLeave);\n }\n if (polygonButton) {\n DOM.removeEventListener(polygonButton, \"click\", this.onPolygonClick);\n DOM.removeEventListener(polygonButton, \"mouseenter\", this.onButtonEnter as EventListenerOrEventListenerObject);\n DOM.removeEventListener(polygonButton, \"mouseleave\", this.onButtonLeave);\n }\n if (breakButton) {\n DOM.removeEventListener(breakButton, \"click\", this.onBreakClick);\n DOM.removeEventListener(breakButton, \"mouseenter\", this.onButtonEnter as EventListenerOrEventListenerObject);\n DOM.removeEventListener(breakButton, \"mouseleave\", this.onButtonLeave);\n }\n }\n\n remove() {\n this.removeEvents();\n this.tooltip.remove();\n }\n\n onButtonEnter = (event: HTMLEvent<HTMLButtonElement>) => {\n const { options } = this.ctx;\n\n const type = event.target.getAttribute(\"data-type\") as ControlType;\n\n if (type) {\n const label = getButtonLabel(type, options);\n const placement = \"left\";\n this.tooltip\n .create({\n label,\n placement,\n })\n .setPosition(this.tooltip.getPosition(event, placement));\n }\n };\n\n onButtonLeave = () => {\n this.tooltip.remove();\n };\n\n removeActiveClass = () => {\n const { lineButton, breakButton, polygonButton } = this.ctx.view;\n\n lineButton?.classList.remove(\"control-button-active\");\n polygonButton?.classList.remove(\"control-button-active\");\n breakButton?.classList.remove(\"control-button-active\");\n };\n\n onLineClick = () => {\n const { mode } = this.ctx;\n const { lineButton } = this.ctx.view;\n\n if (mode.getMode() === \"line\") {\n mode.setMode(null);\n this.removeActiveClass();\n return;\n }\n\n this.removeActiveClass();\n lineButton?.classList.add(\"control-button-active\");\n mode.setMode(\"line\");\n console.log(mode.getMode());\n };\n\n onPolygonClick = () => {\n const { mode } = this.ctx;\n const { polygonButton } = this.ctx.view;\n\n if (mode.getMode() === \"polygon\") {\n mode.setMode(null);\n this.removeActiveClass();\n return;\n }\n\n this.removeActiveClass();\n polygonButton?.classList.add(\"control-button-active\");\n mode.setMode(\"polygon\");\n };\n\n onBreakClick = () => {\n const { map, mode } = this.ctx;\n const { breakButton } = this.ctx.view;\n\n this.removeActiveClass();\n breakButton?.classList.add(\"control-button-active\");\n mode.setBreak(true);\n map.getCanvasContainer().style.cursor = CURSORS.POINTER;\n };\n}\n","import { DOM } from \"#app/dom\";\nimport { FireEvents } from \"#components/map/fire-events\";\nimport { DrawingModeChangeEvent, Mode } from \"#components/map/mode/types\";\nimport { Context } from \".\";\nimport { View } from \"./view\";\n\nexport class Observer {\n constructor(private readonly ctx: Context & { view: View }) {\n this.initConsumers();\n }\n\n private initConsumers = () => {\n this.ctx.mode.addObserver(this.mapModeConsumer);\n };\n\n public remove = () => {\n this.ctx.mode.removeObserver(this.mapModeConsumer);\n };\n\n private resetAllState = () => {\n const { lineButton, breakButton, polygonButton } = this.ctx.view;\n\n lineButton?.classList.remove(\"control-button-active\");\n polygonButton?.classList.remove(\"control-button-active\");\n breakButton?.classList.remove(\"control-button-active\");\n };\n\n private checkActive = (button: HTMLElement) => {\n this.resetAllState();\n button.classList.add(\"control-button-active\");\n };\n\n private observeModeChange = (event: DrawingModeChangeEvent) => {\n const { data } = event;\n const { lineButton, breakButton, polygonButton } = this.ctx.view;\n\n const { mode } = this.ctx;\n FireEvents.modeChanged(this.ctx.map, data as Mode);\n\n if (!lineButton || !polygonButton || !breakButton) return;\n\n switch (data) {\n case \"line\":\n this.checkActive(lineButton);\n break;\n case \"polygon\":\n this.checkActive(polygonButton);\n break;\n default:\n break;\n }\n\n if (!data) {\n DOM.disableButton(breakButton);\n } else {\n if (mode.getClosedGeometry()) {\n DOM.enableButton(breakButton);\n }\n }\n };\n\n private observeGeometryChange = (event: DrawingModeChangeEvent) => {\n const { data } = event;\n const { lineButton, breakButton, polygonButton } = this.ctx.view;\n\n const { mode } = this.ctx;\n const currentMode = mode.getMode();\n\n if (breakButton) {\n data ? DOM.enableButton(breakButton) : DOM.disableButton(breakButton);\n }\n if (currentMode === \"polygon\" && lineButton) {\n data ? DOM.disableButton(lineButton) : DOM.enableButton(lineButton);\n }\n if (currentMode === \"line\" && polygonButton) {\n data ? DOM.disableButton(polygonButton) : DOM.enableButton(polygonButton);\n }\n };\n\n private mapModeConsumer = (event: DrawingModeChangeEvent) => {\n const { type, data } = event;\n\n if (type === \"MODE_CHANGED\") {\n this.observeModeChange(event);\n }\n if (type === \"CLOSED_GEOMETRY_CHANGED\") {\n this.observeGeometryChange(event);\n }\n if (type === \"BREAK_CHANGED\" && data) {\n const { breakButton } = this.ctx.view;\n\n this.checkActive(breakButton as HTMLElement);\n FireEvents.modeChanged(this.ctx.map, \"break\");\n }\n };\n}\n","import { DOM } from \"#app/dom\";\nimport { Context } from \".\";\n\nexport class View {\n private root: HTMLDivElement;\n public lineButton?: HTMLButtonElement;\n public polygonButton?: HTMLButtonElement;\n public breakButton?: HTMLButtonElement;\n\n constructor(private readonly ctx: Pick<Context, \"options\" | \"mode\">) {\n this.root = DOM.create(\"div\", \"mapboxgl-ctrl mapboxgl-ctrl-group maplibregl-ctrl maplibregl-ctrl-group\");\n this.createControl();\n }\n\n createControlButton = (\n type: \"line\" | \"polygon\" | \"break\",\n title: string,\n active: boolean,\n disabled?: boolean,\n ): HTMLButtonElement => {\n const size = this.ctx.options.panel.size;\n const button = DOM.create(\"button\", `control-button control-button-${size}`, this.root);\n button.setAttribute(\"aria-label\", title);\n button.setAttribute(\"data-type\", type);\n\n if (active) {\n button.classList.add(\"control-button-active\");\n }\n if (disabled) {\n DOM.disableButton(button);\n }\n DOM.create(\"span\", `icon ${type} icon-medium`, button);\n return button;\n };\n\n private createLineButton = () => {\n const { mode, options } = this.ctx;\n const lineVisible = this.ctx.options.modes.line.visible;\n const lineTitle = options.locale.line;\n if (lineVisible) {\n this.lineButton = this.createControlButton(\"line\", lineTitle, mode.getMode() === \"line\");\n }\n };\n\n private createPolygonButton = () => {\n const { mode, options } = this.ctx;\n\n const polygonVisible = this.ctx.options.modes.polygon.visible;\n const polygonTitle = options.locale.polygon;\n if (polygonVisible) {\n this.polygonButton = this.createControlButton(\"polygon\", polygonTitle, mode.getMode() === \"polygon\");\n }\n };\n\n private createBreakButton = () => {\n const { mode, options } = this.ctx;\n\n const breakVisible = this.ctx.options.modes.breakGeometry.visible;\n const breakTitle = options.locale.break;\n if (breakVisible) {\n const closedGeometry = this.ctx.options.initial?.closeGeometry;\n const disabled = !closedGeometry;\n const isBreak = mode.getBreak();\n this.breakButton = this.createControlButton(\"break\", breakTitle, isBreak, disabled);\n }\n };\n\n private createControl = () => {\n this.createLineButton();\n this.createPolygonButton();\n this.createBreakButton();\n };\n\n public getContainer = (): HTMLDivElement => {\n return this.root;\n };\n\n public destroy = () => {\n this.root.remove();\n };\n}\n","import type { RequiredDrawOptions } from \"#app/types/index\";\nimport { UnifiedMap } from \"#app/types/map\";\nimport { DrawingMode } from \"#components/map/mode\";\nimport { Events } from \"./events\";\nimport { Observer } from \"./observer\";\nimport { View } from \"./view\";\nimport \"./control.css\";\n\nexport interface Context {\n options: RequiredDrawOptions;\n mode: DrawingMode;\n map: UnifiedMap;\n}\n\nexport class Control {\n private readonly view: View;\n private readonly events: Events;\n private readonly observer: Observer;\n\n constructor(readonly ctx: Context) {\n this.view = new View(ctx);\n const enrichedCtx: Context & { view: View } = { ...ctx, view: this.view };\n\n this.events = new Events(enrichedCtx);\n this.observer = new Observer(enrichedCtx);\n this.init();\n }\n\n init() {\n const root = this.view.getContainer();\n this.ctx.map.getContainer().appendChild(root);\n }\n\n public getContainer(): HTMLDivElement {\n return this.view.getContainer();\n }\n\n public destroy() {\n this.events.remove();\n this.observer.remove();\n this.view.destroy();\n }\n}\n","import type { RequiredDrawOptions } from \"#app/types/index\";\nimport { Observable } from \"#app/observable\";\n\nimport type { DrawingModeChangeEvent, Mode } from \"./types\";\n\nfunction getInitialMode(options: RequiredDrawOptions): Mode {\n if (options.initial?.geometry) {\n return options.initial?.geometry;\n }\n\n if (options.modes.initial) {\n return options.modes.initial;\n }\n\n return null;\n}\n\nexport class DrawingMode extends Observable<DrawingModeChangeEvent> {\n private mode: Mode;\n private break: boolean;\n private closedGeometry: boolean;\n\n constructor(options: RequiredDrawOptions) {\n super();\n this.mode = getInitialMode(options);\n this.break = false;\n this.closedGeometry = options.initial?.closeGeometry ?? false;\n }\n\n getMode = (): Mode => {\n return this.mode;\n };\n\n setMode = (newMode: Mode) => {\n this.mode = newMode;\n this.setBreak(false);\n this.notify({\n type: \"MODE_CHANGED\",\n data: newMode,\n });\n };\n\n getBreak = (): boolean => {\n return this.break;\n };\n\n setBreak = (value: boolean) => {\n this.break = value;\n this.notify({\n type: \"BREAK_CHANGED\",\n data: value,\n });\n };\n\n getClosedGeometry = (): boolean => {\n return this.closedGeometry;\n };\n\n setClosedGeometry = (value: boolean) => {\n this.closedGeometry = value;\n this.notify({\n type: \"CLOSED_GEOMETRY_CHANGED\",\n data: this.closedGeometry,\n });\n };\n\n isPolygon = () => {\n return this.mode === \"polygon\" && this.getClosedGeometry();\n };\n\n reset = () => {\n this.setMode(this.getMode());\n this.setClosedGeometry(false);\n };\n\n pingConsumers = () => {\n this.notify({\n type: \"MODE_CHANGED\",\n data: this.getMode(),\n });\n this.notify({\n type: \"CLOSED_GEOMETRY_CHANGED\",\n data: this.getClosedGeometry(),\n });\n };\n}\n","import type { UnifiedMap } from \"#app/types/map\";\n\nimport { debounce } from \"#app/utils/helpers\";\nimport type { DrawingMode } from \"#components/map/mode\";\nimport type { Store } from \"#app/store/index\";\n\nimport type { MouseEvents } from \"../map/mouse-events\";\nimport type { MouseEventsChangeEvent } from \"../map/mouse-events/types\";\nimport { CURSORS, type TCursor } from \"./constants\";\nimport type { RequiredDrawOptions } from \"#app/types/index\";\n\ninterface Context {\n map: UnifiedMap;\n mode: DrawingMode;\n mouseEvents: MouseEvents;\n store: Store;\n options: RequiredDrawOptions;\n}\n\nexport class Cursor {\n #canvas: HTMLElement;\n\n constructor(private readonly ctx: Context) {\n this.#canvas = this.ctx.map.getCanvasContainer();\n this.#canvas.style.cursor = ctx.mode.getMode() ? CURSORS.CROSSHAIR : CURSORS.AUTO;\n this.#initConsumers();\n }\n\n set = (cursor: TCursor) => {\n this.#canvas.style.cursor = cursor;\n };\n\n get = () => this.#canvas.style.cursor;\n\n handleMouseLeave = debounce(() => {\n const { mouseEvents, mode } = this.ctx;\n if (mouseEvents.pointMouseDown) return;\n if (!mode.getMode()) {\n this.set(CURSORS.AUTO);\n return;\n }\n if (mode.getClosedGeometry()) {\n this.set(CURSORS.AUTO);\n } else {\n this.set(CURSORS.CROSSHAIR);\n }\n }, 10);\n\n handleFirstPointMouseEnter = debounce(() => {\n const { store } = this.ctx;\n\n if (store.circular.canClose()) {\n this.set(CURSORS.POINTER);\n }\n }, 10);\n\n #initConsumers() {\n const { mouseEvents } = this.ctx;\n\n mouseEvents.addObserver(this.#mouseEventsObserver);\n }\n\n remove() {\n const { mouseEvents } = this.ctx;\n\n mouseEvents.removeObserver(this.#mouseEventsObserver);\n }\n\n #mouseEventsObserver = (event: MouseEventsChangeEvent) => {\n const { mode, mouseEvents, store, options } = this.ctx;\n if (mode.getBreak()) return;\n\n const { type, data } = event;\n\n if (!data) return;\n\n switch (type) {\n case \"pointMouseDown\":\n this.set(CURSORS.GRABBING);\n break;\n case \"pointMouseUp\":\n this.set(CURSORS.GRAB);\n break;\n case \"pointMouseEnter\":\n if (mouseEvents.pointMouseDown) return;\n this.set(CURSORS.GRAB);\n break;\n case \"pointMouseLeave\":\n this.handleMouseLeave();\n break;\n case \"lineMouseEnter\":\n if (mouseEvents.pointMouseDown) return;\n this.set(CURSORS.POINTER);\n break;\n case \"lineMouseLeave\":\n this.handleMouseLeave();\n break;\n case \"firstPointMouseEnter\":\n this.handleFirstPointMouseEnter();\n break;\n case \"firstPointMouseLeave\":\n this.handleMouseLeave();\n break;\n case \"lastPointMouseEnter\":\n if (!store.circular.isCircular()) {\n this.set(CURSORS.POINTER);\n }\n break;\n case \"lastPointMouseLeave\":\n this.handleMouseLeave();\n break;\n default:\n break;\n }\n };\n}\n","import { Observable } from \"#app/observable\";\nimport { MouseEventsChangeEvent } from \"./types\";\n\nexport class MouseEvents extends Observable<MouseEventsChangeEvent> {\n #firstPointMouseEnter: boolean;\n #firstPointMouseLeave: boolean;\n #lastPointMouseClick: boolean;\n #lastPointMouseUp: boolean;\n #lastPointMouseEnter: boolean;\n #lastPointMouseLeave: boolean;\n #pointMouseDown: boolean;\n #pointMouseUp: boolean;\n #pointMouseEnter: boolean;\n #pointMouseLeave: boolean;\n #lineMouseEnter: boolean;\n #lineMouseLeave: boolean;\n\n constructor() {\n super();\n this.#firstPointMouseEnter = false;\n this.#firstPointMouseLeave = false;\n this.#lastPointMouseClick = false;\n this.#lastPointMouseUp = false;\n this.#lastPointMouseEnter = false;\n this.#lastPointMouseLeave = false;\n this.#pointMouseDown = false;\n this.#pointMouseUp = false;\n this.#pointMouseEnter = false;\n this.#pointMouseLeave = false;\n this.#lineMouseEnter = false;\n this.#lineMouseLeave = false;\n }\n\n get firstPointMouseEnter() {\n return this.#firstPointMouseEnter;\n }\n set firstPointMouseEnter(value) {\n this.#firstPointMouseEnter = value;\n this.notify({\n type: \"firstPointMouseEnter\",\n data: value,\n });\n }\n\n get firstPointMouseLeave() {\n return this.#firstPointMouseLeave;\n }\n set firstPointMouseLeave(value) {\n this.#firstPointMouseLeave = value;\n this.notify({\n type: \"firstPointMouseLeave\",\n data: value,\n });\n }\n\n get lastPointMouseClick() {\n return this.#lastPointMouseClick;\n }\n set lastPointMouseClick(value) {\n this.#lastPointMouseClick = value;\n this.notify({\n type: \"lastPointMouseClick\",\n data: value,\n });\n }\n\n get lastPointMouseUp() {\n return this.#lastPointMouseUp;\n }\n set lastPointMouseUp(value) {\n this.#lastPointMouseUp = value;\n this.notify({\n type: \"lastPointMouseUp\",\n data: value,\n });\n }\n\n get lastPointMouseEnter() {\n return this.#lastPointMouseEnter;\n }\n set lastPointMouseEnter(value) {\n this.#lastPointMouseEnter = value;\n this.notify({\n type: \"lastPointMouseEnter\",\n data: value,\n });\n }\n\n get lastPointMouseLeave() {\n return this.#lastPointMouseLeave;\n }\n set lastPointMouseLeave(value) {\n this.#lastPointMouseLeave = value;\n this.notify({\n type: \"lastPointMouseLeave\",\n data: value,\n });\n }\n\n get pointMouseDown() {\n return this.#pointMouseDown;\n }\n set pointMouseDown(value) {\n this.#pointMouseDown = value;\n this.notify({\n type: \"pointMouseDown\",\n data: value,\n });\n }\n\n get pointMouseUp() {\n return this.#pointMouseUp;\n }\n set pointMouseUp(value) {\n this.#pointMouseUp = value;\n this.notify({\n type: \"pointMouseUp\",\n data: value,\n });\n }\n\n get pointMouseEnter() {\n return this.#pointMouseEnter;\n }\n set pointMouseEnter(value) {\n this.#pointMouseEnter = value;\n this.notify({\n type: \"pointMouseEnter\",\n data: value,\n });\n }\n\n get pointMouseLeave() {\n return this.#pointMouseLeave;\n }\n set pointMouseLeave(value) {\n this.#pointMouseLeave = value;\n this.notify({\n type: \"pointMouseLeave\",\n data: value,\n });\n }\n\n get lineMouseEnter() {\n return this.#lineMouseEnter;\n }\n\n set lineMouseEnter(value) {\n this.#lineMouseEnter = value;\n this.notify({\n type: \"lineMouseEnter\",\n data: value,\n });\n }\n\n get lineMouseLeave() {\n return this.#lineMouseLeave;\n }\n\n set lineMouseLeave(value) {\n this.#lineMouseLeave = value;\n this.notify({\n type: \"lineMouseLeave\",\n data: value,\n });\n }\n}\n","import type { RequiredDrawOptions } from \"#app/types\";\nimport {\n ON_LINE_POINT_PAINT_BASE,\n FIRST_POINT_PAINT_BASE,\n POINTS_PAINT_BASE,\n LINE_PAINT_BASE,\n POLYGON_PAINT_BASE,\n BREAK_PAINT_BASE,\n AUXILIARY_POINT_PAINT_BASE,\n} from \"#app/utils/geo_constants\";\n\nexport const DEFAULT_OPTIONS: RequiredDrawOptions = {\n pointGeneration: \"manual\",\n panel: {\n size: \"medium\",\n buttons: {\n undo: { visible: true },\n redo: { visible: true },\n delete: { visible: true },\n save: { visible: true, clearOnSave: true },\n },\n },\n modes: {\n initial: null,\n line: {\n visible: true,\n closeGeometry: true,\n },\n polygon: {\n visible: true,\n },\n breakGeometry: {\n visible: true,\n },\n },\n layersPaint: {\n auxiliaryPoint: AUXILIARY_POINT_PAINT_BASE,\n onLinePoint: ON_LINE_POINT_PAINT_BASE,\n firstPoint: FIRST_POINT_PAINT_BASE,\n points: POINTS_PAINT_BASE,\n line: LINE_PAINT_BASE,\n polygon: POLYGON_PAINT_BASE,\n breakLine: BREAK_PAINT_BASE,\n },\n initial: null,\n dynamicLine: true,\n locale: {\n save: \"Save\",\n delete: \"Delete all\",\n undo: \"Undo\",\n redo: \"Redo\",\n line: \"Line\",\n polygon: \"Polygon\",\n break: \"Split\",\n closeLine: \"Close the line\",\n createPolygon: \"Create a polygon\",\n },\n};\n","import { ERRORS } from \"#app/store/init\";\nimport { Initial, DrawOptions, RequiredDrawOptions } from \"#app/types/index\";\nimport {\n ON_LINE_POINT_PAINT_BASE,\n FIRST_POINT_PAINT_BASE,\n POINTS_PAINT_BASE,\n LINE_PAINT_BASE,\n POLYGON_PAINT_BASE,\n BREAK_PAINT_BASE,\n AUXILIARY_POINT_PAINT_BASE,\n} from \"../utils/geo_constants\";\nimport { DEFAULT_OPTIONS } from \"./constants\";\n\nfunction allStepsHaveIds(steps: Initial[\"steps\"]): boolean {\n return steps.every((step) => \"id\" in step && step.id !== undefined);\n}\n\nfunction checkIfMissingIds(steps: Initial[\"steps\"], generateId: Initial[\"generateId\"]) {\n const idGenerationIsOff = !generateId;\n const idsNotProvided = !allStepsHaveIds(steps);\n if (idGenerationIsOff && idsNotProvided) {\n throw new Error(ERRORS[\"MISSING_IDS\"]);\n }\n}\n\nfunction checkIfEnoughPointsToClose(steps: Initial[\"steps\"], closeGeometry: Initial[\"closeGeometry\"]) {\n const minLengthToCloseGeometry = 3;\n if (closeGeometry && steps.length < minLengthToCloseGeometry) {\n throw new Error(ERRORS[\"NOT_ENOUGH_POINTS_TO_CLOSE\"]);\n }\n}\n\nfunction checkIfPolygonIsClosed(options: Initial) {\n const { closeGeometry, steps } = options;\n if (steps) {\n const firstLng = steps[0]?.lng;\n const lastLng = steps[steps.length - 1]?.lng;\n const firstLat = steps[0]?.lat;\n const lastLat = steps[steps.length - 1]?.lat;\n const firstAndLastNotEqual = firstLng !== lastLng || firstLat !== lastLat;\n if (firstAndLastNotEqual && closeGeometry) {\n throw new Error(ERRORS[\"FIRST_LAST_POINT_NOT_EQUAL\"]);\n }\n }\n}\n\nexport function checkInitialStepsOptionOnErrors(options: Initial): void {\n const { closeGeometry, generateId, steps } = options;\n // if we have ids for all steps and id generation is off\n checkIfMissingIds(steps, generateId);\n // If we want to close the geometry, we need at least 3 points\n checkIfEnoughPointsToClose(steps, closeGeometry);\n // If the geometry is a polygon, closeGeometry must be true.\n checkIfPolygonIsClosed(options);\n}\n\nexport function initOptions(options?: DrawOptions): RequiredDrawOptions {\n if (!options) {\n return DEFAULT_OPTIONS;\n }\n\n return {\n pointGeneration: options.pointGeneration ?? DEFAULT_OPTIONS.pointGeneration,\n panel: generatePanelOptions(options),\n modes: generateModeOptions(options),\n layersPaint: generateLayersOptions(options),\n initial: options.initial || DEFAULT_OPTIONS[\"initial\"],\n locale: generateLocaleOptions(options),\n dynamicLine: options.dynamicLine ?? DEFAULT_OPTIONS.dynamicLine,\n } as RequiredDrawOptions;\n}\nfunction generatePanelOptions(options: DrawOptions): RequiredDrawOptions[\"panel\"] {\n return {\n size: options.panel?.size || DEFAULT_OPTIONS.panel.size,\n buttons: {\n undo: {\n visible: options.panel?.buttons?.undo?.visible ?? DEFAULT_OPTIONS.panel.buttons.undo.visible,\n },\n redo: {\n visible: options.panel?.buttons?.redo?.visible ?? DEFAULT_OPTIONS.panel.buttons.redo.visible,\n },\n delete: {\n visible: options.panel?.buttons?.delete?.visible ?? DEFAULT_OPTIONS.panel.buttons.delete.visible,\n },\n save: {\n visible: options.panel?.buttons?.save?.visible ?? DEFAULT_OPTIONS.panel.buttons.save.visible,\n clearOnSave: options.panel?.buttons?.save?.clearOnSave ?? DEFAULT_OPTIONS.panel.buttons.save.clearOnSave,\n },\n },\n };\n}\n\nfunction generateModeOptions(options: DrawOptions): RequiredDrawOptions[\"modes\"] {\n return {\n initial: options.modes?.initial || DEFAULT_OPTIONS.modes.initial,\n line: {\n visible:\n options?.modes?.line?.visible !== undefined\n ? options.modes.line.visible\n : options?.initial?.geometry === \"line\" || DEFAULT_OPTIONS.modes.line.visible,\n closeGeometry: options?.modes?.line?.closeGeometry ?? DEFAULT_OPTIONS.modes.line.closeGeometry,\n },\n polygon: {\n visible:\n options?.modes?.polygon?.visible !== undefined\n ? options.modes.polygon.visible\n : options?.initial?.geometry === \"polygon\" || DEFAULT_OPTIONS.modes.polygon.visible,\n },\n breakGeometry: {\n visible: options?.modes?.breakGeometry?.visible ?? DEFAULT_OPTIONS.modes.breakGeometry.visible,\n },\n };\n}\n\nfunction generateLayersOptions(options: DrawOptions): RequiredDrawOptions[\"layersPaint\"] {\n return {\n onLinePoint: {\n \"circle-radius\": options.layersPaint?.onLinePoint?.[\"circle-radius\"] || ON_LINE_POINT_PAINT_BASE[\"circle-radius\"],\n \"circle-color\": options.layersPaint?.onLinePoint?.[\"circle-color\"] || ON_LINE_POINT_PAINT_BASE[\"circle-color\"],\n \"circle-stroke-color\":\n options.layersPaint?.onLinePoint?.[\"circle-stroke-color\"] || ON_LINE_POINT_PAINT_BASE[\"circle-stroke-color\"],\n \"circle-stroke-width\":\n options.layersPaint?.onLinePoint?.[\"circle-stroke-width\"] || ON_LINE_POINT_PAINT_BASE[\"circle-stroke-width\"],\n ...options.layersPaint?.onLinePoint,\n },\n firstPoint: {\n \"circle-radius\": options.layersPaint?.firstPoint?.[\"circle-radius\"] || FIRST_POINT_PAINT_BASE[\"circle-radius\"],\n \"circle-color\": options.layersPaint?.firstPoint?.[\"circle-color\"] || FIRST_POINT_PAINT_BASE[\"circle-color\"],\n \"circle-stroke-color\":\n options.layersPaint?.firstPoint?.[\"circle-stroke-color\"] || FIRST_POINT_PAINT_BASE[\"circle-stroke-color\"],\n \"circle-stroke-width\":\n options.layersPaint?.firstPoint?.[\"circle-stroke-width\"] || FIRST_POINT_PAINT_BASE[\"circle-stroke-width\"],\n ...options.layersPaint?.firstPoint,\n },\n points: {\n \"circle-radius\": options.layersPaint?.points?.[\"circle-radius\"] || POINTS_PAINT_BASE[\"circle-radius\"],\n \"circle-color\": options.layersPaint?.points?.[\"circle-color\"] || POINTS_PAINT_BASE[\"circle-color\"],\n \"circle-stroke-color\":\n options.layersPaint?.points?.[\"circle-stroke-color\"] || POINTS_PAINT_BASE[\"circle-stroke-color\"],\n \"circle-stroke-width\":\n options.layersPaint?.points?.[\"circle-stroke-width\"] || POINTS_PAINT_BASE[\"circle-stroke-width\"],\n ...options.layersPaint?.points,\n },\n auxiliaryPoint: {\n \"circle-radius\":\n options.layersPaint?.auxiliaryPoint?.[\"circle-radius\"] || AUXILIARY_POINT_PAINT_BASE[\"circle-radius\"],\n \"circle-color\":\n options.layersPaint?.auxiliaryPoint?.[\"circle-color\"] || AUXILIARY_POINT_PAINT_BASE[\"circle-color\"],\n \"circle-stroke-color\":\n options.layersPaint?.auxiliaryPoint?.[\"circle-stroke-color\"] ||\n AUXILIARY_POINT_PAINT_BASE[\"circle-stroke-color\"],\n \"circle-stroke-width\":\n options.layersPaint?.auxiliaryPoint?.[\"circle-stroke-width\"] ||\n AUXILIARY_POINT_PAINT_BASE[\"circle-stroke-width\"],\n ...options.layersPaint?.auxiliaryPoint,\n },\n line: {\n \"line-width\": options.layersPaint?.line?.[\"line-width\"] || LINE_PAINT_BASE[\"line-width\"],\n \"line-color\": options.layersPaint?.line?.[\"line-color\"] || LINE_PAINT_BASE[\"line-color\"],\n \"line-opacity\": options.layersPaint?.line?.[\"line-opacity\"] || LINE_PAINT_BASE[\"line-opacity\"],\n ...options.layersPaint?.line,\n },\n polygon: {\n \"fill-color\": options.layersPaint?.polygon?.[\"fill-color\"] || POLYGON_PAINT_BASE[\"fill-color\"],\n \"fill-opacity\": options.layersPaint?.polygon?.[\"fill-opacity\"] || POLYGON_PAINT_BASE[\"fill-opacity\"],\n ...options.layersPaint?.polygon,\n },\n breakLine: {\n \"line-width\": options.layersPaint?.breakLine?.[\"line-width\"] || BREAK_PAINT_BASE[\"line-width\"],\n \"line-color\": options.layersPaint?.breakLine?.[\"line-color\"] || BREAK_PAINT_BASE[\"line-color\"],\n \"line-dasharray\": options.layersPaint?.breakLine?.[\"line-dasharray\"] || BREAK_PAINT_BASE[\"line-dasharray\"],\n ...options.layersPaint?.breakLine,\n },\n };\n}\n\nfunction generateLocaleOptions(options: DrawOptions): RequiredDrawOptions[\"locale\"] {\n return {\n save: options.locale?.save ?? DEFAULT_OPTIONS.locale.save,\n delete: options.locale?.delete ?? DEFAULT_OPTIONS.locale.delete,\n undo: options.locale?.undo ?? DEFAULT_OPTIONS.locale.undo,\n redo: options.locale?.redo ?? DEFAULT_OPTIONS.locale.redo,\n line: options.locale?.line ?? DEFAULT_OPTIONS.locale.line,\n polygon: options.locale?.polygon ?? DEFAULT_OPTIONS.locale.polygon,\n break: options.locale?.break ?? DEFAULT_OPTIONS.locale.break,\n closeLine: options.locale?.closeLine ?? DEFAULT_OPTIONS.locale.closeLine,\n createPolygon: options.locale?.createPolygon ?? DEFAULT_OPTIONS.locale.createPolygon,\n };\n}\n","import { ListNode, Store } from \"#app/store\";\nimport type { LatLng, Step } from \"#app/types\";\nimport { uuidv4 } from \"#app/utils/helpers\";\nimport type { Command } from \"#app/history/command\";\n\ninterface Snapshot {\n insertedNode: ListNode | null;\n}\n\nexport class InsertPointCommand implements Command {\n type: string = \"STORE_POINT_INSERTED\";\n payload: { node: Step };\n private readonly step: Step;\n private snapshot: Snapshot = {\n insertedNode: null,\n };\n\n constructor(\n private readonly store: Store,\n coords: LatLng,\n private segmentStart: ListNode,\n ) {\n this.step = { id: uuidv4(), isAuxiliary: false, ...coords };\n this.payload = { node: this.step };\n }\n\n private restoreInsertedNode = (node: ListNode) => {\n const prev = node.prev;\n const next = node.next;\n\n if (prev) {\n prev.next = node;\n } else {\n this.store.head = node;\n }\n\n if (next) {\n next.prev = node;\n } else {\n this.store.tail = node;\n }\n\n const betweenHeadAndTail = this.store.tail === prev && this.store.head === next;\n if (betweenHeadAndTail) {\n this.store.tail = node;\n if (this.store.head) this.store.head.prev = node;\n }\n\n if (node.val && !this.store.map.has(node.val.id)) {\n this.store.map.set(node.val.id, node);\n this.store.size++;\n this.store.pingConsumers();\n }\n };\n\n execute = () => {\n if (this.snapshot.insertedNode) {\n this.restoreInsertedNode(this.snapshot.insertedNode);\n } else {\n this.snapshot.insertedNode = this.store.insertAfter(this.segmentStart, this.step);\n }\n\n this.store.notify({ type: \"STORE_POINT_INSERTED\" });\n };\n\n undo = () => {\n this.store.removeNodeById(this.step.id);\n };\n}\n","import type { MapLayerMouseEvent, MapMouseEvent, MapTouchEvent } from \"maplibre-gl\";\nimport type { Uuid } from \"#app/types/index\";\nimport type { UnifiedMap } from \"#app/types/map\";\nimport type { Store } from \"#app/store/index\";\nimport { ELAYERS } from \"#app/utils/geo_constants\";\n\nexport const isFeatureTriggered = (event: MapLayerMouseEvent, layerIds: string[]) => {\n const layers = event.target.queryRenderedFeatures(event.point, {\n layers: layerIds,\n });\n return layers.some((layer) => layerIds.includes(layer.layer.id));\n};\n\nexport const queryPointId = (map: UnifiedMap, point: MapMouseEvent[\"point\"]) => {\n const query = map.queryRenderedFeatures(point, {\n layers: [ELAYERS.PointsLayer, ELAYERS.FirstPointLayer, ELAYERS.AuxiliaryPointLayer, ELAYERS.SinglePointLayer],\n });\n\n const id = query?.[0]?.properties.id;\n return id;\n};\n\nexport const queryPoint = (map: UnifiedMap, point: MapMouseEvent[\"point\"]) => {\n const query = map.queryRenderedFeatures(point, {\n layers: [ELAYERS.PointsLayer, ELAYERS.FirstPointLayer, ELAYERS.AuxiliaryPointLayer, ELAYERS.SinglePointLayer],\n });\n return query?.[0];\n};\n\nexport const getGeometryIndex = (store: Store, id: Uuid) => {\n let current = store.head;\n let idx = 0;\n const visitedNodes = new Set();\n while (current !== null) {\n if (visitedNodes.has(current.val?.id)) {\n break;\n }\n if (current.val?.id === id) {\n return idx;\n }\n\n visitedNodes.add(current.val?.id);\n idx++;\n current = current.next;\n }\n return -1;\n};\n\nexport function isRightClick(event: MapLayerMouseEvent | MapTouchEvent): boolean {\n return (event.originalEvent as MouseEvent).button === 2;\n}\n","import type { GeoJSONSource, MapLayerMouseEvent } from \"maplibre-gl\";\nimport type { Step, Point } from \"#app/types/index\";\nimport type { UnifiedMap } from \"#app/types/map\";\nimport type { Store } from \"#app/store/index\";\n\nimport { ELAYERS, ESOURCES, LINE_BASE } from \"#app/utils/geo_constants\";\nimport { uuidv4 } from \"#app/utils/helpers\";\nimport { timeline } from \"#app/history\";\n\nimport { PointVisibility } from \"../points/helpers\";\nimport { InsertPointCommand } from \"../points/commands/insert-point\";\nimport { renderer } from \"../renderer\";\nimport { isFeatureTriggered } from \"../utils\";\nimport { TilesContext } from \"../tiles\";\n\n// √((x1​−x2​)²+(y1​−y2​)²​)\nconst distance = (point1: Point, point2: Point) =>\n Math.sqrt(Math.pow(point1.x - point2.x, 2) + Math.pow(point1.y - point2.y, 2));\n\nconst checkIfPointIsOnLine = (A: Point, B: Point, P: Point): boolean => {\n const EPSILON = 0.1;\n\n const AB = distance(A, B);\n const AP = distance(A, P);\n const PB = distance(P, B);\n\n if (Math.abs(AP + PB - AB) < EPSILON) {\n return true;\n }\n\n return false;\n};\n\nexport const isOnLine = (event: MapLayerMouseEvent, store: Store) => {\n let current = store.head;\n const visited = new Set();\n\n while (current !== null) {\n if (visited.has(current)) break;\n if (current?.next?.val && current?.val) {\n const map = event.target as UnifiedMap;\n const aPixel = map.project(current.val);\n const bPixel = map.project(current.next.val);\n const eventPixel = map.project(event.lngLat);\n if (checkIfPointIsOnLine(aPixel, bPixel, eventPixel)) {\n return current;\n }\n }\n visited.add(current);\n current = current.next;\n }\n return null;\n};\n\nexport const insertStepIfOnLine = (event: MapLayerMouseEvent, store: Store): Step | null => {\n const segmentStart = isOnLine(event, store);\n\n if (segmentStart) {\n const step = { ...event.lngLat, isAuxiliary: false, id: uuidv4() };\n timeline.commit(new InsertPointCommand(store, step, segmentStart));\n return step;\n }\n return null;\n};\n\nexport const updateUIAfterInsert = (event: MapLayerMouseEvent, context: Pick<TilesContext, \"store\">) => {\n const { store } = context;\n if (store.tail?.val) {\n PointVisibility.setSinglePointHidden(event);\n renderer.execute();\n }\n};\n\nexport const checkIfPointClicked = (event: MapLayerMouseEvent) => {\n return isFeatureTriggered(event, [ELAYERS.PointsLayer, ELAYERS.FirstPointLayer, ELAYERS.AuxiliaryPointLayer]);\n};\n\nexport const hideDynamicLine = (map: UnifiedMap) => {\n const lineSource = map.getSource(ESOURCES.LineDynamicSource) as GeoJSONSource;\n if (lineSource) {\n lineSource.setData(LINE_BASE as GeoJSON.FeatureCollection);\n }\n if (map.getLayer(ELAYERS.LineDynamicLayer)) {\n map.setLayoutProperty(ELAYERS.LineDynamicLayer, \"visibility\", \"none\");\n }\n};\n","import type { ListNode, Store } from \"#app/store\";\nimport type { StoreChangeEventKeys } from \"#app/store/types\";\nimport type { RequiredDrawOptions } from \"#app/types\";\nimport type { DrawingMode } from \"#components/map/mode\";\nimport type { LatLng } from \"#app/types/index\";\nimport type { Command } from \"#app/history/command\";\n\ninterface Snapshot {\n originalHead: ListNode | null;\n originalTail: ListNode | null;\n newHead: ListNode | null;\n newTail: ListNode | null;\n newAuxBetweenHeadTail: ListNode | null;\n}\n\nexport class BreakGeometryCommand implements Command {\n type: StoreChangeEventKeys = \"STORE_BREAK_GEOMETRY\";\n\n private snapshot: Snapshot = {\n originalHead: null,\n originalTail: null,\n newHead: null,\n newTail: null,\n newAuxBetweenHeadTail: null,\n };\n\n constructor(\n private readonly store: Store,\n private readonly options: RequiredDrawOptions,\n private readonly mode: DrawingMode,\n private readonly current: ListNode,\n private readonly clickCoords: LatLng,\n ) {}\n\n private makeSnapshot = () => {\n this.snapshot.originalHead = this.store.head;\n this.snapshot.originalTail = this.store.tail;\n this.snapshot.newAuxBetweenHeadTail = this.current.val?.isAuxiliary ? this.current : this.current.next;\n };\n\n public execute = () => {\n this.makeSnapshot();\n\n this.store.circular.break(this.current);\n this.mode.setClosedGeometry(false);\n\n // save the new head and tail after breaking the geometry\n this.snapshot.newHead = this.store.head;\n this.snapshot.newTail = this.store.tail;\n\n // notify the panel to update the UI\n this.store.notify({ type: \"STORE_BREAK_GEOMETRY\", data: { coords: this.clickCoords } });\n };\n\n private restoreOriginalHeadTail = () => {\n const { originalHead, originalTail } = this.snapshot;\n this.store.head = originalHead;\n this.store.tail = originalTail;\n if (this.store.head) {\n this.store.head.prev = this.store.tail;\n }\n if (this.store.tail) {\n this.store.tail.next = this.store.head;\n }\n };\n\n private restoreAuxBetweenNewHeadTail = () => {\n const { newHead, newTail, newAuxBetweenHeadTail } = this.snapshot;\n\n if (newHead && newTail) {\n newTail.next = newAuxBetweenHeadTail;\n newAuxBetweenHeadTail!.prev = newTail;\n newAuxBetweenHeadTail!.next = newHead;\n newHead.prev = newAuxBetweenHeadTail;\n if (newAuxBetweenHeadTail?.val) {\n this.store.map.set(newAuxBetweenHeadTail?.val.id, newAuxBetweenHeadTail);\n this.store.size += 1;\n }\n }\n };\n\n public undo = () => {\n this.restoreOriginalHeadTail();\n this.store.circular.close();\n this.store.notify({ type: \"STORE_CLOSE_GEOMETRY\" });\n\n const { newHead, newTail } = this.snapshot;\n // restore old node connections. These are the nodes that were \"removed\" when breaking the geometry previously\n if (newHead && newTail) {\n if (this.options.pointGeneration === \"auto\") {\n this.restoreAuxBetweenNewHeadTail();\n } else {\n newTail.next = newHead;\n newHead.prev = newTail;\n }\n }\n this.mode.setClosedGeometry(true);\n // notify the panel to update the UI\n this.store.pingConsumers();\n };\n}\n","import { GeoJSONSource, MapLayerMouseEvent } from \"maplibre-gl\";\n\nimport type { ListNode } from \"#app/store/index\";\nimport { ELAYERS, ESOURCES } from \"#app/utils/geo_constants\";\nimport { throttle } from \"#app/utils/helpers\";\nimport { timeline } from \"#app/history\";\n\nimport { isOnLine } from \"./utils\";\nimport { FireEvents } from \"../fire-events\";\nimport { BreakGeometryCommand } from \"./commands/break-geometry\";\nimport { renderer } from \"../renderer\";\nimport { getLine } from \"../renderer/geojson-builder\";\nimport type { TilesContext } from \"../tiles\";\n\nconst LINE_BREAK_THROTTLE_TIME = 15;\n\nexport class LineBreakEvents {\n private current: ListNode | null;\n private throttledOnLineEnter: (event: MapLayerMouseEvent) => void;\n\n constructor(private readonly ctx: TilesContext) {\n this.current = null;\n this.throttledOnLineEnter = throttle(this.onLineEnterBreak, LINE_BREAK_THROTTLE_TIME);\n }\n\n public initBreakEvents = () => {\n this.ctx.map.on(\"click\", ELAYERS.LineLayer, this.geometryBreakOnClick);\n this.ctx.map.on(\"mouseenter\", ELAYERS.LineLayer, this.throttledOnLineEnter);\n this.ctx.map.on(\"mousemove\", ELAYERS.LineLayer, this.throttledOnLineEnter);\n this.ctx.map.on(\"mouseleave\", ELAYERS.LineLayer, this.onLineLeave);\n };\n\n public removeBreakEvents = () => {\n this.ctx.map.off(\"click\", ELAYERS.LineLayer, this.geometryBreakOnClick);\n this.ctx.map.off(\"mouseenter\", ELAYERS.LineLayer, this.throttledOnLineEnter);\n this.ctx.map.off(\"mousemove\", ELAYERS.LineLayer, this.throttledOnLineEnter);\n this.ctx.map.off(\"mouseleave\", ELAYERS.LineLayer, this.onLineLeave);\n };\n\n public hideBreakLine = () => {\n if (this.ctx.map.getLayoutProperty(ELAYERS.LineLayerBreak, \"visibility\") !== \"none\") {\n this.ctx.map.setLayoutProperty(ELAYERS.LineLayerBreak, \"visibility\", \"none\");\n }\n };\n\n public showBreakLine = () => {\n if (this.ctx.map.getLayoutProperty(ELAYERS.LineLayerBreak, \"visibility\") !== \"visible\") {\n this.ctx.map.setLayoutProperty(ELAYERS.LineLayerBreak, \"visibility\", \"visible\");\n }\n };\n\n private geometryBreakOnClick = (event: MapLayerMouseEvent) => {\n const { store, mode, map, options } = this.ctx;\n\n if (!this.current) return;\n timeline.commit(new BreakGeometryCommand(store, options, mode, this.current, event.lngLat));\n this.onLineLeave();\n mode.reset();\n renderer.execute();\n FireEvents.onLineBreak(map);\n };\n\n private getAutoGenerationPoints = (line: ListNode | null) => {\n let current: [number, number] | null = null;\n let next: [number, number] | null = null;\n\n if (line?.val?.isAuxiliary) {\n current = [line?.prev?.val?.lng, line?.prev?.val?.lat] as [number, number];\n next = [line?.next?.val?.lng, line?.next?.val?.lat] as [number, number];\n } else {\n current = [line?.val?.lng, line?.val?.lat] as [number, number];\n next = [line?.next?.next?.val?.lng, line?.next?.next?.val?.lat] as [number, number];\n }\n return { current, next };\n };\n\n private getLinePoints = (line: ListNode | null) => {\n if (this.ctx.options.pointGeneration === \"manual\") {\n const current = [line?.val?.lng, line?.val?.lat] as [number, number];\n const next = [line?.next?.val?.lng, line?.next?.val?.lat] as [number, number];\n return { current, next };\n }\n\n return this.getAutoGenerationPoints(line);\n };\n\n private onLineEnterBreak = (event: MapLayerMouseEvent) => {\n const { map, store } = this.ctx;\n\n const line = isOnLine(event, store);\n if (line?.val?.id !== this.current?.val?.id) {\n this.current = line;\n }\n\n const lineSource = map.getSource(ESOURCES.LineSourceBreak) as GeoJSONSource;\n const { current, next } = this.getLinePoints(this.current);\n\n const lineBreakData = getLine(current, next);\n if (!lineBreakData) return;\n\n lineSource.setData(lineBreakData as any);\n this.showBreakLine();\n };\n\n private onLineLeave = () => {\n setTimeout(() => {\n this.hideBreakLine();\n }, LINE_BREAK_THROTTLE_TIME + 10);\n };\n}\n","import type { GeoJSONSource, MapLayerMouseEvent, PointLike } from \"maplibre-gl\";\n\nimport type { LatLng } from \"#app/types/index\";\nimport { ELAYERS, ESOURCES, LINE_BASE } from \"#app/utils/geo_constants\";\nimport type { StoreChangeEvent } from \"#app/store/types\";\nimport { debounce, throttle } from \"#app/utils/helpers\";\nimport { EVENTS } from \"#app/utils/constants\";\n\nimport type { PointRightClickRemoveEvent, UndoEvent } from \"../types\";\nimport type { MouseEventsChangeEvent, MapMouseEvent } from \"../mouse-events/types\";\nimport { getLine } from \"../renderer/geojson-builder\";\nimport { isFeatureTriggered } from \"../utils\";\nimport type { TilesContext } from \"../tiles\";\nimport { hideDynamicLine } from \"./utils\";\nimport { DrawingModeChangeEvent } from \"../mode/types\";\n\nconst LINE_DYNAMIC_THROTTLE_TIME = 17; // 60 FPS\n\nexport class DynamicLineEvents {\n private visible: boolean;\n private firstPoint: LatLng | null = null;\n private secondPoint: LatLng | null = null;\n private lineFeature: any;\n private onMouseMoveThrottled: (event: MapLayerMouseEvent) => void;\n private onStoreEventsDebounced: (event: StoreChangeEvent) => void;\n\n constructor(private readonly ctx: TilesContext) {\n this.visible = true;\n this.onMouseMoveThrottled = throttle(this.onLineMove, LINE_DYNAMIC_THROTTLE_TIME);\n this.onStoreEventsDebounced = debounce(this.onStoreEventsConsumer, 10);\n this.initConsumers();\n this.initDynamicEvents();\n }\n\n private initConsumers() {\n this.ctx.store.addObserver(this.onStoreEventsDebounced);\n this.ctx.mouseEvents.addObserver(this.onMouseEventsConsumer);\n this.ctx.mode.addObserver(this.mapModeConsumer);\n }\n\n public removeConsumers = () => {\n this.ctx.store.removeObserver(this.onStoreEventsDebounced);\n this.ctx.mouseEvents.removeObserver(this.onMouseEventsConsumer);\n this.ctx.mode.removeObserver(this.mapModeConsumer);\n };\n\n private mapModeConsumer = (event: DrawingModeChangeEvent) => {\n if (event.type === \"MODE_CHANGED\" && !event.data) {\n this.hide();\n }\n };\n\n private onMouseEventsConsumer = (event: MouseEventsChangeEvent) => {\n const { store } = this.ctx;\n if (this.ctx.mode.getMode() === null) return;\n if (store.circular.isCircular()) {\n this.hide();\n return;\n }\n\n // this one is needed to turn off the dynamic line when the last point is clicked\n if (event.type === \"lastPointMouseClick\" && event.data) {\n this.hide();\n this.visible = false;\n }\n // this is needed to not trigger \"show\" function if the last point was clicked and we just hover a point or a line\n // doesn't matter, will rewrite this part\n if (!this.visible) return;\n\n // not sure about this, but looks like a good idea to hide the dynamic line on these events\n const HIDE_EVENTS = [\"pointMouseEnter\", \"lineMouseEnter\", \"pointMouseDown\"] as MapMouseEvent[];\n if (HIDE_EVENTS.includes(event.type) && event.data) {\n this.hide();\n }\n\n // if we hid the dynamic line there ^, then we obviously need to show it again\n if (event.type === \"pointMouseLeave\" || event.type === \"lineMouseLeave\") {\n const { store } = this.ctx;\n if (store.circular.isCircular()) return;\n if (event.data) {\n this.firstPoint = store.tail?.val as LatLng;\n this.secondPoint = store.tail?.val as LatLng;\n this.show();\n }\n }\n };\n\n private onStoreEventsConsumer = (event: StoreChangeEvent) => {\n const { store } = this.ctx;\n if (this.ctx.mode.getMode() === null) return;\n if (store.circular.isCircular()) {\n this.hide();\n\n return;\n }\n\n if (event.type === \"STORE_CLOSE_GEOMETRY\" || event.type === \"STORE_CLEARED\") {\n this.hide();\n } else if (event.type === \"STORE_BREAK_GEOMETRY\") {\n this.firstPoint = store.tail?.val as LatLng;\n this.secondPoint = event.data?.coords as LatLng;\n this.show();\n this.visible = true;\n } else if (event.type === \"STORE_POINT_ADD\") {\n if (store.size > 0) {\n this.firstPoint = store.tail?.val as LatLng;\n this.secondPoint = store.tail?.val as LatLng;\n this.show();\n this.visible = true;\n }\n }\n };\n\n private initDynamicEvents = () => {\n const { map } = this.ctx;\n map.on(\"click\", this.onMapClick);\n map.on(\"mousemove\", this.onMouseMoveThrottled);\n map.on(EVENTS.REMOVE_ALL, this.hide);\n map.on(EVENTS.UNDO, this.onUndoRedoClick);\n map.on(EVENTS.REDO, this.onUndoRedoClick);\n map.on(EVENTS.RIGHTCLICKREMOVE, this.onRightClickRemove);\n };\n\n public removeEvents = () => {\n const { map } = this.ctx;\n\n map.off(\"click\", this.onMapClick);\n map.off(\"mousemove\", this.onMouseMoveThrottled);\n map.off(EVENTS.REMOVE_ALL, this.hide);\n map.off(EVENTS.UNDO, this.onUndoRedoClick);\n map.off(EVENTS.REDO, this.onUndoRedoClick);\n map.off(EVENTS.RIGHTCLICKREMOVE, this.onRightClickRemove);\n };\n\n public hide = () => {\n const { map } = this.ctx;\n\n this.firstPoint = null;\n this.secondPoint = null;\n this.lineFeature = null;\n map.off(\"mousemove\", this.onMouseMoveThrottled);\n\n hideDynamicLine(map);\n };\n\n private show = () => {\n const { map, store } = this.ctx;\n\n if (store.size && this.firstPoint?.lat && this.firstPoint.lng && this.secondPoint?.lng && this.secondPoint?.lat) {\n const current = [this.firstPoint.lng, this.firstPoint.lat] as [number, number];\n const next = [this.secondPoint.lng, this.secondPoint.lat] as [number, number];\n\n this.lineFeature = getLine(current, next);\n\n map.setLayoutProperty(ELAYERS.LineDynamicLayer, \"visibility\", \"visible\");\n if (this.secondPoint) {\n this.renderLineOnMouseMove({ lng: this.secondPoint?.lng, lat: this.secondPoint?.lat });\n }\n }\n map.on(\"mousemove\", this.onMouseMoveThrottled);\n };\n\n private renderLineOnMouseMove = (newCoord: LatLng) => {\n if (!this.lineFeature) return;\n const { map } = this.ctx;\n\n this.lineFeature.features[0].geometry.coordinates[1] = [newCoord.lng, newCoord.lat];\n const lineSource = map.getSource(ESOURCES.LineDynamicSource) as GeoJSONSource;\n if (lineSource) {\n lineSource.setData(this.lineFeature);\n }\n };\n\n private onLineMove = (event: MapLayerMouseEvent) => {\n this.renderLineOnMouseMove(event.lngLat);\n };\n\n private onMapClick = (event: MapLayerMouseEvent) => {\n const { mode } = this.ctx;\n const lineClick = isFeatureTriggered(event, [ELAYERS.LineLayerTransparent, ELAYERS.LineLayer]);\n if (lineClick && mode.getBreak()) {\n this.secondPoint = { lng: event.lngLat.lng, lat: event.lngLat.lat };\n }\n\n if (lineClick) return;\n this.hide();\n };\n\n private onUndoRedoClick = (event: UndoEvent) => {\n const { store } = this.ctx;\n\n if (!store.circular.isCircular()) {\n const latLng = event.target.unproject({ x: event.originalEvent.x, y: event.originalEvent.y } as PointLike);\n this.firstPoint = store.tail?.val as LatLng;\n this.secondPoint = { lng: latLng.lng, lat: latLng.lat };\n this.show();\n }\n\n if (store.size === 0) {\n this.hide();\n }\n };\n\n private onRightClickRemove = (event: PointRightClickRemoveEvent) => {\n const { store } = this.ctx;\n if (!store.circular.isCircular()) {\n this.secondPoint = { lng: event.coordinates.lng, lat: event.coordinates.lat };\n this.firstPoint = store.tail?.val as LatLng;\n this.show();\n }\n if (store.size === 0) {\n this.hide();\n }\n };\n}\n","import type { GeoJSONSource, MapLayerMouseEvent } from \"maplibre-gl\";\n\nimport { ELAYERS, ESOURCES } from \"#app/utils/geo_constants\";\nimport { throttle } from \"#app/utils/helpers\";\n\nimport { FireEvents } from \"../fire-events\";\nimport { PointVisibility } from \"../points/helpers\";\nimport { checkIfPointClicked, insertStepIfOnLine, updateUIAfterInsert } from \"./utils\";\nimport { isFeatureTriggered } from \"../utils\";\nimport { TilesContext } from \"#components/map/tiles\";\nimport { DrawingModeChangeEvent } from \"../mode/types\";\n\nexport const LINE_TRANSPARENT_THROTTLE_TIME = 17;\n\nexport class TransparentLineEvents {\n private eventsInited = false;\n private isThrottled: boolean;\n private lastEvent: MapLayerMouseEvent | null;\n\n constructor(private readonly ctx: TilesContext) {\n this.isThrottled = false;\n this.lastEvent = null;\n this.initConsumers();\n }\n\n private initConsumers = () => {\n this.ctx.mode.addObserver(this.mapModeConsumer);\n };\n\n public removeConsumers = () => {\n this.ctx.mode.removeObserver(this.mapModeConsumer);\n };\n\n private mapModeConsumer = (event: DrawingModeChangeEvent) => {\n const { type, data } = event;\n\n if (type === \"MODE_CHANGED\" && !data) {\n if (this.eventsInited) {\n this.removeEvents();\n }\n } else if (type === \"MODE_CHANGED\" && data) {\n if (!this.eventsInited) {\n this.initEvents();\n }\n }\n };\n\n initEvents() {\n this.ctx.map.on(\"click\", ELAYERS.LineLayerTransparent, this.onLineClick);\n this.ctx.map.on(\"mousemove\", ELAYERS.LineLayerTransparent, this.onLineMove);\n this.ctx.map.on(\"mouseenter\", ELAYERS.LineLayerTransparent, this.onLineEnter);\n this.ctx.map.on(\"mouseleave\", ELAYERS.LineLayerTransparent, this.onLineLeave);\n this.eventsInited = true;\n }\n\n removeEvents() {\n this.ctx.map.off(\"click\", ELAYERS.LineLayerTransparent, this.onLineClick);\n this.ctx.map.off(\"mousemove\", ELAYERS.LineLayerTransparent, this.onLineMove);\n this.ctx.map.off(\"mouseenter\", ELAYERS.LineLayerTransparent, this.onLineEnter);\n this.ctx.map.off(\"mouseleave\", ELAYERS.LineLayerTransparent, this.onLineLeave);\n this.eventsInited = false;\n }\n\n private onLineClick = (event: MapLayerMouseEvent) => {\n const { store, map, mode } = this.ctx;\n if (checkIfPointClicked(event)) return;\n const step = insertStepIfOnLine(event, store);\n if (step) {\n updateUIAfterInsert(event, this.ctx);\n FireEvents.addPoint({ ...step, total: store.size }, map, mode);\n }\n };\n\n private processMouseMove = (event: MapLayerMouseEvent) => {\n PointVisibility.setSinglePointVisible(event);\n if (event.target.getLayer(ELAYERS.SinglePointLayer)) {\n const map = event.target;\n const pointSource = map.getSource(ESOURCES.SinglePointSource) as GeoJSONSource;\n if (pointSource) {\n pointSource.setData({\n type: \"Feature\",\n geometry: {\n type: \"Point\",\n coordinates: [event.lngLat.lng, event.lngLat.lat],\n },\n properties: {},\n });\n }\n }\n };\n\n private onLineMove = throttle((event: MapLayerMouseEvent) => {\n if (isFeatureTriggered(event, [ELAYERS.PointsLayer, ELAYERS.FirstPointLayer])) return;\n if (this.ctx.mouseEvents.pointMouseDown || this.ctx.mouseEvents.pointMouseEnter) return;\n\n this.lastEvent = event;\n\n if (this.isThrottled) return;\n\n this.isThrottled = true;\n requestAnimationFrame(() => {\n if (!this.lastEvent) return;\n this.processMouseMove(this.lastEvent);\n this.isThrottled = false;\n });\n }, LINE_TRANSPARENT_THROTTLE_TIME);\n\n private onLineEnter = (event: MapLayerMouseEvent) => {\n if (this.ctx.mouseEvents.pointMouseDown || this.ctx.mouseEvents.pointMouseEnter) return;\n if (isFeatureTriggered(event, [ELAYERS.PointsLayer, ELAYERS.FirstPointLayer])) return;\n\n this.ctx.mouseEvents.lineMouseEnter = true;\n PointVisibility.setSinglePointVisible(event);\n };\n\n private onLineLeave = (event: MapLayerMouseEvent) => {\n if (this.ctx.mouseEvents.pointMouseDown || this.ctx.mouseEvents.pointMouseEnter) return;\n\n this.ctx.mouseEvents.lineMouseLeave = true;\n PointVisibility.setSinglePointHidden(event);\n };\n}\n","import { MOBILE_WIDTH } from \"#app/utils/constants\";\n\nimport type { DrawingModeChangeEvent } from \"../mode/types\";\nimport type { MouseEventsChangeEvent } from \"../mouse-events/types\";\nimport { LineBreakEvents } from \"./break-line\";\nimport { DynamicLineEvents } from \"./dynamic-line\";\nimport { TransparentLineEvents } from \"./transparent-line\";\nimport type { TilesContext } from \"../tiles\";\n\nexport class LineEvents {\n private break: LineBreakEvents;\n private transparent: TransparentLineEvents | null;\n private dynamic: DynamicLineEvents | null;\n private type: \"default\" | \"break\";\n\n constructor(private readonly ctx: TilesContext) {\n this.break = new LineBreakEvents(ctx);\n this.transparent = ctx.options.pointGeneration === \"manual\" ? new TransparentLineEvents(ctx) : null;\n this.dynamic = null;\n this.type = \"default\";\n }\n\n init() {\n this.initDynamicLine();\n this.initEvents();\n this.initConsumers();\n }\n\n private initDynamicLine = () => {\n if (window.innerWidth <= MOBILE_WIDTH) return;\n if (this.ctx.options.dynamicLine) {\n this.dynamic = new DynamicLineEvents(this.ctx);\n }\n };\n\n private initEvents() {\n const notBreakMode = !this.ctx.mode.getBreak();\n if (notBreakMode) {\n this.transparent?.initEvents();\n }\n }\n\n private initConsumers() {\n this.ctx.mode.addObserver(this.mapModeConsumer);\n this.ctx.mouseEvents.addObserver(this.mouseEventsConsumer);\n }\n\n remove() {\n this.removeConsumers();\n this.removeEvents();\n }\n\n private removeConsumers() {\n this.ctx.mode.removeObserver(this.mapModeConsumer);\n this.ctx.mouseEvents.removeObserver(this.mouseEventsConsumer);\n this.transparent?.removeConsumers();\n if (this.ctx.options.dynamicLine) {\n this.dynamic?.removeConsumers();\n }\n }\n\n private removeEvents() {\n this.break.removeBreakEvents();\n this.transparent?.removeEvents();\n if (this.ctx.options.dynamicLine) {\n this.dynamic?.removeEvents();\n this.dynamic?.hide();\n }\n }\n\n private mouseEventsConsumer = (event: MouseEventsChangeEvent) => {\n const { type, data } = event;\n const { mode } = this.ctx;\n if (!data || !mode.getBreak() || mode.getMode() === null) return;\n\n switch (type) {\n case \"pointMouseDown\":\n this.break.removeBreakEvents();\n this.break.hideBreakLine();\n break;\n case \"pointMouseUp\":\n this.break.initBreakEvents();\n break;\n default:\n break;\n }\n };\n\n private mapModeConsumer = (event: DrawingModeChangeEvent) => {\n const { type, data } = event;\n\n if (type === \"MODE_CHANGED\") {\n if (this.type === \"break\") {\n this.break.removeBreakEvents();\n this.transparent?.initEvents();\n this.type = \"default\";\n }\n }\n\n if (type === \"BREAK_CHANGED\" && data) {\n if (this.type === \"default\") {\n this.transparent?.removeEvents();\n this.break.initBreakEvents();\n this.type = \"break\";\n }\n }\n };\n}\n","import type { UnifiedMap } from \"#app/types/map\";\n\nimport { ELAYERS, FIRST_POINT_COLOR, FIRST_POINT_RADIUS, generateLayers } from \"#app/utils/geo_constants\";\nimport type { RequiredDrawOptions } from \"#app/types/index\";\n\nconst firstPointCircleRadius = (map: UnifiedMap) => {\n map.setPaintProperty(ELAYERS.FirstPointLayer, \"circle-radius\", FIRST_POINT_RADIUS.large);\n map.setPaintProperty(ELAYERS.FirstPointLayer, \"circle-stroke-color\", FIRST_POINT_COLOR.large);\n};\n\nconst defaultPointCircleRadius = (map: UnifiedMap) => {\n map.setPaintProperty(ELAYERS.FirstPointLayer, \"circle-radius\", FIRST_POINT_RADIUS.default);\n map.setPaintProperty(ELAYERS.FirstPointLayer, \"circle-stroke-color\", FIRST_POINT_COLOR.default);\n};\n\nexport const togglePointCircleRadius = (map: UnifiedMap, type: keyof typeof FIRST_POINT_RADIUS) => {\n if (type === \"large\") {\n firstPointCircleRadius(map);\n } else {\n defaultPointCircleRadius(map);\n }\n};\n\nexport const removeTransparentLine = (map: UnifiedMap) => {\n if (map.getLayer(ELAYERS.LineLayerTransparent)) {\n map.removeLayer(ELAYERS.LineLayerTransparent);\n }\n};\n\nexport const addTransparentLine = (map: UnifiedMap, options: RequiredDrawOptions) => {\n if (map.getLayer(ELAYERS.LineLayerTransparent)) return;\n const LAYERS_TO_RENDER = generateLayers(options);\n const transparentLayer = LAYERS_TO_RENDER.find((layer) => layer.id === ELAYERS.LineLayerTransparent);\n if (transparentLayer) {\n map.addLayer(transparentLayer);\n }\n};\n","import type { ListNode, Store } from \"#app/store\";\nimport type { StoreChangeEventKeys } from \"#app/store/types\";\nimport type { RequiredDrawOptions, Step, StepId } from \"#app/types\";\nimport type { DrawingMode } from \"#components/map/mode\";\nimport type { Command } from \"#app/history/command\";\n\nimport { PointHelpers } from \"../helpers\";\n\nexport class CloseGeometryCommand implements Command {\n type: StoreChangeEventKeys = \"STORE_CLOSE_GEOMETRY\";\n auxPointSnapshot: ListNode | null = null;\n\n constructor(\n private readonly store: Store,\n private readonly mode: DrawingMode,\n private readonly options: RequiredDrawOptions,\n ) {\n this.type = \"STORE_CLOSE_GEOMETRY\";\n }\n\n private restoreAuxPoint = () => {\n if (this.auxPointSnapshot?.val) {\n this.store.head!.prev = this.auxPointSnapshot;\n this.store.tail!.next = this.auxPointSnapshot;\n this.auxPointSnapshot.prev = this.store.tail;\n this.auxPointSnapshot.next = this.store.head;\n this.store.tail = this.auxPointSnapshot;\n this.store.map.set(this.auxPointSnapshot.val.id, this.auxPointSnapshot);\n this.store.size++;\n this.store.pingConsumers();\n }\n };\n\n public execute = () => {\n // adding aux point as the tail before closing the geometry\n if (this.options.pointGeneration === \"auto\" && this.store.tail?.val) {\n if (this.auxPointSnapshot) {\n this.restoreAuxPoint();\n } else {\n const auxPoint = PointHelpers.createAuxiliaryPoint(this.store.tail?.val, this.store.head?.val as Step);\n this.auxPointSnapshot = this.store.push(auxPoint);\n }\n }\n this.store.circular.close();\n this.mode.setClosedGeometry(true);\n this.store.notify({ type: this.type });\n };\n\n public undo = () => {\n if (this.options.pointGeneration === \"auto\") {\n this.store.removeNodeById(this.store.tail?.val?.id as StepId);\n }\n if (this.store.tail?.val && this.store.head?.val) {\n this.store.tail.next = null;\n this.store.head.prev = null;\n }\n this.mode.setClosedGeometry(false);\n this.store.notify({ type: \"STORE_BREAK_GEOMETRY\" });\n };\n}\n","import type { MapLayerMouseEvent } from \"maplibre-gl\";\n\nimport { ELAYERS } from \"#app/utils/geo_constants\";\nimport { Tooltip } from \"#components/tooltip\";\nimport { togglePointCircleRadius } from \"#components/map/tiles/utils\";\nimport type { StoreChangeEvent, StoreChangeEventKeys } from \"#app/store/types\";\nimport { timeline } from \"#app/history\";\n\nimport type { DrawingModeChangeEvent } from \"../mode/types\";\nimport { PointsFilter, PointVisibility } from \"./helpers\";\nimport type { PrimaryPointEvents } from \".\";\nimport { CloseGeometryCommand } from \"./commands/close-geometry\";\nimport type { TilesContext } from \"../tiles\";\nimport { renderer } from \"../renderer\";\n\nexport class FirstPoint {\n private mouseDown: boolean;\n private tooltip: Tooltip;\n private eventsInited = false;\n\n constructor(\n private readonly ctx: TilesContext,\n private readonly baseEvents: PrimaryPointEvents,\n ) {\n this.mouseDown = false;\n this.tooltip = new Tooltip();\n\n this.initLayer();\n this.init();\n }\n\n private initConsumers = () => {\n const { mode, store } = this.ctx;\n mode.addObserver(this.onMapModeChangeConsumer);\n store.addObserver(this.onStoreChangeConsumer);\n };\n\n private removeConsumers = () => {\n const { mode, store } = this.ctx;\n mode.removeObserver(this.onMapModeChangeConsumer);\n store.removeObserver(this.onStoreChangeConsumer);\n };\n\n public initLayer() {\n const { map } = this.ctx;\n if (map.getLayer(ELAYERS.FirstPointLayer)) {\n map.setLayoutProperty(ELAYERS.FirstPointLayer, \"visibility\", \"visible\");\n }\n }\n\n private initBaseEvents = () => {\n const { map } = this.ctx;\n\n map.on(\"mouseenter\", ELAYERS.FirstPointLayer, this.baseEvents.onPointMouseEnter);\n map.on(\"mouseleave\", ELAYERS.FirstPointLayer, this.baseEvents.onPointMouseLeave);\n map.on(\"mousedown\", ELAYERS.FirstPointLayer, this.baseEvents.onPointMouseDown);\n map.on(\"mouseup\", ELAYERS.FirstPointLayer, this.baseEvents.onPointMouseUp);\n map.on(\"touchend\", ELAYERS.FirstPointLayer, this.baseEvents.onPointMouseUp);\n map.on(\"touchstart\", ELAYERS.FirstPointLayer, this.baseEvents.onPointMouseDown);\n };\n\n private initEvents = () => {\n const { map } = this.ctx;\n\n map.on(\"click\", ELAYERS.FirstPointLayer, this.onFirstPointClick);\n map.on(\"mouseenter\", ELAYERS.FirstPointLayer, this.onFirstPointMouseEnter);\n map.on(\"mouseleave\", ELAYERS.FirstPointLayer, this.onFirstPointMouseLeave);\n map.on(\"mouseup\", ELAYERS.FirstPointLayer, this.onFirstPointMouseUp);\n map.on(\"mousedown\", ELAYERS.FirstPointLayer, this.onFirstPointMouseDown);\n this.initBaseEvents();\n this.eventsInited = true;\n };\n\n private init() {\n this.initEvents();\n this.initConsumers();\n }\n\n private removeBaseEvents = () => {\n const { map } = this.ctx;\n\n map.off(\"mouseenter\", ELAYERS.FirstPointLayer, this.baseEvents.onPointMouseEnter);\n map.off(\"mouseleave\", ELAYERS.FirstPointLayer, this.baseEvents.onPointMouseLeave);\n map.off(\"mousedown\", ELAYERS.FirstPointLayer, this.baseEvents.onPointMouseDown);\n map.off(\"mouseup\", ELAYERS.FirstPointLayer, this.baseEvents.onPointMouseUp);\n map.off(\"touchend\", ELAYERS.FirstPointLayer, this.baseEvents.onPointMouseUp);\n map.off(\"touchstart\", ELAYERS.FirstPointLayer, this.baseEvents.onPointMouseDown);\n };\n\n private removeEvents() {\n const { map } = this.ctx;\n\n map.off(\"click\", ELAYERS.FirstPointLayer, this.onFirstPointClick);\n map.off(\"mouseenter\", ELAYERS.FirstPointLayer, this.onFirstPointMouseEnter);\n map.off(\"mouseleave\", ELAYERS.FirstPointLayer, this.onFirstPointMouseLeave);\n map.off(\"mouseup\", ELAYERS.FirstPointLayer, this.onFirstPointMouseUp);\n this.removeBaseEvents();\n this.eventsInited = false;\n }\n\n public remove() {\n this.removeEvents();\n this.removeConsumers();\n }\n\n private onMapModeChangeConsumer = (event: DrawingModeChangeEvent) => {\n const { map, options } = this.ctx;\n const { type, data } = event;\n\n if (type === \"MODE_CHANGED\" && !data) {\n if (this.eventsInited) {\n this.removeEvents();\n }\n } else if (type === \"MODE_CHANGED\" && data) {\n if (!this.eventsInited) {\n this.initEvents();\n }\n }\n\n if (type === \"MODE_CHANGED\") {\n if (data === \"line\" && !options.modes.line.closeGeometry) {\n PointVisibility.setFirstPointHidden(map);\n PointsFilter.closedGeometry(map);\n } else {\n PointVisibility.setFirstPointVisible(map);\n PointsFilter.default(map);\n }\n }\n };\n\n private onStoreChangeConsumer = (event: StoreChangeEvent) => {\n const { map, store } = this.ctx;\n const { type } = event;\n\n const events = [\n \"STORE_MUTATED\",\n \"STORE_POINT_INSERTED\",\n \"STORE_CLOSE_GEOMETRY\",\n \"STORE_BREAK_GEOMETRY\",\n \"STORE_CLEARED\",\n ] as StoreChangeEventKeys[];\n if (events.includes(type)) {\n if (store.circular.canClose()) {\n togglePointCircleRadius(map, \"large\");\n } else {\n togglePointCircleRadius(map, \"default\");\n }\n }\n };\n\n private onFirstPointClick = () => {\n const { store, mode, options } = this.ctx;\n\n if (store.circular.canClose()) {\n timeline.commit(new CloseGeometryCommand(store, mode, options));\n\n renderer.execute();\n }\n };\n\n private onFirstPointMouseDown = () => {\n this.mouseDown = true;\n this.tooltip.remove();\n };\n\n private onFirstPointMouseUp = () => {\n this.mouseDown = false;\n };\n\n private onFirstPointMouseLeave = () => {\n const { mouseEvents } = this.ctx;\n\n if (this.mouseDown) return;\n\n mouseEvents.firstPointMouseLeave = true;\n this.tooltip.remove();\n };\n\n private getTitle = () => {\n const { mode, options } = this.ctx;\n\n if (mode.getMode() === \"line\" && options.modes.line.closeGeometry) {\n return options.locale.closeLine;\n }\n\n if (mode.getMode() === \"polygon\") {\n return options.locale.createPolygon;\n }\n\n return \"\";\n };\n\n private onFirstPointMouseEnter = (event: MapLayerMouseEvent) => {\n const { mode, mouseEvents, store } = this.ctx;\n mouseEvents.firstPointMouseEnter = true;\n if (mode.getClosedGeometry() || this.mouseDown) return;\n if (store.circular.canClose()) {\n const { x, y } = event.originalEvent;\n if (x && y) {\n const Y_OFFSET = 14;\n\n this.tooltip.create({ label: this.getTitle(), placement: \"bottom\" });\n\n const X_OFFSET = this.tooltip.label ? this.tooltip.label.clientWidth / 2 : 0;\n this.tooltip.setPosition({ x: x - X_OFFSET, y: y + Y_OFFSET });\n }\n }\n };\n}\n","import type { ListNode, Store } from \"#app/store\";\nimport type { StoreChangeEventKeys } from \"#app/store/types\";\nimport type { Step } from \"#app/types\";\nimport type { Command } from \"#app/history/command\";\nimport { PointHelpers } from \"../helpers\";\n\ninterface Snapshot {\n clickedNode: ListNode;\n prevPrimaryNode: ListNode | null;\n nextPrimaryNode: ListNode | null;\n prevAuxNode: ListNode | null;\n nextAuxNode: ListNode | null;\n}\n\nexport class AuxToPrimaryCommand implements Command {\n type: StoreChangeEventKeys = \"STORE_AUX_TO_PRIMARY\";\n snapshot: Snapshot | null = null;\n constructor(\n private readonly store: Store,\n private readonly clickedNode: ListNode,\n ) {\n this.snapshot = this.makeSnapshot(this.clickedNode);\n }\n\n private makeSnapshot(clickedNode: ListNode): Snapshot {\n const prevPrimaryNode = clickedNode.prev;\n const nextPrimaryNode = clickedNode.next;\n const prevAuxNode = null;\n const nextAuxNode = null;\n\n return {\n clickedNode,\n prevPrimaryNode,\n nextPrimaryNode,\n prevAuxNode,\n nextAuxNode,\n };\n }\n\n private restorePreviousAux = (clickedNode: ListNode) => {\n if (!this.snapshot) return;\n let { prevPrimaryNode, prevAuxNode } = this.snapshot;\n\n if (prevPrimaryNode) prevPrimaryNode.next = prevAuxNode;\n if (prevAuxNode) prevAuxNode.prev = prevPrimaryNode;\n clickedNode.prev = prevAuxNode;\n if (prevAuxNode) prevAuxNode.next = clickedNode;\n\n if (prevAuxNode?.val?.id && !this.store.map.has(prevAuxNode.val.id)) {\n this.store.map.set(prevAuxNode?.val?.id, prevAuxNode);\n this.store.size++;\n }\n };\n\n private restoreNextAux = (clickedNode: ListNode) => {\n if (!this.snapshot) return;\n let { nextPrimaryNode, nextAuxNode } = this.snapshot;\n\n clickedNode.next = nextAuxNode;\n if (nextAuxNode) {\n nextAuxNode.prev = clickedNode;\n nextAuxNode.next = nextPrimaryNode;\n }\n if (nextPrimaryNode) {\n nextPrimaryNode.prev = nextAuxNode;\n }\n\n const wasDraggingLastPoint = clickedNode.next?.next === this.store.head;\n if (wasDraggingLastPoint) {\n const lastAuxNode = clickedNode.next;\n this.store.tail = lastAuxNode;\n if (this.store.head) {\n this.store.head.prev = lastAuxNode;\n }\n if (this.store.tail) {\n this.store.tail.next = this.store.head;\n }\n }\n\n if (nextAuxNode?.val?.id) {\n this.store.map.set(nextAuxNode.val?.id, nextAuxNode);\n this.store.size++;\n }\n };\n\n private addTwoAuxiliaryPoints = (clickedNode: ListNode) => {\n if (!this.snapshot) return;\n let { nextPrimaryNode, prevPrimaryNode } = this.snapshot;\n\n if (prevPrimaryNode) {\n if (this.snapshot.prevAuxNode) {\n this.restorePreviousAux(clickedNode);\n } else {\n const prevAuxPoint = PointHelpers.createAuxiliaryPoint(prevPrimaryNode.val as Step, clickedNode.val as Step);\n this.snapshot.prevAuxNode = this.store.insertAfter(prevPrimaryNode, prevAuxPoint);\n }\n }\n\n if (nextPrimaryNode) {\n if (this.snapshot.nextAuxNode) {\n this.restoreNextAux(clickedNode);\n } else {\n const nextAuxPoint = PointHelpers.createAuxiliaryPoint(clickedNode.val as Step, nextPrimaryNode.val as Step);\n this.snapshot.nextAuxNode = this.store.insertAfter(clickedNode, nextAuxPoint);\n }\n }\n };\n\n public execute = () => {\n if (!this.snapshot) return;\n const { clickedNode } = this.snapshot;\n\n if (clickedNode && clickedNode.val) {\n clickedNode.val.isAuxiliary = false;\n this.addTwoAuxiliaryPoints(clickedNode);\n }\n };\n\n private removeTwoAuxiliaryPoints = (clickedNode: ListNode | null) => {\n if (!clickedNode || !this.snapshot) return;\n const { prevAuxNode, nextAuxNode } = this.snapshot;\n\n if (prevAuxNode?.val?.isAuxiliary) {\n this.store.removeNodeById(prevAuxNode.val?.id);\n }\n if (nextAuxNode?.val?.isAuxiliary) {\n this.store.removeNodeById(nextAuxNode?.val.id);\n }\n };\n\n public undo = () => {\n if (!this.snapshot) return;\n const { clickedNode } = this.snapshot;\n if (clickedNode && clickedNode.val) {\n clickedNode.val.isAuxiliary = true;\n this.removeTwoAuxiliaryPoints(clickedNode);\n }\n };\n}\n","import { ListNode, Store } from \"#app/store\";\nimport type { StoreChangeEventKeys } from \"#app/store/types\";\nimport type { LatLng } from \"#app/types\";\nimport { UnifiedMap } from \"#app/types/map\";\nimport { FireEvents } from \"#components/map/fire-events\";\nimport type { Command } from \"#app/history/command\";\nimport { PointHelpers } from \"../helpers\";\n\nexport class MovePointCommand implements Command {\n type: StoreChangeEventKeys = \"STORE_POINT_MOVED\";\n end: LatLng;\n constructor(\n private readonly store: Store,\n private readonly selectedNode: ListNode,\n private readonly start: LatLng,\n private readonly map: UnifiedMap,\n ) {\n this.end = { lat: selectedNode.val!.lat, lng: selectedNode.val!.lng };\n }\n\n private updateNeighbors = (node: ListNode) => {\n const prevAux = node.prev;\n const nextAux = node.next;\n // pretty much a check for the pointGeneration === \"auto\"\n if (!prevAux?.val?.isAuxiliary && !nextAux?.val?.isAuxiliary) return;\n\n const prevPrimary = node.prev?.prev;\n const nextPrimary = node.next?.next;\n\n if (prevPrimary?.val && this.selectedNode?.val && prevAux) {\n const midPoint = PointHelpers.getMidpoint(this.selectedNode?.val, prevPrimary?.val);\n if (prevAux.val) {\n prevAux.val.lat = midPoint.lat;\n prevAux.val.lng = midPoint.lng;\n }\n }\n\n if (nextPrimary?.val && this.selectedNode?.val && nextAux) {\n const midPoint = PointHelpers.getMidpoint(this.selectedNode?.val, nextPrimary?.val);\n if (nextAux.val) {\n nextAux.val.lat = midPoint.lat;\n nextAux.val.lng = midPoint.lng;\n }\n }\n };\n\n public execute = () => {\n if (!this.selectedNode.val) return;\n const point = this.store.findStepById(this.selectedNode.val?.id);\n if (point) {\n point.lat = this.end.lat;\n point.lng = this.end.lng;\n this.updateNeighbors(this.selectedNode);\n\n this.store.notify({\n type: \"STORE_MUTATED\",\n data: this.store,\n });\n FireEvents.movePoint(\n {\n id: this.selectedNode.val.id,\n total: this.store.size,\n end: { lat: this.selectedNode.val.lat, lng: this.selectedNode.val.lng },\n start: this.start as LatLng,\n },\n this.map,\n );\n }\n };\n\n public undo = () => {\n if (!this.selectedNode.val) return;\n const point = this.store.findStepById(this.selectedNode.val?.id);\n if (point) {\n point.lat = this.start.lat;\n point.lng = this.start.lng;\n this.updateNeighbors(this.selectedNode);\n\n this.store.notify({\n type: \"STORE_MUTATED\",\n data: this.store,\n });\n FireEvents.movePoint(\n {\n id: this.selectedNode.val.id,\n total: this.store.size,\n end: this.start,\n start: this.end,\n },\n this.map,\n );\n }\n };\n}\n","import type { MapLayerMouseEvent, MapTouchEvent } from \"maplibre-gl\";\n\nimport type { LatLng } from \"#app/types/index\";\nimport { ELAYERS } from \"#app/utils/geo_constants\";\nimport { timeline } from \"#app/history\";\nimport { AuxToPrimaryCommand } from \"./commands/aux-to-primary\";\n\nimport { addTransparentLine } from \"../tiles/utils\";\nimport type { PrimaryPointEvents } from \".\";\nimport { MovePointCommand } from \"./commands/move-point\";\nimport type { PointState } from \"./point-state\";\nimport type { PointTopologyManager } from \"./point-topology-manager\";\nimport { renderer } from \"../renderer\";\nimport { isRightClick, queryPointId } from \"../utils\";\nimport { TilesContext } from \"../tiles\";\nimport { DrawingModeChangeEvent } from \"../mode/types\";\n\nexport class AuxPoints {\n private eventsInited = false;\n constructor(\n private readonly ctx: TilesContext,\n private readonly baseEvents: PrimaryPointEvents,\n private readonly pointState: PointState,\n private readonly topologyManager: PointTopologyManager,\n ) {\n this.initEvents();\n this.initConsumers();\n }\n\n private initBaseEvents = () => {\n const { map } = this.ctx;\n\n map.on(\"mouseenter\", ELAYERS.AuxiliaryPointLayer, this.baseEvents.onPointMouseEnter);\n map.on(\"mouseleave\", ELAYERS.AuxiliaryPointLayer, this.baseEvents.onPointMouseLeave);\n map.on(\"mousedown\", ELAYERS.AuxiliaryPointLayer, this.baseEvents.onPointMouseDown);\n map.on(\"mouseup\", ELAYERS.PointsLayer, this.onMouseUp);\n map.on(\"touchend\", ELAYERS.PointsLayer, this.onMouseUp);\n map.on(\"touchstart\", ELAYERS.AuxiliaryPointLayer, this.baseEvents.onPointMouseDown);\n };\n\n private removeBaseEvents = () => {\n const { map } = this.ctx;\n\n map.off(\"mouseenter\", ELAYERS.AuxiliaryPointLayer, this.baseEvents.onPointMouseEnter);\n map.off(\"mouseleave\", ELAYERS.AuxiliaryPointLayer, this.baseEvents.onPointMouseLeave);\n map.off(\"mousedown\", ELAYERS.AuxiliaryPointLayer, this.baseEvents.onPointMouseDown);\n map.off(\"mouseup\", ELAYERS.PointsLayer, this.onMouseUp);\n map.off(\"touchend\", ELAYERS.PointsLayer, this.onMouseUp);\n map.off(\"touchstart\", ELAYERS.AuxiliaryPointLayer, this.baseEvents.onPointMouseDown);\n };\n\n private initConsumers = () => {\n this.ctx.mode.addObserver(this.onMapModeChangeConsumer);\n };\n\n public removeConsumers = () => {\n this.ctx.mode.removeObserver(this.onMapModeChangeConsumer);\n };\n\n private onMapModeChangeConsumer = (event: DrawingModeChangeEvent) => {\n const { type, data } = event;\n\n if (type === \"MODE_CHANGED\" && !data) {\n if (this.eventsInited) {\n this.removeEvents();\n }\n } else if (type === \"MODE_CHANGED\" && data) {\n if (!this.eventsInited) {\n this.initEvents();\n }\n }\n };\n\n private initEvents() {\n const { map } = this.ctx;\n\n map.on(\"mousedown\", ELAYERS.AuxiliaryPointLayer, this.onMouseDown);\n map.on(\"touchstart\", ELAYERS.AuxiliaryPointLayer, this.onMouseDown);\n // PointsLayer becasue aux is already false\n this.initBaseEvents();\n this.eventsInited = true;\n }\n\n public removeEvents() {\n const { map } = this.ctx;\n map.off(\"mousedown\", ELAYERS.AuxiliaryPointLayer, this.onMouseDown);\n map.off(\"touchstart\", ELAYERS.AuxiliaryPointLayer, this.onMouseDown);\n\n this.removeBaseEvents();\n this.eventsInited = false;\n }\n\n private onMouseDown = (event: MapLayerMouseEvent | MapTouchEvent) => {\n const { store, map } = this.ctx;\n\n if (isRightClick(event)) return;\n\n const id = queryPointId(map, event.point);\n const node = store.findNodeById(id);\n\n if (node) {\n timeline.beginTransaction(\"PointCompound\");\n timeline.commit(new AuxToPrimaryCommand(store, node));\n renderer.execute();\n }\n };\n\n private onMouseUp = () => {\n const { mouseEvents, store, panel, map, options } = this.ctx;\n\n mouseEvents.pointMouseUp = true;\n\n const selectedNode = this.pointState.getSelectedNode();\n const lastEvent = this.pointState.getLastEvent();\n const startCoordinates = this.pointState.getStartCoordinates();\n\n if (selectedNode && selectedNode.val) {\n if (lastEvent) {\n this.topologyManager.updateStore();\n this.pointState.clearLastEvent();\n }\n\n panel?.show();\n if (this.pointState.isMoved()) {\n timeline.commit(new MovePointCommand(store, selectedNode, startCoordinates as LatLng, map));\n timeline.commitTransaction();\n }\n this.pointState.partialReset();\n }\n\n if (mouseEvents) {\n mouseEvents.pointMouseDown = false;\n }\n\n addTransparentLine(map, options);\n };\n}\n","import { ListNode } from \"#app/store/index\";\nimport { LatLng, Step } from \"#app/types/index\";\nimport { MapLayerMouseEvent } from \"maplibre-gl\";\n\nexport class PointState {\n private selectedNode: ListNode | null = null;\n private selectedIdx: number | null = null;\n private startCoordinates: LatLng | null = null;\n private enteredStep: Step | null = null;\n private lastEvent: MapLayerMouseEvent | null = null;\n private moved: boolean = false;\n\n public getSelectedNode(): ListNode | null {\n return this.selectedNode;\n }\n\n public isMoved(): boolean {\n return this.moved;\n }\n\n public getSelectedIdx(): number | null {\n return this.selectedIdx;\n }\n\n public getStartCoordinates(): LatLng | null {\n return this.startCoordinates;\n }\n\n public getEnteredStep(): Step | null {\n return this.enteredStep;\n }\n\n public getLastEvent(): MapLayerMouseEvent | null {\n return this.lastEvent;\n }\n\n public setSelectedNode(node: ListNode | null): void {\n this.selectedNode = node;\n }\n\n public setSelectedIdx(idx: number | null): void {\n this.selectedIdx = idx;\n }\n\n public setStartCoordinates(coordinates: LatLng | null): void {\n this.startCoordinates = coordinates;\n }\n\n public setEnteredStep(step: Step | null): void {\n this.enteredStep = step;\n }\n\n public setLastEvent(event: MapLayerMouseEvent | null): void {\n this.lastEvent = event;\n }\n\n public setMoved(moved: boolean): void {\n this.moved = moved;\n }\n\n public clearLastEvent(): void {\n this.lastEvent = null;\n }\n\n public reset(): void {\n this.selectedNode = null;\n this.selectedIdx = null;\n this.startCoordinates = null;\n this.enteredStep = null;\n this.lastEvent = null;\n }\n\n public partialReset(): void {\n this.selectedNode = null;\n this.selectedIdx = null;\n this.startCoordinates = null;\n this.lastEvent = null;\n this.moved = false;\n }\n}\n","import type { Command } from \"#app/history/command\";\nimport { ListNode, Store } from \"#app/store\";\nimport type { StoreChangeEventKeys } from \"#app/store/types\";\nimport type { LatLng, RequiredDrawOptions, Step } from \"#app/types\";\nimport { uuidv4 } from \"#app/utils/helpers\";\nimport { PointHelpers } from \"../helpers\";\n\ninterface Snapshot {\n addedNode: ListNode | null;\n auxNode: ListNode | null;\n}\n\nexport class AddPointCommand implements Command {\n type: StoreChangeEventKeys = \"STORE_MUTATED\";\n snapshot: Snapshot = {\n addedNode: null,\n auxNode: null,\n };\n private readonly step: Step;\n\n constructor(\n private readonly store: Store,\n private readonly options: RequiredDrawOptions,\n coord: LatLng,\n ) {\n this.step = { id: uuidv4(), isAuxiliary: false, ...coord };\n }\n\n private restoreAddedNode = (addedNode: ListNode) => {\n if (addedNode.prev) {\n addedNode.prev.next = addedNode;\n } else {\n this.store.head = addedNode;\n }\n\n if (addedNode.next) {\n addedNode.next.prev = addedNode;\n } else {\n this.store.tail = addedNode;\n }\n\n this.snapshot.addedNode = addedNode;\n\n if (addedNode.val) {\n this.store.map.set(addedNode.val.id, addedNode);\n this.store.size++;\n this.store.pingConsumers();\n }\n };\n\n private restoreAuxNode = (auxNode: ListNode) => {\n if (auxNode.prev) {\n auxNode.prev.next = auxNode;\n } else {\n this.store.head = auxNode;\n }\n\n if (auxNode.next) {\n auxNode.next.prev = auxNode;\n } else {\n this.store.tail = auxNode;\n }\n\n this.snapshot.auxNode = auxNode;\n\n if (auxNode.val) {\n this.store.map.set(auxNode.val.id, auxNode);\n this.store.size++;\n this.store.pingConsumers();\n }\n };\n\n public execute = () => {\n if (this.snapshot.addedNode) {\n this.restoreAddedNode(this.snapshot.addedNode);\n } else {\n this.snapshot.addedNode = this.store.push(this.step);\n }\n\n // if pointGeneration is \"auto\" then we add an auxPoint\n if (this.options.pointGeneration === \"auto\" && this.store.tail?.prev?.val) {\n if (this.snapshot?.auxNode?.val) {\n this.restoreAuxNode(this.snapshot.auxNode);\n } else {\n const auxPoint = PointHelpers.createAuxiliaryPoint(this.store.tail?.val as Step, this.store.tail?.prev?.val);\n this.snapshot.auxNode = this.store.insertAfter(this.store.tail.prev, auxPoint);\n }\n }\n\n this.store.notify({\n type: \"STORE_POINT_ADD\",\n });\n };\n\n public undo = () => {\n this.store.removeNodeById(this.step.id);\n\n if (this.options.pointGeneration === \"auto\" && this?.snapshot.auxNode?.val) {\n this.store.removeNodeById(this?.snapshot.auxNode.val.id);\n }\n };\n\n public getStep = () => {\n return this.step;\n };\n}\n","import type { Command } from \"#app/history/command\";\nimport type { ListNode } from \"#app/store\";\nimport type { StoreChangeEventKeys } from \"#app/store/types\";\nimport type { Step, StepId } from \"#app/types\";\nimport { FireEvents } from \"#components/map/fire-events\";\nimport { TilesContext } from \"#components/map/tiles\";\nimport type { RemoveCommanContext } from \".\";\nimport { PointHelpers } from \"../../helpers\";\n\ninterface RemovedPointSnapshot {\n removedNode: ListNode;\n wasCircular: boolean;\n wasRemovedHead: boolean;\n wasRemovedTail: boolean;\n beforePrimary: ListNode | null;\n afterPrimary: ListNode | null;\n beforeAux: ListNode | null;\n afterAux: ListNode | null;\n newAux: ListNode | null;\n}\n\nexport class RemovePointAutoCommand implements Command {\n type: StoreChangeEventKeys = \"STORE_INBETWEEN_POINT_REMOVED\";\n // when we execute(remove) we need to create a new aux point in the place of the removed primary point and its aux points\n snapshot: RemovedPointSnapshot | null = null;\n\n constructor(private readonly ctx: RemoveCommanContext) {}\n\n private makeSnapshot(clickedNode: ListNode): RemovedPointSnapshot {\n const { store, nodeId } = this.ctx;\n const wasCircular = store.circular.isCircular();\n const wasRemovedHead = store.head?.val?.id === nodeId;\n const tail = wasCircular ? store.tail?.prev : store.tail;\n const wasRemovedTail = tail?.val?.id === nodeId;\n\n const auxBefore = clickedNode.prev;\n const auxAfter = clickedNode.next;\n const beforePrimary = clickedNode.prev?.prev ?? null;\n const afterPrimary = clickedNode.next?.next ?? null;\n\n return {\n removedNode: clickedNode,\n wasCircular,\n wasRemovedHead,\n wasRemovedTail,\n beforePrimary,\n afterPrimary,\n beforeAux: auxBefore,\n afterAux: auxAfter,\n newAux: null,\n };\n }\n\n public restoreNodeAfter = (after: ListNode, restoredNode: ListNode) => {\n if (!after || !restoredNode || !restoredNode.val) return;\n\n restoredNode.prev = after;\n restoredNode.next = after.next;\n\n if (after.next) {\n after.next.prev = restoredNode;\n }\n\n after.next = restoredNode;\n\n if (!this.ctx.store.map.has(restoredNode.val.id)) {\n this.ctx.store.map.set(restoredNode.val.id, restoredNode);\n this.ctx.store.size++;\n this.ctx.store.pingConsumers();\n }\n };\n\n private recalculateInBetweenRemoved(clickedNode: ListNode | null): void {\n if (!clickedNode || !this.snapshot) return;\n\n const { store } = this.ctx;\n const auxBefore = clickedNode.prev;\n const auxAfter = clickedNode.next;\n const primaryBefore = auxBefore?.prev;\n const primaryAfter = auxAfter?.next;\n\n if (auxBefore?.val?.isAuxiliary) {\n store.removeNodeById(auxBefore.val.id);\n }\n\n if (auxAfter?.val?.isAuxiliary) {\n store.removeNodeById(auxAfter.val.id);\n }\n\n // 5(in a circular and only 3 in a linear) is the minimum number of points needed to add an aux point after removal\n // head -> aux -> primary -> aux -> tail;\n // ^\n // removed\n // head -> aux -> tail;\n // ^ this needs to be added\n const meetsAuxInsertionThreshold = store.circular.isCircular() ? store.size >= 5 : store.size >= 3;\n if (primaryBefore?.val && primaryAfter?.val && meetsAuxInsertionThreshold) {\n // if we have already undo/redoed then we just insert the new aux point already created\n if (this.snapshot.newAux) {\n this.restoreNodeAfter(primaryBefore, this.snapshot.newAux);\n } else {\n const auxPoint = PointHelpers.createAuxiliaryPoint(primaryBefore.val, primaryAfter.val);\n this.snapshot.newAux = store.insertAfter(primaryBefore, auxPoint);\n }\n }\n }\n\n private breakGeometryIfNeeded = (ctx: Pick<TilesContext, \"store\" | \"options\">): boolean => {\n const { store } = ctx;\n\n if (store.circular.canBreak() && store.circular.isCircular()) {\n // if the last point is the aux one(we remove the middle point) then we need to\n // remove the aux point and just add a new one between the head and the tail\n if (store.tail?.val?.isAuxiliary) {\n const oldAuxPoint = store.tail;\n store.removeNodeById(store.tail.val.id);\n store.tail = oldAuxPoint?.prev as ListNode;\n const auxPoint = PointHelpers.createAuxiliaryPoint(store.tail?.val as Step, store.head?.val as Step);\n if (this.snapshot) this.snapshot.newAux = store.insertAfter(store.head as ListNode, auxPoint);\n }\n\n if (store.head) {\n store.head.prev = null;\n }\n if (store.tail) {\n store.tail.next = null;\n }\n\n return true;\n }\n return false;\n };\n\n public execute = () => {\n const clickedNode = this.ctx.store.findNodeById(this.ctx.nodeId);\n const isAuxiliary = clickedNode?.val?.isAuxiliary;\n if (!clickedNode || isAuxiliary) return;\n\n this.snapshot = this.makeSnapshot(clickedNode);\n this.recalculateInBetweenRemoved(clickedNode);\n // remove the primary node\n this.ctx.store.removeNodeById(this.ctx.nodeId);\n\n const ok = this.breakGeometryIfNeeded(this.ctx);\n if (ok) {\n this.ctx.mode.reset();\n }\n\n FireEvents.pointRemoveRightClick({ ...(clickedNode?.val as Step), total: this.ctx.store.size }, this.ctx.map);\n this.ctx.store.pingConsumers();\n };\n\n private restoreRemovedMiddleNode = (removedNode: ListNode) => {\n if (!this.snapshot) return;\n if (!removedNode.val) return;\n const { beforePrimary: before, afterPrimary: after, wasCircular } = this.snapshot;\n const { store, mode } = this.ctx;\n\n if (before) {\n before.next = removedNode;\n removedNode.prev = before;\n }\n\n if (after) {\n removedNode.next = after;\n after.prev = removedNode;\n }\n\n // this is the case when we have 3 primary and 3 aux points\n if (wasCircular && !this.ctx.store.circular.isCircular()) {\n const auxPoint = PointHelpers.createAuxiliaryPoint(store.tail?.val as Step, store.head?.val as Step);\n store.push(auxPoint);\n store.circular.close();\n mode.setClosedGeometry(true);\n }\n };\n\n private restoreRemovedHeadNode = (removedNode: ListNode) => {\n if (!this.snapshot || !removedNode?.val) return;\n\n const { wasCircular } = this.snapshot;\n const { store, mode } = this.ctx;\n const currentHead = this.ctx.store.head;\n\n if (currentHead) {\n removedNode.next = currentHead;\n currentHead.prev = removedNode;\n }\n store.head = removedNode;\n\n const notCircularNow = !store.circular.isCircular();\n if (wasCircular && notCircularNow) {\n store.circular.close();\n mode.setClosedGeometry(true);\n }\n };\n\n private restoreRemovedTailNode = (removedNode: ListNode) => {\n const { store, mode } = this.ctx;\n if (!this.snapshot) return;\n const { wasCircular } = this.snapshot;\n const currentTail = store.tail;\n\n if (currentTail) {\n currentTail.next = removedNode;\n removedNode.prev = currentTail;\n store.tail = removedNode;\n }\n const notCircularNow = !store.circular.isCircular();\n if (wasCircular && notCircularNow) {\n store.circular.close();\n mode.setClosedGeometry(true);\n }\n };\n\n private restoreAuxiliaryPoints(node: ListNode): void {\n if (!this.snapshot) return;\n if (node.prev?.val && node.val && this.snapshot?.beforeAux) {\n this.restoreNodeAfter(node.prev, this.snapshot?.beforeAux);\n if (this.snapshot.wasRemovedHead && this.snapshot.wasCircular) {\n this.ctx.store.tail = this.snapshot.beforeAux;\n }\n }\n\n if (node.next?.val && node.val && this.snapshot?.afterAux) {\n this.restoreNodeAfter(node, this.snapshot?.afterAux);\n if (this.snapshot.wasRemovedTail && this.snapshot.wasCircular) {\n this.ctx.store.tail = this.snapshot.afterAux;\n }\n }\n\n if (this.snapshot.wasCircular) {\n this.ctx.store.circular.close();\n }\n }\n\n public undo = () => {\n const { store } = this.ctx;\n\n if (!this.snapshot) return;\n const { removedNode: node, wasRemovedHead, wasRemovedTail, wasCircular } = this.snapshot;\n if (!node?.val) return;\n\n if (wasRemovedHead) {\n // first remove the aux point that was added before when we removed the primary node\n store.removeNodeById(store.head?.prev?.val?.id as StepId);\n this.restoreRemovedHeadNode(node);\n } else if (wasRemovedTail) {\n this.restoreRemovedTailNode(node);\n if (wasCircular && store.tail?.prev?.val?.isAuxiliary) {\n store.removeNodeById(store.tail?.prev?.val?.id as StepId);\n }\n } else {\n // first remove the aux point that was added before when we removed the primary node\n if (this.snapshot.newAux?.val?.id) {\n store.removeNodeById(this.snapshot.newAux?.val?.id);\n }\n this.restoreRemovedMiddleNode(node);\n }\n\n if (!store.map.has(this.ctx.nodeId)) {\n store.map.set(this.ctx.nodeId, node);\n store.size++;\n }\n\n this.restoreAuxiliaryPoints(node);\n store.pingConsumers();\n };\n}\n","import type { Command } from \"#app/history/command\";\nimport type { ListNode } from \"#app/store\";\nimport type { StoreChangeEventKeys } from \"#app/store/types\";\nimport type { Step } from \"#app/types\";\nimport { FireEvents } from \"#components/map/fire-events\";\nimport type { RemoveCommanContext } from \".\";\n\ninterface RemovedPointSnapshot {\n removedNode: ListNode;\n wasCircular: boolean;\n wasRemovedHead: boolean;\n wasRemovedTail: boolean;\n}\n\nexport class RemovePointManualCommand implements Command {\n type: StoreChangeEventKeys = \"STORE_INBETWEEN_POINT_REMOVED\";\n snapshot: RemovedPointSnapshot | null = null;\n\n constructor(private readonly ctx: RemoveCommanContext) {}\n\n private makeSnapshot(clickedNode: ListNode): RemovedPointSnapshot {\n const wasRemovedHead = this.ctx.store.head?.val?.id === this.ctx.nodeId;\n const wasRemovedTail = this.ctx.store.tail?.val?.id === this.ctx.nodeId;\n const wasCircular = this.ctx.store.circular.isCircular();\n\n return {\n removedNode: clickedNode,\n wasCircular,\n wasRemovedHead,\n wasRemovedTail,\n };\n }\n\n private breakGeometryIfNeeded = (ctx: Pick<RemoveCommanContext, \"store\">) => {\n const { store } = ctx;\n\n if (store.circular.canBreak() && store.circular.isCircular()) {\n if (store.head) {\n store.head.prev = null;\n }\n if (store.tail) {\n store.tail.next = null;\n }\n\n return true;\n }\n return false;\n };\n\n public execute = () => {\n const clickedNode = this.ctx.store.findNodeById(this.ctx.nodeId);\n\n if (!clickedNode?.val) return;\n\n this.snapshot = this.makeSnapshot(clickedNode);\n this.ctx.store.removeNodeById(this.ctx.nodeId);\n const ok = this.breakGeometryIfNeeded(this.ctx);\n if (ok) {\n this.ctx.mode.reset();\n }\n FireEvents.pointRemoveRightClick({ ...(clickedNode?.val as Step), total: this.ctx.store.size }, this.ctx.map);\n this.ctx.store.pingConsumers();\n };\n\n private closeGeometryIfNeeded = () => {\n const { store, mode } = this.ctx;\n\n const notCircularNow = !this.ctx.store.circular.isCircular();\n if (this.snapshot?.wasCircular && notCircularNow) {\n store.circular.close();\n mode.setClosedGeometry(true);\n }\n };\n\n private restoreRemovedMiddleNode = (removedNode: ListNode) => {\n if (!removedNode?.val) return;\n\n const { prev, next } = removedNode;\n\n if (prev) {\n prev.next = removedNode;\n removedNode.prev = prev;\n } else {\n this.ctx.store.head = removedNode;\n }\n\n if (next) {\n next.prev = removedNode;\n removedNode.next = next;\n } else {\n this.ctx.store.tail = removedNode;\n }\n };\n\n private restoreRemovedHeadNode = (removedNode: ListNode) => {\n const currentHead = this.ctx.store.head;\n if (!removedNode?.val) return;\n\n if (currentHead) {\n removedNode.next = currentHead;\n currentHead.prev = removedNode;\n }\n this.ctx.store.head = removedNode;\n };\n\n private restoreRemovedTailNode = (removedNode: ListNode) => {\n const currentTail = this.ctx.store.tail;\n\n if (currentTail) {\n currentTail.next = removedNode;\n removedNode.prev = currentTail;\n }\n this.ctx.store.tail = removedNode;\n };\n\n public undo = () => {\n if (!this.snapshot) return;\n const { removedNode, wasRemovedHead, wasRemovedTail } = this.snapshot;\n\n if (wasRemovedHead) {\n this.restoreRemovedHeadNode(removedNode);\n } else if (wasRemovedTail) {\n this.restoreRemovedTailNode(removedNode);\n } else {\n this.restoreRemovedMiddleNode(removedNode);\n }\n\n this.closeGeometryIfNeeded();\n\n if (!this.ctx.store.map.has(this.ctx.nodeId)) {\n this.ctx.store.map.set(this.ctx.nodeId, removedNode);\n this.ctx.store.size++;\n }\n\n this.ctx.store.pingConsumers();\n };\n}\n","import type { Command } from \"#app/history/command\";\nimport type { Store } from \"#app/store\";\nimport type { StoreChangeEventKeys } from \"#app/store/types\";\nimport type { RequiredDrawOptions } from \"#app/types\";\nimport type { UnifiedMap } from \"#app/types/map\";\nimport type { DrawingMode } from \"#components/map/mode\";\nimport { RemovePointAutoCommand } from \"./auto\";\nimport { RemovePointManualCommand } from \"./manual\";\n\nexport interface RemoveCommanContext {\n readonly store: Store;\n readonly map: UnifiedMap;\n readonly options: RequiredDrawOptions;\n readonly mode: DrawingMode;\n readonly nodeId: string;\n}\n\nexport class RemovePointCommand implements Command {\n type: StoreChangeEventKeys = \"STORE_INBETWEEN_POINT_REMOVED\";\n manualPointRemove: RemovePointManualCommand | null = null;\n autoPointRemove: RemovePointAutoCommand | null = null;\n constructor(private readonly ctx: RemoveCommanContext) {\n this.manualPointRemove = new RemovePointManualCommand(this.ctx);\n this.autoPointRemove = new RemovePointAutoCommand(this.ctx);\n }\n\n public execute = () => {\n if (this.ctx.options.pointGeneration === \"auto\") {\n this.autoPointRemove?.execute();\n } else {\n this.manualPointRemove?.execute();\n }\n };\n\n public undo = () => {\n if (this.ctx.options.pointGeneration === \"auto\") {\n this.autoPointRemove?.undo();\n } else {\n this.manualPointRemove?.undo();\n }\n };\n}\n","import type { MapLayerMouseEvent } from \"maplibre-gl\";\n\nimport type { ListNode } from \"#app/store/index\";\nimport type { LatLng, Step } from \"#app/types/index\";\n\nimport { PointHelpers } from \"./helpers\";\nimport type { PointState } from \"./point-state\";\nimport { AddPointCommand } from \"./commands/add-point\";\nimport { timeline } from \"#app/history\";\nimport { RemovePointCommand } from \"./commands/remove-point\";\nimport type { TilesContext } from \"../tiles\";\n\nexport class PointTopologyManager {\n constructor(\n private readonly ctx: TilesContext,\n private readonly state: PointState,\n ) {}\n\n private updateMainPoint(node: ListNode, event: MapLayerMouseEvent): void {\n if (node.val) {\n node.val.lat = event.lngLat.lat;\n node.val.lng = event.lngLat.lng;\n }\n }\n\n private updateAuxiliaryPoints(node: ListNode, event: MapLayerMouseEvent): void {\n const auxPoints = this.getAuxPointsLatLng(event);\n if (!auxPoints) return;\n\n this.updatePrevAuxPoint(node, auxPoints.prev);\n this.updateNextAuxPoint(node, auxPoints.next);\n }\n\n private updatePrevAuxPoint(node: ListNode, prevCoords: LatLng | null): void {\n if (node.prev?.val && prevCoords) {\n node.prev.val.lat = prevCoords.lat;\n node.prev.val.lng = prevCoords.lng;\n }\n }\n\n private updateNextAuxPoint(node: ListNode, nextCoords: LatLng | null): void {\n if (node.next?.val && nextCoords) {\n node.next.val.lat = nextCoords.lat;\n node.next.val.lng = nextCoords.lng;\n }\n }\n\n // we've got the reference to the selected node from the store and just updating the lat/lng when mouse up event happens\n public updateStore = () => {\n const lastEvent = this.state.getLastEvent();\n const selectedNode = this.state.getSelectedNode();\n\n if (!lastEvent || !selectedNode?.val) return;\n\n this.updateMainPoint(selectedNode, lastEvent);\n this.updateAuxiliaryPoints(selectedNode, lastEvent);\n };\n\n public getAuxPointsLatLng = (event: MapLayerMouseEvent) => {\n const selectedNode = this.state.getSelectedNode();\n if (!selectedNode) return null;\n\n const { options } = this.ctx;\n const prevPrimary = selectedNode?.prev?.prev;\n const nextPrimary = selectedNode?.next?.next;\n\n if (options.pointGeneration === \"auto\") {\n return {\n next: nextPrimary?.val ? PointHelpers.getMidpoint(nextPrimary.val, event.lngLat) : null,\n prev: prevPrimary?.val ? PointHelpers.getMidpoint(event.lngLat, prevPrimary.val) : null,\n } as const;\n }\n return null;\n };\n\n public addPoint(event: MapLayerMouseEvent): Step {\n const { store, options } = this.ctx;\n\n const cmd = new AddPointCommand(store, options, event.lngLat);\n timeline.commit(cmd);\n return cmd.getStep();\n }\n\n public removePoint(id: string): void {\n const { store, options, mode, map } = this.ctx;\n\n if (store.size === 1) {\n store.reset();\n } else {\n timeline.commit(new RemovePointCommand({ store, options, mode, map, nodeId: id }));\n }\n }\n}\n","import type { LatLng } from \"#app/types/index\";\nimport type { MapLayerMouseEvent, MapTouchEvent } from \"maplibre-gl\";\n\nimport { throttle } from \"#app/utils/helpers\";\nimport { ELAYERS } from \"#app/utils/geo_constants\";\nimport { timeline } from \"#app/history\";\nimport type { StoreChangeEvent } from \"#app/store/types\";\n\nimport { FireEvents } from \"../fire-events\";\nimport { PointVisibility } from \"./helpers\";\nimport { FirstPoint } from \"./first-point\";\nimport { removeTransparentLine, addTransparentLine } from \"../tiles/utils\";\nimport { AuxPoints } from \"./aux-points\";\nimport type { DrawingModeChangeEvent } from \"../mode/types\";\nimport { PointState } from \"./point-state\";\nimport { PointTopologyManager } from \"./point-topology-manager\";\nimport { MovePointCommand } from \"./commands/move-point\";\nimport { renderer } from \"../renderer\";\nimport { queryPointId, isFeatureTriggered, queryPoint, getGeometryIndex } from \"../utils\";\nimport type { TilesContext } from \"../tiles\";\n\nexport interface PrimaryPointEvents {\n onPointMouseEnter: (event: MapLayerMouseEvent) => void;\n onPointMouseLeave: (event: MapLayerMouseEvent) => void;\n onPointMouseDown: (event: MapLayerMouseEvent | MapTouchEvent) => void;\n onPointMouseUp: () => void;\n onMapMouseMove: (event: MapLayerMouseEvent) => void;\n}\n// TODO messy: clean this up\nexport class PointEvents {\n private eventsInited = false;\n private events: PrimaryPointEvents;\n private firstPoint: FirstPoint | null;\n private auxPoints: AuxPoints | null;\n private pointState: PointState;\n private topologyManager: PointTopologyManager;\n\n constructor(private readonly ctx: TilesContext) {\n this.pointState = new PointState();\n this.topologyManager = new PointTopologyManager(ctx, this.pointState);\n\n this.events = {\n onPointMouseEnter: this.onPointMouseEnter,\n onPointMouseLeave: this.onPointMouseLeave,\n onPointMouseDown: this.onPointMouseDown,\n onPointMouseUp: this.onPointMouseUp,\n onMapMouseMove: this.onMapMouseMove,\n };\n this.firstPoint = new FirstPoint(this.ctx, this.events);\n this.auxPoints = new AuxPoints(this.ctx, this.events, this.pointState, this.topologyManager);\n }\n\n private initConsumers = () => {\n this.ctx.mode.addObserver(this.mapModeConsumer);\n this.ctx.store.addObserver(this.storeEventsConsumer);\n };\n\n private removeConsumers = () => {\n this.ctx.mode.removeObserver(this.mapModeConsumer);\n this.ctx.store.removeObserver(this.storeEventsConsumer);\n this.auxPoints?.removeConsumers();\n };\n\n private initEvents = () => {\n const { map } = this.ctx;\n map.on(\"click\", this.onMapClick);\n map.on(\"dblclick\", this.onMapDblClick);\n\n map.on(\"mouseenter\", ELAYERS.PointsLayer, this.onPointMouseEnter);\n map.on(\"mouseleave\", ELAYERS.PointsLayer, this.onPointMouseLeave);\n map.on(\"mousedown\", ELAYERS.PointsLayer, this.onPointMouseDown);\n map.on(\"click\", ELAYERS.PointsLayer, this.onPointClick);\n map.on(\"mouseup\", ELAYERS.PointsLayer, this.onPointMouseUp);\n map.on(\"touchend\", ELAYERS.PointsLayer, this.onPointMouseUp);\n map.on(\"touchstart\", ELAYERS.PointsLayer, this.onPointMouseDown);\n this.eventsInited = true;\n };\n\n public init = () => {\n this.initEvents();\n this.initConsumers();\n };\n\n private removeEvents = () => {\n const { map } = this.ctx;\n map.off(\"click\", this.onMapClick);\n map.off(\"dblclick\", this.onMapDblClick);\n map.off(\"mousemove\", this.onMapMouseMove);\n\n map.off(\"mouseenter\", ELAYERS.PointsLayer, this.onPointMouseEnter);\n map.off(\"mouseleave\", ELAYERS.PointsLayer, this.onPointMouseLeave);\n map.off(\"mousedown\", ELAYERS.PointsLayer, this.onPointMouseDown);\n map.off(\"click\", ELAYERS.PointsLayer, this.onPointClick);\n map.off(\"mouseup\", ELAYERS.PointsLayer, this.onPointMouseUp);\n map.off(\"touchend\", ELAYERS.PointsLayer, this.onPointMouseUp);\n map.off(\"touchstart\", ELAYERS.PointsLayer, this.onPointMouseDown);\n this.eventsInited = false;\n };\n\n public remove = () => {\n this.removeEvents();\n this.firstPoint?.remove();\n this.auxPoints?.removeEvents();\n this.removeConsumers();\n };\n\n private onPointClick = (event: MapLayerMouseEvent) => {\n const { mouseEvents, store, map, options } = this.ctx;\n const id = queryPointId(map, event.point);\n\n if (store.isLastPoint(options, id)) {\n mouseEvents.lastPointMouseClick = true;\n mouseEvents.lastPointMouseUp = false;\n }\n };\n\n private onMapDblClick = (event: MapLayerMouseEvent) => {\n event.preventDefault();\n };\n\n private onPointRemove = (event: MapLayerMouseEvent | MapTouchEvent) => {\n const { store } = this.ctx;\n if (store.size === 1) {\n store.reset();\n this.ctx.panel.hide();\n } else {\n const id = queryPointId(this.ctx.map, event.point);\n const clickedNode = store.findNodeById(id);\n\n if (!clickedNode?.val) return;\n\n this.topologyManager.removePoint(clickedNode.val.id);\n }\n renderer.execute();\n };\n\n private onOwnGeometryLayersClick = (event: MapLayerMouseEvent) => {\n return isFeatureTriggered(event, [\n ELAYERS.PointsLayer,\n ELAYERS.FirstPointLayer,\n ELAYERS.LineLayerTransparent,\n ELAYERS.LineLayerBreak,\n ]);\n };\n\n private onMapClick = (event: MapLayerMouseEvent) => {\n const { mode, mouseEvents, map, store } = this.ctx;\n\n if (mode.getClosedGeometry()) return;\n if (this.onOwnGeometryLayersClick(event)) return;\n\n if (mouseEvents.lastPointMouseClick) {\n mouseEvents.lastPointMouseClick = false;\n }\n map.getCanvasContainer().style.cursor = \"grab\";\n const addedStep = this.topologyManager.addPoint(event);\n FireEvents.addPoint({ ...addedStep, total: store.size }, map, mode);\n PointVisibility.setSinglePointHidden(event);\n renderer.execute();\n };\n\n private onMoveLeftClickUp = (event: MapLayerMouseEvent) => {\n const mouseLeftClickUp = event.originalEvent.buttons === 0;\n if (mouseLeftClickUp) {\n this.onPointMouseUp();\n }\n };\n\n private onMapMouseMove = throttle((event: MapLayerMouseEvent) => {\n const { mouseEvents } = this.ctx;\n\n if (mouseEvents.pointMouseDown) {\n this.pointState.setLastEvent(event);\n\n if (!this.pointState.getSelectedNode()) return;\n\n this.onMoveLeftClickUp(this.pointState.getLastEvent() as MapLayerMouseEvent);\n const auxPoints = this.topologyManager.getAuxPointsLatLng(this.pointState.getLastEvent() as MapLayerMouseEvent);\n renderer.executeOnMouseMove(this.pointState.getSelectedIdx() as number, event.lngLat, auxPoints);\n this.pointState.setMoved(true);\n }\n }, 17);\n\n private onPointMouseEnter = (event: MapLayerMouseEvent) => {\n const { mouseEvents, map, store, options } = this.ctx;\n if (mouseEvents) {\n mouseEvents.pointMouseEnter = true;\n if (mouseEvents.pointMouseDown) return;\n }\n PointVisibility.setSinglePointHidden(event);\n const id = queryPointId(map, event.point);\n if (store.isLastPoint(options, id)) {\n mouseEvents.lastPointMouseEnter = true;\n mouseEvents.lastPointMouseLeave = false;\n }\n const step = store.findStepById(id);\n if (step) {\n this.pointState.setEnteredStep(step);\n FireEvents.enterPoint(Object.assign({}, step, { total: store.size }), map);\n }\n };\n\n private onPointMouseLeave = (event: MapLayerMouseEvent) => {\n const { mouseEvents, store, map, options } = this.ctx;\n\n if (mouseEvents) {\n mouseEvents.pointMouseEnter = false;\n if (event.originalEvent.buttons === 0) {\n mouseEvents.pointMouseLeave = true;\n }\n if (mouseEvents.pointMouseDown) return;\n }\n const id = queryPointId(map, event.point);\n if (store.isLastPoint(options, id)) {\n mouseEvents.lastPointMouseEnter = false;\n mouseEvents.lastPointMouseLeave = true;\n }\n FireEvents.leavePoint(\n Object.assign({}, this.pointState.getEnteredStep(), {\n total: store.size,\n }),\n map,\n );\n };\n\n private storeEventsConsumer = (event: StoreChangeEvent) => {\n if (event.type === \"STORE_MUTATED\") {\n if (event.data?.size === 0) {\n this.pointState.reset();\n }\n }\n };\n\n private mapModeConsumer = (event: DrawingModeChangeEvent) => {\n const { type, data } = event;\n if (type === \"MODE_CHANGED\" && !data) {\n if (this.eventsInited) {\n this.removeEvents();\n }\n } else if (type === \"MODE_CHANGED\" && data) {\n if (!this.eventsInited) {\n this.initEvents();\n }\n }\n\n if (type === \"BREAK_CHANGED\" || type === \"MODE_CHANGED\") {\n this.pointState.reset();\n }\n };\n\n private hideLastPointPanel = () => {\n const { store, panel, options } = this.ctx;\n const selectedNode = this.pointState.getSelectedNode();\n\n if (!selectedNode?.val) return;\n\n if (store.isLastPoint(options, selectedNode.val.id)) {\n panel.hide();\n }\n };\n\n private setSelectedNode = (event: MapLayerMouseEvent | MapTouchEvent) => {\n const { store, map } = this.ctx;\n\n const id = queryPointId(map, event.point);\n const node = store.findNodeById(id);\n\n if (node) {\n this.pointState.setSelectedNode(node);\n }\n };\n\n private onPointMouseDown = (event: MapLayerMouseEvent | MapTouchEvent) => {\n event.preventDefault();\n\n this.pointState.clearLastEvent();\n\n const { mouseEvents, map, store } = this.ctx;\n\n if ((event.originalEvent as { button: number }).button === 2) {\n this.onPointRemove(event);\n return;\n }\n\n this.setSelectedNode(event);\n\n removeTransparentLine(map);\n this.hideLastPointPanel();\n\n const point = queryPoint(map, event.point);\n const geometryIndex = getGeometryIndex(store, point?.properties.id);\n this.pointState.setSelectedIdx(geometryIndex);\n\n if (mouseEvents) {\n mouseEvents.pointMouseDown = true;\n }\n\n this.pointState.setStartCoordinates(event.lngLat);\n\n map.on(\"mousemove\", this.onMapMouseMove);\n map.on(\"touchmove\", this.onMapMouseMove);\n };\n\n private onPointMouseUp = () => {\n const { mouseEvents, store, panel, map, options } = this.ctx;\n\n map.off(\"mousemove\", this.onMapMouseMove);\n map.off(\"touchmove\", this.onMapMouseMove);\n\n mouseEvents.pointMouseUp = true;\n\n const selectedNode = this.pointState.getSelectedNode();\n const lastEvent = this.pointState.getLastEvent();\n const startCoordinates = this.pointState.getStartCoordinates();\n\n if (selectedNode && !selectedNode.val?.isAuxiliary) {\n if (lastEvent) {\n this.topologyManager.updateStore();\n this.pointState.clearLastEvent();\n }\n\n panel?.show();\n\n if (this.pointState.isMoved()) {\n timeline.commit(new MovePointCommand(store, selectedNode, startCoordinates as LatLng, map));\n this.pointState.setMoved(false);\n }\n this.pointState.partialReset();\n }\n\n if (mouseEvents) {\n mouseEvents.pointMouseDown = false;\n }\n\n addTransparentLine(map, options);\n renderer.execute();\n };\n}\n","import { LineEvents } from \"../line\";\nimport { PointEvents } from \"../points\";\nimport { TilesContext } from \".\";\n\nexport class Events {\n private pointEvents: PointEvents;\n private lineEvents: LineEvents;\n\n constructor(private readonly ctx: TilesContext) {\n this.pointEvents = new PointEvents(this.ctx);\n this.lineEvents = new LineEvents(this.ctx);\n this.initEvents();\n }\n\n private initEvents = () => {\n this.lineEvents.init();\n this.pointEvents?.init();\n };\n\n public remove = () => {\n this.pointEvents?.remove();\n this.lineEvents?.remove();\n };\n}\n","import type { StoreChangeEvent, StoreChangeEventKeys } from \"#app/store/types\";\nimport { ELAYERS, generateLayers } from \"#app/utils/geo_constants\";\nimport { debounce } from \"#app/utils/helpers\";\nimport { TilesContext } from \".\";\n\nexport class Layers {\n constructor(private readonly ctx: TilesContext) {}\n\n public init() {\n this.add();\n this.swap(ELAYERS.LineLayer, ELAYERS.SinglePointLayer);\n this.swap(ELAYERS.LineLayerTransparent, ELAYERS.SinglePointLayer);\n this.swap(ELAYERS.LineLayerTransparent, ELAYERS.FirstPointLayer);\n this.swap(ELAYERS.LineLayerTransparent, ELAYERS.PointsLayer);\n this.swap(ELAYERS.PolygonLayer, ELAYERS.LineLayer);\n\n this.initConsumers();\n }\n\n private initConsumers = () => {\n this.ctx.store.addObserver(this.onStoreChange);\n };\n\n private removeConsumers = () => {\n this.ctx.store.removeObserver(this.onStoreChange);\n };\n\n private onStoreChange = debounce((event: StoreChangeEvent) => {\n const events = [\n \"STORE_MUTATED\",\n \"STORE_CLOSE_GEOMETRY\",\n \"STORE_BREAK_GEOMETRY\",\n \"STORE_CLEARED\",\n ] as StoreChangeEventKeys[];\n\n if (events.includes(event.type)) {\n const { map, store, mode } = this.ctx;\n\n const isPolygonMode = mode.getMode() === \"polygon\";\n\n if (isPolygonMode && store.circular.isCircular()) {\n map.setLayoutProperty(ELAYERS.PolygonLayer, \"visibility\", \"visible\");\n } else {\n map.setLayoutProperty(ELAYERS.PolygonLayer, \"visibility\", \"none\");\n }\n }\n }, 10);\n\n private add = () => {\n const LAYERS_TO_RENDER = generateLayers(this.ctx.options);\n\n for (const layer of LAYERS_TO_RENDER) {\n if (!this.ctx.map.getLayer(layer.id)) {\n this.ctx.map.addLayer(layer);\n }\n }\n };\n\n private swap = (beneathLayerId: string, aboveLayerId: string) => {\n const beneath = this.ctx.map.getLayer(beneathLayerId);\n const above = this.ctx.map.getLayer(aboveLayerId);\n\n if (beneath && above) {\n this.ctx.map.moveLayer(beneathLayerId, aboveLayerId);\n }\n };\n\n private removeLayers = () => {\n for (const layer of Object.values(ELAYERS)) {\n if (this.ctx.map.getLayer(layer)) {\n this.ctx.map.removeLayer(layer);\n }\n }\n };\n\n public remove = () => {\n this.removeConsumers();\n this.removeLayers();\n };\n}\n","import { ESOURCES } from \"#app/utils/geo_constants\";\nimport { TilesContext } from \".\";\n\nexport class Sources {\n constructor(private readonly ctx: Pick<TilesContext, \"map\">) {}\n\n init() {\n for (const source of Object.values(ESOURCES)) {\n if (!this.ctx.map.getSource(source)) {\n this.ctx.map.addSource(source, {\n type: \"geojson\",\n data: {\n type: \"FeatureCollection\",\n features: [],\n },\n promoteId: \"id\",\n });\n }\n }\n }\n\n remove() {\n for (const source of Object.values(ESOURCES)) {\n if (this.ctx.map.getSource(source)) {\n this.ctx.map.removeSource(source);\n }\n }\n }\n}\n","import type { Store } from \"#app/store\";\nimport type { RequiredDrawOptions } from \"#app/types\";\nimport type { UnifiedMap } from \"#app/types/map\";\nimport { Panel } from \"#components/panel\";\nimport { Control } from \"#components/side-control\";\nimport { DrawingMode } from \"../mode\";\nimport { MouseEvents } from \"../mouse-events\";\nimport { Events } from \"./events\";\nimport { Layers } from \"./layers\";\nimport { Sources } from \"./sources\";\n\nexport type TilesContext = {\n map: UnifiedMap;\n panel: Panel;\n store: Store;\n control: Control;\n options: RequiredDrawOptions;\n mouseEvents: MouseEvents;\n mode: DrawingMode;\n};\n\nexport class Tiles {\n private sources: Sources;\n private layers: Layers;\n private events: Events | undefined;\n\n constructor(private readonly ctx: TilesContext) {\n this.sources = new Sources(this.ctx);\n this.layers = new Layers(this.ctx);\n this.events = new Events(this.ctx);\n this.init();\n }\n\n private init = () => {\n // first add the sources then all the layers\n this.sources.init();\n this.layers.init();\n };\n\n public remove = () => {\n // first remove the layers then all the sources\n this.layers.remove();\n this.sources.remove();\n this.events?.remove();\n };\n}\n","import type { UnifiedMap } from \"#app/types/map\";\nimport { EVENTS } from \"#app/utils/constants\";\nimport { FireEvents } from \"#components/map/fire-events\";\nimport { timeline } from \".\";\nimport type { TimelineChangeEvent } from \"./types\";\n\nexport class MapTimelineAdapter {\n constructor(private map: UnifiedMap) {\n this.init();\n }\n\n private init() {\n timeline.addObserver(this.onTimelineEvent);\n }\n\n public destroy() {\n timeline.removeObserver(this.onTimelineEvent);\n }\n\n private onTimelineEvent = (evt: TimelineChangeEvent) => {\n switch (evt.type) {\n case \"UNDO_STACK_CHANGED\":\n FireEvents.onUndoStackChange(this.map, evt.data);\n break;\n case \"REDO_STACK_CHANGED\":\n FireEvents.onRedoStackChange(this.map, evt.data);\n break;\n }\n };\n}\n","import type { IControl, UnifiedMap } from \"#app/types/map\";\nimport type { DrawOptions, LatLng, RequiredDrawOptions, Step, StepId } from \"#app/types/index\";\nimport type {\n UndoEvent,\n PointAddEvent,\n PointRightClickRemoveEvent,\n PointEnterEvent,\n PointLeaveEvent,\n PointMoveEvent,\n RemoveAllEvent,\n SaveEvent,\n ModeChangeEvent,\n UndoStackChangeEvent,\n RedoStackChangeEvent,\n} from \"#components/map/types\";\n\nimport { Panel } from \"#components/panel\";\nimport { Control } from \"#components/side-control\";\nimport { DrawingMode } from \"#components/map/mode\";\nimport { Cursor } from \"#components/cursor\";\nimport { MouseEvents } from \"#components/map/mouse-events/index\";\nimport { uuidv4 } from \"#app/utils/helpers\";\nimport { DOM } from \"#app/dom\";\nimport { Store } from \"#app/store/index\";\nimport { renderer, Renderer } from \"#components/map/renderer\";\nimport { linkedListToArray } from \"#app/store/init\";\nimport { checkInitialStepsOptionOnErrors, initOptions } from \"#app/options\";\n\nimport \"./draw.css\";\nimport { Tiles } from \"#components/map/tiles\";\nimport { MapTimelineAdapter } from \"#app/history/map-adapter\";\n\nexport default class DrawLibre implements IControl {\n private container: HTMLElement | undefined;\n private store: Store | undefined;\n private mode: DrawingMode | undefined;\n private defaultOptions: RequiredDrawOptions;\n private tiles: Tiles | undefined;\n private panel: Panel | undefined;\n private control: Control | undefined;\n private cursor: Cursor | undefined;\n private mouseEvents: MouseEvents | undefined;\n private timelineAdapter: MapTimelineAdapter | undefined;\n\n private renderer: Renderer | null = null;\n static instance: DrawLibre | null = null;\n\n private constructor(options?: DrawOptions) {\n this.defaultOptions = initOptions(options);\n\n if (this.defaultOptions.initial) {\n checkInitialStepsOptionOnErrors(this.defaultOptions.initial);\n }\n }\n\n static getInstance(options?: DrawOptions): DrawLibre {\n if (!DrawLibre.instance) {\n DrawLibre.instance = new DrawLibre(options);\n }\n return DrawLibre.instance;\n }\n\n /**\n * DO NOT USE IMPLICITLY. PASS TO map.addControl().\n *\n * @example ```ts\n * const map = new Map();\n * const draw = DrawLibre.getInstance();\n * map.addControl(draw)\n * ```\n *\n * Register a control on the map and give it a chance to register event listeners\n *\n * @param map - the Map this control will be added to\n * @returns The control's container element. This should\n * be created by the control and returned by onAdd without being attached\n * to the DOM: the map will insert the control's element into the DOM\n * as necessary.\n */\n onAdd = (map: UnifiedMap) => {\n this.store = new Store(this.defaultOptions);\n this.mode = new DrawingMode(this.defaultOptions);\n this.renderer = renderer.initialize({\n map,\n store: this.store,\n options: this.defaultOptions,\n mode: this.mode,\n });\n this.mouseEvents = new MouseEvents();\n this.panel = new Panel({ map, mode: this.mode, options: this.defaultOptions, store: this.store });\n this.control = new Control({ options: this.defaultOptions, map, mode: this.mode });\n this.tiles = new Tiles({\n map,\n store: this.store,\n mode: this.mode,\n options: this.defaultOptions,\n control: this.control,\n panel: this.panel,\n mouseEvents: this.mouseEvents,\n });\n this.cursor = new Cursor({\n map,\n mode: this.mode,\n mouseEvents: this.mouseEvents,\n store: this.store,\n options: this.defaultOptions,\n });\n\n this.timelineAdapter = new MapTimelineAdapter(map);\n this.mode.pingConsumers();\n this.store.pingConsumers();\n this.container = this.control.getContainer();\n\n return this.container;\n };\n\n /**\n * DO NOT USE IMPLICITLY. PASS TO map.removeControl().\n *\n * @example ```ts\n * const map = new Map();\n * const draw = DrawLibre.getInstance();\n * map.removeControl(draw)\n * ```\n *\n * Unregister a control on the map and give it a chance to detach event listeners.\n *\n * @param map - the Map this control will be removed from\n */\n onRemove = () => {\n this.cursor?.remove();\n this.tiles?.remove();\n this.panel?.destroy();\n this.store?.reset();\n this.mode?.unsubscribe();\n this.control?.destroy();\n this.timelineAdapter?.destroy();\n\n if (this.container) {\n DOM.remove(this.container);\n }\n };\n\n /**\n * Adds a series of steps to the store. If a step ID is not provided, it will be automatically generated.\n *\n * @param step - The step to add to the store, which can be of type Step or LatLng.\n */\n public setSteps = (value: Step[] | LatLng[]) => {\n if (Array.isArray(value)) {\n for (const step of value) {\n const newStep = { ...step, id: (step as Step).id || uuidv4() };\n this.store?.push(newStep);\n }\n } else {\n throw new Error(\"Invalid argument. Expected an array of steps.\");\n }\n this.renderer?.execute();\n };\n\n /**\n * Retrieves a step from the store by its ID.\n *\n * @param id - The ID of the step to retrieve.\n * @returns The step with the specified ID, or null if not found.\n */\n public findStepById = (id: StepId) => {\n return this.store?.findStepById(id);\n };\n\n /**\n * Retrieves a node from the store by its ID.\n *\n * @param id - The ID of the node to retrieve.\n * @returns The node with the specified ID, or null if not found.\n */\n public findNodeById = (id: StepId) => {\n return this.store?.findNodeById(id);\n };\n\n /**\n * Retrieves all steps from the store, either as an array or as a linked list, based on the type specified.\n *\n * @param type - The type of collection to return, either \"array\" or \"ll\" (linked list).\n * @returns An array of all steps or the linked list of steps.\n */\n public getAllSteps = (type: \"array\" | \"linkedlist\" = \"array\") => {\n if (type === \"array\" && this.store) {\n return linkedListToArray(this.store.head);\n }\n if (type === \"linkedlist\") {\n return {\n head: this.store?.head,\n tail: this.store?.tail,\n size: this.store?.size,\n };\n }\n throw new Error(\"Invalid type specified. Use 'array' or 'linkedlist'.\");\n };\n\n public setOptions = (fn: (options: RequiredDrawOptions) => RequiredDrawOptions) => {\n this.defaultOptions = fn(this.defaultOptions);\n };\n\n public undo = (e: Event): void => {\n this.panel?.api()?.undo(e);\n };\n\n public redo = (e: Event): void => {\n this.panel?.api()?.redo(e);\n };\n\n public clear = (): void => {\n this.panel?.api()?.clear();\n };\n\n public save = (): void => {\n this.panel?.api()?.save();\n };\n\n public removeAllSteps = () => {\n this.store?.reset();\n this.panel?.destroy();\n this.renderer?.execute();\n };\n}\n\nexport type {\n DrawOptions,\n RequiredDrawOptions,\n PointAddEvent,\n PointRightClickRemoveEvent,\n PointEnterEvent,\n PointLeaveEvent,\n PointMoveEvent,\n RemoveAllEvent,\n SaveEvent,\n UndoEvent,\n ModeChangeEvent,\n UndoStackChangeEvent,\n RedoStackChangeEvent,\n UnifiedMap,\n};\n"]}