mehdi-akbari-map 0.0.1 → 0.0.3

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.
@@ -1 +1 @@
1
- {"version":3,"file":"Map.d.ts","sourceRoot":"","sources":["../../src/components/Map.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAyB,MAAM,UAAU,CAAC;AAE3D,QAAA,MAAM,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,QAAQ,CA2F3B,CAAC;AAEF,eAAe,GAAG,CAAC"}
1
+ {"version":3,"file":"Map.d.ts","sourceRoot":"","sources":["../../src/components/Map.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAyB,MAAM,UAAU,CAAC;AAE3D,QAAA,MAAM,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,QAAQ,CAwH3B,CAAC;AAEF,eAAe,GAAG,CAAC"}
package/dist/index.cjs CHANGED
@@ -1,2 +1,134 @@
1
1
  "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/index.ts
31
+ var src_exports = {};
32
+ __export(src_exports, {
33
+ NeshanMap: () => Map_default
34
+ });
35
+ module.exports = __toCommonJS(src_exports);
36
+
37
+ // src/components/Map.tsx
38
+ var import_react = require("react");
39
+ var import_jsx_runtime = require("react/jsx-runtime");
40
+ var Map = ({
41
+ options,
42
+ markers = [],
43
+ selectedMarkerId = null,
44
+ onMarkerClick,
45
+ onMapLoad,
46
+ children,
47
+ className = "",
48
+ style = { width: "100%", height: "100%" }
49
+ }) => {
50
+ const mapContainerRef = (0, import_react.useRef)(null);
51
+ const mapInstanceRef = (0, import_react.useRef)(null);
52
+ const markersRef = (0, import_react.useRef)([]);
53
+ const [mapLib, setMapLib] = (0, import_react.useState)(null);
54
+ const [isLoaded, setIsLoaded] = (0, import_react.useState)(false);
55
+ (0, import_react.useEffect)(() => {
56
+ if (typeof window === "undefined") return;
57
+ let canceled = false;
58
+ import("@neshan-maps-platform/mapbox-gl").then((mod) => {
59
+ if (!canceled) {
60
+ setMapLib(mod.default || mod);
61
+ setIsLoaded(true);
62
+ }
63
+ }).catch((err) => {
64
+ console.error("\u062E\u0637\u0627 \u062F\u0631 \u0644\u0648\u062F \u0646\u0642\u0634\u0647 \u0646\u0634\u0627\u0646:", err);
65
+ });
66
+ return () => {
67
+ canceled = true;
68
+ };
69
+ }, []);
70
+ (0, import_react.useEffect)(() => {
71
+ if (!mapLib || !mapContainerRef.current || mapInstanceRef.current) return;
72
+ try {
73
+ const map = new mapLib.Map({
74
+ container: mapContainerRef.current,
75
+ ...options
76
+ });
77
+ map.on("load", () => {
78
+ mapInstanceRef.current = map;
79
+ onMapLoad?.(map);
80
+ });
81
+ return () => {
82
+ markersRef.current.forEach((m) => m.remove());
83
+ markersRef.current = [];
84
+ if (mapInstanceRef.current) {
85
+ mapInstanceRef.current.remove();
86
+ mapInstanceRef.current = null;
87
+ }
88
+ };
89
+ } catch (err) {
90
+ console.error("\u062E\u0637\u0627 \u062F\u0631 \u0633\u0627\u062E\u062A \u0646\u0642\u0634\u0647:", err);
91
+ }
92
+ }, [mapLib, options, onMapLoad]);
93
+ (0, import_react.useEffect)(() => {
94
+ if (!mapInstanceRef.current || !mapLib || markers.length === 0) {
95
+ markersRef.current.forEach((m) => m.remove());
96
+ markersRef.current = [];
97
+ return;
98
+ }
99
+ markersRef.current.forEach((m) => m.remove());
100
+ markersRef.current = [];
101
+ markers.forEach((markerData, index) => {
102
+ const el = document.createElement("div");
103
+ el.innerHTML = `
104
+ <div style="
105
+ background: #ef4444;
106
+ width: 32px;
107
+ height: 32px;
108
+ border-radius: 50%;
109
+ border: 4px solid white;
110
+ box-shadow: 0 4px 12px rgba(0,0,0,0.3);
111
+ "></div>
112
+ `;
113
+ el.style.cursor = "pointer";
114
+ el.style.transition = "transform 0.3s ease";
115
+ el.style.transform = markerData.id === selectedMarkerId ? "scale(1.4)" : "scale(1)";
116
+ const marker = new mapLib.Marker({ element: el }).setLngLat([markerData.lng, markerData.lat]).addTo(mapInstanceRef.current);
117
+ el.addEventListener("click", (e) => {
118
+ e.stopPropagation();
119
+ onMarkerClick?.(markerData, index, mapInstanceRef.current);
120
+ });
121
+ markersRef.current.push(marker);
122
+ });
123
+ }, [markers, mapLib, mapInstanceRef.current, onMarkerClick, selectedMarkerId]);
124
+ if (!isLoaded) {
125
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { ...style, display: "flex", alignItems: "center", justifyContent: "center", background: "#f3f4f6" }, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { children: "\u062F\u0631 \u062D\u0627\u0644 \u0628\u0627\u0631\u06AF\u0630\u0627\u0631\u06CC \u0646\u0642\u0634\u0647..." }) });
126
+ }
127
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { ref: mapContainerRef, className, style, children });
128
+ };
129
+ var Map_default = Map;
130
+ // Annotate the CommonJS export names for ESM import in node:
131
+ 0 && (module.exports = {
132
+ NeshanMap
133
+ });
2
134
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/components/Map.tsx"],"sourcesContent":["\r\n\r\n\r\nexport { default as NeshanMap } from './components/Map';\r\n\r\n\r\nexport type {\r\n MapProps,\r\n MapOptions,\r\n MarkerData,\r\n MapboxMap,\r\n LngLatLike,\r\n} from './types';\r\n\r\n\r\n\r\n\r\n\r\n\r\nimport './styles.css';","\r\n\r\n\"use client\";\r\n\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport { MapProps, MapboxMap, MarkerData } from '../types';\r\n\r\nconst Map: React.FC<MapProps> = ({\r\n options,\r\n markers = [],\r\n selectedMarkerId = null,\r\n onMarkerClick,\r\n onMapLoad,\r\n children,\r\n className = '',\r\n style = { width: '100%', height: '100%' },\r\n}) => {\r\n const mapContainerRef = useRef<HTMLDivElement>(null);\r\n const mapInstanceRef = useRef<MapboxMap | null>(null);\r\n const markersRef = useRef<any[]>([]);\r\n const [mapLib, setMapLib] = useState<any>(null);\r\n const [isLoaded, setIsLoaded] = useState(false); \r\n\r\n \r\n useEffect(() => {\r\n if (typeof window === 'undefined') return;\r\n\r\n let canceled = false;\r\n\r\n import('@neshan-maps-platform/mapbox-gl').then((mod) => {\r\n if (!canceled) {\r\n setMapLib(mod.default || mod);\r\n setIsLoaded(true);\r\n }\r\n }).catch((err) => {\r\n console.error(\"خطا در لود نقشه نشان:\", err);\r\n });\r\n\r\n return () => {\r\n canceled = true;\r\n };\r\n }, []);\r\n\r\n \r\n useEffect(() => {\r\n if (!mapLib || !mapContainerRef.current || mapInstanceRef.current) return;\r\n\r\n try {\r\n const map = new mapLib.Map({\r\n container: mapContainerRef.current,\r\n ...options,\r\n });\r\n\r\n map.on('load', () => {\r\n mapInstanceRef.current = map;\r\n onMapLoad?.(map);\r\n });\r\n\r\n return () => {\r\n markersRef.current.forEach((m: any) => m.remove());\r\n markersRef.current = [];\r\n if (mapInstanceRef.current) {\r\n mapInstanceRef.current.remove();\r\n mapInstanceRef.current = null;\r\n }\r\n };\r\n } catch (err) {\r\n console.error(\"خطا در ساخت نقشه:\", err);\r\n }\r\n }, [mapLib, options, onMapLoad]);\r\n\r\n \r\n useEffect(() => {\r\n if (!mapInstanceRef.current || !mapLib || markers.length === 0) {\r\n \r\n markersRef.current.forEach((m: any) => m.remove());\r\n markersRef.current = [];\r\n return;\r\n }\r\n\r\n \r\n markersRef.current.forEach((m: any) => m.remove());\r\n markersRef.current = [];\r\n\r\n markers.forEach((markerData: MarkerData, index: number) => {\r\n const el = document.createElement('div');\r\n el.innerHTML = `\r\n <div style=\"\r\n background: #ef4444;\r\n width: 32px;\r\n height: 32px;\r\n border-radius: 50%;\r\n border: 4px solid white;\r\n box-shadow: 0 4px 12px rgba(0,0,0,0.3);\r\n \"></div>\r\n `;\r\n el.style.cursor = 'pointer';\r\n el.style.transition = 'transform 0.3s ease';\r\n el.style.transform = markerData.id === selectedMarkerId ? 'scale(1.4)' : 'scale(1)';\r\n\r\n const marker = new mapLib.Marker({ element: el })\r\n .setLngLat([markerData.lng, markerData.lat])\r\n .addTo(mapInstanceRef.current!);\r\n\r\n el.addEventListener('click', (e) => {\r\n e.stopPropagation();\r\n onMarkerClick?.(markerData, index, mapInstanceRef.current!);\r\n });\r\n\r\n markersRef.current.push(marker);\r\n });\r\n }, [markers, mapLib, mapInstanceRef.current, onMarkerClick, selectedMarkerId]);\r\n\r\n \r\n if (!isLoaded) {\r\n return (\r\n <div style={{ ...style, display: 'flex', alignItems: 'center', justifyContent: 'center', background: '#f3f4f6' }}>\r\n <p>در حال بارگذاری نقشه...</p>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div ref={mapContainerRef} className={className} style={style}>\r\n {children}\r\n </div>\r\n );\r\n};\r\n\r\nexport default Map;"],"mappings":"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","names":[]}
package/dist/index.css CHANGED
@@ -1,2 +1,38 @@
1
1
  /* src/styles.css */
2
+ .neshan-map-container * {
3
+ box-sizing: border-box;
4
+ }
5
+ .neshan-marker {
6
+ transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
7
+ will-change: transform;
8
+ }
9
+ .neshan-marker:hover {
10
+ transform: scale(1.2) !important;
11
+ }
12
+ .neshan-marker-label {
13
+ background: white;
14
+ color: #1f2937;
15
+ font-size: 10px;
16
+ font-weight: bold;
17
+ padding: 4px 8px;
18
+ border-radius: 6px;
19
+ margin-top: 4px;
20
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);
21
+ white-space: nowrap;
22
+ pointer-events: none;
23
+ }
24
+ .neshan-marker-selected {
25
+ animation: pulse 2s infinite;
26
+ }
27
+ @keyframes pulse {
28
+ 0% {
29
+ transform: scale(1);
30
+ }
31
+ 50% {
32
+ transform: scale(1.15);
33
+ }
34
+ 100% {
35
+ transform: scale(1);
36
+ }
37
+ }
2
38
  /*# sourceMappingURL=index.css.map */
@@ -1 +1 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
1
+ {"version":3,"sources":["../src/styles.css"],"sourcesContent":["\r\n\r\n\r\n.neshan-map-container * {\r\n box-sizing: border-box;\r\n}\r\n\r\n\r\n.neshan-marker {\r\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\r\n will-change: transform;\r\n}\r\n\r\n.neshan-marker:hover {\r\n transform: scale(1.2) !important;\r\n}\r\n\r\n\r\n.neshan-marker-label {\r\n background: white;\r\n color: #1f2937;\r\n font-size: 10px;\r\n font-weight: bold;\r\n padding: 4px 8px;\r\n border-radius: 6px;\r\n margin-top: 4px;\r\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);\r\n white-space: nowrap;\r\n pointer-events: none;\r\n}\r\n\r\n\r\n.neshan-marker-selected {\r\n animation: pulse 2s infinite;\r\n}\r\n\r\n@keyframes pulse {\r\n 0% {\r\n transform: scale(1);\r\n }\r\n 50% {\r\n transform: scale(1.15);\r\n }\r\n 100% {\r\n transform: scale(1);\r\n }\r\n}"],"mappings":";AAGA,CAAC,qBAAqB;AACpB,cAAY;AACd;AAGA,CAAC;AACC,cAAY,UAAU,KAAK,aAAa,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE;AACrD,eAAa;AACf;AAEA,CALC,aAKa;AACZ,aAAW,MAAM;AACnB;AAGA,CAAC;AACC,cAAY;AACZ,SAAO;AACP,aAAW;AACX,eAAa;AACb,WAAS,IAAI;AACb,iBAAe;AACf,cAAY;AACZ,cAAY,EAAE,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AACpC,eAAa;AACb,kBAAgB;AAClB;AAGA,CAAC;AACC,aAAW,MAAM,GAAG;AACtB;AAEA,WAHa;AAIX;AACE,eAAW,MAAM;AACnB;AACA;AACE,eAAW,MAAM;AACnB;AACA;AACE,eAAW,MAAM;AACnB;AACF;","names":[]}
package/dist/index.d.ts CHANGED
@@ -1,2 +1,4 @@
1
+ export { default as NeshanMap } from './components/Map';
2
+ export type { MapProps, MapOptions, MarkerData, MapboxMap, LngLatLike, } from './types';
1
3
  import './styles.css';
2
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAGxD,YAAY,EACV,QAAQ,EACR,UAAU,EACV,UAAU,EACV,SAAS,EACT,UAAU,GACX,MAAM,SAAS,CAAC;AAOjB,OAAO,cAAc,CAAC"}
package/dist/index.js CHANGED
@@ -1 +1,97 @@
1
+ // src/components/Map.tsx
2
+ import { useEffect, useRef, useState } from "react";
3
+ import { jsx } from "react/jsx-runtime";
4
+ var Map = ({
5
+ options,
6
+ markers = [],
7
+ selectedMarkerId = null,
8
+ onMarkerClick,
9
+ onMapLoad,
10
+ children,
11
+ className = "",
12
+ style = { width: "100%", height: "100%" }
13
+ }) => {
14
+ const mapContainerRef = useRef(null);
15
+ const mapInstanceRef = useRef(null);
16
+ const markersRef = useRef([]);
17
+ const [mapLib, setMapLib] = useState(null);
18
+ const [isLoaded, setIsLoaded] = useState(false);
19
+ useEffect(() => {
20
+ if (typeof window === "undefined") return;
21
+ let canceled = false;
22
+ import("@neshan-maps-platform/mapbox-gl").then((mod) => {
23
+ if (!canceled) {
24
+ setMapLib(mod.default || mod);
25
+ setIsLoaded(true);
26
+ }
27
+ }).catch((err) => {
28
+ console.error("\u062E\u0637\u0627 \u062F\u0631 \u0644\u0648\u062F \u0646\u0642\u0634\u0647 \u0646\u0634\u0627\u0646:", err);
29
+ });
30
+ return () => {
31
+ canceled = true;
32
+ };
33
+ }, []);
34
+ useEffect(() => {
35
+ if (!mapLib || !mapContainerRef.current || mapInstanceRef.current) return;
36
+ try {
37
+ const map = new mapLib.Map({
38
+ container: mapContainerRef.current,
39
+ ...options
40
+ });
41
+ map.on("load", () => {
42
+ mapInstanceRef.current = map;
43
+ onMapLoad?.(map);
44
+ });
45
+ return () => {
46
+ markersRef.current.forEach((m) => m.remove());
47
+ markersRef.current = [];
48
+ if (mapInstanceRef.current) {
49
+ mapInstanceRef.current.remove();
50
+ mapInstanceRef.current = null;
51
+ }
52
+ };
53
+ } catch (err) {
54
+ console.error("\u062E\u0637\u0627 \u062F\u0631 \u0633\u0627\u062E\u062A \u0646\u0642\u0634\u0647:", err);
55
+ }
56
+ }, [mapLib, options, onMapLoad]);
57
+ useEffect(() => {
58
+ if (!mapInstanceRef.current || !mapLib || markers.length === 0) {
59
+ markersRef.current.forEach((m) => m.remove());
60
+ markersRef.current = [];
61
+ return;
62
+ }
63
+ markersRef.current.forEach((m) => m.remove());
64
+ markersRef.current = [];
65
+ markers.forEach((markerData, index) => {
66
+ const el = document.createElement("div");
67
+ el.innerHTML = `
68
+ <div style="
69
+ background: #ef4444;
70
+ width: 32px;
71
+ height: 32px;
72
+ border-radius: 50%;
73
+ border: 4px solid white;
74
+ box-shadow: 0 4px 12px rgba(0,0,0,0.3);
75
+ "></div>
76
+ `;
77
+ el.style.cursor = "pointer";
78
+ el.style.transition = "transform 0.3s ease";
79
+ el.style.transform = markerData.id === selectedMarkerId ? "scale(1.4)" : "scale(1)";
80
+ const marker = new mapLib.Marker({ element: el }).setLngLat([markerData.lng, markerData.lat]).addTo(mapInstanceRef.current);
81
+ el.addEventListener("click", (e) => {
82
+ e.stopPropagation();
83
+ onMarkerClick?.(markerData, index, mapInstanceRef.current);
84
+ });
85
+ markersRef.current.push(marker);
86
+ });
87
+ }, [markers, mapLib, mapInstanceRef.current, onMarkerClick, selectedMarkerId]);
88
+ if (!isLoaded) {
89
+ return /* @__PURE__ */ jsx("div", { style: { ...style, display: "flex", alignItems: "center", justifyContent: "center", background: "#f3f4f6" }, children: /* @__PURE__ */ jsx("p", { children: "\u062F\u0631 \u062D\u0627\u0644 \u0628\u0627\u0631\u06AF\u0630\u0627\u0631\u06CC \u0646\u0642\u0634\u0647..." }) });
90
+ }
91
+ return /* @__PURE__ */ jsx("div", { ref: mapContainerRef, className, style, children });
92
+ };
93
+ var Map_default = Map;
94
+ export {
95
+ Map_default as NeshanMap
96
+ };
1
97
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
1
+ {"version":3,"sources":["../src/components/Map.tsx"],"sourcesContent":["\r\n\r\n\"use client\";\r\n\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport { MapProps, MapboxMap, MarkerData } from '../types';\r\n\r\nconst Map: React.FC<MapProps> = ({\r\n options,\r\n markers = [],\r\n selectedMarkerId = null,\r\n onMarkerClick,\r\n onMapLoad,\r\n children,\r\n className = '',\r\n style = { width: '100%', height: '100%' },\r\n}) => {\r\n const mapContainerRef = useRef<HTMLDivElement>(null);\r\n const mapInstanceRef = useRef<MapboxMap | null>(null);\r\n const markersRef = useRef<any[]>([]);\r\n const [mapLib, setMapLib] = useState<any>(null);\r\n const [isLoaded, setIsLoaded] = useState(false); \r\n\r\n \r\n useEffect(() => {\r\n if (typeof window === 'undefined') return;\r\n\r\n let canceled = false;\r\n\r\n import('@neshan-maps-platform/mapbox-gl').then((mod) => {\r\n if (!canceled) {\r\n setMapLib(mod.default || mod);\r\n setIsLoaded(true);\r\n }\r\n }).catch((err) => {\r\n console.error(\"خطا در لود نقشه نشان:\", err);\r\n });\r\n\r\n return () => {\r\n canceled = true;\r\n };\r\n }, []);\r\n\r\n \r\n useEffect(() => {\r\n if (!mapLib || !mapContainerRef.current || mapInstanceRef.current) return;\r\n\r\n try {\r\n const map = new mapLib.Map({\r\n container: mapContainerRef.current,\r\n ...options,\r\n });\r\n\r\n map.on('load', () => {\r\n mapInstanceRef.current = map;\r\n onMapLoad?.(map);\r\n });\r\n\r\n return () => {\r\n markersRef.current.forEach((m: any) => m.remove());\r\n markersRef.current = [];\r\n if (mapInstanceRef.current) {\r\n mapInstanceRef.current.remove();\r\n mapInstanceRef.current = null;\r\n }\r\n };\r\n } catch (err) {\r\n console.error(\"خطا در ساخت نقشه:\", err);\r\n }\r\n }, [mapLib, options, onMapLoad]);\r\n\r\n \r\n useEffect(() => {\r\n if (!mapInstanceRef.current || !mapLib || markers.length === 0) {\r\n \r\n markersRef.current.forEach((m: any) => m.remove());\r\n markersRef.current = [];\r\n return;\r\n }\r\n\r\n \r\n markersRef.current.forEach((m: any) => m.remove());\r\n markersRef.current = [];\r\n\r\n markers.forEach((markerData: MarkerData, index: number) => {\r\n const el = document.createElement('div');\r\n el.innerHTML = `\r\n <div style=\"\r\n background: #ef4444;\r\n width: 32px;\r\n height: 32px;\r\n border-radius: 50%;\r\n border: 4px solid white;\r\n box-shadow: 0 4px 12px rgba(0,0,0,0.3);\r\n \"></div>\r\n `;\r\n el.style.cursor = 'pointer';\r\n el.style.transition = 'transform 0.3s ease';\r\n el.style.transform = markerData.id === selectedMarkerId ? 'scale(1.4)' : 'scale(1)';\r\n\r\n const marker = new mapLib.Marker({ element: el })\r\n .setLngLat([markerData.lng, markerData.lat])\r\n .addTo(mapInstanceRef.current!);\r\n\r\n el.addEventListener('click', (e) => {\r\n e.stopPropagation();\r\n onMarkerClick?.(markerData, index, mapInstanceRef.current!);\r\n });\r\n\r\n markersRef.current.push(marker);\r\n });\r\n }, [markers, mapLib, mapInstanceRef.current, onMarkerClick, selectedMarkerId]);\r\n\r\n \r\n if (!isLoaded) {\r\n return (\r\n <div style={{ ...style, display: 'flex', alignItems: 'center', justifyContent: 'center', background: '#f3f4f6' }}>\r\n <p>در حال بارگذاری نقشه...</p>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div ref={mapContainerRef} className={className} style={style}>\r\n {children}\r\n </div>\r\n );\r\n};\r\n\r\nexport default Map;"],"mappings":"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","names":[]}
package/dist/react.cjs CHANGED
@@ -1,3 +1,135 @@
1
1
  "use strict";
2
2
  "use client";
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __export = (target, all) => {
10
+ for (var name in all)
11
+ __defProp(target, name, { get: all[name], enumerable: true });
12
+ };
13
+ var __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (let key of __getOwnPropNames(from))
16
+ if (!__hasOwnProp.call(to, key) && key !== except)
17
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
18
+ }
19
+ return to;
20
+ };
21
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
22
+ // If the importer is in node compatibility mode or this is not an ESM
23
+ // file that has been converted to a CommonJS file using a Babel-
24
+ // compatible transform (i.e. "__esModule" has not been set), then set
25
+ // "default" to the CommonJS "module.exports" for node compatibility.
26
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
27
+ mod
28
+ ));
29
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
+
31
+ // src/react.ts
32
+ var react_exports = {};
33
+ __export(react_exports, {
34
+ NeshanMap: () => Map_default
35
+ });
36
+ module.exports = __toCommonJS(react_exports);
37
+
38
+ // src/components/Map.tsx
39
+ var import_react = require("react");
40
+ var import_jsx_runtime = require("react/jsx-runtime");
41
+ var Map = ({
42
+ options,
43
+ markers = [],
44
+ selectedMarkerId = null,
45
+ onMarkerClick,
46
+ onMapLoad,
47
+ children,
48
+ className = "",
49
+ style = { width: "100%", height: "100%" }
50
+ }) => {
51
+ const mapContainerRef = (0, import_react.useRef)(null);
52
+ const mapInstanceRef = (0, import_react.useRef)(null);
53
+ const markersRef = (0, import_react.useRef)([]);
54
+ const [mapLib, setMapLib] = (0, import_react.useState)(null);
55
+ const [isLoaded, setIsLoaded] = (0, import_react.useState)(false);
56
+ (0, import_react.useEffect)(() => {
57
+ if (typeof window === "undefined") return;
58
+ let canceled = false;
59
+ import("@neshan-maps-platform/mapbox-gl").then((mod) => {
60
+ if (!canceled) {
61
+ setMapLib(mod.default || mod);
62
+ setIsLoaded(true);
63
+ }
64
+ }).catch((err) => {
65
+ console.error("\u062E\u0637\u0627 \u062F\u0631 \u0644\u0648\u062F \u0646\u0642\u0634\u0647 \u0646\u0634\u0627\u0646:", err);
66
+ });
67
+ return () => {
68
+ canceled = true;
69
+ };
70
+ }, []);
71
+ (0, import_react.useEffect)(() => {
72
+ if (!mapLib || !mapContainerRef.current || mapInstanceRef.current) return;
73
+ try {
74
+ const map = new mapLib.Map({
75
+ container: mapContainerRef.current,
76
+ ...options
77
+ });
78
+ map.on("load", () => {
79
+ mapInstanceRef.current = map;
80
+ onMapLoad?.(map);
81
+ });
82
+ return () => {
83
+ markersRef.current.forEach((m) => m.remove());
84
+ markersRef.current = [];
85
+ if (mapInstanceRef.current) {
86
+ mapInstanceRef.current.remove();
87
+ mapInstanceRef.current = null;
88
+ }
89
+ };
90
+ } catch (err) {
91
+ console.error("\u062E\u0637\u0627 \u062F\u0631 \u0633\u0627\u062E\u062A \u0646\u0642\u0634\u0647:", err);
92
+ }
93
+ }, [mapLib, options, onMapLoad]);
94
+ (0, import_react.useEffect)(() => {
95
+ if (!mapInstanceRef.current || !mapLib || markers.length === 0) {
96
+ markersRef.current.forEach((m) => m.remove());
97
+ markersRef.current = [];
98
+ return;
99
+ }
100
+ markersRef.current.forEach((m) => m.remove());
101
+ markersRef.current = [];
102
+ markers.forEach((markerData, index) => {
103
+ const el = document.createElement("div");
104
+ el.innerHTML = `
105
+ <div style="
106
+ background: #ef4444;
107
+ width: 32px;
108
+ height: 32px;
109
+ border-radius: 50%;
110
+ border: 4px solid white;
111
+ box-shadow: 0 4px 12px rgba(0,0,0,0.3);
112
+ "></div>
113
+ `;
114
+ el.style.cursor = "pointer";
115
+ el.style.transition = "transform 0.3s ease";
116
+ el.style.transform = markerData.id === selectedMarkerId ? "scale(1.4)" : "scale(1)";
117
+ const marker = new mapLib.Marker({ element: el }).setLngLat([markerData.lng, markerData.lat]).addTo(mapInstanceRef.current);
118
+ el.addEventListener("click", (e) => {
119
+ e.stopPropagation();
120
+ onMarkerClick?.(markerData, index, mapInstanceRef.current);
121
+ });
122
+ markersRef.current.push(marker);
123
+ });
124
+ }, [markers, mapLib, mapInstanceRef.current, onMarkerClick, selectedMarkerId]);
125
+ if (!isLoaded) {
126
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { ...style, display: "flex", alignItems: "center", justifyContent: "center", background: "#f3f4f6" }, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { children: "\u062F\u0631 \u062D\u0627\u0644 \u0628\u0627\u0631\u06AF\u0630\u0627\u0631\u06CC \u0646\u0642\u0634\u0647..." }) });
127
+ }
128
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { ref: mapContainerRef, className, style, children });
129
+ };
130
+ var Map_default = Map;
131
+ // Annotate the CommonJS export names for ESM import in node:
132
+ 0 && (module.exports = {
133
+ NeshanMap
134
+ });
3
135
  //# sourceMappingURL=react.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
1
+ {"version":3,"sources":["../src/react.ts","../src/components/Map.tsx"],"sourcesContent":["// src/react.ts\r\n\r\n\"use client\";\r\n\r\nexport { default as NeshanMap } from './components/Map';\r\nexport type {\r\n MapProps,\r\n MapOptions,\r\n MarkerData,\r\n} from './types';","\r\n\r\n\"use client\";\r\n\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport { MapProps, MapboxMap, MarkerData } from '../types';\r\n\r\nconst Map: React.FC<MapProps> = ({\r\n options,\r\n markers = [],\r\n selectedMarkerId = null,\r\n onMarkerClick,\r\n onMapLoad,\r\n children,\r\n className = '',\r\n style = { width: '100%', height: '100%' },\r\n}) => {\r\n const mapContainerRef = useRef<HTMLDivElement>(null);\r\n const mapInstanceRef = useRef<MapboxMap | null>(null);\r\n const markersRef = useRef<any[]>([]);\r\n const [mapLib, setMapLib] = useState<any>(null);\r\n const [isLoaded, setIsLoaded] = useState(false); \r\n\r\n \r\n useEffect(() => {\r\n if (typeof window === 'undefined') return;\r\n\r\n let canceled = false;\r\n\r\n import('@neshan-maps-platform/mapbox-gl').then((mod) => {\r\n if (!canceled) {\r\n setMapLib(mod.default || mod);\r\n setIsLoaded(true);\r\n }\r\n }).catch((err) => {\r\n console.error(\"خطا در لود نقشه نشان:\", err);\r\n });\r\n\r\n return () => {\r\n canceled = true;\r\n };\r\n }, []);\r\n\r\n \r\n useEffect(() => {\r\n if (!mapLib || !mapContainerRef.current || mapInstanceRef.current) return;\r\n\r\n try {\r\n const map = new mapLib.Map({\r\n container: mapContainerRef.current,\r\n ...options,\r\n });\r\n\r\n map.on('load', () => {\r\n mapInstanceRef.current = map;\r\n onMapLoad?.(map);\r\n });\r\n\r\n return () => {\r\n markersRef.current.forEach((m: any) => m.remove());\r\n markersRef.current = [];\r\n if (mapInstanceRef.current) {\r\n mapInstanceRef.current.remove();\r\n mapInstanceRef.current = null;\r\n }\r\n };\r\n } catch (err) {\r\n console.error(\"خطا در ساخت نقشه:\", err);\r\n }\r\n }, [mapLib, options, onMapLoad]);\r\n\r\n \r\n useEffect(() => {\r\n if (!mapInstanceRef.current || !mapLib || markers.length === 0) {\r\n \r\n markersRef.current.forEach((m: any) => m.remove());\r\n markersRef.current = [];\r\n return;\r\n }\r\n\r\n \r\n markersRef.current.forEach((m: any) => m.remove());\r\n markersRef.current = [];\r\n\r\n markers.forEach((markerData: MarkerData, index: number) => {\r\n const el = document.createElement('div');\r\n el.innerHTML = `\r\n <div style=\"\r\n background: #ef4444;\r\n width: 32px;\r\n height: 32px;\r\n border-radius: 50%;\r\n border: 4px solid white;\r\n box-shadow: 0 4px 12px rgba(0,0,0,0.3);\r\n \"></div>\r\n `;\r\n el.style.cursor = 'pointer';\r\n el.style.transition = 'transform 0.3s ease';\r\n el.style.transform = markerData.id === selectedMarkerId ? 'scale(1.4)' : 'scale(1)';\r\n\r\n const marker = new mapLib.Marker({ element: el })\r\n .setLngLat([markerData.lng, markerData.lat])\r\n .addTo(mapInstanceRef.current!);\r\n\r\n el.addEventListener('click', (e) => {\r\n e.stopPropagation();\r\n onMarkerClick?.(markerData, index, mapInstanceRef.current!);\r\n });\r\n\r\n markersRef.current.push(marker);\r\n });\r\n }, [markers, mapLib, mapInstanceRef.current, onMarkerClick, selectedMarkerId]);\r\n\r\n \r\n if (!isLoaded) {\r\n return (\r\n <div style={{ ...style, display: 'flex', alignItems: 'center', justifyContent: 'center', background: '#f3f4f6' }}>\r\n <p>در حال بارگذاری نقشه...</p>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div ref={mapContainerRef} className={className} style={style}>\r\n {children}\r\n </div>\r\n );\r\n};\r\n\r\nexport default Map;"],"mappings":"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","names":[]}
package/dist/react.d.ts CHANGED
@@ -1 +1,3 @@
1
+ export { default as NeshanMap } from './components/Map';
2
+ export type { MapProps, MapOptions, MarkerData, } from './types';
1
3
  //# sourceMappingURL=react.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACxD,YAAY,EACV,QAAQ,EACR,UAAU,EACV,UAAU,GACX,MAAM,SAAS,CAAC"}
package/dist/react.js CHANGED
@@ -1,2 +1,99 @@
1
1
  "use client";
2
+
3
+ // src/components/Map.tsx
4
+ import { useEffect, useRef, useState } from "react";
5
+ import { jsx } from "react/jsx-runtime";
6
+ var Map = ({
7
+ options,
8
+ markers = [],
9
+ selectedMarkerId = null,
10
+ onMarkerClick,
11
+ onMapLoad,
12
+ children,
13
+ className = "",
14
+ style = { width: "100%", height: "100%" }
15
+ }) => {
16
+ const mapContainerRef = useRef(null);
17
+ const mapInstanceRef = useRef(null);
18
+ const markersRef = useRef([]);
19
+ const [mapLib, setMapLib] = useState(null);
20
+ const [isLoaded, setIsLoaded] = useState(false);
21
+ useEffect(() => {
22
+ if (typeof window === "undefined") return;
23
+ let canceled = false;
24
+ import("@neshan-maps-platform/mapbox-gl").then((mod) => {
25
+ if (!canceled) {
26
+ setMapLib(mod.default || mod);
27
+ setIsLoaded(true);
28
+ }
29
+ }).catch((err) => {
30
+ console.error("\u062E\u0637\u0627 \u062F\u0631 \u0644\u0648\u062F \u0646\u0642\u0634\u0647 \u0646\u0634\u0627\u0646:", err);
31
+ });
32
+ return () => {
33
+ canceled = true;
34
+ };
35
+ }, []);
36
+ useEffect(() => {
37
+ if (!mapLib || !mapContainerRef.current || mapInstanceRef.current) return;
38
+ try {
39
+ const map = new mapLib.Map({
40
+ container: mapContainerRef.current,
41
+ ...options
42
+ });
43
+ map.on("load", () => {
44
+ mapInstanceRef.current = map;
45
+ onMapLoad?.(map);
46
+ });
47
+ return () => {
48
+ markersRef.current.forEach((m) => m.remove());
49
+ markersRef.current = [];
50
+ if (mapInstanceRef.current) {
51
+ mapInstanceRef.current.remove();
52
+ mapInstanceRef.current = null;
53
+ }
54
+ };
55
+ } catch (err) {
56
+ console.error("\u062E\u0637\u0627 \u062F\u0631 \u0633\u0627\u062E\u062A \u0646\u0642\u0634\u0647:", err);
57
+ }
58
+ }, [mapLib, options, onMapLoad]);
59
+ useEffect(() => {
60
+ if (!mapInstanceRef.current || !mapLib || markers.length === 0) {
61
+ markersRef.current.forEach((m) => m.remove());
62
+ markersRef.current = [];
63
+ return;
64
+ }
65
+ markersRef.current.forEach((m) => m.remove());
66
+ markersRef.current = [];
67
+ markers.forEach((markerData, index) => {
68
+ const el = document.createElement("div");
69
+ el.innerHTML = `
70
+ <div style="
71
+ background: #ef4444;
72
+ width: 32px;
73
+ height: 32px;
74
+ border-radius: 50%;
75
+ border: 4px solid white;
76
+ box-shadow: 0 4px 12px rgba(0,0,0,0.3);
77
+ "></div>
78
+ `;
79
+ el.style.cursor = "pointer";
80
+ el.style.transition = "transform 0.3s ease";
81
+ el.style.transform = markerData.id === selectedMarkerId ? "scale(1.4)" : "scale(1)";
82
+ const marker = new mapLib.Marker({ element: el }).setLngLat([markerData.lng, markerData.lat]).addTo(mapInstanceRef.current);
83
+ el.addEventListener("click", (e) => {
84
+ e.stopPropagation();
85
+ onMarkerClick?.(markerData, index, mapInstanceRef.current);
86
+ });
87
+ markersRef.current.push(marker);
88
+ });
89
+ }, [markers, mapLib, mapInstanceRef.current, onMarkerClick, selectedMarkerId]);
90
+ if (!isLoaded) {
91
+ return /* @__PURE__ */ jsx("div", { style: { ...style, display: "flex", alignItems: "center", justifyContent: "center", background: "#f3f4f6" }, children: /* @__PURE__ */ jsx("p", { children: "\u062F\u0631 \u062D\u0627\u0644 \u0628\u0627\u0631\u06AF\u0630\u0627\u0631\u06CC \u0646\u0642\u0634\u0647..." }) });
92
+ }
93
+ return /* @__PURE__ */ jsx("div", { ref: mapContainerRef, className, style, children });
94
+ };
95
+ var Map_default = Map;
96
+ export {
97
+ Map_default as NeshanMap
98
+ };
2
99
  //# sourceMappingURL=react.js.map
package/dist/react.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
1
+ {"version":3,"sources":["../src/components/Map.tsx"],"sourcesContent":["\r\n\r\n\"use client\";\r\n\r\nimport React, { useEffect, useRef, useState } from 'react';\r\nimport { MapProps, MapboxMap, MarkerData } from '../types';\r\n\r\nconst Map: React.FC<MapProps> = ({\r\n options,\r\n markers = [],\r\n selectedMarkerId = null,\r\n onMarkerClick,\r\n onMapLoad,\r\n children,\r\n className = '',\r\n style = { width: '100%', height: '100%' },\r\n}) => {\r\n const mapContainerRef = useRef<HTMLDivElement>(null);\r\n const mapInstanceRef = useRef<MapboxMap | null>(null);\r\n const markersRef = useRef<any[]>([]);\r\n const [mapLib, setMapLib] = useState<any>(null);\r\n const [isLoaded, setIsLoaded] = useState(false); \r\n\r\n \r\n useEffect(() => {\r\n if (typeof window === 'undefined') return;\r\n\r\n let canceled = false;\r\n\r\n import('@neshan-maps-platform/mapbox-gl').then((mod) => {\r\n if (!canceled) {\r\n setMapLib(mod.default || mod);\r\n setIsLoaded(true);\r\n }\r\n }).catch((err) => {\r\n console.error(\"خطا در لود نقشه نشان:\", err);\r\n });\r\n\r\n return () => {\r\n canceled = true;\r\n };\r\n }, []);\r\n\r\n \r\n useEffect(() => {\r\n if (!mapLib || !mapContainerRef.current || mapInstanceRef.current) return;\r\n\r\n try {\r\n const map = new mapLib.Map({\r\n container: mapContainerRef.current,\r\n ...options,\r\n });\r\n\r\n map.on('load', () => {\r\n mapInstanceRef.current = map;\r\n onMapLoad?.(map);\r\n });\r\n\r\n return () => {\r\n markersRef.current.forEach((m: any) => m.remove());\r\n markersRef.current = [];\r\n if (mapInstanceRef.current) {\r\n mapInstanceRef.current.remove();\r\n mapInstanceRef.current = null;\r\n }\r\n };\r\n } catch (err) {\r\n console.error(\"خطا در ساخت نقشه:\", err);\r\n }\r\n }, [mapLib, options, onMapLoad]);\r\n\r\n \r\n useEffect(() => {\r\n if (!mapInstanceRef.current || !mapLib || markers.length === 0) {\r\n \r\n markersRef.current.forEach((m: any) => m.remove());\r\n markersRef.current = [];\r\n return;\r\n }\r\n\r\n \r\n markersRef.current.forEach((m: any) => m.remove());\r\n markersRef.current = [];\r\n\r\n markers.forEach((markerData: MarkerData, index: number) => {\r\n const el = document.createElement('div');\r\n el.innerHTML = `\r\n <div style=\"\r\n background: #ef4444;\r\n width: 32px;\r\n height: 32px;\r\n border-radius: 50%;\r\n border: 4px solid white;\r\n box-shadow: 0 4px 12px rgba(0,0,0,0.3);\r\n \"></div>\r\n `;\r\n el.style.cursor = 'pointer';\r\n el.style.transition = 'transform 0.3s ease';\r\n el.style.transform = markerData.id === selectedMarkerId ? 'scale(1.4)' : 'scale(1)';\r\n\r\n const marker = new mapLib.Marker({ element: el })\r\n .setLngLat([markerData.lng, markerData.lat])\r\n .addTo(mapInstanceRef.current!);\r\n\r\n el.addEventListener('click', (e) => {\r\n e.stopPropagation();\r\n onMarkerClick?.(markerData, index, mapInstanceRef.current!);\r\n });\r\n\r\n markersRef.current.push(marker);\r\n });\r\n }, [markers, mapLib, mapInstanceRef.current, onMarkerClick, selectedMarkerId]);\r\n\r\n \r\n if (!isLoaded) {\r\n return (\r\n <div style={{ ...style, display: 'flex', alignItems: 'center', justifyContent: 'center', background: '#f3f4f6' }}>\r\n <p>در حال بارگذاری نقشه...</p>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div ref={mapContainerRef} className={className} style={style}>\r\n {children}\r\n </div>\r\n );\r\n};\r\n\r\nexport default Map;"],"mappings":"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","names":[]}
package/dist/styles.css CHANGED
@@ -0,0 +1,47 @@
1
+
2
+
3
+
4
+ .neshan-map-container * {
5
+ box-sizing: border-box;
6
+ }
7
+
8
+
9
+ .neshan-marker {
10
+ transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
11
+ will-change: transform;
12
+ }
13
+
14
+ .neshan-marker:hover {
15
+ transform: scale(1.2) !important;
16
+ }
17
+
18
+
19
+ .neshan-marker-label {
20
+ background: white;
21
+ color: #1f2937;
22
+ font-size: 10px;
23
+ font-weight: bold;
24
+ padding: 4px 8px;
25
+ border-radius: 6px;
26
+ margin-top: 4px;
27
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);
28
+ white-space: nowrap;
29
+ pointer-events: none;
30
+ }
31
+
32
+
33
+ .neshan-marker-selected {
34
+ animation: pulse 2s infinite;
35
+ }
36
+
37
+ @keyframes pulse {
38
+ 0% {
39
+ transform: scale(1);
40
+ }
41
+ 50% {
42
+ transform: scale(1.15);
43
+ }
44
+ 100% {
45
+ transform: scale(1);
46
+ }
47
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mehdi-akbari-map",
3
- "version": "0.0.1",
3
+ "version": "0.0.3",
4
4
  "description": "A professional Map",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",