@preprio/prepr-nextjs 2.1.1 → 2.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/react/index.tsx","../../src/react/components/toolbar/toolbar-provider.tsx","../../src/react/components/error-boundary.tsx","../../src/react/components/store/prepr-store-initializer.tsx","../../src/stores/prepr-store.ts","../../src/utils/index.ts","../../src/utils/errors.ts","../../src/utils/dom.ts","../../src/utils/debug.ts","../../src/utils/performance.ts","../../src/react/hooks/use-scroll-position.tsx","../../src/react/components/toolbar/prepr-toolbar.tsx","../../src/react/hooks/use-stega-scan.tsx","../../src/react/hooks/use-stega-overlay.tsx","../../src/react/hooks/use-stega-proximity.tsx","../../src/react/hooks/use-stega-elements.tsx","../../src/react/components/toolbar/toolbar-wrapper.tsx","../../src/react/components/toolbar/toolbar.tsx","../../src/react/hooks/use-modal.ts","../../src/react/components/toolbar/toolbar-content.tsx","../../src/react/components/ui/status-indicator-pill.tsx","../../src/react/components/icons/xmark.tsx","../../src/react/hooks/use-i18n.ts","../../src/i18n/locales/en.json","../../src/i18n/locales/nl.json","../../src/i18n/index.ts","../../src/react/components/ui/close-edit-mode-pill.tsx","../../src/react/components/ui/reset-button.tsx","../../src/react/components/icons/rotate.tsx","../../src/react/components/ui/icon.tsx","../../src/react/components/ui/logo.tsx","../../src/react/components/ui/prepr-tracking-pixel.tsx","../../src/react/components/selectors/segment-selector.tsx","../../src/react/components/icons/sort-down.tsx","../../src/react/components/selectors/variant-selector.tsx","../../src/react/components/selectors/radio-selector.tsx","../../src/react/components/ui/tooltip.tsx","../../src/react/components/selectors/edit-mode-selector.tsx","../../src/react/components/selectors/preview-mode-selector.tsx","../../src/react/components/toolbar/toolbar-button.tsx","../../src/react/components/toolbar/toolbar-indicator-wrapper.tsx"],"sourcesContent":["'use client';\n\nexport {\n PreprToolbarProvider,\n usePreprToolbar,\n} from './components/toolbar/toolbar-provider';\n\nexport { default as PreprToolbar } from './components/toolbar/prepr-toolbar';\nexport { default as PreprTrackingPixel } from './components/ui/prepr-tracking-pixel';\nexport { useTranslations } from './hooks/use-i18n';\n","'use client';\n\nimport React, { ReactNode, useEffect, useCallback, useMemo } from 'react';\nimport { PreprToolbarOptions, PreprToolbarProps } from '../../../types';\nimport { StegaErrorBoundary } from '../error-boundary';\nimport { PreprStoreInitializer } from '../store/prepr-store-initializer';\nimport { initDebugLogger } from '../../../utils/debug';\nimport useScrollPosition from '../../hooks/use-scroll-position';\nimport { usePreprStore, usePreviewMode } from '../../../stores/prepr-store';\n\ninterface PreprToolbarProviderProps {\n children: ReactNode;\n props: PreprToolbarProps;\n options?: PreprToolbarOptions;\n}\n\nexport const PreprToolbarProvider: React.FC<PreprToolbarProviderProps> = ({\n children,\n props,\n options,\n}) => {\n // Initialize debug logger with options\n useEffect(() => {\n const debugEnabled = options?.debug ?? false;\n initDebugLogger(debugEnabled);\n }, [options?.debug]);\n\n // Initialize scroll position handling for iframe communication\n useScrollPosition();\n\n // Initialize locale from options\n const setLocale = usePreprStore(s => s.setLocale);\n useEffect(() => {\n if (options?.locale) {\n setLocale(options.locale);\n }\n }, [options?.locale, setLocale]);\n\n // Fallback: auto-detect browser language when no locale is provided\n useEffect(() => {\n if (options?.locale) return; // Respect explicitly provided locale\n\n if (typeof navigator !== 'undefined') {\n const candidates =\n Array.isArray(navigator.languages) && navigator.languages.length\n ? navigator.languages\n : [navigator.language];\n\n const normalized = candidates\n .filter(Boolean)\n .map(l => l.toLowerCase())\n .map(l => l.split('-')[0]);\n\n // Restrict to supported locales; default to 'en'\n const supported: Array<'en' | 'nl'> = ['en', 'nl'];\n const match = normalized.find(l =>\n supported.includes(l as 'en' | 'nl')\n ) as 'en' | 'nl' | undefined;\n\n setLocale(match ?? 'en');\n }\n }, [options?.locale, setLocale]);\n\n return (\n <StegaErrorBoundary>\n <PreprStoreInitializer props={props}>{children}</PreprStoreInitializer>\n </StegaErrorBoundary>\n );\n};\n\n// Legacy hook for backward compatibility\nexport const usePreprToolbar = () => {\n // Convenience hook backed by Zustand store\n const selectedSegment = usePreprStore(s => s.selectedSegment);\n const segments = usePreprStore(s => s.segments);\n const emptySegment = usePreprStore(s => s.emptySegment);\n const setSelectedSegment = usePreprStore(s => s.setSelectedSegment);\n\n const selectedVariant = usePreprStore(s => s.selectedVariant);\n const emptyVariant = usePreprStore(s => s.emptyVariant);\n const setSelectedVariant = usePreprStore(s => s.setSelectedVariant);\n\n const editMode = usePreprStore(s => s.editMode);\n const setEditMode = usePreprStore(s => s.setEditMode);\n const isIframe = usePreprStore(s => s.isIframe);\n\n const resetPersonalizationStore = usePreprStore(s => s.resetPersonalization);\n const resetAllStore = usePreprStore(s => s.resetAll);\n const previewMode = usePreviewMode();\n\n const resetPersonalization = useCallback(() => {\n resetPersonalizationStore();\n }, [resetPersonalizationStore]);\n\n const resetAll = useCallback(() => {\n resetAllStore();\n }, [resetAllStore]);\n\n return useMemo(\n () => ({\n isPreviewMode: previewMode,\n activeSegment: selectedSegment._id,\n activeVariant: selectedVariant,\n data: segments,\n emptySegment,\n segmentList: segments,\n selectedSegment,\n setSelectedSegment,\n emptyVariant,\n selectedVariant,\n setSelectedVariant,\n editMode,\n setEditMode,\n isIframe,\n resetPersonalization,\n resetAll,\n }),\n [\n previewMode,\n selectedSegment,\n segments,\n emptySegment,\n setSelectedSegment,\n selectedVariant,\n emptyVariant,\n setSelectedVariant,\n editMode,\n setEditMode,\n isIframe,\n resetPersonalization,\n resetAll,\n ]\n );\n};\n","'use client';\n\nimport React, { Component, ReactNode } from 'react';\n\ninterface Props {\n children: ReactNode;\n fallback?: ReactNode;\n}\n\ninterface State {\n hasError: boolean;\n error: Error | null;\n}\n\nexport class StegaErrorBoundary extends Component<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): State {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n console.error('Stega Error Boundary caught an error:', error, errorInfo);\n\n // In production, you might want to send this to an error tracking service\n if (process.env.NODE_ENV === 'production') {\n // sendToErrorTrackingService({ error, errorInfo });\n }\n }\n\n render() {\n if (this.state.hasError) {\n if (this.props.fallback) {\n return this.props.fallback;\n }\n\n return (\n <div className=\"p-rounded-lg p-border p-border-red-200 p-bg-red-50 p-p-4 p-text-sm p-text-red-800\">\n <div className=\"p-mb-2 p-font-semibold\">Preview mode unavailable</div>\n <div className=\"p-text-red-600\">\n {this.state.error?.message || 'An unexpected error occurred'}\n </div>\n </div>\n );\n }\n\n return this.props.children;\n }\n}\n","'use client';\n\nimport React, { ReactNode, useEffect } from 'react';\nimport { usePreprStore } from '../../../stores/prepr-store';\nimport { PreprToolbarProps } from '../../../types';\n\ninterface PreprStoreInitializerProps {\n children: ReactNode;\n props: PreprToolbarProps;\n}\n\nexport function PreprStoreInitializer({\n children,\n props,\n}: PreprStoreInitializerProps) {\n const initialize = usePreprStore(state => state.initialize);\n const setIsIframe = usePreprStore(state => state.setIsIframe);\n const editMode = usePreprStore(state => state.editMode);\n const setEditMode = usePreprStore(state => state.setEditMode);\n const setToolbarOpen = usePreprStore(state => state.setToolbarOpen);\n\n // Initialize store with server data\n useEffect(() => {\n initialize({\n initialSegments: props.data,\n activeSegment: props.activeSegment,\n activeVariant: props.activeVariant,\n });\n }, [initialize, props.data, props.activeSegment, props.activeVariant]);\n\n // Handle iframe detection\n useEffect(() => {\n if (typeof window !== 'undefined' && window.parent !== window) {\n setIsIframe(true);\n }\n }, [setIsIframe]);\n\n // Handle escape key for edit mode\n useEffect(() => {\n const handleEscapeKey = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && editMode) {\n setEditMode(false);\n }\n };\n\n if (editMode) {\n document.addEventListener('keydown', handleEscapeKey);\n }\n\n return () => {\n document.removeEventListener('keydown', handleEscapeKey);\n };\n }, [editMode, setEditMode]);\n\n // Initialize preview mode from cookie\n useEffect(() => {\n if (typeof window !== 'undefined') {\n const getCookie = (name: string): string | null => {\n if (typeof document === 'undefined') return null;\n const value = `; ${document.cookie}`;\n const parts = value.split(`; ${name}=`);\n if (parts.length === 2) return parts.pop()?.split(';').shift() || null;\n return null;\n };\n\n const cookieValue = getCookie('Prepr-Preview-Mode');\n if (cookieValue !== null) {\n // Don't trigger events on initial load\n usePreprStore.setState({ previewMode: cookieValue === 'true' });\n }\n\n const toolbarOpenCookie = getCookie('Prepr-Toolbar-Open');\n if (toolbarOpenCookie !== null) {\n setToolbarOpen(toolbarOpenCookie === 'true');\n }\n }\n }, []);\n\n return <>{children}</>;\n}\n","'use client';\n\nimport { create } from 'zustand';\nimport { subscribeWithSelector } from 'zustand/middleware';\nimport { PreprSegment } from '../types';\nimport { sendPreprEvent } from '../utils';\n\ninterface PreprStore {\n // Locale slice\n locale: string;\n setLocale: (locale: string) => void;\n\n // Segment slice\n segments: PreprSegment[];\n selectedSegment: PreprSegment;\n emptySegment: PreprSegment;\n setSelectedSegment: (segment: PreprSegment) => void;\n initializeSegments: (\n segments: readonly PreprSegment[],\n activeSegment?: string | null\n ) => void;\n\n // Variant slice\n selectedVariant: string | null;\n emptyVariant: string;\n setSelectedVariant: (variant: string | null) => void;\n initializeVariant: (activeVariant?: string | null) => void;\n\n // Edit mode slice\n editMode: boolean;\n isIframe: boolean;\n setEditMode: (mode: boolean) => void;\n setIsIframe: (isIframe: boolean) => void;\n\n // Preview mode slice\n previewMode: boolean;\n setPreviewMode: (mode: boolean) => void;\n\n // Toolbar visibility slice\n toolbarOpen: boolean;\n setToolbarOpen: (open: boolean) => void;\n\n // Reset actions\n resetPersonalization: () => void;\n resetAll: () => void;\n\n // Store initialization\n initialize: (props: {\n initialSegments: readonly PreprSegment[];\n activeSegment?: string | null;\n activeVariant?: string | null;\n }) => void;\n}\n\nexport const usePreprStore = create<PreprStore>()(\n subscribeWithSelector((set, get) => ({\n // Initial i18n state\n locale: 'en',\n setLocale: (locale: string) => set({ locale }),\n\n // Initial segment state\n segments: [],\n selectedSegment: {\n name: 'Choose segment',\n _id: 'null',\n },\n emptySegment: {\n name: 'Choose segment',\n _id: 'null',\n },\n setSelectedSegment: (segment: PreprSegment) => {\n set({ selectedSegment: segment });\n sendPreprEvent('segment_changed', { segment: segment._id });\n },\n initializeSegments: (\n initialSegments: readonly PreprSegment[],\n activeSegment?: string | null\n ) => {\n const segmentList: PreprSegment[] = [\n {\n _id: 'all_other_users',\n name: 'All other users',\n },\n ...initialSegments,\n ];\n\n const emptySegment: PreprSegment = {\n name: 'Choose segment',\n _id: 'null',\n };\n\n const selectedSegment =\n (segmentList &&\n segmentList.filter(\n (segmentData: PreprSegment) => segmentData._id === activeSegment\n )[0]) ||\n emptySegment;\n\n set({\n segments: segmentList,\n selectedSegment,\n emptySegment,\n });\n },\n\n // Initial variant state\n selectedVariant: 'A',\n emptyVariant: 'A',\n setSelectedVariant: (variant: string | null) => {\n set({ selectedVariant: variant });\n sendPreprEvent('variant_changed', { variant: variant ?? undefined });\n },\n initializeVariant: (activeVariant?: string | null) => {\n set({ selectedVariant: activeVariant || 'A' });\n },\n\n // Initial edit mode state\n editMode: false,\n isIframe: false,\n setEditMode: (mode: boolean) => {\n set({ editMode: mode });\n sendPreprEvent('edit_mode_toggled', { editMode: mode });\n },\n setIsIframe: (isIframe: boolean) => {\n set({ isIframe });\n },\n\n // Initial preview mode state\n previewMode: true,\n setPreviewMode: (mode: boolean) => {\n set({ previewMode: mode });\n // Ensure edit mode is off when toolbar is disabled\n if (!mode) {\n const { setEditMode } = get();\n setEditMode(false);\n }\n // Manage toolbar open state and cookie to restore after reload\n const { setToolbarOpen } = get();\n // Auto-close toolbar when toggling preview mode\n setToolbarOpen(false);\n // Cookie handling\n if (typeof document !== 'undefined') {\n const expires = new Date();\n expires.setTime(expires.getTime() + 365 * 24 * 60 * 60 * 1000);\n document.cookie = `Prepr-Preview-Mode=${mode.toString()};expires=${expires.toUTCString()};path=/`;\n document.cookie = `Prepr-Toolbar-Open=false;expires=${expires.toUTCString()};path=/`;\n }\n sendPreprEvent('preview_mode_toggled', { previewMode: mode });\n // Refresh the page to apply the new preview mode state\n if (typeof window !== 'undefined') {\n window.location.reload();\n }\n },\n\n // Toolbar visibility\n toolbarOpen: false,\n setToolbarOpen: (open: boolean) => {\n set({ toolbarOpen: open });\n if (typeof document !== 'undefined') {\n const expires = new Date();\n expires.setTime(expires.getTime() + 365 * 24 * 60 * 60 * 1000);\n document.cookie = `Prepr-Toolbar-Open=${open.toString()};expires=${expires.toUTCString()};path=/`;\n }\n },\n\n // Reset actions\n resetPersonalization: () => {\n const {\n emptySegment,\n emptyVariant,\n setSelectedSegment,\n setSelectedVariant,\n } = get();\n setSelectedSegment(emptySegment);\n setSelectedVariant(emptyVariant);\n },\n resetAll: () => {\n const {\n emptySegment,\n emptyVariant,\n setSelectedSegment,\n setSelectedVariant,\n setEditMode,\n } = get();\n setSelectedSegment(emptySegment);\n setSelectedVariant(emptyVariant);\n setEditMode(false);\n },\n\n // Master initialization\n initialize: props => {\n const { initializeSegments, initializeVariant } = get();\n initializeSegments(props.initialSegments, props.activeSegment);\n initializeVariant(props.activeVariant);\n },\n }))\n);\n\n// Selectors for performance optimization\nexport const useSegments = () => usePreprStore(state => state.segments);\nexport const useSelectedSegment = () =>\n usePreprStore(state => state.selectedSegment);\nexport const useSelectedVariant = () =>\n usePreprStore(state => state.selectedVariant);\nexport const useEditMode = () => usePreprStore(state => state.editMode);\nexport const useIsIframe = () => usePreprStore(state => state.isIframe);\nexport const usePreviewMode = () => usePreprStore(state => state.previewMode);\nexport const useLocale = () => usePreprStore(state => state.locale);\n","import { ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\nimport { PreprEventType } from '../types';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n// Define specific types for Prepr events\nexport interface PreprEventData {\n readonly segment?: string;\n readonly variant?: string;\n readonly editMode?: boolean;\n readonly [key: string]: string | boolean | number | undefined;\n}\n\n/**\n * Sends a Prepr event to both the current window and parent window\n * @param event - The event type to send\n * @param data - Optional event data\n */\nexport function sendPreprEvent(\n event: PreprEventType,\n data?: PreprEventData\n): void {\n if (typeof window !== 'undefined') {\n const message = {\n name: 'prepr_preview_bar',\n event,\n ...data,\n };\n\n // Send to current window for local event handling\n window.dispatchEvent(\n new CustomEvent('prepr_preview_bar', { detail: message })\n );\n\n // Send to parent window if available\n if (window.parent && window.parent !== window) {\n window.parent.postMessage(message, '*');\n }\n }\n}\n\n// Export error handling utilities\nexport * from './errors';\n\n// Export DOM service\nexport * from './dom';\n\n// Export debug utilities\nexport * from './debug';\n\n// Export performance utilities\nexport * from './performance';\n","export const StegaError = {\n DECODE_FAILED: 'STEGA_DECODE_FAILED',\n INVALID_FORMAT: 'STEGA_INVALID_FORMAT',\n DOM_MANIPULATION_FAILED: 'DOM_MANIPULATION_FAILED',\n CONTEXT_NOT_FOUND: 'CONTEXT_NOT_FOUND',\n} as const;\n\nexport type StegaErrorType = (typeof StegaError)[keyof typeof StegaError];\n\n// Define specific types for error additional data\nexport interface ErrorAdditionalData {\n input?: string;\n element?: HTMLElement;\n context?: string;\n [key: string]: string | HTMLElement | undefined;\n}\n\nexport interface ErrorInfo {\n type: StegaErrorType;\n context: string;\n message: string;\n timestamp: string;\n stack?: string;\n additionalData?: ErrorAdditionalData;\n}\n\nexport function createErrorInfo(\n type: StegaErrorType,\n context: string,\n error: Error,\n additionalData?: ErrorAdditionalData\n): ErrorInfo {\n return {\n type,\n context,\n message: error.message,\n timestamp: new Date().toISOString(),\n stack: error.stack,\n additionalData,\n };\n}\n\nexport function handleStegaError(\n error: Error,\n context: string,\n additionalData?: ErrorAdditionalData\n) {\n const errorInfo = createErrorInfo(\n StegaError.DECODE_FAILED,\n context,\n error,\n additionalData\n );\n\n console.error('Stega Error:', errorInfo);\n\n // In production, you might want to send this to an error tracking service\n if (process.env.NODE_ENV === 'production') {\n // sendToErrorTrackingService(errorInfo);\n }\n\n return errorInfo;\n}\n\nexport function handleDOMError(error: Error, context: string) {\n const errorInfo = createErrorInfo(\n StegaError.DOM_MANIPULATION_FAILED,\n context,\n error\n );\n\n console.error('DOM Error:', errorInfo);\n return errorInfo;\n}\n\nexport function handleContextError(contextName: string) {\n const error = new Error(`${contextName} must be used within its provider`);\n const errorInfo = createErrorInfo(\n StegaError.CONTEXT_NOT_FOUND,\n contextName,\n error\n );\n\n console.error('Context Error:', errorInfo);\n throw error;\n}\n","import { handleDOMError } from './errors';\n\nexport class DOMService {\n /**\n * Creates an HTML element with specified tag and class name\n */\n static createElement(tag: string, className: string): HTMLElement {\n try {\n const element = document.createElement(tag);\n element.className = className;\n return element;\n } catch (error) {\n handleDOMError(error as Error, 'createElement');\n throw error;\n }\n }\n\n /**\n * Appends an element to the document body\n */\n static appendToBody(element: HTMLElement): void {\n try {\n document.body.appendChild(element);\n } catch (error) {\n handleDOMError(error as Error, 'appendToBody');\n throw error;\n }\n }\n\n /**\n * Removes an element from the document body\n */\n static removeFromBody(element: HTMLElement): void {\n try {\n if (element.parentNode) {\n element.parentNode.removeChild(element);\n }\n } catch (error) {\n handleDOMError(error as Error, 'removeFromBody');\n throw error;\n }\n }\n\n /**\n * Sets multiple CSS properties on an element\n */\n static setElementStyles(\n element: HTMLElement,\n styles: Record<string, string>\n ): void {\n try {\n Object.entries(styles).forEach(([property, value]) => {\n element.style.setProperty(property, value);\n });\n } catch (error) {\n handleDOMError(error as Error, 'setElementStyles');\n throw error;\n }\n }\n\n /**\n * Gets the bounding rectangle of an element\n */\n static getElementRect(element: HTMLElement): DOMRect {\n try {\n return element.getBoundingClientRect();\n } catch (error) {\n handleDOMError(error as Error, 'getElementRect');\n throw error;\n }\n }\n\n /**\n * Checks if an element is in the viewport\n */\n static isElementInViewport(element: HTMLElement): boolean {\n try {\n const rect = this.getElementRect(element);\n return (\n rect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <=\n (window.innerHeight || document.documentElement.clientHeight) &&\n rect.right <=\n (window.innerWidth || document.documentElement.clientWidth)\n );\n } catch (error) {\n handleDOMError(error as Error, 'isElementInViewport');\n return false;\n }\n }\n\n /**\n * Calculates distance between two points\n */\n static calculateDistance(\n x1: number,\n y1: number,\n x2: number,\n y2: number\n ): number {\n return Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));\n }\n\n /**\n * Finds the closest element to a point from a list of elements\n */\n static findClosestElement(\n pointX: number,\n pointY: number,\n elements: NodeListOf<Element>\n ): HTMLElement | null {\n try {\n let closestElement: HTMLElement | null = null;\n let minDistance = Infinity;\n\n elements.forEach(element => {\n const rect = this.getElementRect(element as HTMLElement);\n const distance = this.calculateDistance(\n pointX,\n pointY,\n rect.left + rect.width / 2,\n rect.top + rect.height / 2\n );\n\n if (distance < minDistance) {\n minDistance = distance;\n closestElement = element as HTMLElement;\n }\n });\n\n return closestElement;\n } catch (error) {\n handleDOMError(error as Error, 'findClosestElement');\n return null;\n }\n }\n\n /**\n * Safely adds event listeners\n */\n static addEventListener(\n element: EventTarget,\n event: string,\n handler: EventListener,\n options?: AddEventListenerOptions\n ): void {\n try {\n element.addEventListener(event, handler, options);\n } catch (error) {\n handleDOMError(error as Error, 'addEventListener');\n throw error;\n }\n }\n\n /**\n * Safely removes event listeners\n */\n static removeEventListener(\n element: EventTarget,\n event: string,\n handler: EventListener,\n options?: EventListenerOptions\n ): void {\n try {\n element.removeEventListener(event, handler, options);\n } catch (error) {\n handleDOMError(error as Error, 'removeEventListener');\n throw error;\n }\n }\n}\n","/**\n * Debug utility for Prepr Next.js package\n * Provides centralized debug logging with performance optimizations\n */\n\n// Define specific types for debug arguments\nexport type DebugArg = string | number | boolean | null | undefined | object;\n\ninterface DebugOptions {\n enabled?: boolean;\n prefix?: string;\n}\n\nclass DebugLogger {\n private options: DebugOptions;\n\n constructor(options: DebugOptions) {\n this.options = {\n prefix: '[Prepr]',\n ...options,\n };\n }\n\n /**\n * Check if debug is enabled - checks both local and global state\n */\n private isEnabled(): boolean {\n // If this logger has a local enabled state, use it\n if (this.options.enabled !== undefined) {\n return this.options.enabled;\n }\n\n // Otherwise, check the global logger state\n return globalDebugLogger?.options?.enabled ?? false;\n }\n\n /**\n * Log a debug message if debug is enabled\n */\n log(message: string, ...args: DebugArg[]): void {\n if (!this.isEnabled()) return;\n\n const prefix = this.options.prefix;\n console.log(`${prefix} ${message}`, ...args);\n }\n\n /**\n * Log a debug warning if debug is enabled\n */\n warn(message: string, ...args: DebugArg[]): void {\n if (!this.isEnabled()) return;\n\n const prefix = this.options.prefix;\n console.warn(`${prefix} ${message}`, ...args);\n }\n\n /**\n * Log a debug error if debug is enabled\n */\n error(message: string, ...args: DebugArg[]): void {\n if (!this.isEnabled()) return;\n\n const prefix = this.options.prefix;\n console.error(`${prefix} ${message}`, ...args);\n }\n\n /**\n * Create a scoped logger with additional context\n */\n scope(scopeName: string): DebugLogger {\n return new DebugLogger({\n ...this.options,\n prefix: `${this.options.prefix}[${scopeName}]`,\n });\n }\n}\n\n// Global debug instance\nlet globalDebugLogger: DebugLogger | null = null;\n\n/**\n * Initialize the debug logger\n */\nexport function initDebugLogger(enabled: boolean = false): void {\n globalDebugLogger = new DebugLogger({ enabled });\n}\n\n/**\n * Get the debug logger instance\n */\nexport function getDebugLogger(): DebugLogger {\n if (!globalDebugLogger) {\n // Fallback to disabled logger if not initialized\n globalDebugLogger = new DebugLogger({ enabled: false });\n }\n return globalDebugLogger;\n}\n\n/**\n * Convenience function for logging\n */\nexport function debugLog(message: string, ...args: DebugArg[]): void {\n getDebugLogger().log(message, ...args);\n}\n\n/**\n * Convenience function for warning\n */\nexport function debugWarn(message: string, ...args: DebugArg[]): void {\n getDebugLogger().warn(message, ...args);\n}\n\n/**\n * Convenience function for errors\n */\nexport function debugError(message: string, ...args: DebugArg[]): void {\n getDebugLogger().error(message, ...args);\n}\n\n/**\n * Create a scoped debug logger that dynamically checks global debug state\n */\nexport function createScopedLogger(scopeName: string): DebugLogger {\n // Create a scoped logger without its own enabled state\n // This allows it to dynamically check the global logger state\n return new DebugLogger({\n prefix: `[Prepr][${scopeName}]`,\n });\n}\n","// Performance utilities\n\n/**\n * Throttled function with cancellation support\n */\nexport interface ThrottledFunction<T extends (...args: any[]) => any> {\n (...args: Parameters<T>): void;\n cancel(): void;\n}\n\n/**\n * Improved throttle function with better memory management and cancellation\n * @param func - The function to throttle\n * @param delay - The delay in milliseconds\n * @returns Throttled function with cancel method\n */\nexport function throttle<T extends (...args: any[]) => any>(\n func: T,\n delay: number\n): ThrottledFunction<T> {\n let timeoutId: NodeJS.Timeout | null = null;\n let lastExecTime = 0;\n\n const throttledFunc = ((...args: Parameters<T>) => {\n const currentTime = Date.now();\n const timeSinceLastExec = currentTime - lastExecTime;\n\n if (timeSinceLastExec >= delay) {\n func(...args);\n lastExecTime = currentTime;\n } else {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(() => {\n func(...args);\n lastExecTime = Date.now();\n timeoutId = null;\n }, delay - timeSinceLastExec);\n }\n }) as ThrottledFunction<T>;\n\n throttledFunc.cancel = () => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n return throttledFunc;\n}\n\n/**\n * Debounce function with cancellation support\n * @param func - The function to debounce\n * @param delay - The delay in milliseconds\n * @returns Debounced function with cancel method\n */\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n delay: number\n): ThrottledFunction<T> {\n let timeoutId: NodeJS.Timeout | null = null;\n\n const debouncedFunc = ((...args: Parameters<T>) => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(() => {\n func(...args);\n timeoutId = null;\n }, delay);\n }) as ThrottledFunction<T>;\n\n debouncedFunc.cancel = () => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n return debouncedFunc;\n}\n\n// Simple DOM element cache for querySelectorAll\nexport function createElementCache<T extends Element = Element>(\n query: string,\n ttl: number = 1000\n) {\n let cache: NodeListOf<T> | null = null;\n let lastCacheTime = 0;\n return () => {\n const now = Date.now();\n if (!cache || now - lastCacheTime > ttl) {\n cache = document.querySelectorAll<T>(query);\n lastCacheTime = now;\n }\n return cache;\n };\n}\n","import { useEffect } from 'react';\nimport { sendPreprEvent } from '../../utils';\nimport { createScopedLogger } from '../../utils';\n\n// Mark this hook as having side effects to prevent tree shaking\n\nexport default function useScrollPosition() {\n const debug = createScopedLogger('useScrollPosition');\n\n useEffect(() => {\n sendPreprEvent('getScrollPosition', {\n value: 0,\n });\n\n if (window.parent !== self) {\n let parentOrigin: string | null = null; //Get origin of parent outside iframe\n sendPreprEvent('loaded');\n\n const handleMessage = (evt: MessageEvent) => {\n debug.log('received message:', evt.data);\n\n if (evt?.data?.event === 'prepr:initVE' && !parentOrigin) {\n parentOrigin = evt.origin;\n\n if (evt.data?.scrollPosition) {\n debug.log('scrolling to position:', evt.data.scrollPosition);\n //Timeout needed in order to scroll to position\n setTimeout(() => {\n window.scrollTo(0, evt.data?.scrollPosition);\n }, 1);\n }\n }\n if (evt.origin !== parentOrigin) return;\n\n if (evt?.data?.event === 'prepr:getScrollPosition') {\n const currentScrollY =\n window.scrollY || document.documentElement.scrollTop;\n debug.log('sending scroll position:', currentScrollY);\n sendPreprEvent('getScrollPosition', {\n value: currentScrollY,\n });\n }\n };\n\n window.addEventListener('message', handleMessage);\n\n debug.log('set up iframe message listener');\n\n return () => {\n window.removeEventListener('message', handleMessage);\n debug.log('cleaned up iframe message listener');\n };\n } else {\n debug.log('not in iframe, skipping iframe setup');\n return undefined;\n }\n }, [debug]);\n\n // Return something to prevent tree shaking\n return true;\n}\n","'use client';\n\nimport React from 'react';\nimport { useEditMode } from '../../../stores/prepr-store';\nimport useStegaScan from '../../hooks/use-stega-scan';\nimport ToolbarWrapper from './toolbar-wrapper';\nimport ToolbarIndicatorWrapper from './toolbar-indicator-wrapper';\n\nexport default function PreprToolbar() {\n const editMode = useEditMode();\n\n useStegaScan(editMode);\n\n return (\n <>\n <ToolbarWrapper />\n <ToolbarIndicatorWrapper />\n </>\n );\n}\n","import { useEffect, useRef, useCallback, useMemo } from 'react';\nimport { DOMService } from '../../utils/dom';\nimport { createScopedLogger } from '../../utils/debug';\nimport { throttle } from '../../utils/performance';\nimport { useStegaOverlay } from './use-stega-overlay';\nimport { useStegaProximity } from './use-stega-proximity';\nimport { useStegaElements } from './use-stega-elements';\n\nexport default function useStegaScan(editMode: boolean): void {\n const debug = createScopedLogger('useStegaScan');\n const isInitializedRef = useRef(false);\n\n const {\n currentElementRef,\n hideTimeoutRef,\n createOverlay,\n showOverlay,\n hideOverlay,\n cleanup: cleanupOverlay,\n decode,\n } = useStegaOverlay();\n\n const {\n updateElementGradients,\n clearAllHighlights,\n refreshObserving,\n stopObserving,\n } = useStegaProximity();\n\n const {\n getElements,\n scanDocument,\n setupMutationObserver,\n cleanup: cleanupElements,\n } = useStegaElements();\n\n // Memoize the throttled mouse move handler\n const throttledMouseMove = useMemo(\n () =>\n throttle((e: Event) => {\n const mouseEvent = e as MouseEvent;\n const target = mouseEvent.target as HTMLElement;\n // Early return if hovering over tooltip\n if (target.closest('.prepr-tooltip')) {\n return;\n }\n updateElementGradients(mouseEvent.clientX, mouseEvent.clientY);\n const encodedElement = target.closest('[data-prepr-encoded]');\n if (encodedElement) {\n showOverlay(encodedElement as HTMLElement);\n } else {\n hideOverlay();\n }\n }, 16),\n [updateElementGradients, showOverlay, hideOverlay]\n );\n\n // Memoize tooltip handlers\n const handleTooltipMouseEnter = useCallback(() => {\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n }\n }, [hideTimeoutRef]);\n\n const handleTooltipMouseLeave = useCallback(() => {\n if (!currentElementRef.current) {\n hideOverlay();\n }\n }, [currentElementRef, hideOverlay]);\n\n useEffect(() => {\n debug.log('editMode changed to', editMode);\n if (!editMode) {\n debug.log('editMode is false, cleaning up');\n if (isInitializedRef.current) {\n DOMService.removeEventListener(\n document,\n 'mousemove',\n throttledMouseMove\n );\n cleanupOverlay();\n clearAllHighlights();\n cleanupElements();\n isInitializedRef.current = false;\n }\n return;\n }\n if (isInitializedRef.current) {\n debug.log('already initialized, skipping setup');\n return;\n }\n debug.log('editMode is true, setting up scanning');\n // Create overlay and tooltip elements\n const { tooltip } = createOverlay();\n debug.log('created overlay and tooltip');\n DOMService.addEventListener(tooltip, 'mouseenter', handleTooltipMouseEnter);\n DOMService.addEventListener(tooltip, 'mouseleave', handleTooltipMouseLeave);\n debug.log('starting document scan');\n scanDocument(decode);\n const elements = getElements();\n debug.log('found', elements.length, 'encoded elements after scan');\n // Start observing visible candidates\n refreshObserving();\n setupMutationObserver(decode, () => {\n // Refresh visible candidates on DOM changes\n refreshObserving();\n });\n debug.log('set up mutation observer');\n DOMService.addEventListener(document, 'mousemove', throttledMouseMove);\n debug.log('added throttled mousemove handler');\n isInitializedRef.current = true;\n return () => {\n debug.log('cleaning up');\n DOMService.removeEventListener(document, 'mousemove', throttledMouseMove);\n DOMService.removeEventListener(\n tooltip,\n 'mouseenter',\n handleTooltipMouseEnter\n );\n DOMService.removeEventListener(\n tooltip,\n 'mouseleave',\n handleTooltipMouseLeave\n );\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n }\n cleanupOverlay();\n clearAllHighlights();\n stopObserving();\n cleanupElements();\n isInitializedRef.current = false;\n };\n }, [editMode]);\n}\n","import { useRef, useCallback } from 'react';\nimport { DOMService } from '../../utils/dom';\nimport { handleStegaError } from '../../utils/errors';\nimport { createScopedLogger } from '../../utils/debug';\nimport { vercelStegaDecode } from '@vercel/stega';\n\ninterface DecodedData {\n origin: string;\n href: string;\n}\n\nconst decodeLogger = createScopedLogger('decode');\n\nfunction decode(str: string | null): DecodedData | null {\n if (!str) return null;\n\n try {\n // First, try to decode the string directly\n decodeLogger.log('attempting to decode stega data');\n\n const decoded = vercelStegaDecode(str) as DecodedData;\n decodeLogger.log('vercelStegaDecode result:', decoded);\n\n if (decoded?.href) {\n decodeLogger.log('successfully decoded', decoded);\n return decoded;\n }\n } catch (e) {\n decodeLogger.log('error decoding stega data:', e as Error);\n // If it fails, it might be because of trailing characters.\n // Regex to find the JSON string\n const regex = /{\"origin.*?}/;\n const match = str.match(regex);\n\n if (match) {\n try {\n // Now, try to decode the matched JSON string\n const decodedMatch = vercelStegaDecode(match[0]) as DecodedData;\n if (decodedMatch?.href) {\n decodeLogger.log(\n 'successfully decoded with regex match',\n decodedMatch\n );\n return decodedMatch;\n }\n } catch (e) {\n handleStegaError(e as Error, 'decode', { input: str });\n }\n }\n }\n\n return null;\n}\n\nexport function useStegaOverlay() {\n const debug = createScopedLogger('useStegaOverlay');\n const overlayRef = useRef<HTMLDivElement | null>(null);\n const tooltipRef = useRef<HTMLDivElement | null>(null);\n const hideTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const currentElementRef = useRef<HTMLElement | null>(null);\n\n const createOverlay = useCallback(() => {\n const overlay = DOMService.createElement(\n 'div',\n 'prepr-overlay'\n ) as HTMLDivElement;\n overlay.style.display = 'none';\n\n const tooltip = DOMService.createElement(\n 'div',\n 'prepr-tooltip'\n ) as HTMLDivElement;\n tooltip.style.display = 'none';\n\n DOMService.appendToBody(overlay);\n DOMService.appendToBody(tooltip);\n\n overlayRef.current = overlay;\n tooltipRef.current = tooltip;\n\n debug.log('created overlay and tooltip elements');\n\n return { overlay, tooltip };\n }, [debug]);\n\n const showOverlay = useCallback(\n (element: HTMLElement) => {\n if (!overlayRef.current || !tooltipRef.current) return;\n\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n }\n\n // Update active class on elements\n if (currentElementRef.current && currentElementRef.current !== element) {\n currentElementRef.current.classList.remove('prepr-overlay-active');\n }\n\n const rect = DOMService.getElementRect(element);\n const href = element.getAttribute('data-prepr-href');\n const origin = element.getAttribute('data-prepr-origin');\n\n debug.log('showing overlay for element:', { href, origin, rect });\n\n // Position overlay\n const overlay = overlayRef.current;\n overlay.style.display = 'block';\n overlay.style.top = `${rect.top + window.scrollY - 2}px`;\n overlay.style.left = `${rect.left + window.scrollX - 4}px`;\n overlay.style.width = `${rect.width + 8}px`;\n overlay.style.height = `${rect.height + 4}px`;\n\n // Position and show tooltip\n const tooltip = tooltipRef.current;\n if (tooltip && href && origin) {\n const MIN_WIDTH_FOR_TEXT = 80;\n const isCompact = rect.width < MIN_WIDTH_FOR_TEXT;\n tooltip.textContent = isCompact ? '↗' : `${origin} ↗`;\n tooltip.style.display = 'block';\n\n // Remove min-width constraint for compact tooltips\n if (isCompact) {\n tooltip.style.minWidth = 'auto';\n } else {\n tooltip.style.minWidth = '80px';\n }\n\n // Use requestAnimationFrame to ensure the DOM has updated before calculating position\n requestAnimationFrame(() => {\n if (tooltip) {\n // Compute desired positions\n let top = rect.top + window.scrollY - tooltip.clientHeight - 2;\n let left = rect.right + 4 - tooltip.clientWidth;\n\n // Clamp within viewport bounds\n const minTop = window.scrollY + 4;\n const maxTop =\n window.scrollY + window.innerHeight - tooltip.clientHeight - 4;\n const minLeft = window.scrollX + 4;\n const maxLeft =\n window.scrollX + window.innerWidth - tooltip.clientWidth - 4;\n\n if (top < minTop) {\n // If above viewport, place below the element\n top = rect.bottom + window.scrollY + 2;\n }\n top = Math.max(minTop, Math.min(top, maxTop));\n left = Math.max(minLeft, Math.min(left, maxLeft));\n\n tooltip.style.top = `${top}px`;\n tooltip.style.left = `${left}px`;\n }\n });\n\n tooltip.onclick = () =>\n window.open(href, '_blank', 'noopener,noreferrer');\n }\n\n currentElementRef.current = element;\n element.classList.add('prepr-overlay-active');\n },\n [debug]\n );\n\n const hideOverlay = useCallback(() => {\n if (!overlayRef.current || !tooltipRef.current) return;\n\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n }\n\n hideTimeoutRef.current = setTimeout(() => {\n if (overlayRef.current) overlayRef.current.style.display = 'none';\n if (tooltipRef.current) tooltipRef.current.style.display = 'none';\n if (currentElementRef.current) {\n currentElementRef.current.classList.remove('prepr-overlay-active');\n }\n currentElementRef.current = null;\n debug.log('hidden overlay and tooltip');\n }, 100);\n }, [debug]);\n\n const cleanup = useCallback(() => {\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n }\n\n if (overlayRef.current) {\n DOMService.removeFromBody(overlayRef.current);\n }\n if (tooltipRef.current) {\n DOMService.removeFromBody(tooltipRef.current);\n }\n\n debug.log('cleaned up overlay and tooltip');\n }, [debug]);\n\n return {\n overlayRef,\n tooltipRef,\n currentElementRef,\n hideTimeoutRef,\n createOverlay,\n showOverlay,\n hideOverlay,\n cleanup,\n decode,\n };\n}\n","import { useRef, useCallback } from 'react';\nimport { createScopedLogger } from '../../utils/debug';\nimport { createElementCache } from '../../utils/performance';\n\nexport function useStegaProximity() {\n const debug = createScopedLogger('useStegaProximity');\n const highlightedElementsRef = useRef<Set<HTMLElement>>(new Set());\n const getEncodedElements = createElementCache<HTMLElement>(\n '[data-prepr-encoded]',\n 200\n );\n\n // Track on-screen candidates via IntersectionObserver\n const visibleElementsRef = useRef<Set<HTMLElement>>(new Set());\n const observerRef = useRef<IntersectionObserver | null>(null);\n\n const refreshObserving = useCallback(() => {\n try {\n if (!('IntersectionObserver' in window)) return; // Fallback handled later\n\n // Reset observer\n if (observerRef.current) {\n observerRef.current.disconnect();\n observerRef.current = null;\n }\n\n const visible = new Set<HTMLElement>();\n visibleElementsRef.current = visible;\n\n observerRef.current = new IntersectionObserver(\n entries => {\n entries.forEach(entry => {\n const el = entry.target as HTMLElement;\n if (entry.isIntersecting) {\n visible.add(el);\n } else {\n visible.delete(el);\n }\n });\n },\n { root: null, rootMargin: '0px', threshold: 0 }\n );\n\n const nodes = getEncodedElements();\n nodes.forEach(el => observerRef.current!.observe(el));\n debug.log('observing', nodes.length, 'encoded elements');\n } catch (e) {\n debug.log('error setting up IntersectionObserver:', e as Error);\n }\n }, [debug, getEncodedElements]);\n\n const stopObserving = useCallback(() => {\n if (observerRef.current) {\n observerRef.current.disconnect();\n observerRef.current = null;\n visibleElementsRef.current.clear();\n }\n }, []);\n\n const updateElementGradients = useCallback(\n (cursorX: number, cursorY: number) => {\n // Use visible candidates when available; fall back to all\n const candidates =\n visibleElementsRef.current.size > 0\n ? Array.from(visibleElementsRef.current)\n : Array.from(getEncodedElements());\n const newHighlightedElements = new Set<HTMLElement>();\n let highlightedCount = 0;\n\n candidates.forEach(element => {\n const rect = element.getBoundingClientRect();\n\n // Calculate shortest distance from cursor to element edges\n const distanceLeft = Math.abs(cursorX - rect.left);\n const distanceRight = Math.abs(cursorX - rect.right);\n const distanceTop = Math.abs(cursorY - rect.top);\n const distanceBottom = Math.abs(cursorY - rect.bottom);\n\n // Use minimum distance to any edge\n const distance = Math.min(\n distanceLeft,\n distanceRight,\n distanceTop,\n distanceBottom\n );\n\n const el = element as HTMLElement;\n if (distance < 150) {\n // Calculate relative cursor position within the element\n const relativeX = cursorX - rect.left;\n const relativeY = cursorY - rect.top;\n\n el.style.setProperty('--cursor-x', `${relativeX}px`);\n el.style.setProperty('--cursor-y', `${relativeY}px`);\n\n // Set gradient size based on element dimensions\n // Calculate base gradient size based on element dimensions\n const baseGradientSize = Math.max(\n 150,\n Math.max(rect.width, rect.height) * 1.1\n );\n // Scale gradient size based on distance (400 is max distance, closer = larger gradient)\n const distanceScale = Math.max(0, (400 - distance) / 400);\n const gradientSize = baseGradientSize * distanceScale;\n\n el.style.setProperty('--gradient-size', `${gradientSize}px`);\n el.classList.add('prepr-proximity-highlight');\n newHighlightedElements.add(el);\n highlightedCount++;\n } else {\n el.classList.remove('prepr-proximity-highlight');\n }\n });\n\n // Update the highlighted elements reference\n highlightedElementsRef.current = newHighlightedElements;\n\n if (highlightedCount > 0) {\n debug.log('highlighted', highlightedCount, 'elements near cursor');\n }\n },\n [debug, getEncodedElements]\n );\n\n const clearAllHighlights = useCallback(() => {\n const highlightedElements = highlightedElementsRef.current;\n let clearedCount = 0;\n\n highlightedElements.forEach(element => {\n element.classList.remove('prepr-proximity-highlight');\n clearedCount++;\n });\n\n highlightedElementsRef.current.clear();\n\n if (clearedCount > 0) {\n debug.log('cleared highlights from', clearedCount, 'elements');\n }\n }, [debug]);\n\n return {\n updateElementGradients,\n clearAllHighlights,\n refreshObserving,\n stopObserving,\n highlightedElementsRef,\n };\n}\n","import { useRef, useCallback } from 'react';\nimport { createScopedLogger } from '../../utils/debug';\n\n// Define the expected structure for decoded data\ninterface DecodedData {\n href: string;\n origin: string;\n}\n\nexport function useStegaElements() {\n const debug = createScopedLogger('useStegaElements');\n const elementsRef = useRef<NodeListOf<Element> | undefined>(undefined);\n const observerRef = useRef<MutationObserver | null>(null);\n\n const getElements = useCallback(() => {\n if (!elementsRef.current) {\n elementsRef.current = document.querySelectorAll('[data-prepr-encoded]');\n }\n return elementsRef.current;\n }, []);\n\n const scanNode = useCallback(\n (node: Node, decode: (str: string | null) => DecodedData | null) => {\n if (node.nodeType === Node.TEXT_NODE) {\n if (!node.textContent?.trim()) return;\n if (node.parentElement?.closest('script, style, noscript')) return;\n const decoded = decode(node.textContent);\n if (decoded?.href) {\n const target = node.parentElement;\n if (target && !target.hasAttribute('data-prepr-encoded')) {\n target.setAttribute('data-prepr-encoded', '');\n target.setAttribute('data-prepr-href', decoded.href);\n target.setAttribute('data-prepr-origin', decoded.origin);\n debug.log('encoded element found:', {\n href: decoded.href,\n origin: decoded.origin,\n });\n }\n }\n } else if (node.nodeType === Node.ELEMENT_NODE) {\n for (let i = 0; i < node.childNodes.length; i++) {\n scanNode(node.childNodes[i], decode);\n }\n }\n },\n [debug]\n );\n\n const scanDocument = useCallback(\n (decode: (str: string | null) => DecodedData | null) => {\n debug.log('starting document scan');\n const walker = document.createTreeWalker(\n document.body,\n NodeFilter.SHOW_TEXT,\n {\n acceptNode: node => {\n if (node.parentElement?.closest('script, style, noscript')) {\n return NodeFilter.FILTER_REJECT;\n }\n if (!node.textContent?.trim()) {\n return NodeFilter.FILTER_REJECT;\n }\n return NodeFilter.FILTER_ACCEPT;\n },\n }\n );\n let textNode;\n let encodedCount = 0;\n while ((textNode = walker.nextNode())) {\n const decoded = decode(textNode.textContent);\n if (decoded?.href) {\n const target = textNode.parentElement;\n if (target && !target.hasAttribute('data-prepr-encoded')) {\n target.setAttribute('data-prepr-encoded', '');\n target.setAttribute('data-prepr-href', decoded.href);\n target.setAttribute('data-prepr-origin', decoded.origin);\n encodedCount++;\n }\n }\n }\n debug.log('document scan complete, encoded', encodedCount, 'elements');\n elementsRef.current = document.querySelectorAll('[data-prepr-encoded]');\n },\n [debug]\n );\n\n const setupMutationObserver = useCallback(\n (\n decode: (str: string | null) => DecodedData | null,\n onUpdate?: () => void\n ) => {\n if (observerRef.current) {\n observerRef.current.disconnect();\n }\n let pendingMutations: MutationRecord[] = [];\n let debounceTimeout: NodeJS.Timeout | null = null;\n const processMutations = () => {\n const allAddedNodes = new Set<Node>();\n pendingMutations.forEach(mutation => {\n mutation.addedNodes.forEach(node => allAddedNodes.add(node));\n // Include text changes in existing nodes\n if (mutation.type === 'characterData') {\n allAddedNodes.add(mutation.target);\n }\n });\n allAddedNodes.forEach(node => scanNode(node, decode));\n pendingMutations = [];\n elementsRef.current = document.querySelectorAll('[data-prepr-encoded]');\n if (onUpdate) onUpdate();\n };\n observerRef.current = new MutationObserver(mutations => {\n pendingMutations.push(...mutations);\n if (debounceTimeout) clearTimeout(debounceTimeout);\n debounceTimeout = setTimeout(processMutations, 100);\n });\n observerRef.current.observe(document.body, {\n childList: true,\n subtree: true,\n characterData: true,\n });\n debug.log('mutation observer set up');\n },\n [scanNode, debug]\n );\n\n const cleanup = useCallback(() => {\n if (observerRef.current) {\n observerRef.current.disconnect();\n observerRef.current = null;\n }\n const encodedElements = document.querySelectorAll('[data-prepr-encoded]');\n encodedElements.forEach(element => {\n element.removeAttribute('data-prepr-encoded');\n element.removeAttribute('data-prepr-href');\n element.removeAttribute('data-prepr-origin');\n });\n debug.log('cleaned up', encodedElements.length, 'encoded elements');\n elementsRef.current = undefined;\n }, [debug]);\n\n return {\n getElements,\n scanDocument,\n setupMutationObserver,\n cleanup,\n };\n}\n","import React, { useEffect, useState } from 'react';\nimport { useSearchParams } from 'next/navigation';\nimport Toolbar from './toolbar';\n\nexport default function ToolbarWrapper() {\n const searchParams = useSearchParams();\n const [isIframe, setIsIframe] = useState<boolean>(false);\n\n const handleKeyDown = (event: KeyboardEvent) => {\n const key = event.key.toLowerCase();\n // Check for the blocked shortcuts\n const isSaveShortcut = (event.ctrlKey || event.metaKey) && key === 's';\n const isPrintShortcut = (event.ctrlKey || event.metaKey) && key === 'p';\n const isAddressBarShortcut =\n (event.ctrlKey || event.metaKey) && key === 'l';\n if (isSaveShortcut || isPrintShortcut || isAddressBarShortcut) {\n event.preventDefault(); // Prevent the browser's default action\n }\n };\n\n useEffect(() => {\n const isIframe =\n typeof window !== 'undefined' && window?.parent !== window.self;\n if (isIframe) {\n setIsIframe(true);\n const previewBarMessage = {\n name: 'prepr_preview_bar',\n event: 'loaded',\n };\n window.parent.postMessage(previewBarMessage, '*');\n window.addEventListener('keydown', handleKeyDown);\n }\n return () => {\n if (isIframe) {\n window.removeEventListener('keydown', handleKeyDown);\n }\n };\n }, []);\n\n if (searchParams.get('prepr_hide_bar') === 'true' || isIframe) {\n return null;\n }\n\n return <Toolbar />;\n}\n","import React, { useEffect, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../../../utils';\nimport {\n useEditMode,\n useSelectedSegment,\n useSelectedVariant,\n usePreprStore,\n} from '../../../stores/prepr-store';\nimport { useModal } from '../../hooks/use-modal';\nimport { ToolbarContent } from './toolbar-content';\nimport { ToolbarButton } from './toolbar-button';\n\ninterface ToolbarProps {\n children?: React.ReactNode;\n}\n\nexport default function Toolbar({ children }: ToolbarProps) {\n const [isMounted, setIsMounted] = useState(false);\n const isBarVisible = usePreprStore(s => s.toolbarOpen);\n const setToolbarOpen = usePreprStore(s => s.setToolbarOpen);\n const editMode = useEditMode();\n const selectedSegment = useSelectedSegment();\n const selectedVariant = useSelectedVariant();\n const { contentRef, triggerRef } = useModal({\n isVisible: isBarVisible,\n onClose: () => setToolbarOpen(false),\n });\n\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n // Ref for the popup box\n const popupBoxRef = React.useRef<HTMLDivElement>(null);\n const [popupTop, setPopupTop] = React.useState<string | number>('');\n\n const updatePopupPosition = React.useCallback(() => {\n if (popupBoxRef.current && triggerRef.current) {\n const popupHeight = popupBoxRef.current.offsetHeight;\n const windowHeight = window.innerHeight;\n const triggerRect = triggerRef.current.getBoundingClientRect();\n // Center popup relative to the icon (trigger)\n const triggerCenter = triggerRect.top + triggerRect.height / 2;\n let top = triggerCenter - popupHeight / 2;\n // Clamp to leave at least 32px top and bottom\n top = Math.max(32, Math.min(top, windowHeight - popupHeight - 32));\n setPopupTop(top);\n }\n }, [triggerRef]);\n\n useEffect(() => {\n if (isBarVisible) {\n updatePopupPosition();\n window.addEventListener('resize', updatePopupPosition);\n return () => window.removeEventListener('resize', updatePopupPosition);\n }\n return undefined;\n }, [isBarVisible, updatePopupPosition]);\n\n const handleClick = () => {\n setToolbarOpen(!isBarVisible);\n };\n\n useEffect(() => {\n if (editMode) {\n setTimeout(() => {\n setToolbarOpen(false);\n }, 150);\n }\n }, [editMode]);\n\n // Auto-close modal when segment changes\n useEffect(() => {\n setTimeout(() => {\n setToolbarOpen(false);\n }, 150);\n }, [selectedSegment]);\n\n // Auto-close modal when variant changes\n useEffect(() => {\n setTimeout(() => {\n setToolbarOpen(false);\n }, 150);\n }, [selectedVariant]);\n\n const previewBarContent = (\n <>\n {isBarVisible && <div className=\"preview-bar-backdrop\" />}\n <div className={cn('preview-bar-container')}>\n {/* Button holder*/}\n <div className=\"p-pr-2\" ref={triggerRef}>\n <ToolbarButton onClick={handleClick} />\n </div>\n\n {/* Box holder */}\n <div\n ref={popupBoxRef}\n style={\n popupTop !== ''\n ? { top: popupTop, position: 'fixed', right: 0 }\n : {}\n }\n className={cn(\n 'preview-bar-popup',\n isBarVisible\n ? 'p-pointer-events-auto p-opacity-100'\n : 'p-pointer-events-none p-opacity-0'\n )}\n >\n {children || (\n <ToolbarContent onClose={handleClick} contentRef={contentRef} />\n )}\n </div>\n </div>\n </>\n );\n\n if (!isMounted) return null;\n\n return createPortal(previewBarContent, document.body);\n}\n\n// Compound component pattern\nToolbar.Content = ToolbarContent;\nToolbar.Button = ToolbarButton;\n","import { useEffect, useRef } from 'react';\n\ninterface UseModalProps {\n isVisible: boolean;\n onClose: () => void;\n}\n\nexport function useModal({ isVisible, onClose }: UseModalProps) {\n const contentRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (isVisible) {\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = '';\n }\n return () => {\n document.body.style.overflow = '';\n };\n }, [isVisible]);\n\n useEffect(() => {\n const handleEscapeKey = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n onClose();\n }\n };\n\n const handleClickOutside = (event: MouseEvent) => {\n // Check if the click target is part of a dropdown\n const isDropdownItem = (event.target as HTMLElement).closest(\n '[role=\"listbox\"], [role=\"option\"]'\n );\n if (isDropdownItem) {\n return;\n }\n\n if (\n contentRef.current &&\n !contentRef.current.contains(event.target as Node) &&\n triggerRef.current &&\n !triggerRef.current.contains(event.target as Node)\n ) {\n onClose();\n }\n };\n\n if (isVisible) {\n document.addEventListener('keydown', handleEscapeKey);\n document.addEventListener('mousedown', handleClickOutside);\n }\n\n return () => {\n document.removeEventListener('keydown', handleEscapeKey);\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [isVisible, onClose]);\n\n return {\n contentRef,\n triggerRef,\n };\n}\n","import React from 'react';\nimport { Logo } from '../ui';\nimport {\n SegmentSelector,\n VariantSelector,\n EditModeSelector,\n PreviewModeSelector,\n} from '../selectors';\nimport { ResetButton } from '../ui';\nimport { useTranslations } from '../../hooks/use-i18n';\n\ninterface ToolbarContentProps {\n onClose: () => void;\n contentRef: React.RefObject<HTMLDivElement | null>;\n}\n\nexport function ToolbarContent({ onClose, contentRef }: ToolbarContentProps) {\n const { t } = useTranslations();\n return (\n <div\n ref={contentRef}\n className=\"p-box-shadow p-right-0 p-z-[101] p-flex p-w-full p-flex-col p-gap-y-10 p-rounded-lg p-bg-primary-50 p-p-6 sm:p-w-[502px] sm:p-p-10\"\n >\n {/* Header */}\n <div className=\"p-flex p-items-center p-justify-between p-gap-2\">\n <div className=\"p-flex p-items-start p-gap-3\">\n <Logo />\n <div className=\"p-flex p-h-6 p-items-center p-rounded p-bg-primary-100 p-px-3 p-py-1 p-text-sm p-text-primary-700\">\n {t('common.toolbar')}\n </div>\n </div>\n <button\n onClick={onClose}\n className=\"p-flex p-h-8 p-w-8 p-cursor-pointer p-items-center p-justify-center p-rounded-md p-bg-primary-100 p-text-gray-700\"\n >\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 10 10\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M8.17578 1.07031C8.41016 0.816406 8.82031 0.816406 9.05469 1.07031C9.30859 1.30469 9.30859 1.71484 9.05469 1.94922L5.75391 5.25L9.05469 8.57031C9.30859 8.80469 9.30859 9.21484 9.05469 9.44922C8.82031 9.70312 8.41016 9.70312 8.17578 9.44922L4.875 6.14844L1.55469 9.44922C1.32031 9.70312 0.910156 9.70312 0.675781 9.44922C0.421875 9.21484 0.421875 8.80469 0.675781 8.57031L3.97656 5.25L0.675781 1.94922C0.421875 1.71484 0.421875 1.30469 0.675781 1.07031C0.910156 0.816406 1.32031 0.816406 1.55469 1.07031L4.875 4.37109L8.17578 1.07031Z\"\n fill=\"currentColor\"\n />\n </svg>\n </button>\n </div>\n\n {/* Personalized Content */}\n <div className=\"p-space-y-2\">\n <span className=\"p-text-sm p-text-grey-400\">\n {t('adaptiveContent.adaptiveContent')}\n </span>\n <div className=\"p-gap p-flex p-flex-wrap p-items-center p-justify-between p-gap-x-6 p-gap-y-2\">\n <h2 className=\"p-text-grey-800 p-font-semibold\">\n {t('adaptiveContent.enablePreview')}\n </h2>\n <PreviewModeSelector />\n </div>\n <div className=\"p-gap p-flex p-flex-wrap p-items-center p-justify-between p-gap-x-6 p-gap-y-2\">\n <h2 className=\"p-text-grey-800 p-font-semibold\">\n {t('adaptiveContent.segment')}\n </h2>\n <SegmentSelector />\n </div>\n <div className=\"p-gap p-flex p-flex-wrap p-items-center p-justify-between p-gap-x-6 p-gap-y-2\">\n <h2 className=\"p-text-grey-800 p-font-semibold\">\n {t('adaptiveContent.ABVariant')}\n </h2>\n <VariantSelector />\n </div>\n </div>\n\n {/* Collaboration */}\n <div className=\"p-space-y-2\">\n <span className=\"p-text-sm p-text-grey-400\">\n {t('editingTools.editingTools')}\n </span>\n <div className=\"p-gap p-flex p-flex-wrap p-items-center p-justify-between p-gap-x-6 p-gap-y-2\">\n <h2 className=\"p-text-grey-800 p-font-semibold\">\n {t('editingTools.editMode')}\n </h2>\n <EditModeSelector />\n </div>\n </div>\n\n <ResetButton />\n </div>\n );\n}\n","import React from 'react';\nimport { usePreprToolbar } from '../toolbar/toolbar-provider';\nimport {\n usePreviewMode,\n useSegments,\n usePreprStore,\n} from '../../../stores/prepr-store';\nimport XMark from '../icons/xmark';\nimport { usePathname, useRouter } from 'next/navigation';\nimport { cn } from '../../../utils';\nimport { useTranslations } from '../../hooks/use-i18n';\n\nexport default function StatusIndicatorPill() {\n const {\n selectedSegment,\n selectedVariant,\n emptySegment,\n isIframe,\n resetPersonalization,\n } = usePreprToolbar();\n\n const segments = useSegments();\n const { t } = useTranslations();\n\n const router = useRouter();\n const pathname = usePathname();\n const previewMode = usePreviewMode();\n const setPreviewMode = usePreprStore(state => state.setPreviewMode);\n\n const handleReset = () => {\n if (selectedSegment === emptySegment) {\n return;\n }\n\n resetPersonalization();\n // Set preview params to 'null' in the URL, then remove them for a clean URL\n const params = new URLSearchParams();\n params.set('prepr_preview_segment', 'null');\n params.set('prepr_preview_ab', 'null');\n\n // First, push the URL with reset params to trigger any listeners\n router.push(`${pathname}?${params.toString()}`, { scroll: false });\n router.refresh();\n\n // Then, push the clean URL (without the reset params)\n router.push(pathname, { scroll: false });\n router.refresh();\n };\n\n if (isIframe) {\n return null;\n }\n\n // Always show in preview mode; default segment label falls back to \"All other users\"\n const defaultSegmentName =\n segments.find(s => s._id === 'all_other_users')?.name ||\n t('adaptiveContent.allOtherUsers');\n const segmentLabel = !previewMode\n ? t('common.user')\n : selectedSegment && selectedSegment._id !== (emptySegment?._id ?? 'null')\n ? selectedSegment.name\n : defaultSegmentName;\n\n return (\n <div className=\"p-z-[998] p-flex p-gap-2\">\n <button\n type=\"button\"\n onClick={previewMode ? handleReset : () => setPreviewMode(true)}\n className={cn(\n 'p-flex p-items-center p-gap-2 p-rounded-full p-bg-primary-700 p-px-4 p-py-2 p-text-xs p-font-medium p-text-white p-shadow-lg',\n selectedSegment !== emptySegment &&\n 'p-cursor-pointer p-transition-colors p-duration-150 hover:p-bg-primary-800'\n )}\n >\n <span className=\"p-text-[10px] p-text-white/60\">\n {t('common.viewingAs')}\n </span>\n <span className=\"max-w-[120px] p-inline-block p-truncate\">\n {segmentLabel}\n </span>\n {previewMode && (\n <span className=\"max-w-[80px] p-inline-block p-truncate p-rounded p-bg-white/20 p-px-2\">\n {selectedVariant === 'B' ? 'B' : 'A'}\n </span>\n )}\n {selectedSegment !== emptySegment && (\n <XMark className=\"p-h-3 p-w-3 p-text-white\" />\n )}\n </button>\n </div>\n );\n}\n","import React from 'react';\n\nexport default function XMark(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M4.22 4.22a.75.75 0 0 1 1.06 0L8 6.94l2.72-2.72a.75.75 0 1 1 1.06 1.06L9.06 8l2.72 2.72a.75.75 0 1 1-1.06 1.06L8 9.06l-2.72 2.72a.75.75 0 1 1-1.06-1.06L6.94 8 4.22 5.28a.75.75 0 0 1 0-1.06z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n","'use client';\n\nimport { useMemo } from 'react';\nimport { t as baseT } from '../../i18n';\nimport { useLocale } from '../../stores/prepr-store';\n\nexport function useTranslations() {\n const locale = useLocale();\n\n const t = useMemo(() => {\n return (key: string, vars?: Record<string, string | number>) =>\n baseT(key, vars);\n }, [locale]);\n\n return { t, locale };\n}\n","{\n \"common\": {\n \"viewingAs\": \"Viewing as:\",\n \"user\": \"User\",\n \"off\": \"Off\",\n \"on\": \"On\",\n \"reset\": \"Reset\",\n \"toolbar\": \"Toolbar\"\n },\n \"adaptiveContent\": {\n \"adaptiveContent\": \"Adaptive content\",\n \"enablePreview\": \"Preview mode\",\n \"segment\": \"Segment\",\n \"ABVariant\": \"A/B variant\",\n \"chooseSegment\": \"Choose segment\",\n \"none\": \"No segments\",\n \"allOtherUsers\": \"All other users\",\n \"offDescription\": \"View the site as a real user (use cookies)\",\n \"onDescription\": \"Use the toolbar to simulate segments and A/B variants\"\n },\n \"editingTools\": {\n \"editingTools\": \"Editing tools\",\n \"editMode\": \"Edit mode\",\n \"ariaCloseEditMode\": \"Close edit mode\"\n }\n}\n","{\n \"common\": {\n \"viewingAs\": \"Bekijken als:\",\n \"user\": \"Gebruiker\",\n \"off\": \"Uit\",\n \"on\": \"Aan\",\n \"reset\": \"Resetten\",\n \"toolbar\": \"Toolbar\"\n },\n \"adaptiveContent\": {\n \"adaptiveContent\": \"Adaptieve inhoud\",\n \"enablePreview\": \"Preview modus\",\n \"segment\": \"Segment\",\n \"ABVariant\": \"A/B-variant\",\n \"chooseSegment\": \"Kies segment\",\n \"none\": \"Geen segmenten\",\n \"allOtherUsers\": \"Alle andere gebruikers\",\n \"offDescription\": \"Bekijk de site als een echte gebruiker (gebruik cookies)\",\n \"onDescription\": \"Gebruik de werkbalk om segmenten en A/B-varianten te simuleren\"\n },\n \"editingTools\": {\n \"editingTools\": \"Editing Tools\",\n \"editMode\": \"Edit mode\",\n \"ariaCloseEditMode\": \"Edit mode sluiten\"\n }\n}\n","import en from './locales/en.json';\nimport nl from './locales/nl.json';\nimport { usePreprStore } from '../stores/prepr-store';\n\nexport type Locale = 'en' | 'nl';\n\nconst dictionaries: Record<Locale, Record<string, any>> = {\n en: en as Record<string, any>,\n nl: nl as Record<string, any>,\n};\n\nfunction getDict(locale: string) {\n if (locale in dictionaries) return dictionaries[locale as Locale];\n return dictionaries.en;\n}\n\nfunction getFromPath(obj: any, path: string) {\n return path\n .split('.')\n .reduce((acc: any, key: string) => (acc ? acc[key] : undefined), obj);\n}\n\nfunction format(message: string, vars?: Record<string, string | number>) {\n if (!vars) return message;\n return Object.keys(vars).reduce(\n (acc, k) => acc.replace(new RegExp(`\\\\{${k}\\\\}`, 'g'), String(vars[k])),\n message\n );\n}\n\nexport function t(key: string, vars?: Record<string, string | number>): string {\n const { locale } = usePreprStore.getState();\n const dict = getDict(locale);\n const msg = getFromPath(dict, key);\n if (typeof msg === 'string') return format(msg, vars);\n // Fallback to key if not found\n return key;\n}\n","import React from 'react';\nimport { usePreprToolbar } from '../toolbar/toolbar-provider';\nimport XMark from '../icons/xmark';\nimport { useTranslations } from '../../hooks/use-i18n';\n\nexport default function CloseEditModePill() {\n const { editMode, setEditMode, isIframe } = usePreprToolbar();\n const { t } = useTranslations();\n if (!editMode || isIframe) {\n return null;\n }\n\n return (\n <div className=\"p-z-[999] p-flex\">\n <button\n type=\"button\"\n onClick={() => setEditMode && setEditMode(false)}\n className=\"p-flex p-items-center p-gap-2 p-rounded-full p-bg-primary-50 p-px-4 p-py-2 p-text-xs p-font-medium p-text-gray-800 p-shadow-lg p-transition-colors p-duration-150 hover:p-bg-primary-100\"\n aria-label={t('editingTools.ariaCloseEditMode')}\n >\n <span>{t('editingTools.editMode')}</span>\n <XMark className=\"transition-colors duration-150 p-h-4 p-w-4 p-text-gray-500 hover:p-text-gray-700\" />\n </button>\n </div>\n );\n}\n","import React from 'react';\nimport { usePathname, useRouter } from 'next/navigation';\nimport { cn } from '../../../utils';\nimport { usePreprToolbar } from '../toolbar/toolbar-provider';\nimport Rotate from '../icons/rotate';\nimport { useTranslations } from '../../hooks/use-i18n';\nexport default function ResetButton() {\n const router = useRouter();\n const {\n resetAll,\n selectedVariant,\n selectedSegment,\n setEditMode,\n isPreviewMode,\n } = usePreprToolbar();\n const pathname = usePathname();\n const enabled = selectedSegment._id !== 'null' || selectedVariant !== 'null';\n const { t } = useTranslations();\n const handleClick = () => {\n resetAll();\n setEditMode(false);\n\n // Set preview params to 'null' in the URL, then remove them for a clean URL\n const params = new URLSearchParams();\n params.set('prepr_preview_segment', 'null');\n params.set('prepr_preview_ab', 'null');\n\n // First, push the URL with reset params to trigger any listeners\n router.push(`${pathname}?${params.toString()}`, { scroll: false });\n router.refresh();\n\n // Then, push the clean URL (without the reset params)\n router.push(pathname, { scroll: false });\n router.refresh();\n };\n\n const classes = cn(\n 'p-py-2 p-px-3 p-flex p-justify-center p-gap-2 p-items-center p-rounded-md p-regular-text p-h-10 p-w-full md:p-w-[108px]',\n enabled &&\n 'p-bg-secondary-400 hover:p-secondary-500 p-cursor-pointer p-text-white',\n !enabled && 'p-bg-grey-400 p-text-gray-500',\n !isPreviewMode && 'p-cursor-not-allowed'\n );\n\n return (\n <button onClick={handleClick} className={classes} disabled={!enabled}>\n <Rotate />\n <span className=\"p-block sm:p-hidden lg:p-block\">\n {t('common.reset')}\n </span>\n </button>\n );\n}\n","import React from 'react';\n\nexport default function Rotate() {\n return (\n <svg\n width=\"15\"\n height=\"14\"\n viewBox=\"0 0 15 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M3.37109 5.80078C3.20703 6.26562 2.6875 6.51172 2.25 6.34766C1.78516 6.18359 1.53906 5.69141 1.70312 5.22656C2.00391 4.37891 2.49609 3.58594 3.15234 2.92969C5.55859 0.550781 9.41406 0.550781 11.8203 2.92969L12.2852 3.42188V2C12.2852 1.53516 12.6953 1.125 13.1602 1.125C13.6523 1.125 14.0352 1.53516 14.0352 2V5.5C14.0352 5.99219 13.6523 6.375 13.1602 6.375H9.6875C9.19531 6.375 8.8125 5.99219 8.8125 5.5C8.8125 5.03516 9.19531 4.625 9.6875 4.625H11.0547L10.5898 4.16016C8.86719 2.46484 6.10547 2.46484 4.38281 4.16016C3.91797 4.65234 3.5625 5.19922 3.37109 5.80078ZM1.56641 8.17969C1.59375 8.15234 1.64844 8.15234 1.67578 8.15234C1.73047 8.15234 1.75781 8.125 1.8125 8.125H5.3125C5.77734 8.125 6.1875 8.53516 6.1875 9C6.1875 9.49219 5.77734 9.875 5.3125 9.875H3.91797L4.38281 10.3672C6.10547 12.0625 8.86719 12.0625 10.5898 10.3672C11.0547 9.875 11.4102 9.32812 11.6016 8.72656C11.7656 8.26172 12.2852 8.01562 12.7227 8.17969C13.1875 8.34375 13.4336 8.83594 13.2695 9.30078C12.9688 10.1484 12.4766 10.9141 11.8203 11.5977C9.41406 13.9766 5.55859 13.9766 3.15234 11.5977L2.6875 11.1055V12.5C2.6875 12.9922 2.27734 13.375 1.8125 13.375C1.32031 13.375 0.9375 12.9922 0.9375 12.5V9.02734C0.9375 8.97266 0.9375 8.91797 0.9375 8.89062C0.9375 8.83594 0.9375 8.80859 0.964844 8.78125C0.992188 8.64453 1.07422 8.50781 1.18359 8.39844C1.29297 8.28906 1.42969 8.20703 1.56641 8.17969Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n","import React from 'react';\n\nconst Icon: React.FC<React.SVGProps<SVGSVGElement>> = props => {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M9.05365 0C5.71033 0 3 2.75516 3 6.15377V15.6309C3 15.8346 3.16248 16 3.36328 16H5.05838C5.25898 16 5.42166 15.8346 5.42166 15.6309V11.0772C6.43342 11.8498 7.69104 12.3077 9.05385 12.3077C12.397 12.3077 15.1077 9.55259 15.1077 6.15397C15.1075 2.75516 12.397 0 9.05365 0ZM9.05365 9.84623C7.04766 9.84623 5.42146 8.19314 5.42146 6.15377C5.42146 4.1146 7.04766 2.46151 9.05365 2.46151C11.0596 2.46151 12.686 4.1146 12.686 6.15377C12.686 8.19293 11.0596 9.84623 9.05365 9.84623Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n};\n\nexport default Icon;\n","import React from 'react';\n\nconst Logo: React.FC<React.SVGProps<SVGSVGElement>> = props => {\n return (\n <svg\n width=\"102\"\n height=\"28\"\n viewBox=\"0 0 102 28\"\n fill=\"none\"\n {...props}\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M39.2674 2.19699C39.2757 2.18321 39.2839 2.16943 39.291 2.15528L39.2939 2.15057L39.2935 2.1502C39.3379 2.06208 39.3633 1.96308 39.3633 1.85754C39.3633 1.62109 39.2374 1.41474 39.0507 1.30231C39.0485 1.30014 39.0467 1.29651 39.0446 1.29578C35.1089 -0.88088 29.8537 -0.36627 26.3741 3.2632C24.4207 5.3006 23.4231 7.92116 23.3716 10.5544H23.3684V20.893C23.3684 21.2495 23.6538 21.5389 24.0058 21.5389H26.98C27.332 21.5389 27.6174 21.2495 27.6174 20.893V10.7698H27.6192C27.6192 9.14658 28.2169 7.52187 29.4209 6.26599C31.5699 4.02478 34.7423 3.8565 36.9299 5.03659C36.9367 5.04058 36.9439 5.04384 36.9507 5.04747C36.9557 5.05001 36.9607 5.05254 36.9657 5.05508H36.9664C37.0494 5.09497 37.1417 5.11782 37.2393 5.11782C37.4879 5.11782 37.7032 4.97276 37.808 4.76206L39.2674 2.19699Z\"\n fill=\"#4338CA\"\n />\n <path\n d=\"M10.6216 0.000244141C4.75551 0.000244141 0 4.82177 0 10.7693V27.3543C0 27.7108 0.285079 28.0002 0.637405 28.0002H3.61161C3.96358 28.0002 4.24902 27.7108 4.24902 27.3543V19.3853C6.02424 20.7373 8.23084 21.5388 10.622 21.5388C16.4878 21.5388 21.244 16.7173 21.244 10.7697C21.2437 4.82177 16.4878 0.000244141 10.6216 0.000244141ZM10.6216 17.2311C7.10196 17.2311 4.24866 14.3382 4.24866 10.7693C4.24866 7.20079 7.10196 4.30788 10.6216 4.30788C14.1413 4.30788 16.995 7.20079 16.995 10.7693C16.995 14.3379 14.1413 17.2311 10.6216 17.2311Z\"\n fill=\"#4338CA\"\n />\n <path\n d=\"M73.259 0C67.3932 0 62.6373 4.82152 62.6373 10.7691V27.3541C62.6373 27.7106 62.9228 28 63.2747 28H66.2489C66.6009 28 66.8863 27.7106 66.8863 27.3541V19.3854C68.6616 20.7374 70.8682 21.5389 73.2593 21.5389C79.1251 21.5389 83.8813 16.7174 83.8813 10.7698C83.881 4.82152 79.1248 0 73.259 0ZM73.259 17.2309C69.7393 17.2309 66.886 14.338 66.886 10.7691C66.886 7.20055 69.7393 4.30764 73.259 4.30764C76.7783 4.30764 79.632 7.20055 79.632 10.7691C79.632 14.3376 76.7783 17.2309 73.259 17.2309Z\"\n fill=\"#4338CA\"\n />\n <path\n d=\"M60.439 10.9845C60.439 5.03657 55.6827 0 49.817 0C43.9508 0 39.1953 4.82152 39.1953 10.7691C39.1953 16.7167 43.9508 21.5382 49.817 21.5382C53.1374 21.5382 55.8763 19.9954 57.5939 18.1031C57.5939 18.1031 57.5942 18.1027 57.5946 18.1024C57.596 18.1009 57.5975 18.0995 57.5985 18.098C57.7112 17.9812 57.7806 17.822 57.7806 17.6461C57.7806 17.4601 57.7026 17.2929 57.5785 17.1751V17.1743L57.5696 17.1671C57.5535 17.1522 57.5367 17.1384 57.5188 17.1254L55.2464 15.2501C55.1344 15.1503 54.9877 15.0891 54.8264 15.0891C54.6261 15.0891 54.4476 15.183 54.331 15.3291C53.3216 16.3707 51.7256 17.2309 49.8166 17.2309C46.2969 17.2309 43.4436 14.338 43.4436 10.7691C43.4436 7.20055 46.2969 4.30764 49.8166 4.30764C52.5909 4.30764 54.9505 6.10605 55.8255 8.61527H50.3474C49.9954 8.61527 49.71 8.90467 49.71 9.26152V12.277C49.71 12.6339 49.9954 12.9233 50.3474 12.9233H59.5884C59.6059 12.9233 59.6227 12.9218 59.6399 12.9207C59.6571 12.9222 59.6742 12.9233 59.6914 12.9233C59.9743 12.9233 60.214 12.7361 60.2973 12.4772L60.3045 12.4783C60.308 12.4551 60.3116 12.4326 60.3152 12.4097C60.3199 12.3876 60.3234 12.3655 60.3256 12.3427C60.4003 11.861 60.439 11.5172 60.439 10.9845Z\"\n fill=\"#4338CA\"\n />\n <path\n d=\"M101.928 2.15406L101.931 2.14934L101.93 2.14898C101.974 2.06085 102 1.96185 102 1.85632C102 1.61987 101.874 1.41351 101.687 1.30109C101.685 1.29891 101.683 1.29529 101.681 1.29456C97.7455 -0.882101 92.4903 -0.367491 89.0107 3.26198C87.0573 5.29938 86.0597 7.91993 86.0082 10.5532H86.005V20.8918C86.005 21.2483 86.2904 21.5377 86.6424 21.5377H89.6166C89.9686 21.5377 90.254 21.2483 90.254 20.8918V10.7686H90.2555C90.2555 9.14535 90.8532 7.52065 92.0571 6.26477C94.2062 4.02355 97.3785 3.85528 99.5662 5.03537C99.573 5.03936 99.5801 5.04262 99.5869 5.04624C99.5919 5.04878 99.5969 5.05132 99.6019 5.05386H99.6027C99.6856 5.09375 99.7779 5.11696 99.8756 5.11696C100.124 5.11696 100.339 4.9719 100.444 4.7612L101.905 2.19685C101.913 2.18235 101.92 2.16856 101.928 2.15406Z\"\n fill=\"#4338CA\"\n />\n </svg>\n );\n};\n\nexport default Logo;\n","'use client';\n\nimport React from 'react';\nimport Script from 'next/script';\n\ninterface PreprTrackingPixelProps {\n /**\n * The Prepr access token (without the full GraphQL URL)\n * Extract this from your PREPR_GRAPHQL_URL: https://graphql.prepr.io/YOUR_ACCESS_TOKEN\n */\n accessToken?: string;\n}\n\n/**\n * PreprTrackingPixel component for user tracking\n *\n * This component loads the Prepr tracking script and initializes tracking.\n * It should be included in your application to track user interactions.\n *\n * @param accessToken - Your Prepr access token\n *\n * @example\n * ```tsx\n * // In your layout or page\n *\n * import { PreprTrackingPixel } from '@preprio/prepr-nextjs/react'\n *\n * // Extract token from PREPR_GRAPHQL_URL\n * const accessToken = extractAccessToken(process.env.PREPR_GRAPHQL_URL!)\n *\n * export default function Layout({ children }) {\n * return (\n * <html>\n * <head>\n * <PreprTrackingPixel accessToken={accessToken!} />\n * </head>\n * <body>{children}</body>\n * </html>\n * )\n * }\n * ```\n */\nexport default function PreprTrackingPixel({\n accessToken,\n}: PreprTrackingPixelProps) {\n if (!accessToken) {\n console.warn(\n 'PreprTrackingPixel: accessToken is required for tracking to work'\n );\n return null;\n }\n\n return (\n <Script\n id=\"prepr-tracking-pixel\"\n dangerouslySetInnerHTML={{\n __html: `\n ! function (e, t, p, r, n, a, s) {\n e[r] || ((n = e[r] = function () {\n n.process ? n.process.apply(n, arguments) : n.queue.push(arguments)\n }).queue = [], n.t = +new Date, (a = t.createElement(p)).async = 1, a.src = \"https://cdn.tracking.prepr.io/js/prepr_v2.min.js?t=\" + 864e5 * Math.ceil(new Date / 864e5), (s = t.getElementsByTagName(p)[0]).parentNode.insertBefore(a, s))\n }(window, document, \"script\", \"prepr\"), prepr(\"init\", \"${accessToken}\", { destinations: { googleTagManager: true } }), prepr(\"event\", \"pageload\");`,\n }}\n />\n );\n}\n","import React from 'react';\nimport { PreprSegment } from '../../../types';\nimport {\n useSegments,\n useSelectedSegment,\n usePreprStore,\n usePreviewMode,\n} from '../../../stores/prepr-store';\nimport { usePathname, useRouter } from 'next/navigation';\nimport {\n Listbox,\n ListboxButton,\n ListboxOption,\n ListboxOptions,\n} from '@headlessui/react';\nimport SortDown from '../icons/sort-down';\nimport { cn } from '../../../utils';\nimport { useTranslations } from '../../hooks/use-i18n';\n\nexport default function SegmentSelector() {\n const segments = useSegments();\n const selectedSegment = useSelectedSegment();\n const setSelectedSegment = usePreprStore(state => state.setSelectedSegment);\n const previewMode = usePreviewMode();\n const { t } = useTranslations();\n\n const pathname = usePathname();\n const router = useRouter();\n\n const updateSelectedSegment = (value: string) => {\n const params = new URLSearchParams(window.location.search);\n const segment = segments.find(segment => segment._id === value);\n\n if (segment) {\n setSelectedSegment(segment);\n params.set('prepr_preview_segment', value);\n\n router.push(`${pathname}?${params.toString()}`, {\n scroll: false,\n });\n router.refresh();\n }\n };\n\n return (\n <Listbox\n value={selectedSegment._id}\n onChange={(value: string) => updateSelectedSegment(value)}\n >\n <ListboxButton\n as=\"button\"\n disabled={!(segments && segments.length > 0) || !previewMode}\n className=\"p-regular-text p-flex p-h-10 p-w-[240px] p-shrink-0 p-flex-nowrap p-items-center p-gap-2 p-overflow-hidden p-text-ellipsis p-text-nowrap p-rounded-lg p-border p-border-gray-300 p-bg-white p-px-2 p-text-gray-500 disabled:p-cursor-not-allowed disabled:p-bg-gray-200 disabled:p-text-gray-400 data-[open]:p-rounded-b-none data-[open]:p-border-b-white md:p-px-4\"\n >\n <div\n style={{\n textWrap: 'nowrap',\n textOverflow: 'ellipsis',\n textAlign: 'left',\n }}\n className=\"p-mr-auto p-w-full p-overflow-hidden\"\n >\n {segments.length > 0\n ? selectedSegment._id === 'null'\n ? t('adaptiveContent.chooseSegment')\n : selectedSegment.name\n : t('adaptiveContent.none')}\n </div>\n <div className=\"p-text-gray-800\">\n <SortDown />\n </div>\n </ListboxButton>\n <ListboxOptions\n anchor=\"bottom start\"\n className=\"p-no-scrollbar p-z-[9999] !p-max-h-[300px] p-w-[240px] p-rounded-b-md p-border-x p-border-b p-border-gray-300 p-bg-white p-shadow-xl\"\n >\n {segments?.map((segment: PreprSegment) => (\n <ListboxOption\n key={segment._id}\n value={segment._id}\n className={cn(\n 'p-regular-text p-z-[100] p-flex p-w-full p-items-center p-p-2 p-px-4 hover:p-cursor-pointer',\n segment._id === selectedSegment._id\n ? 'p-bg-indigo-50 p-text-indigo-700'\n : 'p-bg-white p-text-gray-900 hover:p-bg-gray-100'\n )}\n >\n <div\n style={{\n textWrap: 'nowrap',\n textOverflow: 'ellipsis',\n textAlign: 'left',\n }}\n className=\"p-mr-auto p-w-full p-overflow-hidden\"\n >\n {segment.name}\n </div>\n </ListboxOption>\n ))}\n </ListboxOptions>\n </Listbox>\n );\n}\n","import React from 'react';\n\nexport default function SortDown(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg\n width=\"9\"\n height=\"6\"\n viewBox=\"0 0 9 6\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M5.24274 5.36865C4.91462 5.72412 4.3404 5.72412 4.01227 5.36865L0.512273 1.86865C0.266179 1.62256 0.184148 1.23975 0.320867 0.911621C0.457586 0.583496 0.785711 0.364746 1.14118 0.364746H8.14118C8.46931 0.364746 8.79743 0.583496 8.93415 0.911621C9.07087 1.23975 8.98884 1.62256 8.74274 1.86865L5.24274 5.36865Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n","import React from 'react';\nimport { useSelectedVariant, usePreprStore } from '../../../stores/prepr-store';\nimport { usePathname, useRouter } from 'next/navigation';\nimport RadioSelector from './radio-selector';\nimport { usePreviewMode } from '../../../stores/prepr-store';\n\nexport default function VariantSelector() {\n const selectedVariant = useSelectedVariant();\n const setSelectedVariant = usePreprStore(state => state.setSelectedVariant);\n\n const pathname = usePathname();\n const router = useRouter();\n const previewMode = usePreviewMode();\n\n const updateSelectedVariant = (value: string | boolean) => {\n const params = new URLSearchParams(window.location.search);\n setSelectedVariant(String(value));\n params.set('prepr_preview_ab', String(value));\n\n router.push(`${pathname}?${params.toString()}`, {\n scroll: false,\n });\n router.refresh();\n };\n\n const options = [\n { value: 'A', label: 'A', width: 'p-w-[82px]' },\n { value: 'B', label: 'B', width: 'p-w-[82px]' },\n ];\n\n // Always show 'A' as active when state is not 'B'\n const displayValue = selectedVariant === 'B' ? 'B' : 'A';\n\n return (\n <RadioSelector\n value={displayValue}\n onChange={updateSelectedVariant}\n options={options}\n disabled={!previewMode}\n />\n );\n}\n","import React from 'react';\nimport { Radio, RadioGroup } from '@headlessui/react';\nimport { cn } from '../../../utils';\nimport Tooltip from '../ui/tooltip';\n\ninterface RadioOption {\n value: string | boolean;\n label: string;\n width?: string;\n title?: string;\n}\n\ninterface RadioSelectorProps {\n value: string | boolean;\n onChange: (value: string | boolean) => void;\n options: RadioOption[];\n disabled?: boolean;\n}\n\nexport default function RadioSelector({\n value,\n onChange,\n options,\n disabled = false,\n}: RadioSelectorProps) {\n return (\n <RadioGroup\n className={cn(\n 'p-flex p-h-10 p-items-center p-gap-1 p-rounded-lg p-border p-border-gray-300 p-bg-white p-p-1',\n disabled && 'p-cursor-not-allowed p-opacity-50'\n )}\n value={value}\n onChange={onChange}\n disabled={disabled}\n >\n {options.map(option => {\n const radio = (\n <Radio\n key={String(option.value)}\n value={option.value}\n className={cn(\n option.width,\n 'p-regular-text p-flex p-h-8 p-cursor-pointer p-items-center p-justify-center p-whitespace-nowrap p-rounded-md p-px-4.5 p-py-2 p-text-center p-text-gray-900 p-transition-all p-duration-200 p-ease-in-out',\n disabled && 'p-pointer-events-none',\n option.value === false ||\n option.value === 'null' ||\n option.value === 'off'\n ? 'data-[checked]:p-bg-gray-800 data-[checked]:p-text-white'\n : 'data-[checked]:p-bg-indigo-600 data-[checked]:p-text-white',\n option.value === value && 'p-drop-shadow-3'\n )}\n >\n {option.label}\n </Radio>\n );\n\n return option.title ? (\n <Tooltip\n key={String(option.value)}\n content={option.title}\n wrapperClassName={option.width}\n >\n {radio}\n </Tooltip>\n ) : (\n radio\n );\n })}\n </RadioGroup>\n );\n}\n","import React, { useEffect, useId, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\ninterface TooltipProps {\n content: React.ReactNode;\n children: React.ReactNode;\n side?: 'top' | 'bottom';\n wrapperClassName?: string;\n}\n\nexport default function Tooltip({\n content,\n children,\n side = 'top',\n wrapperClassName,\n}: TooltipProps) {\n const [open, setOpen] = useState(false);\n const [arrowX, setArrowX] = useState<number | null>(null);\n const id = useId();\n const tipRef = useRef<HTMLDivElement | null>(null);\n const triggerRef = useRef<HTMLSpanElement | null>(null);\n\n // Position the fixed tooltip relative to the trigger and viewport\n useEffect(() => {\n if (!open) return;\n const position = () => {\n const el = tipRef.current;\n const trigger = triggerRef.current;\n if (!el || !trigger) return;\n // Let the tooltip size to content before measuring\n el.style.top = '0px';\n el.style.left = '0px';\n el.style.visibility = 'hidden';\n requestAnimationFrame(() => {\n const tip = el.getBoundingClientRect();\n const tri = trigger.getBoundingClientRect();\n const padding = 8;\n const centerX = tri.left + tri.width / 2;\n const spaceAbove = tri.top - padding;\n const spaceBelow = window.innerHeight - tri.bottom - padding;\n const placeTop =\n (side === 'top' && tip.height + padding <= spaceAbove) ||\n tip.height + padding > spaceBelow;\n const top = placeTop ? tri.top - tip.height - 8 : tri.bottom + 8;\n let left = centerX - tip.width / 2;\n if (left < padding) left = padding;\n if (left + tip.width > window.innerWidth - padding)\n left = window.innerWidth - padding - tip.width;\n const arrow = Math.max(10, Math.min(centerX - left, tip.width - 10));\n // Apply\n el.style.top = `${top}px`;\n el.style.left = `${left}px`;\n el.style.visibility = '';\n setArrowX(arrow);\n });\n };\n position();\n window.addEventListener('resize', position);\n return () => window.removeEventListener('resize', position);\n }, [open, side]);\n\n return (\n <span\n className={'p-relative p-flex p-items-center ' + (wrapperClassName || '')}\n ref={triggerRef}\n onMouseEnter={() => setOpen(true)}\n onMouseLeave={() => setOpen(false)}\n onFocus={() => setOpen(true)}\n onBlur={() => setOpen(false)}\n >\n {children}\n {open &&\n createPortal(\n <div\n role=\"tooltip\"\n id={id}\n ref={tipRef}\n className=\"p-fixed p-z-[10002] p-w-auto p-break-words p-rounded-md p-bg-gray-900 p-px-3 p-py-2 p-text-xs p-font-medium p-text-white p-shadow-xl\"\n style={{\n top: side === 'top' ? '0px' : '0px', // positioned after measure in effect below\n left: '0px',\n maxWidth: 'min(420px, calc(100vw - 16px))',\n }}\n >\n {content}\n <span\n className=\"p-absolute p-h-0 p-w-0\"\n style={{\n top: '100%',\n left: `${arrowX ?? 0}px`,\n transform: 'translateX(-50%)',\n borderLeft: '6px solid transparent',\n borderRight: '6px solid transparent',\n borderTop: '6px solid #111827',\n }}\n />\n </div>,\n document.body\n )}\n </span>\n );\n}\n","import React from 'react';\nimport { useEditMode, usePreprStore } from '../../../stores/prepr-store';\nimport RadioSelector from './radio-selector';\nimport { useTranslations } from '../../hooks/use-i18n';\n\nexport default function EditModeSelector() {\n const editMode = useEditMode();\n const setEditMode = usePreprStore(state => state.setEditMode);\n const { t } = useTranslations();\n const updateEditMode = (value: string | boolean) => {\n setEditMode(value === 'true' || value === true);\n };\n\n const options = [\n { value: 'false', label: t('common.off') },\n { value: 'true', label: t('common.on') },\n ];\n\n return (\n <RadioSelector\n options={options}\n value={editMode.toString()}\n onChange={updateEditMode}\n />\n );\n}\n","import React from 'react';\nimport { usePreviewMode, usePreprStore } from '../../../stores/prepr-store';\nimport RadioSelector from './radio-selector';\nimport { useTranslations } from '../../hooks/use-i18n';\n\nexport default function PreviewModeSelector() {\n const previewMode = usePreviewMode();\n const setPreviewMode = usePreprStore(state => state.setPreviewMode);\n const { t } = useTranslations();\n const updatePreviewMode = (value: string | boolean) => {\n setPreviewMode(value === 'true' || value === true);\n };\n\n const options = [\n {\n value: 'false',\n label: t('common.off'),\n title: t('adaptiveContent.offDescription'),\n },\n {\n value: 'true',\n label: t('common.on'),\n title: t('adaptiveContent.onDescription'),\n },\n ];\n\n return (\n <RadioSelector\n options={options}\n value={previewMode.toString()}\n onChange={updatePreviewMode}\n />\n );\n}\n","import React from 'react';\nimport { cn } from '../../../utils';\nimport { Icon } from '../ui';\n\ninterface ToolbarButtonProps {\n onClick: () => void;\n className?: string;\n}\n\nexport function ToolbarButton({ onClick, className }: ToolbarButtonProps) {\n return (\n <button\n onClick={onClick}\n className={cn(\n 'cursor-pointer p-z-50 p-flex p-size-9 p-items-center p-justify-center p-rounded-full p-bg-primary-700',\n className\n )}\n >\n <Icon className=\"p-text-white\" />\n </button>\n );\n}\n","import React from 'react';\nimport { StatusIndicatorPill, CloseEditModePill } from '../ui';\n\nexport default function ToolbarIndicatorWrapper() {\n return (\n <div className=\"p-fixed p-bottom-6 p-right-6 p-z-[999] p-flex p-gap-3\">\n <StatusIndicatorPill />\n <CloseEditModePill />\n </div>\n );\n}\n"],"mappings":"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","names":["react_exports","__export","PreprToolbar","PreprToolbarProvider","PreprTrackingPixel","usePreprToolbar","useTranslations","__toCommonJS","import_react","import_react","StegaErrorBoundary","props","error","errorInfo","_a","React","import_react","import_zustand","import_middleware","import_clsx","import_tailwind_merge","StegaError","createErrorInfo","type","context","error","additionalData","handleStegaError","errorInfo","handleDOMError","DOMService","tag","className","element","error","handleDOMError","styles","property","value","rect","x1","y1","x2","y2","pointX","pointY","elements","closestElement","minDistance","distance","event","handler","options","DebugLogger","_DebugLogger","options","__spreadValues","_a","_b","globalDebugLogger","message","args","prefix","scopeName","__spreadProps","initDebugLogger","enabled","createScopedLogger","scopeName","DebugLogger","throttle","func","delay","timeoutId","lastExecTime","throttledFunc","args","currentTime","timeSinceLastExec","createElementCache","query","ttl","cache","lastCacheTime","now","cn","inputs","sendPreprEvent","event","data","message","__spreadValues","usePreprStore","set","get","locale","segment","sendPreprEvent","initialSegments","activeSegment","segmentList","emptySegment","selectedSegment","segmentData","variant","activeVariant","mode","isIframe","setEditMode","setToolbarOpen","expires","open","emptyVariant","setSelectedSegment","setSelectedVariant","props","initializeSegments","initializeVariant","useSegments","state","useSelectedSegment","useSelectedVariant","useEditMode","usePreviewMode","usePreprStore","state","useLocale","PreprStoreInitializer","children","props","initialize","usePreprStore","state","setIsIframe","editMode","setEditMode","setToolbarOpen","handleEscapeKey","event","getCookie","name","_a","parts","cookieValue","toolbarOpenCookie","React","import_react","useScrollPosition","debug","createScopedLogger","sendPreprEvent","parentOrigin","handleMessage","evt","_a","_b","_c","currentScrollY","PreprToolbarProvider","children","props","options","_a","debugEnabled","initDebugLogger","useScrollPosition","setLocale","usePreprStore","s","normalized","l","supported","match","React","StegaErrorBoundary","PreprStoreInitializer","usePreprToolbar","selectedSegment","segments","emptySegment","setSelectedSegment","selectedVariant","emptyVariant","setSelectedVariant","editMode","setEditMode","isIframe","resetPersonalizationStore","resetAllStore","previewMode","usePreviewMode","resetPersonalization","resetAll","import_react","import_react","import_react","import_stega","decodeLogger","createScopedLogger","decode","str","decoded","e","regex","match","decodedMatch","handleStegaError","useStegaOverlay","debug","overlayRef","tooltipRef","hideTimeoutRef","currentElementRef","createOverlay","overlay","DOMService","tooltip","showOverlay","element","rect","href","origin","isCompact","top","left","minTop","maxTop","minLeft","maxLeft","hideOverlay","cleanup","import_react","useStegaProximity","debug","createScopedLogger","highlightedElementsRef","getEncodedElements","createElementCache","visibleElementsRef","observerRef","refreshObserving","visible","entries","entry","el","nodes","e","stopObserving","updateElementGradients","cursorX","cursorY","candidates","newHighlightedElements","highlightedCount","element","rect","distanceLeft","distanceRight","distanceTop","distanceBottom","distance","relativeX","relativeY","baseGradientSize","distanceScale","gradientSize","clearAllHighlights","highlightedElements","clearedCount","import_react","useStegaElements","debug","createScopedLogger","elementsRef","observerRef","getElements","scanNode","node","decode","_a","_b","decoded","target","i","scanDocument","walker","textNode","encodedCount","setupMutationObserver","onUpdate","pendingMutations","debounceTimeout","processMutations","allAddedNodes","mutation","mutations","cleanup","encodedElements","element","useStegaScan","editMode","debug","createScopedLogger","isInitializedRef","currentElementRef","hideTimeoutRef","createOverlay","showOverlay","hideOverlay","cleanupOverlay","decode","useStegaOverlay","updateElementGradients","clearAllHighlights","refreshObserving","stopObserving","useStegaProximity","getElements","scanDocument","setupMutationObserver","cleanupElements","useStegaElements","throttledMouseMove","throttle","e","mouseEvent","target","encodedElement","handleTooltipMouseEnter","handleTooltipMouseLeave","DOMService","tooltip","elements","import_react","import_navigation","import_react","import_react_dom","import_react","useModal","isVisible","onClose","contentRef","triggerRef","handleEscapeKey","event","handleClickOutside","import_react","import_react","import_react","XMark","props","React","__spreadValues","import_navigation","import_react","en_default","nl_default","dictionaries","en_default","nl_default","getDict","locale","getFromPath","obj","path","acc","key","format","message","vars","k","t","usePreprStore","dict","msg","useTranslations","locale","useLocale","key","vars","t","StatusIndicatorPill","_a","_b","selectedSegment","selectedVariant","emptySegment","isIframe","resetPersonalization","usePreprToolbar","segments","useSegments","t","useTranslations","router","pathname","previewMode","usePreviewMode","setPreviewMode","usePreprStore","state","handleReset","params","defaultSegmentName","s","segmentLabel","React","cn","XMark","import_react","CloseEditModePill","editMode","setEditMode","isIframe","usePreprToolbar","t","useTranslations","React","XMark","import_react","import_navigation","import_react","Rotate","React","ResetButton","router","resetAll","selectedVariant","selectedSegment","setEditMode","isPreviewMode","usePreprToolbar","pathname","enabled","t","useTranslations","handleClick","params","classes","cn","React","Rotate","import_react","Icon","props","React","__spreadValues","icon_default","import_react","Logo","props","React","__spreadProps","__spreadValues","logo_default","import_react","import_script","PreprTrackingPixel","accessToken","React","Script","import_react","import_navigation","import_react","import_react","SortDown","props","React","__spreadValues","SegmentSelector","segments","useSegments","selectedSegment","useSelectedSegment","setSelectedSegment","usePreprStore","state","previewMode","usePreviewMode","t","useTranslations","pathname","router","updateSelectedSegment","value","params","segment","React","SortDown","cn","import_react","import_navigation","import_react","import_react","import_react_dom","Tooltip","content","children","side","wrapperClassName","open","setOpen","arrowX","setArrowX","id","tipRef","triggerRef","position","el","trigger","tip","tri","padding","centerX","spaceAbove","spaceBelow","top","left","arrow","React","RadioSelector","value","onChange","options","disabled","React","cn","option","radio","Tooltip","VariantSelector","selectedVariant","useSelectedVariant","setSelectedVariant","usePreprStore","state","pathname","router","previewMode","usePreviewMode","React","RadioSelector","value","params","import_react","EditModeSelector","editMode","useEditMode","setEditMode","usePreprStore","state","t","useTranslations","updateEditMode","value","options","React","RadioSelector","import_react","PreviewModeSelector","previewMode","usePreviewMode","setPreviewMode","usePreprStore","state","t","useTranslations","updatePreviewMode","value","options","React","RadioSelector","ToolbarContent","onClose","contentRef","t","useTranslations","React","logo_default","PreviewModeSelector","SegmentSelector","VariantSelector","EditModeSelector","ResetButton","import_react","ToolbarButton","onClick","className","React","cn","icon_default","Toolbar","children","isMounted","setIsMounted","isBarVisible","usePreprStore","s","setToolbarOpen","editMode","useEditMode","selectedSegment","useSelectedSegment","selectedVariant","useSelectedVariant","contentRef","triggerRef","useModal","popupBoxRef","React","popupTop","setPopupTop","updatePopupPosition","popupHeight","windowHeight","triggerRect","top","handleClick","previewBarContent","cn","ToolbarButton","ToolbarContent","ToolbarWrapper","searchParams","isIframe","setIsIframe","handleKeyDown","event","key","isSaveShortcut","isPrintShortcut","isAddressBarShortcut","previewBarMessage","React","Toolbar","import_react","ToolbarIndicatorWrapper","React","StatusIndicatorPill","CloseEditModePill","PreprToolbar","editMode","useEditMode","useStegaScan","React","ToolbarWrapper","ToolbarIndicatorWrapper"]}
1
+ {"version":3,"sources":["../../src/react/index.tsx","../../src/react/components/toolbar/toolbar-provider.tsx","../../src/react/components/error-boundary.tsx","../../src/react/components/store/prepr-store-initializer.tsx","../../src/stores/prepr-store.ts","../../src/utils/index.ts","../../src/utils/errors.ts","../../src/utils/dom.ts","../../src/utils/debug.ts","../../src/utils/performance.ts","../../src/react/hooks/use-scroll-position.tsx","../../src/react/components/toolbar/prepr-toolbar.tsx","../../src/react/hooks/use-stega-scan.tsx","../../src/react/hooks/use-stega-overlay.tsx","../../src/react/hooks/use-stega-proximity.tsx","../../src/react/hooks/use-stega-elements.tsx","../../src/react/components/toolbar/toolbar-wrapper.tsx","../../src/react/components/toolbar/toolbar.tsx","../../src/react/hooks/use-modal.ts","../../src/react/components/toolbar/toolbar-content.tsx","../../src/react/components/ui/status-indicator-pill.tsx","../../src/react/components/icons/xmark.tsx","../../src/react/hooks/use-i18n.ts","../../src/i18n/locales/en.json","../../src/i18n/locales/nl.json","../../src/i18n/index.ts","../../src/react/components/ui/close-edit-mode-pill.tsx","../../src/react/components/ui/reset-button.tsx","../../src/react/components/icons/rotate.tsx","../../src/react/components/ui/icon.tsx","../../src/react/components/ui/logo.tsx","../../src/react/components/ui/prepr-tracking-pixel.tsx","../../src/react/components/selectors/segment-selector.tsx","../../src/react/components/icons/sort-down.tsx","../../src/react/components/selectors/variant-selector.tsx","../../src/react/components/selectors/radio-selector.tsx","../../src/react/components/ui/tooltip.tsx","../../src/react/components/selectors/edit-mode-selector.tsx","../../src/react/components/selectors/preview-mode-selector.tsx","../../src/react/components/toolbar/toolbar-button.tsx","../../src/react/components/toolbar/toolbar-indicator-wrapper.tsx"],"sourcesContent":["'use client';\n\nexport {\n PreprToolbarProvider,\n usePreprToolbar,\n} from './components/toolbar/toolbar-provider';\n\nexport { default as PreprToolbar } from './components/toolbar/prepr-toolbar';\nexport { default as PreprTrackingPixel } from './components/ui/prepr-tracking-pixel';\nexport { useTranslations } from './hooks/use-i18n';\n","'use client';\n\nimport React, { ReactNode, useEffect, useCallback, useMemo } from 'react';\nimport { PreprToolbarOptions, PreprToolbarProps } from '../../../types';\nimport { StegaErrorBoundary } from '../error-boundary';\nimport { PreprStoreInitializer } from '../store/prepr-store-initializer';\nimport { initDebugLogger } from '../../../utils/debug';\nimport useScrollPosition from '../../hooks/use-scroll-position';\nimport { usePreprStore, usePreviewMode } from '../../../stores/prepr-store';\n\ninterface PreprToolbarProviderProps {\n children: ReactNode;\n props: PreprToolbarProps;\n options?: PreprToolbarOptions;\n}\n\nexport const PreprToolbarProvider: React.FC<PreprToolbarProviderProps> = ({\n children,\n props,\n options,\n}) => {\n // Initialize debug logger with options\n useEffect(() => {\n const debugEnabled = options?.debug ?? false;\n initDebugLogger(debugEnabled);\n }, [options?.debug]);\n\n // Initialize scroll position handling for iframe communication\n useScrollPosition();\n\n // Initialize locale from options\n const setLocale = usePreprStore(s => s.setLocale);\n useEffect(() => {\n if (options?.locale) {\n setLocale(options.locale);\n }\n }, [options?.locale, setLocale]);\n\n // Fallback: auto-detect browser language when no locale is provided\n useEffect(() => {\n if (options?.locale) return; // Respect explicitly provided locale\n\n if (typeof navigator !== 'undefined') {\n const candidates =\n Array.isArray(navigator.languages) && navigator.languages.length\n ? navigator.languages\n : [navigator.language];\n\n const normalized = candidates\n .filter(Boolean)\n .map(l => l.toLowerCase())\n .map(l => l.split('-')[0]);\n\n // Restrict to supported locales; default to 'en'\n const supported: Array<'en' | 'nl'> = ['en', 'nl'];\n const match = normalized.find(l =>\n supported.includes(l as 'en' | 'nl')\n ) as 'en' | 'nl' | undefined;\n\n setLocale(match ?? 'en');\n }\n }, [options?.locale, setLocale]);\n\n return (\n <StegaErrorBoundary>\n <PreprStoreInitializer props={props}>{children}</PreprStoreInitializer>\n </StegaErrorBoundary>\n );\n};\n\n// Legacy hook for backward compatibility\nexport const usePreprToolbar = () => {\n // Convenience hook backed by Zustand store\n const selectedSegment = usePreprStore(s => s.selectedSegment);\n const segments = usePreprStore(s => s.segments);\n const emptySegment = usePreprStore(s => s.emptySegment);\n const setSelectedSegment = usePreprStore(s => s.setSelectedSegment);\n\n const selectedVariant = usePreprStore(s => s.selectedVariant);\n const emptyVariant = usePreprStore(s => s.emptyVariant);\n const setSelectedVariant = usePreprStore(s => s.setSelectedVariant);\n\n const editMode = usePreprStore(s => s.editMode);\n const setEditMode = usePreprStore(s => s.setEditMode);\n const isIframe = usePreprStore(s => s.isIframe);\n\n const resetPersonalizationStore = usePreprStore(s => s.resetPersonalization);\n const resetAllStore = usePreprStore(s => s.resetAll);\n const previewMode = usePreviewMode();\n\n const resetPersonalization = useCallback(() => {\n resetPersonalizationStore();\n }, [resetPersonalizationStore]);\n\n const resetAll = useCallback(() => {\n resetAllStore();\n }, [resetAllStore]);\n\n return useMemo(\n () => ({\n isPreviewMode: previewMode,\n activeSegment: selectedSegment._id,\n activeVariant: selectedVariant,\n data: segments,\n emptySegment,\n segmentList: segments,\n selectedSegment,\n setSelectedSegment,\n emptyVariant,\n selectedVariant,\n setSelectedVariant,\n editMode,\n setEditMode,\n isIframe,\n resetPersonalization,\n resetAll,\n }),\n [\n previewMode,\n selectedSegment,\n segments,\n emptySegment,\n setSelectedSegment,\n selectedVariant,\n emptyVariant,\n setSelectedVariant,\n editMode,\n setEditMode,\n isIframe,\n resetPersonalization,\n resetAll,\n ]\n );\n};\n","'use client';\n\nimport React, { Component, ReactNode } from 'react';\n\ninterface Props {\n children: ReactNode;\n fallback?: ReactNode;\n}\n\ninterface State {\n hasError: boolean;\n error: Error | null;\n}\n\nexport class StegaErrorBoundary extends Component<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): State {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n console.error('Stega Error Boundary caught an error:', error, errorInfo);\n\n // In production, you might want to send this to an error tracking service\n if (process.env.NODE_ENV === 'production') {\n // sendToErrorTrackingService({ error, errorInfo });\n }\n }\n\n render() {\n if (this.state.hasError) {\n if (this.props.fallback) {\n return this.props.fallback;\n }\n\n return (\n <div className=\"p-rounded-lg p-border p-border-red-200 p-bg-red-50 p-p-4 p-text-sm p-text-red-800\">\n <div className=\"p-mb-2 p-font-semibold\">Preview mode unavailable</div>\n <div className=\"p-text-red-600\">\n {this.state.error?.message || 'An unexpected error occurred'}\n </div>\n </div>\n );\n }\n\n return this.props.children;\n }\n}\n","'use client';\n\nimport React, { ReactNode, useEffect } from 'react';\nimport { usePreprStore } from '../../../stores/prepr-store';\nimport { PreprToolbarProps } from '../../../types';\n\ninterface PreprStoreInitializerProps {\n children: ReactNode;\n props: PreprToolbarProps;\n}\n\nexport function PreprStoreInitializer({\n children,\n props,\n}: PreprStoreInitializerProps) {\n const initialize = usePreprStore(state => state.initialize);\n const setIsIframe = usePreprStore(state => state.setIsIframe);\n const editMode = usePreprStore(state => state.editMode);\n const setEditMode = usePreprStore(state => state.setEditMode);\n const setToolbarOpen = usePreprStore(state => state.setToolbarOpen);\n\n // Initialize store with server data\n useEffect(() => {\n initialize({\n initialSegments: props.data,\n activeSegment: props.activeSegment,\n activeVariant: props.activeVariant,\n });\n }, [initialize, props.data, props.activeSegment, props.activeVariant]);\n\n // Handle iframe detection\n useEffect(() => {\n if (typeof window !== 'undefined' && window.parent !== window) {\n setIsIframe(true);\n }\n }, [setIsIframe]);\n\n // Handle escape key for edit mode\n useEffect(() => {\n const handleEscapeKey = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && editMode) {\n setEditMode(false);\n }\n };\n\n if (editMode) {\n document.addEventListener('keydown', handleEscapeKey);\n }\n\n return () => {\n document.removeEventListener('keydown', handleEscapeKey);\n };\n }, [editMode, setEditMode]);\n\n // Initialize preview mode from cookie\n useEffect(() => {\n if (typeof window !== 'undefined') {\n const getCookie = (name: string): string | null => {\n if (typeof document === 'undefined') return null;\n const value = `; ${document.cookie}`;\n const parts = value.split(`; ${name}=`);\n if (parts.length === 2) return parts.pop()?.split(';').shift() || null;\n return null;\n };\n\n const cookieValue = getCookie('Prepr-Preview-Mode');\n if (cookieValue !== null) {\n // Don't trigger events on initial load\n usePreprStore.setState({ previewMode: cookieValue === 'true' });\n }\n\n const toolbarOpenCookie = getCookie('Prepr-Toolbar-Open');\n if (toolbarOpenCookie !== null) {\n setToolbarOpen(toolbarOpenCookie === 'true');\n }\n }\n }, []);\n\n return <>{children}</>;\n}\n","'use client';\n\nimport { create } from 'zustand';\nimport { subscribeWithSelector } from 'zustand/middleware';\nimport { PreprSegment } from '../types';\nimport { sendPreprEvent } from '../utils';\n\ninterface PreprStore {\n // Locale slice\n locale: string;\n setLocale: (locale: string) => void;\n\n // Segment slice\n segments: PreprSegment[];\n selectedSegment: PreprSegment;\n emptySegment: PreprSegment;\n setSelectedSegment: (segment: PreprSegment) => void;\n initializeSegments: (\n segments: readonly PreprSegment[],\n activeSegment?: string | null\n ) => void;\n\n // Variant slice\n selectedVariant: string | null;\n emptyVariant: string;\n setSelectedVariant: (variant: string | null) => void;\n initializeVariant: (activeVariant?: string | null) => void;\n\n // Edit mode slice\n editMode: boolean;\n isIframe: boolean;\n setEditMode: (mode: boolean) => void;\n setIsIframe: (isIframe: boolean) => void;\n\n // Preview mode slice\n previewMode: boolean;\n setPreviewMode: (mode: boolean) => void;\n\n // Toolbar visibility slice\n toolbarOpen: boolean;\n setToolbarOpen: (open: boolean) => void;\n\n // Reset actions\n resetPersonalization: () => void;\n resetAll: () => void;\n\n // Store initialization\n initialize: (props: {\n initialSegments: readonly PreprSegment[];\n activeSegment?: string | null;\n activeVariant?: string | null;\n }) => void;\n}\n\nexport const usePreprStore = create<PreprStore>()(\n subscribeWithSelector((set, get) => ({\n // Initial i18n state\n locale: 'en',\n setLocale: (locale: string) => set({ locale }),\n\n // Initial segment state\n segments: [],\n selectedSegment: {\n name: 'Choose segment',\n _id: 'null',\n },\n emptySegment: {\n name: 'Choose segment',\n _id: 'null',\n },\n setSelectedSegment: (segment: PreprSegment) => {\n set({ selectedSegment: segment });\n sendPreprEvent('segment_changed', { segment: segment._id });\n },\n initializeSegments: (\n initialSegments: readonly PreprSegment[],\n activeSegment?: string | null\n ) => {\n const segmentList: PreprSegment[] = [\n {\n _id: 'all_other_users',\n name: 'All other users',\n },\n ...initialSegments,\n ];\n\n const emptySegment: PreprSegment = {\n name: 'Choose segment',\n _id: 'null',\n };\n\n const selectedSegment =\n (segmentList &&\n segmentList.filter(\n (segmentData: PreprSegment) => segmentData._id === activeSegment\n )[0]) ||\n emptySegment;\n\n set({\n segments: segmentList,\n selectedSegment,\n emptySegment,\n });\n },\n\n // Initial variant state\n selectedVariant: 'A',\n emptyVariant: 'A',\n setSelectedVariant: (variant: string | null) => {\n set({ selectedVariant: variant });\n sendPreprEvent('variant_changed', { variant: variant ?? undefined });\n },\n initializeVariant: (activeVariant?: string | null) => {\n set({ selectedVariant: activeVariant || 'A' });\n },\n\n // Initial edit mode state\n editMode: false,\n isIframe: false,\n setEditMode: (mode: boolean) => {\n set({ editMode: mode });\n sendPreprEvent('edit_mode_toggled', { editMode: mode });\n },\n setIsIframe: (isIframe: boolean) => {\n set({ isIframe });\n },\n\n // Initial preview mode state\n previewMode: true,\n setPreviewMode: (mode: boolean) => {\n set({ previewMode: mode });\n // Ensure edit mode is off when toolbar is disabled\n if (!mode) {\n const { setEditMode } = get();\n setEditMode(false);\n }\n // Manage toolbar open state and cookie to restore after reload\n const { setToolbarOpen } = get();\n // Auto-close toolbar when toggling preview mode\n setToolbarOpen(false);\n // Cookie handling\n if (typeof document !== 'undefined') {\n const expires = new Date();\n expires.setTime(expires.getTime() + 365 * 24 * 60 * 60 * 1000);\n document.cookie = `Prepr-Preview-Mode=${mode.toString()};expires=${expires.toUTCString()};path=/`;\n document.cookie = `Prepr-Toolbar-Open=false;expires=${expires.toUTCString()};path=/`;\n }\n sendPreprEvent('preview_mode_toggled', { previewMode: mode });\n // Refresh the page to apply the new preview mode state\n if (typeof window !== 'undefined') {\n window.location.reload();\n }\n },\n\n // Toolbar visibility\n toolbarOpen: false,\n setToolbarOpen: (open: boolean) => {\n set({ toolbarOpen: open });\n if (typeof document !== 'undefined') {\n const expires = new Date();\n expires.setTime(expires.getTime() + 365 * 24 * 60 * 60 * 1000);\n document.cookie = `Prepr-Toolbar-Open=${open.toString()};expires=${expires.toUTCString()};path=/`;\n }\n },\n\n // Reset actions\n resetPersonalization: () => {\n const {\n emptySegment,\n emptyVariant,\n setSelectedSegment,\n setSelectedVariant,\n } = get();\n setSelectedSegment(emptySegment);\n setSelectedVariant(emptyVariant);\n },\n resetAll: () => {\n const {\n emptySegment,\n emptyVariant,\n setSelectedSegment,\n setSelectedVariant,\n setEditMode,\n } = get();\n setSelectedSegment(emptySegment);\n setSelectedVariant(emptyVariant);\n setEditMode(false);\n },\n\n // Master initialization\n initialize: props => {\n const { initializeSegments, initializeVariant } = get();\n initializeSegments(props.initialSegments, props.activeSegment);\n initializeVariant(props.activeVariant);\n },\n }))\n);\n\n// Selectors for performance optimization\nexport const useSegments = () => usePreprStore(state => state.segments);\nexport const useSelectedSegment = () =>\n usePreprStore(state => state.selectedSegment);\nexport const useSelectedVariant = () =>\n usePreprStore(state => state.selectedVariant);\nexport const useEditMode = () => usePreprStore(state => state.editMode);\nexport const useIsIframe = () => usePreprStore(state => state.isIframe);\nexport const usePreviewMode = () => usePreprStore(state => state.previewMode);\nexport const useLocale = () => usePreprStore(state => state.locale);\n","import { ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\nimport { PreprEventType } from '../types';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\n// Define specific types for Prepr events\nexport interface PreprEventData {\n readonly segment?: string;\n readonly variant?: string;\n readonly editMode?: boolean;\n readonly [key: string]: string | boolean | number | undefined;\n}\n\n/**\n * Sends a Prepr event to both the current window and parent window\n * @param event - The event type to send\n * @param data - Optional event data\n */\nexport function sendPreprEvent(\n event: PreprEventType,\n data?: PreprEventData\n): void {\n if (typeof window !== 'undefined') {\n const message = {\n name: 'prepr_preview_bar',\n event,\n ...data,\n };\n\n // Send to current window for local event handling\n window.dispatchEvent(\n new CustomEvent('prepr_preview_bar', { detail: message })\n );\n\n // Send to parent window if available\n if (window.parent && window.parent !== window) {\n window.parent.postMessage(message, '*');\n }\n }\n}\n\n// Export error handling utilities\nexport * from './errors';\n\n// Export DOM service\nexport * from './dom';\n\n// Export debug utilities\nexport * from './debug';\n\n// Export performance utilities\nexport * from './performance';\n","export const StegaError = {\n DECODE_FAILED: 'STEGA_DECODE_FAILED',\n INVALID_FORMAT: 'STEGA_INVALID_FORMAT',\n DOM_MANIPULATION_FAILED: 'DOM_MANIPULATION_FAILED',\n CONTEXT_NOT_FOUND: 'CONTEXT_NOT_FOUND',\n} as const;\n\nexport type StegaErrorType = (typeof StegaError)[keyof typeof StegaError];\n\n// Define specific types for error additional data\nexport interface ErrorAdditionalData {\n input?: string;\n element?: HTMLElement;\n context?: string;\n [key: string]: string | HTMLElement | undefined;\n}\n\nexport interface ErrorInfo {\n type: StegaErrorType;\n context: string;\n message: string;\n timestamp: string;\n stack?: string;\n additionalData?: ErrorAdditionalData;\n}\n\nexport function createErrorInfo(\n type: StegaErrorType,\n context: string,\n error: Error,\n additionalData?: ErrorAdditionalData\n): ErrorInfo {\n return {\n type,\n context,\n message: error.message,\n timestamp: new Date().toISOString(),\n stack: error.stack,\n additionalData,\n };\n}\n\nexport function handleStegaError(\n error: Error,\n context: string,\n additionalData?: ErrorAdditionalData\n) {\n const errorInfo = createErrorInfo(\n StegaError.DECODE_FAILED,\n context,\n error,\n additionalData\n );\n\n console.error('Stega Error:', errorInfo);\n\n // In production, you might want to send this to an error tracking service\n if (process.env.NODE_ENV === 'production') {\n // sendToErrorTrackingService(errorInfo);\n }\n\n return errorInfo;\n}\n\nexport function handleDOMError(error: Error, context: string) {\n const errorInfo = createErrorInfo(\n StegaError.DOM_MANIPULATION_FAILED,\n context,\n error\n );\n\n console.error('DOM Error:', errorInfo);\n return errorInfo;\n}\n\nexport function handleContextError(contextName: string) {\n const error = new Error(`${contextName} must be used within its provider`);\n const errorInfo = createErrorInfo(\n StegaError.CONTEXT_NOT_FOUND,\n contextName,\n error\n );\n\n console.error('Context Error:', errorInfo);\n throw error;\n}\n","import { handleDOMError } from './errors';\n\nexport class DOMService {\n /**\n * Creates an HTML element with specified tag and class name\n */\n static createElement(tag: string, className: string): HTMLElement {\n try {\n const element = document.createElement(tag);\n element.className = className;\n return element;\n } catch (error) {\n handleDOMError(error as Error, 'createElement');\n throw error;\n }\n }\n\n /**\n * Appends an element to the document body\n */\n static appendToBody(element: HTMLElement): void {\n try {\n document.body.appendChild(element);\n } catch (error) {\n handleDOMError(error as Error, 'appendToBody');\n throw error;\n }\n }\n\n /**\n * Removes an element from the document body\n */\n static removeFromBody(element: HTMLElement): void {\n try {\n if (element.parentNode) {\n element.parentNode.removeChild(element);\n }\n } catch (error) {\n handleDOMError(error as Error, 'removeFromBody');\n throw error;\n }\n }\n\n /**\n * Sets multiple CSS properties on an element\n */\n static setElementStyles(\n element: HTMLElement,\n styles: Record<string, string>\n ): void {\n try {\n Object.entries(styles).forEach(([property, value]) => {\n element.style.setProperty(property, value);\n });\n } catch (error) {\n handleDOMError(error as Error, 'setElementStyles');\n throw error;\n }\n }\n\n /**\n * Gets the bounding rectangle of an element\n */\n static getElementRect(element: HTMLElement): DOMRect {\n try {\n return element.getBoundingClientRect();\n } catch (error) {\n handleDOMError(error as Error, 'getElementRect');\n throw error;\n }\n }\n\n /**\n * Checks if an element is in the viewport\n */\n static isElementInViewport(element: HTMLElement): boolean {\n try {\n const rect = this.getElementRect(element);\n return (\n rect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <=\n (window.innerHeight || document.documentElement.clientHeight) &&\n rect.right <=\n (window.innerWidth || document.documentElement.clientWidth)\n );\n } catch (error) {\n handleDOMError(error as Error, 'isElementInViewport');\n return false;\n }\n }\n\n /**\n * Calculates distance between two points\n */\n static calculateDistance(\n x1: number,\n y1: number,\n x2: number,\n y2: number\n ): number {\n return Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));\n }\n\n /**\n * Finds the closest element to a point from a list of elements\n */\n static findClosestElement(\n pointX: number,\n pointY: number,\n elements: NodeListOf<Element>\n ): HTMLElement | null {\n try {\n let closestElement: HTMLElement | null = null;\n let minDistance = Infinity;\n\n elements.forEach(element => {\n const rect = this.getElementRect(element as HTMLElement);\n const distance = this.calculateDistance(\n pointX,\n pointY,\n rect.left + rect.width / 2,\n rect.top + rect.height / 2\n );\n\n if (distance < minDistance) {\n minDistance = distance;\n closestElement = element as HTMLElement;\n }\n });\n\n return closestElement;\n } catch (error) {\n handleDOMError(error as Error, 'findClosestElement');\n return null;\n }\n }\n\n /**\n * Safely adds event listeners\n */\n static addEventListener(\n element: EventTarget,\n event: string,\n handler: EventListener,\n options?: AddEventListenerOptions\n ): void {\n try {\n element.addEventListener(event, handler, options);\n } catch (error) {\n handleDOMError(error as Error, 'addEventListener');\n throw error;\n }\n }\n\n /**\n * Safely removes event listeners\n */\n static removeEventListener(\n element: EventTarget,\n event: string,\n handler: EventListener,\n options?: EventListenerOptions\n ): void {\n try {\n element.removeEventListener(event, handler, options);\n } catch (error) {\n handleDOMError(error as Error, 'removeEventListener');\n throw error;\n }\n }\n}\n","/**\n * Debug utility for Prepr Next.js package\n * Provides centralized debug logging with performance optimizations\n */\n\n// Define specific types for debug arguments\nexport type DebugArg = string | number | boolean | null | undefined | object;\n\ninterface DebugOptions {\n enabled?: boolean;\n prefix?: string;\n}\n\nclass DebugLogger {\n private options: DebugOptions;\n\n constructor(options: DebugOptions) {\n this.options = {\n prefix: '[Prepr]',\n ...options,\n };\n }\n\n /**\n * Check if debug is enabled - checks both local and global state\n */\n private isEnabled(): boolean {\n // If this logger has a local enabled state, use it\n if (this.options.enabled !== undefined) {\n return this.options.enabled;\n }\n\n // Otherwise, check the global logger state\n return globalDebugLogger?.options?.enabled ?? false;\n }\n\n /**\n * Log a debug message if debug is enabled\n */\n log(message: string, ...args: DebugArg[]): void {\n if (!this.isEnabled()) return;\n\n const prefix = this.options.prefix;\n console.log(`${prefix} ${message}`, ...args);\n }\n\n /**\n * Log a debug warning if debug is enabled\n */\n warn(message: string, ...args: DebugArg[]): void {\n if (!this.isEnabled()) return;\n\n const prefix = this.options.prefix;\n console.warn(`${prefix} ${message}`, ...args);\n }\n\n /**\n * Log a debug error if debug is enabled\n */\n error(message: string, ...args: DebugArg[]): void {\n if (!this.isEnabled()) return;\n\n const prefix = this.options.prefix;\n console.error(`${prefix} ${message}`, ...args);\n }\n\n /**\n * Create a scoped logger with additional context\n */\n scope(scopeName: string): DebugLogger {\n return new DebugLogger({\n ...this.options,\n prefix: `${this.options.prefix}[${scopeName}]`,\n });\n }\n}\n\n// Global debug instance\nlet globalDebugLogger: DebugLogger | null = null;\n\n/**\n * Initialize the debug logger\n */\nexport function initDebugLogger(enabled: boolean = false): void {\n globalDebugLogger = new DebugLogger({ enabled });\n}\n\n/**\n * Get the debug logger instance\n */\nexport function getDebugLogger(): DebugLogger {\n if (!globalDebugLogger) {\n // Fallback to disabled logger if not initialized\n globalDebugLogger = new DebugLogger({ enabled: false });\n }\n return globalDebugLogger;\n}\n\n/**\n * Convenience function for logging\n */\nexport function debugLog(message: string, ...args: DebugArg[]): void {\n getDebugLogger().log(message, ...args);\n}\n\n/**\n * Convenience function for warning\n */\nexport function debugWarn(message: string, ...args: DebugArg[]): void {\n getDebugLogger().warn(message, ...args);\n}\n\n/**\n * Convenience function for errors\n */\nexport function debugError(message: string, ...args: DebugArg[]): void {\n getDebugLogger().error(message, ...args);\n}\n\n/**\n * Create a scoped debug logger that dynamically checks global debug state\n */\nexport function createScopedLogger(scopeName: string): DebugLogger {\n // Create a scoped logger without its own enabled state\n // This allows it to dynamically check the global logger state\n return new DebugLogger({\n prefix: `[Prepr][${scopeName}]`,\n });\n}\n","// Performance utilities\n\n/**\n * Throttled function with cancellation support\n */\nexport interface ThrottledFunction<T extends (...args: any[]) => any> {\n (...args: Parameters<T>): void;\n cancel(): void;\n}\n\n/**\n * Improved throttle function with better memory management and cancellation\n * @param func - The function to throttle\n * @param delay - The delay in milliseconds\n * @returns Throttled function with cancel method\n */\nexport function throttle<T extends (...args: any[]) => any>(\n func: T,\n delay: number\n): ThrottledFunction<T> {\n let timeoutId: NodeJS.Timeout | null = null;\n let lastExecTime = 0;\n\n const throttledFunc = ((...args: Parameters<T>) => {\n const currentTime = Date.now();\n const timeSinceLastExec = currentTime - lastExecTime;\n\n if (timeSinceLastExec >= delay) {\n func(...args);\n lastExecTime = currentTime;\n } else {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(() => {\n func(...args);\n lastExecTime = Date.now();\n timeoutId = null;\n }, delay - timeSinceLastExec);\n }\n }) as ThrottledFunction<T>;\n\n throttledFunc.cancel = () => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n return throttledFunc;\n}\n\n/**\n * Debounce function with cancellation support\n * @param func - The function to debounce\n * @param delay - The delay in milliseconds\n * @returns Debounced function with cancel method\n */\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n delay: number\n): ThrottledFunction<T> {\n let timeoutId: NodeJS.Timeout | null = null;\n\n const debouncedFunc = ((...args: Parameters<T>) => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(() => {\n func(...args);\n timeoutId = null;\n }, delay);\n }) as ThrottledFunction<T>;\n\n debouncedFunc.cancel = () => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n return debouncedFunc;\n}\n\n// Simple DOM element cache for querySelectorAll\nexport function createElementCache<T extends Element = Element>(\n query: string,\n ttl: number = 1000\n) {\n let cache: NodeListOf<T> | null = null;\n let lastCacheTime = 0;\n return () => {\n const now = Date.now();\n if (!cache || now - lastCacheTime > ttl) {\n cache = document.querySelectorAll<T>(query);\n lastCacheTime = now;\n }\n return cache;\n };\n}\n","import { useEffect } from 'react';\nimport { sendPreprEvent } from '../../utils';\nimport { createScopedLogger } from '../../utils';\n\n// Mark this hook as having side effects to prevent tree shaking\n\nexport default function useScrollPosition() {\n const debug = createScopedLogger('useScrollPosition');\n\n useEffect(() => {\n sendPreprEvent('getScrollPosition', {\n value: 0,\n });\n\n if (window.parent !== self) {\n let parentOrigin: string | null = null; //Get origin of parent outside iframe\n sendPreprEvent('loaded');\n\n const handleMessage = (evt: MessageEvent) => {\n debug.log('received message:', evt.data);\n\n if (evt?.data?.event === 'prepr:initVE' && !parentOrigin) {\n parentOrigin = evt.origin;\n\n if (evt.data?.scrollPosition) {\n debug.log('scrolling to position:', evt.data.scrollPosition);\n //Timeout needed in order to scroll to position\n setTimeout(() => {\n window.scrollTo(0, evt.data?.scrollPosition);\n }, 1);\n }\n }\n if (evt.origin !== parentOrigin) return;\n\n if (evt?.data?.event === 'prepr:getScrollPosition') {\n const currentScrollY =\n window.scrollY || document.documentElement.scrollTop;\n debug.log('sending scroll position:', currentScrollY);\n sendPreprEvent('getScrollPosition', {\n value: currentScrollY,\n });\n }\n };\n\n window.addEventListener('message', handleMessage);\n\n debug.log('set up iframe message listener');\n\n return () => {\n window.removeEventListener('message', handleMessage);\n debug.log('cleaned up iframe message listener');\n };\n } else {\n debug.log('not in iframe, skipping iframe setup');\n return undefined;\n }\n }, [debug]);\n\n // Return something to prevent tree shaking\n return true;\n}\n","'use client';\n\nimport React from 'react';\nimport { useEditMode } from '../../../stores/prepr-store';\nimport useStegaScan from '../../hooks/use-stega-scan';\nimport ToolbarWrapper from './toolbar-wrapper';\nimport ToolbarIndicatorWrapper from './toolbar-indicator-wrapper';\n\nexport default function PreprToolbar() {\n const editMode = useEditMode();\n\n useStegaScan(editMode);\n\n return (\n <>\n <ToolbarWrapper />\n <ToolbarIndicatorWrapper />\n </>\n );\n}\n","import { useEffect, useRef, useCallback, useMemo } from 'react';\nimport { DOMService } from '../../utils/dom';\nimport { createScopedLogger } from '../../utils/debug';\nimport { throttle } from '../../utils/performance';\nimport { useStegaOverlay } from './use-stega-overlay';\nimport { useStegaProximity } from './use-stega-proximity';\nimport { useStegaElements } from './use-stega-elements';\n\nexport default function useStegaScan(editMode: boolean): void {\n const debug = createScopedLogger('useStegaScan');\n const isInitializedRef = useRef(false);\n\n const {\n currentElementRef,\n hideTimeoutRef,\n createOverlay,\n showOverlay,\n hideOverlay,\n cleanup: cleanupOverlay,\n decode,\n } = useStegaOverlay();\n\n const {\n updateElementGradients,\n clearAllHighlights,\n refreshObserving,\n stopObserving,\n } = useStegaProximity();\n\n const {\n getElements,\n scanDocument,\n setupMutationObserver,\n cleanup: cleanupElements,\n } = useStegaElements();\n\n // Memoize the throttled mouse move handler\n const throttledMouseMove = useMemo(\n () =>\n throttle((e: Event) => {\n const mouseEvent = e as MouseEvent;\n const target = mouseEvent.target as HTMLElement;\n // Early return if hovering over tooltip\n if (target.closest('.prepr-tooltip')) {\n return;\n }\n updateElementGradients(mouseEvent.clientX, mouseEvent.clientY);\n const encodedElement = target.closest('[data-prepr-encoded]');\n if (encodedElement) {\n showOverlay(encodedElement as HTMLElement);\n } else {\n hideOverlay();\n }\n }, 16),\n [updateElementGradients, showOverlay, hideOverlay]\n );\n\n // Memoize tooltip handlers\n const handleTooltipMouseEnter = useCallback(() => {\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n }\n }, [hideTimeoutRef]);\n\n const handleTooltipMouseLeave = useCallback(() => {\n if (!currentElementRef.current) {\n hideOverlay();\n }\n }, [currentElementRef, hideOverlay]);\n\n useEffect(() => {\n debug.log('editMode changed to', editMode);\n if (!editMode) {\n debug.log('editMode is false, cleaning up');\n if (isInitializedRef.current) {\n DOMService.removeEventListener(\n document,\n 'mousemove',\n throttledMouseMove\n );\n cleanupOverlay();\n clearAllHighlights();\n cleanupElements();\n isInitializedRef.current = false;\n }\n return;\n }\n if (isInitializedRef.current) {\n debug.log('already initialized, skipping setup');\n return;\n }\n debug.log('editMode is true, setting up scanning');\n // Create overlay and tooltip elements\n const { tooltip } = createOverlay();\n debug.log('created overlay and tooltip');\n DOMService.addEventListener(tooltip, 'mouseenter', handleTooltipMouseEnter);\n DOMService.addEventListener(tooltip, 'mouseleave', handleTooltipMouseLeave);\n debug.log('starting document scan');\n scanDocument(decode);\n const elements = getElements();\n debug.log('found', elements.length, 'encoded elements after scan');\n // Start observing visible candidates\n refreshObserving();\n setupMutationObserver(decode, () => {\n // Refresh visible candidates on DOM changes\n refreshObserving();\n });\n debug.log('set up mutation observer');\n DOMService.addEventListener(document, 'mousemove', throttledMouseMove);\n debug.log('added throttled mousemove handler');\n isInitializedRef.current = true;\n return () => {\n debug.log('cleaning up');\n DOMService.removeEventListener(document, 'mousemove', throttledMouseMove);\n DOMService.removeEventListener(\n tooltip,\n 'mouseenter',\n handleTooltipMouseEnter\n );\n DOMService.removeEventListener(\n tooltip,\n 'mouseleave',\n handleTooltipMouseLeave\n );\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n }\n cleanupOverlay();\n clearAllHighlights();\n stopObserving();\n cleanupElements();\n isInitializedRef.current = false;\n };\n }, [editMode]);\n}\n","import { useRef, useCallback } from 'react';\nimport { DOMService } from '../../utils/dom';\nimport { handleStegaError } from '../../utils/errors';\nimport { createScopedLogger } from '../../utils/debug';\nimport { vercelStegaDecode } from '@vercel/stega';\n\ninterface DecodedData {\n origin: string;\n href: string;\n}\n\nconst decodeLogger = createScopedLogger('decode');\n\nfunction decode(str: string | null): DecodedData | null {\n if (!str) return null;\n\n try {\n // First, try to decode the string directly\n decodeLogger.log('attempting to decode stega data');\n\n const decoded = vercelStegaDecode(str) as DecodedData;\n decodeLogger.log('vercelStegaDecode result:', decoded);\n\n if (decoded?.href) {\n decodeLogger.log('successfully decoded', decoded);\n return decoded;\n }\n } catch (e) {\n decodeLogger.log('error decoding stega data:', e as Error);\n // If it fails, it might be because of trailing characters.\n // Regex to find the JSON string\n const regex = /{\"origin.*?}/;\n const match = str.match(regex);\n\n if (match) {\n try {\n // Now, try to decode the matched JSON string\n const decodedMatch = vercelStegaDecode(match[0]) as DecodedData;\n if (decodedMatch?.href) {\n decodeLogger.log(\n 'successfully decoded with regex match',\n decodedMatch\n );\n return decodedMatch;\n }\n } catch (e) {\n handleStegaError(e as Error, 'decode', { input: str });\n }\n }\n }\n\n return null;\n}\n\nexport function useStegaOverlay() {\n const debug = createScopedLogger('useStegaOverlay');\n const overlayRef = useRef<HTMLDivElement | null>(null);\n const tooltipRef = useRef<HTMLDivElement | null>(null);\n const hideTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const currentElementRef = useRef<HTMLElement | null>(null);\n\n const createOverlay = useCallback(() => {\n const overlay = DOMService.createElement(\n 'div',\n 'prepr-overlay'\n ) as HTMLDivElement;\n overlay.style.display = 'none';\n\n const tooltip = DOMService.createElement(\n 'div',\n 'prepr-tooltip'\n ) as HTMLDivElement;\n tooltip.style.display = 'none';\n\n DOMService.appendToBody(overlay);\n DOMService.appendToBody(tooltip);\n\n overlayRef.current = overlay;\n tooltipRef.current = tooltip;\n\n debug.log('created overlay and tooltip elements');\n\n return { overlay, tooltip };\n }, [debug]);\n\n const showOverlay = useCallback(\n (element: HTMLElement) => {\n if (!overlayRef.current || !tooltipRef.current) return;\n\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n }\n\n // Update active class on elements\n if (currentElementRef.current && currentElementRef.current !== element) {\n currentElementRef.current.classList.remove('prepr-overlay-active');\n }\n\n const rect = DOMService.getElementRect(element);\n const href = element.getAttribute('data-prepr-href');\n const origin = element.getAttribute('data-prepr-origin');\n\n debug.log('showing overlay for element:', { href, origin, rect });\n\n // Position overlay\n const overlay = overlayRef.current;\n overlay.style.display = 'block';\n overlay.style.top = `${rect.top + window.scrollY - 2}px`;\n overlay.style.left = `${rect.left + window.scrollX - 4}px`;\n overlay.style.width = `${rect.width + 8}px`;\n overlay.style.height = `${rect.height + 4}px`;\n\n // Position and show tooltip\n const tooltip = tooltipRef.current;\n if (tooltip && href && origin) {\n const MIN_WIDTH_FOR_TEXT = 80;\n const isCompact = rect.width < MIN_WIDTH_FOR_TEXT;\n tooltip.textContent = isCompact ? '↗' : `${origin} ↗`;\n tooltip.style.display = 'block';\n\n // Remove min-width constraint for compact tooltips\n if (isCompact) {\n tooltip.style.minWidth = 'auto';\n } else {\n tooltip.style.minWidth = '80px';\n }\n\n // Use requestAnimationFrame to ensure the DOM has updated before calculating position\n requestAnimationFrame(() => {\n if (tooltip) {\n // Compute desired positions\n let top = rect.top + window.scrollY - tooltip.clientHeight - 2;\n let left = rect.right + 4 - tooltip.clientWidth;\n\n // Clamp within viewport bounds\n const minTop = window.scrollY + 4;\n const maxTop =\n window.scrollY + window.innerHeight - tooltip.clientHeight - 4;\n const minLeft = window.scrollX + 4;\n const maxLeft =\n window.scrollX + window.innerWidth - tooltip.clientWidth - 4;\n\n if (top < minTop) {\n // If above viewport, place below the element\n top = rect.bottom + window.scrollY + 2;\n }\n top = Math.max(minTop, Math.min(top, maxTop));\n left = Math.max(minLeft, Math.min(left, maxLeft));\n\n tooltip.style.top = `${top}px`;\n tooltip.style.left = `${left}px`;\n }\n });\n\n tooltip.onclick = () =>\n window.open(href, '_blank', 'noopener,noreferrer');\n }\n\n currentElementRef.current = element;\n element.classList.add('prepr-overlay-active');\n },\n [debug]\n );\n\n const hideOverlay = useCallback(() => {\n if (!overlayRef.current || !tooltipRef.current) return;\n\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n }\n\n hideTimeoutRef.current = setTimeout(() => {\n if (overlayRef.current) overlayRef.current.style.display = 'none';\n if (tooltipRef.current) tooltipRef.current.style.display = 'none';\n if (currentElementRef.current) {\n currentElementRef.current.classList.remove('prepr-overlay-active');\n }\n currentElementRef.current = null;\n debug.log('hidden overlay and tooltip');\n }, 100);\n }, [debug]);\n\n const cleanup = useCallback(() => {\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n }\n\n if (overlayRef.current) {\n DOMService.removeFromBody(overlayRef.current);\n }\n if (tooltipRef.current) {\n DOMService.removeFromBody(tooltipRef.current);\n }\n\n debug.log('cleaned up overlay and tooltip');\n }, [debug]);\n\n return {\n overlayRef,\n tooltipRef,\n currentElementRef,\n hideTimeoutRef,\n createOverlay,\n showOverlay,\n hideOverlay,\n cleanup,\n decode,\n };\n}\n","import { useRef, useCallback } from 'react';\nimport { createScopedLogger } from '../../utils/debug';\nimport { createElementCache } from '../../utils/performance';\n\nexport function useStegaProximity() {\n const debug = createScopedLogger('useStegaProximity');\n const highlightedElementsRef = useRef<Set<HTMLElement>>(new Set());\n const getEncodedElements = createElementCache<HTMLElement>(\n '[data-prepr-encoded]',\n 200\n );\n\n // Track on-screen candidates via IntersectionObserver\n const visibleElementsRef = useRef<Set<HTMLElement>>(new Set());\n const observerRef = useRef<IntersectionObserver | null>(null);\n\n const refreshObserving = useCallback(() => {\n try {\n if (!('IntersectionObserver' in window)) return; // Fallback handled later\n\n // Reset observer\n if (observerRef.current) {\n observerRef.current.disconnect();\n observerRef.current = null;\n }\n\n const visible = new Set<HTMLElement>();\n visibleElementsRef.current = visible;\n\n observerRef.current = new IntersectionObserver(\n entries => {\n entries.forEach(entry => {\n const el = entry.target as HTMLElement;\n if (entry.isIntersecting) {\n visible.add(el);\n } else {\n visible.delete(el);\n }\n });\n },\n { root: null, rootMargin: '0px', threshold: 0 }\n );\n\n const nodes = getEncodedElements();\n nodes.forEach(el => observerRef.current!.observe(el));\n debug.log('observing', nodes.length, 'encoded elements');\n } catch (e) {\n debug.log('error setting up IntersectionObserver:', e as Error);\n }\n }, [debug, getEncodedElements]);\n\n const stopObserving = useCallback(() => {\n if (observerRef.current) {\n observerRef.current.disconnect();\n observerRef.current = null;\n visibleElementsRef.current.clear();\n }\n }, []);\n\n const updateElementGradients = useCallback(\n (cursorX: number, cursorY: number) => {\n // Use visible candidates when available; fall back to all\n const candidates =\n visibleElementsRef.current.size > 0\n ? Array.from(visibleElementsRef.current)\n : Array.from(getEncodedElements());\n const newHighlightedElements = new Set<HTMLElement>();\n let highlightedCount = 0;\n\n candidates.forEach(element => {\n const rect = element.getBoundingClientRect();\n\n // Calculate shortest distance from cursor to element edges\n const distanceLeft = Math.abs(cursorX - rect.left);\n const distanceRight = Math.abs(cursorX - rect.right);\n const distanceTop = Math.abs(cursorY - rect.top);\n const distanceBottom = Math.abs(cursorY - rect.bottom);\n\n // Use minimum distance to any edge\n const distance = Math.min(\n distanceLeft,\n distanceRight,\n distanceTop,\n distanceBottom\n );\n\n const el = element as HTMLElement;\n if (distance < 150) {\n // Calculate relative cursor position within the element\n const relativeX = cursorX - rect.left;\n const relativeY = cursorY - rect.top;\n\n el.style.setProperty('--cursor-x', `${relativeX}px`);\n el.style.setProperty('--cursor-y', `${relativeY}px`);\n\n // Set gradient size based on element dimensions\n // Calculate base gradient size based on element dimensions\n const baseGradientSize = Math.max(\n 150,\n Math.max(rect.width, rect.height) * 1.1\n );\n // Scale gradient size based on distance (400 is max distance, closer = larger gradient)\n const distanceScale = Math.max(0, (400 - distance) / 400);\n const gradientSize = baseGradientSize * distanceScale;\n\n el.style.setProperty('--gradient-size', `${gradientSize}px`);\n el.classList.add('prepr-proximity-highlight');\n newHighlightedElements.add(el);\n highlightedCount++;\n } else {\n el.classList.remove('prepr-proximity-highlight');\n }\n });\n\n // Update the highlighted elements reference\n highlightedElementsRef.current = newHighlightedElements;\n\n if (highlightedCount > 0) {\n debug.log('highlighted', highlightedCount, 'elements near cursor');\n }\n },\n [debug, getEncodedElements]\n );\n\n const clearAllHighlights = useCallback(() => {\n const highlightedElements = highlightedElementsRef.current;\n let clearedCount = 0;\n\n highlightedElements.forEach(element => {\n element.classList.remove('prepr-proximity-highlight');\n clearedCount++;\n });\n\n highlightedElementsRef.current.clear();\n\n if (clearedCount > 0) {\n debug.log('cleared highlights from', clearedCount, 'elements');\n }\n }, [debug]);\n\n return {\n updateElementGradients,\n clearAllHighlights,\n refreshObserving,\n stopObserving,\n highlightedElementsRef,\n };\n}\n","import { useRef, useCallback } from 'react';\nimport { createScopedLogger } from '../../utils/debug';\n\n// Define the expected structure for decoded data\ninterface DecodedData {\n href: string;\n origin: string;\n}\n\nexport function useStegaElements() {\n const debug = createScopedLogger('useStegaElements');\n const elementsRef = useRef<NodeListOf<Element> | undefined>(undefined);\n const observerRef = useRef<MutationObserver | null>(null);\n\n const getElements = useCallback(() => {\n if (!elementsRef.current) {\n elementsRef.current = document.querySelectorAll(\n '[data-prepr-encoded], [data-prepr-edit-target][data-prepr-encoded]'\n );\n }\n return elementsRef.current;\n }, []);\n\n const scanNode = useCallback(\n (node: Node, decode: (str: string | null) => DecodedData | null) => {\n if (node.nodeType === Node.TEXT_NODE) {\n if (!node.textContent?.trim()) return;\n if (node.parentElement?.closest('script, style, noscript')) return;\n const decoded = decode(node.textContent);\n if (decoded?.href) {\n const target = node.parentElement;\n if (target && !target.hasAttribute('data-prepr-encoded')) {\n target.setAttribute('data-prepr-encoded', '');\n target.setAttribute('data-prepr-href', decoded.href);\n target.setAttribute('data-prepr-origin', decoded.origin);\n debug.log('encoded element found:', {\n href: decoded.href,\n origin: decoded.origin,\n });\n }\n }\n } else if (node.nodeType === Node.ELEMENT_NODE) {\n for (let i = 0; i < node.childNodes.length; i++) {\n scanNode(node.childNodes[i], decode);\n }\n }\n },\n [debug]\n );\n\n const scanDocument = useCallback(\n (decode: (str: string | null) => DecodedData | null) => {\n debug.log('starting document scan');\n const walker = document.createTreeWalker(\n document.body,\n NodeFilter.SHOW_TEXT,\n {\n acceptNode: node => {\n if (node.parentElement?.closest('script, style, noscript')) {\n return NodeFilter.FILTER_REJECT;\n }\n if (!node.textContent?.trim()) {\n return NodeFilter.FILTER_REJECT;\n }\n return NodeFilter.FILTER_ACCEPT;\n },\n }\n );\n let textNode;\n let encodedCount = 0;\n while ((textNode = walker.nextNode())) {\n const decoded = decode(textNode.textContent);\n if (decoded?.href) {\n const target = textNode.parentElement;\n if (target && !target.hasAttribute('data-prepr-encoded')) {\n target.setAttribute('data-prepr-encoded', '');\n target.setAttribute('data-prepr-href', decoded.href);\n target.setAttribute('data-prepr-origin', decoded.origin);\n encodedCount++;\n }\n }\n }\n\n // Scan for elements with data-prepr-edit-target and check for encoded data in hidden spans\n const editTargetElements = document.querySelectorAll(\n '[data-prepr-edit-target]'\n );\n let editTargetCount = 0;\n editTargetElements.forEach(element => {\n if (element.hasAttribute('data-prepr-encoded')) {\n return; // Already processed\n }\n\n // Check all spans within the element for hidden ones with encoded data\n const allSpans = element.querySelectorAll('span');\n for (const span of Array.from(allSpans)) {\n const computedStyle = window.getComputedStyle(span);\n const isHidden =\n computedStyle.display === 'none' ||\n computedStyle.visibility === 'hidden';\n\n if (isHidden && span.textContent) {\n const decoded = decode(span.textContent);\n if (decoded?.href) {\n // Mark the parent element with data-prepr-edit-target, not the span\n element.setAttribute('data-prepr-encoded', '');\n element.setAttribute('data-prepr-href', decoded.href);\n element.setAttribute('data-prepr-origin', decoded.origin);\n editTargetCount++;\n debug.log('encoded element found via data-prepr-edit-target:', {\n href: decoded.href,\n origin: decoded.origin,\n });\n break; // Found encoded data, no need to check other spans\n }\n }\n }\n });\n\n debug.log(\n 'document scan complete, encoded',\n encodedCount,\n 'elements,',\n editTargetCount,\n 'via data-prepr-edit-target'\n );\n elementsRef.current = document.querySelectorAll(\n '[data-prepr-encoded], [data-prepr-edit-target][data-prepr-encoded]'\n );\n },\n [debug]\n );\n\n const setupMutationObserver = useCallback(\n (\n decode: (str: string | null) => DecodedData | null,\n onUpdate?: () => void\n ) => {\n if (observerRef.current) {\n observerRef.current.disconnect();\n }\n let pendingMutations: MutationRecord[] = [];\n let debounceTimeout: NodeJS.Timeout | null = null;\n const processMutations = () => {\n const allAddedNodes = new Set<Node>();\n pendingMutations.forEach(mutation => {\n mutation.addedNodes.forEach(node => allAddedNodes.add(node));\n // Include text changes in existing nodes\n if (mutation.type === 'characterData') {\n allAddedNodes.add(mutation.target);\n }\n });\n allAddedNodes.forEach(node => scanNode(node, decode));\n\n // Also scan for newly added elements with data-prepr-edit-target\n const newEditTargets = document.querySelectorAll(\n '[data-prepr-edit-target]:not([data-prepr-encoded])'\n );\n newEditTargets.forEach(element => {\n const allSpans = element.querySelectorAll('span');\n for (const span of Array.from(allSpans)) {\n const computedStyle = window.getComputedStyle(span);\n const isHidden =\n computedStyle.display === 'none' ||\n computedStyle.visibility === 'hidden';\n\n if (isHidden && span.textContent) {\n const decoded = decode(span.textContent);\n if (decoded?.href) {\n element.setAttribute('data-prepr-encoded', '');\n element.setAttribute('data-prepr-href', decoded.href);\n element.setAttribute('data-prepr-origin', decoded.origin);\n break;\n }\n }\n }\n });\n\n pendingMutations = [];\n elementsRef.current = document.querySelectorAll(\n '[data-prepr-encoded], [data-prepr-edit-target][data-prepr-encoded]'\n );\n if (onUpdate) onUpdate();\n };\n observerRef.current = new MutationObserver(mutations => {\n pendingMutations.push(...mutations);\n if (debounceTimeout) clearTimeout(debounceTimeout);\n debounceTimeout = setTimeout(processMutations, 100);\n });\n observerRef.current.observe(document.body, {\n childList: true,\n subtree: true,\n characterData: true,\n });\n debug.log('mutation observer set up');\n },\n [scanNode, debug]\n );\n\n const cleanup = useCallback(() => {\n if (observerRef.current) {\n observerRef.current.disconnect();\n observerRef.current = null;\n }\n const encodedElements = document.querySelectorAll('[data-prepr-encoded]');\n encodedElements.forEach(element => {\n element.removeAttribute('data-prepr-encoded');\n element.removeAttribute('data-prepr-href');\n element.removeAttribute('data-prepr-origin');\n });\n debug.log('cleaned up', encodedElements.length, 'encoded elements');\n elementsRef.current = undefined;\n }, [debug]);\n\n return {\n getElements,\n scanDocument,\n setupMutationObserver,\n cleanup,\n };\n}\n","import React, { useEffect, useState } from 'react';\nimport { useSearchParams } from 'next/navigation';\nimport Toolbar from './toolbar';\n\nexport default function ToolbarWrapper() {\n const searchParams = useSearchParams();\n const [isIframe, setIsIframe] = useState<boolean>(false);\n\n const handleKeyDown = (event: KeyboardEvent) => {\n const key = event.key.toLowerCase();\n // Check for the blocked shortcuts\n const isSaveShortcut = (event.ctrlKey || event.metaKey) && key === 's';\n const isPrintShortcut = (event.ctrlKey || event.metaKey) && key === 'p';\n const isAddressBarShortcut =\n (event.ctrlKey || event.metaKey) && key === 'l';\n if (isSaveShortcut || isPrintShortcut || isAddressBarShortcut) {\n event.preventDefault(); // Prevent the browser's default action\n }\n };\n\n useEffect(() => {\n const isIframe =\n typeof window !== 'undefined' && window?.parent !== window.self;\n if (isIframe) {\n setIsIframe(true);\n const previewBarMessage = {\n name: 'prepr_preview_bar',\n event: 'loaded',\n };\n window.parent.postMessage(previewBarMessage, '*');\n window.addEventListener('keydown', handleKeyDown);\n }\n return () => {\n if (isIframe) {\n window.removeEventListener('keydown', handleKeyDown);\n }\n };\n }, []);\n\n if (searchParams.get('prepr_hide_bar') === 'true' || isIframe) {\n return null;\n }\n\n return <Toolbar />;\n}\n","import React, { useEffect, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../../../utils';\nimport {\n useEditMode,\n useSelectedSegment,\n useSelectedVariant,\n usePreprStore,\n} from '../../../stores/prepr-store';\nimport { useModal } from '../../hooks/use-modal';\nimport { ToolbarContent } from './toolbar-content';\nimport { ToolbarButton } from './toolbar-button';\n\ninterface ToolbarProps {\n children?: React.ReactNode;\n}\n\nexport default function Toolbar({ children }: ToolbarProps) {\n const [isMounted, setIsMounted] = useState(false);\n const isBarVisible = usePreprStore(s => s.toolbarOpen);\n const setToolbarOpen = usePreprStore(s => s.setToolbarOpen);\n const editMode = useEditMode();\n const selectedSegment = useSelectedSegment();\n const selectedVariant = useSelectedVariant();\n const { contentRef, triggerRef } = useModal({\n isVisible: isBarVisible,\n onClose: () => setToolbarOpen(false),\n });\n\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n // Ref for the popup box\n const popupBoxRef = React.useRef<HTMLDivElement>(null);\n const [popupTop, setPopupTop] = React.useState<string | number>('');\n\n const updatePopupPosition = React.useCallback(() => {\n if (popupBoxRef.current && triggerRef.current) {\n const popupHeight = popupBoxRef.current.offsetHeight;\n const windowHeight = window.innerHeight;\n const triggerRect = triggerRef.current.getBoundingClientRect();\n // Center popup relative to the icon (trigger)\n const triggerCenter = triggerRect.top + triggerRect.height / 2;\n let top = triggerCenter - popupHeight / 2;\n // Clamp to leave at least 32px top and bottom\n top = Math.max(32, Math.min(top, windowHeight - popupHeight - 32));\n setPopupTop(top);\n }\n }, [triggerRef]);\n\n useEffect(() => {\n if (isBarVisible) {\n updatePopupPosition();\n window.addEventListener('resize', updatePopupPosition);\n return () => window.removeEventListener('resize', updatePopupPosition);\n }\n return undefined;\n }, [isBarVisible, updatePopupPosition]);\n\n const handleClick = () => {\n setToolbarOpen(!isBarVisible);\n };\n\n useEffect(() => {\n if (editMode) {\n setTimeout(() => {\n setToolbarOpen(false);\n }, 150);\n }\n }, [editMode]);\n\n // Auto-close modal when segment changes\n useEffect(() => {\n setTimeout(() => {\n setToolbarOpen(false);\n }, 150);\n }, [selectedSegment]);\n\n // Auto-close modal when variant changes\n useEffect(() => {\n setTimeout(() => {\n setToolbarOpen(false);\n }, 150);\n }, [selectedVariant]);\n\n const previewBarContent = (\n <>\n {isBarVisible && <div className=\"preview-bar-backdrop\" />}\n <div className={cn('preview-bar-container')}>\n {/* Button holder*/}\n <div className=\"p-pr-2\" ref={triggerRef}>\n <ToolbarButton onClick={handleClick} />\n </div>\n\n {/* Box holder */}\n <div\n ref={popupBoxRef}\n style={\n popupTop !== ''\n ? { top: popupTop, position: 'fixed', right: 0 }\n : {}\n }\n className={cn(\n 'preview-bar-popup',\n isBarVisible\n ? 'p-pointer-events-auto p-opacity-100'\n : 'p-pointer-events-none p-opacity-0'\n )}\n >\n {children || (\n <ToolbarContent onClose={handleClick} contentRef={contentRef} />\n )}\n </div>\n </div>\n </>\n );\n\n if (!isMounted) return null;\n\n return createPortal(previewBarContent, document.body);\n}\n\n// Compound component pattern\nToolbar.Content = ToolbarContent;\nToolbar.Button = ToolbarButton;\n","import { useEffect, useRef } from 'react';\n\ninterface UseModalProps {\n isVisible: boolean;\n onClose: () => void;\n}\n\nexport function useModal({ isVisible, onClose }: UseModalProps) {\n const contentRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (isVisible) {\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = '';\n }\n return () => {\n document.body.style.overflow = '';\n };\n }, [isVisible]);\n\n useEffect(() => {\n const handleEscapeKey = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n onClose();\n }\n };\n\n const handleClickOutside = (event: MouseEvent) => {\n // Check if the click target is part of a dropdown\n const isDropdownItem = (event.target as HTMLElement).closest(\n '[role=\"listbox\"], [role=\"option\"]'\n );\n if (isDropdownItem) {\n return;\n }\n\n if (\n contentRef.current &&\n !contentRef.current.contains(event.target as Node) &&\n triggerRef.current &&\n !triggerRef.current.contains(event.target as Node)\n ) {\n onClose();\n }\n };\n\n if (isVisible) {\n document.addEventListener('keydown', handleEscapeKey);\n document.addEventListener('mousedown', handleClickOutside);\n }\n\n return () => {\n document.removeEventListener('keydown', handleEscapeKey);\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [isVisible, onClose]);\n\n return {\n contentRef,\n triggerRef,\n };\n}\n","import React from 'react';\nimport { Logo } from '../ui';\nimport {\n SegmentSelector,\n VariantSelector,\n EditModeSelector,\n PreviewModeSelector,\n} from '../selectors';\nimport { ResetButton } from '../ui';\nimport { useTranslations } from '../../hooks/use-i18n';\n\ninterface ToolbarContentProps {\n onClose: () => void;\n contentRef: React.RefObject<HTMLDivElement | null>;\n}\n\nexport function ToolbarContent({ onClose, contentRef }: ToolbarContentProps) {\n const { t } = useTranslations();\n return (\n <div\n ref={contentRef}\n className=\"p-box-shadow p-right-0 p-z-[101] p-flex p-w-full p-flex-col p-gap-y-10 p-rounded-lg p-bg-primary-50 p-p-6 sm:p-w-[502px] sm:p-p-10\"\n >\n {/* Header */}\n <div className=\"p-flex p-items-center p-justify-between p-gap-2\">\n <div className=\"p-flex p-items-start p-gap-3\">\n <Logo />\n <div className=\"p-flex p-h-6 p-items-center p-rounded p-bg-primary-100 p-px-3 p-py-1 p-text-sm p-text-primary-700\">\n {t('common.toolbar')}\n </div>\n </div>\n <button\n onClick={onClose}\n className=\"p-flex p-h-8 p-w-8 p-cursor-pointer p-items-center p-justify-center p-rounded-md p-bg-primary-100 p-text-gray-700\"\n >\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 10 10\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M8.17578 1.07031C8.41016 0.816406 8.82031 0.816406 9.05469 1.07031C9.30859 1.30469 9.30859 1.71484 9.05469 1.94922L5.75391 5.25L9.05469 8.57031C9.30859 8.80469 9.30859 9.21484 9.05469 9.44922C8.82031 9.70312 8.41016 9.70312 8.17578 9.44922L4.875 6.14844L1.55469 9.44922C1.32031 9.70312 0.910156 9.70312 0.675781 9.44922C0.421875 9.21484 0.421875 8.80469 0.675781 8.57031L3.97656 5.25L0.675781 1.94922C0.421875 1.71484 0.421875 1.30469 0.675781 1.07031C0.910156 0.816406 1.32031 0.816406 1.55469 1.07031L4.875 4.37109L8.17578 1.07031Z\"\n fill=\"currentColor\"\n />\n </svg>\n </button>\n </div>\n\n {/* Personalized Content */}\n <div className=\"p-space-y-2\">\n <span className=\"p-text-sm p-text-grey-400\">\n {t('adaptiveContent.adaptiveContent')}\n </span>\n <div className=\"p-gap p-flex p-flex-wrap p-items-center p-justify-between p-gap-x-6 p-gap-y-2\">\n <h2 className=\"p-text-grey-800 p-font-semibold\">\n {t('adaptiveContent.enablePreview')}\n </h2>\n <PreviewModeSelector />\n </div>\n <div className=\"p-gap p-flex p-flex-wrap p-items-center p-justify-between p-gap-x-6 p-gap-y-2\">\n <h2 className=\"p-text-grey-800 p-font-semibold\">\n {t('adaptiveContent.segment')}\n </h2>\n <SegmentSelector />\n </div>\n <div className=\"p-gap p-flex p-flex-wrap p-items-center p-justify-between p-gap-x-6 p-gap-y-2\">\n <h2 className=\"p-text-grey-800 p-font-semibold\">\n {t('adaptiveContent.ABVariant')}\n </h2>\n <VariantSelector />\n </div>\n </div>\n\n {/* Collaboration */}\n <div className=\"p-space-y-2\">\n <span className=\"p-text-sm p-text-grey-400\">\n {t('editingTools.editingTools')}\n </span>\n <div className=\"p-gap p-flex p-flex-wrap p-items-center p-justify-between p-gap-x-6 p-gap-y-2\">\n <h2 className=\"p-text-grey-800 p-font-semibold\">\n {t('editingTools.editMode')}\n </h2>\n <EditModeSelector />\n </div>\n </div>\n\n <ResetButton />\n </div>\n );\n}\n","import React from 'react';\nimport { usePreprToolbar } from '../toolbar/toolbar-provider';\nimport {\n usePreviewMode,\n useSegments,\n usePreprStore,\n} from '../../../stores/prepr-store';\nimport XMark from '../icons/xmark';\nimport { usePathname, useRouter } from 'next/navigation';\nimport { cn } from '../../../utils';\nimport { useTranslations } from '../../hooks/use-i18n';\n\nexport default function StatusIndicatorPill() {\n const {\n selectedSegment,\n selectedVariant,\n emptySegment,\n isIframe,\n resetPersonalization,\n } = usePreprToolbar();\n\n const segments = useSegments();\n const { t } = useTranslations();\n\n const router = useRouter();\n const pathname = usePathname();\n const previewMode = usePreviewMode();\n const setPreviewMode = usePreprStore(state => state.setPreviewMode);\n\n const handleReset = () => {\n if (selectedSegment === emptySegment) {\n return;\n }\n\n resetPersonalization();\n // Set preview params to 'null' in the URL, then remove them for a clean URL\n const params = new URLSearchParams();\n params.set('prepr_preview_segment', 'null');\n params.set('prepr_preview_ab', 'null');\n\n // First, push the URL with reset params to trigger any listeners\n router.push(`${pathname}?${params.toString()}`, { scroll: false });\n router.refresh();\n\n // Then, push the clean URL (without the reset params)\n router.push(pathname, { scroll: false });\n router.refresh();\n };\n\n if (isIframe) {\n return null;\n }\n\n // Always show in preview mode; default segment label falls back to \"All other users\"\n const defaultSegmentName =\n segments.find(s => s._id === 'all_other_users')?.name ||\n t('adaptiveContent.allOtherUsers');\n const segmentLabel = !previewMode\n ? t('common.user')\n : selectedSegment && selectedSegment._id !== (emptySegment?._id ?? 'null')\n ? selectedSegment.name\n : defaultSegmentName;\n\n return (\n <div className=\"p-z-[998] p-flex p-gap-2\">\n <button\n type=\"button\"\n onClick={previewMode ? handleReset : () => setPreviewMode(true)}\n className={cn(\n 'p-flex p-items-center p-gap-2 p-rounded-full p-bg-primary-700 p-px-4 p-py-2 p-text-xs p-font-medium p-text-white p-shadow-lg',\n selectedSegment !== emptySegment &&\n 'p-cursor-pointer p-transition-colors p-duration-150 hover:p-bg-primary-800'\n )}\n >\n <span className=\"p-text-[10px] p-text-white/60\">\n {t('common.viewingAs')}\n </span>\n <span className=\"max-w-[120px] p-inline-block p-truncate\">\n {segmentLabel}\n </span>\n {previewMode && (\n <span className=\"max-w-[80px] p-inline-block p-truncate p-rounded p-bg-white/20 p-px-2\">\n {selectedVariant === 'B' ? 'B' : 'A'}\n </span>\n )}\n {selectedSegment !== emptySegment && (\n <XMark className=\"p-h-3 p-w-3 p-text-white\" />\n )}\n </button>\n </div>\n );\n}\n","import React from 'react';\n\nexport default function XMark(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M4.22 4.22a.75.75 0 0 1 1.06 0L8 6.94l2.72-2.72a.75.75 0 1 1 1.06 1.06L9.06 8l2.72 2.72a.75.75 0 1 1-1.06 1.06L8 9.06l-2.72 2.72a.75.75 0 1 1-1.06-1.06L6.94 8 4.22 5.28a.75.75 0 0 1 0-1.06z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n","'use client';\n\nimport { useMemo } from 'react';\nimport { t as baseT } from '../../i18n';\nimport { useLocale } from '../../stores/prepr-store';\n\nexport function useTranslations() {\n const locale = useLocale();\n\n const t = useMemo(() => {\n return (key: string, vars?: Record<string, string | number>) =>\n baseT(key, vars);\n }, [locale]);\n\n return { t, locale };\n}\n","{\n \"common\": {\n \"viewingAs\": \"Viewing as:\",\n \"user\": \"User\",\n \"off\": \"Off\",\n \"on\": \"On\",\n \"reset\": \"Reset\",\n \"toolbar\": \"Toolbar\"\n },\n \"adaptiveContent\": {\n \"adaptiveContent\": \"Adaptive content\",\n \"enablePreview\": \"Preview mode\",\n \"segment\": \"Segment\",\n \"ABVariant\": \"A/B variant\",\n \"chooseSegment\": \"Choose segment\",\n \"none\": \"No segments\",\n \"allOtherUsers\": \"All other users\",\n \"offDescription\": \"View the site as a real user (use cookies)\",\n \"onDescription\": \"Use the toolbar to simulate segments and A/B variants\"\n },\n \"editingTools\": {\n \"editingTools\": \"Editing tools\",\n \"editMode\": \"Edit mode\",\n \"ariaCloseEditMode\": \"Close edit mode\"\n }\n}\n","{\n \"common\": {\n \"viewingAs\": \"Bekijken als:\",\n \"user\": \"Gebruiker\",\n \"off\": \"Uit\",\n \"on\": \"Aan\",\n \"reset\": \"Resetten\",\n \"toolbar\": \"Toolbar\"\n },\n \"adaptiveContent\": {\n \"adaptiveContent\": \"Adaptieve inhoud\",\n \"enablePreview\": \"Preview modus\",\n \"segment\": \"Segment\",\n \"ABVariant\": \"A/B-variant\",\n \"chooseSegment\": \"Kies segment\",\n \"none\": \"Geen segmenten\",\n \"allOtherUsers\": \"Alle andere gebruikers\",\n \"offDescription\": \"Bekijk de site als een echte gebruiker (gebruik cookies)\",\n \"onDescription\": \"Gebruik de werkbalk om segmenten en A/B-varianten te simuleren\"\n },\n \"editingTools\": {\n \"editingTools\": \"Editing Tools\",\n \"editMode\": \"Edit mode\",\n \"ariaCloseEditMode\": \"Edit mode sluiten\"\n }\n}\n","import en from './locales/en.json';\nimport nl from './locales/nl.json';\nimport { usePreprStore } from '../stores/prepr-store';\n\nexport type Locale = 'en' | 'nl';\n\nconst dictionaries: Record<Locale, Record<string, any>> = {\n en: en as Record<string, any>,\n nl: nl as Record<string, any>,\n};\n\nfunction getDict(locale: string) {\n if (locale in dictionaries) return dictionaries[locale as Locale];\n return dictionaries.en;\n}\n\nfunction getFromPath(obj: any, path: string) {\n return path\n .split('.')\n .reduce((acc: any, key: string) => (acc ? acc[key] : undefined), obj);\n}\n\nfunction format(message: string, vars?: Record<string, string | number>) {\n if (!vars) return message;\n return Object.keys(vars).reduce(\n (acc, k) => acc.replace(new RegExp(`\\\\{${k}\\\\}`, 'g'), String(vars[k])),\n message\n );\n}\n\nexport function t(key: string, vars?: Record<string, string | number>): string {\n const { locale } = usePreprStore.getState();\n const dict = getDict(locale);\n const msg = getFromPath(dict, key);\n if (typeof msg === 'string') return format(msg, vars);\n // Fallback to key if not found\n return key;\n}\n","import React from 'react';\nimport { usePreprToolbar } from '../toolbar/toolbar-provider';\nimport XMark from '../icons/xmark';\nimport { useTranslations } from '../../hooks/use-i18n';\n\nexport default function CloseEditModePill() {\n const { editMode, setEditMode, isIframe } = usePreprToolbar();\n const { t } = useTranslations();\n if (!editMode || isIframe) {\n return null;\n }\n\n return (\n <div className=\"p-z-[999] p-flex\">\n <button\n type=\"button\"\n onClick={() => setEditMode && setEditMode(false)}\n className=\"p-flex p-items-center p-gap-2 p-rounded-full p-bg-primary-50 p-px-4 p-py-2 p-text-xs p-font-medium p-text-gray-800 p-shadow-lg p-transition-colors p-duration-150 hover:p-bg-primary-100\"\n aria-label={t('editingTools.ariaCloseEditMode')}\n >\n <span>{t('editingTools.editMode')}</span>\n <XMark className=\"transition-colors duration-150 p-h-4 p-w-4 p-text-gray-500 hover:p-text-gray-700\" />\n </button>\n </div>\n );\n}\n","import React from 'react';\nimport { usePathname, useRouter } from 'next/navigation';\nimport { cn } from '../../../utils';\nimport { usePreprToolbar } from '../toolbar/toolbar-provider';\nimport Rotate from '../icons/rotate';\nimport { useTranslations } from '../../hooks/use-i18n';\nexport default function ResetButton() {\n const router = useRouter();\n const {\n resetAll,\n selectedVariant,\n selectedSegment,\n setEditMode,\n isPreviewMode,\n } = usePreprToolbar();\n const pathname = usePathname();\n const enabled = selectedSegment._id !== 'null' || selectedVariant !== 'null';\n const { t } = useTranslations();\n const handleClick = () => {\n resetAll();\n setEditMode(false);\n\n // Set preview params to 'null' in the URL, then remove them for a clean URL\n const params = new URLSearchParams();\n params.set('prepr_preview_segment', 'null');\n params.set('prepr_preview_ab', 'null');\n\n // First, push the URL with reset params to trigger any listeners\n router.push(`${pathname}?${params.toString()}`, { scroll: false });\n router.refresh();\n\n // Then, push the clean URL (without the reset params)\n router.push(pathname, { scroll: false });\n router.refresh();\n };\n\n const classes = cn(\n 'p-py-2 p-px-3 p-flex p-justify-center p-gap-2 p-items-center p-rounded-md p-regular-text p-h-10 p-w-full md:p-w-[108px]',\n enabled &&\n 'p-bg-secondary-400 hover:p-secondary-500 p-cursor-pointer p-text-white',\n !enabled && 'p-bg-grey-400 p-text-gray-500',\n !isPreviewMode && 'p-cursor-not-allowed'\n );\n\n return (\n <button onClick={handleClick} className={classes} disabled={!enabled}>\n <Rotate />\n <span className=\"p-block sm:p-hidden lg:p-block\">\n {t('common.reset')}\n </span>\n </button>\n );\n}\n","import React from 'react';\n\nexport default function Rotate() {\n return (\n <svg\n width=\"15\"\n height=\"14\"\n viewBox=\"0 0 15 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M3.37109 5.80078C3.20703 6.26562 2.6875 6.51172 2.25 6.34766C1.78516 6.18359 1.53906 5.69141 1.70312 5.22656C2.00391 4.37891 2.49609 3.58594 3.15234 2.92969C5.55859 0.550781 9.41406 0.550781 11.8203 2.92969L12.2852 3.42188V2C12.2852 1.53516 12.6953 1.125 13.1602 1.125C13.6523 1.125 14.0352 1.53516 14.0352 2V5.5C14.0352 5.99219 13.6523 6.375 13.1602 6.375H9.6875C9.19531 6.375 8.8125 5.99219 8.8125 5.5C8.8125 5.03516 9.19531 4.625 9.6875 4.625H11.0547L10.5898 4.16016C8.86719 2.46484 6.10547 2.46484 4.38281 4.16016C3.91797 4.65234 3.5625 5.19922 3.37109 5.80078ZM1.56641 8.17969C1.59375 8.15234 1.64844 8.15234 1.67578 8.15234C1.73047 8.15234 1.75781 8.125 1.8125 8.125H5.3125C5.77734 8.125 6.1875 8.53516 6.1875 9C6.1875 9.49219 5.77734 9.875 5.3125 9.875H3.91797L4.38281 10.3672C6.10547 12.0625 8.86719 12.0625 10.5898 10.3672C11.0547 9.875 11.4102 9.32812 11.6016 8.72656C11.7656 8.26172 12.2852 8.01562 12.7227 8.17969C13.1875 8.34375 13.4336 8.83594 13.2695 9.30078C12.9688 10.1484 12.4766 10.9141 11.8203 11.5977C9.41406 13.9766 5.55859 13.9766 3.15234 11.5977L2.6875 11.1055V12.5C2.6875 12.9922 2.27734 13.375 1.8125 13.375C1.32031 13.375 0.9375 12.9922 0.9375 12.5V9.02734C0.9375 8.97266 0.9375 8.91797 0.9375 8.89062C0.9375 8.83594 0.9375 8.80859 0.964844 8.78125C0.992188 8.64453 1.07422 8.50781 1.18359 8.39844C1.29297 8.28906 1.42969 8.20703 1.56641 8.17969Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n","import React from 'react';\n\nconst Icon: React.FC<React.SVGProps<SVGSVGElement>> = props => {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M9.05365 0C5.71033 0 3 2.75516 3 6.15377V15.6309C3 15.8346 3.16248 16 3.36328 16H5.05838C5.25898 16 5.42166 15.8346 5.42166 15.6309V11.0772C6.43342 11.8498 7.69104 12.3077 9.05385 12.3077C12.397 12.3077 15.1077 9.55259 15.1077 6.15397C15.1075 2.75516 12.397 0 9.05365 0ZM9.05365 9.84623C7.04766 9.84623 5.42146 8.19314 5.42146 6.15377C5.42146 4.1146 7.04766 2.46151 9.05365 2.46151C11.0596 2.46151 12.686 4.1146 12.686 6.15377C12.686 8.19293 11.0596 9.84623 9.05365 9.84623Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n};\n\nexport default Icon;\n","import React from 'react';\n\nconst Logo: React.FC<React.SVGProps<SVGSVGElement>> = props => {\n return (\n <svg\n width=\"102\"\n height=\"28\"\n viewBox=\"0 0 102 28\"\n fill=\"none\"\n {...props}\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M39.2674 2.19699C39.2757 2.18321 39.2839 2.16943 39.291 2.15528L39.2939 2.15057L39.2935 2.1502C39.3379 2.06208 39.3633 1.96308 39.3633 1.85754C39.3633 1.62109 39.2374 1.41474 39.0507 1.30231C39.0485 1.30014 39.0467 1.29651 39.0446 1.29578C35.1089 -0.88088 29.8537 -0.36627 26.3741 3.2632C24.4207 5.3006 23.4231 7.92116 23.3716 10.5544H23.3684V20.893C23.3684 21.2495 23.6538 21.5389 24.0058 21.5389H26.98C27.332 21.5389 27.6174 21.2495 27.6174 20.893V10.7698H27.6192C27.6192 9.14658 28.2169 7.52187 29.4209 6.26599C31.5699 4.02478 34.7423 3.8565 36.9299 5.03659C36.9367 5.04058 36.9439 5.04384 36.9507 5.04747C36.9557 5.05001 36.9607 5.05254 36.9657 5.05508H36.9664C37.0494 5.09497 37.1417 5.11782 37.2393 5.11782C37.4879 5.11782 37.7032 4.97276 37.808 4.76206L39.2674 2.19699Z\"\n fill=\"#4338CA\"\n />\n <path\n d=\"M10.6216 0.000244141C4.75551 0.000244141 0 4.82177 0 10.7693V27.3543C0 27.7108 0.285079 28.0002 0.637405 28.0002H3.61161C3.96358 28.0002 4.24902 27.7108 4.24902 27.3543V19.3853C6.02424 20.7373 8.23084 21.5388 10.622 21.5388C16.4878 21.5388 21.244 16.7173 21.244 10.7697C21.2437 4.82177 16.4878 0.000244141 10.6216 0.000244141ZM10.6216 17.2311C7.10196 17.2311 4.24866 14.3382 4.24866 10.7693C4.24866 7.20079 7.10196 4.30788 10.6216 4.30788C14.1413 4.30788 16.995 7.20079 16.995 10.7693C16.995 14.3379 14.1413 17.2311 10.6216 17.2311Z\"\n fill=\"#4338CA\"\n />\n <path\n d=\"M73.259 0C67.3932 0 62.6373 4.82152 62.6373 10.7691V27.3541C62.6373 27.7106 62.9228 28 63.2747 28H66.2489C66.6009 28 66.8863 27.7106 66.8863 27.3541V19.3854C68.6616 20.7374 70.8682 21.5389 73.2593 21.5389C79.1251 21.5389 83.8813 16.7174 83.8813 10.7698C83.881 4.82152 79.1248 0 73.259 0ZM73.259 17.2309C69.7393 17.2309 66.886 14.338 66.886 10.7691C66.886 7.20055 69.7393 4.30764 73.259 4.30764C76.7783 4.30764 79.632 7.20055 79.632 10.7691C79.632 14.3376 76.7783 17.2309 73.259 17.2309Z\"\n fill=\"#4338CA\"\n />\n <path\n d=\"M60.439 10.9845C60.439 5.03657 55.6827 0 49.817 0C43.9508 0 39.1953 4.82152 39.1953 10.7691C39.1953 16.7167 43.9508 21.5382 49.817 21.5382C53.1374 21.5382 55.8763 19.9954 57.5939 18.1031C57.5939 18.1031 57.5942 18.1027 57.5946 18.1024C57.596 18.1009 57.5975 18.0995 57.5985 18.098C57.7112 17.9812 57.7806 17.822 57.7806 17.6461C57.7806 17.4601 57.7026 17.2929 57.5785 17.1751V17.1743L57.5696 17.1671C57.5535 17.1522 57.5367 17.1384 57.5188 17.1254L55.2464 15.2501C55.1344 15.1503 54.9877 15.0891 54.8264 15.0891C54.6261 15.0891 54.4476 15.183 54.331 15.3291C53.3216 16.3707 51.7256 17.2309 49.8166 17.2309C46.2969 17.2309 43.4436 14.338 43.4436 10.7691C43.4436 7.20055 46.2969 4.30764 49.8166 4.30764C52.5909 4.30764 54.9505 6.10605 55.8255 8.61527H50.3474C49.9954 8.61527 49.71 8.90467 49.71 9.26152V12.277C49.71 12.6339 49.9954 12.9233 50.3474 12.9233H59.5884C59.6059 12.9233 59.6227 12.9218 59.6399 12.9207C59.6571 12.9222 59.6742 12.9233 59.6914 12.9233C59.9743 12.9233 60.214 12.7361 60.2973 12.4772L60.3045 12.4783C60.308 12.4551 60.3116 12.4326 60.3152 12.4097C60.3199 12.3876 60.3234 12.3655 60.3256 12.3427C60.4003 11.861 60.439 11.5172 60.439 10.9845Z\"\n fill=\"#4338CA\"\n />\n <path\n d=\"M101.928 2.15406L101.931 2.14934L101.93 2.14898C101.974 2.06085 102 1.96185 102 1.85632C102 1.61987 101.874 1.41351 101.687 1.30109C101.685 1.29891 101.683 1.29529 101.681 1.29456C97.7455 -0.882101 92.4903 -0.367491 89.0107 3.26198C87.0573 5.29938 86.0597 7.91993 86.0082 10.5532H86.005V20.8918C86.005 21.2483 86.2904 21.5377 86.6424 21.5377H89.6166C89.9686 21.5377 90.254 21.2483 90.254 20.8918V10.7686H90.2555C90.2555 9.14535 90.8532 7.52065 92.0571 6.26477C94.2062 4.02355 97.3785 3.85528 99.5662 5.03537C99.573 5.03936 99.5801 5.04262 99.5869 5.04624C99.5919 5.04878 99.5969 5.05132 99.6019 5.05386H99.6027C99.6856 5.09375 99.7779 5.11696 99.8756 5.11696C100.124 5.11696 100.339 4.9719 100.444 4.7612L101.905 2.19685C101.913 2.18235 101.92 2.16856 101.928 2.15406Z\"\n fill=\"#4338CA\"\n />\n </svg>\n );\n};\n\nexport default Logo;\n","'use client';\n\nimport React from 'react';\nimport Script from 'next/script';\n\ninterface PreprTrackingPixelProps {\n /**\n * The Prepr access token (without the full GraphQL URL)\n * Extract this from your PREPR_GRAPHQL_URL: https://graphql.prepr.io/YOUR_ACCESS_TOKEN\n */\n accessToken?: string;\n}\n\n/**\n * PreprTrackingPixel component for user tracking\n *\n * This component loads the Prepr tracking script and initializes tracking.\n * It should be included in your application to track user interactions.\n *\n * @param accessToken - Your Prepr access token\n *\n * @example\n * ```tsx\n * // In your layout or page\n *\n * import { PreprTrackingPixel } from '@preprio/prepr-nextjs/react'\n *\n * // Extract token from PREPR_GRAPHQL_URL\n * const accessToken = extractAccessToken(process.env.PREPR_GRAPHQL_URL!)\n *\n * export default function Layout({ children }) {\n * return (\n * <html>\n * <head>\n * <PreprTrackingPixel accessToken={accessToken!} />\n * </head>\n * <body>{children}</body>\n * </html>\n * )\n * }\n * ```\n */\nexport default function PreprTrackingPixel({\n accessToken,\n}: PreprTrackingPixelProps) {\n if (!accessToken) {\n console.warn(\n 'PreprTrackingPixel: accessToken is required for tracking to work'\n );\n return null;\n }\n\n return (\n <Script\n id=\"prepr-tracking-pixel\"\n dangerouslySetInnerHTML={{\n __html: `\n ! function (e, t, p, r, n, a, s) {\n e[r] || ((n = e[r] = function () {\n n.process ? n.process.apply(n, arguments) : n.queue.push(arguments)\n }).queue = [], n.t = +new Date, (a = t.createElement(p)).async = 1, a.src = \"https://cdn.tracking.prepr.io/js/prepr_v2.min.js?t=\" + 864e5 * Math.ceil(new Date / 864e5), (s = t.getElementsByTagName(p)[0]).parentNode.insertBefore(a, s))\n }(window, document, \"script\", \"prepr\"), prepr(\"init\", \"${accessToken}\", { destinations: { googleTagManager: true } }), prepr(\"event\", \"pageload\");`,\n }}\n />\n );\n}\n","import React from 'react';\nimport { PreprSegment } from '../../../types';\nimport {\n useSegments,\n useSelectedSegment,\n usePreprStore,\n usePreviewMode,\n} from '../../../stores/prepr-store';\nimport { usePathname, useRouter } from 'next/navigation';\nimport {\n Listbox,\n ListboxButton,\n ListboxOption,\n ListboxOptions,\n} from '@headlessui/react';\nimport SortDown from '../icons/sort-down';\nimport { cn } from '../../../utils';\nimport { useTranslations } from '../../hooks/use-i18n';\n\nexport default function SegmentSelector() {\n const segments = useSegments();\n const selectedSegment = useSelectedSegment();\n const setSelectedSegment = usePreprStore(state => state.setSelectedSegment);\n const previewMode = usePreviewMode();\n const { t } = useTranslations();\n\n const pathname = usePathname();\n const router = useRouter();\n\n const updateSelectedSegment = (value: string) => {\n const params = new URLSearchParams(window.location.search);\n const segment = segments.find(segment => segment._id === value);\n\n if (segment) {\n setSelectedSegment(segment);\n params.set('prepr_preview_segment', value);\n\n router.push(`${pathname}?${params.toString()}`, {\n scroll: false,\n });\n router.refresh();\n }\n };\n\n return (\n <Listbox\n value={selectedSegment._id}\n onChange={(value: string) => updateSelectedSegment(value)}\n >\n <ListboxButton\n as=\"button\"\n disabled={!(segments && segments.length > 0) || !previewMode}\n className=\"p-regular-text p-flex p-h-10 p-w-[240px] p-shrink-0 p-flex-nowrap p-items-center p-gap-2 p-overflow-hidden p-text-ellipsis p-text-nowrap p-rounded-lg p-border p-border-gray-300 p-bg-white p-px-2 p-text-gray-500 disabled:p-cursor-not-allowed disabled:p-bg-gray-200 disabled:p-text-gray-400 data-[open]:p-rounded-b-none data-[open]:p-border-b-white md:p-px-4\"\n >\n <div\n style={{\n textWrap: 'nowrap',\n textOverflow: 'ellipsis',\n textAlign: 'left',\n }}\n className=\"p-mr-auto p-w-full p-overflow-hidden\"\n >\n {segments.length > 0\n ? selectedSegment._id === 'null'\n ? t('adaptiveContent.chooseSegment')\n : selectedSegment.name\n : t('adaptiveContent.none')}\n </div>\n <div className=\"p-text-gray-800\">\n <SortDown />\n </div>\n </ListboxButton>\n <ListboxOptions\n anchor=\"bottom start\"\n className=\"p-no-scrollbar p-z-[9999] !p-max-h-[300px] p-w-[240px] p-rounded-b-md p-border-x p-border-b p-border-gray-300 p-bg-white p-shadow-xl\"\n >\n {segments?.map((segment: PreprSegment) => (\n <ListboxOption\n key={segment._id}\n value={segment._id}\n className={cn(\n 'p-regular-text p-z-[100] p-flex p-w-full p-items-center p-p-2 p-px-4 hover:p-cursor-pointer',\n segment._id === selectedSegment._id\n ? 'p-bg-indigo-50 p-text-indigo-700'\n : 'p-bg-white p-text-gray-900 hover:p-bg-gray-100'\n )}\n >\n <div\n style={{\n textWrap: 'nowrap',\n textOverflow: 'ellipsis',\n textAlign: 'left',\n }}\n className=\"p-mr-auto p-w-full p-overflow-hidden\"\n >\n {segment.name}\n </div>\n </ListboxOption>\n ))}\n </ListboxOptions>\n </Listbox>\n );\n}\n","import React from 'react';\n\nexport default function SortDown(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg\n width=\"9\"\n height=\"6\"\n viewBox=\"0 0 9 6\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M5.24274 5.36865C4.91462 5.72412 4.3404 5.72412 4.01227 5.36865L0.512273 1.86865C0.266179 1.62256 0.184148 1.23975 0.320867 0.911621C0.457586 0.583496 0.785711 0.364746 1.14118 0.364746H8.14118C8.46931 0.364746 8.79743 0.583496 8.93415 0.911621C9.07087 1.23975 8.98884 1.62256 8.74274 1.86865L5.24274 5.36865Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n","import React from 'react';\nimport { useSelectedVariant, usePreprStore } from '../../../stores/prepr-store';\nimport { usePathname, useRouter } from 'next/navigation';\nimport RadioSelector from './radio-selector';\nimport { usePreviewMode } from '../../../stores/prepr-store';\n\nexport default function VariantSelector() {\n const selectedVariant = useSelectedVariant();\n const setSelectedVariant = usePreprStore(state => state.setSelectedVariant);\n\n const pathname = usePathname();\n const router = useRouter();\n const previewMode = usePreviewMode();\n\n const updateSelectedVariant = (value: string | boolean) => {\n const params = new URLSearchParams(window.location.search);\n setSelectedVariant(String(value));\n params.set('prepr_preview_ab', String(value));\n\n router.push(`${pathname}?${params.toString()}`, {\n scroll: false,\n });\n router.refresh();\n };\n\n const options = [\n { value: 'A', label: 'A', width: 'p-w-[82px]' },\n { value: 'B', label: 'B', width: 'p-w-[82px]' },\n ];\n\n // Always show 'A' as active when state is not 'B'\n const displayValue = selectedVariant === 'B' ? 'B' : 'A';\n\n return (\n <RadioSelector\n value={displayValue}\n onChange={updateSelectedVariant}\n options={options}\n disabled={!previewMode}\n />\n );\n}\n","import React from 'react';\nimport { Radio, RadioGroup } from '@headlessui/react';\nimport { cn } from '../../../utils';\nimport Tooltip from '../ui/tooltip';\n\ninterface RadioOption {\n value: string | boolean;\n label: string;\n width?: string;\n title?: string;\n}\n\ninterface RadioSelectorProps {\n value: string | boolean;\n onChange: (value: string | boolean) => void;\n options: RadioOption[];\n disabled?: boolean;\n}\n\nexport default function RadioSelector({\n value,\n onChange,\n options,\n disabled = false,\n}: RadioSelectorProps) {\n return (\n <RadioGroup\n className={cn(\n 'p-flex p-h-10 p-items-center p-gap-1 p-rounded-lg p-border p-border-gray-300 p-bg-white p-p-1',\n disabled && 'p-cursor-not-allowed p-opacity-50'\n )}\n value={value}\n onChange={onChange}\n disabled={disabled}\n >\n {options.map(option => {\n const radio = (\n <Radio\n key={String(option.value)}\n value={option.value}\n className={cn(\n option.width,\n 'p-regular-text p-flex p-h-8 p-cursor-pointer p-items-center p-justify-center p-whitespace-nowrap p-rounded-md p-px-4.5 p-py-2 p-text-center p-text-gray-900 p-transition-all p-duration-200 p-ease-in-out',\n disabled && 'p-pointer-events-none',\n option.value === false ||\n option.value === 'null' ||\n option.value === 'off'\n ? 'data-[checked]:p-bg-gray-800 data-[checked]:p-text-white'\n : 'data-[checked]:p-bg-indigo-600 data-[checked]:p-text-white',\n option.value === value && 'p-drop-shadow-3'\n )}\n >\n {option.label}\n </Radio>\n );\n\n return option.title ? (\n <Tooltip\n key={String(option.value)}\n content={option.title}\n wrapperClassName={option.width}\n >\n {radio}\n </Tooltip>\n ) : (\n radio\n );\n })}\n </RadioGroup>\n );\n}\n","import React, { useEffect, useId, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\ninterface TooltipProps {\n content: React.ReactNode;\n children: React.ReactNode;\n side?: 'top' | 'bottom';\n wrapperClassName?: string;\n}\n\nexport default function Tooltip({\n content,\n children,\n side = 'top',\n wrapperClassName,\n}: TooltipProps) {\n const [open, setOpen] = useState(false);\n const [arrowX, setArrowX] = useState<number | null>(null);\n const id = useId();\n const tipRef = useRef<HTMLDivElement | null>(null);\n const triggerRef = useRef<HTMLSpanElement | null>(null);\n\n // Position the fixed tooltip relative to the trigger and viewport\n useEffect(() => {\n if (!open) return;\n const position = () => {\n const el = tipRef.current;\n const trigger = triggerRef.current;\n if (!el || !trigger) return;\n // Let the tooltip size to content before measuring\n el.style.top = '0px';\n el.style.left = '0px';\n el.style.visibility = 'hidden';\n requestAnimationFrame(() => {\n const tip = el.getBoundingClientRect();\n const tri = trigger.getBoundingClientRect();\n const padding = 8;\n const centerX = tri.left + tri.width / 2;\n const spaceAbove = tri.top - padding;\n const spaceBelow = window.innerHeight - tri.bottom - padding;\n const placeTop =\n (side === 'top' && tip.height + padding <= spaceAbove) ||\n tip.height + padding > spaceBelow;\n const top = placeTop ? tri.top - tip.height - 8 : tri.bottom + 8;\n let left = centerX - tip.width / 2;\n if (left < padding) left = padding;\n if (left + tip.width > window.innerWidth - padding)\n left = window.innerWidth - padding - tip.width;\n const arrow = Math.max(10, Math.min(centerX - left, tip.width - 10));\n // Apply\n el.style.top = `${top}px`;\n el.style.left = `${left}px`;\n el.style.visibility = '';\n setArrowX(arrow);\n });\n };\n position();\n window.addEventListener('resize', position);\n return () => window.removeEventListener('resize', position);\n }, [open, side]);\n\n return (\n <span\n className={'p-relative p-flex p-items-center ' + (wrapperClassName || '')}\n ref={triggerRef}\n onMouseEnter={() => setOpen(true)}\n onMouseLeave={() => setOpen(false)}\n onFocus={() => setOpen(true)}\n onBlur={() => setOpen(false)}\n >\n {children}\n {open &&\n createPortal(\n <div\n role=\"tooltip\"\n id={id}\n ref={tipRef}\n className=\"p-fixed p-z-[10002] p-w-auto p-break-words p-rounded-md p-bg-gray-900 p-px-3 p-py-2 p-text-xs p-font-medium p-text-white p-shadow-xl\"\n style={{\n top: side === 'top' ? '0px' : '0px', // positioned after measure in effect below\n left: '0px',\n maxWidth: 'min(420px, calc(100vw - 16px))',\n }}\n >\n {content}\n <span\n className=\"p-absolute p-h-0 p-w-0\"\n style={{\n top: '100%',\n left: `${arrowX ?? 0}px`,\n transform: 'translateX(-50%)',\n borderLeft: '6px solid transparent',\n borderRight: '6px solid transparent',\n borderTop: '6px solid #111827',\n }}\n />\n </div>,\n document.body\n )}\n </span>\n );\n}\n","import React from 'react';\nimport { useEditMode, usePreprStore } from '../../../stores/prepr-store';\nimport RadioSelector from './radio-selector';\nimport { useTranslations } from '../../hooks/use-i18n';\n\nexport default function EditModeSelector() {\n const editMode = useEditMode();\n const setEditMode = usePreprStore(state => state.setEditMode);\n const { t } = useTranslations();\n const updateEditMode = (value: string | boolean) => {\n setEditMode(value === 'true' || value === true);\n };\n\n const options = [\n { value: 'false', label: t('common.off') },\n { value: 'true', label: t('common.on') },\n ];\n\n return (\n <RadioSelector\n options={options}\n value={editMode.toString()}\n onChange={updateEditMode}\n />\n );\n}\n","import React from 'react';\nimport { usePreviewMode, usePreprStore } from '../../../stores/prepr-store';\nimport RadioSelector from './radio-selector';\nimport { useTranslations } from '../../hooks/use-i18n';\n\nexport default function PreviewModeSelector() {\n const previewMode = usePreviewMode();\n const setPreviewMode = usePreprStore(state => state.setPreviewMode);\n const { t } = useTranslations();\n const updatePreviewMode = (value: string | boolean) => {\n setPreviewMode(value === 'true' || value === true);\n };\n\n const options = [\n {\n value: 'false',\n label: t('common.off'),\n title: t('adaptiveContent.offDescription'),\n },\n {\n value: 'true',\n label: t('common.on'),\n title: t('adaptiveContent.onDescription'),\n },\n ];\n\n return (\n <RadioSelector\n options={options}\n value={previewMode.toString()}\n onChange={updatePreviewMode}\n />\n );\n}\n","import React from 'react';\nimport { cn } from '../../../utils';\nimport { Icon } from '../ui';\n\ninterface ToolbarButtonProps {\n onClick: () => void;\n className?: string;\n}\n\nexport function ToolbarButton({ onClick, className }: ToolbarButtonProps) {\n return (\n <button\n onClick={onClick}\n className={cn(\n 'cursor-pointer p-z-50 p-flex p-size-9 p-items-center p-justify-center p-rounded-full p-bg-primary-700',\n className\n )}\n >\n <Icon className=\"p-text-white\" />\n </button>\n );\n}\n","import React from 'react';\nimport { StatusIndicatorPill, CloseEditModePill } from '../ui';\n\nexport default function ToolbarIndicatorWrapper() {\n return (\n <div className=\"p-fixed p-bottom-6 p-right-6 p-z-[999] p-flex p-gap-3\">\n <StatusIndicatorPill />\n <CloseEditModePill />\n </div>\n );\n}\n"],"mappings":"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","names":["react_exports","__export","PreprToolbar","PreprToolbarProvider","PreprTrackingPixel","usePreprToolbar","useTranslations","__toCommonJS","import_react","import_react","StegaErrorBoundary","props","error","errorInfo","_a","React","import_react","import_zustand","import_middleware","import_clsx","import_tailwind_merge","StegaError","createErrorInfo","type","context","error","additionalData","handleStegaError","errorInfo","handleDOMError","DOMService","tag","className","element","error","handleDOMError","styles","property","value","rect","x1","y1","x2","y2","pointX","pointY","elements","closestElement","minDistance","distance","event","handler","options","DebugLogger","_DebugLogger","options","__spreadValues","_a","_b","globalDebugLogger","message","args","prefix","scopeName","__spreadProps","initDebugLogger","enabled","createScopedLogger","scopeName","DebugLogger","throttle","func","delay","timeoutId","lastExecTime","throttledFunc","args","currentTime","timeSinceLastExec","createElementCache","query","ttl","cache","lastCacheTime","now","cn","inputs","sendPreprEvent","event","data","message","__spreadValues","usePreprStore","set","get","locale","segment","sendPreprEvent","initialSegments","activeSegment","segmentList","emptySegment","selectedSegment","segmentData","variant","activeVariant","mode","isIframe","setEditMode","setToolbarOpen","expires","open","emptyVariant","setSelectedSegment","setSelectedVariant","props","initializeSegments","initializeVariant","useSegments","state","useSelectedSegment","useSelectedVariant","useEditMode","usePreviewMode","usePreprStore","state","useLocale","PreprStoreInitializer","children","props","initialize","usePreprStore","state","setIsIframe","editMode","setEditMode","setToolbarOpen","handleEscapeKey","event","getCookie","name","_a","parts","cookieValue","toolbarOpenCookie","React","import_react","useScrollPosition","debug","createScopedLogger","sendPreprEvent","parentOrigin","handleMessage","evt","_a","_b","_c","currentScrollY","PreprToolbarProvider","children","props","options","_a","debugEnabled","initDebugLogger","useScrollPosition","setLocale","usePreprStore","s","normalized","l","supported","match","React","StegaErrorBoundary","PreprStoreInitializer","usePreprToolbar","selectedSegment","segments","emptySegment","setSelectedSegment","selectedVariant","emptyVariant","setSelectedVariant","editMode","setEditMode","isIframe","resetPersonalizationStore","resetAllStore","previewMode","usePreviewMode","resetPersonalization","resetAll","import_react","import_react","import_react","import_stega","decodeLogger","createScopedLogger","decode","str","decoded","e","regex","match","decodedMatch","handleStegaError","useStegaOverlay","debug","overlayRef","tooltipRef","hideTimeoutRef","currentElementRef","createOverlay","overlay","DOMService","tooltip","showOverlay","element","rect","href","origin","isCompact","top","left","minTop","maxTop","minLeft","maxLeft","hideOverlay","cleanup","import_react","useStegaProximity","debug","createScopedLogger","highlightedElementsRef","getEncodedElements","createElementCache","visibleElementsRef","observerRef","refreshObserving","visible","entries","entry","el","nodes","e","stopObserving","updateElementGradients","cursorX","cursorY","candidates","newHighlightedElements","highlightedCount","element","rect","distanceLeft","distanceRight","distanceTop","distanceBottom","distance","relativeX","relativeY","baseGradientSize","distanceScale","gradientSize","clearAllHighlights","highlightedElements","clearedCount","import_react","useStegaElements","debug","createScopedLogger","elementsRef","observerRef","getElements","scanNode","node","decode","_a","_b","decoded","target","i","scanDocument","walker","textNode","encodedCount","editTargetElements","editTargetCount","element","allSpans","span","computedStyle","setupMutationObserver","onUpdate","pendingMutations","debounceTimeout","processMutations","allAddedNodes","mutation","mutations","cleanup","encodedElements","useStegaScan","editMode","debug","createScopedLogger","isInitializedRef","currentElementRef","hideTimeoutRef","createOverlay","showOverlay","hideOverlay","cleanupOverlay","decode","useStegaOverlay","updateElementGradients","clearAllHighlights","refreshObserving","stopObserving","useStegaProximity","getElements","scanDocument","setupMutationObserver","cleanupElements","useStegaElements","throttledMouseMove","throttle","e","mouseEvent","target","encodedElement","handleTooltipMouseEnter","handleTooltipMouseLeave","DOMService","tooltip","elements","import_react","import_navigation","import_react","import_react_dom","import_react","useModal","isVisible","onClose","contentRef","triggerRef","handleEscapeKey","event","handleClickOutside","import_react","import_react","import_react","XMark","props","React","__spreadValues","import_navigation","import_react","en_default","nl_default","dictionaries","en_default","nl_default","getDict","locale","getFromPath","obj","path","acc","key","format","message","vars","k","t","usePreprStore","dict","msg","useTranslations","locale","useLocale","key","vars","t","StatusIndicatorPill","_a","_b","selectedSegment","selectedVariant","emptySegment","isIframe","resetPersonalization","usePreprToolbar","segments","useSegments","t","useTranslations","router","pathname","previewMode","usePreviewMode","setPreviewMode","usePreprStore","state","handleReset","params","defaultSegmentName","s","segmentLabel","React","cn","XMark","import_react","CloseEditModePill","editMode","setEditMode","isIframe","usePreprToolbar","t","useTranslations","React","XMark","import_react","import_navigation","import_react","Rotate","React","ResetButton","router","resetAll","selectedVariant","selectedSegment","setEditMode","isPreviewMode","usePreprToolbar","pathname","enabled","t","useTranslations","handleClick","params","classes","cn","React","Rotate","import_react","Icon","props","React","__spreadValues","icon_default","import_react","Logo","props","React","__spreadProps","__spreadValues","logo_default","import_react","import_script","PreprTrackingPixel","accessToken","React","Script","import_react","import_navigation","import_react","import_react","SortDown","props","React","__spreadValues","SegmentSelector","segments","useSegments","selectedSegment","useSelectedSegment","setSelectedSegment","usePreprStore","state","previewMode","usePreviewMode","t","useTranslations","pathname","router","updateSelectedSegment","value","params","segment","React","SortDown","cn","import_react","import_navigation","import_react","import_react","import_react_dom","Tooltip","content","children","side","wrapperClassName","open","setOpen","arrowX","setArrowX","id","tipRef","triggerRef","position","el","trigger","tip","tri","padding","centerX","spaceAbove","spaceBelow","top","left","arrow","React","RadioSelector","value","onChange","options","disabled","React","cn","option","radio","Tooltip","VariantSelector","selectedVariant","useSelectedVariant","setSelectedVariant","usePreprStore","state","pathname","router","previewMode","usePreviewMode","React","RadioSelector","value","params","import_react","EditModeSelector","editMode","useEditMode","setEditMode","usePreprStore","state","t","useTranslations","updateEditMode","value","options","React","RadioSelector","import_react","PreviewModeSelector","previewMode","usePreviewMode","setPreviewMode","usePreprStore","state","t","useTranslations","updatePreviewMode","value","options","React","RadioSelector","ToolbarContent","onClose","contentRef","t","useTranslations","React","logo_default","PreviewModeSelector","SegmentSelector","VariantSelector","EditModeSelector","ResetButton","import_react","ToolbarButton","onClick","className","React","cn","icon_default","Toolbar","children","isMounted","setIsMounted","isBarVisible","usePreprStore","s","setToolbarOpen","editMode","useEditMode","selectedSegment","useSelectedSegment","selectedVariant","useSelectedVariant","contentRef","triggerRef","useModal","popupBoxRef","React","popupTop","setPopupTop","updatePopupPosition","popupHeight","windowHeight","triggerRect","top","handleClick","previewBarContent","cn","ToolbarButton","ToolbarContent","ToolbarWrapper","searchParams","isIframe","setIsIframe","handleKeyDown","event","key","isSaveShortcut","isPrintShortcut","isAddressBarShortcut","previewBarMessage","React","Toolbar","import_react","ToolbarIndicatorWrapper","React","StatusIndicatorPill","CloseEditModePill","PreprToolbar","editMode","useEditMode","useStegaScan","React","ToolbarWrapper","ToolbarIndicatorWrapper"]}