import { ref, watch } from 'vue'; import Coloris from '@melloware/coloris'; /** * Composable for managing preview rendering with double buffering * Handles iframe transitions, scroll persistence, and PagedJS rendering */ export function usePreviewRenderer({ previewFrame1, previewFrame2, stylesheetStore, narrativeStore, handleIframeMouseMove, handleIframeClick, }) { let savedScrollPercentage = 0; const currentFrameIndex = ref(1); // 1 or 2, which iframe is currently visible const isTransitioning = ref(false); const initialized = ref(false); let keyboardShortcutHandler = null; /** * Render preview to hidden iframe with crossfade transition */ const renderPreview = async (shouldReloadFromFile = false) => { if (isTransitioning.value) return; isTransitioning.value = true; // Determine which iframe is currently visible and which to render to const visibleFrame = currentFrameIndex.value === 1 ? previewFrame1.value : previewFrame2.value; const hiddenFrame = currentFrameIndex.value === 1 ? previewFrame2.value : previewFrame1.value; if (!hiddenFrame) { isTransitioning.value = false; return; } // Save scroll position from visible frame if ( visibleFrame && visibleFrame.contentWindow && visibleFrame.contentDocument ) { const scrollTop = visibleFrame.contentWindow.scrollY || 0; const scrollHeight = visibleFrame.contentDocument.documentElement.scrollHeight; const clientHeight = visibleFrame.contentWindow.innerHeight; const maxScroll = scrollHeight - clientHeight; savedScrollPercentage = maxScroll > 0 ? scrollTop / maxScroll : 0; } if (shouldReloadFromFile || !stylesheetStore.content) { await stylesheetStore.loadStylesheet(); } // Render to the hidden frame hiddenFrame.srcdoc = `