draw-libre 1.0.0 → 1.0.1
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.css +1 -1
- package/dist/index.css.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +3 -2
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/line/projection.ts","../src/components/map/mouse-events/index.ts","../src/app/options/constants.ts","../src/app/options/index.ts","../src/components/map/line/commands/break-geometry.ts","../src/components/map/line/break-line.ts","../src/components/map/utils.ts","../src/components/map/points/commands/insert-point.ts","../src/components/map/line/utils.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/tiles/drag-layers.ts","../src/components/map/points/commands/aux-to-primary.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/commands/move-point.ts","../src/components/remove-button/view.ts","../src/components/remove-button/index.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/app/events/emitter.ts","../src/index.ts"],"names":["UIState","value","id","DOM","tagName","className","container","element","node","target","type","callback","options","button","pressed","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","right","labelWidth","labelHeight","position","pos","Observable","args","CompoundCommand","payload","commands","cmd","i","Timeline","_Timeline","txn","timeline","uuidv4","getRandomHexChar","getUuidSection","length","section","getUuidSectionSize","idx","firstElement","lastElement","parts","debounce","fn","delay","timeout","call","coalesceToFrame","pending","frame","flush","LINE_BASE","ELAYERS","POINTS_FILTER","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","DYNAMIC_LINE_PAINT_BASE","BREAK_PAINT_BASE","HIT_HIGHLIGHT_OPACITY","POINT_HIT_PAINT","generateLayers","hitPaint","PointHelpers","p1","p2","mid","FIRST_POINT_LAYERS","POINT_LAYERS","SINGLE_POINT_HIDE_DELAY","singlePointHideTimer","cancelSinglePointHiding","PointVisibility","map","layer","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","prepareSteps","fromArray","initialOptions","appendOpenSteps","linkedListToArray","visitedNodes","result","EVENTS","FireEvents","_FireEvents","emitter","fields","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","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","#modeObserver","GeometryPixels","source","project","#dirty","#nodes","#pixels","isCircular","orderedNodes","nodes","visited","nearestVertexPx","vertices","best","index","vertex","distance","nearestSegmentPx","a","b","abx","aby","lengthSquared","t","clamped","projected","DESYNC_TOLERANCE","GeometryProjection","coords","#toGeometryCopy","reference","copies","origin","shifted","pixels","localCursor","segment","segmentStart","MouseEvents","#firstPointMouseEnter","#firstPointMouseLeave","#lastPointMouseClick","#lastPointMouseUp","#lastPointMouseEnter","#lastPointMouseLeave","#pointMouseDown","#pointMouseUp","#pointMouseEnter","#pointMouseLeave","#lineMouseEnter","#lineMouseLeave","interactionDefaults","isCoarsePointer","DEFAULT_OPTIONS","allStepsHaveIds","checkIfMissingIds","generateId","idGenerationIsOff","idsNotProvided","checkIfStepsAreEmpty","checkIfEnoughPointsToClose","differentPoints","checkIfPolygonIsClosed","firstLng","lastLng","firstLat","lastLat","checkInitialStepsOptionOnErrors","initOptions","interaction","matchesMedia","canHover","generatePanelOptions","generateModeOptions","generateLayersOptions","generateLocaleOptions","query","paint","BreakGeometryCommand","clickCoords","originalHead","originalTail","newHead","newTail","newAuxBetweenHeadTail","LineBreakEvents","lineSource","lineBreakData","POINT_HIT_LAYERS","isFeatureTriggered","layerIds","queryPointId","queryPoint","features","cursorLng","lng","lat","nearest","getGeometryIndex","isRightClick","InsertPointCommand","insertStepIfOnLine","projection","hit","updateUIAfterInsert","checkIfPointClicked","hideDynamicLine","DynamicLineEvents","events","subscription","clientX","clientY","box","latLng","lineClick","TransparentLineEvents","pointSource","LineEvents","firstPointCircleRadius","radius","defaultPointCircleRadius","togglePointCircleRadius","CloseGeometryCommand","FirstPoint","baseEvents","X_OFFSET","CLICK_TOLERANCE_PX","LAYERS","DragLayers","visibility","AuxToPrimaryCommand","clickedNode","prevPrimaryNode","nextPrimaryNode","prevAuxNode","nextAuxNode","lastAuxNode","prevAuxPoint","nextAuxPoint","AuxPoints","PointState","moved","AddPointCommand","coord","addedNode","auxNode","RemovePointAutoCommand","nodeId","wasCircular","wasRemovedHead","wasRemovedTail","auxBefore","auxAfter","beforePrimary","afterPrimary","after","restoredNode","primaryBefore","primaryAfter","meetsAuxInsertionThreshold","closesOnTail","oldAuxPoint","isAuxiliary","removedNode","before","currentHead","notCircularNow","currentTail","RemovePointManualCommand","RemovePointCommand","PointTopologyManager","state","auxPoints","prevCoords","nextCoords","lastEvent","selectedNode","prevPrimary","nextPrimary","MovePointCommand","start","prevAux","nextAux","midPoint","BUTTON_CLASS","HIDDEN_CLASS","RemoveButtonView","side","selfShift","OFFSET_X","RemoveButton","containerWidth","anchor","PointEvents","addedStep","moveEvent","reentered","startCoordinates","Layers","LAYERS_TO_RENDER","beneathLayerId","aboveLayerId","beneath","above","Sources","Tiles","MapTimelineAdapter","evt","Emitter","listener","registered","registration","once","key","DrawLibre","_DrawLibre","#mounted","#busy","engine","error","#teardown","#getMountedState"],"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 setPressed(button: HTMLElement | null | undefined, pressed: boolean) {\n if (!button) return;\n button.classList.toggle(\"control-button-active\", pressed);\n button.setAttribute(\"aria-pressed\", String(pressed));\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.root.setAttribute(\"data-type\", \"panel\");\n this.buttonContainer = DOM.create(\"div\", \"mdl-dashboard\", this.root);\n\n this.renderButtons();\n if (this.hasButtons()) 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 return this.buttons[type] ?? null;\n };\n\n public hasButtons = (): boolean => {\n return Object.keys(this.buttons).length > 0;\n };\n\n public getRoot = (): HTMLDivElement => {\n return this.root;\n };\n\n public show = () => {\n this.root.classList.remove(\"hidden\");\n this.root.removeAttribute(\"aria-hidden\");\n };\n\n public hide = () => {\n this.root.classList.add(\"hidden\");\n this.root.setAttribute(\"aria-hidden\", \"true\");\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, right } = event.target.getBoundingClientRect();\n const { width: labelWidth, height: labelHeight } = this.getLabelDimensions();\n const x = left - BASE_X_OFFSET_FROM_ELEMENT - labelWidth;\n const y = bottom - labelHeight - 2;\n\n if (x < 0) {\n return { x: right + BASE_X_OFFSET_FROM_ELEMENT, y };\n }\n\n return { x, y };\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.transaction = null;\n this.undoStack = [];\n this.redoStack = [];\n this.pingConsumers();\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 type Debounced<T extends AnyFunction> = ((...args: Parameters<T>) => void) & { cancel: () => void };\n\nexport const debounce = <T extends AnyFunction>(fn: T, delay: number): Debounced<T> => {\n let timeout = 0;\n\n const call = (...args: Parameters<T>) => {\n window.clearTimeout(timeout);\n timeout = window.setTimeout(() => {\n timeout = 0;\n fn(...args);\n }, delay);\n };\n\n call.cancel = () => {\n window.clearTimeout(timeout);\n timeout = 0;\n };\n\n return call;\n};\n\nexport type FrameCoalesced<T extends AnyFunction> = ((...args: Parameters<T>) => void) & { cancel: () => void };\n\nexport const coalesceToFrame = <T extends AnyFunction>(fn: T): FrameCoalesced<T> => {\n let pending: Parameters<T> | null = null;\n let frame = 0;\n\n const flush = () => {\n frame = 0;\n const args = pending;\n pending = null;\n if (args) fn(...args);\n };\n\n const call = (...args: Parameters<T>) => {\n pending = args;\n if (frame === 0) frame = window.requestAnimationFrame(flush);\n };\n\n call.cancel = () => {\n if (frame !== 0) window.cancelAnimationFrame(frame);\n frame = 0;\n pending = null;\n };\n\n return call;\n};\n","import type { RequiredDrawOptions } from \"#app/types/index\";\nimport type { AddLayerObject, CircleLayerSpecification, FilterSpecification } 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 PointsHitLayer: \"mdl-points-hit-layer\",\n FirstPointHitLayer: \"mdl-first-point-hit-layer\",\n AuxiliaryPointHitLayer: \"mdl-auxiliary-point-hit-layer\",\n} as const;\n\nexport const POINTS_FILTER = {\n points: [\n \"all\",\n [\"==\", [\"geometry-type\"], \"Point\"],\n [\"==\", [\"get\", \"isFirst\"], false],\n [\"==\", [\"get\", \"isAuxiliary\"], false],\n ],\n pointsWhenClosed: [\"all\", [\"==\", [\"geometry-type\"], \"Point\"], [\"==\", [\"get\", \"isAuxiliary\"], false]],\n firstPoint: [\"==\", [\"get\", \"isFirst\"], true],\n auxiliaryPoint: [\"==\", [\"get\", \"isAuxiliary\"], true],\n} satisfies Record<string, FilterSpecification>;\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 DYNAMIC_LINE_PAINT_BASE = {\n ...LINE_PAINT_BASE,\n \"line-dasharray\": [4.5, 2.5],\n};\n\nexport const BREAK_PAINT_BASE = {\n \"line-width\": 3,\n \"line-color\": \"#FF6464\",\n \"line-dasharray\": [3, 3],\n};\n\nconst HIT_HIGHLIGHT_OPACITY = 0.18;\n\nconst POINT_HIT_PAINT = {\n \"circle-color\": \"#666666\",\n \"circle-opacity\": [\"case\", [\"boolean\", [\"feature-state\", \"hover\"], false], HIT_HIGHLIGHT_OPACITY, 0],\n} satisfies CircleLayerSpecification[\"paint\"];\n\nexport const generateLayers = (options: RequiredDrawOptions) => {\n const hitPaint = {\n ...POINT_HIT_PAINT,\n \"circle-radius\": options.interaction.pointHitRadius,\n \"circle-pitch-scale\": \"viewport\" as const,\n };\n\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: [\"==\", [\"geometry-type\"], \"Polygon\"],\n },\n {\n id: ELAYERS.LineDynamicLayer,\n source: ESOURCES.LineDynamicSource,\n type: \"line\",\n paint: options.layersPaint.dynamicLine,\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: [\"==\", [\"geometry-type\"], \"LineString\"],\n },\n {\n id: ELAYERS.LineLayerTransparent,\n source: ESOURCES.UnifiedSource,\n type: \"line\",\n paint: {\n \"line-width\": options.interaction.lineHitRadius * 2,\n \"line-color\": \"transparent\",\n },\n filter: [\"==\", [\"geometry-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: POINTS_FILTER.points,\n },\n {\n id: ELAYERS.FirstPointLayer,\n source: ESOURCES.UnifiedSource,\n type: \"circle\",\n paint: options.layersPaint.firstPoint,\n filter: POINTS_FILTER.firstPoint,\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: POINTS_FILTER.auxiliaryPoint,\n },\n {\n id: ELAYERS.PointsHitLayer,\n source: ESOURCES.UnifiedSource,\n type: \"circle\",\n paint: { ...hitPaint },\n filter: POINTS_FILTER.points,\n },\n {\n id: ELAYERS.FirstPointHitLayer,\n source: ESOURCES.UnifiedSource,\n type: \"circle\",\n paint: { ...hitPaint },\n filter: POINTS_FILTER.firstPoint,\n layout: {\n visibility: \"none\",\n },\n },\n {\n id: ELAYERS.AuxiliaryPointHitLayer,\n source: ESOURCES.UnifiedSource,\n type: \"circle\",\n paint: { ...hitPaint },\n filter: POINTS_FILTER.auxiliaryPoint,\n },\n ] satisfies AddLayerObject[];\n};\n","import type { MapLayerMouseEvent } from \"maplibre-gl\";\nimport type { Step } from \"#app/types/index\";\n\nimport { ELAYERS, POINTS_FILTER } from \"#app/utils/geo_constants\";\nimport { uuidv4 } from \"#app/utils/helpers\";\n\nimport type { EngineMap } from \"#app/types/engine\";\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\nconst FIRST_POINT_LAYERS = [ELAYERS.FirstPointLayer, ELAYERS.FirstPointHitLayer];\nconst POINT_LAYERS = [ELAYERS.PointsLayer, ELAYERS.PointsHitLayer];\n\nconst SINGLE_POINT_HIDE_DELAY = 33;\n\nlet singlePointHideTimer: ReturnType<typeof setTimeout> | null = null;\n\nconst cancelSinglePointHiding = () => {\n if (singlePointHideTimer !== null) {\n clearTimeout(singlePointHideTimer);\n singlePointHideTimer = null;\n }\n};\n\nexport const PointVisibility = {\n cancelSinglePointHiding,\n\n setFirstPointVisible(map: EngineMap) {\n for (const layer of FIRST_POINT_LAYERS) {\n map.setLayoutProperty(layer, \"visibility\", \"visible\");\n }\n },\n\n setFirstPointHidden(map: EngineMap) {\n for (const layer of FIRST_POINT_LAYERS) {\n map.setLayoutProperty(layer, \"visibility\", \"none\");\n }\n },\n\n setSinglePointVisible(event: MapLayerMouseEvent) {\n cancelSinglePointHiding();\n event.target.setLayoutProperty(ELAYERS.SinglePointLayer, \"visibility\", \"visible\");\n },\n\n setSinglePointHidden(event: MapLayerMouseEvent) {\n const map = event.target;\n cancelSinglePointHiding();\n singlePointHideTimer = setTimeout(() => {\n singlePointHideTimer = null;\n map.setLayoutProperty(ELAYERS.SinglePointLayer, \"visibility\", \"none\");\n }, SINGLE_POINT_HIDE_DELAY);\n },\n};\n\nexport const PointsFilter = {\n default(map: EngineMap) {\n for (const layer of POINT_LAYERS) {\n map.setFilter(layer, POINTS_FILTER.points);\n }\n },\n closedGeometry(map: EngineMap) {\n for (const layer of POINT_LAYERS) {\n map.setFilter(layer, POINTS_FILTER.pointsWhenClosed);\n }\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 // breaking works differently depending on whether current is the auxiliary node or the primary node before it\n public break = (current: ListNode) => {\n if (!this.store.head) return;\n\n if (this.options?.pointGeneration === \"auto\") {\n // when current is auxiliary, tail steps back one node and head is the node after 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 // otherwise tail is current and head skips the aux point using 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 // without an aux node, tail is current and 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 NOT_ADDED_TO_MAP: \"DrawLibre is not added to a map. Call map.addControl(draw) before using this method.\",\n ALREADY_ADDED_TO_MAP: \"DrawLibre is already added to a map. Call map.removeControl(draw) before adding it again.\",\n REENTRANT_LIFECYCLE:\n \"DrawLibre is in the middle of being added or removed. Do not call map.addControl or map.removeControl from a listener that runs during addControl or removeControl.\",\n INVALID_STEPS_ARGUMENT: \"Invalid argument. Expected an array of steps.\",\n INVALID_STEPS_TYPE: \"Invalid type specified. Use 'array' or 'linkedlist'.\",\n};\n\nfunction buildStepSequence(\n store: Store,\n initialSteps: Step[],\n closeGeometry: Initial[\"closeGeometry\"],\n pointGeneration: RequiredDrawOptions[\"pointGeneration\"],\n): Store {\n const steps = closeGeometry ? initialSteps.slice(0, -1) : initialSteps;\n\n steps.forEach((step, idx) => {\n store.push(step);\n\n // the last step without a next point gets an auxiliary point back to the first step, closing 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 prepareSteps(steps: (Step | LatLng)[]): Step[] {\n return steps.map((step, idx) => {\n const id = \"id\" in step && step.id !== undefined ? step.id : uuidv4();\n return { ...step, isAuxiliary: false, isFirst: idx === 0, id };\n });\n}\n\nfunction fromArray(initialOptions: Initial, pointGeneration: RequiredDrawOptions[\"pointGeneration\"]): Store | null {\n const { steps: initialSteps, closeGeometry } = initialOptions;\n const steps = prepareSteps(initialSteps);\n const list = buildStepSequence(new Store(), steps, 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 appendOpenSteps(\n store: Store,\n steps: (Step | LatLng)[],\n pointGeneration: RequiredDrawOptions[\"pointGeneration\"],\n) {\n buildStepSequence(store, prepareSteps(steps), false, pointGeneration);\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 POINT_REMOVE: \"mdl:pointremove\",\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","import type { Emitter } from \"#app/events/emitter\";\nimport type { EngineMap } from \"#app/types/engine\";\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 type { TilesContext } from \"./tiles\";\nimport type { DrawLibreEventType } from \"./types\";\n\ntype EventName = keyof DrawLibreEventType;\ntype EventFields<T extends EventName> = Omit<DrawLibreEventType[T], \"type\" | \"target\">;\n\ntype FiringMap = { fire(type: string, properties?: object): unknown };\n\ntype QueuedEvent = {\n map: EngineMap;\n type: EventName;\n payload: DrawLibreEventType[EventName];\n emitter: Emitter<DrawLibreEventType> | null;\n};\n\nexport class FireEvents {\n private static emitter: Emitter<DrawLibreEventType> | null = null;\n private static queue: QueuedEvent[] = [];\n private static delivering = false;\n\n static bind(emitter: Emitter<DrawLibreEventType>) {\n FireEvents.emitter = emitter;\n }\n\n static unbind(emitter: Emitter<DrawLibreEventType>) {\n if (FireEvents.emitter === emitter) FireEvents.emitter = null;\n }\n\n private static dispatch<T extends EventName>(map: EngineMap, type: T, fields: EventFields<T>) {\n const payload = { ...fields, type, target: map } as unknown as DrawLibreEventType[T];\n // the receiver is fixed here, a listener of this event may remove the control before it is delivered\n FireEvents.queue.push({ map, type, payload, emitter: FireEvents.emitter });\n // an event fired from inside a listener waits, so both channels see the same order\n if (FireEvents.delivering) return;\n\n FireEvents.delivering = true;\n try {\n let next = FireEvents.queue.shift();\n while (next) {\n (next.map as unknown as FiringMap).fire(next.type, next.payload);\n next.emitter?.emit(next.type, next.payload);\n next = FireEvents.queue.shift();\n }\n } finally {\n FireEvents.queue = [];\n FireEvents.delivering = false;\n }\n }\n\n static addPoint(step: Step & { total: number }, map: EngineMap, mode: DrawingMode) {\n FireEvents.dispatch(map, 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\n static movePoint(step: { end: LatLng; id: StepId; start: LatLng; total: number }, map: EngineMap) {\n FireEvents.dispatch(map, 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\n static removePoint(step: Step & { total: number }, map: EngineMap) {\n FireEvents.dispatch(map, EVENTS.POINT_REMOVE, {\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 enterPoint(step: Step & { total: number }, map: EngineMap) {\n FireEvents.dispatch(map, 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\n static leavePoint(step: Step & { total: number }, map: EngineMap) {\n FireEvents.dispatch(map, 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\n static undo(step: Step & { total: number }, map: EngineMap, originalEvent?: Event) {\n FireEvents.dispatch(map, 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: EngineMap, originalEvent?: Event) {\n FireEvents.dispatch(map, 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: EngineMap, mode: Mode | \"break\") {\n FireEvents.dispatch(map, EVENTS.MODE_CHANGED, { mode });\n }\n\n static removeAllPoints(map: EngineMap, originalEvent?: Event) {\n FireEvents.dispatch(map, EVENTS.REMOVE_ALL, { originalEvent });\n }\n\n static onSaveClick(context: Pick<TilesContext, \"map\" | \"mode\">, steps: Step[], originalEvent?: Event) {\n const { map, mode } = context;\n\n FireEvents.dispatch(map, EVENTS.SAVE, {\n originalEvent,\n timestamp: Date.now(),\n steps,\n mode: {\n geometry: mode.getMode(),\n closedGeometry: mode.getClosedGeometry(),\n },\n });\n }\n\n static onLineBreak(map: EngineMap) {\n FireEvents.dispatch(map, EVENTS.BREAK, {});\n }\n\n static onUndoStackChange = (map: EngineMap, length?: number) => {\n FireEvents.dispatch(map, EVENTS.UNDO_STACK_CHANGED, { length: length as number });\n };\n\n static onRedoStackChange = (map: EngineMap, length?: number) => {\n FireEvents.dispatch(map, EVENTS.REDO_STACK_CHANGED, { length: length as number });\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// rendering depends 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 { EngineMap } from \"#app/types/engine\";\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: EngineMap;\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 // line is always second to last, matching the order from 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 // polygon is always last, matching the order from 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 first, matching the order from 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 type { Step } from \"#app/types\";\nimport { FireEvents } from \"#components/map/fire-events\";\nimport { renderer } from \"#components/map/renderer\";\nimport type { 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 FireEvents.removeAllPoints(map, event);\n renderer.execute();\n };\n\n public undo = (event?: Event) => {\n const { store, map } = this.ctx;\n\n timeline.undo();\n FireEvents.undo({ ...(store.tail?.val as Step), total: store.size }, map, event);\n renderer.execute();\n };\n\n public redo = (event?: Event) => {\n const { store, map } = this.ctx;\n\n timeline.redo();\n FireEvents.redo({ ...(store.tail?.val as Step), total: store.size }, map, event);\n renderer.execute();\n };\n\n public save = (event?: Event) => {\n const { store, options } = this.ctx;\n\n FireEvents.onSaveClick(this.ctx, linkedListToArray(store.head), event);\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;\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 this loop looks avoidable, find a way to remove it\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 { EngineMap } from \"#app/types/engine\";\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: EngineMap;\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 if (!this.view.hasButtons()) return;\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 DOM.setPressed(lineButton, false);\n DOM.setPressed(polygonButton, false);\n DOM.setPressed(breakButton, false);\n };\n\n onLineClick = () => {\n this.tooltip.remove();\n const { mode } = this.ctx;\n const { lineButton } = this.ctx.view;\n\n if (mode.getMode() === \"line\" && !mode.getBreak()) {\n mode.setMode(null);\n this.removeActiveClass();\n return;\n }\n\n this.removeActiveClass();\n DOM.setPressed(lineButton, true);\n mode.setMode(\"line\");\n console.log(mode.getMode());\n };\n\n onPolygonClick = () => {\n this.tooltip.remove();\n const { mode } = this.ctx;\n const { polygonButton } = this.ctx.view;\n\n if (mode.getMode() === \"polygon\" && !mode.getBreak()) {\n mode.setMode(null);\n this.removeActiveClass();\n return;\n }\n\n this.removeActiveClass();\n DOM.setPressed(polygonButton, true);\n mode.setMode(\"polygon\");\n };\n\n onBreakClick = () => {\n this.tooltip.remove();\n const { map, mode } = this.ctx;\n const { breakButton } = this.ctx.view;\n\n this.removeActiveClass();\n DOM.setPressed(breakButton, true);\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 type { DrawingModeChangeEvent, Mode } from \"#components/map/mode/types\";\nimport type { Context } from \".\";\nimport { View } from \"./view\";\n\ntype AnnouncedMode = Mode | \"break\";\n\nexport class Observer {\n private announced: AnnouncedMode | undefined = undefined;\n\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 DOM.setPressed(lineButton, false);\n DOM.setPressed(polygonButton, false);\n DOM.setPressed(breakButton, false);\n };\n\n private announce = (mode: AnnouncedMode) => {\n if (mode === this.announced) return;\n this.announced = mode;\n FireEvents.modeChanged(this.ctx.map, mode);\n };\n\n private checkActive = (button: HTMLElement) => {\n this.resetAllState();\n DOM.setPressed(button, true);\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 this.announce(data as Mode);\n\n if (data === \"line\" || data === \"polygon\") {\n this.resetAllState();\n DOM.setPressed(data === \"line\" ? lineButton : polygonButton, true);\n }\n\n if (!breakButton) return;\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 this.announce(\"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 DOM.setPressed(button, active);\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 type { EngineMap } from \"#app/types/engine\";\nimport type { 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: EngineMap;\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 { EngineMap } from \"#app/types/engine\";\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\";\nimport type { DrawingModeChangeEvent } from \"#components/map/mode/types\";\n\ninterface Context {\n map: EngineMap;\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, mode } = this.ctx;\n\n mouseEvents.addObserver(this.#mouseEventsObserver);\n mode.addObserver(this.#modeObserver);\n }\n\n remove() {\n const { mouseEvents, mode } = this.ctx;\n\n mouseEvents.removeObserver(this.#mouseEventsObserver);\n mode.removeObserver(this.#modeObserver);\n this.handleMouseLeave.cancel();\n this.handleFirstPointMouseEnter.cancel();\n }\n\n #modeObserver = (event: DrawingModeChangeEvent) => {\n const { mode } = this.ctx;\n if (mode.getBreak()) return;\n if (event.type === \"CLOSED_GEOMETRY_CHANGED\" && event.data) return;\n\n this.set(mode.getMode() && !mode.getClosedGeometry() ? CURSORS.CROSSHAIR : CURSORS.AUTO);\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 type { ListNode, Store } from \"#app/store/index\";\nimport type { LatLng, Point, RequiredDrawOptions, Step } from \"#app/types/index\";\nimport type { EngineMap } from \"#app/types/engine\";\n\ntype GeometrySource = () => { head: ListNode | null; isCircular: boolean };\n\nexport class GeometryPixels {\n #dirty = true;\n #nodes: ListNode[] = [];\n #pixels: Point[] = [];\n\n constructor(\n private readonly source: GeometrySource,\n private readonly project: (coords: LatLng) => Point,\n ) {}\n\n invalidate = () => {\n this.#dirty = true;\n };\n\n read = () => {\n if (this.#dirty) {\n const { head, isCircular } = this.source();\n this.#nodes = orderedNodes(head, isCircular);\n this.#pixels = this.#nodes.map((node) => this.project(node.val as Step));\n this.#dirty = false;\n }\n\n return { nodes: this.#nodes, pixels: this.#pixels };\n };\n}\n\nexport const orderedNodes = (head: ListNode | null, isCircular: boolean): ListNode[] => {\n const nodes: ListNode[] = [];\n const visited = new Set<ListNode>();\n let current = head;\n\n while (current && !visited.has(current)) {\n visited.add(current);\n if (current.val) {\n nodes.push(current);\n }\n current = current.next;\n }\n\n if (isCircular && head?.val && nodes.length > 1) {\n nodes.push(head);\n }\n\n return nodes;\n};\n\nexport type NearestVertex = {\n index: number;\n distance: number;\n};\n\nexport const nearestVertexPx = (vertices: Point[], cursor: Point): NearestVertex | null => {\n let best: NearestVertex | null = null;\n\n for (let index = 0; index < vertices.length; index++) {\n const vertex = vertices[index];\n if (!vertex) continue;\n\n const distance = Math.hypot(cursor.x - vertex.x, cursor.y - vertex.y);\n\n if (!best || distance < best.distance) {\n best = { index, distance };\n }\n }\n\n return best;\n};\n\nexport type NearestSegment = {\n index: number;\n projected: Point;\n t: number;\n distance: number;\n};\n\nexport const nearestSegmentPx = (vertices: Point[], cursor: Point): NearestSegment | null => {\n let best: NearestSegment | null = null;\n\n for (let index = 0; index < vertices.length - 1; index++) {\n const a = vertices[index];\n const b = vertices[index + 1];\n if (!a || !b) continue;\n\n const abx = b.x - a.x;\n const aby = b.y - a.y;\n const lengthSquared = abx * abx + aby * aby;\n const t = lengthSquared === 0 ? 0 : ((cursor.x - a.x) * abx + (cursor.y - a.y) * aby) / lengthSquared;\n const clamped = Math.min(1, Math.max(0, t));\n const projected = { x: a.x + abx * clamped, y: a.y + aby * clamped };\n const distance = Math.hypot(cursor.x - projected.x, cursor.y - projected.y);\n\n if (!best || distance < best.distance) {\n best = { index, projected, t: clamped, distance };\n }\n }\n\n return best;\n};\n\nconst DESYNC_TOLERANCE = 2;\n\nexport type SegmentHit = {\n segmentStart: ListNode;\n projected: LatLng;\n distance: number;\n vertexDistance: number;\n};\n\ntype ProjectionContext = {\n map: EngineMap;\n store: Store;\n options: RequiredDrawOptions;\n};\n\nexport class GeometryProjection {\n #pixels: GeometryPixels;\n\n constructor(private readonly ctx: ProjectionContext) {\n this.#pixels = new GeometryPixels(\n () => ({ head: ctx.store.head, isCircular: ctx.store.circular.isCircular() }),\n (coords) => ctx.map.project(coords),\n );\n\n ctx.store.addObserver(this.#pixels.invalidate);\n ctx.map.on(\"move\", this.#pixels.invalidate);\n }\n\n public remove = () => {\n this.ctx.store.removeObserver(this.#pixels.invalidate);\n this.ctx.map.off(\"move\", this.#pixels.invalidate);\n };\n\n #toGeometryCopy = (cursor: Point, reference: Step): Point => {\n const { map } = this.ctx;\n const copies = Math.round((map.unproject([cursor.x, cursor.y]).lng - reference.lng) / 360);\n if (copies === 0) return cursor;\n\n const origin = map.project(reference);\n const shifted = map.project({ lng: reference.lng + 360, lat: reference.lat });\n\n return { x: cursor.x - (shifted.x - origin.x) * copies, y: cursor.y - (shifted.y - origin.y) * copies };\n };\n\n public hit = (cursor: Point): SegmentHit | null => {\n const { nodes, pixels } = this.#pixels.read();\n const reference = nodes[0]?.val;\n if (!reference) return null;\n\n const localCursor = this.#toGeometryCopy(cursor, reference);\n const segment = nearestSegmentPx(pixels, localCursor);\n if (!segment) return null;\n if (segment.distance > this.ctx.options.interaction.lineHitRadius * DESYNC_TOLERANCE) return null;\n\n const segmentStart = nodes[segment.index];\n if (!segmentStart) return null;\n\n const vertex = nearestVertexPx(pixels, localCursor);\n const projected = this.ctx.map.unproject([segment.projected.x, segment.projected.y]);\n\n return {\n segmentStart,\n projected: { lat: projected.lat, lng: projected.lng },\n distance: segment.distance,\n vertexDistance: vertex ? vertex.distance : Infinity,\n };\n };\n\n public isNearGeometry = (cursor: Point): boolean => {\n const { nodes, pixels } = this.#pixels.read();\n const reference = nodes[0]?.val;\n if (!reference) return false;\n\n const localCursor = this.#toGeometryCopy(cursor, reference);\n const vertex = nearestVertexPx(pixels, localCursor);\n if (vertex && vertex.distance <= this.ctx.options.interaction.pointHitRadius) return true;\n\n const segment = nearestSegmentPx(pixels, localCursor);\n return segment !== null && segment.distance <= this.ctx.options.interaction.lineHitRadius;\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 DYNAMIC_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 interactionDefaults = (isCoarsePointer: boolean) =>\n isCoarsePointer ? { lineHitRadius: 12, pointHitRadius: 20 } : { lineHitRadius: 7, pointHitRadius: 14 };\n\nexport const DEFAULT_OPTIONS: RequiredDrawOptions = {\n pointGeneration: \"manual\",\n panel: {\n size: \"medium\",\n buttons: {\n undo: { visible: false },\n redo: { visible: false },\n delete: { visible: false },\n save: { visible: false, 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 dynamicLine: DYNAMIC_LINE_PAINT_BASE,\n polygon: POLYGON_PAINT_BASE,\n breakLine: BREAK_PAINT_BASE,\n },\n interaction: interactionDefaults(false),\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 removePoint: \"Remove point\",\n },\n};\n","import { ERRORS } from \"#app/store/init\";\nimport type { Initial, DrawOptions, RequiredDrawOptions, StrictLayersPaint } 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 DYNAMIC_LINE_PAINT_BASE,\n POLYGON_PAINT_BASE,\n BREAK_PAINT_BASE,\n AUXILIARY_POINT_PAINT_BASE,\n} from \"../utils/geo_constants\";\nimport { DEFAULT_OPTIONS, interactionDefaults } 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 checkIfStepsAreEmpty(steps: Initial[\"steps\"]) {\n if (!steps.length) {\n throw new Error(ERRORS[\"EMPTY_INITIAL_STATE\"]);\n }\n}\n\nfunction checkIfEnoughPointsToClose(steps: Initial[\"steps\"], closeGeometry: Initial[\"closeGeometry\"]) {\n const minPointsToCloseGeometry = 3;\n const differentPoints = new Set(steps.map((step) => `${step.lng},${step.lat}`)).size;\n if (closeGeometry && differentPoints < minPointsToCloseGeometry) {\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 checkIfStepsAreEmpty(steps);\n // checks ids exist when id generation is off\n checkIfMissingIds(steps, generateId);\n // closing the geometry needs at least three points\n checkIfEnoughPointsToClose(steps, closeGeometry);\n // a polygon must have closeGeometry set to true\n checkIfPolygonIsClosed(options);\n}\n\nexport function initOptions(options?: DrawOptions): RequiredDrawOptions {\n const interaction = interactionDefaults(matchesMedia(\"(pointer: coarse)\"));\n const canHover = !matchesMedia(\"(hover: none)\");\n\n if (!options) {\n return { ...DEFAULT_OPTIONS, interaction, dynamicLine: DEFAULT_OPTIONS.dynamicLine && canHover };\n }\n\n return {\n pointGeneration: options.pointGeneration ?? DEFAULT_OPTIONS.pointGeneration,\n panel: generatePanelOptions(options),\n modes: generateModeOptions(options),\n layersPaint: generateLayersOptions(options),\n interaction,\n initial: options.initial || DEFAULT_OPTIONS[\"initial\"],\n locale: generateLocaleOptions(options),\n dynamicLine: (options.dynamicLine ?? DEFAULT_OPTIONS.dynamicLine) && canHover,\n } as RequiredDrawOptions;\n}\nconst matchesMedia = (query: string) =>\n typeof window !== \"undefined\" && typeof window.matchMedia === \"function\" ? window.matchMedia(query).matches : false;\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 const paint = options.layersPaint as StrictLayersPaint | undefined;\n const line = {\n \"line-width\": paint?.line?.[\"line-width\"] || LINE_PAINT_BASE[\"line-width\"],\n \"line-color\": paint?.line?.[\"line-color\"] || LINE_PAINT_BASE[\"line-color\"],\n \"line-opacity\": paint?.line?.[\"line-opacity\"] || LINE_PAINT_BASE[\"line-opacity\"],\n ...paint?.line,\n };\n\n return {\n onLinePoint: {\n \"circle-radius\": paint?.onLinePoint?.[\"circle-radius\"] || ON_LINE_POINT_PAINT_BASE[\"circle-radius\"],\n \"circle-color\": paint?.onLinePoint?.[\"circle-color\"] || ON_LINE_POINT_PAINT_BASE[\"circle-color\"],\n \"circle-stroke-color\":\n paint?.onLinePoint?.[\"circle-stroke-color\"] || ON_LINE_POINT_PAINT_BASE[\"circle-stroke-color\"],\n \"circle-stroke-width\":\n paint?.onLinePoint?.[\"circle-stroke-width\"] || ON_LINE_POINT_PAINT_BASE[\"circle-stroke-width\"],\n ...paint?.onLinePoint,\n },\n firstPoint: {\n \"circle-radius\": paint?.firstPoint?.[\"circle-radius\"] || FIRST_POINT_PAINT_BASE[\"circle-radius\"],\n \"circle-color\": paint?.firstPoint?.[\"circle-color\"] || FIRST_POINT_PAINT_BASE[\"circle-color\"],\n \"circle-stroke-color\":\n paint?.firstPoint?.[\"circle-stroke-color\"] || FIRST_POINT_PAINT_BASE[\"circle-stroke-color\"],\n \"circle-stroke-width\":\n paint?.firstPoint?.[\"circle-stroke-width\"] || FIRST_POINT_PAINT_BASE[\"circle-stroke-width\"],\n ...paint?.firstPoint,\n },\n points: {\n \"circle-radius\": paint?.points?.[\"circle-radius\"] || POINTS_PAINT_BASE[\"circle-radius\"],\n \"circle-color\": paint?.points?.[\"circle-color\"] || POINTS_PAINT_BASE[\"circle-color\"],\n \"circle-stroke-color\": paint?.points?.[\"circle-stroke-color\"] || POINTS_PAINT_BASE[\"circle-stroke-color\"],\n \"circle-stroke-width\": paint?.points?.[\"circle-stroke-width\"] || POINTS_PAINT_BASE[\"circle-stroke-width\"],\n ...paint?.points,\n },\n auxiliaryPoint: {\n \"circle-radius\": paint?.auxiliaryPoint?.[\"circle-radius\"] || AUXILIARY_POINT_PAINT_BASE[\"circle-radius\"],\n \"circle-color\": paint?.auxiliaryPoint?.[\"circle-color\"] || AUXILIARY_POINT_PAINT_BASE[\"circle-color\"],\n \"circle-stroke-color\":\n paint?.auxiliaryPoint?.[\"circle-stroke-color\"] || AUXILIARY_POINT_PAINT_BASE[\"circle-stroke-color\"],\n \"circle-stroke-width\":\n paint?.auxiliaryPoint?.[\"circle-stroke-width\"] || AUXILIARY_POINT_PAINT_BASE[\"circle-stroke-width\"],\n ...paint?.auxiliaryPoint,\n },\n line,\n dynamicLine: {\n ...line,\n \"line-dasharray\": DYNAMIC_LINE_PAINT_BASE[\"line-dasharray\"],\n ...paint?.dynamicLine,\n },\n polygon: {\n \"fill-color\": paint?.polygon?.[\"fill-color\"] || POLYGON_PAINT_BASE[\"fill-color\"],\n \"fill-opacity\": paint?.polygon?.[\"fill-opacity\"] || POLYGON_PAINT_BASE[\"fill-opacity\"],\n ...paint?.polygon,\n },\n breakLine: {\n \"line-width\": paint?.breakLine?.[\"line-width\"] || BREAK_PAINT_BASE[\"line-width\"],\n \"line-color\": paint?.breakLine?.[\"line-color\"] || BREAK_PAINT_BASE[\"line-color\"],\n \"line-dasharray\": paint?.breakLine?.[\"line-dasharray\"] || BREAK_PAINT_BASE[\"line-dasharray\"],\n ...paint?.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 removePoint: options.locale?.removePoint ?? DEFAULT_OPTIONS.locale.removePoint,\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 head and tail after the break\n this.snapshot.newHead = this.store.head;\n this.snapshot.newTail = this.store.tail;\n\n // notifies the panel\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 // restores the node connections that were undone when the geometry broke\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 // notifies the panel\n this.store.pingConsumers();\n };\n}\n","import type { GeoJSONSource, MapLayerMouseEvent } from \"maplibre-gl\";\n\nimport type { ListNode } from \"#app/store/index\";\nimport { ELAYERS, ESOURCES } from \"#app/utils/geo_constants\";\nimport { coalesceToFrame } from \"#app/utils/helpers\";\nimport { timeline } from \"#app/history\";\n\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\nexport class LineBreakEvents {\n private current: ListNode | null;\n private renderBreakSegment = coalesceToFrame((event: MapLayerMouseEvent) => {\n this.onLineEnterBreak(event);\n });\n\n constructor(private readonly ctx: TilesContext) {\n this.current = null;\n }\n\n public initBreakEvents = () => {\n this.ctx.map.on(\"click\", ELAYERS.LineLayer, this.geometryBreakOnClick);\n this.ctx.map.on(\"mouseenter\", ELAYERS.LineLayer, this.renderBreakSegment);\n this.ctx.map.on(\"mousemove\", ELAYERS.LineLayer, this.renderBreakSegment);\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.renderBreakSegment);\n this.ctx.map.off(\"mousemove\", ELAYERS.LineLayer, this.renderBreakSegment);\n this.ctx.map.off(\"mouseleave\", ELAYERS.LineLayer, this.onLineLeave);\n this.renderBreakSegment.cancel();\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 } = this.ctx;\n\n const line = this.ctx.projection.hit(event.point)?.segmentStart ?? null;\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 this.renderBreakSegment.cancel();\n this.hideBreakLine();\n };\n}\n","import type { MapLayerMouseEvent, MapMouseEvent, MapTouchEvent } from \"maplibre-gl\";\nimport type { Uuid } from \"#app/types/index\";\nimport type { EngineMap } from \"#app/types/engine\";\nimport type { Store } from \"#app/store/index\";\nimport { ELAYERS } from \"#app/utils/geo_constants\";\nimport { nearestVertexPx } from \"./line/projection\";\n\nexport const POINT_HIT_LAYERS = [ELAYERS.PointsHitLayer, ELAYERS.FirstPointHitLayer, ELAYERS.AuxiliaryPointHitLayer];\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: EngineMap, point: MapMouseEvent[\"point\"]) => {\n const id = queryPoint(map, point)?.properties.id;\n return id;\n};\n\nexport const queryPoint = (map: EngineMap, point: MapMouseEvent[\"point\"]) => {\n const features = map.queryRenderedFeatures(point, {\n layers: POINT_HIT_LAYERS,\n });\n if (features.length < 2) return features[0];\n\n // features are ordered by layer, not by distance, and keep coordinates from the original world copy\n const cursorLng = map.unproject(point).lng;\n const pixels = features.map((feature) => {\n const [lng, lat] = (feature.geometry as GeoJSON.Point).coordinates as [number, number];\n return map.project({ lng: lng + 360 * Math.round((cursorLng - lng) / 360), lat });\n });\n\n const nearest = nearestVertexPx(pixels, point);\n return nearest ? features[nearest.index] : undefined;\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 { 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 { GeoJSONSource, MapLayerMouseEvent } from \"maplibre-gl\";\nimport type { Step } from \"#app/types/index\";\nimport type { EngineMap } from \"#app/types/engine\";\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, POINT_HIT_LAYERS } from \"../utils\";\nimport { TilesContext } from \"../tiles\";\n\nexport const insertStepIfOnLine = (\n event: MapLayerMouseEvent,\n context: Pick<TilesContext, \"store\" | \"options\" | \"projection\">,\n): Step | null => {\n const { store, options, projection } = context;\n const hit = projection.hit(event.point);\n\n if (!hit || hit.vertexDistance < options.interaction.pointHitRadius) {\n return null;\n }\n\n const step = { ...hit.projected, isAuxiliary: false, id: uuidv4() };\n timeline.commit(new InsertPointCommand(store, step, hit.segmentStart));\n return step;\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, POINT_HIT_LAYERS);\n};\n\nexport const hideDynamicLine = (map: EngineMap) => {\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 { GeoJSONSource, MapLayerMouseEvent, PointLike } from \"maplibre-gl\";\n\nimport { DOM } from \"#app/dom\";\nimport type { DrawLibreSubscription } from \"#app/events/emitter\";\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 { coalesceToFrame, debounce, type Debounced } from \"#app/utils/helpers\";\n\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\nexport class DynamicLineEvents {\n private visible: boolean;\n private firstPoint: LatLng | null = null;\n private secondPoint: LatLng | null = null;\n private pointer: LatLng | null = null;\n private lineFeature: any;\n private subscriptions: DrawLibreSubscription[] = [];\n private onStoreEventsDebounced: Debounced<(event: StoreChangeEvent) => void>;\n private renderFreeEnd = coalesceToFrame((event: MapLayerMouseEvent) => {\n this.renderLineOnMouseMove(event.lngLat);\n });\n\n constructor(private readonly ctx: TilesContext) {\n this.visible = true;\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.onStoreEventsDebounced.cancel();\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 // the last point click always hides the dynamic line\n if (event.type === \"lastPointMouseClick\" && event.data) {\n this.hide();\n this.visible = false;\n }\n // avoids calling show right after the last point click while just hovering a point or line\n // TODO rewrite this condition\n if (!this.visible) return;\n\n // hides the dynamic line on these events, reason unclear\n const HIDE_EVENTS = [\"pointMouseEnter\", \"lineMouseEnter\", \"pointMouseDown\"] as MapMouseEvent[];\n if (HIDE_EVENTS.includes(event.type) && event.data) {\n this.hide();\n }\n\n // shows the dynamic line back when it was hidden by the block above\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 = this.freeEnd();\n this.show();\n this.visible = true;\n }\n } else if (event.type === \"STORE_MUTATED\") {\n if (this.ctx.mouseEvents.pointMouseDown) return;\n if (store.size === 0) return;\n this.firstPoint = store.tail?.val as LatLng;\n if (this.ctx.mouseEvents.pointMouseEnter) return;\n this.secondPoint = this.freeEnd();\n this.show();\n this.visible = true;\n }\n };\n\n private initDynamicEvents = () => {\n const { map, events } = this.ctx;\n map.on(\"click\", this.onMapClick);\n map.on(\"mousemove\", this.renderFreeEnd);\n this.subscriptions = [\n events.on(\"mdl:removeall\", this.hide),\n events.on(\"mdl:undo\", this.onUndoRedoClick),\n events.on(\"mdl:redo\", this.onUndoRedoClick),\n events.on(\"mdl:pointremove\", this.onPointRemove),\n ];\n DOM.addEventListener(map.getContainer(), \"pointermove\", this.onPointerMove);\n };\n\n public removeEvents = () => {\n const { map } = this.ctx;\n\n map.off(\"click\", this.onMapClick);\n map.off(\"mousemove\", this.renderFreeEnd);\n this.renderFreeEnd.cancel();\n for (const subscription of this.subscriptions) subscription.unsubscribe();\n this.subscriptions = [];\n DOM.removeEventListener(map.getContainer(), \"pointermove\", this.onPointerMove);\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.renderFreeEnd);\n this.renderFreeEnd.cancel();\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.renderFreeEnd);\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 onPointerMove = (event: Event) => {\n const { map } = this.ctx;\n const { clientX, clientY } = event as PointerEvent;\n const box = map.getContainer().getBoundingClientRect();\n const latLng = map.unproject([clientX - box.left, clientY - box.top] as PointLike);\n\n this.pointer = { lng: latLng.lng, lat: latLng.lat };\n };\n\n private freeEnd = (): LatLng => {\n const { store } = this.ctx;\n return this.pointer ?? (store.tail?.val as LatLng);\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 = () => {\n const { store } = this.ctx;\n\n if (!store.circular.isCircular()) {\n this.firstPoint = store.tail?.val as LatLng;\n this.secondPoint = this.freeEnd();\n this.show();\n }\n\n if (store.size === 0) {\n this.hide();\n }\n };\n\n private onPointRemove = () => {\n const { store } = this.ctx;\n if (!store.circular.isCircular()) {\n this.firstPoint = store.tail?.val as LatLng;\n this.secondPoint = this.freeEnd();\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 { coalesceToFrame } from \"#app/utils/helpers\";\n\nimport { FireEvents } from \"../fire-events\";\nimport { PointVisibility } from \"../points/helpers\";\nimport { checkIfPointClicked, insertStepIfOnLine, updateUIAfterInsert } from \"./utils\";\nimport { TilesContext } from \"#components/map/tiles\";\nimport { DrawingModeChangeEvent } from \"../mode/types\";\n\nexport class TransparentLineEvents {\n private eventsInited = false;\n\n constructor(private readonly ctx: TilesContext) {\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 if (this.eventsInited) return;\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.renderGhostPoint.cancel();\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, this.ctx);\n if (step) {\n updateUIAfterInsert(event, this.ctx);\n FireEvents.addPoint({ ...step, total: store.size }, map, mode);\n }\n };\n\n private hitClearOfVertices = (event: MapLayerMouseEvent) => {\n const hit = this.ctx.projection.hit(event.point);\n if (!hit || hit.vertexDistance < this.ctx.options.interaction.pointHitRadius) return null;\n\n return hit;\n };\n\n private processMouseMove = (event: MapLayerMouseEvent) => {\n const hit = this.hitClearOfVertices(event);\n\n if (!hit) {\n PointVisibility.setSinglePointHidden(event);\n return;\n }\n\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: [hit.projected.lng, hit.projected.lat],\n },\n properties: {},\n });\n }\n }\n };\n\n private onLineMove = (event: MapLayerMouseEvent) => {\n if (this.ctx.mouseEvents.pointMouseDown || this.ctx.mouseEvents.pointMouseEnter) return;\n this.renderGhostPoint(event);\n };\n\n private renderGhostPoint = coalesceToFrame((event: MapLayerMouseEvent) => {\n this.processMouseMove(event);\n });\n\n private onLineEnter = (event: MapLayerMouseEvent) => {\n if (this.ctx.mouseEvents.pointMouseDown || this.ctx.mouseEvents.pointMouseEnter) return;\n if (!this.hitClearOfVertices(event)) return;\n\n this.ctx.mouseEvents.lineMouseEnter = true;\n PointVisibility.setSinglePointVisible(event);\n };\n\n private onLineLeave = (event: MapLayerMouseEvent) => {\n this.renderGhostPoint.cancel();\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 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 (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 if (data) {\n this.transparent?.initEvents();\n }\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 { CircleLayerSpecification } from \"maplibre-gl\";\n\nimport type { EngineMap } from \"#app/types/engine\";\n\nimport { ELAYERS, FIRST_POINT_COLOR, FIRST_POINT_RADIUS } from \"#app/utils/geo_constants\";\n\ntype FirstPointPaint = CircleLayerSpecification[\"paint\"];\n\nconst firstPointCircleRadius = (map: EngineMap, paint: FirstPointPaint) => {\n const radius = paint?.[\"circle-radius\"];\n map.setPaintProperty(\n ELAYERS.FirstPointLayer,\n \"circle-radius\",\n typeof radius === \"number\" ? radius + 1 : radius ?? FIRST_POINT_RADIUS.large,\n );\n map.setPaintProperty(ELAYERS.FirstPointLayer, \"circle-stroke-color\", FIRST_POINT_COLOR.large);\n};\n\nconst defaultPointCircleRadius = (map: EngineMap, paint: FirstPointPaint) => {\n map.setPaintProperty(\n ELAYERS.FirstPointLayer,\n \"circle-radius\",\n paint?.[\"circle-radius\"] ?? FIRST_POINT_RADIUS.default,\n );\n map.setPaintProperty(\n ELAYERS.FirstPointLayer,\n \"circle-stroke-color\",\n paint?.[\"circle-stroke-color\"] ?? FIRST_POINT_COLOR.default,\n );\n};\n\nexport const togglePointCircleRadius = (\n map: EngineMap,\n type: keyof typeof FIRST_POINT_RADIUS,\n paint: FirstPointPaint,\n) => {\n if (type === \"large\") {\n firstPointCircleRadius(map, paint);\n } else {\n defaultPointCircleRadius(map, paint);\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 // aux point becomes the new tail before closing\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 PointVisibility.setFirstPointVisible(map);\n }\n }\n\n private initBaseEvents = () => {\n const { map } = this.ctx;\n\n map.on(\"mouseenter\", ELAYERS.FirstPointHitLayer, this.baseEvents.onPointMouseEnter);\n map.on(\"mouseleave\", ELAYERS.FirstPointHitLayer, this.baseEvents.onPointMouseLeave);\n map.on(\"mousedown\", ELAYERS.FirstPointHitLayer, this.baseEvents.onPointMouseDown);\n map.on(\"touchstart\", ELAYERS.FirstPointHitLayer, this.baseEvents.onPointMouseDown);\n };\n\n private initEvents = () => {\n const { map } = this.ctx;\n\n map.on(\"click\", ELAYERS.FirstPointHitLayer, this.onFirstPointClick);\n map.on(\"mouseenter\", ELAYERS.FirstPointHitLayer, this.onFirstPointMouseEnter);\n map.on(\"mouseleave\", ELAYERS.FirstPointHitLayer, this.onFirstPointMouseLeave);\n map.on(\"mousedown\", ELAYERS.FirstPointHitLayer, this.onFirstPointMouseDown);\n map.on(\"mouseup\", this.onFirstPointMouseUp);\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.FirstPointHitLayer, this.baseEvents.onPointMouseEnter);\n map.off(\"mouseleave\", ELAYERS.FirstPointHitLayer, this.baseEvents.onPointMouseLeave);\n map.off(\"mousedown\", ELAYERS.FirstPointHitLayer, this.baseEvents.onPointMouseDown);\n map.off(\"touchstart\", ELAYERS.FirstPointHitLayer, this.baseEvents.onPointMouseDown);\n };\n\n private removeEvents() {\n const { map } = this.ctx;\n\n map.off(\"click\", ELAYERS.FirstPointHitLayer, this.onFirstPointClick);\n map.off(\"mouseenter\", ELAYERS.FirstPointHitLayer, this.onFirstPointMouseEnter);\n map.off(\"mouseleave\", ELAYERS.FirstPointHitLayer, this.onFirstPointMouseLeave);\n map.off(\"mousedown\", ELAYERS.FirstPointHitLayer, this.onFirstPointMouseDown);\n map.off(\"mouseup\", 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 const paint = this.ctx.options.layersPaint.firstPoint;\n if (store.circular.canClose()) {\n togglePointCircleRadius(map, \"large\", paint);\n } else {\n togglePointCircleRadius(map, \"default\", paint);\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 { Point } from \"#app/types/index\";\nimport type { EngineMap } from \"#app/types/engine\";\nimport { ELAYERS } from \"#app/utils/geo_constants\";\n\n// maplibre still fires a click when release lands within 3px of press, a wobble that small should not cost two tile reparses\nconst CLICK_TOLERANCE_PX = 3;\n\nconst LAYERS = [\n ELAYERS.LineLayerTransparent,\n ELAYERS.PointsHitLayer,\n ELAYERS.FirstPointHitLayer,\n ELAYERS.AuxiliaryPointHitLayer,\n];\n\ntype Visibility = \"visible\" | \"none\";\n\nexport class DragLayers {\n private pressPoint: Point | null = null;\n private saved: Map<string, Visibility> | null = null;\n\n constructor(private readonly map: EngineMap) {}\n\n press = (point: Point) => {\n this.pressPoint = { x: point.x, y: point.y };\n };\n\n move = (point: Point) => {\n if (!this.pressPoint || this.saved) return;\n if (Math.hypot(point.x - this.pressPoint.x, point.y - this.pressPoint.y) <= CLICK_TOLERANCE_PX) return;\n\n this.hide();\n };\n\n release = () => {\n this.pressPoint = null;\n if (!this.saved) return;\n\n for (const [id, visibility] of this.saved) {\n if (this.map.getLayer(id)) {\n this.map.setLayoutProperty(id, \"visibility\", visibility);\n }\n }\n this.saved = null;\n };\n\n private hide() {\n this.saved = new Map();\n\n for (const id of LAYERS) {\n if (!this.map.getLayer(id)) continue;\n\n const current = (this.map.getLayoutProperty(id, \"visibility\") as Visibility | undefined) ?? \"visible\";\n this.saved.set(id, current);\n this.map.setLayoutProperty(id, \"visibility\", \"none\");\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 type { MapLayerMouseEvent, MapTouchEvent } from \"maplibre-gl\";\n\nimport { ELAYERS } from \"#app/utils/geo_constants\";\nimport { timeline } from \"#app/history\";\nimport { AuxToPrimaryCommand } from \"./commands/aux-to-primary\";\n\nimport type { PrimaryPointEvents } from \".\";\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 ) {\n this.initEvents();\n this.initConsumers();\n }\n\n private initBaseEvents = () => {\n const { map } = this.ctx;\n\n map.on(\"mouseenter\", ELAYERS.AuxiliaryPointHitLayer, this.baseEvents.onPointMouseEnter);\n map.on(\"mouseleave\", ELAYERS.AuxiliaryPointHitLayer, this.baseEvents.onPointMouseLeave);\n map.on(\"mousedown\", ELAYERS.AuxiliaryPointHitLayer, this.baseEvents.onPointMouseDown);\n map.on(\"touchstart\", ELAYERS.AuxiliaryPointHitLayer, this.baseEvents.onPointMouseDown);\n };\n\n private removeBaseEvents = () => {\n const { map } = this.ctx;\n\n map.off(\"mouseenter\", ELAYERS.AuxiliaryPointHitLayer, this.baseEvents.onPointMouseEnter);\n map.off(\"mouseleave\", ELAYERS.AuxiliaryPointHitLayer, this.baseEvents.onPointMouseLeave);\n map.off(\"mousedown\", ELAYERS.AuxiliaryPointHitLayer, this.baseEvents.onPointMouseDown);\n map.off(\"touchstart\", ELAYERS.AuxiliaryPointHitLayer, 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.AuxiliaryPointHitLayer, this.onMouseDown);\n map.on(\"touchstart\", ELAYERS.AuxiliaryPointHitLayer, this.onMouseDown);\n this.initBaseEvents();\n this.eventsInited = true;\n }\n\n public removeEvents() {\n const { map } = this.ctx;\n map.off(\"mousedown\", ELAYERS.AuxiliaryPointHitLayer, this.onMouseDown);\n map.off(\"touchstart\", ELAYERS.AuxiliaryPointHitLayer, 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","import type { ListNode } from \"#app/store/index\";\nimport type { LatLng, Step } from \"#app/types/index\";\nimport type { 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 this.moved = false;\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 // adds an aux point when pointGeneration is auto\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 // removing a primary point replaces it and its aux points with a new aux point\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 // an aux point is inserted between the two remaining aux points only once size reaches five in a circular list or three in a linear one\n const meetsAuxInsertionThreshold = store.circular.isCircular() ? store.size >= 5 : store.size >= 3;\n if (primaryBefore?.val && primaryAfter?.val && meetsAuxInsertionThreshold) {\n // reuses the aux point created earlier when this is an undo or redo\n if (this.snapshot.newAux) {\n const closesOnTail = store.tail === primaryBefore && store.head === primaryBefore.next;\n this.restoreNodeAfter(primaryBefore, this.snapshot.newAux);\n if (closesOnTail) store.tail = 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 if (this.snapshot?.newAux) {\n this.restoreNodeAfter(store.head as ListNode, this.snapshot.newAux);\n } else {\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\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 if (!this.snapshot) {\n this.snapshot = this.makeSnapshot(clickedNode);\n }\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.removePoint({ ...(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 } else {\n store.tail = 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.removePoint({ ...(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 } else {\n this.ctx.store.tail = 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 { EngineMap } from \"#app/types/engine\";\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: EngineMap;\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 // updates the selected node lat and lng from the store on mouse up\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 timeline.commit(new RemovePointCommand({ store, options, mode, map, nodeId: id }));\n }\n}\n","import { ListNode, Store } from \"#app/store\";\nimport type { StoreChangeEventKeys } from \"#app/store/types\";\nimport type { LatLng } from \"#app/types\";\nimport type { EngineMap } from \"#app/types/engine\";\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: EngineMap,\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 // true only when pointGeneration is 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 { DOM } from \"#app/dom\";\n\nconst BUTTON_CLASS = \"mdl-point-remove\";\nconst HIDDEN_CLASS = \"hidden\";\n\nexport type Side = \"left\" | \"right\";\n\nexport class RemoveButtonView {\n private readonly button: HTMLButtonElement;\n\n constructor(container: HTMLElement, label: string) {\n this.button = DOM.create(\"button\", `${BUTTON_CLASS} ${HIDDEN_CLASS}`, container);\n this.button.type = \"button\";\n this.button.setAttribute(\"data-type\", \"remove-point\");\n this.button.setAttribute(\"aria-label\", label);\n }\n\n public getElement = (): HTMLButtonElement => this.button;\n\n public getWidth = (): number => this.button.offsetWidth;\n\n public setPosition = (x: number, y: number, side: Side) => {\n const selfShift = side === \"right\" ? \"0, -50%\" : \"-100%, -50%\";\n this.button.style.transform = `translate(${x}px, ${y}px) translate(${selfShift})`;\n this.button.dataset.side = side;\n };\n\n public show = () => DOM.removeClassName(this.button, HIDDEN_CLASS);\n\n public hide = () => DOM.addClassName(this.button, HIDDEN_CLASS);\n\n public destroy = () => DOM.remove(this.button);\n}\n","import { DOM } from \"#app/dom\";\nimport type { RequiredDrawOptions, Step, StepId } from \"#app/types/index\";\nimport type { EngineMap } from \"#app/types/engine\";\n\nimport { RemoveButtonView } from \"./view\";\nimport \"./remove-button.css\";\n\nconst OFFSET_X = 12;\n\nexport interface RemoveButtonContext {\n map: EngineMap;\n options: RequiredDrawOptions;\n onRemove: (id: StepId) => void;\n}\n\nexport class RemoveButton {\n private readonly view: RemoveButtonView;\n private anchor: Step | null = null;\n private rafId = 0;\n private listenersActive = false;\n\n constructor(private readonly ctx: RemoveButtonContext) {\n this.view = new RemoveButtonView(ctx.map.getContainer(), ctx.options.locale.removePoint);\n\n const element = this.view.getElement();\n DOM.addEventListener(element, \"mouseleave\", this.onButtonMouseLeave);\n DOM.addEventListener(element, \"click\", this.onButtonClick);\n }\n\n public show = (step: Step) => {\n this.anchor = step;\n this.enableListeners();\n this.updatePosition();\n this.view.show();\n };\n\n public hide = () => {\n this.cancelFrame();\n this.disableListeners();\n this.anchor = null;\n this.view.hide();\n };\n\n public destroy = () => {\n this.hide();\n\n const element = this.view.getElement();\n DOM.removeEventListener(element, \"mouseleave\", this.onButtonMouseLeave);\n DOM.removeEventListener(element, \"click\", this.onButtonClick);\n\n this.view.destroy();\n };\n\n private cancelFrame = () => {\n if (!this.rafId) return;\n window.cancelAnimationFrame(this.rafId);\n this.rafId = 0;\n };\n\n private enableListeners = () => {\n if (this.listenersActive) return;\n const { map } = this.ctx;\n\n map.on(\"move\", this.onMapMove);\n map.on(\"zoom\", this.onMapMove);\n DOM.addEventListener(map.getCanvasContainer(), \"pointerdown\", this.hide);\n this.listenersActive = true;\n };\n\n private disableListeners = () => {\n if (!this.listenersActive) return;\n const { map } = this.ctx;\n\n map.off(\"move\", this.onMapMove);\n map.off(\"zoom\", this.onMapMove);\n DOM.removeEventListener(map.getCanvasContainer(), \"pointerdown\", this.hide);\n this.listenersActive = false;\n };\n\n private onMapMove = () => {\n if (this.rafId) return;\n this.rafId = window.requestAnimationFrame(() => {\n this.rafId = 0;\n this.updatePosition();\n });\n };\n\n private updatePosition = () => {\n if (!this.anchor) return;\n const { map } = this.ctx;\n\n const point = map.project({ lng: this.anchor.lng, lat: this.anchor.lat });\n const containerWidth = map.getContainer().clientWidth;\n const overflowsRight = point.x + OFFSET_X + this.view.getWidth() > containerWidth;\n\n if (overflowsRight) {\n this.view.setPosition(point.x - OFFSET_X, point.y, \"left\");\n } else {\n this.view.setPosition(point.x + OFFSET_X, point.y, \"right\");\n }\n };\n\n private onButtonMouseLeave = () => this.hide();\n\n private onButtonClick = (event: Event) => {\n event.stopPropagation();\n const anchor = this.anchor;\n\n this.hide();\n if (anchor) this.ctx.onRemove(anchor.id);\n };\n}\n","import type { LatLng, Step, StepId } from \"#app/types/index\";\nimport type { MapLayerMouseEvent, MapTouchEvent } from \"maplibre-gl\";\n\nimport { coalesceToFrame } from \"#app/utils/helpers\";\nimport { ELAYERS, ESOURCES } from \"#app/utils/geo_constants\";\nimport { timeline } from \"#app/history\";\nimport type { StoreChangeEvent } from \"#app/store/types\";\nimport type { DrawLibreSubscription } from \"#app/events/emitter\";\n\nimport { FireEvents } from \"../fire-events\";\nimport { PointVisibility } from \"./helpers\";\nimport { FirstPoint } from \"./first-point\";\nimport { DragLayers } from \"../tiles/drag-layers\";\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, getGeometryIndex, isRightClick, POINT_HIT_LAYERS } from \"../utils\";\nimport type { TilesContext } from \"../tiles\";\nimport { DOM } from \"#app/dom\";\nimport { RemoveButton } from \"#components/remove-button\";\n\nexport interface PrimaryPointEvents {\n onPointMouseEnter: (event: MapLayerMouseEvent) => void;\n onPointMouseLeave: (event: MapLayerMouseEvent) => void;\n onPointMouseDown: (event: MapLayerMouseEvent | MapTouchEvent) => void;\n onMapMouseMove: (event: MapLayerMouseEvent) => void;\n}\n// TODO clean up this class, it got messy\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 private removeButton: RemoveButton;\n private dragLayers: DragLayers;\n private pressedStep: Step | null = null;\n private pressActive = false;\n private suppressedStepId: StepId | null = null;\n private highlightedStepId: StepId | null = null;\n private pointAdded: DrawLibreSubscription | null = null;\n\n constructor(private readonly ctx: TilesContext) {\n this.pointState = new PointState();\n this.topologyManager = new PointTopologyManager(ctx, this.pointState);\n this.dragLayers = new DragLayers(this.ctx.map);\n\n this.events = {\n onPointMouseEnter: this.onPointMouseEnter,\n onPointMouseLeave: this.onPointMouseLeave,\n onPointMouseDown: this.onPointMouseDown,\n onMapMouseMove: this.onMapMouseMove,\n };\n this.firstPoint = new FirstPoint(this.ctx, this.events);\n this.auxPoints = new AuxPoints(this.ctx, this.events);\n this.removeButton = new RemoveButton({\n map: this.ctx.map,\n options: this.ctx.options,\n onRemove: this.onPointRemove,\n });\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 map.on(\"mousemove\", this.onPointerHover);\n DOM.addEventListener(map.getContainer(), \"mouseleave\", this.onPointerLeaveMap);\n this.pointAdded = this.ctx.events.on(\"mdl:add\", this.onPointAdded);\n\n map.on(\"mouseenter\", ELAYERS.PointsHitLayer, this.onPointMouseEnter);\n map.on(\"mouseleave\", ELAYERS.PointsHitLayer, this.onPointMouseLeave);\n map.on(\"mousedown\", ELAYERS.PointsHitLayer, this.onPointMouseDown);\n map.on(\"click\", ELAYERS.PointsHitLayer, this.onPointClick);\n map.on(\"touchstart\", ELAYERS.PointsHitLayer, 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 this.highlight(null);\n map.off(\"click\", this.onMapClick);\n map.off(\"dblclick\", this.onMapDblClick);\n map.off(\"mousemove\", this.onPointerHover);\n DOM.removeEventListener(map.getContainer(), \"mouseleave\", this.onPointerLeaveMap);\n map.off(\"mousemove\", this.onMapMouseMove);\n this.renderDraggedPoint.cancel();\n this.onPointerHover.cancel();\n this.dragLayers.release();\n this.pointAdded?.unsubscribe();\n this.pointAdded = null;\n\n map.off(\"mouseenter\", ELAYERS.PointsHitLayer, this.onPointMouseEnter);\n map.off(\"mouseleave\", ELAYERS.PointsHitLayer, this.onPointMouseLeave);\n map.off(\"mousedown\", ELAYERS.PointsHitLayer, this.onPointMouseDown);\n map.off(\"click\", ELAYERS.PointsHitLayer, this.onPointClick);\n map.off(\"touchstart\", ELAYERS.PointsHitLayer, this.onPointMouseDown);\n this.eventsInited = false;\n };\n\n private unbindPress = () => {\n const { map } = this.ctx;\n map.off(\"mousemove\", this.onMapMouseMove);\n map.off(\"touchmove\", this.onMapMouseMove);\n map.off(\"mouseup\", this.onPointMouseUp);\n map.off(\"touchend\", this.onPointMouseUp);\n };\n\n private cancelPress = () => {\n this.unbindPress();\n this.pressActive = false;\n this.pressedStep = null;\n this.pointState.reset();\n };\n\n public remove = () => {\n this.cancelPress();\n this.removeEvents();\n this.firstPoint?.remove();\n this.auxPoints?.removeEvents();\n this.removeConsumers();\n this.removeButton.destroy();\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 = (id: StepId) => {\n const { store } = this.ctx;\n\n if (!store.findStepById(id)) return;\n\n this.topologyManager.removePoint(id);\n renderer.execute();\n };\n\n private onOwnGeometryClick = (event: MapLayerMouseEvent) => {\n if (isFeatureTriggered(event, [...POINT_HIT_LAYERS, ELAYERS.LineLayerTransparent, ELAYERS.LineLayerBreak])) {\n return true;\n }\n // hit layers stay unqueryable during a drag until tiles reparse, a short out and back drag can land a click in that gap\n return this.ctx.projection.isNearGeometry(event.point);\n };\n\n private onMapClick = (event: MapLayerMouseEvent) => {\n const { mode, mouseEvents, map, store } = this.ctx;\n\n if (mode.getClosedGeometry()) return;\n if (this.onOwnGeometryClick(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 onPointAdded = (event: { id: StepId }) => {\n // a queued hover before this click would query tiles missing the new point and lift the suppression\n this.onPointerHover.cancel();\n this.suppressedStepId = event.id;\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 = (event: MapLayerMouseEvent | MapTouchEvent) => {\n if (!this.ctx.mouseEvents.pointMouseDown) return;\n\n const moveEvent = event as MapLayerMouseEvent;\n this.pointState.setLastEvent(moveEvent);\n if (!this.pointState.getSelectedNode()) return;\n\n this.onMoveLeftClickUp(moveEvent);\n if (!this.pressActive) return;\n\n this.pointState.setMoved(true);\n this.dragLayers.move(moveEvent.point);\n this.renderDraggedPoint();\n };\n\n private renderDraggedPoint = coalesceToFrame(() => {\n const event = this.pointState.getLastEvent();\n const idx = this.pointState.getSelectedIdx();\n if (!event || idx === null || !this.pointState.getSelectedNode()) return;\n\n renderer.executeOnMouseMove(idx, event.lngLat, this.topologyManager.getAuxPointsLatLng(event));\n });\n\n private highlight = (id: StepId | null) => {\n const { map } = this.ctx;\n if (this.highlightedStepId === id) return;\n\n if (this.highlightedStepId !== null) {\n map.removeFeatureState({ source: ESOURCES.UnifiedSource, id: this.highlightedStepId });\n }\n\n this.highlightedStepId = id;\n\n if (id !== null) {\n map.setFeatureState({ source: ESOURCES.UnifiedSource, id }, { hover: true });\n }\n };\n\n private onPointerLeaveMap = () => {\n this.onPointerHover.cancel();\n this.highlight(null);\n };\n\n private onPointerHover = coalesceToFrame((event: MapLayerMouseEvent) => {\n const { mouseEvents, map, store } = this.ctx;\n\n if (!this.eventsInited) return;\n if (mouseEvents.pointMouseDown) return;\n\n const id = queryPointId(map, event.point);\n this.highlight(id ?? null);\n\n if (id !== this.suppressedStepId) {\n this.suppressedStepId = null;\n } else if (id) {\n this.removeButton.hide();\n return;\n }\n\n const step = id ? store.findStepById(id) : null;\n\n if (step && !step.isAuxiliary) {\n this.removeButton.show(step);\n } else {\n this.removeButton.hide();\n }\n });\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 // hidden hit layers make maplibre report a second enter for a point dragged without ever leaving\n const reentered = this.pointState.getEnteredStep()?.id === step.id;\n this.pointState.setEnteredStep(step);\n if (!reentered) {\n FireEvents.enterPoint(Object.assign({}, step, { total: store.size }), map);\n }\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 this.pointState.setEnteredStep(null);\n };\n\n private dismissButton = () => {\n this.suppressedStepId = null;\n this.removeButton.hide();\n };\n\n private storeEventsConsumer = (event: StoreChangeEvent) => {\n if (event.type === \"STORE_CLEARED\") {\n this.pointState.reset();\n this.dismissButton();\n return;\n }\n\n if (event.type === \"STORE_MUTATED\" && event.data?.size === 0) {\n this.pointState.reset();\n this.dismissButton();\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 this.dismissButton();\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 onPointMouseDown = (event: MapLayerMouseEvent | MapTouchEvent) => {\n event.preventDefault();\n\n this.pointState.clearLastEvent();\n\n const { mouseEvents, map, store } = this.ctx;\n\n if (isRightClick(event)) return;\n\n this.suppressedStepId = null;\n const id = queryPointId(map, event.point);\n const node = store.findNodeById(id);\n if (node) {\n this.pointState.setSelectedNode(node);\n }\n this.pressedStep = node?.val ?? null;\n this.pressActive = true;\n\n this.dragLayers.press(event.point);\n this.hideLastPointPanel();\n\n this.pointState.setSelectedIdx(getGeometryIndex(store, id));\n\n if (mouseEvents) {\n mouseEvents.pointMouseDown = true;\n }\n\n this.pointState.setStartCoordinates(\n this.pressedStep ? { lat: this.pressedStep.lat, lng: this.pressedStep.lng } : event.lngLat,\n );\n\n map.on(\"mousemove\", this.onMapMouseMove);\n map.on(\"touchmove\", this.onMapMouseMove);\n map.on(\"mouseup\", this.onPointMouseUp);\n map.on(\"touchend\", this.onPointMouseUp);\n };\n\n private onPointMouseUp = () => {\n const { mouseEvents, store, panel, map } = this.ctx;\n\n if (!this.pressActive) return;\n this.pressActive = false;\n\n this.unbindPress();\n this.renderDraggedPoint.cancel();\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?.val) {\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 }\n\n this.pointState.partialReset();\n }\n\n // an aux press opens a PointCompound transaction in AuxPoints, it must close on every release, moved or not\n timeline.commitTransaction();\n\n if (mouseEvents) {\n mouseEvents.pointMouseDown = false;\n }\n\n this.dragLayers.release();\n renderer.execute();\n this.showButtonForPressedStep();\n };\n\n private showButtonForPressedStep = () => {\n const { store } = this.ctx;\n const pressed = this.pressedStep;\n this.pressedStep = null;\n\n if (!pressed || pressed.isAuxiliary) return;\n if (!store.findStepById(pressed.id)) return;\n\n this.removeButton.show(pressed);\n };\n}\n","import { LineEvents } from \"../line\";\nimport { PointEvents } from \"../points\";\nimport { PointVisibility } from \"../points/helpers\";\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 PointVisibility.cancelSinglePointHiding();\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 this.swap(ELAYERS.PointsHitLayer, ELAYERS.PointsLayer);\n this.swap(ELAYERS.FirstPointHitLayer, ELAYERS.FirstPointLayer);\n this.swap(ELAYERS.AuxiliaryPointHitLayer, ELAYERS.AuxiliaryPointLayer);\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.onStoreChange.cancel();\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 { EngineMap } from \"#app/types/engine\";\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\";\nimport type { GeometryProjection } from \"../line/projection\";\nimport type { Emitter } from \"#app/events/emitter\";\nimport type { DrawLibreEventType } from \"../types\";\n\nexport type TilesContext = {\n map: EngineMap;\n panel: Panel;\n store: Store;\n control: Control;\n options: RequiredDrawOptions;\n mouseEvents: MouseEvents;\n mode: DrawingMode;\n projection: GeometryProjection;\n events: Emitter<DrawLibreEventType>;\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 // sources first, then layers\n this.sources.init();\n this.layers.init();\n };\n\n public remove = () => {\n this.events?.remove();\n this.layers.remove();\n this.sources.remove();\n };\n}\n","import type { EngineMap } from \"#app/types/engine\";\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: EngineMap) {\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","export interface DrawLibreSubscription {\n unsubscribe(): void;\n}\n\ntype Listener<T> = (event: T) => void;\n\ntype Registration = { listener: Listener<never>; once: boolean; delivered: boolean };\n\nexport class Emitter<Events extends object> {\n private readonly listeners = new Map<keyof Events, Map<Listener<never>, Registration>>();\n\n on = <T extends keyof Events>(type: T, listener: Listener<Events[T]>): DrawLibreSubscription =>\n this.add(type, listener, false);\n\n once = <T extends keyof Events>(type: T, listener: Listener<Events[T]>): DrawLibreSubscription =>\n this.add(type, listener, true);\n\n off = <T extends keyof Events>(type: T, listener: Listener<Events[T]>): void => {\n this.listeners.get(type)?.delete(listener as Listener<never>);\n };\n\n emit = <T extends keyof Events>(type: T, event: Events[T]): void => {\n const registered = this.listeners.get(type);\n if (!registered) return;\n for (const registration of [...registered.values()]) {\n // a nested emit may have delivered this once registration already\n if (registration.delivered) continue;\n if (registration.once) {\n registration.delivered = true;\n if (registered.get(registration.listener) === registration) registered.delete(registration.listener);\n }\n registration.listener(event as never);\n }\n };\n\n private add<T extends keyof Events>(type: T, listener: Listener<Events[T]>, once: boolean): DrawLibreSubscription {\n let registered = this.listeners.get(type);\n if (!registered) {\n registered = new Map();\n this.listeners.set(type, registered);\n }\n const key = listener as Listener<never>;\n const current = registered.get(key);\n if (!current || !once) registered.set(key, { listener: key, once, delivered: false });\n return { unsubscribe: () => this.off(type, listener) };\n }\n}\n","import type { DrawLibreControl, MapLike, UnifiedMap } from \"#app/types/map\";\nimport type { EngineMap } from \"#app/types/engine\";\nimport type { DrawOptions, LatLng, RequiredDrawOptions, Step, StepId } from \"#app/types/index\";\nimport type {\n DrawLibreEventType,\n UndoEvent,\n RedoEvent,\n PointAddEvent,\n PointRemoveEvent,\n PointEnterEvent,\n PointLeaveEvent,\n PointMoveEvent,\n RemoveAllEvent,\n SaveEvent,\n ModeChangeEvent,\n UndoStackChangeEvent,\n RedoStackChangeEvent,\n BreakEvent,\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 { GeometryProjection } from \"#components/map/line/projection\";\nimport { MouseEvents } from \"#components/map/mouse-events/index\";\nimport { DOM } from \"#app/dom\";\nimport { Store } from \"#app/store/index\";\nimport { renderer, Renderer } from \"#components/map/renderer\";\nimport { appendOpenSteps, ERRORS, linkedListToArray } from \"#app/store/init\";\nimport { checkInitialStepsOptionOnErrors, initOptions } from \"#app/options\";\n\nimport { Tiles } from \"#components/map/tiles\";\nimport { timeline } from \"#app/history\";\nimport { MapTimelineAdapter } from \"#app/history/map-adapter\";\nimport { Emitter, type DrawLibreSubscription } from \"#app/events/emitter\";\nimport { FireEvents } from \"#components/map/fire-events\";\n\nimport \"./draw.css\";\n\nexport default class DrawLibre implements DrawLibreControl {\n static #mounted: DrawLibre | null = null;\n static #busy = false;\n\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 private projection: GeometryProjection | undefined;\n private readonly events = new Emitter<DrawLibreEventType>();\n\n private renderer: Renderer | null = null;\n\n constructor(options?: DrawOptions) {\n this.defaultOptions = initOptions(options);\n\n if (this.defaultOptions.initial) {\n checkInitialStepsOptionOnErrors(this.defaultOptions.initial);\n }\n }\n\n /**\n * DO NOT USE IMPLICITLY. PASS TO map.addControl().\n *\n * @example ```ts\n * const map = new Map();\n * const draw = new DrawLibre();\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: MapLike) => {\n if (DrawLibre.#busy) throw new Error(ERRORS[\"REENTRANT_LIFECYCLE\"]);\n if (DrawLibre.#mounted) throw new Error(ERRORS[\"ALREADY_ADDED_TO_MAP\"]);\n\n DrawLibre.#busy = true;\n DrawLibre.#mounted = this;\n\n try {\n // maplibre and mapbox maps both provide every method the drawing calls\n const engine = map as EngineMap;\n FireEvents.bind(this.events);\n this.store = new Store(this.defaultOptions);\n this.mode = new DrawingMode(this.defaultOptions);\n this.renderer = renderer.initialize({\n map: engine,\n store: this.store,\n options: this.defaultOptions,\n mode: this.mode,\n });\n this.projection = new GeometryProjection({ map: engine, store: this.store, options: this.defaultOptions });\n this.mouseEvents = new MouseEvents();\n this.panel = new Panel({ map: engine, mode: this.mode, options: this.defaultOptions, store: this.store });\n this.control = new Control({ options: this.defaultOptions, map: engine, mode: this.mode });\n this.tiles = new Tiles({\n map: engine,\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 projection: this.projection,\n events: this.events,\n });\n // map sources exist only from here, rendering earlier inside initialize had nowhere to draw\n this.renderer?.execute();\n this.cursor = new Cursor({\n map: engine,\n mode: this.mode,\n mouseEvents: this.mouseEvents,\n store: this.store,\n options: this.defaultOptions,\n });\n\n this.timelineAdapter = new MapTimelineAdapter(engine);\n this.mode.pingConsumers();\n this.store.pingConsumers();\n this.container = this.control.getContainer();\n\n return this.container;\n } catch (error) {\n DrawLibre.#mounted = null;\n this.#teardown();\n throw error;\n } finally {\n DrawLibre.#busy = false;\n }\n };\n\n #teardown = () => {\n this.projection?.remove();\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 timeline.resetStacks();\n if (this.container) DOM.remove(this.container);\n FireEvents.unbind(this.events);\n\n this.container = undefined;\n this.store = undefined;\n this.mode = undefined;\n this.tiles = undefined;\n this.panel = undefined;\n this.control = undefined;\n this.cursor = undefined;\n this.mouseEvents = undefined;\n this.timelineAdapter = undefined;\n this.projection = undefined;\n this.renderer = null;\n };\n\n #getMountedState = () => {\n const { store, mode, panel } = this;\n if (DrawLibre.#mounted !== this || !store || !mode || !panel) {\n throw new Error(ERRORS[\"NOT_ADDED_TO_MAP\"]);\n }\n return { store, mode, panel };\n };\n\n /**\n * DO NOT USE IMPLICITLY. PASS TO map.removeControl().\n *\n * @example ```ts\n * const map = new Map();\n * const draw = new DrawLibre();\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 if (DrawLibre.#busy) throw new Error(ERRORS[\"REENTRANT_LIFECYCLE\"]);\n // tearing down touches the shared timeline, a foreign instance must not do it\n if (DrawLibre.#mounted !== this) return;\n\n DrawLibre.#busy = true;\n try {\n this.#teardown();\n } finally {\n DrawLibre.#mounted = null;\n DrawLibre.#busy = false;\n }\n };\n\n /**\n * Replaces all steps in 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 throw new Error(ERRORS[\"INVALID_STEPS_ARGUMENT\"]);\n }\n const { store, mode, panel } = this.#getMountedState();\n\n store.reset();\n panel.hide();\n mode.reset();\n timeline.resetStacks();\n this.renderer?.resetGeometries();\n appendOpenSteps(store, value, this.defaultOptions.pointGeneration);\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.#getMountedState().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.#getMountedState().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 const { store } = this.#getMountedState();\n\n if (type === \"array\") {\n return linkedListToArray(store.head);\n }\n if (type === \"linkedlist\") {\n return {\n head: store.head,\n tail: store.tail,\n size: store.size,\n };\n }\n throw new Error(ERRORS[\"INVALID_STEPS_TYPE\"]);\n };\n\n public undo = (e?: Event): void => {\n this.#getMountedState().panel.api().undo(e);\n };\n\n public redo = (e?: Event): void => {\n this.#getMountedState().panel.api().redo(e);\n };\n\n public clear = (e?: Event): void => {\n this.#getMountedState().panel.api().clear(e);\n };\n\n public save = (e?: Event): void => {\n this.#getMountedState().panel.api().save(e);\n };\n\n public removeAllSteps = (e?: Event): void => {\n this.clear(e);\n };\n\n public on = <T extends keyof DrawLibreEventType>(\n type: T,\n listener: (event: DrawLibreEventType[T]) => void,\n ): DrawLibreSubscription => this.events.on(type, listener);\n\n public once = <T extends keyof DrawLibreEventType>(\n type: T,\n listener: (event: DrawLibreEventType[T]) => void,\n ): DrawLibreSubscription => this.events.once(type, listener);\n\n public off = <T extends keyof DrawLibreEventType>(\n type: T,\n listener: (event: DrawLibreEventType[T]) => void,\n ): void => {\n this.events.off(type, listener);\n };\n}\n\nexport type {\n DrawOptions,\n RequiredDrawOptions,\n Step,\n LatLng,\n StepId,\n PointAddEvent,\n PointRemoveEvent,\n PointEnterEvent,\n PointLeaveEvent,\n PointMoveEvent,\n RemoveAllEvent,\n SaveEvent,\n UndoEvent,\n RedoEvent,\n ModeChangeEvent,\n UndoStackChangeEvent,\n RedoStackChangeEvent,\n BreakEvent,\n DrawLibreEventType,\n DrawLibreSubscription,\n MapLike,\n DrawLibreControl,\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/line/projection.ts","../src/components/map/mouse-events/index.ts","../src/app/options/constants.ts","../src/app/options/index.ts","../src/components/map/line/commands/break-geometry.ts","../src/components/map/line/break-line.ts","../src/components/map/utils.ts","../src/components/map/points/commands/insert-point.ts","../src/components/map/line/utils.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/tiles/drag-layers.ts","../src/components/map/points/commands/aux-to-primary.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/commands/move-point.ts","../src/components/remove-button/view.ts","../src/components/remove-button/index.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/app/events/emitter.ts","../src/index.ts"],"names":["UIState","value","id","DOM","tagName","className","container","element","node","target","type","callback","options","button","pressed","View","ctx","title","size","panel","locale","buttons","x","y","observer","BASE_Y_OFFSET_FROM_ELEMENT","BASE_X_OFFSET_FROM_ELEMENT","Tooltip","span","event","side","bottom","left","right","labelWidth","labelHeight","position","pos","Observable","args","CompoundCommand","payload","commands","cmd","i","Timeline","_Timeline","txn","timeline","uuidv4","getRandomHexChar","getUuidSection","length","section","getUuidSectionSize","idx","firstElement","lastElement","parts","debounce","fn","delay","timeout","call","coalesceToFrame","pending","frame","flush","LINE_BASE","ELAYERS","POINTS_FILTER","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","DYNAMIC_LINE_PAINT_BASE","BREAK_PAINT_BASE","HIT_HIGHLIGHT_OPACITY","POINT_HIT_PAINT","generateLayers","hitPaint","PointHelpers","p1","p2","mid","FIRST_POINT_LAYERS","POINT_LAYERS","SINGLE_POINT_HIDE_DELAY","singlePointHideTimer","cancelSinglePointHiding","PointVisibility","map","layer","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","prepareSteps","fromArray","initialOptions","appendOpenSteps","linkedListToArray","visitedNodes","result","EVENTS","FireEvents","_FireEvents","emitter","fields","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","Events","handler","btn","onClick","label","Observer","data","OFFSET_Y","Panel","width","height","point","dx","dy","visible","CURSORS","getButtonLabel","lineTitle","polygonTitle","breakTitle","lineButton","breakButton","polygonButton","rect","buttonCenter","mapCenter","placement","currentMode","active","disabled","lineVisible","polygonVisible","breakVisible","isBreak","Control","enrichedCtx","root","getInitialMode","DrawingMode","newMode","Cursor","#canvas","#initConsumers","cursor","mouseEvents","#mouseEventsObserver","#modeObserver","GeometryPixels","source","project","#dirty","#nodes","#pixels","isCircular","orderedNodes","nodes","visited","nearestVertexPx","vertices","best","index","vertex","distance","nearestSegmentPx","a","b","abx","aby","lengthSquared","t","clamped","projected","DESYNC_TOLERANCE","GeometryProjection","coords","#toGeometryCopy","reference","copies","origin","shifted","pixels","localCursor","segment","segmentStart","MouseEvents","#firstPointMouseEnter","#firstPointMouseLeave","#lastPointMouseClick","#lastPointMouseUp","#lastPointMouseEnter","#lastPointMouseLeave","#pointMouseDown","#pointMouseUp","#pointMouseEnter","#pointMouseLeave","#lineMouseEnter","#lineMouseLeave","interactionDefaults","isCoarsePointer","DEFAULT_OPTIONS","allStepsHaveIds","checkIfMissingIds","generateId","idGenerationIsOff","idsNotProvided","checkIfStepsAreEmpty","checkIfEnoughPointsToClose","differentPoints","checkIfPolygonIsClosed","firstLng","lastLng","firstLat","lastLat","checkInitialStepsOptionOnErrors","initOptions","interaction","matchesMedia","canHover","generatePanelOptions","generateModeOptions","generateLayersOptions","generateLocaleOptions","query","paint","BreakGeometryCommand","clickCoords","originalHead","originalTail","newHead","newTail","newAuxBetweenHeadTail","LineBreakEvents","lineSource","lineBreakData","POINT_HIT_LAYERS","isFeatureTriggered","layerIds","queryPointId","queryPoint","features","cursorLng","lng","lat","nearest","getGeometryIndex","isRightClick","InsertPointCommand","insertStepIfOnLine","projection","hit","updateUIAfterInsert","checkIfPointClicked","hideDynamicLine","DynamicLineEvents","events","subscription","clientX","clientY","box","latLng","lineClick","TransparentLineEvents","pointSource","LineEvents","firstPointCircleRadius","radius","defaultPointCircleRadius","togglePointCircleRadius","CloseGeometryCommand","FirstPoint","baseEvents","X_OFFSET","CLICK_TOLERANCE_PX","LAYERS","DragLayers","visibility","AuxToPrimaryCommand","clickedNode","prevPrimaryNode","nextPrimaryNode","prevAuxNode","nextAuxNode","lastAuxNode","prevAuxPoint","nextAuxPoint","AuxPoints","PointState","moved","AddPointCommand","coord","addedNode","auxNode","RemovePointAutoCommand","nodeId","wasCircular","wasRemovedHead","wasRemovedTail","auxBefore","auxAfter","beforePrimary","afterPrimary","after","restoredNode","primaryBefore","primaryAfter","meetsAuxInsertionThreshold","closesOnTail","oldAuxPoint","isAuxiliary","removedNode","before","currentHead","notCircularNow","currentTail","RemovePointManualCommand","RemovePointCommand","PointTopologyManager","state","auxPoints","prevCoords","nextCoords","lastEvent","selectedNode","prevPrimary","nextPrimary","MovePointCommand","start","prevAux","nextAux","midPoint","BUTTON_CLASS","HIDDEN_CLASS","RemoveButtonView","selfShift","OFFSET_X","RemoveButton","containerWidth","anchor","PointEvents","addedStep","moveEvent","reentered","startCoordinates","Layers","LAYERS_TO_RENDER","beneathLayerId","aboveLayerId","beneath","above","Sources","Tiles","MapTimelineAdapter","evt","Emitter","listener","registered","registration","once","key","DrawLibre","_DrawLibre","#mounted","#busy","engine","error","#teardown","#getMountedState"],"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 setPressed(button: HTMLElement | null | undefined, pressed: boolean) {\n if (!button) return;\n button.classList.toggle(\"mdl-control-button-active\", pressed);\n button.setAttribute(\"aria-pressed\", String(pressed));\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.root.setAttribute(\"data-type\", \"panel\");\n this.buttonContainer = DOM.create(\"div\", \"mdl-dashboard\", this.root);\n\n this.renderButtons();\n if (this.hasButtons()) 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\", `mdl-icon mdl-icon-${type} mdl-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 return this.buttons[type] ?? null;\n };\n\n public hasButtons = (): boolean => {\n return Object.keys(this.buttons).length > 0;\n };\n\n public getRoot = (): HTMLDivElement => {\n return this.root;\n };\n\n public show = () => {\n this.root.classList.remove(\"mdl-hidden\");\n this.root.removeAttribute(\"aria-hidden\");\n };\n\n public hide = () => {\n this.root.classList.add(\"mdl-hidden\");\n this.root.setAttribute(\"aria-hidden\", \"true\");\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\nexport type Placement = \"left\" | \"right\" | \"bottom\";\n\ninterface CreateOptions {\n label: string;\n placement: Placement;\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\", \"mdl-tooltip\", document.body);\n const span = DOM.create(\"span\", `mdl-tooltip-text mdl-tooltip-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 this.label?.classList.add(\"mdl-tooltip-text-active\");\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 getSidePosition = (event: HTMLEvent<HTMLElement>, side: \"left\" | \"right\"): Position => {\n const { bottom, left, right } = event.target.getBoundingClientRect();\n const { width: labelWidth, height: labelHeight } = this.getLabelDimensions();\n const y = bottom - labelHeight - 2;\n\n if (side === \"right\") {\n return { x: right + BASE_X_OFFSET_FROM_ELEMENT, y };\n }\n\n return { x: left - BASE_X_OFFSET_FROM_ELEMENT - labelWidth, y };\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 // window coordinates, the container has fixed position\n getPosition = (event: HTMLEvent<HTMLElement>, position: Placement): Position => {\n if (position !== \"bottom\") {\n return this.getSidePosition(event, position);\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.transaction = null;\n this.undoStack = [];\n this.redoStack = [];\n this.pingConsumers();\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 type Debounced<T extends AnyFunction> = ((...args: Parameters<T>) => void) & { cancel: () => void };\n\nexport const debounce = <T extends AnyFunction>(fn: T, delay: number): Debounced<T> => {\n let timeout = 0;\n\n const call = (...args: Parameters<T>) => {\n window.clearTimeout(timeout);\n timeout = window.setTimeout(() => {\n timeout = 0;\n fn(...args);\n }, delay);\n };\n\n call.cancel = () => {\n window.clearTimeout(timeout);\n timeout = 0;\n };\n\n return call;\n};\n\nexport type FrameCoalesced<T extends AnyFunction> = ((...args: Parameters<T>) => void) & { cancel: () => void };\n\nexport const coalesceToFrame = <T extends AnyFunction>(fn: T): FrameCoalesced<T> => {\n let pending: Parameters<T> | null = null;\n let frame = 0;\n\n const flush = () => {\n frame = 0;\n const args = pending;\n pending = null;\n if (args) fn(...args);\n };\n\n const call = (...args: Parameters<T>) => {\n pending = args;\n if (frame === 0) frame = window.requestAnimationFrame(flush);\n };\n\n call.cancel = () => {\n if (frame !== 0) window.cancelAnimationFrame(frame);\n frame = 0;\n pending = null;\n };\n\n return call;\n};\n","import type { RequiredDrawOptions } from \"#app/types/index\";\nimport type { AddLayerObject, CircleLayerSpecification, FilterSpecification } 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 PointsHitLayer: \"mdl-points-hit-layer\",\n FirstPointHitLayer: \"mdl-first-point-hit-layer\",\n AuxiliaryPointHitLayer: \"mdl-auxiliary-point-hit-layer\",\n} as const;\n\nexport const POINTS_FILTER = {\n points: [\n \"all\",\n [\"==\", [\"geometry-type\"], \"Point\"],\n [\"==\", [\"get\", \"isFirst\"], false],\n [\"==\", [\"get\", \"isAuxiliary\"], false],\n ],\n pointsWhenClosed: [\"all\", [\"==\", [\"geometry-type\"], \"Point\"], [\"==\", [\"get\", \"isAuxiliary\"], false]],\n firstPoint: [\"==\", [\"get\", \"isFirst\"], true],\n auxiliaryPoint: [\"==\", [\"get\", \"isAuxiliary\"], true],\n} satisfies Record<string, FilterSpecification>;\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 DYNAMIC_LINE_PAINT_BASE = {\n ...LINE_PAINT_BASE,\n \"line-dasharray\": [4.5, 2.5],\n};\n\nexport const BREAK_PAINT_BASE = {\n \"line-width\": 3,\n \"line-color\": \"#FF6464\",\n \"line-dasharray\": [3, 3],\n};\n\nconst HIT_HIGHLIGHT_OPACITY = 0.18;\n\nconst POINT_HIT_PAINT = {\n \"circle-color\": \"#666666\",\n \"circle-opacity\": [\"case\", [\"boolean\", [\"feature-state\", \"hover\"], false], HIT_HIGHLIGHT_OPACITY, 0],\n} satisfies CircleLayerSpecification[\"paint\"];\n\nexport const generateLayers = (options: RequiredDrawOptions) => {\n const hitPaint = {\n ...POINT_HIT_PAINT,\n \"circle-radius\": options.interaction.pointHitRadius,\n \"circle-pitch-scale\": \"viewport\" as const,\n };\n\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: [\"==\", [\"geometry-type\"], \"Polygon\"],\n },\n {\n id: ELAYERS.LineDynamicLayer,\n source: ESOURCES.LineDynamicSource,\n type: \"line\",\n paint: options.layersPaint.dynamicLine,\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: [\"==\", [\"geometry-type\"], \"LineString\"],\n },\n {\n id: ELAYERS.LineLayerTransparent,\n source: ESOURCES.UnifiedSource,\n type: \"line\",\n paint: {\n \"line-width\": options.interaction.lineHitRadius * 2,\n \"line-color\": \"transparent\",\n },\n filter: [\"==\", [\"geometry-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: POINTS_FILTER.points,\n },\n {\n id: ELAYERS.FirstPointLayer,\n source: ESOURCES.UnifiedSource,\n type: \"circle\",\n paint: options.layersPaint.firstPoint,\n filter: POINTS_FILTER.firstPoint,\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: POINTS_FILTER.auxiliaryPoint,\n },\n {\n id: ELAYERS.PointsHitLayer,\n source: ESOURCES.UnifiedSource,\n type: \"circle\",\n paint: { ...hitPaint },\n filter: POINTS_FILTER.points,\n },\n {\n id: ELAYERS.FirstPointHitLayer,\n source: ESOURCES.UnifiedSource,\n type: \"circle\",\n paint: { ...hitPaint },\n filter: POINTS_FILTER.firstPoint,\n layout: {\n visibility: \"none\",\n },\n },\n {\n id: ELAYERS.AuxiliaryPointHitLayer,\n source: ESOURCES.UnifiedSource,\n type: \"circle\",\n paint: { ...hitPaint },\n filter: POINTS_FILTER.auxiliaryPoint,\n },\n ] satisfies AddLayerObject[];\n};\n","import type { MapLayerMouseEvent } from \"maplibre-gl\";\nimport type { Step } from \"#app/types/index\";\n\nimport { ELAYERS, POINTS_FILTER } from \"#app/utils/geo_constants\";\nimport { uuidv4 } from \"#app/utils/helpers\";\n\nimport type { EngineMap } from \"#app/types/engine\";\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\nconst FIRST_POINT_LAYERS = [ELAYERS.FirstPointLayer, ELAYERS.FirstPointHitLayer];\nconst POINT_LAYERS = [ELAYERS.PointsLayer, ELAYERS.PointsHitLayer];\n\nconst SINGLE_POINT_HIDE_DELAY = 33;\n\nlet singlePointHideTimer: ReturnType<typeof setTimeout> | null = null;\n\nconst cancelSinglePointHiding = () => {\n if (singlePointHideTimer !== null) {\n clearTimeout(singlePointHideTimer);\n singlePointHideTimer = null;\n }\n};\n\nexport const PointVisibility = {\n cancelSinglePointHiding,\n\n setFirstPointVisible(map: EngineMap) {\n for (const layer of FIRST_POINT_LAYERS) {\n map.setLayoutProperty(layer, \"visibility\", \"visible\");\n }\n },\n\n setFirstPointHidden(map: EngineMap) {\n for (const layer of FIRST_POINT_LAYERS) {\n map.setLayoutProperty(layer, \"visibility\", \"none\");\n }\n },\n\n setSinglePointVisible(event: MapLayerMouseEvent) {\n cancelSinglePointHiding();\n event.target.setLayoutProperty(ELAYERS.SinglePointLayer, \"visibility\", \"visible\");\n },\n\n setSinglePointHidden(event: MapLayerMouseEvent) {\n const map = event.target;\n cancelSinglePointHiding();\n singlePointHideTimer = setTimeout(() => {\n singlePointHideTimer = null;\n map.setLayoutProperty(ELAYERS.SinglePointLayer, \"visibility\", \"none\");\n }, SINGLE_POINT_HIDE_DELAY);\n },\n};\n\nexport const PointsFilter = {\n default(map: EngineMap) {\n for (const layer of POINT_LAYERS) {\n map.setFilter(layer, POINTS_FILTER.points);\n }\n },\n closedGeometry(map: EngineMap) {\n for (const layer of POINT_LAYERS) {\n map.setFilter(layer, POINTS_FILTER.pointsWhenClosed);\n }\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 // breaking works differently depending on whether current is the auxiliary node or the primary node before it\n public break = (current: ListNode) => {\n if (!this.store.head) return;\n\n if (this.options?.pointGeneration === \"auto\") {\n // when current is auxiliary, tail steps back one node and head is the node after 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 // otherwise tail is current and head skips the aux point using 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 // without an aux node, tail is current and 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 NOT_ADDED_TO_MAP: \"DrawLibre is not added to a map. Call map.addControl(draw) before using this method.\",\n ALREADY_ADDED_TO_MAP: \"DrawLibre is already added to a map. Call map.removeControl(draw) before adding it again.\",\n REENTRANT_LIFECYCLE:\n \"DrawLibre is in the middle of being added or removed. Do not call map.addControl or map.removeControl from a listener that runs during addControl or removeControl.\",\n INVALID_STEPS_ARGUMENT: \"Invalid argument. Expected an array of steps.\",\n INVALID_STEPS_TYPE: \"Invalid type specified. Use 'array' or 'linkedlist'.\",\n};\n\nfunction buildStepSequence(\n store: Store,\n initialSteps: Step[],\n closeGeometry: Initial[\"closeGeometry\"],\n pointGeneration: RequiredDrawOptions[\"pointGeneration\"],\n): Store {\n const steps = closeGeometry ? initialSteps.slice(0, -1) : initialSteps;\n\n steps.forEach((step, idx) => {\n store.push(step);\n\n // the last step without a next point gets an auxiliary point back to the first step, closing 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 prepareSteps(steps: (Step | LatLng)[]): Step[] {\n return steps.map((step, idx) => {\n const id = \"id\" in step && step.id !== undefined ? step.id : uuidv4();\n return { ...step, isAuxiliary: false, isFirst: idx === 0, id };\n });\n}\n\nfunction fromArray(initialOptions: Initial, pointGeneration: RequiredDrawOptions[\"pointGeneration\"]): Store | null {\n const { steps: initialSteps, closeGeometry } = initialOptions;\n const steps = prepareSteps(initialSteps);\n const list = buildStepSequence(new Store(), steps, 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 appendOpenSteps(\n store: Store,\n steps: (Step | LatLng)[],\n pointGeneration: RequiredDrawOptions[\"pointGeneration\"],\n) {\n buildStepSequence(store, prepareSteps(steps), false, pointGeneration);\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 POINT_REMOVE: \"mdl:pointremove\",\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","import type { Emitter } from \"#app/events/emitter\";\nimport type { EngineMap } from \"#app/types/engine\";\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 type { TilesContext } from \"./tiles\";\nimport type { DrawLibreEventType } from \"./types\";\n\ntype EventName = keyof DrawLibreEventType;\ntype EventFields<T extends EventName> = Omit<DrawLibreEventType[T], \"type\" | \"target\">;\n\ntype FiringMap = { fire(type: string, properties?: object): unknown };\n\ntype QueuedEvent = {\n map: EngineMap;\n type: EventName;\n payload: DrawLibreEventType[EventName];\n emitter: Emitter<DrawLibreEventType> | null;\n};\n\nexport class FireEvents {\n private static emitter: Emitter<DrawLibreEventType> | null = null;\n private static queue: QueuedEvent[] = [];\n private static delivering = false;\n\n static bind(emitter: Emitter<DrawLibreEventType>) {\n FireEvents.emitter = emitter;\n }\n\n static unbind(emitter: Emitter<DrawLibreEventType>) {\n if (FireEvents.emitter === emitter) FireEvents.emitter = null;\n }\n\n private static dispatch<T extends EventName>(map: EngineMap, type: T, fields: EventFields<T>) {\n const payload = { ...fields, type, target: map } as unknown as DrawLibreEventType[T];\n // the receiver is fixed here, a listener of this event may remove the control before it is delivered\n FireEvents.queue.push({ map, type, payload, emitter: FireEvents.emitter });\n // an event fired from inside a listener waits, so both channels see the same order\n if (FireEvents.delivering) return;\n\n FireEvents.delivering = true;\n try {\n let next = FireEvents.queue.shift();\n while (next) {\n (next.map as unknown as FiringMap).fire(next.type, next.payload);\n next.emitter?.emit(next.type, next.payload);\n next = FireEvents.queue.shift();\n }\n } finally {\n FireEvents.queue = [];\n FireEvents.delivering = false;\n }\n }\n\n static addPoint(step: Step & { total: number }, map: EngineMap, mode: DrawingMode) {\n FireEvents.dispatch(map, 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\n static movePoint(step: { end: LatLng; id: StepId; start: LatLng; total: number }, map: EngineMap) {\n FireEvents.dispatch(map, 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\n static removePoint(step: Step & { total: number }, map: EngineMap) {\n FireEvents.dispatch(map, EVENTS.POINT_REMOVE, {\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 enterPoint(step: Step & { total: number }, map: EngineMap) {\n FireEvents.dispatch(map, 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\n static leavePoint(step: Step & { total: number }, map: EngineMap) {\n FireEvents.dispatch(map, 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\n static undo(step: Step & { total: number }, map: EngineMap, originalEvent?: Event) {\n FireEvents.dispatch(map, 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: EngineMap, originalEvent?: Event) {\n FireEvents.dispatch(map, 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: EngineMap, mode: Mode | \"break\") {\n FireEvents.dispatch(map, EVENTS.MODE_CHANGED, { mode });\n }\n\n static removeAllPoints(map: EngineMap, originalEvent?: Event) {\n FireEvents.dispatch(map, EVENTS.REMOVE_ALL, { originalEvent });\n }\n\n static onSaveClick(context: Pick<TilesContext, \"map\" | \"mode\">, steps: Step[], originalEvent?: Event) {\n const { map, mode } = context;\n\n FireEvents.dispatch(map, EVENTS.SAVE, {\n originalEvent,\n timestamp: Date.now(),\n steps,\n mode: {\n geometry: mode.getMode(),\n closedGeometry: mode.getClosedGeometry(),\n },\n });\n }\n\n static onLineBreak(map: EngineMap) {\n FireEvents.dispatch(map, EVENTS.BREAK, {});\n }\n\n static onUndoStackChange = (map: EngineMap, length?: number) => {\n FireEvents.dispatch(map, EVENTS.UNDO_STACK_CHANGED, { length: length as number });\n };\n\n static onRedoStackChange = (map: EngineMap, length?: number) => {\n FireEvents.dispatch(map, EVENTS.REDO_STACK_CHANGED, { length: length as number });\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// rendering depends 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 { EngineMap } from \"#app/types/engine\";\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: EngineMap;\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 // line is always second to last, matching the order from 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 // polygon is always last, matching the order from 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 first, matching the order from 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 type { Step } from \"#app/types\";\nimport { FireEvents } from \"#components/map/fire-events\";\nimport { renderer } from \"#components/map/renderer\";\nimport type { 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 FireEvents.removeAllPoints(map, event);\n renderer.execute();\n };\n\n public undo = (event?: Event) => {\n const { store, map } = this.ctx;\n\n timeline.undo();\n FireEvents.undo({ ...(store.tail?.val as Step), total: store.size }, map, event);\n renderer.execute();\n };\n\n public redo = (event?: Event) => {\n const { store, map } = this.ctx;\n\n timeline.redo();\n FireEvents.redo({ ...(store.tail?.val as Step), total: store.size }, map, event);\n renderer.execute();\n };\n\n public save = (event?: Event) => {\n const { store, options } = this.ctx;\n\n FireEvents.onSaveClick(this.ctx, linkedListToArray(store.head), event);\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;\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 this loop looks avoidable, find a way to remove it\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 { EngineMap } from \"#app/types/engine\";\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: EngineMap;\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 if (!this.view.hasButtons()) return;\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, type Placement } 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 private getPlacement = (button: HTMLElement): Placement => {\n const map = this.ctx.map.getContainer().getBoundingClientRect();\n const rect = button.getBoundingClientRect();\n const buttonCenter = rect.left + rect.width / 2;\n const mapCenter = map.left + map.width / 2;\n\n return buttonCenter < mapCenter ? \"right\" : \"left\";\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 = this.getPlacement(event.target);\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 DOM.setPressed(lineButton, false);\n DOM.setPressed(polygonButton, false);\n DOM.setPressed(breakButton, false);\n };\n\n onLineClick = () => {\n this.tooltip.remove();\n const { mode } = this.ctx;\n const { lineButton } = this.ctx.view;\n\n if (mode.getMode() === \"line\" && !mode.getBreak()) {\n mode.setMode(null);\n this.removeActiveClass();\n return;\n }\n\n this.removeActiveClass();\n DOM.setPressed(lineButton, true);\n mode.setMode(\"line\");\n };\n\n onPolygonClick = () => {\n this.tooltip.remove();\n const { mode } = this.ctx;\n const { polygonButton } = this.ctx.view;\n\n if (mode.getMode() === \"polygon\" && !mode.getBreak()) {\n mode.setMode(null);\n this.removeActiveClass();\n return;\n }\n\n this.removeActiveClass();\n DOM.setPressed(polygonButton, true);\n mode.setMode(\"polygon\");\n };\n\n onBreakClick = () => {\n this.tooltip.remove();\n const { map, mode } = this.ctx;\n const { breakButton } = this.ctx.view;\n\n this.removeActiveClass();\n DOM.setPressed(breakButton, true);\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 type { DrawingModeChangeEvent, Mode } from \"#components/map/mode/types\";\nimport type { Context } from \".\";\nimport { View } from \"./view\";\n\ntype AnnouncedMode = Mode | \"break\";\n\nexport class Observer {\n private announced: AnnouncedMode | undefined = undefined;\n\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 DOM.setPressed(lineButton, false);\n DOM.setPressed(polygonButton, false);\n DOM.setPressed(breakButton, false);\n };\n\n private announce = (mode: AnnouncedMode) => {\n if (mode === this.announced) return;\n this.announced = mode;\n FireEvents.modeChanged(this.ctx.map, mode);\n };\n\n private checkActive = (button: HTMLElement) => {\n this.resetAllState();\n DOM.setPressed(button, true);\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 this.announce(data as Mode);\n\n if (data === \"line\" || data === \"polygon\") {\n this.resetAllState();\n DOM.setPressed(data === \"line\" ? lineButton : polygonButton, true);\n }\n\n if (!breakButton) return;\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 this.announce(\"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 button = DOM.create(\"button\", \"mdl-control-button\", this.root);\n button.setAttribute(\"aria-label\", title);\n button.setAttribute(\"data-type\", type);\n\n DOM.setPressed(button, active);\n if (disabled) {\n DOM.disableButton(button);\n }\n DOM.create(\"span\", `mdl-icon mdl-icon-${type} mdl-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 type { EngineMap } from \"#app/types/engine\";\nimport type { 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: EngineMap;\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 { EngineMap } from \"#app/types/engine\";\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\";\nimport type { DrawingModeChangeEvent } from \"#components/map/mode/types\";\n\ninterface Context {\n map: EngineMap;\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, mode } = this.ctx;\n\n mouseEvents.addObserver(this.#mouseEventsObserver);\n mode.addObserver(this.#modeObserver);\n }\n\n remove() {\n const { mouseEvents, mode } = this.ctx;\n\n mouseEvents.removeObserver(this.#mouseEventsObserver);\n mode.removeObserver(this.#modeObserver);\n this.handleMouseLeave.cancel();\n this.handleFirstPointMouseEnter.cancel();\n }\n\n #modeObserver = (event: DrawingModeChangeEvent) => {\n const { mode } = this.ctx;\n if (mode.getBreak()) return;\n if (event.type === \"CLOSED_GEOMETRY_CHANGED\" && event.data) return;\n\n this.set(mode.getMode() && !mode.getClosedGeometry() ? CURSORS.CROSSHAIR : CURSORS.AUTO);\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 type { ListNode, Store } from \"#app/store/index\";\nimport type { LatLng, Point, RequiredDrawOptions, Step } from \"#app/types/index\";\nimport type { EngineMap } from \"#app/types/engine\";\n\ntype GeometrySource = () => { head: ListNode | null; isCircular: boolean };\n\nexport class GeometryPixels {\n #dirty = true;\n #nodes: ListNode[] = [];\n #pixels: Point[] = [];\n\n constructor(\n private readonly source: GeometrySource,\n private readonly project: (coords: LatLng) => Point,\n ) {}\n\n invalidate = () => {\n this.#dirty = true;\n };\n\n read = () => {\n if (this.#dirty) {\n const { head, isCircular } = this.source();\n this.#nodes = orderedNodes(head, isCircular);\n this.#pixels = this.#nodes.map((node) => this.project(node.val as Step));\n this.#dirty = false;\n }\n\n return { nodes: this.#nodes, pixels: this.#pixels };\n };\n}\n\nexport const orderedNodes = (head: ListNode | null, isCircular: boolean): ListNode[] => {\n const nodes: ListNode[] = [];\n const visited = new Set<ListNode>();\n let current = head;\n\n while (current && !visited.has(current)) {\n visited.add(current);\n if (current.val) {\n nodes.push(current);\n }\n current = current.next;\n }\n\n if (isCircular && head?.val && nodes.length > 1) {\n nodes.push(head);\n }\n\n return nodes;\n};\n\nexport type NearestVertex = {\n index: number;\n distance: number;\n};\n\nexport const nearestVertexPx = (vertices: Point[], cursor: Point): NearestVertex | null => {\n let best: NearestVertex | null = null;\n\n for (let index = 0; index < vertices.length; index++) {\n const vertex = vertices[index];\n if (!vertex) continue;\n\n const distance = Math.hypot(cursor.x - vertex.x, cursor.y - vertex.y);\n\n if (!best || distance < best.distance) {\n best = { index, distance };\n }\n }\n\n return best;\n};\n\nexport type NearestSegment = {\n index: number;\n projected: Point;\n t: number;\n distance: number;\n};\n\nexport const nearestSegmentPx = (vertices: Point[], cursor: Point): NearestSegment | null => {\n let best: NearestSegment | null = null;\n\n for (let index = 0; index < vertices.length - 1; index++) {\n const a = vertices[index];\n const b = vertices[index + 1];\n if (!a || !b) continue;\n\n const abx = b.x - a.x;\n const aby = b.y - a.y;\n const lengthSquared = abx * abx + aby * aby;\n const t = lengthSquared === 0 ? 0 : ((cursor.x - a.x) * abx + (cursor.y - a.y) * aby) / lengthSquared;\n const clamped = Math.min(1, Math.max(0, t));\n const projected = { x: a.x + abx * clamped, y: a.y + aby * clamped };\n const distance = Math.hypot(cursor.x - projected.x, cursor.y - projected.y);\n\n if (!best || distance < best.distance) {\n best = { index, projected, t: clamped, distance };\n }\n }\n\n return best;\n};\n\nconst DESYNC_TOLERANCE = 2;\n\nexport type SegmentHit = {\n segmentStart: ListNode;\n projected: LatLng;\n distance: number;\n vertexDistance: number;\n};\n\ntype ProjectionContext = {\n map: EngineMap;\n store: Store;\n options: RequiredDrawOptions;\n};\n\nexport class GeometryProjection {\n #pixels: GeometryPixels;\n\n constructor(private readonly ctx: ProjectionContext) {\n this.#pixels = new GeometryPixels(\n () => ({ head: ctx.store.head, isCircular: ctx.store.circular.isCircular() }),\n (coords) => ctx.map.project(coords),\n );\n\n ctx.store.addObserver(this.#pixels.invalidate);\n ctx.map.on(\"move\", this.#pixels.invalidate);\n }\n\n public remove = () => {\n this.ctx.store.removeObserver(this.#pixels.invalidate);\n this.ctx.map.off(\"move\", this.#pixels.invalidate);\n };\n\n #toGeometryCopy = (cursor: Point, reference: Step): Point => {\n const { map } = this.ctx;\n const copies = Math.round((map.unproject([cursor.x, cursor.y]).lng - reference.lng) / 360);\n if (copies === 0) return cursor;\n\n const origin = map.project(reference);\n const shifted = map.project({ lng: reference.lng + 360, lat: reference.lat });\n\n return { x: cursor.x - (shifted.x - origin.x) * copies, y: cursor.y - (shifted.y - origin.y) * copies };\n };\n\n public hit = (cursor: Point): SegmentHit | null => {\n const { nodes, pixels } = this.#pixels.read();\n const reference = nodes[0]?.val;\n if (!reference) return null;\n\n const localCursor = this.#toGeometryCopy(cursor, reference);\n const segment = nearestSegmentPx(pixels, localCursor);\n if (!segment) return null;\n if (segment.distance > this.ctx.options.interaction.lineHitRadius * DESYNC_TOLERANCE) return null;\n\n const segmentStart = nodes[segment.index];\n if (!segmentStart) return null;\n\n const vertex = nearestVertexPx(pixels, localCursor);\n const projected = this.ctx.map.unproject([segment.projected.x, segment.projected.y]);\n\n return {\n segmentStart,\n projected: { lat: projected.lat, lng: projected.lng },\n distance: segment.distance,\n vertexDistance: vertex ? vertex.distance : Infinity,\n };\n };\n\n public isNearGeometry = (cursor: Point): boolean => {\n const { nodes, pixels } = this.#pixels.read();\n const reference = nodes[0]?.val;\n if (!reference) return false;\n\n const localCursor = this.#toGeometryCopy(cursor, reference);\n const vertex = nearestVertexPx(pixels, localCursor);\n if (vertex && vertex.distance <= this.ctx.options.interaction.pointHitRadius) return true;\n\n const segment = nearestSegmentPx(pixels, localCursor);\n return segment !== null && segment.distance <= this.ctx.options.interaction.lineHitRadius;\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 DYNAMIC_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 interactionDefaults = (isCoarsePointer: boolean) =>\n isCoarsePointer ? { lineHitRadius: 12, pointHitRadius: 20 } : { lineHitRadius: 7, pointHitRadius: 14 };\n\nexport const DEFAULT_OPTIONS: RequiredDrawOptions = {\n pointGeneration: \"manual\",\n panel: {\n size: \"medium\",\n buttons: {\n undo: { visible: false },\n redo: { visible: false },\n delete: { visible: false },\n save: { visible: false, 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 dynamicLine: DYNAMIC_LINE_PAINT_BASE,\n polygon: POLYGON_PAINT_BASE,\n breakLine: BREAK_PAINT_BASE,\n },\n interaction: interactionDefaults(false),\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 removePoint: \"Remove point\",\n },\n};\n","import { ERRORS } from \"#app/store/init\";\nimport type { Initial, DrawOptions, RequiredDrawOptions, StrictLayersPaint } 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 DYNAMIC_LINE_PAINT_BASE,\n POLYGON_PAINT_BASE,\n BREAK_PAINT_BASE,\n AUXILIARY_POINT_PAINT_BASE,\n} from \"../utils/geo_constants\";\nimport { DEFAULT_OPTIONS, interactionDefaults } 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 checkIfStepsAreEmpty(steps: Initial[\"steps\"]) {\n if (!steps.length) {\n throw new Error(ERRORS[\"EMPTY_INITIAL_STATE\"]);\n }\n}\n\nfunction checkIfEnoughPointsToClose(steps: Initial[\"steps\"], closeGeometry: Initial[\"closeGeometry\"]) {\n const minPointsToCloseGeometry = 3;\n const differentPoints = new Set(steps.map((step) => `${step.lng},${step.lat}`)).size;\n if (closeGeometry && differentPoints < minPointsToCloseGeometry) {\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 checkIfStepsAreEmpty(steps);\n // checks ids exist when id generation is off\n checkIfMissingIds(steps, generateId);\n // closing the geometry needs at least three points\n checkIfEnoughPointsToClose(steps, closeGeometry);\n // a polygon must have closeGeometry set to true\n checkIfPolygonIsClosed(options);\n}\n\nexport function initOptions(options?: DrawOptions): RequiredDrawOptions {\n const interaction = interactionDefaults(matchesMedia(\"(pointer: coarse)\"));\n const canHover = !matchesMedia(\"(hover: none)\");\n\n if (!options) {\n return { ...DEFAULT_OPTIONS, interaction, dynamicLine: DEFAULT_OPTIONS.dynamicLine && canHover };\n }\n\n return {\n pointGeneration: options.pointGeneration ?? DEFAULT_OPTIONS.pointGeneration,\n panel: generatePanelOptions(options),\n modes: generateModeOptions(options),\n layersPaint: generateLayersOptions(options),\n interaction,\n initial: options.initial || DEFAULT_OPTIONS[\"initial\"],\n locale: generateLocaleOptions(options),\n dynamicLine: (options.dynamicLine ?? DEFAULT_OPTIONS.dynamicLine) && canHover,\n } as RequiredDrawOptions;\n}\nconst matchesMedia = (query: string) =>\n typeof window !== \"undefined\" && typeof window.matchMedia === \"function\" ? window.matchMedia(query).matches : false;\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 const paint = options.layersPaint as StrictLayersPaint | undefined;\n const line = {\n \"line-width\": paint?.line?.[\"line-width\"] || LINE_PAINT_BASE[\"line-width\"],\n \"line-color\": paint?.line?.[\"line-color\"] || LINE_PAINT_BASE[\"line-color\"],\n \"line-opacity\": paint?.line?.[\"line-opacity\"] || LINE_PAINT_BASE[\"line-opacity\"],\n ...paint?.line,\n };\n\n return {\n onLinePoint: {\n \"circle-radius\": paint?.onLinePoint?.[\"circle-radius\"] || ON_LINE_POINT_PAINT_BASE[\"circle-radius\"],\n \"circle-color\": paint?.onLinePoint?.[\"circle-color\"] || ON_LINE_POINT_PAINT_BASE[\"circle-color\"],\n \"circle-stroke-color\":\n paint?.onLinePoint?.[\"circle-stroke-color\"] || ON_LINE_POINT_PAINT_BASE[\"circle-stroke-color\"],\n \"circle-stroke-width\":\n paint?.onLinePoint?.[\"circle-stroke-width\"] || ON_LINE_POINT_PAINT_BASE[\"circle-stroke-width\"],\n ...paint?.onLinePoint,\n },\n firstPoint: {\n \"circle-radius\": paint?.firstPoint?.[\"circle-radius\"] || FIRST_POINT_PAINT_BASE[\"circle-radius\"],\n \"circle-color\": paint?.firstPoint?.[\"circle-color\"] || FIRST_POINT_PAINT_BASE[\"circle-color\"],\n \"circle-stroke-color\":\n paint?.firstPoint?.[\"circle-stroke-color\"] || FIRST_POINT_PAINT_BASE[\"circle-stroke-color\"],\n \"circle-stroke-width\":\n paint?.firstPoint?.[\"circle-stroke-width\"] || FIRST_POINT_PAINT_BASE[\"circle-stroke-width\"],\n ...paint?.firstPoint,\n },\n points: {\n \"circle-radius\": paint?.points?.[\"circle-radius\"] || POINTS_PAINT_BASE[\"circle-radius\"],\n \"circle-color\": paint?.points?.[\"circle-color\"] || POINTS_PAINT_BASE[\"circle-color\"],\n \"circle-stroke-color\": paint?.points?.[\"circle-stroke-color\"] || POINTS_PAINT_BASE[\"circle-stroke-color\"],\n \"circle-stroke-width\": paint?.points?.[\"circle-stroke-width\"] || POINTS_PAINT_BASE[\"circle-stroke-width\"],\n ...paint?.points,\n },\n auxiliaryPoint: {\n \"circle-radius\": paint?.auxiliaryPoint?.[\"circle-radius\"] || AUXILIARY_POINT_PAINT_BASE[\"circle-radius\"],\n \"circle-color\": paint?.auxiliaryPoint?.[\"circle-color\"] || AUXILIARY_POINT_PAINT_BASE[\"circle-color\"],\n \"circle-stroke-color\":\n paint?.auxiliaryPoint?.[\"circle-stroke-color\"] || AUXILIARY_POINT_PAINT_BASE[\"circle-stroke-color\"],\n \"circle-stroke-width\":\n paint?.auxiliaryPoint?.[\"circle-stroke-width\"] || AUXILIARY_POINT_PAINT_BASE[\"circle-stroke-width\"],\n ...paint?.auxiliaryPoint,\n },\n line,\n dynamicLine: {\n ...line,\n \"line-dasharray\": DYNAMIC_LINE_PAINT_BASE[\"line-dasharray\"],\n ...paint?.dynamicLine,\n },\n polygon: {\n \"fill-color\": paint?.polygon?.[\"fill-color\"] || POLYGON_PAINT_BASE[\"fill-color\"],\n \"fill-opacity\": paint?.polygon?.[\"fill-opacity\"] || POLYGON_PAINT_BASE[\"fill-opacity\"],\n ...paint?.polygon,\n },\n breakLine: {\n \"line-width\": paint?.breakLine?.[\"line-width\"] || BREAK_PAINT_BASE[\"line-width\"],\n \"line-color\": paint?.breakLine?.[\"line-color\"] || BREAK_PAINT_BASE[\"line-color\"],\n \"line-dasharray\": paint?.breakLine?.[\"line-dasharray\"] || BREAK_PAINT_BASE[\"line-dasharray\"],\n ...paint?.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 removePoint: options.locale?.removePoint ?? DEFAULT_OPTIONS.locale.removePoint,\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 head and tail after the break\n this.snapshot.newHead = this.store.head;\n this.snapshot.newTail = this.store.tail;\n\n // notifies the panel\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 // restores the node connections that were undone when the geometry broke\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 // notifies the panel\n this.store.pingConsumers();\n };\n}\n","import type { GeoJSONSource, MapLayerMouseEvent } from \"maplibre-gl\";\n\nimport type { ListNode } from \"#app/store/index\";\nimport { ELAYERS, ESOURCES } from \"#app/utils/geo_constants\";\nimport { coalesceToFrame } from \"#app/utils/helpers\";\nimport { timeline } from \"#app/history\";\n\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\nexport class LineBreakEvents {\n private current: ListNode | null;\n private renderBreakSegment = coalesceToFrame((event: MapLayerMouseEvent) => {\n this.onLineEnterBreak(event);\n });\n\n constructor(private readonly ctx: TilesContext) {\n this.current = null;\n }\n\n public initBreakEvents = () => {\n this.ctx.map.on(\"click\", ELAYERS.LineLayer, this.geometryBreakOnClick);\n this.ctx.map.on(\"mouseenter\", ELAYERS.LineLayer, this.renderBreakSegment);\n this.ctx.map.on(\"mousemove\", ELAYERS.LineLayer, this.renderBreakSegment);\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.renderBreakSegment);\n this.ctx.map.off(\"mousemove\", ELAYERS.LineLayer, this.renderBreakSegment);\n this.ctx.map.off(\"mouseleave\", ELAYERS.LineLayer, this.onLineLeave);\n this.renderBreakSegment.cancel();\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 } = this.ctx;\n\n const line = this.ctx.projection.hit(event.point)?.segmentStart ?? null;\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 this.renderBreakSegment.cancel();\n this.hideBreakLine();\n };\n}\n","import type { MapLayerMouseEvent, MapMouseEvent, MapTouchEvent } from \"maplibre-gl\";\nimport type { Uuid } from \"#app/types/index\";\nimport type { EngineMap } from \"#app/types/engine\";\nimport type { Store } from \"#app/store/index\";\nimport { ELAYERS } from \"#app/utils/geo_constants\";\nimport { nearestVertexPx } from \"./line/projection\";\n\nexport const POINT_HIT_LAYERS = [ELAYERS.PointsHitLayer, ELAYERS.FirstPointHitLayer, ELAYERS.AuxiliaryPointHitLayer];\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: EngineMap, point: MapMouseEvent[\"point\"]) => {\n const id = queryPoint(map, point)?.properties.id;\n return id;\n};\n\nexport const queryPoint = (map: EngineMap, point: MapMouseEvent[\"point\"]) => {\n const features = map.queryRenderedFeatures(point, {\n layers: POINT_HIT_LAYERS,\n });\n if (features.length < 2) return features[0];\n\n // features are ordered by layer, not by distance, and keep coordinates from the original world copy\n const cursorLng = map.unproject(point).lng;\n const pixels = features.map((feature) => {\n const [lng, lat] = (feature.geometry as GeoJSON.Point).coordinates as [number, number];\n return map.project({ lng: lng + 360 * Math.round((cursorLng - lng) / 360), lat });\n });\n\n const nearest = nearestVertexPx(pixels, point);\n return nearest ? features[nearest.index] : undefined;\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 { 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 { GeoJSONSource, MapLayerMouseEvent } from \"maplibre-gl\";\nimport type { Step } from \"#app/types/index\";\nimport type { EngineMap } from \"#app/types/engine\";\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, POINT_HIT_LAYERS } from \"../utils\";\nimport { TilesContext } from \"../tiles\";\n\nexport const insertStepIfOnLine = (\n event: MapLayerMouseEvent,\n context: Pick<TilesContext, \"store\" | \"options\" | \"projection\">,\n): Step | null => {\n const { store, options, projection } = context;\n const hit = projection.hit(event.point);\n\n if (!hit || hit.vertexDistance < options.interaction.pointHitRadius) {\n return null;\n }\n\n const step = { ...hit.projected, isAuxiliary: false, id: uuidv4() };\n timeline.commit(new InsertPointCommand(store, step, hit.segmentStart));\n return step;\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, POINT_HIT_LAYERS);\n};\n\nexport const hideDynamicLine = (map: EngineMap) => {\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 { GeoJSONSource, MapLayerMouseEvent, PointLike } from \"maplibre-gl\";\n\nimport { DOM } from \"#app/dom\";\nimport type { DrawLibreSubscription } from \"#app/events/emitter\";\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 { coalesceToFrame, debounce, type Debounced } from \"#app/utils/helpers\";\n\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\nexport class DynamicLineEvents {\n private visible: boolean;\n private firstPoint: LatLng | null = null;\n private secondPoint: LatLng | null = null;\n private pointer: LatLng | null = null;\n private lineFeature: any;\n private subscriptions: DrawLibreSubscription[] = [];\n private onStoreEventsDebounced: Debounced<(event: StoreChangeEvent) => void>;\n private renderFreeEnd = coalesceToFrame((event: MapLayerMouseEvent) => {\n this.renderLineOnMouseMove(event.lngLat);\n });\n\n constructor(private readonly ctx: TilesContext) {\n this.visible = true;\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.onStoreEventsDebounced.cancel();\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 // the last point click always hides the dynamic line\n if (event.type === \"lastPointMouseClick\" && event.data) {\n this.hide();\n this.visible = false;\n }\n // avoids calling show right after the last point click while just hovering a point or line\n // TODO rewrite this condition\n if (!this.visible) return;\n\n // hides the dynamic line on these events, reason unclear\n const HIDE_EVENTS = [\"pointMouseEnter\", \"lineMouseEnter\", \"pointMouseDown\"] as MapMouseEvent[];\n if (HIDE_EVENTS.includes(event.type) && event.data) {\n this.hide();\n }\n\n // shows the dynamic line back when it was hidden by the block above\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 = this.freeEnd();\n this.show();\n this.visible = true;\n }\n } else if (event.type === \"STORE_MUTATED\") {\n if (this.ctx.mouseEvents.pointMouseDown) return;\n if (store.size === 0) return;\n this.firstPoint = store.tail?.val as LatLng;\n if (this.ctx.mouseEvents.pointMouseEnter) return;\n this.secondPoint = this.freeEnd();\n this.show();\n this.visible = true;\n }\n };\n\n private initDynamicEvents = () => {\n const { map, events } = this.ctx;\n map.on(\"click\", this.onMapClick);\n map.on(\"mousemove\", this.renderFreeEnd);\n this.subscriptions = [\n events.on(\"mdl:removeall\", this.hide),\n events.on(\"mdl:undo\", this.onUndoRedoClick),\n events.on(\"mdl:redo\", this.onUndoRedoClick),\n events.on(\"mdl:pointremove\", this.onPointRemove),\n ];\n DOM.addEventListener(map.getContainer(), \"pointermove\", this.onPointerMove);\n };\n\n public removeEvents = () => {\n const { map } = this.ctx;\n\n map.off(\"click\", this.onMapClick);\n map.off(\"mousemove\", this.renderFreeEnd);\n this.renderFreeEnd.cancel();\n for (const subscription of this.subscriptions) subscription.unsubscribe();\n this.subscriptions = [];\n DOM.removeEventListener(map.getContainer(), \"pointermove\", this.onPointerMove);\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.renderFreeEnd);\n this.renderFreeEnd.cancel();\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.renderFreeEnd);\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 onPointerMove = (event: Event) => {\n const { map } = this.ctx;\n const { clientX, clientY } = event as PointerEvent;\n const box = map.getContainer().getBoundingClientRect();\n const latLng = map.unproject([clientX - box.left, clientY - box.top] as PointLike);\n\n this.pointer = { lng: latLng.lng, lat: latLng.lat };\n };\n\n private freeEnd = (): LatLng => {\n const { store } = this.ctx;\n return this.pointer ?? (store.tail?.val as LatLng);\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 = () => {\n const { store } = this.ctx;\n\n if (!store.circular.isCircular()) {\n this.firstPoint = store.tail?.val as LatLng;\n this.secondPoint = this.freeEnd();\n this.show();\n }\n\n if (store.size === 0) {\n this.hide();\n }\n };\n\n private onPointRemove = () => {\n const { store } = this.ctx;\n if (!store.circular.isCircular()) {\n this.firstPoint = store.tail?.val as LatLng;\n this.secondPoint = this.freeEnd();\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 { coalesceToFrame } from \"#app/utils/helpers\";\n\nimport { FireEvents } from \"../fire-events\";\nimport { PointVisibility } from \"../points/helpers\";\nimport { checkIfPointClicked, insertStepIfOnLine, updateUIAfterInsert } from \"./utils\";\nimport { TilesContext } from \"#components/map/tiles\";\nimport { DrawingModeChangeEvent } from \"../mode/types\";\n\nexport class TransparentLineEvents {\n private eventsInited = false;\n\n constructor(private readonly ctx: TilesContext) {\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 if (this.eventsInited) return;\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.renderGhostPoint.cancel();\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, this.ctx);\n if (step) {\n updateUIAfterInsert(event, this.ctx);\n FireEvents.addPoint({ ...step, total: store.size }, map, mode);\n }\n };\n\n private hitClearOfVertices = (event: MapLayerMouseEvent) => {\n const hit = this.ctx.projection.hit(event.point);\n if (!hit || hit.vertexDistance < this.ctx.options.interaction.pointHitRadius) return null;\n\n return hit;\n };\n\n private processMouseMove = (event: MapLayerMouseEvent) => {\n const hit = this.hitClearOfVertices(event);\n\n if (!hit) {\n PointVisibility.setSinglePointHidden(event);\n return;\n }\n\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: [hit.projected.lng, hit.projected.lat],\n },\n properties: {},\n });\n }\n }\n };\n\n private onLineMove = (event: MapLayerMouseEvent) => {\n if (this.ctx.mouseEvents.pointMouseDown || this.ctx.mouseEvents.pointMouseEnter) return;\n this.renderGhostPoint(event);\n };\n\n private renderGhostPoint = coalesceToFrame((event: MapLayerMouseEvent) => {\n this.processMouseMove(event);\n });\n\n private onLineEnter = (event: MapLayerMouseEvent) => {\n if (this.ctx.mouseEvents.pointMouseDown || this.ctx.mouseEvents.pointMouseEnter) return;\n if (!this.hitClearOfVertices(event)) return;\n\n this.ctx.mouseEvents.lineMouseEnter = true;\n PointVisibility.setSinglePointVisible(event);\n };\n\n private onLineLeave = (event: MapLayerMouseEvent) => {\n this.renderGhostPoint.cancel();\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 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 (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 if (data) {\n this.transparent?.initEvents();\n }\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 { CircleLayerSpecification } from \"maplibre-gl\";\n\nimport type { EngineMap } from \"#app/types/engine\";\n\nimport { ELAYERS, FIRST_POINT_COLOR, FIRST_POINT_RADIUS } from \"#app/utils/geo_constants\";\n\ntype FirstPointPaint = CircleLayerSpecification[\"paint\"];\n\nconst firstPointCircleRadius = (map: EngineMap, paint: FirstPointPaint) => {\n const radius = paint?.[\"circle-radius\"];\n map.setPaintProperty(\n ELAYERS.FirstPointLayer,\n \"circle-radius\",\n typeof radius === \"number\" ? radius + 1 : radius ?? FIRST_POINT_RADIUS.large,\n );\n map.setPaintProperty(ELAYERS.FirstPointLayer, \"circle-stroke-color\", FIRST_POINT_COLOR.large);\n};\n\nconst defaultPointCircleRadius = (map: EngineMap, paint: FirstPointPaint) => {\n map.setPaintProperty(\n ELAYERS.FirstPointLayer,\n \"circle-radius\",\n paint?.[\"circle-radius\"] ?? FIRST_POINT_RADIUS.default,\n );\n map.setPaintProperty(\n ELAYERS.FirstPointLayer,\n \"circle-stroke-color\",\n paint?.[\"circle-stroke-color\"] ?? FIRST_POINT_COLOR.default,\n );\n};\n\nexport const togglePointCircleRadius = (\n map: EngineMap,\n type: keyof typeof FIRST_POINT_RADIUS,\n paint: FirstPointPaint,\n) => {\n if (type === \"large\") {\n firstPointCircleRadius(map, paint);\n } else {\n defaultPointCircleRadius(map, paint);\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 // aux point becomes the new tail before closing\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 PointVisibility.setFirstPointVisible(map);\n }\n }\n\n private initBaseEvents = () => {\n const { map } = this.ctx;\n\n map.on(\"mouseenter\", ELAYERS.FirstPointHitLayer, this.baseEvents.onPointMouseEnter);\n map.on(\"mouseleave\", ELAYERS.FirstPointHitLayer, this.baseEvents.onPointMouseLeave);\n map.on(\"mousedown\", ELAYERS.FirstPointHitLayer, this.baseEvents.onPointMouseDown);\n map.on(\"touchstart\", ELAYERS.FirstPointHitLayer, this.baseEvents.onPointMouseDown);\n };\n\n private initEvents = () => {\n const { map } = this.ctx;\n\n map.on(\"click\", ELAYERS.FirstPointHitLayer, this.onFirstPointClick);\n map.on(\"mouseenter\", ELAYERS.FirstPointHitLayer, this.onFirstPointMouseEnter);\n map.on(\"mouseleave\", ELAYERS.FirstPointHitLayer, this.onFirstPointMouseLeave);\n map.on(\"mousedown\", ELAYERS.FirstPointHitLayer, this.onFirstPointMouseDown);\n map.on(\"mouseup\", this.onFirstPointMouseUp);\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.FirstPointHitLayer, this.baseEvents.onPointMouseEnter);\n map.off(\"mouseleave\", ELAYERS.FirstPointHitLayer, this.baseEvents.onPointMouseLeave);\n map.off(\"mousedown\", ELAYERS.FirstPointHitLayer, this.baseEvents.onPointMouseDown);\n map.off(\"touchstart\", ELAYERS.FirstPointHitLayer, this.baseEvents.onPointMouseDown);\n };\n\n private removeEvents() {\n const { map } = this.ctx;\n\n map.off(\"click\", ELAYERS.FirstPointHitLayer, this.onFirstPointClick);\n map.off(\"mouseenter\", ELAYERS.FirstPointHitLayer, this.onFirstPointMouseEnter);\n map.off(\"mouseleave\", ELAYERS.FirstPointHitLayer, this.onFirstPointMouseLeave);\n map.off(\"mousedown\", ELAYERS.FirstPointHitLayer, this.onFirstPointMouseDown);\n map.off(\"mouseup\", 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 const paint = this.ctx.options.layersPaint.firstPoint;\n if (store.circular.canClose()) {\n togglePointCircleRadius(map, \"large\", paint);\n } else {\n togglePointCircleRadius(map, \"default\", paint);\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 { Point } from \"#app/types/index\";\nimport type { EngineMap } from \"#app/types/engine\";\nimport { ELAYERS } from \"#app/utils/geo_constants\";\n\n// maplibre still fires a click when release lands within 3px of press, a wobble that small should not cost two tile reparses\nconst CLICK_TOLERANCE_PX = 3;\n\nconst LAYERS = [\n ELAYERS.LineLayerTransparent,\n ELAYERS.PointsHitLayer,\n ELAYERS.FirstPointHitLayer,\n ELAYERS.AuxiliaryPointHitLayer,\n];\n\ntype Visibility = \"visible\" | \"none\";\n\nexport class DragLayers {\n private pressPoint: Point | null = null;\n private saved: Map<string, Visibility> | null = null;\n\n constructor(private readonly map: EngineMap) {}\n\n press = (point: Point) => {\n this.pressPoint = { x: point.x, y: point.y };\n };\n\n move = (point: Point) => {\n if (!this.pressPoint || this.saved) return;\n if (Math.hypot(point.x - this.pressPoint.x, point.y - this.pressPoint.y) <= CLICK_TOLERANCE_PX) return;\n\n this.hide();\n };\n\n release = () => {\n this.pressPoint = null;\n if (!this.saved) return;\n\n for (const [id, visibility] of this.saved) {\n if (this.map.getLayer(id)) {\n this.map.setLayoutProperty(id, \"visibility\", visibility);\n }\n }\n this.saved = null;\n };\n\n private hide() {\n this.saved = new Map();\n\n for (const id of LAYERS) {\n if (!this.map.getLayer(id)) continue;\n\n const current = (this.map.getLayoutProperty(id, \"visibility\") as Visibility | undefined) ?? \"visible\";\n this.saved.set(id, current);\n this.map.setLayoutProperty(id, \"visibility\", \"none\");\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 type { MapLayerMouseEvent, MapTouchEvent } from \"maplibre-gl\";\n\nimport { ELAYERS } from \"#app/utils/geo_constants\";\nimport { timeline } from \"#app/history\";\nimport { AuxToPrimaryCommand } from \"./commands/aux-to-primary\";\n\nimport type { PrimaryPointEvents } from \".\";\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 ) {\n this.initEvents();\n this.initConsumers();\n }\n\n private initBaseEvents = () => {\n const { map } = this.ctx;\n\n map.on(\"mouseenter\", ELAYERS.AuxiliaryPointHitLayer, this.baseEvents.onPointMouseEnter);\n map.on(\"mouseleave\", ELAYERS.AuxiliaryPointHitLayer, this.baseEvents.onPointMouseLeave);\n map.on(\"mousedown\", ELAYERS.AuxiliaryPointHitLayer, this.baseEvents.onPointMouseDown);\n map.on(\"touchstart\", ELAYERS.AuxiliaryPointHitLayer, this.baseEvents.onPointMouseDown);\n };\n\n private removeBaseEvents = () => {\n const { map } = this.ctx;\n\n map.off(\"mouseenter\", ELAYERS.AuxiliaryPointHitLayer, this.baseEvents.onPointMouseEnter);\n map.off(\"mouseleave\", ELAYERS.AuxiliaryPointHitLayer, this.baseEvents.onPointMouseLeave);\n map.off(\"mousedown\", ELAYERS.AuxiliaryPointHitLayer, this.baseEvents.onPointMouseDown);\n map.off(\"touchstart\", ELAYERS.AuxiliaryPointHitLayer, 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.AuxiliaryPointHitLayer, this.onMouseDown);\n map.on(\"touchstart\", ELAYERS.AuxiliaryPointHitLayer, this.onMouseDown);\n this.initBaseEvents();\n this.eventsInited = true;\n }\n\n public removeEvents() {\n const { map } = this.ctx;\n map.off(\"mousedown\", ELAYERS.AuxiliaryPointHitLayer, this.onMouseDown);\n map.off(\"touchstart\", ELAYERS.AuxiliaryPointHitLayer, 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","import type { ListNode } from \"#app/store/index\";\nimport type { LatLng, Step } from \"#app/types/index\";\nimport type { 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 this.moved = false;\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 // adds an aux point when pointGeneration is auto\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 // removing a primary point replaces it and its aux points with a new aux point\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 // an aux point is inserted between the two remaining aux points only once size reaches five in a circular list or three in a linear one\n const meetsAuxInsertionThreshold = store.circular.isCircular() ? store.size >= 5 : store.size >= 3;\n if (primaryBefore?.val && primaryAfter?.val && meetsAuxInsertionThreshold) {\n // reuses the aux point created earlier when this is an undo or redo\n if (this.snapshot.newAux) {\n const closesOnTail = store.tail === primaryBefore && store.head === primaryBefore.next;\n this.restoreNodeAfter(primaryBefore, this.snapshot.newAux);\n if (closesOnTail) store.tail = 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 if (this.snapshot?.newAux) {\n this.restoreNodeAfter(store.head as ListNode, this.snapshot.newAux);\n } else {\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\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 if (!this.snapshot) {\n this.snapshot = this.makeSnapshot(clickedNode);\n }\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.removePoint({ ...(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 } else {\n store.tail = 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.removePoint({ ...(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 } else {\n this.ctx.store.tail = 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 { EngineMap } from \"#app/types/engine\";\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: EngineMap;\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 // updates the selected node lat and lng from the store on mouse up\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 timeline.commit(new RemovePointCommand({ store, options, mode, map, nodeId: id }));\n }\n}\n","import { ListNode, Store } from \"#app/store\";\nimport type { StoreChangeEventKeys } from \"#app/store/types\";\nimport type { LatLng } from \"#app/types\";\nimport type { EngineMap } from \"#app/types/engine\";\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: EngineMap,\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 // true only when pointGeneration is 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 { DOM } from \"#app/dom\";\n\nconst BUTTON_CLASS = \"mdl-point-remove\";\nconst HIDDEN_CLASS = \"mdl-hidden\";\n\nexport type Side = \"left\" | \"right\";\n\nexport class RemoveButtonView {\n private readonly button: HTMLButtonElement;\n\n constructor(container: HTMLElement, label: string) {\n this.button = DOM.create(\"button\", `${BUTTON_CLASS} ${HIDDEN_CLASS}`, container);\n this.button.type = \"button\";\n this.button.setAttribute(\"data-type\", \"remove-point\");\n this.button.setAttribute(\"aria-label\", label);\n }\n\n public getElement = (): HTMLButtonElement => this.button;\n\n public getWidth = (): number => this.button.offsetWidth;\n\n public setPosition = (x: number, y: number, side: Side) => {\n const selfShift = side === \"right\" ? \"0, -50%\" : \"-100%, -50%\";\n this.button.style.transform = `translate(${x}px, ${y}px) translate(${selfShift})`;\n this.button.dataset.side = side;\n };\n\n public show = () => DOM.removeClassName(this.button, HIDDEN_CLASS);\n\n public hide = () => DOM.addClassName(this.button, HIDDEN_CLASS);\n\n public destroy = () => DOM.remove(this.button);\n}\n","import { DOM } from \"#app/dom\";\nimport type { RequiredDrawOptions, Step, StepId } from \"#app/types/index\";\nimport type { EngineMap } from \"#app/types/engine\";\n\nimport { RemoveButtonView } from \"./view\";\nimport \"./remove-button.css\";\n\nconst OFFSET_X = 12;\n\nexport interface RemoveButtonContext {\n map: EngineMap;\n options: RequiredDrawOptions;\n onRemove: (id: StepId) => void;\n}\n\nexport class RemoveButton {\n private readonly view: RemoveButtonView;\n private anchor: Step | null = null;\n private rafId = 0;\n private listenersActive = false;\n\n constructor(private readonly ctx: RemoveButtonContext) {\n this.view = new RemoveButtonView(ctx.map.getContainer(), ctx.options.locale.removePoint);\n\n const element = this.view.getElement();\n DOM.addEventListener(element, \"mouseleave\", this.onButtonMouseLeave);\n DOM.addEventListener(element, \"click\", this.onButtonClick);\n }\n\n public show = (step: Step) => {\n this.anchor = step;\n this.enableListeners();\n this.updatePosition();\n this.view.show();\n };\n\n public hide = () => {\n this.cancelFrame();\n this.disableListeners();\n this.anchor = null;\n this.view.hide();\n };\n\n public destroy = () => {\n this.hide();\n\n const element = this.view.getElement();\n DOM.removeEventListener(element, \"mouseleave\", this.onButtonMouseLeave);\n DOM.removeEventListener(element, \"click\", this.onButtonClick);\n\n this.view.destroy();\n };\n\n private cancelFrame = () => {\n if (!this.rafId) return;\n window.cancelAnimationFrame(this.rafId);\n this.rafId = 0;\n };\n\n private enableListeners = () => {\n if (this.listenersActive) return;\n const { map } = this.ctx;\n\n map.on(\"move\", this.onMapMove);\n map.on(\"zoom\", this.onMapMove);\n DOM.addEventListener(map.getCanvasContainer(), \"pointerdown\", this.hide);\n this.listenersActive = true;\n };\n\n private disableListeners = () => {\n if (!this.listenersActive) return;\n const { map } = this.ctx;\n\n map.off(\"move\", this.onMapMove);\n map.off(\"zoom\", this.onMapMove);\n DOM.removeEventListener(map.getCanvasContainer(), \"pointerdown\", this.hide);\n this.listenersActive = false;\n };\n\n private onMapMove = () => {\n if (this.rafId) return;\n this.rafId = window.requestAnimationFrame(() => {\n this.rafId = 0;\n this.updatePosition();\n });\n };\n\n private updatePosition = () => {\n if (!this.anchor) return;\n const { map } = this.ctx;\n\n const point = map.project({ lng: this.anchor.lng, lat: this.anchor.lat });\n const containerWidth = map.getContainer().clientWidth;\n const overflowsRight = point.x + OFFSET_X + this.view.getWidth() > containerWidth;\n\n if (overflowsRight) {\n this.view.setPosition(point.x - OFFSET_X, point.y, \"left\");\n } else {\n this.view.setPosition(point.x + OFFSET_X, point.y, \"right\");\n }\n };\n\n private onButtonMouseLeave = () => this.hide();\n\n private onButtonClick = (event: Event) => {\n event.stopPropagation();\n const anchor = this.anchor;\n\n this.hide();\n if (anchor) this.ctx.onRemove(anchor.id);\n };\n}\n","import type { LatLng, Step, StepId } from \"#app/types/index\";\nimport type { MapLayerMouseEvent, MapTouchEvent } from \"maplibre-gl\";\n\nimport { coalesceToFrame } from \"#app/utils/helpers\";\nimport { ELAYERS, ESOURCES } from \"#app/utils/geo_constants\";\nimport { timeline } from \"#app/history\";\nimport type { StoreChangeEvent } from \"#app/store/types\";\nimport type { DrawLibreSubscription } from \"#app/events/emitter\";\n\nimport { FireEvents } from \"../fire-events\";\nimport { PointVisibility } from \"./helpers\";\nimport { FirstPoint } from \"./first-point\";\nimport { DragLayers } from \"../tiles/drag-layers\";\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, getGeometryIndex, isRightClick, POINT_HIT_LAYERS } from \"../utils\";\nimport type { TilesContext } from \"../tiles\";\nimport { DOM } from \"#app/dom\";\nimport { RemoveButton } from \"#components/remove-button\";\n\nexport interface PrimaryPointEvents {\n onPointMouseEnter: (event: MapLayerMouseEvent) => void;\n onPointMouseLeave: (event: MapLayerMouseEvent) => void;\n onPointMouseDown: (event: MapLayerMouseEvent | MapTouchEvent) => void;\n onMapMouseMove: (event: MapLayerMouseEvent) => void;\n}\n// TODO clean up this class, it got messy\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 private removeButton: RemoveButton;\n private dragLayers: DragLayers;\n private pressedStep: Step | null = null;\n private pressActive = false;\n private suppressedStepId: StepId | null = null;\n private highlightedStepId: StepId | null = null;\n private pointAdded: DrawLibreSubscription | null = null;\n\n constructor(private readonly ctx: TilesContext) {\n this.pointState = new PointState();\n this.topologyManager = new PointTopologyManager(ctx, this.pointState);\n this.dragLayers = new DragLayers(this.ctx.map);\n\n this.events = {\n onPointMouseEnter: this.onPointMouseEnter,\n onPointMouseLeave: this.onPointMouseLeave,\n onPointMouseDown: this.onPointMouseDown,\n onMapMouseMove: this.onMapMouseMove,\n };\n this.firstPoint = new FirstPoint(this.ctx, this.events);\n this.auxPoints = new AuxPoints(this.ctx, this.events);\n this.removeButton = new RemoveButton({\n map: this.ctx.map,\n options: this.ctx.options,\n onRemove: this.onPointRemove,\n });\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 map.on(\"mousemove\", this.onPointerHover);\n DOM.addEventListener(map.getContainer(), \"mouseleave\", this.onPointerLeaveMap);\n this.pointAdded = this.ctx.events.on(\"mdl:add\", this.onPointAdded);\n\n map.on(\"mouseenter\", ELAYERS.PointsHitLayer, this.onPointMouseEnter);\n map.on(\"mouseleave\", ELAYERS.PointsHitLayer, this.onPointMouseLeave);\n map.on(\"mousedown\", ELAYERS.PointsHitLayer, this.onPointMouseDown);\n map.on(\"click\", ELAYERS.PointsHitLayer, this.onPointClick);\n map.on(\"touchstart\", ELAYERS.PointsHitLayer, 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 this.highlight(null);\n map.off(\"click\", this.onMapClick);\n map.off(\"dblclick\", this.onMapDblClick);\n map.off(\"mousemove\", this.onPointerHover);\n DOM.removeEventListener(map.getContainer(), \"mouseleave\", this.onPointerLeaveMap);\n map.off(\"mousemove\", this.onMapMouseMove);\n this.renderDraggedPoint.cancel();\n this.onPointerHover.cancel();\n this.dragLayers.release();\n this.pointAdded?.unsubscribe();\n this.pointAdded = null;\n\n map.off(\"mouseenter\", ELAYERS.PointsHitLayer, this.onPointMouseEnter);\n map.off(\"mouseleave\", ELAYERS.PointsHitLayer, this.onPointMouseLeave);\n map.off(\"mousedown\", ELAYERS.PointsHitLayer, this.onPointMouseDown);\n map.off(\"click\", ELAYERS.PointsHitLayer, this.onPointClick);\n map.off(\"touchstart\", ELAYERS.PointsHitLayer, this.onPointMouseDown);\n this.eventsInited = false;\n };\n\n private unbindPress = () => {\n const { map } = this.ctx;\n map.off(\"mousemove\", this.onMapMouseMove);\n map.off(\"touchmove\", this.onMapMouseMove);\n map.off(\"mouseup\", this.onPointMouseUp);\n map.off(\"touchend\", this.onPointMouseUp);\n };\n\n private cancelPress = () => {\n this.unbindPress();\n this.pressActive = false;\n this.pressedStep = null;\n this.pointState.reset();\n };\n\n public remove = () => {\n this.cancelPress();\n this.removeEvents();\n this.firstPoint?.remove();\n this.auxPoints?.removeEvents();\n this.removeConsumers();\n this.removeButton.destroy();\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 = (id: StepId) => {\n const { store } = this.ctx;\n\n if (!store.findStepById(id)) return;\n\n this.topologyManager.removePoint(id);\n renderer.execute();\n };\n\n private onOwnGeometryClick = (event: MapLayerMouseEvent) => {\n if (isFeatureTriggered(event, [...POINT_HIT_LAYERS, ELAYERS.LineLayerTransparent, ELAYERS.LineLayerBreak])) {\n return true;\n }\n // hit layers stay unqueryable during a drag until tiles reparse, a short out and back drag can land a click in that gap\n return this.ctx.projection.isNearGeometry(event.point);\n };\n\n private onMapClick = (event: MapLayerMouseEvent) => {\n const { mode, mouseEvents, map, store } = this.ctx;\n\n if (mode.getClosedGeometry()) return;\n if (this.onOwnGeometryClick(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 onPointAdded = (event: { id: StepId }) => {\n // a queued hover before this click would query tiles missing the new point and lift the suppression\n this.onPointerHover.cancel();\n this.suppressedStepId = event.id;\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 = (event: MapLayerMouseEvent | MapTouchEvent) => {\n if (!this.ctx.mouseEvents.pointMouseDown) return;\n\n const moveEvent = event as MapLayerMouseEvent;\n this.pointState.setLastEvent(moveEvent);\n if (!this.pointState.getSelectedNode()) return;\n\n this.onMoveLeftClickUp(moveEvent);\n if (!this.pressActive) return;\n\n this.pointState.setMoved(true);\n this.dragLayers.move(moveEvent.point);\n this.renderDraggedPoint();\n };\n\n private renderDraggedPoint = coalesceToFrame(() => {\n const event = this.pointState.getLastEvent();\n const idx = this.pointState.getSelectedIdx();\n if (!event || idx === null || !this.pointState.getSelectedNode()) return;\n\n renderer.executeOnMouseMove(idx, event.lngLat, this.topologyManager.getAuxPointsLatLng(event));\n });\n\n private highlight = (id: StepId | null) => {\n const { map } = this.ctx;\n if (this.highlightedStepId === id) return;\n\n if (this.highlightedStepId !== null) {\n map.removeFeatureState({ source: ESOURCES.UnifiedSource, id: this.highlightedStepId });\n }\n\n this.highlightedStepId = id;\n\n if (id !== null) {\n map.setFeatureState({ source: ESOURCES.UnifiedSource, id }, { hover: true });\n }\n };\n\n private onPointerLeaveMap = () => {\n this.onPointerHover.cancel();\n this.highlight(null);\n };\n\n private onPointerHover = coalesceToFrame((event: MapLayerMouseEvent) => {\n const { mouseEvents, map, store } = this.ctx;\n\n if (!this.eventsInited) return;\n if (mouseEvents.pointMouseDown) return;\n\n const id = queryPointId(map, event.point);\n this.highlight(id ?? null);\n\n if (id !== this.suppressedStepId) {\n this.suppressedStepId = null;\n } else if (id) {\n this.removeButton.hide();\n return;\n }\n\n const step = id ? store.findStepById(id) : null;\n\n if (step && !step.isAuxiliary) {\n this.removeButton.show(step);\n } else {\n this.removeButton.hide();\n }\n });\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 // hidden hit layers make maplibre report a second enter for a point dragged without ever leaving\n const reentered = this.pointState.getEnteredStep()?.id === step.id;\n this.pointState.setEnteredStep(step);\n if (!reentered) {\n FireEvents.enterPoint(Object.assign({}, step, { total: store.size }), map);\n }\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 this.pointState.setEnteredStep(null);\n };\n\n private dismissButton = () => {\n this.suppressedStepId = null;\n this.removeButton.hide();\n };\n\n private storeEventsConsumer = (event: StoreChangeEvent) => {\n if (event.type === \"STORE_CLEARED\") {\n this.pointState.reset();\n this.dismissButton();\n return;\n }\n\n if (event.type === \"STORE_MUTATED\" && event.data?.size === 0) {\n this.pointState.reset();\n this.dismissButton();\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 this.dismissButton();\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 onPointMouseDown = (event: MapLayerMouseEvent | MapTouchEvent) => {\n event.preventDefault();\n\n this.pointState.clearLastEvent();\n\n const { mouseEvents, map, store } = this.ctx;\n\n if (isRightClick(event)) return;\n\n this.suppressedStepId = null;\n const id = queryPointId(map, event.point);\n const node = store.findNodeById(id);\n if (node) {\n this.pointState.setSelectedNode(node);\n }\n this.pressedStep = node?.val ?? null;\n this.pressActive = true;\n\n this.dragLayers.press(event.point);\n this.hideLastPointPanel();\n\n this.pointState.setSelectedIdx(getGeometryIndex(store, id));\n\n if (mouseEvents) {\n mouseEvents.pointMouseDown = true;\n }\n\n this.pointState.setStartCoordinates(\n this.pressedStep ? { lat: this.pressedStep.lat, lng: this.pressedStep.lng } : event.lngLat,\n );\n\n map.on(\"mousemove\", this.onMapMouseMove);\n map.on(\"touchmove\", this.onMapMouseMove);\n map.on(\"mouseup\", this.onPointMouseUp);\n map.on(\"touchend\", this.onPointMouseUp);\n };\n\n private onPointMouseUp = () => {\n const { mouseEvents, store, panel, map } = this.ctx;\n\n if (!this.pressActive) return;\n this.pressActive = false;\n\n this.unbindPress();\n this.renderDraggedPoint.cancel();\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?.val) {\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 }\n\n this.pointState.partialReset();\n }\n\n // an aux press opens a PointCompound transaction in AuxPoints, it must close on every release, moved or not\n timeline.commitTransaction();\n\n if (mouseEvents) {\n mouseEvents.pointMouseDown = false;\n }\n\n this.dragLayers.release();\n renderer.execute();\n this.showButtonForPressedStep();\n };\n\n private showButtonForPressedStep = () => {\n const { store } = this.ctx;\n const pressed = this.pressedStep;\n this.pressedStep = null;\n\n if (!pressed || pressed.isAuxiliary) return;\n if (!store.findStepById(pressed.id)) return;\n\n this.removeButton.show(pressed);\n };\n}\n","import { LineEvents } from \"../line\";\nimport { PointEvents } from \"../points\";\nimport { PointVisibility } from \"../points/helpers\";\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 PointVisibility.cancelSinglePointHiding();\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 this.swap(ELAYERS.PointsHitLayer, ELAYERS.PointsLayer);\n this.swap(ELAYERS.FirstPointHitLayer, ELAYERS.FirstPointLayer);\n this.swap(ELAYERS.AuxiliaryPointHitLayer, ELAYERS.AuxiliaryPointLayer);\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.onStoreChange.cancel();\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 { EngineMap } from \"#app/types/engine\";\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\";\nimport type { GeometryProjection } from \"../line/projection\";\nimport type { Emitter } from \"#app/events/emitter\";\nimport type { DrawLibreEventType } from \"../types\";\n\nexport type TilesContext = {\n map: EngineMap;\n panel: Panel;\n store: Store;\n control: Control;\n options: RequiredDrawOptions;\n mouseEvents: MouseEvents;\n mode: DrawingMode;\n projection: GeometryProjection;\n events: Emitter<DrawLibreEventType>;\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 // sources first, then layers\n this.sources.init();\n this.layers.init();\n };\n\n public remove = () => {\n this.events?.remove();\n this.layers.remove();\n this.sources.remove();\n };\n}\n","import type { EngineMap } from \"#app/types/engine\";\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: EngineMap) {\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","export interface DrawLibreSubscription {\n unsubscribe(): void;\n}\n\ntype Listener<T> = (event: T) => void;\n\ntype Registration = { listener: Listener<never>; once: boolean; delivered: boolean };\n\nexport class Emitter<Events extends object> {\n private readonly listeners = new Map<keyof Events, Map<Listener<never>, Registration>>();\n\n on = <T extends keyof Events>(type: T, listener: Listener<Events[T]>): DrawLibreSubscription =>\n this.add(type, listener, false);\n\n once = <T extends keyof Events>(type: T, listener: Listener<Events[T]>): DrawLibreSubscription =>\n this.add(type, listener, true);\n\n off = <T extends keyof Events>(type: T, listener: Listener<Events[T]>): void => {\n this.listeners.get(type)?.delete(listener as Listener<never>);\n };\n\n emit = <T extends keyof Events>(type: T, event: Events[T]): void => {\n const registered = this.listeners.get(type);\n if (!registered) return;\n for (const registration of [...registered.values()]) {\n // a nested emit may have delivered this once registration already\n if (registration.delivered) continue;\n if (registration.once) {\n registration.delivered = true;\n if (registered.get(registration.listener) === registration) registered.delete(registration.listener);\n }\n registration.listener(event as never);\n }\n };\n\n private add<T extends keyof Events>(type: T, listener: Listener<Events[T]>, once: boolean): DrawLibreSubscription {\n let registered = this.listeners.get(type);\n if (!registered) {\n registered = new Map();\n this.listeners.set(type, registered);\n }\n const key = listener as Listener<never>;\n const current = registered.get(key);\n if (!current || !once) registered.set(key, { listener: key, once, delivered: false });\n return { unsubscribe: () => this.off(type, listener) };\n }\n}\n","import type { DrawLibreControl, MapLike, UnifiedMap } from \"#app/types/map\";\nimport type { EngineMap } from \"#app/types/engine\";\nimport type { DrawOptions, LatLng, RequiredDrawOptions, Step, StepId } from \"#app/types/index\";\nimport type {\n DrawLibreEventType,\n UndoEvent,\n RedoEvent,\n PointAddEvent,\n PointRemoveEvent,\n PointEnterEvent,\n PointLeaveEvent,\n PointMoveEvent,\n RemoveAllEvent,\n SaveEvent,\n ModeChangeEvent,\n UndoStackChangeEvent,\n RedoStackChangeEvent,\n BreakEvent,\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 { GeometryProjection } from \"#components/map/line/projection\";\nimport { MouseEvents } from \"#components/map/mouse-events/index\";\nimport { DOM } from \"#app/dom\";\nimport { Store } from \"#app/store/index\";\nimport { renderer, Renderer } from \"#components/map/renderer\";\nimport { appendOpenSteps, ERRORS, linkedListToArray } from \"#app/store/init\";\nimport { checkInitialStepsOptionOnErrors, initOptions } from \"#app/options\";\n\nimport { Tiles } from \"#components/map/tiles\";\nimport { timeline } from \"#app/history\";\nimport { MapTimelineAdapter } from \"#app/history/map-adapter\";\nimport { Emitter, type DrawLibreSubscription } from \"#app/events/emitter\";\nimport { FireEvents } from \"#components/map/fire-events\";\n\nexport default class DrawLibre implements DrawLibreControl {\n static #mounted: DrawLibre | null = null;\n static #busy = false;\n\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 private projection: GeometryProjection | undefined;\n private readonly events = new Emitter<DrawLibreEventType>();\n\n private renderer: Renderer | null = null;\n\n constructor(options?: DrawOptions) {\n this.defaultOptions = initOptions(options);\n\n if (this.defaultOptions.initial) {\n checkInitialStepsOptionOnErrors(this.defaultOptions.initial);\n }\n }\n\n /**\n * DO NOT USE IMPLICITLY. PASS TO map.addControl().\n *\n * @example ```ts\n * const map = new Map();\n * const draw = new DrawLibre();\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: MapLike) => {\n if (DrawLibre.#busy) throw new Error(ERRORS[\"REENTRANT_LIFECYCLE\"]);\n if (DrawLibre.#mounted) throw new Error(ERRORS[\"ALREADY_ADDED_TO_MAP\"]);\n\n DrawLibre.#busy = true;\n DrawLibre.#mounted = this;\n\n try {\n // maplibre and mapbox maps both provide every method the drawing calls\n const engine = map as EngineMap;\n FireEvents.bind(this.events);\n this.store = new Store(this.defaultOptions);\n this.mode = new DrawingMode(this.defaultOptions);\n this.renderer = renderer.initialize({\n map: engine,\n store: this.store,\n options: this.defaultOptions,\n mode: this.mode,\n });\n this.projection = new GeometryProjection({ map: engine, store: this.store, options: this.defaultOptions });\n this.mouseEvents = new MouseEvents();\n this.panel = new Panel({ map: engine, mode: this.mode, options: this.defaultOptions, store: this.store });\n this.control = new Control({ options: this.defaultOptions, map: engine, mode: this.mode });\n this.tiles = new Tiles({\n map: engine,\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 projection: this.projection,\n events: this.events,\n });\n // map sources exist only from here, rendering earlier inside initialize had nowhere to draw\n this.renderer?.execute();\n this.cursor = new Cursor({\n map: engine,\n mode: this.mode,\n mouseEvents: this.mouseEvents,\n store: this.store,\n options: this.defaultOptions,\n });\n\n this.timelineAdapter = new MapTimelineAdapter(engine);\n this.mode.pingConsumers();\n this.store.pingConsumers();\n this.container = this.control.getContainer();\n\n return this.container;\n } catch (error) {\n DrawLibre.#mounted = null;\n this.#teardown();\n throw error;\n } finally {\n DrawLibre.#busy = false;\n }\n };\n\n #teardown = () => {\n this.projection?.remove();\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 timeline.resetStacks();\n if (this.container) DOM.remove(this.container);\n FireEvents.unbind(this.events);\n\n this.container = undefined;\n this.store = undefined;\n this.mode = undefined;\n this.tiles = undefined;\n this.panel = undefined;\n this.control = undefined;\n this.cursor = undefined;\n this.mouseEvents = undefined;\n this.timelineAdapter = undefined;\n this.projection = undefined;\n this.renderer = null;\n };\n\n #getMountedState = () => {\n const { store, mode, panel } = this;\n if (DrawLibre.#mounted !== this || !store || !mode || !panel) {\n throw new Error(ERRORS[\"NOT_ADDED_TO_MAP\"]);\n }\n return { store, mode, panel };\n };\n\n /**\n * DO NOT USE IMPLICITLY. PASS TO map.removeControl().\n *\n * @example ```ts\n * const map = new Map();\n * const draw = new DrawLibre();\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 if (DrawLibre.#busy) throw new Error(ERRORS[\"REENTRANT_LIFECYCLE\"]);\n // tearing down touches the shared timeline, a foreign instance must not do it\n if (DrawLibre.#mounted !== this) return;\n\n DrawLibre.#busy = true;\n try {\n this.#teardown();\n } finally {\n DrawLibre.#mounted = null;\n DrawLibre.#busy = false;\n }\n };\n\n /**\n * Replaces all steps in 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 throw new Error(ERRORS[\"INVALID_STEPS_ARGUMENT\"]);\n }\n const { store, mode, panel } = this.#getMountedState();\n\n store.reset();\n panel.hide();\n mode.reset();\n timeline.resetStacks();\n this.renderer?.resetGeometries();\n appendOpenSteps(store, value, this.defaultOptions.pointGeneration);\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.#getMountedState().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.#getMountedState().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 const { store } = this.#getMountedState();\n\n if (type === \"array\") {\n return linkedListToArray(store.head);\n }\n if (type === \"linkedlist\") {\n return {\n head: store.head,\n tail: store.tail,\n size: store.size,\n };\n }\n throw new Error(ERRORS[\"INVALID_STEPS_TYPE\"]);\n };\n\n public undo = (e?: Event): void => {\n this.#getMountedState().panel.api().undo(e);\n };\n\n public redo = (e?: Event): void => {\n this.#getMountedState().panel.api().redo(e);\n };\n\n public clear = (e?: Event): void => {\n this.#getMountedState().panel.api().clear(e);\n };\n\n public save = (e?: Event): void => {\n this.#getMountedState().panel.api().save(e);\n };\n\n public removeAllSteps = (e?: Event): void => {\n this.clear(e);\n };\n\n public on = <T extends keyof DrawLibreEventType>(\n type: T,\n listener: (event: DrawLibreEventType[T]) => void,\n ): DrawLibreSubscription => this.events.on(type, listener);\n\n public once = <T extends keyof DrawLibreEventType>(\n type: T,\n listener: (event: DrawLibreEventType[T]) => void,\n ): DrawLibreSubscription => this.events.once(type, listener);\n\n public off = <T extends keyof DrawLibreEventType>(\n type: T,\n listener: (event: DrawLibreEventType[T]) => void,\n ): void => {\n this.events.off(type, listener);\n };\n}\n\nexport type {\n DrawOptions,\n RequiredDrawOptions,\n Step,\n LatLng,\n StepId,\n PointAddEvent,\n PointRemoveEvent,\n PointEnterEvent,\n PointLeaveEvent,\n PointMoveEvent,\n RemoveAllEvent,\n SaveEvent,\n UndoEvent,\n RedoEvent,\n ModeChangeEvent,\n UndoStackChangeEvent,\n RedoStackChangeEvent,\n BreakEvent,\n DrawLibreEventType,\n DrawLibreSubscription,\n MapLike,\n DrawLibreControl,\n UnifiedMap,\n};\n"]}
|