{"version":3,"sources":["../src/contexts/ConsentContext.tsx","../src/contexts/GenericConsentContext.tsx","../src/lib/utils.ts","../src/components/ui/Button.tsx","../src/components/consent/ConsentBanner.tsx","../src/components/ui/switch.tsx","../src/components/ui/dialog.tsx","../src/components/consent/ConsentSettings.tsx","../src/components/consent/ConsentManager.tsx","../src/components/consent/unstyled/UnstyledConsentBanner.tsx","../src/components/consent/unstyled/UnstyledConsentSettings.tsx","../src/components/consent/unstyled/UnstyledConsentToggle.tsx","../src/hooks/useConsentState.ts","../src/hooks/useConsentActions.ts","../src/hooks/useConsentManager.ts","../src/lib/consentService.ts","../src/index.ts"],"names":["ConsentContext","createContext","defaultConsent","ConsentProvider","children","initialConsent","onConsentChange","storageKey","consentState","setConsentState","useState","stored","parsed","__spreadValues","e","hasUserConsented","setHasUserConsented","showBanner","setShowBanner","showSettings","setShowSettings","useEffect","acceptAll","useCallback","rejectAll","savePreferences","preferences","prev","__spreadProps","updateConsent","category","value","openSettings","closeSettings","React","useConsent","context","useContext","createConsentContext","categories","getDefaultConsent","cat","newConsent","key","cn","inputs","twMerge","clsx","buttonVariants","cva","Button","_a","_b","className","variant","size","asChild","props","__objRest","de","Slot","ConsentBanner","renderBanner","theme","position","animation","fullWidth","maxWidth","unstyled","Switch","Q","Dialog","open","onOpenChange","w","DialogContent","ref","DialogHeader","DialogTitle","DialogDescription","cookieCategories","ConsentSettings","renderSettings","handleSave","checked","ConsentManagerInner","headless","components","consent","renderProps","ConsentManager","innerProps","UnstyledConsentBanner","UnstyledConsentSettings","UnstyledConsentToggle","label","useConsentState","useConsentActions","useConsentManager","listenersRef","useRef","previousStateRef","emit","event","data","listeners","listener","on","off","allAccepted","CONSENT_STORAGE_KEY","CONSENT_HISTORY_KEY","getConsentHistoryHelper","storedHistory","error","consentService","consents","userId","consentRecord","uuidv4","history","storedConsent","changeReason","type","current","cookieUtils","name","days","date","expires","nameEQ","ca","i","c","consentStorage"],"mappings":"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","file":"index.mjs","sourcesContent":["import React, { createContext, useContext, useState, useCallback, useEffect, ReactNode } from 'react';\n\nexport interface ConsentCategories {\n  necessary: boolean;\n  analytics: boolean;\n  marketing: boolean;\n  functional: boolean;\n  [key: string]: boolean;\n}\n\nexport interface ConsentState {\n  hasUserConsented: boolean;\n  consentState: ConsentCategories;\n  showBanner: boolean;\n  showSettings: boolean;\n}\n\nexport interface ConsentActions {\n  acceptAll: () => void;\n  rejectAll: () => void;\n  savePreferences: (preferences: Partial<ConsentCategories>) => void;\n  openSettings: () => void;\n  closeSettings: () => void;\n  updateConsent: (category: keyof ConsentCategories, value: boolean) => void;\n}\n\nexport interface ConsentContextValue extends ConsentState, ConsentActions {}\n\nconst ConsentContext = createContext<ConsentContextValue | undefined>(undefined);\n\nexport interface ConsentProviderProps {\n  children: ReactNode;\n  initialConsent?: Partial<ConsentCategories>;\n  onConsentChange?: (consent: ConsentCategories) => void;\n  storageKey?: string;\n}\n\nconst defaultConsent: ConsentCategories = {\n  necessary: true, // Always true\n  analytics: false,\n  marketing: false,\n  functional: false,\n};\n\nexport function ConsentProvider({\n  children,\n  initialConsent = {},\n  onConsentChange,\n  storageKey = 'ndpr-consent',\n}: ConsentProviderProps) {\n  const [consentState, setConsentState] = useState<ConsentCategories>(() => {\n    // Try to load from localStorage\n    if (typeof window !== 'undefined') {\n      const stored = localStorage.getItem(storageKey);\n      if (stored) {\n        try {\n          const parsed = JSON.parse(stored);\n          return { ...defaultConsent, ...parsed };\n        } catch (e) {\n          console.error('Failed to parse consent from localStorage', e);\n        }\n      }\n    }\n    return { ...defaultConsent, ...initialConsent };\n  });\n\n  const [hasUserConsented, setHasUserConsented] = useState(() => {\n    if (typeof window !== 'undefined') {\n      return localStorage.getItem(`${storageKey}-set`) === 'true';\n    }\n    return false;\n  });\n\n  const [showBanner, setShowBanner] = useState(!hasUserConsented);\n  const [showSettings, setShowSettings] = useState(false);\n\n  // Persist consent to localStorage\n  useEffect(() => {\n    if (typeof window !== 'undefined' && hasUserConsented) {\n      localStorage.setItem(storageKey, JSON.stringify(consentState));\n      localStorage.setItem(`${storageKey}-set`, 'true');\n    }\n  }, [consentState, hasUserConsented, storageKey]);\n\n  // Notify parent of consent changes\n  useEffect(() => {\n    if (hasUserConsented && onConsentChange) {\n      onConsentChange(consentState);\n    }\n  }, [consentState, hasUserConsented, onConsentChange]);\n\n  const acceptAll = useCallback(() => {\n    const newConsent: ConsentCategories = {\n      necessary: true,\n      analytics: true,\n      marketing: true,\n      functional: true,\n    };\n    setConsentState(newConsent);\n    setHasUserConsented(true);\n    setShowBanner(false);\n    setShowSettings(false);\n  }, []);\n\n  const rejectAll = useCallback(() => {\n    const newConsent: ConsentCategories = {\n      necessary: true,\n      analytics: false,\n      marketing: false,\n      functional: false,\n    };\n    setConsentState(newConsent);\n    setHasUserConsented(true);\n    setShowBanner(false);\n    setShowSettings(false);\n  }, []);\n\n  const savePreferences = useCallback((preferences: Partial<ConsentCategories>) => {\n    setConsentState(prev => ({\n      ...prev,\n      ...preferences,\n      necessary: true, // Always keep necessary as true\n    }));\n    setHasUserConsented(true);\n    setShowBanner(false);\n    setShowSettings(false);\n  }, []);\n\n  const updateConsent = useCallback((category: keyof ConsentCategories, value: boolean) => {\n    if (category === 'necessary') return; // Can't change necessary cookies\n    \n    setConsentState(prev => ({\n      ...prev,\n      [category]: value,\n    }));\n  }, []);\n\n  const openSettings = useCallback(() => {\n    setShowSettings(true);\n    setShowBanner(false);\n  }, []);\n\n  const closeSettings = useCallback(() => {\n    setShowSettings(false);\n  }, []);\n\n  const value: ConsentContextValue = {\n    hasUserConsented,\n    consentState,\n    showBanner,\n    showSettings,\n    acceptAll,\n    rejectAll,\n    savePreferences,\n    openSettings,\n    closeSettings,\n    updateConsent,\n  };\n\n  return (\n    <ConsentContext.Provider value={value}>\n      {children}\n    </ConsentContext.Provider>\n  );\n}\n\nexport function useConsent() {\n  const context = useContext(ConsentContext);\n  if (!context) {\n    throw new Error('useConsent must be used within a ConsentProvider');\n  }\n  return context;\n}\n\n// Export for external use\nexport { ConsentContext };","import React, { createContext, useContext, useState, useCallback, useEffect, ReactNode } from 'react';\nimport {\n  BaseConsentCategories,\n  DefaultConsentCategories,\n  ConsentState,\n  ConsentActions,\n  ConsentContextValue,\n  ConsentProviderProps,\n} from '@/types/consent';\n\n/**\n * Factory function to create a typed consent context\n */\nexport function createConsentContext<T extends BaseConsentCategories = DefaultConsentCategories>() {\n  const ConsentContext = createContext<ConsentContextValue<T> | undefined>(undefined);\n\n  function ConsentProvider({\n    children,\n    initialConsent = {} as Partial<T>,\n    onConsentChange,\n    storageKey = 'ndpr-consent',\n    categories,\n  }: ConsentProviderProps<T>) {\n    const getDefaultConsent = (): T => {\n      const defaultConsent: any = { necessary: true };\n      \n      if (categories) {\n        categories.forEach(cat => {\n          if (cat.id !== 'necessary') {\n            defaultConsent[cat.id] = false;\n          }\n        });\n      } else {\n        // Use default categories\n        defaultConsent.analytics = false;\n        defaultConsent.marketing = false;\n        defaultConsent.functional = false;\n      }\n      \n      return defaultConsent as T;\n    };\n\n    const [consentState, setConsentState] = useState<T>(() => {\n      // Try to load from localStorage\n      if (typeof window !== 'undefined') {\n        const stored = localStorage.getItem(storageKey);\n        if (stored) {\n          try {\n            const parsed = JSON.parse(stored);\n            return { ...getDefaultConsent(), ...parsed };\n          } catch (e) {\n            console.error('Failed to parse consent from localStorage', e);\n          }\n        }\n      }\n      return { ...getDefaultConsent(), ...initialConsent } as T;\n    });\n\n    const [hasUserConsented, setHasUserConsented] = useState(() => {\n      if (typeof window !== 'undefined') {\n        return localStorage.getItem(`${storageKey}-set`) === 'true';\n      }\n      return false;\n    });\n\n    const [showBanner, setShowBanner] = useState(!hasUserConsented);\n    const [showSettings, setShowSettings] = useState(false);\n\n    // Persist consent to localStorage\n    useEffect(() => {\n      if (typeof window !== 'undefined' && hasUserConsented) {\n        localStorage.setItem(storageKey, JSON.stringify(consentState));\n        localStorage.setItem(`${storageKey}-set`, 'true');\n      }\n    }, [consentState, hasUserConsented, storageKey]);\n\n    // Notify parent of consent changes\n    useEffect(() => {\n      if (hasUserConsented && onConsentChange) {\n        onConsentChange(consentState);\n      }\n    }, [consentState, hasUserConsented, onConsentChange]);\n\n    const acceptAll = useCallback(() => {\n      const newConsent = { ...consentState };\n      Object.keys(newConsent).forEach(key => {\n        newConsent[key as keyof T] = true as any;\n      });\n      setConsentState(newConsent);\n      setHasUserConsented(true);\n      setShowBanner(false);\n      setShowSettings(false);\n    }, [consentState]);\n\n    const rejectAll = useCallback(() => {\n      const newConsent = { ...consentState };\n      Object.keys(newConsent).forEach(key => {\n        if (key !== 'necessary') {\n          newConsent[key as keyof T] = false as any;\n        }\n      });\n      setConsentState(newConsent);\n      setHasUserConsented(true);\n      setShowBanner(false);\n      setShowSettings(false);\n    }, [consentState]);\n\n    const savePreferences = useCallback((preferences: Partial<T>) => {\n      setConsentState(prev => ({\n        ...prev,\n        ...preferences,\n        necessary: true, // Always keep necessary as true\n      } as T));\n      setHasUserConsented(true);\n      setShowBanner(false);\n      setShowSettings(false);\n    }, []);\n\n    const updateConsent = useCallback((category: keyof T, value: boolean) => {\n      if (category === 'necessary') return; // Can't change necessary cookies\n      \n      setConsentState(prev => ({\n        ...prev,\n        [category]: value,\n      }));\n    }, []);\n\n    const openSettings = useCallback(() => {\n      setShowSettings(true);\n      setShowBanner(false);\n    }, []);\n\n    const closeSettings = useCallback(() => {\n      setShowSettings(false);\n    }, []);\n\n    const value: ConsentContextValue<T> = {\n      hasUserConsented,\n      consentState,\n      showBanner,\n      showSettings,\n      acceptAll,\n      rejectAll,\n      savePreferences,\n      openSettings,\n      closeSettings,\n      updateConsent,\n    };\n\n    return (\n      <ConsentContext.Provider value={value}>\n        {children}\n      </ConsentContext.Provider>\n    );\n  }\n\n  function useConsent() {\n    const context = useContext(ConsentContext);\n    if (!context) {\n      throw new Error('useConsent must be used within a ConsentProvider');\n    }\n    return context;\n  }\n\n  return {\n    ConsentContext,\n    ConsentProvider,\n    useConsent,\n  };\n}","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n  return twMerge(clsx(inputs))\n}\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst buttonVariants = cva(\n  \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n  {\n    variants: {\n      variant: {\n        default:\n          \"bg-primary text-primary-foreground shadow-xs hover:bg-primary/90\",\n        destructive:\n          \"bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n        outline:\n          \"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50\",\n        secondary:\n          \"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80\",\n        ghost:\n          \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n        link: \"text-primary underline-offset-4 hover:underline\",\n      },\n      size: {\n        default: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n        sm: \"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5\",\n        lg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n        icon: \"size-9\",\n      },\n    },\n    defaultVariants: {\n      variant: \"default\",\n      size: \"default\",\n    },\n  }\n)\n\nfunction Button({\n  className,\n  variant,\n  size,\n  asChild = false,\n  ...props\n}: React.ComponentProps<\"button\"> &\n  VariantProps<typeof buttonVariants> & {\n    asChild?: boolean\n  }) {\n  const Comp = asChild ? Slot : \"button\"\n\n  return (\n    <Comp\n      data-slot=\"button\"\n      className={cn(buttonVariants({ variant, size, className }))}\n      {...props}\n    />\n  )\n}\n\nexport { Button, buttonVariants }\n","import React, { ReactNode } from 'react';\nimport { useConsent } from '@/contexts/ConsentContext';\nimport { Button } from '@/components/ui/Button';\nimport { cn } from '@/lib/utils';\nimport { BannerProps } from './ConsentManager';\n\nexport interface ConsentBannerProps {\n  renderBanner?: (props: BannerProps) => ReactNode;\n  theme?: {\n    primaryColor?: string;\n    textColor?: string;\n    backgroundColor?: string;\n  };\n  position?: 'top' | 'bottom' | 'center';\n  animation?: 'slide' | 'fade' | 'none';\n  fullWidth?: boolean;\n  maxWidth?: string;\n  unstyled?: boolean;\n  className?: string;\n  children?: ReactNode;\n}\n\ninterface ConsentBannerComponent extends React.FC<ConsentBannerProps> {\n  Message: React.FC<{ children: ReactNode; className?: string }>;\n  Actions: React.FC<{ children: ReactNode; className?: string }>;\n}\n\nconst ConsentBanner: ConsentBannerComponent = ({\n  renderBanner,\n  theme,\n  position = 'bottom',\n  animation = 'slide',\n  fullWidth = true,\n  maxWidth = '1200px',\n  unstyled = false,\n  className,\n  children,\n}) => {\n  const { showBanner, acceptAll, rejectAll, openSettings } = useConsent();\n\n  if (!showBanner) return null;\n\n  // Custom render function\n  if (renderBanner) {\n    return <>{renderBanner({ onAcceptAll: acceptAll, onRejectAll: rejectAll, onOpenSettings: openSettings })}</>;\n  }\n\n  // Children-based composition\n  if (children) {\n    return (\n      <div\n        className={cn(\n          !unstyled && [\n            'fixed z-50 p-4',\n            position === 'bottom' && 'bottom-0 left-0 right-0',\n            position === 'top' && 'top-0 left-0 right-0',\n            position === 'center' && 'top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2',\n            animation === 'slide' && 'animate-slide-in',\n            animation === 'fade' && 'animate-fade-in',\n          ],\n          className\n        )}\n        style={{\n          backgroundColor: unstyled ? undefined : theme?.backgroundColor || 'white',\n          color: unstyled ? undefined : theme?.textColor,\n          maxWidth: fullWidth ? undefined : maxWidth,\n          margin: fullWidth ? undefined : '0 auto',\n        }}\n      >\n        {children}\n      </div>\n    );\n  }\n\n  // Default implementation\n  return (\n    <div\n      className={cn(\n        'fixed z-50 p-4',\n        position === 'bottom' && 'bottom-0 left-0 right-0',\n        position === 'top' && 'top-0 left-0 right-0',\n        position === 'center' && 'top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2',\n        animation === 'slide' && 'animate-slide-in',\n        animation === 'fade' && 'animate-fade-in',\n        className\n      )}\n      style={{\n        backgroundColor: theme?.backgroundColor || 'white',\n        color: theme?.textColor,\n      }}\n    >\n      <div\n        className=\"mx-auto\"\n        style={{\n          maxWidth: fullWidth ? undefined : maxWidth,\n        }}\n      >\n        <div className=\"bg-white rounded-lg shadow-lg p-6\">\n          <h3 className=\"text-lg font-semibold mb-2\">Cookie Consent</h3>\n          <p className=\"text-gray-600 mb-4\">\n            We use cookies to enhance your experience. By continuing to visit this site you agree to our use of cookies.\n          </p>\n          <div className=\"flex gap-3 flex-wrap\">\n            <Button\n              onClick={acceptAll}\n              style={{ backgroundColor: theme?.primaryColor }}\n            >\n              Accept All\n            </Button>\n            <Button\n              onClick={rejectAll}\n              variant=\"outline\"\n            >\n              Reject All\n            </Button>\n            <Button\n              onClick={openSettings}\n              variant=\"ghost\"\n            >\n              Manage Preferences\n            </Button>\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n};\n\n// Sub-components for composition\nConsentBanner.Message = ({ children, className }) => (\n  <div className={cn('mb-4', className)}>{children}</div>\n);\n\nConsentBanner.Actions = ({ children, className }) => (\n  <div className={cn('flex gap-3 flex-wrap', className)}>{children}</div>\n);\n\nexport { ConsentBanner };","\"use client\"\n\nimport * as React from \"react\"\nimport * as SwitchPrimitive from \"@radix-ui/react-switch\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Switch({\n  className,\n  ...props\n}: React.ComponentProps<typeof SwitchPrimitive.Root>) {\n  return (\n    <SwitchPrimitive.Root\n      data-slot=\"switch\"\n      className={cn(\n        \"peer data-[state=checked]:bg-primary data-[state=unchecked]:bg-input focus-visible:border-ring focus-visible:ring-ring/50 dark:data-[state=unchecked]:bg-input/80 inline-flex h-[1.15rem] w-8 shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50\",\n        className\n      )}\n      {...props}\n    >\n      <SwitchPrimitive.Thumb\n        data-slot=\"switch-thumb\"\n        className={cn(\n          \"bg-background dark:data-[state=unchecked]:bg-foreground dark:data-[state=checked]:bg-primary-foreground pointer-events-none block size-4 rounded-full ring-0 transition-transform data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0\"\n        )}\n      />\n    </SwitchPrimitive.Root>\n  )\n}\n\nexport { Switch }\n","import * as React from \"react\"\nimport { cn } from \"@/lib/utils\"\n\ninterface DialogProps {\n  open?: boolean\n  onOpenChange?: (open: boolean) => void\n  children: React.ReactNode\n}\n\nconst Dialog = ({ open, onOpenChange, children }: DialogProps) => {\n  if (!open) return null\n\n  return (\n    <div className=\"fixed inset-0 z-50 flex items-center justify-center\">\n      <div \n        className=\"fixed inset-0 bg-black/50\" \n        onClick={() => onOpenChange?.(false)}\n      />\n      {children}\n    </div>\n  )\n}\n\nconst DialogContent = React.forwardRef<\n  HTMLDivElement,\n  React.HTMLAttributes<HTMLDivElement> & { unstyled?: boolean }\n>(({ className, children, unstyled, ...props }, ref) => (\n  <div\n    ref={ref}\n    className={cn(\n      !unstyled && \"relative z-50 grid w-full max-w-lg gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 sm:rounded-lg\",\n      className\n    )}\n    {...props}\n  >\n    {children}\n  </div>\n))\nDialogContent.displayName = \"DialogContent\"\n\nconst DialogHeader = ({\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n  <div\n    className={cn(\n      \"flex flex-col space-y-1.5 text-center sm:text-left\",\n      className\n    )}\n    {...props}\n  />\n)\nDialogHeader.displayName = \"DialogHeader\"\n\nconst DialogTitle = React.forwardRef<\n  HTMLHeadingElement,\n  React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n  <h3\n    ref={ref}\n    className={cn(\n      \"text-lg font-semibold leading-none tracking-tight\",\n      className\n    )}\n    {...props}\n  />\n))\nDialogTitle.displayName = \"DialogTitle\"\n\nconst DialogDescription = React.forwardRef<\n  HTMLParagraphElement,\n  React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n  <p\n    ref={ref}\n    className={cn(\"text-sm text-muted-foreground\", className)}\n    {...props}\n  />\n))\nDialogDescription.displayName = \"DialogDescription\"\n\nexport {\n  Dialog,\n  DialogContent,\n  DialogHeader,\n  DialogTitle,\n  DialogDescription,\n}","import React, { ReactNode } from 'react';\nimport { useConsent } from '@/contexts/ConsentContext';\nimport { Button } from '@/components/ui/Button';\nimport { Switch } from '@/components/ui/switch';\nimport { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription } from '@/components/ui/dialog';\nimport { SettingsProps } from './ConsentManager';\n\nexport interface ConsentSettingsProps {\n  renderSettings?: (props: SettingsProps) => ReactNode;\n  theme?: {\n    primaryColor?: string;\n    textColor?: string;\n    backgroundColor?: string;\n  };\n  unstyled?: boolean;\n  className?: string;\n  children?: ReactNode;\n}\n\nconst cookieCategories = [\n  {\n    id: 'necessary',\n    name: 'Necessary Cookies',\n    description: 'These cookies are essential for the website to function properly.',\n    disabled: true,\n  },\n  {\n    id: 'analytics',\n    name: 'Analytics Cookies',\n    description: 'These cookies help us understand how visitors interact with our website.',\n    disabled: false,\n  },\n  {\n    id: 'marketing',\n    name: 'Marketing Cookies',\n    description: 'These cookies are used to track visitors across websites for marketing purposes.',\n    disabled: false,\n  },\n  {\n    id: 'functional',\n    name: 'Functional Cookies',\n    description: 'These cookies enable personalized features and functionality.',\n    disabled: false,\n  },\n];\n\nexport const ConsentSettings: React.FC<ConsentSettingsProps> = ({\n  renderSettings,\n  theme,\n  unstyled = false,\n  className,\n  children,\n}) => {\n  const { showSettings, consentState, updateConsent, savePreferences, closeSettings } = useConsent();\n\n  if (!showSettings) return null;\n\n  const handleSave = () => {\n    savePreferences(consentState);\n  };\n\n  // Custom render function\n  if (renderSettings) {\n    return (\n      <>\n        {renderSettings({\n          consentState,\n          onUpdateConsent: updateConsent,\n          onSave: handleSave,\n          onClose: closeSettings,\n        })}\n      </>\n    );\n  }\n\n  // Children-based composition\n  if (children) {\n    return (\n      <Dialog open={showSettings} onOpenChange={closeSettings}>\n        <DialogContent className={className} unstyled={unstyled}>\n          {children}\n        </DialogContent>\n      </Dialog>\n    );\n  }\n\n  // Default implementation\n  return (\n    <Dialog open={showSettings} onOpenChange={closeSettings}>\n      <DialogContent className=\"max-w-2xl\">\n        <DialogHeader>\n          <DialogTitle>Cookie Preferences</DialogTitle>\n          <DialogDescription>\n            Manage your cookie preferences. You can enable or disable different categories of cookies below.\n          </DialogDescription>\n        </DialogHeader>\n        \n        <div className=\"space-y-6 py-4\">\n          {cookieCategories.map((category) => (\n            <div key={category.id} className=\"flex items-start justify-between space-x-4\">\n              <div className=\"flex-1\">\n                <h4 className=\"font-medium mb-1\">{category.name}</h4>\n                <p className=\"text-sm text-gray-600\">{category.description}</p>\n              </div>\n              <Switch\n                checked={consentState[category.id as keyof typeof consentState]}\n                onCheckedChange={(checked) => updateConsent(category.id as keyof typeof consentState, checked)}\n                disabled={category.disabled}\n              />\n            </div>\n          ))}\n        </div>\n\n        <div className=\"flex justify-end gap-3 pt-4 border-t\">\n          <Button variant=\"outline\" onClick={closeSettings}>\n            Cancel\n          </Button>\n          <Button\n            onClick={handleSave}\n            style={{ backgroundColor: theme?.primaryColor }}\n          >\n            Save Preferences\n          </Button>\n        </div>\n      </DialogContent>\n    </Dialog>\n  );\n};","import React, { ReactNode } from 'react';\nimport { ConsentProvider, ConsentProviderProps, ConsentCategories, ConsentActions, useConsent } from '@/contexts/ConsentContext';\nimport { ConsentBanner } from './ConsentBanner';\nimport { ConsentSettings } from './ConsentSettings';\n\nexport interface BannerProps {\n  onAcceptAll: () => void;\n  onRejectAll: () => void;\n  onOpenSettings: () => void;\n}\n\nexport interface SettingsProps {\n  consentState: ConsentCategories;\n  onUpdateConsent: (category: keyof ConsentCategories, value: boolean) => void;\n  onSave: () => void;\n  onClose: () => void;\n}\n\nexport interface RenderProps {\n  consents: ConsentCategories;\n  actions: ConsentActions;\n  ui: {\n    showBanner: boolean;\n    showSettings: boolean;\n    openSettings: () => void;\n    closeSettings: () => void;\n  };\n}\n\nexport interface ConsentManagerProps extends Omit<ConsentProviderProps, 'children'> {\n  children?: ReactNode | ((props: RenderProps) => ReactNode);\n  headless?: boolean;\n  renderBanner?: (props: BannerProps) => ReactNode;\n  renderSettings?: (props: SettingsProps) => ReactNode;\n  components?: {\n    Banner?: React.ComponentType<any>;\n    Settings?: React.ComponentType<any>;\n  };\n  theme?: {\n    primaryColor?: string;\n    textColor?: string;\n    backgroundColor?: string;\n  };\n  position?: 'top' | 'bottom' | 'center';\n  animation?: 'slide' | 'fade' | 'none';\n  fullWidth?: boolean;\n  maxWidth?: string;\n}\n\ninterface ConsentManagerComponent extends React.FC<ConsentManagerProps> {\n  Banner: typeof ConsentBanner;\n  Settings: typeof ConsentSettings;\n}\n\n// Internal component that has access to consent context\nconst ConsentManagerInner: React.FC<Omit<ConsentManagerProps, keyof Omit<ConsentProviderProps, 'children'>>> = ({\n  children,\n  headless = false,\n  renderBanner,\n  renderSettings,\n  components,\n  theme,\n  position = 'bottom',\n  animation = 'slide',\n  fullWidth = true,\n  maxWidth = '1200px',\n}) => {\n  const consent = useConsent();\n\n  // If using render props pattern\n  if (typeof children === 'function') {\n    const renderProps: RenderProps = {\n      consents: consent.consentState,\n      actions: {\n        acceptAll: consent.acceptAll,\n        rejectAll: consent.rejectAll,\n        savePreferences: consent.savePreferences,\n        updateConsent: consent.updateConsent,\n        openSettings: consent.openSettings,\n        closeSettings: consent.closeSettings,\n      },\n      ui: {\n        showBanner: consent.showBanner,\n        showSettings: consent.showSettings,\n        openSettings: consent.openSettings,\n        closeSettings: consent.closeSettings,\n      },\n    };\n    return <>{children(renderProps)}</>;\n  }\n\n  return (\n    <>\n      {children}\n      {!headless && (\n        <>\n          {components?.Banner ? (\n            <components.Banner />\n          ) : (\n            <ConsentBanner\n              renderBanner={renderBanner}\n              theme={theme}\n              position={position}\n              animation={animation}\n              fullWidth={fullWidth}\n              maxWidth={maxWidth}\n            />\n          )}\n          {components?.Settings ? (\n            <components.Settings />\n          ) : (\n            <ConsentSettings\n              renderSettings={renderSettings}\n              theme={theme}\n            />\n          )}\n        </>\n      )}\n    </>\n  );\n};\n\nconst ConsentManager: ConsentManagerComponent = ({\n  children,\n  initialConsent,\n  onConsentChange,\n  storageKey,\n  ...innerProps\n}) => {\n  return (\n    <ConsentProvider\n      initialConsent={initialConsent}\n      onConsentChange={onConsentChange}\n      storageKey={storageKey}\n    >\n      <ConsentManagerInner {...innerProps}>\n        {children}\n      </ConsentManagerInner>\n    </ConsentProvider>\n  );\n};\n\n// Attach sub-components for composition\nConsentManager.Banner = ConsentBanner;\nConsentManager.Settings = ConsentSettings;\n\nexport { ConsentManager };","import React, { ReactNode } from 'react';\nimport { useConsent } from '@/contexts/ConsentContext';\n\nexport interface UnstyledConsentBannerProps {\n  className?: string;\n  children?: ReactNode;\n}\n\nexport const UnstyledConsentBanner: React.FC<UnstyledConsentBannerProps> = ({\n  className,\n  children,\n}) => {\n  const { showBanner, acceptAll, rejectAll, openSettings } = useConsent();\n\n  if (!showBanner) return null;\n\n  return (\n    <div className={className} role=\"region\" aria-label=\"Cookie consent\">\n      {children || (\n        <>\n          <div>\n            <h3>Cookie Consent</h3>\n            <p>We use cookies to enhance your experience. By continuing to visit this site you agree to our use of cookies.</p>\n          </div>\n          <div>\n            <button onClick={acceptAll} aria-label=\"Accept all cookies\">\n              Accept All\n            </button>\n            <button onClick={rejectAll} aria-label=\"Reject non-essential cookies\">\n              Reject All\n            </button>\n            <button onClick={openSettings} aria-label=\"Manage cookie preferences\">\n              Manage Preferences\n            </button>\n          </div>\n        </>\n      )}\n    </div>\n  );\n};","import React, { ReactNode } from 'react';\nimport { useConsent } from '@/contexts/ConsentContext';\n\nexport interface UnstyledConsentSettingsProps {\n  className?: string;\n  children?: ReactNode;\n}\n\nconst cookieCategories = [\n  {\n    id: 'necessary',\n    name: 'Necessary Cookies',\n    description: 'These cookies are essential for the website to function properly.',\n    disabled: true,\n  },\n  {\n    id: 'analytics',\n    name: 'Analytics Cookies',\n    description: 'These cookies help us understand how visitors interact with our website.',\n    disabled: false,\n  },\n  {\n    id: 'marketing',\n    name: 'Marketing Cookies',\n    description: 'These cookies are used to track visitors across websites for marketing purposes.',\n    disabled: false,\n  },\n  {\n    id: 'functional',\n    name: 'Functional Cookies',\n    description: 'These cookies enable personalized features and functionality.',\n    disabled: false,\n  },\n];\n\nexport const UnstyledConsentSettings: React.FC<UnstyledConsentSettingsProps> = ({\n  className,\n  children,\n}) => {\n  const { showSettings, consentState, updateConsent, savePreferences, closeSettings } = useConsent();\n\n  if (!showSettings) return null;\n\n  const handleSave = () => {\n    savePreferences(consentState);\n  };\n\n  return (\n    <div className={className} role=\"dialog\" aria-label=\"Cookie preferences\">\n      {children || (\n        <>\n          <div>\n            <h2>Cookie Preferences</h2>\n            <p>Manage your cookie preferences. You can enable or disable different categories of cookies below.</p>\n          </div>\n          \n          <div>\n            {cookieCategories.map((category) => (\n              <div key={category.id}>\n                <div>\n                  <h4>{category.name}</h4>\n                  <p>{category.description}</p>\n                </div>\n                <input\n                  type=\"checkbox\"\n                  checked={consentState[category.id as keyof typeof consentState]}\n                  onChange={(e) => updateConsent(category.id as keyof typeof consentState, e.target.checked)}\n                  disabled={category.disabled}\n                  aria-label={`Toggle ${category.name}`}\n                />\n              </div>\n            ))}\n          </div>\n\n          <div>\n            <button onClick={closeSettings} aria-label=\"Cancel changes\">\n              Cancel\n            </button>\n            <button onClick={handleSave} aria-label=\"Save cookie preferences\">\n              Save Preferences\n            </button>\n          </div>\n        </>\n      )}\n    </div>\n  );\n};","import React from 'react';\nimport { useConsent } from '@/contexts/ConsentContext';\n\nexport interface UnstyledConsentToggleProps {\n  category: 'analytics' | 'marketing' | 'functional';\n  className?: string;\n  label?: string;\n}\n\nexport const UnstyledConsentToggle: React.FC<UnstyledConsentToggleProps> = ({\n  category,\n  className,\n  label,\n}) => {\n  const { consentState, updateConsent } = useConsent();\n\n  return (\n    <label className={className}>\n      <input\n        type=\"checkbox\"\n        checked={consentState[category]}\n        onChange={(e) => updateConsent(category, e.target.checked)}\n        aria-label={label || `Toggle ${category} cookies`}\n      />\n      {label && <span>{label}</span>}\n    </label>\n  );\n};","import { useConsent } from '@/contexts/ConsentContext';\n\n/**\n * Hook to access only the consent state without actions\n */\nexport function useConsentState() {\n  const { hasUserConsented, consentState, showBanner, showSettings } = useConsent();\n  \n  return {\n    hasUserConsented,\n    consentState,\n    showBanner,\n    showSettings,\n  };\n}","import { useConsent } from '@/contexts/ConsentContext';\n\n/**\n * Hook to access only the consent actions without state\n */\nexport function useConsentActions() {\n  const {\n    acceptAll,\n    rejectAll,\n    savePreferences,\n    openSettings,\n    closeSettings,\n    updateConsent,\n  } = useConsent();\n  \n  return {\n    acceptAll,\n    rejectAll,\n    savePreferences,\n    openSettings,\n    closeSettings,\n    updateConsent,\n  };\n}","import { useEffect, useRef, useCallback } from 'react';\nimport { useConsent } from '@/contexts/ConsentContext';\nimport { ConsentCategories } from '@/contexts/ConsentContext';\n\ntype ConsentEventType = \n  | 'consent:accepted'\n  | 'consent:rejected'\n  | 'consent:updated'\n  | 'banner:shown'\n  | 'banner:hidden'\n  | 'settings:opened'\n  | 'settings:closed';\n\ntype ConsentEventListener = (data?: any) => void;\n\ninterface ConsentEventManager {\n  on: (event: ConsentEventType, listener: ConsentEventListener) => () => void;\n  off: (event: ConsentEventType, listener: ConsentEventListener) => void;\n  emit: (event: ConsentEventType, data?: any) => void;\n}\n\n/**\n * Advanced hook that provides event-driven consent management\n */\nexport function useConsentManager(): ConsentEventManager & ReturnType<typeof useConsent> {\n  const consent = useConsent();\n  const listenersRef = useRef<Map<ConsentEventType, Set<ConsentEventListener>>>(new Map());\n  const previousStateRef = useRef({\n    hasUserConsented: consent.hasUserConsented,\n    showBanner: consent.showBanner,\n    showSettings: consent.showSettings,\n    consentState: consent.consentState,\n  });\n\n  // Event emitter implementation\n  const emit = useCallback((event: ConsentEventType, data?: any) => {\n    const listeners = listenersRef.current.get(event);\n    if (listeners) {\n      listeners.forEach(listener => listener(data));\n    }\n  }, []);\n\n  const on = useCallback((event: ConsentEventType, listener: ConsentEventListener) => {\n    if (!listenersRef.current.has(event)) {\n      listenersRef.current.set(event, new Set());\n    }\n    listenersRef.current.get(event)!.add(listener);\n\n    // Return unsubscribe function\n    return () => {\n      const listeners = listenersRef.current.get(event);\n      if (listeners) {\n        listeners.delete(listener);\n      }\n    };\n  }, []);\n\n  const off = useCallback((event: ConsentEventType, listener: ConsentEventListener) => {\n    const listeners = listenersRef.current.get(event);\n    if (listeners) {\n      listeners.delete(listener);\n    }\n  }, []);\n\n  // Track state changes and emit events\n  useEffect(() => {\n    const prev = previousStateRef.current;\n    \n    // Check for consent acceptance\n    if (!prev.hasUserConsented && consent.hasUserConsented) {\n      const allAccepted = Object.entries(consent.consentState)\n        .filter(([key]) => key !== 'necessary')\n        .every(([, value]) => value);\n      \n      if (allAccepted) {\n        emit('consent:accepted', consent.consentState);\n      } else {\n        emit('consent:rejected', consent.consentState);\n      }\n    }\n\n    // Check for consent updates\n    if (prev.hasUserConsented && consent.hasUserConsented && \n        JSON.stringify(prev.consentState) !== JSON.stringify(consent.consentState)) {\n      emit('consent:updated', consent.consentState);\n    }\n\n    // Check for banner visibility changes\n    if (!prev.showBanner && consent.showBanner) {\n      emit('banner:shown');\n    } else if (prev.showBanner && !consent.showBanner) {\n      emit('banner:hidden');\n    }\n\n    // Check for settings visibility changes\n    if (!prev.showSettings && consent.showSettings) {\n      emit('settings:opened');\n    } else if (prev.showSettings && !consent.showSettings) {\n      emit('settings:closed');\n    }\n\n    // Update previous state\n    previousStateRef.current = {\n      hasUserConsented: consent.hasUserConsented,\n      showBanner: consent.showBanner,\n      showSettings: consent.showSettings,\n      consentState: { ...consent.consentState },\n    };\n  }, [consent, emit]);\n\n  return {\n    ...consent,\n    on,\n    off,\n    emit,\n  };\n}","'use client';\n\nimport { ConsentRecord, ConsentType, ConsentHistoryEntry } from '@/types';\nimport { v4 as uuidv4 } from 'uuid';\n\n// In a real implementation, this would connect to a database\n// For demo purposes, we're using localStorage\n\nconst CONSENT_STORAGE_KEY = 'ndpr_consent_records';\nconst CONSENT_HISTORY_KEY = 'ndpr_consent_history';\n\n// Helper function to get consent history\nconst getConsentHistoryHelper = (): ConsentHistoryEntry[] => {\n  if (typeof window === 'undefined') return [];\n  \n  const storedHistory = localStorage.getItem(CONSENT_HISTORY_KEY);\n  if (!storedHistory) return [];\n  \n  try {\n    return JSON.parse(storedHistory) as ConsentHistoryEntry[];\n  } catch (error) {\n    console.error('Error parsing consent history:', error);\n    return [];\n  }\n};\n\nexport const consentService = {\n  // Save a new consent record\n  saveConsent: (consents: Record<ConsentType, boolean>, userId?: string): ConsentRecord => {\n    const consentRecord: ConsentRecord = {\n      id: uuidv4(),\n      userId,\n      consents,\n      timestamp: new Date().toISOString(),\n      ipAddress: 'Collected server-side in real implementation',\n      userAgent: typeof window !== 'undefined' ? window.navigator.userAgent : 'Unknown',\n    };\n\n    // Store in localStorage for demo\n    if (typeof window !== 'undefined') {\n      // Save as current consent\n      localStorage.setItem(CONSENT_STORAGE_KEY, JSON.stringify(consentRecord));\n      \n      // Add to history\n      const history = getConsentHistoryHelper();\n      history.push(consentRecord);\n      localStorage.setItem(CONSENT_HISTORY_KEY, JSON.stringify(history));\n    }\n\n    return consentRecord;\n  },\n\n  // Get the current consent record\n  getCurrentConsent: (): ConsentRecord | null => {\n    if (typeof window === 'undefined') return null;\n    \n    const storedConsent = localStorage.getItem(CONSENT_STORAGE_KEY);\n    if (!storedConsent) return null;\n    \n    try {\n      return JSON.parse(storedConsent) as ConsentRecord;\n    } catch (error) {\n      console.error('Error parsing consent record:', error);\n      return null;\n    }\n  },\n\n  // Get consent history\n  getConsentHistory: (): ConsentHistoryEntry[] => {\n    return getConsentHistoryHelper();\n  },\n\n  // Update consent with change reason\n  updateConsent: (\n    consents: Record<ConsentType, boolean>, \n    changeReason?: string,\n    userId?: string\n  ): ConsentRecord => {\n    const consentRecord: ConsentHistoryEntry = {\n      id: uuidv4(),\n      userId,\n      consents,\n      timestamp: new Date().toISOString(),\n      ipAddress: 'Collected server-side in real implementation',\n      userAgent: typeof window !== 'undefined' ? window.navigator.userAgent : 'Unknown',\n      changeReason\n    };\n\n    // Store in localStorage for demo\n    if (typeof window !== 'undefined') {\n      // Save as current consent\n      localStorage.setItem(CONSENT_STORAGE_KEY, JSON.stringify(consentRecord));\n      \n      // Add to history\n      const history = getConsentHistoryHelper();\n      history.push(consentRecord);\n      localStorage.setItem(CONSENT_HISTORY_KEY, JSON.stringify(history));\n    }\n\n    return consentRecord;\n  },\n\n  // Clear all consent data (for testing/development)\n  clearConsentData: (): void => {\n    if (typeof window === 'undefined') return;\n    \n    localStorage.removeItem(CONSENT_STORAGE_KEY);\n    localStorage.removeItem(CONSENT_HISTORY_KEY);\n  },\n\n  // Check if a specific consent is granted\n  hasConsent: (type: ConsentType): boolean => {\n    const current = consentService.getCurrentConsent();\n    if (!current) return false;\n    return current.consents[type] === true;\n  }\n};\n\nexport default consentService;\n","// Core exports\nexport { ConsentProvider, useConsent, ConsentContext } from './contexts/ConsentContext';\nexport type { ConsentCategories, ConsentState, ConsentActions, ConsentContextValue } from './contexts/ConsentContext';\n\n// Generic consent context factory\nexport { createConsentContext } from './contexts/GenericConsentContext';\nexport type {\n  BaseConsentCategories,\n  DefaultConsentCategories,\n  ConsentProviderProps,\n} from './types/consent';\n\n// Components\nexport { ConsentManager } from './components/consent/ConsentManager';\nexport { ConsentBanner } from './components/consent/ConsentBanner';\nexport { ConsentSettings } from './components/consent/ConsentSettings';\nexport type { ConsentManagerProps, BannerProps, SettingsProps, RenderProps } from './components/consent/ConsentManager';\n\n// Unstyled components\nexport {\n  UnstyledConsentBanner,\n  UnstyledConsentSettings,\n  UnstyledConsentToggle,\n} from './components/consent/unstyled';\n\n// Hooks\nexport { useConsentState } from './hooks/useConsentState';\nexport { useConsentActions } from './hooks/useConsentActions';\nexport { useConsentManager } from './hooks/useConsentManager';\n\n// Utilities\nexport { consentService } from './lib/consentService';\n\n// Cookie utilities\nexport const cookieUtils = {\n  set: (name: string, value: string, days: number) => {\n    if (typeof window === 'undefined') return;\n    const date = new Date();\n    date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));\n    const expires = `expires=${date.toUTCString()}`;\n    document.cookie = `${name}=${value};${expires};path=/`;\n  },\n  get: (name: string): string | null => {\n    if (typeof window === 'undefined') return null;\n    const nameEQ = `${name}=`;\n    const ca = document.cookie.split(';');\n    for (let i = 0; i < ca.length; i++) {\n      let c = ca[i];\n      while (c.charAt(0) === ' ') c = c.substring(1, c.length);\n      if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);\n    }\n    return null;\n  },\n  delete: (name: string) => {\n    if (typeof window === 'undefined') return;\n    document.cookie = `${name}=;expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/;`;\n  }\n};\n\n// Consent storage utilities\nexport const consentStorage = {\n  save: (key: string, data: any) => {\n    if (typeof window === 'undefined') return;\n    localStorage.setItem(key, JSON.stringify(data));\n  },\n  load: (key: string): any | null => {\n    if (typeof window === 'undefined') return null;\n    const data = localStorage.getItem(key);\n    return data ? JSON.parse(data) : null;\n  },\n  remove: (key: string) => {\n    if (typeof window === 'undefined') return;\n    localStorage.removeItem(key);\n  }\n};"]}