react-docxodus-viewer 0.1.0 → 0.2.1
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.
- package/dist/react-docxodus-viewer.cjs.js +1 -1
- package/dist/react-docxodus-viewer.cjs.js.map +1 -1
- package/dist/react-docxodus-viewer.css +1 -1
- package/dist/react-docxodus-viewer.es.js +596 -194
- package/dist/react-docxodus-viewer.es.js.map +1 -1
- package/dist/types/DocumentViewer.d.ts +1 -1
- package/dist/types/DocumentViewer.d.ts.map +1 -1
- package/dist/types/DocumentViewer.test.d.ts +2 -0
- package/dist/types/DocumentViewer.test.d.ts.map +1 -0
- package/dist/types/components/RevisionPanel.d.ts +7 -0
- package/dist/types/components/RevisionPanel.d.ts.map +1 -0
- package/dist/types/components/RevisionPanel.test.d.ts +2 -0
- package/dist/types/components/RevisionPanel.test.d.ts.map +1 -0
- package/dist/types/index.d.ts +4 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/test/setup.d.ts +2 -0
- package/dist/types/test/setup.d.ts.map +1 -0
- package/dist/types/types/index.d.ts +15 -1
- package/dist/types/types/index.d.ts.map +1 -1
- package/package.json +13 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-docxodus-viewer.es.js","sources":["../src/types/index.ts","../src/DocumentViewer.tsx"],"sourcesContent":["/**\n * react-docxodus-viewer types\n */\n\nexport type CommentMode = 'disabled' | 'endnote' | 'inline' | 'margin';\nexport type AnnotationMode = 'disabled' | 'above' | 'inline' | 'tooltip' | 'none';\n\nexport interface ViewerSettings {\n /** Zoom scale (0.3 - 2.0) */\n paginationScale: number;\n /** Show page numbers on pages */\n showPageNumbers: boolean;\n /** Render footnotes and endnotes */\n renderFootnotesAndEndnotes: boolean;\n /** Render headers and footers */\n renderHeadersAndFooters: boolean;\n /** Comment rendering mode */\n commentMode: CommentMode;\n /** Annotation rendering mode */\n annotationMode: AnnotationMode;\n /** Show tracked changes */\n renderTrackedChanges: boolean;\n /** Show deleted content in tracked changes */\n showDeletedContent: boolean;\n /** Distinguish move operations in tracked changes */\n renderMoveOperations: boolean;\n /** Page title for converted HTML */\n pageTitle: string;\n /** CSS class prefix for generated elements */\n cssPrefix: string;\n /** Generate CSS classes for styling */\n fabricateClasses: boolean;\n /** Additional CSS to inject */\n additionalCss: string;\n /** CSS class prefix for comments */\n commentCssClassPrefix: string;\n /** CSS class prefix for annotations */\n annotationCssClassPrefix: string;\n}\n\nexport interface DocumentViewerProps {\n /** File to display (controlled mode) */\n file?: File | null;\n /** Pre-converted HTML content (skip conversion) */\n html?: string | null;\n\n /** Callback when file changes */\n onFileChange?: (file: File | null) => void;\n /** Callback when conversion starts */\n onConversionStart?: () => void;\n /** Callback when conversion completes successfully */\n onConversionComplete?: (html: string) => void;\n /** Callback when an error occurs */\n onError?: (error: Error) => void;\n /** Callback when visible page changes */\n onPageChange?: (page: number, total: number) => void;\n\n /** Initial/controlled viewer settings */\n settings?: Partial<ViewerSettings>;\n /** Default settings (used for uncontrolled mode) */\n defaultSettings?: Partial<ViewerSettings>;\n /** Callback when settings change */\n onSettingsChange?: (settings: ViewerSettings) => void;\n\n /** Additional CSS class for the root element */\n className?: string;\n /** Inline styles for the root element */\n style?: React.CSSProperties;\n /** Toolbar position */\n toolbar?: 'top' | 'bottom' | 'none';\n /** Show settings button in toolbar */\n showSettingsButton?: boolean;\n /** Placeholder text when no document is loaded */\n placeholder?: string;\n\n /** Base path for WASM files */\n wasmBasePath?: string;\n}\n\nexport const DEFAULT_SETTINGS: ViewerSettings = {\n paginationScale: 0.8,\n showPageNumbers: true,\n renderFootnotesAndEndnotes: true,\n renderHeadersAndFooters: true,\n commentMode: 'disabled',\n annotationMode: 'disabled',\n renderTrackedChanges: false,\n showDeletedContent: true,\n renderMoveOperations: true,\n pageTitle: 'Document',\n cssPrefix: 'docx-',\n fabricateClasses: true,\n additionalCss: '',\n commentCssClassPrefix: 'comment-',\n annotationCssClassPrefix: 'annot-',\n};\n","import { useState, useCallback, useRef, useEffect, useMemo } from 'react';\nimport { useDocxodus, PaginatedDocument } from 'docxodus/react';\nimport { CommentRenderMode, PaginationMode, AnnotationLabelMode } from 'docxodus';\nimport type { PaginationResult } from 'docxodus/react';\nimport type {\n DocumentViewerProps,\n ViewerSettings,\n CommentMode,\n AnnotationMode,\n} from './types';\nimport { DEFAULT_SETTINGS } from './types';\n\n// Default WASM path - consumers should override this\nconst DEFAULT_WASM_PATH = '/wasm/';\n\nfunction getCommentRenderMode(mode: CommentMode): CommentRenderMode {\n switch (mode) {\n case 'endnote': return CommentRenderMode.EndnoteStyle;\n case 'inline': return CommentRenderMode.Inline;\n case 'margin': return CommentRenderMode.Margin;\n default: return CommentRenderMode.Disabled;\n }\n}\n\nfunction getAnnotationLabelMode(mode: AnnotationMode): AnnotationLabelMode | undefined {\n switch (mode) {\n case 'above': return AnnotationLabelMode.Above;\n case 'inline': return AnnotationLabelMode.Inline;\n case 'tooltip': return AnnotationLabelMode.Tooltip;\n case 'none': return AnnotationLabelMode.None;\n default: return undefined;\n }\n}\n\nexport function DocumentViewer({\n file: controlledFile,\n html: controlledHtml,\n onFileChange,\n onConversionStart,\n onConversionComplete,\n onError,\n onPageChange,\n settings: controlledSettings,\n defaultSettings,\n onSettingsChange,\n className,\n style,\n toolbar = 'top',\n showSettingsButton = true,\n placeholder = 'Open a DOCX file to view',\n wasmBasePath = DEFAULT_WASM_PATH,\n}: DocumentViewerProps) {\n // Merge default settings\n const mergedDefaults = useMemo(\n () => ({ ...DEFAULT_SETTINGS, ...defaultSettings }),\n [defaultSettings]\n );\n\n // Internal state (uncontrolled mode)\n const [internalFile, setInternalFile] = useState<File | null>(null);\n const [internalHtml, setInternalHtml] = useState<string | null>(null);\n const [internalSettings, setInternalSettings] = useState<ViewerSettings>(mergedDefaults);\n\n // Determine which values to use (controlled vs uncontrolled)\n const file = controlledFile !== undefined ? controlledFile : internalFile;\n const html = controlledHtml !== undefined ? controlledHtml : internalHtml;\n const settings = useMemo(\n () => controlledSettings\n ? { ...mergedDefaults, ...controlledSettings }\n : internalSettings,\n [controlledSettings, mergedDefaults, internalSettings]\n );\n\n // Docxodus hook\n const { isReady, isLoading, error: initError, convertToHtml } = useDocxodus(wasmBasePath);\n\n // Local UI state\n const [isConverting, setIsConverting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [fileName, setFileName] = useState<string>('');\n const [currentPage, setCurrentPage] = useState(1);\n const [totalPages, setTotalPages] = useState(0);\n const [showSettings, setShowSettings] = useState(false);\n\n const paginatedContainerRef = useRef<HTMLDivElement>(null);\n\n // Build conversion options from settings\n const getConvertOptions = useCallback(() => ({\n commentRenderMode: getCommentRenderMode(settings.commentMode),\n pageTitle: settings.pageTitle,\n cssPrefix: settings.cssPrefix,\n fabricateClasses: settings.fabricateClasses,\n additionalCss: settings.additionalCss || undefined,\n commentCssClassPrefix: settings.commentCssClassPrefix,\n paginationMode: PaginationMode.Paginated,\n paginationScale: settings.paginationScale,\n renderAnnotations: settings.annotationMode !== 'disabled',\n annotationLabelMode: getAnnotationLabelMode(settings.annotationMode),\n annotationCssClassPrefix: settings.annotationCssClassPrefix,\n renderFootnotesAndEndnotes: settings.renderFootnotesAndEndnotes,\n renderHeadersAndFooters: settings.renderHeadersAndFooters,\n renderTrackedChanges: settings.renderTrackedChanges,\n showDeletedContent: settings.showDeletedContent,\n renderMoveOperations: settings.renderMoveOperations,\n }), [settings]);\n\n // Convert file to HTML\n const convert = useCallback(async (fileToConvert: File) => {\n if (!isReady) return;\n\n setIsConverting(true);\n setError(null);\n onConversionStart?.();\n\n // Allow React to render loading state before heavy WASM work\n await new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve)));\n\n try {\n const result = await convertToHtml(fileToConvert, getConvertOptions());\n\n if (controlledHtml === undefined) {\n setInternalHtml(result);\n }\n onConversionComplete?.(result);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n onError?.(error);\n } finally {\n setIsConverting(false);\n }\n }, [isReady, convertToHtml, getConvertOptions, controlledHtml, onConversionStart, onConversionComplete, onError]);\n\n // Auto-convert when WASM ready and file available\n useEffect(() => {\n if (isReady && file && !html && !isConverting && controlledHtml === undefined) {\n convert(file);\n }\n }, [isReady, file, html, isConverting, convert, controlledHtml]);\n\n // Handle file input change\n const handleFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const selectedFile = e.target.files?.[0];\n if (selectedFile) {\n setFileName(selectedFile.name);\n setError(null);\n setCurrentPage(1);\n setTotalPages(0);\n\n if (controlledFile === undefined) {\n setInternalFile(selectedFile);\n setInternalHtml(null);\n }\n onFileChange?.(selectedFile);\n\n if (isReady && controlledHtml === undefined) {\n await convert(selectedFile);\n }\n }\n };\n\n // Reconvert with current settings\n const reconvert = useCallback(async () => {\n if (file) {\n if (controlledHtml === undefined) {\n setInternalHtml(null);\n }\n await convert(file);\n }\n }, [file, convert, controlledHtml]);\n\n // Clear document\n const handleClear = () => {\n if (controlledFile === undefined) {\n setInternalFile(null);\n }\n if (controlledHtml === undefined) {\n setInternalHtml(null);\n }\n setError(null);\n setFileName('');\n setCurrentPage(1);\n setTotalPages(0);\n onFileChange?.(null);\n\n const input = document.getElementById('rdv-file-input') as HTMLInputElement;\n if (input) input.value = '';\n };\n\n // Update settings\n const updateSettings = useCallback((updates: Partial<ViewerSettings>) => {\n const newSettings = { ...settings, ...updates };\n if (controlledSettings === undefined) {\n setInternalSettings(newSettings);\n }\n onSettingsChange?.(newSettings);\n }, [settings, controlledSettings, onSettingsChange]);\n\n // Zoom controls\n const handleZoomIn = () => updateSettings({\n paginationScale: Math.min(settings.paginationScale + 0.1, 2.0)\n });\n const handleZoomOut = () => updateSettings({\n paginationScale: Math.max(settings.paginationScale - 0.1, 0.3)\n });\n const handleZoomChange = (value: number) => updateSettings({\n paginationScale: Math.max(0.3, Math.min(2.0, value))\n });\n\n // Page navigation\n const goToPage = (pageNum: number) => {\n const container = paginatedContainerRef.current;\n if (!container || pageNum < 1 || pageNum > totalPages) return;\n const pageElement = container.querySelector(`[data-page-number=\"${pageNum}\"]`);\n if (pageElement) {\n pageElement.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n };\n\n const goToPreviousPage = () => currentPage > 1 && goToPage(currentPage - 1);\n const goToNextPage = () => currentPage < totalPages && goToPage(currentPage + 1);\n\n // Handle page visibility changes\n const handlePageVisible = (pageNumber: number) => {\n setCurrentPage(pageNumber);\n onPageChange?.(pageNumber, totalPages);\n };\n\n // Handle footnote/anchor clicks\n useEffect(() => {\n const container = paginatedContainerRef.current;\n if (!container) return;\n\n const handleAnchorClick = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n const anchor = target.closest('a[href^=\"#\"]') as HTMLAnchorElement | null;\n if (!anchor) return;\n\n const href = anchor.getAttribute('href');\n if (!href || !href.startsWith('#')) return;\n\n e.preventDefault();\n const targetId = href.substring(1);\n const targetElement = container.querySelector(`[id=\"${targetId}\"], [name=\"${targetId}\"]`);\n\n if (targetElement) {\n targetElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\n targetElement.classList.add('rdv-footnote-highlight');\n setTimeout(() => targetElement.classList.remove('rdv-footnote-highlight'), 2000);\n }\n };\n\n container.addEventListener('click', handleAnchorClick);\n return () => container.removeEventListener('click', handleAnchorClick);\n }, [html]);\n\n // Notify parent of page changes when totalPages updates\n useEffect(() => {\n if (totalPages > 0) {\n onPageChange?.(currentPage, totalPages);\n }\n }, [totalPages, currentPage, onPageChange]);\n\n const isProcessing = isConverting || isLoading;\n\n // Settings Modal\n const SettingsModal = () => (\n <div className=\"rdv-settings-overlay\" onClick={() => setShowSettings(false)}>\n <div className=\"rdv-settings-modal\" onClick={(e) => e.stopPropagation()}>\n <div className=\"rdv-settings-header\">\n <h3>Viewer Settings</h3>\n <button className=\"rdv-settings-close\" onClick={() => setShowSettings(false)}>×</button>\n </div>\n <div className=\"rdv-settings-body\">\n <div className=\"rdv-settings-section\">\n <h4>Display Options</h4>\n <label className=\"rdv-settings-checkbox\">\n <input\n type=\"checkbox\"\n checked={settings.renderFootnotesAndEndnotes}\n onChange={(e) => updateSettings({ renderFootnotesAndEndnotes: e.target.checked })}\n />\n <span>Show footnotes and endnotes</span>\n </label>\n <label className=\"rdv-settings-checkbox\">\n <input\n type=\"checkbox\"\n checked={settings.renderHeadersAndFooters}\n onChange={(e) => updateSettings({ renderHeadersAndFooters: e.target.checked })}\n />\n <span>Show headers and footers</span>\n </label>\n <label className=\"rdv-settings-checkbox\">\n <input\n type=\"checkbox\"\n checked={settings.showPageNumbers}\n onChange={(e) => updateSettings({ showPageNumbers: e.target.checked })}\n />\n <span>Show page numbers</span>\n </label>\n </div>\n\n <div className=\"rdv-settings-section\">\n <h4>Comment Rendering</h4>\n <div className=\"rdv-settings-radio-group\">\n {(['disabled', 'endnote', 'inline', 'margin'] as CommentMode[]).map((mode) => (\n <label key={mode} className=\"rdv-settings-radio\">\n <input\n type=\"radio\"\n name=\"commentMode\"\n checked={settings.commentMode === mode}\n onChange={() => updateSettings({ commentMode: mode })}\n />\n <span>{mode.charAt(0).toUpperCase() + mode.slice(1)}{mode === 'endnote' ? 's' : ''}</span>\n </label>\n ))}\n </div>\n </div>\n\n <div className=\"rdv-settings-section\">\n <h4>Annotation Rendering</h4>\n <div className=\"rdv-settings-radio-group\">\n {(['disabled', 'above', 'inline', 'tooltip', 'none'] as AnnotationMode[]).map((mode) => (\n <label key={mode} className=\"rdv-settings-radio\">\n <input\n type=\"radio\"\n name=\"annotationMode\"\n checked={settings.annotationMode === mode}\n onChange={() => updateSettings({ annotationMode: mode })}\n />\n <span>{mode === 'none' ? 'Highlight Only' : mode.charAt(0).toUpperCase() + mode.slice(1)}</span>\n </label>\n ))}\n </div>\n </div>\n\n <div className=\"rdv-settings-section\">\n <h4>Tracked Changes</h4>\n <label className=\"rdv-settings-checkbox\">\n <input\n type=\"checkbox\"\n checked={settings.renderTrackedChanges}\n onChange={(e) => updateSettings({ renderTrackedChanges: e.target.checked })}\n />\n <span>Show tracked changes</span>\n </label>\n {settings.renderTrackedChanges && (\n <div className=\"rdv-settings-subsection\">\n <label className=\"rdv-settings-checkbox\">\n <input\n type=\"checkbox\"\n checked={settings.showDeletedContent}\n onChange={(e) => updateSettings({ showDeletedContent: e.target.checked })}\n />\n <span>Show deleted content</span>\n </label>\n <label className=\"rdv-settings-checkbox\">\n <input\n type=\"checkbox\"\n checked={settings.renderMoveOperations}\n onChange={(e) => updateSettings({ renderMoveOperations: e.target.checked })}\n />\n <span>Distinguish move operations</span>\n </label>\n </div>\n )}\n </div>\n </div>\n <div className=\"rdv-settings-footer\">\n <button className=\"rdv-settings-apply\" onClick={() => { reconvert(); setShowSettings(false); }}>\n Apply & Close\n </button>\n </div>\n </div>\n </div>\n );\n\n // Toolbar component\n const Toolbar = () => (\n <div className=\"rdv-toolbar\">\n <div className=\"rdv-toolbar-left\">\n <label htmlFor=\"rdv-file-input\" className=\"rdv-toolbar-file-btn\">\n {fileName || 'Open Document'}\n </label>\n <input\n id=\"rdv-file-input\"\n type=\"file\"\n accept=\".docx\"\n onChange={handleFileChange}\n disabled={isProcessing}\n className=\"rdv-file-input\"\n />\n {fileName && (\n <button className=\"rdv-toolbar-btn rdv-toolbar-clear\" onClick={handleClear} disabled={isProcessing}>\n ×\n </button>\n )}\n </div>\n\n <div className=\"rdv-toolbar-center\">\n {html && totalPages > 0 && (\n <>\n <button\n className=\"rdv-toolbar-btn\"\n onClick={goToPreviousPage}\n disabled={currentPage <= 1}\n title=\"Previous Page\"\n >\n ◀\n </button>\n <div className=\"rdv-page-input-group\">\n <input\n type=\"number\"\n className=\"rdv-page-input\"\n value={currentPage}\n min={1}\n max={totalPages}\n onChange={(e) => {\n const page = parseInt(e.target.value);\n if (!isNaN(page)) goToPage(page);\n }}\n />\n <span className=\"rdv-page-total\">/ {totalPages}</span>\n </div>\n <button\n className=\"rdv-toolbar-btn\"\n onClick={goToNextPage}\n disabled={currentPage >= totalPages}\n title=\"Next Page\"\n >\n ▶\n </button>\n\n <div className=\"rdv-toolbar-separator\" />\n\n <button\n className=\"rdv-toolbar-btn\"\n onClick={handleZoomOut}\n disabled={settings.paginationScale <= 0.3}\n title=\"Zoom Out\"\n >\n −\n </button>\n <select\n className=\"rdv-zoom-select\"\n value={settings.paginationScale}\n onChange={(e) => handleZoomChange(parseFloat(e.target.value))}\n >\n <option value=\"0.5\">50%</option>\n <option value=\"0.75\">75%</option>\n <option value=\"0.8\">80%</option>\n <option value=\"0.9\">90%</option>\n <option value=\"1\">100%</option>\n <option value=\"1.25\">125%</option>\n <option value=\"1.5\">150%</option>\n <option value=\"2\">200%</option>\n </select>\n <button\n className=\"rdv-toolbar-btn\"\n onClick={handleZoomIn}\n disabled={settings.paginationScale >= 2.0}\n title=\"Zoom In\"\n >\n +\n </button>\n </>\n )}\n </div>\n\n <div className=\"rdv-toolbar-right\">\n {showSettingsButton && (\n <button\n className=\"rdv-toolbar-btn rdv-toolbar-settings\"\n onClick={() => setShowSettings(true)}\n title=\"Settings\"\n >\n ⚙\n </button>\n )}\n </div>\n </div>\n );\n\n const rootClassName = ['rdv-viewer', className].filter(Boolean).join(' ');\n\n return (\n <div className={rootClassName} style={style}>\n {toolbar === 'top' && <Toolbar />}\n\n <div className=\"rdv-content\">\n {initError && (\n <div className=\"rdv-message rdv-message--error\">\n <p>Failed to initialize: {initError.message}</p>\n </div>\n )}\n\n {!initError && (isLoading || isConverting) && (\n <div className=\"rdv-message\">\n <div className=\"rdv-spinner\"></div>\n <p>\n {isLoading && file\n ? 'Loading engine & preparing document...'\n : isLoading\n ? 'Loading document engine...'\n : 'Processing document...'}\n </p>\n </div>\n )}\n\n {!isLoading && !initError && !html && !isConverting && !file && (\n <div className=\"rdv-message\">\n <div className=\"rdv-message__icon\">📄</div>\n <p>{placeholder}</p>\n </div>\n )}\n\n {error && !isConverting && (\n <div className=\"rdv-message rdv-message--error\">\n <p>Error: {error.message}</p>\n </div>\n )}\n\n {html && !isConverting && (\n <div ref={paginatedContainerRef} className=\"rdv-pages\">\n <PaginatedDocument\n html={html}\n scale={settings.paginationScale}\n showPageNumbers={settings.showPageNumbers}\n pageGap={20}\n backgroundColor=\"#525659\"\n className=\"rdv-paginated-document\"\n onPaginationComplete={(result: PaginationResult) => {\n setTotalPages(result.totalPages);\n }}\n onPageVisible={handlePageVisible}\n />\n </div>\n )}\n </div>\n\n {toolbar === 'bottom' && <Toolbar />}\n\n {showSettings && <SettingsModal />}\n </div>\n );\n}\n"],"names":["DEFAULT_SETTINGS","DEFAULT_WASM_PATH","getCommentRenderMode","mode","CommentRenderMode","getAnnotationLabelMode","AnnotationLabelMode","DocumentViewer","controlledFile","controlledHtml","onFileChange","onConversionStart","onConversionComplete","onError","onPageChange","controlledSettings","defaultSettings","onSettingsChange","className","style","toolbar","showSettingsButton","placeholder","wasmBasePath","mergedDefaults","useMemo","internalFile","setInternalFile","useState","internalHtml","setInternalHtml","internalSettings","setInternalSettings","file","html","settings","isReady","isLoading","initError","convertToHtml","useDocxodus","isConverting","setIsConverting","error","setError","fileName","setFileName","currentPage","setCurrentPage","totalPages","setTotalPages","showSettings","setShowSettings","paginatedContainerRef","useRef","getConvertOptions","useCallback","PaginationMode","convert","fileToConvert","resolve","result","err","useEffect","handleFileChange","e","selectedFile","reconvert","handleClear","input","updateSettings","updates","newSettings","handleZoomIn","handleZoomOut","handleZoomChange","value","goToPage","pageNum","container","pageElement","goToPreviousPage","goToNextPage","handlePageVisible","pageNumber","handleAnchorClick","anchor","href","targetId","targetElement","isProcessing","SettingsModal","jsx","jsxs","Toolbar","Fragment","page","rootClassName","PaginatedDocument"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"react-docxodus-viewer.es.js","sources":["../node_modules/docxodus/dist/worker-proxy.js","../src/types/index.ts","../src/components/RevisionPanel.tsx","../src/DocumentViewer.tsx"],"sourcesContent":["/**\n * Worker Proxy - Main thread interface for the Docxodus Web Worker\n *\n * This module provides a Promise-based API that mirrors the main API but\n * executes all WASM operations in a Web Worker, keeping the main thread free.\n *\n * @example\n * ```typescript\n * import { createWorkerDocxodus } from 'docxodus/worker';\n *\n * // Create worker instance\n * const docxodus = await createWorkerDocxodus();\n *\n * // Use the same API as the main module, but non-blocking!\n * const html = await docxodus.convertDocxToHtml(docxFile);\n *\n * // Clean up when done\n * docxodus.terminate();\n * ```\n */\n/**\n * Generate a unique request ID.\n */\nfunction generateId() {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\n}\n/**\n * Convert a File or Uint8Array to Uint8Array.\n */\nasync function toBytes(document) {\n if (document instanceof Uint8Array) {\n return document;\n }\n const buffer = await document.arrayBuffer();\n return new Uint8Array(buffer);\n}\n/**\n * Derive the WASM base path from the current module URL.\n */\nfunction deriveWasmBasePath() {\n // Try to get the base path from the current script URL\n if (typeof document !== \"undefined\") {\n // Browser: look for docxodus script tag or use current location\n const scripts = document.querySelectorAll('script[src*=\"docxodus\"]');\n if (scripts.length > 0) {\n const src = scripts[0].src;\n const base = src.substring(0, src.lastIndexOf(\"/\") + 1);\n return base + \"wasm/\";\n }\n }\n // Default fallback\n return \"/wasm/\";\n}\n/**\n * Create a worker-based Docxodus instance.\n *\n * This function spawns a Web Worker that loads the WASM runtime independently.\n * All operations are executed in the worker, keeping the main thread responsive.\n *\n * @param options - Configuration options\n * @returns A Promise that resolves to a WorkerDocxodus instance\n *\n * @example\n * ```typescript\n * // Basic usage\n * const docxodus = await createWorkerDocxodus();\n * const html = await docxodus.convertDocxToHtml(docxFile);\n *\n * // With custom WASM path\n * const docxodus = await createWorkerDocxodus({\n * wasmBasePath: '/assets/wasm/'\n * });\n * ```\n */\nexport async function createWorkerDocxodus(options) {\n // Determine WASM base path\n const wasmBasePath = options?.wasmBasePath ?? deriveWasmBasePath();\n // Determine worker script path\n // The worker bundle should be in the same directory as this module\n let workerUrl;\n // Try to create worker from bundled script or blob\n // For now, we'll use a blob URL to inline the worker path\n const workerScriptPath = new URL(\"./docxodus.worker.js\", import.meta.url)\n .href;\n // Create the worker\n const worker = new Worker(workerScriptPath, { type: \"module\" });\n // Track pending requests\n const pendingRequests = new Map();\n // Track if worker is active\n let isWorkerActive = true;\n // Handle worker messages\n worker.onmessage = (event) => {\n const response = event.data;\n // Handle ready signal\n if (response.type === \"ready\") {\n return;\n }\n // Handle normal responses\n const pending = pendingRequests.get(response.id);\n if (pending) {\n pendingRequests.delete(response.id);\n if (response.success) {\n pending.resolve(response);\n }\n else {\n pending.reject(new Error(response.error || \"Unknown error\"));\n }\n }\n };\n // Handle worker errors\n worker.onerror = (error) => {\n // Reject all pending requests\n for (const pending of pendingRequests.values()) {\n pending.reject(new Error(`Worker error: ${error.message}`));\n }\n pendingRequests.clear();\n isWorkerActive = false;\n };\n /**\n * Send a request to the worker and wait for response.\n */\n function sendRequest(request, transfer) {\n return new Promise((resolve, reject) => {\n if (!isWorkerActive) {\n reject(new Error(\"Worker has been terminated\"));\n return;\n }\n pendingRequests.set(request.id, { resolve, reject });\n if (transfer && transfer.length > 0) {\n worker.postMessage(request, transfer);\n }\n else {\n worker.postMessage(request);\n }\n });\n }\n // Initialize the worker\n const initResponse = await sendRequest({\n id: generateId(),\n type: \"init\",\n wasmBasePath,\n });\n if (!initResponse.success) {\n worker.terminate();\n throw new Error(`Failed to initialize worker: ${initResponse.error}`);\n }\n // Return the WorkerDocxodus instance\n return {\n async convertDocxToHtml(document, options) {\n const bytes = await toBytes(document);\n const response = await sendRequest({\n id: generateId(),\n type: \"convertDocxToHtml\",\n documentBytes: bytes,\n options,\n }, [bytes.buffer]);\n return response.html;\n },\n async compareDocuments(original, modified, options) {\n const originalBytes = await toBytes(original);\n const modifiedBytes = await toBytes(modified);\n const response = await sendRequest({\n id: generateId(),\n type: \"compareDocuments\",\n originalBytes,\n modifiedBytes,\n options,\n }, [originalBytes.buffer, modifiedBytes.buffer]);\n return response.documentBytes;\n },\n async compareDocumentsToHtml(original, modified, options) {\n const originalBytes = await toBytes(original);\n const modifiedBytes = await toBytes(modified);\n const response = await sendRequest({\n id: generateId(),\n type: \"compareDocumentsToHtml\",\n originalBytes,\n modifiedBytes,\n options,\n }, [originalBytes.buffer, modifiedBytes.buffer]);\n return response.html;\n },\n async getRevisions(document, options) {\n const bytes = await toBytes(document);\n const response = await sendRequest({\n id: generateId(),\n type: \"getRevisions\",\n documentBytes: bytes,\n options,\n }, [bytes.buffer]);\n return response.revisions;\n },\n async getDocumentMetadata(document) {\n const bytes = await toBytes(document);\n const response = await sendRequest({\n id: generateId(),\n type: \"getDocumentMetadata\",\n documentBytes: bytes,\n }, [bytes.buffer]);\n return response.metadata;\n },\n async getVersion() {\n const response = await sendRequest({\n id: generateId(),\n type: \"getVersion\",\n });\n return response.version;\n },\n terminate() {\n isWorkerActive = false;\n worker.terminate();\n // Reject any pending requests\n for (const pending of pendingRequests.values()) {\n pending.reject(new Error(\"Worker terminated\"));\n }\n pendingRequests.clear();\n },\n isActive() {\n return isWorkerActive;\n },\n };\n}\n/**\n * Check if Web Workers are supported in the current environment.\n */\nexport function isWorkerSupported() {\n return typeof Worker !== \"undefined\";\n}\n//# sourceMappingURL=worker-proxy.js.map","/**\n * react-docxodus-viewer types\n */\n\nexport type CommentMode = 'disabled' | 'endnote' | 'inline' | 'margin';\nexport type AnnotationMode = 'disabled' | 'above' | 'inline' | 'tooltip' | 'none';\nexport type ViewMode = 'document' | 'revisions';\n\nexport interface ViewerSettings {\n /** Zoom scale (0.3 - 2.0) */\n paginationScale: number;\n /** Show page numbers on pages */\n showPageNumbers: boolean;\n /** Render footnotes and endnotes */\n renderFootnotesAndEndnotes: boolean;\n /** Render headers and footers */\n renderHeadersAndFooters: boolean;\n /** Comment rendering mode */\n commentMode: CommentMode;\n /** Annotation rendering mode */\n annotationMode: AnnotationMode;\n /** Show tracked changes */\n renderTrackedChanges: boolean;\n /** Show deleted content in tracked changes */\n showDeletedContent: boolean;\n /** Distinguish move operations in tracked changes */\n renderMoveOperations: boolean;\n /** Page title for converted HTML */\n pageTitle: string;\n /** CSS class prefix for generated elements */\n cssPrefix: string;\n /** Generate CSS classes for styling */\n fabricateClasses: boolean;\n /** Additional CSS to inject */\n additionalCss: string;\n /** CSS class prefix for comments */\n commentCssClassPrefix: string;\n /** CSS class prefix for annotations */\n annotationCssClassPrefix: string;\n}\n\nexport interface DocumentViewerProps {\n /** File to display (controlled mode) */\n file?: File | null;\n /** Pre-converted HTML content (skip conversion) */\n html?: string | null;\n\n /** Callback when file changes */\n onFileChange?: (file: File | null) => void;\n /** Callback when conversion starts */\n onConversionStart?: () => void;\n /** Callback when conversion completes successfully */\n onConversionComplete?: (html: string) => void;\n /** Callback when an error occurs */\n onError?: (error: Error) => void;\n /** Callback when visible page changes */\n onPageChange?: (page: number, total: number) => void;\n /** Callback when revisions are extracted from document */\n onRevisionsExtracted?: (revisions: import('docxodus').Revision[]) => void;\n\n /** Initial/controlled viewer settings */\n settings?: Partial<ViewerSettings>;\n /** Default settings (used for uncontrolled mode) */\n defaultSettings?: Partial<ViewerSettings>;\n /** Callback when settings change */\n onSettingsChange?: (settings: ViewerSettings) => void;\n\n /** Additional CSS class for the root element */\n className?: string;\n /** Inline styles for the root element */\n style?: React.CSSProperties;\n /** Toolbar position */\n toolbar?: 'top' | 'bottom' | 'none';\n /** Show settings button in toolbar */\n showSettingsButton?: boolean;\n /** Show revisions tab when document has tracked changes */\n showRevisionsTab?: boolean;\n /** Placeholder text when no document is loaded */\n placeholder?: string;\n\n /**\n * Base path for WASM files.\n * Leave undefined for auto-detection (recommended for most setups).\n * Only specify if hosting WASM files at a custom location.\n */\n wasmBasePath?: string;\n /**\n * Use Web Worker for document conversion (keeps UI responsive).\n * Recommended for large documents. Default: false\n */\n useWorker?: boolean;\n}\n\nexport const DEFAULT_SETTINGS: ViewerSettings = {\n paginationScale: 0.8,\n showPageNumbers: true,\n renderFootnotesAndEndnotes: true,\n renderHeadersAndFooters: true,\n commentMode: 'disabled',\n annotationMode: 'disabled',\n renderTrackedChanges: false,\n showDeletedContent: true,\n renderMoveOperations: true,\n pageTitle: 'Document',\n cssPrefix: 'docx-',\n fabricateClasses: true,\n additionalCss: '',\n commentCssClassPrefix: 'comment-',\n annotationCssClassPrefix: 'annot-',\n};\n","import { useState, useMemo } from 'react';\nimport type { Revision } from 'docxodus/react';\nimport { isInsertion, isDeletion, isMove, isFormatChange } from 'docxodus';\n\ninterface RevisionPanelProps {\n revisions: Revision[];\n}\n\ntype FilterType = 'all' | 'insertions' | 'deletions' | 'moves' | 'formatting';\n\nfunction getRevisionTypeLabel(revision: Revision): string {\n if (isInsertion(revision)) return 'Inserted';\n if (isDeletion(revision)) return 'Deleted';\n if (isMove(revision)) return revision.isMoveSource ? 'Moved from' : 'Moved to';\n if (isFormatChange(revision)) return 'Formatted';\n return String(revision.revisionType);\n}\n\nfunction getRevisionTypeClass(revision: Revision): string {\n if (isInsertion(revision)) return 'rdv-revision--insertion';\n if (isDeletion(revision)) return 'rdv-revision--deletion';\n if (isMove(revision)) return 'rdv-revision--move';\n if (isFormatChange(revision)) return 'rdv-revision--format';\n return '';\n}\n\nfunction formatDate(isoDate: string): string {\n try {\n const date = new Date(isoDate);\n return date.toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n } catch {\n return isoDate;\n }\n}\n\nfunction truncateText(text: string, maxLength: number = 150): string {\n if (text.length <= maxLength) return text;\n return text.substring(0, maxLength) + '...';\n}\n\n// Filter out raw XML values and clean up property names\nfunction isValidPropertyValue(value: string): boolean {\n if (!value || typeof value !== 'string') return false;\n // Filter out raw XML data\n if (value.includes('<') || value.includes('xmlns') || value.includes('Unid=')) return false;\n // Filter out overly long values (likely XML)\n if (value.length > 100) return false;\n return true;\n}\n\n// Make property names more readable\nfunction formatPropertyName(name: string): string {\n // Convert camelCase to Title Case with spaces\n return name\n .replace(/([A-Z])/g, ' $1')\n .replace(/^./, (str) => str.toUpperCase())\n .trim();\n}\n\n// Format property value for display\nfunction formatPropertyValue(value: string): string {\n if (value === 'true') return 'Yes';\n if (value === 'false') return 'No';\n if (value === 'single') return 'Single';\n if (value === 'double') return 'Double';\n return value;\n}\n\ninterface FormatChangeItem {\n property: string;\n oldValue?: string;\n newValue?: string;\n}\n\n// Get paired format changes (old → new for same property)\nfunction getFormatChanges(revision: Revision): FormatChangeItem[] {\n if (!revision.formatChange) return [];\n\n const { oldProperties, newProperties } = revision.formatChange;\n const changes: FormatChangeItem[] = [];\n const processedKeys = new Set<string>();\n\n // Process old properties\n if (oldProperties) {\n for (const [key, value] of Object.entries(oldProperties)) {\n if (!isValidPropertyValue(value)) continue;\n processedKeys.add(key);\n const newValue = newProperties?.[key];\n changes.push({\n property: formatPropertyName(key),\n oldValue: formatPropertyValue(value),\n newValue: newValue && isValidPropertyValue(newValue) ? formatPropertyValue(newValue) : undefined,\n });\n }\n }\n\n // Process new properties not in old\n if (newProperties) {\n for (const [key, value] of Object.entries(newProperties)) {\n if (processedKeys.has(key)) continue;\n if (!isValidPropertyValue(value)) continue;\n changes.push({\n property: formatPropertyName(key),\n oldValue: undefined,\n newValue: formatPropertyValue(value),\n });\n }\n }\n\n return changes;\n}\n\nexport function RevisionPanel({ revisions }: RevisionPanelProps) {\n const [filter, setFilter] = useState<FilterType>('all');\n const [expandedIds, setExpandedIds] = useState<Set<number>>(new Set());\n\n const filteredRevisions = useMemo(() => {\n if (filter === 'all') return revisions;\n return revisions.filter((rev) => {\n switch (filter) {\n case 'insertions': return isInsertion(rev);\n case 'deletions': return isDeletion(rev);\n case 'moves': return isMove(rev);\n case 'formatting': return isFormatChange(rev);\n default: return true;\n }\n });\n }, [revisions, filter]);\n\n const stats = useMemo(() => ({\n total: revisions.length,\n insertions: revisions.filter(isInsertion).length,\n deletions: revisions.filter(isDeletion).length,\n moves: revisions.filter(isMove).length,\n formatting: revisions.filter(isFormatChange).length,\n }), [revisions]);\n\n const toggleExpanded = (index: number) => {\n setExpandedIds((prev) => {\n const next = new Set(prev);\n if (next.has(index)) {\n next.delete(index);\n } else {\n next.add(index);\n }\n return next;\n });\n };\n\n if (revisions.length === 0) {\n return (\n <div className=\"rdv-revision-panel\">\n <div className=\"rdv-revision-empty\">\n <div className=\"rdv-revision-empty__icon\">📝</div>\n <p>No tracked changes found in this document.</p>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"rdv-revision-panel\">\n <div className=\"rdv-revision-header\">\n <div className=\"rdv-revision-stats\">\n <span className=\"rdv-revision-stat rdv-revision-stat--total\">\n {stats.total} change{stats.total !== 1 ? 's' : ''}\n </span>\n {stats.insertions > 0 && (\n <span className=\"rdv-revision-stat rdv-revision-stat--insertion\">\n +{stats.insertions}\n </span>\n )}\n {stats.deletions > 0 && (\n <span className=\"rdv-revision-stat rdv-revision-stat--deletion\">\n −{stats.deletions}\n </span>\n )}\n {stats.moves > 0 && (\n <span className=\"rdv-revision-stat rdv-revision-stat--move\">\n ↔{stats.moves}\n </span>\n )}\n {stats.formatting > 0 && (\n <span className=\"rdv-revision-stat rdv-revision-stat--format\">\n ✎{stats.formatting}\n </span>\n )}\n </div>\n <select\n className=\"rdv-revision-filter\"\n value={filter}\n onChange={(e) => setFilter(e.target.value as FilterType)}\n >\n <option value=\"all\">All Changes</option>\n <option value=\"insertions\">Insertions ({stats.insertions})</option>\n <option value=\"deletions\">Deletions ({stats.deletions})</option>\n <option value=\"moves\">Moves ({stats.moves})</option>\n <option value=\"formatting\">Formatting ({stats.formatting})</option>\n </select>\n </div>\n\n <div className=\"rdv-revision-list\">\n {filteredRevisions.map((revision, index) => {\n const isExpanded = expandedIds.has(index);\n const needsTruncation = revision.text.length > 150;\n const formatChanges = isFormatChange(revision) ? getFormatChanges(revision) : [];\n\n return (\n <div\n key={index}\n className={`rdv-revision-item ${getRevisionTypeClass(revision)}`}\n >\n <div className=\"rdv-revision-item__header\">\n <span className=\"rdv-revision-type\">\n {getRevisionTypeLabel(revision)}\n </span>\n {isMove(revision) && revision.moveGroupId !== undefined && (\n <span className=\"rdv-revision-move-id\">#{revision.moveGroupId}</span>\n )}\n <span className=\"rdv-revision-author\">{revision.author || 'Unknown'}</span>\n <span className=\"rdv-revision-date\">{formatDate(revision.date)}</span>\n </div>\n\n {revision.text && (\n <div className=\"rdv-revision-item__content\">\n <span className=\"rdv-revision-text\">\n {isExpanded ? revision.text : truncateText(revision.text)}\n </span>\n {needsTruncation && (\n <button\n className=\"rdv-revision-expand\"\n onClick={() => toggleExpanded(index)}\n >\n {isExpanded ? 'Show less' : 'Show more'}\n </button>\n )}\n </div>\n )}\n\n {formatChanges.length > 0 && (\n <div className=\"rdv-revision-item__format-details\">\n {formatChanges.map((change, i) => (\n <div key={i} className=\"rdv-format-change\">\n <span className=\"rdv-format-change__property\">{change.property}</span>\n <span className=\"rdv-format-change__values\">\n {change.oldValue && (\n <span className=\"rdv-format-change__old\">{change.oldValue}</span>\n )}\n {change.oldValue && change.newValue && (\n <span className=\"rdv-format-change__arrow\">→</span>\n )}\n {change.newValue && (\n <span className=\"rdv-format-change__new\">{change.newValue}</span>\n )}\n {!change.oldValue && change.newValue && (\n <span className=\"rdv-format-change__added\">(added)</span>\n )}\n {change.oldValue && !change.newValue && (\n <span className=\"rdv-format-change__removed\">(removed)</span>\n )}\n </span>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import { useState, useCallback, useRef, useEffect, useMemo } from 'react';\nimport { useDocxodus, PaginatedDocument } from 'docxodus/react';\nimport type { PaginationResult, Revision } from 'docxodus/react';\nimport { CommentRenderMode, PaginationMode, AnnotationLabelMode, getDocumentMetadata } from 'docxodus';\nimport type { DocumentMetadata } from 'docxodus';\nimport { createWorkerDocxodus, isWorkerSupported } from 'docxodus/worker';\nimport type { WorkerDocxodus } from 'docxodus/worker';\nimport type {\n DocumentViewerProps,\n ViewerSettings,\n CommentMode,\n AnnotationMode,\n ViewMode,\n} from './types';\nimport { DEFAULT_SETTINGS } from './types';\nimport { RevisionPanel } from './components/RevisionPanel';\n\nfunction getCommentRenderMode(mode: CommentMode): CommentRenderMode {\n switch (mode) {\n case 'endnote': return CommentRenderMode.EndnoteStyle;\n case 'inline': return CommentRenderMode.Inline;\n case 'margin': return CommentRenderMode.Margin;\n default: return CommentRenderMode.Disabled;\n }\n}\n\nfunction getAnnotationLabelMode(mode: AnnotationMode): AnnotationLabelMode | undefined {\n switch (mode) {\n case 'above': return AnnotationLabelMode.Above;\n case 'inline': return AnnotationLabelMode.Inline;\n case 'tooltip': return AnnotationLabelMode.Tooltip;\n case 'none': return AnnotationLabelMode.None;\n default: return undefined;\n }\n}\n\nexport function DocumentViewer({\n file: controlledFile,\n html: controlledHtml,\n onFileChange,\n onConversionStart,\n onConversionComplete,\n onError,\n onPageChange,\n onRevisionsExtracted,\n settings: controlledSettings,\n defaultSettings,\n onSettingsChange,\n className,\n style,\n toolbar = 'top',\n showSettingsButton = true,\n showRevisionsTab = true,\n placeholder = 'Open a DOCX file to view',\n wasmBasePath,\n useWorker = true,\n}: DocumentViewerProps) {\n // Merge default settings\n const mergedDefaults = useMemo(\n () => ({ ...DEFAULT_SETTINGS, ...defaultSettings }),\n [defaultSettings]\n );\n\n // Internal state (uncontrolled mode)\n const [internalFile, setInternalFile] = useState<File | null>(null);\n const [internalHtml, setInternalHtml] = useState<string | null>(null);\n const [internalSettings, setInternalSettings] = useState<ViewerSettings>(mergedDefaults);\n\n // Determine which values to use (controlled vs uncontrolled)\n const file = controlledFile !== undefined ? controlledFile : internalFile;\n const html = controlledHtml !== undefined ? controlledHtml : internalHtml;\n const settings = useMemo(\n () => controlledSettings\n ? { ...mergedDefaults, ...controlledSettings }\n : internalSettings,\n [controlledSettings, mergedDefaults, internalSettings]\n );\n\n // Docxodus hook (used when not in worker mode)\n const hookResult = useDocxodus(wasmBasePath);\n\n // Worker instance state (used when useWorker=true)\n const [worker, setWorker] = useState<WorkerDocxodus | null>(null);\n const [workerReady, setWorkerReady] = useState(false);\n const [workerLoading, setWorkerLoading] = useState(false);\n const [workerError, setWorkerError] = useState<Error | null>(null);\n\n // Create/destroy worker based on useWorker prop\n const workerRef = useRef<WorkerDocxodus | null>(null);\n\n useEffect(() => {\n if (!useWorker || !isWorkerSupported()) {\n return;\n }\n\n let cancelled = false;\n setWorkerLoading(true);\n setWorkerError(null);\n\n createWorkerDocxodus({ wasmBasePath })\n .then((workerInstance) => {\n if (!cancelled) {\n workerRef.current = workerInstance;\n setWorker(workerInstance);\n setWorkerReady(true);\n setWorkerLoading(false);\n } else {\n workerInstance.terminate();\n }\n })\n .catch((err) => {\n if (!cancelled) {\n setWorkerError(err instanceof Error ? err : new Error(String(err)));\n setWorkerLoading(false);\n }\n });\n\n return () => {\n cancelled = true;\n if (workerRef.current) {\n workerRef.current.terminate();\n workerRef.current = null;\n setWorker(null);\n setWorkerReady(false);\n }\n };\n }, [useWorker, wasmBasePath]);\n\n // Unified ready/loading/error state\n const isReady = useWorker ? workerReady : hookResult.isReady;\n const isLoading = useWorker ? workerLoading : hookResult.isLoading;\n const initError = useWorker ? workerError : hookResult.error;\n\n // Local UI state\n const [isConverting, setIsConverting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [fileName, setFileName] = useState<string>('');\n const [currentPage, setCurrentPage] = useState(1);\n const [totalPages, setTotalPages] = useState(0);\n const [showSettings, setShowSettings] = useState(false);\n const [viewMode, setViewMode] = useState<ViewMode>('document');\n const [revisions, setRevisions] = useState<Revision[]>([]);\n const [isExtractingRevisions, setIsExtractingRevisions] = useState(false);\n\n // Document metadata for progressive loading placeholders\n const [documentMetadata, setDocumentMetadata] = useState<DocumentMetadata | null>(null);\n\n const paginatedContainerRef = useRef<HTMLDivElement>(null);\n\n // Build conversion options from settings\n const getConvertOptions = useCallback(() => ({\n commentRenderMode: getCommentRenderMode(settings.commentMode),\n pageTitle: settings.pageTitle,\n cssPrefix: settings.cssPrefix,\n fabricateClasses: settings.fabricateClasses,\n additionalCss: settings.additionalCss || undefined,\n commentCssClassPrefix: settings.commentCssClassPrefix,\n paginationMode: PaginationMode.Paginated,\n paginationScale: settings.paginationScale,\n renderAnnotations: settings.annotationMode !== 'disabled',\n annotationLabelMode: getAnnotationLabelMode(settings.annotationMode),\n annotationCssClassPrefix: settings.annotationCssClassPrefix,\n renderFootnotesAndEndnotes: settings.renderFootnotesAndEndnotes,\n renderHeadersAndFooters: settings.renderHeadersAndFooters,\n renderTrackedChanges: settings.renderTrackedChanges,\n showDeletedContent: settings.showDeletedContent,\n renderMoveOperations: settings.renderMoveOperations,\n }), [settings]);\n\n // Fetch document metadata quickly (for progressive loading placeholders)\n const fetchMetadata = useCallback(async (fileToFetch: File) => {\n try {\n // Use worker's getDocumentMetadata if available, otherwise direct call\n const metadata = useWorker && worker\n ? await worker.getDocumentMetadata(fileToFetch)\n : await getDocumentMetadata(fileToFetch);\n setDocumentMetadata(metadata);\n } catch {\n // Metadata extraction is non-critical, silently fail\n setDocumentMetadata(null);\n }\n }, [useWorker, worker]);\n\n // Extract revisions from document\n const extractRevisions = useCallback(async (fileToExtract: File) => {\n if (!isReady || !showRevisionsTab) return;\n\n setIsExtractingRevisions(true);\n try {\n const extractedRevisions = useWorker && worker\n ? await worker.getRevisions(fileToExtract)\n : await hookResult.getRevisions(fileToExtract);\n setRevisions(extractedRevisions);\n onRevisionsExtracted?.(extractedRevisions);\n } catch {\n // Revision extraction is non-critical, silently fail\n setRevisions([]);\n } finally {\n setIsExtractingRevisions(false);\n }\n }, [isReady, useWorker, worker, hookResult, showRevisionsTab, onRevisionsExtracted]);\n\n // Convert file to HTML\n const convert = useCallback(async (fileToConvert: File) => {\n if (!isReady) return;\n\n setIsConverting(true);\n setError(null);\n setRevisions([]);\n setViewMode('document');\n // Don't reset documentMetadata here - we want to show placeholders during conversion\n onConversionStart?.();\n\n // Allow React to render loading state before heavy WASM work (only needed for non-worker mode)\n if (!useWorker) {\n await new Promise(resolve => requestAnimationFrame(() => requestAnimationFrame(resolve)));\n }\n\n try {\n const result = useWorker && worker\n ? await worker.convertDocxToHtml(fileToConvert, getConvertOptions())\n : await hookResult.convertToHtml(fileToConvert, getConvertOptions());\n\n if (controlledHtml === undefined) {\n setInternalHtml(result);\n }\n onConversionComplete?.(result);\n\n // Extract revisions in background after conversion\n extractRevisions(fileToConvert);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n onError?.(error);\n } finally {\n setIsConverting(false);\n }\n }, [isReady, useWorker, worker, hookResult, getConvertOptions, controlledHtml, onConversionStart, onConversionComplete, onError, extractRevisions]);\n\n // Auto-convert when WASM ready and file available\n useEffect(() => {\n if (isReady && file && !html && !isConverting && controlledHtml === undefined) {\n convert(file);\n }\n }, [isReady, file, html, isConverting, convert, controlledHtml]);\n\n // Handle file input change\n const handleFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const selectedFile = e.target.files?.[0];\n if (selectedFile) {\n setFileName(selectedFile.name);\n setError(null);\n setCurrentPage(1);\n setTotalPages(0);\n setDocumentMetadata(null); // Reset metadata from previous file\n\n if (controlledFile === undefined) {\n setInternalFile(selectedFile);\n setInternalHtml(null);\n }\n onFileChange?.(selectedFile);\n\n // Fetch metadata first (fast) - this enables showing page placeholders\n // while the full conversion runs\n fetchMetadata(selectedFile);\n\n if (isReady && controlledHtml === undefined) {\n await convert(selectedFile);\n }\n }\n };\n\n // Reconvert with current settings\n const reconvert = useCallback(async () => {\n if (file) {\n if (controlledHtml === undefined) {\n setInternalHtml(null);\n }\n await convert(file);\n }\n }, [file, convert, controlledHtml]);\n\n // Clear document\n const handleClear = () => {\n if (controlledFile === undefined) {\n setInternalFile(null);\n }\n if (controlledHtml === undefined) {\n setInternalHtml(null);\n }\n setError(null);\n setFileName('');\n setCurrentPage(1);\n setTotalPages(0);\n setRevisions([]);\n setViewMode('document');\n setDocumentMetadata(null);\n onFileChange?.(null);\n\n const input = document.getElementById('rdv-file-input') as HTMLInputElement;\n if (input) input.value = '';\n };\n\n // Update settings\n const updateSettings = useCallback((updates: Partial<ViewerSettings>) => {\n const newSettings = { ...settings, ...updates };\n if (controlledSettings === undefined) {\n setInternalSettings(newSettings);\n }\n onSettingsChange?.(newSettings);\n }, [settings, controlledSettings, onSettingsChange]);\n\n // Zoom controls\n const handleZoomIn = () => updateSettings({\n paginationScale: Math.min(settings.paginationScale + 0.1, 2.0)\n });\n const handleZoomOut = () => updateSettings({\n paginationScale: Math.max(settings.paginationScale - 0.1, 0.3)\n });\n const handleZoomChange = (value: number) => updateSettings({\n paginationScale: Math.max(0.3, Math.min(2.0, value))\n });\n\n // Page navigation\n const goToPage = (pageNum: number) => {\n const container = paginatedContainerRef.current;\n if (!container || pageNum < 1 || pageNum > totalPages) return;\n const pageElement = container.querySelector(`[data-page-number=\"${pageNum}\"]`);\n if (pageElement) {\n pageElement.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n };\n\n const goToPreviousPage = () => currentPage > 1 && goToPage(currentPage - 1);\n const goToNextPage = () => currentPage < totalPages && goToPage(currentPage + 1);\n\n // Handle page visibility changes\n const handlePageVisible = (pageNumber: number) => {\n setCurrentPage(pageNumber);\n onPageChange?.(pageNumber, totalPages);\n };\n\n // Handle footnote/anchor clicks\n useEffect(() => {\n const container = paginatedContainerRef.current;\n if (!container) return;\n\n const handleAnchorClick = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n const anchor = target.closest('a[href^=\"#\"]') as HTMLAnchorElement | null;\n if (!anchor) return;\n\n const href = anchor.getAttribute('href');\n if (!href || !href.startsWith('#')) return;\n\n e.preventDefault();\n const targetId = href.substring(1);\n const targetElement = container.querySelector(`[id=\"${targetId}\"], [name=\"${targetId}\"]`);\n\n if (targetElement) {\n targetElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\n targetElement.classList.add('rdv-footnote-highlight');\n setTimeout(() => targetElement.classList.remove('rdv-footnote-highlight'), 2000);\n }\n };\n\n container.addEventListener('click', handleAnchorClick);\n return () => container.removeEventListener('click', handleAnchorClick);\n }, [html]);\n\n // Notify parent of page changes when totalPages updates\n useEffect(() => {\n if (totalPages > 0) {\n onPageChange?.(currentPage, totalPages);\n }\n }, [totalPages, currentPage, onPageChange]);\n\n const isProcessing = isConverting || isLoading;\n\n // Settings Modal\n const SettingsModal = () => (\n <div className=\"rdv-settings-overlay\" onClick={() => setShowSettings(false)}>\n <div className=\"rdv-settings-modal\" onClick={(e) => e.stopPropagation()}>\n <div className=\"rdv-settings-header\">\n <h3>Viewer Settings</h3>\n <button className=\"rdv-settings-close\" onClick={() => setShowSettings(false)}>×</button>\n </div>\n <div className=\"rdv-settings-body\">\n <div className=\"rdv-settings-section\">\n <h4>Display Options</h4>\n <label className=\"rdv-settings-checkbox\">\n <input\n type=\"checkbox\"\n checked={settings.renderFootnotesAndEndnotes}\n onChange={(e) => updateSettings({ renderFootnotesAndEndnotes: e.target.checked })}\n />\n <span>Show footnotes and endnotes</span>\n </label>\n <label className=\"rdv-settings-checkbox\">\n <input\n type=\"checkbox\"\n checked={settings.renderHeadersAndFooters}\n onChange={(e) => updateSettings({ renderHeadersAndFooters: e.target.checked })}\n />\n <span>Show headers and footers</span>\n </label>\n <label className=\"rdv-settings-checkbox\">\n <input\n type=\"checkbox\"\n checked={settings.showPageNumbers}\n onChange={(e) => updateSettings({ showPageNumbers: e.target.checked })}\n />\n <span>Show page numbers</span>\n </label>\n </div>\n\n <div className=\"rdv-settings-section\">\n <h4>Comment Rendering</h4>\n <div className=\"rdv-settings-radio-group\">\n {(['disabled', 'endnote', 'inline', 'margin'] as CommentMode[]).map((mode) => (\n <label key={mode} className=\"rdv-settings-radio\">\n <input\n type=\"radio\"\n name=\"commentMode\"\n checked={settings.commentMode === mode}\n onChange={() => updateSettings({ commentMode: mode })}\n />\n <span>{mode.charAt(0).toUpperCase() + mode.slice(1)}{mode === 'endnote' ? 's' : ''}</span>\n </label>\n ))}\n </div>\n </div>\n\n <div className=\"rdv-settings-section\">\n <h4>Annotation Rendering</h4>\n <div className=\"rdv-settings-radio-group\">\n {(['disabled', 'above', 'inline', 'tooltip', 'none'] as AnnotationMode[]).map((mode) => (\n <label key={mode} className=\"rdv-settings-radio\">\n <input\n type=\"radio\"\n name=\"annotationMode\"\n checked={settings.annotationMode === mode}\n onChange={() => updateSettings({ annotationMode: mode })}\n />\n <span>{mode === 'none' ? 'Highlight Only' : mode.charAt(0).toUpperCase() + mode.slice(1)}</span>\n </label>\n ))}\n </div>\n </div>\n\n <div className=\"rdv-settings-section\">\n <h4>Tracked Changes</h4>\n <label className=\"rdv-settings-checkbox\">\n <input\n type=\"checkbox\"\n checked={settings.renderTrackedChanges}\n onChange={(e) => updateSettings({ renderTrackedChanges: e.target.checked })}\n />\n <span>Show tracked changes</span>\n </label>\n {settings.renderTrackedChanges && (\n <div className=\"rdv-settings-subsection\">\n <label className=\"rdv-settings-checkbox\">\n <input\n type=\"checkbox\"\n checked={settings.showDeletedContent}\n onChange={(e) => updateSettings({ showDeletedContent: e.target.checked })}\n />\n <span>Show deleted content</span>\n </label>\n <label className=\"rdv-settings-checkbox\">\n <input\n type=\"checkbox\"\n checked={settings.renderMoveOperations}\n onChange={(e) => updateSettings({ renderMoveOperations: e.target.checked })}\n />\n <span>Distinguish move operations</span>\n </label>\n </div>\n )}\n </div>\n </div>\n <div className=\"rdv-settings-footer\">\n <button className=\"rdv-settings-apply\" onClick={() => { reconvert(); setShowSettings(false); }}>\n Apply & Close\n </button>\n </div>\n </div>\n </div>\n );\n\n const hasRevisions = revisions.length > 0;\n\n // Toolbar component\n const Toolbar = () => (\n <div className=\"rdv-toolbar\">\n <div className=\"rdv-toolbar-left\">\n <label htmlFor=\"rdv-file-input\" className=\"rdv-toolbar-file-btn\">\n {fileName || 'Open Document'}\n </label>\n <input\n id=\"rdv-file-input\"\n type=\"file\"\n accept=\".docx\"\n onChange={handleFileChange}\n disabled={isProcessing}\n className=\"rdv-file-input\"\n />\n {fileName && (\n <button className=\"rdv-toolbar-btn rdv-toolbar-clear\" onClick={handleClear} disabled={isProcessing}>\n ×\n </button>\n )}\n {showRevisionsTab && hasRevisions && (\n <>\n <div className=\"rdv-toolbar-separator\" />\n <div className=\"rdv-view-tabs\">\n <button\n className={`rdv-view-tab ${viewMode === 'document' ? 'rdv-view-tab--active' : ''}`}\n onClick={() => setViewMode('document')}\n title=\"View Document\"\n >\n Document\n </button>\n <button\n className={`rdv-view-tab ${viewMode === 'revisions' ? 'rdv-view-tab--active' : ''}`}\n onClick={() => setViewMode('revisions')}\n title=\"View Tracked Changes\"\n >\n Changes ({revisions.length})\n </button>\n </div>\n </>\n )}\n {showRevisionsTab && isExtractingRevisions && (\n <span className=\"rdv-extracting-indicator\" title=\"Extracting tracked changes...\">\n ...\n </span>\n )}\n </div>\n\n <div className=\"rdv-toolbar-center\">\n {html && totalPages > 0 && viewMode === 'document' && (\n <>\n <button\n className=\"rdv-toolbar-btn\"\n onClick={goToPreviousPage}\n disabled={currentPage <= 1}\n title=\"Previous Page\"\n >\n ◀\n </button>\n <div className=\"rdv-page-input-group\">\n <input\n type=\"number\"\n className=\"rdv-page-input\"\n value={currentPage}\n min={1}\n max={totalPages}\n onChange={(e) => {\n const page = parseInt(e.target.value);\n if (!isNaN(page)) goToPage(page);\n }}\n />\n <span className=\"rdv-page-total\">/ {totalPages}</span>\n </div>\n <button\n className=\"rdv-toolbar-btn\"\n onClick={goToNextPage}\n disabled={currentPage >= totalPages}\n title=\"Next Page\"\n >\n ▶\n </button>\n\n <div className=\"rdv-toolbar-separator\" />\n\n <button\n className=\"rdv-toolbar-btn\"\n onClick={handleZoomOut}\n disabled={settings.paginationScale <= 0.3}\n title=\"Zoom Out\"\n >\n −\n </button>\n <select\n className=\"rdv-zoom-select\"\n value={settings.paginationScale}\n onChange={(e) => handleZoomChange(parseFloat(e.target.value))}\n >\n <option value=\"0.5\">50%</option>\n <option value=\"0.75\">75%</option>\n <option value=\"0.8\">80%</option>\n <option value=\"0.9\">90%</option>\n <option value=\"1\">100%</option>\n <option value=\"1.25\">125%</option>\n <option value=\"1.5\">150%</option>\n <option value=\"2\">200%</option>\n </select>\n <button\n className=\"rdv-toolbar-btn\"\n onClick={handleZoomIn}\n disabled={settings.paginationScale >= 2.0}\n title=\"Zoom In\"\n >\n +\n </button>\n </>\n )}\n </div>\n\n <div className=\"rdv-toolbar-right\">\n {showSettingsButton && (\n <button\n className=\"rdv-toolbar-btn rdv-toolbar-settings\"\n onClick={() => setShowSettings(true)}\n title=\"Settings\"\n >\n ⚙\n </button>\n )}\n </div>\n </div>\n );\n\n const rootClassName = ['rdv-viewer', className].filter(Boolean).join(' ');\n\n return (\n <div className={rootClassName} style={style}>\n {toolbar === 'top' && <Toolbar />}\n\n <div className=\"rdv-content\">\n {initError && (\n <div className=\"rdv-message rdv-message--error\">\n <p>Failed to initialize: {initError.message}</p>\n </div>\n )}\n\n {!initError && (isLoading || isConverting) && (\n documentMetadata && isConverting ? (\n // Show page placeholders while converting\n <div className=\"rdv-pages rdv-pages--loading\">\n <div className=\"rdv-page-placeholders\" style={{ backgroundColor: '#525659' }}>\n {Array.from({ length: documentMetadata.estimatedPageCount || 1 }).map((_, index) => {\n // Get section for this page (approximate - use first section if not enough)\n const section = documentMetadata.sections[\n Math.min(index, documentMetadata.sections.length - 1)\n ];\n // Calculate scaled dimensions (points to pixels, then apply scale)\n const scale = settings.paginationScale;\n const width = Math.round((section?.pageWidthPt || 612) * (96 / 72) * scale);\n const height = Math.round((section?.pageHeightPt || 792) * (96 / 72) * scale);\n\n return (\n <div\n key={index}\n className=\"rdv-page-placeholder\"\n style={{\n width: `${width}px`,\n height: `${height}px`,\n marginBottom: '20px',\n }}\n >\n <div className=\"rdv-page-placeholder__shimmer\" />\n {index === 0 && (\n <div className=\"rdv-page-placeholder__info\">\n <div className=\"rdv-spinner rdv-spinner--small\"></div>\n <span>Converting document...</span>\n <span className=\"rdv-page-placeholder__count\">\n ~{documentMetadata.estimatedPageCount} page{documentMetadata.estimatedPageCount !== 1 ? 's' : ''}\n </span>\n </div>\n )}\n <div className=\"rdv-page-placeholder__number\">{index + 1}</div>\n </div>\n );\n })}\n </div>\n </div>\n ) : (\n <div className=\"rdv-message\">\n <div className=\"rdv-spinner\"></div>\n <p>\n {isLoading && file\n ? 'Loading engine & preparing document...'\n : isLoading\n ? 'Loading document engine...'\n : 'Processing document...'}\n </p>\n </div>\n )\n )}\n\n {!isLoading && !initError && !html && !isConverting && !file && (\n <div className=\"rdv-message\">\n <div className=\"rdv-message__icon\">📄</div>\n <p>{placeholder}</p>\n </div>\n )}\n\n {error && !isConverting && (\n <div className=\"rdv-message rdv-message--error\">\n <p>Error: {error.message}</p>\n </div>\n )}\n\n {html && !isConverting && viewMode === 'document' && (\n <div ref={paginatedContainerRef} className=\"rdv-pages\">\n <PaginatedDocument\n html={html}\n scale={settings.paginationScale}\n showPageNumbers={settings.showPageNumbers}\n pageGap={20}\n backgroundColor=\"#525659\"\n className=\"rdv-paginated-document\"\n onPaginationComplete={(result: PaginationResult) => {\n setTotalPages(result.totalPages);\n }}\n onPageVisible={handlePageVisible}\n />\n </div>\n )}\n\n {html && !isConverting && viewMode === 'revisions' && (\n <RevisionPanel revisions={revisions} />\n )}\n </div>\n\n {toolbar === 'bottom' && <Toolbar />}\n\n {showSettings && <SettingsModal />}\n </div>\n );\n}\n"],"names":["generateId","toBytes","document","buffer","deriveWasmBasePath","scripts","src","createWorkerDocxodus","options","wasmBasePath","workerScriptPath","worker","pendingRequests","isWorkerActive","event","response","pending","error","sendRequest","request","transfer","resolve","reject","initResponse","bytes","original","modified","originalBytes","modifiedBytes","isWorkerSupported","DEFAULT_SETTINGS","getRevisionTypeLabel","revision","isInsertion","isDeletion","isMove","isFormatChange","getRevisionTypeClass","formatDate","isoDate","truncateText","text","maxLength","isValidPropertyValue","value","formatPropertyName","name","str","formatPropertyValue","getFormatChanges","oldProperties","newProperties","changes","processedKeys","key","newValue","RevisionPanel","revisions","filter","setFilter","useState","expandedIds","setExpandedIds","filteredRevisions","useMemo","rev","stats","toggleExpanded","index","prev","next","jsxs","jsx","e","isExpanded","needsTruncation","formatChanges","change","i","getCommentRenderMode","mode","CommentRenderMode","getAnnotationLabelMode","AnnotationLabelMode","DocumentViewer","controlledFile","controlledHtml","onFileChange","onConversionStart","onConversionComplete","onError","onPageChange","onRevisionsExtracted","controlledSettings","defaultSettings","onSettingsChange","className","style","toolbar","showSettingsButton","showRevisionsTab","placeholder","useWorker","mergedDefaults","internalFile","setInternalFile","internalHtml","setInternalHtml","internalSettings","setInternalSettings","file","html","settings","hookResult","useDocxodus","setWorker","workerReady","setWorkerReady","workerLoading","setWorkerLoading","workerError","setWorkerError","workerRef","useRef","useEffect","cancelled","workerInstance","err","isReady","isLoading","initError","isConverting","setIsConverting","setError","fileName","setFileName","currentPage","setCurrentPage","totalPages","setTotalPages","showSettings","setShowSettings","viewMode","setViewMode","setRevisions","isExtractingRevisions","setIsExtractingRevisions","documentMetadata","setDocumentMetadata","paginatedContainerRef","getConvertOptions","useCallback","PaginationMode","fetchMetadata","fileToFetch","metadata","getDocumentMetadata","extractRevisions","fileToExtract","extractedRevisions","convert","fileToConvert","result","handleFileChange","selectedFile","reconvert","handleClear","input","updateSettings","updates","newSettings","handleZoomIn","handleZoomOut","handleZoomChange","goToPage","pageNum","container","pageElement","goToPreviousPage","goToNextPage","handlePageVisible","pageNumber","handleAnchorClick","anchor","href","targetId","targetElement","isProcessing","SettingsModal","hasRevisions","Toolbar","Fragment","page","rootClassName","_","section","scale","width","height","PaginatedDocument"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { DocumentViewerProps } from './types';
|
|
2
|
-
export declare function DocumentViewer({ file: controlledFile, html: controlledHtml, onFileChange, onConversionStart, onConversionComplete, onError, onPageChange, settings: controlledSettings, defaultSettings, onSettingsChange, className, style, toolbar, showSettingsButton, placeholder, wasmBasePath, }: DocumentViewerProps): import("react/jsx-runtime").JSX.Element;
|
|
2
|
+
export declare function DocumentViewer({ file: controlledFile, html: controlledHtml, onFileChange, onConversionStart, onConversionComplete, onError, onPageChange, onRevisionsExtracted, settings: controlledSettings, defaultSettings, onSettingsChange, className, style, toolbar, showSettingsButton, showRevisionsTab, placeholder, wasmBasePath, useWorker, }: DocumentViewerProps): import("react/jsx-runtime").JSX.Element;
|
|
3
3
|
//# sourceMappingURL=DocumentViewer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DocumentViewer.d.ts","sourceRoot":"","sources":["../../src/DocumentViewer.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"DocumentViewer.d.ts","sourceRoot":"","sources":["../../src/DocumentViewer.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,mBAAmB,EAKpB,MAAM,SAAS,CAAC;AAuBjB,wBAAgB,cAAc,CAAC,EAC7B,IAAI,EAAE,cAAc,EACpB,IAAI,EAAE,cAAc,EACpB,YAAY,EACZ,iBAAiB,EACjB,oBAAoB,EACpB,OAAO,EACP,YAAY,EACZ,oBAAoB,EACpB,QAAQ,EAAE,kBAAkB,EAC5B,eAAe,EACf,gBAAgB,EAChB,SAAS,EACT,KAAK,EACL,OAAe,EACf,kBAAyB,EACzB,gBAAuB,EACvB,WAAwC,EACxC,YAAY,EACZ,SAAgB,GACjB,EAAE,mBAAmB,2CAqqBrB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DocumentViewer.test.d.ts","sourceRoot":"","sources":["../../src/DocumentViewer.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Revision } from 'docxodus/react';
|
|
2
|
+
interface RevisionPanelProps {
|
|
3
|
+
revisions: Revision[];
|
|
4
|
+
}
|
|
5
|
+
export declare function RevisionPanel({ revisions }: RevisionPanelProps): import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=RevisionPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RevisionPanel.d.ts","sourceRoot":"","sources":["../../../src/components/RevisionPanel.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG/C,UAAU,kBAAkB;IAC1B,SAAS,EAAE,QAAQ,EAAE,CAAC;CACvB;AAgHD,wBAAgB,aAAa,CAAC,EAAE,SAAS,EAAE,EAAE,kBAAkB,2CA+J9D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RevisionPanel.test.d.ts","sourceRoot":"","sources":["../../../src/components/RevisionPanel.test.tsx"],"names":[],"mappings":""}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -4,7 +4,9 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import './styles/DocumentViewer.css';
|
|
6
6
|
export { DocumentViewer } from './DocumentViewer';
|
|
7
|
-
export type { DocumentViewerProps, ViewerSettings, CommentMode, AnnotationMode, } from './types';
|
|
7
|
+
export type { DocumentViewerProps, ViewerSettings, CommentMode, AnnotationMode, ViewMode, } from './types';
|
|
8
8
|
export { DEFAULT_SETTINGS } from './types';
|
|
9
|
-
export type { PaginationResult } from 'docxodus/react';
|
|
9
|
+
export type { PaginationResult, Revision } from 'docxodus/react';
|
|
10
|
+
export { RevisionType, isInsertion, isDeletion, isMove, isFormatChange } from 'docxodus';
|
|
11
|
+
export { isWorkerSupported } from 'docxodus/worker';
|
|
10
12
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,6BAA6B,CAAC;AAGrC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD,YAAY,EACV,mBAAmB,EACnB,cAAc,EACd,WAAW,EACX,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,6BAA6B,CAAC;AAGrC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD,YAAY,EACV,mBAAmB,EACnB,cAAc,EACd,WAAW,EACX,cAAc,EACd,QAAQ,GACT,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAG3C,YAAY,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACzF,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../src/test/setup.tsx"],"names":[],"mappings":"AAAA,OAAO,kCAAkC,CAAA"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export type CommentMode = 'disabled' | 'endnote' | 'inline' | 'margin';
|
|
5
5
|
export type AnnotationMode = 'disabled' | 'above' | 'inline' | 'tooltip' | 'none';
|
|
6
|
+
export type ViewMode = 'document' | 'revisions';
|
|
6
7
|
export interface ViewerSettings {
|
|
7
8
|
/** Zoom scale (0.3 - 2.0) */
|
|
8
9
|
paginationScale: number;
|
|
@@ -50,6 +51,8 @@ export interface DocumentViewerProps {
|
|
|
50
51
|
onError?: (error: Error) => void;
|
|
51
52
|
/** Callback when visible page changes */
|
|
52
53
|
onPageChange?: (page: number, total: number) => void;
|
|
54
|
+
/** Callback when revisions are extracted from document */
|
|
55
|
+
onRevisionsExtracted?: (revisions: import('docxodus').Revision[]) => void;
|
|
53
56
|
/** Initial/controlled viewer settings */
|
|
54
57
|
settings?: Partial<ViewerSettings>;
|
|
55
58
|
/** Default settings (used for uncontrolled mode) */
|
|
@@ -64,10 +67,21 @@ export interface DocumentViewerProps {
|
|
|
64
67
|
toolbar?: 'top' | 'bottom' | 'none';
|
|
65
68
|
/** Show settings button in toolbar */
|
|
66
69
|
showSettingsButton?: boolean;
|
|
70
|
+
/** Show revisions tab when document has tracked changes */
|
|
71
|
+
showRevisionsTab?: boolean;
|
|
67
72
|
/** Placeholder text when no document is loaded */
|
|
68
73
|
placeholder?: string;
|
|
69
|
-
/**
|
|
74
|
+
/**
|
|
75
|
+
* Base path for WASM files.
|
|
76
|
+
* Leave undefined for auto-detection (recommended for most setups).
|
|
77
|
+
* Only specify if hosting WASM files at a custom location.
|
|
78
|
+
*/
|
|
70
79
|
wasmBasePath?: string;
|
|
80
|
+
/**
|
|
81
|
+
* Use Web Worker for document conversion (keeps UI responsive).
|
|
82
|
+
* Recommended for large documents. Default: false
|
|
83
|
+
*/
|
|
84
|
+
useWorker?: boolean;
|
|
71
85
|
}
|
|
72
86
|
export declare const DEFAULT_SETTINGS: ViewerSettings;
|
|
73
87
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;AACvE,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-docxodus-viewer",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "A React component for viewing DOCX documents in the browser, powered by Docxodus",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/react-docxodus-viewer.cjs.js",
|
|
@@ -26,6 +26,9 @@
|
|
|
26
26
|
"build:lib": "BUILD_LIB=true vite build && tsc -p tsconfig.lib.json",
|
|
27
27
|
"build:demo": "tsc -b && vite build",
|
|
28
28
|
"lint": "eslint .",
|
|
29
|
+
"test": "vitest run",
|
|
30
|
+
"test:watch": "vitest",
|
|
31
|
+
"test:coverage": "vitest run --coverage",
|
|
29
32
|
"preview": "vite preview",
|
|
30
33
|
"prepublishOnly": "npm run build:lib"
|
|
31
34
|
},
|
|
@@ -49,25 +52,30 @@
|
|
|
49
52
|
"author": "",
|
|
50
53
|
"license": "MIT",
|
|
51
54
|
"peerDependencies": {
|
|
52
|
-
"docxodus": ">=
|
|
55
|
+
"docxodus": ">=4.0",
|
|
53
56
|
"react": ">=18"
|
|
54
57
|
},
|
|
55
|
-
"dependencies": {},
|
|
56
58
|
"devDependencies": {
|
|
57
59
|
"@eslint/js": "^9.39.1",
|
|
60
|
+
"@testing-library/jest-dom": "^6.9.1",
|
|
61
|
+
"@testing-library/react": "^16.3.0",
|
|
62
|
+
"@testing-library/user-event": "^14.6.1",
|
|
58
63
|
"@types/node": "^24.10.1",
|
|
59
64
|
"@types/react": "^19.2.5",
|
|
60
65
|
"@types/react-dom": "^19.2.3",
|
|
61
66
|
"@vitejs/plugin-react": "^5.1.1",
|
|
62
|
-
"
|
|
67
|
+
"@vitest/coverage-v8": "^4.0.14",
|
|
68
|
+
"docxodus": "^4.0.3",
|
|
63
69
|
"eslint": "^9.39.1",
|
|
64
70
|
"eslint-plugin-react-hooks": "^7.0.1",
|
|
65
71
|
"eslint-plugin-react-refresh": "^0.4.24",
|
|
66
72
|
"globals": "^16.5.0",
|
|
73
|
+
"jsdom": "^27.2.0",
|
|
67
74
|
"react": "^19.2.0",
|
|
68
75
|
"react-dom": "^19.2.0",
|
|
69
76
|
"typescript": "~5.9.3",
|
|
70
77
|
"typescript-eslint": "^8.46.4",
|
|
71
|
-
"vite": "^7.2.4"
|
|
78
|
+
"vite": "^7.2.4",
|
|
79
|
+
"vitest": "^4.0.14"
|
|
72
80
|
}
|
|
73
81
|
}
|