{"version":3,"file":"index.cjs","names":["createContext","useState","useRef","useMemo","useCallback","useContext","useCallback","NextScript","useRef","useCallback","isValidElement","cloneElement","useCallback","useRef","useCallback","API_ROUTES","useRef","useRef","useCallback","API_ROUTES","isNavigationType"],"sources":["../src/client/context.ts","../src/client/identity.ts","../src/client/provider.tsx","../src/client/components/Analytics.tsx","../src/client/hooks/useEntrolytics.ts","../src/client/components/OutboundLink.tsx","../src/client/components/Script.tsx","../src/client/components/TrackEvent.tsx","../src/client/hooks/useEventTracker.ts","../src/client/hooks/useFormTracking.ts","../src/client/hooks/usePageView.ts","../src/client/hooks/useWebVitals.ts"],"sourcesContent":["'use client';\n\nimport { createContext } from 'react';\nimport type { EntrolyticsContextValue } from '../types';\n\nexport const EntrolyticsContext = createContext<EntrolyticsContextValue | null>(null);\n","'use client';\n\nexport function generateUuid(): string {\n  if (\n    typeof globalThis.crypto !== 'undefined' &&\n    typeof globalThis.crypto.randomUUID === 'function'\n  ) {\n    return globalThis.crypto.randomUUID();\n  }\n\n  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\n    const r = Math.floor(Math.random() * 16);\n    const v = c === 'x' ? r : (r & 0x3) | 0x8;\n    return v.toString(16);\n  });\n}\n\nconst SESSION_KEY = '__entro_sid';\nconst SESSION_IDLE_MS = 30 * 60 * 1000;\nlet visitorDay: string | undefined;\nlet visitorId: string | undefined;\n\nexport function getOrCreateSessionId(): string {\n  if (typeof window === 'undefined') return generateUuid();\n\n  const now = Date.now();\n  try {\n    const stored = JSON.parse(window.sessionStorage.getItem(SESSION_KEY) ?? 'null') as unknown;\n    if (\n      typeof stored === 'object' &&\n      stored !== null &&\n      'id' in stored &&\n      'lastActivity' in stored &&\n      typeof stored.id === 'string' &&\n      typeof stored.lastActivity === 'number' &&\n      now - stored.lastActivity < SESSION_IDLE_MS\n    ) {\n      window.sessionStorage.setItem(\n        SESSION_KEY,\n        JSON.stringify({ id: stored.id, lastActivity: now }),\n      );\n      return stored.id;\n    }\n  } catch {\n    // Storage can be unavailable; generate an in-memory session.\n  }\n\n  const sessionId = generateUuid();\n  try {\n    window.sessionStorage.setItem(\n      SESSION_KEY,\n      JSON.stringify({ id: sessionId, lastActivity: now }),\n    );\n  } catch {\n    // Storage can be unavailable; return the generated session.\n  }\n  return sessionId;\n}\n\nexport function getOrCreateVisitorId(): string {\n  const currentDay = new Date().toISOString().slice(0, 10);\n  if (!visitorId || visitorDay !== currentDay) {\n    visitorDay = currentDay;\n    visitorId = generateUuid();\n  }\n  return visitorId;\n}\n\nexport function buildCollectionHeaders(): Record<string, string> {\n  return {\n    'Content-Type': 'application/json',\n  };\n}\n","'use client';\n\nimport React, { type ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type {\n  EnhancedIdentityData,\n  EntrolyticsConfig,\n  EntrolyticsContextValue,\n  EventData,\n  EventPayload,\n  IdentifyPayload,\n  PayloadType,\n  TrackedProperties,\n} from '../types';\nimport { EntrolyticsContext } from './context';\nimport { generateUuid, getOrCreateSessionId, getOrCreateVisitorId } from './identity';\n\ndeclare global {\n  interface Window {\n    entrolytics?: {\n      track: EntrolyticsContextValue['track'];\n      identify: EntrolyticsContextValue['identify'];\n    };\n  }\n}\n\ninterface EntrolyticsProviderProps extends EntrolyticsConfig {\n  children: ReactNode;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n  return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function EntrolyticsProvider({\n  children,\n  websiteId,\n  clientKey,\n  host,\n  autoTrack = true,\n  tag: initialTag,\n  domains,\n  excludeSearch = false,\n  excludeHash = false,\n  respectDoNotTrack = false,\n  consentGranted = false,\n  ignoreLocalhost = false,\n  beforeSend,\n  trackOutboundLinks = false,\n  outboundLinkEvent = 'outbound-link-click',\n  proxy = false,\n  scriptName = 'script.js',\n  debug = false,\n}: EntrolyticsProviderProps) {\n  const [isReady, setIsReady] = useState(false);\n  const [isEnabled, setIsEnabled] = useState(true);\n  const [currentTag, setCurrentTag] = useState(initialTag);\n  const [identity, setIdentity] = useState<string | undefined>();\n  const cacheRef = useRef<string | undefined>(undefined);\n  const currentUrlRef = useRef<string>('');\n  const currentRefRef = useRef<string>('');\n  const missingClientKeyWarned = useRef(false);\n\n  // Determine endpoint\n  const endpoint = useMemo(() => {\n    if (proxy && typeof proxy === 'object' && proxy.enabled) {\n      return proxy.collectPath || '/api/collect';\n    }\n\n    const endpointPath = '/collect';\n\n    if (host) {\n      return `${host.replace(/\\/$/, '')}${endpointPath}`;\n    }\n    return endpointPath;\n  }, [host, proxy]);\n\n  // Check if tracking should be disabled\n  const checkTrackingDisabled = useCallback((): boolean => {\n    if (typeof window === 'undefined') return true;\n    if (!websiteId) return true;\n    if (!isEnabled) return true;\n\n    // Check localStorage disable flag\n    if (typeof localStorage !== 'undefined') {\n      if (localStorage.getItem('entrolytics.disabled')) return true;\n    }\n\n    // Check domain restrictions\n    if (domains && domains.length > 0) {\n      if (!domains.includes(window.location.hostname)) return true;\n    }\n\n    // Check localhost\n    if (ignoreLocalhost) {\n      const { hostname } = window.location;\n      if (hostname === 'localhost' || hostname === '127.0.0.1') return true;\n    }\n\n    // Check Do Not Track\n    if (respectDoNotTrack) {\n      const microsoftDnt =\n        'msDoNotTrack' in navigator && typeof navigator.msDoNotTrack === 'string'\n          ? navigator.msDoNotTrack\n          : undefined;\n      const windowDnt =\n        'doNotTrack' in window && typeof window.doNotTrack === 'string'\n          ? window.doNotTrack\n          : undefined;\n      const dnt = navigator.doNotTrack || microsoftDnt || windowDnt;\n      if (dnt === '1' || dnt === 'yes') return true;\n    }\n\n    return false;\n  }, [websiteId, isEnabled, domains, ignoreLocalhost, respectDoNotTrack]);\n\n  // Get current payload\n  const getPayload = useCallback((): TrackedProperties => {\n    const { screen, navigator, location, document } = window;\n\n    const payload: TrackedProperties = {\n      hostname: location.hostname,\n      screen: `${screen.width}x${screen.height}`,\n      language: navigator.language,\n      title: document.title,\n      url: currentUrlRef.current || location.pathname + location.search + location.hash,\n      referrer: currentRefRef.current,\n      tag: currentTag,\n      id: identity,\n    };\n\n    if (websiteId) payload.website = websiteId;\n\n    return payload;\n  }, [websiteId, currentTag, identity]);\n\n  // Debug logger\n  const log = useCallback(\n    (...args: unknown[]) => {\n      if (debug) {\n        console.log('[Entrolytics]', ...args);\n      }\n    },\n    [debug],\n  );\n\n  const toAbsoluteUrl = useCallback((rawUrl: string): string => {\n    if (/^https?:\\/\\//i.test(rawUrl)) {\n      return rawUrl;\n    }\n\n    if (typeof window === 'undefined') {\n      const normalized = rawUrl.startsWith('/') ? rawUrl : `/${rawUrl}`;\n      return `https://localhost${normalized}`;\n    }\n\n    try {\n      return new URL(rawUrl, window.location.origin).toString();\n    } catch {\n      return window.location.href;\n    }\n  }, []);\n\n  const toValidReferrer = useCallback((rawReferrer?: string): string | undefined => {\n    if (!rawReferrer) return undefined;\n    if (/^https?:\\/\\//i.test(rawReferrer)) {\n      return rawReferrer;\n    }\n    return undefined;\n  }, []);\n\n  // Send data to endpoint\n  const send = useCallback(\n    async (payload: EventPayload | IdentifyPayload, type: PayloadType = 'event'): Promise<void> => {\n      if (checkTrackingDisabled()) {\n        log('Tracking disabled, skipping', type);\n        return;\n      }\n\n      if (!websiteId) {\n        log('websiteId is required for collect tracking, skipping');\n        return;\n      }\n\n      if (!clientKey) {\n        if (!missingClientKeyWarned.current) {\n          log('clientKey is required for collect tracking, skipping until configured');\n          missingClientKeyWarned.current = true;\n        }\n        return;\n      }\n\n      let finalPayload = payload;\n\n      // Apply beforeSend callback\n      if (beforeSend) {\n        const result = beforeSend(type, payload);\n        if (!result) {\n          log('beforeSend returned falsy, skipping', type);\n          return;\n        }\n        finalPayload = result;\n      }\n\n      log('Sending', type, finalPayload);\n\n      try {\n        const eventPayload = finalPayload as Partial<EventPayload> & Partial<TrackedProperties>;\n        const rawUrl =\n          typeof eventPayload.url === 'string' && eventPayload.url.length > 0\n            ? eventPayload.url\n            : currentUrlRef.current || window.location.pathname + window.location.search;\n\n        const url = toAbsoluteUrl(rawUrl);\n        const sessionId = getOrCreateSessionId();\n        const visitorId = getOrCreateVisitorId();\n\n        const properties: Record<string, unknown> = {\n          ...(eventPayload.data && typeof eventPayload.data === 'object' ? eventPayload.data : {}),\n        };\n\n        if (eventPayload.tag) properties.tag = eventPayload.tag;\n        if (eventPayload.id) properties.distinctId = eventPayload.id;\n\n        if (type === 'identify') {\n          properties.identify = true;\n        }\n\n        const eventName =\n          typeof eventPayload.name === 'string' && eventPayload.name.length > 0\n            ? eventPayload.name\n            : type === 'identify'\n              ? 'identify'\n              : undefined;\n\n        const eventType = eventName ? 'custom_event' : 'pageview';\n        const parsedUrl = new URL(url);\n        const normalizedReferrer = toValidReferrer(eventPayload.referrer);\n\n        const collectPayload = {\n          websiteId,\n          clientKey,\n          eventId: generateUuid(),\n          timestamp: new Date().toISOString(),\n          consent: consentGranted,\n          sessionId,\n          visitorId,\n          url,\n          eventType,\n          ...(eventName && { eventName }),\n          ...(normalizedReferrer && { referrer: normalizedReferrer }),\n          screenWidth: window.screen.width,\n          screenHeight: window.screen.height,\n          ...(parsedUrl.searchParams.get('utm_source') && {\n            utmSource: parsedUrl.searchParams.get('utm_source'),\n          }),\n          ...(parsedUrl.searchParams.get('utm_medium') && {\n            utmMedium: parsedUrl.searchParams.get('utm_medium'),\n          }),\n          ...(parsedUrl.searchParams.get('utm_campaign') && {\n            utmCampaign: parsedUrl.searchParams.get('utm_campaign'),\n          }),\n          ...(parsedUrl.searchParams.get('utm_term') && {\n            utmTerm: parsedUrl.searchParams.get('utm_term'),\n          }),\n          ...(parsedUrl.searchParams.get('utm_content') && {\n            utmContent: parsedUrl.searchParams.get('utm_content'),\n          }),\n          ...(Object.keys(properties).length > 0 && { properties }),\n        };\n\n        const res = await fetch(endpoint, {\n          method: 'POST',\n          body: JSON.stringify(collectPayload),\n          headers: {\n            'Content-Type': 'application/json',\n            ...(cacheRef.current && { 'x-entrolytics-cache': cacheRef.current }),\n          },\n          credentials: 'omit',\n          keepalive: true,\n        });\n\n        const responseText = await res.text();\n        if (responseText) {\n          try {\n            const data: unknown = JSON.parse(responseText);\n            if (isRecord(data)) {\n              if (data.disabled === true) setIsEnabled(false);\n              if (typeof data.cache === 'string') cacheRef.current = data.cache;\n            }\n          } catch {\n            // Non-JSON response is acceptable for fire-and-forget endpoint\n          }\n        }\n      } catch (error) {\n        log('Error sending', type, error);\n      }\n    },\n    [\n      clientKey,\n      endpoint,\n      checkTrackingDisabled,\n      beforeSend,\n      consentGranted,\n      log,\n      websiteId,\n      toAbsoluteUrl,\n      toValidReferrer,\n    ],\n  );\n\n  // Track function with multiple overloads\n  const track = useCallback(\n    async (\n      nameOrPayloadOrFn?:\n        | string\n        | Partial<EventPayload>\n        | ((props: TrackedProperties) => EventPayload),\n      data?: EventData,\n    ): Promise<void> => {\n      const basePayload = getPayload();\n\n      if (typeof nameOrPayloadOrFn === 'function') {\n        return send(nameOrPayloadOrFn(basePayload));\n      }\n\n      if (typeof nameOrPayloadOrFn === 'object') {\n        return send({ ...basePayload, ...nameOrPayloadOrFn });\n      }\n\n      if (typeof nameOrPayloadOrFn === 'string') {\n        return send({ ...basePayload, name: nameOrPayloadOrFn, data });\n      }\n\n      return send(basePayload);\n    },\n    [getPayload, send],\n  );\n\n  // Track page view\n  const trackView = useCallback(\n    async (url?: string, referrer?: string): Promise<void> => {\n      const payload = getPayload();\n      if (url) payload.url = url;\n      if (referrer) payload.referrer = referrer;\n      return send(payload);\n    },\n    [getPayload, send],\n  );\n\n  // Identify function\n  const identify = useCallback(\n    async (idOrData?: string | EventData, data?: EventData): Promise<void> => {\n      const payload = getPayload();\n\n      if (typeof idOrData === 'string') {\n        setIdentity(idOrData);\n        payload.id = idOrData;\n        cacheRef.current = undefined; // Reset cache on identify\n        return send({ ...payload, data }, 'identify');\n      }\n\n      if (typeof idOrData === 'object') {\n        return send({ ...payload, data: idOrData }, 'identify');\n      }\n\n      return send(payload, 'identify');\n    },\n    [getPayload, send],\n  ) as EntrolyticsContextValue['identify'];\n\n  // Track revenue\n  const trackRevenue = useCallback(\n    async (eventName: string, revenue: number, currency = 'USD'): Promise<void> => {\n      if (!Number.isFinite(revenue)) {\n        log('Invalid revenue amount', revenue);\n        return;\n      }\n\n      const payload = getPayload();\n      return send({\n        ...payload,\n        name: eventName,\n        data: {\n          revenue,\n          currency: currency.toUpperCase().slice(0, 3),\n        },\n      });\n    },\n    [getPayload, send, log],\n  );\n\n  // Track outbound link\n  const trackOutboundLink = useCallback(\n    async (url: string, data?: EventData): Promise<void> => {\n      const payload = getPayload();\n      return send({\n        ...payload,\n        name: outboundLinkEvent,\n        data: {\n          ...data,\n          url,\n        },\n      });\n    },\n    [getPayload, send, outboundLinkEvent],\n  );\n\n  // Set tag\n  const setTag = useCallback((tag: string) => {\n    setCurrentTag(tag);\n  }, []);\n\n  // Generate enhanced identity data\n  const generateEnhancedIdentity = useCallback(\n    (data?: Record<string, string | number | boolean | undefined>): EnhancedIdentityData => {\n      if (typeof window === 'undefined') return { ...data };\n\n      const connection = (navigator as Navigator & { connection?: { effectiveType?: string } })\n        .connection;\n\n      return {\n        ...data,\n        timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n        theme: window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light',\n        connectionType: connection?.effectiveType,\n        touchCapable: 'ontouchstart' in window || navigator.maxTouchPoints > 0,\n        orientation: screen.orientation?.type,\n        devicePixelRatio: window.devicePixelRatio,\n        platform: navigator.platform,\n      };\n    },\n    [],\n  );\n\n  // Initialize URL tracking\n  useEffect(() => {\n    if (typeof window === 'undefined') return;\n\n    const { location, document } = window;\n    let url = location.pathname + location.search + location.hash;\n\n    if (excludeSearch) {\n      const urlObj = new URL(url, location.origin);\n      urlObj.search = '';\n      url = urlObj.pathname + urlObj.hash;\n    }\n\n    if (excludeHash) {\n      const urlObj = new URL(url, location.origin);\n      urlObj.hash = '';\n      url = urlObj.pathname + urlObj.search;\n    }\n\n    currentUrlRef.current = url;\n    currentRefRef.current = document.referrer.startsWith(location.origin) ? '' : document.referrer;\n\n    setIsReady(true);\n  }, [excludeSearch, excludeHash]);\n\n  // Auto-track initial page view\n  useEffect(() => {\n    if (!isReady || !autoTrack || checkTrackingDisabled()) return undefined;\n    void track();\n    return undefined;\n  }, [isReady, autoTrack, checkTrackingDisabled, track]);\n\n  // Handle history changes for SPA navigation\n  useEffect(() => {\n    if (typeof window === 'undefined' || !autoTrack) return undefined;\n\n    const handleNavigation = () => {\n      const { location } = window;\n      const previousUrl = currentUrlRef.current;\n\n      let url = location.pathname + location.search + location.hash;\n\n      if (excludeSearch) {\n        const urlObj = new URL(url, location.origin);\n        urlObj.search = '';\n        url = urlObj.pathname + urlObj.hash;\n      }\n\n      if (excludeHash) {\n        const urlObj = new URL(url, location.origin);\n        urlObj.hash = '';\n        url = urlObj.pathname + urlObj.search;\n      }\n\n      if (url !== previousUrl) {\n        currentRefRef.current = previousUrl;\n        currentUrlRef.current = url;\n        // Small delay to ensure page title updates\n        setTimeout(() => track(), 300);\n      }\n    };\n\n    // Hook into history API\n    const originalPushState = history.pushState.bind(history);\n    const originalReplaceState = history.replaceState.bind(history);\n\n    history.pushState = function (...args) {\n      originalPushState(...args);\n      handleNavigation();\n    };\n\n    history.replaceState = function (...args) {\n      originalReplaceState(...args);\n      handleNavigation();\n    };\n\n    window.addEventListener('popstate', handleNavigation);\n\n    return () => {\n      history.pushState = originalPushState;\n      history.replaceState = originalReplaceState;\n      window.removeEventListener('popstate', handleNavigation);\n    };\n  }, [autoTrack, excludeSearch, excludeHash, track]);\n\n  // Setup outbound link tracking\n  useEffect(() => {\n    if (!trackOutboundLinks || typeof window === 'undefined') return undefined;\n\n    const handleClick = (e: MouseEvent) => {\n      if (!(e.target instanceof Element)) return;\n      const target = e.target.closest('a');\n      if (!target) return;\n\n      const href = target.getAttribute('href');\n      if (!href) return;\n\n      try {\n        const url = new URL(href, window.location.origin);\n        if (url.host !== window.location.host) {\n          void trackOutboundLink(href);\n        }\n      } catch {\n        // Invalid URL, skip\n      }\n    };\n\n    document.addEventListener('click', handleClick, true);\n    return () => document.removeEventListener('click', handleClick, true);\n  }, [trackOutboundLinks, trackOutboundLink]);\n\n  // Expose global entrolytics object\n  useEffect(() => {\n    if (typeof window === 'undefined') return undefined;\n\n    window.entrolytics = {\n      track,\n      identify,\n    };\n\n    return () => {\n      delete window.entrolytics;\n    };\n  }, [track, identify]);\n\n  const config = useMemo(\n    () => ({\n      websiteId,\n      clientKey,\n      host,\n      autoTrack,\n      tag: currentTag,\n      domains,\n      excludeSearch,\n      excludeHash,\n      respectDoNotTrack,\n      ignoreLocalhost,\n      beforeSend,\n      trackOutboundLinks,\n      outboundLinkEvent,\n      proxy,\n      scriptName,\n      debug,\n    }),\n    [\n      websiteId,\n      clientKey,\n      host,\n      autoTrack,\n      currentTag,\n      domains,\n      excludeSearch,\n      excludeHash,\n      respectDoNotTrack,\n      ignoreLocalhost,\n      beforeSend,\n      trackOutboundLinks,\n      outboundLinkEvent,\n      proxy,\n      scriptName,\n      debug,\n    ],\n  );\n\n  const value = useMemo<EntrolyticsContextValue>(\n    () => ({\n      track,\n      trackView,\n      identify,\n      trackRevenue,\n      trackOutboundLink,\n      setTag,\n      generateEnhancedIdentity,\n      isReady,\n      isEnabled,\n      config,\n    }),\n    [\n      track,\n      trackView,\n      identify,\n      trackRevenue,\n      trackOutboundLink,\n      setTag,\n      generateEnhancedIdentity,\n      isReady,\n      isEnabled,\n      config,\n    ],\n  );\n\n  return <EntrolyticsContext.Provider value={value}>{children}</EntrolyticsContext.Provider>;\n}\n","'use client';\n\nimport React, { type ReactNode } from 'react';\nimport type { EntrolyticsConfig } from '../../types';\nimport { EntrolyticsProvider } from '../provider';\n\nexport interface AnalyticsProps extends Partial<EntrolyticsConfig> {\n  /**\n   * Website ID - defaults to NEXT_PUBLIC_ENTROLYTICS_WEBSITE_ID\n   */\n  websiteId?: string;\n  /**\n   * API host - defaults to NEXT_PUBLIC_ENTROLYTICS_HOST\n   */\n  host?: string;\n  /**\n   * Optional children to wrap (rarely needed)\n   */\n  children?: ReactNode;\n}\n\n/**\n * Zero-config Analytics component that automatically reads from environment variables.\n *\n * @example\n * ```tsx\n * // app/layout.tsx\n * import { Analytics } from '@entrolytics/nextjs';\n *\n * export default function RootLayout({ children }) {\n *   return (\n *     <html>\n *       <body>\n *         {children}\n *         <Analytics />\n *       </body>\n *     </html>\n *   );\n * }\n * ```\n *\n * Environment variables (in .env.local):\n * - NEXT_PUBLIC_ENTROLYTICS_WEBSITE_ID (required)\n * - NEXT_PUBLIC_ENTROLYTICS_HOST (optional)\n */\nexport function Analytics({ websiteId, host, children, ...config }: AnalyticsProps) {\n  const finalWebsiteId = websiteId || process.env.NEXT_PUBLIC_ENTROLYTICS_WEBSITE_ID;\n  const finalHost = host || process.env.NEXT_PUBLIC_ENTROLYTICS_HOST;\n\n  // Show helpful warnings in development\n  if (process.env.NODE_ENV === 'development') {\n    if (!finalWebsiteId) {\n      console.warn(\n        '[Entrolytics] Missing NEXT_PUBLIC_ENTROLYTICS_WEBSITE_ID environment variable. Add it to .env.local or pass as prop.',\n      );\n      return null;\n    }\n\n    if (config.debug) {\n      console.log('[Entrolytics] Initialized with:', {\n        websiteId: finalWebsiteId,\n        host: finalHost || 'default',\n        config,\n      });\n    }\n  }\n\n  // In production, silently skip if no website ID\n  if (!finalWebsiteId) {\n    return null;\n  }\n\n  return (\n    <EntrolyticsProvider websiteId={finalWebsiteId} host={finalHost} {...config}>\n      {children}\n    </EntrolyticsProvider>\n  );\n}\n","'use client';\n\nimport { useContext } from 'react';\nimport type { EntrolyticsContextValue } from '../../types';\nimport { EntrolyticsContext } from '../context';\n\n/**\n * Hook to access Entrolytics tracking functions.\n *\n * @example\n * ```tsx\n * const { track, identify, trackRevenue } = useEntrolytics();\n *\n * // Track a page view\n * track();\n *\n * // Track an event\n * track('button-click');\n *\n * // Track an event with data\n * track('signup', { plan: 'premium' });\n *\n * // Identify a user\n * identify('user-123', { email: 'user@example.com' });\n *\n * // Track revenue\n * trackRevenue('purchase', 99.99, 'USD');\n * ```\n */\nexport function useEntrolytics(): EntrolyticsContextValue {\n  const context = useContext(EntrolyticsContext);\n\n  if (!context) {\n    throw new Error('useEntrolytics must be used within an EntrolyticsProvider');\n  }\n\n  return context;\n}\n","'use client';\n\nimport React, { type Ref, useCallback } from 'react';\nimport type { OutboundLinkProps } from '../../types';\nimport { useEntrolytics } from '../hooks/useEntrolytics';\n\n/**\n * Component for tracking outbound link clicks.\n * Uses React 19's ref as prop pattern for better compatibility.\n *\n * @example\n * ```tsx\n * <OutboundLink href=\"https://stripe.com\" data={{ context: 'pricing' }}>\n *   Payment Provider\n * </OutboundLink>\n *\n * <OutboundLink href=\"https://github.com/entro314-labs\" target=\"_blank\">\n *   View on GitHub\n * </OutboundLink>\n * ```\n */\nexport function OutboundLink({\n  href,\n  data,\n  children,\n  onClick,\n  ref,\n  ...props\n}: OutboundLinkProps & { ref?: Ref<HTMLAnchorElement> }) {\n  const { trackOutboundLink, isReady, config } = useEntrolytics();\n\n  const handleClick = useCallback(\n    async (e: React.MouseEvent<HTMLAnchorElement>) => {\n      if (isReady) {\n        const isExternal =\n          props.target === '_blank' ||\n          e.ctrlKey ||\n          e.shiftKey ||\n          e.metaKey ||\n          (e.button && e.button === 1);\n\n        // For internal navigation, prevent default and track first\n        if (!isExternal) {\n          e.preventDefault();\n          await trackOutboundLink(href, data);\n          // Navigate after tracking\n          if (props.target === '_top' && window.top) {\n            window.top.location.href = href;\n          } else {\n            window.location.href = href;\n          }\n        } else {\n          // For external/new tab, track without blocking\n          void trackOutboundLink(href, data);\n        }\n      }\n\n      onClick?.(e);\n    },\n    [isReady, trackOutboundLink, href, data, onClick, props.target],\n  );\n\n  return (\n    <a\n      ref={ref}\n      href={href}\n      onClick={handleClick}\n      data-entrolytics-event={config.outboundLinkEvent}\n      data-entrolytics-event-url={href}\n      {...props}\n    >\n      {children}\n    </a>\n  );\n}\n","'use client';\n\nimport React from 'react';\nimport NextScript from 'next/script';\nimport type { EntrolyticsConfig } from '../../types';\n\ninterface ScriptProps extends Pick<\n  EntrolyticsConfig,\n  'websiteId' | 'host' | 'proxy' | 'scriptName'\n> {\n  /** Additional data attributes */\n  autoTrack?: boolean;\n  domains?: string[];\n  tag?: string;\n  excludeSearch?: boolean;\n  excludeHash?: boolean;\n  respectDoNotTrack?: boolean;\n  beforeSend?: string;\n}\n\n/**\n * Script component for loading the Entrolytics tracker.\n * Use this as an alternative to EntrolyticsProvider when you want\n * to use the traditional script-based tracking.\n *\n * @example\n * ```tsx\n * // In app/layout.tsx\n * import { Script } from '@entrolytics/nextjs';\n *\n * export default function RootLayout({ children }) {\n *   return (\n *     <html>\n *       <head>\n *         <Script\n *           websiteId={process.env.NEXT_PUBLIC_ENTROLYTICS_WEBSITE_ID!}\n *           host={process.env.NEXT_PUBLIC_ENTROLYTICS_HOST}\n *         />\n *       </head>\n *       <body>{children}</body>\n *     </html>\n *   );\n * }\n * ```\n */\nexport function Script({\n  websiteId,\n  host,\n  proxy,\n  scriptName = 'script.js',\n  autoTrack = true,\n  domains,\n  tag,\n  excludeSearch,\n  excludeHash,\n  respectDoNotTrack,\n  beforeSend,\n}: ScriptProps) {\n  // Determine script source\n  let src: string;\n\n  if (proxy && typeof proxy === 'object' && proxy.enabled) {\n    src = proxy.scriptPath || '/analytics.js';\n  } else if (host) {\n    src = `${host.replace(/\\/$/, '')}/${scriptName}`;\n  } else {\n    src = `/${scriptName}`;\n  }\n\n  return (\n    <NextScript\n      src={src}\n      data-website-id={websiteId}\n      data-host-url={host}\n      data-auto-track={autoTrack ? undefined : 'false'}\n      data-domains={domains?.join(',')}\n      data-tag={tag}\n      data-exclude-search={excludeSearch ? 'true' : undefined}\n      data-exclude-hash={excludeHash ? 'true' : undefined}\n      data-do-not-track={respectDoNotTrack ? 'true' : undefined}\n      data-before-send={beforeSend}\n      strategy=\"afterInteractive\"\n    />\n  );\n}\n","'use client';\n\nimport React from 'react';\nimport {\n  cloneElement,\n  isValidElement,\n  type ReactElement,\n  useCallback,\n  useEffect,\n  useRef,\n} from 'react';\nimport type { TrackEventProps } from '../../types';\nimport { useEntrolytics } from '../hooks/useEntrolytics';\n\ninterface TrackedChildProps {\n  onClick?: (event: React.MouseEvent) => void;\n  onSubmit?: (event: React.FormEvent) => void;\n  ref?: React.Ref<HTMLElement>;\n  className?: string;\n}\n\n/**\n * Declarative component for tracking events.\n *\n * @example\n * ```tsx\n * // Track on click (default)\n * <TrackEvent name=\"cta-click\" data={{ location: 'hero' }}>\n *   <button>Get Started</button>\n * </TrackEvent>\n *\n * // Track on visibility (Intersection Observer)\n * <TrackEvent name=\"section-viewed\" trigger=\"visible\" once>\n *   <section>Pricing Content</section>\n * </TrackEvent>\n *\n * // Track on form submit\n * <TrackEvent name=\"form-submit\" trigger=\"submit\">\n *   <form>...</form>\n * </TrackEvent>\n * ```\n */\nexport function TrackEvent({\n  name,\n  data,\n  trigger = 'click',\n  once = false,\n  children,\n  className,\n}: TrackEventProps) {\n  const { track, isReady } = useEntrolytics();\n  const elementRef = useRef<HTMLElement>(null);\n  const hasTrackedRef = useRef(false);\n  const setElementRef = useCallback((element: HTMLElement | null) => {\n    elementRef.current = element;\n  }, []);\n\n  const handleTrack = useCallback(async () => {\n    if (!isReady) return;\n    if (once && hasTrackedRef.current) return;\n\n    if (data) {\n      await track(name, data);\n    } else {\n      await track(name);\n    }\n    hasTrackedRef.current = true;\n  }, [isReady, once, track, name, data]);\n\n  // Keyboard handler for accessible span wrapper\n  const handleKeyDown = useCallback(\n    (e: React.KeyboardEvent) => {\n      if (trigger === 'click' && (e.key === 'Enter' || e.key === ' ')) {\n        e.preventDefault();\n        void handleTrack();\n      }\n    },\n    [trigger, handleTrack],\n  );\n\n  // Handle visibility trigger with Intersection Observer\n  useEffect(() => {\n    if (trigger !== 'visible' || !isReady) return undefined;\n\n    const element = elementRef.current;\n    if (!element) return undefined;\n\n    const observer = new IntersectionObserver(\n      entries => {\n        entries.forEach(entry => {\n          if (entry.isIntersecting) {\n            void handleTrack();\n            if (once) {\n              observer.disconnect();\n            }\n          }\n        });\n      },\n      { threshold: 0.5 },\n    );\n\n    observer.observe(element);\n\n    return () => observer.disconnect();\n  }, [trigger, isReady, handleTrack, once]);\n\n  // Clone child element and attach handlers\n  if (isValidElement<TrackedChildProps>(children)) {\n    const child: ReactElement<TrackedChildProps> = children;\n\n    const props: TrackedChildProps = {\n      ref: setElementRef,\n    };\n\n    if (className) {\n      props.className = child.props.className ? `${child.props.className} ${className}` : className;\n    }\n\n    if (trigger === 'click') {\n      props.onClick = async (e: React.MouseEvent) => {\n        await handleTrack();\n        child.props.onClick?.(e);\n      };\n    }\n\n    if (trigger === 'submit') {\n      props.onSubmit = async (e: React.FormEvent) => {\n        await handleTrack();\n        child.props.onSubmit?.(e);\n      };\n    }\n\n    return cloneElement(child, props);\n  }\n\n  if (trigger === 'click') {\n    return (\n      <button\n        ref={setElementRef}\n        type=\"button\"\n        className={className}\n        onClick={() => {\n          void handleTrack();\n        }}\n        onKeyDown={handleKeyDown}\n      >\n        {children}\n      </button>\n    );\n  }\n\n  return (\n    <span ref={setElementRef} className={className}>\n      {children}\n    </span>\n  );\n}\n","'use client';\n\nimport { useCallback } from 'react';\nimport type { EventData } from '../../types';\nimport { useEntrolytics } from './useEntrolytics';\n\ninterface UseEventTrackerOptions {\n  /** Default event name */\n  eventName?: string;\n  /** Default event data */\n  defaultData?: EventData;\n}\n\ninterface EventTrackerReturn {\n  /** Track an event with optional name and data overrides */\n  trackEvent: (name?: string, data?: EventData) => Promise<void>;\n  /** Create a click handler that tracks an event */\n  createClickHandler: (name?: string, data?: EventData) => (e?: React.MouseEvent) => Promise<void>;\n  /** Whether tracking is ready */\n  isReady: boolean;\n}\n\n/**\n * Hook for convenient event tracking with defaults.\n *\n * @example\n * ```tsx\n * const { trackEvent, createClickHandler } = useEventTracker({\n *   eventName: 'button-click',\n *   defaultData: { section: 'header' }\n * });\n *\n * // Track with defaults\n * trackEvent();\n *\n * // Override name\n * trackEvent('custom-event');\n *\n * // Override data\n * trackEvent('custom-event', { action: 'submit' });\n *\n * // Use as click handler\n * <button onClick={createClickHandler()}>Click me</button>\n *\n * // With custom data per click\n * <button onClick={createClickHandler('signup', { plan: 'free' })}>Sign Up</button>\n * ```\n */\nexport function useEventTracker(options: UseEventTrackerOptions = {}): EventTrackerReturn {\n  const { eventName, defaultData } = options;\n  const { track, isReady } = useEntrolytics();\n\n  const trackEvent = useCallback(\n    async (name?: string, data?: EventData): Promise<void> => {\n      const finalName = name || eventName;\n      const finalData: EventData = { ...defaultData, ...data };\n\n      if (finalName) {\n        const hasData = Object.keys(finalData).length > 0;\n        if (hasData) {\n          await track(finalName, finalData);\n        } else {\n          await track(finalName);\n        }\n      } else {\n        await track();\n      }\n    },\n    [track, eventName, defaultData],\n  );\n\n  const createClickHandler = useCallback(\n    (name?: string, data?: EventData) => {\n      return async (_e?: React.MouseEvent): Promise<void> => {\n        await trackEvent(name, data);\n      };\n    },\n    [trackEvent],\n  );\n\n  return {\n    trackEvent,\n    createClickHandler,\n    isReady,\n  };\n}\n","'use client';\n\nimport { API_ROUTES } from '@entrolytics/shared';\nimport type { FormEventType } from '@entrolytics/shared';\nimport { useCallback, useEffect, useRef } from 'react';\nimport {\n  buildCollectionHeaders,\n  generateUuid,\n  getOrCreateSessionId,\n  getOrCreateVisitorId,\n} from '../identity';\nimport { useEntrolytics } from './useEntrolytics';\n\nexport type { FormEventType };\n\nexport interface FormEventData {\n  eventType: FormEventType;\n  formId: string;\n  formName?: string;\n  urlPath?: string;\n  fieldName?: string;\n  fieldType?: string;\n  fieldIndex?: number;\n  timeOnField?: number;\n  timeSinceStart?: number;\n  errorMessage?: string;\n  success?: boolean;\n}\n\nexport interface UseFormTrackingOptions {\n  formId: string;\n  formName?: string;\n  autoTrack?: boolean;\n  trackTiming?: boolean;\n  trackAbandonment?: boolean;\n}\n\ninterface FormState {\n  startTime: number | null;\n  fieldStartTimes: Map<string, number>;\n  hasInteracted: boolean;\n  lastFieldName: string | null;\n}\n\n/**\n * Hook for tracking form interactions in Next.js\n *\n * @example\n * ```tsx\n * 'use client';\n * import { useFormTracking } from '@entrolytics/nextjs';\n *\n * export function ContactForm() {\n *   const { formRef, trackSubmit } = useFormTracking({\n *     formId: 'contact-form',\n *     formName: 'Contact Form'\n *   });\n *\n *   const handleSubmit = async (e) => {\n *     e.preventDefault();\n *     const success = await submitForm();\n *     trackSubmit(success);\n *   };\n *\n *   return (\n *     <form ref={formRef} onSubmit={handleSubmit}>\n *       <input name=\"email\" type=\"email\" />\n *       <button type=\"submit\">Send</button>\n *     </form>\n *   );\n * }\n * ```\n */\nexport function useFormTracking(options: UseFormTrackingOptions) {\n  const {\n    formId,\n    formName,\n    autoTrack = true,\n    trackTiming = true,\n    trackAbandonment = true,\n  } = options;\n  const { config } = useEntrolytics();\n  const formRef = useRef<HTMLFormElement | null>(null);\n  const stateRef = useRef<FormState>({\n    startTime: null,\n    fieldStartTimes: new Map(),\n    hasInteracted: false,\n    lastFieldName: null,\n  });\n\n  const trackEvent = useCallback(\n    async (\n      data: Omit<FormEventData, 'formId' | 'formName' | 'urlPath'> &\n        Partial<Pick<FormEventData, 'formId' | 'formName' | 'urlPath'>>,\n    ) => {\n      if (typeof window === 'undefined') return;\n\n      const host = config.host || 'https://api.entrolytics.click';\n      const payload: FormEventData = {\n        formId: data.formId || formId,\n        formName: data.formName || formName,\n        urlPath: data.urlPath || window.location.pathname,\n        ...data,\n      };\n\n      try {\n        await fetch(`${host}${API_ROUTES.collectForms}`, {\n          method: 'POST',\n          headers: buildCollectionHeaders(),\n          body: JSON.stringify({\n            websiteId: config.websiteId,\n            clientKey: config.clientKey,\n            eventId: generateUuid(),\n            timestamp: new Date().toISOString(),\n            dnt: navigator.doNotTrack === '1',\n            sessionId: getOrCreateSessionId(),\n            visitorId: getOrCreateVisitorId(),\n            ...payload,\n          }),\n          keepalive: true,\n        });\n      } catch (err) {\n        console.error('[Entrolytics] Failed to track form event:', err);\n      }\n    },\n    [config.clientKey, config.websiteId, config.host, formId, formName],\n  );\n\n  const trackStart = useCallback(() => {\n    if (stateRef.current.startTime !== null) return;\n    stateRef.current.startTime = Date.now();\n    void trackEvent({ eventType: 'start' });\n  }, [trackEvent]);\n\n  const trackFieldFocus = useCallback(\n    (fieldName: string, fieldType?: string, fieldIndex?: number) => {\n      const state = stateRef.current;\n\n      if (!state.hasInteracted) {\n        state.hasInteracted = true;\n        trackStart();\n      }\n\n      if (trackTiming) {\n        state.fieldStartTimes.set(fieldName, Date.now());\n      }\n\n      state.lastFieldName = fieldName;\n\n      void trackEvent({\n        eventType: 'field_focus',\n        fieldName,\n        fieldType,\n        fieldIndex,\n        timeSinceStart: state.startTime ? Date.now() - state.startTime : undefined,\n      });\n    },\n    [trackEvent, trackStart, trackTiming],\n  );\n\n  const trackFieldBlur = useCallback(\n    (fieldName: string, fieldType?: string, fieldIndex?: number) => {\n      const state = stateRef.current;\n      const fieldStartTime = state.fieldStartTimes.get(fieldName);\n      const timeOnField = fieldStartTime ? Date.now() - fieldStartTime : undefined;\n\n      void trackEvent({\n        eventType: 'field_blur',\n        fieldName,\n        fieldType,\n        fieldIndex,\n        timeOnField,\n        timeSinceStart: state.startTime ? Date.now() - state.startTime : undefined,\n      });\n    },\n    [trackEvent],\n  );\n\n  const trackFieldError = useCallback(\n    (fieldName: string, errorMessage: string, fieldType?: string, fieldIndex?: number) => {\n      void trackEvent({\n        eventType: 'field_error',\n        fieldName,\n        fieldType,\n        fieldIndex,\n        errorMessage,\n        timeSinceStart: stateRef.current.startTime\n          ? Date.now() - stateRef.current.startTime\n          : undefined,\n      });\n    },\n    [trackEvent],\n  );\n\n  const trackSubmit = useCallback(\n    (success: boolean) => {\n      void trackEvent({\n        eventType: 'submit',\n        success,\n        timeSinceStart: stateRef.current.startTime\n          ? Date.now() - stateRef.current.startTime\n          : undefined,\n      });\n\n      stateRef.current = {\n        startTime: null,\n        fieldStartTimes: new Map(),\n        hasInteracted: false,\n        lastFieldName: null,\n      };\n    },\n    [trackEvent],\n  );\n\n  const trackAbandon = useCallback(() => {\n    if (!stateRef.current.hasInteracted) return;\n\n    void trackEvent({\n      eventType: 'abandon',\n      fieldName: stateRef.current.lastFieldName || undefined,\n      timeSinceStart: stateRef.current.startTime\n        ? Date.now() - stateRef.current.startTime\n        : undefined,\n    });\n  }, [trackEvent]);\n\n  useEffect(() => {\n    if (!autoTrack || !formRef.current) return undefined;\n\n    const form = formRef.current;\n\n    const handleFocus = (e: FocusEvent) => {\n      const target = e.target;\n      if (\n        !(target instanceof HTMLInputElement) &&\n        !(target instanceof HTMLSelectElement) &&\n        !(target instanceof HTMLTextAreaElement)\n      ) {\n        return;\n      }\n      if (!target.name && !target.id) return;\n\n      const fieldName = target.name || target.id;\n      const fieldType = target.type || target.tagName.toLowerCase();\n      const fields = Array.from(form.elements);\n      const fieldIndex = fields.indexOf(target);\n\n      trackFieldFocus(fieldName, fieldType, fieldIndex >= 0 ? fieldIndex : undefined);\n    };\n\n    const handleBlur = (e: FocusEvent) => {\n      const target = e.target;\n      if (\n        !(target instanceof HTMLInputElement) &&\n        !(target instanceof HTMLSelectElement) &&\n        !(target instanceof HTMLTextAreaElement)\n      ) {\n        return;\n      }\n      if (!target.name && !target.id) return;\n\n      const fieldName = target.name || target.id;\n      const fieldType = target.type || target.tagName.toLowerCase();\n      const fields = Array.from(form.elements);\n      const fieldIndex = fields.indexOf(target);\n\n      trackFieldBlur(fieldName, fieldType, fieldIndex >= 0 ? fieldIndex : undefined);\n    };\n\n    form.addEventListener('focusin', handleFocus);\n    form.addEventListener('focusout', handleBlur);\n\n    return () => {\n      form.removeEventListener('focusin', handleFocus);\n      form.removeEventListener('focusout', handleBlur);\n    };\n  }, [autoTrack, trackFieldFocus, trackFieldBlur]);\n\n  useEffect(() => {\n    if (!trackAbandonment) return undefined;\n\n    const handleBeforeUnload = () => {\n      if (stateRef.current.hasInteracted && stateRef.current.startTime) {\n        trackAbandon();\n      }\n    };\n\n    window.addEventListener('beforeunload', handleBeforeUnload);\n    return () => window.removeEventListener('beforeunload', handleBeforeUnload);\n  }, [trackAbandonment, trackAbandon]);\n\n  return {\n    formRef,\n    trackEvent,\n    trackStart,\n    trackFieldFocus,\n    trackFieldBlur,\n    trackFieldError,\n    trackSubmit,\n    trackAbandon,\n  };\n}\n","'use client';\n\nimport { useEffect, useRef } from 'react';\nimport type { UsePageViewOptions } from '../../types';\nimport { useEntrolytics } from './useEntrolytics';\n\n/**\n * Hook to track page views with dependency-based triggering.\n *\n * @example\n * ```tsx\n * // Basic usage - tracks on mount\n * usePageView();\n *\n * // Custom URL\n * usePageView({ url: '/custom-path' });\n *\n * // With dependencies - re-tracks when deps change\n * usePageView({ url: virtualPath, deps: [virtualPath] });\n *\n * // Conditional tracking\n * usePageView({ enabled: isAuthenticated });\n * ```\n */\nexport function usePageView(options: UsePageViewOptions = {}): void {\n  const { url, referrer, deps = [], enabled = true } = options;\n  const { trackView, isReady, isEnabled } = useEntrolytics();\n  const hasTrackedRef = useRef(false);\n  const prevDepsRef = useRef<unknown[]>(deps);\n\n  useEffect(() => {\n    if (!isReady || !isEnabled || !enabled) return;\n\n    // Check if deps changed\n    const depsChanged =\n      deps.length > 0 &&\n      (deps.length !== prevDepsRef.current.length ||\n        deps.some((dep, i) => dep !== prevDepsRef.current[i]));\n\n    // Track if first render or deps changed\n    if (!hasTrackedRef.current || depsChanged) {\n      void trackView(url, referrer);\n      hasTrackedRef.current = true;\n      prevDepsRef.current = [...deps];\n    }\n  }, [isReady, isEnabled, enabled, url, referrer, trackView, deps]);\n}\n","'use client';\n\nimport { API_ROUTES, isNavigationType } from '@entrolytics/shared';\nimport type { NavigationType, VitalRating, VitalType } from '@entrolytics/shared';\nimport { useCallback, useEffect, useRef } from 'react';\nimport {\n  buildCollectionHeaders,\n  generateUuid,\n  getOrCreateSessionId,\n  getOrCreateVisitorId,\n} from '../identity';\nimport { useEntrolytics } from './useEntrolytics';\n\nexport type WebVitalMetric = VitalType;\nexport type WebVitalRating = VitalRating;\nexport type { NavigationType };\n\nexport interface WebVitalData {\n  metric: WebVitalMetric;\n  value: number;\n  rating: WebVitalRating;\n  delta?: number;\n  id?: string;\n  navigationType?: NavigationType;\n  attribution?: Record<string, unknown>;\n}\n\nexport interface UseWebVitalsOptions {\n  /** Auto-initialize web-vitals library (default: true) */\n  autoInit?: boolean;\n  /** Report all changes (default: false) */\n  reportAllChanges?: boolean;\n}\n\n/**\n * Hook for tracking Web Vitals in Next.js App Router\n *\n * @example\n * ```tsx\n * 'use client';\n * import { useWebVitals } from '@entrolytics/nextjs';\n *\n * export function WebVitalsTracker() {\n *   useWebVitals(); // Auto-tracks all Core Web Vitals\n *   return null;\n * }\n * ```\n */\nexport function useWebVitals(options: UseWebVitalsOptions = {}) {\n  const { autoInit = true, reportAllChanges = false } = options;\n  const { config, isReady } = useEntrolytics();\n  const initialized = useRef(false);\n\n  const trackVital = useCallback(\n    async (data: WebVitalData) => {\n      if (typeof window === 'undefined') return;\n\n      const host = config.host || 'https://api.entrolytics.click';\n      const payload = {\n        websiteId: config.websiteId,\n        clientKey: config.clientKey,\n        eventId: generateUuid(),\n        timestamp: new Date().toISOString(),\n        dnt: navigator.doNotTrack === '1',\n        sessionId: getOrCreateSessionId(),\n        visitorId: getOrCreateVisitorId(),\n        metricName: data.metric,\n        metricValue: data.value,\n        rating: data.rating,\n        delta: data.delta,\n        id: data.id,\n        navigationType: data.navigationType,\n        attribution: data.attribution,\n        url: window.location.href,\n        path: window.location.pathname,\n      };\n\n      try {\n        await fetch(`${host}${API_ROUTES.collectVitals}`, {\n          method: 'POST',\n          headers: buildCollectionHeaders(),\n          body: JSON.stringify(payload),\n          keepalive: true,\n        });\n      } catch (err) {\n        console.error('[Entrolytics] Failed to track vital:', err);\n      }\n    },\n    [config.clientKey, config.websiteId, config.host],\n  );\n\n  useEffect(() => {\n    if (!autoInit || !isReady || initialized.current) return;\n    if (typeof window === 'undefined') return;\n\n    initialized.current = true;\n\n    import('web-vitals/attribution')\n      .then(({ onCLS, onINP, onLCP, onFCP, onTTFB }) => {\n        const opts = { reportAllChanges };\n\n        onLCP(\n          m =>\n            trackVital({\n              metric: 'LCP',\n              value: m.value,\n              rating: m.rating,\n              delta: m.delta,\n              id: m.id,\n              navigationType: isNavigationType(m.navigationType) ? m.navigationType : undefined,\n              attribution: { ...m.attribution },\n            }),\n          opts,\n        );\n\n        onINP(\n          m =>\n            trackVital({\n              metric: 'INP',\n              value: m.value,\n              rating: m.rating,\n              delta: m.delta,\n              id: m.id,\n              navigationType: isNavigationType(m.navigationType) ? m.navigationType : undefined,\n              attribution: { ...m.attribution },\n            }),\n          opts,\n        );\n\n        onCLS(\n          m =>\n            trackVital({\n              metric: 'CLS',\n              value: m.value,\n              rating: m.rating,\n              delta: m.delta,\n              id: m.id,\n              navigationType: isNavigationType(m.navigationType) ? m.navigationType : undefined,\n              attribution: { ...m.attribution },\n            }),\n          opts,\n        );\n\n        onFCP(\n          m =>\n            trackVital({\n              metric: 'FCP',\n              value: m.value,\n              rating: m.rating,\n              delta: m.delta,\n              id: m.id,\n              navigationType: isNavigationType(m.navigationType) ? m.navigationType : undefined,\n              attribution: { ...m.attribution },\n            }),\n          opts,\n        );\n\n        onTTFB(\n          m =>\n            trackVital({\n              metric: 'TTFB',\n              value: m.value,\n              rating: m.rating,\n              delta: m.delta,\n              id: m.id,\n              navigationType: isNavigationType(m.navigationType) ? m.navigationType : undefined,\n              attribution: { ...m.attribution },\n            }),\n          opts,\n        );\n      })\n      .catch(() => {\n        console.debug('[Entrolytics] web-vitals not found. Use trackVital() for manual tracking.');\n      });\n  }, [autoInit, isReady, trackVital, reportAllChanges]);\n\n  return { trackVital };\n}\n"],"mappings":"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"}