@page-speed/maps 0.2.0 → 0.2.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/geo-map.cjs +53 -4
- package/dist/components/geo-map.cjs.map +1 -1
- package/dist/components/geo-map.js +53 -4
- package/dist/components/geo-map.js.map +1 -1
- package/dist/components/index.cjs +53 -4
- package/dist/components/index.cjs.map +1 -1
- package/dist/components/index.js +53 -4
- package/dist/components/index.js.map +1 -1
- package/dist/index.cjs +53 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +53 -4
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/cn.ts","../../src/components/map-marker.tsx","../../src/utils/getMapLibreStyleUrl.ts","../../src/utils/simple-pressable.tsx","../../src/core/MapLibre.tsx","../../src/hooks/useDefaultZoom.ts","../../src/components/geo-map.tsx"],"names":["React","jsx","jsxs","Map"],"mappings":"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","file":"index.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Utility function to merge Tailwind CSS classes with proper conflict resolution.\n * Uses clsx for conditional class names and tailwind-merge for deduplication.\n *\n * @param inputs - Class names to merge\n * @returns Merged class string\n *\n * @example\n * cn(\"px-2 py-1\", \"px-4\") // => \"py-1 px-4\"\n * cn(\"text-red-500\", condition && \"text-blue-500\") // => \"text-blue-500\" (if condition is true)\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import * as React from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport type MapMarkerSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface MapMarkerProps {\n /** Size variant of the marker */\n size?: MapMarkerSize;\n /** Whether the marker is currently selected/active */\n isSelected?: boolean;\n /** Custom color for the center dot (defaults to neutral-900) */\n dotColor?: string;\n /** Custom color for the inner ring (defaults to neutral-400) */\n innerRingColor?: string;\n /** Custom color for the middle ring (defaults to neutral-300) */\n middleRingColor?: string;\n /** Custom color for the outer ring (defaults to neutral-200) */\n outerRingColor?: string;\n /** Additional class name for the wrapper */\n className?: string;\n /** Click handler for the marker */\n onClick?: (event: React.MouseEvent) => void;\n /** Whether the marker is interactive/clickable */\n interactive?: boolean;\n /** Accessible label for the marker */\n \"aria-label\"?: string;\n}\n\nconst SIZE_CONFIG: Record<\n MapMarkerSize,\n {\n outer: string;\n middle: string;\n inner: string;\n dot: string;\n }\n> = {\n sm: {\n outer: \"size-10\",\n middle: \"size-7\",\n inner: \"size-5\",\n dot: \"size-2\",\n },\n md: {\n outer: \"size-14\",\n middle: \"size-10\",\n inner: \"size-7\",\n dot: \"size-2.5\",\n },\n lg: {\n outer: \"size-20\",\n middle: \"size-14\",\n inner: \"size-10\",\n dot: \"size-3.5\",\n },\n};\n\n/**\n * A reusable map marker component with concentric circle design.\n * Can be used directly with MapLibre markers via the `element` prop.\n *\n * @example\n * // Basic usage\n * <MapMarker />\n *\n * @example\n * // With MapLibre GeoMap\n * const markers = [{\n * id: 'location-1',\n * latitude: 40.7128,\n * longitude: -74.0060,\n * markerElement: ({ isSelected }) => (\n * <MapMarker isSelected={isSelected} size=\"md\" />\n * ),\n * }];\n *\n * @example\n * // Custom colors\n * <MapMarker\n * dotColor=\"#1E40AF\"\n * innerRingColor=\"#3B82F6\"\n * middleRingColor=\"#93C5FD\"\n * outerRingColor=\"#DBEAFE\"\n * />\n */\nexport function MapMarker({\n size = \"md\",\n isSelected = false,\n dotColor,\n innerRingColor,\n middleRingColor,\n outerRingColor,\n className,\n onClick,\n interactive = true,\n \"aria-label\": ariaLabel = \"Map location marker\",\n}: MapMarkerProps) {\n const sizeConfig = SIZE_CONFIG[size];\n\n const content = (\n <div\n className={cn(\n \"relative flex items-center justify-center rounded-full transition-transform duration-200\",\n sizeConfig.outer,\n isSelected && \"scale-110\",\n className\n )}\n style={{ backgroundColor: outerRingColor }}\n >\n {/* Middle ring */}\n <div\n className={cn(\n \"absolute rounded-full transition-all duration-200\",\n sizeConfig.middle\n )}\n style={{ backgroundColor: middleRingColor }}\n />\n\n {/* Inner ring */}\n <div\n className={cn(\n \"absolute rounded-full transition-all duration-200\",\n sizeConfig.inner\n )}\n style={{ backgroundColor: innerRingColor }}\n />\n\n {/* Center dot */}\n <div\n className={cn(\n \"absolute rounded-full transition-all duration-200\",\n sizeConfig.dot\n )}\n style={{ backgroundColor: dotColor }}\n />\n </div>\n );\n\n if (!interactive) {\n return content;\n }\n\n return (\n <button\n type=\"button\"\n className=\"group cursor-pointer focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 rounded-full\"\n onClick={onClick}\n aria-label={ariaLabel}\n >\n <div\n className={cn(\n \"transition-transform duration-200 group-hover:scale-110\",\n isSelected && \"scale-110\"\n )}\n >\n {content}\n </div>\n </button>\n );\n}\n\n/**\n * Pre-configured marker with neutral gray colors matching the reference design.\n */\nexport function NeutralMapMarker(\n props: Omit<\n MapMarkerProps,\n \"dotColor\" | \"innerRingColor\" | \"middleRingColor\" | \"outerRingColor\"\n >\n) {\n return (\n <MapMarker\n {...props}\n dotColor=\"hsl(var(--neutral-900, 0 0% 9%))\"\n innerRingColor=\"hsl(var(--neutral-400, 0 0% 64%))\"\n middleRingColor=\"hsl(var(--neutral-300, 0 0% 78%))\"\n outerRingColor=\"hsl(var(--neutral-200, 0 0% 88%))\"\n />\n );\n}\n\n/**\n * Factory function to create a marker element for use with MapLibre/GeoMap.\n * Returns a function compatible with the `markerElement` prop.\n *\n * @example\n * const markers = [{\n * id: 'location-1',\n * latitude: 40.7128,\n * longitude: -74.0060,\n * markerElement: createMapMarkerElement({ size: 'lg' }),\n * }];\n */\nexport function createMapMarkerElement(\n config?: Omit<MapMarkerProps, \"isSelected\" | \"onClick\">\n) {\n return function MarkerElement({ isSelected }: { isSelected: boolean }) {\n return <MapMarker {...config} isSelected={isSelected} interactive={false} />;\n };\n}\n\nexport default MapMarker;\n","const MAPLIBRE_DEFAULT_STYLE_URL =\n \"https://basemaps.cartocdn.com/gl/positron-gl-style/style.json\";\nconst DEFAULT_STADIA_STYLE_URL =\n \"https://tiles.stadiamaps.com/styles/osm_bright.json\";\n\nconst STYLE_MAP: Record<string, string> = {\n default: DEFAULT_STADIA_STYLE_URL,\n \"alidade-smooth\": \"https://tiles.stadiamaps.com/styles/alidade_smooth.json\",\n \"alidade-smooth-dark\": \"https://tiles.stadiamaps.com/styles/alidade_smooth_dark.json\",\n \"maplibre-default\": MAPLIBRE_DEFAULT_STYLE_URL,\n \"osm-bright\": \"https://tiles.stadiamaps.com/styles/osm_bright.json\",\n \"stadia-outdoors\": \"https://tiles.stadiamaps.com/styles/outdoors.json\",\n \"stamen-toner\": \"https://tiles.stadiamaps.com/styles/stamen_toner.json\",\n \"stamen-terrain\": \"https://tiles.stadiamaps.com/styles/stamen_terrain.json\",\n \"stamen-watercolor\": \"https://tiles.stadiamaps.com/styles/stamen_watercolor.json\"\n};\n\nconst HTTP_URL_REGEX = /^https?:\\/\\//i;\n\nexport type MapLibreBuiltInStyle = keyof typeof STYLE_MAP;\n\nfunction isStadiaMapsUrl(url: string): boolean {\n try {\n const parsed = new URL(url);\n return parsed.hostname === \"tiles.stadiamaps.com\";\n } catch {\n return false;\n }\n}\n\nfunction assertStadiaApiKey(stadiaApiKey: string): void {\n if (!stadiaApiKey.trim()) {\n throw new Error(\n \"A non-empty stadiaApiKey is required for Stadia Maps style URLs.\"\n );\n }\n}\n\nexport function appendStadiaApiKey(\n styleUrl: string,\n stadiaApiKey: string\n): string {\n if (!isStadiaMapsUrl(styleUrl)) {\n return styleUrl;\n }\n\n assertStadiaApiKey(stadiaApiKey);\n\n const parsed = new URL(styleUrl);\n if (!parsed.searchParams.has(\"api_key\")) {\n parsed.searchParams.set(\"api_key\", stadiaApiKey);\n }\n\n return parsed.toString();\n}\n\nexport function getMapLibreStyleUrl(\n value: string | undefined,\n stadiaApiKey: string\n): string {\n const normalizedApiKey = stadiaApiKey.trim();\n\n if (!value || typeof value !== \"string\") {\n if (!normalizedApiKey) {\n return MAPLIBRE_DEFAULT_STYLE_URL;\n }\n return appendStadiaApiKey(DEFAULT_STADIA_STYLE_URL, normalizedApiKey);\n }\n\n if (STYLE_MAP[value]) {\n const mappedStyleUrl = STYLE_MAP[value];\n if (isStadiaMapsUrl(mappedStyleUrl) && !normalizedApiKey) {\n return MAPLIBRE_DEFAULT_STYLE_URL;\n }\n return appendStadiaApiKey(mappedStyleUrl, normalizedApiKey);\n }\n\n if (HTTP_URL_REGEX.test(value)) {\n if (isStadiaMapsUrl(value) && !normalizedApiKey) {\n return MAPLIBRE_DEFAULT_STYLE_URL;\n }\n return appendStadiaApiKey(value, normalizedApiKey);\n }\n\n if (!normalizedApiKey) {\n return MAPLIBRE_DEFAULT_STYLE_URL;\n }\n\n return appendStadiaApiKey(DEFAULT_STADIA_STYLE_URL, normalizedApiKey);\n}\n\nexport { DEFAULT_STADIA_STYLE_URL, MAPLIBRE_DEFAULT_STYLE_URL };\n","/**\n * Simple Pressable component for internal use by map components.\n * This is a lightweight version focused on basic link/button functionality.\n * For full-featured Pressable, use @opensite/ui.\n */\n\nimport * as React from \"react\";\n\nexport interface SimplePressableProps {\n children: React.ReactNode;\n className?: string;\n href?: string;\n onClick?: React.MouseEventHandler<HTMLElement>;\n \"aria-label\"?: string;\n target?: string;\n rel?: string;\n}\n\nexport const SimplePressable = React.forwardRef<\n HTMLAnchorElement | HTMLButtonElement,\n SimplePressableProps\n>(({ children, className, href, onClick, ...props }, ref) => {\n if (href) {\n const isExternal = href.startsWith(\"http://\") || href.startsWith(\"https://\");\n return (\n <a\n ref={ref as React.Ref<HTMLAnchorElement>}\n href={href}\n className={className}\n target={isExternal ? \"_blank\" : props.target}\n rel={isExternal ? \"noopener noreferrer\" : props.rel}\n onClick={onClick}\n {...props}\n >\n {children}\n </a>\n );\n }\n\n if (onClick) {\n return (\n <button\n ref={ref as React.Ref<HTMLButtonElement>}\n type=\"button\"\n className={className}\n onClick={onClick}\n {...props}\n >\n {children}\n </button>\n );\n }\n\n return <span className={className}>{children}</span>;\n});\n\nSimplePressable.displayName = \"SimplePressable\";\n","import React from \"react\";\nimport {\n GeolocateControl,\n Map,\n Marker,\n NavigationControl,\n type MapRef,\n type ViewStateChangeEvent\n} from \"react-map-gl/maplibre\";\n\nimport type {\n BasicMarkerInput,\n MapLibreFlyToOptions,\n MapLibreMarker,\n MapLibreProps,\n MapViewState\n} from \"../types\";\nimport { appendStadiaApiKey, getMapLibreStyleUrl } from \"../utils\";\n\nconst DEFAULT_MAPLIBRE_CSS_HREF =\n \"https://cdn.jsdelivr.net/npm/maplibre-gl@5.18.0/dist/maplibre-gl.css\";\nconst MAPLIBRE_STYLESHEET_ID = \"page-speed-maplibre-gl-css\";\nconst DEFAULT_FLY_TO_OPTIONS: Readonly<MapLibreFlyToOptions> = Object.freeze({});\nconst VIEW_STATE_COORDINATE_EPSILON = 0.000001;\nconst VIEW_STATE_ZOOM_EPSILON = 0.01;\nconst DEFAULT_FLY_TO_EASING = (t: number): number => 1 - Math.pow(1 - t, 3);\n\nfunction joinClassNames(...classNames: Array<string | undefined>): string {\n return classNames.filter(Boolean).join(\" \");\n}\n\nfunction hasMeaningfulViewStateDelta(\n previous: MapViewState,\n next: MapViewState\n): boolean {\n return (\n Math.abs(previous.latitude - next.latitude) > VIEW_STATE_COORDINATE_EPSILON ||\n Math.abs(previous.longitude - next.longitude) > VIEW_STATE_COORDINATE_EPSILON ||\n Math.abs(previous.zoom - next.zoom) > VIEW_STATE_ZOOM_EPSILON\n );\n}\n\nfunction ensureMapLibreStylesheet(href: string): void {\n if (typeof document === \"undefined\") {\n return;\n }\n\n const existingLink = document.getElementById(MAPLIBRE_STYLESHEET_ID);\n if (existingLink instanceof HTMLLinkElement) {\n if (existingLink.getAttribute(\"href\") !== href) {\n existingLink.setAttribute(\"href\", href);\n }\n return;\n }\n\n const matchingLink = Array.from(\n document.querySelectorAll(\"link[rel='stylesheet']\")\n ).find((link) => link.getAttribute(\"href\") === href);\n\n if (matchingLink instanceof HTMLLinkElement) {\n matchingLink.id = MAPLIBRE_STYLESHEET_ID;\n return;\n }\n\n const stylesheet = document.createElement(\"link\");\n stylesheet.id = MAPLIBRE_STYLESHEET_ID;\n stylesheet.rel = \"stylesheet\";\n stylesheet.href = href;\n stylesheet.dataset.pageSpeedMaps = \"maplibre-css\";\n document.head.appendChild(stylesheet);\n}\n\nfunction DefaultMarker({ marker }: { marker: MapLibreMarker }) {\n return (\n <div\n style={{\n cursor: marker.draggable ? \"grab\" : \"pointer\",\n transform: \"translate(-50%, -100%)\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n position: \"relative\"\n }}\n onClick={marker.onClick}\n >\n <svg\n aria-hidden=\"true\"\n width=\"32\"\n height=\"32\"\n viewBox=\"0 0 24 24\"\n fill={marker.color || \"#3B82F6\"}\n style={{ filter: \"drop-shadow(0 2px 8px rgba(0,0,0,0.35))\" }}\n >\n <path d=\"M12 2C8.13 2 5 5.13 5 9c0 4.85 6.13 12.24 6.39 12.55a.75.75 0 0 0 1.16 0C12.87 21.24 19 13.85 19 9c0-3.87-3.13-7-7-7Zm0 9.75A2.75 2.75 0 1 1 12 6.25a2.75 2.75 0 0 1 0 5.5Z\" />\n </svg>\n {marker.label ? (\n <div\n style={{\n position: \"absolute\",\n bottom: -28,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n background: \"#FFFFFF\",\n borderRadius: 6,\n padding: \"2px 8px\",\n fontSize: 12,\n fontWeight: 500,\n whiteSpace: \"nowrap\",\n boxShadow: \"0 3px 10px rgba(0, 0, 0, 0.2)\"\n }}\n >\n {marker.label}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction normalizeMarkers(\n markers: (MapLibreMarker | BasicMarkerInput)[]\n): MapLibreMarker[] {\n return markers.map((marker, index) => {\n if (\n (marker as MapLibreMarker).lat !== undefined &&\n (marker as MapLibreMarker).lng !== undefined\n ) {\n return marker as MapLibreMarker;\n }\n\n const basicMarker = marker as BasicMarkerInput;\n return {\n id: basicMarker.id ?? index,\n lat: basicMarker.latitude,\n lng: basicMarker.longitude,\n color: basicMarker.color,\n draggable: basicMarker.draggable,\n label: basicMarker.label,\n element: basicMarker.element,\n onClick: basicMarker.onClick\n };\n });\n}\n\nexport function MapLibre({\n stadiaApiKey,\n mapLibreCssHref,\n viewState,\n onViewStateChange,\n mapStyle,\n center = viewState\n ? { lat: viewState.latitude ?? 0, lng: viewState.longitude ?? 0 }\n : { lat: 0, lng: 0 },\n zoom = viewState?.zoom ?? 14,\n styleUrl,\n markers = [],\n onMoveEnd,\n onClick,\n onMarkerDrag,\n className,\n style,\n children,\n showNavigationControl = true,\n showGeolocateControl = false,\n navigationControlPosition = \"bottom-right\",\n geolocateControlPosition = \"top-left\",\n flyToOptions = DEFAULT_FLY_TO_OPTIONS\n}: MapLibreProps) {\n const mapRef = React.useRef<MapRef>(null);\n const resolvedMapLibreCssHref =\n mapLibreCssHref && mapLibreCssHref.trim().length > 0\n ? mapLibreCssHref\n : DEFAULT_MAPLIBRE_CSS_HREF;\n\n const [internalViewState, setInternalViewState] = React.useState<MapViewState>({\n latitude: viewState?.latitude ?? center.lat,\n longitude: viewState?.longitude ?? center.lng,\n zoom: viewState?.zoom ?? zoom\n });\n\n const isUserInteracting = React.useRef(false);\n const isMarkerDragging = React.useRef(false);\n const dragAnimationFrame = React.useRef<number | null>(null);\n const lastReportedViewState = React.useRef<MapViewState | null>(null);\n\n const resolvedFlyToOptions = React.useMemo(\n () => ({\n speed: flyToOptions.speed ?? 0.8,\n curve: flyToOptions.curve ?? 1.2,\n bearing: flyToOptions.bearing ?? 0,\n easing: flyToOptions.easing ?? DEFAULT_FLY_TO_EASING\n }),\n [\n flyToOptions.bearing,\n flyToOptions.curve,\n flyToOptions.easing,\n flyToOptions.speed\n ]\n );\n\n React.useEffect(() => {\n ensureMapLibreStylesheet(resolvedMapLibreCssHref);\n }, [resolvedMapLibreCssHref]);\n\n React.useEffect(() => {\n if (\n !mapRef.current ||\n !viewState ||\n isUserInteracting.current ||\n isMarkerDragging.current\n ) {\n return;\n }\n\n setInternalViewState((previous) => {\n const next = {\n latitude: viewState.latitude ?? previous.latitude,\n longitude: viewState.longitude ?? previous.longitude,\n zoom: viewState.zoom ?? previous.zoom\n };\n\n const hasChanged = hasMeaningfulViewStateDelta(previous, next);\n\n if (!hasChanged) {\n return previous;\n }\n\n const isEchoedMoveState =\n !!lastReportedViewState.current &&\n !hasMeaningfulViewStateDelta(lastReportedViewState.current, next);\n\n if (!isEchoedMoveState) {\n mapRef.current?.flyTo({\n center: [next.longitude, next.latitude],\n zoom: next.zoom,\n speed: resolvedFlyToOptions.speed,\n curve: resolvedFlyToOptions.curve,\n bearing: resolvedFlyToOptions.bearing,\n easing: resolvedFlyToOptions.easing,\n essential: true\n });\n }\n\n return next;\n });\n }, [\n resolvedFlyToOptions,\n viewState?.latitude,\n viewState?.longitude,\n viewState?.zoom\n ]);\n\n const handleMoveStart = React.useCallback(() => {\n isUserInteracting.current = true;\n }, []);\n\n const handleMove = React.useCallback(\n (event: ViewStateChangeEvent) => {\n const nextViewState = event.viewState;\n setInternalViewState({\n latitude: nextViewState.latitude,\n longitude: nextViewState.longitude,\n zoom: nextViewState.zoom\n });\n\n const roundedViewState = {\n latitude: Number(nextViewState.latitude.toFixed(6)),\n longitude: Number(nextViewState.longitude.toFixed(6)),\n zoom: Number(nextViewState.zoom.toFixed(2))\n };\n\n lastReportedViewState.current = roundedViewState;\n onViewStateChange?.(roundedViewState);\n },\n [onViewStateChange]\n );\n\n const handleMoveEnd = React.useCallback(\n (event: ViewStateChangeEvent) => {\n isUserInteracting.current = false;\n\n if (!onMoveEnd) {\n return;\n }\n\n const map = event.target;\n const nextCenter = map.getCenter();\n const nextZoom = map.getZoom();\n const bounds = map.getBounds();\n\n onMoveEnd(\n {\n lat: Number(nextCenter.lat.toFixed(6)),\n lng: Number(nextCenter.lng.toFixed(6))\n },\n Number(nextZoom.toFixed(2)),\n bounds\n );\n },\n [onMoveEnd]\n );\n\n const handleMapClick = React.useCallback(\n (event: { lngLat: { lng: number; lat: number } }) => {\n if (!onClick) {\n return;\n }\n\n onClick({ latitude: event.lngLat.lat, longitude: event.lngLat.lng });\n },\n [onClick]\n );\n\n const normalizedMarkers = React.useMemo(\n () => normalizeMarkers(markers),\n [markers]\n );\n\n const markerElements = React.useMemo(\n () =>\n normalizedMarkers.map((marker) => (\n <Marker\n key={marker.id}\n longitude={marker.lng}\n latitude={marker.lat}\n draggable={marker.draggable}\n onDragStart={() => {\n isMarkerDragging.current = true;\n }}\n onDrag={(event) => {\n if (!mapRef.current) {\n return;\n }\n\n const nextLngLat = (event as { lngLat?: { lng?: number; lat?: number } }).lngLat;\n if (!nextLngLat || nextLngLat.lng === undefined || nextLngLat.lat === undefined) {\n return;\n }\n const draggedLng = nextLngLat.lng;\n const draggedLat = nextLngLat.lat;\n\n if (dragAnimationFrame.current) {\n cancelAnimationFrame(dragAnimationFrame.current);\n }\n\n dragAnimationFrame.current = requestAnimationFrame(() => {\n if (!mapRef.current) {\n return;\n }\n\n const bounds = mapRef.current.getBounds();\n const viewportWidth = bounds.getEast() - bounds.getWest();\n const viewportHeight = bounds.getNorth() - bounds.getSouth();\n\n const edgePadding = 0.1;\n const westThreshold = bounds.getWest() + viewportWidth * edgePadding;\n const eastThreshold = bounds.getEast() - viewportWidth * edgePadding;\n const southThreshold = bounds.getSouth() + viewportHeight * edgePadding;\n const northThreshold = bounds.getNorth() - viewportHeight * edgePadding;\n\n const nearWestEdge = draggedLng < westThreshold;\n const nearEastEdge = draggedLng > eastThreshold;\n const nearSouthEdge = draggedLat < southThreshold;\n const nearNorthEdge = draggedLat > northThreshold;\n\n if (!nearWestEdge && !nearEastEdge && !nearSouthEdge && !nearNorthEdge) {\n return;\n }\n\n let panLng = draggedLng;\n let panLat = draggedLat;\n const offsetAmount = 0.2;\n\n if (nearWestEdge) {\n panLng = draggedLng - viewportWidth * offsetAmount;\n }\n if (nearEastEdge) {\n panLng = draggedLng + viewportWidth * offsetAmount;\n }\n if (nearSouthEdge) {\n panLat = draggedLat - viewportHeight * offsetAmount;\n }\n if (nearNorthEdge) {\n panLat = draggedLat + viewportHeight * offsetAmount;\n }\n\n mapRef.current?.easeTo({\n center: [panLng, panLat],\n duration: 200\n });\n });\n }}\n onDragEnd={(event) => {\n isMarkerDragging.current = false;\n\n if (dragAnimationFrame.current) {\n cancelAnimationFrame(dragAnimationFrame.current);\n dragAnimationFrame.current = null;\n }\n\n if (!onMarkerDrag) {\n return;\n }\n\n const nextLngLat = (event as { lngLat?: { lng?: number; lat?: number } }).lngLat;\n if (!nextLngLat || nextLngLat.lng === undefined || nextLngLat.lat === undefined) {\n return;\n }\n\n onMarkerDrag(marker.id ?? null, {\n latitude: nextLngLat.lat,\n longitude: nextLngLat.lng\n });\n }}\n >\n {marker.element\n ? typeof marker.element === \"function\"\n ? marker.element()\n : marker.element\n : <DefaultMarker marker={marker} />}\n </Marker>\n )),\n [normalizedMarkers, onMarkerDrag]\n );\n\n const resolvedMapStyleUrl = React.useMemo(() => {\n if (styleUrl) {\n return appendStadiaApiKey(styleUrl, stadiaApiKey);\n }\n\n if (mapStyle) {\n return getMapLibreStyleUrl(mapStyle, stadiaApiKey);\n }\n\n return getMapLibreStyleUrl(\"osm-bright\", stadiaApiKey);\n }, [mapStyle, stadiaApiKey, styleUrl]);\n\n const containerRef = React.useRef<HTMLDivElement>(null);\n\n // Fix for MapLibre canvas height growth issue\n React.useEffect(() => {\n if (!mapRef.current || !containerRef.current) return;\n\n // Force the map to respect container bounds\n const enforceContainerHeight = () => {\n const container = containerRef.current;\n const map = mapRef.current;\n\n if (!container || !map) return;\n\n // Get the actual container height\n const rect = container.getBoundingClientRect();\n const maxHeight = Math.min(rect.height, window.innerHeight);\n\n // Ensure the map canvas doesn't exceed container\n const canvas = map.getCanvas();\n if (canvas && canvas.style.height) {\n const canvasHeight = parseInt(canvas.style.height);\n if (canvasHeight > maxHeight || canvasHeight > 2000) {\n // Force resize to container dimensions\n map.resize();\n }\n }\n };\n\n // Check periodically to prevent runaway growth\n const interval = setInterval(enforceContainerHeight, 1000);\n\n // Also check on any resize events if ResizeObserver is available\n let resizeObserver: ResizeObserver | null = null;\n if (typeof ResizeObserver !== \"undefined\") {\n resizeObserver = new ResizeObserver(() => {\n enforceContainerHeight();\n });\n resizeObserver.observe(containerRef.current);\n }\n\n return () => {\n clearInterval(interval);\n if (resizeObserver) {\n resizeObserver.disconnect();\n }\n };\n }, []);\n\n return (\n <div\n ref={containerRef}\n className={joinClassNames(\"relative w-full h-full\", className)}\n style={{\n width: \"100%\",\n height: \"100%\",\n maxHeight: \"100vh\", // Prevent excessive height\n overflow: \"hidden\",\n position: \"relative\",\n ...style\n }}\n >\n <Map\n ref={mapRef}\n {...internalViewState}\n mapStyle={resolvedMapStyleUrl}\n onMoveStart={handleMoveStart}\n onMove={handleMove}\n onMoveEnd={handleMoveEnd}\n onClick={handleMapClick}\n attributionControl={false}\n trackResize\n dragRotate={false}\n touchZoomRotate={false}\n >\n {showGeolocateControl ? (\n <GeolocateControl position={geolocateControlPosition} />\n ) : null}\n\n {showNavigationControl ? (\n <NavigationControl position={navigationControlPosition} />\n ) : null}\n\n {markerElements}\n\n {children}\n </Map>\n </div>\n );\n}\n\nexport const DTMapLibreMap = MapLibre;\n","import { useMemo } from \"react\";\nimport type { GeoCoordinate } from \"./useGeoCenter\";\n\nexport interface DefaultZoomOptions {\n /** Array of coordinates to fit */\n coordinates: GeoCoordinate[];\n /** Map container width in pixels */\n mapWidth: number;\n /** Map container height in pixels */\n mapHeight: number;\n /** Padding in pixels around the bounds (default: 50) */\n padding?: number;\n /** Maximum zoom level to return (default: 18) */\n maxZoom?: number;\n /** Minimum zoom level to return (default: 1) */\n minZoom?: number;\n}\n\nconst TILE_SIZE = 512; // MapLibre GL JS uses 512px tiles\n\n/**\n * Converts latitude to Mercator Y pixel coordinate at zoom 0.\n */\nfunction latToMercatorY(lat: number): number {\n const latRad = (lat * Math.PI) / 180;\n const mercN = Math.log(Math.tan(Math.PI / 4 + latRad / 2));\n return (TILE_SIZE / (2 * Math.PI)) * (Math.PI - mercN);\n}\n\n/**\n * Converts longitude to Mercator X pixel coordinate at zoom 0.\n */\nfunction lngToMercatorX(lng: number): number {\n return (TILE_SIZE / (2 * Math.PI)) * (((lng + 180) / 360) * 2 * Math.PI);\n}\n\n/**\n * Pure function: computes the ideal zoom level to fit all coordinates\n * within the given map dimensions.\n *\n * Returns null if fewer than 1 coordinate is provided.\n * For a single coordinate, returns maxZoom (caller should use markerFocusZoom).\n */\nexport function computeDefaultZoom(options: DefaultZoomOptions): number | null {\n const {\n coordinates,\n mapWidth,\n mapHeight,\n padding = 50,\n maxZoom = 18,\n minZoom = 1,\n } = options;\n\n if (coordinates.length === 0) return null;\n if (coordinates.length === 1) return maxZoom;\n if (mapWidth <= 0 || mapHeight <= 0) return null;\n\n // Compute bounding box\n let minLat = Infinity;\n let maxLat = -Infinity;\n let minLng = Infinity;\n let maxLng = -Infinity;\n\n for (const coord of coordinates) {\n if (coord.lat < minLat) minLat = coord.lat;\n if (coord.lat > maxLat) maxLat = coord.lat;\n if (coord.lng < minLng) minLng = coord.lng;\n if (coord.lng > maxLng) maxLng = coord.lng;\n }\n\n // Compute pixel span at zoom 0\n const pixelXMin = lngToMercatorX(minLng);\n const pixelXMax = lngToMercatorX(maxLng);\n const pixelYMin = latToMercatorY(maxLat); // Note: Y is inverted in Mercator\n const pixelYMax = latToMercatorY(minLat);\n\n const dx = Math.abs(pixelXMax - pixelXMin);\n const dy = Math.abs(pixelYMax - pixelYMin);\n\n // Available viewport after padding\n const availableWidth = mapWidth - padding * 2;\n const availableHeight = mapHeight - padding * 2;\n\n if (availableWidth <= 0 || availableHeight <= 0) return minZoom;\n\n // Compute zoom for each axis: viewport = pixelSpan * 2^zoom\n // So zoom = log2(viewport / pixelSpan)\n let zoom: number;\n\n if (dx === 0 && dy === 0) {\n // All coordinates are identical\n return maxZoom;\n } else if (dx === 0) {\n zoom = Math.log2(availableHeight / dy);\n } else if (dy === 0) {\n zoom = Math.log2(availableWidth / dx);\n } else {\n const zoomX = Math.log2(availableWidth / dx);\n const zoomY = Math.log2(availableHeight / dy);\n zoom = Math.min(zoomX, zoomY); // Use the more restrictive axis\n }\n\n // Clamp to min/max and floor to avoid sub-pixel jitter\n return Math.max(minZoom, Math.min(maxZoom, Math.floor(zoom * 100) / 100));\n}\n\n/**\n * React hook wrapper around computeDefaultZoom.\n */\nexport function useDefaultZoom(options: DefaultZoomOptions): number | null {\n const { coordinates, mapWidth, mapHeight, padding, maxZoom, minZoom } = options;\n\n return useMemo(\n () =>\n computeDefaultZoom({\n coordinates,\n mapWidth,\n mapHeight,\n padding,\n maxZoom,\n minZoom,\n }),\n [coordinates, mapWidth, mapHeight, padding, maxZoom, minZoom]\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { MapLibre } from \"../core\";\nimport type {\n BasicMarkerInput,\n MapControlPosition,\n MapCoordinate,\n MapLibreFlyToOptions,\n MapViewState,\n} from \"../types\";\nimport { useDefaultZoom } from \"../hooks/useDefaultZoom\";\nimport { cn } from \"../utils/cn\";\nimport { SimplePressable } from \"../utils/simple-pressable\";\n\n// Optional peer dependencies - allow consuming apps to provide these\ntype IconComponent = React.ComponentType<{\n name: string;\n size?: number;\n className?: string;\n}>;\ntype ImgComponent = React.ComponentType<{\n src: string;\n alt?: string;\n className?: string;\n loading?: \"lazy\" | \"eager\";\n optixFlowConfig?: any;\n}>;\n\ntype PanelPosition = \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\";\n\nexport type GeoMapMediaType = \"image\" | \"video\";\n\nexport interface GeoMapMediaItem {\n id?: string | number;\n src: string;\n type?: GeoMapMediaType;\n alt?: string;\n poster?: string;\n}\n\nexport interface GeoMapMarker {\n id?: string | number;\n latitude: number;\n longitude: number;\n label?: React.ReactNode;\n eyebrow?: React.ReactNode;\n title?: React.ReactNode;\n summary?: React.ReactNode;\n locationLine?: React.ReactNode;\n locationUrl?: string;\n hoursLine?: React.ReactNode;\n mediaItems?: GeoMapMediaItem[];\n markerContentComponent?: React.ReactNode;\n actions?: ActionConfig[];\n draggable?: boolean;\n pinColor?: string;\n pinClassName?: string;\n markerElement?:\n | React.ReactNode\n | ((args: { isSelected: boolean }) => React.ReactNode);\n}\n\nexport interface GeoMapCluster {\n id?: string | number;\n label?: React.ReactNode;\n title?: React.ReactNode;\n summary?: React.ReactNode;\n latitude?: number;\n longitude?: number;\n markers: GeoMapMarker[];\n pinColor?: string;\n pinClassName?: string;\n markerElement?:\n | React.ReactNode\n | ((args: { isSelected: boolean; count: number }) => React.ReactNode);\n}\n\nexport interface GeoMapSelection {\n type: \"none\" | \"marker\" | \"cluster\";\n marker?: GeoMapMarker;\n cluster?: GeoMapCluster;\n}\n\nexport interface ActionConfig {\n label?: React.ReactNode;\n icon?: React.ReactNode;\n iconAfter?: React.ReactNode;\n children?: React.ReactNode;\n href?: string;\n onClick?: React.MouseEventHandler;\n className?: string;\n variant?: \"default\" | \"outline\" | \"ghost\" | \"link\";\n size?: \"sm\" | \"md\" | \"lg\" | \"icon\";\n asButton?: boolean;\n [key: string]: any;\n}\n\nexport interface GeoMapProps {\n className?: string;\n mapWrapperClassName?: string;\n mapClassName?: string;\n panelClassName?: string;\n panelPosition?: PanelPosition;\n stadiaApiKey?: string;\n mapStyle?: string;\n styleUrl?: string;\n mapLibreCssHref?: string;\n markers?: GeoMapMarker[];\n clusters?: GeoMapCluster[];\n viewState?: Partial<MapViewState>;\n defaultViewState?: Partial<MapViewState>;\n onViewStateChange?: (state: Partial<MapViewState>) => void;\n onMapClick?: (coord: MapCoordinate) => void;\n onMarkerDrag?: (\n markerId: string | number | null,\n coord: MapCoordinate,\n ) => void;\n showNavigationControl?: boolean;\n showGeolocateControl?: boolean;\n navigationControlPosition?: MapControlPosition;\n geolocateControlPosition?: MapControlPosition;\n flyToOptions?: MapLibreFlyToOptions;\n markerFocusZoom?: number;\n clusterFocusZoom?: number;\n selectedMarkerId?: string | number;\n initialSelectedMarkerId?: string | number;\n onSelectionChange?: (selection: GeoMapSelection) => void;\n clearSelectionOnMapClick?: boolean;\n mapChildren?: React.ReactNode;\n optixFlowConfig?: any;\n // Map size configuration\n mapSize?: { desktop: number; mobile: number };\n // Optional component overrides for external dependencies\n IconComponent?: IconComponent;\n ImgComponent?: ImgComponent;\n}\n\ntype NormalizedMarker = Omit<GeoMapMarker, \"id\"> & {\n id: string;\n clusterId?: string;\n};\n\ntype NormalizedCluster = Omit<\n GeoMapCluster,\n \"id\" | \"markers\" | \"latitude\" | \"longitude\"\n> & {\n id: string;\n latitude: number;\n longitude: number;\n markers: NormalizedMarker[];\n};\n\nconst PANEL_POSITION_CLASS: Record<PanelPosition, string> = {\n \"top-left\": \"left-4 top-4\",\n \"top-right\": \"right-4 top-4\",\n \"bottom-left\": \"bottom-4 left-4\",\n \"bottom-right\": \"bottom-4 right-4\",\n};\n\nconst DEFAULT_VIEW_STATE: MapViewState = {\n latitude: 39.5,\n longitude: -98.35,\n zoom: 3,\n};\n\nconst VIDEO_FILE_EXTENSION_REGEX = /\\.(mp4|webm|ogg|mov|m4v|m3u8)(\\?.*)?$/i;\n\nfunction resolveMediaType(item: GeoMapMediaItem): GeoMapMediaType {\n if (item.type) {\n return item.type;\n }\n\n return VIDEO_FILE_EXTENSION_REGEX.test(item.src) ? \"video\" : \"image\";\n}\n\nfunction normalizeId(\n value: string | number | undefined,\n fallback: string,\n): string {\n if (value === null || value === undefined || value === \"\") {\n return fallback;\n }\n\n return String(value);\n}\n\nfunction buildClusterCenter(markers: GeoMapMarker[]): MapCoordinate | null {\n if (!markers.length) {\n return null;\n }\n\n const total = markers.reduce(\n (accumulator, marker) => ({\n latitude: accumulator.latitude + marker.latitude,\n longitude: accumulator.longitude + marker.longitude,\n }),\n { latitude: 0, longitude: 0 },\n );\n\n return {\n latitude: total.latitude / markers.length,\n longitude: total.longitude / markers.length,\n };\n}\n\nfunction resolveActionKey(action: ActionConfig, index: number): string {\n if (typeof action.label === \"string\" && action.label.trim().length > 0) {\n return `label:${action.label}:${index}`;\n }\n\n if (action.href) {\n return `href:${action.href}:${index}`;\n }\n\n return `action:${index}`;\n}\n\n// Simple fallback icon component\nconst FallbackIcon: React.FC<{\n name: string;\n size?: number;\n className?: string;\n}> = ({ size = 20, className }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n </svg>\n);\n\n// Simple fallback image component\nconst FallbackImg: React.FC<{\n src: string;\n alt?: string;\n className?: string;\n loading?: \"lazy\" | \"eager\";\n}> = ({ src, alt, className, loading }) => (\n <img src={src} alt={alt} className={className} loading={loading} />\n);\n\nfunction MarkerActions({ actions }: { actions?: ActionConfig[] }) {\n if (!actions || actions.length === 0) {\n return null;\n }\n\n return (\n <div className=\"mt-4 flex flex-wrap gap-2\">\n {actions.map((action, index) => {\n const {\n label,\n icon,\n iconAfter,\n children,\n href,\n onClick,\n className: actionClassName,\n variant,\n size,\n asButton,\n ...rest\n } = action;\n\n // Simple button styles\n const buttonStyles = cn(\n \"inline-flex items-center gap-2 px-4 py-2 rounded-md font-medium transition-colors\",\n variant === \"outline\"\n ? \"border border-border bg-background hover:bg-muted\"\n : \"bg-primary text-primary-foreground hover:bg-primary/90\",\n size === \"sm\" && \"text-sm px-3 py-1.5\",\n size === \"icon\" && \"p-2\",\n actionClassName,\n );\n\n return (\n <SimplePressable\n key={resolveActionKey(action, index)}\n href={href}\n onClick={onClick}\n className={buttonStyles}\n {...rest}\n >\n {children ?? (\n <>\n {icon}\n {label}\n {iconAfter}\n </>\n )}\n </SimplePressable>\n );\n })}\n </div>\n );\n}\n\nfunction MarkerMediaCarousel({\n mediaItems,\n optixFlowConfig,\n IconComponent = FallbackIcon,\n ImgComponent = FallbackImg,\n}: {\n mediaItems: GeoMapMediaItem[];\n optixFlowConfig?: any;\n IconComponent?: IconComponent;\n ImgComponent?: ImgComponent;\n}) {\n const [activeIndex, setActiveIndex] = React.useState(0);\n const totalItems = mediaItems.length;\n const mediaResetKey = React.useMemo(\n () =>\n mediaItems\n .map((item, index) => {\n const itemId = normalizeId(item.id, `media-${index}`);\n return `${itemId}:${item.src}:${item.type ?? \"\"}:${item.poster ?? \"\"}`;\n })\n .join(\"|\"),\n [mediaItems],\n );\n const activeItemIndex = Math.min(activeIndex, Math.max(0, totalItems - 1));\n\n React.useEffect(() => {\n setActiveIndex(0);\n }, [mediaResetKey]);\n\n return (\n <div className=\"relative border-b border-border/60 bg-muted/40\">\n <div className=\"relative aspect-video w-full overflow-hidden\">\n {mediaItems.map((item, index) => {\n const isActive = index === activeItemIndex;\n const mediaType = resolveMediaType(item);\n\n return (\n <div\n key={normalizeId(item.id, `media-slide-${index}`)}\n aria-hidden={!isActive}\n className={cn(\n \"absolute inset-0 transition-opacity duration-500 ease-in-out\",\n isActive\n ? \"opacity-100 z-1\"\n : \"opacity-0 z-0 pointer-events-none\",\n )}\n >\n {mediaType === \"video\" ? (\n <video\n className=\"h-full w-full object-cover\"\n controls={isActive}\n preload=\"metadata\"\n poster={item.poster}\n tabIndex={isActive ? 0 : -1}\n >\n <source src={item.src} />\n </video>\n ) : (\n <ImgComponent\n src={item.src}\n alt={item.alt ?? \"Map marker media\"}\n className=\"h-full w-full object-cover\"\n loading=\"eager\"\n optixFlowConfig={optixFlowConfig}\n />\n )}\n </div>\n );\n })}\n </div>\n\n {totalItems > 1 ? (\n <>\n <button\n type=\"button\"\n aria-label=\"Show previous media\"\n className=\"absolute left-4 top-1/2 inline-flex size-10 -translate-y-1/2 items-center justify-center rounded-2xl bg-card text-card-foreground shadow-lg border-4 border-black hover:border-white hover:bg-black hover:text-white transition-all duration-500 z-2\"\n onClick={() => {\n setActiveIndex(\n (current) => (current - 1 + totalItems) % totalItems,\n );\n }}\n >\n <IconComponent name=\"lucide/arrow-left\" size={18} />\n </button>\n <button\n type=\"button\"\n aria-label=\"Show next media\"\n className=\"absolute right-4 top-1/2 inline-flex size-10 -translate-y-1/2 items-center justify-center rounded-2xl bg-card text-card-foreground shadow-lg border-4 border-black hover:border-white hover:bg-black hover:text-white transition-all duration-500 z-2\"\n onClick={() => {\n setActiveIndex((current) => (current + 1) % totalItems);\n }}\n >\n <IconComponent name=\"lucide/arrow-right\" size={18} />\n </button>\n\n <div className=\"absolute bottom-2 left-1/2 flex -translate-x-1/2 items-center gap-1.5 z-[2]\">\n {mediaItems.map((item, index) => (\n <button\n key={normalizeId(item.id, `media-dot-${index}`)}\n type=\"button\"\n aria-label={`Show media item ${index + 1}`}\n className={cn(\n \"h-2 rounded-full transition-all duration-300\",\n index === activeItemIndex\n ? \"w-6 bg-card\"\n : \"w-2 bg-card opacity-50 hover:opacity-100\",\n )}\n onClick={() => setActiveIndex(index)}\n />\n ))}\n </div>\n </>\n ) : null}\n </div>\n );\n}\n\nfunction getMarkerTitle(\n marker: NormalizedMarker,\n markerIndex: number,\n): React.ReactNode {\n if (marker.title !== undefined && marker.title !== null) {\n return marker.title;\n }\n\n if (marker.label !== undefined && marker.label !== null) {\n return marker.label;\n }\n\n return `Location ${markerIndex + 1}`;\n}\n\n/**\n * GeoMap - Feature-rich map component with markers, clusters, and rich media panels.\n *\n * Provides clustering, marker selection, media carousels, and customizable UI panels.\n * Built on top of MapLibre GL for high-performance rendering.\n *\n * @example\n * ```tsx\n * <GeoMap\n * stadiaApiKey=\"your-api-key\"\n * markers={[\n * {\n * id: 'loc-1',\n * latitude: 40.7128,\n * longitude: -74.0060,\n * title: 'New York Office',\n * summary: 'Our flagship location',\n * mediaItems: [{ src: '/office.jpg', alt: 'Office' }],\n * }\n * ]}\n * defaultViewState={{ latitude: 40.7128, longitude: -74.0060, zoom: 12 }}\n * />\n * ```\n */\nexport function GeoMap({\n className,\n mapWrapperClassName,\n mapClassName,\n panelClassName,\n panelPosition = \"top-left\",\n stadiaApiKey = \"\",\n mapStyle = \"osm-bright\",\n styleUrl,\n mapLibreCssHref,\n markers = [],\n clusters = [],\n viewState,\n defaultViewState,\n onViewStateChange,\n onMapClick,\n onMarkerDrag,\n showNavigationControl = true,\n showGeolocateControl = false,\n navigationControlPosition = \"top-right\",\n geolocateControlPosition = \"top-left\",\n flyToOptions,\n markerFocusZoom = 14,\n clusterFocusZoom = 5,\n selectedMarkerId,\n initialSelectedMarkerId,\n onSelectionChange,\n clearSelectionOnMapClick = true,\n mapChildren,\n optixFlowConfig,\n mapSize,\n IconComponent = FallbackIcon,\n ImgComponent = FallbackImg,\n}: GeoMapProps): React.JSX.Element {\n // Track container dimensions for proper zoom calculations\n const containerRef = React.useRef<HTMLDivElement>(null);\n const [containerDimensions, setContainerDimensions] = React.useState({\n width: 800, // Default width\n height: 520, // Default height\n });\n\n // Detect mobile screen size\n const [isMobile, setIsMobile] = React.useState(false);\n\n React.useEffect(() => {\n const checkMobile = () => {\n setIsMobile(window.innerWidth < 768); // md breakpoint\n };\n\n checkMobile();\n window.addEventListener('resize', checkMobile);\n return () => window.removeEventListener('resize', checkMobile);\n }, []);\n\n // Calculate height based on mapSize prop or defaults\n const calculatedHeight = React.useMemo(() => {\n if (mapSize) {\n return isMobile ? mapSize.mobile : mapSize.desktop;\n }\n // Default heights\n return isMobile ? 420 : 520;\n }, [mapSize, isMobile]);\n\n // Track container dimensions\n React.useEffect(() => {\n if (!containerRef.current) return;\n\n const updateDimensions = () => {\n if (containerRef.current) {\n const rect = containerRef.current.getBoundingClientRect();\n setContainerDimensions({\n width: rect.width || 800,\n height: rect.height || calculatedHeight,\n });\n }\n };\n\n updateDimensions();\n\n // Check for ResizeObserver availability (for test environments)\n if (typeof ResizeObserver !== \"undefined\") {\n const resizeObserver = new ResizeObserver(updateDimensions);\n resizeObserver.observe(containerRef.current);\n return () => resizeObserver.disconnect();\n }\n }, [calculatedHeight]);\n\n const normalizedStandaloneMarkers = React.useMemo<NormalizedMarker[]>(\n () =>\n markers.map((marker, index) => ({\n ...marker,\n id: normalizeId(marker.id, `marker-${index}`),\n })),\n [markers],\n );\n\n const normalizedClusters = React.useMemo<NormalizedCluster[]>(() => {\n const results: NormalizedCluster[] = [];\n\n clusters.forEach((cluster, clusterIndex) => {\n const clusterId = normalizeId(cluster.id, `cluster-${clusterIndex}`);\n const normalizedClusterMarkers: NormalizedMarker[] = cluster.markers.map(\n (marker, markerIndex) => ({\n ...marker,\n id: normalizeId(marker.id, `${clusterId}-marker-${markerIndex}`),\n clusterId,\n }),\n );\n\n const clusterCenter =\n cluster.latitude !== undefined && cluster.longitude !== undefined\n ? { latitude: cluster.latitude, longitude: cluster.longitude }\n : buildClusterCenter(normalizedClusterMarkers);\n\n if (!clusterCenter) {\n return;\n }\n\n results.push({\n ...cluster,\n id: clusterId,\n latitude: clusterCenter.latitude,\n longitude: clusterCenter.longitude,\n markers: normalizedClusterMarkers,\n });\n });\n\n return results;\n }, [clusters]);\n\n const markerLookup = React.useMemo(() => {\n const lookup = new Map<string, NormalizedMarker>();\n\n normalizedStandaloneMarkers.forEach((marker) => {\n lookup.set(marker.id, marker);\n });\n\n normalizedClusters.forEach((cluster) => {\n cluster.markers.forEach((marker) => {\n lookup.set(marker.id, marker);\n });\n });\n\n return lookup;\n }, [normalizedClusters, normalizedStandaloneMarkers]);\n\n const clusterLookup = React.useMemo(() => {\n const lookup = new Map<string, NormalizedCluster>();\n normalizedClusters.forEach((cluster) => {\n lookup.set(cluster.id, cluster);\n });\n return lookup;\n }, [normalizedClusters]);\n\n // FIX: Calculate proper initial center from all markers/clusters\n const firstCoordinate = React.useMemo(() => {\n const allCoords: MapCoordinate[] = [];\n\n // Collect all marker coordinates\n normalizedStandaloneMarkers.forEach((marker) => {\n allCoords.push({\n latitude: marker.latitude,\n longitude: marker.longitude,\n });\n });\n\n // Collect all cluster coordinates\n normalizedClusters.forEach((cluster) => {\n allCoords.push({\n latitude: cluster.latitude,\n longitude: cluster.longitude,\n });\n });\n\n // If we have coordinates, calculate the center\n if (allCoords.length > 0) {\n const sum = allCoords.reduce(\n (acc, coord) => ({\n latitude: acc.latitude + coord.latitude,\n longitude: acc.longitude + coord.longitude,\n }),\n { latitude: 0, longitude: 0 },\n );\n\n return {\n latitude: sum.latitude / allCoords.length,\n longitude: sum.longitude / allCoords.length,\n };\n }\n\n return {\n latitude: DEFAULT_VIEW_STATE.latitude,\n longitude: DEFAULT_VIEW_STATE.longitude,\n };\n }, [normalizedClusters, normalizedStandaloneMarkers]);\n\n // Prepare coordinates for zoom calculation\n const zoomCoordinates = React.useMemo(() => {\n const coords: Array<{ lat: number; lng: number }> = [];\n\n normalizedStandaloneMarkers.forEach((marker) => {\n coords.push({\n lat: marker.latitude,\n lng: marker.longitude,\n });\n });\n\n normalizedClusters.forEach((cluster) => {\n coords.push({\n lat: cluster.latitude,\n lng: cluster.longitude,\n });\n });\n\n return coords;\n }, [normalizedStandaloneMarkers, normalizedClusters]);\n\n // Use proper zoom calculation hook\n const properZoom = useDefaultZoom({\n coordinates: zoomCoordinates,\n mapWidth: containerDimensions.width,\n mapHeight: containerDimensions.height,\n padding: 80, // Increased padding for better framing\n maxZoom: 18,\n minZoom: 1,\n });\n\n // Calculate zoom with fallback for special cases\n const calculatedZoom = React.useMemo(() => {\n // Single marker case\n if (zoomCoordinates.length === 1) {\n return markerFocusZoom;\n }\n\n // No markers case\n if (zoomCoordinates.length === 0) {\n return DEFAULT_VIEW_STATE.zoom;\n }\n\n // Use properly calculated zoom, but subtract a bit to ensure all markers are visible\n // The -0.5 adjustment ensures markers aren't too close to edges\n const adjustedZoom = properZoom ? properZoom - 0.5 : DEFAULT_VIEW_STATE.zoom;\n\n // Ensure we don't zoom in too much\n return Math.min(adjustedZoom, 15);\n }, [properZoom, zoomCoordinates.length, markerFocusZoom]);\n\n const [uncontrolledViewState, setUncontrolledViewState] = React.useState<\n Partial<MapViewState>\n >({\n latitude: defaultViewState?.latitude ?? firstCoordinate.latitude,\n longitude: defaultViewState?.longitude ?? firstCoordinate.longitude,\n zoom: defaultViewState?.zoom ?? calculatedZoom,\n });\n\n // FIX: Update view state when markers/clusters change\n React.useEffect(() => {\n if (!viewState && !defaultViewState) {\n setUncontrolledViewState({\n latitude: firstCoordinate.latitude,\n longitude: firstCoordinate.longitude,\n zoom: calculatedZoom,\n });\n }\n }, [firstCoordinate, calculatedZoom, viewState, defaultViewState]);\n\n const isControlledViewState = viewState !== undefined;\n\n const resolvedViewState = isControlledViewState\n ? viewState\n : uncontrolledViewState;\n\n const applyViewState = React.useCallback(\n (nextState: Partial<MapViewState>) => {\n if (!isControlledViewState) {\n setUncontrolledViewState((current) => {\n const next = { ...current, ...nextState };\n const hasChanged =\n current.latitude !== next.latitude ||\n current.longitude !== next.longitude ||\n current.zoom !== next.zoom;\n\n return hasChanged ? next : current;\n });\n }\n\n onViewStateChange?.(nextState);\n },\n [isControlledViewState, onViewStateChange],\n );\n\n const [selection, setSelection] = React.useState<{\n type: \"none\" | \"marker\" | \"cluster\";\n markerId?: string;\n clusterId?: string;\n }>(() => {\n if (\n initialSelectedMarkerId !== undefined &&\n initialSelectedMarkerId !== null\n ) {\n return {\n type: \"marker\",\n markerId: String(initialSelectedMarkerId),\n };\n }\n\n return { type: \"none\" };\n });\n\n React.useEffect(() => {\n if (selectedMarkerId === undefined || selectedMarkerId === null) {\n return;\n }\n\n setSelection({\n type: \"marker\",\n markerId: String(selectedMarkerId),\n });\n }, [selectedMarkerId]);\n\n const selectedMarker = selection.markerId\n ? markerLookup.get(selection.markerId)\n : undefined;\n const selectedCluster = selection.clusterId\n ? clusterLookup.get(selection.clusterId)\n : undefined;\n\n React.useEffect(() => {\n if (selection.type === \"marker\" && selection.markerId && !selectedMarker) {\n setSelection({ type: \"none\" });\n onSelectionChange?.({ type: \"none\" });\n }\n }, [onSelectionChange, selectedMarker, selection]);\n\n const emitSelectionChange = React.useCallback(\n (\n nextSelection:\n | { type: \"none\" }\n | { type: \"marker\"; marker: NormalizedMarker }\n | { type: \"cluster\"; cluster: NormalizedCluster },\n ) => {\n if (nextSelection.type === \"none\") {\n onSelectionChange?.({ type: \"none\" });\n return;\n }\n\n if (nextSelection.type === \"marker\") {\n const parentCluster = nextSelection.marker.clusterId\n ? clusterLookup.get(nextSelection.marker.clusterId)\n : undefined;\n onSelectionChange?.({\n type: \"marker\",\n marker: nextSelection.marker,\n cluster: parentCluster,\n });\n return;\n }\n\n onSelectionChange?.({\n type: \"cluster\",\n cluster: nextSelection.cluster,\n });\n },\n [clusterLookup, onSelectionChange],\n );\n\n const selectMarker = React.useCallback(\n (marker: NormalizedMarker) => {\n setSelection({\n type: \"marker\",\n markerId: marker.id,\n clusterId: marker.clusterId,\n });\n\n applyViewState({\n latitude: marker.latitude,\n longitude: marker.longitude,\n zoom: markerFocusZoom,\n });\n\n emitSelectionChange({ type: \"marker\", marker });\n },\n [applyViewState, emitSelectionChange, markerFocusZoom],\n );\n\n const selectCluster = React.useCallback(\n (cluster: NormalizedCluster) => {\n setSelection({\n type: \"cluster\",\n clusterId: cluster.id,\n });\n\n applyViewState({\n latitude: cluster.latitude,\n longitude: cluster.longitude,\n zoom: clusterFocusZoom,\n });\n\n emitSelectionChange({ type: \"cluster\", cluster });\n },\n [applyViewState, clusterFocusZoom, emitSelectionChange],\n );\n\n const clearSelection = React.useCallback(() => {\n setSelection({ type: \"none\" });\n emitSelectionChange({ type: \"none\" });\n }, [emitSelectionChange]);\n\n const mapMarkers = React.useMemo<BasicMarkerInput[]>(() => {\n const resolvedMarkers: BasicMarkerInput[] = [];\n\n normalizedClusters.forEach((cluster) => {\n const isSelected =\n selection.type === \"cluster\" && selection.clusterId === cluster.id;\n\n resolvedMarkers.push({\n id: `cluster-pin:${cluster.id}`,\n latitude: cluster.latitude,\n longitude: cluster.longitude,\n element: () => {\n const customMarkerElement = cluster.markerElement;\n const markerBody =\n typeof customMarkerElement === \"function\"\n ? customMarkerElement({\n isSelected,\n count: cluster.markers.length,\n })\n : customMarkerElement;\n\n return (\n <button\n type=\"button\"\n className=\"group cursor-pointer\"\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n selectCluster(cluster);\n }}\n aria-label={`View ${cluster.markers.length} clustered locations`}\n >\n {markerBody ?? (\n <span\n className={cn(\n \"inline-flex min-h-10 min-w-10 items-center justify-center rounded-full border-2 border-white px-2 text-xs font-semibold text-white shadow-lg transition-transform duration-200 group-hover:scale-105\",\n isSelected && \"ring-4 ring-primary/30\",\n cluster.pinClassName,\n )}\n style={{\n backgroundColor: cluster.pinColor ?? \"var(--foreground)\",\n }}\n >\n {cluster.markers.length}\n </span>\n )}\n </button>\n );\n },\n });\n });\n\n normalizedStandaloneMarkers.forEach((marker) => {\n const isSelected =\n selection.type === \"marker\" && selection.markerId === marker.id;\n const customMarkerElement = marker.markerElement;\n\n resolvedMarkers.push({\n id: marker.id,\n latitude: marker.latitude,\n longitude: marker.longitude,\n draggable: marker.draggable,\n element: () => {\n const markerBody =\n typeof customMarkerElement === \"function\"\n ? customMarkerElement({ isSelected })\n : customMarkerElement;\n\n return (\n <button\n type=\"button\"\n className=\"group cursor-pointer\"\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n selectMarker(marker);\n }}\n aria-label={\n typeof marker.title === \"string\"\n ? `View ${marker.title}`\n : \"View location details\"\n }\n >\n {markerBody ?? (\n <span\n className={cn(\n \"inline-flex h-4 w-4 rounded-full border-2 border-white shadow-md transition-transform duration-200 group-hover:scale-110\",\n isSelected && \"h-5 w-5 ring-4 ring-primary/30\",\n marker.pinClassName,\n )}\n style={{\n backgroundColor: marker.pinColor ?? \"#f43f5e\",\n }}\n />\n )}\n </button>\n );\n },\n });\n });\n\n return resolvedMarkers;\n }, [\n normalizedClusters,\n normalizedStandaloneMarkers,\n selectCluster,\n selectMarker,\n selection,\n ]);\n\n const renderMarkerPanel = () => {\n if (selectedMarker) {\n const markerMediaItems = selectedMarker.mediaItems ?? [];\n\n return (\n <div\n className={cn(\n \"relative w-80 overflow-hidden rounded-xl border border-border bg-card text-card-foreground shadow-2xl\",\n panelClassName,\n )}\n >\n <button\n type=\"button\"\n aria-label=\"Close marker details\"\n className=\"flex size-12 items-center justify-center rounded-bl-lg rounded-br-0 rounded-t-0 bg-black text-white transition-all duration-500 absolute top-0 right-0 z-10 cursor-pointer ring-4 ring-white\"\n onClick={clearSelection}\n >\n <IconComponent name=\"lucide/x\" size={20} />\n </button>\n\n {markerMediaItems.length > 0 ? (\n <MarkerMediaCarousel\n mediaItems={markerMediaItems}\n optixFlowConfig={optixFlowConfig}\n IconComponent={IconComponent}\n ImgComponent={ImgComponent}\n />\n ) : null}\n\n <div className=\"space-y-2 p-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0 space-y-1\">\n {selectedMarker.eyebrow ? (\n <p className=\"text-xs font-semibold uppercase tracking-wide\">\n {selectedMarker.eyebrow}\n </p>\n ) : null}\n <div className=\"text-base font-semibold leading-tight\">\n {selectedMarker.title ?? selectedMarker.label ?? \"Location\"}\n </div>\n </div>\n </div>\n\n {selectedMarker.summary ? (\n <div className=\"text-sm leading-relaxed\">\n {selectedMarker.summary}\n </div>\n ) : null}\n\n {selectedMarker.locationLine ? (\n <div className=\"flex flex-row items-center justify-start text-sm gap-2\">\n <IconComponent\n name=\"lucide:map-pin\"\n className=\"opacity-50\"\n size={18}\n />\n {typeof selectedMarker.locationLine === \"string\" ? (\n <SimplePressable\n href={selectedMarker.locationUrl}\n className={cn(\n \"transition-all duration-500\",\n \"font-medium opacity-75 hover:opacity-100\",\n selectedMarker.locationUrl\n ? \"underline underline-offset-4\"\n : \"\",\n )}\n >\n {selectedMarker.locationLine}\n </SimplePressable>\n ) : (\n selectedMarker.locationLine\n )}\n </div>\n ) : null}\n\n {selectedMarker.hoursLine ? (\n <div className=\"flex flex-row items-center justify-start text-sm gap-2\">\n <IconComponent\n name=\"lucide:clock\"\n className=\"opacity-50\"\n size={18}\n />\n {typeof selectedMarker.hoursLine === \"string\" ? (\n <div className=\"font-medium\">{selectedMarker.hoursLine}</div>\n ) : (\n selectedMarker.hoursLine\n )}\n </div>\n ) : null}\n\n {selectedMarker.markerContentComponent ? (\n <div className=\"relative\">\n {selectedMarker.markerContentComponent}\n </div>\n ) : null}\n\n <MarkerActions actions={selectedMarker.actions} />\n </div>\n </div>\n );\n }\n\n if (selectedCluster) {\n return (\n <div\n className={cn(\n \"relative w-80 overflow-hidden rounded-xl border border-border bg-card text-card-foreground p-4 shadow-2xl\",\n panelClassName,\n )}\n >\n <button\n type=\"button\"\n aria-label=\"Close cluster details\"\n className=\"flex size-8 items-center justify-center rounded-full border border-border bg-card text-card-foreground transition hover:bg-muted hover:text-foreground absolute top-2 right-2 z-10\"\n onClick={clearSelection}\n >\n <IconComponent name=\"lucide/x\" size={20} />\n </button>\n\n <div className=\"mb-3 flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n {selectedCluster.label ? (\n <p className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {selectedCluster.label}\n </p>\n ) : null}\n <div className=\"text-base font-semibold leading-tight text-foreground\">\n {selectedCluster.title ?? \"Clustered Locations\"}\n </div>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {selectedCluster.summary ??\n `${selectedCluster.markers.length} location${selectedCluster.markers.length === 1 ? \"\" : \"s\"} in this cluster.`}\n </p>\n </div>\n </div>\n\n <div className=\"max-h-56 space-y-2 overflow-y-auto pr-1\">\n {selectedCluster.markers.map((marker, markerIndex) => (\n <button\n key={marker.id}\n type=\"button\"\n className=\"w-full rounded-lg border border-border/60 p-3 text-left transition hover:border-border hover:bg-muted/50\"\n onClick={() => selectMarker(marker)}\n >\n <div className=\"line-clamp-1 text-sm font-semibold text-foreground\">\n {getMarkerTitle(marker, markerIndex)}\n </div>\n {marker.summary ? (\n <div className=\"mt-1 line-clamp-2 text-xs text-muted-foreground\">\n {marker.summary}\n </div>\n ) : null}\n </button>\n ))}\n </div>\n </div>\n );\n }\n\n return null;\n };\n\n return (\n <div\n ref={containerRef}\n className={cn(\n \"relative rounded-2xl border border-border bg-background\",\n // Remove overflow-hidden from outer container to allow panel to overflow\n className,\n )}\n style={{\n // If className includes height settings, they'll override via CSS specificity\n height: className?.includes('h-[') || className?.includes('min-h-[') || className?.includes('max-h-[')\n ? undefined\n : `${calculatedHeight}px`,\n // Explicitly allow overflow for marker panels\n overflow: \"visible\",\n }}\n >\n <div\n className={cn(\n \"w-full rounded-2xl\",\n // Only apply default height class if mapWrapperClassName not provided\n !mapWrapperClassName && `h-[${calculatedHeight}px]`,\n mapWrapperClassName\n )}\n style={{\n // If mapWrapperClassName includes height, let it handle the height\n height: mapWrapperClassName?.includes('h-[') || mapWrapperClassName?.includes('min-h-[') || mapWrapperClassName?.includes('max-h-[')\n ? undefined\n : `${calculatedHeight}px`,\n maxHeight: \"100vh\", // Prevent excessive growth\n position: \"relative\",\n // Keep overflow hidden only on the map wrapper to contain the canvas\n overflow: \"hidden\"\n }}\n >\n <MapLibre\n stadiaApiKey={stadiaApiKey}\n mapStyle={mapStyle}\n styleUrl={styleUrl}\n mapLibreCssHref={mapLibreCssHref}\n viewState={resolvedViewState}\n onViewStateChange={applyViewState}\n markers={mapMarkers}\n onClick={(coord) => {\n onMapClick?.(coord);\n if (clearSelectionOnMapClick) {\n clearSelection();\n }\n }}\n onMarkerDrag={onMarkerDrag}\n showNavigationControl={showNavigationControl}\n showGeolocateControl={showGeolocateControl}\n navigationControlPosition={navigationControlPosition}\n geolocateControlPosition={geolocateControlPosition}\n flyToOptions={flyToOptions}\n className={cn(\"h-full w-full\", mapClassName)}\n style={{\n // Pass the calculated height to MapLibre for better zoom calculations\n height: mapClassName?.includes('h-[') || mapClassName?.includes('min-h-[') || mapClassName?.includes('max-h-[')\n ? undefined\n : `${calculatedHeight}px`\n }}\n >\n {mapChildren}\n </MapLibre>\n </div>\n\n {selection.type !== \"none\" ? (\n <div\n className={cn(\n \"pointer-events-none absolute z-30\",\n PANEL_POSITION_CLASS[panelPosition],\n )}\n style={{\n // Ensure panel can overflow and has higher z-index\n zIndex: 30,\n }}\n >\n <div className=\"pointer-events-auto\">{renderMarkerPanel()}</div>\n </div>\n ) : null}\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/cn.ts","../../src/components/map-marker.tsx","../../src/utils/getMapLibreStyleUrl.ts","../../src/utils/simple-pressable.tsx","../../src/core/MapLibre.tsx","../../src/hooks/useDefaultZoom.ts","../../src/components/geo-map.tsx"],"names":["React","jsx","jsxs","Map"],"mappings":"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","file":"index.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Utility function to merge Tailwind CSS classes with proper conflict resolution.\n * Uses clsx for conditional class names and tailwind-merge for deduplication.\n *\n * @param inputs - Class names to merge\n * @returns Merged class string\n *\n * @example\n * cn(\"px-2 py-1\", \"px-4\") // => \"py-1 px-4\"\n * cn(\"text-red-500\", condition && \"text-blue-500\") // => \"text-blue-500\" (if condition is true)\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import * as React from \"react\";\nimport { cn } from \"../utils/cn\";\n\nexport type MapMarkerSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface MapMarkerProps {\n /** Size variant of the marker */\n size?: MapMarkerSize;\n /** Whether the marker is currently selected/active */\n isSelected?: boolean;\n /** Custom color for the center dot (defaults to neutral-900) */\n dotColor?: string;\n /** Custom color for the inner ring (defaults to neutral-400) */\n innerRingColor?: string;\n /** Custom color for the middle ring (defaults to neutral-300) */\n middleRingColor?: string;\n /** Custom color for the outer ring (defaults to neutral-200) */\n outerRingColor?: string;\n /** Additional class name for the wrapper */\n className?: string;\n /** Click handler for the marker */\n onClick?: (event: React.MouseEvent) => void;\n /** Whether the marker is interactive/clickable */\n interactive?: boolean;\n /** Accessible label for the marker */\n \"aria-label\"?: string;\n}\n\nconst SIZE_CONFIG: Record<\n MapMarkerSize,\n {\n outer: string;\n middle: string;\n inner: string;\n dot: string;\n }\n> = {\n sm: {\n outer: \"size-10\",\n middle: \"size-7\",\n inner: \"size-5\",\n dot: \"size-2\",\n },\n md: {\n outer: \"size-14\",\n middle: \"size-10\",\n inner: \"size-7\",\n dot: \"size-2.5\",\n },\n lg: {\n outer: \"size-20\",\n middle: \"size-14\",\n inner: \"size-10\",\n dot: \"size-3.5\",\n },\n};\n\n/**\n * A reusable map marker component with concentric circle design.\n * Can be used directly with MapLibre markers via the `element` prop.\n *\n * @example\n * // Basic usage\n * <MapMarker />\n *\n * @example\n * // With MapLibre GeoMap\n * const markers = [{\n * id: 'location-1',\n * latitude: 40.7128,\n * longitude: -74.0060,\n * markerElement: ({ isSelected }) => (\n * <MapMarker isSelected={isSelected} size=\"md\" />\n * ),\n * }];\n *\n * @example\n * // Custom colors\n * <MapMarker\n * dotColor=\"#1E40AF\"\n * innerRingColor=\"#3B82F6\"\n * middleRingColor=\"#93C5FD\"\n * outerRingColor=\"#DBEAFE\"\n * />\n */\nexport function MapMarker({\n size = \"md\",\n isSelected = false,\n dotColor,\n innerRingColor,\n middleRingColor,\n outerRingColor,\n className,\n onClick,\n interactive = true,\n \"aria-label\": ariaLabel = \"Map location marker\",\n}: MapMarkerProps) {\n const sizeConfig = SIZE_CONFIG[size];\n\n const content = (\n <div\n className={cn(\n \"relative flex items-center justify-center rounded-full transition-transform duration-200\",\n sizeConfig.outer,\n isSelected && \"scale-110\",\n className\n )}\n style={{ backgroundColor: outerRingColor }}\n >\n {/* Middle ring */}\n <div\n className={cn(\n \"absolute rounded-full transition-all duration-200\",\n sizeConfig.middle\n )}\n style={{ backgroundColor: middleRingColor }}\n />\n\n {/* Inner ring */}\n <div\n className={cn(\n \"absolute rounded-full transition-all duration-200\",\n sizeConfig.inner\n )}\n style={{ backgroundColor: innerRingColor }}\n />\n\n {/* Center dot */}\n <div\n className={cn(\n \"absolute rounded-full transition-all duration-200\",\n sizeConfig.dot\n )}\n style={{ backgroundColor: dotColor }}\n />\n </div>\n );\n\n if (!interactive) {\n return content;\n }\n\n return (\n <button\n type=\"button\"\n className=\"group cursor-pointer focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 rounded-full\"\n onClick={onClick}\n aria-label={ariaLabel}\n >\n <div\n className={cn(\n \"transition-transform duration-200 group-hover:scale-110\",\n isSelected && \"scale-110\"\n )}\n >\n {content}\n </div>\n </button>\n );\n}\n\n/**\n * Pre-configured marker with neutral gray colors matching the reference design.\n */\nexport function NeutralMapMarker(\n props: Omit<\n MapMarkerProps,\n \"dotColor\" | \"innerRingColor\" | \"middleRingColor\" | \"outerRingColor\"\n >\n) {\n return (\n <MapMarker\n {...props}\n dotColor=\"hsl(var(--neutral-900, 0 0% 9%))\"\n innerRingColor=\"hsl(var(--neutral-400, 0 0% 64%))\"\n middleRingColor=\"hsl(var(--neutral-300, 0 0% 78%))\"\n outerRingColor=\"hsl(var(--neutral-200, 0 0% 88%))\"\n />\n );\n}\n\n/**\n * Factory function to create a marker element for use with MapLibre/GeoMap.\n * Returns a function compatible with the `markerElement` prop.\n *\n * @example\n * const markers = [{\n * id: 'location-1',\n * latitude: 40.7128,\n * longitude: -74.0060,\n * markerElement: createMapMarkerElement({ size: 'lg' }),\n * }];\n */\nexport function createMapMarkerElement(\n config?: Omit<MapMarkerProps, \"isSelected\" | \"onClick\">\n) {\n return function MarkerElement({ isSelected }: { isSelected: boolean }) {\n return <MapMarker {...config} isSelected={isSelected} interactive={false} />;\n };\n}\n\nexport default MapMarker;\n","const MAPLIBRE_DEFAULT_STYLE_URL =\n \"https://basemaps.cartocdn.com/gl/positron-gl-style/style.json\";\nconst DEFAULT_STADIA_STYLE_URL =\n \"https://tiles.stadiamaps.com/styles/osm_bright.json\";\n\nconst STYLE_MAP: Record<string, string> = {\n default: DEFAULT_STADIA_STYLE_URL,\n \"alidade-smooth\": \"https://tiles.stadiamaps.com/styles/alidade_smooth.json\",\n \"alidade-smooth-dark\": \"https://tiles.stadiamaps.com/styles/alidade_smooth_dark.json\",\n \"maplibre-default\": MAPLIBRE_DEFAULT_STYLE_URL,\n \"osm-bright\": \"https://tiles.stadiamaps.com/styles/osm_bright.json\",\n \"stadia-outdoors\": \"https://tiles.stadiamaps.com/styles/outdoors.json\",\n \"stamen-toner\": \"https://tiles.stadiamaps.com/styles/stamen_toner.json\",\n \"stamen-terrain\": \"https://tiles.stadiamaps.com/styles/stamen_terrain.json\",\n \"stamen-watercolor\": \"https://tiles.stadiamaps.com/styles/stamen_watercolor.json\"\n};\n\nconst HTTP_URL_REGEX = /^https?:\\/\\//i;\n\nexport type MapLibreBuiltInStyle = keyof typeof STYLE_MAP;\n\nfunction isStadiaMapsUrl(url: string): boolean {\n try {\n const parsed = new URL(url);\n return parsed.hostname === \"tiles.stadiamaps.com\";\n } catch {\n return false;\n }\n}\n\nfunction assertStadiaApiKey(stadiaApiKey: string): void {\n if (!stadiaApiKey.trim()) {\n throw new Error(\n \"A non-empty stadiaApiKey is required for Stadia Maps style URLs.\"\n );\n }\n}\n\nexport function appendStadiaApiKey(\n styleUrl: string,\n stadiaApiKey: string\n): string {\n if (!isStadiaMapsUrl(styleUrl)) {\n return styleUrl;\n }\n\n assertStadiaApiKey(stadiaApiKey);\n\n const parsed = new URL(styleUrl);\n if (!parsed.searchParams.has(\"api_key\")) {\n parsed.searchParams.set(\"api_key\", stadiaApiKey);\n }\n\n return parsed.toString();\n}\n\nexport function getMapLibreStyleUrl(\n value: string | undefined,\n stadiaApiKey: string\n): string {\n const normalizedApiKey = stadiaApiKey.trim();\n\n if (!value || typeof value !== \"string\") {\n if (!normalizedApiKey) {\n return MAPLIBRE_DEFAULT_STYLE_URL;\n }\n return appendStadiaApiKey(DEFAULT_STADIA_STYLE_URL, normalizedApiKey);\n }\n\n if (STYLE_MAP[value]) {\n const mappedStyleUrl = STYLE_MAP[value];\n if (isStadiaMapsUrl(mappedStyleUrl) && !normalizedApiKey) {\n return MAPLIBRE_DEFAULT_STYLE_URL;\n }\n return appendStadiaApiKey(mappedStyleUrl, normalizedApiKey);\n }\n\n if (HTTP_URL_REGEX.test(value)) {\n if (isStadiaMapsUrl(value) && !normalizedApiKey) {\n return MAPLIBRE_DEFAULT_STYLE_URL;\n }\n return appendStadiaApiKey(value, normalizedApiKey);\n }\n\n if (!normalizedApiKey) {\n return MAPLIBRE_DEFAULT_STYLE_URL;\n }\n\n return appendStadiaApiKey(DEFAULT_STADIA_STYLE_URL, normalizedApiKey);\n}\n\nexport { DEFAULT_STADIA_STYLE_URL, MAPLIBRE_DEFAULT_STYLE_URL };\n","/**\n * Simple Pressable component for internal use by map components.\n * This is a lightweight version focused on basic link/button functionality.\n * For full-featured Pressable, use @opensite/ui.\n */\n\nimport * as React from \"react\";\n\nexport interface SimplePressableProps {\n children: React.ReactNode;\n className?: string;\n href?: string;\n onClick?: React.MouseEventHandler<HTMLElement>;\n \"aria-label\"?: string;\n target?: string;\n rel?: string;\n}\n\nexport const SimplePressable = React.forwardRef<\n HTMLAnchorElement | HTMLButtonElement,\n SimplePressableProps\n>(({ children, className, href, onClick, ...props }, ref) => {\n if (href) {\n const isExternal = href.startsWith(\"http://\") || href.startsWith(\"https://\");\n return (\n <a\n ref={ref as React.Ref<HTMLAnchorElement>}\n href={href}\n className={className}\n target={isExternal ? \"_blank\" : props.target}\n rel={isExternal ? \"noopener noreferrer\" : props.rel}\n onClick={onClick}\n {...props}\n >\n {children}\n </a>\n );\n }\n\n if (onClick) {\n return (\n <button\n ref={ref as React.Ref<HTMLButtonElement>}\n type=\"button\"\n className={className}\n onClick={onClick}\n {...props}\n >\n {children}\n </button>\n );\n }\n\n return <span className={className}>{children}</span>;\n});\n\nSimplePressable.displayName = \"SimplePressable\";\n","import React from \"react\";\nimport {\n GeolocateControl,\n Map,\n Marker,\n NavigationControl,\n type MapRef,\n type ViewStateChangeEvent\n} from \"react-map-gl/maplibre\";\n\nimport type {\n BasicMarkerInput,\n MapLibreFlyToOptions,\n MapLibreMarker,\n MapLibreProps,\n MapViewState\n} from \"../types\";\nimport { appendStadiaApiKey, getMapLibreStyleUrl } from \"../utils\";\n\nconst DEFAULT_MAPLIBRE_CSS_HREF =\n \"https://cdn.jsdelivr.net/npm/maplibre-gl@5.18.0/dist/maplibre-gl.css\";\nconst MAPLIBRE_STYLESHEET_ID = \"page-speed-maplibre-gl-css\";\nconst DEFAULT_FLY_TO_OPTIONS: Readonly<MapLibreFlyToOptions> = Object.freeze({});\nconst VIEW_STATE_COORDINATE_EPSILON = 0.000001;\nconst VIEW_STATE_ZOOM_EPSILON = 0.01;\nconst DEFAULT_FLY_TO_EASING = (t: number): number => 1 - Math.pow(1 - t, 3);\n\nfunction joinClassNames(...classNames: Array<string | undefined>): string {\n return classNames.filter(Boolean).join(\" \");\n}\n\nfunction hasMeaningfulViewStateDelta(\n previous: MapViewState,\n next: MapViewState\n): boolean {\n return (\n Math.abs(previous.latitude - next.latitude) > VIEW_STATE_COORDINATE_EPSILON ||\n Math.abs(previous.longitude - next.longitude) > VIEW_STATE_COORDINATE_EPSILON ||\n Math.abs(previous.zoom - next.zoom) > VIEW_STATE_ZOOM_EPSILON\n );\n}\n\nfunction ensureMapLibreStylesheet(href: string): void {\n if (typeof document === \"undefined\") {\n return;\n }\n\n const existingLink = document.getElementById(MAPLIBRE_STYLESHEET_ID);\n if (existingLink instanceof HTMLLinkElement) {\n if (existingLink.getAttribute(\"href\") !== href) {\n existingLink.setAttribute(\"href\", href);\n }\n return;\n }\n\n const matchingLink = Array.from(\n document.querySelectorAll(\"link[rel='stylesheet']\")\n ).find((link) => link.getAttribute(\"href\") === href);\n\n if (matchingLink instanceof HTMLLinkElement) {\n matchingLink.id = MAPLIBRE_STYLESHEET_ID;\n return;\n }\n\n const stylesheet = document.createElement(\"link\");\n stylesheet.id = MAPLIBRE_STYLESHEET_ID;\n stylesheet.rel = \"stylesheet\";\n stylesheet.href = href;\n stylesheet.dataset.pageSpeedMaps = \"maplibre-css\";\n document.head.appendChild(stylesheet);\n}\n\nfunction DefaultMarker({ marker }: { marker: MapLibreMarker }) {\n return (\n <div\n style={{\n cursor: marker.draggable ? \"grab\" : \"pointer\",\n transform: \"translate(-50%, -100%)\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n position: \"relative\"\n }}\n onClick={marker.onClick}\n >\n <svg\n aria-hidden=\"true\"\n width=\"32\"\n height=\"32\"\n viewBox=\"0 0 24 24\"\n fill={marker.color || \"#3B82F6\"}\n style={{ filter: \"drop-shadow(0 2px 8px rgba(0,0,0,0.35))\" }}\n >\n <path d=\"M12 2C8.13 2 5 5.13 5 9c0 4.85 6.13 12.24 6.39 12.55a.75.75 0 0 0 1.16 0C12.87 21.24 19 13.85 19 9c0-3.87-3.13-7-7-7Zm0 9.75A2.75 2.75 0 1 1 12 6.25a2.75 2.75 0 0 1 0 5.5Z\" />\n </svg>\n {marker.label ? (\n <div\n style={{\n position: \"absolute\",\n bottom: -28,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n background: \"#FFFFFF\",\n borderRadius: 6,\n padding: \"2px 8px\",\n fontSize: 12,\n fontWeight: 500,\n whiteSpace: \"nowrap\",\n boxShadow: \"0 3px 10px rgba(0, 0, 0, 0.2)\"\n }}\n >\n {marker.label}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction normalizeMarkers(\n markers: (MapLibreMarker | BasicMarkerInput)[]\n): MapLibreMarker[] {\n return markers.map((marker, index) => {\n if (\n (marker as MapLibreMarker).lat !== undefined &&\n (marker as MapLibreMarker).lng !== undefined\n ) {\n return marker as MapLibreMarker;\n }\n\n const basicMarker = marker as BasicMarkerInput;\n return {\n id: basicMarker.id ?? index,\n lat: basicMarker.latitude,\n lng: basicMarker.longitude,\n color: basicMarker.color,\n draggable: basicMarker.draggable,\n label: basicMarker.label,\n element: basicMarker.element,\n onClick: basicMarker.onClick\n };\n });\n}\n\nexport function MapLibre({\n stadiaApiKey,\n mapLibreCssHref,\n viewState,\n onViewStateChange,\n mapStyle,\n center = viewState\n ? { lat: viewState.latitude ?? 0, lng: viewState.longitude ?? 0 }\n : { lat: 0, lng: 0 },\n zoom = viewState?.zoom ?? 14,\n styleUrl,\n markers = [],\n onMoveEnd,\n onClick,\n onMarkerDrag,\n className,\n style,\n children,\n showNavigationControl = true,\n showGeolocateControl = false,\n navigationControlPosition = \"bottom-right\",\n geolocateControlPosition = \"top-left\",\n flyToOptions = DEFAULT_FLY_TO_OPTIONS\n}: MapLibreProps) {\n const mapRef = React.useRef<MapRef>(null);\n const resolvedMapLibreCssHref =\n mapLibreCssHref && mapLibreCssHref.trim().length > 0\n ? mapLibreCssHref\n : DEFAULT_MAPLIBRE_CSS_HREF;\n\n const [internalViewState, setInternalViewState] = React.useState<MapViewState>({\n latitude: viewState?.latitude ?? center.lat,\n longitude: viewState?.longitude ?? center.lng,\n zoom: viewState?.zoom ?? zoom\n });\n\n const isUserInteracting = React.useRef(false);\n const isMarkerDragging = React.useRef(false);\n const dragAnimationFrame = React.useRef<number | null>(null);\n const lastReportedViewState = React.useRef<MapViewState | null>(null);\n\n const resolvedFlyToOptions = React.useMemo(\n () => ({\n speed: flyToOptions.speed ?? 0.8,\n curve: flyToOptions.curve ?? 1.2,\n bearing: flyToOptions.bearing ?? 0,\n easing: flyToOptions.easing ?? DEFAULT_FLY_TO_EASING\n }),\n [\n flyToOptions.bearing,\n flyToOptions.curve,\n flyToOptions.easing,\n flyToOptions.speed\n ]\n );\n\n React.useEffect(() => {\n ensureMapLibreStylesheet(resolvedMapLibreCssHref);\n }, [resolvedMapLibreCssHref]);\n\n React.useEffect(() => {\n if (\n !mapRef.current ||\n !viewState ||\n isUserInteracting.current ||\n isMarkerDragging.current\n ) {\n return;\n }\n\n setInternalViewState((previous) => {\n const next = {\n latitude: viewState.latitude ?? previous.latitude,\n longitude: viewState.longitude ?? previous.longitude,\n zoom: viewState.zoom ?? previous.zoom\n };\n\n const hasChanged = hasMeaningfulViewStateDelta(previous, next);\n\n if (!hasChanged) {\n return previous;\n }\n\n const isEchoedMoveState =\n !!lastReportedViewState.current &&\n !hasMeaningfulViewStateDelta(lastReportedViewState.current, next);\n\n if (!isEchoedMoveState) {\n mapRef.current?.flyTo({\n center: [next.longitude, next.latitude],\n zoom: next.zoom,\n speed: resolvedFlyToOptions.speed,\n curve: resolvedFlyToOptions.curve,\n bearing: resolvedFlyToOptions.bearing,\n easing: resolvedFlyToOptions.easing,\n essential: true\n });\n }\n\n return next;\n });\n }, [\n resolvedFlyToOptions,\n viewState?.latitude,\n viewState?.longitude,\n viewState?.zoom\n ]);\n\n const handleMoveStart = React.useCallback(() => {\n isUserInteracting.current = true;\n }, []);\n\n const handleMove = React.useCallback(\n (event: ViewStateChangeEvent) => {\n const nextViewState = event.viewState;\n setInternalViewState({\n latitude: nextViewState.latitude,\n longitude: nextViewState.longitude,\n zoom: nextViewState.zoom\n });\n\n const roundedViewState = {\n latitude: Number(nextViewState.latitude.toFixed(6)),\n longitude: Number(nextViewState.longitude.toFixed(6)),\n zoom: Number(nextViewState.zoom.toFixed(2))\n };\n\n lastReportedViewState.current = roundedViewState;\n onViewStateChange?.(roundedViewState);\n },\n [onViewStateChange]\n );\n\n const handleMoveEnd = React.useCallback(\n (event: ViewStateChangeEvent) => {\n isUserInteracting.current = false;\n\n if (!onMoveEnd) {\n return;\n }\n\n const map = event.target;\n const nextCenter = map.getCenter();\n const nextZoom = map.getZoom();\n const bounds = map.getBounds();\n\n onMoveEnd(\n {\n lat: Number(nextCenter.lat.toFixed(6)),\n lng: Number(nextCenter.lng.toFixed(6))\n },\n Number(nextZoom.toFixed(2)),\n bounds\n );\n },\n [onMoveEnd]\n );\n\n const handleMapClick = React.useCallback(\n (event: { lngLat: { lng: number; lat: number } }) => {\n if (!onClick) {\n return;\n }\n\n onClick({ latitude: event.lngLat.lat, longitude: event.lngLat.lng });\n },\n [onClick]\n );\n\n const normalizedMarkers = React.useMemo(\n () => normalizeMarkers(markers),\n [markers]\n );\n\n const markerElements = React.useMemo(\n () =>\n normalizedMarkers.map((marker) => (\n <Marker\n key={marker.id}\n longitude={marker.lng}\n latitude={marker.lat}\n draggable={marker.draggable}\n onDragStart={() => {\n isMarkerDragging.current = true;\n }}\n onDrag={(event) => {\n if (!mapRef.current) {\n return;\n }\n\n const nextLngLat = (event as { lngLat?: { lng?: number; lat?: number } }).lngLat;\n if (!nextLngLat || nextLngLat.lng === undefined || nextLngLat.lat === undefined) {\n return;\n }\n const draggedLng = nextLngLat.lng;\n const draggedLat = nextLngLat.lat;\n\n if (dragAnimationFrame.current) {\n cancelAnimationFrame(dragAnimationFrame.current);\n }\n\n dragAnimationFrame.current = requestAnimationFrame(() => {\n if (!mapRef.current) {\n return;\n }\n\n const bounds = mapRef.current.getBounds();\n const viewportWidth = bounds.getEast() - bounds.getWest();\n const viewportHeight = bounds.getNorth() - bounds.getSouth();\n\n const edgePadding = 0.1;\n const westThreshold = bounds.getWest() + viewportWidth * edgePadding;\n const eastThreshold = bounds.getEast() - viewportWidth * edgePadding;\n const southThreshold = bounds.getSouth() + viewportHeight * edgePadding;\n const northThreshold = bounds.getNorth() - viewportHeight * edgePadding;\n\n const nearWestEdge = draggedLng < westThreshold;\n const nearEastEdge = draggedLng > eastThreshold;\n const nearSouthEdge = draggedLat < southThreshold;\n const nearNorthEdge = draggedLat > northThreshold;\n\n if (!nearWestEdge && !nearEastEdge && !nearSouthEdge && !nearNorthEdge) {\n return;\n }\n\n let panLng = draggedLng;\n let panLat = draggedLat;\n const offsetAmount = 0.2;\n\n if (nearWestEdge) {\n panLng = draggedLng - viewportWidth * offsetAmount;\n }\n if (nearEastEdge) {\n panLng = draggedLng + viewportWidth * offsetAmount;\n }\n if (nearSouthEdge) {\n panLat = draggedLat - viewportHeight * offsetAmount;\n }\n if (nearNorthEdge) {\n panLat = draggedLat + viewportHeight * offsetAmount;\n }\n\n mapRef.current?.easeTo({\n center: [panLng, panLat],\n duration: 200\n });\n });\n }}\n onDragEnd={(event) => {\n isMarkerDragging.current = false;\n\n if (dragAnimationFrame.current) {\n cancelAnimationFrame(dragAnimationFrame.current);\n dragAnimationFrame.current = null;\n }\n\n if (!onMarkerDrag) {\n return;\n }\n\n const nextLngLat = (event as { lngLat?: { lng?: number; lat?: number } }).lngLat;\n if (!nextLngLat || nextLngLat.lng === undefined || nextLngLat.lat === undefined) {\n return;\n }\n\n onMarkerDrag(marker.id ?? null, {\n latitude: nextLngLat.lat,\n longitude: nextLngLat.lng\n });\n }}\n >\n {marker.element\n ? typeof marker.element === \"function\"\n ? marker.element()\n : marker.element\n : <DefaultMarker marker={marker} />}\n </Marker>\n )),\n [normalizedMarkers, onMarkerDrag]\n );\n\n const resolvedMapStyleUrl = React.useMemo(() => {\n if (styleUrl) {\n return appendStadiaApiKey(styleUrl, stadiaApiKey);\n }\n\n if (mapStyle) {\n return getMapLibreStyleUrl(mapStyle, stadiaApiKey);\n }\n\n return getMapLibreStyleUrl(\"osm-bright\", stadiaApiKey);\n }, [mapStyle, stadiaApiKey, styleUrl]);\n\n const containerRef = React.useRef<HTMLDivElement>(null);\n\n // Fix for MapLibre canvas height growth issue\n React.useEffect(() => {\n if (!mapRef.current || !containerRef.current) return;\n\n // Force the map to respect container bounds\n const enforceContainerHeight = () => {\n const container = containerRef.current;\n const map = mapRef.current;\n\n if (!container || !map) return;\n\n // Get the actual container height\n const rect = container.getBoundingClientRect();\n const maxHeight = Math.min(rect.height, window.innerHeight);\n\n // Ensure the map canvas doesn't exceed container\n const canvas = map.getCanvas();\n if (canvas && canvas.style.height) {\n const canvasHeight = parseInt(canvas.style.height);\n if (canvasHeight > maxHeight || canvasHeight > 2000) {\n // Force resize to container dimensions\n map.resize();\n }\n }\n };\n\n // Check periodically to prevent runaway growth\n const interval = setInterval(enforceContainerHeight, 1000);\n\n // Also check on any resize events if ResizeObserver is available\n let resizeObserver: ResizeObserver | null = null;\n if (typeof ResizeObserver !== \"undefined\") {\n resizeObserver = new ResizeObserver(() => {\n enforceContainerHeight();\n });\n resizeObserver.observe(containerRef.current);\n }\n\n return () => {\n clearInterval(interval);\n if (resizeObserver) {\n resizeObserver.disconnect();\n }\n };\n }, []);\n\n return (\n <div\n ref={containerRef}\n className={joinClassNames(\"relative w-full h-full\", className)}\n style={{\n width: \"100%\",\n height: \"100%\",\n maxHeight: \"100vh\", // Prevent excessive height\n overflow: \"hidden\",\n position: \"relative\",\n ...style\n }}\n >\n <Map\n ref={mapRef}\n {...internalViewState}\n mapStyle={resolvedMapStyleUrl}\n onMoveStart={handleMoveStart}\n onMove={handleMove}\n onMoveEnd={handleMoveEnd}\n onClick={handleMapClick}\n attributionControl={false}\n trackResize\n dragRotate={false}\n touchZoomRotate={false}\n >\n {showGeolocateControl ? (\n <GeolocateControl position={geolocateControlPosition} />\n ) : null}\n\n {showNavigationControl ? (\n <NavigationControl position={navigationControlPosition} />\n ) : null}\n\n {markerElements}\n\n {children}\n </Map>\n </div>\n );\n}\n\nexport const DTMapLibreMap = MapLibre;\n","import { useMemo } from \"react\";\nimport type { GeoCoordinate } from \"./useGeoCenter\";\n\nexport interface DefaultZoomOptions {\n /** Array of coordinates to fit */\n coordinates: GeoCoordinate[];\n /** Map container width in pixels */\n mapWidth: number;\n /** Map container height in pixels */\n mapHeight: number;\n /** Padding in pixels around the bounds (default: 50) */\n padding?: number;\n /** Maximum zoom level to return (default: 18) */\n maxZoom?: number;\n /** Minimum zoom level to return (default: 1) */\n minZoom?: number;\n}\n\nconst TILE_SIZE = 512; // MapLibre GL JS uses 512px tiles\n\n/**\n * Converts latitude to Mercator Y pixel coordinate at zoom 0.\n */\nfunction latToMercatorY(lat: number): number {\n const latRad = (lat * Math.PI) / 180;\n const mercN = Math.log(Math.tan(Math.PI / 4 + latRad / 2));\n return (TILE_SIZE / (2 * Math.PI)) * (Math.PI - mercN);\n}\n\n/**\n * Converts longitude to Mercator X pixel coordinate at zoom 0.\n */\nfunction lngToMercatorX(lng: number): number {\n return (TILE_SIZE / (2 * Math.PI)) * (((lng + 180) / 360) * 2 * Math.PI);\n}\n\n/**\n * Pure function: computes the ideal zoom level to fit all coordinates\n * within the given map dimensions.\n *\n * Returns null if fewer than 1 coordinate is provided.\n * For a single coordinate, returns maxZoom (caller should use markerFocusZoom).\n */\nexport function computeDefaultZoom(options: DefaultZoomOptions): number | null {\n const {\n coordinates,\n mapWidth,\n mapHeight,\n padding = 50,\n maxZoom = 18,\n minZoom = 1,\n } = options;\n\n if (coordinates.length === 0) return null;\n if (coordinates.length === 1) return maxZoom;\n if (mapWidth <= 0 || mapHeight <= 0) return null;\n\n // Compute bounding box\n let minLat = Infinity;\n let maxLat = -Infinity;\n let minLng = Infinity;\n let maxLng = -Infinity;\n\n for (const coord of coordinates) {\n if (coord.lat < minLat) minLat = coord.lat;\n if (coord.lat > maxLat) maxLat = coord.lat;\n if (coord.lng < minLng) minLng = coord.lng;\n if (coord.lng > maxLng) maxLng = coord.lng;\n }\n\n // Compute pixel span at zoom 0\n const pixelXMin = lngToMercatorX(minLng);\n const pixelXMax = lngToMercatorX(maxLng);\n const pixelYMin = latToMercatorY(maxLat); // Note: Y is inverted in Mercator\n const pixelYMax = latToMercatorY(minLat);\n\n const dx = Math.abs(pixelXMax - pixelXMin);\n const dy = Math.abs(pixelYMax - pixelYMin);\n\n // Available viewport after padding\n const availableWidth = mapWidth - padding * 2;\n const availableHeight = mapHeight - padding * 2;\n\n if (availableWidth <= 0 || availableHeight <= 0) return minZoom;\n\n // Compute zoom for each axis: viewport = pixelSpan * 2^zoom\n // So zoom = log2(viewport / pixelSpan)\n let zoom: number;\n\n if (dx === 0 && dy === 0) {\n // All coordinates are identical\n return maxZoom;\n } else if (dx === 0) {\n zoom = Math.log2(availableHeight / dy);\n } else if (dy === 0) {\n zoom = Math.log2(availableWidth / dx);\n } else {\n const zoomX = Math.log2(availableWidth / dx);\n const zoomY = Math.log2(availableHeight / dy);\n zoom = Math.min(zoomX, zoomY); // Use the more restrictive axis\n }\n\n // Clamp to min/max and floor to avoid sub-pixel jitter\n return Math.max(minZoom, Math.min(maxZoom, Math.floor(zoom * 100) / 100));\n}\n\n/**\n * React hook wrapper around computeDefaultZoom.\n */\nexport function useDefaultZoom(options: DefaultZoomOptions): number | null {\n const { coordinates, mapWidth, mapHeight, padding, maxZoom, minZoom } = options;\n\n return useMemo(\n () =>\n computeDefaultZoom({\n coordinates,\n mapWidth,\n mapHeight,\n padding,\n maxZoom,\n minZoom,\n }),\n [coordinates, mapWidth, mapHeight, padding, maxZoom, minZoom]\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { MapLibre } from \"../core\";\nimport type {\n BasicMarkerInput,\n MapControlPosition,\n MapCoordinate,\n MapLibreFlyToOptions,\n MapViewState,\n} from \"../types\";\nimport { useDefaultZoom } from \"../hooks/useDefaultZoom\";\nimport { cn } from \"../utils/cn\";\nimport { SimplePressable } from \"../utils/simple-pressable\";\n\n// Optional peer dependencies - allow consuming apps to provide these\ntype IconComponent = React.ComponentType<{\n name: string;\n size?: number;\n className?: string;\n}>;\ntype ImgComponent = React.ComponentType<{\n src: string;\n alt?: string;\n className?: string;\n loading?: \"lazy\" | \"eager\";\n optixFlowConfig?: any;\n}>;\n\ntype PanelPosition = \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\";\n\nexport type GeoMapMediaType = \"image\" | \"video\";\n\nexport interface GeoMapMediaItem {\n id?: string | number;\n src: string;\n type?: GeoMapMediaType;\n alt?: string;\n poster?: string;\n}\n\nexport interface GeoMapMarker {\n id?: string | number;\n latitude: number;\n longitude: number;\n label?: React.ReactNode;\n eyebrow?: React.ReactNode;\n title?: React.ReactNode;\n summary?: React.ReactNode;\n locationLine?: React.ReactNode;\n locationUrl?: string;\n hoursLine?: React.ReactNode;\n mediaItems?: GeoMapMediaItem[];\n markerContentComponent?: React.ReactNode;\n actions?: ActionConfig[];\n draggable?: boolean;\n pinColor?: string;\n pinClassName?: string;\n markerElement?:\n | React.ReactNode\n | ((args: { isSelected: boolean }) => React.ReactNode);\n}\n\nexport interface GeoMapCluster {\n id?: string | number;\n label?: React.ReactNode;\n title?: React.ReactNode;\n summary?: React.ReactNode;\n latitude?: number;\n longitude?: number;\n markers: GeoMapMarker[];\n pinColor?: string;\n pinClassName?: string;\n markerElement?:\n | React.ReactNode\n | ((args: { isSelected: boolean; count: number }) => React.ReactNode);\n}\n\nexport interface GeoMapSelection {\n type: \"none\" | \"marker\" | \"cluster\";\n marker?: GeoMapMarker;\n cluster?: GeoMapCluster;\n}\n\nexport interface ActionConfig {\n label?: React.ReactNode;\n icon?: React.ReactNode;\n iconAfter?: React.ReactNode;\n children?: React.ReactNode;\n href?: string;\n onClick?: React.MouseEventHandler;\n className?: string;\n variant?: \"default\" | \"outline\" | \"ghost\" | \"link\";\n size?: \"sm\" | \"md\" | \"lg\" | \"icon\";\n asButton?: boolean;\n [key: string]: any;\n}\n\nexport interface GeoMapProps {\n className?: string;\n mapWrapperClassName?: string;\n mapClassName?: string;\n panelClassName?: string;\n panelPosition?: PanelPosition;\n stadiaApiKey?: string;\n mapStyle?: string;\n styleUrl?: string;\n mapLibreCssHref?: string;\n markers?: GeoMapMarker[];\n clusters?: GeoMapCluster[];\n viewState?: Partial<MapViewState>;\n defaultViewState?: Partial<MapViewState>;\n onViewStateChange?: (state: Partial<MapViewState>) => void;\n onMapClick?: (coord: MapCoordinate) => void;\n onMarkerDrag?: (\n markerId: string | number | null,\n coord: MapCoordinate,\n ) => void;\n showNavigationControl?: boolean;\n showGeolocateControl?: boolean;\n navigationControlPosition?: MapControlPosition;\n geolocateControlPosition?: MapControlPosition;\n flyToOptions?: MapLibreFlyToOptions;\n markerFocusZoom?: number;\n clusterFocusZoom?: number;\n selectedMarkerId?: string | number;\n initialSelectedMarkerId?: string | number;\n onSelectionChange?: (selection: GeoMapSelection) => void;\n clearSelectionOnMapClick?: boolean;\n mapChildren?: React.ReactNode;\n optixFlowConfig?: any;\n // Map size configuration\n mapSize?: { desktop: number; mobile: number };\n // Optional component overrides for external dependencies\n IconComponent?: IconComponent;\n ImgComponent?: ImgComponent;\n}\n\ntype NormalizedMarker = Omit<GeoMapMarker, \"id\"> & {\n id: string;\n clusterId?: string;\n};\n\ntype NormalizedCluster = Omit<\n GeoMapCluster,\n \"id\" | \"markers\" | \"latitude\" | \"longitude\"\n> & {\n id: string;\n latitude: number;\n longitude: number;\n markers: NormalizedMarker[];\n};\n\nconst PANEL_POSITION_CLASS: Record<PanelPosition, string> = {\n \"top-left\": \"left-4 top-4\",\n \"top-right\": \"right-4 top-4\",\n \"bottom-left\": \"bottom-4 left-4\",\n \"bottom-right\": \"bottom-4 right-4\",\n};\n\n/**\n * Determines which quadrant a marker is in and returns the opposite panel position\n * to avoid covering the marker with the panel\n */\nfunction getOptimalPanelPosition(\n markerLat: number,\n markerLng: number,\n mapCenter: { latitude: number; longitude: number }\n): PanelPosition {\n const isNorth = markerLat >= mapCenter.latitude;\n const isEast = markerLng >= mapCenter.longitude;\n\n // Place panel in opposite quadrant to the marker\n if (isNorth && isEast) {\n // Marker in top-right → panel in bottom-left\n return \"bottom-left\";\n } else if (isNorth && !isEast) {\n // Marker in top-left → panel in bottom-right\n return \"bottom-right\";\n } else if (!isNorth && isEast) {\n // Marker in bottom-right → panel in top-left\n return \"top-left\";\n } else {\n // Marker in bottom-left → panel in top-right\n return \"top-right\";\n }\n}\n\nconst DEFAULT_VIEW_STATE: MapViewState = {\n latitude: 39.5,\n longitude: -98.35,\n zoom: 3,\n};\n\nconst VIDEO_FILE_EXTENSION_REGEX = /\\.(mp4|webm|ogg|mov|m4v|m3u8)(\\?.*)?$/i;\n\nfunction resolveMediaType(item: GeoMapMediaItem): GeoMapMediaType {\n if (item.type) {\n return item.type;\n }\n\n return VIDEO_FILE_EXTENSION_REGEX.test(item.src) ? \"video\" : \"image\";\n}\n\nfunction normalizeId(\n value: string | number | undefined,\n fallback: string,\n): string {\n if (value === null || value === undefined || value === \"\") {\n return fallback;\n }\n\n return String(value);\n}\n\nfunction buildClusterCenter(markers: GeoMapMarker[]): MapCoordinate | null {\n if (!markers.length) {\n return null;\n }\n\n const total = markers.reduce(\n (accumulator, marker) => ({\n latitude: accumulator.latitude + marker.latitude,\n longitude: accumulator.longitude + marker.longitude,\n }),\n { latitude: 0, longitude: 0 },\n );\n\n return {\n latitude: total.latitude / markers.length,\n longitude: total.longitude / markers.length,\n };\n}\n\nfunction resolveActionKey(action: ActionConfig, index: number): string {\n if (typeof action.label === \"string\" && action.label.trim().length > 0) {\n return `label:${action.label}:${index}`;\n }\n\n if (action.href) {\n return `href:${action.href}:${index}`;\n }\n\n return `action:${index}`;\n}\n\n// Simple fallback icon component\nconst FallbackIcon: React.FC<{\n name: string;\n size?: number;\n className?: string;\n}> = ({ size = 20, className }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n </svg>\n);\n\n// Simple fallback image component\nconst FallbackImg: React.FC<{\n src: string;\n alt?: string;\n className?: string;\n loading?: \"lazy\" | \"eager\";\n}> = ({ src, alt, className, loading }) => (\n <img src={src} alt={alt} className={className} loading={loading} />\n);\n\nfunction MarkerActions({ actions }: { actions?: ActionConfig[] }) {\n if (!actions || actions.length === 0) {\n return null;\n }\n\n return (\n <div className=\"mt-4 flex flex-wrap gap-2\">\n {actions.map((action, index) => {\n const {\n label,\n icon,\n iconAfter,\n children,\n href,\n onClick,\n className: actionClassName,\n variant,\n size,\n asButton,\n ...rest\n } = action;\n\n // Simple button styles\n const buttonStyles = cn(\n \"inline-flex items-center gap-2 px-4 py-2 rounded-md font-medium transition-colors\",\n variant === \"outline\"\n ? \"border border-border bg-background hover:bg-muted\"\n : \"bg-primary text-primary-foreground hover:bg-primary/90\",\n size === \"sm\" && \"text-sm px-3 py-1.5\",\n size === \"icon\" && \"p-2\",\n actionClassName,\n );\n\n return (\n <SimplePressable\n key={resolveActionKey(action, index)}\n href={href}\n onClick={onClick}\n className={buttonStyles}\n {...rest}\n >\n {children ?? (\n <>\n {icon}\n {label}\n {iconAfter}\n </>\n )}\n </SimplePressable>\n );\n })}\n </div>\n );\n}\n\nfunction MarkerMediaCarousel({\n mediaItems,\n optixFlowConfig,\n IconComponent = FallbackIcon,\n ImgComponent = FallbackImg,\n}: {\n mediaItems: GeoMapMediaItem[];\n optixFlowConfig?: any;\n IconComponent?: IconComponent;\n ImgComponent?: ImgComponent;\n}) {\n const [activeIndex, setActiveIndex] = React.useState(0);\n const totalItems = mediaItems.length;\n const mediaResetKey = React.useMemo(\n () =>\n mediaItems\n .map((item, index) => {\n const itemId = normalizeId(item.id, `media-${index}`);\n return `${itemId}:${item.src}:${item.type ?? \"\"}:${item.poster ?? \"\"}`;\n })\n .join(\"|\"),\n [mediaItems],\n );\n const activeItemIndex = Math.min(activeIndex, Math.max(0, totalItems - 1));\n\n React.useEffect(() => {\n setActiveIndex(0);\n }, [mediaResetKey]);\n\n return (\n <div className=\"relative border-b border-border/60 bg-muted/40\">\n <div className=\"relative aspect-video w-full overflow-hidden\">\n {mediaItems.map((item, index) => {\n const isActive = index === activeItemIndex;\n const mediaType = resolveMediaType(item);\n\n return (\n <div\n key={normalizeId(item.id, `media-slide-${index}`)}\n aria-hidden={!isActive}\n className={cn(\n \"absolute inset-0 transition-opacity duration-500 ease-in-out\",\n isActive\n ? \"opacity-100 z-1\"\n : \"opacity-0 z-0 pointer-events-none\",\n )}\n >\n {mediaType === \"video\" ? (\n <video\n className=\"h-full w-full object-cover\"\n controls={isActive}\n preload=\"metadata\"\n poster={item.poster}\n tabIndex={isActive ? 0 : -1}\n >\n <source src={item.src} />\n </video>\n ) : (\n <ImgComponent\n src={item.src}\n alt={item.alt ?? \"Map marker media\"}\n className=\"h-full w-full object-cover\"\n loading=\"eager\"\n optixFlowConfig={optixFlowConfig}\n />\n )}\n </div>\n );\n })}\n </div>\n\n {totalItems > 1 ? (\n <>\n <button\n type=\"button\"\n aria-label=\"Show previous media\"\n className=\"absolute left-4 top-1/2 inline-flex size-10 -translate-y-1/2 items-center justify-center rounded-2xl bg-card text-card-foreground shadow-lg border-4 border-black hover:border-white hover:bg-black hover:text-white transition-all duration-500 z-2\"\n onClick={() => {\n setActiveIndex(\n (current) => (current - 1 + totalItems) % totalItems,\n );\n }}\n >\n <IconComponent name=\"lucide/arrow-left\" size={18} />\n </button>\n <button\n type=\"button\"\n aria-label=\"Show next media\"\n className=\"absolute right-4 top-1/2 inline-flex size-10 -translate-y-1/2 items-center justify-center rounded-2xl bg-card text-card-foreground shadow-lg border-4 border-black hover:border-white hover:bg-black hover:text-white transition-all duration-500 z-2\"\n onClick={() => {\n setActiveIndex((current) => (current + 1) % totalItems);\n }}\n >\n <IconComponent name=\"lucide/arrow-right\" size={18} />\n </button>\n\n <div className=\"absolute bottom-2 left-1/2 flex -translate-x-1/2 items-center gap-1.5 z-[2]\">\n {mediaItems.map((item, index) => (\n <button\n key={normalizeId(item.id, `media-dot-${index}`)}\n type=\"button\"\n aria-label={`Show media item ${index + 1}`}\n className={cn(\n \"h-2 rounded-full transition-all duration-300\",\n index === activeItemIndex\n ? \"w-6 bg-card\"\n : \"w-2 bg-card opacity-50 hover:opacity-100\",\n )}\n onClick={() => setActiveIndex(index)}\n />\n ))}\n </div>\n </>\n ) : null}\n </div>\n );\n}\n\nfunction getMarkerTitle(\n marker: NormalizedMarker,\n markerIndex: number,\n): React.ReactNode {\n if (marker.title !== undefined && marker.title !== null) {\n return marker.title;\n }\n\n if (marker.label !== undefined && marker.label !== null) {\n return marker.label;\n }\n\n return `Location ${markerIndex + 1}`;\n}\n\n/**\n * GeoMap - Feature-rich map component with markers, clusters, and rich media panels.\n *\n * Provides clustering, marker selection, media carousels, and customizable UI panels.\n * Built on top of MapLibre GL for high-performance rendering.\n *\n * @example\n * ```tsx\n * <GeoMap\n * stadiaApiKey=\"your-api-key\"\n * markers={[\n * {\n * id: 'loc-1',\n * latitude: 40.7128,\n * longitude: -74.0060,\n * title: 'New York Office',\n * summary: 'Our flagship location',\n * mediaItems: [{ src: '/office.jpg', alt: 'Office' }],\n * }\n * ]}\n * defaultViewState={{ latitude: 40.7128, longitude: -74.0060, zoom: 12 }}\n * />\n * ```\n */\nexport function GeoMap({\n className,\n mapWrapperClassName,\n mapClassName,\n panelClassName,\n panelPosition = \"top-left\",\n stadiaApiKey = \"\",\n mapStyle = \"osm-bright\",\n styleUrl,\n mapLibreCssHref,\n markers = [],\n clusters = [],\n viewState,\n defaultViewState,\n onViewStateChange,\n onMapClick,\n onMarkerDrag,\n showNavigationControl = true,\n showGeolocateControl = false,\n navigationControlPosition = \"top-right\",\n geolocateControlPosition = \"top-left\",\n flyToOptions,\n markerFocusZoom = 14,\n clusterFocusZoom = 5,\n selectedMarkerId,\n initialSelectedMarkerId,\n onSelectionChange,\n clearSelectionOnMapClick = true,\n mapChildren,\n optixFlowConfig,\n mapSize,\n IconComponent = FallbackIcon,\n ImgComponent = FallbackImg,\n}: GeoMapProps): React.JSX.Element {\n // Track container dimensions for proper zoom calculations\n const containerRef = React.useRef<HTMLDivElement>(null);\n const [containerDimensions, setContainerDimensions] = React.useState({\n width: 800, // Default width\n height: 520, // Default height\n });\n\n // Detect mobile screen size\n const [isMobile, setIsMobile] = React.useState(false);\n\n React.useEffect(() => {\n const checkMobile = () => {\n setIsMobile(window.innerWidth < 768); // md breakpoint\n };\n\n checkMobile();\n window.addEventListener('resize', checkMobile);\n return () => window.removeEventListener('resize', checkMobile);\n }, []);\n\n // Calculate height based on mapSize prop or defaults\n const calculatedHeight = React.useMemo(() => {\n if (mapSize) {\n return isMobile ? mapSize.mobile : mapSize.desktop;\n }\n // Default heights\n return isMobile ? 420 : 520;\n }, [mapSize, isMobile]);\n\n // Track container dimensions\n React.useEffect(() => {\n if (!containerRef.current) return;\n\n const updateDimensions = () => {\n if (containerRef.current) {\n const rect = containerRef.current.getBoundingClientRect();\n setContainerDimensions((prev) => {\n // Only update if dimensions actually changed to avoid infinite loops\n const newWidth = rect.width || 800;\n const newHeight = rect.height || calculatedHeight;\n\n if (prev.width === newWidth && prev.height === newHeight) {\n return prev;\n }\n\n return {\n width: newWidth,\n height: newHeight,\n };\n });\n }\n };\n\n // Initial measurement\n updateDimensions();\n\n // Check for ResizeObserver availability (for test environments)\n if (typeof ResizeObserver !== \"undefined\") {\n const resizeObserver = new ResizeObserver(updateDimensions);\n resizeObserver.observe(containerRef.current);\n return () => resizeObserver.disconnect();\n }\n }, [calculatedHeight]);\n\n const normalizedStandaloneMarkers = React.useMemo<NormalizedMarker[]>(\n () =>\n markers.map((marker, index) => ({\n ...marker,\n id: normalizeId(marker.id, `marker-${index}`),\n })),\n [markers],\n );\n\n const normalizedClusters = React.useMemo<NormalizedCluster[]>(() => {\n const results: NormalizedCluster[] = [];\n\n clusters.forEach((cluster, clusterIndex) => {\n const clusterId = normalizeId(cluster.id, `cluster-${clusterIndex}`);\n const normalizedClusterMarkers: NormalizedMarker[] = cluster.markers.map(\n (marker, markerIndex) => ({\n ...marker,\n id: normalizeId(marker.id, `${clusterId}-marker-${markerIndex}`),\n clusterId,\n }),\n );\n\n const clusterCenter =\n cluster.latitude !== undefined && cluster.longitude !== undefined\n ? { latitude: cluster.latitude, longitude: cluster.longitude }\n : buildClusterCenter(normalizedClusterMarkers);\n\n if (!clusterCenter) {\n return;\n }\n\n results.push({\n ...cluster,\n id: clusterId,\n latitude: clusterCenter.latitude,\n longitude: clusterCenter.longitude,\n markers: normalizedClusterMarkers,\n });\n });\n\n return results;\n }, [clusters]);\n\n const markerLookup = React.useMemo(() => {\n const lookup = new Map<string, NormalizedMarker>();\n\n normalizedStandaloneMarkers.forEach((marker) => {\n lookup.set(marker.id, marker);\n });\n\n normalizedClusters.forEach((cluster) => {\n cluster.markers.forEach((marker) => {\n lookup.set(marker.id, marker);\n });\n });\n\n return lookup;\n }, [normalizedClusters, normalizedStandaloneMarkers]);\n\n const clusterLookup = React.useMemo(() => {\n const lookup = new Map<string, NormalizedCluster>();\n normalizedClusters.forEach((cluster) => {\n lookup.set(cluster.id, cluster);\n });\n return lookup;\n }, [normalizedClusters]);\n\n // FIX: Calculate proper initial center from all markers/clusters\n const firstCoordinate = React.useMemo(() => {\n const allCoords: MapCoordinate[] = [];\n\n // Collect all marker coordinates\n normalizedStandaloneMarkers.forEach((marker) => {\n allCoords.push({\n latitude: marker.latitude,\n longitude: marker.longitude,\n });\n });\n\n // Collect all cluster coordinates\n normalizedClusters.forEach((cluster) => {\n allCoords.push({\n latitude: cluster.latitude,\n longitude: cluster.longitude,\n });\n });\n\n // If we have coordinates, calculate the center\n if (allCoords.length > 0) {\n const sum = allCoords.reduce(\n (acc, coord) => ({\n latitude: acc.latitude + coord.latitude,\n longitude: acc.longitude + coord.longitude,\n }),\n { latitude: 0, longitude: 0 },\n );\n\n return {\n latitude: sum.latitude / allCoords.length,\n longitude: sum.longitude / allCoords.length,\n };\n }\n\n return {\n latitude: DEFAULT_VIEW_STATE.latitude,\n longitude: DEFAULT_VIEW_STATE.longitude,\n };\n }, [normalizedClusters, normalizedStandaloneMarkers]);\n\n // Prepare coordinates for zoom calculation\n const zoomCoordinates = React.useMemo(() => {\n const coords: Array<{ lat: number; lng: number }> = [];\n\n normalizedStandaloneMarkers.forEach((marker) => {\n coords.push({\n lat: marker.latitude,\n lng: marker.longitude,\n });\n });\n\n normalizedClusters.forEach((cluster) => {\n coords.push({\n lat: cluster.latitude,\n lng: cluster.longitude,\n });\n });\n\n return coords;\n }, [normalizedStandaloneMarkers, normalizedClusters]);\n\n // Use proper zoom calculation hook\n const properZoom = useDefaultZoom({\n coordinates: zoomCoordinates,\n mapWidth: containerDimensions.width,\n mapHeight: containerDimensions.height,\n padding: 80, // Increased padding for better framing\n maxZoom: 18,\n minZoom: 1,\n });\n\n // Calculate zoom with fallback for special cases\n const calculatedZoom = React.useMemo(() => {\n // Single marker case\n if (zoomCoordinates.length === 1) {\n return markerFocusZoom;\n }\n\n // No markers case\n if (zoomCoordinates.length === 0) {\n return DEFAULT_VIEW_STATE.zoom;\n }\n\n // Use properly calculated zoom, but subtract a bit to ensure all markers are visible\n // The -0.5 adjustment ensures markers aren't too close to edges\n const adjustedZoom = properZoom ? properZoom - 0.5 : DEFAULT_VIEW_STATE.zoom;\n\n // Ensure we don't zoom in too much\n return Math.min(adjustedZoom, 15);\n }, [properZoom, zoomCoordinates.length, markerFocusZoom]);\n\n const [uncontrolledViewState, setUncontrolledViewState] = React.useState<\n Partial<MapViewState>\n >({\n latitude: defaultViewState?.latitude ?? firstCoordinate.latitude,\n longitude: defaultViewState?.longitude ?? firstCoordinate.longitude,\n zoom: defaultViewState?.zoom ?? calculatedZoom,\n });\n\n // Track dynamic panel position based on selected marker\n const [dynamicPanelPosition, setDynamicPanelPosition] = React.useState<PanelPosition>(\n panelPosition\n );\n\n // Use ref to track current view state without causing re-renders\n const viewStateRef = React.useRef<Partial<MapViewState>>(uncontrolledViewState);\n\n // FIX: Update view state when markers/clusters change\n React.useEffect(() => {\n if (!viewState && !defaultViewState) {\n setUncontrolledViewState({\n latitude: firstCoordinate.latitude,\n longitude: firstCoordinate.longitude,\n zoom: calculatedZoom,\n });\n }\n }, [firstCoordinate, calculatedZoom, viewState, defaultViewState]);\n\n const isControlledViewState = viewState !== undefined;\n\n const resolvedViewState = isControlledViewState\n ? viewState\n : uncontrolledViewState;\n\n // Update ref when view state changes\n React.useEffect(() => {\n viewStateRef.current = resolvedViewState || uncontrolledViewState;\n }, [resolvedViewState, uncontrolledViewState]);\n\n const applyViewState = React.useCallback(\n (nextState: Partial<MapViewState>) => {\n if (!isControlledViewState) {\n setUncontrolledViewState((current) => {\n const next = { ...current, ...nextState };\n const hasChanged =\n current.latitude !== next.latitude ||\n current.longitude !== next.longitude ||\n current.zoom !== next.zoom;\n\n return hasChanged ? next : current;\n });\n }\n\n onViewStateChange?.(nextState);\n },\n [isControlledViewState, onViewStateChange],\n );\n\n const [selection, setSelection] = React.useState<{\n type: \"none\" | \"marker\" | \"cluster\";\n markerId?: string;\n clusterId?: string;\n }>(() => {\n if (\n initialSelectedMarkerId !== undefined &&\n initialSelectedMarkerId !== null\n ) {\n return {\n type: \"marker\",\n markerId: String(initialSelectedMarkerId),\n };\n }\n\n return { type: \"none\" };\n });\n\n React.useEffect(() => {\n if (selectedMarkerId === undefined || selectedMarkerId === null) {\n return;\n }\n\n setSelection({\n type: \"marker\",\n markerId: String(selectedMarkerId),\n });\n }, [selectedMarkerId]);\n\n const selectedMarker = selection.markerId\n ? markerLookup.get(selection.markerId)\n : undefined;\n const selectedCluster = selection.clusterId\n ? clusterLookup.get(selection.clusterId)\n : undefined;\n\n React.useEffect(() => {\n if (selection.type === \"marker\" && selection.markerId && !selectedMarker) {\n setSelection({ type: \"none\" });\n onSelectionChange?.({ type: \"none\" });\n }\n }, [onSelectionChange, selectedMarker, selection]);\n\n const emitSelectionChange = React.useCallback(\n (\n nextSelection:\n | { type: \"none\" }\n | { type: \"marker\"; marker: NormalizedMarker }\n | { type: \"cluster\"; cluster: NormalizedCluster },\n ) => {\n if (nextSelection.type === \"none\") {\n onSelectionChange?.({ type: \"none\" });\n return;\n }\n\n if (nextSelection.type === \"marker\") {\n const parentCluster = nextSelection.marker.clusterId\n ? clusterLookup.get(nextSelection.marker.clusterId)\n : undefined;\n onSelectionChange?.({\n type: \"marker\",\n marker: nextSelection.marker,\n cluster: parentCluster,\n });\n return;\n }\n\n onSelectionChange?.({\n type: \"cluster\",\n cluster: nextSelection.cluster,\n });\n },\n [clusterLookup, onSelectionChange],\n );\n\n const selectMarker = React.useCallback(\n (marker: NormalizedMarker) => {\n setSelection({\n type: \"marker\",\n markerId: marker.id,\n clusterId: marker.clusterId,\n });\n\n // Calculate optimal panel position based on marker location\n // Use ref to avoid dependency issues\n const currentState = viewStateRef.current;\n const center = {\n latitude: currentState.latitude ?? 0,\n longitude: currentState.longitude ?? 0,\n };\n\n const optimalPosition = getOptimalPanelPosition(\n marker.latitude,\n marker.longitude,\n center\n );\n setDynamicPanelPosition(optimalPosition);\n\n applyViewState({\n latitude: marker.latitude,\n longitude: marker.longitude,\n zoom: markerFocusZoom,\n });\n\n emitSelectionChange({ type: \"marker\", marker });\n },\n [applyViewState, emitSelectionChange, markerFocusZoom],\n );\n\n const selectCluster = React.useCallback(\n (cluster: NormalizedCluster) => {\n setSelection({\n type: \"cluster\",\n clusterId: cluster.id,\n });\n\n // Calculate optimal panel position based on cluster location\n // Use ref to avoid dependency issues\n const currentState = viewStateRef.current;\n const center = {\n latitude: currentState.latitude ?? 0,\n longitude: currentState.longitude ?? 0,\n };\n\n const optimalPosition = getOptimalPanelPosition(\n cluster.latitude,\n cluster.longitude,\n center\n );\n setDynamicPanelPosition(optimalPosition);\n\n applyViewState({\n latitude: cluster.latitude,\n longitude: cluster.longitude,\n zoom: clusterFocusZoom,\n });\n\n emitSelectionChange({ type: \"cluster\", cluster });\n },\n [applyViewState, clusterFocusZoom, emitSelectionChange],\n );\n\n const clearSelection = React.useCallback(() => {\n setSelection({ type: \"none\" });\n emitSelectionChange({ type: \"none\" });\n }, [emitSelectionChange]);\n\n const mapMarkers = React.useMemo<BasicMarkerInput[]>(() => {\n const resolvedMarkers: BasicMarkerInput[] = [];\n\n normalizedClusters.forEach((cluster) => {\n const isSelected =\n selection.type === \"cluster\" && selection.clusterId === cluster.id;\n\n resolvedMarkers.push({\n id: `cluster-pin:${cluster.id}`,\n latitude: cluster.latitude,\n longitude: cluster.longitude,\n element: () => {\n const customMarkerElement = cluster.markerElement;\n const markerBody =\n typeof customMarkerElement === \"function\"\n ? customMarkerElement({\n isSelected,\n count: cluster.markers.length,\n })\n : customMarkerElement;\n\n return (\n <button\n type=\"button\"\n className=\"group cursor-pointer\"\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n selectCluster(cluster);\n }}\n aria-label={`View ${cluster.markers.length} clustered locations`}\n >\n {markerBody ?? (\n <span\n className={cn(\n \"inline-flex min-h-10 min-w-10 items-center justify-center rounded-full border-2 border-white px-2 text-xs font-semibold text-white shadow-lg transition-transform duration-200 group-hover:scale-105\",\n isSelected && \"ring-4 ring-primary/30\",\n cluster.pinClassName,\n )}\n style={{\n backgroundColor: cluster.pinColor ?? \"var(--foreground)\",\n }}\n >\n {cluster.markers.length}\n </span>\n )}\n </button>\n );\n },\n });\n });\n\n normalizedStandaloneMarkers.forEach((marker) => {\n const isSelected =\n selection.type === \"marker\" && selection.markerId === marker.id;\n const customMarkerElement = marker.markerElement;\n\n resolvedMarkers.push({\n id: marker.id,\n latitude: marker.latitude,\n longitude: marker.longitude,\n draggable: marker.draggable,\n element: () => {\n const markerBody =\n typeof customMarkerElement === \"function\"\n ? customMarkerElement({ isSelected })\n : customMarkerElement;\n\n return (\n <button\n type=\"button\"\n className=\"group cursor-pointer\"\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n selectMarker(marker);\n }}\n aria-label={\n typeof marker.title === \"string\"\n ? `View ${marker.title}`\n : \"View location details\"\n }\n >\n {markerBody ?? (\n <span\n className={cn(\n \"inline-flex h-4 w-4 rounded-full border-2 border-white shadow-md transition-transform duration-200 group-hover:scale-110\",\n isSelected && \"h-5 w-5 ring-4 ring-primary/30\",\n marker.pinClassName,\n )}\n style={{\n backgroundColor: marker.pinColor ?? \"#f43f5e\",\n }}\n />\n )}\n </button>\n );\n },\n });\n });\n\n return resolvedMarkers;\n }, [\n normalizedClusters,\n normalizedStandaloneMarkers,\n selectCluster,\n selectMarker,\n selection,\n ]);\n\n const renderMarkerPanel = () => {\n if (selectedMarker) {\n const markerMediaItems = selectedMarker.mediaItems ?? [];\n\n return (\n <div\n className={cn(\n \"relative w-80 overflow-hidden rounded-xl border border-border bg-card text-card-foreground shadow-2xl\",\n panelClassName,\n )}\n >\n <button\n type=\"button\"\n aria-label=\"Close marker details\"\n className=\"flex size-12 items-center justify-center rounded-bl-lg rounded-br-0 rounded-t-0 bg-black text-white transition-all duration-500 absolute top-0 right-0 z-10 cursor-pointer ring-4 ring-white\"\n onClick={clearSelection}\n >\n <IconComponent name=\"lucide/x\" size={20} />\n </button>\n\n {markerMediaItems.length > 0 ? (\n <MarkerMediaCarousel\n mediaItems={markerMediaItems}\n optixFlowConfig={optixFlowConfig}\n IconComponent={IconComponent}\n ImgComponent={ImgComponent}\n />\n ) : null}\n\n <div className=\"space-y-2 p-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0 space-y-1\">\n {selectedMarker.eyebrow ? (\n <p className=\"text-xs font-semibold uppercase tracking-wide\">\n {selectedMarker.eyebrow}\n </p>\n ) : null}\n <div className=\"text-base font-semibold leading-tight\">\n {selectedMarker.title ?? selectedMarker.label ?? \"Location\"}\n </div>\n </div>\n </div>\n\n {selectedMarker.summary ? (\n <div className=\"text-sm leading-relaxed\">\n {selectedMarker.summary}\n </div>\n ) : null}\n\n {selectedMarker.locationLine ? (\n <div className=\"flex flex-row items-center justify-start text-sm gap-2\">\n <IconComponent\n name=\"lucide:map-pin\"\n className=\"opacity-50\"\n size={18}\n />\n {typeof selectedMarker.locationLine === \"string\" ? (\n <SimplePressable\n href={selectedMarker.locationUrl}\n className={cn(\n \"transition-all duration-500\",\n \"font-medium opacity-75 hover:opacity-100\",\n selectedMarker.locationUrl\n ? \"underline underline-offset-4\"\n : \"\",\n )}\n >\n {selectedMarker.locationLine}\n </SimplePressable>\n ) : (\n selectedMarker.locationLine\n )}\n </div>\n ) : null}\n\n {selectedMarker.hoursLine ? (\n <div className=\"flex flex-row items-center justify-start text-sm gap-2\">\n <IconComponent\n name=\"lucide:clock\"\n className=\"opacity-50\"\n size={18}\n />\n {typeof selectedMarker.hoursLine === \"string\" ? (\n <div className=\"font-medium\">{selectedMarker.hoursLine}</div>\n ) : (\n selectedMarker.hoursLine\n )}\n </div>\n ) : null}\n\n {selectedMarker.markerContentComponent ? (\n <div className=\"relative\">\n {selectedMarker.markerContentComponent}\n </div>\n ) : null}\n\n <MarkerActions actions={selectedMarker.actions} />\n </div>\n </div>\n );\n }\n\n if (selectedCluster) {\n return (\n <div\n className={cn(\n \"relative w-80 overflow-hidden rounded-xl border border-border bg-card text-card-foreground p-4 shadow-2xl\",\n panelClassName,\n )}\n >\n <button\n type=\"button\"\n aria-label=\"Close cluster details\"\n className=\"flex size-8 items-center justify-center rounded-full border border-border bg-card text-card-foreground transition hover:bg-muted hover:text-foreground absolute top-2 right-2 z-10\"\n onClick={clearSelection}\n >\n <IconComponent name=\"lucide/x\" size={20} />\n </button>\n\n <div className=\"mb-3 flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n {selectedCluster.label ? (\n <p className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n {selectedCluster.label}\n </p>\n ) : null}\n <div className=\"text-base font-semibold leading-tight text-foreground\">\n {selectedCluster.title ?? \"Clustered Locations\"}\n </div>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {selectedCluster.summary ??\n `${selectedCluster.markers.length} location${selectedCluster.markers.length === 1 ? \"\" : \"s\"} in this cluster.`}\n </p>\n </div>\n </div>\n\n <div className=\"max-h-56 space-y-2 overflow-y-auto pr-1\">\n {selectedCluster.markers.map((marker, markerIndex) => (\n <button\n key={marker.id}\n type=\"button\"\n className=\"w-full rounded-lg border border-border/60 p-3 text-left transition hover:border-border hover:bg-muted/50\"\n onClick={() => selectMarker(marker)}\n >\n <div className=\"line-clamp-1 text-sm font-semibold text-foreground\">\n {getMarkerTitle(marker, markerIndex)}\n </div>\n {marker.summary ? (\n <div className=\"mt-1 line-clamp-2 text-xs text-muted-foreground\">\n {marker.summary}\n </div>\n ) : null}\n </button>\n ))}\n </div>\n </div>\n );\n }\n\n return null;\n };\n\n return (\n <div\n ref={containerRef}\n className={cn(\n \"relative rounded-2xl border border-border bg-background\",\n // Remove overflow-hidden from outer container to allow panel to overflow\n className,\n )}\n style={{\n // If className includes height settings, they'll override via CSS specificity\n height: className?.includes('h-[') || className?.includes('min-h-[') || className?.includes('max-h-[')\n ? undefined\n : `${calculatedHeight}px`,\n // Explicitly allow overflow for marker panels\n overflow: \"visible\",\n }}\n >\n <div\n className={cn(\n \"w-full rounded-2xl\",\n // Only apply default height class if mapWrapperClassName not provided\n !mapWrapperClassName && `h-[${calculatedHeight}px]`,\n mapWrapperClassName\n )}\n style={{\n // If mapWrapperClassName includes height, let it handle the height\n height: mapWrapperClassName?.includes('h-[') || mapWrapperClassName?.includes('min-h-[') || mapWrapperClassName?.includes('max-h-[')\n ? undefined\n : `${calculatedHeight}px`,\n maxHeight: \"100vh\", // Prevent excessive growth\n position: \"relative\",\n // Keep overflow hidden only on the map wrapper to contain the canvas\n overflow: \"hidden\"\n }}\n >\n <MapLibre\n stadiaApiKey={stadiaApiKey}\n mapStyle={mapStyle}\n styleUrl={styleUrl}\n mapLibreCssHref={mapLibreCssHref}\n viewState={resolvedViewState}\n onViewStateChange={applyViewState}\n markers={mapMarkers}\n onClick={(coord) => {\n onMapClick?.(coord);\n if (clearSelectionOnMapClick) {\n clearSelection();\n }\n }}\n onMarkerDrag={onMarkerDrag}\n showNavigationControl={showNavigationControl}\n showGeolocateControl={showGeolocateControl}\n navigationControlPosition={navigationControlPosition}\n geolocateControlPosition={geolocateControlPosition}\n flyToOptions={flyToOptions}\n className={cn(\"h-full w-full\", mapClassName)}\n style={{\n // Pass the calculated height to MapLibre for better zoom calculations\n height: mapClassName?.includes('h-[') || mapClassName?.includes('min-h-[') || mapClassName?.includes('max-h-[')\n ? undefined\n : `${calculatedHeight}px`\n }}\n >\n {mapChildren}\n </MapLibre>\n </div>\n\n {selection.type !== \"none\" ? (\n <div\n className={cn(\n \"pointer-events-none absolute z-30\",\n PANEL_POSITION_CLASS[dynamicPanelPosition],\n )}\n style={{\n // Ensure panel can overflow and has higher z-index\n zIndex: 30,\n }}\n >\n <div className=\"pointer-events-auto\">{renderMarkerPanel()}</div>\n </div>\n ) : null}\n </div>\n );\n}\n"]}
|