mehdi-akbari-map 1.3.1 → 1.3.2
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/components/InteractiveMap.d.ts.map +1 -1
- package/dist/index.cjs +57 -47
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +10 -6
- package/dist/index.css.map +1 -1
- package/dist/index.js +57 -47
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +57 -47
- package/dist/react.cjs.map +1 -1
- package/dist/react.js +57 -47
- package/dist/react.js.map +1 -1
- package/dist/styles.css +39 -64
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InteractiveMap.d.ts","sourceRoot":"","sources":["../../src/components/InteractiveMap.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAGxE,OAAO,EAAS,QAAQ,EAAE,MAAM,UAAU,CAAC;AAE3C,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,QAAQ,
|
|
1
|
+
{"version":3,"file":"InteractiveMap.d.ts","sourceRoot":"","sources":["../../src/components/InteractiveMap.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAGxE,OAAO,EAAS,QAAQ,EAAE,MAAM,UAAU,CAAC;AAE3C,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,QAAQ,CAgG7C,CAAC"}
|
package/dist/index.cjs
CHANGED
|
@@ -334,53 +334,63 @@ var InteractiveMap = (props) => {
|
|
|
334
334
|
}
|
|
335
335
|
}, [mapInstance, props]);
|
|
336
336
|
const safeMarkers = props.markers || [];
|
|
337
|
-
return
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
{
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
337
|
+
return (
|
|
338
|
+
/* ✅ استایل inline برای اطمینان از پر کردن فضای مودال والد */
|
|
339
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
340
|
+
"div",
|
|
341
|
+
{
|
|
342
|
+
className: `map-layout-root ${isMobile ? "is-mobile" : "is-desktop"}`,
|
|
343
|
+
style: { position: "absolute", inset: 0, height: "100%", width: "100%" },
|
|
344
|
+
children: [
|
|
345
|
+
!isMobile && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("aside", { className: "sidebar", children: [
|
|
346
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("header", { className: "sidebar-header", children: "\u0644\u06CC\u0633\u062A \u0641\u0631\u0648\u0634\u06AF\u0627\u0647\u200C\u0647\u0627" }),
|
|
347
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "sidebar-list", children: safeMarkers.map((store, idx) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
348
|
+
StoreCard,
|
|
349
|
+
{
|
|
350
|
+
store,
|
|
351
|
+
isSelected: props.selectedMarkerId === store.id,
|
|
352
|
+
onSelect: () => handleStoreSelect(store, idx),
|
|
353
|
+
shopLogoUrl: store.logoUrl
|
|
354
|
+
},
|
|
355
|
+
store.id
|
|
356
|
+
)) })
|
|
357
|
+
] }),
|
|
358
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("main", { className: "map-container", children: [
|
|
359
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
360
|
+
Map_default,
|
|
361
|
+
{
|
|
362
|
+
...props,
|
|
363
|
+
onMapLoad: (map) => {
|
|
364
|
+
if (map) {
|
|
365
|
+
setMapInstance(map);
|
|
366
|
+
props.onMapLoad?.(map);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
),
|
|
371
|
+
props.productName && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "product-badge", children: [
|
|
372
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "product-badge-left-side", children: [
|
|
373
|
+
props.productLogoUrl && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("img", { src: props.productLogoUrl, alt: "product", className: "product-badge-logo" }),
|
|
374
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "product-badge-fixed-label", children: "\u0641\u0631\u0648\u0634\u06AF\u0627\u0647\u200C\u0647\u0627\u06CC \u062D\u0636\u0648\u0631\u06CC" })
|
|
375
|
+
] }),
|
|
376
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "product-badge-separator" }),
|
|
377
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "product-badge-text", children: props.productName })
|
|
378
|
+
] }),
|
|
379
|
+
isMobile && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "mobile-slider", ref: sliderRef, children: safeMarkers.map((store, idx) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
|
|
380
|
+
StoreCard,
|
|
381
|
+
{
|
|
382
|
+
store,
|
|
383
|
+
isSelected: props.selectedMarkerId === store.id,
|
|
384
|
+
onSelect: () => handleStoreSelect(store, idx),
|
|
385
|
+
shopLogoUrl: store.logoUrl
|
|
386
|
+
},
|
|
387
|
+
store.id
|
|
388
|
+
)) })
|
|
389
|
+
] })
|
|
390
|
+
]
|
|
391
|
+
}
|
|
392
|
+
)
|
|
393
|
+
);
|
|
384
394
|
};
|
|
385
395
|
// Annotate the CommonJS export names for ESM import in node:
|
|
386
396
|
0 && (module.exports = {
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/components/InteractiveMap.tsx","../src/components/Map.tsx","../src/utils/createCustomMarkerElement.ts","../src/utils/createClusterElement.ts","../src/components/StoreCard.tsx"],"sourcesContent":["\r\nimport './styles.css';\r\n\r\n\r\nexport { InteractiveMap as NeshanMap } from './components/InteractiveMap';\r\n\r\n\r\nexport { default as RawMap } from './components/Map';\r\n\r\n\r\nexport type {\r\n MapProps,\r\n MapOptions,\r\n MarkerData,\r\n Store,\r\n MapboxMap,\r\n LngLatLike,\r\n} from './types';","\"use client\";\r\n\r\nimport React, { useState, useEffect, useRef, useCallback } from 'react';\r\nimport Map from './Map';\r\nimport { StoreCard } from './StoreCard';\r\nimport { Store, MapProps } from '../types';\r\n\r\nexport const InteractiveMap: React.FC<MapProps> = (props) => {\r\n const [isMobile, setIsMobile] = useState(false);\r\n const [mapInstance, setMapInstance] = useState<any>(null);\r\n const sliderRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n const checkMobile = () => setIsMobile(window.innerWidth < 1024);\r\n checkMobile();\r\n window.addEventListener('resize', checkMobile);\r\n return () => window.removeEventListener('resize', checkMobile);\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (isMobile && props.selectedMarkerId && sliderRef.current) {\r\n const timer = setTimeout(() => {\r\n const selectedCard = sliderRef.current?.querySelector(`[data-id=\"${props.selectedMarkerId}\"]`);\r\n if (selectedCard) {\r\n selectedCard.scrollIntoView({ behavior: 'smooth', inline: 'center', block: 'nearest' });\r\n }\r\n }, 150);\r\n return () => clearTimeout(timer);\r\n }\r\n }, [props.selectedMarkerId, isMobile]);\r\n\r\n const handleStoreSelect = useCallback((store: Store, index: number) => {\r\n if (mapInstance) {\r\n props.onMarkerClick?.(store, index, mapInstance);\r\n }\r\n }, [mapInstance, props]);\r\n\r\n const safeMarkers = props.markers || [];\r\n\r\n return (\r\n <div className={`map-layout-root ${isMobile ? 'is-mobile' : 'is-desktop'}`}>\r\n {!isMobile && (\r\n <aside className=\"sidebar\">\r\n <header className=\"sidebar-header\">لیست فروشگاهها</header>\r\n <div className=\"sidebar-list\">\r\n {safeMarkers.map((store, idx) => (\r\n <StoreCard \r\n key={store.id} \r\n store={store} \r\n isSelected={props.selectedMarkerId === store.id}\r\n onSelect={() => handleStoreSelect(store, idx)}\r\n shopLogoUrl={store.logoUrl}\r\n />\r\n ))}\r\n </div>\r\n </aside>\r\n )}\r\n\r\n <main className=\"map-container\">\r\n <Map \r\n {...props} \r\n onMapLoad={(map) => {\r\n if (map) {\r\n setMapInstance(map);\r\n props.onMapLoad?.(map);\r\n }\r\n }} \r\n />\r\n \r\n {props.productName && (\r\n <div className=\"product-badge\">\r\n <div className=\"product-badge-left-side\">\r\n {props.productLogoUrl && (\r\n <img src={props.productLogoUrl} alt=\"product\" className=\"product-badge-logo\" />\r\n )}\r\n <span className=\"product-badge-fixed-label\">فروشگاههای حضوری</span>\r\n </div>\r\n <div className=\"product-badge-separator\"></div>\r\n <span className=\"product-badge-text\">{props.productName}</span>\r\n </div>\r\n )}\r\n\r\n {isMobile && (\r\n <div className=\"mobile-slider\" ref={sliderRef}>\r\n {safeMarkers.map((store, idx) => (\r\n <StoreCard \r\n key={store.id} \r\n store={store} \r\n isSelected={props.selectedMarkerId === store.id}\r\n onSelect={() => handleStoreSelect(store, idx)}\r\n shopLogoUrl={store.logoUrl}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n </main>\r\n </div>\r\n );\r\n};","\"use client\";\r\n\r\nimport React, { useEffect, useRef, useState, useCallback } from 'react';\r\nimport type { MapboxMap, Store, MapProps } from '../types';\r\nimport { createCustomMarkerElement } from '../utils/createCustomMarkerElement';\r\nimport { createClusterElement } from '../utils/createClusterElement';\r\nimport Supercluster from 'supercluster';\r\n\r\n\r\nconst Map: React.FC<MapProps> = ({\r\n options,\r\n markers = [],\r\n markerLogoUrl = '',\r\n selectedMarkerId = null,\r\n onMarkerClick,\r\n onMapLoad,\r\n style = { width: '100%', height: '100%' },\r\n}) => {\r\n const mapContainerRef = useRef<HTMLDivElement>(null);\r\n const [mapInstance, setMapInstance] = useState<MapboxMap | null>(null);\r\n const [mapLib, setMapLib] = useState<any>(null);\r\n const markersRef = useRef<any[]>([]);\r\n const isRemoving = useRef(false); \r\n \r\n const clusterIndex = useRef(new Supercluster({\r\n radius: 60,\r\n maxZoom: 16\r\n }));\r\n\r\n \r\n useEffect(() => {\r\n let mounted = true;\r\n import('@neshan-maps-platform/mapbox-gl').then((mod) => {\r\n if (mounted) setMapLib(mod.default || mod);\r\n });\r\n return () => { mounted = false; };\r\n }, []);\r\n\r\n \r\n useEffect(() => {\r\n if (!mapLib || !mapContainerRef.current || mapInstance) return;\r\n\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 if (!isRemoving.current) {\r\n setMapInstance(map);\r\n onMapLoad?.(map);\r\n }\r\n });\r\n\r\n return () => {\r\n if (map) {\r\n isRemoving.current = true;\r\n \r\n setTimeout(() => {\r\n try {\r\n map.remove();\r\n } catch (e) {\r\n console.warn(\"Mapbox remove error ignored:\", e);\r\n }\r\n }, 0);\r\n }\r\n };\r\n \r\n }, [mapLib]); \r\n\r\n \r\n useEffect(() => {\r\n if (!mapInstance || !selectedMarkerId || isRemoving.current) return;\r\n const selectedStore = markers.find(m => m.id === selectedMarkerId);\r\n if (selectedStore) {\r\n mapInstance.flyTo({\r\n center: [selectedStore.lng, selectedStore.lat],\r\n zoom: 16, \r\n essential: true,\r\n duration: 1200\r\n });\r\n }\r\n }, [selectedMarkerId, mapInstance, markers]);\r\n\r\n \r\n const updateMarkers = useCallback(() => {\r\n if (!mapInstance || !mapLib || isRemoving.current) return;\r\n\r\n try {\r\n const bounds = mapInstance.getBounds();\r\n const zoom = Math.floor(mapInstance.getZoom());\r\n\r\n const clusters = clusterIndex.current.getClusters(\r\n [bounds.getWest(), bounds.getSouth(), bounds.getEast(), bounds.getNorth()],\r\n zoom\r\n );\r\n\r\n markersRef.current.forEach(m => m.remove());\r\n markersRef.current = [];\r\n\r\n clusters.forEach(cluster => {\r\n const [lng, lat] = cluster.geometry.coordinates;\r\n const { cluster: isCluster, point_count: count } = cluster.properties;\r\n\r\n let el: HTMLElement;\r\n\r\n if (isCluster) {\r\n el = createClusterElement(count);\r\n el.onclick = (e) => {\r\n e.stopPropagation();\r\n const expansionZoom = Math.min(\r\n clusterIndex.current.getClusterExpansionZoom(cluster.id as number),\r\n 18\r\n );\r\n mapInstance.easeTo({ center: [lng, lat], zoom: expansionZoom });\r\n };\r\n } else {\r\n const storeData = cluster.properties as Store;\r\n el = createCustomMarkerElement({\r\n marker: storeData,\r\n isSelected: storeData.id === selectedMarkerId,\r\n logoSrc: markerLogoUrl,\r\n });\r\n el.onclick = () => onMarkerClick?.(storeData, 0, mapInstance);\r\n }\r\n\r\n const newMarker = new mapLib.Marker({ element: el, anchor: isCluster ? 'center' : 'bottom' })\r\n .setLngLat([lng, lat])\r\n .addTo(mapInstance);\r\n \r\n markersRef.current.push(newMarker);\r\n });\r\n } catch (err) {\r\n console.error(\"Update markers failed:\", err);\r\n }\r\n }, [mapInstance, mapLib, selectedMarkerId, markerLogoUrl, onMarkerClick]);\r\n\r\n \r\n useEffect(() => {\r\n if (isRemoving.current) return;\r\n const points: any = markers.map(s => ({\r\n type: 'Feature',\r\n properties: { ...s },\r\n geometry: { type: 'Point', coordinates: [s.lng, s.lat] }\r\n }));\r\n clusterIndex.current.load(points);\r\n updateMarkers();\r\n }, [markers, updateMarkers]);\r\n\r\n \r\n useEffect(() => {\r\n if (!mapInstance || isRemoving.current) return;\r\n mapInstance.on('moveend', updateMarkers);\r\n return () => { mapInstance.off('moveend', updateMarkers); };\r\n }, [mapInstance, updateMarkers]);\r\n\r\n return (\r\n <div style={{ position: 'relative', overflow: 'hidden', ...style }}>\r\n <div \r\n ref={mapContainerRef} \r\n style={{ width: '100%', height: '100%', backfaceVisibility: 'hidden' }} \r\n />\r\n </div>\r\n );\r\n};\r\n\r\nexport default Map;","import type { Store } from '../types';\r\n\r\ninterface CreateMarkerOptions {\r\n marker: Store;\r\n isSelected: boolean;\r\n logoSrc?: string;\r\n}\r\n\r\nexport function createCustomMarkerElement({\r\n marker,\r\n isSelected,\r\n logoSrc = '',\r\n}: CreateMarkerOptions): HTMLElement {\r\n const container = document.createElement('div');\r\n container.className = `neshan-marker-container ${isSelected ? 'neshan-marker-selected' : ''}`;\r\n\r\n const body = document.createElement('div');\r\n body.className = 'neshan-marker-body';\r\n\r\n const iconBox = document.createElement('div');\r\n Object.assign(iconBox.style, {\r\n width: '40px',\r\n height: '40px',\r\n borderRadius: '50%',\r\n backgroundColor: 'white',\r\n border: isSelected ? '3px solid #2563eb' : '',\r\n boxShadow: '0 4px 8px rgba(0,0,0,0.2)',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n overflow: 'hidden'\r\n });\r\n\r\n if (logoSrc) {\r\n const img = document.createElement('img');\r\n img.src = logoSrc;\r\n img.style.width = '100%';\r\n img.style.height = '100%';\r\n img.style.objectFit = 'cover';\r\n iconBox.appendChild(img);\r\n } else {\r\n iconBox.style.backgroundColor = isSelected ? '#2563eb' : '#ef4444';\r\n }\r\n\r\n body.appendChild(iconBox);\r\n\r\n \r\n if (marker.name || marker.price) {\r\n const label = document.createElement('div');\r\n label.className = 'neshan-marker-label';\r\n \r\n const pricePart = marker.price ? ` (${marker.price} ت)` : '';\r\n label.textContent = `${marker.name}${pricePart}`;\r\n \r\n body.appendChild(label);\r\n }\r\n\r\n container.appendChild(body);\r\n return container;\r\n}","export function createClusterElement(count: number): HTMLElement {\r\n const container = document.createElement('div');\r\n container.className = 'neshan-cluster-marker';\r\n \r\n const countSpan = document.createElement('span');\r\n countSpan.className = 'neshan-cluster-count';\r\n countSpan.innerText = count.toString();\r\n \r\n container.appendChild(countSpan);\r\n return container;\r\n}","import React from 'react';\r\nimport { Store } from '../types';\r\n\r\ninterface StoreCardProps {\r\n store: Store;\r\n isSelected: boolean;\r\n onSelect: () => void;\r\n shopLogoUrl?: string; // لوگوی کوچک کنار توضیحات\r\n}\r\n\r\nexport const StoreCard: React.FC<StoreCardProps> = ({ store, isSelected, onSelect, shopLogoUrl }) => {\r\n const googleMapUrl = `https://www.google.com/maps/dir/?api=1&destination=${store.lat},${store.lng}`;\r\n\r\n const handleActionClick = (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n };\r\n\r\n return (\r\n <div \r\n className={`store-card ${isSelected ? 'active' : ''}`}\r\n onClick={onSelect}\r\n data-id={store.id}\r\n >\r\n {/* ردیف اول: نام، شهر و گزارش */}\r\n <div className=\"store-card-header\">\r\n <div className=\"store-info-main\">\r\n <h4 className=\"store-name\">{store.name}</h4>\r\n <div className=\"store-location-tag\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z\"></path><circle cx=\"12\" cy=\"10\" r=\"3\"></circle></svg>\r\n <span className=\"store-city\">{store.city}</span>\r\n </div>\r\n </div>\r\n <button className=\"report-btn\" onClick={handleActionClick}>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#6b7280\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M4 15s1-1 4-1 5 2 8 2 4-1 4-1V3s-1 1-4 1-5-2-8-2-4 1-4 1z\"></path><line x1=\"4\" y1=\"22\" x2=\"4\" y2=\"15\"></line></svg>\r\n <span>گزارش</span>\r\n </button>\r\n </div>\r\n\r\n {/* بخش عملکرد (اختیاری - اگر در دیتا بود) */}\r\n {store.performance && (\r\n <div className=\"store-performance\">\r\n عملکرد <span className=\"perf-value\">{store.performance}</span>\r\n </div>\r\n )}\r\n\r\n {/* بخش توضیحات همراه با لوگو */}\r\n <div className=\"store-desc-section\">\r\n {shopLogoUrl && (\r\n <img src={shopLogoUrl} alt=\"shop logo\" className=\"store-mini-logo\" />\r\n )}\r\n <p className=\"store-desc\">{store.desc}</p>\r\n </div>\r\n\r\n {/* ردیف آخر: قیمت و اطلاعات تماس */}\r\n <div className=\"store-card-footer\">\r\n <div className=\"price-container\">\r\n <span className=\"price-value\">{store.price}</span>\r\n <span className=\"price-unit\">تومان</span>\r\n </div>\r\n <div className=\"contact-trigger\">\r\n <span>اطلاعات تماس</span>\r\n <svg className={`arrow-icon ${isSelected ? 'open' : ''}`} width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><polyline points=\"18 15 12 9 6 15\"></polyline></svg>\r\n </div>\r\n </div>\r\n\r\n {/* بخش دکمههای عملیاتی (عمودی) */}\r\n <div className=\"store-details-wrapper\">\r\n <div className=\"store-details-content\">\r\n <div className=\"action-buttons vertical\">\r\n {store.phone && (\r\n <a href={`tel:${store.phone}`} className=\"btn btn-call full-width\" onClick={handleActionClick}>\r\n <div className=\"btn-content\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z\"></path></svg>\r\n <span>تماس: {store.phone}</span>\r\n </div>\r\n </a>\r\n )}\r\n {store.whatsapp && (\r\n <a href={`https://wa.me/${store.whatsapp}`} target=\"_blank\" rel=\"noreferrer\" className=\"btn btn-wa full-width\" onClick={handleActionClick}>\r\n <div className=\"btn-content\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z\"></path></svg>\r\n <span>ارسال پیام در واتساپ</span>\r\n </div>\r\n </a>\r\n )}\r\n <a href={googleMapUrl} target=\"_blank\" rel=\"noreferrer\" className=\"btn btn-route full-width\" onClick={handleActionClick}>\r\n <div className=\"btn-content\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><polygon points=\"3 11 22 2 13 21 11 13 3 11\"></polygon></svg>\r\n <span>مسیریابی روی نقشه</span>\r\n </div>\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};"],"mappings":"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","names":["import_react","Supercluster","import_jsx_runtime","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/components/InteractiveMap.tsx","../src/components/Map.tsx","../src/utils/createCustomMarkerElement.ts","../src/utils/createClusterElement.ts","../src/components/StoreCard.tsx"],"sourcesContent":["\r\nimport './styles.css';\r\n\r\n\r\nexport { InteractiveMap as NeshanMap } from './components/InteractiveMap';\r\n\r\n\r\nexport { default as RawMap } from './components/Map';\r\n\r\n\r\nexport type {\r\n MapProps,\r\n MapOptions,\r\n MarkerData,\r\n Store,\r\n MapboxMap,\r\n LngLatLike,\r\n} from './types';","\"use client\";\r\n\r\nimport React, { useState, useEffect, useRef, useCallback } from 'react';\r\nimport Map from './Map';\r\nimport { StoreCard } from './StoreCard';\r\nimport { Store, MapProps } from '../types';\r\n\r\nexport const InteractiveMap: React.FC<MapProps> = (props) => {\r\n const [isMobile, setIsMobile] = useState(false);\r\n const [mapInstance, setMapInstance] = useState<any>(null);\r\n const sliderRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n const checkMobile = () => setIsMobile(window.innerWidth < 1024);\r\n checkMobile();\r\n window.addEventListener('resize', checkMobile);\r\n return () => window.removeEventListener('resize', checkMobile);\r\n }, []);\r\n\r\n // هماهنگی اسکرول\r\n useEffect(() => {\r\n if (isMobile && props.selectedMarkerId && sliderRef.current) {\r\n const timer = setTimeout(() => {\r\n const selectedCard = sliderRef.current?.querySelector(`[data-id=\"${props.selectedMarkerId}\"]`);\r\n if (selectedCard) {\r\n selectedCard.scrollIntoView({ behavior: 'smooth', inline: 'center', block: 'nearest' });\r\n }\r\n }, 150);\r\n return () => clearTimeout(timer);\r\n }\r\n }, [props.selectedMarkerId, isMobile]);\r\n\r\n const handleStoreSelect = useCallback((store: Store, index: number) => {\r\n if (mapInstance) {\r\n props.onMarkerClick?.(store, index, mapInstance);\r\n }\r\n }, [mapInstance, props]);\r\n\r\n const safeMarkers = props.markers || [];\r\n\r\n return (\r\n /* ✅ استایل inline برای اطمینان از پر کردن فضای مودال والد */\r\n <div \r\n className={`map-layout-root ${isMobile ? 'is-mobile' : 'is-desktop'}`}\r\n style={{ position: 'absolute', inset: 0, height: '100%', width: '100%' }}\r\n >\r\n {!isMobile && (\r\n <aside className=\"sidebar\">\r\n <header className=\"sidebar-header\">لیست فروشگاهها</header>\r\n <div className=\"sidebar-list\">\r\n {safeMarkers.map((store, idx) => (\r\n <StoreCard \r\n key={store.id} \r\n store={store} \r\n isSelected={props.selectedMarkerId === store.id}\r\n onSelect={() => handleStoreSelect(store, idx)}\r\n shopLogoUrl={store.logoUrl}\r\n />\r\n ))}\r\n </div>\r\n </aside>\r\n )}\r\n\r\n <main className=\"map-container\">\r\n <Map \r\n {...props} \r\n onMapLoad={(map) => {\r\n if (map) {\r\n setMapInstance(map);\r\n props.onMapLoad?.(map);\r\n }\r\n }} \r\n />\r\n \r\n {props.productName && (\r\n <div className=\"product-badge\">\r\n <div className=\"product-badge-left-side\">\r\n {props.productLogoUrl && (\r\n <img src={props.productLogoUrl} alt=\"product\" className=\"product-badge-logo\" />\r\n )}\r\n <span className=\"product-badge-fixed-label\">فروشگاههای حضوری</span>\r\n </div>\r\n <div className=\"product-badge-separator\"></div>\r\n <span className=\"product-badge-text\">{props.productName}</span>\r\n </div>\r\n )}\r\n\r\n {isMobile && (\r\n <div className=\"mobile-slider\" ref={sliderRef}>\r\n {safeMarkers.map((store, idx) => (\r\n <StoreCard \r\n key={store.id} \r\n store={store} \r\n isSelected={props.selectedMarkerId === store.id}\r\n onSelect={() => handleStoreSelect(store, idx)}\r\n shopLogoUrl={store.logoUrl}\r\n />\r\n ))}\r\n </div>\r\n )}\r\n </main>\r\n </div>\r\n );\r\n};","\"use client\";\r\n\r\nimport React, { useEffect, useRef, useState, useCallback } from 'react';\r\nimport type { MapboxMap, Store, MapProps } from '../types';\r\nimport { createCustomMarkerElement } from '../utils/createCustomMarkerElement';\r\nimport { createClusterElement } from '../utils/createClusterElement';\r\nimport Supercluster from 'supercluster';\r\n\r\n\r\nconst Map: React.FC<MapProps> = ({\r\n options,\r\n markers = [],\r\n markerLogoUrl = '',\r\n selectedMarkerId = null,\r\n onMarkerClick,\r\n onMapLoad,\r\n style = { width: '100%', height: '100%' },\r\n}) => {\r\n const mapContainerRef = useRef<HTMLDivElement>(null);\r\n const [mapInstance, setMapInstance] = useState<MapboxMap | null>(null);\r\n const [mapLib, setMapLib] = useState<any>(null);\r\n const markersRef = useRef<any[]>([]);\r\n const isRemoving = useRef(false); \r\n \r\n const clusterIndex = useRef(new Supercluster({\r\n radius: 60,\r\n maxZoom: 16\r\n }));\r\n\r\n \r\n useEffect(() => {\r\n let mounted = true;\r\n import('@neshan-maps-platform/mapbox-gl').then((mod) => {\r\n if (mounted) setMapLib(mod.default || mod);\r\n });\r\n return () => { mounted = false; };\r\n }, []);\r\n\r\n \r\n useEffect(() => {\r\n if (!mapLib || !mapContainerRef.current || mapInstance) return;\r\n\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 if (!isRemoving.current) {\r\n setMapInstance(map);\r\n onMapLoad?.(map);\r\n }\r\n });\r\n\r\n return () => {\r\n if (map) {\r\n isRemoving.current = true;\r\n \r\n setTimeout(() => {\r\n try {\r\n map.remove();\r\n } catch (e) {\r\n console.warn(\"Mapbox remove error ignored:\", e);\r\n }\r\n }, 0);\r\n }\r\n };\r\n \r\n }, [mapLib]); \r\n\r\n \r\n useEffect(() => {\r\n if (!mapInstance || !selectedMarkerId || isRemoving.current) return;\r\n const selectedStore = markers.find(m => m.id === selectedMarkerId);\r\n if (selectedStore) {\r\n mapInstance.flyTo({\r\n center: [selectedStore.lng, selectedStore.lat],\r\n zoom: 16, \r\n essential: true,\r\n duration: 1200\r\n });\r\n }\r\n }, [selectedMarkerId, mapInstance, markers]);\r\n\r\n \r\n const updateMarkers = useCallback(() => {\r\n if (!mapInstance || !mapLib || isRemoving.current) return;\r\n\r\n try {\r\n const bounds = mapInstance.getBounds();\r\n const zoom = Math.floor(mapInstance.getZoom());\r\n\r\n const clusters = clusterIndex.current.getClusters(\r\n [bounds.getWest(), bounds.getSouth(), bounds.getEast(), bounds.getNorth()],\r\n zoom\r\n );\r\n\r\n markersRef.current.forEach(m => m.remove());\r\n markersRef.current = [];\r\n\r\n clusters.forEach(cluster => {\r\n const [lng, lat] = cluster.geometry.coordinates;\r\n const { cluster: isCluster, point_count: count } = cluster.properties;\r\n\r\n let el: HTMLElement;\r\n\r\n if (isCluster) {\r\n el = createClusterElement(count);\r\n el.onclick = (e) => {\r\n e.stopPropagation();\r\n const expansionZoom = Math.min(\r\n clusterIndex.current.getClusterExpansionZoom(cluster.id as number),\r\n 18\r\n );\r\n mapInstance.easeTo({ center: [lng, lat], zoom: expansionZoom });\r\n };\r\n } else {\r\n const storeData = cluster.properties as Store;\r\n el = createCustomMarkerElement({\r\n marker: storeData,\r\n isSelected: storeData.id === selectedMarkerId,\r\n logoSrc: markerLogoUrl,\r\n });\r\n el.onclick = () => onMarkerClick?.(storeData, 0, mapInstance);\r\n }\r\n\r\n const newMarker = new mapLib.Marker({ element: el, anchor: isCluster ? 'center' : 'bottom' })\r\n .setLngLat([lng, lat])\r\n .addTo(mapInstance);\r\n \r\n markersRef.current.push(newMarker);\r\n });\r\n } catch (err) {\r\n console.error(\"Update markers failed:\", err);\r\n }\r\n }, [mapInstance, mapLib, selectedMarkerId, markerLogoUrl, onMarkerClick]);\r\n\r\n \r\n useEffect(() => {\r\n if (isRemoving.current) return;\r\n const points: any = markers.map(s => ({\r\n type: 'Feature',\r\n properties: { ...s },\r\n geometry: { type: 'Point', coordinates: [s.lng, s.lat] }\r\n }));\r\n clusterIndex.current.load(points);\r\n updateMarkers();\r\n }, [markers, updateMarkers]);\r\n\r\n \r\n useEffect(() => {\r\n if (!mapInstance || isRemoving.current) return;\r\n mapInstance.on('moveend', updateMarkers);\r\n return () => { mapInstance.off('moveend', updateMarkers); };\r\n }, [mapInstance, updateMarkers]);\r\n\r\n return (\r\n <div style={{ position: 'relative', overflow: 'hidden', ...style }}>\r\n <div \r\n ref={mapContainerRef} \r\n style={{ width: '100%', height: '100%', backfaceVisibility: 'hidden' }} \r\n />\r\n </div>\r\n );\r\n};\r\n\r\nexport default Map;","import type { Store } from '../types';\r\n\r\ninterface CreateMarkerOptions {\r\n marker: Store;\r\n isSelected: boolean;\r\n logoSrc?: string;\r\n}\r\n\r\nexport function createCustomMarkerElement({\r\n marker,\r\n isSelected,\r\n logoSrc = '',\r\n}: CreateMarkerOptions): HTMLElement {\r\n const container = document.createElement('div');\r\n container.className = `neshan-marker-container ${isSelected ? 'neshan-marker-selected' : ''}`;\r\n\r\n const body = document.createElement('div');\r\n body.className = 'neshan-marker-body';\r\n\r\n const iconBox = document.createElement('div');\r\n Object.assign(iconBox.style, {\r\n width: '40px',\r\n height: '40px',\r\n borderRadius: '50%',\r\n backgroundColor: 'white',\r\n border: isSelected ? '3px solid #2563eb' : '',\r\n boxShadow: '0 4px 8px rgba(0,0,0,0.2)',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n overflow: 'hidden'\r\n });\r\n\r\n if (logoSrc) {\r\n const img = document.createElement('img');\r\n img.src = logoSrc;\r\n img.style.width = '100%';\r\n img.style.height = '100%';\r\n img.style.objectFit = 'cover';\r\n iconBox.appendChild(img);\r\n } else {\r\n iconBox.style.backgroundColor = isSelected ? '#2563eb' : '#ef4444';\r\n }\r\n\r\n body.appendChild(iconBox);\r\n\r\n \r\n if (marker.name || marker.price) {\r\n const label = document.createElement('div');\r\n label.className = 'neshan-marker-label';\r\n \r\n const pricePart = marker.price ? ` (${marker.price} ت)` : '';\r\n label.textContent = `${marker.name}${pricePart}`;\r\n \r\n body.appendChild(label);\r\n }\r\n\r\n container.appendChild(body);\r\n return container;\r\n}","export function createClusterElement(count: number): HTMLElement {\r\n const container = document.createElement('div');\r\n container.className = 'neshan-cluster-marker';\r\n \r\n const countSpan = document.createElement('span');\r\n countSpan.className = 'neshan-cluster-count';\r\n countSpan.innerText = count.toString();\r\n \r\n container.appendChild(countSpan);\r\n return container;\r\n}","import React from 'react';\r\nimport { Store } from '../types';\r\n\r\ninterface StoreCardProps {\r\n store: Store;\r\n isSelected: boolean;\r\n onSelect: () => void;\r\n shopLogoUrl?: string; // لوگوی کوچک کنار توضیحات\r\n}\r\n\r\nexport const StoreCard: React.FC<StoreCardProps> = ({ store, isSelected, onSelect, shopLogoUrl }) => {\r\n const googleMapUrl = `https://www.google.com/maps/dir/?api=1&destination=${store.lat},${store.lng}`;\r\n\r\n const handleActionClick = (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n };\r\n\r\n return (\r\n <div \r\n className={`store-card ${isSelected ? 'active' : ''}`}\r\n onClick={onSelect}\r\n data-id={store.id}\r\n >\r\n {/* ردیف اول: نام، شهر و گزارش */}\r\n <div className=\"store-card-header\">\r\n <div className=\"store-info-main\">\r\n <h4 className=\"store-name\">{store.name}</h4>\r\n <div className=\"store-location-tag\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z\"></path><circle cx=\"12\" cy=\"10\" r=\"3\"></circle></svg>\r\n <span className=\"store-city\">{store.city}</span>\r\n </div>\r\n </div>\r\n <button className=\"report-btn\" onClick={handleActionClick}>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#6b7280\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M4 15s1-1 4-1 5 2 8 2 4-1 4-1V3s-1 1-4 1-5-2-8-2-4 1-4 1z\"></path><line x1=\"4\" y1=\"22\" x2=\"4\" y2=\"15\"></line></svg>\r\n <span>گزارش</span>\r\n </button>\r\n </div>\r\n\r\n {/* بخش عملکرد (اختیاری - اگر در دیتا بود) */}\r\n {store.performance && (\r\n <div className=\"store-performance\">\r\n عملکرد <span className=\"perf-value\">{store.performance}</span>\r\n </div>\r\n )}\r\n\r\n {/* بخش توضیحات همراه با لوگو */}\r\n <div className=\"store-desc-section\">\r\n {shopLogoUrl && (\r\n <img src={shopLogoUrl} alt=\"shop logo\" className=\"store-mini-logo\" />\r\n )}\r\n <p className=\"store-desc\">{store.desc}</p>\r\n </div>\r\n\r\n {/* ردیف آخر: قیمت و اطلاعات تماس */}\r\n <div className=\"store-card-footer\">\r\n <div className=\"price-container\">\r\n <span className=\"price-value\">{store.price}</span>\r\n <span className=\"price-unit\">تومان</span>\r\n </div>\r\n <div className=\"contact-trigger\">\r\n <span>اطلاعات تماس</span>\r\n <svg className={`arrow-icon ${isSelected ? 'open' : ''}`} width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><polyline points=\"18 15 12 9 6 15\"></polyline></svg>\r\n </div>\r\n </div>\r\n\r\n {/* بخش دکمههای عملیاتی (عمودی) */}\r\n <div className=\"store-details-wrapper\">\r\n <div className=\"store-details-content\">\r\n <div className=\"action-buttons vertical\">\r\n {store.phone && (\r\n <a href={`tel:${store.phone}`} className=\"btn btn-call full-width\" onClick={handleActionClick}>\r\n <div className=\"btn-content\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z\"></path></svg>\r\n <span>تماس: {store.phone}</span>\r\n </div>\r\n </a>\r\n )}\r\n {store.whatsapp && (\r\n <a href={`https://wa.me/${store.whatsapp}`} target=\"_blank\" rel=\"noreferrer\" className=\"btn btn-wa full-width\" onClick={handleActionClick}>\r\n <div className=\"btn-content\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z\"></path></svg>\r\n <span>ارسال پیام در واتساپ</span>\r\n </div>\r\n </a>\r\n )}\r\n <a href={googleMapUrl} target=\"_blank\" rel=\"noreferrer\" className=\"btn btn-route full-width\" onClick={handleActionClick}>\r\n <div className=\"btn-content\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><polygon points=\"3 11 22 2 13 21 11 13 3 11\"></polygon></svg>\r\n <span>مسیریابی روی نقشه</span>\r\n </div>\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n};"],"mappings":"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","names":["import_react","Supercluster","import_jsx_runtime","import_jsx_runtime"]}
|
package/dist/index.css
CHANGED
|
@@ -11,9 +11,13 @@
|
|
|
11
11
|
display: flex;
|
|
12
12
|
width: 100%;
|
|
13
13
|
height: 100%;
|
|
14
|
+
min-height: 100%;
|
|
14
15
|
direction: rtl;
|
|
15
16
|
font-family: inherit;
|
|
16
17
|
overflow: hidden;
|
|
18
|
+
position: absolute;
|
|
19
|
+
top: 0;
|
|
20
|
+
left: 0;
|
|
17
21
|
}
|
|
18
22
|
.sidebar {
|
|
19
23
|
width: 350px;
|
|
@@ -24,7 +28,7 @@
|
|
|
24
28
|
flex-direction: column;
|
|
25
29
|
z-index: 1000;
|
|
26
30
|
box-shadow: 2px 0 10px rgba(0, 0, 0, 0.05);
|
|
27
|
-
|
|
31
|
+
position: relative;
|
|
28
32
|
}
|
|
29
33
|
.sidebar-header {
|
|
30
34
|
padding: 20px;
|
|
@@ -38,6 +42,8 @@
|
|
|
38
42
|
flex: 1;
|
|
39
43
|
overflow-y: auto;
|
|
40
44
|
min-height: 0;
|
|
45
|
+
overscroll-behavior: contain;
|
|
46
|
+
-webkit-overflow-scrolling: touch;
|
|
41
47
|
}
|
|
42
48
|
.store-card {
|
|
43
49
|
padding: 16px;
|
|
@@ -46,8 +52,6 @@
|
|
|
46
52
|
transition: background 0.2s ease;
|
|
47
53
|
background: #ffffff;
|
|
48
54
|
width: 100%;
|
|
49
|
-
display: flex;
|
|
50
|
-
flex-direction: column;
|
|
51
55
|
}
|
|
52
56
|
.store-card.active {
|
|
53
57
|
background: #f8fafc;
|
|
@@ -120,7 +124,6 @@
|
|
|
120
124
|
align-items: center;
|
|
121
125
|
border-top: 1px dashed #e5e7eb;
|
|
122
126
|
padding-top: 12px;
|
|
123
|
-
width: 100%;
|
|
124
127
|
}
|
|
125
128
|
.price-container {
|
|
126
129
|
display: flex;
|
|
@@ -191,6 +194,7 @@
|
|
|
191
194
|
flex: 1;
|
|
192
195
|
position: relative;
|
|
193
196
|
background: #f3f4f6;
|
|
197
|
+
height: 100%;
|
|
194
198
|
}
|
|
195
199
|
.store-details-wrapper {
|
|
196
200
|
display: grid;
|
|
@@ -220,7 +224,7 @@
|
|
|
220
224
|
color: #111827 !important;
|
|
221
225
|
font-size: 11px;
|
|
222
226
|
font-weight: 800;
|
|
223
|
-
padding: 4px
|
|
227
|
+
padding: 4px 12px;
|
|
224
228
|
border-radius: 20px;
|
|
225
229
|
margin-top: 6px;
|
|
226
230
|
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
|
|
@@ -270,6 +274,7 @@
|
|
|
270
274
|
z-index: 20;
|
|
271
275
|
align-items: flex-end;
|
|
272
276
|
scrollbar-width: none;
|
|
277
|
+
overscroll-behavior: contain;
|
|
273
278
|
}
|
|
274
279
|
.is-mobile .mobile-slider::-webkit-scrollbar {
|
|
275
280
|
display: none;
|
|
@@ -296,7 +301,6 @@
|
|
|
296
301
|
gap: 16px;
|
|
297
302
|
z-index: 40;
|
|
298
303
|
border: 1px solid rgba(0, 0, 0, 0.05);
|
|
299
|
-
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
300
304
|
}
|
|
301
305
|
.product-badge-left-side {
|
|
302
306
|
display: flex;
|
package/dist/index.css.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/styles.css"],"sourcesContent":["@import \"@neshan-maps-platform/mapbox-gl/dist/NeshanMapboxGl.css\";\r\n\r\n/* ۱. جلوگیری از بیرونزدگی المانها */\r\n.map-layout-root, \r\n.map-layout-root *, \r\n.map-layout-root *::before, \r\n.map-layout-root *::after {\r\n box-sizing: border-box;\r\n}\r\n\r\n.map-layout-root {\r\n display: flex;\r\n width: 100%;\r\n height: 100%;\r\n direction: rtl;\r\n font-family: inherit;\r\n overflow: hidden;\r\n}\r\n\r\n/* سایدبار دسکتاپ - اصلاح شده برای اسکرول */\r\n.sidebar {\r\n width: 350px;\r\n height: 100%; \r\n background: #ffffff;\r\n border-left: 1px solid #e5e7eb;\r\n display: flex;\r\n flex-direction: column;\r\n z-index: 1000;\r\n box-shadow: 2px 0 10px rgba(0, 0, 0, 0.05);\r\n min-height: 0; /* ✅ بسیار حیاتی برای فعال شدن اسکرول در فلکسباکس */\r\n}\r\n\r\n.sidebar-header {\r\n padding: 20px;\r\n font-weight: 800;\r\n font-size: 18px;\r\n color: #111827;\r\n border-bottom: 1px solid #f3f4f6;\r\n flex-shrink: 0; /* جلوگیری از فشرده شدن هدر */\r\n}\r\n\r\n.sidebar-list {\r\n flex: 1;\r\n overflow-y: auto; /* فعال کردن اسکرول عمودی */\r\n min-height: 0; /* ✅ بسیار حیاتی: اجازه میدهد لیست کوچکتر از محتوا شود تا اسکرول بخورد */\r\n}\r\n\r\n/* کارت فروشگاه */\r\n.store-card {\r\n padding: 16px;\r\n border-bottom: 1px solid #f3f4f6;\r\n cursor: pointer;\r\n transition: background 0.2s ease;\r\n background: #ffffff;\r\n width: 100%;\r\n display: flex;\r\n flex-direction: column;\r\n}\r\n\r\n.store-card.active {\r\n background: #f8fafc;\r\n}\r\n\r\n.store-card-header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: flex-start;\r\n margin-bottom: 12px;\r\n}\r\n\r\n.store-name {\r\n margin: 0;\r\n font-size: 15px;\r\n font-weight: 800;\r\n color: #111827;\r\n}\r\n\r\n.store-location-tag {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n color: #6b7280;\r\n margin-top: 4px;\r\n}\r\n\r\n.store-city {\r\n font-size: 12px;\r\n font-weight: 600;\r\n}\r\n\r\n.report-btn {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n background: #f3f4f6;\r\n border: none;\r\n padding: 4px 10px;\r\n border-radius: 8px;\r\n color: #6b7280;\r\n font-size: 11px;\r\n font-weight: 700;\r\n cursor: pointer;\r\n}\r\n\r\n.store-desc-section {\r\n display: flex;\r\n align-items: flex-start;\r\n gap: 10px;\r\n margin-bottom: 16px;\r\n width: 100%;\r\n}\r\n\r\n.store-mini-logo {\r\n width: 40px;\r\n height: 40px;\r\n border-radius: 8px;\r\n object-fit: cover;\r\n border: 1px solid #e5e7eb;\r\n flex-shrink: 0;\r\n}\r\n\r\n.store-desc {\r\n flex: 1;\r\n font-size: 12px;\r\n color: #4b5563;\r\n line-height: 1.6;\r\n margin: 0;\r\n display: -webkit-box;\r\n -webkit-line-clamp: 2;\r\n -webkit-box-orient: vertical;\r\n overflow: hidden;\r\n}\r\n\r\n.store-card-footer {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n border-top: 1px dashed #e5e7eb;\r\n padding-top: 12px;\r\n width: 100%;\r\n}\r\n\r\n.price-container {\r\n display: flex;\r\n align-items: baseline;\r\n gap: 4px;\r\n}\r\n\r\n.price-value {\r\n font-size: 16px;\r\n font-weight: 900;\r\n color: #111827;\r\n}\r\n\r\n.price-unit {\r\n font-size: 11px;\r\n color: #6b7280;\r\n font-weight: 600;\r\n}\r\n\r\n.contact-trigger {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n color: #1d4ed8;\r\n font-size: 13px;\r\n font-weight: 800;\r\n}\r\n\r\n.arrow-icon {\r\n transition: transform 0.3s ease;\r\n transform: rotate(180deg);\r\n}\r\n\r\n.arrow-icon.open {\r\n transform: rotate(0deg);\r\n}\r\n\r\n.action-buttons.vertical {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 10px;\r\n margin-top: 15px;\r\n width: 100%;\r\n}\r\n\r\n.btn.full-width {\r\n width: 100%;\r\n padding: 12px;\r\n border-radius: 12px;\r\n text-decoration: none;\r\n border: none;\r\n display: block;\r\n}\r\n\r\n.btn-content {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n width: 100%;\r\n font-weight: 700;\r\n font-size: 13px;\r\n}\r\n\r\n.btn-call { background: #1d4ed8; color: white; }\r\n.btn-wa { background: #10b981; color: white; }\r\n.btn-route { background: #7c3aed; color: white; }\r\n\r\n.map-container { flex: 1; position: relative; background: #f3f4f6; }\r\n.store-details-wrapper { \r\n display: grid; \r\n grid-template-rows: 0fr; \r\n transition: grid-template-rows 0.3s ease; \r\n overflow: hidden;\r\n width: 100%;\r\n}\r\n.active .store-details-wrapper { grid-template-rows: 1fr; }\r\n.store-details-content { min-height: 0; width: 100%; }\r\n\r\n.neshan-marker-container { pointer-events: auto; }\r\n.neshan-marker-body {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n transform-origin: bottom center;\r\n}\r\n\r\n/* ✅ استایل مارکر: پسزمینه سفید، بردر نارنجی، متن مشکی */\r\n.neshan-marker-label {\r\n background: #ffffff;\r\n color: #111827 !important;\r\n font-size: 11px;\r\n font-weight: 800;\r\n padding: 4px 10px;\r\n border-radius: 20px;\r\n margin-top: 6px;\r\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\r\n border: 2px solid #f97316;\r\n white-space: nowrap;\r\n pointer-events: none;\r\n}\r\n\r\n.neshan-cluster-marker {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n background: #ffffff;\r\n border: 3px solid #2563eb;\r\n border-radius: 50%;\r\n width: 42px;\r\n height: 42px;\r\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.25);\r\n cursor: pointer;\r\n}\r\n\r\n.neshan-cluster-count {\r\n color: #2563eb;\r\n font-weight: 900;\r\n font-size: 16px;\r\n}\r\n\r\n.neshan-marker-selected .neshan-marker-body {\r\n animation: marker-bounce 0.8s infinite alternate cubic-bezier(0.45, 0.05, 0.55, 0.95);\r\n z-index: 100;\r\n}\r\n\r\n@keyframes marker-bounce {\r\n from { transform: translateY(0) scale(1.1); }\r\n to { transform: translateY(-12px) scale(1.15); }\r\n}\r\n\r\n.is-mobile .mobile-slider {\r\n position: absolute; bottom: 0; left: 0; right: 0;\r\n display: flex; gap: 12px; padding: 20px 20px 40px 20px;\r\n overflow-x: auto; scroll-snap-type: x mandatory;\r\n z-index: 20; align-items: flex-end;\r\n scrollbar-width: none;\r\n}\r\n.is-mobile .mobile-slider::-webkit-scrollbar { display: none; }\r\n.is-mobile .store-card {\r\n min-width: 290px; \r\n max-width: calc(100vw - 40px);\r\n border-radius: 20px; \r\n box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);\r\n scroll-snap-align: center; \r\n border: none;\r\n}\r\n\r\n.product-badge {\r\n position: absolute;\r\n bottom: 24px;\r\n right: 24px;\r\n background: rgba(255, 255, 255, 0.98);\r\n backdrop-filter: blur(12px);\r\n padding: 12px 20px;\r\n border-radius: 20px;\r\n box-shadow: 0 10px 30px rgba(0, 0, 0, 0.12);\r\n display: flex;\r\n align-items: center;\r\n gap: 16px;\r\n z-index: 40;\r\n border: 1px solid rgba(0, 0, 0, 0.05);\r\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\r\n}\r\n\r\n.product-badge-left-side {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n gap: 4px;\r\n}\r\n\r\n.product-badge-logo {\r\n width: 65px;\r\n height: 50px;\r\n object-fit: contain;\r\n border-radius: 12px;\r\n padding: 1px;\r\n}\r\n\r\n.product-badge-fixed-label {\r\n font-size: 9px;\r\n font-weight: 800;\r\n color: #64748b;\r\n white-space: nowrap;\r\n}\r\n\r\n.product-badge-separator {\r\n width: 1px;\r\n height: 35px;\r\n background: #e2e8f0;\r\n}\r\n\r\n.product-badge-text {\r\n font-weight: 850;\r\n font-size: 12px;\r\n color: #0f172a;\r\n white-space: nowrap;\r\n}\r\n\r\n.is-mobile .product-badge {\r\n top: 16px;\r\n bottom: auto;\r\n right: 16px;\r\n padding: 10px 14px;\r\n border-radius: 16px;\r\n gap: 12px;\r\n max-width: 85vw;\r\n}\r\n\r\n.is-mobile .product-badge-logo { width: 32px; height: 32px; }\r\n.is-mobile .product-badge-fixed-label { font-size: 8px; }\r\n.is-mobile .product-badge-separator { height: 25px; }\r\n.is-mobile .product-badge-text { font-size: 13px; }"],"mappings":";;;AAGA,CAAC;AACD,CADC,gBACgB;AACjB,CAFC,gBAEgB,CAAC;AAClB,CAHC,gBAGgB,CAAC;AAChB,cAAY;AACd;AAEA,CAPC;AAQC,WAAS;AACT,SAAO;AACP,UAAQ;AACR,aAAW;AACX,eAAa;AACb,YAAU;AACZ;AAGA,CAAC;AACC,SAAO;AACP,UAAQ;AACR,cAAY;AACZ,eAAa,IAAI,MAAM;AACvB,WAAS;AACT,kBAAgB;AAChB,WAAS;AACT,cAAY,IAAI,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AACrC,cAAY;AACd;AAEA,CAAC;AACC,WAAS;AACT,eAAa;AACb,aAAW;AACX,SAAO;AACP,iBAAe,IAAI,MAAM;AACzB,eAAa;AACf;AAEA,CAAC;AACC,QAAM;AACN,cAAY;AACZ,cAAY;AACd;AAGA,CAAC;AACC,WAAS;AACT,iBAAe,IAAI,MAAM;AACzB,UAAQ;AACR,cAAY,WAAW,KAAK;AAC5B,cAAY;AACZ,SAAO;AACP,WAAS;AACT,kBAAgB;AAClB;AAEA,CAXC,UAWU,CAAC;AACV,cAAY;AACd;AAEA,CAAC;AACC,WAAS;AACT,mBAAiB;AACjB,eAAa;AACb,iBAAe;AACjB;AAEA,CAAC;AACC,UAAQ;AACR,aAAW;AACX,eAAa;AACb,SAAO;AACT;AAEA,CAAC;AACC,WAAS;AACT,eAAa;AACb,OAAK;AACL,SAAO;AACP,cAAY;AACd;AAEA,CAAC;AACC,aAAW;AACX,eAAa;AACf;AAEA,CAAC;AACC,WAAS;AACT,eAAa;AACb,OAAK;AACL,cAAY;AACZ,UAAQ;AACR,WAAS,IAAI;AACb,iBAAe;AACf,SAAO;AACP,aAAW;AACX,eAAa;AACb,UAAQ;AACV;AAEA,CAAC;AACC,WAAS;AACT,eAAa;AACb,OAAK;AACL,iBAAe;AACf,SAAO;AACT;AAEA,CAAC;AACC,SAAO;AACP,UAAQ;AACR,iBAAe;AACf,cAAY;AACZ,UAAQ,IAAI,MAAM;AAClB,eAAa;AACf;AAEA,CAAC;AACC,QAAM;AACN,aAAW;AACX,SAAO;AACP,eAAa;AACb,UAAQ;AACR,WAAS;AACT,sBAAoB;AACpB,sBAAoB;AACpB,YAAU;AACZ;AAEA,CAAC;AACC,WAAS;AACT,mBAAiB;AACjB,eAAa;AACb,cAAY,IAAI,OAAO;AACvB,eAAa;AACb,SAAO;AACT;AAEA,CAAC;AACC,WAAS;AACT,eAAa;AACb,OAAK;AACP;AAEA,CAAC;AACC,aAAW;AACX,eAAa;AACb,SAAO;AACT;AAEA,CAAC;AACC,aAAW;AACX,SAAO;AACP,eAAa;AACf;AAEA,CAAC;AACC,WAAS;AACT,eAAa;AACb,OAAK;AACL,SAAO;AACP,aAAW;AACX,eAAa;AACf;AAEA,CAAC;AACC,cAAY,UAAU,KAAK;AAC3B,aAAW,OAAO;AACpB;AAEA,CALC,UAKU,CAAC;AACV,aAAW,OAAO;AACpB;AAEA,CAAC,cAAc,CAAC;AACd,WAAS;AACT,kBAAgB;AAChB,OAAK;AACL,cAAY;AACZ,SAAO;AACT;AAEA,CAAC,GAAG,CAAC;AACH,SAAO;AACP,WAAS;AACT,iBAAe;AACf,mBAAiB;AACjB,UAAQ;AACR,WAAS;AACX;AAEA,CAAC;AACC,WAAS;AACT,eAAa;AACb,mBAAiB;AACjB,SAAO;AACP,eAAa;AACb,aAAW;AACb;AAEA,CAAC;AAAW,cAAY;AAAS,SAAO;AAAO;AAC/C,CAAC;AAAS,cAAY;AAAS,SAAO;AAAO;AAC7C,CAAC;AAAY,cAAY;AAAS,SAAO;AAAO;AAEhD,CAAC;AAAgB,QAAM;AAAG,YAAU;AAAU,cAAY;AAAS;AACnE,CAAC;AACC,WAAS;AACT,sBAAoB;AACpB,cAAY,mBAAmB,KAAK;AACpC,YAAU;AACV,SAAO;AACT;AACA,CA7JY,OA6JJ,CAPP;AAOgC,sBAAoB;AAAK;AAC1D,CAAC;AAAwB,cAAY;AAAG,SAAO;AAAM;AAErD,CAAC;AAA0B,kBAAgB;AAAM;AACjD,CAAC;AACC,WAAS;AACT,kBAAgB;AAChB,eAAa;AACb,oBAAkB,OAAO;AAC3B;AAGA,CAAC;AACC,cAAY;AACZ,SAAO;AACP,aAAW;AACX,eAAa;AACb,WAAS,IAAI;AACb,iBAAe;AACf,cAAY;AACZ,cAAY,EAAE,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AACrC,UAAQ,IAAI,MAAM;AAClB,eAAa;AACb,kBAAgB;AAClB;AAEA,CAAC;AACC,WAAS;AACT,eAAa;AACb,mBAAiB;AACjB,cAAY;AACZ,UAAQ,IAAI,MAAM;AAClB,iBAAe;AACf,SAAO;AACP,UAAQ;AACR,cAAY,EAAE,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AACrC,UAAQ;AACV;AAEA,CAAC;AACC,SAAO;AACP,eAAa;AACb,aAAW;AACb;AAEA,CAAC,uBAAuB,CAzCvB;AA0CC,aAAW,cAAc,KAAK,SAAS,UAAU,aAAa,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;AAChF,WAAS;AACX;AAEA,WAJa;AAKX;AAAO,eAAW,WAAW,GAAG,MAAM;AAAM;AAC5C;AAAK,eAAW,WAAW,OAAO,MAAM;AAAO;AACjD;AAEA,CAAC,UAAU,CAAC;AACV,YAAU;AAAU,UAAQ;AAAG,QAAM;AAAG,SAAO;AAC/C,WAAS;AAAM,OAAK;AAAM,WAAS,KAAK,KAAK,KAAK;AAClD,cAAY;AAAM,oBAAkB,EAAE;AACtC,WAAS;AAAI,eAAa;AAC1B,mBAAiB;AACnB;AACA,CAPC,UAOU,CAPC,aAOa;AAAsB,WAAS;AAAM;AAC9D,CARC,UAQU,CAvOV;AAwOC,aAAW;AACX,aAAW,KAAK,MAAM,EAAE;AACxB,iBAAe;AACf,cAAY,EAAE,KAAK,KAAK,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AACtC,qBAAmB;AACnB,UAAQ;AACV;AAEA,CAAC;AACC,YAAU;AACV,UAAQ;AACR,SAAO;AACP,cAAY,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AAChC,mBAAiB,KAAK;AACtB,WAAS,KAAK;AACd,iBAAe;AACf,cAAY,EAAE,KAAK,KAAK,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AACtC,WAAS;AACT,eAAa;AACb,OAAK;AACL,WAAS;AACT,UAAQ,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AAChC,cAAY,IAAI,KAAK,aAAa,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE;AACjD;AAEA,CAAC;AACC,WAAS;AACT,kBAAgB;AAChB,eAAa;AACb,OAAK;AACP;AAEA,CAAC;AACC,SAAO;AACP,UAAQ;AACR,cAAY;AACZ,iBAAe;AACf,WAAS;AACX;AAEA,CAAC;AACC,aAAW;AACX,eAAa;AACb,SAAO;AACP,eAAa;AACf;AAEA,CAAC;AACC,SAAO;AACP,UAAQ;AACR,cAAY;AACd;AAEA,CAAC;AACC,eAAa;AACb,aAAW;AACX,SAAO;AACP,eAAa;AACf;AAEA,CArEC,UAqEU,CApDV;AAqDC,OAAK;AACL,UAAQ;AACR,SAAO;AACP,WAAS,KAAK;AACd,iBAAe;AACf,OAAK;AACL,aAAW;AACb;AAEA,CA/EC,UA+EU,CAtCV;AAsCgC,SAAO;AAAM,UAAQ;AAAM;AAC5D,CAhFC,UAgFU,CA/BV;AA+BuC,aAAW;AAAK;AACxD,CAjFC,UAiFU,CAzBV;AAyBqC,UAAQ;AAAM;AACpD,CAlFC,UAkFU,CApBV;AAoBgC,aAAW;AAAM;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/styles.css"],"sourcesContent":["@import \"@neshan-maps-platform/mapbox-gl/dist/NeshanMapboxGl.css\";\r\n\r\n/* جلوگیری از بیرونزدگی و نشت اسکرول */\r\n.map-layout-root, \r\n.map-layout-root *, \r\n.map-layout-root *::before, \r\n.map-layout-root *::after {\r\n box-sizing: border-box;\r\n}\r\n\r\n.map-layout-root {\r\n display: flex;\r\n width: 100%;\r\n height: 100%; /* این ۱۰۰٪ باید از والد (محیط تست) گرفته شود */\r\n min-height: 100%;\r\n direction: rtl;\r\n font-family: inherit;\r\n overflow: hidden; /* جلوگیری از اسکرول خوردن کل کانتینر نقشه */\r\n position: absolute; /* برای اطمینان از پر کردن فضای والد */\r\n top: 0;\r\n left: 0;\r\n}\r\n\r\n/* سایدبار دسکتاپ */\r\n.sidebar {\r\n width: 350px;\r\n height: 100%;\r\n background: #ffffff;\r\n border-left: 1px solid #e5e7eb;\r\n display: flex;\r\n flex-direction: column;\r\n z-index: 1000;\r\n box-shadow: 2px 0 10px rgba(0, 0, 0, 0.05);\r\n position: relative;\r\n}\r\n\r\n.sidebar-header {\r\n padding: 20px;\r\n font-weight: 800;\r\n font-size: 18px;\r\n color: #111827;\r\n border-bottom: 1px solid #f3f4f6;\r\n flex-shrink: 0;\r\n}\r\n\r\n.sidebar-list {\r\n flex: 1;\r\n overflow-y: auto;\r\n min-height: 0;\r\n /* ✅ جلوگیری از اسکرول شدن صفحه پشتی وقتی به انتهای لیست میرسید */\r\n overscroll-behavior: contain; \r\n -webkit-overflow-scrolling: touch;\r\n}\r\n\r\n/* کارت فروشگاه */\r\n.store-card {\r\n padding: 16px;\r\n border-bottom: 1px solid #f3f4f6;\r\n cursor: pointer;\r\n transition: background 0.2s ease;\r\n background: #ffffff;\r\n width: 100%;\r\n}\r\n\r\n.store-card.active {\r\n background: #f8fafc;\r\n}\r\n\r\n.store-card-header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: flex-start;\r\n margin-bottom: 12px;\r\n}\r\n\r\n.store-name {\r\n margin: 0;\r\n font-size: 15px;\r\n font-weight: 800;\r\n color: #111827;\r\n}\r\n\r\n.store-location-tag {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n color: #6b7280;\r\n margin-top: 4px;\r\n}\r\n\r\n.store-city {\r\n font-size: 12px;\r\n font-weight: 600;\r\n}\r\n\r\n.report-btn {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n background: #f3f4f6;\r\n border: none;\r\n padding: 4px 10px;\r\n border-radius: 8px;\r\n color: #6b7280;\r\n font-size: 11px;\r\n font-weight: 700;\r\n cursor: pointer;\r\n}\r\n\r\n.store-desc-section {\r\n display: flex;\r\n align-items: flex-start;\r\n gap: 10px;\r\n margin-bottom: 16px;\r\n width: 100%;\r\n}\r\n\r\n.store-mini-logo {\r\n width: 40px;\r\n height: 40px;\r\n border-radius: 8px;\r\n object-fit: cover;\r\n border: 1px solid #e5e7eb;\r\n flex-shrink: 0;\r\n}\r\n\r\n.store-desc {\r\n flex: 1;\r\n font-size: 12px;\r\n color: #4b5563;\r\n line-height: 1.6;\r\n margin: 0;\r\n display: -webkit-box;\r\n -webkit-line-clamp: 2;\r\n -webkit-box-orient: vertical;\r\n overflow: hidden;\r\n}\r\n\r\n.store-card-footer {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n border-top: 1px dashed #e5e7eb;\r\n padding-top: 12px;\r\n}\r\n\r\n.price-container {\r\n display: flex;\r\n align-items: baseline;\r\n gap: 4px;\r\n}\r\n\r\n.price-value {\r\n font-size: 16px;\r\n font-weight: 900;\r\n color: #111827;\r\n}\r\n\r\n.price-unit {\r\n font-size: 11px;\r\n color: #6b7280;\r\n font-weight: 600;\r\n}\r\n\r\n.contact-trigger {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n color: #1d4ed8;\r\n font-size: 13px;\r\n font-weight: 800;\r\n}\r\n\r\n.arrow-icon {\r\n transition: transform 0.3s ease;\r\n transform: rotate(180deg);\r\n}\r\n\r\n.arrow-icon.open { transform: rotate(0deg); }\r\n\r\n/* دکمههای عمودی */\r\n.action-buttons.vertical {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 10px;\r\n margin-top: 15px;\r\n width: 100%;\r\n}\r\n\r\n.btn.full-width {\r\n width: 100%;\r\n padding: 12px;\r\n border-radius: 12px;\r\n text-decoration: none;\r\n border: none;\r\n display: block;\r\n}\r\n\r\n.btn-content {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n width: 100%;\r\n font-weight: 700;\r\n font-size: 13px;\r\n}\r\n\r\n.btn-call { background: #1d4ed8; color: white; }\r\n.btn-wa { background: #10b981; color: white; }\r\n.btn-route { background: #7c3aed; color: white; }\r\n\r\n/* بخش نقشه */\r\n.map-container { \r\n flex: 1; \r\n position: relative; \r\n background: #f3f4f6; \r\n height: 100%;\r\n}\r\n.store-details-wrapper { \r\n display: grid; \r\n grid-template-rows: 0fr; \r\n transition: grid-template-rows 0.3s ease; \r\n overflow: hidden;\r\n width: 100%;\r\n}\r\n.active .store-details-wrapper { grid-template-rows: 1fr; }\r\n.store-details-content { min-height: 0; width: 100%; }\r\n\r\n/* ✅ استایل مارکر: سفید، بردر نارنجی، متن مشکی */\r\n.neshan-marker-container { pointer-events: auto; }\r\n.neshan-marker-body {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n transform-origin: bottom center;\r\n}\r\n\r\n.neshan-marker-label {\r\n background: #ffffff;\r\n color: #111827 !important;\r\n font-size: 11px;\r\n font-weight: 800;\r\n padding: 4px 12px;\r\n border-radius: 20px;\r\n margin-top: 6px;\r\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\r\n border: 2px solid #f97316; /* نارنجی */\r\n white-space: nowrap;\r\n pointer-events: none;\r\n}\r\n\r\n/* کلاستر */\r\n.neshan-cluster-marker {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n background: #ffffff;\r\n border: 3px solid #2563eb;\r\n border-radius: 50%;\r\n width: 42px;\r\n height: 42px;\r\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.25);\r\n cursor: pointer;\r\n}\r\n\r\n.neshan-cluster-count {\r\n color: #2563eb;\r\n font-weight: 900;\r\n font-size: 16px;\r\n}\r\n\r\n/* انیمیشن انتخاب */\r\n.neshan-marker-selected .neshan-marker-body {\r\n animation: marker-bounce 0.8s infinite alternate cubic-bezier(0.45, 0.05, 0.55, 0.95);\r\n z-index: 100;\r\n}\r\n\r\n@keyframes marker-bounce {\r\n from { transform: translateY(0) scale(1.1); }\r\n to { transform: translateY(-12px) scale(1.15); }\r\n}\r\n\r\n/* موبایل */\r\n.is-mobile .mobile-slider {\r\n position: absolute; bottom: 0; left: 0; right: 0;\r\n display: flex; gap: 12px; padding: 20px 20px 40px 20px;\r\n overflow-x: auto; scroll-snap-type: x mandatory;\r\n z-index: 20; align-items: flex-end;\r\n scrollbar-width: none;\r\n overscroll-behavior: contain;\r\n}\r\n.is-mobile .mobile-slider::-webkit-scrollbar { display: none; }\r\n.is-mobile .store-card {\r\n min-width: 290px; \r\n max-width: calc(100vw - 40px);\r\n border-radius: 20px; \r\n box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);\r\n scroll-snap-align: center; \r\n border: none;\r\n}\r\n\r\n/* باج محصول حرفهای */\r\n.product-badge {\r\n position: absolute;\r\n bottom: 24px;\r\n right: 24px;\r\n background: rgba(255, 255, 255, 0.98);\r\n backdrop-filter: blur(12px);\r\n padding: 12px 20px;\r\n border-radius: 20px;\r\n box-shadow: 0 10px 30px rgba(0, 0, 0, 0.12);\r\n display: flex;\r\n align-items: center;\r\n gap: 16px;\r\n z-index: 40;\r\n border: 1px solid rgba(0, 0, 0, 0.05);\r\n}\r\n\r\n.product-badge-left-side { display: flex; flex-direction: column; align-items: center; gap: 4px; }\r\n.product-badge-logo { width: 65px; height: 50px; object-fit: contain; border-radius: 12px; padding: 1px; }\r\n.product-badge-fixed-label { font-size: 9px; font-weight: 800; color: #64748b; white-space: nowrap; }\r\n.product-badge-separator { width: 1px; height: 35px; background: #e2e8f0; }\r\n.product-badge-text { font-weight: 850; font-size: 12px; color: #0f172a; white-space: nowrap; }\r\n\r\n.is-mobile .product-badge { top: 16px; bottom: auto; right: 16px; padding: 10px 14px; border-radius: 16px; gap: 12px; max-width: 85vw; }\r\n.is-mobile .product-badge-logo { width: 32px; height: 32px; }\r\n.is-mobile .product-badge-fixed-label { font-size: 8px; }\r\n.is-mobile .product-badge-separator { height: 25px; }\r\n.is-mobile .product-badge-text { font-size: 13px; }"],"mappings":"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","names":[]}
|
package/dist/index.js
CHANGED
|
@@ -297,53 +297,63 @@ var InteractiveMap = (props) => {
|
|
|
297
297
|
}
|
|
298
298
|
}, [mapInstance, props]);
|
|
299
299
|
const safeMarkers = props.markers || [];
|
|
300
|
-
return
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
{
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
300
|
+
return (
|
|
301
|
+
/* ✅ استایل inline برای اطمینان از پر کردن فضای مودال والد */
|
|
302
|
+
/* @__PURE__ */ jsxs2(
|
|
303
|
+
"div",
|
|
304
|
+
{
|
|
305
|
+
className: `map-layout-root ${isMobile ? "is-mobile" : "is-desktop"}`,
|
|
306
|
+
style: { position: "absolute", inset: 0, height: "100%", width: "100%" },
|
|
307
|
+
children: [
|
|
308
|
+
!isMobile && /* @__PURE__ */ jsxs2("aside", { className: "sidebar", children: [
|
|
309
|
+
/* @__PURE__ */ jsx3("header", { className: "sidebar-header", children: "\u0644\u06CC\u0633\u062A \u0641\u0631\u0648\u0634\u06AF\u0627\u0647\u200C\u0647\u0627" }),
|
|
310
|
+
/* @__PURE__ */ jsx3("div", { className: "sidebar-list", children: safeMarkers.map((store, idx) => /* @__PURE__ */ jsx3(
|
|
311
|
+
StoreCard,
|
|
312
|
+
{
|
|
313
|
+
store,
|
|
314
|
+
isSelected: props.selectedMarkerId === store.id,
|
|
315
|
+
onSelect: () => handleStoreSelect(store, idx),
|
|
316
|
+
shopLogoUrl: store.logoUrl
|
|
317
|
+
},
|
|
318
|
+
store.id
|
|
319
|
+
)) })
|
|
320
|
+
] }),
|
|
321
|
+
/* @__PURE__ */ jsxs2("main", { className: "map-container", children: [
|
|
322
|
+
/* @__PURE__ */ jsx3(
|
|
323
|
+
Map_default,
|
|
324
|
+
{
|
|
325
|
+
...props,
|
|
326
|
+
onMapLoad: (map) => {
|
|
327
|
+
if (map) {
|
|
328
|
+
setMapInstance(map);
|
|
329
|
+
props.onMapLoad?.(map);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
),
|
|
334
|
+
props.productName && /* @__PURE__ */ jsxs2("div", { className: "product-badge", children: [
|
|
335
|
+
/* @__PURE__ */ jsxs2("div", { className: "product-badge-left-side", children: [
|
|
336
|
+
props.productLogoUrl && /* @__PURE__ */ jsx3("img", { src: props.productLogoUrl, alt: "product", className: "product-badge-logo" }),
|
|
337
|
+
/* @__PURE__ */ jsx3("span", { className: "product-badge-fixed-label", children: "\u0641\u0631\u0648\u0634\u06AF\u0627\u0647\u200C\u0647\u0627\u06CC \u062D\u0636\u0648\u0631\u06CC" })
|
|
338
|
+
] }),
|
|
339
|
+
/* @__PURE__ */ jsx3("div", { className: "product-badge-separator" }),
|
|
340
|
+
/* @__PURE__ */ jsx3("span", { className: "product-badge-text", children: props.productName })
|
|
341
|
+
] }),
|
|
342
|
+
isMobile && /* @__PURE__ */ jsx3("div", { className: "mobile-slider", ref: sliderRef, children: safeMarkers.map((store, idx) => /* @__PURE__ */ jsx3(
|
|
343
|
+
StoreCard,
|
|
344
|
+
{
|
|
345
|
+
store,
|
|
346
|
+
isSelected: props.selectedMarkerId === store.id,
|
|
347
|
+
onSelect: () => handleStoreSelect(store, idx),
|
|
348
|
+
shopLogoUrl: store.logoUrl
|
|
349
|
+
},
|
|
350
|
+
store.id
|
|
351
|
+
)) })
|
|
352
|
+
] })
|
|
353
|
+
]
|
|
354
|
+
}
|
|
355
|
+
)
|
|
356
|
+
);
|
|
347
357
|
};
|
|
348
358
|
export {
|
|
349
359
|
InteractiveMap as NeshanMap,
|