@opendfieldmap/map 0.2.2-beta → 0.2.3-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { loadOEMManifest, validateOEMManifest } from "@opendfieldmap/core";
|
|
3
3
|
import { gameToOEMPosition, gameXZToOEMPosition, mapToGameXZPosition, oemToGamePosition, toOEMMapPosition, fromOEMMapPosition, toOEMLeafletMapPosition } from "@opendfieldmap/core";
|
|
4
4
|
var runtimePromise;
|
|
5
|
-
var loadRuntime = () => runtimePromise ??= import("./runtime-
|
|
5
|
+
var loadRuntime = () => runtimePromise ??= import("./runtime-6QYIDK3F.js");
|
|
6
6
|
if (typeof document !== "undefined") void loadRuntime();
|
|
7
7
|
async function createOEM(container, options) {
|
|
8
8
|
if (typeof document === "undefined") throw new Error("createOEM must run in a browser");
|
|
@@ -3,6 +3,8 @@ export type GeometryPoint = {
|
|
|
3
3
|
x: number;
|
|
4
4
|
z: number;
|
|
5
5
|
};
|
|
6
|
+
/** Validates the readable boundary collection format used by both data sources. */
|
|
7
|
+
export declare const parseBoundaryCollection: (value: unknown, path: string) => OEMBoundary[];
|
|
6
8
|
/** Scores a boundary for hit-testing, including polygon holes and edge distance. */
|
|
7
9
|
export declare const boundaryScore: (boundary: OEMBoundary, point: GeometryPoint) => {
|
|
8
10
|
id: string;
|
package/dist/runtime/oem.d.ts
CHANGED
|
@@ -57,7 +57,7 @@ export declare class OEM implements OEMContract {
|
|
|
57
57
|
private normalizeCustomPoints;
|
|
58
58
|
private normalizeClickPointOptions;
|
|
59
59
|
private position;
|
|
60
|
-
private
|
|
60
|
+
private loadBoundaryData;
|
|
61
61
|
/** Preloads OEM subregion geometry so map clicks can resolve an exact subregion. */
|
|
62
62
|
prepareSubregionBoundaries(): Promise<void>;
|
|
63
63
|
private inferSubregionId;
|
|
@@ -413,6 +413,18 @@ var isMapOverdragged = (map, bounds) => {
|
|
|
413
413
|
var ghicon_default = '<svg width="83" height="81" viewBox="0 0 83 81" xmlns="http://www.w3.org/2000/svg">\n<path fill-rule="evenodd" clip-rule="evenodd" d="M41.3763 0C18.4963 0 0 18.5625 0 41.5268C0 59.8835 11.8512 75.422 28.292 80.9215C30.3475 81.335 31.1004 80.028 31.1004 78.9286C31.1004 77.9659 31.0327 74.666 31.0327 71.2277C19.5228 73.7032 17.1259 66.2774 17.1259 66.2774C15.2762 61.4647 12.5355 60.2277 12.5355 60.2277C8.76836 57.6838 12.8099 57.6838 12.8099 57.6838C16.9887 57.9589 19.1815 61.9464 19.1815 61.9464C22.8801 68.2712 28.84 66.4841 31.2376 65.3839C31.5798 62.7024 32.6766 60.8462 33.8411 59.8151C24.6612 58.8524 15.0027 55.2774 15.0027 39.3263C15.0027 34.7887 16.6457 31.0762 19.2492 28.1888C18.8385 27.1578 17.3995 22.8943 19.6608 17.188C19.6608 17.188 23.1545 16.0878 31.0318 21.4507C34.4044 20.5417 37.8825 20.0792 41.3763 20.0753C44.87 20.0753 48.4314 20.5571 51.72 21.4507C59.5982 16.0878 63.0919 17.188 63.0919 17.188C65.3532 22.8943 63.9134 27.1578 63.5026 28.1888C66.1747 31.0762 67.75 34.7887 67.75 39.3263C67.75 55.2774 58.0915 58.7832 48.843 59.8151C50.3505 61.1213 51.6514 63.596 51.6514 67.5152C51.6514 73.0839 51.5837 77.5533 51.5837 78.9277C51.5837 80.028 52.3374 81.335 54.3921 80.9224C70.8329 75.4211 82.6841 59.8835 82.6841 41.5268C82.7518 18.5625 64.1878 0 41.3763 0Z"/>\n</svg>\n';
|
|
414
414
|
|
|
415
415
|
// packages/map/src/runtime/geometry.ts
|
|
416
|
+
var parseBoundaryCollection = (value, path) => {
|
|
417
|
+
const collection = Array.isArray(value) ? { count: value.length, boundaries: value } : value;
|
|
418
|
+
if (!collection || !Number.isInteger(collection.count) || !Array.isArray(collection.boundaries) || collection.count !== collection.boundaries.length) {
|
|
419
|
+
throw new Error(`Invalid OEM boundary data: ${path}`);
|
|
420
|
+
}
|
|
421
|
+
for (const boundary of collection.boundaries) {
|
|
422
|
+
if (!boundary || typeof boundary.id !== "string" || !boundary.id || !Array.isArray(boundary.rings) || boundary.rings.some((ring) => !Array.isArray(ring) || ring.length < 3 || ring.some((point) => !point || !Number.isFinite(point.x) || !Number.isFinite(point.z)))) {
|
|
423
|
+
throw new Error(`Invalid OEM boundary data: ${path}`);
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
return collection.boundaries;
|
|
427
|
+
};
|
|
416
428
|
var pointOnSegment = (point, start, end) => {
|
|
417
429
|
const cross = (point.x - start.x) * (end.z - start.z) - (point.z - start.z) * (end.x - start.x);
|
|
418
430
|
if (Math.abs(cross) > 1e-7) return false;
|
|
@@ -753,14 +765,13 @@ var OEM = class {
|
|
|
753
765
|
position(latlng) {
|
|
754
766
|
return fromOEMLeafletPosition(latlng.lat, latlng.lng, this.region, this.floorId);
|
|
755
767
|
}
|
|
756
|
-
|
|
768
|
+
loadBoundaryData(reference) {
|
|
757
769
|
const cached = this.boundaryData.get(reference.path);
|
|
758
770
|
if (cached) return Promise.resolve(cached);
|
|
759
771
|
const pending = this.boundaryDataRequests.get(reference.path);
|
|
760
772
|
if (pending) return pending;
|
|
761
773
|
const request = fetchOEMJson(resolveOEMAsset(this.options.resources.baseUrl, reference.path), this.options.signal).then((value) => {
|
|
762
|
-
|
|
763
|
-
const boundaries = value;
|
|
774
|
+
const boundaries = parseBoundaryCollection(value, reference.path);
|
|
764
775
|
this.boundaryData.set(reference.path, boundaries);
|
|
765
776
|
return boundaries;
|
|
766
777
|
}).finally(() => {
|
|
@@ -773,7 +784,7 @@ var OEM = class {
|
|
|
773
784
|
async prepareSubregionBoundaries() {
|
|
774
785
|
if (!this.region.boundaries) return;
|
|
775
786
|
try {
|
|
776
|
-
await this.
|
|
787
|
+
await this.loadBoundaryData(this.region.boundaries);
|
|
777
788
|
} catch {
|
|
778
789
|
}
|
|
779
790
|
}
|
|
@@ -807,16 +818,17 @@ var OEM = class {
|
|
|
807
818
|
ranked.sort((left, right) => right.wins - left.wins || right.margin - left.margin || right.distance - left.distance || left.id.localeCompare(right.id));
|
|
808
819
|
return ranked[0].id;
|
|
809
820
|
}
|
|
810
|
-
|
|
821
|
+
if (scores.length) return void 0;
|
|
822
|
+
const bounds = this.region.subregions.filter((subregion) => subregion.bounds && (!allowed || allowed.has(subregion.id))).flatMap((subregion) => {
|
|
811
823
|
const [[minX, minZ], [maxX, maxZ]] = subregion.bounds;
|
|
812
824
|
const insideX = point.x >= minX && point.x <= maxX;
|
|
813
825
|
const insideZ = point.z >= minZ && point.z <= maxZ;
|
|
814
|
-
|
|
815
|
-
const
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
return
|
|
826
|
+
if (!insideX || !insideZ) return [];
|
|
827
|
+
const dx = Math.min(point.x - minX, maxX - point.x);
|
|
828
|
+
const dz = Math.min(point.z - minZ, maxZ - point.z);
|
|
829
|
+
return [{ id: subregion.id, distance: Math.min(dx, dz) ** 2 }];
|
|
830
|
+
}).sort((left, right) => right.distance - left.distance || left.id.localeCompare(right.id));
|
|
831
|
+
return bounds[0]?.id;
|
|
820
832
|
}
|
|
821
833
|
emitMapClick = (event) => {
|
|
822
834
|
if (this.destroyed) return;
|
|
@@ -1220,7 +1232,7 @@ var OEM = class {
|
|
|
1220
1232
|
this.renderLabels(true);
|
|
1221
1233
|
} else {
|
|
1222
1234
|
const reference = this.boundarySource === "game" ? this.region.gameBoundaries : this.region.boundaries;
|
|
1223
|
-
const boundaries = reference ?
|
|
1235
|
+
const boundaries = reference ? await this.loadBoundaryData(reference) : [];
|
|
1224
1236
|
if (request.signal.aborted) return;
|
|
1225
1237
|
this.renderBoundaries(boundaries);
|
|
1226
1238
|
}
|
|
@@ -1397,7 +1409,7 @@ var OEM = class {
|
|
|
1397
1409
|
renderBoundaries(boundaries) {
|
|
1398
1410
|
this.boundariesLayer.clearLayers();
|
|
1399
1411
|
for (const boundary of boundaries) {
|
|
1400
|
-
const rings = boundary.rings.map((ring) => ring.map((position) => toOEMLeafletPosition(position, this.region)));
|
|
1412
|
+
const rings = boundary.rings.map((ring) => ring.map((position) => toOEMLeafletPosition({ ...position, regionId: this.region.id }, this.region)));
|
|
1401
1413
|
L5.polygon(rings, {
|
|
1402
1414
|
color: "transparent",
|
|
1403
1415
|
fillOpacity: 0.2,
|
|
@@ -1463,4 +1475,4 @@ var OEM = class {
|
|
|
1463
1475
|
export {
|
|
1464
1476
|
OEM
|
|
1465
1477
|
};
|
|
1466
|
-
//# sourceMappingURL=runtime-
|
|
1478
|
+
//# sourceMappingURL=runtime-6QYIDK3F.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/runtime/oem.ts", "../src/atlos/smoothWheelZoom.ts", "../src/atlos/mapOverdrag.ts", "../src/assets/ghicon.svg", "../src/runtime/geometry.ts", "../src/runtime/layers.ts", "../src/atlos/smoothTileLayer.ts", "../src/tileVersion.ts", "../src/runtime/helpers.ts"],
|
|
4
|
+
"sourcesContent": ["import L from 'leaflet';\nimport 'leaflet.markercluster';\nimport {\n createOEMPointUrl,\n fetchOEMJson,\n fromOEMLeafletPosition,\n getOEMRegion,\n mapToGameXZPosition,\n normalizeOEMLocale,\n resolveOEMAsset,\n toOEMLeafletMapPosition,\n toOEMLeafletPosition,\n} from '@opendfieldmap/core';\nimport type {\n OEMAsset,\n OEMBoundary,\n OEMBoundarySource,\n OEMFloor,\n OEMLabel,\n OEMLocaleMessages,\n OEMManifest,\n OEMPoint,\n OEMPointFilter,\n OEMMapPosition,\n OEMPointType,\n OEMPosition,\n OEMRegion,\n OEMView,\n} from '@opendfieldmap/core';\nimport type { OEM as OEMContract, OEMClickPointOptions, OEMCustomPoint, OEMEvents, OEMFeatures, OEMOptions, OEMZoomOptions } from '../types';\nimport { enableSmoothWheelZoom } from '../atlos/smoothWheelZoom';\nimport { isMapOverdragged, toMapBounds } from '../atlos/mapOverdrag';\nimport GithubIcon from '../assets/ghicon.svg';\nimport { boundaryScore, parseBoundaryCollection } from './geometry';\nimport { CoveredTileLayer, OEMMarker } from './layers';\nimport {\n BRAND_URL,\n CLUSTER_SUBCATEGORIES,\n cloneCustomPoint,\n cloneFilter,\n clonePoint,\n FEATURE_NAMES,\n GITHUB_URL,\n sameFilter,\n TERMS_URL,\n type OEMFeatureName,\n} from './helpers';\n\nconst mounted = new WeakSet<HTMLElement>();\n\ntype AtlosPointTuple = [string | number, number, number, number, number, string | null];\ntype AtlosPointObject = { id: string | number; z?: number; x?: number; y?: number; tier?: number; pos?: number[]; subregId?: string; type?: string | null };\n\n/** Decodes the compact tuple/object format used by Atlos' marker interpreter. */\nconst decodeAtlosPoint = (raw: AtlosPointTuple | AtlosPointObject, region: OEMRegion, fallbackSubregionId: string): OEMPoint | undefined => {\n if (!Array.isArray(raw) && raw && 'position' in (raw as object) && 'raw' in (raw as object)) return raw as unknown as OEMPoint;\n const value = Array.isArray(raw)\n ? { id: raw[0], z: raw[1], x: raw[2], y: raw[3], tier: raw[4], type: raw[5] }\n : raw;\n if (value?.id == null) return undefined;\n const x = value.x ?? value.pos?.[1] ?? 0;\n const z = value.z ?? value.pos?.[0] ?? 0;\n const y = value.y ?? value.pos?.[2] ?? 0;\n const tier = value.tier ?? 0;\n if (![x, y, z, tier].every(Number.isFinite)) return undefined;\n const subregionId = value.subregId ?? fallbackSubregionId;\n const floorId = tier === 0 ? 'M' : `${tier < 0 ? 'B' : 'L'}${Math.abs(Math.trunc(tier))}`;\n const mapPosition: OEMMapPosition = { regionId: region.id, subregionId, x, z, floorId };\n const game = mapToGameXZPosition(mapPosition, region, subregionId);\n const scale = 2 ** region.maxNativeZoom;\n return {\n id: String(value.id), regionId: region.id, subregionId, type: value.type ?? '', tier,\n raw: { x: game.x, y, z: game.z },\n position: { ...mapPosition, x: x * scale, z: z * scale },\n };\n};\n\n/** Leaflet-backed implementation of the public OEM interface. */\nexport class OEM implements OEMContract {\n destroyed = false;\n private map: L.Map;\n private root: HTMLDivElement;\n private region: OEMRegion;\n private floorId = 'M';\n private features: OEMFeatures = {};\n private boundarySource: OEMBoundarySource = 'oem';\n private listeners = new Map<keyof OEMEvents, Set<(payload: never) => void>>();\n private requests = new Map<OEMFeatureName, AbortController>();\n private baseTiles?: L.TileLayer;\n private floorTiles?: L.TileLayer;\n private pointsLayer = L.layerGroup();\n private customPointsLayer = L.layerGroup();\n private pointClusters = new Map<string, L.MarkerClusterGroup>();\n private labelsLayer = L.layerGroup();\n private boundariesLayer = L.layerGroup();\n private points: OEMPoint[] = [];\n private customPoints: OEMCustomPoint[] = [];\n private clickPoints: OEMCustomPoint[] = [];\n private clickPointOptions?: OEMClickPointOptions;\n private clickPointSequence = 0;\n private customPointsRequest?: { controller: AbortController; promise: Promise<void> };\n private pointIndex?: Record<string, string>;\n private pointIndexRequest?: Promise<Record<string, string>>;\n private pointShardRequests = new Map<string, Promise<OEMPoint[]>>();\n private boundaryData = new Map<string, OEMBoundary[]>();\n private boundaryDataRequests = new Map<string, Promise<OEMBoundary[]>>();\n private types: Record<string, OEMPointType> = {};\n private labels: OEMLabel[] = [];\n private visibleLabelType?: OEMLabel['type'];\n private messages: OEMLocaleMessages = {};\n private filter: OEMPointFilter = {};\n private markerClustering: boolean;\n private locale: string;\n private resolvedLocale: string;\n private attributionBrand: HTMLAnchorElement;\n private attributionLink: HTMLAnchorElement;\n private observer?: ResizeObserver;\n private updatingView = false;\n private emittedView?: OEMView;\n private overdragFrame?: number;\n private overdragged = false;\n private wheel: ReturnType<typeof enableSmoothWheelZoom>;\n\n constructor(private container: HTMLElement, readonly manifest: OEMManifest, private options: OEMOptions) {\n if (mounted.has(container)) throw new Error('This container already hosts an OEM instance');\n this.region = getOEMRegion(manifest, options.view?.regionId ?? options.regionId ?? manifest.defaultRegionId);\n this.filter = cloneFilter(options.pointFilter ?? {});\n this.boundarySource = options.features?.boundarySource ?? 'oem';\n this.customPoints = this.normalizeCustomPoints(options.customPoints ?? []);\n this.markerClustering = options.markerClustering ?? true;\n const initialFloor = options.view?.floorId ?? options.floorId ?? 'M';\n this.validateFloor(initialFloor);\n if (options.view) this.validatePosition(options.view);\n this.locale = options.locale ?? manifest.fallbackLocale;\n this.resolvedLocale = normalizeOEMLocale(this.locale, Object.keys(manifest.locales), manifest.fallbackLocale);\n this.root = document.createElement('div');\n this.root.className = 'mapRoot';\n this.root.dataset.theme = options.theme ?? 'light';\n container.append(this.root);\n mounted.add(container);\n this.map = L.map(this.root, {\n crs: L.CRS.Simple, minZoom: 0, maxZoom: 3, zoomControl: false, attributionControl: false,\n dragging: !options.lockDrag, touchZoom: !options.lockZoom, boxZoom: !options.lockZoom,\n keyboard: !options.lockZoom, doubleClickZoom: false, scrollWheelZoom: false, zoomAnimation: true,\n markerZoomAnimation: true, fadeAnimation: true, zoomSnap: 0, zoomDelta: 0.25,\n });\n this.wheel = enableSmoothWheelZoom(this.map, {\n enableInertia: true,\n panEnabled: !options.lockDrag,\n zoomEnabled: !options.lockZoom,\n });\n const pane = this.map.createPane('placeLabels');\n pane.style.zIndex = '650';\n pane.style.pointerEvents = 'none';\n this.pointsLayer.addTo(this.map);\n this.customPointsLayer.addTo(this.map);\n this.labelsLayer.addTo(this.map);\n this.boundariesLayer.addTo(this.map);\n const credit = document.createElement('div');\n credit.className = 'attribution';\n const github = document.createElement('a');\n github.className = 'attributionGithub';\n github.href = GITHUB_URL;\n github.target = '_blank';\n github.rel = 'noopener noreferrer';\n github.setAttribute('aria-label', 'GitHub');\n github.innerHTML = GithubIcon;\n const githubSvg = github.querySelector('svg');\n githubSvg?.setAttribute('aria-hidden', 'true');\n githubSvg?.setAttribute('focusable', 'false');\n this.attributionBrand = document.createElement('a');\n this.attributionBrand.className = 'attributionBrand';\n this.attributionBrand.href = BRAND_URL;\n const separator = document.createElement('span');\n separator.className = 'attributionSeparator';\n separator.textContent = '\u00B7';\n separator.setAttribute('aria-hidden', 'true');\n this.attributionLink = document.createElement('a');\n this.attributionLink.className = 'attributionLink';\n this.attributionLink.href = TERMS_URL;\n this.attributionLink.target = '_blank';\n this.attributionLink.rel = 'noopener noreferrer';\n credit.append(github, this.attributionBrand, separator, this.attributionLink);\n this.updateAttribution();\n this.root.append(credit);\n this.applyRegion(options.view);\n this.setFloor(initialFloor);\n this.renderCustomPoints();\n this.map.on('click', this.emitMapClick);\n this.map.on('moveend zoomend', this.emitView);\n this.map.on('move drag', this.scheduleOverdragUpdate);\n this.map.on('moveend dragend movestart zoomstart', this.clearOverdrag);\n if (typeof ResizeObserver !== 'undefined') {\n this.observer = new ResizeObserver(() => this.resize());\n this.observer.observe(container);\n }\n options.signal?.addEventListener('abort', this.destroy, { once: true });\n }\n\n /** Prevents calls against a released map instance. */\n private assertAlive(): void { if (this.destroyed) throw new Error('OEM instance has been destroyed'); }\n private validateFloor(id: string): void {\n if (!this.region.floors.some((floor) => floor.id === id)) throw new Error(`Unknown floor ${id} in ${this.region.id}`);\n }\n private validatePosition(position: OEMPosition): void { toOEMLeafletPosition(position, this.region); }\n private normalizeCustomPoints(points: readonly OEMCustomPoint[]): OEMCustomPoint[] {\n const ids = new Set<string>();\n return points.map((point) => {\n if (!point || typeof point.id !== 'string' || !point.id.trim()) {\n throw new Error(`Custom point IDs must be non-empty and unique: ${point?.id}`);\n }\n const id = point.id.trim();\n if (ids.has(id)) throw new Error(`Custom point IDs must be non-empty and unique: ${id}`);\n ids.add(id);\n if (!point.position || typeof point.position.regionId !== 'string') {\n throw new Error(`Invalid custom point position: ${id}`);\n }\n const position = point.position;\n if (point.style !== 'framed' && point.style !== 'no-frame') {\n throw new Error(`Invalid custom point style: ${id}`);\n }\n if (typeof point.icon !== 'string' || !point.icon) {\n throw new Error(`Custom point icon must be a non-empty URL: ${id}`);\n }\n const pointRegion = getOEMRegion(this.manifest, position.regionId);\n toOEMLeafletMapPosition(position);\n if (position.subregionId && !pointRegion.subregions.some((subregion) => subregion.id === position.subregionId)) {\n throw new Error(`Unknown custom point subregion ${position.subregionId} in ${position.regionId}`);\n }\n if (position.floorId && !pointRegion.floors.some((floor) => floor.id === position.floorId)) {\n throw new Error(`Unknown custom point floor ${position.floorId} in ${position.regionId}`);\n }\n return { ...cloneCustomPoint({ ...point, position }), id };\n });\n }\n private normalizeClickPointOptions(options: OEMClickPointOptions): OEMClickPointOptions {\n const probe: OEMCustomPoint = {\n id: 'click-point-option',\n position: { regionId: this.region.id, x: 0, z: 0 },\n style: options?.style,\n icon: options?.icon,\n };\n this.normalizeCustomPoints([probe]);\n if (options.mode !== 'multiple' && options.mode !== 'single') {\n throw new Error(`Invalid click point mode: ${options.mode}`);\n }\n return { mode: options.mode, style: options.style, icon: options.icon };\n }\n private position(latlng: L.LatLng): OEMPosition {\n return fromOEMLeafletPosition(latlng.lat, latlng.lng, this.region, this.floorId);\n }\n private loadBoundaryData(reference: OEMAsset): Promise<OEMBoundary[]> {\n const cached = this.boundaryData.get(reference.path);\n if (cached) return Promise.resolve(cached);\n const pending = this.boundaryDataRequests.get(reference.path);\n if (pending) return pending;\n const request = fetchOEMJson<unknown>(resolveOEMAsset(this.options.resources.baseUrl, reference.path), this.options.signal).then((value) => {\n const boundaries = parseBoundaryCollection(value, reference.path);\n this.boundaryData.set(reference.path, boundaries);\n return boundaries;\n }).finally(() => {\n if (this.boundaryDataRequests.get(reference.path) === request) this.boundaryDataRequests.delete(reference.path);\n });\n this.boundaryDataRequests.set(reference.path, request);\n return request;\n }\n /** Preloads OEM subregion geometry so map clicks can resolve an exact subregion. */\n async prepareSubregionBoundaries(): Promise<void> {\n if (!this.region.boundaries) return;\n try { await this.loadBoundaryData(this.region.boundaries); } catch { /* Click metadata has a bounds fallback. */ }\n }\n private inferSubregionId(x: number, z: number): string | undefined {\n const selected = this.filter.subregions?.filter((id) => this.region.subregions.some((subregion) => subregion.id === id));\n const scale = 2 ** this.region.maxNativeZoom;\n const point = { x: x * scale, z: z * scale };\n const allowed = selected?.length ? new Set(selected) : undefined;\n const geometries = this.region.boundaries ? this.boundaryData.get(this.region.boundaries.path) ?? [] : [];\n const scores = geometries\n .filter((boundary) => this.region.subregions.some((subregion) => subregion.id === boundary.id) && (!allowed || allowed.has(boundary.id)))\n .map((boundary) => boundaryScore(boundary, point));\n const inside = scores.filter((score) => score.inside);\n if (inside.length) {\n // Shared OEM polygons can overlap at block boundaries. A point that is\n // close to a candidate's own boundary is close to that region's edge,\n // not deep inside its overall structure. Resolve ambiguity by comparing\n // candidates pairwise and preferring the one with the greater boundary\n // clearance (the inverse of the old nearest-boundary rule).\n const ranked = inside.map((score) => ({ ...score, wins: 0, margin: 0 }));\n for (let leftIndex = 0; leftIndex < ranked.length; leftIndex += 1) {\n for (let rightIndex = leftIndex + 1; rightIndex < ranked.length; rightIndex += 1) {\n const left = ranked[leftIndex];\n const right = ranked[rightIndex];\n const delta = left.distance - right.distance;\n if (Math.abs(delta) <= 1e-9) continue;\n if (delta > 0) {\n left.wins += 1;\n left.margin += delta;\n right.margin -= delta;\n } else {\n right.wins += 1;\n right.margin -= delta;\n left.margin += delta;\n }\n }\n }\n ranked.sort((left, right) => right.wins - left.wins || right.margin - left.margin ||\n right.distance - left.distance || left.id.localeCompare(right.id));\n return ranked[0].id;\n }\n if (scores.length) return undefined;\n\n const bounds = this.region.subregions\n .filter((subregion) => subregion.bounds && (!allowed || allowed.has(subregion.id)))\n .flatMap((subregion) => {\n const [[minX, minZ], [maxX, maxZ]] = subregion.bounds!;\n const insideX = point.x >= minX && point.x <= maxX;\n const insideZ = point.z >= minZ && point.z <= maxZ;\n if (!insideX || !insideZ) return [];\n const dx = Math.min(point.x - minX, maxX - point.x);\n const dz = Math.min(point.z - minZ, maxZ - point.z);\n return [{ id: subregion.id, distance: Math.min(dx, dz) ** 2 }];\n })\n .sort((left, right) => right.distance - left.distance || left.id.localeCompare(right.id));\n return bounds[0]?.id;\n }\n private emitMapClick = (event: L.LeafletMouseEvent): void => {\n if (this.destroyed) return;\n const subregionId = this.inferSubregionId(event.latlng.lng, event.latlng.lat);\n const position: OEMMapPosition = {\n regionId: this.region.id,\n x: event.latlng.lng,\n z: event.latlng.lat,\n floorId: this.floorId,\n ...(subregionId ? { subregionId } : {}),\n };\n if (this.clickPointOptions) {\n const point: OEMCustomPoint = {\n id: `oem-click-point-${++this.clickPointSequence}`,\n position,\n style: this.clickPointOptions.style,\n icon: this.clickPointOptions.icon,\n };\n if (this.clickPointOptions.mode === 'single') this.clickPoints = [point];\n else this.clickPoints.push(point);\n this.renderCustomPoints();\n }\n this.emit('click', { position, game: mapToGameXZPosition(position, this.region) });\n };\n private emit<Event extends keyof OEMEvents>(event: Event, payload: OEMEvents[Event]): void {\n this.listeners.get(event)?.forEach((handler) => handler(payload as never));\n if (event === 'error') this.options.onError?.(payload as Error);\n }\n private scheduleOverdragUpdate = (): void => {\n if (this.overdragFrame !== undefined) return;\n this.overdragFrame = requestAnimationFrame(() => {\n this.overdragFrame = undefined;\n const bounds = toMapBounds(this.map.options.maxBounds);\n const overdragged = !!bounds && isMapOverdragged(this.map, bounds);\n if (overdragged === this.overdragged) return;\n this.overdragged = overdragged;\n this.root.classList.toggle('overdrag', overdragged);\n });\n };\n private clearOverdrag = (): void => {\n if (this.overdragFrame !== undefined) cancelAnimationFrame(this.overdragFrame);\n this.overdragFrame = undefined;\n if (!this.overdragged) return;\n this.overdragged = false;\n this.root.classList.remove('overdrag');\n };\n /** Emits one resolved view for duplicate Leaflet move and zoom events. */\n private emitView = (): void => {\n if (this.destroyed || this.updatingView) return;\n const view = this.getView();\n if (this.emittedView && view.regionId === this.emittedView.regionId &&\n view.floorId === this.emittedView.floorId && view.x === this.emittedView.x &&\n view.z === this.emittedView.z && view.zoom === this.emittedView.zoom) return;\n this.emittedView = view;\n this.emit('viewchange', view);\n this.renderLabels();\n };\n /** Resolves the compact attribution without inheriting the map control font. */\n private updateAttribution(): void {\n const messages = this.manifest.controls[this.resolvedLocale] ?? this.manifest.controls[this.manifest.fallbackLocale];\n if (!messages) throw new Error('Missing OEM attribution messages');\n this.attributionBrand.textContent = messages.brandName;\n this.attributionLink.textContent = messages.termsOfService;\n }\n on<Event extends keyof OEMEvents>(event: Event, handler: (payload: OEMEvents[Event]) => void): () => void {\n this.assertAlive();\n const handlers = this.listeners.get(event) ?? new Set();\n handlers.add(handler as (payload: never) => void);\n this.listeners.set(event, handlers);\n return () => { handlers.delete(handler as (payload: never) => void); };\n }\n /** Rebuilds the base map constraints and main tile layer for one region. */\n private applyRegion(view?: OEMView): void {\n this.updatingView = true;\n this.baseTiles?.remove();\n this.floorTiles?.remove();\n this.floorTiles = undefined;\n this.floorId = 'M';\n this.map.setMaxBounds(L.latLngBounds([]));\n this.map.setMinZoom(this.region.minZoom);\n this.map.setMaxZoom(this.region.maxZoom);\n const target = view ?? this.region.initialView;\n this.map.setView(toOEMLeafletPosition(target, this.region), this.clampZoom(target.zoom), { animate: false });\n this.map.setMaxBounds(this.regionBounds());\n this.baseTiles = this.makeTiles('M').addTo(this.map);\n this.updatingView = false;\n }\n /** Converts the region's published pixel extent to Simple CRS bounds. */\n private regionBounds(): L.LatLngBounds {\n const { x, z } = this.region.boundsOffset;\n return L.latLngBounds(\n toOEMLeafletPosition({ regionId: this.region.id, x, z }, this.region),\n toOEMLeafletPosition({ regionId: this.region.id, x: x + this.region.dimensions[0], z: z + this.region.dimensions[1] }, this.region),\n );\n }\n /** Creates a coverage-aware layer for one region floor. */\n private makeTiles(floorId: string): L.TileLayer {\n const floor = this.region.floors.find((entry) => entry.id === floorId)!;\n const regionId = this.region.id;\n const layer = new CoveredTileLayer(resolveOEMAsset(this.options.resources.baseUrl, floor.tileTemplate), {\n tileSize: this.region.tileSize, noWrap: true, bounds: this.regionBounds(),\n maxNativeZoom: this.region.maxNativeZoom, maxZoom: Math.ceil(this.region.maxZoom),\n }, this.region.coverage, floor);\n layer.on('load', () => { if (!this.destroyed && this.region.id === regionId) this.emit('load', { regionId, floorId }); });\n layer.on('tileerror', () => this.emit('error', new Error(`Tile load failed: ${regionId}/${floorId}`)));\n return layer;\n }\n private clampZoom(zoom: number): number {\n if (!Number.isFinite(zoom)) throw new Error('Zoom must be finite');\n return Math.max(this.region.minZoom, Math.min(this.region.maxZoom, zoom));\n }\n /** Returns the current view in the OEM pixel coordinate system. */\n getView(): OEMView { this.assertAlive(); return { ...this.position(this.map.getCenter()), zoom: this.map.getZoom() }; }\n\n /** Sets the view without exposing Leaflet's coordinate objects. */\n setView(view: OEMView): void {\n this.assertAlive();\n this.validatePosition(view);\n const zoom = this.clampZoom(view.zoom);\n if (view.floorId) this.setFloor(view.floorId);\n this.map.setView(toOEMLeafletPosition(view, this.region), zoom, { animate: false });\n }\n /** Changes zoom around the current center with an optional native transition. */\n setZoom(zoom: number, options: OEMZoomOptions = {}): void {\n this.assertAlive();\n this.map.setZoom(this.clampZoom(zoom), { animate: options.animate ?? false });\n }\n /** Fits the map to an OEM pixel-coordinate extent. */\n fitBounds(bounds: [OEMPosition, OEMPosition]): void {\n this.assertAlive();\n this.map.fitBounds(L.latLngBounds(toOEMLeafletPosition(bounds[0], this.region), toOEMLeafletPosition(bounds[1], this.region)), { animate: false });\n }\n /** Switches regions and reloads only the features currently enabled. */\n async setRegion(regionId: string): Promise<void> {\n this.assertAlive();\n const region = getOEMRegion(this.manifest, regionId);\n if (region === this.region) return;\n this.cancelRequests();\n this.region = region;\n this.points = [];\n this.labels = [];\n this.visibleLabelType = undefined;\n this.clearPointLayers();\n this.labelsLayer.clearLayers();\n this.boundariesLayer.clearLayers();\n this.applyRegion();\n this.renderCustomPoints();\n this.emit('regionchange', { regionId });\n this.emit('floorchange', { floorId: 'M' });\n this.emitView();\n await this.prepareSubregionBoundaries();\n await this.loadFeatures();\n }\n /** Switches the rendered floor while retaining the current region view. */\n setFloor(floorId: string): void {\n this.assertAlive();\n this.validateFloor(floorId);\n if (floorId === this.floorId) return;\n this.floorTiles?.remove();\n this.floorTiles = undefined;\n this.floorId = floorId;\n const base = this.baseTiles?.getContainer();\n if (base) base.style.filter = floorId === 'M' ? 'brightness(1)' : 'brightness(0.5)';\n if (floorId !== 'M') this.floorTiles = this.makeTiles(floorId).addTo(this.map);\n this.renderPoints();\n this.renderCustomPoints();\n this.emit('floorchange', { floorId });\n this.emitView();\n }\n /** Changes label language and applies the manifest fallback chain. */\n async setLocale(locale: string): Promise<void> {\n this.assertAlive();\n const resolved = normalizeOEMLocale(locale, Object.keys(this.manifest.locales), this.manifest.fallbackLocale);\n const changed = resolved !== this.resolvedLocale;\n this.locale = locale;\n if (!changed) return;\n this.resolvedLocale = resolved;\n this.updateAttribution();\n if (this.features.labels) await this.loadFeature('labels');\n }\n /** Returns both the requested and resolved locale values. */\n getLocale(): { requested: string; resolved: string } { return { requested: this.locale, resolved: this.resolvedLocale }; }\n\n /** Changes only this instance's theme attribute. */\n setTheme(theme: 'light' | 'dark'): void { this.assertAlive(); this.root.dataset.theme = theme; }\n\n /** Enables or disables static layers and cancels disabled layer requests. */\n async setFeatures(features: OEMFeatures): Promise<void> {\n this.assertAlive();\n const loads: Promise<void>[] = [];\n if (features.boundarySource !== undefined) {\n if (features.boundarySource !== 'oem' && features.boundarySource !== 'game') {\n throw new Error(`Unknown OEM boundary source: ${features.boundarySource}`);\n }\n if (features.boundarySource !== this.boundarySource) {\n this.boundarySource = features.boundarySource;\n this.cancelRequest('boundaries');\n if (this.features.boundaries) loads.push(this.loadFeature('boundaries'));\n }\n }\n for (const feature of FEATURE_NAMES) {\n if (features[feature] === undefined || features[feature] === this.features[feature]) continue;\n this.features[feature] = features[feature];\n this.cancelRequest(feature);\n if (features[feature]) loads.push(this.loadFeature(feature));\n else if (feature === 'points') { this.points = []; this.clearPointLayers(); }\n else if (feature === 'labels') { this.labels = []; this.visibleLabelType = undefined; this.labelsLayer.clearLayers(); }\n else this.boundariesLayer.clearLayers();\n }\n // Feature payloads are optional runtime data. A CDN or host-side outage\n // should disable only the affected layer; loadFeature already emits the\n // structured error event and clears its loading state.\n await Promise.allSettled(loads);\n }\n\n /** Replaces host-defined points without reloading static map data. */\n setCustomPoints(points: readonly OEMCustomPoint[]): void {\n this.assertAlive();\n this.customPointsRequest?.controller.abort();\n this.customPointsRequest = undefined;\n this.customPoints = this.normalizeCustomPoints(points);\n this.renderCustomPoints();\n }\n\n /** Enables or disables automatic custom-point creation from map clicks. */\n setClickPointMode(options?: OEMClickPointOptions | null): void {\n this.assertAlive();\n this.clickPointOptions = options == null ? undefined : this.normalizeClickPointOptions(options);\n if (this.clickPointOptions?.mode === 'single' && this.clickPoints.length > 1) {\n this.clickPoints = [this.clickPoints.at(-1)!];\n this.renderCustomPoints();\n }\n }\n\n /** Removes only points created by the click-point mode. */\n clearClickPoints(): void {\n this.assertAlive();\n if (!this.clickPoints.length) return;\n this.clickPoints = [];\n this.renderCustomPoints();\n }\n\n loadCustomPoints(url: string): Promise<void> {\n this.assertAlive();\n const value = url.trim();\n if (!value) throw new Error('Custom points URL must be a non-empty URL');\n let resolvedUrl: string;\n try {\n resolvedUrl = new URL(value, document.baseURI).toString();\n } catch {\n throw new Error(`Invalid custom points URL: ${url}`);\n }\n this.customPointsRequest?.controller.abort();\n const controller = new AbortController();\n const abort = () => controller.abort();\n this.options.signal?.addEventListener('abort', abort, { once: true });\n const request: { controller: AbortController; promise: Promise<void> } = { controller, promise: Promise.resolve() };\n request.promise = fetchOEMJson<unknown>(resolvedUrl, controller.signal).then((value) => {\n if (!Array.isArray(value)) throw new Error('Custom points JSON must be an array');\n const points = value.map((point) => {\n if (!point || typeof point !== 'object' || typeof (point as { icon?: unknown }).icon !== 'string') return point as OEMCustomPoint;\n return {\n ...(point as OEMCustomPoint),\n icon: new URL((point as OEMCustomPoint).icon, resolvedUrl).toString(),\n };\n });\n if (controller.signal.aborted || this.destroyed) return;\n this.customPoints = this.normalizeCustomPoints(points);\n this.renderCustomPoints();\n }).finally(() => {\n this.options.signal?.removeEventListener('abort', abort);\n if (this.customPointsRequest === request) this.customPointsRequest = undefined;\n });\n this.customPointsRequest = request;\n return request.promise;\n }\n\n /** Removes all host-defined points from this map instance. */\n clearCustomPoints(): void {\n this.assertAlive();\n this.customPointsRequest?.controller.abort();\n this.customPointsRequest = undefined;\n this.customPoints = [];\n this.renderCustomPoints();\n }\n\n /** Returns a loaded published point from the current region, if available. */\n getPoint(pointId: string): OEMPoint | undefined {\n this.assertAlive();\n const id = pointId.trim();\n if (!id) throw new Error('Point ID must not be empty');\n const point = this.points.find((entry) => entry.id === id);\n return point ? clonePoint(point) : undefined;\n }\n\n /** Loads one published point by using the release point index when available. */\n async loadPoint(pointId: string): Promise<OEMPoint | undefined> {\n this.assertAlive();\n const id = pointId.trim();\n if (!id) throw new Error('Point ID must not be empty');\n const loaded = this.getPoint(id);\n if (loaded) return loaded;\n\n const pointIndex = await this.loadPointIndex();\n this.assertAlive();\n const paths = pointIndex[id]\n ? [pointIndex[id]]\n : this.manifest.pointIndex\n ? []\n : this.manifest.regions.flatMap((region) => region.points.map((ref) => ref.path));\n for (const path of paths) {\n const points = await this.loadPointShard(path);\n const point = points.find((entry) => entry.id === id);\n if (point) return clonePoint(point);\n }\n return undefined;\n }\n\n private async loadPointIndex(): Promise<Record<string, string>> {\n if (!this.manifest.pointIndex) return {};\n if (this.pointIndex) return this.pointIndex;\n if (!this.pointIndexRequest) {\n this.pointIndexRequest = fetchOEMJson<unknown>(\n resolveOEMAsset(this.options.resources.baseUrl, this.manifest.pointIndex.path),\n this.options.signal,\n ).then((value) => {\n if (!value || typeof value !== 'object' || Array.isArray(value)) throw new Error('Invalid OEM point index');\n const index: Record<string, string> = {};\n for (const [id, path] of Object.entries(value)) {\n if (!id || typeof path !== 'string' || !path) throw new Error(`Invalid OEM point index entry: ${id}`);\n resolveOEMAsset(this.options.resources.baseUrl, path);\n index[id] = path;\n }\n this.pointIndex = index;\n return index;\n }).catch((error) => {\n this.pointIndexRequest = undefined;\n throw error;\n });\n }\n return this.pointIndexRequest;\n }\n\n private loadPointShard(path: string): Promise<OEMPoint[]> {\n const cached = this.pointShardRequests.get(path);\n if (cached) return cached;\n const request = fetchOEMJson<unknown>(resolveOEMAsset(this.options.resources.baseUrl, path), this.options.signal).then((value) => {\n const region = this.manifest.regions.find((entry) => entry.points.some((ref) => ref.path === path));\n if (!region || !Array.isArray(value)) throw new Error(`Invalid OEM point shard: ${path}`);\n return this.decodePointShard(value, path, region);\n }).catch((error) => {\n if (this.pointShardRequests.get(path) === request) this.pointShardRequests.delete(path);\n throw error;\n });\n this.pointShardRequests.set(path, request);\n return request;\n }\n\n private decodePointShard(value: unknown[], shardPath: string, region: OEMRegion = this.region): OEMPoint[] {\n const fallbackSubregionId = shardPath.split('/').at(-1)?.replace(/\\.json$/, '') ?? '';\n return value\n .map((entry) => decodeAtlosPoint(entry as AtlosPointTuple | AtlosPointObject, region, fallbackSubregionId))\n .filter((entry): entry is OEMPoint => !!entry);\n }\n\n private cancelRequest(feature: OEMFeatureName): void {\n if (!this.requests.has(feature)) return;\n this.requests.get(feature)!.abort();\n this.requests.delete(feature);\n this.emit('loading', { feature, loading: false });\n }\n private cancelRequests(): void { for (const feature of this.requests.keys()) this.cancelRequest(feature); }\n private async loadFeatures(): Promise<void> {\n await Promise.allSettled(FEATURE_NAMES.filter((feature) => this.features[feature]).map((feature) => this.loadFeature(feature)));\n }\n /** Loads one feature with a request token so stale responses are ignored. */\n private async loadFeature(feature: OEMFeatureName): Promise<void> {\n this.cancelRequest(feature);\n const request = new AbortController();\n this.requests.set(feature, request);\n this.emit('loading', { feature, loading: true });\n const read = <Data>(ref: OEMAsset) => fetchOEMJson<Data>(resolveOEMAsset(this.options.resources.baseUrl, ref.path), request.signal);\n try {\n if (feature === 'points') {\n const [groups, types] = await Promise.all([\n Promise.all(this.region.points.map(async (ref) => {\n const value = await read<unknown[]>(ref);\n if (!Array.isArray(value)) throw new Error(`Invalid OEM point shard: ${ref.path}`);\n return this.decodePointShard(value, ref.path);\n })),\n Object.keys(this.types).length ? this.types : read<Record<string, OEMPointType>>(this.manifest.types),\n ]);\n if (request.signal.aborted) return;\n this.points = groups.flat();\n this.types = types;\n this.renderPoints();\n } else if (feature === 'labels') {\n const [labels, messages] = await Promise.all([\n this.region.labels ? read<OEMLabel[]>(this.region.labels) : Promise.resolve([]),\n this.manifest.locales[this.resolvedLocale] ? read<OEMLocaleMessages>(this.manifest.locales[this.resolvedLocale]) : Promise.resolve({}),\n ]);\n if (request.signal.aborted) return;\n this.labels = labels;\n this.messages = messages;\n this.renderLabels(true);\n } else {\n const reference = this.boundarySource === 'game' ? this.region.gameBoundaries : this.region.boundaries;\n const boundaries = reference ? await this.loadBoundaryData(reference) : [];\n if (request.signal.aborted) return;\n this.renderBoundaries(boundaries);\n }\n } catch (error) {\n if (!request.signal.aborted) {\n this.features[feature] = false;\n this.emit('error', error instanceof Error ? error : new Error(String(error)));\n throw error;\n }\n } finally {\n if (this.requests.get(feature) === request) {\n this.requests.delete(feature);\n this.emit('loading', { feature, loading: false });\n }\n }\n }\n /** Applies a client-side filter without making another network request. */\n setPointFilter(filter: OEMPointFilter): void {\n this.assertAlive();\n const next = cloneFilter(filter);\n if (sameFilter(this.filter, next)) return;\n this.filter = next;\n this.renderPoints();\n }\n\n /** Enables or disables Atlos-style marker clustering without reloading point data. */\n setMarkerClustering(enabled: boolean): void {\n this.assertAlive();\n if (enabled === this.markerClustering) return;\n this.markerClustering = enabled;\n this.renderPoints();\n }\n\n private clearPointLayers(): void {\n this.pointsLayer.clearLayers();\n for (const group of this.pointClusters.values()) {\n group.clearLayers();\n group.remove();\n }\n this.pointClusters.clear();\n }\n\n private createCustomPointVisual(point: OEMCustomPoint): HTMLElement {\n const inner = document.createElement('div');\n inner.className = point.style === 'no-frame' ? 'noFrameInner' : 'markerInner';\n inner.setAttribute('aria-label', point.id);\n if (point.position.floorId && point.position.floorId !== this.floorId) inner.classList.add('offLayer');\n const image = document.createElement('img');\n image.src = point.icon;\n image.alt = point.id;\n image.draggable = false;\n if (point.style === 'no-frame') {\n image.className = 'noFrameImage';\n inner.append(image);\n } else {\n const frame = document.createElement('div');\n frame.className = 'frameImage';\n frame.append(image);\n inner.append(frame);\n }\n return inner;\n }\n\n private renderCustomPoints(): void {\n this.customPointsLayer.clearLayers();\n for (const point of [...this.customPoints, ...this.clickPoints]) {\n if (point.position.regionId !== this.region.id) continue;\n const marker = new OEMMarker(toOEMLeafletMapPosition(point.position), {\n interactive: false,\n keyboard: false,\n bubblingMouseEvents: false,\n icon: L.divIcon({\n html: this.createCustomPointVisual(point),\n className: `${point.style === 'no-frame' ? 'noFrameMarkerIcon' : 'frameMarkerIcon'} incompleteMarker`,\n iconSize: point.style === 'no-frame' ? [50, 50] : [32, 32],\n iconAnchor: point.style === 'no-frame' ? [25, 25] : [16, 32],\n }),\n });\n marker.addTo(this.customPointsLayer);\n }\n }\n\n /** Builds the shared Atlos marker composition for points and cluster summaries. */\n private createMarkerVisual(type: OEMPointType, point?: OEMPoint, count?: number): HTMLElement {\n const inner = document.createElement(point ? 'a' : 'div');\n inner.className = type.noFrame ? 'noFrameInner' : 'markerInner';\n if (point) {\n const link = inner as HTMLAnchorElement;\n link.href = createOEMPointUrl(point.id);\n link.target = '_blank';\n link.rel = 'noopener noreferrer';\n inner.classList.toggle('offLayer', point.position.floorId !== this.floorId);\n if (point.tier) inner.dataset.tier = point.position.floorId;\n }\n if (count !== undefined) inner.classList.add('clusterMarker');\n const image = document.createElement('img');\n image.src = resolveOEMAsset(this.options.resources.baseUrl, type.icon);\n image.alt = type.key;\n image.draggable = false;\n if (type.noFrame) {\n image.className = 'noFrameImage';\n inner.append(image);\n } else {\n const frame = document.createElement('div');\n frame.className = 'frameImage';\n frame.append(image);\n inner.append(frame);\n }\n if (type.subIcon) {\n const sub = document.createElement('div');\n sub.className = 'subIconContainer';\n const subImage = document.createElement('img');\n subImage.className = 'subIcon';\n subImage.src = resolveOEMAsset(this.options.resources.baseUrl, type.subIcon);\n subImage.alt = '';\n sub.append(subImage);\n inner.append(sub);\n }\n if (count !== undefined) {\n const badge = document.createElement('span');\n badge.className = 'clusterCount';\n badge.textContent = String(count);\n inner.append(badge);\n }\n return inner;\n }\n\n private createPointMarker(point: OEMPoint, type: OEMPointType): OEMMarker {\n return new OEMMarker(toOEMLeafletPosition(point.position, this.region), {\n interactive: true, keyboard: false, bubblingMouseEvents: false,\n icon: L.divIcon({ html: this.createMarkerVisual(type, point),\n className: `${type.noFrame ? 'noFrameMarkerIcon' : 'frameMarkerIcon'} incompleteMarker`,\n iconSize: type.noFrame ? [50, 50] : [32, 32], iconAnchor: type.noFrame ? [25, 25] : [16, 32] }),\n });\n }\n\n private createPointCluster(type: OEMPointType): L.MarkerClusterGroup {\n return L.markerClusterGroup({\n showCoverageOnHover: false,\n zoomToBoundsOnClick: !this.options.lockZoom,\n spiderfyOnMaxZoom: !this.options.lockZoom,\n disableClusteringAtZoom: 2,\n maxClusterRadius: 60,\n iconCreateFunction: (cluster) => L.divIcon({\n html: this.createMarkerVisual(type, undefined, cluster.getChildCount()),\n className: `${type.noFrame ? 'noFrameMarkerIcon' : 'frameMarkerIcon'} markerClusterCustom`,\n iconSize: type.noFrame ? [50, 50] : [32, 32],\n iconAnchor: type.noFrame ? [25, 25] : [16, 32],\n }),\n });\n }\n\n /** Rebuilds visible markers and groups eligible types with Atlos clustering rules. */\n private renderPoints(): void {\n this.clearPointLayers();\n const types = this.filter.types ? new Set(this.filter.types) : undefined;\n const subregions = this.filter.subregions ? new Set(this.filter.subregions) : undefined;\n for (const point of this.points) {\n if (types && !types.has(point.type)) continue;\n if (subregions && !subregions.has(point.subregionId)) continue;\n if (this.filter.floorOnly && point.position.floorId !== this.floorId) continue;\n const type = this.types[point.type];\n if (!type) continue;\n const marker = this.createPointMarker(point, type);\n if (this.markerClustering && CLUSTER_SUBCATEGORIES.has(type.category.sub)) {\n let group = this.pointClusters.get(type.key);\n if (!group) {\n group = this.createPointCluster(type);\n this.pointClusters.set(type.key, group);\n }\n group.addLayer(marker);\n } else marker.addTo(this.pointsLayer);\n }\n for (const group of this.pointClusters.values()) if (group.getLayers().length) group.addTo(this.map);\n }\n\n /** Renders Atlos-style fill and dashed stroke layers for published subregions. */\n private renderBoundaries(boundaries: OEMBoundary[]): void {\n this.boundariesLayer.clearLayers();\n for (const boundary of boundaries) {\n const rings = boundary.rings.map((ring) => ring.map((position) =>\n toOEMLeafletPosition({ ...position, regionId: this.region.id }, this.region)));\n L.polygon(rings, { color: 'transparent', fillOpacity: 0.2, interactive: false,\n className: 'subregionBoundaryFill' }).addTo(this.boundariesLayer);\n L.polygon(rings, { weight: 2, opacity: 0.8, fill: false, interactive: false,\n className: 'subregionBoundaryStroke' }).addTo(this.boundariesLayer);\n }\n }\n /** Renders Atlos site or subregion labels according to the current zoom. */\n private renderLabels(force = false): void {\n const showSub = this.map.getZoom() <= 0.25 && this.labels.some((label) => label.type === 'sub');\n const visibleType: OEMLabel['type'] = showSub ? 'sub' : 'site';\n if (!force && visibleType === this.visibleLabelType) return;\n this.visibleLabelType = visibleType;\n this.labelsLayer.clearLayers();\n for (const label of this.labels) {\n if (label.type !== visibleType) continue;\n const inner = document.createElement('div');\n inner.className = label.type === 'sub' ? 'innerSub' : 'innerSite';\n inner.textContent = this.messages[label.textKey] ?? label.id.split('/').at(-1) ?? label.id;\n new OEMMarker(toOEMLeafletPosition(label.position, this.region), {\n pane: 'placeLabels', interactive: false, keyboard: false,\n icon: L.divIcon({ className: 'mapLabel', html: inner, iconSize: [0, 0] }),\n }).addTo(this.labelsLayer);\n }\n }\n /** Recalculates Leaflet dimensions after the host element changes size. */\n resize(): void { if (!this.destroyed) this.map.invalidateSize({ animate: false }); }\n\n /** Releases listeners, observers, pending requests, layers and DOM nodes. */\n destroy = (): void => {\n if (this.destroyed) return;\n this.destroyed = true;\n this.cancelRequests();\n this.customPointsRequest?.controller.abort();\n this.customPointsRequest = undefined;\n if (this.overdragFrame !== undefined) cancelAnimationFrame(this.overdragFrame);\n this.observer?.disconnect();\n this.wheel.dispose();\n this.options.signal?.removeEventListener('abort', this.destroy);\n this.listeners.clear();\n this.map.remove();\n this.root.remove();\n this.points = [];\n this.customPoints = [];\n this.clickPoints = [];\n this.clickPointOptions = undefined;\n this.customPointsLayer.clearLayers();\n this.pointShardRequests.clear();\n mounted.delete(this.container);\n };\n}\n", "import L from 'leaflet';\nimport { WHEEL_GESTURE_IDLE_MS, WheelInputRouter, type WheelGestureMode, } from 'trackpad-input';\nconst ZOOM_PER_WHEEL_PIXEL = 0.003;\nconst TRACKPAD_PINCH_ZOOM_PER_PIXEL = 0.01;\nconst INERTIA_INITIAL_FACTOR = 0.07;\nconst INERTIA_MAX_STEP = 0.008;\nconst INERTIA_FRICTION_PER_FRAME = 0.72;\nconst INERTIA_STOP_THRESHOLD = 0.00025;\nconst FRAME_DURATION = 1000 / 60;\nconst TRACKPAD_OVERDRAG_MAX_PX = 96;\nconst TRACKPAD_OVERDRAG_RESISTANCE = 0.65;\nconst TRACKPAD_OVERDRAG_SETTLE_THRESHOLD_PX = 80;\nconst TRACKPAD_OVERDRAG_SETTLE_MS = 48;\ninterface ContinuousZoomEventData {\n pinch: true;\n round: false;\n}\nconst CONTINUOUS_ZOOM_EVENT_DATA: ContinuousZoomEventData = {\n pinch: true,\n round: false,\n};\nexport interface SmoothWheelZoomOptions {\n /** Enables inertial continuation after wheel zoom input. */\n enableInertia?: boolean;\n /** Enables trackpad gestures classified as map panning. */\n panEnabled?: boolean;\n /** Enables wheel and trackpad gestures classified as map zooming. */\n zoomEnabled?: boolean;\n}\ninterface ContinuousZoomMap extends L.Map {\n _animatingZoom?: boolean;\n _getMapPanePos(): L.Point;\n _getNewPixelOrigin(center: L.LatLng, zoom: number): L.Point;\n _latLngToNewLayerPoint(latLng: L.LatLng, zoom: number, center: L.LatLng): L.Point;\n _limitCenter(center: L.LatLng, zoom: number, bounds: L.LatLngBounds): L.LatLng;\n _limitZoom(zoom: number): number;\n _move(center: L.LatLng, zoom: number, data?: ContinuousZoomEventData): this;\n _moveEnd(zoomChanged: boolean): this;\n _moveStart(zoomChanged: boolean, noMoveStart: boolean): this;\n _onZoomTransitionEnd?(): void;\n _rawPanBy(offset: L.Point): void;\n _stop(): this;\n}\ninterface SubpixelMarker {\n _icon?: HTMLElement;\n _latlng: L.LatLng;\n _map?: ContinuousZoomMap;\n _setPos(point: L.Point): void;\n}\ninterface MarkerZoomAnimation {\n center: L.LatLng;\n zoom: number;\n}\nconst installSubpixelPixelOrigin = (map: ContinuousZoomMap) => {\n map._getNewPixelOrigin = function (center, zoom) {\n return this.project(center, zoom)\n .subtract(this.getSize().divideBy(2))\n .add(this._getMapPanePos());\n };\n map.latLngToLayerPoint = function (latLng) {\n return this.project(latLng, this.getZoom()).subtract(this.getPixelOrigin());\n };\n};\nexport class SmoothWheelZoom {\n private readonly map: ContinuousZoomMap;\n private readonly container: HTMLElement;\n private readonly inertiaEnabled: boolean;\n private readonly panEnabled: boolean;\n private readonly zoomEnabled: boolean;\n private readonly wheelInputRouter: WheelInputRouter<WheelEvent>;\n private zoomFrame: number | null = null;\n private panFrame: number | null = null;\n private endTimer: number | null = null;\n private panTailTimer: number | null = null;\n private targetZoom: number | null = null;\n private anchorPoint: L.Point | null = null;\n private anchorLatLng: L.LatLng | null = null;\n private zoomVelocity = 0;\n private lastZoomInputTime: number | null = null;\n private inertiaStep = 0;\n private lastFrameTime: number | null = null;\n private pendingPanOffset = L.point(0, 0);\n private panRawCenterPoint: L.Point | null = null;\n private gestureMode: WheelGestureMode | null = null;\n private gestureActive = false;\n private trackpadDragging = false;\n private overdragSettling = false;\n private disposed = false;\n constructor(map: L.Map, options: SmoothWheelZoomOptions = {}) {\n this.map = map as ContinuousZoomMap;\n this.container = map.getContainer();\n this.inertiaEnabled = options.enableInertia ?? true;\n this.panEnabled = options.panEnabled ?? true;\n this.zoomEnabled = options.zoomEnabled ?? true;\n this.wheelInputRouter = new WheelInputRouter<WheelEvent>({\n onPan: (event) => this.handleRoutedWheel('pan', event),\n onZoom: (event) => this.handleRoutedWheel('zoom', event),\n });\n installSubpixelPixelOrigin(this.map);\n map.scrollWheelZoom.disable();\n this.container.addEventListener('wheel', this.handleWheel, {\n passive: false,\n });\n map.once('unload', this.dispose);\n }\n dispose = () => {\n if (this.disposed)\n return;\n this.disposed = true;\n this.container.removeEventListener('wheel', this.handleWheel);\n this.map.off('unload', this.dispose);\n this.clearScheduledWork();\n };\n private handleWheel = (event: WheelEvent) => {\n event.preventDefault();\n event.stopPropagation();\n this.finishLeafletZoomAnimation();\n const gestureMode = this.wheelInputRouter.route(event);\n if (gestureMode === 'pending' && this.overdragSettling) {\n this.clearOverdragSettlement();\n }\n };\n private handleRoutedWheel(gestureMode: WheelGestureMode, event: WheelEvent) {\n if ((gestureMode === 'pan' && !this.panEnabled) || (gestureMode === 'zoom' && !this.zoomEnabled))\n return;\n if (this.overdragSettling && gestureMode === 'pan') {\n this.schedulePanTailRelease();\n return;\n }\n if (this.overdragSettling)\n this.clearOverdragSettlement();\n this.routeWheelEvent(gestureMode, event);\n }\n private routeWheelEvent(gestureMode: WheelGestureMode, event: WheelEvent) {\n if (this.gestureActive &&\n this.gestureMode !== null &&\n this.gestureMode !== gestureMode) {\n this.finishGesture();\n }\n this.gestureMode = gestureMode;\n if (gestureMode === 'pan') {\n this.handleTrackpadPan(event);\n return;\n }\n this.handleZoom(event);\n }\n private handleZoom(event: WheelEvent) {\n const wheelDelta = L.DomEvent.getWheelDelta(event);\n if (!wheelDelta)\n return;\n const zoomDelta = event.ctrlKey && event.deltaMode === 0\n ? -event.deltaY * TRACKPAD_PINCH_ZOOM_PER_PIXEL\n : wheelDelta * ZOOM_PER_WHEEL_PIXEL;\n const currentTarget = this.targetZoom ?? this.map.getZoom();\n const nextTarget = this.map._limitZoom(currentTarget + zoomDelta);\n this.updateAnchor(event);\n this.targetZoom = nextTarget;\n if (this.inertiaEnabled) {\n this.updateZoomVelocity(nextTarget - currentTarget, performance.now());\n this.inertiaStep = Math.max(-INERTIA_MAX_STEP, Math.min(INERTIA_MAX_STEP, this.zoomVelocity * INERTIA_INITIAL_FACTOR));\n }\n else {\n this.inertiaStep = 0;\n }\n if (nextTarget !== this.map.getZoom())\n this.startGesture(true);\n if (this.gestureActive &&\n nextTarget !== this.map.getZoom() &&\n this.zoomFrame === null) {\n this.zoomFrame = requestAnimationFrame(this.applyZoomFrame);\n }\n this.scheduleGestureEnd();\n }\n private handleTrackpadPan(event: WheelEvent) {\n const offset = L.point(event.deltaX, event.deltaY);\n if (offset.x === 0 && offset.y === 0) {\n if (this.gestureActive && !this.overdragSettling) {\n this.scheduleGestureEnd();\n }\n return;\n }\n const wasActive = this.gestureActive;\n this.startGesture(false);\n if (!wasActive) {\n this.trackpadDragging = true;\n this.map.fire('dragstart');\n }\n this.pendingPanOffset = this.pendingPanOffset.add(offset);\n if (this.panFrame === null) {\n this.panFrame = requestAnimationFrame(this.applyPanFrame);\n }\n if (!this.overdragSettling)\n this.scheduleGestureEnd();\n }\n private startGesture(zoomChanged: boolean) {\n if (this.gestureActive)\n return;\n this.map._stop();\n this.map._moveStart(zoomChanged, false);\n this.gestureActive = true;\n }\n private updateAnchor(event: WheelEvent) {\n const point = this.map.mouseEventToContainerPoint(event);\n if (this.anchorPoint?.equals(point) && this.anchorLatLng !== null) {\n return;\n }\n this.anchorPoint = point;\n this.anchorLatLng = this.continuousContainerPointToLatLng(point);\n }\n private continuousContainerPointToLatLng(point: L.Point) {\n const centerPoint = this.map.getSize().divideBy(2);\n const center = this.map.getCenter();\n const zoom = this.map.getZoom();\n return this.map.unproject(this.map.project(center, zoom).add(point.subtract(centerPoint)), zoom);\n }\n private updateZoomVelocity(delta: number, timestamp: number) {\n if (this.lastZoomInputTime === null ||\n delta * this.zoomVelocity <= 0 ||\n timestamp - this.lastZoomInputTime > WHEEL_GESTURE_IDLE_MS) {\n this.zoomVelocity = delta;\n }\n else {\n const elapsed = Math.max(8, Math.min(40, timestamp - this.lastZoomInputTime));\n const frameDelta = delta * (FRAME_DURATION / elapsed);\n this.zoomVelocity = this.zoomVelocity * 0.65 + frameDelta * 0.35;\n }\n this.lastZoomInputTime = timestamp;\n }\n private applyZoomFrame = (timestamp: number) => {\n this.zoomFrame = null;\n if (!this.gestureActive)\n return;\n const elapsed = this.lastFrameTime === null\n ? FRAME_DURATION\n : Math.max(8, Math.min(34, timestamp - this.lastFrameTime));\n this.lastFrameTime = timestamp;\n const currentZoom = this.map.getZoom();\n const directTarget = this.targetZoom;\n let zoom = directTarget ?? currentZoom;\n this.targetZoom = null;\n if (this.inertiaEnabled && directTarget === null) {\n if (Math.abs(this.inertiaStep) < INERTIA_STOP_THRESHOLD) {\n this.inertiaStep = 0;\n }\n else {\n const zoomBeforeInertia = zoom;\n zoom = this.map._limitZoom(zoom + this.inertiaStep * (elapsed / FRAME_DURATION));\n if (zoom === zoomBeforeInertia) {\n this.inertiaStep = 0;\n }\n else {\n this.inertiaStep *= Math.pow(INERTIA_FRICTION_PER_FRAME, elapsed / FRAME_DURATION);\n }\n }\n }\n if (zoom !== currentZoom) {\n this.moveToZoom(zoom);\n }\n if (this.targetZoom !== null ||\n (this.inertiaEnabled &&\n Math.abs(this.inertiaStep) >= INERTIA_STOP_THRESHOLD)) {\n this.zoomFrame = requestAnimationFrame(this.applyZoomFrame);\n return;\n }\n this.lastFrameTime = null;\n if (this.endTimer === null) {\n this.finishGesture();\n }\n };\n private applyPanFrame = () => {\n this.panFrame = null;\n if (!this.gestureActive || this.gestureMode !== 'pan')\n return;\n const offset = this.pendingPanOffset;\n this.pendingPanOffset = L.point(0, 0);\n if (offset.x !== 0 || offset.y !== 0) {\n const overdragAmount = this.applyConstrainedPan(offset);\n this.map.fire('move').fire('drag');\n if (overdragAmount >= TRACKPAD_OVERDRAG_SETTLE_THRESHOLD_PX) {\n this.beginOverdragSettlement();\n }\n }\n if (this.pendingPanOffset.x !== 0 || this.pendingPanOffset.y !== 0) {\n this.panFrame = requestAnimationFrame(this.applyPanFrame);\n return;\n }\n if (this.endTimer === null) {\n this.finishGesture();\n }\n };\n private applyConstrainedPan(offset: L.Point) {\n const zoom = this.map.getZoom();\n const currentCenterPoint = this.map.project(this.map.getCenter(), zoom);\n this.panRawCenterPoint ??= currentCenterPoint;\n this.panRawCenterPoint = this.panRawCenterPoint.add(offset);\n const configuredBounds = this.map.options.maxBounds;\n if (!configuredBounds) {\n this.map._rawPanBy(offset);\n return 0;\n }\n const maxBounds = configuredBounds instanceof L.LatLngBounds\n ? configuredBounds\n : L.latLngBounds(configuredBounds);\n const rawCenter = this.map.unproject(this.panRawCenterPoint, zoom);\n const limitedCenter = this.map._limitCenter(rawCenter, zoom, maxBounds);\n const limitedCenterPoint = this.map.project(limitedCenter, zoom);\n const rawOverdrag = this.panRawCenterPoint.subtract(limitedCenterPoint);\n const visualOverdrag = L.point(this.resistOverdrag(rawOverdrag.x), this.resistOverdrag(rawOverdrag.y));\n const visualCenterPoint = limitedCenterPoint.add(visualOverdrag);\n const visualOffset = visualCenterPoint.subtract(currentCenterPoint);\n if (visualOffset.x !== 0 || visualOffset.y !== 0) {\n this.map._rawPanBy(visualOffset);\n }\n return Math.max(Math.abs(visualOverdrag.x), Math.abs(visualOverdrag.y));\n }\n private resistOverdrag(value: number) {\n if (value === 0)\n return 0;\n const magnitude = TRACKPAD_OVERDRAG_MAX_PX *\n (1 -\n Math.exp((-Math.abs(value) * TRACKPAD_OVERDRAG_RESISTANCE) /\n TRACKPAD_OVERDRAG_MAX_PX));\n return Math.sign(value) * magnitude;\n }\n private beginOverdragSettlement() {\n if (this.overdragSettling)\n return;\n this.overdragSettling = true;\n this.schedulePanTailRelease();\n if (this.endTimer !== null)\n window.clearTimeout(this.endTimer);\n this.endTimer = window.setTimeout(this.handleGestureEnd, TRACKPAD_OVERDRAG_SETTLE_MS);\n }\n private schedulePanTailRelease() {\n if (this.panTailTimer !== null) {\n window.clearTimeout(this.panTailTimer);\n }\n this.panTailTimer = window.setTimeout(() => {\n this.panTailTimer = null;\n this.overdragSettling = false;\n }, WHEEL_GESTURE_IDLE_MS);\n }\n private clearOverdragSettlement() {\n this.overdragSettling = false;\n if (this.panTailTimer !== null) {\n window.clearTimeout(this.panTailTimer);\n this.panTailTimer = null;\n }\n }\n private moveToZoom(zoom: number) {\n if (this.anchorPoint === null || this.anchorLatLng === null)\n return;\n const centerPoint = this.map.getSize().divideBy(2);\n const cursorOffset = this.anchorPoint.subtract(centerPoint);\n let center = this.map.unproject(this.map.project(this.anchorLatLng, zoom).subtract(cursorOffset), zoom);\n const configuredBounds = this.map.options.maxBounds;\n if (configuredBounds) {\n const maxBounds = configuredBounds instanceof L.LatLngBounds\n ? configuredBounds\n : L.latLngBounds(configuredBounds);\n center = this.map._limitCenter(center, zoom, maxBounds);\n }\n this.map._move(center, zoom, CONTINUOUS_ZOOM_EVENT_DATA);\n }\n private scheduleGestureEnd() {\n if (this.endTimer !== null) {\n window.clearTimeout(this.endTimer);\n }\n this.endTimer = window.setTimeout(this.handleGestureEnd, WHEEL_GESTURE_IDLE_MS);\n }\n private handleGestureEnd = () => {\n this.endTimer = null;\n if (this.zoomFrame === null &&\n this.panFrame === null &&\n this.targetZoom === null &&\n this.pendingPanOffset.x === 0 &&\n this.pendingPanOffset.y === 0 &&\n (!this.inertiaEnabled ||\n Math.abs(this.inertiaStep) < INERTIA_STOP_THRESHOLD)) {\n this.finishGesture();\n }\n };\n private finishGesture() {\n if (this.endTimer !== null) {\n window.clearTimeout(this.endTimer);\n this.endTimer = null;\n }\n if (this.zoomFrame !== null) {\n cancelAnimationFrame(this.zoomFrame);\n this.zoomFrame = null;\n }\n if (this.panFrame !== null) {\n cancelAnimationFrame(this.panFrame);\n this.panFrame = null;\n }\n if (!this.gestureActive) {\n this.resetVisualState();\n return;\n }\n const wasTrackpadDrag = this.trackpadDragging;\n this.gestureActive = false;\n this.trackpadDragging = false;\n if (wasTrackpadDrag)\n this.map.fire('dragend');\n this.map._moveEnd(this.gestureMode === 'zoom');\n this.resetVisualState();\n }\n private finishLeafletZoomAnimation() {\n if (this.map._animatingZoom) {\n this.map._onZoomTransitionEnd?.();\n }\n }\n private resetVisualState() {\n this.targetZoom = null;\n this.anchorPoint = null;\n this.anchorLatLng = null;\n this.zoomVelocity = 0;\n this.lastZoomInputTime = null;\n this.inertiaStep = 0;\n this.lastFrameTime = null;\n this.pendingPanOffset = L.point(0, 0);\n this.panRawCenterPoint = null;\n this.gestureMode = null;\n this.trackpadDragging = false;\n }\n private clearScheduledWork() {\n if (this.zoomFrame !== null) {\n cancelAnimationFrame(this.zoomFrame);\n this.zoomFrame = null;\n }\n if (this.panFrame !== null) {\n cancelAnimationFrame(this.panFrame);\n this.panFrame = null;\n }\n if (this.endTimer !== null) {\n window.clearTimeout(this.endTimer);\n this.endTimer = null;\n }\n this.clearOverdragSettlement();\n this.gestureActive = false;\n this.resetVisualState();\n this.wheelInputRouter.dispose();\n }\n}\nexport const enableSmoothWheelZoom = (map: L.Map, options?: SmoothWheelZoomOptions) => new SmoothWheelZoom(map, options);\n", "import L from 'leaflet';\ninterface BoundsAwareMap extends L.Map {\n _limitCenter(center: L.LatLng, zoom: number, bounds: L.LatLngBounds): L.LatLng;\n}\nexport const toMapBounds = (bounds: L.Map['options']['maxBounds']): L.LatLngBounds | null => {\n if (!bounds)\n return null;\n if (bounds instanceof L.LatLngBounds)\n return bounds;\n return Array.isArray(bounds) && bounds.length === 2\n ? L.latLngBounds(bounds[0], bounds[1])\n : null;\n};\nexport const isMapOverdragged = (map: L.Map, bounds: L.LatLngBounds): boolean => {\n const constrainedMap = map as BoundsAwareMap;\n const center = map.getCenter();\n const constrainedCenter = constrainedMap._limitCenter(center, map.getZoom(), bounds);\n return (map\n .project(center, map.getZoom())\n .distanceTo(map.project(constrainedCenter, map.getZoom())) > 1);\n};\n", "<svg width=\"83\" height=\"81\" viewBox=\"0 0 83 81\" xmlns=\"http://www.w3.org/2000/svg\">\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M41.3763 0C18.4963 0 0 18.5625 0 41.5268C0 59.8835 11.8512 75.422 28.292 80.9215C30.3475 81.335 31.1004 80.028 31.1004 78.9286C31.1004 77.9659 31.0327 74.666 31.0327 71.2277C19.5228 73.7032 17.1259 66.2774 17.1259 66.2774C15.2762 61.4647 12.5355 60.2277 12.5355 60.2277C8.76836 57.6838 12.8099 57.6838 12.8099 57.6838C16.9887 57.9589 19.1815 61.9464 19.1815 61.9464C22.8801 68.2712 28.84 66.4841 31.2376 65.3839C31.5798 62.7024 32.6766 60.8462 33.8411 59.8151C24.6612 58.8524 15.0027 55.2774 15.0027 39.3263C15.0027 34.7887 16.6457 31.0762 19.2492 28.1888C18.8385 27.1578 17.3995 22.8943 19.6608 17.188C19.6608 17.188 23.1545 16.0878 31.0318 21.4507C34.4044 20.5417 37.8825 20.0792 41.3763 20.0753C44.87 20.0753 48.4314 20.5571 51.72 21.4507C59.5982 16.0878 63.0919 17.188 63.0919 17.188C65.3532 22.8943 63.9134 27.1578 63.5026 28.1888C66.1747 31.0762 67.75 34.7887 67.75 39.3263C67.75 55.2774 58.0915 58.7832 48.843 59.8151C50.3505 61.1213 51.6514 63.596 51.6514 67.5152C51.6514 73.0839 51.5837 77.5533 51.5837 78.9277C51.5837 80.028 52.3374 81.335 54.3921 80.9224C70.8329 75.4211 82.6841 59.8835 82.6841 41.5268C82.7518 18.5625 64.1878 0 41.3763 0Z\"/>\n</svg>\n", "import type { OEMBoundary, OEMBoundaryCollection, OEMBoundaryPoint } from '@opendfieldmap/core';\n\nexport type GeometryPoint = { x: number; z: number };\n\n/** Validates the readable boundary collection format used by both data sources. */\nexport const parseBoundaryCollection = (value: unknown, path: string): OEMBoundary[] => {\n // Immutable releases predating the collection wrapper remain readable.\n const collection = Array.isArray(value)\n ? { count: value.length, boundaries: value }\n : value as Partial<OEMBoundaryCollection> | null;\n if (!collection || !Number.isInteger(collection.count) || !Array.isArray(collection.boundaries) ||\n collection.count !== collection.boundaries.length) {\n throw new Error(`Invalid OEM boundary data: ${path}`);\n }\n for (const boundary of collection.boundaries as OEMBoundary[]) {\n if (!boundary || typeof boundary.id !== 'string' || !boundary.id || !Array.isArray(boundary.rings) ||\n boundary.rings.some((ring: OEMBoundaryPoint[]) => !Array.isArray(ring) || ring.length < 3 ||\n ring.some((point: OEMBoundaryPoint) => !point || !Number.isFinite(point.x) || !Number.isFinite(point.z)))) {\n throw new Error(`Invalid OEM boundary data: ${path}`);\n }\n }\n return collection.boundaries as OEMBoundary[];\n};\n\nconst pointOnSegment = (point: GeometryPoint, start: GeometryPoint, end: GeometryPoint): boolean => {\n const cross = (point.x - start.x) * (end.z - start.z) - (point.z - start.z) * (end.x - start.x);\n if (Math.abs(cross) > 1e-7) return false;\n return point.x >= Math.min(start.x, end.x) - 1e-7 && point.x <= Math.max(start.x, end.x) + 1e-7 &&\n point.z >= Math.min(start.z, end.z) - 1e-7 && point.z <= Math.max(start.z, end.z) + 1e-7;\n};\n\nconst pointInRing = (point: GeometryPoint, ring: readonly GeometryPoint[]): boolean => {\n let inside = false;\n for (let index = 0, previous = ring.length - 1; index < ring.length; previous = index++) {\n const current = ring[index];\n const prior = ring[previous];\n if (pointOnSegment(point, prior, current)) return true;\n const crosses = (current.z > point.z) !== (prior.z > point.z);\n if (crosses && point.x < (prior.x - current.x) * (point.z - current.z) / (prior.z - current.z) + current.x) inside = !inside;\n }\n return inside;\n};\n\nconst distanceSquaredToSegment = (point: GeometryPoint, start: GeometryPoint, end: GeometryPoint): number => {\n const dx = end.x - start.x;\n const dz = end.z - start.z;\n const lengthSquared = dx * dx + dz * dz;\n if (!lengthSquared) return (point.x - start.x) ** 2 + (point.z - start.z) ** 2;\n const projection = Math.max(0, Math.min(1, ((point.x - start.x) * dx + (point.z - start.z) * dz) / lengthSquared));\n const nearestX = start.x + projection * dx;\n const nearestZ = start.z + projection * dz;\n return (point.x - nearestX) ** 2 + (point.z - nearestZ) ** 2;\n};\n\n/** Scores a boundary for hit-testing, including polygon holes and edge distance. */\nexport const boundaryScore = (boundary: OEMBoundary, point: GeometryPoint): { id: string; inside: boolean; distance: number } => {\n const rings = boundary.rings.map((ring) => ring as readonly GeometryPoint[]);\n const distances = rings.flatMap((ring) => ring.map((start, index) =>\n distanceSquaredToSegment(point, start, ring[(index + 1) % ring.length])));\n const insideOuter = rings.length > 0 && pointInRing(point, rings[0]);\n const insideHole = rings.slice(1).some((ring) => pointInRing(point, ring));\n return { id: boundary.id, inside: insideOuter && !insideHole, distance: Math.min(...distances, Infinity) };\n};\n", "import L from 'leaflet';\nimport type { OEMFloor, OEMRegion } from '@opendfieldmap/core';\nimport { SmoothTileLayer } from '../atlos/smoothTileLayer';\nimport { appendOEMTileVersion, lookupOEMTile } from '../tileVersion';\n\n/** Leaflet marker with the subpixel positioning used by Atlos. */\nexport class OEMMarker extends L.Marker {\n update(): this {\n const marker = this as unknown as { _icon?: HTMLElement; _map?: L.Map; _latlng: L.LatLng; _setPos(point: L.Point): void };\n if (marker._icon && marker._map) marker._setPos(marker._map.latLngToLayerPoint(marker._latlng));\n return this;\n }\n _animateZoom(event: { center: L.LatLng; zoom: number }): void {\n const marker = this as unknown as {\n _map?: L.Map & { _latLngToNewLayerPoint(latlng: L.LatLng, zoom: number, center: L.LatLng): L.Point };\n _latlng: L.LatLng;\n _setPos(point: L.Point): void;\n };\n if (marker._map) marker._setPos(marker._map._latLngToNewLayerPoint(marker._latlng, event.zoom, event.center));\n }\n}\n\n/** Tile layer that skips coordinates absent from the published coverage index. */\nexport class CoveredTileLayer extends SmoothTileLayer {\n constructor(url: string, options: L.TileLayerOptions, private coverage: OEMRegion['coverage'], private floor: OEMFloor) {\n super(url, options);\n }\n getTileUrl(coords: L.Coords): string {\n const tile = lookupOEMTile(this.coverage, this.floor, coords.z, coords.x, coords.y);\n return appendOEMTileVersion(super.getTileUrl(coords), tile.version);\n }\n _isValidTile(coords: L.Coords): boolean {\n const prototype = L.GridLayer.prototype as unknown as {\n _isValidTile(this: L.GridLayer, value: L.Coords): boolean;\n };\n return prototype._isValidTile.call(this, coords) &&\n lookupOEMTile(this.coverage, this.floor, coords.z, coords.x, coords.y).covered;\n }\n}\n", "import L from 'leaflet';\ninterface TileLevel {\n el: HTMLElement;\n origin: L.Point;\n zoom: number;\n}\ninterface ContinuousPixelMap extends L.Map {\n _getNewPixelOrigin(center: L.LatLng, zoom: number): L.Point;\n}\nexport class SmoothTileLayer extends L.TileLayer {\n _setZoomTransform(level: TileLevel, center: L.LatLng, zoom: number) {\n const map = (this as unknown as {\n _map?: ContinuousPixelMap;\n })._map;\n if (!map)\n return;\n const scale = map.getZoomScale(zoom, level.zoom);\n const translate = level.origin\n .multiplyBy(scale)\n .subtract(map._getNewPixelOrigin(center, zoom));\n if (L.Browser.any3d) {\n L.DomUtil.setTransform(level.el, translate, scale);\n }\n else {\n L.DomUtil.setPosition(level.el, translate);\n }\n }\n}\n", "import type { OEMFloor, OEMRegion } from '@opendfieldmap/core';\n\nexport interface OEMTileLookup { covered: boolean; version?: string }\n\nexport const lookupOEMTile = (\n coverage: OEMRegion['coverage'],\n floor: OEMFloor,\n zoom: number,\n x: number,\n y: number,\n): OEMTileLookup => {\n const ranges = coverage[String(zoom)]?.[floor.id]?.[String(y)] ?? [];\n let offset = 0;\n for (let index = 0; index < ranges.length; index += 2) {\n const start = ranges[index];\n const end = ranges[index + 1];\n if (x >= start && x <= end) {\n return {\n covered: true,\n version: floor.tileVersions?.[String(zoom)]?.[String(y)]?.[offset + x - start],\n };\n }\n offset += end - start + 1;\n }\n return { covered: false };\n};\n\nexport const appendOEMTileVersion = (url: string, version?: string): string =>\n version ? `${url}${url.includes('?') ? '&' : '?'}v=${encodeURIComponent(version)}` : url;\n", "import type { OEMPoint, OEMPointFilter } from '@opendfieldmap/core';\nimport type { OEMCustomPoint } from '../types';\n\nexport const cloneFilter = (filter: OEMPointFilter): OEMPointFilter => ({\n types: filter.types ? [...filter.types] : undefined,\n subregions: filter.subregions ? [...filter.subregions] : undefined,\n floorOnly: filter.floorOnly,\n});\n\nconst sameList = (left?: string[], right?: string[]): boolean =>\n left === right || (!!left && !!right && left.length === right.length &&\n left.every((value, index) => value === right[index]));\n\nexport const sameFilter = (left: OEMPointFilter, right: OEMPointFilter): boolean =>\n left.floorOnly === right.floorOnly &&\n sameList(left.types, right.types) &&\n sameList(left.subregions, right.subregions);\n\nexport const clonePoint = (point: OEMPoint): OEMPoint => ({\n ...point,\n raw: { ...point.raw },\n position: { ...point.position },\n});\n\nexport const cloneCustomPoint = (point: OEMCustomPoint): OEMCustomPoint => ({\n ...point,\n position: { ...point.position },\n});\n\nexport const CLUSTER_SUBCATEGORIES = new Set(['boss', 'collection', 'mob', 'natural', 'valuable', 'exploration']);\nexport const FEATURE_NAMES = ['points', 'labels', 'boundaries'] as const;\nexport type OEMFeatureName = typeof FEATURE_NAMES[number];\nexport const BRAND_URL = 'https://oem.re/';\nexport const GITHUB_URL = 'https://github.com/Terra-Online/OEM-SDK';\nexport const TERMS_URL = 'https://blog.opendfieldmap.org/docs/tos#intellectual-property-and-copyright';\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["L", "L", "L", "L", "L", "L", "value"]
|
|
7
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opendfieldmap/map",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.3-beta",
|
|
4
4
|
"description": "Rendering kernel for Open Endfield Map widgets",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "AGPL-3.0-only",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"leaflet": "1.9.4",
|
|
23
23
|
"leaflet.markercluster": "1.5.3",
|
|
24
24
|
"trackpad-input": "0.1.1",
|
|
25
|
-
"@opendfieldmap/core": "^0.2.
|
|
25
|
+
"@opendfieldmap/core": "^0.2.3-beta"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"@types/leaflet": "1.9.16",
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/runtime/oem.ts", "../src/atlos/smoothWheelZoom.ts", "../src/atlos/mapOverdrag.ts", "../src/assets/ghicon.svg", "../src/runtime/geometry.ts", "../src/runtime/layers.ts", "../src/atlos/smoothTileLayer.ts", "../src/tileVersion.ts", "../src/runtime/helpers.ts"],
|
|
4
|
-
"sourcesContent": ["import L from 'leaflet';\nimport 'leaflet.markercluster';\nimport {\n createOEMPointUrl,\n fetchOEMJson,\n fromOEMLeafletPosition,\n getOEMRegion,\n mapToGameXZPosition,\n normalizeOEMLocale,\n resolveOEMAsset,\n toOEMLeafletMapPosition,\n toOEMLeafletPosition,\n} from '@opendfieldmap/core';\nimport type {\n OEMAsset,\n OEMBoundary,\n OEMBoundarySource,\n OEMFloor,\n OEMLabel,\n OEMLocaleMessages,\n OEMManifest,\n OEMPoint,\n OEMPointFilter,\n OEMMapPosition,\n OEMPointType,\n OEMPosition,\n OEMRegion,\n OEMView,\n} from '@opendfieldmap/core';\nimport type { OEM as OEMContract, OEMClickPointOptions, OEMCustomPoint, OEMEvents, OEMFeatures, OEMOptions, OEMZoomOptions } from '../types';\nimport { enableSmoothWheelZoom } from '../atlos/smoothWheelZoom';\nimport { isMapOverdragged, toMapBounds } from '../atlos/mapOverdrag';\nimport GithubIcon from '../assets/ghicon.svg';\nimport { boundaryScore } from './geometry';\nimport { CoveredTileLayer, OEMMarker } from './layers';\nimport {\n BRAND_URL,\n CLUSTER_SUBCATEGORIES,\n cloneCustomPoint,\n cloneFilter,\n clonePoint,\n FEATURE_NAMES,\n GITHUB_URL,\n sameFilter,\n TERMS_URL,\n type OEMFeatureName,\n} from './helpers';\n\nconst mounted = new WeakSet<HTMLElement>();\n\ntype AtlosPointTuple = [string | number, number, number, number, number, string | null];\ntype AtlosPointObject = { id: string | number; z?: number; x?: number; y?: number; tier?: number; pos?: number[]; subregId?: string; type?: string | null };\n\n/** Decodes the compact tuple/object format used by Atlos' marker interpreter. */\nconst decodeAtlosPoint = (raw: AtlosPointTuple | AtlosPointObject, region: OEMRegion, fallbackSubregionId: string): OEMPoint | undefined => {\n if (!Array.isArray(raw) && raw && 'position' in (raw as object) && 'raw' in (raw as object)) return raw as unknown as OEMPoint;\n const value = Array.isArray(raw)\n ? { id: raw[0], z: raw[1], x: raw[2], y: raw[3], tier: raw[4], type: raw[5] }\n : raw;\n if (value?.id == null) return undefined;\n const x = value.x ?? value.pos?.[1] ?? 0;\n const z = value.z ?? value.pos?.[0] ?? 0;\n const y = value.y ?? value.pos?.[2] ?? 0;\n const tier = value.tier ?? 0;\n if (![x, y, z, tier].every(Number.isFinite)) return undefined;\n const subregionId = value.subregId ?? fallbackSubregionId;\n const floorId = tier === 0 ? 'M' : `${tier < 0 ? 'B' : 'L'}${Math.abs(Math.trunc(tier))}`;\n const mapPosition: OEMMapPosition = { regionId: region.id, subregionId, x, z, floorId };\n const game = mapToGameXZPosition(mapPosition, region, subregionId);\n const scale = 2 ** region.maxNativeZoom;\n return {\n id: String(value.id), regionId: region.id, subregionId, type: value.type ?? '', tier,\n raw: { x: game.x, y, z: game.z },\n position: { ...mapPosition, x: x * scale, z: z * scale },\n };\n};\n\n/** Leaflet-backed implementation of the public OEM interface. */\nexport class OEM implements OEMContract {\n destroyed = false;\n private map: L.Map;\n private root: HTMLDivElement;\n private region: OEMRegion;\n private floorId = 'M';\n private features: OEMFeatures = {};\n private boundarySource: OEMBoundarySource = 'oem';\n private listeners = new Map<keyof OEMEvents, Set<(payload: never) => void>>();\n private requests = new Map<OEMFeatureName, AbortController>();\n private baseTiles?: L.TileLayer;\n private floorTiles?: L.TileLayer;\n private pointsLayer = L.layerGroup();\n private customPointsLayer = L.layerGroup();\n private pointClusters = new Map<string, L.MarkerClusterGroup>();\n private labelsLayer = L.layerGroup();\n private boundariesLayer = L.layerGroup();\n private points: OEMPoint[] = [];\n private customPoints: OEMCustomPoint[] = [];\n private clickPoints: OEMCustomPoint[] = [];\n private clickPointOptions?: OEMClickPointOptions;\n private clickPointSequence = 0;\n private customPointsRequest?: { controller: AbortController; promise: Promise<void> };\n private pointIndex?: Record<string, string>;\n private pointIndexRequest?: Promise<Record<string, string>>;\n private pointShardRequests = new Map<string, Promise<OEMPoint[]>>();\n private boundaryData = new Map<string, OEMBoundary[]>();\n private boundaryDataRequests = new Map<string, Promise<OEMBoundary[]>>();\n private types: Record<string, OEMPointType> = {};\n private labels: OEMLabel[] = [];\n private visibleLabelType?: OEMLabel['type'];\n private messages: OEMLocaleMessages = {};\n private filter: OEMPointFilter = {};\n private markerClustering: boolean;\n private locale: string;\n private resolvedLocale: string;\n private attributionBrand: HTMLAnchorElement;\n private attributionLink: HTMLAnchorElement;\n private observer?: ResizeObserver;\n private updatingView = false;\n private emittedView?: OEMView;\n private overdragFrame?: number;\n private overdragged = false;\n private wheel: ReturnType<typeof enableSmoothWheelZoom>;\n\n constructor(private container: HTMLElement, readonly manifest: OEMManifest, private options: OEMOptions) {\n if (mounted.has(container)) throw new Error('This container already hosts an OEM instance');\n this.region = getOEMRegion(manifest, options.view?.regionId ?? options.regionId ?? manifest.defaultRegionId);\n this.filter = cloneFilter(options.pointFilter ?? {});\n this.boundarySource = options.features?.boundarySource ?? 'oem';\n this.customPoints = this.normalizeCustomPoints(options.customPoints ?? []);\n this.markerClustering = options.markerClustering ?? true;\n const initialFloor = options.view?.floorId ?? options.floorId ?? 'M';\n this.validateFloor(initialFloor);\n if (options.view) this.validatePosition(options.view);\n this.locale = options.locale ?? manifest.fallbackLocale;\n this.resolvedLocale = normalizeOEMLocale(this.locale, Object.keys(manifest.locales), manifest.fallbackLocale);\n this.root = document.createElement('div');\n this.root.className = 'mapRoot';\n this.root.dataset.theme = options.theme ?? 'light';\n container.append(this.root);\n mounted.add(container);\n this.map = L.map(this.root, {\n crs: L.CRS.Simple, minZoom: 0, maxZoom: 3, zoomControl: false, attributionControl: false,\n dragging: !options.lockDrag, touchZoom: !options.lockZoom, boxZoom: !options.lockZoom,\n keyboard: !options.lockZoom, doubleClickZoom: false, scrollWheelZoom: false, zoomAnimation: true,\n markerZoomAnimation: true, fadeAnimation: true, zoomSnap: 0, zoomDelta: 0.25,\n });\n this.wheel = enableSmoothWheelZoom(this.map, {\n enableInertia: true,\n panEnabled: !options.lockDrag,\n zoomEnabled: !options.lockZoom,\n });\n const pane = this.map.createPane('placeLabels');\n pane.style.zIndex = '650';\n pane.style.pointerEvents = 'none';\n this.pointsLayer.addTo(this.map);\n this.customPointsLayer.addTo(this.map);\n this.labelsLayer.addTo(this.map);\n this.boundariesLayer.addTo(this.map);\n const credit = document.createElement('div');\n credit.className = 'attribution';\n const github = document.createElement('a');\n github.className = 'attributionGithub';\n github.href = GITHUB_URL;\n github.target = '_blank';\n github.rel = 'noopener noreferrer';\n github.setAttribute('aria-label', 'GitHub');\n github.innerHTML = GithubIcon;\n const githubSvg = github.querySelector('svg');\n githubSvg?.setAttribute('aria-hidden', 'true');\n githubSvg?.setAttribute('focusable', 'false');\n this.attributionBrand = document.createElement('a');\n this.attributionBrand.className = 'attributionBrand';\n this.attributionBrand.href = BRAND_URL;\n const separator = document.createElement('span');\n separator.className = 'attributionSeparator';\n separator.textContent = '\u00B7';\n separator.setAttribute('aria-hidden', 'true');\n this.attributionLink = document.createElement('a');\n this.attributionLink.className = 'attributionLink';\n this.attributionLink.href = TERMS_URL;\n this.attributionLink.target = '_blank';\n this.attributionLink.rel = 'noopener noreferrer';\n credit.append(github, this.attributionBrand, separator, this.attributionLink);\n this.updateAttribution();\n this.root.append(credit);\n this.applyRegion(options.view);\n this.setFloor(initialFloor);\n this.renderCustomPoints();\n this.map.on('click', this.emitMapClick);\n this.map.on('moveend zoomend', this.emitView);\n this.map.on('move drag', this.scheduleOverdragUpdate);\n this.map.on('moveend dragend movestart zoomstart', this.clearOverdrag);\n if (typeof ResizeObserver !== 'undefined') {\n this.observer = new ResizeObserver(() => this.resize());\n this.observer.observe(container);\n }\n options.signal?.addEventListener('abort', this.destroy, { once: true });\n }\n\n /** Prevents calls against a released map instance. */\n private assertAlive(): void { if (this.destroyed) throw new Error('OEM instance has been destroyed'); }\n private validateFloor(id: string): void {\n if (!this.region.floors.some((floor) => floor.id === id)) throw new Error(`Unknown floor ${id} in ${this.region.id}`);\n }\n private validatePosition(position: OEMPosition): void { toOEMLeafletPosition(position, this.region); }\n private normalizeCustomPoints(points: readonly OEMCustomPoint[]): OEMCustomPoint[] {\n const ids = new Set<string>();\n return points.map((point) => {\n if (!point || typeof point.id !== 'string' || !point.id.trim()) {\n throw new Error(`Custom point IDs must be non-empty and unique: ${point?.id}`);\n }\n const id = point.id.trim();\n if (ids.has(id)) throw new Error(`Custom point IDs must be non-empty and unique: ${id}`);\n ids.add(id);\n if (!point.position || typeof point.position.regionId !== 'string') {\n throw new Error(`Invalid custom point position: ${id}`);\n }\n const position = point.position;\n if (point.style !== 'framed' && point.style !== 'no-frame') {\n throw new Error(`Invalid custom point style: ${id}`);\n }\n if (typeof point.icon !== 'string' || !point.icon) {\n throw new Error(`Custom point icon must be a non-empty URL: ${id}`);\n }\n const pointRegion = getOEMRegion(this.manifest, position.regionId);\n toOEMLeafletMapPosition(position);\n if (position.subregionId && !pointRegion.subregions.some((subregion) => subregion.id === position.subregionId)) {\n throw new Error(`Unknown custom point subregion ${position.subregionId} in ${position.regionId}`);\n }\n if (position.floorId && !pointRegion.floors.some((floor) => floor.id === position.floorId)) {\n throw new Error(`Unknown custom point floor ${position.floorId} in ${position.regionId}`);\n }\n return { ...cloneCustomPoint({ ...point, position }), id };\n });\n }\n private normalizeClickPointOptions(options: OEMClickPointOptions): OEMClickPointOptions {\n const probe: OEMCustomPoint = {\n id: 'click-point-option',\n position: { regionId: this.region.id, x: 0, z: 0 },\n style: options?.style,\n icon: options?.icon,\n };\n this.normalizeCustomPoints([probe]);\n if (options.mode !== 'multiple' && options.mode !== 'single') {\n throw new Error(`Invalid click point mode: ${options.mode}`);\n }\n return { mode: options.mode, style: options.style, icon: options.icon };\n }\n private position(latlng: L.LatLng): OEMPosition {\n return fromOEMLeafletPosition(latlng.lat, latlng.lng, this.region, this.floorId);\n }\n private loadOEMBoundaryData(reference: OEMAsset): Promise<OEMBoundary[]> {\n const cached = this.boundaryData.get(reference.path);\n if (cached) return Promise.resolve(cached);\n const pending = this.boundaryDataRequests.get(reference.path);\n if (pending) return pending;\n const request = fetchOEMJson<unknown>(resolveOEMAsset(this.options.resources.baseUrl, reference.path), this.options.signal).then((value) => {\n if (!Array.isArray(value)) throw new Error(`Invalid OEM boundary data: ${reference.path}`);\n const boundaries = value as OEMBoundary[];\n this.boundaryData.set(reference.path, boundaries);\n return boundaries;\n }).finally(() => {\n if (this.boundaryDataRequests.get(reference.path) === request) this.boundaryDataRequests.delete(reference.path);\n });\n this.boundaryDataRequests.set(reference.path, request);\n return request;\n }\n /** Preloads OEM subregion geometry so map clicks can resolve an exact subregion. */\n async prepareSubregionBoundaries(): Promise<void> {\n if (!this.region.boundaries) return;\n try { await this.loadOEMBoundaryData(this.region.boundaries); } catch { /* Click metadata has a bounds fallback. */ }\n }\n private inferSubregionId(x: number, z: number): string | undefined {\n const selected = this.filter.subregions?.filter((id) => this.region.subregions.some((subregion) => subregion.id === id));\n const scale = 2 ** this.region.maxNativeZoom;\n const point = { x: x * scale, z: z * scale };\n const allowed = selected?.length ? new Set(selected) : undefined;\n const geometries = this.region.boundaries ? this.boundaryData.get(this.region.boundaries.path) ?? [] : [];\n const scores = geometries\n .filter((boundary) => this.region.subregions.some((subregion) => subregion.id === boundary.id) && (!allowed || allowed.has(boundary.id)))\n .map((boundary) => boundaryScore(boundary, point));\n const inside = scores.filter((score) => score.inside);\n if (inside.length) {\n // Shared OEM polygons can overlap at block boundaries. A point that is\n // close to a candidate's own boundary is close to that region's edge,\n // not deep inside its overall structure. Resolve ambiguity by comparing\n // candidates pairwise and preferring the one with the greater boundary\n // clearance (the inverse of the old nearest-boundary rule).\n const ranked = inside.map((score) => ({ ...score, wins: 0, margin: 0 }));\n for (let leftIndex = 0; leftIndex < ranked.length; leftIndex += 1) {\n for (let rightIndex = leftIndex + 1; rightIndex < ranked.length; rightIndex += 1) {\n const left = ranked[leftIndex];\n const right = ranked[rightIndex];\n const delta = left.distance - right.distance;\n if (Math.abs(delta) <= 1e-9) continue;\n if (delta > 0) {\n left.wins += 1;\n left.margin += delta;\n right.margin -= delta;\n } else {\n right.wins += 1;\n right.margin -= delta;\n left.margin += delta;\n }\n }\n }\n ranked.sort((left, right) => right.wins - left.wins || right.margin - left.margin ||\n right.distance - left.distance || left.id.localeCompare(right.id));\n return ranked[0].id;\n }\n\n const bounds = this.region.subregions\n .filter((subregion) => subregion.bounds && (!allowed || allowed.has(subregion.id)))\n .map((subregion) => {\n const [[minX, minZ], [maxX, maxZ]] = subregion.bounds!;\n const insideX = point.x >= minX && point.x <= maxX;\n const insideZ = point.z >= minZ && point.z <= maxZ;\n const dx = insideX ? Math.min(point.x - minX, maxX - point.x) : Math.min(Math.abs(point.x - minX), Math.abs(point.x - maxX));\n const dz = insideZ ? Math.min(point.z - minZ, maxZ - point.z) : Math.min(Math.abs(point.z - minZ), Math.abs(point.z - maxZ));\n return { id: subregion.id, inside: insideX && insideZ, distance: dx * dx + dz * dz };\n })\n .sort((left, right) => Number(right.inside) - Number(left.inside) || left.distance - right.distance || left.id.localeCompare(right.id));\n if (bounds.length) return bounds[0].id;\n return scores.sort((left, right) => left.distance - right.distance || left.id.localeCompare(right.id))[0]?.id;\n }\n private emitMapClick = (event: L.LeafletMouseEvent): void => {\n if (this.destroyed) return;\n const subregionId = this.inferSubregionId(event.latlng.lng, event.latlng.lat);\n const position: OEMMapPosition = {\n regionId: this.region.id,\n x: event.latlng.lng,\n z: event.latlng.lat,\n floorId: this.floorId,\n ...(subregionId ? { subregionId } : {}),\n };\n if (this.clickPointOptions) {\n const point: OEMCustomPoint = {\n id: `oem-click-point-${++this.clickPointSequence}`,\n position,\n style: this.clickPointOptions.style,\n icon: this.clickPointOptions.icon,\n };\n if (this.clickPointOptions.mode === 'single') this.clickPoints = [point];\n else this.clickPoints.push(point);\n this.renderCustomPoints();\n }\n this.emit('click', { position, game: mapToGameXZPosition(position, this.region) });\n };\n private emit<Event extends keyof OEMEvents>(event: Event, payload: OEMEvents[Event]): void {\n this.listeners.get(event)?.forEach((handler) => handler(payload as never));\n if (event === 'error') this.options.onError?.(payload as Error);\n }\n private scheduleOverdragUpdate = (): void => {\n if (this.overdragFrame !== undefined) return;\n this.overdragFrame = requestAnimationFrame(() => {\n this.overdragFrame = undefined;\n const bounds = toMapBounds(this.map.options.maxBounds);\n const overdragged = !!bounds && isMapOverdragged(this.map, bounds);\n if (overdragged === this.overdragged) return;\n this.overdragged = overdragged;\n this.root.classList.toggle('overdrag', overdragged);\n });\n };\n private clearOverdrag = (): void => {\n if (this.overdragFrame !== undefined) cancelAnimationFrame(this.overdragFrame);\n this.overdragFrame = undefined;\n if (!this.overdragged) return;\n this.overdragged = false;\n this.root.classList.remove('overdrag');\n };\n /** Emits one resolved view for duplicate Leaflet move and zoom events. */\n private emitView = (): void => {\n if (this.destroyed || this.updatingView) return;\n const view = this.getView();\n if (this.emittedView && view.regionId === this.emittedView.regionId &&\n view.floorId === this.emittedView.floorId && view.x === this.emittedView.x &&\n view.z === this.emittedView.z && view.zoom === this.emittedView.zoom) return;\n this.emittedView = view;\n this.emit('viewchange', view);\n this.renderLabels();\n };\n /** Resolves the compact attribution without inheriting the map control font. */\n private updateAttribution(): void {\n const messages = this.manifest.controls[this.resolvedLocale] ?? this.manifest.controls[this.manifest.fallbackLocale];\n if (!messages) throw new Error('Missing OEM attribution messages');\n this.attributionBrand.textContent = messages.brandName;\n this.attributionLink.textContent = messages.termsOfService;\n }\n on<Event extends keyof OEMEvents>(event: Event, handler: (payload: OEMEvents[Event]) => void): () => void {\n this.assertAlive();\n const handlers = this.listeners.get(event) ?? new Set();\n handlers.add(handler as (payload: never) => void);\n this.listeners.set(event, handlers);\n return () => { handlers.delete(handler as (payload: never) => void); };\n }\n /** Rebuilds the base map constraints and main tile layer for one region. */\n private applyRegion(view?: OEMView): void {\n this.updatingView = true;\n this.baseTiles?.remove();\n this.floorTiles?.remove();\n this.floorTiles = undefined;\n this.floorId = 'M';\n this.map.setMaxBounds(L.latLngBounds([]));\n this.map.setMinZoom(this.region.minZoom);\n this.map.setMaxZoom(this.region.maxZoom);\n const target = view ?? this.region.initialView;\n this.map.setView(toOEMLeafletPosition(target, this.region), this.clampZoom(target.zoom), { animate: false });\n this.map.setMaxBounds(this.regionBounds());\n this.baseTiles = this.makeTiles('M').addTo(this.map);\n this.updatingView = false;\n }\n /** Converts the region's published pixel extent to Simple CRS bounds. */\n private regionBounds(): L.LatLngBounds {\n const { x, z } = this.region.boundsOffset;\n return L.latLngBounds(\n toOEMLeafletPosition({ regionId: this.region.id, x, z }, this.region),\n toOEMLeafletPosition({ regionId: this.region.id, x: x + this.region.dimensions[0], z: z + this.region.dimensions[1] }, this.region),\n );\n }\n /** Creates a coverage-aware layer for one region floor. */\n private makeTiles(floorId: string): L.TileLayer {\n const floor = this.region.floors.find((entry) => entry.id === floorId)!;\n const regionId = this.region.id;\n const layer = new CoveredTileLayer(resolveOEMAsset(this.options.resources.baseUrl, floor.tileTemplate), {\n tileSize: this.region.tileSize, noWrap: true, bounds: this.regionBounds(),\n maxNativeZoom: this.region.maxNativeZoom, maxZoom: Math.ceil(this.region.maxZoom),\n }, this.region.coverage, floor);\n layer.on('load', () => { if (!this.destroyed && this.region.id === regionId) this.emit('load', { regionId, floorId }); });\n layer.on('tileerror', () => this.emit('error', new Error(`Tile load failed: ${regionId}/${floorId}`)));\n return layer;\n }\n private clampZoom(zoom: number): number {\n if (!Number.isFinite(zoom)) throw new Error('Zoom must be finite');\n return Math.max(this.region.minZoom, Math.min(this.region.maxZoom, zoom));\n }\n /** Returns the current view in the OEM pixel coordinate system. */\n getView(): OEMView { this.assertAlive(); return { ...this.position(this.map.getCenter()), zoom: this.map.getZoom() }; }\n\n /** Sets the view without exposing Leaflet's coordinate objects. */\n setView(view: OEMView): void {\n this.assertAlive();\n this.validatePosition(view);\n const zoom = this.clampZoom(view.zoom);\n if (view.floorId) this.setFloor(view.floorId);\n this.map.setView(toOEMLeafletPosition(view, this.region), zoom, { animate: false });\n }\n /** Changes zoom around the current center with an optional native transition. */\n setZoom(zoom: number, options: OEMZoomOptions = {}): void {\n this.assertAlive();\n this.map.setZoom(this.clampZoom(zoom), { animate: options.animate ?? false });\n }\n /** Fits the map to an OEM pixel-coordinate extent. */\n fitBounds(bounds: [OEMPosition, OEMPosition]): void {\n this.assertAlive();\n this.map.fitBounds(L.latLngBounds(toOEMLeafletPosition(bounds[0], this.region), toOEMLeafletPosition(bounds[1], this.region)), { animate: false });\n }\n /** Switches regions and reloads only the features currently enabled. */\n async setRegion(regionId: string): Promise<void> {\n this.assertAlive();\n const region = getOEMRegion(this.manifest, regionId);\n if (region === this.region) return;\n this.cancelRequests();\n this.region = region;\n this.points = [];\n this.labels = [];\n this.visibleLabelType = undefined;\n this.clearPointLayers();\n this.labelsLayer.clearLayers();\n this.boundariesLayer.clearLayers();\n this.applyRegion();\n this.renderCustomPoints();\n this.emit('regionchange', { regionId });\n this.emit('floorchange', { floorId: 'M' });\n this.emitView();\n await this.prepareSubregionBoundaries();\n await this.loadFeatures();\n }\n /** Switches the rendered floor while retaining the current region view. */\n setFloor(floorId: string): void {\n this.assertAlive();\n this.validateFloor(floorId);\n if (floorId === this.floorId) return;\n this.floorTiles?.remove();\n this.floorTiles = undefined;\n this.floorId = floorId;\n const base = this.baseTiles?.getContainer();\n if (base) base.style.filter = floorId === 'M' ? 'brightness(1)' : 'brightness(0.5)';\n if (floorId !== 'M') this.floorTiles = this.makeTiles(floorId).addTo(this.map);\n this.renderPoints();\n this.renderCustomPoints();\n this.emit('floorchange', { floorId });\n this.emitView();\n }\n /** Changes label language and applies the manifest fallback chain. */\n async setLocale(locale: string): Promise<void> {\n this.assertAlive();\n const resolved = normalizeOEMLocale(locale, Object.keys(this.manifest.locales), this.manifest.fallbackLocale);\n const changed = resolved !== this.resolvedLocale;\n this.locale = locale;\n if (!changed) return;\n this.resolvedLocale = resolved;\n this.updateAttribution();\n if (this.features.labels) await this.loadFeature('labels');\n }\n /** Returns both the requested and resolved locale values. */\n getLocale(): { requested: string; resolved: string } { return { requested: this.locale, resolved: this.resolvedLocale }; }\n\n /** Changes only this instance's theme attribute. */\n setTheme(theme: 'light' | 'dark'): void { this.assertAlive(); this.root.dataset.theme = theme; }\n\n /** Enables or disables static layers and cancels disabled layer requests. */\n async setFeatures(features: OEMFeatures): Promise<void> {\n this.assertAlive();\n const loads: Promise<void>[] = [];\n if (features.boundarySource !== undefined) {\n if (features.boundarySource !== 'oem' && features.boundarySource !== 'game') {\n throw new Error(`Unknown OEM boundary source: ${features.boundarySource}`);\n }\n if (features.boundarySource !== this.boundarySource) {\n this.boundarySource = features.boundarySource;\n this.cancelRequest('boundaries');\n if (this.features.boundaries) loads.push(this.loadFeature('boundaries'));\n }\n }\n for (const feature of FEATURE_NAMES) {\n if (features[feature] === undefined || features[feature] === this.features[feature]) continue;\n this.features[feature] = features[feature];\n this.cancelRequest(feature);\n if (features[feature]) loads.push(this.loadFeature(feature));\n else if (feature === 'points') { this.points = []; this.clearPointLayers(); }\n else if (feature === 'labels') { this.labels = []; this.visibleLabelType = undefined; this.labelsLayer.clearLayers(); }\n else this.boundariesLayer.clearLayers();\n }\n // Feature payloads are optional runtime data. A CDN or host-side outage\n // should disable only the affected layer; loadFeature already emits the\n // structured error event and clears its loading state.\n await Promise.allSettled(loads);\n }\n\n /** Replaces host-defined points without reloading static map data. */\n setCustomPoints(points: readonly OEMCustomPoint[]): void {\n this.assertAlive();\n this.customPointsRequest?.controller.abort();\n this.customPointsRequest = undefined;\n this.customPoints = this.normalizeCustomPoints(points);\n this.renderCustomPoints();\n }\n\n /** Enables or disables automatic custom-point creation from map clicks. */\n setClickPointMode(options?: OEMClickPointOptions | null): void {\n this.assertAlive();\n this.clickPointOptions = options == null ? undefined : this.normalizeClickPointOptions(options);\n if (this.clickPointOptions?.mode === 'single' && this.clickPoints.length > 1) {\n this.clickPoints = [this.clickPoints.at(-1)!];\n this.renderCustomPoints();\n }\n }\n\n /** Removes only points created by the click-point mode. */\n clearClickPoints(): void {\n this.assertAlive();\n if (!this.clickPoints.length) return;\n this.clickPoints = [];\n this.renderCustomPoints();\n }\n\n loadCustomPoints(url: string): Promise<void> {\n this.assertAlive();\n const value = url.trim();\n if (!value) throw new Error('Custom points URL must be a non-empty URL');\n let resolvedUrl: string;\n try {\n resolvedUrl = new URL(value, document.baseURI).toString();\n } catch {\n throw new Error(`Invalid custom points URL: ${url}`);\n }\n this.customPointsRequest?.controller.abort();\n const controller = new AbortController();\n const abort = () => controller.abort();\n this.options.signal?.addEventListener('abort', abort, { once: true });\n const request: { controller: AbortController; promise: Promise<void> } = { controller, promise: Promise.resolve() };\n request.promise = fetchOEMJson<unknown>(resolvedUrl, controller.signal).then((value) => {\n if (!Array.isArray(value)) throw new Error('Custom points JSON must be an array');\n const points = value.map((point) => {\n if (!point || typeof point !== 'object' || typeof (point as { icon?: unknown }).icon !== 'string') return point as OEMCustomPoint;\n return {\n ...(point as OEMCustomPoint),\n icon: new URL((point as OEMCustomPoint).icon, resolvedUrl).toString(),\n };\n });\n if (controller.signal.aborted || this.destroyed) return;\n this.customPoints = this.normalizeCustomPoints(points);\n this.renderCustomPoints();\n }).finally(() => {\n this.options.signal?.removeEventListener('abort', abort);\n if (this.customPointsRequest === request) this.customPointsRequest = undefined;\n });\n this.customPointsRequest = request;\n return request.promise;\n }\n\n /** Removes all host-defined points from this map instance. */\n clearCustomPoints(): void {\n this.assertAlive();\n this.customPointsRequest?.controller.abort();\n this.customPointsRequest = undefined;\n this.customPoints = [];\n this.renderCustomPoints();\n }\n\n /** Returns a loaded published point from the current region, if available. */\n getPoint(pointId: string): OEMPoint | undefined {\n this.assertAlive();\n const id = pointId.trim();\n if (!id) throw new Error('Point ID must not be empty');\n const point = this.points.find((entry) => entry.id === id);\n return point ? clonePoint(point) : undefined;\n }\n\n /** Loads one published point by using the release point index when available. */\n async loadPoint(pointId: string): Promise<OEMPoint | undefined> {\n this.assertAlive();\n const id = pointId.trim();\n if (!id) throw new Error('Point ID must not be empty');\n const loaded = this.getPoint(id);\n if (loaded) return loaded;\n\n const pointIndex = await this.loadPointIndex();\n this.assertAlive();\n const paths = pointIndex[id]\n ? [pointIndex[id]]\n : this.manifest.pointIndex\n ? []\n : this.manifest.regions.flatMap((region) => region.points.map((ref) => ref.path));\n for (const path of paths) {\n const points = await this.loadPointShard(path);\n const point = points.find((entry) => entry.id === id);\n if (point) return clonePoint(point);\n }\n return undefined;\n }\n\n private async loadPointIndex(): Promise<Record<string, string>> {\n if (!this.manifest.pointIndex) return {};\n if (this.pointIndex) return this.pointIndex;\n if (!this.pointIndexRequest) {\n this.pointIndexRequest = fetchOEMJson<unknown>(\n resolveOEMAsset(this.options.resources.baseUrl, this.manifest.pointIndex.path),\n this.options.signal,\n ).then((value) => {\n if (!value || typeof value !== 'object' || Array.isArray(value)) throw new Error('Invalid OEM point index');\n const index: Record<string, string> = {};\n for (const [id, path] of Object.entries(value)) {\n if (!id || typeof path !== 'string' || !path) throw new Error(`Invalid OEM point index entry: ${id}`);\n resolveOEMAsset(this.options.resources.baseUrl, path);\n index[id] = path;\n }\n this.pointIndex = index;\n return index;\n }).catch((error) => {\n this.pointIndexRequest = undefined;\n throw error;\n });\n }\n return this.pointIndexRequest;\n }\n\n private loadPointShard(path: string): Promise<OEMPoint[]> {\n const cached = this.pointShardRequests.get(path);\n if (cached) return cached;\n const request = fetchOEMJson<unknown>(resolveOEMAsset(this.options.resources.baseUrl, path), this.options.signal).then((value) => {\n const region = this.manifest.regions.find((entry) => entry.points.some((ref) => ref.path === path));\n if (!region || !Array.isArray(value)) throw new Error(`Invalid OEM point shard: ${path}`);\n return this.decodePointShard(value, path, region);\n }).catch((error) => {\n if (this.pointShardRequests.get(path) === request) this.pointShardRequests.delete(path);\n throw error;\n });\n this.pointShardRequests.set(path, request);\n return request;\n }\n\n private decodePointShard(value: unknown[], shardPath: string, region: OEMRegion = this.region): OEMPoint[] {\n const fallbackSubregionId = shardPath.split('/').at(-1)?.replace(/\\.json$/, '') ?? '';\n return value\n .map((entry) => decodeAtlosPoint(entry as AtlosPointTuple | AtlosPointObject, region, fallbackSubregionId))\n .filter((entry): entry is OEMPoint => !!entry);\n }\n\n private cancelRequest(feature: OEMFeatureName): void {\n if (!this.requests.has(feature)) return;\n this.requests.get(feature)!.abort();\n this.requests.delete(feature);\n this.emit('loading', { feature, loading: false });\n }\n private cancelRequests(): void { for (const feature of this.requests.keys()) this.cancelRequest(feature); }\n private async loadFeatures(): Promise<void> {\n await Promise.allSettled(FEATURE_NAMES.filter((feature) => this.features[feature]).map((feature) => this.loadFeature(feature)));\n }\n /** Loads one feature with a request token so stale responses are ignored. */\n private async loadFeature(feature: OEMFeatureName): Promise<void> {\n this.cancelRequest(feature);\n const request = new AbortController();\n this.requests.set(feature, request);\n this.emit('loading', { feature, loading: true });\n const read = <Data>(ref: OEMAsset) => fetchOEMJson<Data>(resolveOEMAsset(this.options.resources.baseUrl, ref.path), request.signal);\n try {\n if (feature === 'points') {\n const [groups, types] = await Promise.all([\n Promise.all(this.region.points.map(async (ref) => {\n const value = await read<unknown[]>(ref);\n if (!Array.isArray(value)) throw new Error(`Invalid OEM point shard: ${ref.path}`);\n return this.decodePointShard(value, ref.path);\n })),\n Object.keys(this.types).length ? this.types : read<Record<string, OEMPointType>>(this.manifest.types),\n ]);\n if (request.signal.aborted) return;\n this.points = groups.flat();\n this.types = types;\n this.renderPoints();\n } else if (feature === 'labels') {\n const [labels, messages] = await Promise.all([\n this.region.labels ? read<OEMLabel[]>(this.region.labels) : Promise.resolve([]),\n this.manifest.locales[this.resolvedLocale] ? read<OEMLocaleMessages>(this.manifest.locales[this.resolvedLocale]) : Promise.resolve({}),\n ]);\n if (request.signal.aborted) return;\n this.labels = labels;\n this.messages = messages;\n this.renderLabels(true);\n } else {\n const reference = this.boundarySource === 'game' ? this.region.gameBoundaries : this.region.boundaries;\n const boundaries = reference\n ? this.boundarySource === 'oem'\n ? await this.loadOEMBoundaryData(reference)\n : await read<OEMBoundary[]>(reference)\n : [];\n if (request.signal.aborted) return;\n this.renderBoundaries(boundaries);\n }\n } catch (error) {\n if (!request.signal.aborted) {\n this.features[feature] = false;\n this.emit('error', error instanceof Error ? error : new Error(String(error)));\n throw error;\n }\n } finally {\n if (this.requests.get(feature) === request) {\n this.requests.delete(feature);\n this.emit('loading', { feature, loading: false });\n }\n }\n }\n /** Applies a client-side filter without making another network request. */\n setPointFilter(filter: OEMPointFilter): void {\n this.assertAlive();\n const next = cloneFilter(filter);\n if (sameFilter(this.filter, next)) return;\n this.filter = next;\n this.renderPoints();\n }\n\n /** Enables or disables Atlos-style marker clustering without reloading point data. */\n setMarkerClustering(enabled: boolean): void {\n this.assertAlive();\n if (enabled === this.markerClustering) return;\n this.markerClustering = enabled;\n this.renderPoints();\n }\n\n private clearPointLayers(): void {\n this.pointsLayer.clearLayers();\n for (const group of this.pointClusters.values()) {\n group.clearLayers();\n group.remove();\n }\n this.pointClusters.clear();\n }\n\n private createCustomPointVisual(point: OEMCustomPoint): HTMLElement {\n const inner = document.createElement('div');\n inner.className = point.style === 'no-frame' ? 'noFrameInner' : 'markerInner';\n inner.setAttribute('aria-label', point.id);\n if (point.position.floorId && point.position.floorId !== this.floorId) inner.classList.add('offLayer');\n const image = document.createElement('img');\n image.src = point.icon;\n image.alt = point.id;\n image.draggable = false;\n if (point.style === 'no-frame') {\n image.className = 'noFrameImage';\n inner.append(image);\n } else {\n const frame = document.createElement('div');\n frame.className = 'frameImage';\n frame.append(image);\n inner.append(frame);\n }\n return inner;\n }\n\n private renderCustomPoints(): void {\n this.customPointsLayer.clearLayers();\n for (const point of [...this.customPoints, ...this.clickPoints]) {\n if (point.position.regionId !== this.region.id) continue;\n const marker = new OEMMarker(toOEMLeafletMapPosition(point.position), {\n interactive: false,\n keyboard: false,\n bubblingMouseEvents: false,\n icon: L.divIcon({\n html: this.createCustomPointVisual(point),\n className: `${point.style === 'no-frame' ? 'noFrameMarkerIcon' : 'frameMarkerIcon'} incompleteMarker`,\n iconSize: point.style === 'no-frame' ? [50, 50] : [32, 32],\n iconAnchor: point.style === 'no-frame' ? [25, 25] : [16, 32],\n }),\n });\n marker.addTo(this.customPointsLayer);\n }\n }\n\n /** Builds the shared Atlos marker composition for points and cluster summaries. */\n private createMarkerVisual(type: OEMPointType, point?: OEMPoint, count?: number): HTMLElement {\n const inner = document.createElement(point ? 'a' : 'div');\n inner.className = type.noFrame ? 'noFrameInner' : 'markerInner';\n if (point) {\n const link = inner as HTMLAnchorElement;\n link.href = createOEMPointUrl(point.id);\n link.target = '_blank';\n link.rel = 'noopener noreferrer';\n inner.classList.toggle('offLayer', point.position.floorId !== this.floorId);\n if (point.tier) inner.dataset.tier = point.position.floorId;\n }\n if (count !== undefined) inner.classList.add('clusterMarker');\n const image = document.createElement('img');\n image.src = resolveOEMAsset(this.options.resources.baseUrl, type.icon);\n image.alt = type.key;\n image.draggable = false;\n if (type.noFrame) {\n image.className = 'noFrameImage';\n inner.append(image);\n } else {\n const frame = document.createElement('div');\n frame.className = 'frameImage';\n frame.append(image);\n inner.append(frame);\n }\n if (type.subIcon) {\n const sub = document.createElement('div');\n sub.className = 'subIconContainer';\n const subImage = document.createElement('img');\n subImage.className = 'subIcon';\n subImage.src = resolveOEMAsset(this.options.resources.baseUrl, type.subIcon);\n subImage.alt = '';\n sub.append(subImage);\n inner.append(sub);\n }\n if (count !== undefined) {\n const badge = document.createElement('span');\n badge.className = 'clusterCount';\n badge.textContent = String(count);\n inner.append(badge);\n }\n return inner;\n }\n\n private createPointMarker(point: OEMPoint, type: OEMPointType): OEMMarker {\n return new OEMMarker(toOEMLeafletPosition(point.position, this.region), {\n interactive: true, keyboard: false, bubblingMouseEvents: false,\n icon: L.divIcon({ html: this.createMarkerVisual(type, point),\n className: `${type.noFrame ? 'noFrameMarkerIcon' : 'frameMarkerIcon'} incompleteMarker`,\n iconSize: type.noFrame ? [50, 50] : [32, 32], iconAnchor: type.noFrame ? [25, 25] : [16, 32] }),\n });\n }\n\n private createPointCluster(type: OEMPointType): L.MarkerClusterGroup {\n return L.markerClusterGroup({\n showCoverageOnHover: false,\n zoomToBoundsOnClick: !this.options.lockZoom,\n spiderfyOnMaxZoom: !this.options.lockZoom,\n disableClusteringAtZoom: 2,\n maxClusterRadius: 60,\n iconCreateFunction: (cluster) => L.divIcon({\n html: this.createMarkerVisual(type, undefined, cluster.getChildCount()),\n className: `${type.noFrame ? 'noFrameMarkerIcon' : 'frameMarkerIcon'} markerClusterCustom`,\n iconSize: type.noFrame ? [50, 50] : [32, 32],\n iconAnchor: type.noFrame ? [25, 25] : [16, 32],\n }),\n });\n }\n\n /** Rebuilds visible markers and groups eligible types with Atlos clustering rules. */\n private renderPoints(): void {\n this.clearPointLayers();\n const types = this.filter.types ? new Set(this.filter.types) : undefined;\n const subregions = this.filter.subregions ? new Set(this.filter.subregions) : undefined;\n for (const point of this.points) {\n if (types && !types.has(point.type)) continue;\n if (subregions && !subregions.has(point.subregionId)) continue;\n if (this.filter.floorOnly && point.position.floorId !== this.floorId) continue;\n const type = this.types[point.type];\n if (!type) continue;\n const marker = this.createPointMarker(point, type);\n if (this.markerClustering && CLUSTER_SUBCATEGORIES.has(type.category.sub)) {\n let group = this.pointClusters.get(type.key);\n if (!group) {\n group = this.createPointCluster(type);\n this.pointClusters.set(type.key, group);\n }\n group.addLayer(marker);\n } else marker.addTo(this.pointsLayer);\n }\n for (const group of this.pointClusters.values()) if (group.getLayers().length) group.addTo(this.map);\n }\n\n /** Renders Atlos-style fill and dashed stroke layers for published subregions. */\n private renderBoundaries(boundaries: OEMBoundary[]): void {\n this.boundariesLayer.clearLayers();\n for (const boundary of boundaries) {\n const rings = boundary.rings.map((ring) => ring.map((position) => toOEMLeafletPosition(position, this.region)));\n L.polygon(rings, { color: 'transparent', fillOpacity: 0.2, interactive: false,\n className: 'subregionBoundaryFill' }).addTo(this.boundariesLayer);\n L.polygon(rings, { weight: 2, opacity: 0.8, fill: false, interactive: false,\n className: 'subregionBoundaryStroke' }).addTo(this.boundariesLayer);\n }\n }\n /** Renders Atlos site or subregion labels according to the current zoom. */\n private renderLabels(force = false): void {\n const showSub = this.map.getZoom() <= 0.25 && this.labels.some((label) => label.type === 'sub');\n const visibleType: OEMLabel['type'] = showSub ? 'sub' : 'site';\n if (!force && visibleType === this.visibleLabelType) return;\n this.visibleLabelType = visibleType;\n this.labelsLayer.clearLayers();\n for (const label of this.labels) {\n if (label.type !== visibleType) continue;\n const inner = document.createElement('div');\n inner.className = label.type === 'sub' ? 'innerSub' : 'innerSite';\n inner.textContent = this.messages[label.textKey] ?? label.id.split('/').at(-1) ?? label.id;\n new OEMMarker(toOEMLeafletPosition(label.position, this.region), {\n pane: 'placeLabels', interactive: false, keyboard: false,\n icon: L.divIcon({ className: 'mapLabel', html: inner, iconSize: [0, 0] }),\n }).addTo(this.labelsLayer);\n }\n }\n /** Recalculates Leaflet dimensions after the host element changes size. */\n resize(): void { if (!this.destroyed) this.map.invalidateSize({ animate: false }); }\n\n /** Releases listeners, observers, pending requests, layers and DOM nodes. */\n destroy = (): void => {\n if (this.destroyed) return;\n this.destroyed = true;\n this.cancelRequests();\n this.customPointsRequest?.controller.abort();\n this.customPointsRequest = undefined;\n if (this.overdragFrame !== undefined) cancelAnimationFrame(this.overdragFrame);\n this.observer?.disconnect();\n this.wheel.dispose();\n this.options.signal?.removeEventListener('abort', this.destroy);\n this.listeners.clear();\n this.map.remove();\n this.root.remove();\n this.points = [];\n this.customPoints = [];\n this.clickPoints = [];\n this.clickPointOptions = undefined;\n this.customPointsLayer.clearLayers();\n this.pointShardRequests.clear();\n mounted.delete(this.container);\n };\n}\n", "import L from 'leaflet';\nimport { WHEEL_GESTURE_IDLE_MS, WheelInputRouter, type WheelGestureMode, } from 'trackpad-input';\nconst ZOOM_PER_WHEEL_PIXEL = 0.003;\nconst TRACKPAD_PINCH_ZOOM_PER_PIXEL = 0.01;\nconst INERTIA_INITIAL_FACTOR = 0.07;\nconst INERTIA_MAX_STEP = 0.008;\nconst INERTIA_FRICTION_PER_FRAME = 0.72;\nconst INERTIA_STOP_THRESHOLD = 0.00025;\nconst FRAME_DURATION = 1000 / 60;\nconst TRACKPAD_OVERDRAG_MAX_PX = 96;\nconst TRACKPAD_OVERDRAG_RESISTANCE = 0.65;\nconst TRACKPAD_OVERDRAG_SETTLE_THRESHOLD_PX = 80;\nconst TRACKPAD_OVERDRAG_SETTLE_MS = 48;\ninterface ContinuousZoomEventData {\n pinch: true;\n round: false;\n}\nconst CONTINUOUS_ZOOM_EVENT_DATA: ContinuousZoomEventData = {\n pinch: true,\n round: false,\n};\nexport interface SmoothWheelZoomOptions {\n /** Enables inertial continuation after wheel zoom input. */\n enableInertia?: boolean;\n /** Enables trackpad gestures classified as map panning. */\n panEnabled?: boolean;\n /** Enables wheel and trackpad gestures classified as map zooming. */\n zoomEnabled?: boolean;\n}\ninterface ContinuousZoomMap extends L.Map {\n _animatingZoom?: boolean;\n _getMapPanePos(): L.Point;\n _getNewPixelOrigin(center: L.LatLng, zoom: number): L.Point;\n _latLngToNewLayerPoint(latLng: L.LatLng, zoom: number, center: L.LatLng): L.Point;\n _limitCenter(center: L.LatLng, zoom: number, bounds: L.LatLngBounds): L.LatLng;\n _limitZoom(zoom: number): number;\n _move(center: L.LatLng, zoom: number, data?: ContinuousZoomEventData): this;\n _moveEnd(zoomChanged: boolean): this;\n _moveStart(zoomChanged: boolean, noMoveStart: boolean): this;\n _onZoomTransitionEnd?(): void;\n _rawPanBy(offset: L.Point): void;\n _stop(): this;\n}\ninterface SubpixelMarker {\n _icon?: HTMLElement;\n _latlng: L.LatLng;\n _map?: ContinuousZoomMap;\n _setPos(point: L.Point): void;\n}\ninterface MarkerZoomAnimation {\n center: L.LatLng;\n zoom: number;\n}\nconst installSubpixelPixelOrigin = (map: ContinuousZoomMap) => {\n map._getNewPixelOrigin = function (center, zoom) {\n return this.project(center, zoom)\n .subtract(this.getSize().divideBy(2))\n .add(this._getMapPanePos());\n };\n map.latLngToLayerPoint = function (latLng) {\n return this.project(latLng, this.getZoom()).subtract(this.getPixelOrigin());\n };\n};\nexport class SmoothWheelZoom {\n private readonly map: ContinuousZoomMap;\n private readonly container: HTMLElement;\n private readonly inertiaEnabled: boolean;\n private readonly panEnabled: boolean;\n private readonly zoomEnabled: boolean;\n private readonly wheelInputRouter: WheelInputRouter<WheelEvent>;\n private zoomFrame: number | null = null;\n private panFrame: number | null = null;\n private endTimer: number | null = null;\n private panTailTimer: number | null = null;\n private targetZoom: number | null = null;\n private anchorPoint: L.Point | null = null;\n private anchorLatLng: L.LatLng | null = null;\n private zoomVelocity = 0;\n private lastZoomInputTime: number | null = null;\n private inertiaStep = 0;\n private lastFrameTime: number | null = null;\n private pendingPanOffset = L.point(0, 0);\n private panRawCenterPoint: L.Point | null = null;\n private gestureMode: WheelGestureMode | null = null;\n private gestureActive = false;\n private trackpadDragging = false;\n private overdragSettling = false;\n private disposed = false;\n constructor(map: L.Map, options: SmoothWheelZoomOptions = {}) {\n this.map = map as ContinuousZoomMap;\n this.container = map.getContainer();\n this.inertiaEnabled = options.enableInertia ?? true;\n this.panEnabled = options.panEnabled ?? true;\n this.zoomEnabled = options.zoomEnabled ?? true;\n this.wheelInputRouter = new WheelInputRouter<WheelEvent>({\n onPan: (event) => this.handleRoutedWheel('pan', event),\n onZoom: (event) => this.handleRoutedWheel('zoom', event),\n });\n installSubpixelPixelOrigin(this.map);\n map.scrollWheelZoom.disable();\n this.container.addEventListener('wheel', this.handleWheel, {\n passive: false,\n });\n map.once('unload', this.dispose);\n }\n dispose = () => {\n if (this.disposed)\n return;\n this.disposed = true;\n this.container.removeEventListener('wheel', this.handleWheel);\n this.map.off('unload', this.dispose);\n this.clearScheduledWork();\n };\n private handleWheel = (event: WheelEvent) => {\n event.preventDefault();\n event.stopPropagation();\n this.finishLeafletZoomAnimation();\n const gestureMode = this.wheelInputRouter.route(event);\n if (gestureMode === 'pending' && this.overdragSettling) {\n this.clearOverdragSettlement();\n }\n };\n private handleRoutedWheel(gestureMode: WheelGestureMode, event: WheelEvent) {\n if ((gestureMode === 'pan' && !this.panEnabled) || (gestureMode === 'zoom' && !this.zoomEnabled))\n return;\n if (this.overdragSettling && gestureMode === 'pan') {\n this.schedulePanTailRelease();\n return;\n }\n if (this.overdragSettling)\n this.clearOverdragSettlement();\n this.routeWheelEvent(gestureMode, event);\n }\n private routeWheelEvent(gestureMode: WheelGestureMode, event: WheelEvent) {\n if (this.gestureActive &&\n this.gestureMode !== null &&\n this.gestureMode !== gestureMode) {\n this.finishGesture();\n }\n this.gestureMode = gestureMode;\n if (gestureMode === 'pan') {\n this.handleTrackpadPan(event);\n return;\n }\n this.handleZoom(event);\n }\n private handleZoom(event: WheelEvent) {\n const wheelDelta = L.DomEvent.getWheelDelta(event);\n if (!wheelDelta)\n return;\n const zoomDelta = event.ctrlKey && event.deltaMode === 0\n ? -event.deltaY * TRACKPAD_PINCH_ZOOM_PER_PIXEL\n : wheelDelta * ZOOM_PER_WHEEL_PIXEL;\n const currentTarget = this.targetZoom ?? this.map.getZoom();\n const nextTarget = this.map._limitZoom(currentTarget + zoomDelta);\n this.updateAnchor(event);\n this.targetZoom = nextTarget;\n if (this.inertiaEnabled) {\n this.updateZoomVelocity(nextTarget - currentTarget, performance.now());\n this.inertiaStep = Math.max(-INERTIA_MAX_STEP, Math.min(INERTIA_MAX_STEP, this.zoomVelocity * INERTIA_INITIAL_FACTOR));\n }\n else {\n this.inertiaStep = 0;\n }\n if (nextTarget !== this.map.getZoom())\n this.startGesture(true);\n if (this.gestureActive &&\n nextTarget !== this.map.getZoom() &&\n this.zoomFrame === null) {\n this.zoomFrame = requestAnimationFrame(this.applyZoomFrame);\n }\n this.scheduleGestureEnd();\n }\n private handleTrackpadPan(event: WheelEvent) {\n const offset = L.point(event.deltaX, event.deltaY);\n if (offset.x === 0 && offset.y === 0) {\n if (this.gestureActive && !this.overdragSettling) {\n this.scheduleGestureEnd();\n }\n return;\n }\n const wasActive = this.gestureActive;\n this.startGesture(false);\n if (!wasActive) {\n this.trackpadDragging = true;\n this.map.fire('dragstart');\n }\n this.pendingPanOffset = this.pendingPanOffset.add(offset);\n if (this.panFrame === null) {\n this.panFrame = requestAnimationFrame(this.applyPanFrame);\n }\n if (!this.overdragSettling)\n this.scheduleGestureEnd();\n }\n private startGesture(zoomChanged: boolean) {\n if (this.gestureActive)\n return;\n this.map._stop();\n this.map._moveStart(zoomChanged, false);\n this.gestureActive = true;\n }\n private updateAnchor(event: WheelEvent) {\n const point = this.map.mouseEventToContainerPoint(event);\n if (this.anchorPoint?.equals(point) && this.anchorLatLng !== null) {\n return;\n }\n this.anchorPoint = point;\n this.anchorLatLng = this.continuousContainerPointToLatLng(point);\n }\n private continuousContainerPointToLatLng(point: L.Point) {\n const centerPoint = this.map.getSize().divideBy(2);\n const center = this.map.getCenter();\n const zoom = this.map.getZoom();\n return this.map.unproject(this.map.project(center, zoom).add(point.subtract(centerPoint)), zoom);\n }\n private updateZoomVelocity(delta: number, timestamp: number) {\n if (this.lastZoomInputTime === null ||\n delta * this.zoomVelocity <= 0 ||\n timestamp - this.lastZoomInputTime > WHEEL_GESTURE_IDLE_MS) {\n this.zoomVelocity = delta;\n }\n else {\n const elapsed = Math.max(8, Math.min(40, timestamp - this.lastZoomInputTime));\n const frameDelta = delta * (FRAME_DURATION / elapsed);\n this.zoomVelocity = this.zoomVelocity * 0.65 + frameDelta * 0.35;\n }\n this.lastZoomInputTime = timestamp;\n }\n private applyZoomFrame = (timestamp: number) => {\n this.zoomFrame = null;\n if (!this.gestureActive)\n return;\n const elapsed = this.lastFrameTime === null\n ? FRAME_DURATION\n : Math.max(8, Math.min(34, timestamp - this.lastFrameTime));\n this.lastFrameTime = timestamp;\n const currentZoom = this.map.getZoom();\n const directTarget = this.targetZoom;\n let zoom = directTarget ?? currentZoom;\n this.targetZoom = null;\n if (this.inertiaEnabled && directTarget === null) {\n if (Math.abs(this.inertiaStep) < INERTIA_STOP_THRESHOLD) {\n this.inertiaStep = 0;\n }\n else {\n const zoomBeforeInertia = zoom;\n zoom = this.map._limitZoom(zoom + this.inertiaStep * (elapsed / FRAME_DURATION));\n if (zoom === zoomBeforeInertia) {\n this.inertiaStep = 0;\n }\n else {\n this.inertiaStep *= Math.pow(INERTIA_FRICTION_PER_FRAME, elapsed / FRAME_DURATION);\n }\n }\n }\n if (zoom !== currentZoom) {\n this.moveToZoom(zoom);\n }\n if (this.targetZoom !== null ||\n (this.inertiaEnabled &&\n Math.abs(this.inertiaStep) >= INERTIA_STOP_THRESHOLD)) {\n this.zoomFrame = requestAnimationFrame(this.applyZoomFrame);\n return;\n }\n this.lastFrameTime = null;\n if (this.endTimer === null) {\n this.finishGesture();\n }\n };\n private applyPanFrame = () => {\n this.panFrame = null;\n if (!this.gestureActive || this.gestureMode !== 'pan')\n return;\n const offset = this.pendingPanOffset;\n this.pendingPanOffset = L.point(0, 0);\n if (offset.x !== 0 || offset.y !== 0) {\n const overdragAmount = this.applyConstrainedPan(offset);\n this.map.fire('move').fire('drag');\n if (overdragAmount >= TRACKPAD_OVERDRAG_SETTLE_THRESHOLD_PX) {\n this.beginOverdragSettlement();\n }\n }\n if (this.pendingPanOffset.x !== 0 || this.pendingPanOffset.y !== 0) {\n this.panFrame = requestAnimationFrame(this.applyPanFrame);\n return;\n }\n if (this.endTimer === null) {\n this.finishGesture();\n }\n };\n private applyConstrainedPan(offset: L.Point) {\n const zoom = this.map.getZoom();\n const currentCenterPoint = this.map.project(this.map.getCenter(), zoom);\n this.panRawCenterPoint ??= currentCenterPoint;\n this.panRawCenterPoint = this.panRawCenterPoint.add(offset);\n const configuredBounds = this.map.options.maxBounds;\n if (!configuredBounds) {\n this.map._rawPanBy(offset);\n return 0;\n }\n const maxBounds = configuredBounds instanceof L.LatLngBounds\n ? configuredBounds\n : L.latLngBounds(configuredBounds);\n const rawCenter = this.map.unproject(this.panRawCenterPoint, zoom);\n const limitedCenter = this.map._limitCenter(rawCenter, zoom, maxBounds);\n const limitedCenterPoint = this.map.project(limitedCenter, zoom);\n const rawOverdrag = this.panRawCenterPoint.subtract(limitedCenterPoint);\n const visualOverdrag = L.point(this.resistOverdrag(rawOverdrag.x), this.resistOverdrag(rawOverdrag.y));\n const visualCenterPoint = limitedCenterPoint.add(visualOverdrag);\n const visualOffset = visualCenterPoint.subtract(currentCenterPoint);\n if (visualOffset.x !== 0 || visualOffset.y !== 0) {\n this.map._rawPanBy(visualOffset);\n }\n return Math.max(Math.abs(visualOverdrag.x), Math.abs(visualOverdrag.y));\n }\n private resistOverdrag(value: number) {\n if (value === 0)\n return 0;\n const magnitude = TRACKPAD_OVERDRAG_MAX_PX *\n (1 -\n Math.exp((-Math.abs(value) * TRACKPAD_OVERDRAG_RESISTANCE) /\n TRACKPAD_OVERDRAG_MAX_PX));\n return Math.sign(value) * magnitude;\n }\n private beginOverdragSettlement() {\n if (this.overdragSettling)\n return;\n this.overdragSettling = true;\n this.schedulePanTailRelease();\n if (this.endTimer !== null)\n window.clearTimeout(this.endTimer);\n this.endTimer = window.setTimeout(this.handleGestureEnd, TRACKPAD_OVERDRAG_SETTLE_MS);\n }\n private schedulePanTailRelease() {\n if (this.panTailTimer !== null) {\n window.clearTimeout(this.panTailTimer);\n }\n this.panTailTimer = window.setTimeout(() => {\n this.panTailTimer = null;\n this.overdragSettling = false;\n }, WHEEL_GESTURE_IDLE_MS);\n }\n private clearOverdragSettlement() {\n this.overdragSettling = false;\n if (this.panTailTimer !== null) {\n window.clearTimeout(this.panTailTimer);\n this.panTailTimer = null;\n }\n }\n private moveToZoom(zoom: number) {\n if (this.anchorPoint === null || this.anchorLatLng === null)\n return;\n const centerPoint = this.map.getSize().divideBy(2);\n const cursorOffset = this.anchorPoint.subtract(centerPoint);\n let center = this.map.unproject(this.map.project(this.anchorLatLng, zoom).subtract(cursorOffset), zoom);\n const configuredBounds = this.map.options.maxBounds;\n if (configuredBounds) {\n const maxBounds = configuredBounds instanceof L.LatLngBounds\n ? configuredBounds\n : L.latLngBounds(configuredBounds);\n center = this.map._limitCenter(center, zoom, maxBounds);\n }\n this.map._move(center, zoom, CONTINUOUS_ZOOM_EVENT_DATA);\n }\n private scheduleGestureEnd() {\n if (this.endTimer !== null) {\n window.clearTimeout(this.endTimer);\n }\n this.endTimer = window.setTimeout(this.handleGestureEnd, WHEEL_GESTURE_IDLE_MS);\n }\n private handleGestureEnd = () => {\n this.endTimer = null;\n if (this.zoomFrame === null &&\n this.panFrame === null &&\n this.targetZoom === null &&\n this.pendingPanOffset.x === 0 &&\n this.pendingPanOffset.y === 0 &&\n (!this.inertiaEnabled ||\n Math.abs(this.inertiaStep) < INERTIA_STOP_THRESHOLD)) {\n this.finishGesture();\n }\n };\n private finishGesture() {\n if (this.endTimer !== null) {\n window.clearTimeout(this.endTimer);\n this.endTimer = null;\n }\n if (this.zoomFrame !== null) {\n cancelAnimationFrame(this.zoomFrame);\n this.zoomFrame = null;\n }\n if (this.panFrame !== null) {\n cancelAnimationFrame(this.panFrame);\n this.panFrame = null;\n }\n if (!this.gestureActive) {\n this.resetVisualState();\n return;\n }\n const wasTrackpadDrag = this.trackpadDragging;\n this.gestureActive = false;\n this.trackpadDragging = false;\n if (wasTrackpadDrag)\n this.map.fire('dragend');\n this.map._moveEnd(this.gestureMode === 'zoom');\n this.resetVisualState();\n }\n private finishLeafletZoomAnimation() {\n if (this.map._animatingZoom) {\n this.map._onZoomTransitionEnd?.();\n }\n }\n private resetVisualState() {\n this.targetZoom = null;\n this.anchorPoint = null;\n this.anchorLatLng = null;\n this.zoomVelocity = 0;\n this.lastZoomInputTime = null;\n this.inertiaStep = 0;\n this.lastFrameTime = null;\n this.pendingPanOffset = L.point(0, 0);\n this.panRawCenterPoint = null;\n this.gestureMode = null;\n this.trackpadDragging = false;\n }\n private clearScheduledWork() {\n if (this.zoomFrame !== null) {\n cancelAnimationFrame(this.zoomFrame);\n this.zoomFrame = null;\n }\n if (this.panFrame !== null) {\n cancelAnimationFrame(this.panFrame);\n this.panFrame = null;\n }\n if (this.endTimer !== null) {\n window.clearTimeout(this.endTimer);\n this.endTimer = null;\n }\n this.clearOverdragSettlement();\n this.gestureActive = false;\n this.resetVisualState();\n this.wheelInputRouter.dispose();\n }\n}\nexport const enableSmoothWheelZoom = (map: L.Map, options?: SmoothWheelZoomOptions) => new SmoothWheelZoom(map, options);\n", "import L from 'leaflet';\ninterface BoundsAwareMap extends L.Map {\n _limitCenter(center: L.LatLng, zoom: number, bounds: L.LatLngBounds): L.LatLng;\n}\nexport const toMapBounds = (bounds: L.Map['options']['maxBounds']): L.LatLngBounds | null => {\n if (!bounds)\n return null;\n if (bounds instanceof L.LatLngBounds)\n return bounds;\n return Array.isArray(bounds) && bounds.length === 2\n ? L.latLngBounds(bounds[0], bounds[1])\n : null;\n};\nexport const isMapOverdragged = (map: L.Map, bounds: L.LatLngBounds): boolean => {\n const constrainedMap = map as BoundsAwareMap;\n const center = map.getCenter();\n const constrainedCenter = constrainedMap._limitCenter(center, map.getZoom(), bounds);\n return (map\n .project(center, map.getZoom())\n .distanceTo(map.project(constrainedCenter, map.getZoom())) > 1);\n};\n", "<svg width=\"83\" height=\"81\" viewBox=\"0 0 83 81\" xmlns=\"http://www.w3.org/2000/svg\">\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M41.3763 0C18.4963 0 0 18.5625 0 41.5268C0 59.8835 11.8512 75.422 28.292 80.9215C30.3475 81.335 31.1004 80.028 31.1004 78.9286C31.1004 77.9659 31.0327 74.666 31.0327 71.2277C19.5228 73.7032 17.1259 66.2774 17.1259 66.2774C15.2762 61.4647 12.5355 60.2277 12.5355 60.2277C8.76836 57.6838 12.8099 57.6838 12.8099 57.6838C16.9887 57.9589 19.1815 61.9464 19.1815 61.9464C22.8801 68.2712 28.84 66.4841 31.2376 65.3839C31.5798 62.7024 32.6766 60.8462 33.8411 59.8151C24.6612 58.8524 15.0027 55.2774 15.0027 39.3263C15.0027 34.7887 16.6457 31.0762 19.2492 28.1888C18.8385 27.1578 17.3995 22.8943 19.6608 17.188C19.6608 17.188 23.1545 16.0878 31.0318 21.4507C34.4044 20.5417 37.8825 20.0792 41.3763 20.0753C44.87 20.0753 48.4314 20.5571 51.72 21.4507C59.5982 16.0878 63.0919 17.188 63.0919 17.188C65.3532 22.8943 63.9134 27.1578 63.5026 28.1888C66.1747 31.0762 67.75 34.7887 67.75 39.3263C67.75 55.2774 58.0915 58.7832 48.843 59.8151C50.3505 61.1213 51.6514 63.596 51.6514 67.5152C51.6514 73.0839 51.5837 77.5533 51.5837 78.9277C51.5837 80.028 52.3374 81.335 54.3921 80.9224C70.8329 75.4211 82.6841 59.8835 82.6841 41.5268C82.7518 18.5625 64.1878 0 41.3763 0Z\"/>\n</svg>\n", "import type { OEMBoundary } from '@opendfieldmap/core';\n\nexport type GeometryPoint = { x: number; z: number };\n\nconst pointOnSegment = (point: GeometryPoint, start: GeometryPoint, end: GeometryPoint): boolean => {\n const cross = (point.x - start.x) * (end.z - start.z) - (point.z - start.z) * (end.x - start.x);\n if (Math.abs(cross) > 1e-7) return false;\n return point.x >= Math.min(start.x, end.x) - 1e-7 && point.x <= Math.max(start.x, end.x) + 1e-7 &&\n point.z >= Math.min(start.z, end.z) - 1e-7 && point.z <= Math.max(start.z, end.z) + 1e-7;\n};\n\nconst pointInRing = (point: GeometryPoint, ring: readonly GeometryPoint[]): boolean => {\n let inside = false;\n for (let index = 0, previous = ring.length - 1; index < ring.length; previous = index++) {\n const current = ring[index];\n const prior = ring[previous];\n if (pointOnSegment(point, prior, current)) return true;\n const crosses = (current.z > point.z) !== (prior.z > point.z);\n if (crosses && point.x < (prior.x - current.x) * (point.z - current.z) / (prior.z - current.z) + current.x) inside = !inside;\n }\n return inside;\n};\n\nconst distanceSquaredToSegment = (point: GeometryPoint, start: GeometryPoint, end: GeometryPoint): number => {\n const dx = end.x - start.x;\n const dz = end.z - start.z;\n const lengthSquared = dx * dx + dz * dz;\n if (!lengthSquared) return (point.x - start.x) ** 2 + (point.z - start.z) ** 2;\n const projection = Math.max(0, Math.min(1, ((point.x - start.x) * dx + (point.z - start.z) * dz) / lengthSquared));\n const nearestX = start.x + projection * dx;\n const nearestZ = start.z + projection * dz;\n return (point.x - nearestX) ** 2 + (point.z - nearestZ) ** 2;\n};\n\n/** Scores a boundary for hit-testing, including polygon holes and edge distance. */\nexport const boundaryScore = (boundary: OEMBoundary, point: GeometryPoint): { id: string; inside: boolean; distance: number } => {\n const rings = boundary.rings.map((ring) => ring as readonly GeometryPoint[]);\n const distances = rings.flatMap((ring) => ring.map((start, index) =>\n distanceSquaredToSegment(point, start, ring[(index + 1) % ring.length])));\n const insideOuter = rings.length > 0 && pointInRing(point, rings[0]);\n const insideHole = rings.slice(1).some((ring) => pointInRing(point, ring));\n return { id: boundary.id, inside: insideOuter && !insideHole, distance: Math.min(...distances, Infinity) };\n};\n", "import L from 'leaflet';\nimport type { OEMFloor, OEMRegion } from '@opendfieldmap/core';\nimport { SmoothTileLayer } from '../atlos/smoothTileLayer';\nimport { appendOEMTileVersion, lookupOEMTile } from '../tileVersion';\n\n/** Leaflet marker with the subpixel positioning used by Atlos. */\nexport class OEMMarker extends L.Marker {\n update(): this {\n const marker = this as unknown as { _icon?: HTMLElement; _map?: L.Map; _latlng: L.LatLng; _setPos(point: L.Point): void };\n if (marker._icon && marker._map) marker._setPos(marker._map.latLngToLayerPoint(marker._latlng));\n return this;\n }\n _animateZoom(event: { center: L.LatLng; zoom: number }): void {\n const marker = this as unknown as {\n _map?: L.Map & { _latLngToNewLayerPoint(latlng: L.LatLng, zoom: number, center: L.LatLng): L.Point };\n _latlng: L.LatLng;\n _setPos(point: L.Point): void;\n };\n if (marker._map) marker._setPos(marker._map._latLngToNewLayerPoint(marker._latlng, event.zoom, event.center));\n }\n}\n\n/** Tile layer that skips coordinates absent from the published coverage index. */\nexport class CoveredTileLayer extends SmoothTileLayer {\n constructor(url: string, options: L.TileLayerOptions, private coverage: OEMRegion['coverage'], private floor: OEMFloor) {\n super(url, options);\n }\n getTileUrl(coords: L.Coords): string {\n const tile = lookupOEMTile(this.coverage, this.floor, coords.z, coords.x, coords.y);\n return appendOEMTileVersion(super.getTileUrl(coords), tile.version);\n }\n _isValidTile(coords: L.Coords): boolean {\n const prototype = L.GridLayer.prototype as unknown as {\n _isValidTile(this: L.GridLayer, value: L.Coords): boolean;\n };\n return prototype._isValidTile.call(this, coords) &&\n lookupOEMTile(this.coverage, this.floor, coords.z, coords.x, coords.y).covered;\n }\n}\n", "import L from 'leaflet';\ninterface TileLevel {\n el: HTMLElement;\n origin: L.Point;\n zoom: number;\n}\ninterface ContinuousPixelMap extends L.Map {\n _getNewPixelOrigin(center: L.LatLng, zoom: number): L.Point;\n}\nexport class SmoothTileLayer extends L.TileLayer {\n _setZoomTransform(level: TileLevel, center: L.LatLng, zoom: number) {\n const map = (this as unknown as {\n _map?: ContinuousPixelMap;\n })._map;\n if (!map)\n return;\n const scale = map.getZoomScale(zoom, level.zoom);\n const translate = level.origin\n .multiplyBy(scale)\n .subtract(map._getNewPixelOrigin(center, zoom));\n if (L.Browser.any3d) {\n L.DomUtil.setTransform(level.el, translate, scale);\n }\n else {\n L.DomUtil.setPosition(level.el, translate);\n }\n }\n}\n", "import type { OEMFloor, OEMRegion } from '@opendfieldmap/core';\n\nexport interface OEMTileLookup { covered: boolean; version?: string }\n\nexport const lookupOEMTile = (\n coverage: OEMRegion['coverage'],\n floor: OEMFloor,\n zoom: number,\n x: number,\n y: number,\n): OEMTileLookup => {\n const ranges = coverage[String(zoom)]?.[floor.id]?.[String(y)] ?? [];\n let offset = 0;\n for (let index = 0; index < ranges.length; index += 2) {\n const start = ranges[index];\n const end = ranges[index + 1];\n if (x >= start && x <= end) {\n return {\n covered: true,\n version: floor.tileVersions?.[String(zoom)]?.[String(y)]?.[offset + x - start],\n };\n }\n offset += end - start + 1;\n }\n return { covered: false };\n};\n\nexport const appendOEMTileVersion = (url: string, version?: string): string =>\n version ? `${url}${url.includes('?') ? '&' : '?'}v=${encodeURIComponent(version)}` : url;\n", "import type { OEMPoint, OEMPointFilter } from '@opendfieldmap/core';\nimport type { OEMCustomPoint } from '../types';\n\nexport const cloneFilter = (filter: OEMPointFilter): OEMPointFilter => ({\n types: filter.types ? [...filter.types] : undefined,\n subregions: filter.subregions ? [...filter.subregions] : undefined,\n floorOnly: filter.floorOnly,\n});\n\nconst sameList = (left?: string[], right?: string[]): boolean =>\n left === right || (!!left && !!right && left.length === right.length &&\n left.every((value, index) => value === right[index]));\n\nexport const sameFilter = (left: OEMPointFilter, right: OEMPointFilter): boolean =>\n left.floorOnly === right.floorOnly &&\n sameList(left.types, right.types) &&\n sameList(left.subregions, right.subregions);\n\nexport const clonePoint = (point: OEMPoint): OEMPoint => ({\n ...point,\n raw: { ...point.raw },\n position: { ...point.position },\n});\n\nexport const cloneCustomPoint = (point: OEMCustomPoint): OEMCustomPoint => ({\n ...point,\n position: { ...point.position },\n});\n\nexport const CLUSTER_SUBCATEGORIES = new Set(['boss', 'collection', 'mob', 'natural', 'valuable', 'exploration']);\nexport const FEATURE_NAMES = ['points', 'labels', 'boundaries'] as const;\nexport type OEMFeatureName = typeof FEATURE_NAMES[number];\nexport const BRAND_URL = 'https://oem.re/';\nexport const GITHUB_URL = 'https://github.com/Terra-Online/OEM-SDK';\nexport const TERMS_URL = 'https://blog.opendfieldmap.org/docs/tos#intellectual-property-and-copyright';\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["L", "L", "L", "L", "L", "L", "value"]
|
|
7
|
-
}
|