{"version":3,"sources":["../src/exports/components.ts","../src/components/NewsletterForm.tsx","../src/components/PreferencesForm.tsx","../src/components/MagicLinkVerify.tsx","../src/hooks/useNewsletterAuth.ts","../src/components/Broadcasts/EmailPreview.tsx","../src/utils/emailSafeHtml.ts","../src/utils/validateEmailHtml.ts","../src/components/Broadcasts/EmailPreviewField.tsx","../src/components/Broadcasts/BroadcastEditor.tsx"],"sourcesContent":["'use client'\n\n// Re-export all components from the client export\n// This allows users to import directly from @payloadcms/plugin-newsletter/components\nexport * from './client'\n\n// Email preview components\nexport { EmailPreview } from '../components/Broadcasts/EmailPreview'\nexport { EmailPreviewField } from '../components/Broadcasts/EmailPreviewField'\nexport { BroadcastEditor } from '../components/Broadcasts/BroadcastEditor'","'use client'\n\nimport React, { useState, FormEvent } from 'react'\nimport type { SignupFormProps } from '../types'\n\nconst defaultStyles = {\n  form: {\n    display: 'flex',\n    flexDirection: 'column' as const,\n    gap: '1rem',\n    maxWidth: '400px',\n    margin: '0 auto',\n  },\n  inputGroup: {\n    display: 'flex',\n    flexDirection: 'column' as const,\n    gap: '0.5rem',\n  },\n  label: {\n    fontSize: '0.875rem',\n    fontWeight: '500',\n    color: '#374151',\n  },\n  input: {\n    padding: '0.5rem 0.75rem',\n    fontSize: '1rem',\n    border: '1px solid #e5e7eb',\n    borderRadius: '0.375rem',\n    outline: 'none',\n    transition: 'border-color 0.2s',\n  },\n  button: {\n    padding: '0.75rem 1.5rem',\n    fontSize: '1rem',\n    fontWeight: '500',\n    color: '#ffffff',\n    backgroundColor: '#3b82f6',\n    border: 'none',\n    borderRadius: '0.375rem',\n    cursor: 'pointer',\n    transition: 'background-color 0.2s',\n  },\n  buttonDisabled: {\n    opacity: 0.5,\n    cursor: 'not-allowed',\n  },\n  error: {\n    fontSize: '0.875rem',\n    color: '#ef4444',\n    marginTop: '0.25rem',\n  },\n  success: {\n    fontSize: '0.875rem',\n    color: '#10b981',\n    marginTop: '0.25rem',\n  },\n  checkbox: {\n    display: 'flex',\n    alignItems: 'center',\n    gap: '0.5rem',\n  },\n  checkboxInput: {\n    width: '1rem',\n    height: '1rem',\n  },\n  checkboxLabel: {\n    fontSize: '0.875rem',\n    color: '#374151',\n  },\n}\n\nexport const NewsletterForm: React.FC<SignupFormProps> = ({\n  onSuccess,\n  onError,\n  showName = false,\n  showPreferences = false,\n  leadMagnet,\n  className,\n  styles: customStyles = {},\n  apiEndpoint = '/api/newsletter/subscribe',\n  buttonText = 'Subscribe',\n  loadingText = 'Subscribing...',\n  successMessage = 'Successfully subscribed!',\n  placeholders = {\n    email: 'Enter your email',\n    name: 'Enter your name',\n  },\n  labels = {\n    email: 'Email',\n    name: 'Name',\n    newsletter: 'Newsletter updates',\n    announcements: 'Product announcements',\n  },\n}) => {\n  const [email, setEmail] = useState('')\n  const [name, setName] = useState('')\n  const [preferences, setPreferences] = useState({\n    newsletter: true,\n    announcements: true,\n  })\n  const [loading, setLoading] = useState(false)\n  const [error, setError] = useState<string | null>(null)\n  const [success, setSuccess] = useState(false)\n\n  const styles = {\n    form: { ...defaultStyles.form, ...customStyles.form },\n    inputGroup: { ...defaultStyles.inputGroup, ...customStyles.inputGroup },\n    label: { ...defaultStyles.label, ...customStyles.label },\n    input: { ...defaultStyles.input, ...customStyles.input },\n    button: { ...defaultStyles.button, ...customStyles.button },\n    buttonDisabled: { ...defaultStyles.buttonDisabled, ...customStyles.buttonDisabled },\n    error: { ...defaultStyles.error, ...customStyles.error },\n    success: { ...defaultStyles.success, ...customStyles.success },\n    checkbox: { ...defaultStyles.checkbox, ...customStyles.checkbox },\n    checkboxInput: { ...defaultStyles.checkboxInput, ...customStyles.checkboxInput },\n    checkboxLabel: { ...defaultStyles.checkboxLabel, ...customStyles.checkboxLabel },\n  }\n\n  const handleSubmit = async (e: FormEvent) => {\n    e.preventDefault()\n    setError(null)\n    setLoading(true)\n\n    try {\n      const payload: any = {\n        email,\n        ...(showName && name && { name }),\n        ...(showPreferences && { preferences }),\n        ...(leadMagnet && { leadMagnet: leadMagnet.id }),\n        metadata: {\n          signupPage: window.location.href,\n          ...(typeof window !== 'undefined' && window.location.search && {\n            utmParams: Object.fromEntries(new URLSearchParams(window.location.search)),\n          }),\n        },\n      }\n\n      const response = await fetch(apiEndpoint, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n        },\n        body: JSON.stringify(payload),\n      })\n\n      const data = await response.json()\n\n      if (!response.ok) {\n        throw new Error(data.error || data.errors?.join(', ') || 'Subscription failed')\n      }\n\n      setSuccess(true)\n      setEmail('')\n      setName('')\n      if (onSuccess) {\n        onSuccess(data.subscriber)\n      }\n    } catch (err) {\n      const errorMessage = err instanceof Error ? err.message : 'An error occurred'\n      setError(errorMessage)\n      if (onError) {\n        onError(new Error(errorMessage))\n      }\n    } finally {\n      setLoading(false)\n    }\n  }\n\n  if (success && !showPreferences) {\n    return (\n      <div className={className} style={styles.form}>\n        <p style={styles.success}>{successMessage}</p>\n      </div>\n    )\n  }\n\n  return (\n    <form onSubmit={handleSubmit} className={className} style={styles.form}>\n      <div style={styles.inputGroup}>\n        <label htmlFor=\"email\" style={styles.label}>\n          {labels.email}\n        </label>\n        <input\n          id=\"email\"\n          type=\"email\"\n          value={email}\n          onChange={(e) => setEmail(e.target.value)}\n          placeholder={placeholders.email}\n          required\n          disabled={loading}\n          style={{\n            ...styles.input,\n            ...(loading && { opacity: 0.5 }),\n          }}\n        />\n      </div>\n\n      {showName && (\n        <div style={styles.inputGroup}>\n          <label htmlFor=\"name\" style={styles.label}>\n            {labels.name}\n          </label>\n          <input\n            id=\"name\"\n            type=\"text\"\n            value={name}\n            onChange={(e) => setName(e.target.value)}\n            placeholder={placeholders.name}\n            disabled={loading}\n            style={{\n              ...styles.input,\n              ...(loading && { opacity: 0.5 }),\n            }}\n          />\n        </div>\n      )}\n\n      {showPreferences && (\n        <div style={styles.inputGroup}>\n          <label style={styles.label}>Email Preferences</label>\n          <div style={styles.checkbox}>\n            <input\n              id=\"newsletter\"\n              type=\"checkbox\"\n              checked={preferences.newsletter}\n              onChange={(e) =>\n                setPreferences({ ...preferences, newsletter: e.target.checked })\n              }\n              disabled={loading}\n              style={styles.checkboxInput}\n            />\n            <label htmlFor=\"newsletter\" style={styles.checkboxLabel}>\n              {labels.newsletter}\n            </label>\n          </div>\n          <div style={styles.checkbox}>\n            <input\n              id=\"announcements\"\n              type=\"checkbox\"\n              checked={preferences.announcements}\n              onChange={(e) =>\n                setPreferences({ ...preferences, announcements: e.target.checked })\n              }\n              disabled={loading}\n              style={styles.checkboxInput}\n            />\n            <label htmlFor=\"announcements\" style={styles.checkboxLabel}>\n              {labels.announcements}\n            </label>\n          </div>\n        </div>\n      )}\n\n      <button\n        type=\"submit\"\n        disabled={loading}\n        style={{\n          ...styles.button,\n          ...(loading && styles.buttonDisabled),\n        }}\n      >\n        {loading ? loadingText : buttonText}\n      </button>\n\n      {error && <p style={styles.error}>{error}</p>}\n      {success && <p style={styles.success}>{successMessage}</p>}\n    </form>\n  )\n}\n\n// Factory function for creating custom newsletter forms\nexport function createNewsletterForm(\n  defaultProps: Partial<SignupFormProps>\n): React.FC<SignupFormProps> {\n  return (props: SignupFormProps) => (\n    <NewsletterForm {...defaultProps} {...props} />\n  )\n}","'use client'\n\nimport React, { useState, useEffect, FormEvent } from 'react'\nimport type { PreferencesFormProps, Subscriber } from '../types'\n\nconst defaultStyles = {\n  container: {\n    maxWidth: '600px',\n    margin: '0 auto',\n    padding: '2rem',\n  },\n  heading: {\n    fontSize: '1.5rem',\n    fontWeight: '600',\n    marginBottom: '1.5rem',\n    color: '#111827',\n  },\n  form: {\n    display: 'flex',\n    flexDirection: 'column' as const,\n    gap: '1.5rem',\n  },\n  section: {\n    padding: '1.5rem',\n    backgroundColor: '#f9fafb',\n    borderRadius: '0.5rem',\n    border: '1px solid #e5e7eb',\n  },\n  sectionTitle: {\n    fontSize: '1.125rem',\n    fontWeight: '500',\n    marginBottom: '1rem',\n    color: '#111827',\n  },\n  inputGroup: {\n    display: 'flex',\n    flexDirection: 'column' as const,\n    gap: '0.5rem',\n  },\n  label: {\n    fontSize: '0.875rem',\n    fontWeight: '500',\n    color: '#374151',\n  },\n  input: {\n    padding: '0.5rem 0.75rem',\n    fontSize: '1rem',\n    border: '1px solid #e5e7eb',\n    borderRadius: '0.375rem',\n    outline: 'none',\n    transition: 'border-color 0.2s',\n  },\n  select: {\n    padding: '0.5rem 0.75rem',\n    fontSize: '1rem',\n    border: '1px solid #e5e7eb',\n    borderRadius: '0.375rem',\n    outline: 'none',\n    backgroundColor: '#ffffff',\n  },\n  checkbox: {\n    display: 'flex',\n    alignItems: 'center',\n    gap: '0.5rem',\n    marginBottom: '0.5rem',\n  },\n  checkboxInput: {\n    width: '1rem',\n    height: '1rem',\n  },\n  checkboxLabel: {\n    fontSize: '0.875rem',\n    color: '#374151',\n  },\n  buttonGroup: {\n    display: 'flex',\n    gap: '1rem',\n    marginTop: '1rem',\n  },\n  button: {\n    padding: '0.75rem 1.5rem',\n    fontSize: '1rem',\n    fontWeight: '500',\n    borderRadius: '0.375rem',\n    cursor: 'pointer',\n    transition: 'all 0.2s',\n    border: 'none',\n  },\n  primaryButton: {\n    color: '#ffffff',\n    backgroundColor: '#3b82f6',\n  },\n  secondaryButton: {\n    color: '#374151',\n    backgroundColor: '#ffffff',\n    border: '1px solid #e5e7eb',\n  },\n  dangerButton: {\n    color: '#ffffff',\n    backgroundColor: '#ef4444',\n  },\n  error: {\n    fontSize: '0.875rem',\n    color: '#ef4444',\n    marginTop: '0.5rem',\n  },\n  success: {\n    fontSize: '0.875rem',\n    color: '#10b981',\n    marginTop: '0.5rem',\n  },\n  info: {\n    fontSize: '0.875rem',\n    color: '#6b7280',\n    marginTop: '0.5rem',\n  },\n}\n\nexport const PreferencesForm: React.FC<PreferencesFormProps> = ({\n  subscriber: initialSubscriber,\n  onSuccess,\n  onError,\n  className,\n  styles: customStyles = {},\n  sessionToken,\n  apiEndpoint = '/api/newsletter/preferences',\n  showUnsubscribe = true,\n  locales = ['en'],\n  labels = {\n    title: 'Newsletter Preferences',\n    personalInfo: 'Personal Information',\n    emailPreferences: 'Email Preferences',\n    name: 'Name',\n    language: 'Preferred Language',\n    newsletter: 'Newsletter updates',\n    announcements: 'Product announcements',\n    saveButton: 'Save Preferences',\n    unsubscribeButton: 'Unsubscribe',\n    saving: 'Saving...',\n    saved: 'Preferences saved successfully!',\n    unsubscribeConfirm: 'Are you sure you want to unsubscribe? This cannot be undone.',\n  },\n}) => {\n  const [subscriber, setSubscriber] = useState<Partial<Subscriber>>(initialSubscriber || {})\n  const [loading, setLoading] = useState(false)\n  const [loadingData, setLoadingData] = useState(!initialSubscriber)\n  const [error, setError] = useState<string | null>(null)\n  const [success, setSuccess] = useState(false)\n\n  const styles = {\n    container: { ...defaultStyles.container, ...customStyles.container },\n    heading: { ...defaultStyles.heading, ...customStyles.heading },\n    form: { ...defaultStyles.form, ...customStyles.form },\n    section: { ...defaultStyles.section, ...customStyles.section },\n    sectionTitle: { ...defaultStyles.sectionTitle, ...customStyles.sectionTitle },\n    inputGroup: { ...defaultStyles.inputGroup, ...customStyles.inputGroup },\n    label: { ...defaultStyles.label, ...customStyles.label },\n    input: { ...defaultStyles.input, ...customStyles.input },\n    select: { ...defaultStyles.select, ...customStyles.select },\n    checkbox: { ...defaultStyles.checkbox, ...customStyles.checkbox },\n    checkboxInput: { ...defaultStyles.checkboxInput, ...customStyles.checkboxInput },\n    checkboxLabel: { ...defaultStyles.checkboxLabel, ...customStyles.checkboxLabel },\n    buttonGroup: { ...defaultStyles.buttonGroup, ...customStyles.buttonGroup },\n    button: { ...defaultStyles.button, ...customStyles.button },\n    primaryButton: { ...defaultStyles.primaryButton, ...customStyles.primaryButton },\n    secondaryButton: { ...defaultStyles.secondaryButton, ...customStyles.secondaryButton },\n    dangerButton: { ...defaultStyles.dangerButton, ...customStyles.dangerButton },\n    error: { ...defaultStyles.error, ...customStyles.error },\n    success: { ...defaultStyles.success, ...customStyles.success },\n    info: { ...defaultStyles.info, ...customStyles.info },\n  }\n\n  // Fetch current preferences if not provided\n  useEffect(() => {\n    if (!initialSubscriber && sessionToken) {\n      fetchPreferences()\n    }\n  }, [])\n\n  const fetchPreferences = async () => {\n    try {\n      const response = await fetch(apiEndpoint, {\n        headers: {\n          'Authorization': `Bearer ${sessionToken}`,\n        },\n      })\n\n      if (!response.ok) {\n        throw new Error('Failed to load preferences')\n      }\n\n      const data = await response.json()\n      setSubscriber(data.subscriber)\n    } catch (err) {\n      setError(err instanceof Error ? err.message : 'Failed to load preferences')\n      if (onError) {\n        onError(err instanceof Error ? err : new Error('Failed to load preferences'))\n      }\n    } finally {\n      setLoadingData(false)\n    }\n  }\n\n  const handleSave = async (e: FormEvent) => {\n    e.preventDefault()\n    setError(null)\n    setSuccess(false)\n    setLoading(true)\n\n    try {\n      const response = await fetch(apiEndpoint, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          'Authorization': `Bearer ${sessionToken}`,\n        },\n        body: JSON.stringify({\n          name: subscriber.name,\n          locale: subscriber.locale,\n          emailPreferences: subscriber.emailPreferences,\n        }),\n      })\n\n      const data = await response.json()\n\n      if (!response.ok) {\n        throw new Error(data.error || 'Failed to save preferences')\n      }\n\n      setSubscriber(data.subscriber)\n      setSuccess(true)\n      if (onSuccess) {\n        onSuccess(data.subscriber)\n      }\n    } catch (err) {\n      const errorMessage = err instanceof Error ? err.message : 'An error occurred'\n      setError(errorMessage)\n      if (onError) {\n        onError(new Error(errorMessage))\n      }\n    } finally {\n      setLoading(false)\n    }\n  }\n\n  const handleUnsubscribe = async () => {\n    if (!window.confirm(labels.unsubscribeConfirm)) {\n      return\n    }\n\n    setLoading(true)\n    setError(null)\n\n    try {\n      const response = await fetch('/api/newsletter/unsubscribe', {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          'Authorization': `Bearer ${sessionToken}`,\n        },\n        body: JSON.stringify({\n          email: subscriber.email,\n        }),\n      })\n\n      if (!response.ok) {\n        throw new Error('Failed to unsubscribe')\n      }\n\n      setSubscriber({ ...subscriber, subscriptionStatus: 'unsubscribed' })\n      if (onSuccess) {\n        onSuccess({ ...subscriber, subscriptionStatus: 'unsubscribed' } as Subscriber)\n      }\n    } catch (err) {\n      setError('Failed to unsubscribe. Please try again.')\n      if (onError) {\n        onError(err instanceof Error ? err : new Error('Failed to unsubscribe'))\n      }\n    } finally {\n      setLoading(false)\n    }\n  }\n\n  if (loadingData) {\n    return (\n      <div className={className} style={styles.container}>\n        <p style={styles.info}>Loading preferences...</p>\n      </div>\n    )\n  }\n\n  if (subscriber.subscriptionStatus === 'unsubscribed') {\n    return (\n      <div className={className} style={styles.container}>\n        <h2 style={styles.heading}>Unsubscribed</h2>\n        <p style={styles.info}>\n          You have been unsubscribed from all emails. \n          To resubscribe, please sign up again.\n        </p>\n      </div>\n    )\n  }\n\n  return (\n    <div className={className} style={styles.container}>\n      <h2 style={styles.heading}>{labels.title}</h2>\n      \n      <form onSubmit={handleSave} style={styles.form}>\n        <div style={styles.section}>\n          <h3 style={styles.sectionTitle}>{labels.personalInfo}</h3>\n          \n          <div style={styles.inputGroup}>\n            <label htmlFor=\"name\" style={styles.label}>\n              {labels.name}\n            </label>\n            <input\n              id=\"name\"\n              type=\"text\"\n              value={subscriber.name || ''}\n              onChange={(e) => setSubscriber({ ...subscriber, name: e.target.value })}\n              disabled={loading}\n              style={styles.input}\n            />\n          </div>\n\n          {locales.length > 1 && (\n            <div style={styles.inputGroup}>\n              <label htmlFor=\"locale\" style={styles.label}>\n                {labels.language}\n              </label>\n              <select\n                id=\"locale\"\n                value={subscriber.locale || locales[0]}\n                onChange={(e) => setSubscriber({ ...subscriber, locale: e.target.value })}\n                disabled={loading}\n                style={styles.select}\n              >\n                {locales.map(locale => (\n                  <option key={locale} value={locale}>\n                    {locale.toUpperCase()}\n                  </option>\n                ))}\n              </select>\n            </div>\n          )}\n        </div>\n\n        <div style={styles.section}>\n          <h3 style={styles.sectionTitle}>{labels.emailPreferences}</h3>\n          \n          <div style={styles.checkbox}>\n            <input\n              id=\"pref-newsletter\"\n              type=\"checkbox\"\n              checked={subscriber.emailPreferences?.newsletter ?? true}\n              onChange={(e) =>\n                setSubscriber({\n                  ...subscriber,\n                  emailPreferences: {\n                    ...subscriber.emailPreferences,\n                    newsletter: e.target.checked,\n                  },\n                })\n              }\n              disabled={loading}\n              style={styles.checkboxInput}\n            />\n            <label htmlFor=\"pref-newsletter\" style={styles.checkboxLabel}>\n              {labels.newsletter}\n            </label>\n          </div>\n\n          <div style={styles.checkbox}>\n            <input\n              id=\"pref-announcements\"\n              type=\"checkbox\"\n              checked={subscriber.emailPreferences?.announcements ?? true}\n              onChange={(e) =>\n                setSubscriber({\n                  ...subscriber,\n                  emailPreferences: {\n                    ...subscriber.emailPreferences,\n                    announcements: e.target.checked,\n                  },\n                })\n              }\n              disabled={loading}\n              style={styles.checkboxInput}\n            />\n            <label htmlFor=\"pref-announcements\" style={styles.checkboxLabel}>\n              {labels.announcements}\n            </label>\n          </div>\n        </div>\n\n        <div style={styles.buttonGroup}>\n          <button\n            type=\"submit\"\n            disabled={loading}\n            style={{\n              ...styles.button,\n              ...styles.primaryButton,\n              ...(loading && { opacity: 0.5, cursor: 'not-allowed' }),\n            }}\n          >\n            {loading ? labels.saving : labels.saveButton}\n          </button>\n\n          {showUnsubscribe && (\n            <button\n              type=\"button\"\n              onClick={handleUnsubscribe}\n              disabled={loading}\n              style={{\n                ...styles.button,\n                ...styles.dangerButton,\n                ...(loading && { opacity: 0.5, cursor: 'not-allowed' }),\n              }}\n            >\n              {labels.unsubscribeButton}\n            </button>\n          )}\n        </div>\n\n        {error && <p style={styles.error}>{error}</p>}\n        {success && <p style={styles.success}>{labels.saved}</p>}\n      </form>\n    </div>\n  )\n}\n\n// Factory function for creating custom preferences forms\nexport function createPreferencesForm(\n  defaultProps: Partial<PreferencesFormProps>\n): React.FC<PreferencesFormProps> {\n  return (props: PreferencesFormProps) => (\n    <PreferencesForm {...defaultProps} {...props} />\n  )\n}","'use client'\n\nimport React, { useState, useEffect } from 'react'\n\nexport interface MagicLinkVerifyProps {\n  token?: string\n  onSuccess?: (sessionToken: string, subscriber: any) => void\n  onError?: (error: Error) => void\n  apiEndpoint?: string\n  className?: string\n  styles?: {\n    container?: React.CSSProperties\n    heading?: React.CSSProperties\n    message?: React.CSSProperties\n    error?: React.CSSProperties\n    button?: React.CSSProperties\n  }\n  labels?: {\n    verifying?: string\n    success?: string\n    error?: string\n    expired?: string\n    invalid?: string\n    redirecting?: string\n    tryAgain?: string\n  }\n}\n\nconst defaultStyles = {\n  container: {\n    maxWidth: '400px',\n    margin: '4rem auto',\n    padding: '2rem',\n    textAlign: 'center' as const,\n  },\n  heading: {\n    fontSize: '1.5rem',\n    fontWeight: '600',\n    marginBottom: '1rem',\n    color: '#111827',\n  },\n  message: {\n    fontSize: '1rem',\n    color: '#6b7280',\n    marginBottom: '1.5rem',\n  },\n  error: {\n    fontSize: '1rem',\n    color: '#ef4444',\n    marginBottom: '1.5rem',\n  },\n  button: {\n    padding: '0.75rem 1.5rem',\n    fontSize: '1rem',\n    fontWeight: '500',\n    color: '#ffffff',\n    backgroundColor: '#3b82f6',\n    border: 'none',\n    borderRadius: '0.375rem',\n    cursor: 'pointer',\n    transition: 'background-color 0.2s',\n  },\n}\n\nexport const MagicLinkVerify: React.FC<MagicLinkVerifyProps> = ({\n  token: propToken,\n  onSuccess,\n  onError,\n  apiEndpoint = '/api/newsletter/verify-magic-link',\n  className,\n  styles: customStyles = {},\n  labels = {\n    verifying: 'Verifying your magic link...',\n    success: 'Successfully verified! Redirecting...',\n    error: 'Failed to verify magic link',\n    expired: 'This magic link has expired. Please request a new one.',\n    invalid: 'This magic link is invalid. Please request a new one.',\n    redirecting: 'Redirecting to your preferences...',\n    tryAgain: 'Try Again',\n  },\n}) => {\n  const [status, setStatus] = useState<'verifying' | 'success' | 'error'>('verifying')\n  const [error, setError] = useState<string | null>(null)\n  const [_sessionToken, setSessionToken] = useState<string | null>(null)\n\n  const styles = {\n    container: { ...defaultStyles.container, ...customStyles.container },\n    heading: { ...defaultStyles.heading, ...customStyles.heading },\n    message: { ...defaultStyles.message, ...customStyles.message },\n    error: { ...defaultStyles.error, ...customStyles.error },\n    button: { ...defaultStyles.button, ...customStyles.button },\n  }\n\n  useEffect(() => {\n    // Get token from props or URL\n    const token = propToken || new URLSearchParams(window.location.search).get('token')\n    \n    if (token) {\n      verifyToken(token)\n    } else {\n      setStatus('error')\n      setError(labels.invalid || 'Invalid magic link')\n    }\n  }, [propToken])\n\n  const verifyToken = async (token: string) => {\n    try {\n      const response = await fetch(apiEndpoint, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n        },\n        body: JSON.stringify({ token }),\n      })\n\n      const data = await response.json()\n\n      if (!response.ok) {\n        if (data.error?.includes('expired')) {\n          throw new Error(labels.expired)\n        }\n        throw new Error(data.error || labels.error)\n      }\n\n      setStatus('success')\n      setSessionToken(data.sessionToken)\n\n      // Store session token\n      if (typeof window !== 'undefined' && data.sessionToken) {\n        localStorage.setItem('newsletter_session', data.sessionToken)\n      }\n\n      if (onSuccess) {\n        onSuccess(data.sessionToken, data.subscriber)\n      }\n    } catch (err) {\n      setStatus('error')\n      const errorMessage = err instanceof Error ? err.message : (labels.error || 'Verification failed')\n      setError(errorMessage)\n      if (onError) {\n        onError(err instanceof Error ? err : new Error(errorMessage))\n      }\n    }\n  }\n\n  const handleTryAgain = () => {\n    window.location.href = '/'\n  }\n\n  return (\n    <div className={className} style={styles.container}>\n      {status === 'verifying' && (\n        <>\n          <h2 style={styles.heading}>Verifying</h2>\n          <p style={styles.message}>{labels.verifying}</p>\n        </>\n      )}\n\n      {status === 'success' && (\n        <>\n          <h2 style={styles.heading}>Success!</h2>\n          <p style={styles.message}>{labels.success}</p>\n        </>\n      )}\n\n      {status === 'error' && (\n        <>\n          <h2 style={styles.heading}>Verification Failed</h2>\n          <p style={styles.error}>{error}</p>\n          <button onClick={handleTryAgain} style={styles.button}>\n            {labels.tryAgain}\n          </button>\n        </>\n      )}\n    </div>\n  )\n}\n\n// Factory function for creating custom magic link verify components\nexport function createMagicLinkVerify(\n  defaultProps: Partial<MagicLinkVerifyProps>\n): React.FC<MagicLinkVerifyProps> {\n  return (props: MagicLinkVerifyProps) => (\n    <MagicLinkVerify {...defaultProps} {...props} />\n  )\n}","'use client'\n\nimport { useState, useEffect, useCallback } from 'react'\nimport type { Subscriber } from '../types'\n\nexport interface UseNewsletterAuthOptions {\n  // Reserved for future use\n}\n\nexport interface UseNewsletterAuthReturn {\n  subscriber: Subscriber | null\n  isAuthenticated: boolean\n  isLoading: boolean\n  loading: boolean // Alias for backward compatibility\n  error: Error | null\n  signOut: () => Promise<void>\n  logout: () => Promise<void> // Alias for backward compatibility\n  refreshAuth: () => Promise<void>\n  refreshSubscriber: () => Promise<void> // Alias for backward compatibility\n  login: (token: string) => Promise<void> // For backward compatibility\n}\n\nexport function useNewsletterAuth(\n  _options: UseNewsletterAuthOptions = {}\n): UseNewsletterAuthReturn {\n  const [subscriber, setSubscriber] = useState<Subscriber | null>(null)\n  const [isLoading, setIsLoading] = useState(true)\n  const [error, setError] = useState<Error | null>(null)\n\n  const checkAuth = useCallback(async () => {\n    try {\n      const response = await fetch('/api/newsletter/me', {\n        method: 'GET',\n        credentials: 'include',\n        headers: {\n          'Content-Type': 'application/json',\n        },\n      })\n\n      if (response.ok) {\n        const data = await response.json()\n        setSubscriber(data.subscriber)\n        setError(null)\n      } else {\n        setSubscriber(null)\n        if (response.status !== 401) {\n          setError(new Error('Failed to check authentication'))\n        }\n      }\n    } catch (err) {\n      console.error('Auth check failed:', err)\n      setError(err instanceof Error ? err : new Error('An error occurred'))\n      setSubscriber(null)\n    } finally {\n      setIsLoading(false)\n    }\n  }, [])\n\n  useEffect(() => {\n    checkAuth()\n  }, [checkAuth])\n\n  const signOut = useCallback(async () => {\n    try {\n      const response = await fetch('/api/newsletter/signout', {\n        method: 'POST',\n        credentials: 'include',\n        headers: {\n          'Content-Type': 'application/json',\n        },\n      })\n\n      if (response.ok) {\n        setSubscriber(null)\n        setError(null)\n      } else {\n        throw new Error('Failed to sign out')\n      }\n    } catch (err) {\n      console.error('Sign out error:', err)\n      setError(err instanceof Error ? err : new Error('Sign out failed'))\n      throw err\n    }\n  }, [])\n\n  const refreshAuth = useCallback(async () => {\n    setIsLoading(true)\n    await checkAuth()\n  }, [checkAuth])\n\n  // Backward compatibility: login function that accepts a token\n  // In the new implementation, authentication is handled via cookies\n  const login = useCallback(async (_token: string) => {\n    // Token is now handled server-side via cookies\n    // Just refresh the auth state\n    await refreshAuth()\n  }, [refreshAuth])\n\n  return {\n    subscriber,\n    isAuthenticated: !!subscriber,\n    isLoading,\n    loading: isLoading, // Alias for backward compatibility\n    error,\n    signOut,\n    logout: signOut, // Alias for backward compatibility\n    refreshAuth,\n    refreshSubscriber: refreshAuth, // Alias for backward compatibility\n    login, // For backward compatibility\n  }\n}","'use client'\n\nimport React, { useState, useEffect, useRef } from 'react'\nimport type { SerializedEditorState } from 'lexical'\nimport { convertToEmailSafeHtml, replacePersonalizationTags } from '../../utils/emailSafeHtml'\nimport { validateEmailHtml } from '../../utils/validateEmailHtml'\nimport type { Channel } from '../../types'\n\ninterface EmailPreviewProps {\n  content: SerializedEditorState | null\n  subject: string\n  preheader?: string\n  channel?: Channel | null\n  mode?: 'desktop' | 'mobile'\n  onValidation?: (result: { valid: boolean; warnings: string[]; errors: string[] }) => void\n}\n\nconst SAMPLE_DATA = {\n  'subscriber.name': 'John Doe',\n  'subscriber.firstName': 'John',\n  'subscriber.lastName': 'Doe',\n  'subscriber.email': 'john.doe@example.com',\n}\n\nconst VIEWPORT_SIZES = {\n  desktop: { width: 600, scale: 1 },\n  mobile: { width: 320, scale: 0.8 },\n}\n\nexport const EmailPreview: React.FC<EmailPreviewProps> = ({\n  content,\n  subject,\n  preheader,\n  channel,\n  mode = 'desktop',\n  onValidation,\n}) => {\n  const [html, setHtml] = useState<string>('')\n  const [loading, setLoading] = useState(false)\n  const [validationResult, setValidationResult] = useState<ReturnType<typeof validateEmailHtml> | null>(null)\n  const iframeRef = useRef<HTMLIFrameElement>(null)\n\n  // Convert content to HTML whenever it changes\n  useEffect(() => {\n    const convertContent = async () => {\n      if (!content) {\n        setHtml('')\n        return\n      }\n\n      setLoading(true)\n      try {\n        // Convert to email-safe HTML\n        const emailHtml = await convertToEmailSafeHtml(content, {\n          wrapInTemplate: true,\n          preheader,\n        })\n\n        // Replace personalization tags with sample data\n        const personalizedHtml = replacePersonalizationTags(emailHtml, SAMPLE_DATA)\n\n        // Add email header to the preview\n        const previewHtml = addEmailHeader(personalizedHtml, {\n          subject,\n          from: channel ? `${channel.fromName} <${channel.fromEmail}>` : 'Newsletter <noreply@example.com>',\n          to: SAMPLE_DATA['subscriber.email'],\n        })\n\n        setHtml(previewHtml)\n\n        // Validate the HTML\n        const validation = validateEmailHtml(emailHtml)\n        setValidationResult(validation)\n        onValidation?.(validation)\n      } catch (error) {\n        console.error('Failed to convert content to HTML:', error)\n        setHtml('<p>Error converting content to HTML</p>')\n      } finally {\n        setLoading(false)\n      }\n    }\n\n    convertContent()\n  }, [content, subject, preheader, channel, onValidation])\n\n  // Update iframe content when HTML changes\n  useEffect(() => {\n    if (iframeRef.current && html) {\n      const doc = iframeRef.current.contentDocument\n      if (doc) {\n        doc.open()\n        doc.write(html)\n        doc.close()\n      }\n    }\n  }, [html])\n\n  const viewport = VIEWPORT_SIZES[mode]\n\n  return (\n    <div style={{ height: '100%', display: 'flex', flexDirection: 'column' }}>\n      {/* Validation Messages */}\n      {validationResult && (validationResult.errors.length > 0 || validationResult.warnings.length > 0) && (\n        <div style={{ padding: '16px', borderBottom: '1px solid #e5e7eb' }}>\n          {validationResult.errors.length > 0 && (\n            <div style={{ marginBottom: '12px' }}>\n              <h4 style={{ color: '#dc2626', margin: '0 0 8px 0', fontSize: '14px' }}>\n                Errors ({validationResult.errors.length})\n              </h4>\n              <ul style={{ margin: 0, paddingLeft: '20px', fontSize: '13px', color: '#dc2626' }}>\n                {validationResult.errors.map((error, index) => (\n                  <li key={index}>{error}</li>\n                ))}\n              </ul>\n            </div>\n          )}\n          \n          {validationResult.warnings.length > 0 && (\n            <div>\n              <h4 style={{ color: '#d97706', margin: '0 0 8px 0', fontSize: '14px' }}>\n                Warnings ({validationResult.warnings.length})\n              </h4>\n              <ul style={{ margin: 0, paddingLeft: '20px', fontSize: '13px', color: '#d97706' }}>\n                {validationResult.warnings.map((warning, index) => (\n                  <li key={index}>{warning}</li>\n                ))}\n              </ul>\n            </div>\n          )}\n        </div>\n      )}\n\n      {/* Preview Frame */}\n      <div style={{ \n        flex: 1, \n        display: 'flex', \n        alignItems: 'center', \n        justifyContent: 'center',\n        backgroundColor: '#f3f4f6',\n        padding: '20px',\n        overflow: 'auto',\n      }}>\n        {loading ? (\n          <div style={{ textAlign: 'center', color: '#6b7280' }}>\n            <p>Loading preview...</p>\n          </div>\n        ) : html ? (\n          <div style={{\n            backgroundColor: 'white',\n            boxShadow: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',\n            borderRadius: '8px',\n            overflow: 'hidden',\n            transform: `scale(${viewport.scale})`,\n            transformOrigin: 'top center',\n          }}>\n            <iframe\n              ref={iframeRef}\n              title=\"Email Preview\"\n              style={{\n                width: `${viewport.width}px`,\n                height: '800px',\n                border: 'none',\n                display: 'block',\n              }}\n              sandbox=\"allow-same-origin\"\n            />\n          </div>\n        ) : (\n          <div style={{ textAlign: 'center', color: '#6b7280' }}>\n            <p>Start typing to see the email preview</p>\n          </div>\n        )}\n      </div>\n\n      {/* Stats Bar */}\n      {validationResult && (\n        <div style={{ \n          padding: '12px 16px', \n          borderTop: '1px solid #e5e7eb',\n          fontSize: '13px',\n          color: '#6b7280',\n          display: 'flex',\n          gap: '24px',\n        }}>\n          <span>Size: {Math.round(validationResult.stats.sizeInBytes / 1024)}KB</span>\n          <span>Links: {validationResult.stats.linkCount}</span>\n          <span>Images: {validationResult.stats.imageCount}</span>\n          <span>Viewport: {mode === 'desktop' ? '600px' : '320px'}</span>\n        </div>\n      )}\n    </div>\n  )\n}\n\n/**\n * Add email header for preview\n */\nfunction addEmailHeader(html: string, headers: {\n  subject: string\n  from: string\n  to: string\n}): string {\n  const headerHtml = `\n    <div style=\"background-color: #f9fafb; border-bottom: 1px solid #e5e7eb; padding: 16px; font-family: monospace; font-size: 13px;\">\n      <div style=\"margin-bottom: 8px;\"><strong>Subject:</strong> ${escapeHtml(headers.subject)}</div>\n      <div style=\"margin-bottom: 8px;\"><strong>From:</strong> ${escapeHtml(headers.from)}</div>\n      <div><strong>To:</strong> ${escapeHtml(headers.to)}</div>\n    </div>\n  `\n\n  // Insert header after <body> tag\n  return html.replace(/<body[^>]*>/, `$&${headerHtml}`)\n}\n\n/**\n * Escape HTML for display\n */\nfunction escapeHtml(text: string): string {\n  const div = document.createElement('div')\n  div.textContent = text\n  return div.innerHTML\n}","import DOMPurify from 'isomorphic-dompurify'\nimport type { SerializedEditorState } from 'lexical'\n\n/**\n * DOMPurify configuration for email-safe HTML\n */\nexport const EMAIL_SAFE_CONFIG = {\n  ALLOWED_TAGS: [\n    'p', 'br', 'strong', 'b', 'em', 'i', 'u', 'strike', 's', 'span',\n    'a', 'h1', 'h2', 'h3', 'ul', 'ol', 'li', 'blockquote', 'hr'\n  ],\n  ALLOWED_ATTR: ['href', 'style', 'target', 'rel', 'align'],\n  ALLOWED_STYLES: {\n    '*': [\n      'color', 'background-color', 'font-size', 'font-weight',\n      'font-style', 'text-decoration', 'text-align', 'margin',\n      'margin-top', 'margin-right', 'margin-bottom', 'margin-left',\n      'padding', 'padding-top', 'padding-right', 'padding-bottom', \n      'padding-left', 'line-height', 'border-left', 'border-left-width',\n      'border-left-style', 'border-left-color'\n    ],\n  },\n  FORBID_TAGS: ['script', 'style', 'iframe', 'object', 'embed', 'form', 'input'],\n  FORBID_ATTR: ['class', 'id', 'onclick', 'onload', 'onerror'],\n}\n\n/**\n * Converts Lexical editor state to email-safe HTML\n */\nexport async function convertToEmailSafeHtml(\n  editorState: SerializedEditorState,\n  options?: {\n    wrapInTemplate?: boolean\n    preheader?: string\n  }\n): Promise<string> {\n  // First, convert Lexical state to HTML using custom converters\n  const rawHtml = await lexicalToEmailHtml(editorState)\n  \n  // Sanitize the HTML\n  const sanitizedHtml = DOMPurify.sanitize(rawHtml, EMAIL_SAFE_CONFIG)\n  \n  // Optionally wrap in email template\n  if (options?.wrapInTemplate) {\n    return wrapInEmailTemplate(sanitizedHtml, options.preheader)\n  }\n  \n  return sanitizedHtml\n}\n\n/**\n * Custom Lexical to HTML converter for email\n */\nasync function lexicalToEmailHtml(editorState: SerializedEditorState): Promise<string> {\n  const { root } = editorState\n  \n  if (!root || !root.children) {\n    return ''\n  }\n  \n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  const html = root.children.map((node: any) => convertNode(node)).join('')\n  return html\n}\n\n/**\n * Convert individual Lexical nodes to email-safe HTML\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction convertNode(node: any): string {\n  switch (node.type) {\n    case 'paragraph':\n      return convertParagraph(node)\n    case 'heading':\n      return convertHeading(node)\n    case 'list':\n      return convertList(node)\n    case 'listitem':\n      return convertListItem(node)\n    case 'blockquote':\n      return convertBlockquote(node)\n    case 'text':\n      return convertText(node)\n    case 'link':\n      return convertLink(node)\n    case 'linebreak':\n      return '<br>'\n    default:\n      // Unknown node type - convert children if any\n      if (node.children) {\n        return node.children.map(convertNode).join('')\n      }\n      return ''\n  }\n}\n\n/**\n * Convert paragraph node\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction convertParagraph(node: any): string {\n  const align = getAlignment(node.format)\n  const children = node.children?.map(convertNode).join('') || ''\n  \n  if (!children.trim()) {\n    return '<p style=\"margin: 0 0 16px 0; min-height: 1em;\">&nbsp;</p>'\n  }\n  \n  return `<p style=\"margin: 0 0 16px 0; text-align: ${align};\">${children}</p>`\n}\n\n/**\n * Convert heading node\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction convertHeading(node: any): string {\n  const tag = node.tag || 'h1'\n  const align = getAlignment(node.format)\n  const children = node.children?.map(convertNode).join('') || ''\n  \n  const styles: Record<string, string> = {\n    h1: 'font-size: 32px; font-weight: 700; margin: 0 0 24px 0; line-height: 1.2;',\n    h2: 'font-size: 24px; font-weight: 600; margin: 0 0 16px 0; line-height: 1.3;',\n    h3: 'font-size: 20px; font-weight: 600; margin: 0 0 12px 0; line-height: 1.4;',\n  }\n  \n  const style = `${styles[tag] || styles.h3} text-align: ${align};`\n  \n  return `<${tag} style=\"${style}\">${children}</${tag}>`\n}\n\n/**\n * Convert list node\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction convertList(node: any): string {\n  const tag = node.listType === 'number' ? 'ol' : 'ul'\n  const children = node.children?.map(convertNode).join('') || ''\n  \n  const style = tag === 'ul' \n    ? 'margin: 0 0 16px 0; padding-left: 24px; list-style-type: disc;'\n    : 'margin: 0 0 16px 0; padding-left: 24px; list-style-type: decimal;'\n  \n  return `<${tag} style=\"${style}\">${children}</${tag}>`\n}\n\n/**\n * Convert list item node\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction convertListItem(node: any): string {\n  const children = node.children?.map(convertNode).join('') || ''\n  return `<li style=\"margin: 0 0 8px 0;\">${children}</li>`\n}\n\n/**\n * Convert blockquote node\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction convertBlockquote(node: any): string {\n  const children = node.children?.map(convertNode).join('') || ''\n  const style = 'margin: 0 0 16px 0; padding-left: 16px; border-left: 4px solid #e5e7eb; color: #6b7280;'\n  \n  return `<blockquote style=\"${style}\">${children}</blockquote>`\n}\n\n/**\n * Convert text node\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction convertText(node: any): string {\n  let text = escapeHtml(node.text || '')\n  \n  // Apply formatting\n  if (node.format & 1) { // Bold\n    text = `<strong>${text}</strong>`\n  }\n  if (node.format & 2) { // Italic\n    text = `<em>${text}</em>`\n  }\n  if (node.format & 8) { // Underline\n    text = `<u>${text}</u>`\n  }\n  if (node.format & 4) { // Strikethrough\n    text = `<strike>${text}</strike>`\n  }\n  \n  return text\n}\n\n/**\n * Convert link node\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction convertLink(node: any): string {\n  const children = node.children?.map(convertNode).join('') || ''\n  const url = node.fields?.url || '#'\n  \n  // Ensure links open in new tab and have security attributes\n  return `<a href=\"${escapeHtml(url)}\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"color: #2563eb; text-decoration: underline;\">${children}</a>`\n}\n\n/**\n * Get text alignment from format number\n */\nfunction getAlignment(format?: number): string {\n  if (!format) return 'left'\n  \n  // Lexical alignment format values\n  if (format & 2) return 'center'\n  if (format & 3) return 'right'\n  if (format & 4) return 'justify'\n  \n  return 'left'\n}\n\n/**\n * Escape HTML special characters\n */\nfunction escapeHtml(text: string): string {\n  const map: Record<string, string> = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#039;'\n  }\n  \n  return text.replace(/[&<>\"']/g, m => map[m])\n}\n\n/**\n * Wrap content in a basic email template\n */\nfunction wrapInEmailTemplate(content: string, preheader?: string): string {\n  return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>Email</title>\n  <!--[if mso]>\n  <noscript>\n    <xml>\n      <o:OfficeDocumentSettings>\n        <o:PixelsPerInch>96</o:PixelsPerInch>\n      </o:OfficeDocumentSettings>\n    </xml>\n  </noscript>\n  <![endif]-->\n</head>\n<body style=\"margin: 0; padding: 0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif; font-size: 16px; line-height: 1.5; color: #333333; background-color: #f3f4f6;\">\n  ${preheader ? `<div style=\"display: none; max-height: 0; overflow: hidden;\">${escapeHtml(preheader)}</div>` : ''}\n  <table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" style=\"margin: 0; padding: 0;\">\n    <tr>\n      <td align=\"center\" style=\"padding: 20px 0;\">\n        <table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" width=\"600\" style=\"margin: 0 auto; background-color: #ffffff; border-radius: 8px; overflow: hidden;\">\n          <tr>\n            <td style=\"padding: 40px 30px;\">\n              ${content}\n            </td>\n          </tr>\n        </table>\n      </td>\n    </tr>\n  </table>\n</body>\n</html>`\n}\n\n/**\n * Extract personalization tags from content\n */\nexport function extractPersonalizationTags(html: string): string[] {\n  const regex = /\\{\\{([^}]+)\\}\\}/g\n  const tags: string[] = []\n  let match\n  \n  while ((match = regex.exec(html)) !== null) {\n    tags.push(match[1].trim())\n  }\n  \n  return [...new Set(tags)]\n}\n\n/**\n * Replace personalization tags with sample data\n */\nexport function replacePersonalizationTags(\n  html: string, \n  sampleData: Record<string, string>\n): string {\n  return html.replace(/\\{\\{([^}]+)\\}\\}/g, (match, tag) => {\n    const trimmedTag = tag.trim()\n    return sampleData[trimmedTag] || match\n  })\n}","/**\n * Email HTML validation utilities\n */\n\nexport interface ValidationResult {\n  valid: boolean\n  warnings: string[]\n  errors: string[]\n  stats: {\n    sizeInBytes: number\n    imageCount: number\n    linkCount: number\n    hasExternalStyles: boolean\n    hasJavaScript: boolean\n  }\n}\n\n/**\n * Validate HTML for email compatibility\n */\nexport function validateEmailHtml(html: string): ValidationResult {\n  const warnings: string[] = []\n  const errors: string[] = []\n  \n  // Calculate size\n  const sizeInBytes = new Blob([html]).size\n  \n  // Check size limits\n  if (sizeInBytes > 102400) { // 100KB\n    warnings.push(`Email size (${Math.round(sizeInBytes / 1024)}KB) exceeds Gmail's 102KB limit - email may be clipped`)\n  }\n  \n  // Check for problematic CSS\n  if (html.includes('position:') && (html.includes('position: absolute') || html.includes('position: fixed'))) {\n    errors.push('Absolute/fixed positioning is not supported in most email clients')\n  }\n  \n  if (html.includes('display: flex') || html.includes('display: grid')) {\n    errors.push('Flexbox and Grid layouts are not supported in many email clients')\n  }\n  \n  if (html.includes('@media')) {\n    warnings.push('Media queries may not work in all email clients')\n  }\n  \n  // Check for JavaScript\n  const hasJavaScript = \n    html.includes('<script') || \n    html.includes('onclick') || \n    html.includes('onload') ||\n    html.includes('javascript:')\n  \n  if (hasJavaScript) {\n    errors.push('JavaScript is not supported in email and will be stripped by email clients')\n  }\n  \n  // Check for external styles\n  const hasExternalStyles = html.includes('<link') && html.includes('stylesheet')\n  if (hasExternalStyles) {\n    errors.push('External stylesheets are not supported - use inline styles only')\n  }\n  \n  // Check for forms\n  if (html.includes('<form') || html.includes('<input') || html.includes('<button')) {\n    errors.push('Forms and form elements are not reliably supported in email')\n  }\n  \n  // Check for unsupported tags\n  const unsupportedTags = [\n    'video', 'audio', 'iframe', 'embed', 'object', 'canvas', 'svg'\n  ]\n  \n  for (const tag of unsupportedTags) {\n    if (html.includes(`<${tag}`)) {\n      errors.push(`<${tag}> tags are not supported in email`)\n    }\n  }\n  \n  // Count images and links\n  const imageCount = (html.match(/<img/g) || []).length\n  const linkCount = (html.match(/<a/g) || []).length\n  \n  // Check image usage\n  if (imageCount > 20) {\n    warnings.push(`High number of images (${imageCount}) may affect email performance`)\n  }\n  \n  // Check for missing alt text\n  const imagesWithoutAlt = (html.match(/<img(?![^>]*\\balt\\s*=)[^>]*>/g) || []).length\n  if (imagesWithoutAlt > 0) {\n    warnings.push(`${imagesWithoutAlt} image(s) missing alt text - important for accessibility`)\n  }\n  \n  // Check for proper link attributes\n  const linksWithoutTarget = (html.match(/<a(?![^>]*\\btarget\\s*=)[^>]*>/g) || []).length\n  if (linksWithoutTarget > 0) {\n    warnings.push(`${linksWithoutTarget} link(s) missing target=\"_blank\" attribute`)\n  }\n  \n  // Check for CSS property usage\n  if (html.includes('margin: auto') || html.includes('margin:auto')) {\n    warnings.push('margin: auto is not supported in Outlook - use align=\"center\" or tables for centering')\n  }\n  \n  if (html.includes('background-image')) {\n    warnings.push('Background images are not reliably supported - consider using <img> tags instead')\n  }\n  \n  // Check for rem/em units\n  if (html.match(/\\d+\\s*(rem|em)/)) {\n    warnings.push('rem/em units may render inconsistently - use px for reliable sizing')\n  }\n  \n  // Check for negative margins\n  if (html.match(/margin[^:]*:\\s*-\\d+/)) {\n    errors.push('Negative margins are not supported in many email clients')\n  }\n  \n  // Validate personalization tags\n  const personalizationTags = html.match(/\\{\\{([^}]+)\\}\\}/g) || []\n  const validTags = ['subscriber.name', 'subscriber.email', 'subscriber.firstName', 'subscriber.lastName']\n  \n  for (const tag of personalizationTags) {\n    const tagContent = tag.replace(/[{}]/g, '').trim()\n    if (!validTags.includes(tagContent)) {\n      warnings.push(`Unknown personalization tag: ${tag}`)\n    }\n  }\n  \n  return {\n    valid: errors.length === 0,\n    warnings,\n    errors,\n    stats: {\n      sizeInBytes,\n      imageCount,\n      linkCount,\n      hasExternalStyles,\n      hasJavaScript,\n    }\n  }\n}\n\n/**\n * Get email client compatibility warnings for specific HTML\n */\nexport function getClientCompatibilityWarnings(html: string): Record<string, string[]> {\n  const warnings: Record<string, string[]> = {\n    gmail: [],\n    outlook: [],\n    appleMail: [],\n    mobile: [],\n  }\n  \n  // Gmail specific\n  if (html.includes('<style')) {\n    warnings.gmail.push('Gmail may strip <style> tags in some contexts')\n  }\n  \n  // Outlook specific\n  if (html.includes('margin: auto') || html.includes('margin:auto')) {\n    warnings.outlook.push('Outlook does not support margin: auto')\n  }\n  \n  if (html.includes('padding') && html.includes('<p')) {\n    warnings.outlook.push('Outlook may not respect padding on <p> tags')\n  }\n  \n  if (html.includes('background-image')) {\n    warnings.outlook.push('Outlook has limited background image support')\n  }\n  \n  // Mobile specific\n  const hasSmallText = html.match(/font-size:\\s*(\\d+)px/g)?.some(match => {\n    const size = parseInt(match.match(/\\d+/)?.[0] || '16')\n    return size < 14\n  })\n  \n  if (hasSmallText) {\n    warnings.mobile.push('Text smaller than 14px may be hard to read on mobile')\n  }\n  \n  const hasSmallLinks = html.match(/<a[^>]*>[^<]{1,3}<\\/a>/g)\n  if (hasSmallLinks) {\n    warnings.mobile.push('Short link text may be hard to tap on mobile devices')\n  }\n  \n  return warnings\n}\n\n/**\n * Suggest fixes for common email HTML issues\n */\nexport function suggestFixes(html: string): string[] {\n  const suggestions: string[] = []\n  \n  if (html.includes('display: flex')) {\n    suggestions.push('Replace flexbox with table-based layouts for better email client support')\n  }\n  \n  if (html.includes('position: absolute')) {\n    suggestions.push('Use table cells or margins instead of absolute positioning')\n  }\n  \n  if (html.match(/\\d+rem/) || html.match(/\\d+em/)) {\n    suggestions.push('Convert rem/em units to px for consistent rendering')\n  }\n  \n  if (!html.includes('<!DOCTYPE')) {\n    suggestions.push('Add <!DOCTYPE html> declaration for better rendering')\n  }\n  \n  if (!html.includes('charset')) {\n    suggestions.push('Add <meta charset=\"UTF-8\"> for proper character encoding')\n  }\n  \n  return suggestions\n}","'use client'\n\nimport React, { useState } from 'react'\nimport { useFormFields } from '@payloadcms/ui'\nimport { EmailPreview } from './EmailPreview'\nimport type { SerializedEditorState } from 'lexical'\nimport type { Channel } from '../../types'\n\nexport const EmailPreviewField: React.FC = () => {\n  const [previewMode, setPreviewMode] = useState<'desktop' | 'mobile'>('desktop')\n  const [isValid, setIsValid] = useState(true)\n  const [validationSummary, setValidationSummary] = useState<string>('')\n\n  // Get form fields for preview\n  const fields = useFormFields(([fields]) => ({\n    content: fields.content,\n    subject: fields.subject,\n    preheader: fields.preheader,\n    channel: fields.channel,\n  }))\n\n  // Handle validation results from preview\n  const handleValidation = (result: {\n    valid: boolean\n    warnings: string[]\n    errors: string[]\n  }) => {\n    setIsValid(result.valid)\n    \n    const errorCount = result.errors.length\n    const warningCount = result.warnings.length\n    \n    if (errorCount > 0) {\n      setValidationSummary(`${errorCount} error${errorCount !== 1 ? 's' : ''}, ${warningCount} warning${warningCount !== 1 ? 's' : ''}`)\n    } else if (warningCount > 0) {\n      setValidationSummary(`${warningCount} warning${warningCount !== 1 ? 's' : ''}`)\n    } else {\n      setValidationSummary('')\n    }\n  }\n\n  // Test email handler\n  const handleTestEmail = async () => {\n    // Get the current form ID from the URL\n    const pathParts = window.location.pathname.split('/')\n    const broadcastId = pathParts[pathParts.length - 1]\n    \n    if (!broadcastId || broadcastId === 'create') {\n      alert('Please save the broadcast before sending a test email')\n      return\n    }\n\n    try {\n      const response = await fetch(`/api/broadcasts/${broadcastId}/test`, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n        },\n      })\n\n      if (!response.ok) {\n        const data = await response.json()\n        throw new Error(data.error || 'Failed to send test email')\n      }\n\n      alert('Test email sent successfully! Check your inbox.')\n    } catch (error) {\n      alert(error instanceof Error ? error.message : 'Failed to send test email')\n    }\n  }\n\n  return (\n    <div style={{\n      marginTop: '24px',\n      border: '1px solid #e5e7eb',\n      borderRadius: '8px',\n      overflow: 'hidden',\n    }}>\n      {/* Toolbar */}\n      <div style={{\n        display: 'flex',\n        alignItems: 'center',\n        justifyContent: 'space-between',\n        padding: '12px 16px',\n        borderBottom: '1px solid #e5e7eb',\n        backgroundColor: '#f9fafb',\n      }}>\n        <div style={{ display: 'flex', alignItems: 'center', gap: '16px' }}>\n          <h3 style={{ margin: 0, fontSize: '16px', fontWeight: 600 }}>Email Preview</h3>\n\n          {/* Preview Mode */}\n          <div style={{ display: 'flex', gap: '8px' }}>\n            <button\n              type=\"button\"\n              onClick={() => setPreviewMode('desktop')}\n              style={{\n                padding: '6px 12px',\n                backgroundColor: previewMode === 'desktop' ? '#6366f1' : '#e5e7eb',\n                color: previewMode === 'desktop' ? 'white' : '#374151',\n                border: 'none',\n                borderRadius: '4px 0 0 4px',\n                fontSize: '14px',\n                cursor: 'pointer',\n              }}\n            >\n              Desktop\n            </button>\n            <button\n              type=\"button\"\n              onClick={() => setPreviewMode('mobile')}\n              style={{\n                padding: '6px 12px',\n                backgroundColor: previewMode === 'mobile' ? '#6366f1' : '#e5e7eb',\n                color: previewMode === 'mobile' ? 'white' : '#374151',\n                border: 'none',\n                borderRadius: '0 4px 4px 0',\n                fontSize: '14px',\n                cursor: 'pointer',\n              }}\n            >\n              Mobile\n            </button>\n          </div>\n\n          {/* Validation Status */}\n          {validationSummary && (\n            <div style={{\n              padding: '6px 12px',\n              backgroundColor: isValid ? '#fef3c7' : '#fee2e2',\n              color: isValid ? '#92400e' : '#991b1b',\n              borderRadius: '4px',\n              fontSize: '13px',\n            }}>\n              {validationSummary}\n            </div>\n          )}\n        </div>\n\n        {/* Test Email Button */}\n        <button\n          type=\"button\"\n          onClick={handleTestEmail}\n          style={{\n            padding: '6px 12px',\n            backgroundColor: '#10b981',\n            color: 'white',\n            border: 'none',\n            borderRadius: '4px',\n            fontSize: '14px',\n            cursor: 'pointer',\n          }}\n        >\n          Send Test Email\n        </button>\n      </div>\n\n      {/* Preview */}\n      <div style={{ height: '600px' }}>\n        <EmailPreview\n          content={fields.content?.value as SerializedEditorState || null}\n          subject={fields.subject?.value as string || 'Email Subject'}\n          preheader={fields.preheader?.value as string}\n          channel={fields.channel?.value as Channel | null}\n          mode={previewMode}\n          onValidation={handleValidation}\n        />\n      </div>\n    </div>\n  )\n}","'use client'\n\nimport React, { useState, useCallback } from 'react'\nimport type { RichTextField } from 'payload'\nimport { useField, useFormFields } from '@payloadcms/ui'\nimport { EmailPreview } from './EmailPreview'\nimport type { SerializedEditorState } from 'lexical'\nimport type { Channel } from '../../types'\n\ninterface BroadcastEditorProps {\n  field: RichTextField\n  path: string\n}\n\nexport const BroadcastEditor: React.FC<BroadcastEditorProps> = (props) => {\n  const { value } = useField<SerializedEditorState>({ path: props.path })\n  const [showPreview, setShowPreview] = useState(true)\n  const [previewMode, setPreviewMode] = useState<'desktop' | 'mobile'>('desktop')\n  const [isValid, setIsValid] = useState(true)\n  const [validationSummary, setValidationSummary] = useState<string>('')\n\n  // Get other form fields for preview\n  const fields = useFormFields(([fields]) => ({\n    subject: fields.subject,\n    preheader: fields.preheader,\n    channel: fields.channel,\n  }))\n\n  // Handle validation results from preview\n  const handleValidation = useCallback((result: {\n    valid: boolean\n    warnings: string[]\n    errors: string[]\n  }) => {\n    setIsValid(result.valid)\n    \n    const errorCount = result.errors.length\n    const warningCount = result.warnings.length\n    \n    if (errorCount > 0) {\n      setValidationSummary(`${errorCount} error${errorCount !== 1 ? 's' : ''}, ${warningCount} warning${warningCount !== 1 ? 's' : ''}`)\n    } else if (warningCount > 0) {\n      setValidationSummary(`${warningCount} warning${warningCount !== 1 ? 's' : ''}`)\n    } else {\n      setValidationSummary('')\n    }\n  }, [])\n\n  // Test email handler\n  const handleTestEmail = async () => {\n    // Get the current form ID from the URL\n    const pathParts = window.location.pathname.split('/')\n    const broadcastId = pathParts[pathParts.length - 1]\n    \n    if (!broadcastId || broadcastId === 'create') {\n      alert('Please save the broadcast before sending a test email')\n      return\n    }\n\n    try {\n      const response = await fetch(`/api/broadcasts/${broadcastId}/test`, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n        },\n      })\n\n      if (!response.ok) {\n        const data = await response.json()\n        throw new Error(data.error || 'Failed to send test email')\n      }\n\n      alert('Test email sent successfully! Check your inbox.')\n    } catch (error) {\n      alert(error instanceof Error ? error.message : 'Failed to send test email')\n    }\n  }\n\n  return (\n    <div style={{ height: '600px', display: 'flex', flexDirection: 'column' }}>\n      {/* Toolbar */}\n      <div style={{\n        display: 'flex',\n        alignItems: 'center',\n        justifyContent: 'space-between',\n        padding: '12px 16px',\n        borderBottom: '1px solid #e5e7eb',\n        backgroundColor: '#f9fafb',\n      }}>\n        <div style={{ display: 'flex', alignItems: 'center', gap: '16px' }}>\n          {/* Preview Toggle */}\n          <button\n            type=\"button\"\n            onClick={() => setShowPreview(!showPreview)}\n            style={{\n              padding: '6px 12px',\n              backgroundColor: showPreview ? '#3b82f6' : '#e5e7eb',\n              color: showPreview ? 'white' : '#374151',\n              border: 'none',\n              borderRadius: '4px',\n              fontSize: '14px',\n              cursor: 'pointer',\n            }}\n          >\n            {showPreview ? 'Hide Preview' : 'Show Preview'}\n          </button>\n\n          {/* Preview Mode */}\n          {showPreview && (\n            <div style={{ display: 'flex', gap: '8px' }}>\n              <button\n                type=\"button\"\n                onClick={() => setPreviewMode('desktop')}\n                style={{\n                  padding: '6px 12px',\n                  backgroundColor: previewMode === 'desktop' ? '#6366f1' : '#e5e7eb',\n                  color: previewMode === 'desktop' ? 'white' : '#374151',\n                  border: 'none',\n                  borderRadius: '4px 0 0 4px',\n                  fontSize: '14px',\n                  cursor: 'pointer',\n                }}\n              >\n                Desktop\n              </button>\n              <button\n                type=\"button\"\n                onClick={() => setPreviewMode('mobile')}\n                style={{\n                  padding: '6px 12px',\n                  backgroundColor: previewMode === 'mobile' ? '#6366f1' : '#e5e7eb',\n                  color: previewMode === 'mobile' ? 'white' : '#374151',\n                  border: 'none',\n                  borderRadius: '0 4px 4px 0',\n                  fontSize: '14px',\n                  cursor: 'pointer',\n                }}\n              >\n                Mobile\n              </button>\n            </div>\n          )}\n\n          {/* Validation Status */}\n          {showPreview && validationSummary && (\n            <div style={{\n              padding: '6px 12px',\n              backgroundColor: isValid ? '#fef3c7' : '#fee2e2',\n              color: isValid ? '#92400e' : '#991b1b',\n              borderRadius: '4px',\n              fontSize: '13px',\n            }}>\n              {validationSummary}\n            </div>\n          )}\n        </div>\n\n        {/* Test Email Button */}\n        {showPreview && (\n          <button\n            type=\"button\"\n            onClick={handleTestEmail}\n            style={{\n              padding: '6px 12px',\n              backgroundColor: '#10b981',\n              color: 'white',\n              border: 'none',\n              borderRadius: '4px',\n              fontSize: '14px',\n              cursor: 'pointer',\n            }}\n          >\n            Send Test Email\n          </button>\n        )}\n      </div>\n\n      {/* Content Area */}\n      <div style={{ flex: 1, display: 'flex', overflow: 'hidden' }}>\n        {/* Editor */}\n        <div style={{ \n          flex: showPreview ? '0 0 50%' : '1',\n          overflow: 'auto',\n          borderRight: showPreview ? '1px solid #e5e7eb' : 'none',\n        }}>\n          <div style={{ padding: '16px' }}>\n            {/* The actual rich text editor will be rendered by Payload */}\n            {/* This component wraps it with preview functionality */}\n            <div className=\"rich-text-lexical\">\n              {/* Payload will inject the editor here */}\n            </div>\n          </div>\n        </div>\n\n        {/* Preview */}\n        {showPreview && (\n          <div style={{ flex: '0 0 50%', overflow: 'hidden' }}>\n            <EmailPreview\n              content={value}\n              subject={fields.subject?.value as string || 'Email Subject'}\n              preheader={fields.preheader?.value as string}\n              channel={fields.channel?.value as Channel | null}\n              mode={previewMode}\n              onValidation={handleValidation}\n            />\n          </div>\n        )}\n      </div>\n    </div>\n  )\n}"],"mappings":"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","names":["import_react","import_jsx_runtime","defaultStyles","import_react","import_jsx_runtime","defaultStyles","import_react","import_react","DOMPurify","import_jsx_runtime","escapeHtml","import_react","import_jsx_runtime","fields","import_react","import_ui","import_jsx_runtime","fields"]}