@cloudparse/up-miniapps-sdk 0.2.6 → 0.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/lib/utils.ts","../src/components/ui/button.tsx","../src/bridge.ts","../src/components/ui/sheet.tsx","../src/components/Map/components/MapDrawer.tsx","../src/components/ui/card.tsx","../src/components/Map/components/MapEtaPanel.tsx","../src/components/Map/components/MapRightControls.tsx","../src/components/Map/MapContext.tsx","../src/components/Map/components/MapControls.tsx","../src/components/Map/components/MapMenu.tsx","../src/types/types.ts","../src/components/Map/hooks/useUserLocation.ts","../src/components/Map/hooks/useLiveRouting.ts","../src/components/Map/hooks/useTrimmedRoute.ts","../src/components/Map/layers/RouteLayer.tsx","../src/components/Map/Map.tsx","../src/components/Map/layers/POILayers.tsx","../src/components/Map/layers/POIMarkers.tsx","../src/components/Map/layers/UserLocationLayer.tsx","../src/components/MapWrapper.tsx","../src/services/routingService.ts","../package.json","../src/sdk.ts","../src/components/BridgeMocker.tsx","../src/components/DebugConsole.tsx","../src/components/SDKProvider.tsx","../src/host/routingHandler.ts"],"sourcesContent":["export * from \"@miniapps-sdk/components\";\nexport * from \"@miniapps-sdk/host\";\nexport { MiniAppSDK, sdk } from \"@miniapps-sdk/sdk\";\nexport * from \"@miniapps-sdk/types\";\n\nimport { sdk } from \"@miniapps-sdk/sdk\";\n\nexport default sdk;\n","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { cn } from \"@miniapps-sdk/lib/utils\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n defaultVariants: {\n size: \"default\",\n variant: \"default\",\n },\n variants: {\n size: {\n default: \"h-10 px-4 py-2\",\n icon: \"h-10 w-10\",\n lg: \"h-11 rounded-md px-8\",\n sm: \"h-9 rounded-md px-3\",\n },\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n outline:\n \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n },\n },\n },\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n return (\n <Comp\n className={cn(buttonVariants({ className, size, variant }))}\n ref={ref}\n {...props}\n />\n );\n },\n);\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };\n","import type { IBridgeEnvelope } from \"@miniapps-sdk/types\";\n\n/**\n * The Bridge handles low-level communication between the Mini-App WebView\n * and the Native Host Shell (iOS/Android).\n *\n * It manages asynchronous request-response cycles via callbacks and\n * supports subscription to pushed events from the native environment.\n */\nexport class Bridge {\n private callbacks = new Map<\n string,\n {\n resolve: (val: unknown) => void;\n reject: (err: unknown) => void;\n timeout: ReturnType<typeof setTimeout>;\n }\n >();\n private eventListeners = new Map<string, ((data: any) => void)[]>();\n\n /**\n * Registers a global listener for messages coming from the native shell.\n * Also listens for standard browser `message` events to support multiple\n * communication channels (e.g., React Native WebView postMessage).\n */\n constructor() {\n if (typeof window !== \"undefined\") {\n const bridgeReceiver = Object.freeze({\n onNativeMessage: (envelope: IBridgeEnvelope) =>\n this.handleNativeMessage(envelope),\n });\n\n // Use defineProperty to bind the receiver, allowing reconfiguration for HMR environments\n if (typeof (window as any).__MiniAppBridge === \"undefined\") {\n Object.defineProperty(window, \"__MiniAppBridge\", {\n configurable: true, // MUST be true for React StrictMode / HMR unmount/remount cycles\n value: bridgeReceiver,\n writable: false,\n });\n }\n\n window.addEventListener(\"message\", (event) => {\n // SECURITY: Filter events. If inside a mobile shell, the origin of native postMessage\n // varies by platform (e.g., file://, or specific app schemes).\n // For production, this should be restricted to the expected host origin.\n if (!event.data) return;\n\n try {\n const data =\n typeof event.data === \"string\"\n ? JSON.parse(event.data)\n : event.data;\n\n // SECURITY: Basic envelope validation\n if (\n data &&\n typeof data === \"object\" &&\n (data.callbackId || data.event || data.eventName)\n ) {\n this.handleNativeMessage(data);\n }\n } catch (_e) {\n // Ignore non-JSON or malformed messages\n }\n });\n }\n }\n\n /**\n * Subscribes to a pushed event from the native shell.\n *\n * @param event The event name to listen for.\n * @param callback Function to execute when the event occurs.\n * @returns An unsubscription function.\n */\n public on<T = unknown>(event: string, callback: (data: T) => void) {\n let listeners = this.eventListeners.get(event);\n if (!listeners) {\n listeners = [];\n this.eventListeners.set(event, listeners);\n }\n listeners.push(callback);\n return () => this.off(event, callback);\n }\n\n /**\n * Unsubscribes a specific callback from an event.\n *\n * @param event The event name.\n * @param callback The callback function to remove.\n */\n public off<T = unknown>(event: string, callback: (data: T) => void) {\n const listeners = this.eventListeners.get(event);\n if (!listeners) return;\n this.eventListeners.set(\n event,\n listeners.filter((cb) => cb !== callback),\n );\n }\n\n /**\n * Sends a message to the native shell and waits for a response.\n *\n * @template T The expected response type.\n * @param type The action type (e.g., \"GET_LOCATION\").\n * @param payload Data associated with the action.\n * @param timeoutMs Time in milliseconds to wait for a response before rejecting.\n * @returns A promise that resolves with the native response.\n */\n public send<T = unknown>(\n type: string,\n payload?: unknown,\n timeoutMs = 30000,\n ): Promise<T> {\n if (!this.isNative()) {\n return this.handleMockMessage(type, payload);\n }\n\n return new Promise((resolve, reject) => {\n const callbackId = `${type}_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n\n const timeout = setTimeout(() => {\n if (this.callbacks.has(callbackId)) {\n this.callbacks.delete(callbackId);\n reject(new Error(`Bridge request timeout: ${type}`));\n }\n }, timeoutMs);\n\n this.callbacks.set(callbackId, {\n reject,\n resolve: resolve as (val: unknown) => void,\n timeout,\n });\n\n const message = {\n callbackId,\n payload,\n type,\n };\n\n const win = window as unknown as {\n ReactNativeWebView?: { postMessage: (msg: string) => void };\n };\n\n if (win.ReactNativeWebView?.postMessage) {\n win.ReactNativeWebView.postMessage(JSON.stringify(message));\n } else {\n clearTimeout(timeout);\n this.callbacks.delete(callbackId);\n reject(new Error(\"Bridge not available\"));\n }\n });\n }\n\n /**\n * Internal handler for all incoming messages from the native shell.\n * Matches incoming payloads to either pending callbacks or event listeners.\n *\n * @internal\n * @param envelope The message envelope received from native code.\n */\n public handleNativeMessage(envelope: IBridgeEnvelope) {\n if (!envelope || typeof envelope !== \"object\") return;\n\n // 1. Handle Response Callbacks\n const callbackId = envelope.callbackId;\n if (callbackId && typeof callbackId === \"string\") {\n const callback = this.callbacks.get(callbackId);\n if (callback) {\n clearTimeout(callback.timeout);\n const { resolve, reject } = callback;\n\n if (envelope.success === false || envelope.error) {\n reject(envelope.error || \"Unknown error\");\n } else {\n resolve(envelope.value ?? envelope.payload ?? envelope);\n }\n\n this.callbacks.delete(callbackId);\n return;\n }\n }\n\n // 2. Handle Pushed Events\n const eventName = envelope.eventName || envelope.event;\n if (eventName) {\n // If using the new protocol with type=\"EVENT\", ensure we only process if type matches\n if (envelope.type === \"EVENT\" || !envelope.type || envelope.event) {\n const listeners = this.eventListeners.get(eventName);\n if (listeners) {\n for (const listener of listeners) {\n try {\n listener(envelope.payload || envelope.value);\n } catch (e) {\n console.error(`Error in event listener for ${eventName}:`, e);\n }\n }\n }\n }\n }\n }\n\n /**\n * Internal handler for mock message processing, overrideable in test environments\n */\n protected handleMockMessage(type: string, payload: unknown): Promise<any> {\n console.warn(`[Bridge] Mock mode active: Unhandled message type ${type}`);\n return Promise.resolve();\n }\n\n /**\n * Determine environment. Check flag or cache result.\n */\n private isNative(): boolean {\n if (typeof window === \"undefined\") return false;\n return (\n (window as any).__UP_REACT_NATIVE_APP__ === true ||\n !!(window as any).ReactNativeWebView\n );\n }\n}\n","import { cn } from \"@miniapps-sdk/lib/utils\";\nimport * as SheetPrimitive from \"@radix-ui/react-dialog\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { X } from \"lucide-react\";\nimport * as React from \"react\";\n\nconst Sheet = SheetPrimitive.Root;\n\nconst SheetTrigger = SheetPrimitive.Trigger;\n\nconst SheetClose = SheetPrimitive.Close;\n\nconst SheetPortal = SheetPrimitive.Portal;\n\nconst SheetOverlay = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Overlay\n className={cn(\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className,\n )}\n {...props}\n ref={ref}\n />\n));\nSheetOverlay.displayName = SheetPrimitive.Overlay.displayName;\n\nconst sheetVariants = cva(\n \"z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500\",\n {\n defaultVariants: {\n side: \"right\",\n },\n variants: {\n side: {\n bottom:\n \"inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom\",\n left: \"inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm\",\n right:\n \"inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm\",\n top: \"inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top\",\n },\n },\n },\n);\n\ninterface SheetContentProps\n extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>,\n VariantProps<typeof sheetVariants> {\n portal?: boolean;\n}\n\nconst SheetContent = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Content>,\n SheetContentProps\n>(({ side = \"right\", className, children, portal = true, ...props }, ref) => {\n const Content = (\n <SheetPrimitive.Content\n className={cn(\n sheetVariants({ side }),\n portal ? \"fixed\" : \"absolute\",\n className,\n )}\n ref={ref}\n {...props}\n >\n {children}\n <SheetPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-105 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n </SheetPrimitive.Content>\n );\n\n if (!portal) {\n return Content;\n }\n\n return (\n <SheetPortal>\n <SheetOverlay />\n {Content}\n </SheetPortal>\n );\n});\nSheetContent.displayName = SheetPrimitive.Content.displayName;\n\nconst SheetHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-2 text-center sm:text-left\",\n className,\n )}\n {...props}\n />\n);\nSheetHeader.displayName = \"SheetHeader\";\n\nconst SheetFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className,\n )}\n {...props}\n />\n);\nSheetFooter.displayName = \"SheetFooter\";\n\nconst SheetTitle = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Title\n className={cn(\"text-lg font-semibold text-foreground\", className)}\n ref={ref}\n {...props}\n />\n));\nSheetTitle.displayName = SheetPrimitive.Title.displayName;\n\nconst SheetDescription = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Description\n className={cn(\"text-sm text-muted-foreground\", className)}\n ref={ref}\n {...props}\n />\n));\nSheetDescription.displayName = SheetPrimitive.Description.displayName;\n\nexport {\n Sheet,\n SheetClose,\n SheetContent,\n SheetDescription,\n SheetFooter,\n SheetHeader,\n SheetOverlay,\n SheetPortal,\n SheetTitle,\n SheetTrigger,\n};\n","import type { EtaData, MenuItem } from \"@miniapps-sdk/components/Map/types\";\nimport { Button } from \"@miniapps-sdk/components/ui/button\";\nimport {\n Sheet,\n SheetContent,\n SheetHeader,\n SheetTitle,\n} from \"@miniapps-sdk/components/ui/sheet\";\nimport type React from \"react\";\nimport {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from \"react\";\n\nconst resolveHeightToPixels = (\n height: string | number,\n containerHeight: number,\n): number => {\n if (typeof height === \"number\") {\n return height;\n }\n if (height.endsWith(\"%\")) {\n return (parseFloat(height) / 100) * containerHeight;\n }\n return parseFloat(height);\n};\n\nexport type DrawerState = \"closed\" | \"peek\" | \"full\";\n\nexport interface MapDrawerProps {\n menuItems: MenuItem[];\n state: DrawerState;\n onChangeState: (state: DrawerState) => void;\n side: \"left\" | \"bottom\";\n etaBarHeight?: number;\n etaData?: EtaData;\n\n // Hoisted drag states\n touchStartY: number | null;\n setTouchStartY: (val: number | null) => void;\n currentTouchY: number | null;\n setCurrentTouchY: (val: number | null) => void;\n isDragging: boolean;\n clampedDragOffset: number;\n\n // Drawer customization\n drawerPeekHeight?: string | number;\n drawerFullHeight?: string | number;\n containerHeight?: number;\n menuContent?: React.ReactNode;\n enableTouchDrag?: boolean;\n\n // Scroll to top button customization\n showScrollToTopButton?: boolean;\n scrollToTopThreshold?: number;\n\n // Safe area support\n safeAreaInsets?: { top: number; bottom: number; left: number; right: number };\n}\n\nexport const MapDrawer = forwardRef<HTMLDivElement, MapDrawerProps>(\n (\n {\n menuItems,\n state,\n onChangeState,\n side,\n etaBarHeight = 0,\n etaData,\n touchStartY,\n setTouchStartY,\n currentTouchY,\n setCurrentTouchY,\n isDragging,\n clampedDragOffset,\n drawerPeekHeight,\n drawerFullHeight,\n containerHeight,\n menuContent,\n enableTouchDrag = false,\n showScrollToTopButton = true,\n scrollToTopThreshold = 300,\n safeAreaInsets = { bottom: 0, left: 0, right: 0, top: 0 },\n },\n ref,\n ) => {\n const scrollContainerRef = useRef<HTMLDivElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n useImperativeHandle(\n ref,\n () => scrollContainerRef.current as HTMLDivElement,\n );\n\n const handleHandleClick = () => {\n if (side === \"left\") {\n onChangeState(state === \"closed\" ? \"full\" : \"closed\");\n } else {\n if (state === \"closed\") {\n onChangeState(\"peek\");\n } else if (state === \"peek\") {\n onChangeState(\"full\");\n } else {\n onChangeState(\"peek\");\n }\n }\n };\n\n const [showScrollTop, setShowScrollTop] = useState(false);\n\n const handleScroll = (e: React.UIEvent<HTMLDivElement>) => {\n const scrollTop = e.currentTarget.scrollTop;\n setShowScrollTop(state !== \"closed\" && scrollTop > scrollToTopThreshold);\n };\n\n useEffect(() => {\n if (state === \"closed\") {\n setShowScrollTop(false);\n } else {\n const scrollTop = scrollContainerRef.current?.scrollTop || 0;\n setShowScrollTop(scrollTop > scrollToTopThreshold);\n }\n }, [state, scrollToTopThreshold]);\n\n const isDraggingSheet = useRef(false);\n const hasDeterminedDirection = useRef(false);\n const isTouchOnContent = useRef(false);\n\n // Sync refs to avoid stale closures in native touch listeners\n const stateRef = useRef(state);\n const touchStartYRef = useRef(touchStartY);\n const currentTouchYRef = useRef(currentTouchY);\n\n useEffect(() => {\n stateRef.current = state;\n }, [state]);\n\n useEffect(() => {\n touchStartYRef.current = touchStartY;\n }, [touchStartY]);\n\n useEffect(() => {\n currentTouchYRef.current = currentTouchY;\n }, [currentTouchY]);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container || side !== \"bottom\" || !enableTouchDrag) return;\n\n const handleNativeTouchStart = (e: TouchEvent) => {\n const clientY = e.targetTouches[0].clientY;\n setTouchStartY(clientY);\n setCurrentTouchY(clientY);\n isDraggingSheet.current = false;\n hasDeterminedDirection.current = false;\n\n const target = e.target as Node;\n isTouchOnContent.current = scrollContainerRef.current\n ? scrollContainerRef.current.contains(target)\n : false;\n };\n\n const handleNativeTouchMove = (e: TouchEvent) => {\n const startY = touchStartYRef.current;\n if (startY === null) return;\n\n const currentY = e.targetTouches[0].clientY;\n const deltaY = startY - currentY; // positive means dragging UP, negative means dragging DOWN\n\n const scrollTop = scrollContainerRef.current\n ? scrollContainerRef.current.scrollTop\n : 0;\n const clientHeight = scrollContainerRef.current\n ? scrollContainerRef.current.clientHeight\n : 0;\n const scrollHeight = scrollContainerRef.current\n ? scrollContainerRef.current.scrollHeight\n : 0;\n const isAtBottom = scrollTop + clientHeight >= scrollHeight - 1;\n const currentState = stateRef.current;\n\n if (!hasDeterminedDirection.current) {\n if (!isTouchOnContent.current) {\n // Dragging the handle always controls the sheet itself\n isDraggingSheet.current = true;\n hasDeterminedDirection.current = true;\n } else if (currentState !== \"full\") {\n // Dragging content in peek/closed state:\n // Can drag UP to full only if already at the bottom\n // Can drag DOWN to close only if already at the top\n if (deltaY > 0 && isAtBottom) {\n isDraggingSheet.current = true;\n hasDeterminedDirection.current = true;\n } else if (deltaY < 0 && scrollTop <= 0) {\n isDraggingSheet.current = true;\n hasDeterminedDirection.current = true;\n } else {\n // Otherwise, let the content scroll\n isDraggingSheet.current = false;\n hasDeterminedDirection.current = true;\n }\n } else {\n // In full state: dragging down at the very top of content drags the sheet down\n if (deltaY < 0 && scrollTop <= 0) {\n isDraggingSheet.current = true;\n hasDeterminedDirection.current = true;\n } else {\n // Dragging up or scroll is not at top: scrolls the container content\n isDraggingSheet.current = false;\n hasDeterminedDirection.current = true;\n }\n }\n } else if (!isDraggingSheet.current && isTouchOnContent.current) {\n // Transition from scroll to sheet dragging mid-gesture when reaching top or bottom limits\n if (deltaY < 0 && scrollTop <= 0) {\n isDraggingSheet.current = true;\n setTouchStartY(currentY);\n return;\n }\n if (deltaY > 0 && isAtBottom && currentState !== \"full\") {\n isDraggingSheet.current = true;\n setTouchStartY(currentY);\n return;\n }\n }\n\n if (isDraggingSheet.current) {\n if (e.cancelable) {\n e.preventDefault();\n }\n\n const parentContainer = container.parentElement;\n if (parentContainer) {\n const containerH =\n containerHeight || parentContainer.getBoundingClientRect().height;\n const fullPx = resolveHeightToPixels(\n drawerFullHeight || \"85%\",\n containerH,\n );\n const peekPx = resolveHeightToPixels(\n drawerPeekHeight || \"15%\",\n containerH,\n );\n const closedPx =\n 32 + (currentState === \"closed\" ? safeAreaInsets.bottom : 0);\n\n const dragOffset = currentY - startY; // negative = up, positive = down\n let localClamped = dragOffset;\n\n if (currentState === \"full\") {\n localClamped = Math.max(\n 0,\n Math.min(fullPx - closedPx, dragOffset),\n );\n } else if (currentState === \"peek\") {\n localClamped = Math.max(\n -(fullPx - peekPx),\n Math.min(peekPx - closedPx, dragOffset),\n );\n } else if (currentState === \"closed\") {\n localClamped = Math.min(\n 0,\n Math.max(-(fullPx - closedPx), dragOffset),\n );\n }\n\n parentContainer.style.setProperty(\n \"--drag-offset\",\n `${localClamped}px`,\n );\n }\n }\n };\n\n const handleNativeTouchEnd = (e: TouchEvent) => {\n const startY = touchStartYRef.current;\n const currentY = currentTouchYRef.current;\n const parentContainer = container.parentElement;\n\n if (startY === null || currentY === null) {\n if (parentContainer) {\n parentContainer.style.setProperty(\"--drag-offset\", \"0px\");\n }\n return;\n }\n\n if (!isDraggingSheet.current) {\n setTouchStartY(null);\n setCurrentTouchY(null);\n if (parentContainer) {\n parentContainer.style.setProperty(\"--drag-offset\", \"0px\");\n }\n return;\n }\n\n const touchEndY = e.changedTouches[0].clientY;\n const dragDistance = Math.abs(touchEndY - startY);\n\n if (dragDistance < 10) {\n setTouchStartY(null);\n setCurrentTouchY(null);\n if (parentContainer) {\n parentContainer.style.setProperty(\"--drag-offset\", \"0px\");\n }\n return;\n }\n\n // Find parent container bounds\n const containerH =\n containerHeight ||\n (parentContainer\n ? parentContainer.getBoundingClientRect().height\n : window.innerHeight);\n const containerTop = parentContainer\n ? parentContainer.getBoundingClientRect().top\n : 0;\n\n const touchYInContainer = touchEndY - containerTop;\n const drawerHeightFromBottom = containerH - touchYInContainer;\n\n const fullPx = resolveHeightToPixels(\n drawerFullHeight || \"85%\",\n containerH,\n );\n const peekPx = resolveHeightToPixels(\n drawerPeekHeight || \"15%\",\n containerH,\n );\n const currentState = stateRef.current;\n const closedPx =\n 32 + (currentState === \"closed\" ? safeAreaInsets.bottom : 0);\n\n const distToFull = Math.abs(drawerHeightFromBottom - fullPx);\n const distToPeek = Math.abs(drawerHeightFromBottom - peekPx);\n const distToClosed = Math.abs(drawerHeightFromBottom - closedPx);\n\n const minDist = Math.min(distToFull, distToPeek, distToClosed);\n\n let targetState: DrawerState = \"closed\";\n if (minDist === distToFull) {\n targetState = \"full\";\n } else if (minDist === distToPeek) {\n targetState = \"peek\";\n } else {\n targetState = \"closed\";\n }\n\n // Re-enable transition properties\n setTouchStartY(null);\n setCurrentTouchY(null);\n onChangeState(targetState);\n\n // Snap from current drag coordinates by delaying cleanup of compositor offset\n requestAnimationFrame(() => {\n if (parentContainer) {\n parentContainer.style.setProperty(\"--drag-offset\", \"0px\");\n }\n });\n };\n\n container.addEventListener(\"touchstart\", handleNativeTouchStart, {\n passive: true,\n });\n container.addEventListener(\"touchmove\", handleNativeTouchMove, {\n passive: false,\n });\n container.addEventListener(\"touchend\", handleNativeTouchEnd, {\n passive: true,\n });\n\n return () => {\n container.removeEventListener(\"touchstart\", handleNativeTouchStart);\n container.removeEventListener(\"touchmove\", handleNativeTouchMove);\n container.removeEventListener(\"touchend\", handleNativeTouchEnd);\n };\n }, [\n side,\n enableTouchDrag,\n containerHeight,\n drawerFullHeight,\n drawerPeekHeight,\n safeAreaInsets,\n onChangeState,\n setTouchStartY,\n setCurrentTouchY,\n ]);\n\n // Backdrop only visible when fully open\n const isBackdropActive = state === \"full\";\n const backdropStyles = isBackdropActive\n ? \"opacity-100 pointer-events-auto\"\n : \"opacity-0 pointer-events-none\";\n\n const containerH = containerHeight || window.innerHeight;\n const fullPx = resolveHeightToPixels(drawerFullHeight || \"85%\", containerH);\n const peekPx = resolveHeightToPixels(drawerPeekHeight || \"15%\", containerH);\n const shiftPx = fullPx - peekPx;\n\n // Calculate bottom drawer transform dynamically to enable smooth hardware-accelerated transitions\n const getBottomDrawerTransform = () => {\n if (state === \"full\") {\n return \"translateY(var(--drag-offset, 0px))\";\n }\n if (state === \"peek\") {\n return `translateY(calc(${shiftPx}px + var(--drag-offset, 0px)))`;\n }\n // Closed state: show only the drag handle bar (32px)\n const closedVisibleHeight = 32;\n const closedShiftPx = fullPx - closedVisibleHeight;\n return `translateY(calc(${closedShiftPx}px + var(--drag-offset, 0px)))`;\n };\n\n return (\n <>\n <style>{`\n .no-scrollbar {\n -ms-overflow-style: none;\n scrollbar-width: none;\n }\n .no-scrollbar::-webkit-scrollbar {\n display: none;\n }\n `}</style>\n\n {/* Backdrop overlay for closing on outside tap */}\n <div\n className={`absolute inset-0 bg-black/45 backdrop-blur-[1px] transition-opacity duration-300 z-30 ${backdropStyles}`}\n onClick={() => onChangeState(\"closed\")}\n />\n\n {side === \"left\" ? (\n <>\n {state === \"closed\" && (\n <Button\n className=\"absolute top-4 left-4 z-40 w-12 h-12 rounded-full bg-zinc-950/80 backdrop-blur-md border border-white/10 shadow-lg flex items-center justify-center text-white active:scale-95 transition-all cursor-pointer hover:bg-zinc-900 hover:text-white p-0!\"\n onClick={() => onChangeState(\"full\")}\n variant=\"ghost\"\n >\n <svg\n fill=\"none\"\n height=\"24\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n width=\"24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <line x1=\"4\" x2=\"20\" y1=\"12\" y2=\"12\" />\n <line x1=\"4\" x2=\"20\" y1=\"6\" y2=\"6\" />\n <line x1=\"4\" x2=\"20\" y1=\"18\" y2=\"18\" />\n </svg>\n </Button>\n )}\n <Sheet\n onOpenChange={(open) => onChangeState(open ? \"full\" : \"closed\")}\n open={state !== \"closed\"}\n >\n <SheetContent\n className=\"w-80 bg-zinc-950/85 backdrop-blur-md border-r border-y border-white/10 rounded-r-2xl shadow-2xl p-4 text-white flex flex-col h-full overflow-hidden\"\n portal={false}\n side=\"left\"\n >\n <SheetHeader className=\"pb-3 border-b border-white/10 mb-2 text-left\">\n <SheetTitle className=\"text-sm font-bold tracking-wider text-zinc-400 uppercase\">\n Menu\n </SheetTitle>\n </SheetHeader>\n\n <div\n className=\"flex-1 overflow-y-auto no-scrollbar pr-2\"\n onScroll={handleScroll}\n ref={scrollContainerRef}\n >\n {menuContent ? (\n menuContent\n ) : (\n <div className=\"flex flex-col gap-1.5\">\n {menuItems.map((item) => (\n <Button\n className={`flex items-center gap-3 w-full py-3 px-3.5 rounded-xl text-left cursor-pointer transition-all duration-150 justify-start hover:bg-white/5 hover:text-white active:bg-white/10 text-white ${\n item.disabled\n ? \"opacity-45 cursor-not-allowed pointer-events-none\"\n : \"\"\n }`}\n disabled={item.disabled}\n key={item.id}\n onClick={() => {\n if (!item.disabled) {\n item.onPress();\n onChangeState(\"closed\");\n }\n }}\n variant=\"ghost\"\n >\n <div className=\"relative flex items-center justify-center w-8 h-8 rounded-lg bg-white/5 text-zinc-300\">\n {item.icon}\n {item.badge !== undefined && (\n <span className=\"absolute -top-1 -right-1 bg-cyan-500 text-black text-[9px] font-extrabold min-w-[15px] h-3.5 rounded-full flex items-center justify-center px-1 border border-zinc-950 shadow\">\n {item.badge}\n </span>\n )}\n </div>\n <span className=\"text-sm font-medium tracking-wide flex-1\">\n {item.label}\n </span>\n </Button>\n ))}\n </div>\n )}\n </div>\n\n {showScrollToTopButton && showScrollTop && (\n <Button\n className=\"absolute bottom-6 right-6 z-50 flex items-center justify-center w-10 h-10 rounded-full bg-cyan-500 hover:bg-cyan-400 active:scale-95 text-black hover:text-black shadow-lg shadow-cyan-500/25 transition-all duration-200 cursor-pointer p-0!\"\n onClick={() => {\n scrollContainerRef.current?.scrollTo({\n behavior: \"smooth\",\n top: 0,\n });\n }}\n variant=\"ghost\"\n >\n <svg\n fill=\"none\"\n height=\"20\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2.5\"\n viewBox=\"0 0 24 24\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <polyline points=\"18 15 12 9 6 15\"></polyline>\n </svg>\n </Button>\n )}\n </SheetContent>\n </Sheet>\n </>\n ) : (\n /* Bottom Sheet Panel - Hardware accelerated translateY transitions */\n <div\n className={`absolute w-full bg-zinc-950/85 backdrop-blur-md border border-white/10 rounded-t-2xl shadow-2xl flex flex-col z-40 select-none ${\n isDragging\n ? \"transition-none\"\n : \"transition-transform duration-300 ease-out\"\n }`}\n ref={containerRef}\n style={{\n bottom: \"0px\",\n height:\n typeof drawerFullHeight === \"number\"\n ? `${drawerFullHeight}px`\n : drawerFullHeight || \"85%\",\n marginBottom:\n state === \"closed\" ? `${safeAreaInsets.bottom}px` : \"0px\",\n transform: getBottomDrawerTransform(),\n transition: isDragging\n ? \"none\"\n : \"transform 300ms ease-out, margin-bottom 250ms ease-in-out\",\n }}\n >\n {/* Bottom Sheet Handle Bar */}\n <div\n className=\"w-full h-8 flex flex-col items-center justify-center cursor-pointer hover:bg-white/5 rounded-t-2xl transition-colors border-b border-white/5\"\n onClick={handleHandleClick}\n >\n <div className=\"w-12 h-1 bg-white/25 rounded-full\" />\n </div>\n\n {/* Content Area */}\n <div\n className=\"flex-1 flex flex-col overflow-hidden px-4 pb-4 pt-2 transition-[margin-top] duration-250 ease-in-out relative\"\n style={{\n marginTop:\n state === \"closed\" ? `${safeAreaInsets.bottom}px` : \"0px\",\n }}\n >\n {/* Menu items scrollable list */}\n <div\n className=\"flex-1 overflow-y-auto no-scrollbar\"\n onScroll={handleScroll}\n ref={scrollContainerRef}\n style={{\n paddingBottom: state === \"peek\" ? `${shiftPx}px` : \"0px\",\n }}\n >\n {menuContent ? (\n menuContent\n ) : (\n <div className=\"flex flex-col gap-1\">\n {menuItems.map((item) => (\n <Button\n className={`flex items-center gap-3 w-full py-3 px-3.5 rounded-xl text-left cursor-pointer transition-all duration-150 justify-start hover:bg-white/5 hover:text-white active:bg-white/10 text-white ${\n item.disabled\n ? \"opacity-45 cursor-not-allowed pointer-events-none\"\n : \"\"\n }`}\n disabled={item.disabled}\n key={item.id}\n onClick={() => {\n if (!item.disabled) {\n item.onPress();\n onChangeState(\"closed\");\n }\n }}\n variant=\"ghost\"\n >\n <div className=\"relative flex items-center justify-center w-8 h-8 rounded-lg bg-white/5 text-zinc-300\">\n {item.icon}\n {item.badge !== undefined && (\n <span className=\"absolute -top-1 -right-1 bg-cyan-500 text-black text-[9px] font-extrabold min-w-[15px] h-3.5 rounded-full flex items-center justify-center px-1 border border-zinc-950 shadow\">\n {item.badge}\n </span>\n )}\n </div>\n <span className=\"text-sm font-medium tracking-wide\">\n {item.label}\n </span>\n </Button>\n ))}\n </div>\n )}\n </div>\n\n {showScrollToTopButton && showScrollTop && (\n <Button\n className=\"absolute right-6 z-50 flex items-center justify-center w-10 h-10 rounded-full bg-cyan-500 hover:bg-cyan-400 active:scale-95 text-black hover:text-black shadow-lg shadow-cyan-500/25 transition-all duration-200 cursor-pointer p-0!\"\n onClick={() => {\n scrollContainerRef.current?.scrollTo({\n behavior: \"smooth\",\n top: 0,\n });\n }}\n style={{\n bottom:\n state === \"peek\"\n ? `calc(${24 + shiftPx}px + var(--drag-offset, 0px))`\n : `calc(24px + var(--drag-offset, 0px))`,\n }}\n variant=\"ghost\"\n >\n <svg\n fill=\"none\"\n height=\"20\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2.5\"\n viewBox=\"0 0 24 24\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <polyline points=\"18 15 12 9 6 15\"></polyline>\n </svg>\n </Button>\n )}\n </div>\n </div>\n )}\n </>\n );\n },\n);\n","import { cn } from \"@miniapps-sdk/lib/utils\";\nimport * as React from \"react\";\n\nconst Card = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n className={cn(\n \"rounded-lg border bg-card text-card-foreground shadow-sm\",\n className,\n )}\n ref={ref}\n {...props}\n />\n));\nCard.displayName = \"Card\";\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n className={cn(\"flex flex-col space-y-1.5 p-6\", className)}\n ref={ref}\n {...props}\n />\n));\nCardHeader.displayName = \"CardHeader\";\n\nconst CardTitle = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n className={cn(\n \"text-2xl font-semibold leading-none tracking-tight\",\n className,\n )}\n ref={ref}\n {...props}\n />\n));\nCardTitle.displayName = \"CardTitle\";\n\nconst CardDescription = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n className={cn(\"text-sm text-muted-foreground\", className)}\n ref={ref}\n {...props}\n />\n));\nCardDescription.displayName = \"CardDescription\";\n\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div className={cn(\"p-6 pt-0\", className)} ref={ref} {...props} />\n));\nCardContent.displayName = \"CardContent\";\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n className={cn(\"flex items-center p-6 pt-0\", className)}\n ref={ref}\n {...props}\n />\n));\nCardFooter.displayName = \"CardFooter\";\n\nexport {\n Card,\n CardContent,\n CardDescription,\n CardFooter,\n CardHeader,\n CardTitle,\n};\n","import type { EtaData } from \"@miniapps-sdk/components/Map/types\";\nimport { Button } from \"@miniapps-sdk/components/ui/button\";\nimport {\n Card,\n CardContent,\n CardHeader,\n} from \"@miniapps-sdk/components/ui/card\";\nimport type React from \"react\";\n\nexport interface MapEtaPanelProps {\n etaData: EtaData;\n layoutMode: \"closed-banner\" | \"open-card\" | \"floating-card\";\n onHeaderClick?: () => void;\n style?: React.CSSProperties;\n isDragging?: boolean;\n}\n\nexport const MapEtaPanel: React.FC<MapEtaPanelProps> = ({\n etaData,\n layoutMode,\n onHeaderClick,\n style,\n isDragging = false,\n}) => {\n if (layoutMode === \"closed-banner\") {\n return (\n <div className=\"w-full h-10 flex items-center justify-between px-4 pb-2 pt-1 border-b border-white/5 bg-zinc-950/15 relative overflow-hidden\">\n <div\n className=\"flex items-center gap-2 cursor-pointer flex-1\"\n onClick={onHeaderClick}\n >\n <span className=\"w-2 h-2 rounded-full bg-emerald-500 animate-pulse\" />\n <span className=\"text-xs font-bold text-emerald-400\">\n {etaData.etaMins} min ({etaData.distanceRemainingKm.toFixed(1)} km)\n </span>\n </div>\n {etaData.onAbort && (\n <Button\n className=\"px-1 py-1 text-[10px] font-black bg-red-500/20 text-red-400 hover:bg-red-500/30 border border-red-500/25 active:scale-95 rounded-md transition-all cursor-pointer pointer-events-auto h-auto p-0!\"\n onClick={(e) => {\n e.stopPropagation();\n etaData.onAbort?.();\n }}\n variant=\"ghost\"\n >\n <svg\n className=\"lucide lucide-x\"\n fill=\"none\"\n height=\"18\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2.5\"\n viewBox=\"0 0 24 24\"\n width=\"18\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M18 6 6 18\"></path>\n <path d=\"m6 6 12 12\"></path>\n </svg>\n </Button>\n )}\n {etaData.progress !== undefined && (\n <div className=\"absolute bottom-0 left-0 right-0 h-[2px] bg-white/5\">\n <div\n className=\"h-full bg-cyan-400\"\n style={{ width: `${etaData.progress}%` }}\n />\n </div>\n )}\n </div>\n );\n }\n\n if (layoutMode === \"open-card\") {\n return (\n <Card className=\"mx-4 mt-2 p-4 bg-white/5 border border-white/10 rounded-xl flex flex-col text-card-foreground\">\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"flex items-center gap-2\">\n <span className=\"w-2 h-2 rounded-full bg-emerald-500 animate-pulse\" />\n <span className=\"text-[10px] font-bold text-emerald-400 uppercase tracking-wider\">\n {etaData.label || \"Journey Active\"}\n </span>\n </div>\n {etaData.onAbort && (\n <Button\n className=\"px-1 py-1 text-xs font-bold bg-red-500/20 text-red-400 hover:bg-red-500/30 border border-red-500/30 active:scale-95 rounded-lg transition-all cursor-pointer pointer-events-auto h-auto p-0!\"\n onClick={etaData.onAbort}\n variant=\"ghost\"\n >\n <svg\n className=\"lucide lucide-x\"\n fill=\"none\"\n height=\"18\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2.5\"\n viewBox=\"0 0 24 24\"\n width=\"18\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M18 6 6 18\"></path>\n <path d=\"m6 6 12 12\"></path>\n </svg>\n </Button>\n )}\n </div>\n\n <CardContent className=\"p-0 flex flex-col\">\n <div className=\"grid grid-cols-2 divide-x divide-white/10 py-1.5 mb-2.5\">\n <div className=\"text-center\">\n <div className=\"text-xl font-black text-white leading-none\">\n {etaData.etaMins}\n <span className=\"text-xs text-zinc-400 font-normal\"> min</span>\n </div>\n <div className=\"text-[8px] text-zinc-500 font-bold uppercase tracking-wider mt-1\">\n Time Remaining\n </div>\n </div>\n <div className=\"text-center\">\n <div className=\"text-xl font-black text-white leading-none\">\n {etaData.distanceRemainingKm.toFixed(1)}\n <span className=\"text-xs text-zinc-400 font-normal\"> km</span>\n </div>\n <div className=\"text-[8px] text-zinc-500 font-bold uppercase tracking-wider mt-1\">\n Distance Remaining\n </div>\n </div>\n </div>\n\n {etaData.progress !== undefined && (\n <div className=\"mb-3\">\n <div className=\"flex justify-between text-[9px] font-bold text-zinc-400 mb-1\">\n <span>Progress</span>\n <span>{Math.round(etaData.progress)}%</span>\n </div>\n <div className=\"h-1 bg-white/10 rounded-full overflow-hidden\">\n <div\n className=\"h-full bg-cyan-400 rounded-full\"\n style={{ width: `${etaData.progress}%` }}\n />\n </div>\n </div>\n )}\n\n {etaData.mode === \"preview\" && etaData.onStart && (\n <Button\n className=\"w-full py-2.5 text-xs font-bold bg-cyan-500 text-black hover:bg-cyan-400 hover:text-black active:scale-95 rounded-lg transition-all cursor-pointer h-auto\"\n onClick={etaData.onStart}\n variant=\"ghost\"\n >\n Start Guidance\n </Button>\n )}\n </CardContent>\n </Card>\n );\n }\n\n // floating-card (centered at bottom of map)\n return (\n <Card\n className={`absolute left-1/2 -translate-x-1/2 z-40 w-[calc(100%-2rem)] max-w-[320px] sm:max-w-[380px] bg-zinc-950/85 backdrop-blur-md border border-white/10 rounded-2xl shadow-2xl p-3 sm:p-4 flex flex-col pointer-events-auto select-none text-card-foreground ${\n isDragging ? \"transition-none\" : \"transition-all duration-300 ease-out\"\n }`}\n style={style}\n >\n <div className=\"flex items-center justify-between mb-2 sm:mb-3\">\n <div className=\"flex items-center gap-2\">\n <span className=\"w-1.5 h-1.5 sm:w-2 sm:h-2 rounded-full bg-emerald-500 animate-pulse\" />\n <span className=\"text-[9px] sm:text-[10px] font-bold text-emerald-400 uppercase tracking-wider\">\n {etaData.label || \"Guidance Active\"}\n </span>\n </div>\n {etaData.onAbort && (\n <Button\n className=\"px-1 py-1 text-[10px] sm:text-xs font-bold bg-red-500/20 text-red-400 hover:bg-red-500/30 border border-red-500/30 active:scale-95 rounded-lg transition-all cursor-pointer h-auto p-0!\"\n onClick={etaData.onAbort}\n variant=\"ghost\"\n >\n <svg\n className=\"lucide lucide-x\"\n fill=\"none\"\n height=\"18\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2.5\"\n viewBox=\"0 0 24 24\"\n width=\"18\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M18 6 6 18\"></path>\n <path d=\"m6 6 12 12\"></path>\n </svg>\n </Button>\n )}\n </div>\n\n <CardContent className=\"p-0 flex flex-col\">\n <div className=\"grid grid-cols-2 divide-x divide-white/10 py-0.5 sm:py-1 mb-2 sm:mb-3\">\n <div className=\"text-center\">\n <div className=\"text-base sm:text-lg font-black text-white leading-none\">\n {etaData.etaMins}\n <span className=\"text-[10px] sm:text-xs text-zinc-400 font-normal\">\n {\" \"}\n min\n </span>\n </div>\n </div>\n <div className=\"text-center\">\n <div className=\"text-base sm:text-lg font-black text-white leading-none\">\n {etaData.distanceRemainingKm.toFixed(1)}\n <span className=\"text-[10px] sm:text-xs text-zinc-400 font-normal\">\n {\" \"}\n km\n </span>\n </div>\n </div>\n </div>\n\n {etaData.progress !== undefined && (\n <div>\n <div className=\"flex justify-between text-[8px] sm:text-[9px] font-bold text-zinc-400 mb-1\">\n <span>Progress</span>\n <span>{Math.round(etaData.progress)}%</span>\n </div>\n <div className=\"h-1 sm:h-1.5 bg-white/10 rounded-full overflow-hidden\">\n <div\n className=\"h-full bg-cyan-400 rounded-full\"\n style={{ width: `${etaData.progress}%` }}\n />\n </div>\n </div>\n )}\n\n {etaData.mode === \"preview\" && etaData.onStart && (\n <Button\n className=\"mt-2.5 sm:mt-3 py-1.5 sm:py-2 text-[11px] sm:text-xs font-bold bg-cyan-500 text-black hover:bg-cyan-400 hover:text-black active:scale-95 rounded-lg transition-all cursor-pointer h-auto\"\n onClick={etaData.onStart}\n variant=\"ghost\"\n >\n Start Guidance\n </Button>\n )}\n </CardContent>\n </Card>\n );\n};\n","import type { CenterCallbackParams } from \"@miniapps-sdk/components\";\nimport type {\n CustomControl,\n EtaData,\n} from \"@miniapps-sdk/components/Map/types\";\nimport { Button } from \"@miniapps-sdk/components/ui/button\";\nimport type { ViewState } from \"@vis.gl/react-maplibre\";\nimport type React from \"react\";\nimport type { DrawerState } from \"./MapDrawer\";\n\nexport interface MapRightControlsProps {\n customControls?: CustomControl[];\n etaBarHeight: number;\n onRecenter: (params?: CenterCallbackParams) => void;\n isMapCentered: boolean;\n mapBearing: number;\n mapPitch: number;\n onResetBearing: (params?: CenterCallbackParams) => void;\n drawerState: DrawerState;\n side: \"left\" | \"bottom\";\n etaData?: EtaData;\n initialViewState?: Partial<ViewState>;\n\n isDragging: boolean;\n clampedDragOffset: number;\n\n // Custom button overrides passed down from facade\n customRecenterButton?: React.ReactNode;\n customCompassButton?: React.ReactNode;\n\n // Drawer customization\n drawerPeekHeight?: string | number;\n\n // Safe area insets\n insets?: { top: number; bottom: number; left: number; right: number };\n}\n\nexport const MapRightControls: React.FC<MapRightControlsProps> = ({\n customControls = [],\n etaBarHeight,\n onRecenter,\n isMapCentered,\n mapBearing,\n mapPitch,\n onResetBearing,\n initialViewState,\n drawerState,\n side,\n etaData,\n isDragging,\n clampedDragOffset,\n customRecenterButton,\n customCompassButton,\n drawerPeekHeight,\n insets = { bottom: 0, left: 0, right: 0, top: 0 },\n}) => {\n const aboveControls = customControls.filter(\n (c) => c.position === \"above-recenter\",\n );\n const belowControls = customControls.filter(\n (c) => c.position === \"below-recenter\",\n );\n\n const isCompassVisible =\n Math.abs(mapBearing) >= 0.5 || Math.abs(mapPitch) >= 0.5;\n\n // Since ETA is floating outside the drawer, the closed drawer height is always 32px (the handle).\n const closedHeightOffset = \"32px\";\n\n // If ETA is active, shift controls up by etaBarHeight to avoid overlapping the centered floating ETA card.\n // Note: when drawer is closed, etaBarHeight already includes bottom inset passed from MapControls\n const activeEtaHeight = etaData\n ? etaBarHeight\n : drawerState === \"closed\"\n ? insets.bottom\n : 0;\n\n const peekStyle =\n typeof drawerPeekHeight === \"number\"\n ? `${drawerPeekHeight}px`\n : drawerPeekHeight || \"15%\";\n\n // Compute bottom positioning offset:\n // If drawer is closed: sits above closed height + active ETA bar height (or inset) + margin\n // If drawer is peek: sits above peek height sheet + active ETA bar height + margin\n const controlsBottom =\n side === \"bottom\"\n ? drawerState === \"closed\"\n ? `calc(${closedHeightOffset} + 1rem + ${activeEtaHeight}px - var(--drag-offset, 0px))`\n : `calc(${peekStyle} + 1rem + ${etaData ? etaBarHeight : 0}px - var(--drag-offset, 0px))`\n : `calc(1rem + ${insets.bottom}px)`;\n\n // Hide right-side controls entirely when drawer is fully open in bottom mode\n const isControlsVisible = side !== \"bottom\" || drawerState !== \"full\";\n\n return (\n <div\n className={`absolute right-4 z-30 flex flex-col items-center gap-3 select-none pointer-events-none ${\n isDragging ? \"transition-none\" : \"transition-all duration-300 ease-out\"\n } ${\n isControlsVisible\n ? \"opacity-100 scale-100 pointer-events-auto\"\n : \"opacity-0 scale-75 pointer-events-none\"\n }`}\n style={{\n bottom: controlsBottom,\n }}\n >\n {/* ABOVE-RECENTER CUSTOM CONTROLS */}\n {aboveControls.length > 0 && (\n <div className=\"flex flex-col gap-2 pointer-events-auto\">\n {aboveControls.map((control) => (\n <div className=\"relative group flex items-center\" key={control.id}>\n {/* Tooltip */}\n {control.tooltip && (\n <div className=\"absolute right-14 pointer-events-none opacity-0 scale-95 origin-right group-hover:opacity-100 group-hover:scale-100 transition-all duration-150 bg-zinc-900/95 border border-white/10 text-white text-xs px-2.5 py-1.5 rounded-lg shadow-xl whitespace-nowrap\">\n {control.tooltip}\n </div>\n )}\n\n {/* Action Button */}\n <Button\n className={`w-12 h-12 rounded-full bg-zinc-950/80 backdrop-blur-md border border-white/10 shadow-lg flex items-center justify-center text-white active:scale-95 transition-all cursor-pointer p-0! hover:bg-zinc-900 hover:text-white ${\n control.activeState\n ? \"ring-2 ring-cyan-400 ring-offset-2 ring-offset-zinc-950\"\n : \"\"\n }`}\n onClick={control.onPress}\n variant=\"ghost\"\n >\n {control.icon}\n </Button>\n </div>\n ))}\n </div>\n )}\n\n {/* COMPASS (OVERRIDDEN OR DEFAULT HIDDEN NORTH-UP) */}\n {isCompassVisible &&\n (customCompassButton ? (\n <div className=\"pointer-events-auto\">{customCompassButton}</div>\n ) : (\n <div className=\"pointer-events-auto\">\n <Button\n className={`w-12 h-12 rounded-full bg-zinc-950/80 backdrop-blur-md border border-white/10 shadow-lg flex items-center justify-center text-white active:scale-95 transition-all duration-300 p-0! hover:bg-zinc-900 hover:text-white ${\n isCompassVisible\n ? \"opacity-100 pointer-events-auto\"\n : \"opacity-0 pointer-events-none h-0 w-0 border-none m-0 p-0 overflow-hidden\"\n }`}\n onClick={() =>\n onResetBearing({ pitch: initialViewState?.pitch ?? 0 })\n }\n style={{\n transform: isCompassVisible\n ? \"scale(1) rotate(0deg)\"\n : \"scale(0.7) rotate(0deg)\",\n }}\n title=\"Reset bearing to North\"\n variant=\"ghost\"\n >\n <svg\n className=\"w-7 h-7 transition-transform duration-75 ease-out\"\n fill=\"none\"\n style={{\n transform: `rotate(${-mapBearing}deg)`,\n }}\n viewBox=\"0 0 24 24\"\n >\n {/* Outer ring */}\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"9.5\"\n stroke=\"white\"\n strokeOpacity=\"0.2\"\n strokeWidth=\"1\"\n />\n {/* North Indicator Needle (Red) */}\n <path d=\"M12 4.5L15 12H9L12 4.5Z\" fill=\"#ef4444\" />\n {/* South Indicator Needle (White) */}\n <path d=\"M12 19.5L9 12H15L12 19.5Z\" fill=\"#f4f4f5\" />\n {/* Pivot Center Point */}\n <circle cx=\"12\" cy=\"12\" fill=\"#18181b\" r=\"1.5\" />\n </svg>\n </Button>\n </div>\n ))}\n\n {/* RECENTER BUTTON (OVERRIDDEN OR DEFAULT) */}\n {customRecenterButton ? (\n <div className=\"pointer-events-auto\">{customRecenterButton}</div>\n ) : (\n <div className=\"pointer-events-auto\">\n <Button\n className={`w-12 h-12 rounded-full bg-zinc-950/80 backdrop-blur-md border border-white/10 shadow-lg flex items-center justify-center text-white active:scale-95 transition-all cursor-pointer p-0! hover:bg-zinc-900 hover:text-white ${\n isMapCentered\n ? \"ring-2 ring-cyan-400 ring-offset-2 ring-offset-zinc-950\"\n : \"\"\n }`}\n onClick={() => onRecenter()}\n title=\"Recenter Map\"\n variant=\"ghost\"\n >\n {isMapCentered ? (\n /* Filled active lock state */\n <svg\n className=\"w-6 h-6 text-cyan-400\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.2\"\n viewBox=\"0 0 24 24\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"8\" />\n <circle cx=\"12\" cy=\"12\" fill=\"currentColor\" r=\"3\" />\n <line x1=\"12\" x2=\"12\" y1=\"2\" y2=\"4\" />\n <line x1=\"12\" x2=\"12\" y1=\"20\" y2=\"22\" />\n <line x1=\"2\" x2=\"4\" y1=\"12\" y2=\"12\" />\n <line x1=\"20\" x2=\"22\" y1=\"12\" y2=\"12\" />\n </svg>\n ) : (\n /* Outlined drifted state */\n <svg\n className=\"w-6 h-6 text-zinc-300\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"8\" />\n <line x1=\"12\" x2=\"12\" y1=\"2\" y2=\"4\" />\n <line x1=\"12\" x2=\"12\" y1=\"20\" y2=\"22\" />\n <line x1=\"2\" x2=\"4\" y1=\"12\" y2=\"12\" />\n <line x1=\"20\" x2=\"22\" y1=\"12\" y2=\"12\" />\n </svg>\n )}\n </Button>\n </div>\n )}\n\n {/* BELOW-RECENTER CUSTOM CONTROLS */}\n {belowControls.length > 0 && (\n <div className=\"flex flex-col gap-2 pointer-events-auto\">\n {belowControls.map((control) => (\n <div className=\"relative group flex items-center\" key={control.id}>\n {/* Tooltip */}\n {control.tooltip && (\n <div className=\"absolute right-14 pointer-events-none opacity-0 scale-95 origin-right group-hover:opacity-100 group-hover:scale-100 transition-all duration-150 bg-zinc-900/95 border border-white/10 text-white text-xs px-2.5 py-1.5 rounded-lg shadow-xl whitespace-nowrap\">\n {control.tooltip}\n </div>\n )}\n\n {/* Action Button */}\n <Button\n className={`w-12 h-12 rounded-full bg-zinc-950/80 backdrop-blur-md border border-white/10 shadow-lg flex items-center justify-center text-white active:scale-95 transition-all cursor-pointer p-0! hover:bg-zinc-900 hover:text-white ${\n control.activeState\n ? \"ring-2 ring-cyan-400 ring-offset-2 ring-offset-zinc-950\"\n : \"\"\n }`}\n onClick={control.onPress}\n variant=\"ghost\"\n >\n {control.icon}\n </Button>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n};\n","import type { DrawerState, EtaData } from \"@miniapps-sdk/components/Map/types\";\nimport type React from \"react\";\nimport {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nexport interface MapInsets {\n top: number;\n bottom: number;\n left: number;\n right: number;\n}\n\nexport interface MapControlsState {\n isFollowing: boolean;\n setIsFollowing: (following: boolean) => void;\n centerOnUser: (params?: CenterCallbackParams) => void;\n bearing: number;\n setBearing: (bearing: number) => void;\n pitch: number;\n setPitch: (pitch: number) => void;\n resetBearing: (params?: CenterCallbackParams) => void;\n\n // Navigation details and controls presence state\n etaData?: EtaData;\n setEtaData: (data?: EtaData) => void;\n hasControls: boolean;\n setHasControls: (hasControls: boolean) => void;\n\n // Drawer state controls\n drawerState: DrawerState;\n setDrawerState: (state: DrawerState) => void;\n /** Stable ref to the drawer's scrollable container. Always available. */\n drawerContentRef: React.RefObject<HTMLDivElement | null>;\n\n // Safe area insets (e.g. for mobile home indicators/notches)\n insets: MapInsets;\n setInsets: (insets: Partial<MapInsets>) => void;\n}\n\nexport interface CenterCallbackParams {\n pitch?: number;\n}\n\ninterface MapControlsContextType extends MapControlsState {\n // Internal registration callbacks for the Map component to hook up its controls\n _registerCenterCallback: (\n cb: (params?: CenterCallbackParams) => void,\n ) => void;\n _registerResetBearingCallback: (\n cb: (params?: CenterCallbackParams) => void,\n ) => void;\n}\n\nexport const MapControlsContext = createContext<MapControlsContextType | null>(\n null,\n);\n\nexport const SDKMapProvider: React.FC<{ children: React.ReactNode }> = ({\n children,\n}) => {\n const [isFollowing, setIsFollowing] = useState(true);\n const [bearing, setBearingState] = useState(0);\n const [pitch, setPitchState] = useState(0);\n const [drawerState, setDrawerStateInternal] = useState<DrawerState>(\"closed\");\n\n // Stable ref created by the provider to ensure it's always available to hook users\n const drawerContentRef = useRef<HTMLDivElement>(null);\n\n const setDrawerState = useCallback((val: DrawerState) => {\n setDrawerStateInternal(val);\n }, []);\n\n // Use stable handlers for hasControls\n const [hasControls, setHasControlsState] = useState(false);\n const setHasControls = useCallback((val: boolean) => {\n setHasControlsState((prev) => (prev === val ? prev : val));\n }, []);\n\n // Use shallow comparison for etaData setter to prevent update loops\n const [etaData, setEtaDataState] = useState<EtaData | undefined>(undefined);\n const setEtaData = useCallback((newData?: EtaData) => {\n setEtaDataState((prev) => {\n if (!prev && !newData) return prev;\n if (!prev || !newData) return newData;\n if (\n prev.etaMins === newData.etaMins &&\n prev.distanceRemainingKm === newData.distanceRemainingKm &&\n prev.label === newData.label &&\n prev.progress === newData.progress &&\n prev.mode === newData.mode &&\n prev.isCalculating === newData.isCalculating &&\n prev.error === newData.error\n ) {\n return prev;\n }\n return newData;\n });\n }, []);\n\n const [insets, setInsetsState] = useState<MapInsets>({\n bottom: 0,\n left: 0,\n right: 0,\n top: 0,\n });\n\n const setInsets = useCallback((newInsets: Partial<MapInsets>) => {\n setInsetsState((prev) => ({ ...prev, ...newInsets }));\n }, []);\n\n const centerCallbackRef = useRef<\n ((params?: CenterCallbackParams) => void) | null\n >(null);\n const resetBearingCallbackRef = useRef<\n ((params?: CenterCallbackParams) => void) | null\n >(null);\n\n const centerOnUser = useCallback((params?: CenterCallbackParams) => {\n if (centerCallbackRef.current) {\n centerCallbackRef.current(params);\n }\n }, []);\n\n const resetBearing = useCallback((params?: CenterCallbackParams) => {\n if (resetBearingCallbackRef.current) {\n resetBearingCallbackRef.current(params);\n }\n }, []);\n\n const _registerCenterCallback = useCallback(\n (cb: (params?: CenterCallbackParams) => void) => {\n centerCallbackRef.current = cb;\n },\n [],\n );\n\n const _registerResetBearingCallback = useCallback(\n (cb: (params?: CenterCallbackParams) => void) => {\n resetBearingCallbackRef.current = cb;\n },\n [],\n );\n\n const setBearing = useCallback((b: number) => {\n setBearingState(b);\n }, []);\n\n const setPitch = useCallback((p: number) => {\n setPitchState(p);\n }, []);\n\n // Memoize context value to block redundant re-renders of listeners\n const contextValue = useMemo(\n () => ({\n _registerCenterCallback,\n _registerResetBearingCallback,\n bearing,\n centerOnUser,\n drawerContentRef,\n drawerState,\n etaData,\n hasControls,\n insets,\n isFollowing,\n pitch,\n resetBearing,\n setBearing,\n setDrawerState,\n setEtaData,\n setHasControls,\n setInsets,\n setIsFollowing,\n setPitch,\n }),\n [\n _registerCenterCallback,\n _registerResetBearingCallback,\n bearing,\n centerOnUser,\n drawerState,\n etaData,\n hasControls,\n isFollowing,\n pitch,\n resetBearing,\n setBearing,\n setDrawerState,\n setEtaData,\n setHasControls,\n setPitch,\n insets,\n setInsets,\n ],\n );\n\n return (\n <MapControlsContext.Provider value={contextValue}>\n {children}\n </MapControlsContext.Provider>\n );\n};\n\nexport const useMapControls = (): MapControlsState => {\n const context = useContext(MapControlsContext);\n if (!context) {\n throw new Error(\"useMapControls must be used within a MapControlsProvider\");\n }\n return context;\n};\n","import { MapDrawer } from \"@miniapps-sdk/components/Map/components/MapDrawer\";\nimport { MapEtaPanel } from \"@miniapps-sdk/components/Map/components/MapEtaPanel\";\nimport { MapRightControls } from \"@miniapps-sdk/components/Map/components/MapRightControls\";\nimport {\n type CenterCallbackParams,\n MapControlsContext,\n} from \"@miniapps-sdk/components/Map/MapContext\";\nimport type {\n CustomControl,\n DrawerState,\n EtaData,\n MenuItem,\n} from \"@miniapps-sdk/components/Map/types\";\nimport type { ViewState } from \"@vis.gl/react-maplibre\";\nimport type React from \"react\";\nimport { useCallback, useContext, useEffect, useRef, useState } from \"react\";\n\nconst resolveHeightToPixels = (\n height: string | number,\n containerHeight: number,\n): number => {\n if (typeof height === \"number\") {\n return height;\n }\n if (height.endsWith(\"%\")) {\n return (parseFloat(height) / 100) * containerHeight;\n }\n return parseFloat(height);\n};\n\nexport interface MapControlsProps {\n // Drawer\n menuItems?: MenuItem[];\n drawerSide?: \"left\" | \"bottom\"; // default: 'left' on landscape, 'bottom' on portrait\n defaultState?: DrawerState; // default: 'closed'\n menuContent?: React.ReactNode;\n children?: React.ReactNode;\n\n // Controls\n customControls?: CustomControl[];\n etaBarHeight?: number; // px — keeps controls above ETA bar\n onRecenter?: (params?: CenterCallbackParams) => void;\n isMapCentered?: boolean;\n mapBearing?: number; // degrees — drives compass visibility and rotation\n initialViewState?: Partial<ViewState>;\n\n // Compass\n onResetBearing?: (params?: CenterCallbackParams) => void;\n\n // Integrated ETA details\n etaData?: EtaData;\n\n // Custom button overrides\n customRecenterButton?: React.ReactNode;\n customCompassButton?: React.ReactNode;\n\n // Drawer customization\n drawerPeekHeight?: string | number;\n drawerFullHeight?: string | number;\n drawerContentRef?: React.Ref<HTMLDivElement>;\n\n // Touch drag customization\n enableTouchDrag?: boolean;\n\n // Scroll to top button customization\n showScrollToTopButton?: boolean;\n scrollToTopThreshold?: number;\n\n // Internal flag to avoid registry update loops\n isInternal?: boolean;\n}\n\nexport const MapControls: React.FC<MapControlsProps> = ({\n menuItems = [],\n drawerSide,\n customControls = [],\n etaBarHeight = 100,\n onRecenter: propRecenter,\n isMapCentered: propMapCentered,\n mapBearing: propMapBearing,\n onResetBearing: propResetBearing,\n etaData,\n customRecenterButton,\n defaultState,\n initialViewState,\n customCompassButton,\n drawerPeekHeight,\n drawerFullHeight,\n drawerContentRef,\n menuContent,\n children,\n enableTouchDrag = false,\n showScrollToTopButton = true,\n scrollToTopThreshold = 300,\n isInternal = false,\n}) => {\n const mapContext = useContext(MapControlsContext);\n\n const contextRef = mapContext?.drawerContentRef;\n\n // Combine property ref and context ref into a single sync callback\n const mergedRef = useCallback(\n (node: HTMLDivElement | null) => {\n // Sync prop ref\n if (drawerContentRef) {\n if (typeof drawerContentRef === \"function\") {\n drawerContentRef(node);\n } else {\n (drawerContentRef as any).current = node;\n }\n }\n // Sync context ref (always an object ref from provider)\n if (contextRef) {\n (contextRef as any).current = node;\n }\n },\n [drawerContentRef, contextRef],\n );\n\n // Local fallback if context is not available (e.g. isolated storybook without provider)\n const [localDrawerState, setLocalDrawerState] = useState<DrawerState>(\n defaultState ?? \"closed\",\n );\n\n const drawerState = mapContext ? mapContext.drawerState : localDrawerState;\n const setDrawerState = useCallback(\n (state: DrawerState) => {\n if (mapContext) {\n mapContext.setDrawerState(state);\n } else {\n setLocalDrawerState(state);\n }\n },\n [mapContext],\n );\n\n // Sync defaultState into context on mount if provided\n // biome-ignore lint/correctness/useExhaustiveDependencies: only run on mount to set initial state\n useEffect(() => {\n if (defaultState && mapContext) {\n mapContext.setDrawerState(defaultState);\n }\n }, []);\n\n const [side, setSide] = useState<\"left\" | \"bottom\">(\"left\");\n const containerRef = useRef<HTMLDivElement>(null);\n const [mapHeight, setMapHeight] = useState(600);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: containerRef is stable and parent is resolved once on mount\n useEffect(() => {\n const parent = containerRef.current?.parentElement;\n if (!parent) return;\n\n const updateHeight = () => {\n setMapHeight(parent.getBoundingClientRect().height);\n };\n\n updateHeight();\n\n const observer = new ResizeObserver(updateHeight);\n observer.observe(parent);\n\n return () => {\n observer.disconnect();\n };\n }, []);\n\n // Set registry flag\n const setHasControls = mapContext?.setHasControls;\n useEffect(() => {\n if (setHasControls && !isInternal) {\n setHasControls(true);\n return () => setHasControls(false);\n }\n }, [setHasControls, isInternal]);\n\n // Fallbacks using context properties if props are not explicitly passed\n const isMapCentered =\n propMapCentered !== undefined\n ? propMapCentered\n : mapContext\n ? mapContext.isFollowing\n : true;\n\n const mapBearing =\n propMapBearing !== undefined\n ? propMapBearing\n : mapContext\n ? mapContext.bearing\n : 0;\n\n const onRecenter = (params?: CenterCallbackParams) => {\n if (propRecenter) {\n propRecenter(params);\n } else if (mapContext) {\n mapContext.centerOnUser(params);\n }\n };\n\n const onResetBearing = (params?: CenterCallbackParams) => {\n if (propResetBearing) {\n propResetBearing(params);\n } else if (mapContext) {\n mapContext.resetBearing(params);\n }\n };\n\n const mapPitch = mapContext ? mapContext.pitch : 0;\n\n // Resolve etaData from context if not explicitly passed as a prop\n const resolvedEtaData = etaData !== undefined ? etaData : mapContext?.etaData;\n\n // Hoisted touch coordinates for live drag sync\n const [touchStartY, setTouchStartY] = useState<number | null>(null);\n const [currentTouchY, setCurrentTouchY] = useState<number | null>(null);\n\n // Handle responsive layout detection for orientation matching\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n const checkLayout = () => {\n if (drawerSide) {\n setSide(drawerSide);\n } else {\n // Landscape: left drawer panel, Portrait: bottom sheet panel\n if (window.innerWidth < 768) {\n setSide(\"bottom\");\n } else {\n setSide(\"left\");\n }\n }\n };\n\n checkLayout();\n window.addEventListener(\"resize\", checkLayout);\n return () => window.removeEventListener(\"resize\", checkLayout);\n }, [drawerSide]);\n\n // Compute live drag offset\n const isDragging = touchStartY !== null && currentTouchY !== null;\n const dragOffset = isDragging ? currentTouchY - touchStartY : 0;\n\n // Resolve height limits\n const fullPx = resolveHeightToPixels(drawerFullHeight || \"85%\", mapHeight);\n const peekPx = resolveHeightToPixels(drawerPeekHeight || \"15%\", mapHeight);\n const bottomInset = mapContext?.insets.bottom || 0;\n const closedPx = 32 + (drawerState === \"closed\" ? bottomInset : 0);\n\n // Clamp drag offset based on the current state to prevent boundaries overshoot\n let clampedDragOffset = dragOffset;\n if (drawerState === \"full\") {\n clampedDragOffset = Math.max(0, Math.min(fullPx - closedPx, dragOffset)); // only down, max to closed\n } else if (drawerState === \"peek\") {\n clampedDragOffset = Math.max(\n -(fullPx - peekPx), // up to full\n Math.min(peekPx - closedPx, dragOffset), // down to closed\n );\n } else if (drawerState === \"closed\") {\n clampedDragOffset = Math.min(0, Math.max(-(fullPx - closedPx), dragOffset)); // only up, max to full\n }\n\n // Calculate dynamic drawer height and opacity for portrait bottom sheet\n let baseHeight = 32;\n if (drawerState === \"peek\") {\n baseHeight = peekPx;\n } else if (drawerState === \"full\") {\n baseHeight = fullPx;\n }\n\n const currentDrawerHeight = baseHeight - clampedDragOffset;\n\n // Smoothly fade out opacity between peek height and 35% of the distance to full\n const startFadeHeight = peekPx + 20; // start fading just above peek\n const endFadeHeight = peekPx + (fullPx - peekPx) * 0.35; // fully faded out at 35% progress\n\n let etaOpacity = 1;\n let etaBottomStyle: string | number = \"1rem\";\n\n if (side === \"bottom\") {\n if (currentDrawerHeight <= startFadeHeight) {\n etaOpacity = 1;\n } else if (currentDrawerHeight >= endFadeHeight) {\n etaOpacity = 0;\n } else {\n const fraction =\n (currentDrawerHeight - startFadeHeight) /\n (endFadeHeight - startFadeHeight);\n etaOpacity = 1 - fraction;\n }\n\n // Add inset if closed, otherwise drawer already pushed up\n const effectiveInset = drawerState === \"closed\" ? bottomInset : 0;\n etaBottomStyle = `calc(${baseHeight + effectiveInset + 16}px - var(--drag-offset, 0px))`;\n } else {\n // Landscape / Left drawer side\n etaOpacity = drawerState === \"full\" ? 0 : 1;\n etaBottomStyle = `calc(1rem + ${bottomInset}px)`;\n }\n\n return (\n <>\n <div ref={containerRef} style={{ display: \"none\" }} />\n\n {/* Dynamic Slide-out Menu Drawer */}\n <MapDrawer\n clampedDragOffset={clampedDragOffset}\n containerHeight={mapHeight}\n currentTouchY={currentTouchY}\n drawerFullHeight={drawerFullHeight}\n drawerPeekHeight={drawerPeekHeight}\n enableTouchDrag={enableTouchDrag}\n etaBarHeight={etaBarHeight}\n etaData={resolvedEtaData}\n isDragging={isDragging}\n menuContent={children || menuContent}\n menuItems={menuItems}\n onChangeState={setDrawerState}\n ref={mergedRef}\n safeAreaInsets={mapContext?.insets}\n scrollToTopThreshold={scrollToTopThreshold}\n setCurrentTouchY={setCurrentTouchY}\n setTouchStartY={setTouchStartY}\n showScrollToTopButton={showScrollToTopButton}\n side={side}\n state={drawerState}\n touchStartY={touchStartY}\n />\n\n {/* Floating Controls stacked on the right side */}\n <MapRightControls\n clampedDragOffset={clampedDragOffset}\n customCompassButton={customCompassButton}\n customControls={customControls}\n customRecenterButton={customRecenterButton}\n drawerPeekHeight={drawerPeekHeight}\n drawerState={drawerState}\n etaBarHeight={\n etaBarHeight + (drawerState === \"closed\" ? bottomInset : 0)\n }\n etaData={resolvedEtaData}\n initialViewState={initialViewState}\n insets={mapContext?.insets}\n isDragging={isDragging}\n isMapCentered={isMapCentered}\n mapBearing={mapBearing}\n mapPitch={mapPitch}\n onRecenter={() => onRecenter()}\n onResetBearing={onResetBearing}\n side={side}\n />\n\n {/* Floating Bottom ETA Card (Landscape or Portrait peek/closed) */}\n {resolvedEtaData && (\n <MapEtaPanel\n etaData={resolvedEtaData}\n isDragging={isDragging}\n layoutMode=\"floating-card\"\n style={{\n bottom: etaBottomStyle,\n opacity: etaOpacity,\n pointerEvents: etaOpacity > 0.1 ? \"auto\" : \"none\",\n transition: isDragging\n ? \"none\"\n : \"bottom 250ms ease-in-out, opacity 300ms ease-out\",\n }}\n />\n )}\n </>\n );\n};\n\nexport type { DrawerState };\n","import { MapControlsContext } from \"@miniapps-sdk/components/Map/MapContext\";\nimport type React from \"react\";\nimport { useContext } from \"react\";\n\nexport interface MapMenuProps {\n children?: React.ReactNode;\n}\n\nexport const MapMenu: React.FC<MapMenuProps> = ({ children }) => {\n return <div className=\"flex flex-col gap-1.5\">{children}</div>;\n};\n\nexport interface MapMenuItemProps {\n id: string;\n label: string;\n icon?: React.ReactNode;\n onPress?: () => void;\n badge?: string | number;\n disabled?: boolean;\n children?: React.ReactNode;\n}\n\nexport const MapMenuItem: React.FC<MapMenuItemProps> = ({\n id,\n label,\n icon,\n onPress,\n badge,\n disabled = false,\n children,\n}) => {\n const context = useContext(MapControlsContext);\n\n const handleClick = (e: React.MouseEvent) => {\n if (disabled) return;\n if (onPress) onPress();\n if (context && context.setDrawerState) {\n context.setDrawerState(\"closed\");\n }\n };\n\n return (\n <button\n className={`flex items-center gap-3 w-full py-3 px-3.5 rounded-xl text-left cursor-pointer transition-all duration-150 ${\n disabled\n ? \"opacity-45 cursor-not-allowed pointer-events-none\"\n : \"hover:bg-white/5 active:bg-white/10 text-white\"\n }`}\n disabled={disabled}\n onClick={handleClick}\n type=\"button\"\n >\n {icon && (\n <div className=\"relative flex items-center justify-center w-8 h-8 rounded-lg bg-white/5 text-zinc-300\">\n {icon}\n {badge !== undefined && (\n <span className=\"absolute -top-1 -right-1 bg-cyan-500 text-black text-[9px] font-extrabold min-w-[15px] h-3.5 rounded-full flex items-center justify-center px-1 border border-zinc-950 shadow\">\n {badge}\n </span>\n )}\n </div>\n )}\n <div className=\"flex-1 flex flex-col justify-center\">\n <span className=\"text-sm font-medium tracking-wide flex-1\">\n {label}\n </span>\n {children}\n </div>\n </button>\n );\n};\n\nMapMenu.displayName = \"MapMenu\";\nMapMenuItem.displayName = \"MapMenuItem\";\n\nexport interface MapMenuTitleProps {\n children: React.ReactNode;\n className?: string;\n showDivider?: boolean;\n}\n\nexport const MapMenuTitle: React.FC<MapMenuTitleProps> = ({\n children,\n showDivider = true,\n className = \"\",\n}) => {\n return (\n <div\n className={`flex items-center justify-between pb-3 first:mt-0 px-3.5 ${className} ${showDivider ? \"border-b border-white/10 mb-2 mt-4\" : \"\"}`}\n >\n {children}\n </div>\n );\n};\nMapMenuTitle.displayName = \"MapMenuTitle\";\n\nexport interface MapMenuDividerProps {\n className?: string;\n}\n\nexport const MapMenuDivider: React.FC<MapMenuDividerProps> = ({\n className = \"\",\n}) => {\n return <div className={`h-[1px] bg-white/10 my-3 mx-3.5 ${className}`} />;\n};\nMapMenuDivider.displayName = \"MapMenuDivider\";\n\nexport interface MapMenuFooterProps {\n children: React.ReactNode;\n className?: string;\n}\n\nexport const MapMenuFooter: React.FC<MapMenuFooterProps> = ({\n children,\n className = \"\",\n}) => {\n return (\n <div\n className={`mt-auto pt-4 border-t border-white/10 px-3.5 text-xs text-zinc-500 font-medium ${className}`}\n >\n {children}\n </div>\n );\n};\nMapMenuFooter.displayName = \"MapMenuFooter\";\n","/**\n * UP Mini-App SDK Types\n */\n\n/**\n * Represents the user's profile information.\n */\nexport interface IUserProfile {\n /** Unique identifier for the user. */\n uuid: string;\n /** Full legal name of the user. */\n fullName: string;\n /** First name of the user. */\n firstName: string;\n /** Last name of the user. */\n lastName: string;\n /** Primary email address. */\n email?: string;\n /** Chosen username within the UP ecosystem. */\n username?: string;\n /** ISO country code (e.g., \"FR\", \"US\"). */\n countryCode: string;\n /** Phone number without country code. */\n localNumber: string;\n /** Admin status. */\n admin: boolean;\n /** UP points balance. */\n ups: number;\n /** Experience points balance. */\n xp: number;\n /** ISO timestamp of user creation. */\n createdAt: string;\n /** ISO timestamp of last password update. */\n lastPasswordUpdate?: string;\n /** URL to profile picture. */\n avatarUrl?: string;\n /** UUID of profile picture. */\n avatarUuid?: string;\n /** URL to user badge. */\n badgeUrl?: string;\n /** UUID of user badge. */\n badgeUuid?: string;\n /** URL to user profile theme. */\n themeUrl?: string;\n /** UUID of user profile theme. */\n themeUuid?: string;\n}\n\n/**\n * Geographic location data.\n */\nexport interface ILocationData {\n coords: {\n /** Latitude in decimal degrees. */\n latitude: number;\n /** Longitude in decimal degrees. */\n longitude: number;\n /** Altitude in meters above the WGS 84 reference ellipsoid, or null if not available. */\n altitude: number | null;\n /** Accuracy of the latitude and longitude properties in meters. */\n accuracy: number | null;\n /** Accuracy of the altitude property in meters. */\n altitudeAccuracy: number | null;\n /** The direction in which the device is traveling, in degrees (0-360). */\n heading: number | null;\n /** The velocity of the device in meters per second. */\n speed: number | null;\n };\n /** The time at which the location was retrieved (Unix timestamp). */\n timestamp: number;\n}\n\n/**\n * Request payload for triggering a payment flow.\n */\nexport interface IPaymentRequest {\n /** The specific amount to charge. */\n amount: number;\n /** ISO currency code (e.g., \"EUR\", \"USD\"). */\n currency: string;\n /** Total amount including taxes/fees. */\n total: number;\n /** Itemized breakdown of the purchase. */\n items: Array<{\n /** Name or description of the item. */\n item: string;\n /** Price per unit. */\n price?: number;\n /** Number of units. */\n quantity?: number;\n }>;\n}\n\n/**\n * Style of haptic feedback.\n */\nexport type HapticStyleType =\n | \"light\"\n | \"medium\"\n | \"heavy\"\n | \"rigid\"\n | \"soft\"\n | \"success\"\n | \"warning\"\n | \"error\";\n\n/**\n * Network Proxy Types\n */\n\n/**\n * The HTTP method to use as request method\n */\nexport type NetworkMethodType = \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\";\n\n/**\n * Configuration for network proxy requests.\n */\nexport interface INetworkOptions {\n /** Full URL for the request. */\n url: string;\n /** HTTP method to use. */\n method: NetworkMethodType;\n /** Request body for POST/PUT/PATCH. */\n body?: unknown;\n /** Custom HTTP headers. */\n headers?: Record<string, string>;\n}\n\n/**\n * Response from a network proxy request.\n */\nexport interface INetworkResponse<T = unknown> {\n /** HTTP status code. */\n status: number;\n /** Response data payload. */\n data: T;\n /** Response headers. */\n headers: Headers;\n}\n\n/**\n * Fidelity & Rewards Types\n */\n\n/**\n * Fidelity program balance information.\n */\nexport interface IFidelityBalance {\n /** Current point or currency balance. */\n balance: number;\n /** Name or symbol of the fidelity currency (e.g., \"FPoints\"). */\n currency: string;\n}\n\n/**\n * Parameters for retrieving fidelity transaction history.\n */\nexport interface IFidelityHistoryParams {\n /** Maximum number of records to return. */\n limit?: number;\n\n /** Cursor for pagination; null for the first page. */\n cursor?: string | null;\n}\n\n/** Type of transaction: credit (add) or debit (remove). */\nexport type FidelityTransactionTypeType = \"credit\" | \"debit\";\n\n/**\n * A single fidelity program transaction.\n */\nexport interface IFidelityTransaction {\n /** Unique identifier for the transaction. */\n id: string;\n /** Amount of the transaction. */\n amount: number;\n /** Human-readable description. */\n description: string;\n /** ISO 8601 date string. */\n date: string;\n /** Type of transaction */\n type: FidelityTransactionTypeType;\n}\n\n/**\n * The initialization options required to set up the Mini-App SDK.\n */\nexport type IInitializationOptions = {};\n\n/**\n * The post initialization response\n */\nexport interface IInitializationResponse<\n Env extends Record<string, unknown> = Record<string, unknown>,\n UserData extends Record<string, unknown> = Record<string, unknown>,\n Params extends Record<string, unknown> = Record<string, unknown>,\n> {\n /** The name of the mini app */\n name: string;\n /** The uuid of the mini app */\n uuid: string;\n /** The description of the mini app */\n description: string;\n /** The authors of the mini app */\n authors?: string;\n /** The current version in the registry */\n version?: string;\n /** The scoped profile based on the requested fields during initialization or the getUserProfile call */\n profile: Partial<IUserProfile | null>;\n /** The environment variables defined for the mini app in the shell's backend */\n env: Env;\n /** The user data passed during the initialization or the setUserData call */\n userData: UserData;\n /** The params passed during the initialization */\n params: Params;\n /** The edge insets of the mini app, representing the padding around the mini app's view within the Host Shell. */\n insets: IEdgeInsets;\n}\n\n/**\n * Events emitted by the UI module.\n */\nexport enum UIEvent {\n /** Triggered when the user performs a native \"Pull-to-Refresh\". */\n TOP_SCROLL_MORE = \"TOP_SCROLL_MORE\",\n /** Triggered when the user scrolls near the bottom of the page (within 200px threshold). */\n BOTTOM_SCROLL_MORE = \"BOTTOM_SCROLL_MORE\",\n /** Triggered when the user performs a native back gesture or presses the native back button. */\n BACK_GESTURE = \"BACK_GESTURE\",\n}\n\n/**\n * Events emitted by the Geolocation module.\n */\nexport enum GeolocationEvent {\n /** Triggered when the user's location is updated (legacy polling). */\n LOCATION_UPDATE = \"LOCATION_UPDATE\",\n /** Triggered by the continuous location stream. */\n LOCATION_STREAM_UPDATE = \"LOCATION_STREAM_UPDATE\",\n}\n\n/**\n * Configuration options for the location stream.\n */\nexport interface LocationStreamConfig {\n /** Polling cycle rate in milliseconds. Default: 250 */\n interval?: number;\n /** Distance change in meters to trigger an update. Default: 5 */\n distanceFilter?: number;\n /** Heading change in degrees to trigger an update. Default: 5 */\n headingThreshold?: number;\n /** Accelerometer delta in G-force to trigger an update. Default: 0.1 */\n accelerometerThreshold?: number;\n}\n\nexport interface StreamLocationData {\n coords: {\n latitude: number;\n longitude: number;\n altitude: number | null;\n accuracy: number | null;\n altitudeAccuracy: number | null;\n heading: number | null;\n speed: number | null;\n };\n timestamp: number;\n}\n\nexport interface StreamHeadingData {\n magneticHeading: number;\n trueHeading: number;\n accuracy: number;\n}\n\nexport interface StreamAccelerometerData {\n x: number;\n y: number;\n z: number;\n}\n\nexport interface StreamUpdatePayload {\n location: StreamLocationData;\n heading: StreamHeadingData;\n accelerometer: StreamAccelerometerData | null;\n timestamp: number;\n}\n\n/**\n * Global events emitted by the Host Shell that may affect the mini-app's context.\n */\nexport enum GlobalEvent {\n /** Triggered when the Host Shell sends an update event to the mini-app, indicating changes in context. */\n UPDATE_CONTEXT = \"UPDATE_CONTEXT\",\n}\n\n/**\n * Union type for all SDK events, allowing for both known enums and custom strings.\n * The (string & {}) pattern preserves IntelliSense for enum members.\n */\nexport type SDKEvent = UIEvent | GeolocationEvent | GlobalEvent | (string & {});\n\n/**\n * Configuration for native scroll interactions managed by the Host Shell.\n */\nexport interface ScrollConfig {\n /** Configuration for Pull-to-Refresh (Top). */\n topScrollMore?: {\n /** Show/hide the native RefreshControl. */\n enabled: boolean;\n /** Set to true to show the loading spinner, false to hide it. */\n refreshing?: boolean;\n };\n /** Configuration for Infinite Scroll (Bottom). */\n bottomScrollMore?: {\n /** Enable/disable bottom scroll detection. */\n enabled: boolean;\n /** If false, detection stops and the indicator is hidden. */\n hasMore?: boolean;\n /** Set to true to show the bottom ActivityIndicator. */\n loadingMore?: boolean;\n };\n}\n\n/**\n * Edge insets representing padding or margins around a component, typically used for layout purposes.\n */\nexport interface IEdgeInsets {\n top: number;\n right: number;\n bottom: number;\n left: number;\n}\n\n/**\n * The context state of the mini-app, which includes dynamic properties provided by the Host Shell, such as edge insets for layout adjustments. This type can be extended with additional properties as needed.\n */\nexport type IContextState = Record<string, any> & {\n insets: IEdgeInsets;\n};\n","import { sdk } from \"@miniapps-sdk/sdk\";\nimport { GeolocationEvent } from \"@miniapps-sdk/types\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport interface UserLocationState {\n coords: [number, number] | null;\n heading: number | null;\n accuracy: number | null;\n}\n\n/**\n * Smoothing factor for interpolation.\n * Higher = faster/snappier (less lag, more jitter)\n * Lower = smoother/slower (more lag, zero jitter)\n */\nconst LERP_FACTOR = 0.12;\n\nexport const useUserLocation = () => {\n // Current \"visible\" state\n const [locationState, setLocationState] = useState<UserLocationState>({\n accuracy: null,\n coords: null,\n heading: null,\n });\n\n // Target values from bridge\n const targetRef = useRef<UserLocationState>({\n accuracy: null,\n coords: null,\n heading: null,\n });\n\n // Current interpolated values (refs to avoid re-renders)\n const currentRef = useRef<UserLocationState>({\n accuracy: null,\n coords: null,\n heading: null,\n });\n\n const mapPayload = useCallback((payload: any): UserLocationState => {\n const coords = payload.location?.coords || payload.coords;\n const headingData = payload.heading || payload.coords;\n\n const newCoords: [number, number] | null = coords\n ? [coords.longitude, coords.latitude]\n : null;\n\n let heading = null;\n if (\n headingData?.trueHeading !== undefined &&\n headingData.trueHeading >= 0\n ) {\n heading = headingData.trueHeading;\n } else if (\n headingData?.magneticHeading !== undefined &&\n headingData.magneticHeading >= 0\n ) {\n heading = headingData.magneticHeading;\n } else if (headingData?.heading !== null && headingData.heading >= 0) {\n heading = headingData.heading;\n }\n\n return {\n accuracy: coords?.accuracy || null,\n coords: newCoords,\n heading,\n };\n }, []);\n\n useEffect(() => {\n let rafId: number;\n\n const animate = () => {\n let changed = false;\n\n // 1. Interpolate Coords\n if (targetRef.current.coords) {\n if (!currentRef.current.coords) {\n currentRef.current.coords = [...targetRef.current.coords];\n changed = true;\n } else {\n const [tLng, tLat] = targetRef.current.coords;\n const [cLng, cLat] = currentRef.current.coords;\n\n const nLng = cLng + (tLng - cLng) * LERP_FACTOR;\n const nLat = cLat + (tLat - cLat) * LERP_FACTOR;\n\n // Only update if difference is significant to save cycles\n if (Math.abs(nLng - cLng) > 1e-7 || Math.abs(nLat - cLat) > 1e-7) {\n currentRef.current.coords = [nLng, nLat];\n changed = true;\n }\n }\n }\n\n // 2. Interpolate Heading (Shortest Path)\n if (targetRef.current.heading !== null) {\n if (currentRef.current.heading === null) {\n currentRef.current.heading = targetRef.current.heading;\n changed = true;\n } else {\n const target = targetRef.current.heading;\n const current = currentRef.current.heading;\n\n // Find shortest delta (handle 0/360 wrap)\n let delta = target - current;\n if (delta > 180) delta -= 360;\n if (delta < -180) delta += 360;\n\n const nHeading = current + delta * LERP_FACTOR;\n // Normalize to [0, 360)\n const normalized = ((nHeading % 360) + 360) % 360;\n\n if (Math.abs(delta) > 0.1) {\n currentRef.current.heading = normalized;\n changed = true;\n }\n }\n }\n\n if (changed) {\n setLocationState({\n accuracy: targetRef.current.accuracy,\n coords: currentRef.current.coords\n ? [...currentRef.current.coords]\n : null,\n heading: currentRef.current.heading,\n });\n }\n\n rafId = requestAnimationFrame(animate);\n };\n\n rafId = requestAnimationFrame(animate);\n\n // Initial fetch\n sdk.location\n .getCurrentPosition()\n .then((data) => {\n const payload = mapPayload(data);\n targetRef.current = payload;\n })\n .catch((e) => console.warn(\"Initial location fetch failed\", e));\n\n const unsubscribeStream = sdk.on(\n GeolocationEvent.LOCATION_STREAM_UPDATE,\n (payload: any) => {\n targetRef.current = mapPayload(payload);\n },\n );\n\n const unsubscribeLegacy = sdk.on(\n GeolocationEvent.LOCATION_UPDATE,\n (payload: any) => {\n targetRef.current = mapPayload(payload);\n },\n );\n\n sdk.location\n .startStream({\n distanceFilter: 1,\n headingThreshold: 2,\n })\n .catch((e) => console.warn(\"Failed to start location stream\", e));\n\n return () => {\n cancelAnimationFrame(rafId);\n unsubscribeStream();\n unsubscribeLegacy();\n sdk.location.stopStream().catch(() => {});\n };\n }, [mapPayload]);\n\n return locationState;\n};\n","import { useUserLocation } from \"@miniapps-sdk/components/Map/hooks/useUserLocation\";\nimport { sdk } from \"@miniapps-sdk/sdk\";\nimport type { RouteResponse } from \"@miniapps-sdk/types\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nexport interface LiveRoutingOptions {\n /** Origin coordinates [lng, lat]. If not provided, uses device location. */\n origin?: [number, number] | null;\n /** Destination coordinates [lng, lat] */\n destination: [number, number] | null;\n /** Transport profile. Defaults to 'driving'. */\n profile?: \"driving\" | \"cycling\" | \"walking\";\n /** Minimum distance in meters the user must move before recalculating path geometry. Defaults to 50. */\n recalculateThreshold?: number;\n /** Whether live routing is active. */\n enabled?: boolean;\n /** Initial mode: 'preview' or 'navigation'. Defaults to 'preview'. */\n initialMode?: \"preview\" | \"navigation\";\n}\n\nexport interface LiveRoutingResult {\n /** The calculated route data from the last API call */\n route: RouteResponse[\"data\"] | null;\n /** Real-time distance to destination in meters */\n currentDistanceMeters: number | null;\n /** The initial total distance when the destination was first set */\n totalDistance: number | null;\n /** Whether a new calculation is in progress */\n isCalculating: boolean;\n /** Any error message from the routing service */\n error: string | null;\n /** Force a manual recalculation */\n recalculate: () => void;\n /** Current mode: 'preview' (overview) or 'navigation' (active guidance) */\n mode: \"preview\" | \"navigation\";\n /** Start active navigation (switch mode to 'navigation') */\n start: () => void;\n}\n\nexport const useLiveRouting = ({\n origin: manualOrigin,\n destination,\n profile = \"driving\",\n recalculateThreshold = 50,\n enabled = true,\n initialMode = \"preview\",\n}: LiveRoutingOptions): LiveRoutingResult => {\n const [route, setRoute] = useState<RouteResponse[\"data\"] | null>(null);\n const [totalDistance, setTotalDistance] = useState<number | null>(null);\n const [isCalculating, setIsCalculating] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [mode, setMode] = useState<\"preview\" | \"navigation\">(initialMode);\n\n const userLocationState = useUserLocation();\n // calculationOrigin: used for the route API call (can be a fixed start point)\n // trackingLocation: always live GPS — used for real-time distance/progress tracking\n const calculationOrigin = manualOrigin || userLocationState.coords;\n const trackingLocation = userLocationState.coords || manualOrigin;\n\n const lastCalcOrigin = useRef<[number, number] | null>(null);\n const lastCalcDest = useRef<[number, number] | null>(null);\n const isRequestInProgress = useRef(false);\n\n // Helper to calculate distance between two points (Haversine)\n const getDistance = useCallback(\n (p1: [number, number], p2: [number, number]) => {\n const R = 6371e3; // meters\n const φ1 = (p1[1] * Math.PI) / 180;\n const φ2 = (p2[1] * Math.PI) / 180;\n const Δφ = ((p2[1] - p1[1]) * Math.PI) / 180;\n const Δλ = ((p2[0] - p1[0]) * Math.PI) / 180;\n\n const a =\n Math.sin(Δφ / 2) * Math.sin(Δφ / 2) +\n Math.cos(φ1) * Math.cos(φ2) * Math.sin(Δλ / 2) * Math.sin(Δλ / 2);\n const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n\n return R * c;\n },\n [],\n );\n\n // Real-time distance calculation along route coordinates.\n // ALWAYS uses trackingLocation (live GPS), never the fixed manualOrigin,\n // so it updates as the user physically moves.\n const currentDistanceMeters = useMemo(() => {\n if (!trackingLocation || !route || route.geometry.coordinates.length < 2) {\n if (trackingLocation && destination) {\n return getDistance(trackingLocation, destination);\n }\n return null;\n }\n\n const coords = route.geometry.coordinates as [number, number][];\n\n // Find the coordinate on the route closest to the user's live position\n let minDistSq = Infinity;\n let closestIndex = 0;\n\n const getDistSq = (p1: [number, number], p2: [number, number]) =>\n (p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2;\n\n for (let i = 0; i < coords.length; i++) {\n const d = getDistSq(trackingLocation, coords[i] as [number, number]);\n if (d < minDistSq) {\n minDistSq = d;\n closestIndex = i;\n }\n }\n\n // Sum distance along remaining route segments starting from the user's exact position\n const remainingCoords = coords.slice(closestIndex + 1);\n let dist = 0;\n let prev: [number, number] = trackingLocation;\n for (const coord of remainingCoords) {\n dist += getDistance(prev, coord as [number, number]);\n prev = coord as [number, number];\n }\n return dist;\n }, [trackingLocation, route, destination, getDistance]);\n\n const calculate = useCallback(\n async (\n origin: [number, number],\n dest: [number, number],\n isNewDest: boolean,\n ) => {\n if (isRequestInProgress.current) return;\n\n isRequestInProgress.current = true;\n setIsCalculating(true);\n\n try {\n const data = await sdk.routing.getRoute({\n destination: dest,\n origin,\n profile,\n });\n\n setRoute(data);\n setError(null);\n\n if (isNewDest) {\n const coords = data.geometry.coordinates;\n let sum = 0;\n for (let i = 0; i < coords.length - 1; i++) {\n sum += getDistance(\n coords[i] as [number, number],\n coords[i + 1] as [number, number],\n );\n }\n setTotalDistance(sum);\n }\n\n lastCalcOrigin.current = origin;\n lastCalcDest.current = dest;\n } catch (err: any) {\n setError(err.message || \"Failed to fetch route\");\n } finally {\n setIsCalculating(false);\n isRequestInProgress.current = false;\n }\n },\n [profile, getDistance],\n );\n\n useEffect(() => {\n if (!enabled || !destination || !calculationOrigin) {\n if (!enabled || !destination) {\n setRoute(null);\n setTotalDistance(null);\n lastCalcOrigin.current = null;\n lastCalcDest.current = null;\n }\n return;\n }\n\n const destChanged =\n !lastCalcDest.current ||\n lastCalcDest.current[0] !== destination[0] ||\n lastCalcDest.current[1] !== destination[1];\n\n if (destChanged) {\n calculate(calculationOrigin, destination, true);\n } else if (lastCalcOrigin.current) {\n // Recalculate route geometry only if user drifted far from last calc origin\n const livePos = trackingLocation || calculationOrigin;\n const dist = getDistance(livePos, lastCalcOrigin.current);\n if (dist > recalculateThreshold) {\n calculate(livePos, destination, false);\n }\n } else {\n calculate(calculationOrigin, destination, true);\n }\n }, [\n calculationOrigin,\n trackingLocation,\n destination,\n enabled,\n recalculateThreshold,\n calculate,\n getDistance,\n ]);\n\n return {\n currentDistanceMeters,\n error,\n isCalculating,\n mode,\n recalculate: () =>\n calculationOrigin &&\n destination &&\n calculate(calculationOrigin, destination, false),\n route,\n start: () => setMode(\"navigation\"),\n totalDistance,\n };\n};\n\n/**\n * A simple hook to fetch a route once between two points.\n * Does not automatically recalculate or track user location.\n */\nexport const useRoute = (\n origin: [number, number] | null,\n destination: [number, number] | null,\n profile: \"driving\" | \"cycling\" | \"walking\" = \"driving\",\n) => {\n const [route, setRoute] = useState<RouteResponse[\"data\"] | null>(null);\n const [isCalculating, setIsCalculating] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (!origin || !destination) {\n setRoute(null);\n return;\n }\n\n const fetchRoute = async () => {\n setIsCalculating(true);\n try {\n const data = await sdk.routing.getRoute({\n destination,\n origin,\n profile,\n });\n setRoute(data);\n setError(null);\n } catch (err: any) {\n setError(err.message || \"Failed to fetch route\");\n } finally {\n setIsCalculating(false);\n }\n };\n\n fetchRoute();\n }, [origin, destination, profile]);\n\n return { error, isCalculating, route };\n};\n","import { useMemo } from \"react\";\n\n/**\n * Slices a LineString to start at the point closest to the provided coordinates.\n * This removes the \"already traveled\" portion of the route.\n */\nexport const useTrimmedRoute = (\n route: GeoJSON.LineString | undefined,\n userLocation: [number, number] | null,\n): GeoJSON.LineString | undefined => {\n return useMemo(() => {\n if (!route || !userLocation || route.coordinates.length < 2) return route;\n\n const coords = route.coordinates as [number, number][];\n\n // 1. Find the index of the segment closest to the user\n let minDistance = Infinity;\n let closestIndex = 0;\n\n const getDistSq = (p1: [number, number], p2: [number, number]) => {\n return (p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2;\n };\n\n // We search for the point in the original geometry closest to the user\n for (let i = 0; i < coords.length; i++) {\n const dist = getDistSq(userLocation, coords[i]);\n if (dist < minDistance) {\n minDistance = dist;\n closestIndex = i;\n }\n }\n\n // 2. Slice the route from that point onwards\n // We also prepend the ACTUAL user location to ensure the line starts exactly at the blue dot\n const remainingCoords = coords.slice(closestIndex + 1);\n\n return {\n coordinates: [userLocation, ...remainingCoords],\n type: \"LineString\",\n };\n }, [route, userLocation]);\n};\n","import { Layer, Source } from \"@vis.gl/react-maplibre\";\nimport type React from \"react\";\n\nexport interface RouteLayerProps {\n /** The route geometry as a GeoJSON LineString */\n geometry?: GeoJSON.LineString;\n /** Color of the route line. Defaults to #3b82f6 (blue-500). */\n color?: string;\n /** Width of the route line. Defaults to 5. */\n width?: number;\n /** Opacity of the route line. Defaults to 0.8. */\n opacity?: number;\n}\n\nexport const RouteLayer: React.FC<RouteLayerProps> = ({\n geometry,\n color = \"#3b82f6\",\n width = 5,\n opacity = 0.8,\n}) => {\n if (!geometry) return null;\n\n const data: GeoJSON.Feature<GeoJSON.LineString> = {\n geometry,\n properties: {},\n type: \"Feature\",\n };\n\n return (\n <Source data={data} id=\"sdk-route-source\" type=\"geojson\">\n <Layer\n id=\"sdk-route-layer-casing\"\n paint={{\n \"line-blur\": 1,\n \"line-color\": \"#ffffff\",\n \"line-opacity\": opacity,\n \"line-width\": width + 2,\n }}\n type=\"line\"\n />\n <Layer\n id=\"sdk-route-layer\"\n layout={{\n \"line-cap\": \"round\",\n \"line-join\": \"round\",\n }}\n paint={{\n \"line-color\": color,\n \"line-opacity\": opacity,\n \"line-width\": width,\n }}\n type=\"line\"\n />\n </Source>\n );\n};\n","import type { MapRef } from \"@vis.gl/react-maplibre\";\nimport { Map as MapLibre, MapProvider } from \"@vis.gl/react-maplibre\";\nimport React, {\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport \"maplibre-gl/dist/maplibre-gl.css\";\nimport { MapControls } from \"@miniapps-sdk/components/Map/components/MapControls\";\nimport {\n MapMenu,\n MapMenuDivider,\n MapMenuFooter,\n MapMenuItem,\n MapMenuTitle,\n} from \"@miniapps-sdk/components/Map/components/MapMenu\";\nimport { useLiveRouting } from \"@miniapps-sdk/components/Map/hooks/useLiveRouting\";\nimport { useTrimmedRoute } from \"@miniapps-sdk/components/Map/hooks/useTrimmedRoute\";\nimport { useUserLocation } from \"@miniapps-sdk/components/Map/hooks/useUserLocation\";\nimport { POILayers } from \"@miniapps-sdk/components/Map/layers/POILayers\";\nimport { POIMarkers } from \"@miniapps-sdk/components/Map/layers/POIMarkers\";\nimport { RouteLayer } from \"@miniapps-sdk/components/Map/layers/RouteLayer\";\nimport { UserLocationLayer } from \"@miniapps-sdk/components/Map/layers/UserLocationLayer\";\nimport {\n type CenterCallbackParams,\n MapControlsContext,\n SDKMapProvider,\n} from \"@miniapps-sdk/components/Map/MapContext\";\nimport type { MapProps, POI } from \"@miniapps-sdk/components/Map/types\";\nimport { sdk } from \"@miniapps-sdk/sdk.ts\";\n\nconst MapInternal: React.FC<MapProps> = ({\n initialViewState = {\n latitude: 45.90583599233422,\n longitude: 6.12589018919138,\n zoom: 12,\n },\n style = {},\n mapStyle = \"https://tiles.cloudparse.fr/style/up_dark_matter\",\n className = \"\",\n maxBounds,\n children,\n onClick,\n onMapClickMiss,\n onContextMenu,\n interactiveLayerIds = [],\n onLoad,\n showUserLocation = true,\n followUser: initialFollowUser = false,\n showUserLocationButton = true,\n renderUserLocation,\n pois = [],\n onPoiClick,\n route: externalRoute,\n showNavigationUI: externalShowNavigationUI,\n navigationData: externalNavigationData,\n onNavigationAbort,\n onNavigationModeChange,\n navigation,\n showControls = true,\n menuItems,\n menuContent,\n drawerState: propDrawerState,\n drawerContentRef,\n controlProps = {},\n enableTouchDrag = false,\n}) => {\n const mapControls = useContext(MapControlsContext);\n\n const mapRef = useRef<MapRef | null>(null);\n\n // Get user location state (data only)\n const userLocationState = useUserLocation();\n\n // Programmatic Navigation State (Overrides)\n const [progNav, setProgNav] = useState<{\n destination: [number, number] | null;\n origin?: [number, number] | null;\n profile?: \"driving\" | \"cycling\" | \"walking\";\n mode?: \"preview\" | \"navigation\";\n recalculateThreshold?: number;\n showUI?: boolean;\n } | null>(null);\n\n const [isAborted, setIsAborted] = useState(false);\n\n useEffect(() => {\n const unsubCreate = sdk.on(\"SDK_NAVIGATION_CREATE\", (payload: any) => {\n setIsAborted(false);\n setProgNav(payload);\n });\n const unsubStart = sdk.on(\"SDK_NAVIGATION_START\", () => {\n setIsAborted(false);\n setProgNav((prev) => (prev ? { ...prev, mode: \"navigation\" } : null));\n });\n const unsubAbort = sdk.on(\"SDK_NAVIGATION_ABORT\", () => {\n setIsAborted(true);\n setProgNav(null);\n });\n\n return () => {\n unsubCreate();\n unsubStart();\n unsubAbort();\n };\n }, []);\n\n // Internal Navigation Hook\n const effectiveNavOptions = progNav || navigation;\n const internalNav = useLiveRouting({\n destination: effectiveNavOptions?.destination || null,\n enabled: !!effectiveNavOptions?.destination,\n initialMode: effectiveNavOptions?.mode || \"preview\",\n origin: effectiveNavOptions?.origin,\n profile: effectiveNavOptions?.profile || \"driving\",\n recalculateThreshold: effectiveNavOptions?.recalculateThreshold || 50,\n });\n\n // Sync mode changes back to parent\n useEffect(() => {\n if (onNavigationModeChange && navigation) {\n onNavigationModeChange(internalNav.mode);\n }\n }, [internalNav.mode, onNavigationModeChange, navigation]);\n\n // Reset isAborted when destination changes\n const prevDest = useRef<any>(null);\n const currentDest = effectiveNavOptions?.destination;\n useEffect(() => {\n if (currentDest) {\n if (\n !prevDest.current ||\n prevDest.current[0] !== currentDest[0] ||\n prevDest.current[1] !== currentDest[1]\n ) {\n setIsAborted(false);\n }\n }\n prevDest.current = currentDest;\n }, [currentDest]);\n\n // Merge external and internal data\n const navigationData = !isAborted\n ? effectiveNavOptions\n ? internalNav\n : externalNavigationData\n : undefined;\n const route = !isAborted\n ? effectiveNavOptions\n ? internalNav.route?.geometry\n : externalRoute\n : undefined;\n const showNavigationUI =\n !isAborted &&\n effectiveNavOptions?.showUI !== false &&\n (effectiveNavOptions\n ? !!effectiveNavOptions.destination\n : externalShowNavigationUI);\n\n const mode = navigationData?.mode || \"preview\";\n const resolvedInitialFollow = mapControls\n ? mapControls.isFollowing\n : initialFollowUser;\n\n // Synchronous refs for the render loop to avoid React state batching race conditions\n const isFollowingRef = useRef(resolvedInitialFollow);\n const isFlyingRef = useRef(false);\n\n // We use the context directly for UI updates if it exists, otherwise we fallback to a local state\n const [localIsFollowingUI, setLocalIsFollowingUI] = useState(\n resolvedInitialFollow,\n );\n const isFollowingUI = mapControls\n ? mapControls.isFollowing\n : localIsFollowingUI;\n\n const setIsFollowingCtx = mapControls?.setIsFollowing;\n\n const setFollowMode = useCallback(\n (follow: boolean) => {\n isFollowingRef.current = follow;\n\n // Update local UI state as a fallback\n setLocalIsFollowingUI(follow);\n\n // Update context UI state\n if (setIsFollowingCtx) {\n setIsFollowingCtx(follow);\n }\n },\n [setIsFollowingCtx],\n );\n\n // Sync context state changes into the local ref (if external client called setFollowMode)\n useEffect(() => {\n if (mapControls && mapControls.isFollowing !== isFollowingRef.current) {\n isFollowingRef.current = mapControls.isFollowing;\n }\n }, [mapControls?.isFollowing, mapControls]);\n\n const mergedInteractiveLayerIds = [...interactiveLayerIds];\n if (pois.length > 0 && !mergedInteractiveLayerIds.includes(\"sdk-poi-layer\")) {\n mergedInteractiveLayerIds.push(\"sdk-poi-layer\");\n }\n\n const prevInitialFollow = useRef(initialFollowUser);\n // Reactive follow state sync from props\n useEffect(() => {\n if (initialFollowUser !== prevInitialFollow.current) {\n setFollowMode(initialFollowUser);\n prevInitialFollow.current = initialFollowUser;\n\n if (initialFollowUser && userLocationState.coords && mapRef.current) {\n isFlyingRef.current = true;\n mapRef.current.flyTo({\n center: userLocationState.coords,\n duration: 1000,\n essential: true,\n zoom: Math.max(mapRef.current.getZoom(), 16),\n });\n setTimeout(() => {\n isFlyingRef.current = false;\n }, 1050);\n }\n }\n }, [initialFollowUser, setFollowMode, userLocationState.coords]);\n\n const lastAutoLockedRouteRef = useRef<any>(null);\n const lastModeRef = useRef<string | null>(null);\n\n // Auto-lock camera or fit bounds depending on mode\n useEffect(() => {\n if (!route || !mapRef.current) {\n if (!route) lastAutoLockedRouteRef.current = null;\n return;\n }\n\n const isNewRoute = route !== lastAutoLockedRouteRef.current;\n const modeChanged = lastModeRef.current !== mode;\n\n if (mode === \"navigation\") {\n setFollowMode(true);\n if (\n (modeChanged || isNewRoute) &&\n userLocationState.coords &&\n mapRef.current\n ) {\n isFlyingRef.current = true;\n mapRef.current.flyTo({\n center: userLocationState.coords,\n duration: 1000,\n essential: true,\n zoom: 17, // Zoomed in on user for active guidance\n });\n setTimeout(() => {\n isFlyingRef.current = false;\n }, 1050);\n }\n } else if (mode === \"preview\" && isNewRoute) {\n setFollowMode(false);\n // Fit bounds to show entire route\n const coords = route.coordinates;\n if (coords.length > 0) {\n const bounds = coords.reduce(\n (acc, coord) => {\n return [\n [Math.min(acc[0][0], coord[0]), Math.min(acc[0][1], coord[1])],\n [Math.max(acc[1][0], coord[0]), Math.max(acc[1][1], coord[1])],\n ];\n },\n [\n [coords[0][0], coords[0][1]],\n [coords[0][0], coords[0][1]],\n ],\n );\n\n mapRef.current.fitBounds(\n [bounds[0][0], bounds[0][1], bounds[1][0], bounds[1][1]],\n { padding: 100, speed: 1.2 },\n );\n }\n }\n\n lastAutoLockedRouteRef.current = route;\n lastModeRef.current = mode;\n }, [route, mode, setFollowMode, userLocationState.coords]);\n\n // Continuous Camera Tracking\n useEffect(() => {\n // Read from the ref synchronously to guarantee we don't fight a manual interaction that just occurred\n if (\n isFollowingRef.current &&\n !isFlyingRef.current &&\n userLocationState.coords &&\n mapRef.current\n ) {\n mapRef.current.easeTo({\n center: userLocationState.coords,\n duration: 50, // Ultra-short for high-frequency interpolated stream\n easing: (t) => t,\n essential: true,\n });\n }\n }, [userLocationState.coords]);\n\n // Dynamically trim the route\n const displayRoute = useTrimmedRoute(\n route,\n showUserLocation ? userLocationState.coords : null,\n );\n\n // Compute etaData from navigationData if active\n // Extract primitives directly so useMemo dependency array can track changes\n const currentDistMeters = navigationData?.currentDistanceMeters ?? null;\n const totalDist = navigationData?.totalDistance ?? null;\n const routeDurationSeconds = navigationData?.route?.durationSeconds ?? null;\n\n // Use currentDistanceMeters (real-time along route) — never fall back to route.distanceMeters\n // (that's the total distance, which would make progress 0 or negative)\n const remainingMeters = currentDistMeters ?? 0;\n\n // ETA: scale route duration proportionally to remaining distance\n const etaMins = (() => {\n if (!routeDurationSeconds || !totalDist || !currentDistMeters) return 0;\n const ratio = currentDistMeters / totalDist;\n return Math.ceil((routeDurationSeconds * ratio) / 60);\n })();\n\n const kmRemaining = remainingMeters / 1000;\n\n const progressValue =\n totalDist && totalDist > 0\n ? Math.min(\n 100,\n Math.max(0, ((totalDist - remainingMeters) / totalDist) * 100),\n )\n : 0;\n\n // No useMemo here — primitive deps change on every location update,\n // useMemo was hiding the updates because navigationData object ref is stable\n const showEtaData =\n navigationData && route\n ? {\n distanceRemainingKm: kmRemaining,\n etaMins,\n label:\n mode === \"navigation\" ? \"Walking Guidance Active\" : \"Route Preview\",\n mode: mode,\n onAbort: () => {\n setIsAborted(true);\n setProgNav(null);\n sdk.navigation.abort();\n if (onNavigationAbort) {\n onNavigationAbort();\n }\n },\n onStart: navigationData.start,\n progress: progressValue,\n }\n : undefined;\n\n // Sync etaData to context so controls can access it\n const setEtaDataCtx = mapControls?.setEtaData;\n useEffect(() => {\n if (setEtaDataCtx) {\n setEtaDataCtx(showEtaData);\n }\n }, [showEtaData, setEtaDataCtx]);\n\n // Sync propDrawerState to context so it can be controlled programmatically from Map props\n const setDrawerStateCtx = mapControls?.setDrawerState;\n useEffect(() => {\n if (setDrawerStateCtx && propDrawerState !== undefined) {\n setDrawerStateCtx(propDrawerState);\n }\n }, [propDrawerState, setDrawerStateCtx]);\n\n const defaultMenuItems = useMemo(\n () => [\n {\n icon: (\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n >\n <path\n d=\"M12 11c0 3.517-1.009 6.799-2.753 9.571m-3.44-2.04l.054-.09A13.916 13.916 0 008 11a4 4 0 118 0c0 1.017-.07 2.019-.203 3m-2.118 6.844A21.88 21.88 0 0015.171 17m3.839 1.132c.645-2.266.99-4.659.99-7.132A8 8 0 008 4.07M3 15.364c.64-1.319 1-2.8 1-4.364 0-1.457.39-2.823 1.07-4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n ),\n id: \"walking\",\n label: \"Walking Mode\",\n onPress: () => {},\n },\n ],\n [],\n );\n\n const resolvedMenuItems = menuItems || defaultMenuItems;\n\n const { mapLibreChildren, menuContentFromChildren } = useMemo(() => {\n const mapLibreChildren: React.ReactNode[] = [];\n const extractedMenuItems: React.ReactNode[] = [];\n\n React.Children.forEach(children, (child) => {\n if (React.isValidElement(child)) {\n const type = child.type;\n const displayName = (type as any)?.displayName || (type as any)?.name;\n const isMenu = type === MapMenu || displayName === \"MapMenu\";\n const isMenuComponent =\n isMenu ||\n type === MapMenuItem ||\n type === MapMenuTitle ||\n type === MapMenuDivider ||\n type === MapMenuFooter ||\n [\n \"MapMenuItem\",\n \"MapMenuTitle\",\n \"MapMenuDivider\",\n \"MapMenuFooter\",\n ].includes(displayName);\n\n if (isMenu) {\n React.Children.forEach(\n (child as React.ReactElement<any>).props.children,\n (nestedChild) => {\n if (nestedChild) {\n extractedMenuItems.push(nestedChild);\n }\n },\n );\n } else if (isMenuComponent) {\n extractedMenuItems.push(child);\n } else {\n mapLibreChildren.push(child);\n }\n } else {\n mapLibreChildren.push(child);\n }\n });\n\n const menuContentFromChildren =\n extractedMenuItems.length > 0 ? (\n <MapMenu>{extractedMenuItems}</MapMenu>\n ) : null;\n\n return { mapLibreChildren, menuContentFromChildren };\n }, [children]);\n\n const handleMapClick = (e: any) => {\n const clickedFeatures = e.features || [];\n\n if (onPoiClick) {\n const poiFeature = clickedFeatures.find(\n (f: any) => f.layer.id === \"sdk-poi-layer\",\n );\n if (poiFeature) {\n onPoiClick(poiFeature.properties as POI);\n return;\n }\n }\n\n // Check if the click hit any interactive layers\n const hitInteractive = clickedFeatures.some((f: any) =>\n mergedInteractiveLayerIds.includes(f.layer.id),\n );\n\n if (!hitInteractive) {\n if (onMapClickMiss) {\n onMapClickMiss(e);\n }\n }\n\n if (onClick) onClick(e);\n };\n\n const handleCenterOnUser = useCallback(\n (payload?: CenterCallbackParams) => {\n if (userLocationState.coords && mapRef.current) {\n setFollowMode(true);\n isFlyingRef.current = true; // Lock continuous tracking during the cinematic flyTo\n\n mapRef.current.flyTo({\n center: userLocationState.coords,\n duration: 1000,\n essential: true,\n pitch: payload?.pitch || 0,\n zoom: Math.max(mapRef.current.getZoom(), 16),\n });\n\n // Release the lock when flyTo completes\n setTimeout(() => {\n isFlyingRef.current = false;\n }, 1050);\n }\n },\n [userLocationState.coords, setFollowMode],\n );\n\n const handleResetBearing = useCallback((params?: CenterCallbackParams) => {\n if (mapRef.current) {\n mapRef.current.easeTo({\n bearing: 0,\n duration: 500,\n essential: true,\n pitch: params?.pitch ?? 0,\n });\n }\n }, []);\n\n // Register callbacks to context so controls can trigger centering and resets\n useEffect(() => {\n if (mapControls) {\n mapControls._registerCenterCallback(handleCenterOnUser);\n mapControls._registerResetBearingCallback(handleResetBearing);\n }\n }, [mapControls, handleCenterOnUser, handleResetBearing]);\n\n const handleMove = useCallback(() => {\n if (mapRef.current && mapControls) {\n mapControls.setBearing(mapRef.current.getBearing());\n mapControls.setPitch(mapRef.current.getPitch());\n }\n }, [mapControls]);\n\n // Instantly halt animations and drop tracking on manual input\n const handleUserInteraction = () => {\n if (isFollowingRef.current) {\n console.log(\"[SDK:Map] Manual interaction detected. Halting tracking.\");\n setFollowMode(false);\n if (mapRef.current) {\n mapRef.current.stop(); // Stops any ongoing easeTo immediately\n }\n }\n };\n\n return (\n <div\n className={`w-full h-full overflow-hidden relative ${className}`}\n style={style}\n >\n <MapLibre\n attributionControl={false}\n initialViewState={initialViewState}\n interactiveLayerIds={mergedInteractiveLayerIds}\n mapStyle={mapStyle}\n maxBounds={maxBounds}\n onClick={handleMapClick}\n onContextMenu={onContextMenu}\n onDragStart={handleUserInteraction}\n onLoad={(e) => {\n if (onLoad) onLoad(e);\n if (initialFollowUser && userLocationState.coords && mapRef.current) {\n mapRef.current.jumpTo({\n center: userLocationState.coords,\n zoom: 16,\n });\n }\n }}\n onMouseDown={handleUserInteraction}\n onMove={handleMove}\n onTouchStart={handleUserInteraction}\n onWheel={handleUserInteraction}\n ref={mapRef}\n >\n {showUserLocation &&\n userLocationState.coords &&\n (renderUserLocation ? (\n renderUserLocation({\n coords: userLocationState.coords,\n heading: userLocationState.heading,\n })\n ) : (\n <UserLocationLayer\n forcedLocation={userLocationState.coords}\n heading={userLocationState.heading}\n />\n ))}\n\n {displayRoute && <RouteLayer geometry={displayRoute} />}\n\n {pois.length > 0 && (\n <>\n <POILayers pois={pois} />\n <POIMarkers onClick={onPoiClick} pois={pois} />\n </>\n )}\n {mapLibreChildren}\n </MapLibre>\n {showControls && mapControls && !mapControls.hasControls && (\n <MapControls\n drawerContentRef={drawerContentRef}\n enableTouchDrag={enableTouchDrag}\n etaData={showEtaData}\n initialViewState={initialViewState}\n isInternal={true}\n menuContent={menuContent || menuContentFromChildren}\n menuItems={resolvedMenuItems}\n {...controlProps}\n />\n )}\n </div>\n );\n};\n\nconst SDKMapProviderWrapper: React.FC<{ children: React.ReactNode }> = ({\n children,\n}) => {\n const context = useContext(MapControlsContext);\n if (context) {\n return <>{children}</>;\n }\n return <SDKMapProvider>{children}</SDKMapProvider>;\n};\n\nexport const Map: React.FC<MapProps> = (props) => {\n return (\n <SDKMapProviderWrapper>\n <MapProvider>\n <MapInternal {...props} />\n </MapProvider>\n </SDKMapProviderWrapper>\n );\n};\n","import type { POI } from \"@miniapps-sdk/components/Map/types\";\nimport { Layer, Source, useMap } from \"@vis.gl/react-maplibre\";\nimport type React from \"react\";\nimport { useEffect, useMemo, useState } from \"react\";\n\n/**\n * Utility to render an emoji to ImageData for use as a MapLibre icon\n */\nfunction createEmojiIcon(emoji: string, size = 64): ImageData {\n const canvas = document.createElement(\"canvas\");\n canvas.width = size;\n canvas.height = size;\n const ctx = canvas.getContext(\"2d\")!;\n ctx.font = `${size * 0.75}px serif`;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(emoji, size / 2, size / 2);\n return ctx.getImageData(0, 0, size, size);\n}\n\nexport const POILayers: React.FC<{\n pois: POI[];\n}> = ({ pois }) => {\n const [loadedImages, setLoadedImages] = useState<number>(0);\n const { current: map } = useMap();\n\n // Filter for GL-mode POIs - stable memoized list\n const glPois = useMemo(\n () => pois.filter((p) => !p.displayMode || p.displayMode === \"gl\"),\n [pois],\n );\n\n useEffect(() => {\n if (!map) return;\n const glMap = map.getMap();\n\n // Built-in default emoji icons\n const defaults = [\n { emoji: \"🍺\", name: \"sdk-default-bar\" },\n { emoji: \"🍽️\", name: \"sdk-default-restaurant\" },\n { emoji: \"📍\", name: \"sdk-default-poi\" },\n ];\n\n defaults.forEach((def) => {\n if (!glMap.hasImage(def.name)) {\n glMap.addImage(def.name, createEmojiIcon(def.emoji), { pixelRatio: 2 });\n }\n });\n\n // Handle custom image URLs and custom emojis\n let updates = 0;\n glPois.forEach((poi) => {\n // 1. Custom URL Image\n if (poi.imageUrl) {\n const name = `custom-url-${poi.id}`;\n if (!glMap.hasImage(name)) {\n (glMap.loadImage as any)(poi.imageUrl, (error: any, image: any) => {\n if (!error && image) {\n if (!glMap.hasImage(name)) {\n glMap.addImage(name, image);\n setLoadedImages((prev) => prev + 1);\n }\n }\n });\n }\n }\n\n // 2. Custom Emoji Icon\n if (poi.emoji) {\n const name = `custom-emoji-${poi.emoji}`;\n if (!glMap.hasImage(name)) {\n glMap.addImage(name, createEmojiIcon(poi.emoji), { pixelRatio: 2 });\n updates++;\n }\n }\n });\n\n if (updates > 0) {\n setLoadedImages((prev) => prev + updates);\n }\n }, [map, glPois]);\n\n const geojson: any = useMemo(\n () => ({\n features: glPois.map((poi) => ({\n geometry: {\n coordinates: [poi.longitude, poi.latitude],\n type: \"Point\" as const,\n },\n properties: {\n ...poi,\n // Selection logic for the icon in GL\n \"sdk-icon\": poi.imageUrl\n ? `custom-url-${poi.id}`\n : poi.spriteName\n ? poi.spriteName\n : poi.emoji\n ? `custom-emoji-${poi.emoji}`\n : poi.type === \"bar\"\n ? \"sdk-default-bar\"\n : poi.type === \"restaurant\"\n ? \"sdk-default-restaurant\"\n : \"sdk-default-poi\",\n },\n type: \"Feature\" as const,\n })),\n type: \"FeatureCollection\" as const,\n }),\n [glPois],\n );\n\n return (\n <Source data={geojson} id=\"sdk-pois\" type=\"geojson\">\n <Layer\n id=\"sdk-poi-layer\"\n layout={{\n \"icon-allow-overlap\": true,\n \"icon-image\": [\"get\", \"sdk-icon\"],\n \"icon-size\": 1,\n \"text-anchor\": \"top\",\n \"text-field\": [\n \"step\",\n [\"zoom\"],\n \"\", // Show nothing when zoomed out\n 14,\n [\"get\", \"name\"], // Show name when zoomed in\n ],\n \"text-font\": [\"Open Sans Bold\"],\n \"text-offset\": [0, 1.5],\n \"text-optional\": true,\n \"text-size\": 11,\n }}\n paint={{\n \"icon-opacity\": [\"interpolate\", [\"linear\"], [\"zoom\"], 11, 0, 12, 1],\n \"text-color\": \"#ffffff\",\n \"text-halo-color\": \"#000000\",\n \"text-halo-width\": 1,\n \"text-opacity\": [\"interpolate\", [\"linear\"], [\"zoom\"], 13.5, 0, 14, 1],\n }}\n type=\"symbol\"\n />\n </Source>\n );\n};\n","import type { POI } from \"@miniapps-sdk/components/Map/types\";\nimport { Marker } from \"@vis.gl/react-maplibre\";\nimport type React from \"react\";\n\nexport const POIMarkers: React.FC<{\n pois: POI[];\n onClick?: (poi: POI) => void;\n}> = ({ pois, onClick }) => {\n // Filter for Marker-mode POIs\n const markerPois = pois.filter((p) => p.displayMode === \"marker\");\n\n if (markerPois.length === 0) return null;\n\n return (\n <>\n {markerPois.map((poi) => (\n <Marker\n anchor=\"bottom\"\n key={poi.id}\n latitude={poi.latitude}\n longitude={poi.longitude}\n onClick={(e) => {\n e.originalEvent.stopPropagation();\n if (onClick) onClick(poi);\n }}\n >\n {poi.markerComponent ? (\n poi.markerComponent\n ) : (\n <div\n style={{\n cursor: \"pointer\",\n filter: \"drop-shadow(0 4px 6px rgba(0,0,0,0.1))\",\n transform: \"transition-transform duration-200 hover:scale-110\",\n }}\n >\n <div\n style={{\n alignItems: \"center\",\n backgroundColor: poi.type === \"bar\" ? \"#f97316\" : \"#10b981\",\n border: \"2px solid white\",\n borderRadius: \"50%\",\n display: \"flex\",\n height: \"32px\",\n justifyContent: \"center\",\n width: \"32px\",\n }}\n >\n {poi.emoji ? (\n <span style={{ fontSize: \"16px\" }}>{poi.emoji}</span>\n ) : (\n <div\n style={{\n backgroundColor: \"white\",\n borderRadius: \"50%\",\n height: \"8px\",\n width: \"8px\",\n }}\n ></div>\n )}\n </div>\n {/* Pin Tail */}\n <div\n style={{\n borderLeft: \"6px solid transparent\",\n borderRight: \"6px solid transparent\",\n borderTop: `8px solid ${poi.type === \"bar\" ? \"#f97316\" : \"#10b981\"}`,\n height: 0,\n margin: \"-2px auto 0\",\n width: 0,\n }}\n ></div>\n </div>\n )}\n </Marker>\n ))}\n </>\n );\n};\n","import { Marker } from \"@vis.gl/react-maplibre\";\nimport type React from \"react\";\n\nexport interface UserLocationLayerProps {\n /**\n * The location to display.\n */\n forcedLocation: [number, number] | null;\n /**\n * The user's heading (bearing) in degrees.\n */\n heading?: number | null;\n}\n\nexport const UserLocationLayer: React.FC<UserLocationLayerProps> = ({\n forcedLocation,\n heading,\n}) => {\n if (!forcedLocation) return null;\n\n return (\n <Marker\n anchor=\"center\"\n latitude={forcedLocation[1]}\n longitude={forcedLocation[0]}\n >\n <div\n style={{\n alignItems: \"center\",\n display: \"flex\",\n justifyContent: \"center\",\n position: \"relative\",\n }}\n >\n {/* Pulse Animation */}\n <div\n style={{\n animation: \"pulse 2s infinite\",\n backgroundColor: \"rgba(59, 130, 246, 0.4)\",\n borderRadius: \"50%\",\n height: \"40px\",\n position: \"absolute\",\n width: \"40px\",\n }}\n ></div>\n\n {/* Heading Indicator (Cone/Arrow) */}\n {heading !== undefined && heading !== null && (\n <div\n style={{\n height: \"60px\",\n position: \"absolute\",\n transform: `rotate(${heading}deg)`,\n width: \"60px\",\n zIndex: 0,\n }}\n >\n <svg\n style={{ height: \"100%\", width: \"100%\" }}\n viewBox=\"0 0 100 100\"\n >\n <defs>\n <radialGradient\n cx=\"50%\"\n cy=\"50%\"\n fx=\"50%\"\n fy=\"50%\"\n id=\"grad1\"\n r=\"50%\"\n >\n <stop\n offset=\"0%\"\n style={{\n stopColor: \"rgba(37, 99, 235, 0.6)\",\n stopOpacity: 1,\n }}\n />\n <stop\n offset=\"100%\"\n style={{\n stopColor: \"rgba(37, 99, 235, 0)\",\n stopOpacity: 0,\n }}\n />\n </radialGradient>\n </defs>\n {/* Visual Direction Cone */}\n <path\n d=\"M 50 50 L 35 0 A 50 50 0 0 1 65 0 Z\"\n fill=\"url(#grad1)\"\n />\n </svg>\n </div>\n )}\n\n {/* Main Blue Dot */}\n <div\n style={{\n alignItems: \"center\",\n backgroundColor: \"white\",\n borderRadius: \"50%\",\n boxShadow:\n \"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 0 0 2px rgba(37, 99, 235, 0.2)\",\n display: \"flex\",\n height: \"20px\",\n justifyContent: \"center\",\n width: \"20px\",\n zIndex: 1,\n }}\n >\n <div\n style={{\n backgroundColor: \"#2563eb\",\n border: \"2px solid white\",\n borderRadius: \"50%\",\n height: \"12px\",\n width: \"12px\",\n }}\n ></div>\n </div>\n <style>{`@keyframes pulse { 0% { transform: scale(0.95); opacity: 0.7; } 70% { transform: scale(1.5); opacity: 0; } 100% { transform: scale(0.95); opacity: 0; } }`}</style>\n </div>\n </Marker>\n );\n};\n","import { Map, type MapProps } from \"@miniapps-sdk/components/Map\";\nimport React from \"react\";\nimport { createRoot } from \"react-dom/client\";\n\n/**\n * Renders the Map component into a DOM element.\n * Useful for non-React environments (UMD/IIFE).\n *\n * @param containerId The ID of the HTML element where the map should be rendered.\n * @param props The props to pass to the Map component.\n * @returns The React root instance.\n */\nexport function renderMap(containerId: string, props: MapProps = {}) {\n const container = document.getElementById(containerId);\n if (!container) {\n throw new Error(`Container with id \"${containerId}\" not found.`);\n }\n\n const root = createRoot(container);\n root.render(React.createElement(Map, props));\n return root;\n}\n","import type { RouteRequest, RouteResponse } from \"@miniapps-sdk/types/routing\";\n\nexport interface RoutingBackendConfig {\n backend: \"osrm\" | \"valhalla\";\n baseUrl: string;\n}\n\n/**\n * Core routing service that can be used by both SDK (for direct fetching)\n * and Host (for handling bridge requests).\n */\nexport const RoutingService = {\n createErrorResponse(\n req: RouteRequest,\n code: NonNullable<RouteResponse[\"error\"]>[\"code\"],\n message: string,\n ): RouteResponse {\n return {\n error: { code, message },\n requestId: req.requestId,\n sdkVersion: req.sdkVersion,\n success: false,\n type: \"SDK_ROUTING_GETROUTE_RESPONSE\",\n };\n },\n\n decodePolyline(str: string, precision: number): [number, number][] {\n let index = 0,\n lat = 0,\n lng = 0;\n const coordinates: [number, number][] = [];\n const shift = 10 ** precision;\n\n while (index < str.length) {\n let b: any,\n shiftNum = 0,\n result = 0;\n do {\n b = str.charCodeAt(index++) - 63;\n result |= (b & 0x1f) << shiftNum;\n shiftNum += 5;\n } while (b >= 0x20);\n const dlat = result & 1 ? ~(result >> 1) : result >> 1;\n lat += dlat;\n\n shiftNum = 0;\n result = 0;\n do {\n b = str.charCodeAt(index++) - 63;\n result |= (b & 0x1f) << shiftNum;\n shiftNum += 5;\n } while (b >= 0x20);\n const dlng = result & 1 ? ~(result >> 1) : result >> 1;\n lng += dlng;\n\n coordinates.push([lng / shift, lat / shift]);\n }\n return coordinates;\n },\n\n async fetchOSRMRoute(\n req: RouteRequest,\n coords: [number, number][],\n profile: string,\n baseUrl: string,\n ): Promise<RouteResponse> {\n const coordsString = coords.map((c) => `${c[0]},${c[1]}`).join(\";\");\n const osrmProfile =\n profile === \"walking\" ? \"foot\" : profile === \"driving\" ? \"car\" : \"bike\";\n const url = `${baseUrl}/route/v1/${osrmProfile}/${coordsString}?overview=full&geometries=geojson&steps=true`;\n\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`OSRM Error: ${response.statusText}`);\n }\n const data = await response.json();\n\n if (data.code !== \"Ok\" || !data.routes || data.routes.length === 0) {\n throw new Error(\"NO_ROUTE\");\n }\n\n const route = data.routes[0];\n const steps =\n route.legs?.flatMap((leg: any) =>\n leg.steps?.map((step: any) => ({\n distance: step.distance,\n duration: step.duration,\n instruction: step.maneuver?.instruction || \"Continue\",\n })),\n ) || [];\n\n return {\n data: {\n distanceMeters: route.distance,\n durationSeconds: route.duration,\n geometry: route.geometry,\n steps,\n },\n requestId: req.requestId,\n sdkVersion: req.sdkVersion,\n success: true,\n type: \"SDK_ROUTING_GETROUTE_RESPONSE\",\n };\n },\n async fetchRoute(\n req: RouteRequest,\n config: RoutingBackendConfig,\n ): Promise<RouteResponse> {\n const { origin, destination, waypoints, profile, language } = req.payload;\n\n if (\n !this.isValidCoordinate(origin) ||\n !this.isValidCoordinate(destination)\n ) {\n return this.createErrorResponse(\n req,\n \"INVALID_INPUT\",\n \"Origin or destination coordinates are invalid.\",\n );\n }\n if (waypoints && !waypoints.every(this.isValidCoordinate)) {\n return this.createErrorResponse(\n req,\n \"INVALID_INPUT\",\n \"One or more waypoints are invalid.\",\n );\n }\n\n const allCoords = [origin, ...(waypoints || []), destination];\n\n try {\n if (config.backend === \"osrm\") {\n return await this.fetchOSRMRoute(\n req,\n allCoords,\n profile,\n config.baseUrl,\n );\n } else {\n return await this.fetchValhallaRoute(\n req,\n allCoords,\n profile,\n language,\n config.baseUrl,\n );\n }\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"NO_ROUTE\")) {\n return this.createErrorResponse(\n req,\n \"NO_ROUTE\",\n \"No route could be found for the given points.\",\n );\n }\n if (error instanceof TypeError) {\n return this.createErrorResponse(\n req,\n \"NETWORK_ERROR\",\n \"Failed to connect to the routing backend.\",\n );\n }\n return this.createErrorResponse(\n req,\n \"BACKEND_ERROR\",\n `Routing backend error: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n\n async fetchValhallaRoute(\n req: RouteRequest,\n coords: [number, number][],\n profile: string,\n language: string | undefined,\n baseUrl: string,\n ): Promise<RouteResponse> {\n const valhallaProfile =\n profile === \"driving\"\n ? \"auto\"\n : profile === \"walking\"\n ? \"pedestrian\"\n : \"bicycle\";\n const body = {\n costing: valhallaProfile,\n directions_options: {\n language: language || \"en-US\",\n },\n locations: coords.map((c) => ({ lat: c[1], lon: c[0] })),\n };\n\n const response = await fetch(`${baseUrl}/route`, {\n body: JSON.stringify(body),\n headers: { \"Content-Type\": \"application/json\" },\n method: \"POST\",\n });\n\n if (!response.ok) {\n throw new Error(`Valhalla Error: ${response.statusText}`);\n }\n const data = await response.json();\n\n if (!data.trip || !data.trip.legs || data.trip.legs.length === 0) {\n throw new Error(\"NO_ROUTE\");\n }\n\n const trip = data.trip;\n const decodedCoordinates = this.decodePolyline(trip.legs[0].shape, 6);\n\n const steps =\n trip.legs.flatMap((leg: any) =>\n leg.maneuvers?.map((maneuver: any) => ({\n distance: maneuver.length * 1000, // Valhalla returns km\n duration: maneuver.time,\n instruction: maneuver.instruction || \"Continue\",\n })),\n ) || [];\n\n return {\n data: {\n distanceMeters: trip.summary.length * 1000, // km to m\n durationSeconds: trip.summary.time,\n geometry: {\n coordinates: decodedCoordinates,\n type: \"LineString\",\n },\n steps,\n },\n requestId: req.requestId,\n sdkVersion: req.sdkVersion,\n success: true,\n type: \"SDK_ROUTING_GETROUTE_RESPONSE\",\n };\n },\n\n isValidCoordinate(coord: [number, number]): boolean {\n const [lng, lat] = coord;\n return lng >= -180 && lng <= 180 && lat >= -90 && lat <= 90;\n },\n};\n","{\n \"name\": \"@cloudparse/up-miniapps-sdk\",\n \"version\": \"0.2.6\",\n \"description\": \"UP Mini-App SDK for bridge communication between WebView and Host Shell\",\n \"author\": \"CloudParse Team\",\n \"license\": \"MIT\",\n \"type\": \"module\",\n \"engines\": {\n \"node\": \">=25.6.1\"\n },\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"browser\": \"./dist/index.browser.min.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\",\n \"default\": \"./dist/index.js\"\n },\n \"./host\": {\n \"types\": \"./dist/host.d.ts\",\n \"import\": \"./dist/host.js\",\n \"require\": \"./dist/host.cjs\",\n \"default\": \"./dist/host.js\"\n },\n \"./components/Map\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\",\n \"default\": \"./dist/index.js\"\n },\n \"./style.css\": \"./dist/style.css\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"files\": [\n \"dist\"\n ],\n \"scripts\": {\n \"build\": \"tsc --noEmit --project tsconfig.json && tsup && npm run build:css\",\n \"build:css\": \"npx postcss src/index.css -o dist/style.css\",\n \"prebuild\": \"npm run clean\",\n \"clean\": \"rm -rf dist\",\n \"format\": \"biome format --write . --max-diagnostics 10000 --diagnostic-level error\",\n \"lint\": \"biome lint . --max-diagnostics 10000 --diagnostic-level error\",\n \"lint.fix\": \"biome check --write . --max-diagnostics 10000 --diagnostic-level error\",\n \"prepack\": \"npm run build\",\n \"storybook\": \"storybook dev -p 6006\",\n \"build-storybook\": \"storybook build\"\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"^2.5.1\",\n \"@chromatic-com/storybook\": \"^5.2.1\",\n \"@mapbox/maki\": \"^8.2.0\",\n \"@storybook/addon-a11y\": \"^10.4.6\",\n \"@storybook/addon-docs\": \"^10.4.6\",\n \"@storybook/addon-mcp\": \"^0.6.0\",\n \"@storybook/addon-vitest\": \"^10.4.6\",\n \"@storybook/react-vite\": \"^10.4.6\",\n \"@tailwindcss/postcss\": \"^4.3.2\",\n \"@types/geojson\": \"^7946.0.16\",\n \"@types/react\": \"^19.2.17\",\n \"@types/react-dom\": \"^19.2.3\",\n \"@vitest/browser-playwright\": \"^4.1.9\",\n \"@vitest/coverage-v8\": \"^4.1.9\",\n \"autoprefixer\": \"^10.5.2\",\n \"playwright\": \"^1.61.1\",\n \"postcss\": \"^8.5.16\",\n \"postcss-cli\": \"^11.0.1\",\n \"storybook\": \"^10.4.6\",\n \"tailwindcss\": \"^4.3.2\",\n \"tsc-alias\": \"^1.8.8\",\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^4.1.9\"\n },\n \"dependencies\": {\n \"@radix-ui/react-dialog\": \"^1.1.17\",\n \"@radix-ui/react-slot\": \"^1.3.0\",\n \"@vis.gl/react-maplibre\": \"^8.1.1\",\n \"class-variance-authority\": \"^0.7.1\",\n \"clsx\": \"^2.1.1\",\n \"lucide-react\": \"^1.22.0\",\n \"maplibre-gl\": \"^5.24.0\",\n \"react\": \"^19.2.7\",\n \"react-dom\": \"^19.2.7\",\n \"shadcn\": \"^4.12.0\",\n \"tailwind-merge\": \"^3.6.0\"\n }\n}\n","import { Bridge } from \"@miniapps-sdk/bridge\";\nimport { renderMap } from \"@miniapps-sdk/components/MapWrapper\";\nimport type { RoutingBackendConfig } from \"@miniapps-sdk/services/routingService\";\nimport { RoutingService } from \"@miniapps-sdk/services/routingService\";\nimport type {\n HapticStyleType,\n IFidelityBalance,\n IFidelityHistoryParams,\n IFidelityTransaction,\n IInitializationOptions,\n IInitializationResponse,\n ILocationData,\n INetworkOptions,\n INetworkResponse,\n IPaymentRequest,\n IUserProfile,\n RouteRequest,\n RouteResponse,\n ScrollConfig,\n SDKEvent,\n} from \"@miniapps-sdk/types\";\nimport { version } from \"../package.json\";\n\n// ... deepFreeze function omitted ...\nfunction deepFreeze<T extends object>(obj: T): T {\n // Retrieve the property names defined on obj\n const propNames = Object.getOwnPropertyNames(obj);\n\n // Freeze properties before freezing self\n for (const name of propNames) {\n const value = (obj as Record<string, unknown>)[name];\n\n if (\n value &&\n typeof value === \"object\" &&\n !Object.isFrozen(value) &&\n // Skip freezing of native objects or circular refs if any (though not expected here)\n !(value instanceof Bridge)\n ) {\n deepFreeze(value as object);\n }\n }\n\n return Object.freeze(obj);\n}\n\n/**\n * Main SDK for UP Mini-Apps.\n * Provides access to native device features, storage, identity, and shell UI.\n */\nlet globalRoutingConfig: RoutingBackendConfig | null = null;\n\nexport class MiniAppSDK {\n /**\n * Map services.\n * Provides access to MapLibre-based mapping components.\n */\n public readonly maps = Object.freeze({\n /**\n * Renders a MapLibre map into a DOM element.\n * Useful for non-React environments.\n */\n render: renderMap,\n });\n private bridge: Bridge;\n /**\n * Local SQLite Storage.\n * Data is persisted on the device and is isolated per Mini-App.\n */\n public readonly storage = Object.freeze({\n /** Retrieves a value by key. */\n get: (key: string): Promise<string | null> =>\n this.bridge.send(\"STORAGE_GET\", { key }),\n /** Retrieves all key-value pairs stored for this Mini-App. */\n getAll: (): Promise<Record<string, string>> =>\n this.bridge.send(\"STORAGE_GET_ALL\"),\n /** Sets a value for a specific key. */\n set: (key: string, value: string): Promise<void> =>\n this.bridge.send(\"STORAGE_SET\", { key, value }),\n });\n /**\n * Hardware-level Secure Storage.\n * Data is stored in the device's secure enclave (Keychain/Keystore) and is isolated per Mini-App.\n */\n public readonly secureStore = Object.freeze({\n /** Retrieves a value by key from secure storage. */\n get: (key: string): Promise<string | null> =>\n this.bridge.send(\"SECURE_GET\", { key }),\n /** Sets a value for a specific key in secure storage. */\n set: (key: string, value: string): Promise<void> =>\n this.bridge.send(\"SECURE_SET\", { key, value }),\n });\n /**\n * Database Storage.\n * Access to user-app specific persistent database storage.\n */\n public readonly database = Object.freeze({\n /** Retrieves the user data stored in the backend database. */\n getUserData: <T = unknown>(): Promise<T> =>\n this.bridge.send<T>(\"DATABASE_GET_USER_DATA\"),\n /** Updates the user data stored in the backend database. */\n setUserData: <T = unknown>(data: T): Promise<void> =>\n this.bridge.send<void>(\"DATABASE_SET_USER_DATA\", { data }),\n });\n /**\n * Device Location services.\n */\n public readonly location = Object.freeze({\n /**\n * Retrieves the current GPS position of the device.\n */\n getCurrentPosition: (): Promise<ILocationData> =>\n this.bridge.send(\"GET_CURRENT_POSITION\"),\n /**\n * Starts the continuous location and sensor stream.\n * @param config Optional configuration for thresholds and intervals.\n */\n startStream: (\n config?: import(\"./types\").LocationStreamConfig,\n ): Promise<void> => this.bridge.send(\"START_LOCATION_STREAM\", config),\n /**\n * Stops the continuous location and sensor stream.\n */\n stopStream: (): Promise<void> => this.bridge.send(\"STOP_LOCATION_STREAM\"),\n });\n /**\n * Identity & Profile management.\n */\n public readonly user = Object.freeze({\n /**\n * Fetch user profile data.\n * @param fields Optional list of specific fields to retrieve (e.g., ['fullName', 'username']).\n */\n getProfile: <T extends keyof IUserProfile>(\n fields?: T[],\n ): Promise<Partial<IUserProfile>> =>\n this.bridge.send(\"GET_USER_PROFILE\", { fields }),\n /**\n * Fetch profile picture as a string of the current user, or a map of profile pictures from a list of user UUIDs.\n * @param uuids Optional list of user UUIDs.\n */\n getProfilePicture: ((uuids?: string[]) => {\n return this.bridge.send(\"GET_PROFILE_PICTURE\", { uuids: uuids || [] });\n }) as {\n (): Promise<string>;\n (uuids: string[]): Promise<Record<string, string>>;\n },\n });\n /**\n * Explicit Permission Management.\n * Allows requesting access to sensitive device features or user data.\n */\n public readonly permission = Object.freeze({\n /**\n * Explicitly request access to sensitive data.\n * @param type The type of permission to request ('location' or 'profile').\n * @param fields If requesting 'profile', the specific fields required.\n */\n request: ((type: \"location\" | \"profile\", fields?: string[]) => {\n return this.bridge.send(\"REQUEST_PERMISSION\", { fields, type });\n }) as {\n (type: \"location\"): Promise<boolean>;\n (type: \"profile\", fields: (keyof IUserProfile)[]): Promise<boolean>;\n },\n });\n /**\n * Payments integration.\n */\n public readonly payment = Object.freeze({\n /**\n * Triggers the native payment flow.\n * @param payload Amount, currency, and itemized list for the payment.\n */\n request: (\n payload: IPaymentRequest,\n ): Promise<{ success: true; transactionId: string }> =>\n this.bridge.send(\"PAYMENT_REQUEST\", payload),\n });\n /**\n * Live Activities & Notifications.\n * Allows the Mini-App to display real-time updates in the host shell.\n */\n public readonly activity = Object.freeze({\n /**\n * Starts a new live activity.\n * @param id Unique identifier for the activity.\n * @param title Display title for the activity.\n * @param status Initial status message.\n */\n start: (id: string, title: string, status: string): Promise<void> =>\n this.bridge.send(\"START_ACTIVITY\", { id, status, title }),\n });\n /**\n * Haptic feedback.\n */\n public readonly haptic = Object.freeze({\n /**\n * Triggers a haptic vibration on the device.\n * @param style The style of haptic feedback (e.g., 'light', 'medium', 'heavy', 'success', 'warning', 'error').\n */\n trigger: (style: HapticStyleType): Promise<void> =>\n this.bridge.send(\"TRIGGER_HAPTIC\", { style }),\n });\n /**\n * Network Proxy.\n * Allows the Mini-App to make network requests through the host shell to bypass CORS or use host-level authentication.\n */\n public readonly network = Object.freeze({\n /**\n * Performs a network request via the host shell.\n * @param options Request method, URL, headers, and body.\n */\n request: async <T = unknown>(\n options: INetworkOptions,\n ): Promise<INetworkResponse<T>> => {\n return this.bridge.send(\"NETWORK_REQUEST\", options);\n },\n });\n /**\n * Navigation and Journey controls.\n * Allows programmatically starting itineraries and managing navigation state.\n */\n public readonly navigation = Object.freeze({\n /**\n * Aborts the current navigation journey.\n */\n abort: (): void => {\n this.bridge.handleNativeMessage({\n eventName: \"SDK_NAVIGATION_ABORT\",\n type: \"EVENT\",\n });\n },\n /**\n * Creates a new itinerary preview.\n * @param options Destination and routing options.\n */\n createJourney: (options: {\n destination: [number, number];\n origin?: [number, number];\n profile?: \"driving\" | \"cycling\" | \"walking\";\n }): void => {\n this.bridge.handleNativeMessage({\n eventName: \"SDK_NAVIGATION_CREATE\",\n payload: { ...options, mode: \"preview\" },\n type: \"EVENT\",\n });\n },\n /**\n * Starts the active navigation (active guidance).\n */\n start: (): void => {\n this.bridge.handleNativeMessage({\n eventName: \"SDK_NAVIGATION_START\",\n type: \"EVENT\",\n });\n },\n });\n /**\n * Fidelity & Rewards program integration.\n */\n public readonly fidelity = Object.freeze({\n /** Returns current fidelity balance. */\n getFidelityBalance: (): Promise<IFidelityBalance> =>\n this.bridge.send(\"GET_FIDELITY_BALANCE\"),\n /**\n * Retrieves fidelity transaction history.\n * @param params Filtering and pagination parameters.\n */\n getFidelityHistory: (\n params?: IFidelityHistoryParams,\n ): Promise<IFidelityTransaction[]> =>\n this.bridge.send(\"GET_FIDELITY_HISTORY\", params),\n /**\n * Triggers the native fidelity history view.\n */\n showHistory: (): Promise<void> => this.bridge.send(\"SHOW_FIDELITY_HISTORY\"),\n /**\n * Authorize spending fidelity points (FPoints) via Two-Phase Authorization.\n * @param intentUuid UUID generated by your backend for the transaction.\n */\n spendFPoints: (\n intentUuid: string,\n ): Promise<{ success: boolean; transactionId: string }> =>\n this.bridge.send(\"SPEND_FPOINTS\", { intentUuid }),\n });\n /**\n * UI and Navigation controls.\n */\n public readonly ui = Object.freeze({\n /** Closes the Mini-App and returns to the host shell. */\n exit: (): Promise<void> => this.bridge.send(\"EXIT\"),\n /**\n * Configures native scroll behaviors like Pull-to-Refresh and Infinite Scroll.\n * @param config Scroll configuration for top/bottom detection.\n */\n setScrollConfig: (config: ScrollConfig): Promise<void> =>\n this.bridge.send(\"SET_SCROLL_CONFIG\", config),\n });\n /**\n * Debug controls\n */\n public readonly debug = Object.freeze({\n /**\n * Log to the shell app\n * @param message\n */\n log: (...message: unknown[]) => this.bridge.send(\"DEBUG_LOG\", { message }),\n });\n /**\n * Routing integration (OSRM / Valhalla).\n * Provides access to route calculation and rendering on the host map.\n */\n public readonly routing = Object.freeze({\n /**\n * Clears the currently rendered route.\n */\n clearRoute: (): Promise<void> => {\n const requestId = crypto.randomUUID\n ? crypto.randomUUID()\n : Math.random().toString(36).substring(2);\n return this.bridge.send(\"SDK_ROUTING_CLEARROUTE\", {\n requestId,\n sdkVersion: version,\n });\n },\n\n /**\n * Draws the calculated route on the host map.\n * @param routeData The route data returned by getRoute.\n */\n drawRoute: (\n routeData: NonNullable<RouteResponse[\"data\"]>,\n ): Promise<void> => {\n const requestId = crypto.randomUUID\n ? crypto.randomUUID()\n : Math.random().toString(36).substring(2);\n return this.bridge.send(\"SDK_ROUTING_DRAWROUTE\", {\n payload: { routeData },\n requestId,\n sdkVersion: version,\n });\n },\n /**\n * Calculates a route between points.\n * @param payload Request payload containing origin, destination, and options.\n */\n getRoute: async (\n payload: RouteRequest[\"payload\"],\n ): Promise<NonNullable<RouteResponse[\"data\"]>> => {\n // Create a unique requestId\n const requestId = crypto.randomUUID\n ? crypto.randomUUID()\n : Math.random().toString(36).substring(2);\n\n const request: RouteRequest = {\n payload,\n requestId,\n sdkVersion: version,\n type: \"SDK_ROUTING_GETROUTE\",\n };\n\n // If a direct backend is configured, bypass the bridge\n if (globalRoutingConfig) {\n const response = await RoutingService.fetchRoute(\n request,\n globalRoutingConfig,\n );\n if (response.success && response.data) {\n return response.data;\n }\n throw new Error(response.error?.message || \"Routing failed\");\n }\n\n // Otherwise, use the bridge\n return this.bridge.send(\"SDK_ROUTING_GETROUTE\", {\n payload,\n requestId,\n sdkVersion: version,\n });\n },\n });\n\n constructor() {\n this.bridge = new Bridge();\n\n // Bind methods to this instance to preserve context if pulled out\n this.initialize = this.initialize.bind(this);\n this.on = this.on.bind(this);\n this.off = this.off.bind(this);\n }\n\n /**\n * Configures global SDK settings.\n */\n public config(options: { routingBackend?: RoutingBackendConfig }): void {\n if (options.routingBackend) {\n globalRoutingConfig = options.routingBackend;\n }\n }\n\n /**\n * Updates the global context shared between the Mini-App and the native shell.\n * Useful for synchronizing state like theme preferences, UI flags, or custom app-specific context.\n * @param context Partial context object to merge into the existing shell context.\n */\n public updateContext(context: Record<string, unknown>): Promise<void> {\n return this.bridge.send(\"UPDATE_CONTEXT\", context);\n }\n\n /**\n * The starting point for the Mini-App. Must be called before any other SDK methods.\n * @param options The options to provide to the shell app\n */\n public initialize(\n options: IInitializationOptions,\n ): Promise<IInitializationResponse> {\n return this.bridge.send(\"INITIALIZE\", options);\n }\n\n /**\n * Registers a callback for a specific event from the native shell.\n * @param event The name of the event to listen for.\n * @param callback The function to execute when the event is triggered.\n * @returns A function to unregister the listener.\n */\n public on<T = unknown>(\n event: SDKEvent,\n callback: (data: T) => void,\n ): () => void {\n return this.bridge.on<T>(event as string, callback);\n }\n\n /**\n * Unregisters a previously registered event listener.\n * @param event The name of the event.\n * @param callback The callback function to remove.\n */\n public off<T = unknown>(event: SDKEvent, callback: (data: T) => void): void {\n this.bridge.off<T>(event as string, callback);\n }\n}\n\n/**\n * Singleton instance of the MiniAppSDK.\n * Frozen to prevent tampering.\n */\nexport const sdk = deepFreeze(new MiniAppSDK());\n","import { Button } from \"@miniapps-sdk/components/ui/button\";\nimport { sdk } from \"@miniapps-sdk/sdk\";\nimport { GeolocationEvent } from \"@miniapps-sdk/types\";\nimport type React from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport interface BridgeMockerProps {\n /** Optional appId to return in INITIALIZE response */\n appId?: string;\n /** Initial simulated location [lng, lat] */\n initialLocation?: [number, number];\n /** Whether the simulated user should be moving */\n isMoving?: boolean;\n /** An array of coordinates to follow. If provided, overrides random movement. */\n simulationPath?: [number, number][];\n /** Speed multiplier for the simulation interval. Default is 1. Higher is faster. */\n simulationSpeed?: number;\n /** Mock JWT token for NETWORK_REQUEST mocking */\n mockJWTToken?: string;\n children: React.ReactNode;\n}\n\n/**\n * Calculates bearing between two points\n */\nconst getBearing = (p1: [number, number], p2: [number, number]) => {\n const lat1 = (p1[1] * Math.PI) / 180;\n const lat2 = (p2[1] * Math.PI) / 180;\n const dLon = ((p2[0] - p1[0]) * Math.PI) / 180;\n const y = Math.sin(dLon) * Math.cos(lat2);\n const x =\n Math.cos(lat1) * Math.sin(lat2) -\n Math.sin(lat1) * Math.cos(lat2) * Math.cos(dLon);\n return ((Math.atan2(y, x) * 180) / Math.PI + 360) % 360;\n};\n\n/**\n * A utility component for Storybook that intercepts SDK bridge calls,\n * simulates the behavior of the native shell app.\n *\n * NOTE: Logs are now handled by the standalone DebugConsole component.\n */\nexport const BridgeMocker: React.FC<BridgeMockerProps> = ({\n appId,\n initialLocation = [6.1258, 45.9058], // Annecy default\n isMoving = false,\n simulationPath,\n simulationSpeed = 1,\n mockJWTToken,\n children,\n}) => {\n const [autoMove, setAutoMove] = useState(isMoving);\n const [location, setLocation] = useState<[number, number]>(initialLocation);\n const [heading, setHeading] = useState<number>(0);\n const [speedMultiplier, setSpeedMultiplier] = useState(simulationSpeed);\n const [isReady, setIsReady] = useState(false);\n const [isMinimized, setIsMinimized] = useState(true);\n\n const streamIntervalRef = useRef<any | null>(null);\n const pathIndexRef = useRef<number>(0);\n const activeConfigRef = useRef<any>(null); // Keep track of the last START_LOCATION_STREAM config\n\n // Refs for interval to read latest state without rebinding\n const stateRef = useRef({\n autoMove,\n heading,\n location,\n mockJWTToken,\n pushLocationUpdate: () => {},\n setHeading,\n setLocation,\n simulationPath,\n speedMultiplier,\n });\n\n const pushLocationUpdate = useCallback(() => {\n const currentState = stateRef.current;\n const payload = {\n accelerometer: null,\n heading: {\n accuracy: 3,\n magneticHeading: currentState.heading,\n trueHeading: currentState.heading,\n },\n location: {\n coords: {\n accuracy: 10,\n altitude: 0,\n altitudeAccuracy: null,\n heading: currentState.heading,\n latitude: currentState.location[1],\n longitude: currentState.location[0],\n speed: currentState.autoMove ? 1.5 * currentState.speedMultiplier : 0,\n },\n timestamp: Date.now(),\n },\n timestamp: Date.now(),\n };\n\n (window as any).__MiniAppBridge?.onNativeMessage({\n eventName: GeolocationEvent.LOCATION_STREAM_UPDATE,\n payload,\n type: \"EVENT\",\n });\n }, []);\n\n useEffect(() => {\n stateRef.current = {\n autoMove,\n heading,\n location,\n mockJWTToken,\n pushLocationUpdate,\n setHeading,\n setLocation,\n simulationPath,\n speedMultiplier,\n };\n }, [\n location,\n heading,\n autoMove,\n pushLocationUpdate,\n simulationPath,\n speedMultiplier,\n mockJWTToken,\n ]);\n\n // Sync prop changes\n useEffect(() => {\n setAutoMove(isMoving);\n }, [isMoving]);\n\n useEffect(() => {\n setSpeedMultiplier(simulationSpeed);\n }, [simulationSpeed]);\n\n // Reset path index if path changes\n useEffect(() => {\n if (simulationPath && simulationPath.length > 0) {\n pathIndexRef.current = 0;\n setLocation(simulationPath[0]); // Snap to start of new path\n }\n }, [simulationPath]);\n\n // Handle dynamic interval restart when speed changes\n // biome-ignore lint/correctness/useExhaustiveDependencies: We intentionally only want to re-trigger when speedMultiplier changes, not on every config change\n useEffect(() => {\n if (streamIntervalRef.current && activeConfigRef.current) {\n // Re-trigger startStream to apply new speed\n (sdk as any).bridge.send(\n \"START_LOCATION_STREAM\",\n activeConfigRef.current,\n );\n }\n }, [speedMultiplier]);\n\n // Setup interception synchronously before children render\n useEffect(() => {\n const bridge = (sdk as any).bridge;\n const originalSend = bridge.send.bind(bridge);\n\n const stopStream = () => {\n if (streamIntervalRef.current) {\n clearInterval(streamIntervalRef.current);\n streamIntervalRef.current = null;\n }\n activeConfigRef.current = null;\n };\n\n const startStream = (config?: any) => {\n stopStream();\n activeConfigRef.current = config || {};\n\n const baseInterval = config?.interval || 500;\n const interval = Math.max(\n 10,\n baseInterval / stateRef.current.speedMultiplier,\n );\n\n streamIntervalRef.current = setInterval(() => {\n const state = stateRef.current;\n\n if (state.autoMove) {\n if (state.simulationPath && state.simulationPath.length > 0) {\n // Path following logic\n if (pathIndexRef.current < state.simulationPath.length - 1) {\n const currentPoint = state.simulationPath[pathIndexRef.current];\n const nextPoint = state.simulationPath[pathIndexRef.current + 1];\n\n pathIndexRef.current += 1;\n const newHeading = getBearing(currentPoint, nextPoint);\n\n state.setHeading(newHeading);\n state.setLocation(nextPoint);\n } else {\n // Reached end of path\n state.setLocation(\n state.simulationPath[state.simulationPath.length - 1],\n );\n }\n } else {\n // Random drift\n state.setLocation((prev) => [\n prev[0] + (Math.random() - 0.5) * 0.0001,\n prev[1] + (Math.random() - 0.5) * 0.0001,\n ]);\n }\n }\n\n state.pushLocationUpdate();\n }, interval);\n };\n\n const simulateNetworkRequest = async (payload: any) => {\n const {\n url,\n method = \"GET\",\n headers: incomingHeaders = {},\n body,\n } = payload;\n const state = stateRef.current;\n\n const headers = new Headers(incomingHeaders);\n\n if (state.mockJWTToken) {\n headers.set(\n \"Authorization\",\n `Bearer ${state.mockJWTToken.replace(\"Bearer \", \"\")}`,\n );\n }\n\n if (body && typeof body === \"object\" && !headers.has(\"Content-Type\")) {\n headers.set(\"Content-Type\", \"application/json\");\n }\n\n try {\n const response = await fetch(url, {\n body: body\n ? typeof body === \"string\"\n ? body\n : JSON.stringify(body)\n : undefined,\n headers,\n method,\n });\n\n const contentType = response.headers.get(\"content-type\");\n let responseData: any;\n\n if (contentType?.includes(\"application/json\")) {\n responseData = await response.json();\n } else {\n responseData = await response.text();\n }\n\n const headersObj: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n headersObj[key] = value;\n });\n\n return {\n data: responseData,\n headers: headersObj,\n status: response.status,\n statusText: response.statusText,\n };\n } catch (error: any) {\n throw {\n error: error.message || \"Network request failed\",\n status: 0,\n };\n }\n };\n\n // Intercept bridge calls globally\n bridge.send = async (type: string, payload: any) => {\n // 1. Mandatory Lifecycle\n if (type === \"INITIALIZE\") {\n return Promise.resolve({\n appId, // Legacy support\n context: { theme: \"dark\" }, // Legacy support\n description: \"Mocked for Dev\",\n env: {},\n insets: { bottom: 0, left: 0, right: 0, top: 0 },\n name: \"Vite Dev (Mock)\",\n params: {},\n profile: {\n admin: true,\n countryCode: \"FR\",\n createdAt: new Date().toISOString(),\n email: \"caveman@up.app\",\n firstName: \"Smart\",\n fullName: \"Smart Caveman\",\n lastName: \"Caveman\",\n localNumber: \"0600000000\",\n ups: 100,\n username: \"smart_caveman\",\n uuid: \"mock-user-42\",\n xp: 500,\n },\n success: true,\n userData: {},\n uuid: appId || \"mock-app-id\",\n version: \"1.0.0\",\n });\n }\n\n // 2. Location\n if (type === \"GET_CURRENT_POSITION\") {\n const state = stateRef.current;\n return Promise.resolve({\n coords: {\n accuracy: 10,\n altitude: 0,\n altitudeAccuracy: 0,\n heading: state.heading,\n latitude: state.location[1],\n longitude: state.location[0],\n speed: state.autoMove ? 1.5 * state.speedMultiplier : 0,\n },\n timestamp: Date.now(),\n });\n }\n if (type === \"START_LOCATION_STREAM\") {\n startStream(payload);\n return Promise.resolve();\n }\n if (type === \"STOP_LOCATION_STREAM\") {\n stopStream();\n return Promise.resolve();\n }\n\n // 3. Network\n if (type === \"NETWORK_REQUEST\") {\n return simulateNetworkRequest(payload);\n }\n\n // 4. Storage & Identity Mocks\n if (type === \"STORAGE_GET\" || type === \"SECURE_GET\") {\n return Promise.resolve(localStorage.getItem(`mock_sdk_${payload.key}`));\n }\n if (type === \"STORAGE_SET\" || type === \"SECURE_SET\") {\n localStorage.setItem(`mock_sdk_${payload.key}`, payload.value);\n return Promise.resolve();\n }\n if (type === \"GET_USER_PROFILE\") {\n return Promise.resolve({\n admin: true,\n countryCode: \"FR\",\n createdAt: new Date().toISOString(),\n email: \"caveman@up.app\",\n firstName: \"Smart\",\n fullName: \"Smart Caveman\",\n lastName: \"Caveman\",\n localNumber: \"0600000000\",\n ups: 100,\n username: \"smart_caveman\",\n uuid: \"mock-user-42\",\n xp: 500,\n });\n }\n if (type === \"GET_PROFILE_PICTURE\") {\n const uuids = payload?.uuids || [];\n if (uuids.length === 0) {\n return Promise.resolve(\n `https://api.dicebear.com/9.x/rings/png?seed=dummy`,\n );\n }\n const map: Record<string, string> = {};\n for (const uuid of uuids) {\n map[uuid] = `https://api.dicebear.com/9.x/rings/png?seed=${uuid}`;\n }\n return Promise.resolve(map);\n }\n\n // 5. Fidelity & Payment Mocks\n if (type === \"GET_FIDELITY_BALANCE\") {\n return Promise.resolve({ balance: 1337, currency: \"FPoints\" });\n }\n if (type === \"PAYMENT_REQUEST\") {\n return Promise.resolve({\n success: true,\n transactionId: `tx_${Math.random().toString(36).slice(2)}`,\n });\n }\n\n // 6. UI & Haptic (No-ops)\n if (\n type === \"TRIGGER_HAPTIC\" ||\n type === \"EXIT\" ||\n type === \"UPDATE_CONTEXT\"\n ) {\n return Promise.resolve({ success: true });\n }\n\n return originalSend(type, payload);\n };\n\n setIsReady(true);\n\n return () => {\n stopStream();\n bridge.send = originalSend;\n };\n }, [appId]);\n\n if (!isReady) return null;\n\n return (\n <div className=\"relative w-full h-full\">\n {/* Wrapped Story */}\n <div className=\"w-full h-full\">{children}</div>\n\n {isMinimized ? (\n <Button\n className=\"fixed bottom-4 right-4 w-8 h-8 rounded-full bg-slate-900/60 backdrop-blur-sm border border-slate-700/50 flex items-center justify-center text-slate-400 hover:text-blue-400 hover:bg-slate-900/80 z-[9999] transition-all shadow-lg group p-0!\"\n onClick={() => setIsMinimized(false)}\n title=\"Open Simulation Controls\"\n type=\"button\"\n variant=\"ghost\"\n >\n <svg\n className=\"group-hover:scale-110 transition-transform\"\n fill=\"none\"\n height=\"14\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n width=\"14\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M21 4H3\" />\n <path d=\"M10 8H3\" />\n <path d=\"M21 12H3\" />\n <path d=\"M10 16H3\" />\n <path d=\"M21 20H3\" />\n <circle cx=\"14\" cy=\"8\" r=\"2\" />\n <circle cx=\"14\" cy=\"16\" r=\"2\" />\n </svg>\n </Button>\n ) : (\n <div\n className=\"fixed bottom-4 right-4 bg-slate-900 text-slate-300 font-mono text-xs rounded-xl shadow-2xl border border-slate-700 pointer-events-auto flex flex-col w-80 overflow-hidden animate-in slide-in-from-right duration-300\"\n style={{ zIndex: 9998 }}\n >\n {/* Header */}\n <div\n className=\"flex justify-between items-center p-3 border-b border-slate-800 cursor-pointer bg-slate-800/50 hover:bg-slate-800 transition-colors\"\n onClick={() => setIsMinimized(true)}\n >\n <span className=\"font-bold text-slate-100 flex items-center gap-2\">\n <span className=\"text-lg\">🛠️</span> Simulation Controls\n </span>\n <Button\n className=\"text-slate-500 hover:text-white p-0 h-auto hover:bg-transparent cursor-pointer\"\n type=\"button\"\n variant=\"ghost\"\n >\n ▼\n </Button>\n </div>\n\n <div className=\"p-4 flex flex-col gap-3\">\n <div className=\"flex justify-between items-center\">\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n checked={autoMove}\n className=\"accent-blue-500 w-4 h-4\"\n onChange={(e) => setAutoMove(e.target.checked)}\n type=\"checkbox\"\n />\n <span className=\"text-slate-200 font-bold\">\n Auto-Move {simulationPath ? \"(Path)\" : \"(Random)\"}\n </span>\n </label>\n\n <div className=\"flex items-center gap-2\">\n <span className=\"text-[10px] text-slate-500\">Speed:</span>\n <select\n className=\"bg-slate-800 border border-slate-700 rounded px-1 py-0.5 text-white focus:outline-none focus:border-blue-500 text-[10px]\"\n onChange={(e) => setSpeedMultiplier(Number(e.target.value))}\n value={speedMultiplier}\n >\n {[1, 2, 5, 10, 50, 100, 250].map((s) => (\n <option key={s} value={s}>\n {s}x\n </option>\n ))}\n </select>\n </div>\n </div>\n\n <div className=\"grid grid-cols-2 gap-2\">\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[10px] text-slate-500 text-left\">\n Lng\n </span>\n <input\n className=\"bg-slate-800 border border-slate-700 rounded px-2 py-1 text-white focus:outline-none focus:border-blue-500\"\n onChange={(e) => {\n const lng = parseFloat(e.target.value) || 0;\n setLocation([lng, location[1]]);\n pushLocationUpdate();\n }}\n step=\"0.001\"\n type=\"number\"\n value={location[0]}\n />\n </div>\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[10px] text-slate-500 text-left\">\n Lat\n </span>\n <input\n className=\"bg-slate-800 border border-slate-700 rounded px-2 py-1 text-white focus:outline-none focus:border-blue-500\"\n onChange={(e) => {\n const lat = parseFloat(e.target.value) || 0;\n setLocation([location[0], lat]);\n pushLocationUpdate();\n }}\n step=\"0.001\"\n type=\"number\"\n value={location[1]}\n />\n </div>\n <div className=\"flex flex-col gap-1 col-span-2\">\n <span className=\"text-[10px] text-slate-500\">\n Heading (Degrees)\n </span>\n <input\n className=\"w-full accent-blue-500\"\n max=\"360\"\n min=\"0\"\n onChange={(e) => {\n setHeading(parseInt(e.target.value, 10));\n pushLocationUpdate();\n }}\n type=\"range\"\n value={heading}\n />\n <div className=\"text-right text-slate-400\">{heading}°</div>\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n};\n","import { Button } from \"@miniapps-sdk/components/ui/button\";\nimport { sdk } from \"@miniapps-sdk/sdk\";\nimport { GeolocationEvent } from \"@miniapps-sdk/types\";\nimport type React from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport interface DebugConsoleProps {\n /**\n * Whether to show the console initially.\n * Can also be controlled via the 'debug' prop on SDKProvider.\n */\n isOpen?: boolean;\n /**\n * Optional callback when the console is closed.\n */\n onClose?: () => void;\n}\n\ninterface LogEntry {\n id: string;\n time: string;\n label: string;\n content: string;\n}\n\n/**\n * A standalone debug console that intercepts and displays all Bridge communication.\n * Useful for debugging both in mock mode (BridgeMocker) and on real devices.\n */\nexport const DebugConsole: React.FC<DebugConsoleProps> = ({\n isOpen: initialOpen = false,\n onClose,\n}) => {\n const [showConsole, setShowConsole] = useState(initialOpen);\n const [logs, setLogs] = useState<LogEntry[]>([]);\n const scrollRef = useRef<HTMLDivElement>(null);\n\n // Sync with prop\n useEffect(() => {\n setShowConsole(initialOpen);\n }, [initialOpen]);\n\n const clearLogs = () => setLogs([]);\n\n const addLog = useCallback((label: string, data: any) => {\n // Skip location stream updates as they are too noisy\n if (label.includes(GeolocationEvent.LOCATION_STREAM_UPDATE)) return;\n\n const entry: LogEntry = {\n content: typeof data === \"string\" ? data : JSON.stringify(data, null, 2),\n id: Math.random().toString(36).slice(2),\n label,\n time: new Date().toLocaleTimeString(),\n };\n\n setLogs((prev) => [entry, ...prev].slice(0, 100));\n }, []);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n // 1. Intercept OUTGOING calls (SDK -> Shell)\n const bridge = (sdk as any).bridge;\n const originalSend = bridge.send.bind(bridge);\n\n bridge.send = async (type: string, payload: any) => {\n addLog(`OUT: ${type}`, payload);\n return originalSend(type, payload);\n };\n\n // 2. Intercept INCOMING messages (Shell -> SDK)\n const originalHandle = bridge.handleNativeMessage.bind(bridge);\n bridge.handleNativeMessage = (envelope: any) => {\n const type =\n envelope.eventName || envelope.event || envelope.type || \"MSG\";\n if (typeof type === \"string\") {\n addLog(`IN: ${type}`, envelope.payload || envelope.value || envelope);\n originalHandle(envelope);\n }\n };\n\n return () => {\n bridge.send = originalSend;\n bridge.handleNativeMessage = originalHandle;\n };\n }, [addLog]);\n\n if (!showConsole) {\n return (\n <Button\n className=\"fixed bottom-4 left-4 w-8 h-8 rounded-full bg-slate-900/60 backdrop-blur-sm border border-slate-700/50 flex items-center justify-center text-slate-400 hover:text-emerald-400 hover:bg-slate-900/80 transition-all z-[9998] shadow-lg group p-0!\"\n onClick={() => setShowConsole(true)}\n title=\"Open Debug Console\"\n type=\"button\"\n variant=\"ghost\"\n >\n <svg\n className=\"group-hover:scale-110 transition-transform\"\n fill=\"none\"\n height=\"14\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n width=\"14\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"m8 2 1.88 1.88\" />\n <path d=\"M14.12 3.88 16 2\" />\n <path d=\"M9 7.13v-1a3.003 3.003 0 1 1 6 0v1\" />\n <path d=\"M12 20c-3.3 0-6-2.7-6-6v-3a4 4 0 0 1 4-4h4a4 4 0 0 1 4 4v3c0 3.3-2.7 6-6 6\" />\n <path d=\"M12 20v-9\" />\n <path d=\"M6.53 9C4.6 8.8 3 7.1 3 5\" />\n <path d=\"M6 13H2\" />\n <path d=\"M3 21c0-2.1 1.7-3.9 3.8-4\" />\n <path d=\"M20.97 5c0 2.1-1.6 3.8-3.5 4\" />\n <path d=\"M22 13h-4\" />\n <path d=\"M17.2 17c2.1.1 3.8 1.9 3.8 4\" />\n </svg>\n </Button>\n );\n }\n\n return (\n <div className=\"fixed inset-x-0 bottom-0 w-full bg-[#0a080f] border-t border-slate-800 z-[9998] p-4 shadow-2xl flex flex-col animate-in slide-in-from-bottom duration-300\">\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-[10px] font-bold uppercase tracking-widest text-slate-400 flex items-center gap-2\">\n <span className=\"w-2 h-2 rounded-full bg-emerald-500 animate-pulse\" />\n UP SDK Debug Console\n </span>\n <div className=\"flex gap-4\">\n <Button\n className=\"text-[10px] text-slate-500 font-bold uppercase hover:text-slate-300 hover:bg-transparent transition-colors p-0 h-auto cursor-pointer\"\n onClick={clearLogs}\n type=\"button\"\n variant=\"ghost\"\n >\n Clear\n </Button>\n <Button\n className=\"text-[10px] text-pink-500 font-bold uppercase hover:text-pink-400 hover:bg-transparent transition-colors p-0 h-auto cursor-pointer\"\n onClick={() => {\n setShowConsole(false);\n if (onClose) onClose();\n }}\n type=\"button\"\n variant=\"ghost\"\n >\n Close\n </Button>\n </div>\n </div>\n <div\n className=\"bg-black/80 rounded-xl p-3 font-mono text-[10px] text-emerald-400 min-h-[120px] max-h-[240px] overflow-y-auto border border-slate-900 custom-scrollbar\"\n ref={scrollRef}\n >\n {logs.length === 0 ? (\n <div className=\"text-slate-600 italic text-center py-8\">\n No logs yet. Interacting with the SDK will show events here.\n </div>\n ) : (\n logs.map((log) => (\n <div\n className=\"mb-3 pb-3 border-b border-slate-900/50 last:border-0 last:mb-0 last:pb-0\"\n key={log.id}\n >\n <div className=\"flex gap-2 text-slate-500 mb-1 items-center\">\n <span className=\"text-[8px]\">{log.time}</span>\n <span className=\"font-bold text-white uppercase text-[8px] bg-slate-800 px-1.5 py-0.5 rounded leading-none\">\n {log.label}\n </span>\n </div>\n <pre className=\"whitespace-pre-wrap break-all opacity-90\">\n {log.content}\n </pre>\n </div>\n ))\n )}\n </div>\n </div>\n );\n};\n","import type React from \"react\";\nimport { createContext, useContext, useMemo } from \"react\";\nimport { BridgeMocker, type BridgeMockerProps } from \"./BridgeMocker\";\nimport { DebugConsole } from \"./DebugConsole\";\n\ninterface SDKContextValue {\n isMocked: boolean;\n}\n\nconst SDKContext = createContext<SDKContextValue>({ isMocked: false });\n\n/**\n * Hook to check if the SDK is currently running in mock mode (browser)\n * or native mode (shell app).\n */\nexport const useIsMocked = () => useContext(SDKContext).isMocked;\n\nexport interface SDKProviderProps\n extends Partial<Omit<BridgeMockerProps, \"children\">> {\n children: React.ReactNode;\n /**\n * If true, shows the standalone DebugConsole for bridge traffic.\n */\n debug?: boolean;\n}\n\n/**\n * A wrapper component that automatically enables the BridgeMocker\n * when running outside the native shell app.\n */\nexport const SDKProvider: React.FC<SDKProviderProps> = ({\n children,\n debug = false,\n ...mockerProps\n}) => {\n const isMocked =\n typeof window !== \"undefined\" &&\n !(\n (window as any).__UP_REACT_NATIVE_APP__ === true ||\n !!(window as any).ReactNativeWebView\n );\n\n const value = useMemo(() => ({ isMocked }), [isMocked]);\n\n const content = (\n <>\n {children}\n {(debug || isMocked) && <DebugConsole />}\n </>\n );\n\n if (isMocked) {\n return (\n <SDKContext.Provider value={value}>\n <BridgeMocker {...mockerProps}>{content}</BridgeMocker>\n </SDKContext.Provider>\n );\n }\n\n return <SDKContext.Provider value={value}>{content}</SDKContext.Provider>;\n};\n","import type { RoutingBackendConfig } from \"@miniapps-sdk/services/routingService\";\nimport { RoutingService } from \"@miniapps-sdk/services/routingService\";\nimport type {\n DrawRouteRequest,\n RouteRequest,\n RouteResponse,\n} from \"@miniapps-sdk/types/routing\";\nimport type { Map } from \"maplibre-gl\";\n\n/**\n * Handles a route request from the mini-app and fetches data from the configured backend.\n */\nexport async function handleRouteRequest(\n req: RouteRequest,\n config: RoutingBackendConfig,\n): Promise<RouteResponse> {\n return RoutingService.fetchRoute(req, config);\n}\n\n/**\n * Host-side map rendering logic for routes.\n */\nexport function handleDrawRoute(\n map: Map,\n miniAppId: string,\n req: DrawRouteRequest,\n) {\n const sourceId = `sdk-route-${miniAppId}`;\n const casingLayerId = `sdk-route-casing-${miniAppId}`;\n const lineLayerId = `sdk-route-line-${miniAppId}`;\n\n const geojson = {\n features: [\n {\n geometry: req.payload.routeData.geometry,\n properties: {},\n type: \"Feature\",\n },\n ],\n type: \"FeatureCollection\",\n };\n\n const source = map.getSource(sourceId);\n if (source) {\n // @ts-expect-error - maplibre-gl types might not expose setData nicely on generic source\n (source as maplibregl.GeoJSONSource).setData(geojson);\n } else {\n map.addSource(sourceId, {\n data: geojson as any,\n type: \"geojson\",\n });\n\n map.addLayer({\n id: casingLayerId,\n layout: {\n \"line-cap\": \"round\",\n \"line-join\": \"round\",\n },\n paint: {\n \"line-color\": \"#111111\",\n \"line-opacity\": 0.8,\n \"line-width\": 8,\n },\n source: sourceId,\n type: \"line\",\n });\n\n map.addLayer({\n id: lineLayerId,\n layout: {\n \"line-cap\": \"round\",\n \"line-join\": \"round\",\n },\n paint: {\n \"line-color\": \"#3b82f6\", // Bright blue\n \"line-width\": 4,\n },\n source: sourceId,\n type: \"line\",\n });\n }\n}\n\nexport function handleClearRoute(map: Map, miniAppId: string) {\n const sourceId = `sdk-route-${miniAppId}`;\n const casingLayerId = `sdk-route-casing-${miniAppId}`;\n const lineLayerId = `sdk-route-line-${miniAppId}`;\n\n if (map.getLayer(lineLayerId)) map.removeLayer(lineLayerId);\n if (map.getLayer(casingLayerId)) map.removeLayer(casingLayerId);\n if (map.getSource(sourceId)) map.removeSource(sourceId);\n}\n"],"mappings":"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","names":["Map","import_class_variance_authority","React","import_jsx_runtime","Content","import_jsx_runtime","containerH","fullPx","peekPx","React","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","resolveHeightToPixels","import_react","import_jsx_runtime","UIEvent","GeolocationEvent","GlobalEvent","import_react","import_react","import_react","import_jsx_runtime","import_react_maplibre","import_react","import_react_maplibre","import_react","import_jsx_runtime","import_react_maplibre","import_jsx_runtime","import_react_maplibre","import_jsx_runtime","import_jsx_runtime","mapLibreChildren","React","menuContentFromChildren","MapLibre","Map","import_react","React","Map","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/lib/utils.ts","../src/components/ui/button.tsx","../src/bridge.ts","../src/components/ui/sheet.tsx","../src/components/Map/components/MapDrawer.tsx","../src/components/ui/card.tsx","../src/components/Map/components/MapEtaPanel.tsx","../src/components/Map/components/MapRightControls.tsx","../src/components/Map/MapContext.tsx","../src/components/Map/components/MapControls.tsx","../src/components/Map/components/MapMenu.tsx","../src/types/types.ts","../src/components/Map/hooks/useUserLocation.ts","../src/components/Map/hooks/useLiveRouting.ts","../src/components/Map/hooks/useTrimmedRoute.ts","../src/components/Map/layers/RouteLayer.tsx","../src/components/Map/Map.tsx","../src/components/Map/layers/POILayers.tsx","../src/components/Map/layers/POIMarkers.tsx","../src/components/Map/layers/UserLocationLayer.tsx","../src/components/MapWrapper.tsx","../src/services/routingService.ts","../package.json","../src/sdk.ts","../src/components/BridgeMocker.tsx","../src/components/DebugConsole.tsx","../src/components/SDKProvider.tsx","../src/host/routingHandler.ts"],"sourcesContent":["export * from \"@miniapps-sdk/components\";\nexport * from \"@miniapps-sdk/host\";\nexport { MiniAppSDK, sdk } from \"@miniapps-sdk/sdk\";\nexport * from \"@miniapps-sdk/types\";\n\nimport { sdk } from \"@miniapps-sdk/sdk\";\n\nexport default sdk;\n","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { cn } from \"@miniapps-sdk/lib/utils\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n defaultVariants: {\n size: \"default\",\n variant: \"default\",\n },\n variants: {\n size: {\n default: \"h-10 px-4 py-2\",\n icon: \"h-10 w-10\",\n lg: \"h-11 rounded-md px-8\",\n sm: \"h-9 rounded-md px-3\",\n },\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n outline:\n \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n },\n },\n },\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\";\n return (\n <Comp\n className={cn(buttonVariants({ className, size, variant }))}\n ref={ref}\n {...props}\n />\n );\n },\n);\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };\n","import type { IBridgeEnvelope } from \"@miniapps-sdk/types\";\n\n/**\n * The Bridge handles low-level communication between the Mini-App WebView\n * and the Native Host Shell (iOS/Android).\n *\n * It manages asynchronous request-response cycles via callbacks and\n * supports subscription to pushed events from the native environment.\n */\nexport class Bridge {\n private callbacks = new Map<\n string,\n {\n resolve: (val: unknown) => void;\n reject: (err: unknown) => void;\n timeout: ReturnType<typeof setTimeout>;\n }\n >();\n private eventListeners = new Map<string, ((data: any) => void)[]>();\n\n /**\n * Registers a global listener for messages coming from the native shell.\n * Also listens for standard browser `message` events to support multiple\n * communication channels (e.g., React Native WebView postMessage).\n */\n constructor() {\n if (typeof window !== \"undefined\") {\n const bridgeReceiver = Object.freeze({\n onNativeMessage: (envelope: IBridgeEnvelope) =>\n this.handleNativeMessage(envelope),\n });\n\n // Use defineProperty to bind the receiver, allowing reconfiguration for HMR environments\n if (typeof (window as any).__MiniAppBridge === \"undefined\") {\n Object.defineProperty(window, \"__MiniAppBridge\", {\n configurable: true, // MUST be true for React StrictMode / HMR unmount/remount cycles\n value: bridgeReceiver,\n writable: false,\n });\n }\n\n window.addEventListener(\"message\", (event) => {\n // SECURITY: Filter events. If inside a mobile shell, the origin of native postMessage\n // varies by platform (e.g., file://, or specific app schemes).\n // For production, this should be restricted to the expected host origin.\n if (!event.data) return;\n\n try {\n const data =\n typeof event.data === \"string\"\n ? JSON.parse(event.data)\n : event.data;\n\n // SECURITY: Basic envelope validation\n if (\n data &&\n typeof data === \"object\" &&\n (data.callbackId || data.event || data.eventName)\n ) {\n this.handleNativeMessage(data);\n }\n } catch (_e) {\n // Ignore non-JSON or malformed messages\n }\n });\n }\n }\n\n /**\n * Subscribes to a pushed event from the native shell.\n *\n * @param event The event name to listen for.\n * @param callback Function to execute when the event occurs.\n * @returns An unsubscription function.\n */\n public on<T = unknown>(event: string, callback: (data: T) => void) {\n let listeners = this.eventListeners.get(event);\n if (!listeners) {\n listeners = [];\n this.eventListeners.set(event, listeners);\n }\n listeners.push(callback);\n return () => this.off(event, callback);\n }\n\n /**\n * Unsubscribes a specific callback from an event.\n *\n * @param event The event name.\n * @param callback The callback function to remove.\n */\n public off<T = unknown>(event: string, callback: (data: T) => void) {\n const listeners = this.eventListeners.get(event);\n if (!listeners) return;\n this.eventListeners.set(\n event,\n listeners.filter((cb) => cb !== callback),\n );\n }\n\n /**\n * Sends a message to the native shell and waits for a response.\n *\n * @template T The expected response type.\n * @param type The action type (e.g., \"GET_LOCATION\").\n * @param payload Data associated with the action.\n * @param timeoutMs Time in milliseconds to wait for a response before rejecting.\n * @returns A promise that resolves with the native response.\n */\n public send<T = unknown>(\n type: string,\n payload?: unknown,\n timeoutMs = 30000,\n ): Promise<T> {\n if (!this.isNative()) {\n return this.handleMockMessage(type, payload);\n }\n\n return new Promise((resolve, reject) => {\n const callbackId = `${type}_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n\n const timeout = setTimeout(() => {\n if (this.callbacks.has(callbackId)) {\n this.callbacks.delete(callbackId);\n reject(new Error(`Bridge request timeout: ${type}`));\n }\n }, timeoutMs);\n\n this.callbacks.set(callbackId, {\n reject,\n resolve: resolve as (val: unknown) => void,\n timeout,\n });\n\n const message = {\n callbackId,\n payload,\n type,\n };\n\n const win = window as unknown as {\n ReactNativeWebView?: { postMessage: (msg: string) => void };\n };\n\n if (win.ReactNativeWebView?.postMessage) {\n win.ReactNativeWebView.postMessage(JSON.stringify(message));\n } else {\n clearTimeout(timeout);\n this.callbacks.delete(callbackId);\n reject(new Error(\"Bridge not available\"));\n }\n });\n }\n\n /**\n * Internal handler for all incoming messages from the native shell.\n * Matches incoming payloads to either pending callbacks or event listeners.\n *\n * @internal\n * @param envelope The message envelope received from native code.\n */\n public handleNativeMessage(envelope: IBridgeEnvelope) {\n if (!envelope || typeof envelope !== \"object\") return;\n\n // 1. Handle Response Callbacks\n const callbackId = envelope.callbackId;\n if (callbackId && typeof callbackId === \"string\") {\n const callback = this.callbacks.get(callbackId);\n if (callback) {\n clearTimeout(callback.timeout);\n const { resolve, reject } = callback;\n\n if (envelope.success === false || envelope.error) {\n reject(envelope.error || \"Unknown error\");\n } else {\n resolve(envelope.value ?? envelope.payload ?? envelope);\n }\n\n this.callbacks.delete(callbackId);\n return;\n }\n }\n\n // 2. Handle Pushed Events\n const eventName = envelope.eventName || envelope.event;\n if (eventName) {\n // If using the new protocol with type=\"EVENT\", ensure we only process if type matches\n if (envelope.type === \"EVENT\" || !envelope.type || envelope.event) {\n const listeners = this.eventListeners.get(eventName);\n if (listeners) {\n for (const listener of listeners) {\n try {\n listener(envelope.payload || envelope.value);\n } catch (e) {\n console.error(`Error in event listener for ${eventName}:`, e);\n }\n }\n }\n }\n }\n }\n\n /**\n * Internal handler for mock message processing, overrideable in test environments\n */\n protected handleMockMessage(type: string, payload: unknown): Promise<any> {\n console.warn(`[Bridge] Mock mode active: Unhandled message type ${type}`);\n return Promise.resolve();\n }\n\n /**\n * Determine environment. Check flag or cache result.\n */\n private isNative(): boolean {\n if (typeof window === \"undefined\") return false;\n return (\n (window as any).__UP_REACT_NATIVE_APP__ === true ||\n !!(window as any).ReactNativeWebView\n );\n }\n}\n","import { cn } from \"@miniapps-sdk/lib/utils\";\nimport * as SheetPrimitive from \"@radix-ui/react-dialog\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { X } from \"lucide-react\";\nimport * as React from \"react\";\n\nconst Sheet = SheetPrimitive.Root;\n\nconst SheetTrigger = SheetPrimitive.Trigger;\n\nconst SheetClose = SheetPrimitive.Close;\n\nconst SheetPortal = SheetPrimitive.Portal;\n\nconst SheetOverlay = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Overlay\n className={cn(\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className,\n )}\n {...props}\n ref={ref}\n />\n));\nSheetOverlay.displayName = SheetPrimitive.Overlay.displayName;\n\nconst sheetVariants = cva(\n \"z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500\",\n {\n defaultVariants: {\n side: \"right\",\n },\n variants: {\n side: {\n bottom:\n \"inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom\",\n left: \"inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm\",\n right:\n \"inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm\",\n top: \"inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top\",\n },\n },\n },\n);\n\ninterface SheetContentProps\n extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>,\n VariantProps<typeof sheetVariants> {\n portal?: boolean;\n}\n\nconst SheetContent = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Content>,\n SheetContentProps\n>(({ side = \"right\", className, children, portal = true, ...props }, ref) => {\n const Content = (\n <SheetPrimitive.Content\n className={cn(\n sheetVariants({ side }),\n portal ? \"fixed\" : \"absolute\",\n className,\n )}\n ref={ref}\n {...props}\n >\n {children}\n <SheetPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-105 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n </SheetPrimitive.Content>\n );\n\n if (!portal) {\n return Content;\n }\n\n return (\n <SheetPortal>\n <SheetOverlay />\n {Content}\n </SheetPortal>\n );\n});\nSheetContent.displayName = SheetPrimitive.Content.displayName;\n\nconst SheetHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-2 text-center sm:text-left\",\n className,\n )}\n {...props}\n />\n);\nSheetHeader.displayName = \"SheetHeader\";\n\nconst SheetFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className,\n )}\n {...props}\n />\n);\nSheetFooter.displayName = \"SheetFooter\";\n\nconst SheetTitle = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Title\n className={cn(\"text-lg font-semibold text-foreground\", className)}\n ref={ref}\n {...props}\n />\n));\nSheetTitle.displayName = SheetPrimitive.Title.displayName;\n\nconst SheetDescription = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Description\n className={cn(\"text-sm text-muted-foreground\", className)}\n ref={ref}\n {...props}\n />\n));\nSheetDescription.displayName = SheetPrimitive.Description.displayName;\n\nexport {\n Sheet,\n SheetClose,\n SheetContent,\n SheetDescription,\n SheetFooter,\n SheetHeader,\n SheetOverlay,\n SheetPortal,\n SheetTitle,\n SheetTrigger,\n};\n","import type { EtaData, MenuItem } from \"@miniapps-sdk/components/Map/types\";\nimport { Button } from \"@miniapps-sdk/components/ui/button\";\nimport {\n Sheet,\n SheetContent,\n SheetHeader,\n SheetTitle,\n} from \"@miniapps-sdk/components/ui/sheet\";\nimport type React from \"react\";\nimport {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from \"react\";\n\nconst resolveHeightToPixels = (\n height: string | number,\n containerHeight: number,\n): number => {\n if (typeof height === \"number\") {\n return height;\n }\n if (height.endsWith(\"%\")) {\n return (parseFloat(height) / 100) * containerHeight;\n }\n return parseFloat(height);\n};\n\nexport type DrawerState = \"closed\" | \"peek\" | \"full\";\n\nexport interface MapDrawerProps {\n menuItems: MenuItem[];\n state: DrawerState;\n onChangeState: (state: DrawerState) => void;\n side: \"left\" | \"bottom\";\n etaBarHeight?: number;\n etaData?: EtaData;\n\n // Hoisted drag states\n touchStartY: number | null;\n setTouchStartY: (val: number | null) => void;\n currentTouchY: number | null;\n setCurrentTouchY: (val: number | null) => void;\n isDragging: boolean;\n clampedDragOffset: number;\n\n // Drawer customization\n drawerPeekHeight?: string | number;\n drawerFullHeight?: string | number;\n containerHeight?: number;\n menuContent?: React.ReactNode;\n enableTouchDrag?: boolean;\n\n // Scroll to top button customization\n showScrollToTopButton?: boolean;\n scrollToTopThreshold?: number;\n\n // Safe area support\n safeAreaInsets?: { top: number; bottom: number; left: number; right: number };\n}\n\nexport const MapDrawer = forwardRef<HTMLDivElement, MapDrawerProps>(\n (\n {\n menuItems,\n state,\n onChangeState,\n side,\n etaBarHeight = 0,\n etaData,\n touchStartY,\n setTouchStartY,\n currentTouchY,\n setCurrentTouchY,\n isDragging,\n clampedDragOffset,\n drawerPeekHeight,\n drawerFullHeight,\n containerHeight,\n menuContent,\n enableTouchDrag = false,\n showScrollToTopButton = true,\n scrollToTopThreshold = 300,\n safeAreaInsets = { bottom: 0, left: 0, right: 0, top: 0 },\n },\n ref,\n ) => {\n const scrollContainerRef = useRef<HTMLDivElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n useImperativeHandle(\n ref,\n () => scrollContainerRef.current as HTMLDivElement,\n );\n\n const handleHandleClick = () => {\n if (side === \"left\") {\n onChangeState(state === \"closed\" ? \"full\" : \"closed\");\n } else {\n if (state === \"closed\") {\n onChangeState(\"peek\");\n } else if (state === \"peek\") {\n onChangeState(\"full\");\n } else {\n onChangeState(\"peek\");\n }\n }\n };\n\n const [showScrollTop, setShowScrollTop] = useState(false);\n\n const handleScroll = (e: React.UIEvent<HTMLDivElement>) => {\n const scrollTop = e.currentTarget.scrollTop;\n setShowScrollTop(state !== \"closed\" && scrollTop > scrollToTopThreshold);\n };\n\n useEffect(() => {\n if (state === \"closed\") {\n setShowScrollTop(false);\n } else {\n const scrollTop = scrollContainerRef.current?.scrollTop || 0;\n setShowScrollTop(scrollTop > scrollToTopThreshold);\n }\n }, [state, scrollToTopThreshold]);\n\n const isDraggingSheet = useRef(false);\n const hasDeterminedDirection = useRef(false);\n const isTouchOnContent = useRef(false);\n\n // Sync refs to avoid stale closures in native touch listeners\n const stateRef = useRef(state);\n const touchStartYRef = useRef(touchStartY);\n const currentTouchYRef = useRef(currentTouchY);\n\n useEffect(() => {\n stateRef.current = state;\n }, [state]);\n\n useEffect(() => {\n touchStartYRef.current = touchStartY;\n }, [touchStartY]);\n\n useEffect(() => {\n currentTouchYRef.current = currentTouchY;\n }, [currentTouchY]);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container || side !== \"bottom\" || !enableTouchDrag) return;\n\n const handleNativeTouchStart = (e: TouchEvent) => {\n const clientY = e.targetTouches[0].clientY;\n setTouchStartY(clientY);\n setCurrentTouchY(clientY);\n isDraggingSheet.current = false;\n hasDeterminedDirection.current = false;\n\n const target = e.target as Node;\n isTouchOnContent.current = scrollContainerRef.current\n ? scrollContainerRef.current.contains(target)\n : false;\n };\n\n const handleNativeTouchMove = (e: TouchEvent) => {\n const startY = touchStartYRef.current;\n if (startY === null) return;\n\n const currentY = e.targetTouches[0].clientY;\n const deltaY = startY - currentY; // positive means dragging UP, negative means dragging DOWN\n\n const scrollTop = scrollContainerRef.current\n ? scrollContainerRef.current.scrollTop\n : 0;\n const clientHeight = scrollContainerRef.current\n ? scrollContainerRef.current.clientHeight\n : 0;\n const scrollHeight = scrollContainerRef.current\n ? scrollContainerRef.current.scrollHeight\n : 0;\n const isAtBottom = scrollTop + clientHeight >= scrollHeight - 1;\n const currentState = stateRef.current;\n\n if (!hasDeterminedDirection.current) {\n if (!isTouchOnContent.current) {\n // Dragging the handle always controls the sheet itself\n isDraggingSheet.current = true;\n hasDeterminedDirection.current = true;\n } else if (currentState !== \"full\") {\n // Dragging content in peek/closed state:\n // Can drag UP to full only if already at the bottom\n // Can drag DOWN to close only if already at the top\n if (deltaY > 0 && isAtBottom) {\n isDraggingSheet.current = true;\n hasDeterminedDirection.current = true;\n } else if (deltaY < 0 && scrollTop <= 0) {\n isDraggingSheet.current = true;\n hasDeterminedDirection.current = true;\n } else {\n // Otherwise, let the content scroll\n isDraggingSheet.current = false;\n hasDeterminedDirection.current = true;\n }\n } else {\n // In full state: dragging down at the very top of content drags the sheet down\n if (deltaY < 0 && scrollTop <= 0) {\n isDraggingSheet.current = true;\n hasDeterminedDirection.current = true;\n } else {\n // Dragging up or scroll is not at top: scrolls the container content\n isDraggingSheet.current = false;\n hasDeterminedDirection.current = true;\n }\n }\n } else if (!isDraggingSheet.current && isTouchOnContent.current) {\n // Transition from scroll to sheet dragging mid-gesture when reaching top or bottom limits\n if (deltaY < 0 && scrollTop <= 0) {\n isDraggingSheet.current = true;\n setTouchStartY(currentY);\n return;\n }\n if (deltaY > 0 && isAtBottom && currentState !== \"full\") {\n isDraggingSheet.current = true;\n setTouchStartY(currentY);\n return;\n }\n }\n\n if (isDraggingSheet.current) {\n if (e.cancelable) {\n e.preventDefault();\n }\n\n const parentContainer = container.parentElement;\n if (parentContainer) {\n const containerH =\n containerHeight || parentContainer.getBoundingClientRect().height;\n const fullPx = resolveHeightToPixels(\n drawerFullHeight || \"85%\",\n containerH,\n );\n const peekPx = resolveHeightToPixels(\n drawerPeekHeight || \"15%\",\n containerH,\n );\n const closedPx =\n 32 + (currentState === \"closed\" ? safeAreaInsets.bottom : 0);\n\n const dragOffset = currentY - startY; // negative = up, positive = down\n let localClamped = dragOffset;\n\n if (currentState === \"full\") {\n localClamped = Math.max(\n 0,\n Math.min(fullPx - closedPx, dragOffset),\n );\n } else if (currentState === \"peek\") {\n localClamped = Math.max(\n -(fullPx - peekPx),\n Math.min(peekPx - closedPx, dragOffset),\n );\n } else if (currentState === \"closed\") {\n localClamped = Math.min(\n 0,\n Math.max(-(fullPx - closedPx), dragOffset),\n );\n }\n\n parentContainer.style.setProperty(\n \"--drag-offset\",\n `${localClamped}px`,\n );\n }\n }\n };\n\n const handleNativeTouchEnd = (e: TouchEvent) => {\n const startY = touchStartYRef.current;\n const currentY = currentTouchYRef.current;\n const parentContainer = container.parentElement;\n\n if (startY === null || currentY === null) {\n if (parentContainer) {\n parentContainer.style.setProperty(\"--drag-offset\", \"0px\");\n }\n return;\n }\n\n if (!isDraggingSheet.current) {\n setTouchStartY(null);\n setCurrentTouchY(null);\n if (parentContainer) {\n parentContainer.style.setProperty(\"--drag-offset\", \"0px\");\n }\n return;\n }\n\n const touchEndY = e.changedTouches[0].clientY;\n const dragDistance = Math.abs(touchEndY - startY);\n\n if (dragDistance < 10) {\n setTouchStartY(null);\n setCurrentTouchY(null);\n if (parentContainer) {\n parentContainer.style.setProperty(\"--drag-offset\", \"0px\");\n }\n return;\n }\n\n // Find parent container bounds\n const containerH =\n containerHeight ||\n (parentContainer\n ? parentContainer.getBoundingClientRect().height\n : window.innerHeight);\n const containerTop = parentContainer\n ? parentContainer.getBoundingClientRect().top\n : 0;\n\n const touchYInContainer = touchEndY - containerTop;\n const drawerHeightFromBottom = containerH - touchYInContainer;\n\n const fullPx = resolveHeightToPixels(\n drawerFullHeight || \"85%\",\n containerH,\n );\n const peekPx = resolveHeightToPixels(\n drawerPeekHeight || \"15%\",\n containerH,\n );\n const currentState = stateRef.current;\n const closedPx =\n 32 + (currentState === \"closed\" ? safeAreaInsets.bottom : 0);\n\n const distToFull = Math.abs(drawerHeightFromBottom - fullPx);\n const distToPeek = Math.abs(drawerHeightFromBottom - peekPx);\n const distToClosed = Math.abs(drawerHeightFromBottom - closedPx);\n\n const minDist = Math.min(distToFull, distToPeek, distToClosed);\n\n let targetState: DrawerState = \"closed\";\n if (minDist === distToFull) {\n targetState = \"full\";\n } else if (minDist === distToPeek) {\n targetState = \"peek\";\n } else {\n targetState = \"closed\";\n }\n\n // Re-enable transition properties\n setTouchStartY(null);\n setCurrentTouchY(null);\n onChangeState(targetState);\n\n // Snap from current drag coordinates by delaying cleanup of compositor offset\n requestAnimationFrame(() => {\n if (parentContainer) {\n parentContainer.style.setProperty(\"--drag-offset\", \"0px\");\n }\n });\n };\n\n container.addEventListener(\"touchstart\", handleNativeTouchStart, {\n passive: true,\n });\n container.addEventListener(\"touchmove\", handleNativeTouchMove, {\n passive: false,\n });\n container.addEventListener(\"touchend\", handleNativeTouchEnd, {\n passive: true,\n });\n\n return () => {\n container.removeEventListener(\"touchstart\", handleNativeTouchStart);\n container.removeEventListener(\"touchmove\", handleNativeTouchMove);\n container.removeEventListener(\"touchend\", handleNativeTouchEnd);\n };\n }, [\n side,\n enableTouchDrag,\n containerHeight,\n drawerFullHeight,\n drawerPeekHeight,\n safeAreaInsets,\n onChangeState,\n setTouchStartY,\n setCurrentTouchY,\n ]);\n\n // Backdrop only visible when fully open\n const isBackdropActive = state === \"full\";\n const backdropStyles = isBackdropActive\n ? \"opacity-100 pointer-events-auto\"\n : \"opacity-0 pointer-events-none\";\n\n const containerH = containerHeight || window.innerHeight;\n const fullPx = resolveHeightToPixels(drawerFullHeight || \"85%\", containerH);\n const peekPx = resolveHeightToPixels(drawerPeekHeight || \"15%\", containerH);\n const shiftPx = fullPx - peekPx;\n\n // Calculate bottom drawer transform dynamically to enable smooth hardware-accelerated transitions\n const getBottomDrawerTransform = () => {\n if (state === \"full\") {\n return \"translateY(var(--drag-offset, 0px))\";\n }\n if (state === \"peek\") {\n return `translateY(calc(${shiftPx}px + var(--drag-offset, 0px)))`;\n }\n // Closed state: show only the drag handle bar (32px)\n const closedVisibleHeight = 32;\n const closedShiftPx = fullPx - closedVisibleHeight;\n return `translateY(calc(${closedShiftPx}px + var(--drag-offset, 0px)))`;\n };\n\n return (\n <>\n <style>{`\n .no-scrollbar {\n -ms-overflow-style: none;\n scrollbar-width: none;\n }\n .no-scrollbar::-webkit-scrollbar {\n display: none;\n }\n `}</style>\n\n {/* Backdrop overlay for closing on outside tap */}\n <div\n className={`absolute inset-0 bg-black/45 backdrop-blur-[1px] transition-opacity duration-300 z-30 ${backdropStyles}`}\n onClick={() => onChangeState(\"closed\")}\n />\n\n {side === \"left\" ? (\n <>\n {state === \"closed\" && (\n <Button\n className=\"absolute top-4 left-4 z-40 w-12 h-12 rounded-full bg-zinc-950/80 backdrop-blur-md border border-white/10 shadow-lg flex items-center justify-center text-white active:scale-95 transition-all cursor-pointer hover:bg-zinc-900 hover:text-white p-0!\"\n onClick={() => onChangeState(\"full\")}\n variant=\"ghost\"\n >\n <svg\n fill=\"none\"\n height=\"24\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n width=\"24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <line x1=\"4\" x2=\"20\" y1=\"12\" y2=\"12\" />\n <line x1=\"4\" x2=\"20\" y1=\"6\" y2=\"6\" />\n <line x1=\"4\" x2=\"20\" y1=\"18\" y2=\"18\" />\n </svg>\n </Button>\n )}\n <Sheet\n onOpenChange={(open) => onChangeState(open ? \"full\" : \"closed\")}\n open={state !== \"closed\"}\n >\n <SheetContent\n className=\"w-80 bg-zinc-950/85 backdrop-blur-md border-r border-y border-white/10 rounded-r-2xl shadow-2xl p-4 text-white flex flex-col h-full overflow-hidden\"\n portal={false}\n side=\"left\"\n >\n <SheetHeader className=\"pb-3 border-b border-white/10 mb-2 text-left\">\n <SheetTitle className=\"text-sm font-bold tracking-wider text-zinc-400 uppercase\">\n Menu\n </SheetTitle>\n </SheetHeader>\n\n <div\n className=\"flex-1 overflow-y-auto no-scrollbar pr-2\"\n onScroll={handleScroll}\n ref={scrollContainerRef}\n >\n {menuContent ? (\n menuContent\n ) : (\n <div className=\"flex flex-col gap-1.5\">\n {menuItems.map((item) => (\n <Button\n className={`flex items-center gap-3 w-full py-3 px-3.5 rounded-xl text-left cursor-pointer transition-all duration-150 justify-start hover:bg-white/5 hover:text-white active:bg-white/10 text-white ${\n item.disabled\n ? \"opacity-45 cursor-not-allowed pointer-events-none\"\n : \"\"\n }`}\n disabled={item.disabled}\n key={item.id}\n onClick={() => {\n if (!item.disabled) {\n item.onPress();\n onChangeState(\"closed\");\n }\n }}\n variant=\"ghost\"\n >\n <div className=\"relative flex items-center justify-center w-8 h-8 rounded-lg bg-white/5 text-zinc-300\">\n {item.icon}\n {item.badge !== undefined && (\n <span className=\"absolute -top-1 -right-1 bg-cyan-500 text-black text-[9px] font-extrabold min-w-[15px] h-3.5 rounded-full flex items-center justify-center px-1 border border-zinc-950 shadow\">\n {item.badge}\n </span>\n )}\n </div>\n <span className=\"text-sm font-medium tracking-wide flex-1\">\n {item.label}\n </span>\n </Button>\n ))}\n </div>\n )}\n </div>\n\n {showScrollToTopButton && showScrollTop && (\n <Button\n className=\"absolute bottom-6 right-6 z-50 flex items-center justify-center w-10 h-10 rounded-full bg-cyan-500 hover:bg-cyan-400 active:scale-95 text-black hover:text-black shadow-lg shadow-cyan-500/25 transition-all duration-200 cursor-pointer p-0!\"\n onClick={() => {\n scrollContainerRef.current?.scrollTo({\n behavior: \"smooth\",\n top: 0,\n });\n }}\n variant=\"ghost\"\n >\n <svg\n fill=\"none\"\n height=\"20\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2.5\"\n viewBox=\"0 0 24 24\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <polyline points=\"18 15 12 9 6 15\"></polyline>\n </svg>\n </Button>\n )}\n </SheetContent>\n </Sheet>\n </>\n ) : (\n /* Bottom Sheet Panel - Hardware accelerated translateY transitions */\n <div\n className={`absolute w-full bg-zinc-950/85 backdrop-blur-md border border-white/10 rounded-t-2xl shadow-2xl flex flex-col z-40 select-none ${\n isDragging\n ? \"transition-none\"\n : \"transition-transform duration-300 ease-out\"\n }`}\n ref={containerRef}\n style={{\n bottom: \"0px\",\n height:\n typeof drawerFullHeight === \"number\"\n ? `${drawerFullHeight}px`\n : drawerFullHeight || \"85%\",\n marginBottom:\n state === \"closed\" ? `${safeAreaInsets.bottom}px` : \"0px\",\n transform: getBottomDrawerTransform(),\n transition: isDragging\n ? \"none\"\n : \"transform 300ms ease-out, margin-bottom 250ms ease-in-out\",\n }}\n >\n {/* Bottom Sheet Handle Bar */}\n <div\n className=\"w-full h-8 flex flex-col items-center justify-center cursor-pointer hover:bg-white/5 rounded-t-2xl transition-colors border-b border-white/5\"\n onClick={handleHandleClick}\n >\n <div className=\"w-12 h-1 bg-white/25 rounded-full\" />\n </div>\n\n {/* Content Area */}\n <div\n className=\"flex-1 flex flex-col overflow-hidden px-4 pb-4 pt-2 transition-[margin-top] duration-250 ease-in-out relative\"\n style={{\n marginTop:\n state === \"closed\" ? `${safeAreaInsets.bottom}px` : \"0px\",\n }}\n >\n {/* Menu items scrollable list */}\n <div\n className=\"flex-1 overflow-y-auto no-scrollbar\"\n onScroll={handleScroll}\n ref={scrollContainerRef}\n style={{\n paddingBottom: state === \"peek\" ? `${shiftPx}px` : \"0px\",\n }}\n >\n {menuContent ? (\n menuContent\n ) : (\n <div className=\"flex flex-col gap-1\">\n {menuItems.map((item) => (\n <Button\n className={`flex items-center gap-3 w-full py-3 px-3.5 rounded-xl text-left cursor-pointer transition-all duration-150 justify-start hover:bg-white/5 hover:text-white active:bg-white/10 text-white ${\n item.disabled\n ? \"opacity-45 cursor-not-allowed pointer-events-none\"\n : \"\"\n }`}\n disabled={item.disabled}\n key={item.id}\n onClick={() => {\n if (!item.disabled) {\n item.onPress();\n onChangeState(\"closed\");\n }\n }}\n variant=\"ghost\"\n >\n <div className=\"relative flex items-center justify-center w-8 h-8 rounded-lg bg-white/5 text-zinc-300\">\n {item.icon}\n {item.badge !== undefined && (\n <span className=\"absolute -top-1 -right-1 bg-cyan-500 text-black text-[9px] font-extrabold min-w-[15px] h-3.5 rounded-full flex items-center justify-center px-1 border border-zinc-950 shadow\">\n {item.badge}\n </span>\n )}\n </div>\n <span className=\"text-sm font-medium tracking-wide\">\n {item.label}\n </span>\n </Button>\n ))}\n </div>\n )}\n </div>\n\n {showScrollToTopButton && showScrollTop && (\n <Button\n className=\"absolute right-6 z-50 flex items-center justify-center w-10 h-10 rounded-full bg-cyan-500 hover:bg-cyan-400 active:scale-95 text-black hover:text-black shadow-lg shadow-cyan-500/25 transition-all duration-200 cursor-pointer p-0!\"\n onClick={() => {\n scrollContainerRef.current?.scrollTo({\n behavior: \"smooth\",\n top: 0,\n });\n }}\n style={{\n bottom:\n state === \"peek\"\n ? `calc(${24 + shiftPx}px + var(--drag-offset, 0px))`\n : `calc(24px + var(--drag-offset, 0px))`,\n }}\n variant=\"ghost\"\n >\n <svg\n fill=\"none\"\n height=\"20\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2.5\"\n viewBox=\"0 0 24 24\"\n width=\"20\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <polyline points=\"18 15 12 9 6 15\"></polyline>\n </svg>\n </Button>\n )}\n </div>\n </div>\n )}\n </>\n );\n },\n);\n","import { cn } from \"@miniapps-sdk/lib/utils\";\nimport * as React from \"react\";\n\nconst Card = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n className={cn(\n \"rounded-lg border bg-card text-card-foreground shadow-sm\",\n className,\n )}\n ref={ref}\n {...props}\n />\n));\nCard.displayName = \"Card\";\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n className={cn(\"flex flex-col space-y-1.5 p-6\", className)}\n ref={ref}\n {...props}\n />\n));\nCardHeader.displayName = \"CardHeader\";\n\nconst CardTitle = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n className={cn(\n \"text-2xl font-semibold leading-none tracking-tight\",\n className,\n )}\n ref={ref}\n {...props}\n />\n));\nCardTitle.displayName = \"CardTitle\";\n\nconst CardDescription = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n className={cn(\"text-sm text-muted-foreground\", className)}\n ref={ref}\n {...props}\n />\n));\nCardDescription.displayName = \"CardDescription\";\n\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div className={cn(\"p-6 pt-0\", className)} ref={ref} {...props} />\n));\nCardContent.displayName = \"CardContent\";\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n className={cn(\"flex items-center p-6 pt-0\", className)}\n ref={ref}\n {...props}\n />\n));\nCardFooter.displayName = \"CardFooter\";\n\nexport {\n Card,\n CardContent,\n CardDescription,\n CardFooter,\n CardHeader,\n CardTitle,\n};\n","import type { EtaData } from \"@miniapps-sdk/components/Map/types\";\nimport { Button } from \"@miniapps-sdk/components/ui/button\";\nimport {\n Card,\n CardContent,\n CardHeader,\n} from \"@miniapps-sdk/components/ui/card\";\nimport type React from \"react\";\n\nexport interface MapEtaPanelProps {\n etaData: EtaData;\n layoutMode: \"closed-banner\" | \"open-card\" | \"floating-card\";\n onHeaderClick?: () => void;\n style?: React.CSSProperties;\n isDragging?: boolean;\n}\n\nexport const MapEtaPanel: React.FC<MapEtaPanelProps> = ({\n etaData,\n layoutMode,\n onHeaderClick,\n style,\n isDragging = false,\n}) => {\n if (layoutMode === \"closed-banner\") {\n return (\n <div className=\"w-full h-10 flex items-center justify-between px-4 pb-2 pt-1 border-b border-white/5 bg-zinc-950/15 relative overflow-hidden\">\n <div\n className=\"flex items-center gap-2 cursor-pointer flex-1\"\n onClick={onHeaderClick}\n >\n <span className=\"w-2 h-2 rounded-full bg-emerald-500 animate-pulse\" />\n <span className=\"text-xs font-bold text-emerald-400\">\n {etaData.etaMins} min ({etaData.distanceRemainingKm.toFixed(1)} km)\n </span>\n </div>\n {etaData.onAbort && (\n <Button\n className=\"px-1 py-1 text-[10px] font-black bg-red-500/20 text-red-400 hover:bg-red-500/30 border border-red-500/25 active:scale-95 rounded-md transition-all cursor-pointer pointer-events-auto h-auto p-0!\"\n onClick={(e) => {\n e.stopPropagation();\n etaData.onAbort?.();\n }}\n variant=\"ghost\"\n >\n <svg\n className=\"lucide lucide-x\"\n fill=\"none\"\n height=\"18\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2.5\"\n viewBox=\"0 0 24 24\"\n width=\"18\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M18 6 6 18\"></path>\n <path d=\"m6 6 12 12\"></path>\n </svg>\n </Button>\n )}\n {etaData.progress !== undefined && (\n <div className=\"absolute bottom-0 left-0 right-0 h-[2px] bg-white/5\">\n <div\n className=\"h-full bg-cyan-400\"\n style={{ width: `${etaData.progress}%` }}\n />\n </div>\n )}\n </div>\n );\n }\n\n if (layoutMode === \"open-card\") {\n return (\n <Card className=\"mx-4 mt-2 p-4 bg-white/5 border border-white/10 rounded-xl flex flex-col text-card-foreground\">\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"flex items-center gap-2\">\n <span className=\"w-2 h-2 rounded-full bg-emerald-500 animate-pulse\" />\n <span className=\"text-[10px] font-bold text-emerald-400 uppercase tracking-wider\">\n {etaData.label || \"Journey Active\"}\n </span>\n </div>\n {etaData.onAbort && (\n <Button\n className=\"px-1 py-1 text-xs font-bold bg-red-500/20 text-red-400 hover:bg-red-500/30 border border-red-500/30 active:scale-95 rounded-lg transition-all cursor-pointer pointer-events-auto h-auto p-0!\"\n onClick={etaData.onAbort}\n variant=\"ghost\"\n >\n <svg\n className=\"lucide lucide-x\"\n fill=\"none\"\n height=\"18\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2.5\"\n viewBox=\"0 0 24 24\"\n width=\"18\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M18 6 6 18\"></path>\n <path d=\"m6 6 12 12\"></path>\n </svg>\n </Button>\n )}\n </div>\n\n <CardContent className=\"p-0 flex flex-col\">\n <div className=\"grid grid-cols-2 divide-x divide-white/10 py-1.5 mb-2.5\">\n <div className=\"text-center\">\n <div className=\"text-xl font-black text-white leading-none\">\n {etaData.etaMins}\n <span className=\"text-xs text-zinc-400 font-normal\"> min</span>\n </div>\n <div className=\"text-[8px] text-zinc-500 font-bold uppercase tracking-wider mt-1\">\n Time Remaining\n </div>\n </div>\n <div className=\"text-center\">\n <div className=\"text-xl font-black text-white leading-none\">\n {etaData.distanceRemainingKm.toFixed(1)}\n <span className=\"text-xs text-zinc-400 font-normal\"> km</span>\n </div>\n <div className=\"text-[8px] text-zinc-500 font-bold uppercase tracking-wider mt-1\">\n Distance Remaining\n </div>\n </div>\n </div>\n\n {etaData.progress !== undefined && (\n <div className=\"mb-3\">\n <div className=\"flex justify-between text-[9px] font-bold text-zinc-400 mb-1\">\n <span>Progress</span>\n <span>{Math.round(etaData.progress)}%</span>\n </div>\n <div className=\"h-1 bg-white/10 rounded-full overflow-hidden\">\n <div\n className=\"h-full bg-cyan-400 rounded-full\"\n style={{ width: `${etaData.progress}%` }}\n />\n </div>\n </div>\n )}\n\n {etaData.mode === \"preview\" && etaData.onStart && (\n <Button\n className=\"w-full py-2.5 text-xs font-bold bg-cyan-500 text-black hover:bg-cyan-400 hover:text-black active:scale-95 rounded-lg transition-all cursor-pointer h-auto\"\n onClick={etaData.onStart}\n variant=\"ghost\"\n >\n Start Guidance\n </Button>\n )}\n </CardContent>\n </Card>\n );\n }\n\n // floating-card (centered at bottom of map)\n return (\n <Card\n className={`absolute left-1/2 -translate-x-1/2 z-40 w-[calc(100%-2rem)] max-w-[320px] sm:max-w-[380px] bg-zinc-950/85 backdrop-blur-md border border-white/10 rounded-2xl shadow-2xl p-3 sm:p-4 flex flex-col pointer-events-auto select-none text-card-foreground ${\n isDragging ? \"transition-none\" : \"transition-all duration-300 ease-out\"\n }`}\n style={style}\n >\n <div className=\"flex items-center justify-between mb-2 sm:mb-3\">\n <div className=\"flex items-center gap-2\">\n <span className=\"w-1.5 h-1.5 sm:w-2 sm:h-2 rounded-full bg-emerald-500 animate-pulse\" />\n <span className=\"text-[9px] sm:text-[10px] font-bold text-emerald-400 uppercase tracking-wider\">\n {etaData.label || \"Guidance Active\"}\n </span>\n </div>\n {etaData.onAbort && (\n <Button\n className=\"px-1 py-1 text-[10px] sm:text-xs font-bold bg-red-500/20 text-red-400 hover:bg-red-500/30 border border-red-500/30 active:scale-95 rounded-lg transition-all cursor-pointer h-auto p-0!\"\n onClick={etaData.onAbort}\n variant=\"ghost\"\n >\n <svg\n className=\"lucide lucide-x\"\n fill=\"none\"\n height=\"18\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2.5\"\n viewBox=\"0 0 24 24\"\n width=\"18\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M18 6 6 18\"></path>\n <path d=\"m6 6 12 12\"></path>\n </svg>\n </Button>\n )}\n </div>\n\n <CardContent className=\"p-0 flex flex-col\">\n <div className=\"grid grid-cols-2 divide-x divide-white/10 py-0.5 sm:py-1 mb-2 sm:mb-3\">\n <div className=\"text-center\">\n <div className=\"text-base sm:text-lg font-black text-white leading-none\">\n {etaData.etaMins}\n <span className=\"text-[10px] sm:text-xs text-zinc-400 font-normal\">\n {\" \"}\n min\n </span>\n </div>\n </div>\n <div className=\"text-center\">\n <div className=\"text-base sm:text-lg font-black text-white leading-none\">\n {etaData.distanceRemainingKm.toFixed(1)}\n <span className=\"text-[10px] sm:text-xs text-zinc-400 font-normal\">\n {\" \"}\n km\n </span>\n </div>\n </div>\n </div>\n\n {etaData.progress !== undefined && (\n <div>\n <div className=\"flex justify-between text-[8px] sm:text-[9px] font-bold text-zinc-400 mb-1\">\n <span>Progress</span>\n <span>{Math.round(etaData.progress)}%</span>\n </div>\n <div className=\"h-1 sm:h-1.5 bg-white/10 rounded-full overflow-hidden\">\n <div\n className=\"h-full bg-cyan-400 rounded-full\"\n style={{ width: `${etaData.progress}%` }}\n />\n </div>\n </div>\n )}\n\n {etaData.mode === \"preview\" && etaData.onStart && (\n <Button\n className=\"mt-2.5 sm:mt-3 py-1.5 sm:py-2 text-[11px] sm:text-xs font-bold bg-cyan-500 text-black hover:bg-cyan-400 hover:text-black active:scale-95 rounded-lg transition-all cursor-pointer h-auto\"\n onClick={etaData.onStart}\n variant=\"ghost\"\n >\n Start Guidance\n </Button>\n )}\n </CardContent>\n </Card>\n );\n};\n","import type { CenterCallbackParams } from \"@miniapps-sdk/components\";\nimport type {\n CustomControl,\n EtaData,\n} from \"@miniapps-sdk/components/Map/types\";\nimport { Button } from \"@miniapps-sdk/components/ui/button\";\nimport type { ViewState } from \"@vis.gl/react-maplibre\";\nimport type React from \"react\";\nimport type { DrawerState } from \"./MapDrawer\";\n\nexport interface MapRightControlsProps {\n customControls?: CustomControl[];\n etaBarHeight: number;\n onRecenter: (params?: CenterCallbackParams) => void;\n isMapCentered: boolean;\n mapBearing: number;\n mapPitch: number;\n onResetBearing: (params?: CenterCallbackParams) => void;\n drawerState: DrawerState;\n side: \"left\" | \"bottom\";\n etaData?: EtaData;\n initialViewState?: Partial<ViewState>;\n\n isDragging: boolean;\n clampedDragOffset: number;\n\n // Custom button overrides passed down from facade\n customRecenterButton?: React.ReactNode;\n customCompassButton?: React.ReactNode;\n\n // Drawer customization\n drawerPeekHeight?: string | number;\n\n // Safe area insets\n insets?: { top: number; bottom: number; left: number; right: number };\n}\n\nexport const MapRightControls: React.FC<MapRightControlsProps> = ({\n customControls = [],\n etaBarHeight,\n onRecenter,\n isMapCentered,\n mapBearing,\n mapPitch,\n onResetBearing,\n initialViewState,\n drawerState,\n side,\n etaData,\n isDragging,\n clampedDragOffset,\n customRecenterButton,\n customCompassButton,\n drawerPeekHeight,\n insets = { bottom: 0, left: 0, right: 0, top: 0 },\n}) => {\n const aboveControls = customControls.filter(\n (c) => c.position === \"above-recenter\",\n );\n const belowControls = customControls.filter(\n (c) => c.position === \"below-recenter\",\n );\n\n const isCompassVisible =\n Math.abs(mapBearing) >= 0.5 || Math.abs(mapPitch) >= 0.5;\n\n // Since ETA is floating outside the drawer, the closed drawer height is always 32px (the handle).\n const closedHeightOffset = \"32px\";\n\n // If ETA is active, shift controls up by etaBarHeight to avoid overlapping the centered floating ETA card.\n // Note: when drawer is closed, etaBarHeight already includes bottom inset passed from MapControls\n const activeEtaHeight = etaData\n ? etaBarHeight\n : drawerState === \"closed\"\n ? insets.bottom\n : 0;\n\n const peekStyle =\n typeof drawerPeekHeight === \"number\"\n ? `${drawerPeekHeight}px`\n : drawerPeekHeight || \"15%\";\n\n // Compute bottom positioning offset:\n // If drawer is closed: sits above closed height + active ETA bar height (or inset) + margin\n // If drawer is peek: sits above peek height sheet + active ETA bar height + margin\n const controlsBottom =\n side === \"bottom\"\n ? drawerState === \"closed\"\n ? `calc(${closedHeightOffset} + 1rem + ${activeEtaHeight}px - var(--drag-offset, 0px))`\n : `calc(${peekStyle} + 1rem + ${etaData ? etaBarHeight : 0}px - var(--drag-offset, 0px))`\n : `calc(1rem + ${insets.bottom}px)`;\n\n // Hide right-side controls entirely when drawer is fully open in bottom mode\n const isControlsVisible = side !== \"bottom\" || drawerState !== \"full\";\n\n return (\n <div\n className={`absolute right-4 z-30 flex flex-col items-center gap-3 select-none pointer-events-none ${\n isDragging ? \"transition-none\" : \"transition-all duration-300 ease-out\"\n } ${\n isControlsVisible\n ? \"opacity-100 scale-100 pointer-events-auto\"\n : \"opacity-0 scale-75 pointer-events-none\"\n }`}\n style={{\n bottom: controlsBottom,\n }}\n >\n {/* ABOVE-RECENTER CUSTOM CONTROLS */}\n {aboveControls.length > 0 && (\n <div className=\"flex flex-col gap-2 pointer-events-auto\">\n {aboveControls.map((control) => (\n <div className=\"relative group flex items-center\" key={control.id}>\n {/* Tooltip */}\n {control.tooltip && (\n <div className=\"absolute right-14 pointer-events-none opacity-0 scale-95 origin-right group-hover:opacity-100 group-hover:scale-100 transition-all duration-150 bg-zinc-900/95 border border-white/10 text-white text-xs px-2.5 py-1.5 rounded-lg shadow-xl whitespace-nowrap\">\n {control.tooltip}\n </div>\n )}\n\n {/* Action Button */}\n <Button\n className={`w-12 h-12 rounded-full bg-zinc-950/80 backdrop-blur-md border border-white/10 shadow-lg flex items-center justify-center text-white active:scale-95 transition-all cursor-pointer p-0! hover:bg-zinc-900 hover:text-white ${\n control.activeState\n ? \"ring-2 ring-cyan-400 ring-offset-2 ring-offset-zinc-950\"\n : \"\"\n }`}\n onClick={control.onPress}\n variant=\"ghost\"\n >\n {control.icon}\n </Button>\n </div>\n ))}\n </div>\n )}\n\n {/* COMPASS (OVERRIDDEN OR DEFAULT HIDDEN NORTH-UP) */}\n {isCompassVisible &&\n (customCompassButton ? (\n <div className=\"pointer-events-auto\">{customCompassButton}</div>\n ) : (\n <div className=\"pointer-events-auto\">\n <Button\n className={`w-12 h-12 rounded-full bg-zinc-950/80 backdrop-blur-md border border-white/10 shadow-lg flex items-center justify-center text-white active:scale-95 transition-all duration-300 p-0! hover:bg-zinc-900 hover:text-white ${\n isCompassVisible\n ? \"opacity-100 pointer-events-auto\"\n : \"opacity-0 pointer-events-none h-0 w-0 border-none m-0 p-0 overflow-hidden\"\n }`}\n onClick={() =>\n onResetBearing({ pitch: initialViewState?.pitch ?? 0 })\n }\n style={{\n transform: isCompassVisible\n ? \"scale(1) rotate(0deg)\"\n : \"scale(0.7) rotate(0deg)\",\n }}\n title=\"Reset bearing to North\"\n variant=\"ghost\"\n >\n <svg\n className=\"w-7 h-7 transition-transform duration-75 ease-out\"\n fill=\"none\"\n style={{\n transform: `rotate(${-mapBearing}deg)`,\n }}\n viewBox=\"0 0 24 24\"\n >\n {/* Outer ring */}\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"9.5\"\n stroke=\"white\"\n strokeOpacity=\"0.2\"\n strokeWidth=\"1\"\n />\n {/* North Indicator Needle (Red) */}\n <path d=\"M12 4.5L15 12H9L12 4.5Z\" fill=\"#ef4444\" />\n {/* South Indicator Needle (White) */}\n <path d=\"M12 19.5L9 12H15L12 19.5Z\" fill=\"#f4f4f5\" />\n {/* Pivot Center Point */}\n <circle cx=\"12\" cy=\"12\" fill=\"#18181b\" r=\"1.5\" />\n </svg>\n </Button>\n </div>\n ))}\n\n {/* RECENTER BUTTON (OVERRIDDEN OR DEFAULT) */}\n {customRecenterButton ? (\n <div className=\"pointer-events-auto\">{customRecenterButton}</div>\n ) : (\n <div className=\"pointer-events-auto\">\n <Button\n className={`w-12 h-12 rounded-full bg-zinc-950/80 backdrop-blur-md border border-white/10 shadow-lg flex items-center justify-center text-white active:scale-95 transition-all cursor-pointer p-0! hover:bg-zinc-900 hover:text-white ${\n isMapCentered\n ? \"ring-2 ring-cyan-400 ring-offset-2 ring-offset-zinc-950\"\n : \"\"\n }`}\n onClick={() => onRecenter()}\n title=\"Recenter Map\"\n variant=\"ghost\"\n >\n {isMapCentered ? (\n /* Filled active lock state */\n <svg\n className=\"w-6 h-6 text-cyan-400\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.2\"\n viewBox=\"0 0 24 24\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"8\" />\n <circle cx=\"12\" cy=\"12\" fill=\"currentColor\" r=\"3\" />\n <line x1=\"12\" x2=\"12\" y1=\"2\" y2=\"4\" />\n <line x1=\"12\" x2=\"12\" y1=\"20\" y2=\"22\" />\n <line x1=\"2\" x2=\"4\" y1=\"12\" y2=\"12\" />\n <line x1=\"20\" x2=\"22\" y1=\"12\" y2=\"12\" />\n </svg>\n ) : (\n /* Outlined drifted state */\n <svg\n className=\"w-6 h-6 text-zinc-300\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"8\" />\n <line x1=\"12\" x2=\"12\" y1=\"2\" y2=\"4\" />\n <line x1=\"12\" x2=\"12\" y1=\"20\" y2=\"22\" />\n <line x1=\"2\" x2=\"4\" y1=\"12\" y2=\"12\" />\n <line x1=\"20\" x2=\"22\" y1=\"12\" y2=\"12\" />\n </svg>\n )}\n </Button>\n </div>\n )}\n\n {/* BELOW-RECENTER CUSTOM CONTROLS */}\n {belowControls.length > 0 && (\n <div className=\"flex flex-col gap-2 pointer-events-auto\">\n {belowControls.map((control) => (\n <div className=\"relative group flex items-center\" key={control.id}>\n {/* Tooltip */}\n {control.tooltip && (\n <div className=\"absolute right-14 pointer-events-none opacity-0 scale-95 origin-right group-hover:opacity-100 group-hover:scale-100 transition-all duration-150 bg-zinc-900/95 border border-white/10 text-white text-xs px-2.5 py-1.5 rounded-lg shadow-xl whitespace-nowrap\">\n {control.tooltip}\n </div>\n )}\n\n {/* Action Button */}\n <Button\n className={`w-12 h-12 rounded-full bg-zinc-950/80 backdrop-blur-md border border-white/10 shadow-lg flex items-center justify-center text-white active:scale-95 transition-all cursor-pointer p-0! hover:bg-zinc-900 hover:text-white ${\n control.activeState\n ? \"ring-2 ring-cyan-400 ring-offset-2 ring-offset-zinc-950\"\n : \"\"\n }`}\n onClick={control.onPress}\n variant=\"ghost\"\n >\n {control.icon}\n </Button>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n};\n","import type { DrawerState, EtaData } from \"@miniapps-sdk/components/Map/types\";\nimport type React from \"react\";\nimport {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nexport interface MapInsets {\n top: number;\n bottom: number;\n left: number;\n right: number;\n}\n\nexport interface MapControlsState {\n isFollowing: boolean;\n setIsFollowing: (following: boolean) => void;\n centerOnUser: (params?: CenterCallbackParams) => void;\n bearing: number;\n setBearing: (bearing: number) => void;\n pitch: number;\n setPitch: (pitch: number) => void;\n resetBearing: (params?: CenterCallbackParams) => void;\n\n // Navigation details and controls presence state\n etaData?: EtaData;\n setEtaData: (data?: EtaData) => void;\n hasControls: boolean;\n setHasControls: (hasControls: boolean) => void;\n\n // Drawer state controls\n drawerState: DrawerState;\n setDrawerState: (state: DrawerState) => void;\n /** Stable ref to the drawer's scrollable container. Always available. */\n drawerContentRef: React.RefObject<HTMLDivElement | null>;\n\n // Safe area insets (e.g. for mobile home indicators/notches)\n insets: MapInsets;\n setInsets: (insets: Partial<MapInsets>) => void;\n}\n\nexport interface CenterCallbackParams {\n pitch?: number;\n}\n\ninterface MapControlsContextType extends MapControlsState {\n // Internal registration callbacks for the Map component to hook up its controls\n _registerCenterCallback: (\n cb: (params?: CenterCallbackParams) => void,\n ) => void;\n _registerResetBearingCallback: (\n cb: (params?: CenterCallbackParams) => void,\n ) => void;\n}\n\nexport const MapControlsContext = createContext<MapControlsContextType | null>(\n null,\n);\n\nexport const SDKMapProvider: React.FC<{ children: React.ReactNode }> = ({\n children,\n}) => {\n const [isFollowing, setIsFollowing] = useState(true);\n const [bearing, setBearingState] = useState(0);\n const [pitch, setPitchState] = useState(0);\n const [drawerState, setDrawerStateInternal] = useState<DrawerState>(\"closed\");\n\n // Stable ref created by the provider to ensure it's always available to hook users\n const drawerContentRef = useRef<HTMLDivElement>(null);\n\n const setDrawerState = useCallback((val: DrawerState) => {\n setDrawerStateInternal(val);\n }, []);\n\n // Use stable handlers for hasControls\n const [hasControls, setHasControlsState] = useState(false);\n const setHasControls = useCallback((val: boolean) => {\n setHasControlsState((prev) => (prev === val ? prev : val));\n }, []);\n\n // Use shallow comparison for etaData setter to prevent update loops\n const [etaData, setEtaDataState] = useState<EtaData | undefined>(undefined);\n const setEtaData = useCallback((newData?: EtaData) => {\n setEtaDataState((prev) => {\n if (!prev && !newData) return prev;\n if (!prev || !newData) return newData;\n if (\n prev.etaMins === newData.etaMins &&\n prev.distanceRemainingKm === newData.distanceRemainingKm &&\n prev.label === newData.label &&\n prev.progress === newData.progress &&\n prev.mode === newData.mode &&\n prev.isCalculating === newData.isCalculating &&\n prev.error === newData.error\n ) {\n return prev;\n }\n return newData;\n });\n }, []);\n\n const [insets, setInsetsState] = useState<MapInsets>({\n bottom: 0,\n left: 0,\n right: 0,\n top: 0,\n });\n\n const setInsets = useCallback((newInsets: Partial<MapInsets>) => {\n setInsetsState((prev) => ({ ...prev, ...newInsets }));\n }, []);\n\n const centerCallbackRef = useRef<\n ((params?: CenterCallbackParams) => void) | null\n >(null);\n const resetBearingCallbackRef = useRef<\n ((params?: CenterCallbackParams) => void) | null\n >(null);\n\n const centerOnUser = useCallback((params?: CenterCallbackParams) => {\n if (centerCallbackRef.current) {\n centerCallbackRef.current(params);\n }\n }, []);\n\n const resetBearing = useCallback((params?: CenterCallbackParams) => {\n if (resetBearingCallbackRef.current) {\n resetBearingCallbackRef.current(params);\n }\n }, []);\n\n const _registerCenterCallback = useCallback(\n (cb: (params?: CenterCallbackParams) => void) => {\n centerCallbackRef.current = cb;\n },\n [],\n );\n\n const _registerResetBearingCallback = useCallback(\n (cb: (params?: CenterCallbackParams) => void) => {\n resetBearingCallbackRef.current = cb;\n },\n [],\n );\n\n const setBearing = useCallback((b: number) => {\n setBearingState(b);\n }, []);\n\n const setPitch = useCallback((p: number) => {\n setPitchState(p);\n }, []);\n\n // Memoize context value to block redundant re-renders of listeners\n const contextValue = useMemo(\n () => ({\n _registerCenterCallback,\n _registerResetBearingCallback,\n bearing,\n centerOnUser,\n drawerContentRef,\n drawerState,\n etaData,\n hasControls,\n insets,\n isFollowing,\n pitch,\n resetBearing,\n setBearing,\n setDrawerState,\n setEtaData,\n setHasControls,\n setInsets,\n setIsFollowing,\n setPitch,\n }),\n [\n _registerCenterCallback,\n _registerResetBearingCallback,\n bearing,\n centerOnUser,\n drawerState,\n etaData,\n hasControls,\n isFollowing,\n pitch,\n resetBearing,\n setBearing,\n setDrawerState,\n setEtaData,\n setHasControls,\n setPitch,\n insets,\n setInsets,\n ],\n );\n\n return (\n <MapControlsContext.Provider value={contextValue}>\n {children}\n </MapControlsContext.Provider>\n );\n};\n\nexport const useMapControls = (): MapControlsState => {\n const context = useContext(MapControlsContext);\n if (!context) {\n throw new Error(\"useMapControls must be used within a MapControlsProvider\");\n }\n return context;\n};\n","import { MapDrawer } from \"@miniapps-sdk/components/Map/components/MapDrawer\";\nimport { MapEtaPanel } from \"@miniapps-sdk/components/Map/components/MapEtaPanel\";\nimport { MapRightControls } from \"@miniapps-sdk/components/Map/components/MapRightControls\";\nimport {\n type CenterCallbackParams,\n MapControlsContext,\n} from \"@miniapps-sdk/components/Map/MapContext\";\nimport type {\n CustomControl,\n DrawerState,\n EtaData,\n MenuItem,\n} from \"@miniapps-sdk/components/Map/types\";\nimport type { ViewState } from \"@vis.gl/react-maplibre\";\nimport type React from \"react\";\nimport { useCallback, useContext, useEffect, useRef, useState } from \"react\";\n\nconst resolveHeightToPixels = (\n height: string | number,\n containerHeight: number,\n): number => {\n if (typeof height === \"number\") {\n return height;\n }\n if (height.endsWith(\"%\")) {\n return (parseFloat(height) / 100) * containerHeight;\n }\n return parseFloat(height);\n};\n\nexport interface MapControlsProps {\n // Drawer\n menuItems?: MenuItem[];\n drawerSide?: \"left\" | \"bottom\"; // default: 'left' on landscape, 'bottom' on portrait\n defaultState?: DrawerState; // default: 'closed'\n menuContent?: React.ReactNode;\n children?: React.ReactNode;\n\n // Controls\n customControls?: CustomControl[];\n etaBarHeight?: number; // px — keeps controls above ETA bar\n onRecenter?: (params?: CenterCallbackParams) => void;\n isMapCentered?: boolean;\n mapBearing?: number; // degrees — drives compass visibility and rotation\n initialViewState?: Partial<ViewState>;\n\n // Compass\n onResetBearing?: (params?: CenterCallbackParams) => void;\n\n // Integrated ETA details\n etaData?: EtaData;\n\n // Custom button overrides\n customRecenterButton?: React.ReactNode;\n customCompassButton?: React.ReactNode;\n\n // Drawer customization\n drawerPeekHeight?: string | number;\n drawerFullHeight?: string | number;\n drawerContentRef?: React.Ref<HTMLDivElement>;\n\n // Touch drag customization\n enableTouchDrag?: boolean;\n\n // Scroll to top button customization\n showScrollToTopButton?: boolean;\n scrollToTopThreshold?: number;\n\n // Internal flag to avoid registry update loops\n isInternal?: boolean;\n}\n\nexport const MapControls: React.FC<MapControlsProps> = ({\n menuItems = [],\n drawerSide,\n customControls = [],\n etaBarHeight = 100,\n onRecenter: propRecenter,\n isMapCentered: propMapCentered,\n mapBearing: propMapBearing,\n onResetBearing: propResetBearing,\n etaData,\n customRecenterButton,\n defaultState,\n initialViewState,\n customCompassButton,\n drawerPeekHeight,\n drawerFullHeight,\n drawerContentRef,\n menuContent,\n children,\n enableTouchDrag = false,\n showScrollToTopButton = true,\n scrollToTopThreshold = 300,\n isInternal = false,\n}) => {\n const mapContext = useContext(MapControlsContext);\n\n const contextRef = mapContext?.drawerContentRef;\n\n // Combine property ref and context ref into a single sync callback\n const mergedRef = useCallback(\n (node: HTMLDivElement | null) => {\n // Sync prop ref\n if (drawerContentRef) {\n if (typeof drawerContentRef === \"function\") {\n drawerContentRef(node);\n } else {\n (drawerContentRef as any).current = node;\n }\n }\n // Sync context ref (always an object ref from provider)\n if (contextRef) {\n (contextRef as any).current = node;\n }\n },\n [drawerContentRef, contextRef],\n );\n\n // Local fallback if context is not available (e.g. isolated storybook without provider)\n const [localDrawerState, setLocalDrawerState] = useState<DrawerState>(\n defaultState ?? \"closed\",\n );\n\n const drawerState = mapContext ? mapContext.drawerState : localDrawerState;\n const setDrawerState = useCallback(\n (state: DrawerState) => {\n if (mapContext) {\n mapContext.setDrawerState(state);\n } else {\n setLocalDrawerState(state);\n }\n },\n [mapContext],\n );\n\n // Sync defaultState into context on mount if provided\n // biome-ignore lint/correctness/useExhaustiveDependencies: only run on mount to set initial state\n useEffect(() => {\n if (defaultState && mapContext) {\n mapContext.setDrawerState(defaultState);\n }\n }, []);\n\n const [side, setSide] = useState<\"left\" | \"bottom\">(\"left\");\n const containerRef = useRef<HTMLDivElement>(null);\n const [mapHeight, setMapHeight] = useState(600);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: containerRef is stable and parent is resolved once on mount\n useEffect(() => {\n const parent = containerRef.current?.parentElement;\n if (!parent) return;\n\n const updateHeight = () => {\n setMapHeight(parent.getBoundingClientRect().height);\n };\n\n updateHeight();\n\n const observer = new ResizeObserver(updateHeight);\n observer.observe(parent);\n\n return () => {\n observer.disconnect();\n };\n }, []);\n\n // Set registry flag\n const setHasControls = mapContext?.setHasControls;\n useEffect(() => {\n if (setHasControls && !isInternal) {\n setHasControls(true);\n return () => setHasControls(false);\n }\n }, [setHasControls, isInternal]);\n\n // Fallbacks using context properties if props are not explicitly passed\n const isMapCentered =\n propMapCentered !== undefined\n ? propMapCentered\n : mapContext\n ? mapContext.isFollowing\n : true;\n\n const mapBearing =\n propMapBearing !== undefined\n ? propMapBearing\n : mapContext\n ? mapContext.bearing\n : 0;\n\n const onRecenter = (params?: CenterCallbackParams) => {\n if (propRecenter) {\n propRecenter(params);\n } else if (mapContext) {\n mapContext.centerOnUser(params);\n }\n };\n\n const onResetBearing = (params?: CenterCallbackParams) => {\n if (propResetBearing) {\n propResetBearing(params);\n } else if (mapContext) {\n mapContext.resetBearing(params);\n }\n };\n\n const mapPitch = mapContext ? mapContext.pitch : 0;\n\n // Resolve etaData from context if not explicitly passed as a prop\n const resolvedEtaData = etaData !== undefined ? etaData : mapContext?.etaData;\n\n // Hoisted touch coordinates for live drag sync\n const [touchStartY, setTouchStartY] = useState<number | null>(null);\n const [currentTouchY, setCurrentTouchY] = useState<number | null>(null);\n\n // Handle responsive layout detection for orientation matching\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n const checkLayout = () => {\n if (drawerSide) {\n setSide(drawerSide);\n } else {\n // Landscape: left drawer panel, Portrait: bottom sheet panel\n if (window.innerWidth < 768) {\n setSide(\"bottom\");\n } else {\n setSide(\"left\");\n }\n }\n };\n\n checkLayout();\n window.addEventListener(\"resize\", checkLayout);\n return () => window.removeEventListener(\"resize\", checkLayout);\n }, [drawerSide]);\n\n // Compute live drag offset\n const isDragging = touchStartY !== null && currentTouchY !== null;\n const dragOffset = isDragging ? currentTouchY - touchStartY : 0;\n\n // Resolve height limits\n const fullPx = resolveHeightToPixels(drawerFullHeight || \"85%\", mapHeight);\n const peekPx = resolveHeightToPixels(drawerPeekHeight || \"15%\", mapHeight);\n const bottomInset = mapContext?.insets.bottom || 0;\n const closedPx = 32 + (drawerState === \"closed\" ? bottomInset : 0);\n\n // Clamp drag offset based on the current state to prevent boundaries overshoot\n let clampedDragOffset = dragOffset;\n if (drawerState === \"full\") {\n clampedDragOffset = Math.max(0, Math.min(fullPx - closedPx, dragOffset)); // only down, max to closed\n } else if (drawerState === \"peek\") {\n clampedDragOffset = Math.max(\n -(fullPx - peekPx), // up to full\n Math.min(peekPx - closedPx, dragOffset), // down to closed\n );\n } else if (drawerState === \"closed\") {\n clampedDragOffset = Math.min(0, Math.max(-(fullPx - closedPx), dragOffset)); // only up, max to full\n }\n\n // Calculate dynamic drawer height and opacity for portrait bottom sheet\n let baseHeight = 32;\n if (drawerState === \"peek\") {\n baseHeight = peekPx;\n } else if (drawerState === \"full\") {\n baseHeight = fullPx;\n }\n\n const currentDrawerHeight = baseHeight - clampedDragOffset;\n\n // Smoothly fade out opacity between peek height and 35% of the distance to full\n const startFadeHeight = peekPx + 20; // start fading just above peek\n const endFadeHeight = peekPx + (fullPx - peekPx) * 0.35; // fully faded out at 35% progress\n\n let etaOpacity = 1;\n let etaBottomStyle: string | number = \"1rem\";\n\n if (side === \"bottom\") {\n if (currentDrawerHeight <= startFadeHeight) {\n etaOpacity = 1;\n } else if (currentDrawerHeight >= endFadeHeight) {\n etaOpacity = 0;\n } else {\n const fraction =\n (currentDrawerHeight - startFadeHeight) /\n (endFadeHeight - startFadeHeight);\n etaOpacity = 1 - fraction;\n }\n\n // Add inset if closed, otherwise drawer already pushed up\n const effectiveInset = drawerState === \"closed\" ? bottomInset : 0;\n etaBottomStyle = `calc(${baseHeight + effectiveInset + 16}px - var(--drag-offset, 0px))`;\n } else {\n // Landscape / Left drawer side\n etaOpacity = drawerState === \"full\" ? 0 : 1;\n etaBottomStyle = `calc(1rem + ${bottomInset}px)`;\n }\n\n return (\n <>\n <div ref={containerRef} style={{ display: \"none\" }} />\n\n {/* Dynamic Slide-out Menu Drawer */}\n <MapDrawer\n clampedDragOffset={clampedDragOffset}\n containerHeight={mapHeight}\n currentTouchY={currentTouchY}\n drawerFullHeight={drawerFullHeight}\n drawerPeekHeight={drawerPeekHeight}\n enableTouchDrag={enableTouchDrag}\n etaBarHeight={etaBarHeight}\n etaData={resolvedEtaData}\n isDragging={isDragging}\n menuContent={children || menuContent}\n menuItems={menuItems}\n onChangeState={setDrawerState}\n ref={mergedRef}\n safeAreaInsets={mapContext?.insets}\n scrollToTopThreshold={scrollToTopThreshold}\n setCurrentTouchY={setCurrentTouchY}\n setTouchStartY={setTouchStartY}\n showScrollToTopButton={showScrollToTopButton}\n side={side}\n state={drawerState}\n touchStartY={touchStartY}\n />\n\n {/* Floating Controls stacked on the right side */}\n <MapRightControls\n clampedDragOffset={clampedDragOffset}\n customCompassButton={customCompassButton}\n customControls={customControls}\n customRecenterButton={customRecenterButton}\n drawerPeekHeight={drawerPeekHeight}\n drawerState={drawerState}\n etaBarHeight={\n etaBarHeight + (drawerState === \"closed\" ? bottomInset : 0)\n }\n etaData={resolvedEtaData}\n initialViewState={initialViewState}\n insets={mapContext?.insets}\n isDragging={isDragging}\n isMapCentered={isMapCentered}\n mapBearing={mapBearing}\n mapPitch={mapPitch}\n onRecenter={() => onRecenter()}\n onResetBearing={onResetBearing}\n side={side}\n />\n\n {/* Floating Bottom ETA Card (Landscape or Portrait peek/closed) */}\n {resolvedEtaData && (\n <MapEtaPanel\n etaData={resolvedEtaData}\n isDragging={isDragging}\n layoutMode=\"floating-card\"\n style={{\n bottom: etaBottomStyle,\n opacity: etaOpacity,\n pointerEvents: etaOpacity > 0.1 ? \"auto\" : \"none\",\n transition: isDragging\n ? \"none\"\n : \"bottom 250ms ease-in-out, opacity 300ms ease-out\",\n }}\n />\n )}\n </>\n );\n};\n\nexport type { DrawerState };\n","import { MapControlsContext } from \"@miniapps-sdk/components/Map/MapContext\";\nimport type React from \"react\";\nimport { useContext } from \"react\";\n\nexport interface MapMenuProps {\n children?: React.ReactNode;\n}\n\nexport const MapMenu: React.FC<MapMenuProps> = ({ children }) => {\n return <div className=\"flex flex-col gap-1.5\">{children}</div>;\n};\n\nexport interface MapMenuItemProps {\n id: string;\n label: string;\n icon?: React.ReactNode;\n onPress?: () => void;\n badge?: string | number;\n disabled?: boolean;\n children?: React.ReactNode;\n}\n\nexport const MapMenuItem: React.FC<MapMenuItemProps> = ({\n id,\n label,\n icon,\n onPress,\n badge,\n disabled = false,\n children,\n}) => {\n const context = useContext(MapControlsContext);\n\n const handleClick = (e: React.MouseEvent) => {\n if (disabled) return;\n if (onPress) onPress();\n if (context && context.setDrawerState) {\n context.setDrawerState(\"closed\");\n }\n };\n\n return (\n <button\n className={`flex items-center gap-3 w-full py-3 px-3.5 rounded-xl text-left cursor-pointer transition-all duration-150 ${\n disabled\n ? \"opacity-45 cursor-not-allowed pointer-events-none\"\n : \"hover:bg-white/5 active:bg-white/10 text-white\"\n }`}\n disabled={disabled}\n onClick={handleClick}\n type=\"button\"\n >\n {icon && (\n <div className=\"relative flex items-center justify-center w-8 h-8 rounded-lg bg-white/5 text-zinc-300\">\n {icon}\n {badge !== undefined && (\n <span className=\"absolute -top-1 -right-1 bg-cyan-500 text-black text-[9px] font-extrabold min-w-[15px] h-3.5 rounded-full flex items-center justify-center px-1 border border-zinc-950 shadow\">\n {badge}\n </span>\n )}\n </div>\n )}\n <div className=\"flex-1 flex flex-col justify-center\">\n <span className=\"text-sm font-medium tracking-wide flex-1\">\n {label}\n </span>\n {children}\n </div>\n </button>\n );\n};\n\nMapMenu.displayName = \"MapMenu\";\nMapMenuItem.displayName = \"MapMenuItem\";\n\nexport interface MapMenuTitleProps {\n children: React.ReactNode;\n className?: string;\n showDivider?: boolean;\n}\n\nexport const MapMenuTitle: React.FC<MapMenuTitleProps> = ({\n children,\n showDivider = true,\n className = \"\",\n}) => {\n return (\n <div\n className={`flex items-center justify-between pb-3 first:mt-0 px-3.5 ${className} ${showDivider ? \"border-b border-white/10 mb-2 mt-4\" : \"\"}`}\n >\n {children}\n </div>\n );\n};\nMapMenuTitle.displayName = \"MapMenuTitle\";\n\nexport interface MapMenuDividerProps {\n className?: string;\n}\n\nexport const MapMenuDivider: React.FC<MapMenuDividerProps> = ({\n className = \"\",\n}) => {\n return <div className={`h-[1px] bg-white/10 my-3 mx-3.5 ${className}`} />;\n};\nMapMenuDivider.displayName = \"MapMenuDivider\";\n\nexport interface MapMenuFooterProps {\n children: React.ReactNode;\n className?: string;\n}\n\nexport const MapMenuFooter: React.FC<MapMenuFooterProps> = ({\n children,\n className = \"\",\n}) => {\n return (\n <div\n className={`mt-auto pt-4 border-t border-white/10 px-3.5 text-xs text-zinc-500 font-medium ${className}`}\n >\n {children}\n </div>\n );\n};\nMapMenuFooter.displayName = \"MapMenuFooter\";\n","/**\n * UP Mini-App SDK Types\n */\n\n/**\n * Represents the user's profile information.\n */\nexport interface IUserProfile {\n /** Unique identifier for the user. */\n uuid: string;\n /** Full legal name of the user. */\n fullName: string;\n /** First name of the user. */\n firstName: string;\n /** Last name of the user. */\n lastName: string;\n /** Primary email address. */\n email?: string;\n /** Chosen username within the UP ecosystem. */\n username?: string;\n /** ISO country code (e.g., \"FR\", \"US\"). */\n countryCode: string;\n /** Phone number without country code. */\n localNumber: string;\n /** Admin status. */\n admin: boolean;\n /** UP points balance. */\n ups: number;\n /** Experience points balance. */\n xp: number;\n /** ISO timestamp of user creation. */\n createdAt: string;\n /** ISO timestamp of last password update. */\n lastPasswordUpdate?: string;\n /** URL to profile picture. */\n avatarUrl?: string;\n /** UUID of profile picture. */\n avatarUuid?: string;\n /** URL to user badge. */\n badgeUrl?: string;\n /** UUID of user badge. */\n badgeUuid?: string;\n /** URL to user profile theme. */\n themeUrl?: string;\n /** UUID of user profile theme. */\n themeUuid?: string;\n}\n\n/**\n * Geographic location data.\n */\nexport interface ILocationData {\n coords: {\n /** Latitude in decimal degrees. */\n latitude: number;\n /** Longitude in decimal degrees. */\n longitude: number;\n /** Altitude in meters above the WGS 84 reference ellipsoid, or null if not available. */\n altitude: number | null;\n /** Accuracy of the latitude and longitude properties in meters. */\n accuracy: number | null;\n /** Accuracy of the altitude property in meters. */\n altitudeAccuracy: number | null;\n /** The direction in which the device is traveling, in degrees (0-360). */\n heading: number | null;\n /** The velocity of the device in meters per second. */\n speed: number | null;\n };\n /** The time at which the location was retrieved (Unix timestamp). */\n timestamp: number;\n}\n\n/**\n * Request payload for triggering a payment flow.\n */\nexport interface IPaymentRequest {\n /** The specific amount to charge. */\n amount: number;\n /** ISO currency code (e.g., \"EUR\", \"USD\"). */\n currency: string;\n /** Total amount including taxes/fees. */\n total: number;\n /** Itemized breakdown of the purchase. */\n items: Array<{\n /** Name or description of the item. */\n item: string;\n /** Price per unit. */\n price?: number;\n /** Number of units. */\n quantity?: number;\n }>;\n}\n\n/**\n * Style of haptic feedback.\n */\nexport type HapticStyleType =\n | \"light\"\n | \"medium\"\n | \"heavy\"\n | \"rigid\"\n | \"soft\"\n | \"success\"\n | \"warning\"\n | \"error\";\n\n/**\n * Network Proxy Types\n */\n\n/**\n * The HTTP method to use as request method\n */\nexport type NetworkMethodType = \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\";\n\n/**\n * Configuration for network proxy requests.\n */\nexport interface INetworkOptions {\n /** Full URL for the request. */\n url: string;\n /** HTTP method to use. */\n method: NetworkMethodType;\n /** Request body for POST/PUT/PATCH. */\n body?: unknown;\n /** Custom HTTP headers. */\n headers?: Record<string, string>;\n}\n\n/**\n * Response from a network proxy request.\n */\nexport interface INetworkResponse<T = unknown> {\n /** HTTP status code. */\n status: number;\n /** Response data payload. */\n data: T;\n /** Response headers. */\n headers: Headers;\n}\n\n/**\n * Fidelity & Rewards Types\n */\n\n/**\n * Fidelity program balance information.\n */\nexport interface IFidelityBalance {\n /** Current point or currency balance. */\n balance: number;\n /** Name or symbol of the fidelity currency (e.g., \"FPoints\"). */\n currency: string;\n}\n\n/**\n * Parameters for retrieving fidelity transaction history.\n */\nexport interface IFidelityHistoryParams {\n /** Maximum number of records to return. */\n limit?: number;\n\n /** Cursor for pagination; null for the first page. */\n cursor?: string | null;\n}\n\n/** Type of transaction: credit (add) or debit (remove). */\nexport type FidelityTransactionTypeType = \"credit\" | \"debit\";\n\n/**\n * A single fidelity program transaction.\n */\nexport interface IFidelityTransaction {\n /** Unique identifier for the transaction. */\n id: string;\n /** Amount of the transaction. */\n amount: number;\n /** Human-readable description. */\n description: string;\n /** ISO 8601 date string. */\n date: string;\n /** Type of transaction */\n type: FidelityTransactionTypeType;\n}\n\n/**\n * The initialization options required to set up the Mini-App SDK.\n */\nexport type IInitializationOptions = {};\n\n/**\n * The post initialization response\n */\nexport interface IInitializationResponse<\n Env extends Record<string, unknown> = Record<string, unknown>,\n UserData extends Record<string, unknown> = Record<string, unknown>,\n Params extends Record<string, unknown> = Record<string, unknown>,\n> {\n /** The name of the mini app */\n name: string;\n /** The uuid of the mini app */\n uuid: string;\n /** The description of the mini app */\n description: string;\n /** The authors of the mini app */\n authors?: string;\n /** The current version in the registry */\n version?: string;\n /** The scoped profile based on the requested fields during initialization or the getUserProfile call */\n profile: Partial<IUserProfile | null>;\n /** The environment variables defined for the mini app in the shell's backend */\n env: Env;\n /** The user data passed during the initialization or the setUserData call */\n userData: UserData;\n /** The params passed during the initialization */\n params: Params;\n /** The edge insets of the mini app, representing the padding around the mini app's view within the Host Shell. */\n insets: IEdgeInsets;\n}\n\n/**\n * Events emitted by the UI module.\n */\nexport enum UIEvent {\n /** Triggered when the user performs a native \"Pull-to-Refresh\". */\n TOP_SCROLL_MORE = \"TOP_SCROLL_MORE\",\n /** Triggered when the user scrolls near the bottom of the page (within 200px threshold). */\n BOTTOM_SCROLL_MORE = \"BOTTOM_SCROLL_MORE\",\n /** Triggered when the user performs a native back gesture or presses the native back button. */\n BACK_GESTURE = \"BACK_GESTURE\",\n}\n\n/**\n * Events emitted by the Geolocation module.\n */\nexport enum GeolocationEvent {\n /** Triggered when the user's location is updated (legacy polling). */\n LOCATION_UPDATE = \"LOCATION_UPDATE\",\n /** Triggered by the continuous location stream. */\n LOCATION_STREAM_UPDATE = \"LOCATION_STREAM_UPDATE\",\n}\n\n/**\n * Configuration options for the location stream.\n */\nexport interface LocationStreamConfig {\n /** Polling cycle rate in milliseconds. Default: 250 */\n interval?: number;\n /** Distance change in meters to trigger an update. Default: 5 */\n distanceFilter?: number;\n /** Heading change in degrees to trigger an update. Default: 5 */\n headingThreshold?: number;\n /** Accelerometer delta in G-force to trigger an update. Default: 0.1 */\n accelerometerThreshold?: number;\n}\n\nexport interface StreamLocationData {\n coords: {\n latitude: number;\n longitude: number;\n altitude: number | null;\n accuracy: number | null;\n altitudeAccuracy: number | null;\n heading: number | null;\n speed: number | null;\n };\n timestamp: number;\n}\n\nexport interface StreamHeadingData {\n magneticHeading: number;\n trueHeading: number;\n accuracy: number;\n}\n\nexport interface StreamAccelerometerData {\n x: number;\n y: number;\n z: number;\n}\n\nexport interface StreamUpdatePayload {\n location: StreamLocationData;\n heading: StreamHeadingData;\n accelerometer: StreamAccelerometerData | null;\n timestamp: number;\n}\n\n/**\n * Global events emitted by the Host Shell that may affect the mini-app's context.\n */\nexport enum GlobalEvent {\n /** Triggered when the Host Shell sends an update event to the mini-app, indicating changes in context. */\n UPDATE_CONTEXT = \"UPDATE_CONTEXT\",\n}\n\n/**\n * Union type for all SDK events, allowing for both known enums and custom strings.\n * The (string & {}) pattern preserves IntelliSense for enum members.\n */\nexport type SDKEvent = UIEvent | GeolocationEvent | GlobalEvent | (string & {});\n\n/**\n * Configuration for native scroll interactions managed by the Host Shell.\n */\nexport interface ScrollConfig {\n /** Configuration for Pull-to-Refresh (Top). */\n topScrollMore?: {\n /** Show/hide the native RefreshControl. */\n enabled: boolean;\n /** Set to true to show the loading spinner, false to hide it. */\n refreshing?: boolean;\n };\n /** Configuration for Infinite Scroll (Bottom). */\n bottomScrollMore?: {\n /** Enable/disable bottom scroll detection. */\n enabled: boolean;\n /** If false, detection stops and the indicator is hidden. */\n hasMore?: boolean;\n /** Set to true to show the bottom ActivityIndicator. */\n loadingMore?: boolean;\n };\n}\n\n/**\n * Edge insets representing padding or margins around a component, typically used for layout purposes.\n */\nexport interface IEdgeInsets {\n top: number;\n right: number;\n bottom: number;\n left: number;\n}\n\n/**\n * The context state of the mini-app, which includes dynamic properties provided by the Host Shell, such as edge insets for layout adjustments. This type can be extended with additional properties as needed.\n */\nexport type IContextState = Record<string, any> & {\n insets: IEdgeInsets;\n};\n","import { sdk } from \"@miniapps-sdk/sdk\";\nimport { GeolocationEvent } from \"@miniapps-sdk/types\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport interface UserLocationState {\n coords: [number, number] | null;\n heading: number | null;\n accuracy: number | null;\n}\n\n/**\n * Smoothing factor for interpolation.\n * Higher = faster/snappier (less lag, more jitter)\n * Lower = smoother/slower (more lag, zero jitter)\n */\nconst LERP_FACTOR = 0.12;\n\nexport const useUserLocation = () => {\n // Current \"visible\" state\n const [locationState, setLocationState] = useState<UserLocationState>({\n accuracy: null,\n coords: null,\n heading: null,\n });\n\n // Target values from bridge\n const targetRef = useRef<UserLocationState>({\n accuracy: null,\n coords: null,\n heading: null,\n });\n\n // Current interpolated values (refs to avoid re-renders)\n const currentRef = useRef<UserLocationState>({\n accuracy: null,\n coords: null,\n heading: null,\n });\n\n const mapPayload = useCallback((payload: any): UserLocationState => {\n const coords = payload.location?.coords || payload.coords;\n const headingData = payload.heading || payload.coords;\n\n const newCoords: [number, number] | null = coords\n ? [coords.longitude, coords.latitude]\n : null;\n\n let heading = null;\n if (\n headingData?.trueHeading !== undefined &&\n headingData.trueHeading >= 0\n ) {\n heading = headingData.trueHeading;\n } else if (\n headingData?.magneticHeading !== undefined &&\n headingData.magneticHeading >= 0\n ) {\n heading = headingData.magneticHeading;\n } else if (headingData?.heading !== null && headingData.heading >= 0) {\n heading = headingData.heading;\n }\n\n return {\n accuracy: coords?.accuracy || null,\n coords: newCoords,\n heading,\n };\n }, []);\n\n useEffect(() => {\n let rafId: number;\n\n const animate = () => {\n let changed = false;\n\n // 1. Interpolate Coords\n if (targetRef.current.coords) {\n if (!currentRef.current.coords) {\n currentRef.current.coords = [...targetRef.current.coords];\n changed = true;\n } else {\n const [tLng, tLat] = targetRef.current.coords;\n const [cLng, cLat] = currentRef.current.coords;\n\n const nLng = cLng + (tLng - cLng) * LERP_FACTOR;\n const nLat = cLat + (tLat - cLat) * LERP_FACTOR;\n\n // Only update if difference is significant to save cycles\n if (Math.abs(nLng - cLng) > 1e-7 || Math.abs(nLat - cLat) > 1e-7) {\n currentRef.current.coords = [nLng, nLat];\n changed = true;\n }\n }\n }\n\n // 2. Interpolate Heading (Shortest Path)\n if (targetRef.current.heading !== null) {\n if (currentRef.current.heading === null) {\n currentRef.current.heading = targetRef.current.heading;\n changed = true;\n } else {\n const target = targetRef.current.heading;\n const current = currentRef.current.heading;\n\n // Find shortest delta (handle 0/360 wrap)\n let delta = target - current;\n if (delta > 180) delta -= 360;\n if (delta < -180) delta += 360;\n\n const nHeading = current + delta * LERP_FACTOR;\n // Normalize to [0, 360)\n const normalized = ((nHeading % 360) + 360) % 360;\n\n if (Math.abs(delta) > 0.1) {\n currentRef.current.heading = normalized;\n changed = true;\n }\n }\n }\n\n if (changed) {\n setLocationState({\n accuracy: targetRef.current.accuracy,\n coords: currentRef.current.coords\n ? [...currentRef.current.coords]\n : null,\n heading: currentRef.current.heading,\n });\n }\n\n rafId = requestAnimationFrame(animate);\n };\n\n rafId = requestAnimationFrame(animate);\n\n // Initial fetch\n sdk.location\n .getCurrentPosition()\n .then((data) => {\n const payload = mapPayload(data);\n targetRef.current = payload;\n })\n .catch((e) => console.warn(\"Initial location fetch failed\", e));\n\n const unsubscribeStream = sdk.on(\n GeolocationEvent.LOCATION_STREAM_UPDATE,\n (payload: any) => {\n targetRef.current = mapPayload(payload);\n },\n );\n\n const unsubscribeLegacy = sdk.on(\n GeolocationEvent.LOCATION_UPDATE,\n (payload: any) => {\n targetRef.current = mapPayload(payload);\n },\n );\n\n sdk.location\n .startStream({\n distanceFilter: 1,\n headingThreshold: 2,\n })\n .catch((e) => console.warn(\"Failed to start location stream\", e));\n\n return () => {\n cancelAnimationFrame(rafId);\n unsubscribeStream();\n unsubscribeLegacy();\n sdk.location.stopStream().catch(() => {});\n };\n }, [mapPayload]);\n\n return locationState;\n};\n","import { useUserLocation } from \"@miniapps-sdk/components/Map/hooks/useUserLocation\";\nimport { sdk } from \"@miniapps-sdk/sdk\";\nimport type { RouteResponse } from \"@miniapps-sdk/types\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nexport interface LiveRoutingOptions {\n /** Origin coordinates [lng, lat]. If not provided, uses device location. */\n origin?: [number, number] | null;\n /** Destination coordinates [lng, lat] */\n destination: [number, number] | null;\n /** Transport profile. Defaults to 'driving'. */\n profile?: \"driving\" | \"cycling\" | \"walking\";\n /** Minimum distance in meters the user must move before recalculating path geometry. Defaults to 50. */\n recalculateThreshold?: number;\n /** Whether live routing is active. */\n enabled?: boolean;\n /** Initial mode: 'preview' or 'navigation'. Defaults to 'preview'. */\n initialMode?: \"preview\" | \"navigation\";\n}\n\nexport interface LiveRoutingResult {\n /** The calculated route data from the last API call */\n route: RouteResponse[\"data\"] | null;\n /** Real-time distance to destination in meters */\n currentDistanceMeters: number | null;\n /** The initial total distance when the destination was first set */\n totalDistance: number | null;\n /** Whether a new calculation is in progress */\n isCalculating: boolean;\n /** Any error message from the routing service */\n error: string | null;\n /** Force a manual recalculation */\n recalculate: () => void;\n /** Current mode: 'preview' (overview) or 'navigation' (active guidance) */\n mode: \"preview\" | \"navigation\";\n /** Start active navigation (switch mode to 'navigation') */\n start: () => void;\n}\n\nexport const useLiveRouting = ({\n origin: manualOrigin,\n destination,\n profile = \"driving\",\n recalculateThreshold = 50,\n enabled = true,\n initialMode = \"preview\",\n}: LiveRoutingOptions): LiveRoutingResult => {\n const [route, setRoute] = useState<RouteResponse[\"data\"] | null>(null);\n const [totalDistance, setTotalDistance] = useState<number | null>(null);\n const [isCalculating, setIsCalculating] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [mode, setMode] = useState<\"preview\" | \"navigation\">(initialMode);\n\n const userLocationState = useUserLocation();\n // calculationOrigin: used for the route API call (can be a fixed start point)\n // trackingLocation: always live GPS — used for real-time distance/progress tracking\n const calculationOrigin = manualOrigin || userLocationState.coords;\n const trackingLocation = userLocationState.coords || manualOrigin;\n\n const lastCalcOrigin = useRef<[number, number] | null>(null);\n const lastCalcDest = useRef<[number, number] | null>(null);\n const isRequestInProgress = useRef(false);\n\n // Helper to calculate distance between two points (Haversine)\n const getDistance = useCallback(\n (p1: [number, number], p2: [number, number]) => {\n const R = 6371e3; // meters\n const φ1 = (p1[1] * Math.PI) / 180;\n const φ2 = (p2[1] * Math.PI) / 180;\n const Δφ = ((p2[1] - p1[1]) * Math.PI) / 180;\n const Δλ = ((p2[0] - p1[0]) * Math.PI) / 180;\n\n const a =\n Math.sin(Δφ / 2) * Math.sin(Δφ / 2) +\n Math.cos(φ1) * Math.cos(φ2) * Math.sin(Δλ / 2) * Math.sin(Δλ / 2);\n const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n\n return R * c;\n },\n [],\n );\n\n // Real-time distance calculation along route coordinates.\n // ALWAYS uses trackingLocation (live GPS), never the fixed manualOrigin,\n // so it updates as the user physically moves.\n const currentDistanceMeters = useMemo(() => {\n if (!trackingLocation || !route || route.geometry.coordinates.length < 2) {\n if (trackingLocation && destination) {\n return getDistance(trackingLocation, destination);\n }\n return null;\n }\n\n const coords = route.geometry.coordinates as [number, number][];\n\n // Find the coordinate on the route closest to the user's live position\n let minDistSq = Infinity;\n let closestIndex = 0;\n\n const getDistSq = (p1: [number, number], p2: [number, number]) =>\n (p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2;\n\n for (let i = 0; i < coords.length; i++) {\n const d = getDistSq(trackingLocation, coords[i] as [number, number]);\n if (d < minDistSq) {\n minDistSq = d;\n closestIndex = i;\n }\n }\n\n // Sum distance along remaining route segments starting from the user's exact position\n const remainingCoords = coords.slice(closestIndex + 1);\n let dist = 0;\n let prev: [number, number] = trackingLocation;\n for (const coord of remainingCoords) {\n dist += getDistance(prev, coord as [number, number]);\n prev = coord as [number, number];\n }\n return dist;\n }, [trackingLocation, route, destination, getDistance]);\n\n const calculate = useCallback(\n async (\n origin: [number, number],\n dest: [number, number],\n isNewDest: boolean,\n ) => {\n if (isRequestInProgress.current) return;\n\n isRequestInProgress.current = true;\n setIsCalculating(true);\n\n try {\n const data = await sdk.routing.getRoute({\n destination: dest,\n origin,\n profile,\n });\n\n setRoute(data);\n setError(null);\n\n if (isNewDest) {\n const coords = data.geometry.coordinates;\n let sum = 0;\n for (let i = 0; i < coords.length - 1; i++) {\n sum += getDistance(\n coords[i] as [number, number],\n coords[i + 1] as [number, number],\n );\n }\n setTotalDistance(sum);\n }\n\n lastCalcOrigin.current = origin;\n lastCalcDest.current = dest;\n } catch (err: any) {\n setError(err.message || \"Failed to fetch route\");\n } finally {\n setIsCalculating(false);\n isRequestInProgress.current = false;\n }\n },\n [profile, getDistance],\n );\n\n useEffect(() => {\n if (!enabled || !destination || !calculationOrigin) {\n if (!enabled || !destination) {\n setRoute(null);\n setTotalDistance(null);\n lastCalcOrigin.current = null;\n lastCalcDest.current = null;\n }\n return;\n }\n\n const destChanged =\n !lastCalcDest.current ||\n lastCalcDest.current[0] !== destination[0] ||\n lastCalcDest.current[1] !== destination[1];\n\n if (destChanged) {\n calculate(calculationOrigin, destination, true);\n } else if (lastCalcOrigin.current) {\n // Recalculate route geometry only if user drifted far from last calc origin\n const livePos = trackingLocation || calculationOrigin;\n const dist = getDistance(livePos, lastCalcOrigin.current);\n if (dist > recalculateThreshold) {\n calculate(livePos, destination, false);\n }\n } else {\n calculate(calculationOrigin, destination, true);\n }\n }, [\n calculationOrigin,\n trackingLocation,\n destination,\n enabled,\n recalculateThreshold,\n calculate,\n getDistance,\n ]);\n\n return {\n currentDistanceMeters,\n error,\n isCalculating,\n mode,\n recalculate: () =>\n calculationOrigin &&\n destination &&\n calculate(calculationOrigin, destination, false),\n route,\n start: () => setMode(\"navigation\"),\n totalDistance,\n };\n};\n\n/**\n * A simple hook to fetch a route once between two points.\n * Does not automatically recalculate or track user location.\n */\nexport const useRoute = (\n origin: [number, number] | null,\n destination: [number, number] | null,\n profile: \"driving\" | \"cycling\" | \"walking\" = \"driving\",\n) => {\n const [route, setRoute] = useState<RouteResponse[\"data\"] | null>(null);\n const [isCalculating, setIsCalculating] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (!origin || !destination) {\n setRoute(null);\n return;\n }\n\n const fetchRoute = async () => {\n setIsCalculating(true);\n try {\n const data = await sdk.routing.getRoute({\n destination,\n origin,\n profile,\n });\n setRoute(data);\n setError(null);\n } catch (err: any) {\n setError(err.message || \"Failed to fetch route\");\n } finally {\n setIsCalculating(false);\n }\n };\n\n fetchRoute();\n }, [origin, destination, profile]);\n\n return { error, isCalculating, route };\n};\n","import { useMemo } from \"react\";\n\n/**\n * Slices a LineString to start at the point closest to the provided coordinates.\n * This removes the \"already traveled\" portion of the route.\n */\nexport const useTrimmedRoute = (\n route: GeoJSON.LineString | undefined,\n userLocation: [number, number] | null,\n): GeoJSON.LineString | undefined => {\n return useMemo(() => {\n if (!route || !userLocation || route.coordinates.length < 2) return route;\n\n const coords = route.coordinates as [number, number][];\n\n // 1. Find the index of the segment closest to the user\n let minDistance = Infinity;\n let closestIndex = 0;\n\n const getDistSq = (p1: [number, number], p2: [number, number]) => {\n return (p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2;\n };\n\n // We search for the point in the original geometry closest to the user\n for (let i = 0; i < coords.length; i++) {\n const dist = getDistSq(userLocation, coords[i]);\n if (dist < minDistance) {\n minDistance = dist;\n closestIndex = i;\n }\n }\n\n // 2. Slice the route from that point onwards\n // We also prepend the ACTUAL user location to ensure the line starts exactly at the blue dot\n const remainingCoords = coords.slice(closestIndex + 1);\n\n return {\n coordinates: [userLocation, ...remainingCoords],\n type: \"LineString\",\n };\n }, [route, userLocation]);\n};\n","import { Layer, Source } from \"@vis.gl/react-maplibre\";\nimport type React from \"react\";\n\nexport interface RouteLayerProps {\n /** The route geometry as a GeoJSON LineString */\n geometry?: GeoJSON.LineString;\n /** Color of the route line. Defaults to #3b82f6 (blue-500). */\n color?: string;\n /** Width of the route line. Defaults to 5. */\n width?: number;\n /** Opacity of the route line. Defaults to 0.8. */\n opacity?: number;\n}\n\nexport const RouteLayer: React.FC<RouteLayerProps> = ({\n geometry,\n color = \"#3b82f6\",\n width = 5,\n opacity = 0.8,\n}) => {\n if (!geometry) return null;\n\n const data: GeoJSON.Feature<GeoJSON.LineString> = {\n geometry,\n properties: {},\n type: \"Feature\",\n };\n\n return (\n <Source data={data} id=\"sdk-route-source\" type=\"geojson\">\n <Layer\n id=\"sdk-route-layer-casing\"\n paint={{\n \"line-blur\": 1,\n \"line-color\": \"#ffffff\",\n \"line-opacity\": opacity,\n \"line-width\": width + 2,\n }}\n type=\"line\"\n />\n <Layer\n id=\"sdk-route-layer\"\n layout={{\n \"line-cap\": \"round\",\n \"line-join\": \"round\",\n }}\n paint={{\n \"line-color\": color,\n \"line-opacity\": opacity,\n \"line-width\": width,\n }}\n type=\"line\"\n />\n </Source>\n );\n};\n","import type { MapRef } from \"@vis.gl/react-maplibre\";\nimport { Map as MapLibre, MapProvider } from \"@vis.gl/react-maplibre\";\nimport React, {\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport \"maplibre-gl/dist/maplibre-gl.css\";\nimport { MapControls } from \"@miniapps-sdk/components/Map/components/MapControls\";\nimport {\n MapMenu,\n MapMenuDivider,\n MapMenuFooter,\n MapMenuItem,\n MapMenuTitle,\n} from \"@miniapps-sdk/components/Map/components/MapMenu\";\nimport { useLiveRouting } from \"@miniapps-sdk/components/Map/hooks/useLiveRouting\";\nimport { useTrimmedRoute } from \"@miniapps-sdk/components/Map/hooks/useTrimmedRoute\";\nimport { useUserLocation } from \"@miniapps-sdk/components/Map/hooks/useUserLocation\";\nimport { POILayers } from \"@miniapps-sdk/components/Map/layers/POILayers\";\nimport { POIMarkers } from \"@miniapps-sdk/components/Map/layers/POIMarkers\";\nimport { RouteLayer } from \"@miniapps-sdk/components/Map/layers/RouteLayer\";\nimport { UserLocationLayer } from \"@miniapps-sdk/components/Map/layers/UserLocationLayer\";\nimport {\n type CenterCallbackParams,\n MapControlsContext,\n SDKMapProvider,\n} from \"@miniapps-sdk/components/Map/MapContext\";\nimport type { MapProps, POI } from \"@miniapps-sdk/components/Map/types\";\nimport { sdk } from \"@miniapps-sdk/sdk.ts\";\n\nconst MapInternal: React.FC<MapProps> = ({\n initialViewState = {\n latitude: 45.90583599233422,\n longitude: 6.12589018919138,\n zoom: 12,\n },\n style = {},\n mapStyle = \"https://tiles.cloudparse.fr/style/up_dark_matter\",\n className = \"\",\n maxBounds,\n children,\n onClick,\n onMapClickMiss,\n onContextMenu,\n interactiveLayerIds = [],\n onLoad,\n showUserLocation = true,\n followUser: initialFollowUser = false,\n showUserLocationButton = true,\n renderUserLocation,\n pois = [],\n onPoiClick,\n route: externalRoute,\n showNavigationUI: externalShowNavigationUI,\n navigationData: externalNavigationData,\n onNavigationAbort,\n onNavigationModeChange,\n navigation,\n showControls = true,\n menuItems,\n menuContent,\n drawerState: propDrawerState,\n drawerContentRef,\n controlProps = {},\n enableTouchDrag = false,\n}) => {\n const mapControls = useContext(MapControlsContext);\n\n const mapRef = useRef<MapRef | null>(null);\n\n // Get user location state (data only)\n const userLocationState = useUserLocation();\n\n // Programmatic Navigation State (Overrides)\n const [progNav, setProgNav] = useState<{\n destination: [number, number] | null;\n origin?: [number, number] | null;\n profile?: \"driving\" | \"cycling\" | \"walking\";\n mode?: \"preview\" | \"navigation\";\n recalculateThreshold?: number;\n showUI?: boolean;\n } | null>(null);\n\n const [isAborted, setIsAborted] = useState(false);\n\n useEffect(() => {\n const unsubCreate = sdk.on(\"SDK_NAVIGATION_CREATE\", (payload: any) => {\n setIsAborted(false);\n setProgNav(payload);\n });\n const unsubStart = sdk.on(\"SDK_NAVIGATION_START\", () => {\n setIsAborted(false);\n setProgNav((prev) => (prev ? { ...prev, mode: \"navigation\" } : null));\n });\n const unsubAbort = sdk.on(\"SDK_NAVIGATION_ABORT\", () => {\n setIsAborted(true);\n setProgNav(null);\n });\n\n return () => {\n unsubCreate();\n unsubStart();\n unsubAbort();\n };\n }, []);\n\n // Internal Navigation Hook\n const effectiveNavOptions = progNav || navigation;\n const internalNav = useLiveRouting({\n destination: effectiveNavOptions?.destination || null,\n enabled: !!effectiveNavOptions?.destination,\n initialMode: effectiveNavOptions?.mode || \"preview\",\n origin: effectiveNavOptions?.origin,\n profile: effectiveNavOptions?.profile || \"driving\",\n recalculateThreshold: effectiveNavOptions?.recalculateThreshold || 50,\n });\n\n // Sync mode changes back to parent\n useEffect(() => {\n if (onNavigationModeChange && navigation) {\n onNavigationModeChange(internalNav.mode);\n }\n }, [internalNav.mode, onNavigationModeChange, navigation]);\n\n // Reset isAborted when destination changes\n const prevDest = useRef<any>(null);\n const currentDest = effectiveNavOptions?.destination;\n useEffect(() => {\n if (currentDest) {\n if (\n !prevDest.current ||\n prevDest.current[0] !== currentDest[0] ||\n prevDest.current[1] !== currentDest[1]\n ) {\n setIsAborted(false);\n }\n }\n prevDest.current = currentDest;\n }, [currentDest]);\n\n // Merge external and internal data\n const navigationData = !isAborted\n ? effectiveNavOptions\n ? internalNav\n : externalNavigationData\n : undefined;\n const route = !isAborted\n ? effectiveNavOptions\n ? internalNav.route?.geometry\n : externalRoute\n : undefined;\n const showNavigationUI =\n !isAborted &&\n effectiveNavOptions?.showUI !== false &&\n (effectiveNavOptions\n ? !!effectiveNavOptions.destination\n : externalShowNavigationUI);\n\n const mode = navigationData?.mode || \"preview\";\n const resolvedInitialFollow = mapControls\n ? mapControls.isFollowing\n : initialFollowUser;\n\n // Synchronous refs for the render loop to avoid React state batching race conditions\n const isFollowingRef = useRef(resolvedInitialFollow);\n const isFlyingRef = useRef(false);\n\n // We use the context directly for UI updates if it exists, otherwise we fallback to a local state\n const [localIsFollowingUI, setLocalIsFollowingUI] = useState(\n resolvedInitialFollow,\n );\n const isFollowingUI = mapControls\n ? mapControls.isFollowing\n : localIsFollowingUI;\n\n const setIsFollowingCtx = mapControls?.setIsFollowing;\n\n const setFollowMode = useCallback(\n (follow: boolean) => {\n isFollowingRef.current = follow;\n\n // Update local UI state as a fallback\n setLocalIsFollowingUI(follow);\n\n // Update context UI state\n if (setIsFollowingCtx) {\n setIsFollowingCtx(follow);\n }\n },\n [setIsFollowingCtx],\n );\n\n // Sync context state changes into the local ref (if external client called setFollowMode)\n useEffect(() => {\n if (mapControls && mapControls.isFollowing !== isFollowingRef.current) {\n isFollowingRef.current = mapControls.isFollowing;\n }\n }, [mapControls?.isFollowing, mapControls]);\n\n const mergedInteractiveLayerIds = [...interactiveLayerIds];\n if (pois.length > 0 && !mergedInteractiveLayerIds.includes(\"sdk-poi-layer\")) {\n mergedInteractiveLayerIds.push(\"sdk-poi-layer\");\n }\n\n const prevInitialFollow = useRef(initialFollowUser);\n // Reactive follow state sync from props\n useEffect(() => {\n if (initialFollowUser !== prevInitialFollow.current) {\n setFollowMode(initialFollowUser);\n prevInitialFollow.current = initialFollowUser;\n\n if (initialFollowUser && userLocationState.coords && mapRef.current) {\n isFlyingRef.current = true;\n mapRef.current.flyTo({\n center: userLocationState.coords,\n duration: 1000,\n essential: true,\n zoom: Math.max(mapRef.current.getZoom(), 16),\n });\n setTimeout(() => {\n isFlyingRef.current = false;\n }, 1050);\n }\n }\n }, [initialFollowUser, setFollowMode, userLocationState.coords]);\n\n const lastAutoLockedRouteRef = useRef<any>(null);\n const lastModeRef = useRef<string | null>(null);\n\n // Auto-lock camera or fit bounds depending on mode\n useEffect(() => {\n if (!route || !mapRef.current) {\n if (!route) lastAutoLockedRouteRef.current = null;\n return;\n }\n\n const isNewRoute = route !== lastAutoLockedRouteRef.current;\n const modeChanged = lastModeRef.current !== mode;\n\n if (mode === \"navigation\") {\n setFollowMode(true);\n if (\n (modeChanged || isNewRoute) &&\n userLocationState.coords &&\n mapRef.current\n ) {\n isFlyingRef.current = true;\n mapRef.current.flyTo({\n center: userLocationState.coords,\n duration: 1000,\n essential: true,\n zoom: 17, // Zoomed in on user for active guidance\n });\n setTimeout(() => {\n isFlyingRef.current = false;\n }, 1050);\n }\n } else if (mode === \"preview\" && isNewRoute) {\n setFollowMode(false);\n // Fit bounds to show entire route\n const coords = route.coordinates;\n if (coords.length > 0) {\n const bounds = coords.reduce(\n (acc, coord) => {\n return [\n [Math.min(acc[0][0], coord[0]), Math.min(acc[0][1], coord[1])],\n [Math.max(acc[1][0], coord[0]), Math.max(acc[1][1], coord[1])],\n ];\n },\n [\n [coords[0][0], coords[0][1]],\n [coords[0][0], coords[0][1]],\n ],\n );\n\n mapRef.current.fitBounds(\n [bounds[0][0], bounds[0][1], bounds[1][0], bounds[1][1]],\n { padding: 100, speed: 1.2 },\n );\n }\n }\n\n lastAutoLockedRouteRef.current = route;\n lastModeRef.current = mode;\n }, [route, mode, setFollowMode, userLocationState.coords]);\n\n // Continuous Camera Tracking\n useEffect(() => {\n // Read from the ref synchronously to guarantee we don't fight a manual interaction that just occurred\n if (\n isFollowingRef.current &&\n !isFlyingRef.current &&\n userLocationState.coords &&\n mapRef.current\n ) {\n mapRef.current.easeTo({\n center: userLocationState.coords,\n duration: 50, // Ultra-short for high-frequency interpolated stream\n easing: (t) => t,\n essential: true,\n });\n }\n }, [userLocationState.coords]);\n\n // Dynamically trim the route\n const displayRoute = useTrimmedRoute(\n route,\n showUserLocation ? userLocationState.coords : null,\n );\n\n // Compute etaData from navigationData if active\n // Extract primitives directly so useMemo dependency array can track changes\n const currentDistMeters = navigationData?.currentDistanceMeters ?? null;\n const totalDist = navigationData?.totalDistance ?? null;\n const routeDurationSeconds = navigationData?.route?.durationSeconds ?? null;\n\n // Use currentDistanceMeters (real-time along route) — never fall back to route.distanceMeters\n // (that's the total distance, which would make progress 0 or negative)\n const remainingMeters = currentDistMeters ?? 0;\n\n // ETA: scale route duration proportionally to remaining distance\n const etaMins = (() => {\n if (!routeDurationSeconds || !totalDist || !currentDistMeters) return 0;\n const ratio = currentDistMeters / totalDist;\n return Math.ceil((routeDurationSeconds * ratio) / 60);\n })();\n\n const kmRemaining = remainingMeters / 1000;\n\n const progressValue =\n totalDist && totalDist > 0\n ? Math.min(\n 100,\n Math.max(0, ((totalDist - remainingMeters) / totalDist) * 100),\n )\n : 0;\n\n // No useMemo here — primitive deps change on every location update,\n // useMemo was hiding the updates because navigationData object ref is stable\n const showEtaData =\n navigationData && route\n ? {\n distanceRemainingKm: kmRemaining,\n etaMins,\n label:\n mode === \"navigation\" ? \"Walking Guidance Active\" : \"Route Preview\",\n mode: mode,\n onAbort: () => {\n setIsAborted(true);\n setProgNav(null);\n sdk.navigation.abort();\n if (onNavigationAbort) {\n onNavigationAbort();\n }\n },\n onStart: navigationData.start,\n progress: progressValue,\n }\n : undefined;\n\n // Sync etaData to context so controls can access it\n const setEtaDataCtx = mapControls?.setEtaData;\n useEffect(() => {\n if (setEtaDataCtx) {\n setEtaDataCtx(showEtaData);\n }\n }, [showEtaData, setEtaDataCtx]);\n\n // Sync propDrawerState to context so it can be controlled programmatically from Map props\n const setDrawerStateCtx = mapControls?.setDrawerState;\n useEffect(() => {\n if (setDrawerStateCtx && propDrawerState !== undefined) {\n setDrawerStateCtx(propDrawerState);\n }\n }, [propDrawerState, setDrawerStateCtx]);\n\n const defaultMenuItems = useMemo(\n () => [\n {\n icon: (\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n >\n <path\n d=\"M12 11c0 3.517-1.009 6.799-2.753 9.571m-3.44-2.04l.054-.09A13.916 13.916 0 008 11a4 4 0 118 0c0 1.017-.07 2.019-.203 3m-2.118 6.844A21.88 21.88 0 0015.171 17m3.839 1.132c.645-2.266.99-4.659.99-7.132A8 8 0 008 4.07M3 15.364c.64-1.319 1-2.8 1-4.364 0-1.457.39-2.823 1.07-4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n ),\n id: \"walking\",\n label: \"Walking Mode\",\n onPress: () => {},\n },\n ],\n [],\n );\n\n const resolvedMenuItems = menuItems || defaultMenuItems;\n\n const { mapLibreChildren, menuContentFromChildren } = useMemo(() => {\n const mapLibreChildren: React.ReactNode[] = [];\n const extractedMenuItems: React.ReactNode[] = [];\n\n React.Children.forEach(children, (child) => {\n if (React.isValidElement(child)) {\n const type = child.type;\n const displayName = (type as any)?.displayName || (type as any)?.name;\n const isMenu = type === MapMenu || displayName === \"MapMenu\";\n const isMenuComponent =\n isMenu ||\n type === MapMenuItem ||\n type === MapMenuTitle ||\n type === MapMenuDivider ||\n type === MapMenuFooter ||\n [\n \"MapMenuItem\",\n \"MapMenuTitle\",\n \"MapMenuDivider\",\n \"MapMenuFooter\",\n ].includes(displayName);\n\n if (isMenu) {\n React.Children.forEach(\n (child as React.ReactElement<any>).props.children,\n (nestedChild) => {\n if (nestedChild) {\n extractedMenuItems.push(nestedChild);\n }\n },\n );\n } else if (isMenuComponent) {\n extractedMenuItems.push(child);\n } else {\n mapLibreChildren.push(child);\n }\n } else {\n mapLibreChildren.push(child);\n }\n });\n\n const menuContentFromChildren =\n extractedMenuItems.length > 0 ? (\n <MapMenu>{extractedMenuItems}</MapMenu>\n ) : null;\n\n return { mapLibreChildren, menuContentFromChildren };\n }, [children]);\n\n const handleMapClick = (e: any) => {\n const clickedFeatures = e.features || [];\n\n if (onPoiClick) {\n const poiFeature = clickedFeatures.find(\n (f: any) => f.layer.id === \"sdk-poi-layer\",\n );\n if (poiFeature) {\n onPoiClick(poiFeature.properties as POI);\n return;\n }\n }\n\n // Check if the click hit any interactive layers\n const hitInteractive = clickedFeatures.some((f: any) =>\n mergedInteractiveLayerIds.includes(f.layer.id),\n );\n\n if (!hitInteractive) {\n if (onMapClickMiss) {\n onMapClickMiss(e);\n }\n }\n\n if (onClick) onClick(e);\n };\n\n const handleCenterOnUser = useCallback(\n (payload?: CenterCallbackParams) => {\n if (userLocationState.coords && mapRef.current) {\n setFollowMode(true);\n isFlyingRef.current = true; // Lock continuous tracking during the cinematic flyTo\n\n mapRef.current.flyTo({\n center: userLocationState.coords,\n duration: 1000,\n essential: true,\n pitch: payload?.pitch || 0,\n zoom: Math.max(mapRef.current.getZoom(), 16),\n });\n\n // Release the lock when flyTo completes\n setTimeout(() => {\n isFlyingRef.current = false;\n }, 1050);\n }\n },\n [userLocationState.coords, setFollowMode],\n );\n\n const handleResetBearing = useCallback((params?: CenterCallbackParams) => {\n if (mapRef.current) {\n mapRef.current.easeTo({\n bearing: 0,\n duration: 500,\n essential: true,\n pitch: params?.pitch ?? 0,\n });\n }\n }, []);\n\n // Register callbacks to context so controls can trigger centering and resets\n useEffect(() => {\n if (mapControls) {\n mapControls._registerCenterCallback(handleCenterOnUser);\n mapControls._registerResetBearingCallback(handleResetBearing);\n }\n }, [mapControls, handleCenterOnUser, handleResetBearing]);\n\n const handleMove = useCallback(() => {\n if (mapRef.current && mapControls) {\n mapControls.setBearing(mapRef.current.getBearing());\n mapControls.setPitch(mapRef.current.getPitch());\n }\n }, [mapControls]);\n\n // Instantly halt animations and drop tracking on manual input\n const handleUserInteraction = () => {\n if (isFollowingRef.current) {\n console.log(\"[SDK:Map] Manual interaction detected. Halting tracking.\");\n setFollowMode(false);\n if (mapRef.current) {\n mapRef.current.stop(); // Stops any ongoing easeTo immediately\n }\n }\n };\n\n return (\n <div\n className={`w-full h-full overflow-hidden relative ${className}`}\n style={style}\n >\n <MapLibre\n attributionControl={false}\n initialViewState={initialViewState}\n interactiveLayerIds={mergedInteractiveLayerIds}\n mapStyle={mapStyle}\n maxBounds={maxBounds}\n onClick={handleMapClick}\n onContextMenu={onContextMenu}\n onDragStart={handleUserInteraction}\n onLoad={(e) => {\n if (onLoad) onLoad(e);\n if (initialFollowUser && userLocationState.coords && mapRef.current) {\n mapRef.current.jumpTo({\n center: userLocationState.coords,\n zoom: 16,\n });\n }\n }}\n onMouseDown={handleUserInteraction}\n onMove={handleMove}\n onTouchStart={handleUserInteraction}\n onWheel={handleUserInteraction}\n ref={mapRef}\n >\n {showUserLocation &&\n userLocationState.coords &&\n (renderUserLocation ? (\n renderUserLocation({\n coords: userLocationState.coords,\n heading: userLocationState.heading,\n })\n ) : (\n <UserLocationLayer\n forcedLocation={userLocationState.coords}\n heading={userLocationState.heading}\n />\n ))}\n\n {displayRoute && <RouteLayer geometry={displayRoute} />}\n\n {pois.length > 0 && (\n <>\n <POILayers pois={pois} />\n <POIMarkers onClick={onPoiClick} pois={pois} />\n </>\n )}\n {mapLibreChildren}\n </MapLibre>\n {showControls && mapControls && !mapControls.hasControls && (\n <MapControls\n drawerContentRef={drawerContentRef}\n enableTouchDrag={enableTouchDrag}\n etaData={showEtaData}\n initialViewState={initialViewState}\n isInternal={true}\n menuContent={menuContent || menuContentFromChildren}\n menuItems={resolvedMenuItems}\n {...controlProps}\n />\n )}\n </div>\n );\n};\n\nconst SDKMapProviderWrapper: React.FC<{ children: React.ReactNode }> = ({\n children,\n}) => {\n const context = useContext(MapControlsContext);\n if (context) {\n return <>{children}</>;\n }\n return <SDKMapProvider>{children}</SDKMapProvider>;\n};\n\nexport const Map: React.FC<MapProps> = (props) => {\n return (\n <SDKMapProviderWrapper>\n <MapProvider>\n <MapInternal {...props} />\n </MapProvider>\n </SDKMapProviderWrapper>\n );\n};\n","import type { POI } from \"@miniapps-sdk/components/Map/types\";\nimport { Layer, Source, useMap } from \"@vis.gl/react-maplibre\";\nimport type React from \"react\";\nimport { useEffect, useMemo, useState } from \"react\";\n\n/**\n * Utility to render an emoji to ImageData for use as a MapLibre icon\n */\nfunction createEmojiIcon(emoji: string, size = 64): ImageData {\n const canvas = document.createElement(\"canvas\");\n canvas.width = size;\n canvas.height = size;\n const ctx = canvas.getContext(\"2d\")!;\n ctx.font = `${size * 0.75}px serif`;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(emoji, size / 2, size / 2);\n return ctx.getImageData(0, 0, size, size);\n}\n\nexport const POILayers: React.FC<{\n pois: POI[];\n}> = ({ pois }) => {\n const [loadedImages, setLoadedImages] = useState<number>(0);\n const { current: map } = useMap();\n\n // Filter for GL-mode POIs - stable memoized list\n const glPois = useMemo(\n () => pois.filter((p) => !p.displayMode || p.displayMode === \"gl\"),\n [pois],\n );\n\n useEffect(() => {\n if (!map) return;\n const glMap = map.getMap();\n\n // Built-in default emoji icons\n const defaults = [\n { emoji: \"🍺\", name: \"sdk-default-bar\" },\n { emoji: \"🍽️\", name: \"sdk-default-restaurant\" },\n { emoji: \"📍\", name: \"sdk-default-poi\" },\n ];\n\n defaults.forEach((def) => {\n if (!glMap.hasImage(def.name)) {\n glMap.addImage(def.name, createEmojiIcon(def.emoji), { pixelRatio: 2 });\n }\n });\n\n // Handle custom image URLs and custom emojis\n let updates = 0;\n glPois.forEach((poi) => {\n // 1. Custom URL Image\n if (poi.imageUrl) {\n const name = `custom-url-${poi.id}`;\n if (!glMap.hasImage(name)) {\n (glMap.loadImage as any)(poi.imageUrl, (error: any, image: any) => {\n if (!error && image) {\n if (!glMap.hasImage(name)) {\n glMap.addImage(name, image);\n setLoadedImages((prev) => prev + 1);\n }\n }\n });\n }\n }\n\n // 2. Custom Emoji Icon\n if (poi.emoji) {\n const name = `custom-emoji-${poi.emoji}`;\n if (!glMap.hasImage(name)) {\n glMap.addImage(name, createEmojiIcon(poi.emoji), { pixelRatio: 2 });\n updates++;\n }\n }\n });\n\n if (updates > 0) {\n setLoadedImages((prev) => prev + updates);\n }\n }, [map, glPois]);\n\n const geojson: any = useMemo(\n () => ({\n features: glPois.map((poi) => ({\n geometry: {\n coordinates: [poi.longitude, poi.latitude],\n type: \"Point\" as const,\n },\n properties: {\n ...poi,\n // Selection logic for the icon in GL\n \"sdk-icon\": poi.imageUrl\n ? `custom-url-${poi.id}`\n : poi.spriteName\n ? poi.spriteName\n : poi.emoji\n ? `custom-emoji-${poi.emoji}`\n : poi.type === \"bar\"\n ? \"sdk-default-bar\"\n : poi.type === \"restaurant\"\n ? \"sdk-default-restaurant\"\n : \"sdk-default-poi\",\n },\n type: \"Feature\" as const,\n })),\n type: \"FeatureCollection\" as const,\n }),\n [glPois],\n );\n\n return (\n <Source data={geojson} id=\"sdk-pois\" type=\"geojson\">\n <Layer\n id=\"sdk-poi-layer\"\n layout={{\n \"icon-allow-overlap\": true,\n \"icon-image\": [\"get\", \"sdk-icon\"],\n \"icon-size\": 1,\n \"text-anchor\": \"top\",\n \"text-field\": [\n \"step\",\n [\"zoom\"],\n \"\", // Show nothing when zoomed out\n 14,\n [\"get\", \"name\"], // Show name when zoomed in\n ],\n \"text-font\": [\"Open Sans Bold\"],\n \"text-offset\": [0, 1.5],\n \"text-optional\": true,\n \"text-size\": 11,\n }}\n paint={{\n \"icon-opacity\": [\"interpolate\", [\"linear\"], [\"zoom\"], 11, 0, 12, 1],\n \"text-color\": \"#ffffff\",\n \"text-halo-color\": \"#000000\",\n \"text-halo-width\": 1,\n \"text-opacity\": [\"interpolate\", [\"linear\"], [\"zoom\"], 13.5, 0, 14, 1],\n }}\n type=\"symbol\"\n />\n </Source>\n );\n};\n","import type { POI } from \"@miniapps-sdk/components/Map/types\";\nimport { Marker } from \"@vis.gl/react-maplibre\";\nimport type React from \"react\";\n\nexport const POIMarkers: React.FC<{\n pois: POI[];\n onClick?: (poi: POI) => void;\n}> = ({ pois, onClick }) => {\n // Filter for Marker-mode POIs\n const markerPois = pois.filter((p) => p.displayMode === \"marker\");\n\n if (markerPois.length === 0) return null;\n\n return (\n <>\n {markerPois.map((poi) => (\n <Marker\n anchor=\"bottom\"\n key={poi.id}\n latitude={poi.latitude}\n longitude={poi.longitude}\n onClick={(e) => {\n e.originalEvent.stopPropagation();\n if (onClick) onClick(poi);\n }}\n >\n {poi.markerComponent ? (\n poi.markerComponent\n ) : (\n <div\n style={{\n cursor: \"pointer\",\n filter: \"drop-shadow(0 4px 6px rgba(0,0,0,0.1))\",\n transform: \"transition-transform duration-200 hover:scale-110\",\n }}\n >\n <div\n style={{\n alignItems: \"center\",\n backgroundColor: poi.type === \"bar\" ? \"#f97316\" : \"#10b981\",\n border: \"2px solid white\",\n borderRadius: \"50%\",\n display: \"flex\",\n height: \"32px\",\n justifyContent: \"center\",\n width: \"32px\",\n }}\n >\n {poi.emoji ? (\n <span style={{ fontSize: \"16px\" }}>{poi.emoji}</span>\n ) : (\n <div\n style={{\n backgroundColor: \"white\",\n borderRadius: \"50%\",\n height: \"8px\",\n width: \"8px\",\n }}\n ></div>\n )}\n </div>\n {/* Pin Tail */}\n <div\n style={{\n borderLeft: \"6px solid transparent\",\n borderRight: \"6px solid transparent\",\n borderTop: `8px solid ${poi.type === \"bar\" ? \"#f97316\" : \"#10b981\"}`,\n height: 0,\n margin: \"-2px auto 0\",\n width: 0,\n }}\n ></div>\n </div>\n )}\n </Marker>\n ))}\n </>\n );\n};\n","import { Marker } from \"@vis.gl/react-maplibre\";\nimport type React from \"react\";\n\nexport interface UserLocationLayerProps {\n /**\n * The location to display.\n */\n forcedLocation: [number, number] | null;\n /**\n * The user's heading (bearing) in degrees.\n */\n heading?: number | null;\n}\n\nexport const UserLocationLayer: React.FC<UserLocationLayerProps> = ({\n forcedLocation,\n heading,\n}) => {\n if (!forcedLocation) return null;\n\n return (\n <Marker\n anchor=\"center\"\n latitude={forcedLocation[1]}\n longitude={forcedLocation[0]}\n >\n <div\n style={{\n alignItems: \"center\",\n display: \"flex\",\n justifyContent: \"center\",\n position: \"relative\",\n }}\n >\n {/* Pulse Animation */}\n <div\n style={{\n animation: \"pulse 2s infinite\",\n backgroundColor: \"rgba(59, 130, 246, 0.4)\",\n borderRadius: \"50%\",\n height: \"40px\",\n position: \"absolute\",\n width: \"40px\",\n }}\n ></div>\n\n {/* Heading Indicator (Cone/Arrow) */}\n {heading !== undefined && heading !== null && (\n <div\n style={{\n height: \"60px\",\n position: \"absolute\",\n transform: `rotate(${heading}deg)`,\n width: \"60px\",\n zIndex: 0,\n }}\n >\n <svg\n style={{ height: \"100%\", width: \"100%\" }}\n viewBox=\"0 0 100 100\"\n >\n <defs>\n <radialGradient\n cx=\"50%\"\n cy=\"50%\"\n fx=\"50%\"\n fy=\"50%\"\n id=\"grad1\"\n r=\"50%\"\n >\n <stop\n offset=\"0%\"\n style={{\n stopColor: \"rgba(37, 99, 235, 0.6)\",\n stopOpacity: 1,\n }}\n />\n <stop\n offset=\"100%\"\n style={{\n stopColor: \"rgba(37, 99, 235, 0)\",\n stopOpacity: 0,\n }}\n />\n </radialGradient>\n </defs>\n {/* Visual Direction Cone */}\n <path\n d=\"M 50 50 L 35 0 A 50 50 0 0 1 65 0 Z\"\n fill=\"url(#grad1)\"\n />\n </svg>\n </div>\n )}\n\n {/* Main Blue Dot */}\n <div\n style={{\n alignItems: \"center\",\n backgroundColor: \"white\",\n borderRadius: \"50%\",\n boxShadow:\n \"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 0 0 2px rgba(37, 99, 235, 0.2)\",\n display: \"flex\",\n height: \"20px\",\n justifyContent: \"center\",\n width: \"20px\",\n zIndex: 1,\n }}\n >\n <div\n style={{\n backgroundColor: \"#2563eb\",\n border: \"2px solid white\",\n borderRadius: \"50%\",\n height: \"12px\",\n width: \"12px\",\n }}\n ></div>\n </div>\n <style>{`@keyframes pulse { 0% { transform: scale(0.95); opacity: 0.7; } 70% { transform: scale(1.5); opacity: 0; } 100% { transform: scale(0.95); opacity: 0; } }`}</style>\n </div>\n </Marker>\n );\n};\n","import { Map, type MapProps } from \"@miniapps-sdk/components/Map\";\nimport React from \"react\";\nimport { createRoot } from \"react-dom/client\";\n\n/**\n * Renders the Map component into a DOM element.\n * Useful for non-React environments (UMD/IIFE).\n *\n * @param containerId The ID of the HTML element where the map should be rendered.\n * @param props The props to pass to the Map component.\n * @returns The React root instance.\n */\nexport function renderMap(containerId: string, props: MapProps = {}) {\n const container = document.getElementById(containerId);\n if (!container) {\n throw new Error(`Container with id \"${containerId}\" not found.`);\n }\n\n const root = createRoot(container);\n root.render(React.createElement(Map, props));\n return root;\n}\n","import type { RouteRequest, RouteResponse } from \"@miniapps-sdk/types/routing\";\n\nexport interface RoutingBackendConfig {\n backend: \"osrm\" | \"valhalla\";\n baseUrl: string;\n}\n\n/**\n * Core routing service that can be used by both SDK (for direct fetching)\n * and Host (for handling bridge requests).\n */\nexport const RoutingService = {\n createErrorResponse(\n req: RouteRequest,\n code: NonNullable<RouteResponse[\"error\"]>[\"code\"],\n message: string,\n ): RouteResponse {\n return {\n error: { code, message },\n requestId: req.requestId,\n sdkVersion: req.sdkVersion,\n success: false,\n type: \"SDK_ROUTING_GETROUTE_RESPONSE\",\n };\n },\n\n decodePolyline(str: string, precision: number): [number, number][] {\n let index = 0,\n lat = 0,\n lng = 0;\n const coordinates: [number, number][] = [];\n const shift = 10 ** precision;\n\n while (index < str.length) {\n let b: any,\n shiftNum = 0,\n result = 0;\n do {\n b = str.charCodeAt(index++) - 63;\n result |= (b & 0x1f) << shiftNum;\n shiftNum += 5;\n } while (b >= 0x20);\n const dlat = result & 1 ? ~(result >> 1) : result >> 1;\n lat += dlat;\n\n shiftNum = 0;\n result = 0;\n do {\n b = str.charCodeAt(index++) - 63;\n result |= (b & 0x1f) << shiftNum;\n shiftNum += 5;\n } while (b >= 0x20);\n const dlng = result & 1 ? ~(result >> 1) : result >> 1;\n lng += dlng;\n\n coordinates.push([lng / shift, lat / shift]);\n }\n return coordinates;\n },\n\n async fetchOSRMRoute(\n req: RouteRequest,\n coords: [number, number][],\n profile: string,\n baseUrl: string,\n ): Promise<RouteResponse> {\n const coordsString = coords.map((c) => `${c[0]},${c[1]}`).join(\";\");\n const osrmProfile =\n profile === \"walking\" ? \"foot\" : profile === \"driving\" ? \"car\" : \"bike\";\n const url = `${baseUrl}/route/v1/${osrmProfile}/${coordsString}?overview=full&geometries=geojson&steps=true`;\n\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`OSRM Error: ${response.statusText}`);\n }\n const data = await response.json();\n\n if (data.code !== \"Ok\" || !data.routes || data.routes.length === 0) {\n throw new Error(\"NO_ROUTE\");\n }\n\n const route = data.routes[0];\n const steps =\n route.legs?.flatMap((leg: any) =>\n leg.steps?.map((step: any) => ({\n distance: step.distance,\n duration: step.duration,\n instruction: step.maneuver?.instruction || \"Continue\",\n })),\n ) || [];\n\n return {\n data: {\n distanceMeters: route.distance,\n durationSeconds: route.duration,\n geometry: route.geometry,\n steps,\n },\n requestId: req.requestId,\n sdkVersion: req.sdkVersion,\n success: true,\n type: \"SDK_ROUTING_GETROUTE_RESPONSE\",\n };\n },\n async fetchRoute(\n req: RouteRequest,\n config: RoutingBackendConfig,\n ): Promise<RouteResponse> {\n const { origin, destination, waypoints, profile, language } = req.payload;\n\n if (\n !this.isValidCoordinate(origin) ||\n !this.isValidCoordinate(destination)\n ) {\n return this.createErrorResponse(\n req,\n \"INVALID_INPUT\",\n \"Origin or destination coordinates are invalid.\",\n );\n }\n if (waypoints && !waypoints.every(this.isValidCoordinate)) {\n return this.createErrorResponse(\n req,\n \"INVALID_INPUT\",\n \"One or more waypoints are invalid.\",\n );\n }\n\n const allCoords = [origin, ...(waypoints || []), destination];\n\n try {\n if (config.backend === \"osrm\") {\n return await this.fetchOSRMRoute(\n req,\n allCoords,\n profile,\n config.baseUrl,\n );\n } else {\n return await this.fetchValhallaRoute(\n req,\n allCoords,\n profile,\n language,\n config.baseUrl,\n );\n }\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"NO_ROUTE\")) {\n return this.createErrorResponse(\n req,\n \"NO_ROUTE\",\n \"No route could be found for the given points.\",\n );\n }\n if (error instanceof TypeError) {\n return this.createErrorResponse(\n req,\n \"NETWORK_ERROR\",\n \"Failed to connect to the routing backend.\",\n );\n }\n return this.createErrorResponse(\n req,\n \"BACKEND_ERROR\",\n `Routing backend error: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n\n async fetchValhallaRoute(\n req: RouteRequest,\n coords: [number, number][],\n profile: string,\n language: string | undefined,\n baseUrl: string,\n ): Promise<RouteResponse> {\n const valhallaProfile =\n profile === \"driving\"\n ? \"auto\"\n : profile === \"walking\"\n ? \"pedestrian\"\n : \"bicycle\";\n const body = {\n costing: valhallaProfile,\n directions_options: {\n language: language || \"en-US\",\n },\n locations: coords.map((c) => ({ lat: c[1], lon: c[0] })),\n };\n\n const response = await fetch(`${baseUrl}/route`, {\n body: JSON.stringify(body),\n headers: { \"Content-Type\": \"application/json\" },\n method: \"POST\",\n });\n\n if (!response.ok) {\n throw new Error(`Valhalla Error: ${response.statusText}`);\n }\n const data = await response.json();\n\n if (!data.trip || !data.trip.legs || data.trip.legs.length === 0) {\n throw new Error(\"NO_ROUTE\");\n }\n\n const trip = data.trip;\n const decodedCoordinates = this.decodePolyline(trip.legs[0].shape, 6);\n\n const steps =\n trip.legs.flatMap((leg: any) =>\n leg.maneuvers?.map((maneuver: any) => ({\n distance: maneuver.length * 1000, // Valhalla returns km\n duration: maneuver.time,\n instruction: maneuver.instruction || \"Continue\",\n })),\n ) || [];\n\n return {\n data: {\n distanceMeters: trip.summary.length * 1000, // km to m\n durationSeconds: trip.summary.time,\n geometry: {\n coordinates: decodedCoordinates,\n type: \"LineString\",\n },\n steps,\n },\n requestId: req.requestId,\n sdkVersion: req.sdkVersion,\n success: true,\n type: \"SDK_ROUTING_GETROUTE_RESPONSE\",\n };\n },\n\n isValidCoordinate(coord: [number, number]): boolean {\n const [lng, lat] = coord;\n return lng >= -180 && lng <= 180 && lat >= -90 && lat <= 90;\n },\n};\n","{\n \"name\": \"@cloudparse/up-miniapps-sdk\",\n \"version\": \"0.2.7\",\n \"description\": \"UP Mini-App SDK for bridge communication between WebView and Host Shell\",\n \"author\": \"CloudParse Team\",\n \"license\": \"MIT\",\n \"type\": \"module\",\n \"engines\": {\n \"node\": \">=25.6.1\"\n },\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"browser\": \"./dist/index.browser.min.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\",\n \"default\": \"./dist/index.js\"\n },\n \"./host\": {\n \"types\": \"./dist/host.d.ts\",\n \"import\": \"./dist/host.js\",\n \"require\": \"./dist/host.cjs\",\n \"default\": \"./dist/host.js\"\n },\n \"./components/Map\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\",\n \"default\": \"./dist/index.js\"\n },\n \"./style.css\": \"./dist/style.css\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"files\": [\n \"dist\"\n ],\n \"scripts\": {\n \"build\": \"tsc --noEmit --project tsconfig.json && tsup && npm run build:css\",\n \"build:css\": \"npx postcss src/index.css -o dist/style.css\",\n \"prebuild\": \"npm run clean\",\n \"clean\": \"rm -rf dist\",\n \"format\": \"biome format --write . --max-diagnostics 10000 --diagnostic-level error\",\n \"lint\": \"biome lint . --max-diagnostics 10000 --diagnostic-level error\",\n \"lint.fix\": \"biome check --write . --max-diagnostics 10000 --diagnostic-level error\",\n \"prepack\": \"npm run build\",\n \"storybook\": \"storybook dev -p 6006\",\n \"build-storybook\": \"storybook build\"\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"^2.5.1\",\n \"@chromatic-com/storybook\": \"^5.2.1\",\n \"@mapbox/maki\": \"^8.2.0\",\n \"@storybook/addon-a11y\": \"^10.4.6\",\n \"@storybook/addon-docs\": \"^10.4.6\",\n \"@storybook/addon-mcp\": \"^0.6.0\",\n \"@storybook/addon-vitest\": \"^10.4.6\",\n \"@storybook/react-vite\": \"^10.4.6\",\n \"@tailwindcss/postcss\": \"^4.3.2\",\n \"@types/geojson\": \"^7946.0.16\",\n \"@types/react\": \"^19.2.17\",\n \"@types/react-dom\": \"^19.2.3\",\n \"@vitest/browser-playwright\": \"^4.1.9\",\n \"@vitest/coverage-v8\": \"^4.1.9\",\n \"autoprefixer\": \"^10.5.2\",\n \"playwright\": \"^1.61.1\",\n \"postcss\": \"^8.5.16\",\n \"postcss-cli\": \"^11.0.1\",\n \"storybook\": \"^10.4.6\",\n \"tailwindcss\": \"^4.3.2\",\n \"tsc-alias\": \"^1.8.8\",\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^4.1.9\"\n },\n \"dependencies\": {\n \"@radix-ui/react-dialog\": \"^1.1.17\",\n \"@radix-ui/react-slot\": \"^1.3.0\",\n \"@vis.gl/react-maplibre\": \"^8.1.1\",\n \"class-variance-authority\": \"^0.7.1\",\n \"clsx\": \"^2.1.1\",\n \"lucide-react\": \"^1.22.0\",\n \"maplibre-gl\": \"^5.24.0\",\n \"react\": \"^19.2.7\",\n \"react-dom\": \"^19.2.7\",\n \"shadcn\": \"^4.12.0\",\n \"tailwind-merge\": \"^3.6.0\"\n }\n}\n","import { Bridge } from \"@miniapps-sdk/bridge\";\nimport { renderMap } from \"@miniapps-sdk/components/MapWrapper\";\nimport type { RoutingBackendConfig } from \"@miniapps-sdk/services/routingService\";\nimport { RoutingService } from \"@miniapps-sdk/services/routingService\";\nimport type {\n HapticStyleType,\n IFidelityBalance,\n IFidelityHistoryParams,\n IFidelityTransaction,\n IInitializationOptions,\n IInitializationResponse,\n ILocationData,\n INetworkOptions,\n INetworkResponse,\n IPaymentRequest,\n IUserProfile,\n RouteRequest,\n RouteResponse,\n ScrollConfig,\n SDKEvent,\n} from \"@miniapps-sdk/types\";\nimport { version } from \"../package.json\";\n\n// ... deepFreeze function omitted ...\nfunction deepFreeze<T extends object>(obj: T): T {\n // Retrieve the property names defined on obj\n const propNames = Object.getOwnPropertyNames(obj);\n\n // Freeze properties before freezing self\n for (const name of propNames) {\n const value = (obj as Record<string, unknown>)[name];\n\n if (\n value &&\n typeof value === \"object\" &&\n !Object.isFrozen(value) &&\n // Skip freezing of native objects or circular refs if any (though not expected here)\n !(value instanceof Bridge)\n ) {\n deepFreeze(value as object);\n }\n }\n\n return Object.freeze(obj);\n}\n\n/**\n * Main SDK for UP Mini-Apps.\n * Provides access to native device features, storage, identity, and shell UI.\n */\nlet globalRoutingConfig: RoutingBackendConfig | null = null;\n\nexport class MiniAppSDK {\n /**\n * Map services.\n * Provides access to MapLibre-based mapping components.\n */\n public readonly maps = Object.freeze({\n /**\n * Renders a MapLibre map into a DOM element.\n * Useful for non-React environments.\n */\n render: renderMap,\n });\n private bridge: Bridge;\n /**\n * Local SQLite Storage.\n * Data is persisted on the device and is isolated per Mini-App.\n */\n public readonly storage = Object.freeze({\n /** Retrieves a value by key. */\n get: (key: string): Promise<string | null> =>\n this.bridge.send(\"STORAGE_GET\", { key }),\n /** Retrieves all key-value pairs stored for this Mini-App. */\n getAll: (): Promise<Record<string, string>> =>\n this.bridge.send(\"STORAGE_GET_ALL\"),\n /** Sets a value for a specific key. */\n set: (key: string, value: string): Promise<void> =>\n this.bridge.send(\"STORAGE_SET\", { key, value }),\n });\n /**\n * Hardware-level Secure Storage.\n * Data is stored in the device's secure enclave (Keychain/Keystore) and is isolated per Mini-App.\n */\n public readonly secureStore = Object.freeze({\n /** Retrieves a value by key from secure storage. */\n get: (key: string): Promise<string | null> =>\n this.bridge.send(\"SECURE_GET\", { key }),\n /** Sets a value for a specific key in secure storage. */\n set: (key: string, value: string): Promise<void> =>\n this.bridge.send(\"SECURE_SET\", { key, value }),\n });\n /**\n * Database Storage.\n * Access to user-app specific persistent database storage.\n */\n public readonly database = Object.freeze({\n /** Retrieves the user data stored in the backend database. */\n getUserData: <T = unknown>(): Promise<T> =>\n this.bridge.send<T>(\"DATABASE_GET_USER_DATA\"),\n /** Updates the user data stored in the backend database. */\n setUserData: <T = unknown>(data: T): Promise<void> =>\n this.bridge.send<void>(\"DATABASE_SET_USER_DATA\", { data }),\n });\n /**\n * Device Location services.\n */\n public readonly location = Object.freeze({\n /**\n * Retrieves the current GPS position of the device.\n */\n getCurrentPosition: (): Promise<ILocationData> =>\n this.bridge.send(\"GET_CURRENT_POSITION\"),\n /**\n * Starts the continuous location and sensor stream.\n * @param config Optional configuration for thresholds and intervals.\n */\n startStream: (\n config?: import(\"./types\").LocationStreamConfig,\n ): Promise<void> => this.bridge.send(\"START_LOCATION_STREAM\", config),\n /**\n * Stops the continuous location and sensor stream.\n */\n stopStream: (): Promise<void> => this.bridge.send(\"STOP_LOCATION_STREAM\"),\n });\n /**\n * Identity & Profile management.\n */\n public readonly user = Object.freeze({\n /**\n * Fetch user profile data.\n * @param fields Optional list of specific fields to retrieve (e.g., ['fullName', 'username']).\n */\n getProfile: <T extends keyof IUserProfile>(\n fields?: T[],\n ): Promise<Partial<IUserProfile>> =>\n this.bridge.send(\"GET_USER_PROFILE\", { fields }),\n /**\n * Fetch profile picture as a string of the current user, or a map of profile pictures from a list of user UUIDs.\n * @param uuids Optional list of user UUIDs.\n */\n getProfilePicture: ((uuids?: string[]) => {\n return this.bridge.send(\"GET_PROFILE_PICTURE\", { uuids: uuids || [] });\n }) as {\n (): Promise<string>;\n (uuids: string[]): Promise<Record<string, string>>;\n },\n });\n /**\n * Explicit Permission Management.\n * Allows requesting access to sensitive device features or user data.\n */\n public readonly permission = Object.freeze({\n /**\n * Explicitly request access to sensitive data.\n * @param type The type of permission to request ('location' or 'profile').\n * @param fields If requesting 'profile', the specific fields required.\n */\n request: ((type: \"location\" | \"profile\" | \"camera\", fields?: string[]) => {\n return this.bridge.send(\"REQUEST_PERMISSION\", { fields, type });\n }) as {\n (type: \"location\"): Promise<boolean>;\n (type: \"profile\", fields: (keyof IUserProfile)[]): Promise<boolean>;\n },\n });\n /**\n * Payments integration.\n */\n public readonly payment = Object.freeze({\n /**\n * Triggers the native payment flow.\n * @param payload Amount, currency, and itemized list for the payment.\n */\n request: (\n payload: IPaymentRequest,\n ): Promise<{ success: true; transactionId: string }> =>\n this.bridge.send(\"PAYMENT_REQUEST\", payload),\n });\n /**\n * Live Activities & Notifications.\n * Allows the Mini-App to display real-time updates in the host shell.\n */\n public readonly activity = Object.freeze({\n /**\n * Starts a new live activity.\n * @param id Unique identifier for the activity.\n * @param title Display title for the activity.\n * @param status Initial status message.\n */\n start: (id: string, title: string, status: string): Promise<void> =>\n this.bridge.send(\"START_ACTIVITY\", { id, status, title }),\n });\n /**\n * Haptic feedback.\n */\n public readonly haptic = Object.freeze({\n /**\n * Triggers a haptic vibration on the device.\n * @param style The style of haptic feedback (e.g., 'light', 'medium', 'heavy', 'success', 'warning', 'error').\n */\n trigger: (style: HapticStyleType): Promise<void> =>\n this.bridge.send(\"TRIGGER_HAPTIC\", { style }),\n });\n /**\n * Network Proxy.\n * Allows the Mini-App to make network requests through the host shell to bypass CORS or use host-level authentication.\n */\n public readonly network = Object.freeze({\n /**\n * Performs a network request via the host shell.\n * @param options Request method, URL, headers, and body.\n */\n request: async <T = unknown>(\n options: INetworkOptions,\n ): Promise<INetworkResponse<T>> => {\n return this.bridge.send(\"NETWORK_REQUEST\", options);\n },\n });\n /**\n * Navigation and Journey controls.\n * Allows programmatically starting itineraries and managing navigation state.\n */\n public readonly navigation = Object.freeze({\n /**\n * Aborts the current navigation journey.\n */\n abort: (): void => {\n this.bridge.handleNativeMessage({\n eventName: \"SDK_NAVIGATION_ABORT\",\n type: \"EVENT\",\n });\n },\n /**\n * Creates a new itinerary preview.\n * @param options Destination and routing options.\n */\n createJourney: (options: {\n destination: [number, number];\n origin?: [number, number];\n profile?: \"driving\" | \"cycling\" | \"walking\";\n }): void => {\n this.bridge.handleNativeMessage({\n eventName: \"SDK_NAVIGATION_CREATE\",\n payload: { ...options, mode: \"preview\" },\n type: \"EVENT\",\n });\n },\n /**\n * Starts the active navigation (active guidance).\n */\n start: (): void => {\n this.bridge.handleNativeMessage({\n eventName: \"SDK_NAVIGATION_START\",\n type: \"EVENT\",\n });\n },\n });\n /**\n * Fidelity & Rewards program integration.\n */\n public readonly fidelity = Object.freeze({\n /** Returns current fidelity balance. */\n getFidelityBalance: (): Promise<IFidelityBalance> =>\n this.bridge.send(\"GET_FIDELITY_BALANCE\"),\n /**\n * Retrieves fidelity transaction history.\n * @param params Filtering and pagination parameters.\n */\n getFidelityHistory: (\n params?: IFidelityHistoryParams,\n ): Promise<IFidelityTransaction[]> =>\n this.bridge.send(\"GET_FIDELITY_HISTORY\", params),\n /**\n * Triggers the native fidelity history view.\n */\n showHistory: (): Promise<void> => this.bridge.send(\"SHOW_FIDELITY_HISTORY\"),\n /**\n * Authorize spending fidelity points (FPoints) via Two-Phase Authorization.\n * @param intentUuid UUID generated by your backend for the transaction.\n */\n spendFPoints: (\n intentUuid: string,\n ): Promise<{ success: boolean; transactionId: string }> =>\n this.bridge.send(\"SPEND_FPOINTS\", { intentUuid }),\n });\n /**\n * UI and Navigation controls.\n */\n public readonly ui = Object.freeze({\n /** Closes the Mini-App and returns to the host shell. */\n exit: (): Promise<void> => this.bridge.send(\"EXIT\"),\n /**\n * Configures native scroll behaviors like Pull-to-Refresh and Infinite Scroll.\n * @param config Scroll configuration for top/bottom detection.\n */\n setScrollConfig: (config: ScrollConfig): Promise<void> =>\n this.bridge.send(\"SET_SCROLL_CONFIG\", config),\n });\n /**\n * Debug controls\n */\n public readonly debug = Object.freeze({\n /**\n * Log to the shell app\n * @param message\n */\n log: (...message: unknown[]) => this.bridge.send(\"DEBUG_LOG\", { message }),\n });\n /**\n * Routing integration (OSRM / Valhalla).\n * Provides access to route calculation and rendering on the host map.\n */\n public readonly routing = Object.freeze({\n /**\n * Clears the currently rendered route.\n */\n clearRoute: (): Promise<void> => {\n const requestId = crypto.randomUUID\n ? crypto.randomUUID()\n : Math.random().toString(36).substring(2);\n return this.bridge.send(\"SDK_ROUTING_CLEARROUTE\", {\n requestId,\n sdkVersion: version,\n });\n },\n\n /**\n * Draws the calculated route on the host map.\n * @param routeData The route data returned by getRoute.\n */\n drawRoute: (\n routeData: NonNullable<RouteResponse[\"data\"]>,\n ): Promise<void> => {\n const requestId = crypto.randomUUID\n ? crypto.randomUUID()\n : Math.random().toString(36).substring(2);\n return this.bridge.send(\"SDK_ROUTING_DRAWROUTE\", {\n payload: { routeData },\n requestId,\n sdkVersion: version,\n });\n },\n /**\n * Calculates a route between points.\n * @param payload Request payload containing origin, destination, and options.\n */\n getRoute: async (\n payload: RouteRequest[\"payload\"],\n ): Promise<NonNullable<RouteResponse[\"data\"]>> => {\n // Create a unique requestId\n const requestId = crypto.randomUUID\n ? crypto.randomUUID()\n : Math.random().toString(36).substring(2);\n\n const request: RouteRequest = {\n payload,\n requestId,\n sdkVersion: version,\n type: \"SDK_ROUTING_GETROUTE\",\n };\n\n // If a direct backend is configured, bypass the bridge\n if (globalRoutingConfig) {\n const response = await RoutingService.fetchRoute(\n request,\n globalRoutingConfig,\n );\n if (response.success && response.data) {\n return response.data;\n }\n throw new Error(response.error?.message || \"Routing failed\");\n }\n\n // Otherwise, use the bridge\n return this.bridge.send(\"SDK_ROUTING_GETROUTE\", {\n payload,\n requestId,\n sdkVersion: version,\n });\n },\n });\n\n constructor() {\n this.bridge = new Bridge();\n\n // Bind methods to this instance to preserve context if pulled out\n this.initialize = this.initialize.bind(this);\n this.on = this.on.bind(this);\n this.off = this.off.bind(this);\n }\n\n /**\n * Configures global SDK settings.\n */\n public config(options: { routingBackend?: RoutingBackendConfig }): void {\n if (options.routingBackend) {\n globalRoutingConfig = options.routingBackend;\n }\n }\n\n /**\n * Updates the global context shared between the Mini-App and the native shell.\n * Useful for synchronizing state like theme preferences, UI flags, or custom app-specific context.\n * @param context Partial context object to merge into the existing shell context.\n */\n public updateContext(context: Record<string, unknown>): Promise<void> {\n return this.bridge.send(\"UPDATE_CONTEXT\", context);\n }\n\n /**\n * The starting point for the Mini-App. Must be called before any other SDK methods.\n * @param options The options to provide to the shell app\n */\n public initialize(\n options: IInitializationOptions,\n ): Promise<IInitializationResponse> {\n return this.bridge.send(\"INITIALIZE\", options);\n }\n\n /**\n * Registers a callback for a specific event from the native shell.\n * @param event The name of the event to listen for.\n * @param callback The function to execute when the event is triggered.\n * @returns A function to unregister the listener.\n */\n public on<T = unknown>(\n event: SDKEvent,\n callback: (data: T) => void,\n ): () => void {\n return this.bridge.on<T>(event as string, callback);\n }\n\n /**\n * Unregisters a previously registered event listener.\n * @param event The name of the event.\n * @param callback The callback function to remove.\n */\n public off<T = unknown>(event: SDKEvent, callback: (data: T) => void): void {\n this.bridge.off<T>(event as string, callback);\n }\n}\n\n/**\n * Singleton instance of the MiniAppSDK.\n * Frozen to prevent tampering.\n */\nexport const sdk = deepFreeze(new MiniAppSDK());\n","import { Button } from \"@miniapps-sdk/components/ui/button\";\nimport { sdk } from \"@miniapps-sdk/sdk\";\nimport { GeolocationEvent } from \"@miniapps-sdk/types\";\nimport type React from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport interface BridgeMockerProps {\n /** Optional appId to return in INITIALIZE response */\n appId?: string;\n /** Initial simulated location [lng, lat] */\n initialLocation?: [number, number];\n /** Whether the simulated user should be moving */\n isMoving?: boolean;\n /** An array of coordinates to follow. If provided, overrides random movement. */\n simulationPath?: [number, number][];\n /** Speed multiplier for the simulation interval. Default is 1. Higher is faster. */\n simulationSpeed?: number;\n /** Mock JWT token for NETWORK_REQUEST mocking */\n mockJWTToken?: string;\n children: React.ReactNode;\n}\n\n/**\n * Calculates bearing between two points\n */\nconst getBearing = (p1: [number, number], p2: [number, number]) => {\n const lat1 = (p1[1] * Math.PI) / 180;\n const lat2 = (p2[1] * Math.PI) / 180;\n const dLon = ((p2[0] - p1[0]) * Math.PI) / 180;\n const y = Math.sin(dLon) * Math.cos(lat2);\n const x =\n Math.cos(lat1) * Math.sin(lat2) -\n Math.sin(lat1) * Math.cos(lat2) * Math.cos(dLon);\n return ((Math.atan2(y, x) * 180) / Math.PI + 360) % 360;\n};\n\n/**\n * A utility component for Storybook that intercepts SDK bridge calls,\n * simulates the behavior of the native shell app.\n *\n * NOTE: Logs are now handled by the standalone DebugConsole component.\n */\nexport const BridgeMocker: React.FC<BridgeMockerProps> = ({\n appId,\n initialLocation = [6.1258, 45.9058], // Annecy default\n isMoving = false,\n simulationPath,\n simulationSpeed = 1,\n mockJWTToken,\n children,\n}) => {\n const [autoMove, setAutoMove] = useState(isMoving);\n const [location, setLocation] = useState<[number, number]>(initialLocation);\n const [heading, setHeading] = useState<number>(0);\n const [speedMultiplier, setSpeedMultiplier] = useState(simulationSpeed);\n const [isReady, setIsReady] = useState(false);\n const [isMinimized, setIsMinimized] = useState(true);\n\n const streamIntervalRef = useRef<any | null>(null);\n const pathIndexRef = useRef<number>(0);\n const activeConfigRef = useRef<any>(null); // Keep track of the last START_LOCATION_STREAM config\n\n // Refs for interval to read latest state without rebinding\n const stateRef = useRef({\n autoMove,\n heading,\n location,\n mockJWTToken,\n pushLocationUpdate: () => {},\n setHeading,\n setLocation,\n simulationPath,\n speedMultiplier,\n });\n\n const pushLocationUpdate = useCallback(() => {\n const currentState = stateRef.current;\n const payload = {\n accelerometer: null,\n heading: {\n accuracy: 3,\n magneticHeading: currentState.heading,\n trueHeading: currentState.heading,\n },\n location: {\n coords: {\n accuracy: 10,\n altitude: 0,\n altitudeAccuracy: null,\n heading: currentState.heading,\n latitude: currentState.location[1],\n longitude: currentState.location[0],\n speed: currentState.autoMove ? 1.5 * currentState.speedMultiplier : 0,\n },\n timestamp: Date.now(),\n },\n timestamp: Date.now(),\n };\n\n (window as any).__MiniAppBridge?.onNativeMessage({\n eventName: GeolocationEvent.LOCATION_STREAM_UPDATE,\n payload,\n type: \"EVENT\",\n });\n }, []);\n\n useEffect(() => {\n stateRef.current = {\n autoMove,\n heading,\n location,\n mockJWTToken,\n pushLocationUpdate,\n setHeading,\n setLocation,\n simulationPath,\n speedMultiplier,\n };\n }, [\n location,\n heading,\n autoMove,\n pushLocationUpdate,\n simulationPath,\n speedMultiplier,\n mockJWTToken,\n ]);\n\n // Sync prop changes\n useEffect(() => {\n setAutoMove(isMoving);\n }, [isMoving]);\n\n useEffect(() => {\n setSpeedMultiplier(simulationSpeed);\n }, [simulationSpeed]);\n\n // Reset path index if path changes\n useEffect(() => {\n if (simulationPath && simulationPath.length > 0) {\n pathIndexRef.current = 0;\n setLocation(simulationPath[0]); // Snap to start of new path\n }\n }, [simulationPath]);\n\n // Handle dynamic interval restart when speed changes\n // biome-ignore lint/correctness/useExhaustiveDependencies: We intentionally only want to re-trigger when speedMultiplier changes, not on every config change\n useEffect(() => {\n if (streamIntervalRef.current && activeConfigRef.current) {\n // Re-trigger startStream to apply new speed\n (sdk as any).bridge.send(\n \"START_LOCATION_STREAM\",\n activeConfigRef.current,\n );\n }\n }, [speedMultiplier]);\n\n // Setup interception synchronously before children render\n useEffect(() => {\n const bridge = (sdk as any).bridge;\n const originalSend = bridge.send.bind(bridge);\n\n const stopStream = () => {\n if (streamIntervalRef.current) {\n clearInterval(streamIntervalRef.current);\n streamIntervalRef.current = null;\n }\n activeConfigRef.current = null;\n };\n\n const startStream = (config?: any) => {\n stopStream();\n activeConfigRef.current = config || {};\n\n const baseInterval = config?.interval || 500;\n const interval = Math.max(\n 10,\n baseInterval / stateRef.current.speedMultiplier,\n );\n\n streamIntervalRef.current = setInterval(() => {\n const state = stateRef.current;\n\n if (state.autoMove) {\n if (state.simulationPath && state.simulationPath.length > 0) {\n // Path following logic\n if (pathIndexRef.current < state.simulationPath.length - 1) {\n const currentPoint = state.simulationPath[pathIndexRef.current];\n const nextPoint = state.simulationPath[pathIndexRef.current + 1];\n\n pathIndexRef.current += 1;\n const newHeading = getBearing(currentPoint, nextPoint);\n\n state.setHeading(newHeading);\n state.setLocation(nextPoint);\n } else {\n // Reached end of path\n state.setLocation(\n state.simulationPath[state.simulationPath.length - 1],\n );\n }\n } else {\n // Random drift\n state.setLocation((prev) => [\n prev[0] + (Math.random() - 0.5) * 0.0001,\n prev[1] + (Math.random() - 0.5) * 0.0001,\n ]);\n }\n }\n\n state.pushLocationUpdate();\n }, interval);\n };\n\n const simulateNetworkRequest = async (payload: any) => {\n const {\n url,\n method = \"GET\",\n headers: incomingHeaders = {},\n body,\n } = payload;\n const state = stateRef.current;\n\n const headers = new Headers(incomingHeaders);\n\n if (state.mockJWTToken) {\n headers.set(\n \"Authorization\",\n `Bearer ${state.mockJWTToken.replace(\"Bearer \", \"\")}`,\n );\n }\n\n if (body && typeof body === \"object\" && !headers.has(\"Content-Type\")) {\n headers.set(\"Content-Type\", \"application/json\");\n }\n\n try {\n const response = await fetch(url, {\n body: body\n ? typeof body === \"string\"\n ? body\n : JSON.stringify(body)\n : undefined,\n headers,\n method,\n });\n\n const contentType = response.headers.get(\"content-type\");\n let responseData: any;\n\n if (contentType?.includes(\"application/json\")) {\n responseData = await response.json();\n } else {\n responseData = await response.text();\n }\n\n const headersObj: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n headersObj[key] = value;\n });\n\n return {\n data: responseData,\n headers: headersObj,\n status: response.status,\n statusText: response.statusText,\n };\n } catch (error: any) {\n throw {\n error: error.message || \"Network request failed\",\n status: 0,\n };\n }\n };\n\n // Intercept bridge calls globally\n bridge.send = async (type: string, payload: any) => {\n // 1. Mandatory Lifecycle\n if (type === \"INITIALIZE\") {\n return Promise.resolve({\n appId, // Legacy support\n context: { theme: \"dark\" }, // Legacy support\n description: \"Mocked for Dev\",\n env: {},\n insets: { bottom: 0, left: 0, right: 0, top: 0 },\n name: \"Vite Dev (Mock)\",\n params: {},\n profile: {\n admin: true,\n countryCode: \"FR\",\n createdAt: new Date().toISOString(),\n email: \"caveman@up.app\",\n firstName: \"Smart\",\n fullName: \"Smart Caveman\",\n lastName: \"Caveman\",\n localNumber: \"0600000000\",\n ups: 100,\n username: \"smart_caveman\",\n uuid: \"mock-user-42\",\n xp: 500,\n },\n success: true,\n userData: {},\n uuid: appId || \"mock-app-id\",\n version: \"1.0.0\",\n });\n }\n\n // 2. Location\n if (type === \"GET_CURRENT_POSITION\") {\n const state = stateRef.current;\n return Promise.resolve({\n coords: {\n accuracy: 10,\n altitude: 0,\n altitudeAccuracy: 0,\n heading: state.heading,\n latitude: state.location[1],\n longitude: state.location[0],\n speed: state.autoMove ? 1.5 * state.speedMultiplier : 0,\n },\n timestamp: Date.now(),\n });\n }\n if (type === \"START_LOCATION_STREAM\") {\n startStream(payload);\n return Promise.resolve();\n }\n if (type === \"STOP_LOCATION_STREAM\") {\n stopStream();\n return Promise.resolve();\n }\n\n // 3. Network\n if (type === \"NETWORK_REQUEST\") {\n return simulateNetworkRequest(payload);\n }\n\n // 4. Storage & Identity Mocks\n if (type === \"STORAGE_GET\" || type === \"SECURE_GET\") {\n return Promise.resolve(localStorage.getItem(`mock_sdk_${payload.key}`));\n }\n if (type === \"STORAGE_SET\" || type === \"SECURE_SET\") {\n localStorage.setItem(`mock_sdk_${payload.key}`, payload.value);\n return Promise.resolve();\n }\n if (type === \"GET_USER_PROFILE\") {\n return Promise.resolve({\n admin: true,\n countryCode: \"FR\",\n createdAt: new Date().toISOString(),\n email: \"caveman@up.app\",\n firstName: \"Smart\",\n fullName: \"Smart Caveman\",\n lastName: \"Caveman\",\n localNumber: \"0600000000\",\n ups: 100,\n username: \"smart_caveman\",\n uuid: \"mock-user-42\",\n xp: 500,\n });\n }\n if (type === \"GET_PROFILE_PICTURE\") {\n const uuids = payload?.uuids || [];\n if (uuids.length === 0) {\n return Promise.resolve(\n `https://api.dicebear.com/9.x/rings/png?seed=dummy`,\n );\n }\n const map: Record<string, string> = {};\n for (const uuid of uuids) {\n map[uuid] = `https://api.dicebear.com/9.x/rings/png?seed=${uuid}`;\n }\n return Promise.resolve(map);\n }\n\n // 5. Fidelity & Payment Mocks\n if (type === \"GET_FIDELITY_BALANCE\") {\n return Promise.resolve({ balance: 1337, currency: \"FPoints\" });\n }\n if (type === \"PAYMENT_REQUEST\") {\n return Promise.resolve({\n success: true,\n transactionId: `tx_${Math.random().toString(36).slice(2)}`,\n });\n }\n\n // 6. UI & Haptic (No-ops)\n if (\n type === \"TRIGGER_HAPTIC\" ||\n type === \"EXIT\" ||\n type === \"UPDATE_CONTEXT\"\n ) {\n return Promise.resolve({ success: true });\n }\n\n return originalSend(type, payload);\n };\n\n setIsReady(true);\n\n return () => {\n stopStream();\n bridge.send = originalSend;\n };\n }, [appId]);\n\n if (!isReady) return null;\n\n return (\n <div className=\"relative w-full h-full\">\n {/* Wrapped Story */}\n <div className=\"w-full h-full\">{children}</div>\n\n {isMinimized ? (\n <Button\n className=\"fixed bottom-4 right-4 w-8 h-8 rounded-full bg-slate-900/60 backdrop-blur-sm border border-slate-700/50 flex items-center justify-center text-slate-400 hover:text-blue-400 hover:bg-slate-900/80 z-[9999] transition-all shadow-lg group p-0!\"\n onClick={() => setIsMinimized(false)}\n title=\"Open Simulation Controls\"\n type=\"button\"\n variant=\"ghost\"\n >\n <svg\n className=\"group-hover:scale-110 transition-transform\"\n fill=\"none\"\n height=\"14\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n width=\"14\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M21 4H3\" />\n <path d=\"M10 8H3\" />\n <path d=\"M21 12H3\" />\n <path d=\"M10 16H3\" />\n <path d=\"M21 20H3\" />\n <circle cx=\"14\" cy=\"8\" r=\"2\" />\n <circle cx=\"14\" cy=\"16\" r=\"2\" />\n </svg>\n </Button>\n ) : (\n <div\n className=\"fixed bottom-4 right-4 bg-slate-900 text-slate-300 font-mono text-xs rounded-xl shadow-2xl border border-slate-700 pointer-events-auto flex flex-col w-80 overflow-hidden animate-in slide-in-from-right duration-300\"\n style={{ zIndex: 9998 }}\n >\n {/* Header */}\n <div\n className=\"flex justify-between items-center p-3 border-b border-slate-800 cursor-pointer bg-slate-800/50 hover:bg-slate-800 transition-colors\"\n onClick={() => setIsMinimized(true)}\n >\n <span className=\"font-bold text-slate-100 flex items-center gap-2\">\n <span className=\"text-lg\">🛠️</span> Simulation Controls\n </span>\n <Button\n className=\"text-slate-500 hover:text-white p-0 h-auto hover:bg-transparent cursor-pointer\"\n type=\"button\"\n variant=\"ghost\"\n >\n ▼\n </Button>\n </div>\n\n <div className=\"p-4 flex flex-col gap-3\">\n <div className=\"flex justify-between items-center\">\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n checked={autoMove}\n className=\"accent-blue-500 w-4 h-4\"\n onChange={(e) => setAutoMove(e.target.checked)}\n type=\"checkbox\"\n />\n <span className=\"text-slate-200 font-bold\">\n Auto-Move {simulationPath ? \"(Path)\" : \"(Random)\"}\n </span>\n </label>\n\n <div className=\"flex items-center gap-2\">\n <span className=\"text-[10px] text-slate-500\">Speed:</span>\n <select\n className=\"bg-slate-800 border border-slate-700 rounded px-1 py-0.5 text-white focus:outline-none focus:border-blue-500 text-[10px]\"\n onChange={(e) => setSpeedMultiplier(Number(e.target.value))}\n value={speedMultiplier}\n >\n {[1, 2, 5, 10, 50, 100, 250].map((s) => (\n <option key={s} value={s}>\n {s}x\n </option>\n ))}\n </select>\n </div>\n </div>\n\n <div className=\"grid grid-cols-2 gap-2\">\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[10px] text-slate-500 text-left\">\n Lng\n </span>\n <input\n className=\"bg-slate-800 border border-slate-700 rounded px-2 py-1 text-white focus:outline-none focus:border-blue-500\"\n onChange={(e) => {\n const lng = parseFloat(e.target.value) || 0;\n setLocation([lng, location[1]]);\n pushLocationUpdate();\n }}\n step=\"0.001\"\n type=\"number\"\n value={location[0]}\n />\n </div>\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[10px] text-slate-500 text-left\">\n Lat\n </span>\n <input\n className=\"bg-slate-800 border border-slate-700 rounded px-2 py-1 text-white focus:outline-none focus:border-blue-500\"\n onChange={(e) => {\n const lat = parseFloat(e.target.value) || 0;\n setLocation([location[0], lat]);\n pushLocationUpdate();\n }}\n step=\"0.001\"\n type=\"number\"\n value={location[1]}\n />\n </div>\n <div className=\"flex flex-col gap-1 col-span-2\">\n <span className=\"text-[10px] text-slate-500\">\n Heading (Degrees)\n </span>\n <input\n className=\"w-full accent-blue-500\"\n max=\"360\"\n min=\"0\"\n onChange={(e) => {\n setHeading(parseInt(e.target.value, 10));\n pushLocationUpdate();\n }}\n type=\"range\"\n value={heading}\n />\n <div className=\"text-right text-slate-400\">{heading}°</div>\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n};\n","import { Button } from \"@miniapps-sdk/components/ui/button\";\nimport { sdk } from \"@miniapps-sdk/sdk\";\nimport { GeolocationEvent } from \"@miniapps-sdk/types\";\nimport type React from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport interface DebugConsoleProps {\n /**\n * Whether to show the console initially.\n * Can also be controlled via the 'debug' prop on SDKProvider.\n */\n isOpen?: boolean;\n /**\n * Optional callback when the console is closed.\n */\n onClose?: () => void;\n}\n\ninterface LogEntry {\n id: string;\n time: string;\n label: string;\n content: string;\n}\n\n/**\n * A standalone debug console that intercepts and displays all Bridge communication.\n * Useful for debugging both in mock mode (BridgeMocker) and on real devices.\n */\nexport const DebugConsole: React.FC<DebugConsoleProps> = ({\n isOpen: initialOpen = false,\n onClose,\n}) => {\n const [showConsole, setShowConsole] = useState(initialOpen);\n const [logs, setLogs] = useState<LogEntry[]>([]);\n const scrollRef = useRef<HTMLDivElement>(null);\n\n // Sync with prop\n useEffect(() => {\n setShowConsole(initialOpen);\n }, [initialOpen]);\n\n const clearLogs = () => setLogs([]);\n\n const addLog = useCallback((label: string, data: any) => {\n // Skip location stream updates as they are too noisy\n if (label.includes(GeolocationEvent.LOCATION_STREAM_UPDATE)) return;\n\n const entry: LogEntry = {\n content: typeof data === \"string\" ? data : JSON.stringify(data, null, 2),\n id: Math.random().toString(36).slice(2),\n label,\n time: new Date().toLocaleTimeString(),\n };\n\n setLogs((prev) => [entry, ...prev].slice(0, 100));\n }, []);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n // 1. Intercept OUTGOING calls (SDK -> Shell)\n const bridge = (sdk as any).bridge;\n const originalSend = bridge.send.bind(bridge);\n\n bridge.send = async (type: string, payload: any) => {\n addLog(`OUT: ${type}`, payload);\n return originalSend(type, payload);\n };\n\n // 2. Intercept INCOMING messages (Shell -> SDK)\n const originalHandle = bridge.handleNativeMessage.bind(bridge);\n bridge.handleNativeMessage = (envelope: any) => {\n const type =\n envelope.eventName || envelope.event || envelope.type || \"MSG\";\n if (typeof type === \"string\") {\n addLog(`IN: ${type}`, envelope.payload || envelope.value || envelope);\n originalHandle(envelope);\n }\n };\n\n return () => {\n bridge.send = originalSend;\n bridge.handleNativeMessage = originalHandle;\n };\n }, [addLog]);\n\n if (!showConsole) {\n return (\n <Button\n className=\"fixed bottom-4 left-4 w-8 h-8 rounded-full bg-slate-900/60 backdrop-blur-sm border border-slate-700/50 flex items-center justify-center text-slate-400 hover:text-emerald-400 hover:bg-slate-900/80 transition-all z-[9998] shadow-lg group p-0!\"\n onClick={() => setShowConsole(true)}\n title=\"Open Debug Console\"\n type=\"button\"\n variant=\"ghost\"\n >\n <svg\n className=\"group-hover:scale-110 transition-transform\"\n fill=\"none\"\n height=\"14\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n width=\"14\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"m8 2 1.88 1.88\" />\n <path d=\"M14.12 3.88 16 2\" />\n <path d=\"M9 7.13v-1a3.003 3.003 0 1 1 6 0v1\" />\n <path d=\"M12 20c-3.3 0-6-2.7-6-6v-3a4 4 0 0 1 4-4h4a4 4 0 0 1 4 4v3c0 3.3-2.7 6-6 6\" />\n <path d=\"M12 20v-9\" />\n <path d=\"M6.53 9C4.6 8.8 3 7.1 3 5\" />\n <path d=\"M6 13H2\" />\n <path d=\"M3 21c0-2.1 1.7-3.9 3.8-4\" />\n <path d=\"M20.97 5c0 2.1-1.6 3.8-3.5 4\" />\n <path d=\"M22 13h-4\" />\n <path d=\"M17.2 17c2.1.1 3.8 1.9 3.8 4\" />\n </svg>\n </Button>\n );\n }\n\n return (\n <div className=\"fixed inset-x-0 bottom-0 w-full bg-[#0a080f] border-t border-slate-800 z-[9998] p-4 shadow-2xl flex flex-col animate-in slide-in-from-bottom duration-300\">\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-[10px] font-bold uppercase tracking-widest text-slate-400 flex items-center gap-2\">\n <span className=\"w-2 h-2 rounded-full bg-emerald-500 animate-pulse\" />\n UP SDK Debug Console\n </span>\n <div className=\"flex gap-4\">\n <Button\n className=\"text-[10px] text-slate-500 font-bold uppercase hover:text-slate-300 hover:bg-transparent transition-colors p-0 h-auto cursor-pointer\"\n onClick={clearLogs}\n type=\"button\"\n variant=\"ghost\"\n >\n Clear\n </Button>\n <Button\n className=\"text-[10px] text-pink-500 font-bold uppercase hover:text-pink-400 hover:bg-transparent transition-colors p-0 h-auto cursor-pointer\"\n onClick={() => {\n setShowConsole(false);\n if (onClose) onClose();\n }}\n type=\"button\"\n variant=\"ghost\"\n >\n Close\n </Button>\n </div>\n </div>\n <div\n className=\"bg-black/80 rounded-xl p-3 font-mono text-[10px] text-emerald-400 min-h-[120px] max-h-[240px] overflow-y-auto border border-slate-900 custom-scrollbar\"\n ref={scrollRef}\n >\n {logs.length === 0 ? (\n <div className=\"text-slate-600 italic text-center py-8\">\n No logs yet. Interacting with the SDK will show events here.\n </div>\n ) : (\n logs.map((log) => (\n <div\n className=\"mb-3 pb-3 border-b border-slate-900/50 last:border-0 last:mb-0 last:pb-0\"\n key={log.id}\n >\n <div className=\"flex gap-2 text-slate-500 mb-1 items-center\">\n <span className=\"text-[8px]\">{log.time}</span>\n <span className=\"font-bold text-white uppercase text-[8px] bg-slate-800 px-1.5 py-0.5 rounded leading-none\">\n {log.label}\n </span>\n </div>\n <pre className=\"whitespace-pre-wrap break-all opacity-90\">\n {log.content}\n </pre>\n </div>\n ))\n )}\n </div>\n </div>\n );\n};\n","import type React from \"react\";\nimport { createContext, useContext, useMemo } from \"react\";\nimport { BridgeMocker, type BridgeMockerProps } from \"./BridgeMocker\";\nimport { DebugConsole } from \"./DebugConsole\";\n\ninterface SDKContextValue {\n isMocked: boolean;\n}\n\nconst SDKContext = createContext<SDKContextValue>({ isMocked: false });\n\n/**\n * Hook to check if the SDK is currently running in mock mode (browser)\n * or native mode (shell app).\n */\nexport const useIsMocked = () => useContext(SDKContext).isMocked;\n\nexport interface SDKProviderProps\n extends Partial<Omit<BridgeMockerProps, \"children\">> {\n children: React.ReactNode;\n /**\n * If true, shows the standalone DebugConsole for bridge traffic.\n */\n debug?: boolean;\n}\n\n/**\n * A wrapper component that automatically enables the BridgeMocker\n * when running outside the native shell app.\n */\nexport const SDKProvider: React.FC<SDKProviderProps> = ({\n children,\n debug = false,\n ...mockerProps\n}) => {\n const isMocked =\n typeof window !== \"undefined\" &&\n !(\n (window as any).__UP_REACT_NATIVE_APP__ === true ||\n !!(window as any).ReactNativeWebView\n );\n\n const value = useMemo(() => ({ isMocked }), [isMocked]);\n\n const content = (\n <>\n {children}\n {(debug || isMocked) && <DebugConsole />}\n </>\n );\n\n if (isMocked) {\n return (\n <SDKContext.Provider value={value}>\n <BridgeMocker {...mockerProps}>{content}</BridgeMocker>\n </SDKContext.Provider>\n );\n }\n\n return <SDKContext.Provider value={value}>{content}</SDKContext.Provider>;\n};\n","import type { RoutingBackendConfig } from \"@miniapps-sdk/services/routingService\";\nimport { RoutingService } from \"@miniapps-sdk/services/routingService\";\nimport type {\n DrawRouteRequest,\n RouteRequest,\n RouteResponse,\n} from \"@miniapps-sdk/types/routing\";\nimport type { Map } from \"maplibre-gl\";\n\n/**\n * Handles a route request from the mini-app and fetches data from the configured backend.\n */\nexport async function handleRouteRequest(\n req: RouteRequest,\n config: RoutingBackendConfig,\n): Promise<RouteResponse> {\n return RoutingService.fetchRoute(req, config);\n}\n\n/**\n * Host-side map rendering logic for routes.\n */\nexport function handleDrawRoute(\n map: Map,\n miniAppId: string,\n req: DrawRouteRequest,\n) {\n const sourceId = `sdk-route-${miniAppId}`;\n const casingLayerId = `sdk-route-casing-${miniAppId}`;\n const lineLayerId = `sdk-route-line-${miniAppId}`;\n\n const geojson = {\n features: [\n {\n geometry: req.payload.routeData.geometry,\n properties: {},\n type: \"Feature\",\n },\n ],\n type: \"FeatureCollection\",\n };\n\n const source = map.getSource(sourceId);\n if (source) {\n // @ts-expect-error - maplibre-gl types might not expose setData nicely on generic source\n (source as maplibregl.GeoJSONSource).setData(geojson);\n } else {\n map.addSource(sourceId, {\n data: geojson as any,\n type: \"geojson\",\n });\n\n map.addLayer({\n id: casingLayerId,\n layout: {\n \"line-cap\": \"round\",\n \"line-join\": \"round\",\n },\n paint: {\n \"line-color\": \"#111111\",\n \"line-opacity\": 0.8,\n \"line-width\": 8,\n },\n source: sourceId,\n type: \"line\",\n });\n\n map.addLayer({\n id: lineLayerId,\n layout: {\n \"line-cap\": \"round\",\n \"line-join\": \"round\",\n },\n paint: {\n \"line-color\": \"#3b82f6\", // Bright blue\n \"line-width\": 4,\n },\n source: sourceId,\n type: \"line\",\n });\n }\n}\n\nexport function handleClearRoute(map: Map, miniAppId: string) {\n const sourceId = `sdk-route-${miniAppId}`;\n const casingLayerId = `sdk-route-casing-${miniAppId}`;\n const lineLayerId = `sdk-route-line-${miniAppId}`;\n\n if (map.getLayer(lineLayerId)) map.removeLayer(lineLayerId);\n if (map.getLayer(casingLayerId)) map.removeLayer(casingLayerId);\n if (map.getSource(sourceId)) map.removeSource(sourceId);\n}\n"],"mappings":"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","names":["Map","import_class_variance_authority","React","import_jsx_runtime","Content","import_jsx_runtime","containerH","fullPx","peekPx","React","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","resolveHeightToPixels","import_react","import_jsx_runtime","UIEvent","GeolocationEvent","GlobalEvent","import_react","import_react","import_react","import_jsx_runtime","import_react_maplibre","import_react","import_react_maplibre","import_react","import_jsx_runtime","import_react_maplibre","import_jsx_runtime","import_react_maplibre","import_jsx_runtime","import_jsx_runtime","mapLibreChildren","React","menuContentFromChildren","MapLibre","Map","import_react","React","Map","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime"]}