react-sharesheet 1.9.1 → 1.10.0

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/headless.ts","../src/hooks.ts","../src/utils.ts","../src/og-fetcher.ts","../src/share-functions.ts","../src/platforms.tsx"],"sourcesContent":["// Headless exports - just the hook and utilities, no styled components\n\nexport { useShareSheet, useShareMenu, useOGData, type UseShareSheetOptions, type UseShareMenuOptions } from \"./hooks\";\n\n// OG Data fetcher\nexport { fetchOGData, clearOGCache, type OGData } from \"./og-fetcher\";\n\nexport {\n shareToWhatsApp,\n shareToTelegram,\n shareToX,\n shareToFacebook,\n openInstagram,\n openTikTok,\n openThreads,\n shareToSnapchat,\n shareViaSMS,\n shareViaEmail,\n shareToLinkedIn,\n shareToReddit,\n} from \"./share-functions\";\n\nexport { cn, openUrl, getSafeUrl } from \"./utils\";\n\n// Platform configs (colors, icons, labels) - SINGLE SOURCE OF TRUTH\nexport {\n PLATFORMS,\n PLATFORM_IDS,\n PLATFORM_COLORS,\n PLATFORM_ICONS,\n PLATFORM_LABELS,\n PLATFORM_CSS_VARS,\n getPlatform,\n getAllPlatforms,\n getPlatformColor,\n getPlatformIcon,\n getPlatformLabel,\n generateCssVarDefaults,\n type PlatformConfig,\n type PlatformColor,\n} from \"./platforms\";\n\nexport type {\n UseShareSheetReturn,\n UseShareMenuReturn,\n ShareOption,\n ShareButtonConfig,\n} from \"./types\";\n","\"use client\";\n\nimport { useMemo, useState, useCallback, useEffect } from \"react\";\nimport { getSafeUrl, isMobileDevice, getAllPlatformAvailability } from \"./utils\";\nimport { fetchOGData, type OGData } from \"./og-fetcher\";\nimport {\n shareToWhatsApp,\n shareToTelegram,\n shareToX,\n shareToFacebook,\n openInstagram,\n openTikTok,\n openThreads,\n shareToSnapchat,\n shareViaSMS,\n shareViaEmail,\n shareToLinkedIn,\n shareToReddit,\n} from \"./share-functions\";\nimport type { UseShareSheetReturn, PlatformAvailability, ShareOption } from \"./types\";\n\n// Default platform availability (assumes desktop/all platforms available)\n// This is used for SSR to avoid hydration mismatch\nconst DEFAULT_PLATFORM_AVAILABILITY: Record<ShareOption, PlatformAvailability> = {\n native: { available: true },\n copy: { available: true },\n download: { available: true },\n whatsapp: { available: true },\n telegram: { available: true },\n instagram: { available: true },\n facebook: { available: true },\n snapchat: { available: true },\n sms: { available: true },\n email: { available: true },\n linkedin: { available: true },\n reddit: { available: true },\n x: { available: true },\n tiktok: { available: true },\n threads: { available: true },\n};\n\nexport interface UseShareSheetOptions {\n /** URL to share */\n shareUrl: string;\n /** Text to share */\n shareText: string;\n /** Download URL (optional) */\n downloadUrl?: string | null;\n /** Download filename (optional) */\n downloadFilename?: string;\n /** Email subject (optional) */\n emailSubject?: string;\n /** File to share via native share (data URL or Blob) - takes priority over URL sharing */\n shareFile?: string | Blob | null;\n /** Filename for the shared file */\n shareFilename?: string;\n /** Callback after native share */\n onNativeShare?: () => void;\n /** Callback after copy */\n onCopy?: () => void;\n /** Callback after download starts */\n onDownload?: () => void;\n}\n\n/**\n * Headless hook for share sheet functionality.\n * Use this to build your own custom share UI.\n */\nexport function useShareSheet({\n shareUrl,\n shareText,\n downloadUrl,\n downloadFilename,\n emailSubject = \"Share\",\n shareFile,\n shareFilename = \"share.png\",\n onNativeShare,\n onCopy,\n onDownload,\n}: UseShareSheetOptions): UseShareSheetReturn {\n const [copied, setCopied] = useState(false);\n const [downloading, setDownloading] = useState(false);\n\n // Use state for values that depend on browser APIs to avoid hydration mismatch\n // Initial values match what server renders (conservative defaults)\n const [canNativeShare, setCanNativeShare] = useState(false);\n const [isMobile, setIsMobile] = useState(false);\n const [platformAvailability, setPlatformAvailability] = useState<Record<ShareOption, PlatformAvailability>>(\n DEFAULT_PLATFORM_AVAILABILITY\n );\n\n // Detect browser capabilities after mount (client-side only)\n useEffect(() => {\n setCanNativeShare(typeof navigator !== \"undefined\" && \"share\" in navigator);\n setIsMobile(isMobileDevice());\n setPlatformAvailability(getAllPlatformAvailability());\n }, []);\n\n const safeUrl = getSafeUrl(shareUrl);\n\n const copyLink = useCallback(async () => {\n if (!safeUrl) return;\n try {\n await navigator.clipboard.writeText(safeUrl);\n setCopied(true);\n onCopy?.();\n setTimeout(() => setCopied(false), 1200);\n } catch {\n // ignore\n }\n }, [safeUrl, onCopy]);\n\n const nativeShare = useCallback(async () => {\n const nav = navigator as Navigator & {\n share?: (data: ShareData) => Promise<void>;\n canShare?: (data: ShareData) => boolean;\n };\n if (!(\"share\" in nav) || typeof nav.share !== \"function\") return;\n\n try {\n // If shareFile is provided, try to share as a file\n if (shareFile) {\n let blob: Blob;\n\n // Convert data URL to Blob if needed\n if (typeof shareFile === \"string\" && shareFile.startsWith(\"data:\")) {\n const response = await fetch(shareFile);\n blob = await response.blob();\n } else if (shareFile instanceof Blob) {\n blob = shareFile;\n } else {\n // Invalid shareFile, fall back to URL sharing\n if (!safeUrl) return;\n await nav.share({\n title: shareText,\n text: shareText,\n url: safeUrl,\n });\n onNativeShare?.();\n return;\n }\n\n // Create a File from the Blob\n const file = new File([blob], shareFilename, { type: blob.type || \"image/png\" });\n\n // Check if file sharing is supported\n const shareData: ShareData = {\n files: [file],\n title: shareText,\n text: shareText,\n };\n\n if (nav.canShare && !nav.canShare(shareData)) {\n // File sharing not supported, fall back to URL sharing\n if (!safeUrl) return;\n await nav.share({\n title: shareText,\n text: shareText,\n url: safeUrl,\n });\n onNativeShare?.();\n return;\n }\n\n await nav.share(shareData);\n onNativeShare?.();\n return;\n }\n\n // Fall back to URL sharing\n if (!safeUrl) return;\n await nav.share({\n title: shareText,\n text: shareText,\n url: safeUrl,\n });\n onNativeShare?.();\n } catch {\n // user canceled or share failed -> ignore\n }\n }, [safeUrl, shareText, shareFile, shareFilename, onNativeShare]);\n\n const downloadFile = useCallback(async () => {\n const url = (downloadUrl ?? \"\").trim();\n if (!url) return;\n try {\n setDownloading(true);\n onDownload?.();\n const res = await fetch(url);\n if (!res.ok) throw new Error(`Failed to fetch file (${res.status})`);\n const blob = await res.blob();\n const href = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = href;\n a.download = downloadFilename || \"download\";\n document.body.appendChild(a);\n a.click();\n a.remove();\n URL.revokeObjectURL(href);\n } catch {\n // ignore\n } finally {\n setDownloading(false);\n }\n }, [downloadUrl, downloadFilename, onDownload]);\n\n const shareWhatsApp = useCallback(() => {\n shareToWhatsApp(safeUrl, shareText);\n }, [safeUrl, shareText]);\n\n const shareTelegram = useCallback(() => {\n shareToTelegram(safeUrl, shareText);\n }, [safeUrl, shareText]);\n\n const shareX = useCallback(() => {\n shareToX(safeUrl, shareText);\n }, [safeUrl, shareText]);\n\n const shareFacebook = useCallback(() => {\n shareToFacebook(safeUrl);\n }, [safeUrl]);\n\n const shareInstagram = useCallback(() => {\n openInstagram();\n }, []);\n\n const shareTikTok = useCallback(() => {\n openTikTok();\n }, []);\n\n const shareThreads = useCallback(() => {\n openThreads();\n }, []);\n\n const shareSnapchat = useCallback(() => {\n shareToSnapchat(safeUrl);\n }, [safeUrl]);\n\n const shareSMS = useCallback(() => {\n shareViaSMS(safeUrl, shareText);\n }, [safeUrl, shareText]);\n\n const shareEmail = useCallback(() => {\n shareViaEmail(safeUrl, shareText, emailSubject);\n }, [safeUrl, shareText, emailSubject]);\n\n const shareLinkedIn = useCallback(() => {\n shareToLinkedIn(safeUrl);\n }, [safeUrl]);\n\n const shareReddit = useCallback(() => {\n shareToReddit(safeUrl, shareText);\n }, [safeUrl, shareText]);\n\n return {\n canNativeShare,\n copied,\n downloading,\n safeUrl,\n isMobile,\n platformAvailability,\n copyLink,\n nativeShare,\n downloadFile,\n shareWhatsApp,\n shareTelegram,\n shareX,\n shareFacebook,\n shareInstagram,\n shareTikTok,\n shareThreads,\n shareSnapchat,\n shareSMS,\n shareEmail,\n shareLinkedIn,\n shareReddit,\n };\n}\n\n/**\n * Hook to fetch OG (Open Graph) data from a URL.\n * Automatically fetches and caches OG metadata for link previews.\n */\nexport function useOGData(url: string | undefined): {\n ogData: OGData | null;\n loading: boolean;\n error: string | null;\n} {\n const [ogData, setOgData] = useState<OGData | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (!url) {\n setOgData(null);\n setLoading(false);\n setError(null);\n return;\n }\n\n let cancelled = false;\n setLoading(true);\n setError(null);\n\n fetchOGData(url)\n .then((data) => {\n if (!cancelled) {\n setOgData(data);\n setLoading(false);\n }\n })\n .catch((err) => {\n if (!cancelled) {\n setError(err instanceof Error ? err.message : \"Failed to fetch OG data\");\n setLoading(false);\n }\n });\n\n return () => {\n cancelled = true;\n };\n }, [url]);\n\n return { ogData, loading, error };\n}\n\n// Legacy export for backwards compatibility\n/** @deprecated Use useShareSheet instead */\nexport const useShareMenu = useShareSheet;\n/** @deprecated Use UseShareSheetOptions instead */\nexport type UseShareMenuOptions = UseShareSheetOptions;\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\nimport type { ShareOption, PlatformAvailability } from \"./types\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\nexport function openUrl(url: string) {\n window.open(url, \"_blank\", \"noopener,noreferrer\");\n}\n\nexport function getSafeUrl(shareUrl: string): string {\n return shareUrl || (typeof window !== \"undefined\" ? window.location.href : \"\");\n}\n\n/**\n * Detect if the current device is a mobile device.\n * Uses user agent detection as the primary method.\n */\nexport function isMobileDevice(): boolean {\n if (typeof navigator === \"undefined\") return false;\n \n const userAgent = navigator.userAgent || navigator.vendor || \"\";\n \n // Check for mobile user agents\n const mobileRegex = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Mobile|mobile|CriOS/i;\n \n // Also check for touch capability as a secondary signal\n const hasTouch = typeof window !== \"undefined\" && (\n \"ontouchstart\" in window ||\n navigator.maxTouchPoints > 0\n );\n \n // User agent is more reliable than touch detection alone\n // (many desktop browsers support touch)\n return mobileRegex.test(userAgent);\n}\n\n/**\n * Detect if the current device is iOS\n */\nexport function isIOSDevice(): boolean {\n if (typeof navigator === \"undefined\") return false;\n \n const userAgent = navigator.userAgent || \"\";\n return /iPhone|iPad|iPod/i.test(userAgent);\n}\n\n/**\n * Detect if the current device is Android\n */\nexport function isAndroidDevice(): boolean {\n if (typeof navigator === \"undefined\") return false;\n \n const userAgent = navigator.userAgent || \"\";\n return /Android/i.test(userAgent);\n}\n\n/** Platforms that require mobile devices (deep links / URL schemes) */\nexport const MOBILE_ONLY_PLATFORMS: readonly ShareOption[] = [\n \"instagram\",\n \"tiktok\", \n \"threads\",\n \"sms\",\n] as const;\n\n/** Platforms that work better on mobile but may partially work on desktop */\nexport const MOBILE_PREFERRED_PLATFORMS: readonly ShareOption[] = [\n \"snapchat\",\n \"whatsapp\",\n] as const;\n\n/**\n * Check if a share platform is available on the current device.\n * Returns availability status and reason if unavailable.\n */\nexport function checkPlatformAvailability(platform: ShareOption): PlatformAvailability {\n const isMobile = isMobileDevice();\n \n // Deep link platforms - require mobile device\n if (MOBILE_ONLY_PLATFORMS.includes(platform)) {\n if (!isMobile) {\n return {\n available: false,\n reason: `${platform} requires a mobile device with the app installed`,\n };\n }\n }\n \n // SMS - requires mobile or device with SMS capability\n if (platform === \"sms\" && !isMobile) {\n return {\n available: false,\n reason: \"SMS sharing requires a mobile device\",\n };\n }\n \n // Native share - check browser support\n if (platform === \"native\") {\n const canShare = typeof navigator !== \"undefined\" && \"share\" in navigator;\n if (!canShare) {\n return {\n available: false,\n reason: \"Native share is not supported by this browser\",\n };\n }\n }\n \n return { available: true };\n}\n\n/**\n * Get availability status for all platforms.\n */\nexport function getAllPlatformAvailability(): Record<ShareOption, PlatformAvailability> {\n const platforms: ShareOption[] = [\n \"native\", \"copy\", \"download\", \"whatsapp\", \"telegram\",\n \"instagram\", \"facebook\", \"snapchat\", \"sms\", \"email\",\n \"linkedin\", \"reddit\", \"x\", \"tiktok\", \"threads\",\n ];\n \n const result: Partial<Record<ShareOption, PlatformAvailability>> = {};\n for (const platform of platforms) {\n result[platform] = checkPlatformAvailability(platform);\n }\n \n return result as Record<ShareOption, PlatformAvailability>;\n}\n\n/**\n * Log a warning to console when a platform is not available.\n */\nexport function warnUnavailablePlatform(platform: ShareOption, reason: string): void {\n console.warn(\n `[react-sharesheet] ${platform} sharing is not available: ${reason}. ` +\n `This share option may not work correctly on this device.`\n );\n}\n\n","// OG Data fetcher using Microlink API (free, no API key required)\n\nexport interface OGData {\n title?: string;\n description?: string;\n image?: string;\n url?: string;\n siteName?: string;\n}\n\nexport interface OGFetchResult {\n data: OGData | null;\n loading: boolean;\n error: string | null;\n}\n\n// Cache to avoid re-fetching the same URL\nconst ogCache = new Map<string, OGData>();\n\nexport async function fetchOGData(url: string): Promise<OGData | null> {\n // Check cache first\n if (ogCache.has(url)) {\n return ogCache.get(url)!;\n }\n\n try {\n // Use Microlink API to fetch OG data (free tier, no API key needed)\n const apiUrl = `https://api.microlink.io?url=${encodeURIComponent(url)}`;\n const response = await fetch(apiUrl);\n \n if (!response.ok) {\n throw new Error(`Failed to fetch OG data: ${response.status}`);\n }\n\n const json = await response.json();\n \n if (json.status !== \"success\" || !json.data) {\n return null;\n }\n\n const { title, description, image, url: canonicalUrl, publisher } = json.data;\n\n const ogData: OGData = {\n title: title || undefined,\n description: description || undefined,\n image: image?.url || undefined,\n url: canonicalUrl || url,\n siteName: publisher || undefined,\n };\n\n // Cache the result\n ogCache.set(url, ogData);\n\n return ogData;\n } catch (error) {\n console.warn(\"[react-sharesheet] Failed to fetch OG data:\", error);\n return null;\n }\n}\n\n// Clear cache (useful for testing or forcing refresh)\nexport function clearOGCache(): void {\n ogCache.clear();\n}\n","import { \n openUrl, \n checkPlatformAvailability, \n warnUnavailablePlatform,\n} from \"./utils\";\n\nexport function shareToWhatsApp(url: string, text: string) {\n const encoded = encodeURIComponent(`${text}\\n${url}`);\n openUrl(`https://api.whatsapp.com/send?text=${encoded}`);\n}\n\nexport function shareToTelegram(url: string, text: string) {\n const encodedText = encodeURIComponent(text);\n const encodedUrl = encodeURIComponent(url);\n openUrl(`https://t.me/share/url?url=${encodedUrl}&text=${encodedText}`);\n}\n\nexport function shareToX(url: string, text: string) {\n const encodedText = encodeURIComponent(text);\n const encodedUrl = encodeURIComponent(url);\n openUrl(`https://x.com/intent/tweet?text=${encodedText}&url=${encodedUrl}`);\n}\n\nexport function shareToFacebook(url: string) {\n const encodedUrl = encodeURIComponent(url);\n openUrl(`https://www.facebook.com/sharer/sharer.php?u=${encodedUrl}`);\n}\n\nexport function openInstagram() {\n const availability = checkPlatformAvailability(\"instagram\");\n if (!availability.available) {\n warnUnavailablePlatform(\"instagram\", availability.reason!);\n // Still attempt to open - it may work on some desktop browsers with app installed\n }\n window.location.href = \"instagram://\";\n}\n\nexport function openTikTok() {\n const availability = checkPlatformAvailability(\"tiktok\");\n if (!availability.available) {\n warnUnavailablePlatform(\"tiktok\", availability.reason!);\n // Still attempt to open - it may work on some desktop browsers with app installed\n }\n window.location.href = \"tiktok://\";\n}\n\nexport function openThreads() {\n const availability = checkPlatformAvailability(\"threads\");\n if (!availability.available) {\n warnUnavailablePlatform(\"threads\", availability.reason!);\n // Still attempt to open - it may work on some desktop browsers with app installed\n }\n window.location.href = \"threads://\";\n}\n\nexport function shareToSnapchat(url: string) {\n const encodedUrl = encodeURIComponent(url);\n openUrl(`https://www.snapchat.com/scan?attachmentUrl=${encodedUrl}`);\n}\n\nexport function shareViaSMS(url: string, text: string) {\n const availability = checkPlatformAvailability(\"sms\");\n if (!availability.available) {\n warnUnavailablePlatform(\"sms\", availability.reason!);\n // Still attempt to open - it may work on some devices\n }\n const body = encodeURIComponent(`${text}\\n${url}`);\n window.location.href = `sms:?body=${body}`;\n}\n\nexport function shareViaEmail(url: string, text: string, subject = \"Share\") {\n const encodedSubject = encodeURIComponent(subject);\n const body = encodeURIComponent(`${text}\\n\\n${url}`);\n window.location.href = `mailto:?subject=${encodedSubject}&body=${body}`;\n}\n\nexport function shareToLinkedIn(url: string) {\n const encodedUrl = encodeURIComponent(url);\n openUrl(`https://www.linkedin.com/sharing/share-offsite/?url=${encodedUrl}`);\n}\n\nexport function shareToReddit(url: string, text: string) {\n const encodedText = encodeURIComponent(text);\n const encodedUrl = encodeURIComponent(url);\n openUrl(`https://www.reddit.com/submit?url=${encodedUrl}&title=${encodedText}`);\n}\n\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport {\n LuDownload,\n LuLink,\n LuMail,\n LuMessageCircle,\n LuSend,\n} from \"react-icons/lu\";\nimport {\n FaFacebookF,\n FaInstagram,\n FaLinkedin,\n FaReddit,\n FaTelegramPlane,\n FaTiktok,\n FaWhatsapp,\n} from \"react-icons/fa\";\nimport { FaXTwitter, FaThreads, FaSnapchat } from \"react-icons/fa6\";\nimport type { ShareOption } from \"./types\";\n\n/** Platform color configuration */\nexport interface PlatformColor {\n /** Background color (hex) */\n bg: string;\n /** Text/icon color (hex) */\n text: string;\n}\n\n/** Platform configuration */\nexport interface PlatformConfig {\n /** Platform identifier */\n id: ShareOption;\n /** Display label */\n label: string;\n /** Colors */\n colors: PlatformColor;\n /** Icon component (accepts size prop) */\n Icon: (props: { size?: number; className?: string }) => ReactNode;\n /** CSS variable name for background */\n cssVar: string;\n}\n\n/** All platform IDs in default order */\nexport const PLATFORM_IDS: readonly ShareOption[] = [\n \"native\",\n \"copy\",\n \"download\",\n \"whatsapp\",\n \"telegram\",\n \"instagram\",\n \"facebook\",\n \"snapchat\",\n \"sms\",\n \"email\",\n \"linkedin\",\n \"reddit\",\n \"x\",\n \"tiktok\",\n \"threads\",\n] as const;\n\n/** Platform colors - hex values for each platform (SOURCE OF TRUTH) */\nexport const PLATFORM_COLORS: Record<ShareOption, PlatformColor> = {\n native: { bg: \"#7c3aed\", text: \"#ffffff\" },\n copy: { bg: \"#3b82f6\", text: \"#ffffff\" },\n download: { bg: \"#ef4444\", text: \"#ffffff\" },\n whatsapp: { bg: \"#25D366\", text: \"#ffffff\" },\n telegram: { bg: \"#229ED9\", text: \"#ffffff\" },\n instagram: { bg: \"#E1306C\", text: \"#ffffff\" },\n facebook: { bg: \"#1877F2\", text: \"#ffffff\" },\n snapchat: { bg: \"#FFFC00\", text: \"#000000\" },\n sms: { bg: \"#22c55e\", text: \"#ffffff\" },\n email: { bg: \"#f97316\", text: \"#ffffff\" },\n linkedin: { bg: \"#0A66C2\", text: \"#ffffff\" },\n reddit: { bg: \"#FF4500\", text: \"#ffffff\" },\n x: { bg: \"#000000\", text: \"#ffffff\" },\n tiktok: { bg: \"#000000\", text: \"#ffffff\" },\n threads: { bg: \"#000000\", text: \"#ffffff\" },\n} as const;\n\n/** Platform labels (SOURCE OF TRUTH) */\nexport const PLATFORM_LABELS: Record<ShareOption, string> = {\n native: \"Share…\",\n copy: \"Copy\",\n download: \"Download\",\n whatsapp: \"WhatsApp\",\n telegram: \"Telegram\",\n instagram: \"Instagram\",\n facebook: \"Facebook\",\n snapchat: \"Snapchat\",\n sms: \"SMS\",\n email: \"Email\",\n linkedin: \"LinkedIn\",\n reddit: \"Reddit\",\n x: \"X\",\n tiktok: \"TikTok\",\n threads: \"Threads\",\n} as const;\n\n/** Platform icons - React components (SOURCE OF TRUTH) */\nexport const PLATFORM_ICONS: Record<ShareOption, (props: { size?: number; className?: string }) => ReactNode> = {\n native: ({ size = 22, className }) => <LuSend size={size} className={className} />,\n copy: ({ size = 22, className }) => <LuLink size={size} className={className} />,\n download: ({ size = 22, className }) => <LuDownload size={size} className={className} />,\n whatsapp: ({ size = 22, className }) => <FaWhatsapp size={size} className={className} />,\n telegram: ({ size = 22, className }) => <FaTelegramPlane size={size} className={className} />,\n instagram: ({ size = 22, className }) => <FaInstagram size={size} className={className} />,\n facebook: ({ size = 22, className }) => <FaFacebookF size={size} className={className} />,\n snapchat: ({ size = 22, className }) => <FaSnapchat size={size} className={className} />,\n sms: ({ size = 22, className }) => <LuMessageCircle size={size} className={className} />,\n email: ({ size = 22, className }) => <LuMail size={size} className={className} />,\n linkedin: ({ size = 22, className }) => <FaLinkedin size={size} className={className} />,\n reddit: ({ size = 22, className }) => <FaReddit size={size} className={className} />,\n x: ({ size = 22, className }) => <FaXTwitter size={size} className={className} />,\n tiktok: ({ size = 22, className }) => <FaTiktok size={size} className={className} />,\n threads: ({ size = 22, className }) => <FaThreads size={size} className={className} />,\n} as const;\n\n/** CSS variable names for platform backgrounds */\nexport const PLATFORM_CSS_VARS: Record<ShareOption, string> = {\n native: \"--sharesheet-native-bg\",\n copy: \"--sharesheet-copy-bg\",\n download: \"--sharesheet-download-bg\",\n whatsapp: \"--sharesheet-whatsapp-bg\",\n telegram: \"--sharesheet-telegram-bg\",\n instagram: \"--sharesheet-instagram-bg\",\n facebook: \"--sharesheet-facebook-bg\",\n snapchat: \"--sharesheet-snapchat-bg\",\n sms: \"--sharesheet-sms-bg\",\n email: \"--sharesheet-email-bg\",\n linkedin: \"--sharesheet-linkedin-bg\",\n reddit: \"--sharesheet-reddit-bg\",\n x: \"--sharesheet-x-bg\",\n tiktok: \"--sharesheet-tiktok-bg\",\n threads: \"--sharesheet-threads-bg\",\n} as const;\n\n/** Full platform configurations */\nexport const PLATFORMS: Record<ShareOption, PlatformConfig> = Object.fromEntries(\n PLATFORM_IDS.map((id) => [\n id,\n {\n id,\n label: PLATFORM_LABELS[id],\n colors: PLATFORM_COLORS[id],\n Icon: PLATFORM_ICONS[id],\n cssVar: PLATFORM_CSS_VARS[id],\n },\n ])\n) as Record<ShareOption, PlatformConfig>;\n\n/** Get platform config by id */\nexport function getPlatform(id: ShareOption): PlatformConfig {\n return PLATFORMS[id];\n}\n\n/** Get all platform configs as array */\nexport function getAllPlatforms(): PlatformConfig[] {\n return PLATFORM_IDS.map((id) => PLATFORMS[id]);\n}\n\n/** Get platform color */\nexport function getPlatformColor(id: ShareOption): PlatformColor {\n return PLATFORM_COLORS[id];\n}\n\n/** Get platform icon component */\nexport function getPlatformIcon(id: ShareOption): (props: { size?: number; className?: string }) => ReactNode {\n return PLATFORM_ICONS[id];\n}\n\n/** Get platform label */\nexport function getPlatformLabel(id: ShareOption): string {\n return PLATFORM_LABELS[id];\n}\n\n/** Generate CSS variable defaults from platform colors */\nexport function generateCssVarDefaults(): Record<string, string> {\n const defaults: Record<string, string> = {};\n PLATFORM_IDS.forEach((id) => {\n defaults[PLATFORM_CSS_VARS[id]] = PLATFORM_COLORS[id].bg;\n });\n return defaults;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEA,mBAA0D;;;ACF1D,kBAAsC;AACtC,4BAAwB;AAGjB,SAAS,MAAM,QAAsB;AAC1C,aAAO,mCAAQ,kBAAK,MAAM,CAAC;AAC7B;AAEO,SAAS,QAAQ,KAAa;AACnC,SAAO,KAAK,KAAK,UAAU,qBAAqB;AAClD;AAEO,SAAS,WAAW,UAA0B;AACnD,SAAO,aAAa,OAAO,WAAW,cAAc,OAAO,SAAS,OAAO;AAC7E;AAMO,SAAS,iBAA0B;AACxC,MAAI,OAAO,cAAc,YAAa,QAAO;AAE7C,QAAM,YAAY,UAAU,aAAa,UAAU,UAAU;AAG7D,QAAM,cAAc;AAGpB,QAAM,WAAW,OAAO,WAAW,gBACjC,kBAAkB,UAClB,UAAU,iBAAiB;AAK7B,SAAO,YAAY,KAAK,SAAS;AACnC;AAuBO,IAAM,wBAAgD;AAAA,EAC3D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAYO,SAAS,0BAA0B,UAA6C;AACrF,QAAM,WAAW,eAAe;AAGhC,MAAI,sBAAsB,SAAS,QAAQ,GAAG;AAC5C,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,QACL,WAAW;AAAA,QACX,QAAQ,GAAG,QAAQ;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAGA,MAAI,aAAa,SAAS,CAAC,UAAU;AACnC,WAAO;AAAA,MACL,WAAW;AAAA,MACX,QAAQ;AAAA,IACV;AAAA,EACF;AAGA,MAAI,aAAa,UAAU;AACzB,UAAM,WAAW,OAAO,cAAc,eAAe,WAAW;AAChE,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,QACL,WAAW;AAAA,QACX,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,WAAW,KAAK;AAC3B;AAKO,SAAS,6BAAwE;AACtF,QAAM,YAA2B;AAAA,IAC/B;AAAA,IAAU;AAAA,IAAQ;AAAA,IAAY;AAAA,IAAY;AAAA,IAC1C;AAAA,IAAa;AAAA,IAAY;AAAA,IAAY;AAAA,IAAO;AAAA,IAC5C;AAAA,IAAY;AAAA,IAAU;AAAA,IAAK;AAAA,IAAU;AAAA,EACvC;AAEA,QAAM,SAA6D,CAAC;AACpE,aAAW,YAAY,WAAW;AAChC,WAAO,QAAQ,IAAI,0BAA0B,QAAQ;AAAA,EACvD;AAEA,SAAO;AACT;AAKO,SAAS,wBAAwB,UAAuB,QAAsB;AACnF,UAAQ;AAAA,IACN,sBAAsB,QAAQ,8BAA8B,MAAM;AAAA,EAEpE;AACF;;;ACzHA,IAAM,UAAU,oBAAI,IAAoB;AAExC,eAAsB,YAAY,KAAqC;AAErE,MAAI,QAAQ,IAAI,GAAG,GAAG;AACpB,WAAO,QAAQ,IAAI,GAAG;AAAA,EACxB;AAEA,MAAI;AAEF,UAAM,SAAS,gCAAgC,mBAAmB,GAAG,CAAC;AACtE,UAAM,WAAW,MAAM,MAAM,MAAM;AAEnC,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,4BAA4B,SAAS,MAAM,EAAE;AAAA,IAC/D;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AAEjC,QAAI,KAAK,WAAW,aAAa,CAAC,KAAK,MAAM;AAC3C,aAAO;AAAA,IACT;AAEA,UAAM,EAAE,OAAO,aAAa,OAAO,KAAK,cAAc,UAAU,IAAI,KAAK;AAEzE,UAAM,SAAiB;AAAA,MACrB,OAAO,SAAS;AAAA,MAChB,aAAa,eAAe;AAAA,MAC5B,OAAO,OAAO,OAAO;AAAA,MACrB,KAAK,gBAAgB;AAAA,MACrB,UAAU,aAAa;AAAA,IACzB;AAGA,YAAQ,IAAI,KAAK,MAAM;AAEvB,WAAO;AAAA,EACT,SAAS,OAAO;AACd,YAAQ,KAAK,+CAA+C,KAAK;AACjE,WAAO;AAAA,EACT;AACF;AAGO,SAAS,eAAqB;AACnC,UAAQ,MAAM;AAChB;;;ACzDO,SAAS,gBAAgB,KAAa,MAAc;AACzD,QAAM,UAAU,mBAAmB,GAAG,IAAI;AAAA,EAAK,GAAG,EAAE;AACpD,UAAQ,sCAAsC,OAAO,EAAE;AACzD;AAEO,SAAS,gBAAgB,KAAa,MAAc;AACzD,QAAM,cAAc,mBAAmB,IAAI;AAC3C,QAAM,aAAa,mBAAmB,GAAG;AACzC,UAAQ,8BAA8B,UAAU,SAAS,WAAW,EAAE;AACxE;AAEO,SAAS,SAAS,KAAa,MAAc;AAClD,QAAM,cAAc,mBAAmB,IAAI;AAC3C,QAAM,aAAa,mBAAmB,GAAG;AACzC,UAAQ,mCAAmC,WAAW,QAAQ,UAAU,EAAE;AAC5E;AAEO,SAAS,gBAAgB,KAAa;AAC3C,QAAM,aAAa,mBAAmB,GAAG;AACzC,UAAQ,gDAAgD,UAAU,EAAE;AACtE;AAEO,SAAS,gBAAgB;AAC9B,QAAM,eAAe,0BAA0B,WAAW;AAC1D,MAAI,CAAC,aAAa,WAAW;AAC3B,4BAAwB,aAAa,aAAa,MAAO;AAAA,EAE3D;AACA,SAAO,SAAS,OAAO;AACzB;AAEO,SAAS,aAAa;AAC3B,QAAM,eAAe,0BAA0B,QAAQ;AACvD,MAAI,CAAC,aAAa,WAAW;AAC3B,4BAAwB,UAAU,aAAa,MAAO;AAAA,EAExD;AACA,SAAO,SAAS,OAAO;AACzB;AAEO,SAAS,cAAc;AAC5B,QAAM,eAAe,0BAA0B,SAAS;AACxD,MAAI,CAAC,aAAa,WAAW;AAC3B,4BAAwB,WAAW,aAAa,MAAO;AAAA,EAEzD;AACA,SAAO,SAAS,OAAO;AACzB;AAEO,SAAS,gBAAgB,KAAa;AAC3C,QAAM,aAAa,mBAAmB,GAAG;AACzC,UAAQ,+CAA+C,UAAU,EAAE;AACrE;AAEO,SAAS,YAAY,KAAa,MAAc;AACrD,QAAM,eAAe,0BAA0B,KAAK;AACpD,MAAI,CAAC,aAAa,WAAW;AAC3B,4BAAwB,OAAO,aAAa,MAAO;AAAA,EAErD;AACA,QAAM,OAAO,mBAAmB,GAAG,IAAI;AAAA,EAAK,GAAG,EAAE;AACjD,SAAO,SAAS,OAAO,aAAa,IAAI;AAC1C;AAEO,SAAS,cAAc,KAAa,MAAc,UAAU,SAAS;AAC1E,QAAM,iBAAiB,mBAAmB,OAAO;AACjD,QAAM,OAAO,mBAAmB,GAAG,IAAI;AAAA;AAAA,EAAO,GAAG,EAAE;AACnD,SAAO,SAAS,OAAO,mBAAmB,cAAc,SAAS,IAAI;AACvE;AAEO,SAAS,gBAAgB,KAAa;AAC3C,QAAM,aAAa,mBAAmB,GAAG;AACzC,UAAQ,uDAAuD,UAAU,EAAE;AAC7E;AAEO,SAAS,cAAc,KAAa,MAAc;AACvD,QAAM,cAAc,mBAAmB,IAAI;AAC3C,QAAM,aAAa,mBAAmB,GAAG;AACzC,UAAQ,qCAAqC,UAAU,UAAU,WAAW,EAAE;AAChF;;;AH9DA,IAAM,gCAA2E;AAAA,EAC/E,QAAQ,EAAE,WAAW,KAAK;AAAA,EAC1B,MAAM,EAAE,WAAW,KAAK;AAAA,EACxB,UAAU,EAAE,WAAW,KAAK;AAAA,EAC5B,UAAU,EAAE,WAAW,KAAK;AAAA,EAC5B,UAAU,EAAE,WAAW,KAAK;AAAA,EAC5B,WAAW,EAAE,WAAW,KAAK;AAAA,EAC7B,UAAU,EAAE,WAAW,KAAK;AAAA,EAC5B,UAAU,EAAE,WAAW,KAAK;AAAA,EAC5B,KAAK,EAAE,WAAW,KAAK;AAAA,EACvB,OAAO,EAAE,WAAW,KAAK;AAAA,EACzB,UAAU,EAAE,WAAW,KAAK;AAAA,EAC5B,QAAQ,EAAE,WAAW,KAAK;AAAA,EAC1B,GAAG,EAAE,WAAW,KAAK;AAAA,EACrB,QAAQ,EAAE,WAAW,KAAK;AAAA,EAC1B,SAAS,EAAE,WAAW,KAAK;AAC7B;AA6BO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AACF,GAA8C;AAC5C,QAAM,CAAC,QAAQ,SAAS,QAAI,uBAAS,KAAK;AAC1C,QAAM,CAAC,aAAa,cAAc,QAAI,uBAAS,KAAK;AAIpD,QAAM,CAAC,gBAAgB,iBAAiB,QAAI,uBAAS,KAAK;AAC1D,QAAM,CAAC,UAAU,WAAW,QAAI,uBAAS,KAAK;AAC9C,QAAM,CAAC,sBAAsB,uBAAuB,QAAI;AAAA,IACtD;AAAA,EACF;AAGA,8BAAU,MAAM;AACd,sBAAkB,OAAO,cAAc,eAAe,WAAW,SAAS;AAC1E,gBAAY,eAAe,CAAC;AAC5B,4BAAwB,2BAA2B,CAAC;AAAA,EACtD,GAAG,CAAC,CAAC;AAEL,QAAM,UAAU,WAAW,QAAQ;AAEnC,QAAM,eAAW,0BAAY,YAAY;AACvC,QAAI,CAAC,QAAS;AACd,QAAI;AACF,YAAM,UAAU,UAAU,UAAU,OAAO;AAC3C,gBAAU,IAAI;AACd,eAAS;AACT,iBAAW,MAAM,UAAU,KAAK,GAAG,IAAI;AAAA,IACzC,QAAQ;AAAA,IAER;AAAA,EACF,GAAG,CAAC,SAAS,MAAM,CAAC;AAEpB,QAAM,kBAAc,0BAAY,YAAY;AAC1C,UAAM,MAAM;AAIZ,QAAI,EAAE,WAAW,QAAQ,OAAO,IAAI,UAAU,WAAY;AAE1D,QAAI;AAEF,UAAI,WAAW;AACb,YAAI;AAGJ,YAAI,OAAO,cAAc,YAAY,UAAU,WAAW,OAAO,GAAG;AAClE,gBAAM,WAAW,MAAM,MAAM,SAAS;AACtC,iBAAO,MAAM,SAAS,KAAK;AAAA,QAC7B,WAAW,qBAAqB,MAAM;AACpC,iBAAO;AAAA,QACT,OAAO;AAEL,cAAI,CAAC,QAAS;AACd,gBAAM,IAAI,MAAM;AAAA,YACd,OAAO;AAAA,YACP,MAAM;AAAA,YACN,KAAK;AAAA,UACP,CAAC;AACD,0BAAgB;AAChB;AAAA,QACF;AAGA,cAAM,OAAO,IAAI,KAAK,CAAC,IAAI,GAAG,eAAe,EAAE,MAAM,KAAK,QAAQ,YAAY,CAAC;AAG/E,cAAM,YAAuB;AAAA,UAC3B,OAAO,CAAC,IAAI;AAAA,UACZ,OAAO;AAAA,UACP,MAAM;AAAA,QACR;AAEA,YAAI,IAAI,YAAY,CAAC,IAAI,SAAS,SAAS,GAAG;AAE5C,cAAI,CAAC,QAAS;AACd,gBAAM,IAAI,MAAM;AAAA,YACd,OAAO;AAAA,YACP,MAAM;AAAA,YACN,KAAK;AAAA,UACP,CAAC;AACD,0BAAgB;AAChB;AAAA,QACF;AAEA,cAAM,IAAI,MAAM,SAAS;AACzB,wBAAgB;AAChB;AAAA,MACF;AAGA,UAAI,CAAC,QAAS;AACd,YAAM,IAAI,MAAM;AAAA,QACd,OAAO;AAAA,QACP,MAAM;AAAA,QACN,KAAK;AAAA,MACP,CAAC;AACD,sBAAgB;AAAA,IAClB,QAAQ;AAAA,IAER;AAAA,EACF,GAAG,CAAC,SAAS,WAAW,WAAW,eAAe,aAAa,CAAC;AAEhE,QAAM,mBAAe,0BAAY,YAAY;AAC3C,UAAM,OAAO,eAAe,IAAI,KAAK;AACrC,QAAI,CAAC,IAAK;AACV,QAAI;AACF,qBAAe,IAAI;AACnB,mBAAa;AACb,YAAM,MAAM,MAAM,MAAM,GAAG;AAC3B,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,yBAAyB,IAAI,MAAM,GAAG;AACnE,YAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,YAAM,OAAO,IAAI,gBAAgB,IAAI;AACrC,YAAM,IAAI,SAAS,cAAc,GAAG;AACpC,QAAE,OAAO;AACT,QAAE,WAAW,oBAAoB;AACjC,eAAS,KAAK,YAAY,CAAC;AAC3B,QAAE,MAAM;AACR,QAAE,OAAO;AACT,UAAI,gBAAgB,IAAI;AAAA,IAC1B,QAAQ;AAAA,IAER,UAAE;AACA,qBAAe,KAAK;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,aAAa,kBAAkB,UAAU,CAAC;AAE9C,QAAM,oBAAgB,0BAAY,MAAM;AACtC,oBAAgB,SAAS,SAAS;AAAA,EACpC,GAAG,CAAC,SAAS,SAAS,CAAC;AAEvB,QAAM,oBAAgB,0BAAY,MAAM;AACtC,oBAAgB,SAAS,SAAS;AAAA,EACpC,GAAG,CAAC,SAAS,SAAS,CAAC;AAEvB,QAAM,aAAS,0BAAY,MAAM;AAC/B,aAAS,SAAS,SAAS;AAAA,EAC7B,GAAG,CAAC,SAAS,SAAS,CAAC;AAEvB,QAAM,oBAAgB,0BAAY,MAAM;AACtC,oBAAgB,OAAO;AAAA,EACzB,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,qBAAiB,0BAAY,MAAM;AACvC,kBAAc;AAAA,EAChB,GAAG,CAAC,CAAC;AAEL,QAAM,kBAAc,0BAAY,MAAM;AACpC,eAAW;AAAA,EACb,GAAG,CAAC,CAAC;AAEL,QAAM,mBAAe,0BAAY,MAAM;AACrC,gBAAY;AAAA,EACd,GAAG,CAAC,CAAC;AAEL,QAAM,oBAAgB,0BAAY,MAAM;AACtC,oBAAgB,OAAO;AAAA,EACzB,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,eAAW,0BAAY,MAAM;AACjC,gBAAY,SAAS,SAAS;AAAA,EAChC,GAAG,CAAC,SAAS,SAAS,CAAC;AAEvB,QAAM,iBAAa,0BAAY,MAAM;AACnC,kBAAc,SAAS,WAAW,YAAY;AAAA,EAChD,GAAG,CAAC,SAAS,WAAW,YAAY,CAAC;AAErC,QAAM,oBAAgB,0BAAY,MAAM;AACtC,oBAAgB,OAAO;AAAA,EACzB,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,kBAAc,0BAAY,MAAM;AACpC,kBAAc,SAAS,SAAS;AAAA,EAClC,GAAG,CAAC,SAAS,SAAS,CAAC;AAEvB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAMO,SAAS,UAAU,KAIxB;AACA,QAAM,CAAC,QAAQ,SAAS,QAAI,uBAAwB,IAAI;AACxD,QAAM,CAAC,SAAS,UAAU,QAAI,uBAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAAwB,IAAI;AAEtD,8BAAU,MAAM;AACd,QAAI,CAAC,KAAK;AACR,gBAAU,IAAI;AACd,iBAAW,KAAK;AAChB,eAAS,IAAI;AACb;AAAA,IACF;AAEA,QAAI,YAAY;AAChB,eAAW,IAAI;AACf,aAAS,IAAI;AAEb,gBAAY,GAAG,EACZ,KAAK,CAAC,SAAS;AACd,UAAI,CAAC,WAAW;AACd,kBAAU,IAAI;AACd,mBAAW,KAAK;AAAA,MAClB;AAAA,IACF,CAAC,EACA,MAAM,CAAC,QAAQ;AACd,UAAI,CAAC,WAAW;AACd,iBAAS,eAAe,QAAQ,IAAI,UAAU,yBAAyB;AACvE,mBAAW,KAAK;AAAA,MAClB;AAAA,IACF,CAAC;AAEH,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,GAAG,CAAC;AAER,SAAO,EAAE,QAAQ,SAAS,MAAM;AAClC;AAIO,IAAM,eAAe;;;AIrU5B,gBAMO;AACP,gBAQO;AACP,iBAAkD;AAoFV;AA1DjC,IAAM,eAAuC;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,kBAAsD;AAAA,EACjE,QAAQ,EAAE,IAAI,WAAW,MAAM,UAAU;AAAA,EACzC,MAAM,EAAE,IAAI,WAAW,MAAM,UAAU;AAAA,EACvC,UAAU,EAAE,IAAI,WAAW,MAAM,UAAU;AAAA,EAC3C,UAAU,EAAE,IAAI,WAAW,MAAM,UAAU;AAAA,EAC3C,UAAU,EAAE,IAAI,WAAW,MAAM,UAAU;AAAA,EAC3C,WAAW,EAAE,IAAI,WAAW,MAAM,UAAU;AAAA,EAC5C,UAAU,EAAE,IAAI,WAAW,MAAM,UAAU;AAAA,EAC3C,UAAU,EAAE,IAAI,WAAW,MAAM,UAAU;AAAA,EAC3C,KAAK,EAAE,IAAI,WAAW,MAAM,UAAU;AAAA,EACtC,OAAO,EAAE,IAAI,WAAW,MAAM,UAAU;AAAA,EACxC,UAAU,EAAE,IAAI,WAAW,MAAM,UAAU;AAAA,EAC3C,QAAQ,EAAE,IAAI,WAAW,MAAM,UAAU;AAAA,EACzC,GAAG,EAAE,IAAI,WAAW,MAAM,UAAU;AAAA,EACpC,QAAQ,EAAE,IAAI,WAAW,MAAM,UAAU;AAAA,EACzC,SAAS,EAAE,IAAI,WAAW,MAAM,UAAU;AAC5C;AAGO,IAAM,kBAA+C;AAAA,EAC1D,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,WAAW;AAAA,EACX,UAAU;AAAA,EACV,UAAU;AAAA,EACV,KAAK;AAAA,EACL,OAAO;AAAA,EACP,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,GAAG;AAAA,EACH,QAAQ;AAAA,EACR,SAAS;AACX;AAGO,IAAM,iBAAmG;AAAA,EAC9G,QAAQ,CAAC,EAAE,OAAO,IAAI,UAAU,MAAM,4CAAC,oBAAO,MAAY,WAAsB;AAAA,EAChF,MAAM,CAAC,EAAE,OAAO,IAAI,UAAU,MAAM,4CAAC,oBAAO,MAAY,WAAsB;AAAA,EAC9E,UAAU,CAAC,EAAE,OAAO,IAAI,UAAU,MAAM,4CAAC,wBAAW,MAAY,WAAsB;AAAA,EACtF,UAAU,CAAC,EAAE,OAAO,IAAI,UAAU,MAAM,4CAAC,wBAAW,MAAY,WAAsB;AAAA,EACtF,UAAU,CAAC,EAAE,OAAO,IAAI,UAAU,MAAM,4CAAC,6BAAgB,MAAY,WAAsB;AAAA,EAC3F,WAAW,CAAC,EAAE,OAAO,IAAI,UAAU,MAAM,4CAAC,yBAAY,MAAY,WAAsB;AAAA,EACxF,UAAU,CAAC,EAAE,OAAO,IAAI,UAAU,MAAM,4CAAC,yBAAY,MAAY,WAAsB;AAAA,EACvF,UAAU,CAAC,EAAE,OAAO,IAAI,UAAU,MAAM,4CAAC,yBAAW,MAAY,WAAsB;AAAA,EACtF,KAAK,CAAC,EAAE,OAAO,IAAI,UAAU,MAAM,4CAAC,6BAAgB,MAAY,WAAsB;AAAA,EACtF,OAAO,CAAC,EAAE,OAAO,IAAI,UAAU,MAAM,4CAAC,oBAAO,MAAY,WAAsB;AAAA,EAC/E,UAAU,CAAC,EAAE,OAAO,IAAI,UAAU,MAAM,4CAAC,wBAAW,MAAY,WAAsB;AAAA,EACtF,QAAQ,CAAC,EAAE,OAAO,IAAI,UAAU,MAAM,4CAAC,sBAAS,MAAY,WAAsB;AAAA,EAClF,GAAG,CAAC,EAAE,OAAO,IAAI,UAAU,MAAM,4CAAC,yBAAW,MAAY,WAAsB;AAAA,EAC/E,QAAQ,CAAC,EAAE,OAAO,IAAI,UAAU,MAAM,4CAAC,sBAAS,MAAY,WAAsB;AAAA,EAClF,SAAS,CAAC,EAAE,OAAO,IAAI,UAAU,MAAM,4CAAC,wBAAU,MAAY,WAAsB;AACtF;AAGO,IAAM,oBAAiD;AAAA,EAC5D,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AAAA,EACV,WAAW;AAAA,EACX,UAAU;AAAA,EACV,UAAU;AAAA,EACV,KAAK;AAAA,EACL,OAAO;AAAA,EACP,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,GAAG;AAAA,EACH,QAAQ;AAAA,EACR,SAAS;AACX;AAGO,IAAM,YAAiD,OAAO;AAAA,EACnE,aAAa,IAAI,CAAC,OAAO;AAAA,IACvB;AAAA,IACA;AAAA,MACE;AAAA,MACA,OAAO,gBAAgB,EAAE;AAAA,MACzB,QAAQ,gBAAgB,EAAE;AAAA,MAC1B,MAAM,eAAe,EAAE;AAAA,MACvB,QAAQ,kBAAkB,EAAE;AAAA,IAC9B;AAAA,EACF,CAAC;AACH;AAGO,SAAS,YAAY,IAAiC;AAC3D,SAAO,UAAU,EAAE;AACrB;AAGO,SAAS,kBAAoC;AAClD,SAAO,aAAa,IAAI,CAAC,OAAO,UAAU,EAAE,CAAC;AAC/C;AAGO,SAAS,iBAAiB,IAAgC;AAC/D,SAAO,gBAAgB,EAAE;AAC3B;AAGO,SAAS,gBAAgB,IAA8E;AAC5G,SAAO,eAAe,EAAE;AAC1B;AAGO,SAAS,iBAAiB,IAAyB;AACxD,SAAO,gBAAgB,EAAE;AAC3B;AAGO,SAAS,yBAAiD;AAC/D,QAAM,WAAmC,CAAC;AAC1C,eAAa,QAAQ,CAAC,OAAO;AAC3B,aAAS,kBAAkB,EAAE,CAAC,IAAI,gBAAgB,EAAE,EAAE;AAAA,EACxD,CAAC;AACD,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../src/headless.ts","../src/hooks.ts","../src/utils.ts","../src/og-fetcher.ts","../src/share-functions.ts","../src/platforms.tsx"],"sourcesContent":["// Headless exports - just the hook and utilities, no styled components\n\nexport { useShareSheet, useShareMenu, useOGData, type UseShareSheetOptions, type UseShareMenuOptions } from \"./hooks\";\n\n// OG Data fetcher\nexport { fetchOGData, clearOGCache, type OGData, type OGFetcher } from \"./og-fetcher\";\n\nexport {\n shareToWhatsApp,\n shareToTelegram,\n shareToX,\n shareToFacebook,\n openInstagram,\n openTikTok,\n openThreads,\n shareToSnapchat,\n shareViaSMS,\n shareViaEmail,\n shareToLinkedIn,\n shareToReddit,\n} from \"./share-functions\";\n\nexport { cn, openUrl, getSafeUrl } from \"./utils\";\n\n// Platform configs (colors, icons, labels) - SINGLE SOURCE OF TRUTH\nexport {\n PLATFORMS,\n PLATFORM_IDS,\n PLATFORM_COLORS,\n PLATFORM_ICONS,\n PLATFORM_LABELS,\n PLATFORM_CSS_VARS,\n getPlatform,\n getAllPlatforms,\n getPlatformColor,\n getPlatformIcon,\n getPlatformLabel,\n generateCssVarDefaults,\n type PlatformConfig,\n type PlatformColor,\n} from \"./platforms\";\n\nexport type {\n UseShareSheetReturn,\n UseShareMenuReturn,\n ShareOption,\n ShareButtonConfig,\n} from \"./types\";\n","\"use client\";\n\nimport { useMemo, useState, useCallback, useEffect, useRef } from \"react\";\nimport { getSafeUrl, isMobileDevice, getAllPlatformAvailability } from \"./utils\";\nimport { fetchOGData, type OGData, type OGFetcher } from \"./og-fetcher\";\nimport {\n shareToWhatsApp,\n shareToTelegram,\n shareToX,\n shareToFacebook,\n openInstagram,\n openTikTok,\n openThreads,\n shareToSnapchat,\n shareViaSMS,\n shareViaEmail,\n shareToLinkedIn,\n shareToReddit,\n} from \"./share-functions\";\nimport type { UseShareSheetReturn, PlatformAvailability, ShareOption } from \"./types\";\n\n// Default platform availability (assumes desktop/all platforms available)\n// This is used for SSR to avoid hydration mismatch\nconst DEFAULT_PLATFORM_AVAILABILITY: Record<ShareOption, PlatformAvailability> = {\n native: { available: true },\n copy: { available: true },\n download: { available: true },\n whatsapp: { available: true },\n telegram: { available: true },\n instagram: { available: true },\n facebook: { available: true },\n snapchat: { available: true },\n sms: { available: true },\n email: { available: true },\n linkedin: { available: true },\n reddit: { available: true },\n x: { available: true },\n tiktok: { available: true },\n threads: { available: true },\n};\n\nexport interface UseShareSheetOptions {\n /** URL to share */\n shareUrl: string;\n /** Text to share */\n shareText: string;\n /** Download URL (optional) */\n downloadUrl?: string | null;\n /** Download filename (optional) */\n downloadFilename?: string;\n /** Email subject (optional) */\n emailSubject?: string;\n /** File to share via native share (data URL or Blob) - takes priority over URL sharing */\n shareFile?: string | Blob | null;\n /** Filename for the shared file */\n shareFilename?: string;\n /** Callback after native share */\n onNativeShare?: () => void;\n /** Callback after copy */\n onCopy?: () => void;\n /** Callback after download starts */\n onDownload?: () => void;\n}\n\n/**\n * Headless hook for share sheet functionality.\n * Use this to build your own custom share UI.\n */\nexport function useShareSheet({\n shareUrl,\n shareText,\n downloadUrl,\n downloadFilename,\n emailSubject = \"Share\",\n shareFile,\n shareFilename = \"share.png\",\n onNativeShare,\n onCopy,\n onDownload,\n}: UseShareSheetOptions): UseShareSheetReturn {\n const [copied, setCopied] = useState(false);\n const [downloading, setDownloading] = useState(false);\n\n // Use state for values that depend on browser APIs to avoid hydration mismatch\n // Initial values match what server renders (conservative defaults)\n const [canNativeShare, setCanNativeShare] = useState(false);\n const [isMobile, setIsMobile] = useState(false);\n const [platformAvailability, setPlatformAvailability] = useState<Record<ShareOption, PlatformAvailability>>(\n DEFAULT_PLATFORM_AVAILABILITY\n );\n\n // Detect browser capabilities after mount (client-side only)\n useEffect(() => {\n setCanNativeShare(typeof navigator !== \"undefined\" && \"share\" in navigator);\n setIsMobile(isMobileDevice());\n setPlatformAvailability(getAllPlatformAvailability());\n }, []);\n\n const safeUrl = getSafeUrl(shareUrl);\n\n const copyLink = useCallback(async () => {\n if (!safeUrl) return;\n try {\n await navigator.clipboard.writeText(safeUrl);\n setCopied(true);\n onCopy?.();\n setTimeout(() => setCopied(false), 1200);\n } catch {\n // ignore\n }\n }, [safeUrl, onCopy]);\n\n const nativeShare = useCallback(async () => {\n const nav = navigator as Navigator & {\n share?: (data: ShareData) => Promise<void>;\n canShare?: (data: ShareData) => boolean;\n };\n if (!(\"share\" in nav) || typeof nav.share !== \"function\") return;\n\n try {\n // If shareFile is provided, try to share as a file\n if (shareFile) {\n let blob: Blob;\n\n // Convert data URL to Blob if needed\n if (typeof shareFile === \"string\" && shareFile.startsWith(\"data:\")) {\n const response = await fetch(shareFile);\n blob = await response.blob();\n } else if (shareFile instanceof Blob) {\n blob = shareFile;\n } else {\n // Invalid shareFile, fall back to URL sharing\n if (!safeUrl) return;\n await nav.share({\n title: shareText,\n text: shareText,\n url: safeUrl,\n });\n onNativeShare?.();\n return;\n }\n\n // Create a File from the Blob\n const file = new File([blob], shareFilename, { type: blob.type || \"image/png\" });\n\n // Check if file sharing is supported\n const shareData: ShareData = {\n files: [file],\n title: shareText,\n text: shareText,\n };\n\n if (nav.canShare && !nav.canShare(shareData)) {\n // File sharing not supported, fall back to URL sharing\n if (!safeUrl) return;\n await nav.share({\n title: shareText,\n text: shareText,\n url: safeUrl,\n });\n onNativeShare?.();\n return;\n }\n\n await nav.share(shareData);\n onNativeShare?.();\n return;\n }\n\n // Fall back to URL sharing\n if (!safeUrl) return;\n await nav.share({\n title: shareText,\n text: shareText,\n url: safeUrl,\n });\n onNativeShare?.();\n } catch {\n // user canceled or share failed -> ignore\n }\n }, [safeUrl, shareText, shareFile, shareFilename, onNativeShare]);\n\n const downloadFile = useCallback(async () => {\n const url = (downloadUrl ?? \"\").trim();\n if (!url) return;\n try {\n setDownloading(true);\n onDownload?.();\n const res = await fetch(url);\n if (!res.ok) throw new Error(`Failed to fetch file (${res.status})`);\n const blob = await res.blob();\n const href = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = href;\n a.download = downloadFilename || \"download\";\n document.body.appendChild(a);\n a.click();\n a.remove();\n URL.revokeObjectURL(href);\n } catch {\n // ignore\n } finally {\n setDownloading(false);\n }\n }, [downloadUrl, downloadFilename, onDownload]);\n\n const shareWhatsApp = useCallback(() => {\n shareToWhatsApp(safeUrl, shareText);\n }, [safeUrl, shareText]);\n\n const shareTelegram = useCallback(() => {\n shareToTelegram(safeUrl, shareText);\n }, [safeUrl, shareText]);\n\n const shareX = useCallback(() => {\n shareToX(safeUrl, shareText);\n }, [safeUrl, shareText]);\n\n const shareFacebook = useCallback(() => {\n shareToFacebook(safeUrl);\n }, [safeUrl]);\n\n const shareInstagram = useCallback(() => {\n openInstagram();\n }, []);\n\n const shareTikTok = useCallback(() => {\n openTikTok();\n }, []);\n\n const shareThreads = useCallback(() => {\n openThreads();\n }, []);\n\n const shareSnapchat = useCallback(() => {\n shareToSnapchat(safeUrl);\n }, [safeUrl]);\n\n const shareSMS = useCallback(() => {\n shareViaSMS(safeUrl, shareText);\n }, [safeUrl, shareText]);\n\n const shareEmail = useCallback(() => {\n shareViaEmail(safeUrl, shareText, emailSubject);\n }, [safeUrl, shareText, emailSubject]);\n\n const shareLinkedIn = useCallback(() => {\n shareToLinkedIn(safeUrl);\n }, [safeUrl]);\n\n const shareReddit = useCallback(() => {\n shareToReddit(safeUrl, shareText);\n }, [safeUrl, shareText]);\n\n return {\n canNativeShare,\n copied,\n downloading,\n safeUrl,\n isMobile,\n platformAvailability,\n copyLink,\n nativeShare,\n downloadFile,\n shareWhatsApp,\n shareTelegram,\n shareX,\n shareFacebook,\n shareInstagram,\n shareTikTok,\n shareThreads,\n shareSnapchat,\n shareSMS,\n shareEmail,\n shareLinkedIn,\n shareReddit,\n };\n}\n\n/**\n * Hook to fetch OG (Open Graph) data from a URL.\n * Fetches with `fetcher`, the Microlink lookup (`fetchOGData`, cached) unless another is given:\n * calling this hook is the opt-in, since the lookup sends `url` to a third party.\n */\nexport function useOGData(url: string | undefined, fetcher: OGFetcher = fetchOGData): {\n ogData: OGData | null;\n loading: boolean;\n error: string | null;\n} {\n const [ogData, setOgData] = useState<OGData | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n // Read at fetch time, so an inline fetcher does not refetch on every render\n // (this effect runs before the one below in the same commit)\n const fetcherRef = useRef(fetcher);\n useEffect(() => {\n fetcherRef.current = fetcher;\n });\n\n useEffect(() => {\n if (!url) {\n setOgData(null);\n setLoading(false);\n setError(null);\n return;\n }\n\n let cancelled = false;\n setLoading(true);\n setError(null);\n\n fetcherRef.current(url)\n .then((data) => {\n if (!cancelled) {\n setOgData(data);\n setLoading(false);\n }\n })\n .catch((err) => {\n if (!cancelled) {\n setError(err instanceof Error ? err.message : \"Failed to fetch OG data\");\n setLoading(false);\n }\n });\n\n return () => {\n cancelled = true;\n };\n }, [url]);\n\n return { ogData, loading, error };\n}\n\n// Legacy export for backwards compatibility\n/** @deprecated Use useShareSheet instead */\nexport const useShareMenu = useShareSheet;\n/** @deprecated Use UseShareSheetOptions instead */\nexport type UseShareMenuOptions = UseShareSheetOptions;\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\nimport type { ShareOption, PlatformAvailability } from \"./types\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\nexport function openUrl(url: string) {\n window.open(url, \"_blank\", \"noopener,noreferrer\");\n}\n\nexport function getSafeUrl(shareUrl: string): string {\n return shareUrl || (typeof window !== \"undefined\" ? window.location.href : \"\");\n}\n\n/**\n * Detect if the current device is a mobile device.\n * Uses user agent detection as the primary method.\n */\nexport function isMobileDevice(): boolean {\n if (typeof navigator === \"undefined\") return false;\n \n const userAgent = navigator.userAgent || navigator.vendor || \"\";\n \n // Check for mobile user agents\n const mobileRegex = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Mobile|mobile|CriOS/i;\n \n // Also check for touch capability as a secondary signal\n const hasTouch = typeof window !== \"undefined\" && (\n \"ontouchstart\" in window ||\n navigator.maxTouchPoints > 0\n );\n \n // User agent is more reliable than touch detection alone\n // (many desktop browsers support touch)\n return mobileRegex.test(userAgent);\n}\n\n/**\n * Detect if the current device is iOS\n */\nexport function isIOSDevice(): boolean {\n if (typeof navigator === \"undefined\") return false;\n \n const userAgent = navigator.userAgent || \"\";\n return /iPhone|iPad|iPod/i.test(userAgent);\n}\n\n/**\n * Detect if the current device is Android\n */\nexport function isAndroidDevice(): boolean {\n if (typeof navigator === \"undefined\") return false;\n \n const userAgent = navigator.userAgent || \"\";\n return /Android/i.test(userAgent);\n}\n\n/** Platforms that require mobile devices (deep links / URL schemes) */\nexport const MOBILE_ONLY_PLATFORMS: readonly ShareOption[] = [\n \"instagram\",\n \"tiktok\", \n \"threads\",\n \"sms\",\n] as const;\n\n/** Platforms that work better on mobile but may partially work on desktop */\nexport const MOBILE_PREFERRED_PLATFORMS: readonly ShareOption[] = [\n \"snapchat\",\n \"whatsapp\",\n] as const;\n\n/**\n * Check if a share platform is available on the current device.\n * Returns availability status and reason if unavailable.\n */\nexport function checkPlatformAvailability(platform: ShareOption): PlatformAvailability {\n const isMobile = isMobileDevice();\n \n // Deep link platforms - require mobile device\n if (MOBILE_ONLY_PLATFORMS.includes(platform)) {\n if (!isMobile) {\n return {\n available: false,\n reason: `${platform} requires a mobile device with the app installed`,\n };\n }\n }\n \n // SMS - requires mobile or device with SMS capability\n if (platform === \"sms\" && !isMobile) {\n return {\n available: false,\n reason: \"SMS sharing requires a mobile device\",\n };\n }\n \n // Native share - check browser support\n if (platform === \"native\") {\n const canShare = typeof navigator !== \"undefined\" && \"share\" in navigator;\n if (!canShare) {\n return {\n available: false,\n reason: \"Native share is not supported by this browser\",\n };\n }\n }\n \n return { available: true };\n}\n\n/**\n * Get availability status for all platforms.\n */\nexport function getAllPlatformAvailability(): Record<ShareOption, PlatformAvailability> {\n const platforms: ShareOption[] = [\n \"native\", \"copy\", \"download\", \"whatsapp\", \"telegram\",\n \"instagram\", \"facebook\", \"snapchat\", \"sms\", \"email\",\n \"linkedin\", \"reddit\", \"x\", \"tiktok\", \"threads\",\n ];\n \n const result: Partial<Record<ShareOption, PlatformAvailability>> = {};\n for (const platform of platforms) {\n result[platform] = checkPlatformAvailability(platform);\n }\n \n return result as Record<ShareOption, PlatformAvailability>;\n}\n\n/**\n * Log a warning to console when a platform is not available.\n */\nexport function warnUnavailablePlatform(platform: ShareOption, reason: string): void {\n console.warn(\n `[react-sharesheet] ${platform} sharing is not available: ${reason}. ` +\n `This share option may not work correctly on this device.`\n );\n}\n\n","// OG data fetcher using the Microlink API (free, no API key required).\n// The sheet never calls it on its own: a caller opts in with `fetchPreview={fetchOGData}`,\n// because the lookup sends the shared link to a third party.\n\nexport interface OGData {\n title?: string;\n description?: string;\n image?: string;\n url?: string;\n siteName?: string;\n}\n\n/** Looks up a link's card. Resolves to null when there is none. */\nexport type OGFetcher = (url: string) => Promise<OGData | null>;\n\nexport interface OGFetchResult {\n data: OGData | null;\n loading: boolean;\n error: string | null;\n}\n\n// Cache to avoid re-fetching the same URL\nconst ogCache = new Map<string, OGData>();\n\nexport async function fetchOGData(url: string): Promise<OGData | null> {\n // Check cache first\n if (ogCache.has(url)) {\n return ogCache.get(url)!;\n }\n\n try {\n // Use Microlink API to fetch OG data (free tier, no API key needed)\n const apiUrl = `https://api.microlink.io?url=${encodeURIComponent(url)}`;\n const response = await fetch(apiUrl);\n \n if (!response.ok) {\n throw new Error(`Failed to fetch OG data: ${response.status}`);\n }\n\n const json = await response.json();\n \n if (json.status !== \"success\" || !json.data) {\n return null;\n }\n\n const { title, description, image, url: canonicalUrl, publisher } = json.data;\n\n const ogData: OGData = {\n title: title || undefined,\n description: description || undefined,\n image: image?.url || undefined,\n url: canonicalUrl || url,\n siteName: publisher || undefined,\n };\n\n // Cache the result\n ogCache.set(url, ogData);\n\n return ogData;\n } catch (error) {\n console.warn(\"[react-sharesheet] Failed to fetch OG data:\", error);\n return null;\n }\n}\n\n// Clear cache (useful for testing or forcing refresh)\nexport function clearOGCache(): void {\n ogCache.clear();\n}\n","import { \n openUrl, \n checkPlatformAvailability, \n warnUnavailablePlatform,\n} from \"./utils\";\n\nexport function shareToWhatsApp(url: string, text: string) {\n const encoded = encodeURIComponent(`${text}\\n${url}`);\n openUrl(`https://api.whatsapp.com/send?text=${encoded}`);\n}\n\nexport function shareToTelegram(url: string, text: string) {\n const encodedText = encodeURIComponent(text);\n const encodedUrl = encodeURIComponent(url);\n openUrl(`https://t.me/share/url?url=${encodedUrl}&text=${encodedText}`);\n}\n\nexport function shareToX(url: string, text: string) {\n const encodedText = encodeURIComponent(text);\n const encodedUrl = encodeURIComponent(url);\n openUrl(`https://x.com/intent/tweet?text=${encodedText}&url=${encodedUrl}`);\n}\n\nexport function shareToFacebook(url: string) {\n const encodedUrl = encodeURIComponent(url);\n openUrl(`https://www.facebook.com/sharer/sharer.php?u=${encodedUrl}`);\n}\n\nexport function openInstagram() {\n const availability = checkPlatformAvailability(\"instagram\");\n if (!availability.available) {\n warnUnavailablePlatform(\"instagram\", availability.reason!);\n // Still attempt to open - it may work on some desktop browsers with app installed\n }\n window.location.href = \"instagram://\";\n}\n\nexport function openTikTok() {\n const availability = checkPlatformAvailability(\"tiktok\");\n if (!availability.available) {\n warnUnavailablePlatform(\"tiktok\", availability.reason!);\n // Still attempt to open - it may work on some desktop browsers with app installed\n }\n window.location.href = \"tiktok://\";\n}\n\nexport function openThreads() {\n const availability = checkPlatformAvailability(\"threads\");\n if (!availability.available) {\n warnUnavailablePlatform(\"threads\", availability.reason!);\n // Still attempt to open - it may work on some desktop browsers with app installed\n }\n window.location.href = \"threads://\";\n}\n\nexport function shareToSnapchat(url: string) {\n const encodedUrl = encodeURIComponent(url);\n openUrl(`https://www.snapchat.com/scan?attachmentUrl=${encodedUrl}`);\n}\n\nexport function shareViaSMS(url: string, text: string) {\n const availability = checkPlatformAvailability(\"sms\");\n if (!availability.available) {\n warnUnavailablePlatform(\"sms\", availability.reason!);\n // Still attempt to open - it may work on some devices\n }\n const body = encodeURIComponent(`${text}\\n${url}`);\n window.location.href = `sms:?body=${body}`;\n}\n\nexport function shareViaEmail(url: string, text: string, subject = \"Share\") {\n const encodedSubject = encodeURIComponent(subject);\n const body = encodeURIComponent(`${text}\\n\\n${url}`);\n window.location.href = `mailto:?subject=${encodedSubject}&body=${body}`;\n}\n\nexport function shareToLinkedIn(url: string) {\n const encodedUrl = encodeURIComponent(url);\n openUrl(`https://www.linkedin.com/sharing/share-offsite/?url=${encodedUrl}`);\n}\n\nexport function shareToReddit(url: string, text: string) {\n const encodedText = encodeURIComponent(text);\n const encodedUrl = encodeURIComponent(url);\n openUrl(`https://www.reddit.com/submit?url=${encodedUrl}&title=${encodedText}`);\n}\n\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport {\n LuDownload,\n LuLink,\n LuMail,\n LuMessageCircle,\n LuSend,\n} from \"react-icons/lu\";\nimport {\n FaFacebookF,\n FaInstagram,\n FaLinkedin,\n FaReddit,\n FaTelegramPlane,\n FaTiktok,\n FaWhatsapp,\n} from \"react-icons/fa\";\nimport { FaXTwitter, FaThreads, FaSnapchat } from \"react-icons/fa6\";\nimport type { ShareOption } from \"./types\";\n\n/** Platform color configuration */\nexport interface PlatformColor {\n /** Background color (hex) */\n bg: string;\n /** Text/icon color (hex) */\n text: string;\n}\n\n/** Platform configuration */\nexport interface PlatformConfig {\n /** Platform identifier */\n id: ShareOption;\n /** Display label */\n label: string;\n /** Colors */\n colors: PlatformColor;\n /** Icon component (accepts size prop) */\n Icon: (props: { size?: number; className?: string }) => ReactNode;\n /** CSS variable name for background */\n cssVar: string;\n}\n\n/** All platform IDs in default order */\nexport const PLATFORM_IDS: readonly ShareOption[] = [\n \"native\",\n \"copy\",\n \"download\",\n \"whatsapp\",\n \"telegram\",\n \"instagram\",\n \"facebook\",\n \"snapchat\",\n \"sms\",\n \"email\",\n \"linkedin\",\n \"reddit\",\n \"x\",\n \"tiktok\",\n \"threads\",\n] as const;\n\n/** Platform colors - hex values for each platform (SOURCE OF TRUTH) */\nexport const PLATFORM_COLORS: Record<ShareOption, PlatformColor> = {\n native: { bg: \"#7c3aed\", text: \"#ffffff\" },\n copy: { bg: \"#3b82f6\", text: \"#ffffff\" },\n download: { bg: \"#ef4444\", text: \"#ffffff\" },\n whatsapp: { bg: \"#25D366\", text: \"#ffffff\" },\n telegram: { bg: \"#229ED9\", text: \"#ffffff\" },\n instagram: { bg: \"#E1306C\", text: \"#ffffff\" },\n facebook: { bg: \"#1877F2\", text: \"#ffffff\" },\n snapchat: { bg: \"#FFFC00\", text: \"#000000\" },\n sms: { bg: \"#22c55e\", text: \"#ffffff\" },\n email: { bg: \"#f97316\", text: \"#ffffff\" },\n linkedin: { bg: \"#0A66C2\", text: \"#ffffff\" },\n reddit: { bg: \"#FF4500\", text: \"#ffffff\" },\n x: { bg: \"#000000\", text: \"#ffffff\" },\n tiktok: { bg: \"#000000\", text: \"#ffffff\" },\n threads: { bg: \"#000000\", text: \"#ffffff\" },\n} as const;\n\n/** Platform labels (SOURCE OF TRUTH) */\nexport const PLATFORM_LABELS: Record<ShareOption, string> = {\n native: \"Share…\",\n copy: \"Copy\",\n download: \"Download\",\n whatsapp: \"WhatsApp\",\n telegram: \"Telegram\",\n instagram: \"Instagram\",\n facebook: \"Facebook\",\n snapchat: \"Snapchat\",\n sms: \"SMS\",\n email: \"Email\",\n linkedin: \"LinkedIn\",\n reddit: \"Reddit\",\n x: \"X\",\n tiktok: \"TikTok\",\n threads: \"Threads\",\n} as const;\n\n/** Platform icons - React components (SOURCE OF TRUTH) */\nexport const PLATFORM_ICONS: Record<ShareOption, (props: { size?: number; className?: string }) => ReactNode> = {\n native: ({ size = 22, className }) => <LuSend size={size} className={className} />,\n copy: ({ size = 22, className }) => <LuLink size={size} className={className} />,\n download: ({ size = 22, className }) => <LuDownload size={size} className={className} />,\n whatsapp: ({ size = 22, className }) => <FaWhatsapp size={size} className={className} />,\n telegram: ({ size = 22, className }) => <FaTelegramPlane size={size} className={className} />,\n instagram: ({ size = 22, className }) => <FaInstagram size={size} className={className} />,\n facebook: ({ size = 22, className }) => <FaFacebookF size={size} className={className} />,\n snapchat: ({ size = 22, className }) => <FaSnapchat size={size} className={className} />,\n sms: ({ size = 22, className }) => <LuMessageCircle size={size} className={className} />,\n email: ({ size = 22, className }) => <LuMail size={size} className={className} />,\n linkedin: ({ size = 22, className }) => <FaLinkedin size={size} className={className} />,\n reddit: ({ size = 22, className }) => <FaReddit size={size} className={className} />,\n x: ({ size = 22, className }) => <FaXTwitter size={size} className={className} />,\n tiktok: ({ size = 22, className }) => <FaTiktok size={size} className={className} />,\n threads: ({ size = 22, className }) => <FaThreads size={size} className={className} />,\n} as const;\n\n/** CSS variable names for platform backgrounds */\nexport const PLATFORM_CSS_VARS: Record<ShareOption, string> = {\n native: \"--sharesheet-native-bg\",\n copy: \"--sharesheet-copy-bg\",\n download: \"--sharesheet-download-bg\",\n whatsapp: \"--sharesheet-whatsapp-bg\",\n telegram: \"--sharesheet-telegram-bg\",\n instagram: \"--sharesheet-instagram-bg\",\n facebook: \"--sharesheet-facebook-bg\",\n snapchat: \"--sharesheet-snapchat-bg\",\n sms: \"--sharesheet-sms-bg\",\n email: \"--sharesheet-email-bg\",\n linkedin: \"--sharesheet-linkedin-bg\",\n reddit: \"--sharesheet-reddit-bg\",\n x: \"--sharesheet-x-bg\",\n tiktok: \"--sharesheet-tiktok-bg\",\n threads: \"--sharesheet-threads-bg\",\n} as const;\n\n/** Full platform configurations */\nexport const PLATFORMS: Record<ShareOption, PlatformConfig> = Object.fromEntries(\n PLATFORM_IDS.map((id) => [\n id,\n {\n id,\n label: PLATFORM_LABELS[id],\n colors: PLATFORM_COLORS[id],\n Icon: PLATFORM_ICONS[id],\n cssVar: PLATFORM_CSS_VARS[id],\n },\n ])\n) as Record<ShareOption, PlatformConfig>;\n\n/** Get platform config by id */\nexport function getPlatform(id: ShareOption): PlatformConfig {\n return PLATFORMS[id];\n}\n\n/** Get all platform configs as array */\nexport function getAllPlatforms(): PlatformConfig[] {\n return PLATFORM_IDS.map((id) => PLATFORMS[id]);\n}\n\n/** Get platform color */\nexport function getPlatformColor(id: ShareOption): PlatformColor {\n return PLATFORM_COLORS[id];\n}\n\n/** Get platform icon component */\nexport function getPlatformIcon(id: ShareOption): (props: { size?: number; className?: string }) => ReactNode {\n return PLATFORM_ICONS[id];\n}\n\n/** Get platform label */\nexport function getPlatformLabel(id: ShareOption): string {\n return PLATFORM_LABELS[id];\n}\n\n/** Generate CSS variable defaults from platform colors */\nexport function generateCssVarDefaults(): Record<string, string> {\n const defaults: Record<string, string> = {};\n PLATFORM_IDS.forEach((id) => {\n defaults[PLATFORM_CSS_VARS[id]] = PLATFORM_COLORS[id].bg;\n });\n return defaults;\n}\n"],"mappings":"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","names":[]}
package/dist/headless.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  // src/hooks.ts
2
- import { useState, useCallback, useEffect } from "react";
2
+ import { useState, useCallback, useEffect, useRef } from "react";
3
3
 
4
4
  // src/utils.ts
5
5
  import { clsx } from "clsx";
@@ -375,10 +375,14 @@ function useShareSheet({
375
375
  shareReddit
376
376
  };
377
377
  }
378
- function useOGData(url) {
378
+ function useOGData(url, fetcher = fetchOGData) {
379
379
  const [ogData, setOgData] = useState(null);
380
380
  const [loading, setLoading] = useState(false);
381
381
  const [error, setError] = useState(null);
382
+ const fetcherRef = useRef(fetcher);
383
+ useEffect(() => {
384
+ fetcherRef.current = fetcher;
385
+ });
382
386
  useEffect(() => {
383
387
  if (!url) {
384
388
  setOgData(null);
@@ -389,7 +393,7 @@ function useOGData(url) {
389
393
  let cancelled = false;
390
394
  setLoading(true);
391
395
  setError(null);
392
- fetchOGData(url).then((data) => {
396
+ fetcherRef.current(url).then((data) => {
393
397
  if (!cancelled) {
394
398
  setOgData(data);
395
399
  setLoading(false);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/hooks.ts","../src/utils.ts","../src/og-fetcher.ts","../src/share-functions.ts","../src/platforms.tsx"],"sourcesContent":["\"use client\";\n\nimport { useMemo, useState, useCallback, useEffect } from \"react\";\nimport { getSafeUrl, isMobileDevice, getAllPlatformAvailability } from \"./utils\";\nimport { fetchOGData, type OGData } from \"./og-fetcher\";\nimport {\n shareToWhatsApp,\n shareToTelegram,\n shareToX,\n shareToFacebook,\n openInstagram,\n openTikTok,\n openThreads,\n shareToSnapchat,\n shareViaSMS,\n shareViaEmail,\n shareToLinkedIn,\n shareToReddit,\n} from \"./share-functions\";\nimport type { UseShareSheetReturn, PlatformAvailability, ShareOption } from \"./types\";\n\n// Default platform availability (assumes desktop/all platforms available)\n// This is used for SSR to avoid hydration mismatch\nconst DEFAULT_PLATFORM_AVAILABILITY: Record<ShareOption, PlatformAvailability> = {\n native: { available: true },\n copy: { available: true },\n download: { available: true },\n whatsapp: { available: true },\n telegram: { available: true },\n instagram: { available: true },\n facebook: { available: true },\n snapchat: { available: true },\n sms: { available: true },\n email: { available: true },\n linkedin: { available: true },\n reddit: { available: true },\n x: { available: true },\n tiktok: { available: true },\n threads: { available: true },\n};\n\nexport interface UseShareSheetOptions {\n /** URL to share */\n shareUrl: string;\n /** Text to share */\n shareText: string;\n /** Download URL (optional) */\n downloadUrl?: string | null;\n /** Download filename (optional) */\n downloadFilename?: string;\n /** Email subject (optional) */\n emailSubject?: string;\n /** File to share via native share (data URL or Blob) - takes priority over URL sharing */\n shareFile?: string | Blob | null;\n /** Filename for the shared file */\n shareFilename?: string;\n /** Callback after native share */\n onNativeShare?: () => void;\n /** Callback after copy */\n onCopy?: () => void;\n /** Callback after download starts */\n onDownload?: () => void;\n}\n\n/**\n * Headless hook for share sheet functionality.\n * Use this to build your own custom share UI.\n */\nexport function useShareSheet({\n shareUrl,\n shareText,\n downloadUrl,\n downloadFilename,\n emailSubject = \"Share\",\n shareFile,\n shareFilename = \"share.png\",\n onNativeShare,\n onCopy,\n onDownload,\n}: UseShareSheetOptions): UseShareSheetReturn {\n const [copied, setCopied] = useState(false);\n const [downloading, setDownloading] = useState(false);\n\n // Use state for values that depend on browser APIs to avoid hydration mismatch\n // Initial values match what server renders (conservative defaults)\n const [canNativeShare, setCanNativeShare] = useState(false);\n const [isMobile, setIsMobile] = useState(false);\n const [platformAvailability, setPlatformAvailability] = useState<Record<ShareOption, PlatformAvailability>>(\n DEFAULT_PLATFORM_AVAILABILITY\n );\n\n // Detect browser capabilities after mount (client-side only)\n useEffect(() => {\n setCanNativeShare(typeof navigator !== \"undefined\" && \"share\" in navigator);\n setIsMobile(isMobileDevice());\n setPlatformAvailability(getAllPlatformAvailability());\n }, []);\n\n const safeUrl = getSafeUrl(shareUrl);\n\n const copyLink = useCallback(async () => {\n if (!safeUrl) return;\n try {\n await navigator.clipboard.writeText(safeUrl);\n setCopied(true);\n onCopy?.();\n setTimeout(() => setCopied(false), 1200);\n } catch {\n // ignore\n }\n }, [safeUrl, onCopy]);\n\n const nativeShare = useCallback(async () => {\n const nav = navigator as Navigator & {\n share?: (data: ShareData) => Promise<void>;\n canShare?: (data: ShareData) => boolean;\n };\n if (!(\"share\" in nav) || typeof nav.share !== \"function\") return;\n\n try {\n // If shareFile is provided, try to share as a file\n if (shareFile) {\n let blob: Blob;\n\n // Convert data URL to Blob if needed\n if (typeof shareFile === \"string\" && shareFile.startsWith(\"data:\")) {\n const response = await fetch(shareFile);\n blob = await response.blob();\n } else if (shareFile instanceof Blob) {\n blob = shareFile;\n } else {\n // Invalid shareFile, fall back to URL sharing\n if (!safeUrl) return;\n await nav.share({\n title: shareText,\n text: shareText,\n url: safeUrl,\n });\n onNativeShare?.();\n return;\n }\n\n // Create a File from the Blob\n const file = new File([blob], shareFilename, { type: blob.type || \"image/png\" });\n\n // Check if file sharing is supported\n const shareData: ShareData = {\n files: [file],\n title: shareText,\n text: shareText,\n };\n\n if (nav.canShare && !nav.canShare(shareData)) {\n // File sharing not supported, fall back to URL sharing\n if (!safeUrl) return;\n await nav.share({\n title: shareText,\n text: shareText,\n url: safeUrl,\n });\n onNativeShare?.();\n return;\n }\n\n await nav.share(shareData);\n onNativeShare?.();\n return;\n }\n\n // Fall back to URL sharing\n if (!safeUrl) return;\n await nav.share({\n title: shareText,\n text: shareText,\n url: safeUrl,\n });\n onNativeShare?.();\n } catch {\n // user canceled or share failed -> ignore\n }\n }, [safeUrl, shareText, shareFile, shareFilename, onNativeShare]);\n\n const downloadFile = useCallback(async () => {\n const url = (downloadUrl ?? \"\").trim();\n if (!url) return;\n try {\n setDownloading(true);\n onDownload?.();\n const res = await fetch(url);\n if (!res.ok) throw new Error(`Failed to fetch file (${res.status})`);\n const blob = await res.blob();\n const href = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = href;\n a.download = downloadFilename || \"download\";\n document.body.appendChild(a);\n a.click();\n a.remove();\n URL.revokeObjectURL(href);\n } catch {\n // ignore\n } finally {\n setDownloading(false);\n }\n }, [downloadUrl, downloadFilename, onDownload]);\n\n const shareWhatsApp = useCallback(() => {\n shareToWhatsApp(safeUrl, shareText);\n }, [safeUrl, shareText]);\n\n const shareTelegram = useCallback(() => {\n shareToTelegram(safeUrl, shareText);\n }, [safeUrl, shareText]);\n\n const shareX = useCallback(() => {\n shareToX(safeUrl, shareText);\n }, [safeUrl, shareText]);\n\n const shareFacebook = useCallback(() => {\n shareToFacebook(safeUrl);\n }, [safeUrl]);\n\n const shareInstagram = useCallback(() => {\n openInstagram();\n }, []);\n\n const shareTikTok = useCallback(() => {\n openTikTok();\n }, []);\n\n const shareThreads = useCallback(() => {\n openThreads();\n }, []);\n\n const shareSnapchat = useCallback(() => {\n shareToSnapchat(safeUrl);\n }, [safeUrl]);\n\n const shareSMS = useCallback(() => {\n shareViaSMS(safeUrl, shareText);\n }, [safeUrl, shareText]);\n\n const shareEmail = useCallback(() => {\n shareViaEmail(safeUrl, shareText, emailSubject);\n }, [safeUrl, shareText, emailSubject]);\n\n const shareLinkedIn = useCallback(() => {\n shareToLinkedIn(safeUrl);\n }, [safeUrl]);\n\n const shareReddit = useCallback(() => {\n shareToReddit(safeUrl, shareText);\n }, [safeUrl, shareText]);\n\n return {\n canNativeShare,\n copied,\n downloading,\n safeUrl,\n isMobile,\n platformAvailability,\n copyLink,\n nativeShare,\n downloadFile,\n shareWhatsApp,\n shareTelegram,\n shareX,\n shareFacebook,\n shareInstagram,\n shareTikTok,\n shareThreads,\n shareSnapchat,\n shareSMS,\n shareEmail,\n shareLinkedIn,\n shareReddit,\n };\n}\n\n/**\n * Hook to fetch OG (Open Graph) data from a URL.\n * Automatically fetches and caches OG metadata for link previews.\n */\nexport function useOGData(url: string | undefined): {\n ogData: OGData | null;\n loading: boolean;\n error: string | null;\n} {\n const [ogData, setOgData] = useState<OGData | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (!url) {\n setOgData(null);\n setLoading(false);\n setError(null);\n return;\n }\n\n let cancelled = false;\n setLoading(true);\n setError(null);\n\n fetchOGData(url)\n .then((data) => {\n if (!cancelled) {\n setOgData(data);\n setLoading(false);\n }\n })\n .catch((err) => {\n if (!cancelled) {\n setError(err instanceof Error ? err.message : \"Failed to fetch OG data\");\n setLoading(false);\n }\n });\n\n return () => {\n cancelled = true;\n };\n }, [url]);\n\n return { ogData, loading, error };\n}\n\n// Legacy export for backwards compatibility\n/** @deprecated Use useShareSheet instead */\nexport const useShareMenu = useShareSheet;\n/** @deprecated Use UseShareSheetOptions instead */\nexport type UseShareMenuOptions = UseShareSheetOptions;\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\nimport type { ShareOption, PlatformAvailability } from \"./types\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\nexport function openUrl(url: string) {\n window.open(url, \"_blank\", \"noopener,noreferrer\");\n}\n\nexport function getSafeUrl(shareUrl: string): string {\n return shareUrl || (typeof window !== \"undefined\" ? window.location.href : \"\");\n}\n\n/**\n * Detect if the current device is a mobile device.\n * Uses user agent detection as the primary method.\n */\nexport function isMobileDevice(): boolean {\n if (typeof navigator === \"undefined\") return false;\n \n const userAgent = navigator.userAgent || navigator.vendor || \"\";\n \n // Check for mobile user agents\n const mobileRegex = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Mobile|mobile|CriOS/i;\n \n // Also check for touch capability as a secondary signal\n const hasTouch = typeof window !== \"undefined\" && (\n \"ontouchstart\" in window ||\n navigator.maxTouchPoints > 0\n );\n \n // User agent is more reliable than touch detection alone\n // (many desktop browsers support touch)\n return mobileRegex.test(userAgent);\n}\n\n/**\n * Detect if the current device is iOS\n */\nexport function isIOSDevice(): boolean {\n if (typeof navigator === \"undefined\") return false;\n \n const userAgent = navigator.userAgent || \"\";\n return /iPhone|iPad|iPod/i.test(userAgent);\n}\n\n/**\n * Detect if the current device is Android\n */\nexport function isAndroidDevice(): boolean {\n if (typeof navigator === \"undefined\") return false;\n \n const userAgent = navigator.userAgent || \"\";\n return /Android/i.test(userAgent);\n}\n\n/** Platforms that require mobile devices (deep links / URL schemes) */\nexport const MOBILE_ONLY_PLATFORMS: readonly ShareOption[] = [\n \"instagram\",\n \"tiktok\", \n \"threads\",\n \"sms\",\n] as const;\n\n/** Platforms that work better on mobile but may partially work on desktop */\nexport const MOBILE_PREFERRED_PLATFORMS: readonly ShareOption[] = [\n \"snapchat\",\n \"whatsapp\",\n] as const;\n\n/**\n * Check if a share platform is available on the current device.\n * Returns availability status and reason if unavailable.\n */\nexport function checkPlatformAvailability(platform: ShareOption): PlatformAvailability {\n const isMobile = isMobileDevice();\n \n // Deep link platforms - require mobile device\n if (MOBILE_ONLY_PLATFORMS.includes(platform)) {\n if (!isMobile) {\n return {\n available: false,\n reason: `${platform} requires a mobile device with the app installed`,\n };\n }\n }\n \n // SMS - requires mobile or device with SMS capability\n if (platform === \"sms\" && !isMobile) {\n return {\n available: false,\n reason: \"SMS sharing requires a mobile device\",\n };\n }\n \n // Native share - check browser support\n if (platform === \"native\") {\n const canShare = typeof navigator !== \"undefined\" && \"share\" in navigator;\n if (!canShare) {\n return {\n available: false,\n reason: \"Native share is not supported by this browser\",\n };\n }\n }\n \n return { available: true };\n}\n\n/**\n * Get availability status for all platforms.\n */\nexport function getAllPlatformAvailability(): Record<ShareOption, PlatformAvailability> {\n const platforms: ShareOption[] = [\n \"native\", \"copy\", \"download\", \"whatsapp\", \"telegram\",\n \"instagram\", \"facebook\", \"snapchat\", \"sms\", \"email\",\n \"linkedin\", \"reddit\", \"x\", \"tiktok\", \"threads\",\n ];\n \n const result: Partial<Record<ShareOption, PlatformAvailability>> = {};\n for (const platform of platforms) {\n result[platform] = checkPlatformAvailability(platform);\n }\n \n return result as Record<ShareOption, PlatformAvailability>;\n}\n\n/**\n * Log a warning to console when a platform is not available.\n */\nexport function warnUnavailablePlatform(platform: ShareOption, reason: string): void {\n console.warn(\n `[react-sharesheet] ${platform} sharing is not available: ${reason}. ` +\n `This share option may not work correctly on this device.`\n );\n}\n\n","// OG Data fetcher using Microlink API (free, no API key required)\n\nexport interface OGData {\n title?: string;\n description?: string;\n image?: string;\n url?: string;\n siteName?: string;\n}\n\nexport interface OGFetchResult {\n data: OGData | null;\n loading: boolean;\n error: string | null;\n}\n\n// Cache to avoid re-fetching the same URL\nconst ogCache = new Map<string, OGData>();\n\nexport async function fetchOGData(url: string): Promise<OGData | null> {\n // Check cache first\n if (ogCache.has(url)) {\n return ogCache.get(url)!;\n }\n\n try {\n // Use Microlink API to fetch OG data (free tier, no API key needed)\n const apiUrl = `https://api.microlink.io?url=${encodeURIComponent(url)}`;\n const response = await fetch(apiUrl);\n \n if (!response.ok) {\n throw new Error(`Failed to fetch OG data: ${response.status}`);\n }\n\n const json = await response.json();\n \n if (json.status !== \"success\" || !json.data) {\n return null;\n }\n\n const { title, description, image, url: canonicalUrl, publisher } = json.data;\n\n const ogData: OGData = {\n title: title || undefined,\n description: description || undefined,\n image: image?.url || undefined,\n url: canonicalUrl || url,\n siteName: publisher || undefined,\n };\n\n // Cache the result\n ogCache.set(url, ogData);\n\n return ogData;\n } catch (error) {\n console.warn(\"[react-sharesheet] Failed to fetch OG data:\", error);\n return null;\n }\n}\n\n// Clear cache (useful for testing or forcing refresh)\nexport function clearOGCache(): void {\n ogCache.clear();\n}\n","import { \n openUrl, \n checkPlatformAvailability, \n warnUnavailablePlatform,\n} from \"./utils\";\n\nexport function shareToWhatsApp(url: string, text: string) {\n const encoded = encodeURIComponent(`${text}\\n${url}`);\n openUrl(`https://api.whatsapp.com/send?text=${encoded}`);\n}\n\nexport function shareToTelegram(url: string, text: string) {\n const encodedText = encodeURIComponent(text);\n const encodedUrl = encodeURIComponent(url);\n openUrl(`https://t.me/share/url?url=${encodedUrl}&text=${encodedText}`);\n}\n\nexport function shareToX(url: string, text: string) {\n const encodedText = encodeURIComponent(text);\n const encodedUrl = encodeURIComponent(url);\n openUrl(`https://x.com/intent/tweet?text=${encodedText}&url=${encodedUrl}`);\n}\n\nexport function shareToFacebook(url: string) {\n const encodedUrl = encodeURIComponent(url);\n openUrl(`https://www.facebook.com/sharer/sharer.php?u=${encodedUrl}`);\n}\n\nexport function openInstagram() {\n const availability = checkPlatformAvailability(\"instagram\");\n if (!availability.available) {\n warnUnavailablePlatform(\"instagram\", availability.reason!);\n // Still attempt to open - it may work on some desktop browsers with app installed\n }\n window.location.href = \"instagram://\";\n}\n\nexport function openTikTok() {\n const availability = checkPlatformAvailability(\"tiktok\");\n if (!availability.available) {\n warnUnavailablePlatform(\"tiktok\", availability.reason!);\n // Still attempt to open - it may work on some desktop browsers with app installed\n }\n window.location.href = \"tiktok://\";\n}\n\nexport function openThreads() {\n const availability = checkPlatformAvailability(\"threads\");\n if (!availability.available) {\n warnUnavailablePlatform(\"threads\", availability.reason!);\n // Still attempt to open - it may work on some desktop browsers with app installed\n }\n window.location.href = \"threads://\";\n}\n\nexport function shareToSnapchat(url: string) {\n const encodedUrl = encodeURIComponent(url);\n openUrl(`https://www.snapchat.com/scan?attachmentUrl=${encodedUrl}`);\n}\n\nexport function shareViaSMS(url: string, text: string) {\n const availability = checkPlatformAvailability(\"sms\");\n if (!availability.available) {\n warnUnavailablePlatform(\"sms\", availability.reason!);\n // Still attempt to open - it may work on some devices\n }\n const body = encodeURIComponent(`${text}\\n${url}`);\n window.location.href = `sms:?body=${body}`;\n}\n\nexport function shareViaEmail(url: string, text: string, subject = \"Share\") {\n const encodedSubject = encodeURIComponent(subject);\n const body = encodeURIComponent(`${text}\\n\\n${url}`);\n window.location.href = `mailto:?subject=${encodedSubject}&body=${body}`;\n}\n\nexport function shareToLinkedIn(url: string) {\n const encodedUrl = encodeURIComponent(url);\n openUrl(`https://www.linkedin.com/sharing/share-offsite/?url=${encodedUrl}`);\n}\n\nexport function shareToReddit(url: string, text: string) {\n const encodedText = encodeURIComponent(text);\n const encodedUrl = encodeURIComponent(url);\n openUrl(`https://www.reddit.com/submit?url=${encodedUrl}&title=${encodedText}`);\n}\n\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport {\n LuDownload,\n LuLink,\n LuMail,\n LuMessageCircle,\n LuSend,\n} from \"react-icons/lu\";\nimport {\n FaFacebookF,\n FaInstagram,\n FaLinkedin,\n FaReddit,\n FaTelegramPlane,\n FaTiktok,\n FaWhatsapp,\n} from \"react-icons/fa\";\nimport { FaXTwitter, FaThreads, FaSnapchat } from \"react-icons/fa6\";\nimport type { ShareOption } from \"./types\";\n\n/** Platform color configuration */\nexport interface PlatformColor {\n /** Background color (hex) */\n bg: string;\n /** Text/icon color (hex) */\n text: string;\n}\n\n/** Platform configuration */\nexport interface PlatformConfig {\n /** Platform identifier */\n id: ShareOption;\n /** Display label */\n label: string;\n /** Colors */\n colors: PlatformColor;\n /** Icon component (accepts size prop) */\n Icon: (props: { size?: number; className?: string }) => ReactNode;\n /** CSS variable name for background */\n cssVar: string;\n}\n\n/** All platform IDs in default order */\nexport const PLATFORM_IDS: readonly ShareOption[] = [\n \"native\",\n \"copy\",\n \"download\",\n \"whatsapp\",\n \"telegram\",\n \"instagram\",\n \"facebook\",\n \"snapchat\",\n \"sms\",\n \"email\",\n \"linkedin\",\n \"reddit\",\n \"x\",\n \"tiktok\",\n \"threads\",\n] as const;\n\n/** Platform colors - hex values for each platform (SOURCE OF TRUTH) */\nexport const PLATFORM_COLORS: Record<ShareOption, PlatformColor> = {\n native: { bg: \"#7c3aed\", text: \"#ffffff\" },\n copy: { bg: \"#3b82f6\", text: \"#ffffff\" },\n download: { bg: \"#ef4444\", text: \"#ffffff\" },\n whatsapp: { bg: \"#25D366\", text: \"#ffffff\" },\n telegram: { bg: \"#229ED9\", text: \"#ffffff\" },\n instagram: { bg: \"#E1306C\", text: \"#ffffff\" },\n facebook: { bg: \"#1877F2\", text: \"#ffffff\" },\n snapchat: { bg: \"#FFFC00\", text: \"#000000\" },\n sms: { bg: \"#22c55e\", text: \"#ffffff\" },\n email: { bg: \"#f97316\", text: \"#ffffff\" },\n linkedin: { bg: \"#0A66C2\", text: \"#ffffff\" },\n reddit: { bg: \"#FF4500\", text: \"#ffffff\" },\n x: { bg: \"#000000\", text: \"#ffffff\" },\n tiktok: { bg: \"#000000\", text: \"#ffffff\" },\n threads: { bg: \"#000000\", text: \"#ffffff\" },\n} as const;\n\n/** Platform labels (SOURCE OF TRUTH) */\nexport const PLATFORM_LABELS: Record<ShareOption, string> = {\n native: \"Share…\",\n copy: \"Copy\",\n download: \"Download\",\n whatsapp: \"WhatsApp\",\n telegram: \"Telegram\",\n instagram: \"Instagram\",\n facebook: \"Facebook\",\n snapchat: \"Snapchat\",\n sms: \"SMS\",\n email: \"Email\",\n linkedin: \"LinkedIn\",\n reddit: \"Reddit\",\n x: \"X\",\n tiktok: \"TikTok\",\n threads: \"Threads\",\n} as const;\n\n/** Platform icons - React components (SOURCE OF TRUTH) */\nexport const PLATFORM_ICONS: Record<ShareOption, (props: { size?: number; className?: string }) => ReactNode> = {\n native: ({ size = 22, className }) => <LuSend size={size} className={className} />,\n copy: ({ size = 22, className }) => <LuLink size={size} className={className} />,\n download: ({ size = 22, className }) => <LuDownload size={size} className={className} />,\n whatsapp: ({ size = 22, className }) => <FaWhatsapp size={size} className={className} />,\n telegram: ({ size = 22, className }) => <FaTelegramPlane size={size} className={className} />,\n instagram: ({ size = 22, className }) => <FaInstagram size={size} className={className} />,\n facebook: ({ size = 22, className }) => <FaFacebookF size={size} className={className} />,\n snapchat: ({ size = 22, className }) => <FaSnapchat size={size} className={className} />,\n sms: ({ size = 22, className }) => <LuMessageCircle size={size} className={className} />,\n email: ({ size = 22, className }) => <LuMail size={size} className={className} />,\n linkedin: ({ size = 22, className }) => <FaLinkedin size={size} className={className} />,\n reddit: ({ size = 22, className }) => <FaReddit size={size} className={className} />,\n x: ({ size = 22, className }) => <FaXTwitter size={size} className={className} />,\n tiktok: ({ size = 22, className }) => <FaTiktok size={size} className={className} />,\n threads: ({ size = 22, className }) => <FaThreads size={size} className={className} />,\n} as const;\n\n/** CSS variable names for platform backgrounds */\nexport const PLATFORM_CSS_VARS: Record<ShareOption, string> = {\n native: \"--sharesheet-native-bg\",\n copy: \"--sharesheet-copy-bg\",\n download: \"--sharesheet-download-bg\",\n whatsapp: \"--sharesheet-whatsapp-bg\",\n telegram: \"--sharesheet-telegram-bg\",\n instagram: \"--sharesheet-instagram-bg\",\n facebook: \"--sharesheet-facebook-bg\",\n snapchat: \"--sharesheet-snapchat-bg\",\n sms: \"--sharesheet-sms-bg\",\n email: \"--sharesheet-email-bg\",\n linkedin: \"--sharesheet-linkedin-bg\",\n reddit: \"--sharesheet-reddit-bg\",\n x: \"--sharesheet-x-bg\",\n tiktok: \"--sharesheet-tiktok-bg\",\n threads: \"--sharesheet-threads-bg\",\n} as const;\n\n/** Full platform configurations */\nexport const PLATFORMS: Record<ShareOption, PlatformConfig> = Object.fromEntries(\n PLATFORM_IDS.map((id) => [\n id,\n {\n id,\n label: PLATFORM_LABELS[id],\n colors: PLATFORM_COLORS[id],\n Icon: PLATFORM_ICONS[id],\n cssVar: PLATFORM_CSS_VARS[id],\n },\n ])\n) as Record<ShareOption, PlatformConfig>;\n\n/** Get platform config by id */\nexport function getPlatform(id: ShareOption): PlatformConfig {\n return PLATFORMS[id];\n}\n\n/** Get all platform configs as array */\nexport function getAllPlatforms(): PlatformConfig[] {\n return PLATFORM_IDS.map((id) => PLATFORMS[id]);\n}\n\n/** Get platform color */\nexport function getPlatformColor(id: ShareOption): PlatformColor {\n return PLATFORM_COLORS[id];\n}\n\n/** Get platform icon component */\nexport function getPlatformIcon(id: ShareOption): (props: { size?: number; className?: string }) => ReactNode {\n return PLATFORM_ICONS[id];\n}\n\n/** Get platform label */\nexport function getPlatformLabel(id: ShareOption): string {\n return PLATFORM_LABELS[id];\n}\n\n/** Generate CSS variable defaults from platform colors */\nexport function generateCssVarDefaults(): Record<string, string> {\n const defaults: Record<string, string> = {};\n PLATFORM_IDS.forEach((id) => {\n defaults[PLATFORM_CSS_VARS[id]] = PLATFORM_COLORS[id].bg;\n });\n return defaults;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/hooks.ts","../src/utils.ts","../src/og-fetcher.ts","../src/share-functions.ts","../src/platforms.tsx"],"sourcesContent":["\"use client\";\n\nimport { useMemo, useState, useCallback, useEffect, useRef } from \"react\";\nimport { getSafeUrl, isMobileDevice, getAllPlatformAvailability } from \"./utils\";\nimport { fetchOGData, type OGData, type OGFetcher } from \"./og-fetcher\";\nimport {\n shareToWhatsApp,\n shareToTelegram,\n shareToX,\n shareToFacebook,\n openInstagram,\n openTikTok,\n openThreads,\n shareToSnapchat,\n shareViaSMS,\n shareViaEmail,\n shareToLinkedIn,\n shareToReddit,\n} from \"./share-functions\";\nimport type { UseShareSheetReturn, PlatformAvailability, ShareOption } from \"./types\";\n\n// Default platform availability (assumes desktop/all platforms available)\n// This is used for SSR to avoid hydration mismatch\nconst DEFAULT_PLATFORM_AVAILABILITY: Record<ShareOption, PlatformAvailability> = {\n native: { available: true },\n copy: { available: true },\n download: { available: true },\n whatsapp: { available: true },\n telegram: { available: true },\n instagram: { available: true },\n facebook: { available: true },\n snapchat: { available: true },\n sms: { available: true },\n email: { available: true },\n linkedin: { available: true },\n reddit: { available: true },\n x: { available: true },\n tiktok: { available: true },\n threads: { available: true },\n};\n\nexport interface UseShareSheetOptions {\n /** URL to share */\n shareUrl: string;\n /** Text to share */\n shareText: string;\n /** Download URL (optional) */\n downloadUrl?: string | null;\n /** Download filename (optional) */\n downloadFilename?: string;\n /** Email subject (optional) */\n emailSubject?: string;\n /** File to share via native share (data URL or Blob) - takes priority over URL sharing */\n shareFile?: string | Blob | null;\n /** Filename for the shared file */\n shareFilename?: string;\n /** Callback after native share */\n onNativeShare?: () => void;\n /** Callback after copy */\n onCopy?: () => void;\n /** Callback after download starts */\n onDownload?: () => void;\n}\n\n/**\n * Headless hook for share sheet functionality.\n * Use this to build your own custom share UI.\n */\nexport function useShareSheet({\n shareUrl,\n shareText,\n downloadUrl,\n downloadFilename,\n emailSubject = \"Share\",\n shareFile,\n shareFilename = \"share.png\",\n onNativeShare,\n onCopy,\n onDownload,\n}: UseShareSheetOptions): UseShareSheetReturn {\n const [copied, setCopied] = useState(false);\n const [downloading, setDownloading] = useState(false);\n\n // Use state for values that depend on browser APIs to avoid hydration mismatch\n // Initial values match what server renders (conservative defaults)\n const [canNativeShare, setCanNativeShare] = useState(false);\n const [isMobile, setIsMobile] = useState(false);\n const [platformAvailability, setPlatformAvailability] = useState<Record<ShareOption, PlatformAvailability>>(\n DEFAULT_PLATFORM_AVAILABILITY\n );\n\n // Detect browser capabilities after mount (client-side only)\n useEffect(() => {\n setCanNativeShare(typeof navigator !== \"undefined\" && \"share\" in navigator);\n setIsMobile(isMobileDevice());\n setPlatformAvailability(getAllPlatformAvailability());\n }, []);\n\n const safeUrl = getSafeUrl(shareUrl);\n\n const copyLink = useCallback(async () => {\n if (!safeUrl) return;\n try {\n await navigator.clipboard.writeText(safeUrl);\n setCopied(true);\n onCopy?.();\n setTimeout(() => setCopied(false), 1200);\n } catch {\n // ignore\n }\n }, [safeUrl, onCopy]);\n\n const nativeShare = useCallback(async () => {\n const nav = navigator as Navigator & {\n share?: (data: ShareData) => Promise<void>;\n canShare?: (data: ShareData) => boolean;\n };\n if (!(\"share\" in nav) || typeof nav.share !== \"function\") return;\n\n try {\n // If shareFile is provided, try to share as a file\n if (shareFile) {\n let blob: Blob;\n\n // Convert data URL to Blob if needed\n if (typeof shareFile === \"string\" && shareFile.startsWith(\"data:\")) {\n const response = await fetch(shareFile);\n blob = await response.blob();\n } else if (shareFile instanceof Blob) {\n blob = shareFile;\n } else {\n // Invalid shareFile, fall back to URL sharing\n if (!safeUrl) return;\n await nav.share({\n title: shareText,\n text: shareText,\n url: safeUrl,\n });\n onNativeShare?.();\n return;\n }\n\n // Create a File from the Blob\n const file = new File([blob], shareFilename, { type: blob.type || \"image/png\" });\n\n // Check if file sharing is supported\n const shareData: ShareData = {\n files: [file],\n title: shareText,\n text: shareText,\n };\n\n if (nav.canShare && !nav.canShare(shareData)) {\n // File sharing not supported, fall back to URL sharing\n if (!safeUrl) return;\n await nav.share({\n title: shareText,\n text: shareText,\n url: safeUrl,\n });\n onNativeShare?.();\n return;\n }\n\n await nav.share(shareData);\n onNativeShare?.();\n return;\n }\n\n // Fall back to URL sharing\n if (!safeUrl) return;\n await nav.share({\n title: shareText,\n text: shareText,\n url: safeUrl,\n });\n onNativeShare?.();\n } catch {\n // user canceled or share failed -> ignore\n }\n }, [safeUrl, shareText, shareFile, shareFilename, onNativeShare]);\n\n const downloadFile = useCallback(async () => {\n const url = (downloadUrl ?? \"\").trim();\n if (!url) return;\n try {\n setDownloading(true);\n onDownload?.();\n const res = await fetch(url);\n if (!res.ok) throw new Error(`Failed to fetch file (${res.status})`);\n const blob = await res.blob();\n const href = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = href;\n a.download = downloadFilename || \"download\";\n document.body.appendChild(a);\n a.click();\n a.remove();\n URL.revokeObjectURL(href);\n } catch {\n // ignore\n } finally {\n setDownloading(false);\n }\n }, [downloadUrl, downloadFilename, onDownload]);\n\n const shareWhatsApp = useCallback(() => {\n shareToWhatsApp(safeUrl, shareText);\n }, [safeUrl, shareText]);\n\n const shareTelegram = useCallback(() => {\n shareToTelegram(safeUrl, shareText);\n }, [safeUrl, shareText]);\n\n const shareX = useCallback(() => {\n shareToX(safeUrl, shareText);\n }, [safeUrl, shareText]);\n\n const shareFacebook = useCallback(() => {\n shareToFacebook(safeUrl);\n }, [safeUrl]);\n\n const shareInstagram = useCallback(() => {\n openInstagram();\n }, []);\n\n const shareTikTok = useCallback(() => {\n openTikTok();\n }, []);\n\n const shareThreads = useCallback(() => {\n openThreads();\n }, []);\n\n const shareSnapchat = useCallback(() => {\n shareToSnapchat(safeUrl);\n }, [safeUrl]);\n\n const shareSMS = useCallback(() => {\n shareViaSMS(safeUrl, shareText);\n }, [safeUrl, shareText]);\n\n const shareEmail = useCallback(() => {\n shareViaEmail(safeUrl, shareText, emailSubject);\n }, [safeUrl, shareText, emailSubject]);\n\n const shareLinkedIn = useCallback(() => {\n shareToLinkedIn(safeUrl);\n }, [safeUrl]);\n\n const shareReddit = useCallback(() => {\n shareToReddit(safeUrl, shareText);\n }, [safeUrl, shareText]);\n\n return {\n canNativeShare,\n copied,\n downloading,\n safeUrl,\n isMobile,\n platformAvailability,\n copyLink,\n nativeShare,\n downloadFile,\n shareWhatsApp,\n shareTelegram,\n shareX,\n shareFacebook,\n shareInstagram,\n shareTikTok,\n shareThreads,\n shareSnapchat,\n shareSMS,\n shareEmail,\n shareLinkedIn,\n shareReddit,\n };\n}\n\n/**\n * Hook to fetch OG (Open Graph) data from a URL.\n * Fetches with `fetcher`, the Microlink lookup (`fetchOGData`, cached) unless another is given:\n * calling this hook is the opt-in, since the lookup sends `url` to a third party.\n */\nexport function useOGData(url: string | undefined, fetcher: OGFetcher = fetchOGData): {\n ogData: OGData | null;\n loading: boolean;\n error: string | null;\n} {\n const [ogData, setOgData] = useState<OGData | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n // Read at fetch time, so an inline fetcher does not refetch on every render\n // (this effect runs before the one below in the same commit)\n const fetcherRef = useRef(fetcher);\n useEffect(() => {\n fetcherRef.current = fetcher;\n });\n\n useEffect(() => {\n if (!url) {\n setOgData(null);\n setLoading(false);\n setError(null);\n return;\n }\n\n let cancelled = false;\n setLoading(true);\n setError(null);\n\n fetcherRef.current(url)\n .then((data) => {\n if (!cancelled) {\n setOgData(data);\n setLoading(false);\n }\n })\n .catch((err) => {\n if (!cancelled) {\n setError(err instanceof Error ? err.message : \"Failed to fetch OG data\");\n setLoading(false);\n }\n });\n\n return () => {\n cancelled = true;\n };\n }, [url]);\n\n return { ogData, loading, error };\n}\n\n// Legacy export for backwards compatibility\n/** @deprecated Use useShareSheet instead */\nexport const useShareMenu = useShareSheet;\n/** @deprecated Use UseShareSheetOptions instead */\nexport type UseShareMenuOptions = UseShareSheetOptions;\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\nimport type { ShareOption, PlatformAvailability } from \"./types\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\nexport function openUrl(url: string) {\n window.open(url, \"_blank\", \"noopener,noreferrer\");\n}\n\nexport function getSafeUrl(shareUrl: string): string {\n return shareUrl || (typeof window !== \"undefined\" ? window.location.href : \"\");\n}\n\n/**\n * Detect if the current device is a mobile device.\n * Uses user agent detection as the primary method.\n */\nexport function isMobileDevice(): boolean {\n if (typeof navigator === \"undefined\") return false;\n \n const userAgent = navigator.userAgent || navigator.vendor || \"\";\n \n // Check for mobile user agents\n const mobileRegex = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini|Mobile|mobile|CriOS/i;\n \n // Also check for touch capability as a secondary signal\n const hasTouch = typeof window !== \"undefined\" && (\n \"ontouchstart\" in window ||\n navigator.maxTouchPoints > 0\n );\n \n // User agent is more reliable than touch detection alone\n // (many desktop browsers support touch)\n return mobileRegex.test(userAgent);\n}\n\n/**\n * Detect if the current device is iOS\n */\nexport function isIOSDevice(): boolean {\n if (typeof navigator === \"undefined\") return false;\n \n const userAgent = navigator.userAgent || \"\";\n return /iPhone|iPad|iPod/i.test(userAgent);\n}\n\n/**\n * Detect if the current device is Android\n */\nexport function isAndroidDevice(): boolean {\n if (typeof navigator === \"undefined\") return false;\n \n const userAgent = navigator.userAgent || \"\";\n return /Android/i.test(userAgent);\n}\n\n/** Platforms that require mobile devices (deep links / URL schemes) */\nexport const MOBILE_ONLY_PLATFORMS: readonly ShareOption[] = [\n \"instagram\",\n \"tiktok\", \n \"threads\",\n \"sms\",\n] as const;\n\n/** Platforms that work better on mobile but may partially work on desktop */\nexport const MOBILE_PREFERRED_PLATFORMS: readonly ShareOption[] = [\n \"snapchat\",\n \"whatsapp\",\n] as const;\n\n/**\n * Check if a share platform is available on the current device.\n * Returns availability status and reason if unavailable.\n */\nexport function checkPlatformAvailability(platform: ShareOption): PlatformAvailability {\n const isMobile = isMobileDevice();\n \n // Deep link platforms - require mobile device\n if (MOBILE_ONLY_PLATFORMS.includes(platform)) {\n if (!isMobile) {\n return {\n available: false,\n reason: `${platform} requires a mobile device with the app installed`,\n };\n }\n }\n \n // SMS - requires mobile or device with SMS capability\n if (platform === \"sms\" && !isMobile) {\n return {\n available: false,\n reason: \"SMS sharing requires a mobile device\",\n };\n }\n \n // Native share - check browser support\n if (platform === \"native\") {\n const canShare = typeof navigator !== \"undefined\" && \"share\" in navigator;\n if (!canShare) {\n return {\n available: false,\n reason: \"Native share is not supported by this browser\",\n };\n }\n }\n \n return { available: true };\n}\n\n/**\n * Get availability status for all platforms.\n */\nexport function getAllPlatformAvailability(): Record<ShareOption, PlatformAvailability> {\n const platforms: ShareOption[] = [\n \"native\", \"copy\", \"download\", \"whatsapp\", \"telegram\",\n \"instagram\", \"facebook\", \"snapchat\", \"sms\", \"email\",\n \"linkedin\", \"reddit\", \"x\", \"tiktok\", \"threads\",\n ];\n \n const result: Partial<Record<ShareOption, PlatformAvailability>> = {};\n for (const platform of platforms) {\n result[platform] = checkPlatformAvailability(platform);\n }\n \n return result as Record<ShareOption, PlatformAvailability>;\n}\n\n/**\n * Log a warning to console when a platform is not available.\n */\nexport function warnUnavailablePlatform(platform: ShareOption, reason: string): void {\n console.warn(\n `[react-sharesheet] ${platform} sharing is not available: ${reason}. ` +\n `This share option may not work correctly on this device.`\n );\n}\n\n","// OG data fetcher using the Microlink API (free, no API key required).\n// The sheet never calls it on its own: a caller opts in with `fetchPreview={fetchOGData}`,\n// because the lookup sends the shared link to a third party.\n\nexport interface OGData {\n title?: string;\n description?: string;\n image?: string;\n url?: string;\n siteName?: string;\n}\n\n/** Looks up a link's card. Resolves to null when there is none. */\nexport type OGFetcher = (url: string) => Promise<OGData | null>;\n\nexport interface OGFetchResult {\n data: OGData | null;\n loading: boolean;\n error: string | null;\n}\n\n// Cache to avoid re-fetching the same URL\nconst ogCache = new Map<string, OGData>();\n\nexport async function fetchOGData(url: string): Promise<OGData | null> {\n // Check cache first\n if (ogCache.has(url)) {\n return ogCache.get(url)!;\n }\n\n try {\n // Use Microlink API to fetch OG data (free tier, no API key needed)\n const apiUrl = `https://api.microlink.io?url=${encodeURIComponent(url)}`;\n const response = await fetch(apiUrl);\n \n if (!response.ok) {\n throw new Error(`Failed to fetch OG data: ${response.status}`);\n }\n\n const json = await response.json();\n \n if (json.status !== \"success\" || !json.data) {\n return null;\n }\n\n const { title, description, image, url: canonicalUrl, publisher } = json.data;\n\n const ogData: OGData = {\n title: title || undefined,\n description: description || undefined,\n image: image?.url || undefined,\n url: canonicalUrl || url,\n siteName: publisher || undefined,\n };\n\n // Cache the result\n ogCache.set(url, ogData);\n\n return ogData;\n } catch (error) {\n console.warn(\"[react-sharesheet] Failed to fetch OG data:\", error);\n return null;\n }\n}\n\n// Clear cache (useful for testing or forcing refresh)\nexport function clearOGCache(): void {\n ogCache.clear();\n}\n","import { \n openUrl, \n checkPlatformAvailability, \n warnUnavailablePlatform,\n} from \"./utils\";\n\nexport function shareToWhatsApp(url: string, text: string) {\n const encoded = encodeURIComponent(`${text}\\n${url}`);\n openUrl(`https://api.whatsapp.com/send?text=${encoded}`);\n}\n\nexport function shareToTelegram(url: string, text: string) {\n const encodedText = encodeURIComponent(text);\n const encodedUrl = encodeURIComponent(url);\n openUrl(`https://t.me/share/url?url=${encodedUrl}&text=${encodedText}`);\n}\n\nexport function shareToX(url: string, text: string) {\n const encodedText = encodeURIComponent(text);\n const encodedUrl = encodeURIComponent(url);\n openUrl(`https://x.com/intent/tweet?text=${encodedText}&url=${encodedUrl}`);\n}\n\nexport function shareToFacebook(url: string) {\n const encodedUrl = encodeURIComponent(url);\n openUrl(`https://www.facebook.com/sharer/sharer.php?u=${encodedUrl}`);\n}\n\nexport function openInstagram() {\n const availability = checkPlatformAvailability(\"instagram\");\n if (!availability.available) {\n warnUnavailablePlatform(\"instagram\", availability.reason!);\n // Still attempt to open - it may work on some desktop browsers with app installed\n }\n window.location.href = \"instagram://\";\n}\n\nexport function openTikTok() {\n const availability = checkPlatformAvailability(\"tiktok\");\n if (!availability.available) {\n warnUnavailablePlatform(\"tiktok\", availability.reason!);\n // Still attempt to open - it may work on some desktop browsers with app installed\n }\n window.location.href = \"tiktok://\";\n}\n\nexport function openThreads() {\n const availability = checkPlatformAvailability(\"threads\");\n if (!availability.available) {\n warnUnavailablePlatform(\"threads\", availability.reason!);\n // Still attempt to open - it may work on some desktop browsers with app installed\n }\n window.location.href = \"threads://\";\n}\n\nexport function shareToSnapchat(url: string) {\n const encodedUrl = encodeURIComponent(url);\n openUrl(`https://www.snapchat.com/scan?attachmentUrl=${encodedUrl}`);\n}\n\nexport function shareViaSMS(url: string, text: string) {\n const availability = checkPlatformAvailability(\"sms\");\n if (!availability.available) {\n warnUnavailablePlatform(\"sms\", availability.reason!);\n // Still attempt to open - it may work on some devices\n }\n const body = encodeURIComponent(`${text}\\n${url}`);\n window.location.href = `sms:?body=${body}`;\n}\n\nexport function shareViaEmail(url: string, text: string, subject = \"Share\") {\n const encodedSubject = encodeURIComponent(subject);\n const body = encodeURIComponent(`${text}\\n\\n${url}`);\n window.location.href = `mailto:?subject=${encodedSubject}&body=${body}`;\n}\n\nexport function shareToLinkedIn(url: string) {\n const encodedUrl = encodeURIComponent(url);\n openUrl(`https://www.linkedin.com/sharing/share-offsite/?url=${encodedUrl}`);\n}\n\nexport function shareToReddit(url: string, text: string) {\n const encodedText = encodeURIComponent(text);\n const encodedUrl = encodeURIComponent(url);\n openUrl(`https://www.reddit.com/submit?url=${encodedUrl}&title=${encodedText}`);\n}\n\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport {\n LuDownload,\n LuLink,\n LuMail,\n LuMessageCircle,\n LuSend,\n} from \"react-icons/lu\";\nimport {\n FaFacebookF,\n FaInstagram,\n FaLinkedin,\n FaReddit,\n FaTelegramPlane,\n FaTiktok,\n FaWhatsapp,\n} from \"react-icons/fa\";\nimport { FaXTwitter, FaThreads, FaSnapchat } from \"react-icons/fa6\";\nimport type { ShareOption } from \"./types\";\n\n/** Platform color configuration */\nexport interface PlatformColor {\n /** Background color (hex) */\n bg: string;\n /** Text/icon color (hex) */\n text: string;\n}\n\n/** Platform configuration */\nexport interface PlatformConfig {\n /** Platform identifier */\n id: ShareOption;\n /** Display label */\n label: string;\n /** Colors */\n colors: PlatformColor;\n /** Icon component (accepts size prop) */\n Icon: (props: { size?: number; className?: string }) => ReactNode;\n /** CSS variable name for background */\n cssVar: string;\n}\n\n/** All platform IDs in default order */\nexport const PLATFORM_IDS: readonly ShareOption[] = [\n \"native\",\n \"copy\",\n \"download\",\n \"whatsapp\",\n \"telegram\",\n \"instagram\",\n \"facebook\",\n \"snapchat\",\n \"sms\",\n \"email\",\n \"linkedin\",\n \"reddit\",\n \"x\",\n \"tiktok\",\n \"threads\",\n] as const;\n\n/** Platform colors - hex values for each platform (SOURCE OF TRUTH) */\nexport const PLATFORM_COLORS: Record<ShareOption, PlatformColor> = {\n native: { bg: \"#7c3aed\", text: \"#ffffff\" },\n copy: { bg: \"#3b82f6\", text: \"#ffffff\" },\n download: { bg: \"#ef4444\", text: \"#ffffff\" },\n whatsapp: { bg: \"#25D366\", text: \"#ffffff\" },\n telegram: { bg: \"#229ED9\", text: \"#ffffff\" },\n instagram: { bg: \"#E1306C\", text: \"#ffffff\" },\n facebook: { bg: \"#1877F2\", text: \"#ffffff\" },\n snapchat: { bg: \"#FFFC00\", text: \"#000000\" },\n sms: { bg: \"#22c55e\", text: \"#ffffff\" },\n email: { bg: \"#f97316\", text: \"#ffffff\" },\n linkedin: { bg: \"#0A66C2\", text: \"#ffffff\" },\n reddit: { bg: \"#FF4500\", text: \"#ffffff\" },\n x: { bg: \"#000000\", text: \"#ffffff\" },\n tiktok: { bg: \"#000000\", text: \"#ffffff\" },\n threads: { bg: \"#000000\", text: \"#ffffff\" },\n} as const;\n\n/** Platform labels (SOURCE OF TRUTH) */\nexport const PLATFORM_LABELS: Record<ShareOption, string> = {\n native: \"Share…\",\n copy: \"Copy\",\n download: \"Download\",\n whatsapp: \"WhatsApp\",\n telegram: \"Telegram\",\n instagram: \"Instagram\",\n facebook: \"Facebook\",\n snapchat: \"Snapchat\",\n sms: \"SMS\",\n email: \"Email\",\n linkedin: \"LinkedIn\",\n reddit: \"Reddit\",\n x: \"X\",\n tiktok: \"TikTok\",\n threads: \"Threads\",\n} as const;\n\n/** Platform icons - React components (SOURCE OF TRUTH) */\nexport const PLATFORM_ICONS: Record<ShareOption, (props: { size?: number; className?: string }) => ReactNode> = {\n native: ({ size = 22, className }) => <LuSend size={size} className={className} />,\n copy: ({ size = 22, className }) => <LuLink size={size} className={className} />,\n download: ({ size = 22, className }) => <LuDownload size={size} className={className} />,\n whatsapp: ({ size = 22, className }) => <FaWhatsapp size={size} className={className} />,\n telegram: ({ size = 22, className }) => <FaTelegramPlane size={size} className={className} />,\n instagram: ({ size = 22, className }) => <FaInstagram size={size} className={className} />,\n facebook: ({ size = 22, className }) => <FaFacebookF size={size} className={className} />,\n snapchat: ({ size = 22, className }) => <FaSnapchat size={size} className={className} />,\n sms: ({ size = 22, className }) => <LuMessageCircle size={size} className={className} />,\n email: ({ size = 22, className }) => <LuMail size={size} className={className} />,\n linkedin: ({ size = 22, className }) => <FaLinkedin size={size} className={className} />,\n reddit: ({ size = 22, className }) => <FaReddit size={size} className={className} />,\n x: ({ size = 22, className }) => <FaXTwitter size={size} className={className} />,\n tiktok: ({ size = 22, className }) => <FaTiktok size={size} className={className} />,\n threads: ({ size = 22, className }) => <FaThreads size={size} className={className} />,\n} as const;\n\n/** CSS variable names for platform backgrounds */\nexport const PLATFORM_CSS_VARS: Record<ShareOption, string> = {\n native: \"--sharesheet-native-bg\",\n copy: \"--sharesheet-copy-bg\",\n download: \"--sharesheet-download-bg\",\n whatsapp: \"--sharesheet-whatsapp-bg\",\n telegram: \"--sharesheet-telegram-bg\",\n instagram: \"--sharesheet-instagram-bg\",\n facebook: \"--sharesheet-facebook-bg\",\n snapchat: \"--sharesheet-snapchat-bg\",\n sms: \"--sharesheet-sms-bg\",\n email: \"--sharesheet-email-bg\",\n linkedin: \"--sharesheet-linkedin-bg\",\n reddit: \"--sharesheet-reddit-bg\",\n x: \"--sharesheet-x-bg\",\n tiktok: \"--sharesheet-tiktok-bg\",\n threads: \"--sharesheet-threads-bg\",\n} as const;\n\n/** Full platform configurations */\nexport const PLATFORMS: Record<ShareOption, PlatformConfig> = Object.fromEntries(\n PLATFORM_IDS.map((id) => [\n id,\n {\n id,\n label: PLATFORM_LABELS[id],\n colors: PLATFORM_COLORS[id],\n Icon: PLATFORM_ICONS[id],\n cssVar: PLATFORM_CSS_VARS[id],\n },\n ])\n) as Record<ShareOption, PlatformConfig>;\n\n/** Get platform config by id */\nexport function getPlatform(id: ShareOption): PlatformConfig {\n return PLATFORMS[id];\n}\n\n/** Get all platform configs as array */\nexport function getAllPlatforms(): PlatformConfig[] {\n return PLATFORM_IDS.map((id) => PLATFORMS[id]);\n}\n\n/** Get platform color */\nexport function getPlatformColor(id: ShareOption): PlatformColor {\n return PLATFORM_COLORS[id];\n}\n\n/** Get platform icon component */\nexport function getPlatformIcon(id: ShareOption): (props: { size?: number; className?: string }) => ReactNode {\n return PLATFORM_ICONS[id];\n}\n\n/** Get platform label */\nexport function getPlatformLabel(id: ShareOption): string {\n return PLATFORM_LABELS[id];\n}\n\n/** Generate CSS variable defaults from platform colors */\nexport function generateCssVarDefaults(): Record<string, string> {\n const defaults: Record<string, string> = {};\n PLATFORM_IDS.forEach((id) => {\n defaults[PLATFORM_CSS_VARS[id]] = PLATFORM_COLORS[id].bg;\n });\n return defaults;\n}\n"],"mappings":"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","names":[]}
package/dist/index.d.mts CHANGED
@@ -1,7 +1,7 @@
1
1
  export { ShareMenuContent, ShareSheetContent } from './content.mjs';
2
2
  export { ShareMenuDrawer, ShareSheetDrawer } from './drawer.mjs';
3
- export { M as MOBILE_ONLY_PLATFORMS, m as MOBILE_PREFERRED_PLATFORMS, O as OGData, c as UseShareMenuOptions, U as UseShareSheetOptions, k as checkPlatformAvailability, d as clearOGCache, e as cn, f as fetchOGData, l as getAllPlatformAvailability, g as getSafeUrl, j as isAndroidDevice, h as isIOSDevice, i as isMobileDevice, r as openInstagram, v as openThreads, t as openTikTok, o as openUrl, q as shareToFacebook, A as shareToLinkedIn, B as shareToReddit, x as shareToSnapchat, n as shareToTelegram, s as shareToWhatsApp, p as shareToX, z as shareViaEmail, y as shareViaSMS, b as useOGData, a as useShareMenu, u as useShareSheet, w as warnUnavailablePlatform } from './headless-x5iUF86E.mjs';
4
- export { l as CSS_VARS, C as CSS_VARS_UI, m as CSS_VAR_DEFAULTS, k as CSS_VAR_UI_DEFAULTS, n as PLATFORMS, p as PLATFORM_COLORS, s as PLATFORM_CSS_VARS, q as PLATFORM_ICONS, o as PLATFORM_IDS, r as PLATFORM_LABELS, P as PlatformAvailability, A as PlatformColor, z as PlatformConfig, i as ShareButtonConfig, f as ShareMenuContentClassNames, d as ShareMenuContentProps, g as ShareMenuDrawerClassNames, e as ShareMenuDrawerProps, h as ShareOption, b as ShareSheetContentClassNames, S as ShareSheetContentProps, c as ShareSheetDrawerClassNames, a as ShareSheetDrawerProps, j as UseShareMenuReturn, U as UseShareSheetReturn, y as generateCssVarDefaults, u as getAllPlatforms, t as getPlatform, v as getPlatformColor, w as getPlatformIcon, x as getPlatformLabel } from './platforms-BtmTZmgl.mjs';
3
+ export { M as MOBILE_ONLY_PLATFORMS, k as MOBILE_PREFERRED_PLATFORMS, c as UseShareMenuOptions, U as UseShareSheetOptions, h as checkPlatformAvailability, d as cn, j as getAllPlatformAvailability, g as getSafeUrl, f as isAndroidDevice, e as isIOSDevice, i as isMobileDevice, p as openInstagram, r as openThreads, q as openTikTok, o as openUrl, n as shareToFacebook, y as shareToLinkedIn, z as shareToReddit, t as shareToSnapchat, l as shareToTelegram, s as shareToWhatsApp, m as shareToX, x as shareViaEmail, v as shareViaSMS, b as useOGData, a as useShareMenu, u as useShareSheet, w as warnUnavailablePlatform } from './headless-JYVQPj9Q.mjs';
4
+ export { o as CSS_VARS, C as CSS_VARS_UI, p as CSS_VAR_DEFAULTS, n as CSS_VAR_UI_DEFAULTS, O as OGData, a as OGFetcher, q as PLATFORMS, s as PLATFORM_COLORS, v as PLATFORM_CSS_VARS, t as PLATFORM_ICONS, r as PLATFORM_IDS, u as PLATFORM_LABELS, P as PlatformAvailability, E as PlatformColor, D as PlatformConfig, l as ShareButtonConfig, i as ShareMenuContentClassNames, g as ShareMenuContentProps, j as ShareMenuDrawerClassNames, h as ShareMenuDrawerProps, k as ShareOption, d as ShareSheetContentClassNames, S as ShareSheetContentProps, e as ShareSheetDrawerClassNames, b as ShareSheetDrawerProps, m as UseShareMenuReturn, U as UseShareSheetReturn, c as clearOGCache, f as fetchOGData, B as generateCssVarDefaults, x as getAllPlatforms, w as getPlatform, y as getPlatformColor, z as getPlatformIcon, A as getPlatformLabel } from './platforms-B1VXTDkO.mjs';
5
5
  import 'react/jsx-runtime';
6
6
  import 'clsx';
7
7
  import 'react';
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  export { ShareMenuContent, ShareSheetContent } from './content.js';
2
2
  export { ShareMenuDrawer, ShareSheetDrawer } from './drawer.js';
3
- export { M as MOBILE_ONLY_PLATFORMS, m as MOBILE_PREFERRED_PLATFORMS, O as OGData, c as UseShareMenuOptions, U as UseShareSheetOptions, k as checkPlatformAvailability, d as clearOGCache, e as cn, f as fetchOGData, l as getAllPlatformAvailability, g as getSafeUrl, j as isAndroidDevice, h as isIOSDevice, i as isMobileDevice, r as openInstagram, v as openThreads, t as openTikTok, o as openUrl, q as shareToFacebook, A as shareToLinkedIn, B as shareToReddit, x as shareToSnapchat, n as shareToTelegram, s as shareToWhatsApp, p as shareToX, z as shareViaEmail, y as shareViaSMS, b as useOGData, a as useShareMenu, u as useShareSheet, w as warnUnavailablePlatform } from './headless-lxSw27f0.js';
4
- export { l as CSS_VARS, C as CSS_VARS_UI, m as CSS_VAR_DEFAULTS, k as CSS_VAR_UI_DEFAULTS, n as PLATFORMS, p as PLATFORM_COLORS, s as PLATFORM_CSS_VARS, q as PLATFORM_ICONS, o as PLATFORM_IDS, r as PLATFORM_LABELS, P as PlatformAvailability, A as PlatformColor, z as PlatformConfig, i as ShareButtonConfig, f as ShareMenuContentClassNames, d as ShareMenuContentProps, g as ShareMenuDrawerClassNames, e as ShareMenuDrawerProps, h as ShareOption, b as ShareSheetContentClassNames, S as ShareSheetContentProps, c as ShareSheetDrawerClassNames, a as ShareSheetDrawerProps, j as UseShareMenuReturn, U as UseShareSheetReturn, y as generateCssVarDefaults, u as getAllPlatforms, t as getPlatform, v as getPlatformColor, w as getPlatformIcon, x as getPlatformLabel } from './platforms-BtmTZmgl.js';
3
+ export { M as MOBILE_ONLY_PLATFORMS, k as MOBILE_PREFERRED_PLATFORMS, c as UseShareMenuOptions, U as UseShareSheetOptions, h as checkPlatformAvailability, d as cn, j as getAllPlatformAvailability, g as getSafeUrl, f as isAndroidDevice, e as isIOSDevice, i as isMobileDevice, p as openInstagram, r as openThreads, q as openTikTok, o as openUrl, n as shareToFacebook, y as shareToLinkedIn, z as shareToReddit, t as shareToSnapchat, l as shareToTelegram, s as shareToWhatsApp, m as shareToX, x as shareViaEmail, v as shareViaSMS, b as useOGData, a as useShareMenu, u as useShareSheet, w as warnUnavailablePlatform } from './headless-CEUr7QJE.js';
4
+ export { o as CSS_VARS, C as CSS_VARS_UI, p as CSS_VAR_DEFAULTS, n as CSS_VAR_UI_DEFAULTS, O as OGData, a as OGFetcher, q as PLATFORMS, s as PLATFORM_COLORS, v as PLATFORM_CSS_VARS, t as PLATFORM_ICONS, r as PLATFORM_IDS, u as PLATFORM_LABELS, P as PlatformAvailability, E as PlatformColor, D as PlatformConfig, l as ShareButtonConfig, i as ShareMenuContentClassNames, g as ShareMenuContentProps, j as ShareMenuDrawerClassNames, h as ShareMenuDrawerProps, k as ShareOption, d as ShareSheetContentClassNames, S as ShareSheetContentProps, e as ShareSheetDrawerClassNames, b as ShareSheetDrawerProps, m as UseShareMenuReturn, U as UseShareSheetReturn, c as clearOGCache, f as fetchOGData, B as generateCssVarDefaults, x as getAllPlatforms, w as getPlatform, y as getPlatformColor, z as getPlatformIcon, A as getPlatformLabel } from './platforms-B1VXTDkO.js';
5
5
  import 'react/jsx-runtime';
6
6
  import 'clsx';
7
7
  import 'react';
package/dist/index.js CHANGED
@@ -476,10 +476,14 @@ function useShareSheet({
476
476
  shareReddit
477
477
  };
478
478
  }
479
- function useOGData(url) {
479
+ function useOGData(url, fetcher = fetchOGData) {
480
480
  const [ogData, setOgData] = (0, import_react.useState)(null);
481
481
  const [loading, setLoading] = (0, import_react.useState)(false);
482
482
  const [error, setError] = (0, import_react.useState)(null);
483
+ const fetcherRef = (0, import_react.useRef)(fetcher);
484
+ (0, import_react.useEffect)(() => {
485
+ fetcherRef.current = fetcher;
486
+ });
483
487
  (0, import_react.useEffect)(() => {
484
488
  if (!url) {
485
489
  setOgData(null);
@@ -490,7 +494,7 @@ function useOGData(url) {
490
494
  let cancelled = false;
491
495
  setLoading(true);
492
496
  setError(null);
493
- fetchOGData(url).then((data) => {
497
+ fetcherRef.current(url).then((data) => {
494
498
  if (!cancelled) {
495
499
  setOgData(data);
496
500
  setLoading(false);
@@ -704,6 +708,7 @@ function ShareSheetContent({
704
708
  downloadUrl,
705
709
  downloadFilename,
706
710
  previewImage,
711
+ fetchPreview,
707
712
  shareFile,
708
713
  shareFilename,
709
714
  className,
@@ -721,7 +726,7 @@ function ShareSheetContent({
721
726
  }) {
722
727
  const [imageLoaded, setImageLoaded] = (0, import_react2.useState)(false);
723
728
  const [imageError, setImageError] = (0, import_react2.useState)(false);
724
- const { ogData, loading: ogLoading } = useOGData(previewImage ? void 0 : shareUrl);
729
+ const { ogData, loading: ogLoading } = useOGData(previewImage || !fetchPreview ? void 0 : shareUrl, fetchPreview);
725
730
  const handleImageLoad = (0, import_react2.useCallback)(() => {
726
731
  setImageLoaded(true);
727
732
  }, []);
@@ -1071,6 +1076,7 @@ function ShareSheetDrawer({
1071
1076
  downloadUrl,
1072
1077
  downloadFilename,
1073
1078
  previewImage,
1079
+ fetchPreview,
1074
1080
  shareFile,
1075
1081
  shareFilename,
1076
1082
  disabled,
@@ -1145,6 +1151,7 @@ function ShareSheetDrawer({
1145
1151
  downloadUrl,
1146
1152
  downloadFilename,
1147
1153
  previewImage,
1154
+ fetchPreview,
1148
1155
  shareFile,
1149
1156
  shareFilename,
1150
1157
  className,