{"version":3,"sources":["../src/context/announcements-context.ts","../src/hooks/use-announcement.ts","../src/components/headless/headless-modal.tsx","../src/components/headless/headless-slideout.tsx","../src/components/headless/headless-banner.tsx","../src/components/headless/headless-toast.tsx","../src/components/headless/headless-spotlight.tsx","../src/context/announcements-provider.tsx","../src/hooks/use-announcements.ts","../src/hooks/use-announcement-queue.ts"],"names":["AnnouncementsContext","createContext","useAnnouncementsContext","context","useContext","useAnnouncement","id","state","config","show","useCallback","forceShow","hide","dismiss","reason","complete","reset","canShowValue","useMemo","HeadlessModal","openProp","onOpenChange","options","children","announcement","isControlled","open","close","k","modalOptions","overlayProps","contentProps","e","HeadlessSlideout","E","slideoutOptions","HeadlessBanner","q","bannerOptions","bannerProps","HeadlessToast","progress","setProgress","S","dismissRef","toastOptions","startTime","duration","timer","elapsed","remaining","toastProps","HeadlessSpotlight","targetElement","setTargetElement","v","targetRect","setTargetRect","spotlightOptions","element","refs","floatingStyles","useFloating","offset","flip","shift","autoUpdate","AnnouncementsProvider","initialAnnouncements","queueConfigOverrides","storage","storageKey","STORAGE_KEY_PREFIX","userContext","onAnnouncementShow","onAnnouncementDismiss","onAnnouncementComplete","toastAdapter","analytics","useAnalyticsOptional","segments","useSegments","queueConfig","b","DEFAULT_QUEUE_CONFIG","live","handle","createAnnouncementsHandle","event","payload","mounted","synced","engine","verbs","contextValue","jsx","LicenseGate","useAnnouncements","ids","getFiltered","filter","results","visible","dismissed","useAnnouncementQueue","isQueued","getPosition"],"mappings":"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","file":"chunk-ASDWSJZ2.cjs","sourcesContent":["import { createContext, useContext } from 'react'\nimport type { AnnouncementsContextValue } from '../types/context'\n\n/**\n * Announcements context\n */\nexport const AnnouncementsContext = createContext<AnnouncementsContextValue | null>(null)\n\n/**\n * Hook to access the announcements context\n * @throws Error if used outside of AnnouncementsProvider\n */\nexport function useAnnouncementsContext(): AnnouncementsContextValue {\n  const context = useContext(AnnouncementsContext)\n  if (!context) {\n    throw new Error('useAnnouncementsContext must be used within an AnnouncementsProvider')\n  }\n  return context\n}\n","import { useCallback, useMemo } from 'react'\nimport { useAnnouncementsContext } from '../context/announcements-context'\nimport type { AnnouncementConfig, AnnouncementState, DismissalReason } from '../types/announcement'\n\n/**\n * Return type for useAnnouncement hook\n */\nexport interface UseAnnouncementReturn {\n  /** Current state of the announcement */\n  state: AnnouncementState | undefined\n  /** Configuration of the announcement */\n  config: AnnouncementConfig | undefined\n  /** Whether the announcement is currently visible */\n  isVisible: boolean\n  /** Whether the announcement is active (being displayed) */\n  isActive: boolean\n  /** Whether the announcement has been dismissed */\n  isDismissed: boolean\n  /** Whether the announcement can be shown (respects frequency, schedule, etc.) */\n  canShow: boolean\n  /** Number of times the announcement has been viewed */\n  viewCount: number\n  /** Show the announcement */\n  show: () => void\n  /**\n   * Force-show the announcement (admin/demo affordance). Bypasses frequency,\n   * cooldown, viewCount, isDismissed, and audience gates. License soft-gate\n   * is preserved — unlicensed renders still show the watermark.\n   */\n  forceShow: () => void\n  /** Hide the announcement temporarily */\n  hide: () => void\n  /** Dismiss the announcement (marks as dismissed) */\n  dismiss: (reason?: DismissalReason) => void\n  /** Complete the announcement (primary action taken) */\n  complete: () => void\n  /** Reset the announcement (clear dismissed state) */\n  reset: () => void\n}\n\n/**\n * Hook to interact with a single announcement\n * @param id - The announcement ID\n * @returns Announcement state and control methods\n */\nexport function useAnnouncement(id: string): UseAnnouncementReturn {\n  const context = useAnnouncementsContext()\n\n  const state = context.getState(id)\n  const config = context.getConfig(id)\n\n  const show = useCallback(() => {\n    context.show(id)\n  }, [context, id])\n\n  const forceShow = useCallback(() => {\n    context.forceShow(id)\n  }, [context, id])\n\n  const hide = useCallback(() => {\n    context.hide(id)\n  }, [context, id])\n\n  const dismiss = useCallback(\n    (reason?: DismissalReason) => {\n      context.dismiss(id, reason)\n    },\n    [context, id]\n  )\n\n  const complete = useCallback(() => {\n    context.complete(id)\n  }, [context, id])\n\n  const reset = useCallback(() => {\n    context.reset(id)\n  }, [context, id])\n\n  const canShowValue = context.canShow(id)\n\n  return useMemo(\n    () => ({\n      state,\n      config,\n      isVisible: state?.isVisible ?? false,\n      isActive: state?.isActive ?? false,\n      isDismissed: state?.isDismissed ?? false,\n      canShow: canShowValue,\n      viewCount: state?.viewCount ?? 0,\n      show,\n      forceShow,\n      hide,\n      dismiss,\n      complete,\n      reset,\n    }),\n    [state, config, canShowValue, show, forceShow, hide, dismiss, complete, reset]\n  )\n}\n","'use client'\n\nimport * as React from 'react'\nimport { useAnnouncement } from '../../hooks/use-announcement'\nimport type { DismissalReason, ModalOptions } from '../../types/announcement'\n\nexport interface HeadlessModalRenderProps {\n  /** Whether the modal is open */\n  open: boolean\n  /** The announcement state */\n  state: ReturnType<typeof useAnnouncement>['state']\n  /** The announcement config */\n  config: ReturnType<typeof useAnnouncement>['config']\n  /** Close the modal */\n  close: () => void\n  /** Dismiss the modal */\n  dismiss: (reason?: DismissalReason) => void\n  /** Complete the announcement */\n  complete: () => void\n  /** Props for the overlay element */\n  overlayProps: {\n    onClick: () => void\n    'aria-hidden': boolean\n  }\n  /** Props for the content element */\n  contentProps: {\n    role: string\n    'aria-modal': boolean\n    'aria-labelledby': string\n    onKeyDown: (e: React.KeyboardEvent) => void\n  }\n  /** Modal options */\n  options: ModalOptions\n}\n\nexport interface HeadlessModalProps {\n  /** Announcement ID */\n  id: string\n  /** Whether the modal is open (controlled) */\n  open?: boolean\n  /** Callback when open state changes */\n  onOpenChange?: (open: boolean) => void\n  /** Modal options */\n  options?: ModalOptions\n  /** Render function */\n  children: (props: HeadlessModalRenderProps) => React.ReactNode\n}\n\nexport function HeadlessModal({\n  id,\n  open: openProp,\n  onOpenChange,\n  options,\n  children,\n}: HeadlessModalProps) {\n  const announcement = useAnnouncement(id)\n  const config = announcement.config\n\n  // Controlled or uncontrolled open state\n  const isControlled = openProp !== undefined\n  const open = isControlled ? openProp : announcement.isVisible\n\n  const close = React.useCallback(() => {\n    if (!isControlled) {\n      announcement.hide()\n    }\n    onOpenChange?.(false)\n  }, [isControlled, announcement, onOpenChange])\n\n  const dismiss = React.useCallback(\n    (reason: DismissalReason = 'close_button') => {\n      announcement.dismiss(reason)\n      onOpenChange?.(false)\n    },\n    [announcement, onOpenChange]\n  )\n\n  const complete = React.useCallback(() => {\n    announcement.complete()\n    onOpenChange?.(false)\n  }, [announcement, onOpenChange])\n\n  const modalOptions: ModalOptions = {\n    closeOnOverlayClick: true,\n    closeOnEscape: true,\n    showCloseButton: true,\n    ...options,\n    ...config?.modalOptions,\n  }\n\n  const overlayProps = {\n    onClick: modalOptions.closeOnOverlayClick ? () => dismiss('overlay_click') : () => {},\n    'aria-hidden': true as boolean,\n  }\n\n  const contentProps = {\n    role: 'dialog',\n    'aria-modal': true as boolean,\n    'aria-labelledby': `${id}-title`,\n    onKeyDown: (e: React.KeyboardEvent) => {\n      if (e.key === 'Escape' && modalOptions.closeOnEscape) {\n        dismiss('escape_key')\n      }\n    },\n  }\n\n  return children({\n    open,\n    state: announcement.state,\n    config: announcement.config,\n    close,\n    dismiss,\n    complete,\n    overlayProps,\n    contentProps,\n    options: modalOptions,\n  })\n}\n","'use client'\n\nimport * as React from 'react'\nimport { useAnnouncement } from '../../hooks/use-announcement'\nimport type { DismissalReason, SlideoutOptions } from '../../types/announcement'\n\nexport interface HeadlessSlideoutRenderProps {\n  /** Whether the slideout is open */\n  open: boolean\n  /** The announcement state */\n  state: ReturnType<typeof useAnnouncement>['state']\n  /** The announcement config */\n  config: ReturnType<typeof useAnnouncement>['config']\n  /** Close the slideout */\n  close: () => void\n  /** Dismiss the slideout */\n  dismiss: (reason?: DismissalReason) => void\n  /** Complete the announcement */\n  complete: () => void\n  /** Props for the overlay element */\n  overlayProps: {\n    onClick: () => void\n    'aria-hidden': boolean\n  }\n  /** Props for the content element */\n  contentProps: {\n    role: string\n    'aria-modal': boolean\n    'aria-labelledby': string\n    onKeyDown: (e: React.KeyboardEvent) => void\n  }\n  /** Slideout options */\n  options: SlideoutOptions\n}\n\nexport interface HeadlessSlideoutProps {\n  /** Announcement ID */\n  id: string\n  /** Whether the slideout is open (controlled) */\n  open?: boolean\n  /** Callback when open state changes */\n  onOpenChange?: (open: boolean) => void\n  /** Slideout options */\n  options?: SlideoutOptions\n  /** Render function */\n  children: (props: HeadlessSlideoutRenderProps) => React.ReactNode\n}\n\nexport function HeadlessSlideout({\n  id,\n  open: openProp,\n  onOpenChange,\n  options,\n  children,\n}: HeadlessSlideoutProps) {\n  const announcement = useAnnouncement(id)\n  const config = announcement.config\n\n  // Controlled or uncontrolled open state\n  const isControlled = openProp !== undefined\n  const open = isControlled ? openProp : announcement.isVisible\n\n  const close = React.useCallback(() => {\n    if (!isControlled) {\n      announcement.hide()\n    }\n    onOpenChange?.(false)\n  }, [isControlled, announcement, onOpenChange])\n\n  const dismiss = React.useCallback(\n    (reason: DismissalReason = 'close_button') => {\n      announcement.dismiss(reason)\n      onOpenChange?.(false)\n    },\n    [announcement, onOpenChange]\n  )\n\n  const complete = React.useCallback(() => {\n    announcement.complete()\n    onOpenChange?.(false)\n  }, [announcement, onOpenChange])\n\n  const slideoutOptions: SlideoutOptions = {\n    position: 'right',\n    closeOnOverlayClick: true,\n    closeOnEscape: true,\n    showCloseButton: true,\n    ...options,\n    ...config?.slideoutOptions,\n  }\n\n  const overlayProps = {\n    onClick: slideoutOptions.closeOnOverlayClick ? () => dismiss('overlay_click') : () => {},\n    'aria-hidden': true as boolean,\n  }\n\n  const contentProps = {\n    role: 'dialog',\n    'aria-modal': true as boolean,\n    'aria-labelledby': `${id}-title`,\n    onKeyDown: (e: React.KeyboardEvent) => {\n      if (e.key === 'Escape' && slideoutOptions.closeOnEscape) {\n        dismiss('escape_key')\n      }\n    },\n  }\n\n  return children({\n    open,\n    state: announcement.state,\n    config: announcement.config,\n    close,\n    dismiss,\n    complete,\n    overlayProps,\n    contentProps,\n    options: slideoutOptions,\n  })\n}\n","'use client'\n\nimport * as React from 'react'\nimport { useAnnouncement } from '../../hooks/use-announcement'\nimport type { BannerOptions, DismissalReason } from '../../types/announcement'\n\nexport interface HeadlessBannerRenderProps {\n  /** Whether the banner is visible */\n  open: boolean\n  /** The announcement state */\n  state: ReturnType<typeof useAnnouncement>['state']\n  /** The announcement config */\n  config: ReturnType<typeof useAnnouncement>['config']\n  /** Dismiss the banner */\n  dismiss: (reason?: DismissalReason) => void\n  /** Props for the banner element */\n  bannerProps: {\n    role: string\n    'data-state': string\n  }\n  /** Banner options */\n  options: BannerOptions\n}\n\nexport interface HeadlessBannerProps {\n  /** Announcement ID */\n  id: string\n  /** Whether the banner is visible (controlled) */\n  open?: boolean\n  /** Callback when visibility changes */\n  onOpenChange?: (open: boolean) => void\n  /** Banner options */\n  options?: BannerOptions\n  /** Render function */\n  children: (props: HeadlessBannerRenderProps) => React.ReactNode\n}\n\nexport function HeadlessBanner({\n  id,\n  open: openProp,\n  onOpenChange,\n  options,\n  children,\n}: HeadlessBannerProps) {\n  const announcement = useAnnouncement(id)\n  const config = announcement.config\n\n  // Controlled or uncontrolled open state\n  const isControlled = openProp !== undefined\n  const open = isControlled ? openProp : announcement.isVisible\n\n  const dismiss = React.useCallback(\n    (reason: DismissalReason = 'close_button') => {\n      announcement.dismiss(reason)\n      onOpenChange?.(false)\n    },\n    [announcement, onOpenChange]\n  )\n\n  const bannerOptions: BannerOptions = {\n    position: 'top',\n    dismissable: true,\n    intent: 'info',\n    ...options,\n    ...config?.bannerOptions,\n  }\n\n  const bannerProps = {\n    role: 'alert',\n    'data-state': open ? 'open' : 'closed',\n  }\n\n  return children({\n    open,\n    state: announcement.state,\n    config: announcement.config,\n    dismiss,\n    bannerProps,\n    options: bannerOptions,\n  })\n}\n","'use client'\n\nimport * as React from 'react'\nimport { useAnnouncement } from '../../hooks/use-announcement'\nimport type { DismissalReason, ToastOptions } from '../../types/announcement'\n\nexport interface HeadlessToastRenderProps {\n  /** Whether the toast is visible */\n  open: boolean\n  /** The announcement state */\n  state: ReturnType<typeof useAnnouncement>['state']\n  /** The announcement config */\n  config: ReturnType<typeof useAnnouncement>['config']\n  /** Dismiss the toast */\n  dismiss: (reason?: DismissalReason) => void\n  /** Props for the toast element */\n  toastProps: {\n    role: string\n    'aria-live': 'polite' | 'assertive'\n    'data-state': string\n  }\n  /** Auto-dismiss progress (0-100) */\n  progress: number\n  /** Toast options */\n  options: ToastOptions\n}\n\nexport interface HeadlessToastProps {\n  /** Announcement ID */\n  id: string\n  /** Whether the toast is visible (controlled) */\n  open?: boolean\n  /** Callback when visibility changes */\n  onOpenChange?: (open: boolean) => void\n  /** Toast options */\n  options?: ToastOptions\n  /** Render function */\n  children: (props: HeadlessToastRenderProps) => React.ReactNode\n}\n\nexport function HeadlessToast({\n  id,\n  open: openProp,\n  onOpenChange,\n  options,\n  children,\n}: HeadlessToastProps) {\n  const announcement = useAnnouncement(id)\n  const config = announcement.config\n  const [progress, setProgress] = React.useState(100)\n\n  // Controlled or uncontrolled open state\n  const isControlled = openProp !== undefined\n  const open = isControlled ? openProp : announcement.isVisible\n\n  const dismiss = React.useCallback(\n    (reason: DismissalReason = 'close_button') => {\n      announcement.dismiss(reason)\n      onOpenChange?.(false)\n    },\n    [announcement, onOpenChange]\n  )\n\n  // Hold the latest dismiss in a ref so the auto-dismiss timer effect\n  // does not re-subscribe every render when announcement state ticks.\n  const dismissRef = React.useRef(dismiss)\n  React.useEffect(() => {\n    dismissRef.current = dismiss\n  }, [dismiss])\n\n  const toastOptions: ToastOptions = {\n    position: 'bottom-right',\n    autoDismiss: true,\n    autoDismissDelay: 5000,\n    showProgress: true,\n    intent: 'info',\n    ...options,\n    ...config?.toastOptions,\n  }\n\n  // Auto-dismiss timer — depends only on primitive scalars so it does\n  // not tear down on every parent re-render.\n  React.useEffect(() => {\n    if (!open || !toastOptions.autoDismiss) return\n\n    const startTime = Date.now()\n    const duration = toastOptions.autoDismissDelay ?? 5000\n\n    const timer = setInterval(() => {\n      const elapsed = Date.now() - startTime\n      const remaining = Math.max(0, 100 - (elapsed / duration) * 100)\n      setProgress(remaining)\n\n      if (remaining === 0) {\n        clearInterval(timer)\n        dismissRef.current('auto_dismiss')\n      }\n    }, 50)\n\n    return () => {\n      clearInterval(timer)\n      setProgress(100)\n    }\n  }, [open, toastOptions.autoDismiss, toastOptions.autoDismissDelay])\n\n  const toastProps = {\n    role: 'alert' as const,\n    'aria-live': 'polite' as const,\n    'data-state': open ? 'open' : 'closed',\n  }\n\n  return children({\n    open,\n    state: announcement.state,\n    config: announcement.config,\n    dismiss,\n    toastProps,\n    progress,\n    options: toastOptions,\n  })\n}\n","'use client'\n\nimport { type Placement, autoUpdate, flip, offset, shift, useFloating } from '@floating-ui/react'\nimport * as React from 'react'\nimport { useAnnouncement } from '../../hooks/use-announcement'\nimport type { DismissalReason, SpotlightOptions } from '../../types/announcement'\n\nexport interface HeadlessSpotlightRenderProps {\n  /** Whether the spotlight is visible */\n  open: boolean\n  /** The announcement state */\n  state: ReturnType<typeof useAnnouncement>['state']\n  /** The announcement config */\n  config: ReturnType<typeof useAnnouncement>['config']\n  /** Close the spotlight */\n  close: () => void\n  /** Dismiss the spotlight */\n  dismiss: (reason?: DismissalReason) => void\n  /** Complete the announcement */\n  complete: () => void\n  /** Target element */\n  targetElement: Element | null\n  /** Target element rect */\n  targetRect: DOMRect | null\n  /** Floating styles from @floating-ui */\n  floatingStyles: React.CSSProperties\n  /** Set floating element ref */\n  setFloating: (node: HTMLElement | null) => void\n  /** Props for the overlay element */\n  overlayProps: {\n    onClick: () => void\n    'aria-hidden': boolean\n  }\n  /** Props for the content element */\n  contentProps: {\n    role: string\n    'aria-labelledby': string\n  }\n  /** Spotlight options */\n  options: SpotlightOptions\n}\n\nexport interface HeadlessSpotlightProps {\n  /** Announcement ID */\n  id: string\n  /** Whether the spotlight is visible (controlled) */\n  open?: boolean\n  /** Callback when visibility changes */\n  onOpenChange?: (open: boolean) => void\n  /** Spotlight options */\n  options?: SpotlightOptions\n  /** Render function */\n  children: (props: HeadlessSpotlightRenderProps) => React.ReactNode\n}\n\nexport function HeadlessSpotlight({\n  id,\n  open: openProp,\n  onOpenChange,\n  options,\n  children,\n}: HeadlessSpotlightProps) {\n  const announcement = useAnnouncement(id)\n  const config = announcement.config\n  const [targetElement, setTargetElement] = React.useState<Element | null>(null)\n  const [targetRect, setTargetRect] = React.useState<DOMRect | null>(null)\n\n  // Controlled or uncontrolled open state\n  const isControlled = openProp !== undefined\n  const open = isControlled ? openProp : announcement.isVisible\n\n  const spotlightOptions: SpotlightOptions = {\n    targetSelector: '',\n    placement: 'bottom',\n    offset: 8,\n    showOverlay: true,\n    overlayOpacity: 0.5,\n    closeOnOverlayClick: true,\n    ...options,\n    ...config?.spotlightOptions,\n  }\n\n  // Find target element\n  React.useEffect(() => {\n    if (!open || !spotlightOptions.targetSelector) {\n      setTargetElement(null)\n      setTargetRect(null)\n      return\n    }\n\n    const element = document.querySelector(spotlightOptions.targetSelector)\n    setTargetElement(element)\n    if (element) {\n      setTargetRect(element.getBoundingClientRect())\n    }\n  }, [open, spotlightOptions.targetSelector])\n\n  const { refs, floatingStyles } = useFloating({\n    placement: spotlightOptions.placement as Placement,\n    middleware: [offset(spotlightOptions.offset ?? 8), flip(), shift({ padding: 8 })],\n    whileElementsMounted: autoUpdate,\n  })\n\n  // Set reference element when target is found\n  React.useEffect(() => {\n    if (targetElement) {\n      refs.setReference(targetElement)\n    }\n  }, [targetElement, refs])\n\n  const close = React.useCallback(() => {\n    if (!isControlled) {\n      announcement.hide()\n    }\n    onOpenChange?.(false)\n  }, [isControlled, announcement, onOpenChange])\n\n  const dismiss = React.useCallback(\n    (reason: DismissalReason = 'close_button') => {\n      announcement.dismiss(reason)\n      onOpenChange?.(false)\n    },\n    [announcement, onOpenChange]\n  )\n\n  const complete = React.useCallback(() => {\n    announcement.complete()\n    onOpenChange?.(false)\n  }, [announcement, onOpenChange])\n\n  const overlayProps = {\n    onClick: spotlightOptions.closeOnOverlayClick ? () => dismiss('overlay_click') : () => {},\n    'aria-hidden': true as boolean,\n  }\n\n  const contentProps = {\n    role: 'dialog',\n    'aria-labelledby': `${id}-title`,\n  }\n\n  return children({\n    open,\n    state: announcement.state,\n    config: announcement.config,\n    close,\n    dismiss,\n    complete,\n    targetElement,\n    targetRect,\n    floatingStyles,\n    setFloating: refs.setFloating,\n    overlayProps,\n    contentProps,\n    options: spotlightOptions,\n  })\n}\n","'use client'\n\nimport { useAnalyticsOptional } from '@tour-kit/analytics'\nimport { useSegments } from '@tour-kit/core'\nimport { LicenseGate } from '@tour-kit/license'\nimport * as React from 'react'\nimport { createAnnouncementsHandle } from '../lib/announcements-engine/create-announcements-handle'\nimport { STORAGE_KEY_PREFIX } from '../lib/announcements-engine/persistence'\nimport type { AnnouncementConfig, DismissalReason } from '../types/announcement'\nimport type { AnnouncementsContextValue, AnnouncementsProviderProps } from '../types/context'\nimport { DEFAULT_QUEUE_CONFIG, type QueueConfig } from '../types/queue'\nimport { AnnouncementsContext } from './announcements-context'\n\n/**\n * v3 Phase 3 — this provider is a BINDING over `@tour-kit/announcements/engine`.\n *\n * Everything that was 831 lines of reducer, scheduler orchestration, queue\n * timers, persistence and eligibility now lives in `lib/announcements-engine/`\n * and runs with no React at all. What is left here is the four things only\n * React can do: read the two hooks the engine cannot (`useSegments`,\n * `useAnalyticsOptional`), subscribe a component tree to the engine's snapshot,\n * forward prop changes as verbs, and wrap the tree in the licence gate.\n *\n * `FORCE_SHOW_BYPASS` is re-exported from THIS module path under the same name\n * on purpose: `__tests__/force-show.test.tsx:11` imports it from\n * `'../context/announcements-provider'` and pins it with a literal array. A\n * moved import path would be a test edit, and Decision 11 forbids that.\n */\nexport { FORCE_SHOW_BYPASS, type ForceShowBypassKey } from '../lib/announcements-engine/reducer'\n\nexport function AnnouncementsProvider({\n  children,\n  announcements: initialAnnouncements = [],\n  queueConfig: queueConfigOverrides,\n  storage = typeof window !== 'undefined' ? localStorage : null,\n  storageKey = STORAGE_KEY_PREFIX,\n  userContext,\n  onAnnouncementShow,\n  onAnnouncementDismiss,\n  onAnnouncementComplete,\n  toastAdapter,\n}: AnnouncementsProviderProps) {\n  const analytics = useAnalyticsOptional()\n  // Decision 7a — the engine owns eligibility; the binding forwards ONE signal.\n  // `useSegments()` is a React hook from core's main barrel and cannot enter a\n  // React-free engine, but the filtering cannot live here either: `REGISTER`\n  // is unfiltered, so an excluded announcement must still answer `getConfig`.\n  const segments = useSegments()\n\n  const queueConfig: QueueConfig = React.useMemo(\n    () => ({ ...DEFAULT_QUEUE_CONFIG, ...queueConfigOverrides }),\n    [queueConfigOverrides]\n  )\n\n  // The engine is constructed once and reads these through stable callbacks, so\n  // a changed `analytics` or a changed `onAnnouncementShow` never rebuilds it.\n  const live = React.useRef({\n    analytics,\n    onAnnouncementShow,\n    onAnnouncementDismiss,\n    onAnnouncementComplete,\n  })\n  live.current = { analytics, onAnnouncementShow, onAnnouncementDismiss, onAnnouncementComplete }\n\n  // Construct the HANDLE in render (cheap, inert, allocates nothing that\n  // matters) but never the engine: `createHandle` builds that on the first\n  // verb, which is what keeps StrictMode's double render and child-effects-\n  // before-parent-effects from producing two engines.\n  const [handle] = React.useState(() =>\n    createAnnouncementsHandle<AnnouncementConfig>({\n      announcements: initialAnnouncements,\n      queueConfig: queueConfigOverrides,\n      storage,\n      storageKey,\n      userContext,\n      segments,\n      analytics: {\n        track: (event, payload) => live.current.analytics?.track(event, payload),\n      },\n      onShow: (id) => live.current.onAnnouncementShow?.(id),\n      onDismiss: (id, reason) => live.current.onAnnouncementDismiss?.(id, reason),\n      onComplete: (id) => live.current.onAnnouncementComplete?.(id),\n    })\n  )\n\n  const state = React.useSyncExternalStore(handle.subscribe, handle.getState, handle.getState)\n\n  React.useEffect(() => {\n    handle.ensure().boot()\n    return () => handle.release()\n  }, [handle])\n\n  // Prop → verb. Each is guarded against its first run: `boot()` above already\n  // registered, restored and ran the auto-show pass with these exact values, so\n  // an unguarded effect would run the whole pass a second time on mount.\n  const mounted = React.useRef(false)\n  React.useEffect(() => {\n    if (!mounted.current) {\n      mounted.current = true\n      return\n    }\n    const engine = handle.ensure()\n    engine.setAnnouncements(initialAnnouncements)\n  }, [handle, initialAnnouncements])\n\n  const synced = React.useRef(false)\n  React.useEffect(() => {\n    if (!synced.current) {\n      synced.current = true\n      return\n    }\n    const engine = handle.ensure()\n    engine.setSegments(segments)\n    engine.setUserContext(userContext)\n    engine.setQueueConfig(queueConfig)\n  }, [handle, segments, userContext, queueConfig])\n\n  const verbs = React.useMemo(\n    () => ({\n      register: (config: AnnouncementConfig) => handle.ensure().register(config),\n      unregister: (id: string) => handle.ensure().unregister(id),\n      show: (id: string) => handle.ensure().show(id),\n      forceShow: (id: string) => handle.ensure().forceShow(id),\n      hide: (id: string) => handle.ensure().hide(id),\n      dismiss: (id: string, reason: DismissalReason = 'programmatic') =>\n        handle.ensure().dismiss(id, reason),\n      complete: (id: string) => handle.ensure().complete(id),\n      reset: (id: string) => handle.ensure().reset(id),\n      resetAll: () => handle.ensure().resetAll(),\n      getState: (id: string) => handle.ensure().getAnnouncementState(id),\n      getConfig: (id: string) => handle.ensure().getConfig(id),\n      canShow: (id: string) => handle.ensure().canShow(id),\n      showNext: () => handle.ensure().showNext(),\n      clearQueue: () => handle.ensure().clearQueue(),\n    }),\n    [handle]\n  )\n\n  const contextValue = React.useMemo<AnnouncementsContextValue>(\n    () => ({\n      announcements: state.announcements,\n      activeAnnouncement: state.activeAnnouncement,\n      queue: state.queue,\n      queueConfig,\n      ...verbs,\n      toastAdapter: toastAdapter ?? null,\n    }),\n    [state, queueConfig, verbs, toastAdapter]\n  )\n\n  return (\n    <LicenseGate require=\"pro\">\n      <AnnouncementsContext.Provider value={contextValue}>{children}</AnnouncementsContext.Provider>\n    </LicenseGate>\n  )\n}\n","import { useMemo } from 'react'\nimport { useAnnouncementsContext } from '../context/announcements-context'\nimport type {\n  AnnouncementConfig,\n  AnnouncementState,\n  AnnouncementVariant,\n} from '../types/announcement'\n\n/**\n * Filter options for announcements\n */\nexport interface AnnouncementsFilter {\n  /** Filter by variant type */\n  variant?: AnnouncementVariant | AnnouncementVariant[]\n  /** Filter by dismissed state */\n  isDismissed?: boolean\n  /** Filter by active state */\n  isActive?: boolean\n  /** Filter by visibility */\n  isVisible?: boolean\n  /** Custom filter function */\n  filter?: (state: AnnouncementState, config: AnnouncementConfig) => boolean\n}\n\n/**\n * Return type for useAnnouncements hook\n */\nexport interface UseAnnouncementsReturn {\n  /** All announcement states */\n  announcements: Map<string, AnnouncementState>\n  /** Currently active announcement ID */\n  activeId: string | null\n  /** Get all announcement IDs */\n  ids: string[]\n  /** Get announcements by filter */\n  getFiltered: (filter: AnnouncementsFilter) => AnnouncementState[]\n  /** Get visible announcements */\n  visible: AnnouncementState[]\n  /** Get dismissed announcements */\n  dismissed: AnnouncementState[]\n  /** Get count of announcements */\n  count: number\n  /** Reset all announcements */\n  resetAll: () => void\n}\n\n/**\n * Hook to access all announcements\n * @returns All announcements state and query methods\n */\nexport function useAnnouncements(): UseAnnouncementsReturn {\n  const context = useAnnouncementsContext()\n\n  const ids = useMemo(() => Array.from(context.announcements.keys()), [context.announcements])\n\n  const getFiltered = useMemo(\n    () =>\n      (filter: AnnouncementsFilter): AnnouncementState[] => {\n        const results: AnnouncementState[] = []\n\n        // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: filter logic with multiple criteria\n        context.announcements.forEach((state, id) => {\n          const config = context.getConfig(id)\n          if (!config) return\n\n          // Filter by variant\n          if (filter.variant !== undefined) {\n            const variants = Array.isArray(filter.variant) ? filter.variant : [filter.variant]\n            if (!variants.includes(config.variant)) return\n          }\n\n          // Filter by dismissed state\n          if (filter.isDismissed !== undefined && state.isDismissed !== filter.isDismissed) {\n            return\n          }\n\n          // Filter by active state\n          if (filter.isActive !== undefined && state.isActive !== filter.isActive) {\n            return\n          }\n\n          // Filter by visibility\n          if (filter.isVisible !== undefined && state.isVisible !== filter.isVisible) {\n            return\n          }\n\n          // Custom filter\n          if (filter.filter && !filter.filter(state, config)) {\n            return\n          }\n\n          results.push(state)\n        })\n\n        return results\n      },\n    [context]\n  )\n\n  const visible = useMemo(() => getFiltered({ isVisible: true }), [getFiltered])\n\n  const dismissed = useMemo(() => getFiltered({ isDismissed: true }), [getFiltered])\n\n  return useMemo(\n    () => ({\n      announcements: context.announcements,\n      activeId: context.activeAnnouncement,\n      ids,\n      getFiltered,\n      visible,\n      dismissed,\n      count: context.announcements.size,\n      resetAll: context.resetAll,\n    }),\n    [\n      context.announcements,\n      context.activeAnnouncement,\n      context.resetAll,\n      ids,\n      getFiltered,\n      visible,\n      dismissed,\n    ]\n  )\n}\n","import { useMemo } from 'react'\nimport { useAnnouncementsContext } from '../context/announcements-context'\nimport type { QueueConfig } from '../types/queue'\n\n/**\n * Return type for useAnnouncementQueue hook\n */\nexport interface UseAnnouncementQueueReturn {\n  /** IDs of announcements in the queue */\n  queue: string[]\n  /** Number of announcements in the queue */\n  size: number\n  /** Whether the queue is empty */\n  isEmpty: boolean\n  /** Current queue configuration */\n  config: QueueConfig\n  /** Show the next announcement in the queue */\n  showNext: () => void\n  /** Clear all announcements from the queue */\n  clear: () => void\n  /** Check if a specific announcement is in the queue */\n  isQueued: (id: string) => boolean\n  /** Get position of an announcement in the queue (-1 if not queued) */\n  getPosition: (id: string) => number\n}\n\n/**\n * Hook to interact with the announcement queue\n * @returns Queue state and control methods\n */\nexport function useAnnouncementQueue(): UseAnnouncementQueueReturn {\n  const context = useAnnouncementsContext()\n\n  const isQueued = useMemo(() => (id: string) => context.queue.includes(id), [context.queue])\n\n  const getPosition = useMemo(() => (id: string) => context.queue.indexOf(id), [context.queue])\n\n  return useMemo(\n    () => ({\n      queue: context.queue,\n      size: context.queue.length,\n      isEmpty: context.queue.length === 0,\n      config: context.queueConfig,\n      showNext: context.showNext,\n      clear: context.clearQueue,\n      isQueued,\n      getPosition,\n    }),\n    [\n      context.queue,\n      context.queueConfig,\n      context.showNext,\n      context.clearQueue,\n      isQueued,\n      getPosition,\n    ]\n  )\n}\n"]}