@files-preview-app/preview-file 1.3.6 → 1.3.7
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/angular.cjs +497 -130
- package/dist/angular.cjs.map +1 -1
- package/dist/angular.js +497 -130
- package/dist/angular.js.map +1 -1
- package/dist/index.cjs +497 -130
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +497 -130
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +497 -130
- package/dist/react.cjs.map +1 -1
- package/dist/react.js +497 -130
- package/dist/react.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/vue.cjs +497 -130
- package/dist/vue.cjs.map +1 -1
- package/dist/vue.d.cts +2 -2
- package/dist/vue.d.ts +2 -2
- package/dist/vue.js +497 -130
- package/dist/vue.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../core/src/events.ts","../../core/src/detect.ts","../../core/src/utils.ts","../../core/src/transfer.ts","../../core/src/toolbar/icons.ts","../../core/src/toolbar/toolbar-controller.ts","../../core/src/thumbnail/thumbnail-panel.ts","../../core/src/engine.ts","../../core/src/cfbf/cfbf-reader.ts","../../plugins/pdf/src/index.ts","../../plugins/media/src/index.ts","../../plugins/docx/src/index.ts","../../plugins/excel/src/index.ts","../../plugins/csv/src/index.ts","../../plugins/code/src/index.ts","../../plugins/archive/src/index.ts","../../plugins/markdown/src/index.ts","../../plugins/pptx/src/index.ts","../../plugins/3d/src/index.ts","../../plugins/rtf/src/index.ts","../../plugins/html-preview/src/index.ts","../../plugins/opendocument/src/index.ts","../../plugins/doc/src/index.ts","../../plugins/ppt/src/index.ts","../src/index.ts"],"names":["DOMPurify","newWin","pdfjsLib","docx","unzipSync","strFromU8","text","XLSX","hljs","unzip","marked","PptxRenderer","THREE","OrbitControls","STLLoader","OBJLoader","RTFJS","p","fflate","FilePreviewViewer"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { EventHandler, Unsubscribe } from './types';\r\n\r\n/**\r\n * Lightweight typed event emitter for the file preview system.\r\n * Supports on/off/emit with automatic cleanup.\r\n */\r\nexport class EventEmitter {\r\n private listeners = new Map<string, Set<EventHandler>>();\r\n\r\n /**\r\n * Subscribe to an event.\r\n * @returns An unsubscribe function.\r\n */\r\n on(event: string, handler: EventHandler): Unsubscribe {\r\n if (!this.listeners.has(event)) {\r\n this.listeners.set(event, new Set());\r\n }\r\n this.listeners.get(event)!.add(handler);\r\n\r\n return () => this.off(event, handler);\r\n }\r\n\r\n /**\r\n * Unsubscribe from an event.\r\n */\r\n off(event: string, handler: EventHandler): void {\r\n const handlers = this.listeners.get(event);\r\n if (handlers) {\r\n handlers.delete(handler);\r\n if (handlers.size === 0) {\r\n this.listeners.delete(event);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Emit an event with optional payload.\r\n */\r\n emit(event: string, data?: unknown): void {\r\n const handlers = this.listeners.get(event);\r\n if (handlers) {\r\n for (const handler of handlers) {\r\n try {\r\n handler(data);\r\n } catch (error) {\r\n console.error(`[FilePreview] Error in '${event}' handler:`, error);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Remove all listeners, optionally for a specific event.\r\n */\r\n removeAll(event?: string): void {\r\n if (event) {\r\n this.listeners.delete(event);\r\n } else {\r\n this.listeners.clear();\r\n }\r\n }\r\n\r\n /**\r\n * Get the count of listeners for a specific event.\r\n */\r\n listenerCount(event: string): number {\r\n return this.listeners.get(event)?.size ?? 0;\r\n }\r\n}\r\n","import type { FileSource, FileMetadata, FileInfo } from './types';\r\n\r\n/** Magic number signatures for common file formats */\r\nconst MAGIC_NUMBERS: Array<{ bytes: number[]; mask?: number[]; offset?: number; mime: string }> = [\r\n { bytes: [0x25, 0x50, 0x44, 0x46], mime: 'application/pdf' }, // %PDF\r\n { bytes: [0x50, 0x4B, 0x03, 0x04], mime: 'application/zip' }, // PK.. (ZIP/DOCX/XLSX/PPTX/ODT/ODS/ODP)\r\n { bytes: [0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1], mime: 'application/x-cfbf' }, // CFBF/OLE2 (DOC/XLS/PPT)\r\n { bytes: [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A], mime: 'image/png' }, // PNG\r\n { bytes: [0xFF, 0xD8, 0xFF], mime: 'image/jpeg' }, // JPEG\r\n { bytes: [0x47, 0x49, 0x46, 0x38], mime: 'image/gif' }, // GIF87a/GIF89a\r\n { bytes: [0x42, 0x4D], mime: 'image/bmp' }, // BMP\r\n { bytes: [0x00, 0x00, 0x01, 0x00], mime: 'image/x-icon' }, // ICO\r\n { bytes: [0x49, 0x49, 0x2A, 0x00], mime: 'image/tiff' }, // TIFF (LE)\r\n { bytes: [0x4D, 0x4D, 0x00, 0x2A], mime: 'image/tiff' }, // TIFF (BE)\r\n { bytes: [0x1A, 0x45, 0xDF, 0xA3], mime: 'video/webm' }, // WebM/MKV\r\n { bytes: [0x66, 0x74, 0x79, 0x70], mime: 'video/mp4', offset: 4 }, // MP4 (ftyp)\r\n { bytes: [0x49, 0x44, 0x33], mime: 'audio/mpeg' }, // MP3 (ID3)\r\n { bytes: [0xFF, 0xFB], mime: 'audio/mpeg' }, // MP3 (sync)\r\n { bytes: [0xFF, 0xF3], mime: 'audio/mpeg' }, // MP3 (sync)\r\n { bytes: [0x4F, 0x67, 0x67, 0x53], mime: 'audio/ogg' }, // OGG\r\n { bytes: [0x52, 0x49, 0x46, 0x46], mime: 'audio/wav' }, // WAV/RIFF (also WebP)\r\n { bytes: [0x66, 0x4C, 0x61, 0x43], mime: 'audio/flac' }, // FLAC\r\n { bytes: [0x7B, 0x5C, 0x72, 0x74, 0x66], mime: 'text/rtf' }, // RTF\r\n];\r\n\r\n/** Extension to MIME type mapping */\r\nconst EXTENSION_MIME_MAP: Record<string, string> = {\r\n // Documents — Modern OOXML\r\n '.pdf': 'application/pdf',\r\n '.docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\r\n '.docm': 'application/vnd.ms-word.document.macroEnabled.12',\r\n '.dotx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',\r\n '.dotm': 'application/vnd.ms-word.template.macroEnabled.12',\r\n '.xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\r\n '.xlsm': 'application/vnd.ms-excel.sheet.macroEnabled.12',\r\n '.xlsb': 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',\r\n '.xltx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',\r\n '.xltm': 'application/vnd.ms-excel.template.macroEnabled.12',\r\n '.xls': 'application/vnd.ms-excel',\r\n '.pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\r\n '.ppsx': 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',\r\n '.pptm': 'application/vnd.ms-powerpoint.presentation.macroEnabled.12',\r\n '.ppsm': 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12',\r\n '.potx': 'application/vnd.openxmlformats-officedocument.presentationml.template',\r\n '.potm': 'application/vnd.ms-powerpoint.template.macroEnabled.12',\r\n '.csv': 'text/csv',\r\n '.tsv': 'text/tab-separated-values',\r\n // Documents — Legacy Binary (CFBF/OLE2)\r\n '.doc': 'application/msword',\r\n '.dot': 'application/msword',\r\n '.ppt': 'application/vnd.ms-powerpoint',\r\n '.pps': 'application/vnd.ms-powerpoint',\r\n '.pot': 'application/vnd.ms-powerpoint',\r\n // Documents — OpenDocument (ODF)\r\n '.odt': 'application/vnd.oasis.opendocument.text',\r\n '.ods': 'application/vnd.oasis.opendocument.spreadsheet',\r\n '.odp': 'application/vnd.oasis.opendocument.presentation',\r\n '.odg': 'application/vnd.oasis.opendocument.graphics',\r\n '.odf': 'application/vnd.oasis.opendocument.formula',\r\n // Documents — RTF\r\n '.rtf': 'text/rtf',\r\n // Images\r\n '.png': 'image/png',\r\n '.jpg': 'image/jpeg',\r\n '.jpeg': 'image/jpeg',\r\n '.gif': 'image/gif',\r\n '.webp': 'image/webp',\r\n '.bmp': 'image/bmp',\r\n '.svg': 'image/svg+xml',\r\n '.ico': 'image/x-icon',\r\n '.tiff': 'image/tiff',\r\n '.tif': 'image/tiff',\r\n // Media\r\n '.mp4': 'video/mp4',\r\n '.webm': 'video/webm',\r\n '.ogg': 'audio/ogg',\r\n '.ogv': 'video/ogg',\r\n '.mov': 'video/quicktime',\r\n '.mp3': 'audio/mpeg',\r\n '.wav': 'audio/wav',\r\n '.aac': 'audio/aac',\r\n '.flac': 'audio/flac',\r\n // Code/Text\r\n '.txt': 'text/plain',\r\n '.log': 'text/plain',\r\n '.json': 'application/json',\r\n '.xml': 'application/xml',\r\n '.html': 'text/html',\r\n '.htm': 'text/html',\r\n '.css': 'text/css',\r\n '.js': 'text/javascript',\r\n '.ts': 'text/typescript',\r\n '.jsx': 'text/jsx',\r\n '.tsx': 'text/tsx',\r\n '.py': 'text/x-python',\r\n '.java': 'text/x-java',\r\n '.c': 'text/x-c',\r\n '.cpp': 'text/x-c++',\r\n '.h': 'text/x-c',\r\n '.go': 'text/x-go',\r\n '.rs': 'text/x-rust',\r\n '.rb': 'text/x-ruby',\r\n '.php': 'text/x-php',\r\n '.sh': 'text/x-shellscript',\r\n '.bash': 'text/x-shellscript',\r\n '.sql': 'text/x-sql',\r\n '.yaml': 'text/yaml',\r\n '.yml': 'text/yaml',\r\n '.toml': 'text/toml',\r\n '.ini': 'text/ini',\r\n '.conf': 'text/plain',\r\n '.env': 'text/plain',\r\n '.md': 'text/markdown',\r\n '.scss': 'text/x-scss',\r\n '.less': 'text/x-less',\r\n '.vue': 'text/x-vue',\r\n '.svelte': 'text/x-svelte',\r\n '.dart': 'text/x-dart',\r\n '.kt': 'text/x-kotlin',\r\n '.swift': 'text/x-swift',\r\n '.r': 'text/x-r',\r\n '.scala': 'text/x-scala',\r\n '.lua': 'text/x-lua',\r\n '.perl': 'text/x-perl',\r\n '.pl': 'text/x-perl',\r\n};\r\n\r\n/**\r\n * Detect MIME type from file buffer magic bytes.\r\n */\r\nexport function detectMagicBytes(buffer: ArrayBuffer): string | null {\r\n const bytes = new Uint8Array(buffer.slice(0, 16));\r\n\r\n for (const sig of MAGIC_NUMBERS) {\r\n const offset = sig.offset ?? 0;\r\n let match = true;\r\n for (let i = 0; i < sig.bytes.length; i++) {\r\n const actual = bytes[offset + i];\r\n const expected = sig.bytes[i];\r\n const mask = sig.mask?.[i] ?? 0xFF;\r\n if ((actual & mask) !== expected) {\r\n match = false;\r\n break;\r\n }\r\n }\r\n if (match) {\r\n // Special case: RIFF could be WAV or WebP\r\n if (sig.mime === 'audio/wav' && bytes.length >= 12) {\r\n const format = String.fromCharCode(bytes[8], bytes[9], bytes[10], bytes[11]);\r\n if (format === 'WEBP') return 'image/webp';\r\n if (format === 'AVI ') return 'video/x-msvideo';\r\n return 'audio/wav';\r\n }\r\n return sig.mime;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Detect ZIP sub-type (OOXML or OpenDocument) by checking ZIP entry names.\r\n * All OOXML formats use ZIP container with PK header.\r\n * OpenDocument formats also use ZIP with a 'mimetype' entry at offset 0.\r\n */\r\nexport function detectOoxmlType(buffer: ArrayBuffer): string | null {\r\n const text = new TextDecoder('ascii', { fatal: false }).decode(\r\n new Uint8Array(buffer.slice(0, 8000))\r\n );\r\n\r\n // OOXML detection\r\n if (text.includes('word/')) {\r\n return 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';\r\n }\r\n if (text.includes('xl/')) {\r\n return 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';\r\n }\r\n if (text.includes('ppt/')) {\r\n return 'application/vnd.openxmlformats-officedocument.presentationml.presentation';\r\n }\r\n\r\n // OpenDocument detection — the 'mimetype' file is stored uncompressed at the start\r\n if (text.includes('application/vnd.oasis.opendocument.text')) {\r\n return 'application/vnd.oasis.opendocument.text';\r\n }\r\n if (text.includes('application/vnd.oasis.opendocument.spreadsheet')) {\r\n return 'application/vnd.oasis.opendocument.spreadsheet';\r\n }\r\n if (text.includes('application/vnd.oasis.opendocument.presentation')) {\r\n return 'application/vnd.oasis.opendocument.presentation';\r\n }\r\n if (text.includes('application/vnd.oasis.opendocument.graphics')) {\r\n return 'application/vnd.oasis.opendocument.graphics';\r\n }\r\n if (text.includes('application/vnd.oasis.opendocument.formula')) {\r\n return 'application/vnd.oasis.opendocument.formula';\r\n }\r\n\r\n return 'application/zip';\r\n}\r\n\r\n/**\r\n * Detect CFBF / OLE2 sub-type (DOC, XLS, PPT) by searching for stream signatures.\r\n */\r\nexport function detectCfbfType(buffer: ArrayBuffer): { mime: string; extension: string } | null {\r\n const bytes = new Uint8Array(buffer);\r\n \r\n const hasUtf16le = (str: string): boolean => {\r\n const target = new Uint8Array(str.length * 2);\r\n for (let i = 0; i < str.length; i++) {\r\n target[i * 2] = str.charCodeAt(i);\r\n target[i * 2 + 1] = 0;\r\n }\r\n const targetLen = target.length;\r\n const max = bytes.length - targetLen;\r\n for (let i = 0; i <= max; i++) {\r\n let match = true;\r\n for (let j = 0; j < targetLen; j++) {\r\n if (bytes[i + j] !== target[j]) {\r\n match = false;\r\n break;\r\n }\r\n }\r\n if (match) return true;\r\n }\r\n return false;\r\n };\r\n\r\n if (hasUtf16le('PowerPoint Document')) {\r\n return { mime: 'application/vnd.ms-powerpoint', extension: '.ppt' };\r\n }\r\n if (hasUtf16le('WordDocument')) {\r\n return { mime: 'application/msword', extension: '.doc' };\r\n }\r\n if (hasUtf16le('Workbook') || hasUtf16le('Book')) {\r\n return { mime: 'application/vnd.ms-excel', extension: '.xls' };\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Extract file extension from a filename or URL.\r\n */\r\nexport function extractExtension(nameOrUrl: string): string | undefined {\r\n try {\r\n // Try as URL first\r\n const url = new URL(nameOrUrl);\r\n const pathname = url.pathname;\r\n const dotIndex = pathname.lastIndexOf('.');\r\n if (dotIndex !== -1) {\r\n return pathname.slice(dotIndex).toLowerCase().split('?')[0];\r\n }\r\n } catch {\r\n // Not a URL, try as filename\r\n const dotIndex = nameOrUrl.lastIndexOf('.');\r\n if (dotIndex !== -1) {\r\n return nameOrUrl.slice(dotIndex).toLowerCase();\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Get MIME type from file extension.\r\n */\r\nexport function mimeFromExtension(extension: string): string | undefined {\r\n return EXTENSION_MIME_MAP[extension.toLowerCase()];\r\n}\r\n\r\n/**\r\n * Convert any FileSource to ArrayBuffer.\r\n */\r\nexport async function sourceToArrayBuffer(\r\n source: FileSource,\r\n signal?: AbortSignal\r\n): Promise<{ buffer: ArrayBuffer; metadata: FileMetadata }> {\r\n let buffer: ArrayBuffer;\r\n const metadata: FileMetadata = {};\r\n\r\n if (typeof source === 'string') {\r\n // URL string\r\n metadata.name = source.split('/').pop()?.split('?')[0];\r\n metadata.extension = extractExtension(source);\r\n\r\n const response = await fetch(source, { signal });\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch file: ${response.status} ${response.statusText}`);\r\n }\r\n metadata.mimeType = response.headers.get('content-type') ?? undefined;\r\n buffer = await response.arrayBuffer();\r\n } else if (source instanceof File) {\r\n metadata.name = source.name;\r\n metadata.size = source.size;\r\n metadata.mimeType = source.type || undefined;\r\n metadata.extension = extractExtension(source.name);\r\n buffer = await source.arrayBuffer();\r\n } else if (source instanceof Blob || (source && typeof (source as any).arrayBuffer === 'function' && typeof (source as any).size === 'number')) {\r\n metadata.size = (source as any).size;\r\n metadata.mimeType = (source as any).type || undefined;\r\n if ((source as any).name) {\r\n metadata.name = (source as any).name;\r\n metadata.extension = extractExtension((source as any).name);\r\n }\r\n buffer = await (source as any).arrayBuffer();\r\n } else if (\r\n source instanceof ArrayBuffer ||\r\n Object.prototype.toString.call(source) === '[object ArrayBuffer]' ||\r\n (source && typeof (source as any).byteLength === 'number' && typeof (source as any).slice === 'function')\r\n ) {\r\n buffer = source as ArrayBuffer;\r\n } else if (source instanceof Uint8Array || ArrayBuffer.isView(source)) {\r\n const view = source as ArrayBufferView;\r\n buffer = view.buffer.slice(\r\n view.byteOffset,\r\n view.byteOffset + view.byteLength\r\n ) as ArrayBuffer;\r\n } else {\r\n throw new Error('Unsupported file source type');\r\n }\r\n\r\n metadata.size = metadata.size ?? buffer.byteLength;\r\n\r\n // Detect MIME from magic bytes if not already known\r\n const magicMime = detectMagicBytes(buffer);\r\n if (magicMime) {\r\n // Special handling for ZIP-based OOXML\r\n if (magicMime === 'application/zip') {\r\n const ooxmlMime = detectOoxmlType(buffer);\r\n if (ooxmlMime && ooxmlMime !== 'application/zip') {\r\n // Preserve extension-derived MIME (e.g. .docm/.dotx/.dotm) if already set\r\n metadata.mimeType = metadata.mimeType ?? ooxmlMime;\r\n // Set extension from OOXML type\r\n if (ooxmlMime.includes('wordprocessing')) metadata.extension = metadata.extension ?? '.docx';\r\n else if (ooxmlMime.includes('spreadsheet')) metadata.extension = metadata.extension ?? '.xlsx';\r\n else if (ooxmlMime.includes('presentation')) metadata.extension = metadata.extension ?? '.pptx';\r\n } else {\r\n metadata.mimeType = metadata.mimeType ?? magicMime;\r\n }\r\n } else if (magicMime === 'application/x-cfbf') {\r\n // Disambiguate legacy CFBF/OLE2 formats (DOC, XLS, PPT)\r\n if (metadata.extension) {\r\n metadata.mimeType = mimeFromExtension(metadata.extension) ?? magicMime;\r\n } else {\r\n const cfbf = detectCfbfType(buffer);\r\n if (cfbf) {\r\n metadata.mimeType = cfbf.mime;\r\n metadata.extension = cfbf.extension;\r\n } else {\r\n metadata.mimeType = magicMime;\r\n }\r\n }\r\n } else {\r\n metadata.mimeType = magicMime;\r\n }\r\n }\r\n\r\n // Fallback: derive MIME from extension\r\n if (!metadata.mimeType && metadata.extension) {\r\n metadata.mimeType = mimeFromExtension(metadata.extension);\r\n }\r\n\r\n return { buffer, metadata };\r\n}\r\n","import DOMPurify from 'dompurify';\r\n\r\n/**\r\n * Sanitize HTML string using DOMPurify to prevent XSS.\r\n */\r\nexport function sanitizeHTML(html: string): string {\r\n return DOMPurify.sanitize(html, {\r\n USE_PROFILES: { html: true },\r\n });\r\n}\r\n\r\n/**\r\n * Sanitize SVG string using DOMPurify.\r\n */\r\nexport function sanitizeSVG(svg: string): string {\r\n return DOMPurify.sanitize(svg, {\r\n USE_PROFILES: { svg: true, svgFilters: true },\r\n });\r\n}\r\n\r\n/**\r\n * Download a file from an ArrayBuffer.\r\n */\r\nexport function downloadFile(buffer: ArrayBuffer, filename: string, mimeType?: string): void {\r\n const blob = new Blob([buffer], { type: mimeType ?? 'application/octet-stream' });\r\n const url = URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.download = filename;\r\n link.style.display = 'none';\r\n document.body.appendChild(link);\r\n link.click();\r\n // Cleanup\r\n setTimeout(() => {\r\n document.body.removeChild(link);\r\n URL.revokeObjectURL(url);\r\n }, 100);\r\n}\r\n\r\n/**\r\n * Print an HTML element by opening a print window.\r\n */\r\nexport function printElement(element: HTMLElement, title?: string): void {\r\n const printWindow = window.open('', '_blank');\r\n if (!printWindow) {\r\n console.warn('[FilePreview] Could not open print window. Pop-ups may be blocked.');\r\n return;\r\n }\r\n\r\n const styles = Array.from(document.querySelectorAll('style, link[rel=\"stylesheet\"]'))\r\n .map(el => el.outerHTML)\r\n .join('\\n');\r\n\r\n printWindow.document.write(`\r\n <!DOCTYPE html>\r\n <html>\r\n <head>\r\n <title>${title ?? 'Print Preview'}</title>\r\n ${styles}\r\n <style>\r\n @media print {\r\n body { margin: 0; padding: 16px; }\r\n }\r\n </style>\r\n </head>\r\n <body>\r\n ${element.innerHTML}\r\n </body>\r\n </html>\r\n `);\r\n printWindow.document.close();\r\n printWindow.focus();\r\n printWindow.print();\r\n printWindow.close();\r\n}\r\n\r\n/**\r\n * Format file size in human-readable format.\r\n */\r\nexport function formatFileSize(bytes: number): string {\r\n if (bytes === 0) return '0 B';\r\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\r\n const i = Math.floor(Math.log(bytes) / Math.log(1024));\r\n const size = bytes / Math.pow(1024, i);\r\n return `${size.toFixed(i > 0 ? 1 : 0)} ${units[i]}`;\r\n}\r\n\r\n/**\r\n * Debounce a function call.\r\n */\r\nexport function debounce<T extends (...args: unknown[]) => void>(\r\n fn: T,\r\n delay: number\r\n): (...args: Parameters<T>) => void {\r\n let timer: ReturnType<typeof setTimeout> | undefined;\r\n return (...args: Parameters<T>) => {\r\n clearTimeout(timer);\r\n timer = setTimeout(() => fn(...args), delay);\r\n };\r\n}\r\n\r\n/**\r\n * Clamp a number between min and max.\r\n */\r\nexport function clamp(value: number, min: number, max: number): number {\r\n return Math.min(Math.max(value, min), max);\r\n}\r\n\r\n/**\r\n * Create a DOM element with optional attributes and children.\r\n */\r\nexport function createElement<K extends keyof HTMLElementTagNameMap>(\r\n tag: K,\r\n attrs?: Record<string, string>,\r\n ...children: (string | Node)[]\r\n): HTMLElementTagNameMap[K] {\r\n const el = document.createElement(tag);\r\n if (attrs) {\r\n for (const [key, value] of Object.entries(attrs)) {\r\n if (key === 'className') {\r\n el.className = value;\r\n } else {\r\n el.setAttribute(key, value);\r\n }\r\n }\r\n }\r\n for (const child of children) {\r\n if (typeof child === 'string') {\r\n el.appendChild(document.createTextNode(child));\r\n } else {\r\n el.appendChild(child);\r\n }\r\n }\r\n return el;\r\n}\r\n","/**\r\n * IndexedDB and in-memory document transfer utility for cross-window preview opening.\r\n */\r\n\r\nexport interface TransferPayload {\r\n buffer: ArrayBuffer;\r\n metadata?: {\r\n name?: string;\r\n extension?: string;\r\n mimeType?: string;\r\n size?: number;\r\n };\r\n options?: Record<string, any>;\r\n}\r\n\r\nconst DB_NAME = 'PreviewFileTransferDB';\r\nconst DB_STORE = 'transfers';\r\n\r\nfunction openDB(): Promise<IDBDatabase> {\r\n return new Promise((resolve, reject) => {\r\n if (typeof indexedDB === 'undefined') {\r\n return reject(new Error('IndexedDB is not available'));\r\n }\r\n const req = indexedDB.open(DB_NAME, 1);\r\n req.onupgradeneeded = () => {\r\n const db = req.result;\r\n if (!db.objectStoreNames.contains(DB_STORE)) {\r\n db.createObjectStore(DB_STORE, { keyPath: 'id' });\r\n }\r\n };\r\n req.onsuccess = () => resolve(req.result);\r\n req.onerror = () => reject(req.error);\r\n });\r\n}\r\n\r\n/**\r\n * Save file payload to IndexedDB and window storage for cross-window retrieval.\r\n */\r\nexport async function saveTransferPayload(id: string, payload: TransferPayload): Promise<void> {\r\n if (typeof window !== 'undefined') {\r\n try {\r\n (window as any)[id] = payload;\r\n (window as any).__lastTransfer = payload;\r\n } catch {}\r\n }\r\n\r\n try {\r\n const db = await openDB();\r\n return new Promise((resolve, reject) => {\r\n const tx = db.transaction(DB_STORE, 'readwrite');\r\n const store = tx.objectStore(DB_STORE);\r\n store.put({ id, ...payload, timestamp: Date.now() });\r\n tx.oncomplete = () => resolve();\r\n tx.onerror = () => reject(tx.error);\r\n });\r\n } catch (e) {\r\n console.warn('[saveTransferPayload] IndexedDB store warning:', e);\r\n }\r\n}\r\n\r\n/**\r\n * Retrieve transferred file payload from opener window or IndexedDB.\r\n */\r\nexport async function getTransferPayload(id: string): Promise<TransferPayload | null> {\r\n if (typeof window !== 'undefined') {\r\n try {\r\n if (window.opener && (window.opener as any)[id]) {\r\n return (window.opener as any)[id];\r\n }\r\n if ((window as any)[id]) {\r\n return (window as any)[id];\r\n }\r\n if (window.opener && (window.opener as any).__lastTransfer) {\r\n return (window.opener as any).__lastTransfer;\r\n }\r\n if ((window as any).__lastTransfer) {\r\n return (window as any).__lastTransfer;\r\n }\r\n } catch {}\r\n }\r\n\r\n try {\r\n const db = await openDB();\r\n return new Promise((resolve) => {\r\n const tx = db.transaction(DB_STORE, 'readonly');\r\n const store = tx.objectStore(DB_STORE);\r\n const req = store.get(id);\r\n req.onsuccess = () => {\r\n if (req.result && req.result.buffer) {\r\n resolve({\r\n buffer: req.result.buffer,\r\n metadata: req.result.metadata,\r\n options: req.result.options\r\n });\r\n } else {\r\n resolve(null);\r\n }\r\n };\r\n req.onerror = () => resolve(null);\r\n });\r\n } catch {\r\n return null;\r\n }\r\n}\r\n","export const ICON_ZOOM_IN = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"11\" cy=\"11\" r=\"8\"></circle><line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"></line><line x1=\"11\" y1=\"8\" x2=\"11\" y2=\"14\"></line><line x1=\"8\" y1=\"11\" x2=\"14\" y2=\"11\"></line></svg>`;\r\nexport const ICON_ZOOM_OUT = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"11\" cy=\"11\" r=\"8\"></circle><line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"></line><line x1=\"8\" y1=\"11\" x2=\"14\" y2=\"11\"></line></svg>`;\r\nexport const ICON_FIT_PAGE = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"></rect><line x1=\"8\" y1=\"12\" x2=\"16\" y2=\"12\"></line><polyline points=\"11 9 8 12 11 15\"></polyline><polyline points=\"13 9 16 12 13 15\"></polyline></svg>`;\r\nexport const ICON_FIT_WIDTH = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"2\" y1=\"12\" x2=\"22\" y2=\"12\"></line><polyline points=\"5 9 2 12 5 15\"></polyline><polyline points=\"19 9 22 12 19 15\"></polyline><line x1=\"2\" y1=\"5\" x2=\"2\" y2=\"19\"></line><line x1=\"22\" y1=\"5\" x2=\"22\" y2=\"19\"></line></svg>`;\r\nexport const ICON_ROTATE_CW = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"23 4 23 10 17 10\"></polyline><path d=\"M20.49 15a9 9 0 1 1-2.12-9.36L23 10\"></path></svg>`;\r\nexport const ICON_ROTATE_CCW = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"1 4 1 10 7 10\"></polyline><path d=\"M3.51 15a9 9 0 1 0 2.13-9.36L1 10\"></path></svg>`;\r\nexport const ICON_DOWNLOAD = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"></path><polyline points=\"7 10 12 15 17 10\"></polyline><line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"></line></svg>`;\r\nexport const ICON_PRINT = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 6 2 18 2 18 9\"></polyline><path d=\"M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2\"></path><rect x=\"6\" y=\"14\" width=\"12\" height=\"8\"></rect></svg>`;\r\nexport const ICON_PAGE_PREV = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"15 18 9 12 15 6\"></polyline></svg>`;\r\nexport const ICON_PAGE_NEXT = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"9 18 15 12 9 6\"></polyline></svg>`;\r\nexport const ICON_PLAY = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polygon points=\"5 3 19 12 5 21 5 3\"></polygon></svg>`;\r\nexport const ICON_PAUSE = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"6\" y=\"4\" width=\"4\" height=\"16\"></rect><rect x=\"14\" y=\"4\" width=\"4\" height=\"16\"></rect></svg>`;\r\nexport const ICON_THUMBNAILS = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"7\" height=\"7\"></rect><rect x=\"14\" y=\"3\" width=\"7\" height=\"7\"></rect><rect x=\"14\" y=\"14\" width=\"7\" height=\"7\"></rect><rect x=\"3\" y=\"14\" width=\"7\" height=\"7\"></rect></svg>`;\r\nexport const ICON_CLOSE = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line></svg>`;\r\nexport const ICON_FULLSCREEN = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M8 3H5a2 2 0 0 0-2 2v3m18 0V5a2 2 0 0 0-2-2h-3m0 18h3a2 2 0 0 0 2-2v-3M3 16v3a2 2 0 0 0 2 2h3\"></path></svg>`;\r\nexport const ICON_CHEVRON_LEFT = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"15 18 9 12 15 6\"></polyline></svg>`;\r\nexport const ICON_CHEVRON_RIGHT = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"9 18 15 12 9 6\"></polyline></svg>`;\r\nexport const ICON_COPY = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"></rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"></path></svg>`;\r\nexport const ICON_FAST_FORWARD = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polygon points=\"13 19 22 12 13 5 13 19\"></polygon><polygon points=\"2 19 11 12 2 5 2 19\"></polygon></svg>`;\r\nexport const ICON_REWIND = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polygon points=\"11 19 2 12 11 5 11 19\"></polygon><polygon points=\"22 19 13 12 22 5 22 19\"></polygon></svg>`;\r\nexport const ICON_SPEED = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><polyline points=\"12 6 12 12 16 14\"></polyline></svg>`;\r\nexport const ICON_EXTERNAL_WINDOW = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"></rect><line x1=\"3\" y1=\"8\" x2=\"21\" y2=\"8\"></line><circle cx=\"6\" cy=\"5.5\" r=\"0.75\" fill=\"currentColor\"></circle><circle cx=\"8.5\" cy=\"5.5\" r=\"0.75\" fill=\"currentColor\"></circle><polyline points=\"14 13 18 13 18 17\"></polyline><line x1=\"11\" y1=\"20\" x2=\"18\" y2=\"13\"></line></svg>`;\r\nexport const ICON_RESET_ZOOM = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"11\" cy=\"11\" r=\"8\"></circle><line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"></line><path d=\"M13 11a3 3 0 1 0-3 3\"></path><path d=\"M10 11v3h3\"></path></svg>`;\r\n\r\n","import './toolbar.css';\r\nimport { createElement, sanitizeSVG } from '../utils';\r\nimport type { ToolbarAction, ToolbarGroup, ToolbarConfig } from '../types';\r\nimport * as icons from './icons';\r\n\r\nconst ICON_MAP: Record<string, string> = {\r\n 'zoom-in': icons.ICON_ZOOM_IN,\r\n 'zoom-out': icons.ICON_ZOOM_OUT,\r\n 'fit-page': icons.ICON_FIT_PAGE,\r\n 'fit-width': icons.ICON_FIT_WIDTH,\r\n 'fit-slide': icons.ICON_FIT_PAGE,\r\n 'rotate-cw': icons.ICON_ROTATE_CW,\r\n 'rotate-ccw': icons.ICON_ROTATE_CCW,\r\n 'download': icons.ICON_DOWNLOAD,\r\n 'print': icons.ICON_PRINT,\r\n 'thumbnails': icons.ICON_THUMBNAILS,\r\n 'fullscreen': icons.ICON_FULLSCREEN,\r\n 'play': icons.ICON_PLAY,\r\n 'pause': icons.ICON_PAUSE,\r\n 'close': icons.ICON_CLOSE,\r\n 'copy': icons.ICON_COPY,\r\n 'prev': icons.ICON_PAGE_PREV,\r\n 'next': icons.ICON_PAGE_NEXT,\r\n 'page-prev': icons.ICON_PAGE_PREV,\r\n 'page-next': icons.ICON_PAGE_NEXT,\r\n 'chevron-left': icons.ICON_PAGE_PREV,\r\n 'chevron-right': icons.ICON_PAGE_NEXT,\r\n 'fast-forward': icons.ICON_FAST_FORWARD,\r\n 'forward-10': icons.ICON_FAST_FORWARD,\r\n 'rewind': icons.ICON_REWIND,\r\n 'replay-10': icons.ICON_REWIND,\r\n 'open-window': icons.ICON_EXTERNAL_WINDOW,\r\n 'external-window': icons.ICON_EXTERNAL_WINDOW,\r\n 'openWindow': icons.ICON_EXTERNAL_WINDOW,\r\n 'openSeparateWindow': icons.ICON_EXTERNAL_WINDOW,\r\n 'reset-zoom': icons.ICON_RESET_ZOOM,\r\n 'zoom-reset': icons.ICON_RESET_ZOOM,\r\n 'resetZoom': icons.ICON_RESET_ZOOM,\r\n};\r\n\r\nexport class ToolbarController {\r\n private el: HTMLElement;\r\n private toolbarEl: HTMLElement;\r\n private actions: ToolbarAction[] = [];\r\n private config: ToolbarConfig = {};\r\n private pageInputEl: HTMLInputElement | null = null;\r\n private pageLabelEl: HTMLElement | null = null;\r\n private prevPageBtn: HTMLButtonElement | null = null;\r\n private nextPageBtn: HTMLButtonElement | null = null;\r\n\r\n constructor(container: HTMLElement, config?: ToolbarConfig) {\r\n this.el = container;\r\n if (config) this.config = { ...config };\r\n this.toolbarEl = createElement('div', { className: 'fp-toolbar' });\r\n this.el.appendChild(this.toolbarEl);\r\n }\r\n\r\n setConfig(config: ToolbarConfig): void {\r\n this.config = { ...config };\r\n this.render();\r\n }\r\n\r\n getConfig(): ToolbarConfig {\r\n return { ...this.config };\r\n }\r\n\r\n hideAction(actionId: string): void {\r\n (this.config as Record<string, any>)[actionId] = false;\r\n if (actionId === 'zoom-in' || actionId === 'zoomIn') this.config.zoomIn = false;\r\n if (actionId === 'zoom-out' || actionId === 'zoomOut') this.config.zoomOut = false;\r\n if (actionId === 'fit-page' || actionId === 'fitPage' || actionId === 'fitToPage' || actionId === 'fit-width') {\r\n this.config.fitPage = false;\r\n this.config.fitToPage = false;\r\n this.config.fitWidth = false;\r\n }\r\n if (actionId === 'reset-zoom' || actionId === 'zoom-reset' || actionId === 'resetZoom') {\r\n this.config.resetZoom = false;\r\n this.config.zoomReset = false;\r\n }\r\n if (actionId === 'rotate-cw' || actionId === 'rotate' || actionId === 'rotateCW') this.config.rotate = false;\r\n if (actionId === 'fullscreen') this.config.fullscreen = false;\r\n if (actionId === 'download') this.config.download = false;\r\n if (actionId === 'print') this.config.print = false;\r\n if (actionId === 'open-window' || actionId === 'openWindow' || actionId === 'openSeparateWindow') {\r\n this.config.openWindow = false;\r\n this.config.openSeparateWindow = false;\r\n }\r\n if (actionId === 'copy') this.config.copy = false;\r\n if (actionId === 'page-nav' || actionId === 'pageNav' || actionId === 'pagination') {\r\n this.config.pageNav = false;\r\n this.config.pagination = false;\r\n }\r\n this.render();\r\n }\r\n\r\n showAction(actionId: string): void {\r\n (this.config as Record<string, any>)[actionId] = true;\r\n if (actionId === 'zoom-in' || actionId === 'zoomIn') this.config.zoomIn = true;\r\n if (actionId === 'zoom-out' || actionId === 'zoomOut') this.config.zoomOut = true;\r\n if (actionId === 'fit-page' || actionId === 'fitPage' || actionId === 'fitToPage' || actionId === 'fit-width') {\r\n this.config.fitPage = true;\r\n this.config.fitToPage = true;\r\n this.config.fitWidth = true;\r\n }\r\n if (actionId === 'reset-zoom' || actionId === 'zoom-reset' || actionId === 'resetZoom') {\r\n this.config.resetZoom = true;\r\n this.config.zoomReset = true;\r\n }\r\n if (actionId === 'rotate-cw' || actionId === 'rotate' || actionId === 'rotateCW') this.config.rotate = true;\r\n if (actionId === 'fullscreen') this.config.fullscreen = true;\r\n if (actionId === 'download') this.config.download = true;\r\n if (actionId === 'print') this.config.print = true;\r\n if (actionId === 'open-window' || actionId === 'openWindow' || actionId === 'openSeparateWindow') {\r\n this.config.openWindow = true;\r\n this.config.openSeparateWindow = true;\r\n }\r\n if (actionId === 'copy') this.config.copy = true;\r\n if (actionId === 'page-nav' || actionId === 'pageNav' || actionId === 'pagination') {\r\n this.config.pageNav = true;\r\n this.config.pagination = true;\r\n }\r\n this.render();\r\n }\r\n\r\n private normalizeActionId(actionId: string): string {\r\n if (actionId === 'zoomIn') return 'zoom-in';\r\n if (actionId === 'zoomOut') return 'zoom-out';\r\n if (actionId === 'fitPage' || actionId === 'fitToPage' || actionId === 'fitWidth') return 'fit-page';\r\n if (actionId === 'resetZoom' || actionId === 'zoomReset') return 'reset-zoom';\r\n if (actionId === 'rotateCW') return 'rotate-cw';\r\n if (actionId === 'rotateCCW') return 'rotate-ccw';\r\n if (actionId === 'openWindow' || actionId === 'openSeparateWindow') return 'open-window';\r\n if (actionId === 'pageNav') return 'page-nav';\r\n return actionId;\r\n }\r\n\r\n enableAction(actionId: string): void {\r\n const norm = this.normalizeActionId(actionId);\r\n const btn = this.toolbarEl.querySelector(`button[data-action-id=\"${actionId}\"], button[data-action-id=\"${norm}\"]`) as HTMLButtonElement | null;\r\n if (btn) {\r\n btn.disabled = false;\r\n btn.classList.remove('disabled');\r\n }\r\n }\r\n\r\n disableAction(actionId: string): void {\r\n const norm = this.normalizeActionId(actionId);\r\n const btn = this.toolbarEl.querySelector(`button[data-action-id=\"${actionId}\"], button[data-action-id=\"${norm}\"]`) as HTMLButtonElement | null;\r\n if (btn) {\r\n btn.disabled = true;\r\n btn.classList.add('disabled');\r\n }\r\n }\r\n\r\n setActionActive(actionId: string, active: boolean): void {\r\n const norm = this.normalizeActionId(actionId);\r\n const btn = this.toolbarEl.querySelector(`button[data-action-id=\"${actionId}\"], button[data-action-id=\"${norm}\"]`) as HTMLButtonElement | null;\r\n if (btn) {\r\n if (active) {\r\n btn.classList.add('active');\r\n } else {\r\n btn.classList.remove('active');\r\n }\r\n }\r\n }\r\n\r\n isActionEnabled(action: ToolbarAction): boolean {\r\n const c: Record<string, any> = this.config;\r\n const id = action.id;\r\n\r\n // Check direct ID or camelCase override\r\n if (c[id] === false) return false;\r\n\r\n if (id === 'zoom-in' && (c.zoomIn === false || c['zoom-in'] === false)) return false;\r\n if (id === 'zoom-out' && (c.zoomOut === false || c['zoom-out'] === false)) return false;\r\n if (\r\n (id === 'fit-page' || id === 'fit-width' || id === 'fit-slide') &&\r\n (c.fitPage === false || c.fitToPage === false || c.fitWidth === false || c['fit-page'] === false || c['fit-width'] === false)\r\n ) {\r\n return false;\r\n }\r\n if (\r\n (id === 'reset-zoom' || id === 'zoom-reset') &&\r\n (c.resetZoom === false || c.zoomReset === false || c['reset-zoom'] === false || c['zoom-reset'] === false)\r\n ) {\r\n return false;\r\n }\r\n if (\r\n (id === 'rotate-cw' || id === 'rotate-ccw' || id === 'rotate') &&\r\n (c.rotate === false || c.rotateCW === false || c.rotateCCW === false || c['rotate-cw'] === false)\r\n ) {\r\n return false;\r\n }\r\n if (id === 'fullscreen' && c.fullscreen === false) return false;\r\n if (id === 'download' && c.download === false) return false;\r\n if (id === 'print' && c.print === false) return false;\r\n if (\r\n (id === 'open-window' || id === 'external-window') &&\r\n (c.openWindow === false || c.openSeparateWindow === false || c['open-window'] === false)\r\n ) {\r\n return false;\r\n }\r\n if (id === 'copy' && c.copy === false) return false;\r\n if (id === 'thumbnails' && c.thumbnails === false) return false;\r\n if (\r\n id === 'page-nav' &&\r\n (c.pageNav === false || c.pagination === false || c['page-nav'] === false)\r\n ) {\r\n return false;\r\n }\r\n if (\r\n (id === 'prev' || id === 'page-prev') &&\r\n (c.prevPage === false || c.prev === false || c['prev'] === false || c.pageNav === false || c.pagination === false)\r\n ) {\r\n return false;\r\n }\r\n if (\r\n (id === 'next' || id === 'page-next') &&\r\n (c.nextPage === false || c.next === false || c['next'] === false || c.pageNav === false || c.pagination === false)\r\n ) {\r\n return false;\r\n }\r\n if (id === 'play' && c.play === false) return false;\r\n if (id === 'pause' && c.pause === false) return false;\r\n if (\r\n (id === 'fast-forward' || id === 'forward-10') &&\r\n (c.fastForward === false || c['fast-forward'] === false)\r\n ) {\r\n return false;\r\n }\r\n if (\r\n (id === 'rewind' || id === 'replay-10') &&\r\n (c.rewind === false || c['rewind'] === false)\r\n ) {\r\n return false;\r\n }\r\n if (id === 'speed' && c.speed === false) return false;\r\n\r\n return true;\r\n }\r\n\r\n setPage(page: number, max?: number): void {\r\n if (this.pageInputEl) {\r\n this.pageInputEl.value = page.toString();\r\n if (max !== undefined) {\r\n this.pageInputEl.max = max.toString();\r\n }\r\n }\r\n if (max !== undefined && this.pageLabelEl) {\r\n this.pageLabelEl.textContent = ` / ${max}`;\r\n }\r\n const currentMax = max !== undefined ? max : (parseInt(this.pageInputEl?.max || '1', 10) || 1);\r\n if (this.prevPageBtn) {\r\n this.prevPageBtn.disabled = page <= 1;\r\n this.prevPageBtn.style.opacity = page <= 1 ? '0.4' : '1';\r\n }\r\n if (this.nextPageBtn) {\r\n this.nextPageBtn.disabled = page >= currentMax;\r\n this.nextPageBtn.style.opacity = page >= currentMax ? '0.4' : '1';\r\n }\r\n }\r\n\r\n update(actions: ToolbarAction[]): void {\r\n this.actions = actions;\r\n this.render();\r\n }\r\n\r\n show(): void {\r\n this.el.style.display = 'block';\r\n }\r\n\r\n hide(): void {\r\n this.el.style.display = 'none';\r\n }\r\n\r\n destroy(): void {\r\n this.el.innerHTML = '';\r\n }\r\n\r\n private render(): void {\r\n this.toolbarEl.innerHTML = '';\r\n\r\n const groups: Record<ToolbarGroup, ToolbarAction[]> = {\r\n navigation: [],\r\n zoom: [],\r\n view: [],\r\n actions: []\r\n };\r\n\r\n // Filter actions through config\r\n const enabledActions = this.actions.filter(a => this.isActionEnabled(a));\r\n\r\n // If a page-nav component is present, deduplicate standalone prev/next buttons\r\n const hasPageNav = enabledActions.some(a => a.type === 'page-nav');\r\n const effectiveActions = hasPageNav\r\n ? enabledActions.filter(a => a.id !== 'page-prev' && a.id !== 'page-next' && a.id !== 'prev' && a.id !== 'next')\r\n : enabledActions;\r\n\r\n for (const action of effectiveActions) {\r\n if (groups[action.group]) {\r\n groups[action.group].push(action);\r\n }\r\n }\r\n\r\n const order: ToolbarGroup[] = ['navigation', 'zoom', 'view', 'actions'];\r\n let isFirstGroup = true;\r\n\r\n for (const group of order) {\r\n const groupActions = groups[group];\r\n if (groupActions.length === 0) continue;\r\n\r\n if (!isFirstGroup) {\r\n this.toolbarEl.appendChild(createElement('div', { className: 'fp-toolbar-separator' }));\r\n }\r\n isFirstGroup = false;\r\n\r\n const groupEl = createElement('div', { className: 'fp-toolbar-group' });\r\n\r\n for (const action of groupActions) {\r\n if (action.type === 'separator') {\r\n groupEl.appendChild(createElement('div', { className: 'fp-toolbar-separator' }));\r\n } else if (action.type === 'page-nav') {\r\n const max = action.max ?? 1;\r\n const prevBtn = this.createButton(\r\n 'prev', icons.ICON_PAGE_PREV, 'Previous Page',\r\n () => {\r\n const cur = parseInt(input.value, 10) || 1;\r\n if (cur > 1) {\r\n input.value = (cur - 1).toString();\r\n action.execute('prev', cur - 1);\r\n }\r\n }\r\n );\r\n const nextBtn = this.createButton(\r\n 'next', icons.ICON_PAGE_NEXT, 'Next Page',\r\n () => {\r\n const cur = parseInt(input.value, 10) || 1;\r\n if (cur < max) {\r\n input.value = (cur + 1).toString();\r\n action.execute('next', cur + 1);\r\n }\r\n }\r\n );\r\n const input = createElement('input', {\r\n className: 'fp-toolbar-input',\r\n type: 'number',\r\n value: (action.value ?? 1).toString(),\r\n min: '1',\r\n max: max.toString()\r\n }) as HTMLInputElement;\r\n \r\n input.addEventListener('change', () => {\r\n let val = parseInt(input.value, 10);\r\n if (isNaN(val)) val = 1;\r\n val = Math.max(1, Math.min(max, val));\r\n input.value = val.toString();\r\n action.execute('go', val);\r\n });\r\n \r\n const label = createElement('span', { className: 'fp-toolbar-label' }, ` / ${max}`);\r\n \r\n const curVal = action.value ?? 1;\r\n prevBtn.disabled = curVal <= 1;\r\n prevBtn.style.opacity = curVal <= 1 ? '0.4' : '1';\r\n nextBtn.disabled = curVal >= max;\r\n nextBtn.style.opacity = curVal >= max ? '0.4' : '1';\r\n\r\n this.prevPageBtn = prevBtn;\r\n this.nextPageBtn = nextBtn;\r\n this.pageInputEl = input;\r\n this.pageLabelEl = label;\r\n\r\n groupEl.appendChild(prevBtn);\r\n groupEl.appendChild(input);\r\n groupEl.appendChild(label);\r\n groupEl.appendChild(nextBtn);\r\n } else if (action.type === 'range') {\r\n const input = createElement('input', {\r\n type: 'range',\r\n min: (action.min ?? 0).toString(),\r\n max: (action.max ?? 100).toString(),\r\n step: (action.step ?? 1).toString(),\r\n value: (action.value ?? 50).toString()\r\n }) as HTMLInputElement;\r\n input.addEventListener('input', () => {\r\n action.execute(parseFloat(input.value));\r\n });\r\n groupEl.appendChild(input);\r\n } else {\r\n const btn = this.createButton(\r\n action.id, action.icon, action.label,\r\n () => action.execute()\r\n );\r\n if (action.enabled === false) btn.disabled = true;\r\n if (action.active) btn.classList.add('active');\r\n groupEl.appendChild(btn);\r\n }\r\n }\r\n\r\n this.toolbarEl.appendChild(groupEl);\r\n }\r\n }\r\n\r\n private createButton(id: string, iconHtml: string, title: string, onClick: () => void): HTMLButtonElement {\r\n const btn = createElement('button', {\r\n className: 'fp-toolbar-btn',\r\n title,\r\n type: 'button',\r\n 'data-action-id': id\r\n }) as HTMLButtonElement;\r\n \r\n const internalSvg = ICON_MAP[iconHtml] || ICON_MAP[id];\r\n if (internalSvg) {\r\n btn.innerHTML = internalSvg;\r\n } else if (iconHtml && iconHtml.startsWith('<svg')) {\r\n btn.innerHTML = sanitizeSVG(iconHtml);\r\n } else {\r\n btn.textContent = title || id; \r\n }\r\n \r\n btn.addEventListener('click', onClick);\r\n return btn;\r\n }\r\n}\r\n","import { createElement } from '../utils';\r\nimport type { Thumbnail } from '../types';\r\nimport { ICON_CLOSE } from '../toolbar/icons';\r\n\r\nexport class ThumbnailPanel {\r\n private el: HTMLElement;\r\n private panelEl: HTMLElement;\r\n private listEl: HTMLElement;\r\n private headerEl: HTMLElement;\r\n private thumbnails: Thumbnail[] = [];\r\n private onSelect?: (index: number) => void;\r\n private onToggleCallback?: (isOpen: boolean) => void;\r\n private activeIndex: number = 0;\r\n private observer?: IntersectionObserver;\r\n private renderedIndices = new Set<number>();\r\n\r\n constructor(container: HTMLElement, onToggle?: (isOpen: boolean) => void) {\r\n this.el = container;\r\n this.onToggleCallback = onToggle;\r\n\r\n this.panelEl = createElement('div', { className: 'fp-thumbnail-panel hidden' });\r\n this.panelEl.style.width = '0px';\r\n this.panelEl.style.minWidth = '0px';\r\n this.panelEl.style.opacity = '0';\r\n\r\n // Header\r\n this.headerEl = createElement('div', { className: 'fp-thumbnail-header' });\r\n const title = createElement('span', { className: 'fp-thumbnail-title' }, 'Pages');\r\n const closeBtn = createElement('button', {\r\n className: 'fp-thumbnail-close-btn',\r\n title: 'Close Thumbnails',\r\n type: 'button'\r\n }) as HTMLButtonElement;\r\n closeBtn.innerHTML = ICON_CLOSE;\r\n closeBtn.addEventListener('click', (e) => {\r\n e.stopPropagation();\r\n this.hide();\r\n });\r\n this.headerEl.appendChild(title);\r\n this.headerEl.appendChild(closeBtn);\r\n\r\n // List container\r\n this.listEl = createElement('div', { className: 'fp-thumbnail-list' });\r\n\r\n this.panelEl.appendChild(this.headerEl);\r\n this.panelEl.appendChild(this.listEl);\r\n this.el.appendChild(this.panelEl);\r\n }\r\n\r\n isOpen(): boolean {\r\n return !this.panelEl.classList.contains('hidden') && this.panelEl.style.width !== '0px';\r\n }\r\n\r\n update(thumbnails: Thumbnail[], onSelect: (index: number) => void): void {\r\n this.thumbnails = thumbnails;\r\n this.onSelect = onSelect;\r\n this.renderedIndices.clear();\r\n\r\n const titleEl = this.headerEl.querySelector('.fp-thumbnail-title');\r\n if (titleEl) {\r\n titleEl.textContent = `Pages (${thumbnails.length})`;\r\n }\r\n\r\n this.render();\r\n\r\n if (this.isOpen()) {\r\n this.renderAllVisible();\r\n }\r\n }\r\n\r\n setActive(index: number): void {\r\n this.activeIndex = index;\r\n const items = this.listEl.querySelectorAll<HTMLElement>('.fp-thumbnail-item');\r\n items.forEach((item, i) => {\r\n if (i === index) {\r\n item.classList.add('active');\r\n item.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\r\n } else {\r\n item.classList.remove('active');\r\n }\r\n });\r\n }\r\n\r\n show(): void {\r\n this.panelEl.classList.remove('hidden');\r\n this.panelEl.style.width = '200px';\r\n this.panelEl.style.minWidth = '200px';\r\n this.panelEl.style.opacity = '1';\r\n this.panelEl.style.display = 'flex';\r\n this.onToggleCallback?.(true);\r\n this.renderAllVisible();\r\n }\r\n\r\n hide(): void {\r\n this.panelEl.classList.add('hidden');\r\n this.panelEl.style.width = '0px';\r\n this.panelEl.style.minWidth = '0px';\r\n this.panelEl.style.opacity = '0';\r\n this.onToggleCallback?.(false);\r\n }\r\n\r\n toggle(): void {\r\n if (this.isOpen()) {\r\n this.hide();\r\n } else {\r\n this.show();\r\n }\r\n }\r\n\r\n destroy(): void {\r\n if (this.observer) {\r\n this.observer.disconnect();\r\n this.observer = undefined;\r\n }\r\n this.renderedIndices.clear();\r\n this.el.innerHTML = '';\r\n }\r\n\r\n renderAllVisible(): void {\r\n const items = this.listEl.querySelectorAll<HTMLElement>('.fp-thumbnail-item');\r\n items.forEach((item) => {\r\n const idx = parseInt(item.dataset.thumbIndex || '-1', 10);\r\n if (idx >= 0 && !this.renderedIndices.has(idx)) {\r\n this.renderThumbnailItem(idx, item);\r\n }\r\n });\r\n }\r\n\r\n private renderThumbnailItem(idx: number, itemEl: HTMLElement): void {\r\n if (this.renderedIndices.has(idx)) return;\r\n this.renderedIndices.add(idx);\r\n const canvas = itemEl.querySelector('canvas') as HTMLCanvasElement | null;\r\n const thumb = this.thumbnails[idx];\r\n if (canvas && thumb) {\r\n Promise.resolve(thumb.render(canvas)).catch((err) => {\r\n console.warn(`[FilePreview] Error rendering thumbnail ${idx}:`, err);\r\n });\r\n }\r\n }\r\n\r\n private render(): void {\r\n if (this.observer) {\r\n this.observer.disconnect();\r\n }\r\n this.listEl.innerHTML = '';\r\n\r\n const useObserver = typeof IntersectionObserver !== 'undefined';\r\n if (useObserver) {\r\n this.observer = new IntersectionObserver(\r\n (entries) => {\r\n for (const entry of entries) {\r\n if (entry.isIntersecting) {\r\n const target = entry.target as HTMLElement;\r\n const idx = parseInt(target.dataset.thumbIndex || '-1', 10);\r\n if (idx >= 0) {\r\n this.renderThumbnailItem(idx, target);\r\n }\r\n }\r\n }\r\n },\r\n {\r\n root: this.listEl,\r\n rootMargin: '120px 0px 120px 0px'\r\n }\r\n );\r\n }\r\n\r\n for (let i = 0; i < this.thumbnails.length; i++) {\r\n const thumb = this.thumbnails[i];\r\n const itemEl = createElement('div', {\r\n className: 'fp-thumbnail-item' + (i === this.activeIndex ? ' active' : '')\r\n }) as HTMLElement;\r\n itemEl.dataset.thumbIndex = i.toString();\r\n\r\n itemEl.addEventListener('click', () => {\r\n this.setActive(i);\r\n this.onSelect?.(i);\r\n });\r\n\r\n const canvasWrapper = createElement('div', { className: 'fp-thumbnail-canvas-wrapper' });\r\n const canvas = createElement('canvas', { width: '130', height: '170' }) as HTMLCanvasElement;\r\n canvasWrapper.appendChild(canvas);\r\n\r\n const label = createElement('span', { className: 'fp-thumbnail-label' }, thumb.label || `Page ${i + 1}`);\r\n\r\n itemEl.appendChild(canvasWrapper);\r\n itemEl.appendChild(label);\r\n this.listEl.appendChild(itemEl);\r\n\r\n if (this.observer) {\r\n this.observer.observe(itemEl);\r\n }\r\n\r\n // Eagerly render first 4 items immediately\r\n if (i < 4) {\r\n this.renderThumbnailItem(i, itemEl);\r\n }\r\n }\r\n }\r\n}\r\n","import { EventEmitter } from './events';\r\nimport { sourceToArrayBuffer } from './detect';\r\nimport { downloadFile } from './utils';\r\nimport { saveTransferPayload } from './transfer';\r\nimport { ToolbarController } from './toolbar/toolbar-controller';\r\nimport { ThumbnailPanel } from './thumbnail/thumbnail-panel';\r\nimport type {\r\n FileSource,\r\n PreviewPlugin,\r\n PreviewInstance,\r\n PreviewViewerOptions,\r\n FileInfo,\r\n EventHandler,\r\n Unsubscribe,\r\n ToolbarConfig,\r\n} from './types';\r\n\r\n/**\r\n * Main file preview viewer engine.\r\n * Manages plugins, rendering lifecycle, toolbar, and thumbnails.\r\n */\r\nexport class FilePreviewViewer {\r\n private plugins: PreviewPlugin[] = [];\r\n private activeInstance: PreviewInstance | null = null;\r\n private abortController: AbortController | null = null;\r\n private eventEmitter = new EventEmitter();\r\n private toolbar: ToolbarController | null = null;\r\n private thumbnailPanel: ThumbnailPanel | null = null;\r\n private wrapperEl: HTMLElement | null = null;\r\n private contentEl: HTMLElement | null = null;\r\n private currentBuffer: ArrayBuffer | null = null;\r\n private currentMetadata: import('./types').FileMetadata | null = null;\r\n private keyHandler: ((e: KeyboardEvent) => void) | null = null;\r\n private currentContainer: HTMLElement | null = null;\r\n private currentOptions: PreviewViewerOptions = {};\r\n private resizeObserver: ResizeObserver | null = null;\r\n private fullscreenHandler: (() => void) | null = null;\r\n private titleBarEl: HTMLElement | null = null;\r\n\r\n /**\r\n * Register a preview plugin.\r\n */\r\n registerPlugin(plugin: PreviewPlugin): this {\r\n this.plugins.push(plugin);\r\n // Sort by weight descending (higher weight = higher priority)\r\n this.plugins.sort((a, b) => (b.weight ?? 0) - (a.weight ?? 0));\r\n return this;\r\n }\r\n\r\n /**\r\n * Register multiple plugins at once.\r\n */\r\n registerPlugins(plugins: PreviewPlugin[]): this {\r\n for (const plugin of plugins) {\r\n this.registerPlugin(plugin);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Preview a file in the given container element.\r\n */\r\n async preview(\r\n container: HTMLElement,\r\n source: FileSource,\r\n options: PreviewViewerOptions = {}\r\n ): Promise<PreviewInstance> {\r\n this.currentOptions = options;\r\n\r\n // 1. Abort any in-flight operation\r\n this.abort();\r\n this.abortController = new AbortController();\r\n const { signal } = this.abortController;\r\n\r\n // 2. Destroy existing instance\r\n this.destroyInstance();\r\n\r\n // 3. Setup wrapper DOM structure\r\n this.setupDOM(container, options);\r\n\r\n // 4. Emit loading event\r\n this.eventEmitter.emit('loading', { source });\r\n this.showLoading();\r\n\r\n try {\r\n // 5. Normalize source to ArrayBuffer + metadata\r\n const { buffer, metadata } = await sourceToArrayBuffer(source, signal);\r\n if (options.metadata) {\r\n Object.assign(metadata, options.metadata);\r\n }\r\n this.currentBuffer = buffer.slice(0);\r\n this.currentMetadata = metadata;\r\n this.updateTitleBar(options, metadata);\r\n\r\n if (signal.aborted) throw new DOMException('Aborted', 'AbortError');\r\n\r\n // 6. Find matching plugin\r\n const fileInfo: FileInfo = { metadata, buffer };\r\n const matchedPlugin = await this.findPlugin(fileInfo);\r\n\r\n if (!matchedPlugin) {\r\n throw new Error(\r\n `Unsupported file type: ${metadata.extension ?? metadata.mimeType ?? 'unknown'}`\r\n );\r\n }\r\n\r\n if (signal.aborted) throw new DOMException('Aborted', 'AbortError');\r\n\r\n // 7. Clear content area and render\r\n if (this.contentEl) {\r\n this.contentEl.innerHTML = '';\r\n }\r\n\r\n const instance = await matchedPlugin.render({\r\n container: this.contentEl!,\r\n source,\r\n metadata,\r\n buffer,\r\n options,\r\n signal,\r\n emit: (event: string, payload?: unknown) => {\r\n if (event === 'page-change' && payload && typeof (payload as any).page === 'number') {\r\n const total = (payload as any).total ?? (payload as any).totalPages;\r\n this.toolbar?.setPage((payload as any).page, total);\r\n this.thumbnailPanel?.setActive((payload as any).page - 1);\r\n }\r\n this.eventEmitter.emit(event, payload);\r\n },\r\n toggleThumbnails: () => this.toggleThumbnails(),\r\n } as any);\r\n\r\n this.activeInstance = instance;\r\n (instance as any).openInSeparateWindow = () => this.openInSeparateWindow();\r\n (instance as any).toggleThumbnails = () => this.toggleThumbnails();\r\n if (!instance.resetZoom && instance.fitToPage) {\r\n (instance as any).resetZoom = () => instance.fitToPage?.();\r\n }\r\n\r\n // FAST STARTUP: Hide loading immediately once the instance is mounted!\r\n this.hideLoading();\r\n this.eventEmitter.emit('loaded', { metadata, plugin: matchedPlugin.id });\r\n\r\n // 8. Setup toolbar with plugin's actions + auto fullscreen and open-window buttons\r\n const isToolbarVisible = options.showToolbar !== false && options.toolbar !== false;\r\n if (isToolbarVisible && this.toolbar) {\r\n const toolbarConfig = this.extractToolbarConfig(options);\r\n this.toolbar.setConfig(toolbarConfig);\r\n const actions = matchedPlugin.getToolbarActions(instance);\r\n const hasFullscreen = actions.some(a => a.id === 'fullscreen');\r\n if (!hasFullscreen && this.wrapperEl) {\r\n actions.push({\r\n id: 'fullscreen',\r\n icon: 'fullscreen',\r\n label: 'Fullscreen',\r\n type: 'button',\r\n group: 'view',\r\n execute: () => {\r\n try {\r\n if (!document.fullscreenElement) {\r\n this.wrapperEl?.requestFullscreen?.();\r\n this.wrapperEl?.classList.add('fp-fullscreen-active');\r\n } else {\r\n document.exitFullscreen?.();\r\n this.wrapperEl?.classList.remove('fp-fullscreen-active');\r\n }\r\n } catch {\r\n this.wrapperEl?.classList.toggle('fp-fullscreen-active');\r\n }\r\n setTimeout(() => {\r\n this.activeInstance?.fitToPage?.();\r\n }, 120);\r\n }\r\n });\r\n }\r\n\r\n const openWinAction = actions.find(a => a.id === 'open-window');\r\n if (openWinAction) {\r\n if ((options as any)?._isSeparateWindow) {\r\n const idx = actions.indexOf(openWinAction);\r\n if (idx !== -1) actions.splice(idx, 1);\r\n } else {\r\n openWinAction.execute = () => {\r\n this.openInSeparateWindow();\r\n };\r\n }\r\n } else if (!(options as any)?._isSeparateWindow) {\r\n actions.push({\r\n id: 'open-window',\r\n icon: 'open-window',\r\n label: 'Open in Separate Full Window',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => {\r\n this.openInSeparateWindow();\r\n }\r\n });\r\n }\r\n\r\n const thumbAction = actions.find(a => a.id === 'thumbnails');\r\n if (thumbAction) {\r\n thumbAction.execute = () => {\r\n this.toggleThumbnails();\r\n };\r\n }\r\n\r\n this.toolbar.update(actions);\r\n this.toolbar.show();\r\n }\r\n\r\n // 9. Setup thumbnails asynchronously in background so initial preview is instant\r\n if (instance.getThumbnails && this.thumbnailPanel) {\r\n Promise.resolve().then(async () => {\r\n try {\r\n const thumbnails = await Promise.resolve(instance.getThumbnails!());\r\n if (thumbnails && thumbnails.length > 0 && this.thumbnailPanel) {\r\n this.thumbnailPanel.update(thumbnails, (index) => {\r\n instance.goToPage?.(index + 1);\r\n this.toolbar?.setPage(index + 1);\r\n });\r\n if (options.showThumbnails) {\r\n this.thumbnailPanel.show();\r\n }\r\n }\r\n } catch (e) {\r\n console.warn('[FilePreview] Non-critical thumbnail load error:', e);\r\n }\r\n });\r\n }\r\n\r\n return instance;\r\n } catch (error: unknown) {\r\n this.hideLoading();\r\n if (error instanceof DOMException && error.name === 'AbortError') {\r\n throw error;\r\n }\r\n this.showError(error instanceof Error ? error.message : 'Failed to preview file');\r\n this.eventEmitter.emit('error', error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Opens the current file preview in a separate full browser window.\r\n */\r\n openInSeparateWindow(): Window | null {\r\n if (!this.currentBuffer) {\r\n console.warn('[FilePreviewViewer] No active file buffer to open in separate window');\r\n return null;\r\n }\r\n\r\n if (this.currentOptions.onOpenSeparateWindow) {\r\n return this.currentOptions.onOpenSeparateWindow({\r\n buffer: this.currentBuffer,\r\n metadata: this.currentMetadata || { name: 'Document' },\r\n options: this.currentOptions\r\n });\r\n }\r\n\r\n const transferId = 'fp_win_' + Date.now() + '_' + Math.random().toString(36).slice(2, 8);\r\n let clonedBuffer: ArrayBuffer;\r\n try {\r\n clonedBuffer = this.currentBuffer.slice(0);\r\n } catch {\r\n clonedBuffer = this.currentBuffer;\r\n }\r\n const payload = {\r\n buffer: clonedBuffer,\r\n metadata: this.currentMetadata ? { ...this.currentMetadata } : undefined,\r\n options: { ...this.currentOptions, _isSeparateWindow: true }\r\n };\r\n\r\n if (typeof window !== 'undefined') {\r\n try {\r\n (window as any)[transferId] = payload;\r\n (window as any).__lastTransfer = payload;\r\n } catch {}\r\n }\r\n\r\n // Persist asynchronously in IndexedDB for cross-window / process-isolated communication\r\n saveTransferPayload(transferId, payload).catch(err => {\r\n console.warn('[FilePreviewViewer] Transfer payload save warning:', err);\r\n });\r\n\r\n let targetUrl: string | null = null;\r\n if (this.currentOptions.standaloneViewerUrl) {\r\n const u = new URL(this.currentOptions.standaloneViewerUrl, window.location.href);\r\n u.searchParams.set('mode', 'fullscreen');\r\n u.searchParams.set('transferId', transferId);\r\n targetUrl = u.toString();\r\n } else if (typeof window !== 'undefined' && window.location?.href && !window.location.href.startsWith('about:')) {\r\n const u = new URL(window.location.href);\r\n u.searchParams.set('mode', 'fullscreen');\r\n u.searchParams.set('transferId', transferId);\r\n targetUrl = u.toString();\r\n }\r\n\r\n if (targetUrl) {\r\n const newWin = window.open(targetUrl, '_blank');\r\n if (!newWin) {\r\n console.warn('[FilePreviewViewer] Popup blocker prevented opening the preview in a separate window.');\r\n return null;\r\n }\r\n return newWin;\r\n }\r\n\r\n // Fallback for about:blank / test environments without origin\r\n const title = (this.currentMetadata?.name || 'Document Preview') + ' - Full Preview';\r\n const newWin = window.open('', '_blank');\r\n if (!newWin) {\r\n console.warn('[FilePreviewViewer] Popup blocker prevented opening the preview in a separate window.');\r\n return null;\r\n }\r\n\r\n newWin.document.title = title;\r\n newWin.document.body.style.margin = '0';\r\n newWin.document.body.style.padding = '0';\r\n newWin.document.body.style.width = '100vw';\r\n newWin.document.body.style.height = '100vh';\r\n newWin.document.body.style.overflow = 'hidden';\r\n newWin.document.body.style.backgroundColor = '#f8fafc';\r\n\r\n // Clone parent stylesheets and style tags\r\n const headNodes = document.querySelectorAll('link[rel=\"stylesheet\"], style');\r\n headNodes.forEach(node => {\r\n newWin.document.head.appendChild(node.cloneNode(true));\r\n });\r\n\r\n const root = newWin.document.createElement('div');\r\n root.id = 'full-window-preview-root';\r\n root.style.width = '100%';\r\n root.style.height = '100%';\r\n root.style.overflow = 'hidden';\r\n newWin.document.body.appendChild(root);\r\n\r\n const separateViewer = new FilePreviewViewer();\r\n for (const plugin of this.plugins) {\r\n separateViewer.registerPlugin(plugin);\r\n }\r\n\r\n separateViewer.preview(root, this.currentBuffer.slice(0), {\r\n ...this.currentOptions,\r\n showToolbar: true,\r\n toolbarPosition: 'top',\r\n metadata: this.currentMetadata || undefined,\r\n _isSeparateWindow: true\r\n } as any).catch(err => {\r\n console.error('[FilePreviewViewer] Error rendering in separate window:', err);\r\n });\r\n\r\n newWin.addEventListener('beforeunload', () => {\r\n separateViewer.destroy();\r\n });\r\n\r\n return newWin;\r\n }\r\n\r\n /**\r\n * Subscribe to viewer events.\r\n */\r\n on(event: string, handler: EventHandler): Unsubscribe {\r\n return this.eventEmitter.on(event, handler);\r\n }\r\n\r\n /**\r\n * Destroy the viewer and clean up all resources.\r\n */\r\n destroy(): void {\r\n if (this.keyHandler) {\r\n window.removeEventListener('keydown', this.keyHandler);\r\n this.keyHandler = null;\r\n }\r\n if (this.resizeObserver) {\r\n this.resizeObserver.disconnect();\r\n this.resizeObserver = null;\r\n }\r\n if (this.fullscreenHandler) {\r\n document.removeEventListener('fullscreenchange', this.fullscreenHandler);\r\n document.removeEventListener('webkitfullscreenchange', this.fullscreenHandler);\r\n this.fullscreenHandler = null;\r\n }\r\n this.abort();\r\n this.destroyInstance();\r\n this.toolbar?.destroy();\r\n this.thumbnailPanel?.destroy();\r\n this.eventEmitter.emit('destroy', null);\r\n this.eventEmitter.removeAll();\r\n\r\n if (this.wrapperEl?.parentNode) {\r\n this.wrapperEl.parentNode.removeChild(this.wrapperEl);\r\n }\r\n this.wrapperEl = null;\r\n this.contentEl = null;\r\n this.toolbar = null;\r\n this.thumbnailPanel = null;\r\n this.currentBuffer = null;\r\n this.currentMetadata = null;\r\n this.currentContainer = null;\r\n this.titleBarEl = null;\r\n }\r\n\r\n /**\r\n * Get the currently active preview instance.\r\n */\r\n getInstance(): PreviewInstance | null {\r\n return this.activeInstance;\r\n }\r\n\r\n // --- Toolbar Configuration & Feature Toggles ---\r\n\r\n /**\r\n * Configure toolbar features dynamically through options or methods.\r\n * e.g. viewer.setToolbarConfig({ zoomIn: false, print: false })\r\n */\r\n setToolbarConfig(config: ToolbarConfig): void {\r\n this.toolbar?.setConfig(config);\r\n }\r\n\r\n /**\r\n * Get current toolbar configuration.\r\n */\r\n getToolbarConfig(): ToolbarConfig {\r\n return this.toolbar?.getConfig() ?? {};\r\n }\r\n\r\n /**\r\n * Hide a specific toolbar action by ID or alias (e.g. 'zoom-in', 'print', 'download').\r\n */\r\n hideToolbarAction(actionId: string): void {\r\n this.toolbar?.hideAction(actionId);\r\n }\r\n\r\n /**\r\n * Show a specific toolbar action by ID or alias.\r\n */\r\n showToolbarAction(actionId: string): void {\r\n this.toolbar?.showAction(actionId);\r\n }\r\n\r\n /**\r\n * Enable a specific toolbar action button.\r\n */\r\n enableToolbarAction(actionId: string): void {\r\n this.toolbar?.enableAction(actionId);\r\n }\r\n\r\n /**\r\n * Disable a specific toolbar action button.\r\n */\r\n disableToolbarAction(actionId: string): void {\r\n this.toolbar?.disableAction(actionId);\r\n }\r\n\r\n // --- Programmatic Toolbar Action Methods ---\r\n\r\n /**\r\n * Fit document to page so it fills the frame width with minimal margins.\r\n */\r\n fitToPage(): void {\r\n this.activeInstance?.fitToPage?.();\r\n }\r\n\r\n /**\r\n * Reset zoom level to initial/default fit state.\r\n */\r\n resetZoom(): void {\r\n if (this.activeInstance?.resetZoom) {\r\n this.activeInstance.resetZoom();\r\n } else if (this.activeInstance?.fitToPage) {\r\n this.activeInstance.fitToPage();\r\n }\r\n }\r\n\r\n /**\r\n * Zoom in.\r\n */\r\n zoomIn(): void {\r\n this.activeInstance?.zoomIn?.();\r\n }\r\n\r\n /**\r\n * Zoom out.\r\n */\r\n zoomOut(): void {\r\n this.activeInstance?.zoomOut?.();\r\n }\r\n\r\n /**\r\n * Set specific zoom level.\r\n */\r\n setZoom(level: number): void {\r\n this.activeInstance?.setZoom?.(level);\r\n }\r\n\r\n /**\r\n * Get current zoom level.\r\n */\r\n getZoom(): number {\r\n return this.activeInstance?.getZoom?.() ?? 1.0;\r\n }\r\n\r\n /**\r\n * Rotate 90 degrees clockwise.\r\n */\r\n rotateCW(): void {\r\n this.activeInstance?.rotateCW?.();\r\n }\r\n\r\n /**\r\n * Rotate 90 degrees counter-clockwise.\r\n */\r\n rotateCCW(): void {\r\n this.activeInstance?.rotateCCW?.();\r\n }\r\n\r\n /**\r\n * Navigate to a specific page number.\r\n */\r\n goToPage(page: number): void {\r\n this.activeInstance?.goToPage?.(page);\r\n this.toolbar?.setPage(page);\r\n }\r\n\r\n /**\r\n * Navigate to next page.\r\n */\r\n nextPage(): void {\r\n const cur = this.getCurrentPage();\r\n const max = this.getPageCount();\r\n if (cur < max) {\r\n this.goToPage(cur + 1);\r\n }\r\n }\r\n\r\n /**\r\n * Navigate to previous page.\r\n */\r\n prevPage(): void {\r\n const cur = this.getCurrentPage();\r\n if (cur > 1) {\r\n this.goToPage(cur - 1);\r\n }\r\n }\r\n\r\n /**\r\n * Get total page count.\r\n */\r\n getPageCount(): number {\r\n return this.activeInstance?.getPageCount?.() ?? 1;\r\n }\r\n\r\n /**\r\n * Get current page number.\r\n */\r\n getCurrentPage(): number {\r\n return this.activeInstance?.getCurrentPage?.() ?? 1;\r\n }\r\n\r\n /**\r\n * Download the current document.\r\n */\r\n download(): void {\r\n this.activeInstance?.download?.();\r\n }\r\n\r\n /**\r\n * Print the current document.\r\n */\r\n print(): void {\r\n this.activeInstance?.print?.();\r\n }\r\n\r\n /**\r\n * Toggle fullscreen mode.\r\n */\r\n toggleFullscreen(): void {\r\n try {\r\n if (!document.fullscreenElement) {\r\n this.wrapperEl?.requestFullscreen?.();\r\n this.wrapperEl?.classList.add('fp-fullscreen-active');\r\n } else {\r\n document.exitFullscreen?.();\r\n this.wrapperEl?.classList.remove('fp-fullscreen-active');\r\n }\r\n } catch {\r\n this.wrapperEl?.classList.toggle('fp-fullscreen-active');\r\n }\r\n setTimeout(() => {\r\n this.activeInstance?.fitToPage?.();\r\n }, 120);\r\n }\r\n\r\n /**\r\n * Toggle thumbnails sidebar panel.\r\n */\r\n toggleThumbnails(): void {\r\n if (!this.thumbnailPanel) return;\r\n this.thumbnailPanel.toggle();\r\n const isOpen = this.thumbnailPanel.isOpen();\r\n this.toolbar?.setActionActive('thumbnails', isOpen);\r\n setTimeout(() => {\r\n this.activeInstance?.fitToPage?.();\r\n }, 260);\r\n }\r\n\r\n /**\r\n * Set whether to display the file name / title bar above the toolbar.\r\n */\r\n setShowFileName(show: boolean): void {\r\n if (this.currentOptions) {\r\n this.currentOptions.showFileName = show;\r\n }\r\n this.updateTitleBar(this.currentOptions, this.currentMetadata);\r\n }\r\n\r\n /**\r\n * Set or override the displayed file name in the preview panel.\r\n */\r\n setFileName(name: string): void {\r\n if (this.currentOptions) {\r\n this.currentOptions.fileName = name;\r\n }\r\n this.updateTitleBar(this.currentOptions, this.currentMetadata);\r\n }\r\n\r\n // --- Private methods ---\r\n\r\n private updateTitleBar(options?: PreviewViewerOptions, metadata?: import('./types').FileMetadata | null): void {\r\n if (!this.titleBarEl) return;\r\n const show = options?.showFileName !== false;\r\n if (!show) {\r\n this.titleBarEl.style.display = 'none';\r\n return;\r\n }\r\n\r\n const name = options?.fileName || metadata?.name || this.currentMetadata?.name || '';\r\n if (!name) {\r\n this.titleBarEl.style.display = 'none';\r\n return;\r\n }\r\n\r\n this.titleBarEl.style.display = 'flex';\r\n const ext = metadata?.extension || (name.includes('.') ? '.' + name.split('.').pop() : '');\r\n const badge = ext ? ext.replace('.', '').toUpperCase() : '';\r\n this.titleBarEl.innerHTML = `\r\n <div class=\"fp-titlebar-info\">\r\n <span class=\"fp-titlebar-icon\">📄</span>\r\n <span class=\"fp-titlebar-name\" title=\"${name}\">${name}</span>\r\n ${badge ? `<span class=\"fp-titlebar-badge\">${badge}</span>` : ''}\r\n </div>\r\n `;\r\n }\r\n\r\n private extractToolbarConfig(options?: PreviewViewerOptions): ToolbarConfig {\r\n if (!options) return {};\r\n const nested = typeof options.toolbar === 'object' ? options.toolbar : {};\r\n return {\r\n ...options,\r\n ...nested\r\n };\r\n }\r\n\r\n private abort(): void {\r\n if (this.abortController) {\r\n this.abortController.abort();\r\n this.abortController = null;\r\n }\r\n }\r\n\r\n private destroyInstance(): void {\r\n if (this.activeInstance) {\r\n this.activeInstance.destroy();\r\n this.activeInstance = null;\r\n }\r\n }\r\n\r\n private async findPlugin(fileInfo: FileInfo): Promise<PreviewPlugin | null> {\r\n for (const plugin of this.plugins) {\r\n const result = plugin.supports(fileInfo);\r\n const supports = result instanceof Promise ? await result : result;\r\n if (supports) return plugin;\r\n }\r\n return null;\r\n }\r\n\r\n private setupDOM(container: HTMLElement, options: PreviewViewerOptions): void {\r\n this.currentContainer = container;\r\n this.currentOptions = options;\r\n\r\n // Only setup once, or re-setup if container changed\r\n if (this.wrapperEl?.parentNode === container) return;\r\n\r\n // Clean up old wrapper\r\n if (this.wrapperEl?.parentNode) {\r\n this.wrapperEl.parentNode.removeChild(this.wrapperEl);\r\n }\r\n\r\n // Create wrapper structure\r\n const themeClass = options.theme === 'dark' ? 'fp-theme-dark' : '';\r\n const toolbarPos = options.toolbarPosition ?? 'top';\r\n\r\n this.wrapperEl = document.createElement('div');\r\n this.wrapperEl.className = `fp-viewer ${themeClass} ${options.className ?? ''}`.trim();\r\n this.wrapperEl.tabIndex = 0; // allow keyboard focus\r\n\r\n // Toolbar container\r\n const toolbarEl = document.createElement('div');\r\n toolbarEl.className = 'fp-toolbar-container';\r\n\r\n // Content area (where the plugin renders)\r\n this.contentEl = document.createElement('div');\r\n this.contentEl.className = 'fp-content';\r\n\r\n // Thumbnail panel\r\n const thumbnailEl = document.createElement('div');\r\n thumbnailEl.className = 'fp-thumbnail-container';\r\n\r\n // Assemble\r\n const bodyEl = document.createElement('div');\r\n bodyEl.className = 'fp-body';\r\n bodyEl.appendChild(thumbnailEl);\r\n bodyEl.appendChild(this.contentEl);\r\n\r\n // Title / File name bar (above toolbar)\r\n const titleBarEl = document.createElement('div');\r\n titleBarEl.className = 'fp-titlebar';\r\n this.titleBarEl = titleBarEl;\r\n this.updateTitleBar(options, this.currentMetadata);\r\n\r\n if (toolbarPos === 'top') {\r\n this.wrapperEl.appendChild(titleBarEl);\r\n this.wrapperEl.appendChild(toolbarEl);\r\n this.wrapperEl.appendChild(bodyEl);\r\n } else {\r\n this.wrapperEl.appendChild(titleBarEl);\r\n this.wrapperEl.appendChild(bodyEl);\r\n this.wrapperEl.appendChild(toolbarEl);\r\n }\r\n\r\n container.innerHTML = '';\r\n container.appendChild(this.wrapperEl);\r\n\r\n // Initialize toolbar and thumbnail controllers\r\n const initialToolbarConfig = this.extractToolbarConfig(options);\r\n this.toolbar = new ToolbarController(toolbarEl, initialToolbarConfig);\r\n this.thumbnailPanel = new ThumbnailPanel(thumbnailEl, (isOpen) => {\r\n this.toolbar?.setActionActive('thumbnails', isOpen);\r\n setTimeout(() => {\r\n this.activeInstance?.fitToPage?.();\r\n }, 260);\r\n });\r\n\r\n // Enable keyboard shortcuts & drag/drop\r\n this.setupKeyboardShortcuts();\r\n this.setupDragAndDrop(container, options);\r\n this.setupResizeAndFullscreenListeners();\r\n }\r\n\r\n private setupResizeAndFullscreenListeners(): void {\r\n if (this.fullscreenHandler) return;\r\n\r\n this.fullscreenHandler = () => {\r\n setTimeout(() => {\r\n this.activeInstance?.fitToPage?.();\r\n }, 100);\r\n };\r\n\r\n document.addEventListener('fullscreenchange', this.fullscreenHandler);\r\n document.addEventListener('webkitfullscreenchange', this.fullscreenHandler);\r\n\r\n if (typeof ResizeObserver !== 'undefined' && this.contentEl) {\r\n this.resizeObserver = new ResizeObserver(() => {\r\n // Auto-fit content when viewport dimensions resize\r\n if (this.activeInstance && (!this.activeInstance.getZoom || Math.abs((this.activeInstance.getZoom?.() ?? 1) - 1.0) < 0.05)) {\r\n this.activeInstance.fitToPage?.();\r\n }\r\n });\r\n this.resizeObserver.observe(this.contentEl);\r\n }\r\n }\r\n\r\n private setupKeyboardShortcuts(): void {\r\n if (this.keyHandler) return;\r\n\r\n this.keyHandler = (e: KeyboardEvent) => {\r\n // Don't intercept when user is typing in form controls\r\n if (\r\n e.target instanceof HTMLInputElement ||\r\n e.target instanceof HTMLTextAreaElement ||\r\n (e.target as HTMLElement)?.isContentEditable\r\n ) {\r\n return;\r\n }\r\n\r\n if (!this.activeInstance) return;\r\n\r\n if (e.key === 'ArrowRight' || e.key === 'PageDown') {\r\n const cur = this.activeInstance.getCurrentPage?.() ?? 1;\r\n this.activeInstance.goToPage?.(cur + 1);\r\n const nextCur = this.activeInstance.getCurrentPage?.() ?? (cur + 1);\r\n this.toolbar?.setPage(nextCur);\r\n } else if (e.key === 'ArrowLeft' || e.key === 'PageUp') {\r\n const cur = this.activeInstance.getCurrentPage?.() ?? 1;\r\n this.activeInstance.goToPage?.(Math.max(1, cur - 1));\r\n const prevCur = this.activeInstance.getCurrentPage?.() ?? Math.max(1, cur - 1);\r\n this.toolbar?.setPage(prevCur);\r\n } else if (e.key === '+' || e.key === '=') {\r\n this.activeInstance.zoomIn?.();\r\n } else if (e.key === '-' || e.key === '_') {\r\n this.activeInstance.zoomOut?.();\r\n } else if (e.key === '0') {\r\n this.activeInstance.fitToPage?.();\r\n } else if (e.key === 'r' || e.key === 'R') {\r\n this.activeInstance.rotateCW?.();\r\n } else if (e.key === 'f' || e.key === 'F') {\r\n if (!document.fullscreenElement) {\r\n this.wrapperEl?.requestFullscreen?.();\r\n } else {\r\n document.exitFullscreen?.();\r\n }\r\n }\r\n };\r\n\r\n window.addEventListener('keydown', this.keyHandler);\r\n }\r\n\r\n private setupDragAndDrop(container: HTMLElement, options: PreviewViewerOptions): void {\r\n if (!this.wrapperEl) return;\r\n\r\n this.wrapperEl.addEventListener('dragover', (e) => {\r\n e.preventDefault();\r\n this.wrapperEl?.classList.add('fp-dragover');\r\n });\r\n\r\n this.wrapperEl.addEventListener('dragleave', (e) => {\r\n if (e.relatedTarget === null || !this.wrapperEl?.contains(e.relatedTarget as Node)) {\r\n this.wrapperEl?.classList.remove('fp-dragover');\r\n }\r\n });\r\n\r\n this.wrapperEl.addEventListener('drop', (e) => {\r\n e.preventDefault();\r\n this.wrapperEl?.classList.remove('fp-dragover');\r\n const file = e.dataTransfer?.files?.[0];\r\n if (file) {\r\n this.preview(container, file, options);\r\n }\r\n });\r\n }\r\n\r\n private showLoading(): void {\r\n if (!this.contentEl) return;\r\n const loader = document.createElement('div');\r\n loader.className = 'fp-loading';\r\n loader.innerHTML = '<div class=\"fp-spinner\"></div><span>Loading preview...</span>';\r\n this.contentEl.appendChild(loader);\r\n }\r\n\r\n private hideLoading(): void {\r\n if (!this.contentEl) return;\r\n const loader = this.contentEl.querySelector('.fp-loading');\r\n if (loader) loader.remove();\r\n }\r\n\r\n private showError(message: string): void {\r\n if (!this.contentEl) return;\r\n this.contentEl.innerHTML = '';\r\n const errorEl = document.createElement('div');\r\n errorEl.className = 'fp-error';\r\n errorEl.style.display = 'flex';\r\n errorEl.style.flexDirection = 'column';\r\n errorEl.style.alignItems = 'center';\r\n errorEl.style.justifyContent = 'center';\r\n errorEl.style.padding = '32px';\r\n errorEl.style.textAlign = 'center';\r\n\r\n const hasDownload = !!(this.currentBuffer && this.currentMetadata);\r\n\r\n errorEl.innerHTML = `\r\n <div class=\"fp-error-icon\" style=\"font-size:36px;margin-bottom:8px;\">⚠️</div>\r\n <div class=\"fp-error-message\" style=\"font-size:16px;font-weight:600;margin-bottom:6px;\">Cannot preview file</div>\r\n <div class=\"fp-error-sub\" style=\"font-size:13px;color:#64748b;max-width:420px;line-height:1.5;margin-bottom:16px;\">${message}</div>\r\n ${hasDownload ? '<button class=\"fp-error-download-btn\" style=\"padding:8px 16px;background:#3b82f6;color:#ffffff;border:none;border-radius:6px;cursor:pointer;font-weight:500;font-size:13px;transition:background 0.2s;\">Download Original File</button>' : ''}\r\n `;\r\n\r\n if (hasDownload && this.currentBuffer) {\r\n const btn = errorEl.querySelector('.fp-error-download-btn') as HTMLButtonElement;\r\n if (btn) {\r\n btn.addEventListener('click', () => {\r\n downloadFile(this.currentBuffer!, this.currentMetadata?.name || 'download', this.currentMetadata?.mimeType);\r\n });\r\n }\r\n }\r\n\r\n this.contentEl.appendChild(errorEl);\r\n }\r\n}\r\n","/**\r\n * Compound File Binary Format (CFBF / OLE2) parser.\r\n * Implements Microsoft [MS-CFB] specification for legacy Office formats (.doc, .ppt, .xls).\r\n * Zero external dependencies, client-side browser and Node.js compatible.\r\n */\r\n\r\nexport interface CfbfEntry {\r\n name: string;\r\n type: number; // 0=Empty, 1=User Storage, 2=User Stream, 5=Root Storage\r\n size: number;\r\n startSector: number;\r\n}\r\n\r\nexport class CfbfReader {\r\n private view: DataView;\r\n private u8: Uint8Array;\r\n private sectorSize: number;\r\n private miniSectorSize: number;\r\n private miniStreamCutoff: number;\r\n private fat: number[] = [];\r\n private miniFat: number[] = [];\r\n private entries: Map<string, CfbfEntry> = new Map();\r\n private miniStream: Uint8Array = new Uint8Array(0);\r\n\r\n constructor(buffer: ArrayBuffer) {\r\n this.u8 = new Uint8Array(buffer);\r\n this.view = new DataView(buffer);\r\n\r\n if (!this.isValid()) {\r\n throw new Error('Invalid CFBF / OLE2 file header signature');\r\n }\r\n\r\n // Sector shifts\r\n const sectorShift = this.view.getUint16(30, true);\r\n this.sectorSize = 1 << sectorShift;\r\n const miniSectorShift = this.view.getUint16(32, true);\r\n this.miniSectorSize = 1 << miniSectorShift;\r\n this.miniStreamCutoff = this.view.getUint32(56, true) || 4096;\r\n\r\n this.parseFat();\r\n this.parseDirectory();\r\n this.parseMiniFat();\r\n }\r\n\r\n /** Check if the magic 8-byte signature matches [MS-CFB] */\r\n public isValid(): boolean {\r\n if (this.u8.length < 512) return false;\r\n const sig = [0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, 0x1a, 0xe1];\r\n return sig.every((b, i) => this.u8[i] === b);\r\n }\r\n\r\n /** Return all directory stream/storage entries found in the file */\r\n public listEntries(): CfbfEntry[] {\r\n return Array.from(this.entries.values());\r\n }\r\n\r\n /** Check if a stream exists */\r\n public hasStream(name: string): boolean {\r\n return this.entries.has(name) || this.findEntryCaseInsensitive(name) !== null;\r\n }\r\n\r\n /**\r\n * Read raw bytes of a named stream (e.g. \"WordDocument\", \"PowerPoint Document\", \"Workbook\")\r\n */\r\n public readStream(name: string): Uint8Array | null {\r\n const entry = this.entries.get(name) || this.findEntryCaseInsensitive(name);\r\n if (!entry) return null;\r\n if (entry.size === 0) return new Uint8Array(0);\r\n\r\n // Mini Stream vs Regular Stream\r\n if (entry.size < this.miniStreamCutoff && entry.type !== 5) {\r\n return this.readMiniStream(entry.startSector, entry.size);\r\n } else {\r\n return this.readRegularStream(entry.startSector, entry.size);\r\n }\r\n }\r\n\r\n private findEntryCaseInsensitive(name: string): CfbfEntry | null {\r\n const lower = name.toLowerCase();\r\n for (const [key, val] of this.entries.entries()) {\r\n if (key.toLowerCase() === lower) return val;\r\n }\r\n return null;\r\n }\r\n\r\n private getSectorOffset(sectId: number): number {\r\n return (sectId + 1) * this.sectorSize;\r\n }\r\n\r\n private parseFat(): void {\r\n const csectFat = this.view.getUint32(44, true);\r\n const difat: number[] = [];\r\n\r\n // First 109 DIFAT entries stored in header (offset 76..511)\r\n for (let i = 0; i < 109; i++) {\r\n const sect = this.view.getUint32(76 + i * 4, true);\r\n if (sect !== 0xffffffff && sect !== 0xfffffffe) {\r\n difat.push(sect);\r\n }\r\n }\r\n\r\n // Chained DIFAT sectors (if file has > 109 FAT sectors)\r\n let difatSect = this.view.getUint32(68, true);\r\n const csectDif = this.view.getUint32(72, true);\r\n const entriesPerSector = (this.sectorSize / 4) - 1;\r\n\r\n for (let i = 0; i < csectDif && difatSect < 0xfffffffe; i++) {\r\n const offset = this.getSectorOffset(difatSect);\r\n for (let j = 0; j < entriesPerSector; j++) {\r\n const sect = this.view.getUint32(offset + j * 4, true);\r\n if (sect !== 0xffffffff && sect !== 0xfffffffe) {\r\n difat.push(sect);\r\n }\r\n }\r\n difatSect = this.view.getUint32(offset + entriesPerSector * 4, true);\r\n }\r\n\r\n // Read all FAT sectors and construct fat array\r\n for (const fatSect of difat) {\r\n if (fatSect >= 0xfffffffe) continue;\r\n const offset = this.getSectorOffset(fatSect);\r\n const count = this.sectorSize / 4;\r\n for (let j = 0; j < count; j++) {\r\n this.fat.push(this.view.getUint32(offset + j * 4, true));\r\n }\r\n }\r\n }\r\n\r\n private parseDirectory(): void {\r\n const dirStartSect = this.view.getUint32(48, true);\r\n const dirBytes = this.readRegularStream(dirStartSect);\r\n const dirView = new DataView(dirBytes.buffer, dirBytes.byteOffset, dirBytes.byteLength);\r\n const entryCount = dirBytes.length / 128;\r\n\r\n for (let i = 0; i < entryCount; i++) {\r\n const offset = i * 128;\r\n const type = dirView.getUint8(offset + 66);\r\n if (type === 0) continue; // Unallocated\r\n\r\n const nameLen = dirView.getUint16(offset + 64, true);\r\n let name = '';\r\n if (nameLen > 2) {\r\n const charCount = (nameLen / 2) - 1; // exclude null terminator\r\n const chars: string[] = [];\r\n for (let c = 0; c < charCount; c++) {\r\n const charCode = dirView.getUint16(offset + c * 2, true);\r\n chars.push(String.fromCharCode(charCode));\r\n }\r\n name = chars.join('');\r\n }\r\n\r\n const startSector = dirView.getUint32(offset + 116, true);\r\n // Low 32-bits of size (Office files are almost never > 4GB)\r\n const size = dirView.getUint32(offset + 120, true);\r\n\r\n const entry: CfbfEntry = { name, type, size, startSector };\r\n this.entries.set(name, entry);\r\n\r\n // Root entry stores the Mini Stream\r\n if (type === 5) {\r\n this.miniStream = this.readRegularStream(startSector, size);\r\n }\r\n }\r\n }\r\n\r\n private parseMiniFat(): void {\r\n const miniFatStart = this.view.getUint32(60, true);\r\n const csectMiniFat = this.view.getUint32(64, true);\r\n if (miniFatStart >= 0xfffffffe || csectMiniFat === 0) return;\r\n\r\n let sect = miniFatStart;\r\n for (let i = 0; i < csectMiniFat && sect < 0xfffffffe; i++) {\r\n const offset = this.getSectorOffset(sect);\r\n const count = this.sectorSize / 4;\r\n for (let j = 0; j < count; j++) {\r\n this.miniFat.push(this.view.getUint32(offset + j * 4, true));\r\n }\r\n sect = this.fat[sect] ?? 0xfffffffe;\r\n }\r\n }\r\n\r\n private readRegularStream(startSector: number, targetSize?: number): Uint8Array {\r\n if (startSector >= 0xfffffffe) return new Uint8Array(0);\r\n\r\n const chunks: Uint8Array[] = [];\r\n let curr = startSector;\r\n let totalBytes = 0;\r\n const visited = new Set<number>();\r\n\r\n while (curr < 0xfffffffe && !visited.has(curr)) {\r\n visited.add(curr);\r\n const offset = this.getSectorOffset(curr);\r\n if (offset + this.sectorSize <= this.u8.length) {\r\n chunks.push(this.u8.subarray(offset, offset + this.sectorSize));\r\n totalBytes += this.sectorSize;\r\n }\r\n curr = this.fat[curr] ?? 0xfffffffe;\r\n }\r\n\r\n const result = new Uint8Array(totalBytes);\r\n let pos = 0;\r\n for (const chunk of chunks) {\r\n result.set(chunk, pos);\r\n pos += chunk.length;\r\n }\r\n\r\n if (targetSize !== undefined && targetSize < result.length) {\r\n return result.subarray(0, targetSize);\r\n }\r\n return result;\r\n }\r\n\r\n private readMiniStream(startSector: number, targetSize: number): Uint8Array {\r\n if (this.miniStream.length === 0 || startSector >= 0xfffffffe) return new Uint8Array(0);\r\n\r\n const chunks: Uint8Array[] = [];\r\n let curr = startSector;\r\n let totalBytes = 0;\r\n const visited = new Set<number>();\r\n\r\n while (curr < 0xfffffffe && !visited.has(curr)) {\r\n visited.add(curr);\r\n const offset = curr * this.miniSectorSize;\r\n if (offset + this.miniSectorSize <= this.miniStream.length) {\r\n chunks.push(this.miniStream.subarray(offset, offset + this.miniSectorSize));\r\n totalBytes += this.miniSectorSize;\r\n }\r\n curr = this.miniFat[curr] ?? 0xfffffffe;\r\n }\r\n\r\n const result = new Uint8Array(totalBytes);\r\n let pos = 0;\r\n for (const chunk of chunks) {\r\n result.set(chunk, pos);\r\n pos += chunk.length;\r\n }\r\n\r\n return result.subarray(0, targetSize);\r\n }\r\n}\r\n","import type { \r\n FileInfo, \r\n RenderContext, \r\n ToolbarAction, \r\n PreviewPlugin, \r\n PreviewInstance, \r\n Thumbnail \r\n} from '@patel.sumit51/core';\r\nimport * as pdfjsLib from 'pdfjs-dist';\r\n\r\n// Configure PDF.js worker: 100% local, zero external network dependencies\r\nif (typeof window !== 'undefined' && pdfjsLib.GlobalWorkerOptions) {\r\n if (!pdfjsLib.GlobalWorkerOptions.workerPort && !pdfjsLib.GlobalWorkerOptions.workerSrc) {\r\n const customWorker = (window as any).__PDF_WORKER_SRC__;\r\n if (customWorker) {\r\n pdfjsLib.GlobalWorkerOptions.workerSrc = customWorker;\r\n } else {\r\n try {\r\n pdfjsLib.GlobalWorkerOptions.workerPort = new Worker(\r\n new URL('pdfjs-dist/build/pdf.worker.min.mjs', import.meta.url),\r\n { type: 'module' }\r\n );\r\n } catch {\r\n pdfjsLib.GlobalWorkerOptions.workerSrc = './pdf.worker.min.mjs';\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport class PdfPlugin implements PreviewPlugin {\r\n id = 'pdf';\r\n name = 'PDF Document Preview';\r\n extensions = ['.pdf'];\r\n mimeTypes = ['application/pdf'];\r\n weight = 100;\r\n\r\n supports(file: FileInfo): boolean {\r\n const ext = file.metadata.extension?.toLowerCase();\r\n const mime = file.metadata.mimeType?.toLowerCase();\r\n if (ext) return this.extensions.includes(ext);\r\n return this.mimeTypes.includes(mime || '');\r\n }\r\n\r\n getToolbarActions(instance: PreviewInstance): ToolbarAction[] {\r\n const totalPages = instance.getPageCount?.() ?? 1;\r\n const curPage = instance.getCurrentPage?.() ?? 1;\r\n\r\n return [\r\n {\r\n id: 'thumbnails',\r\n icon: 'thumbnails',\r\n label: 'Page Thumbnails',\r\n type: 'button',\r\n group: 'navigation',\r\n execute: () => instance.toggleThumbnails?.()\r\n },\r\n {\r\n id: 'page-nav',\r\n icon: '',\r\n label: 'Page Navigation',\r\n type: 'page-nav',\r\n group: 'navigation',\r\n value: curPage,\r\n max: totalPages,\r\n execute: (action: unknown, page?: unknown) => {\r\n const cur = instance.getCurrentPage?.() ?? 1;\r\n const max = instance.getPageCount?.() ?? 1;\r\n if (action === 'prev') {\r\n if (cur > 1) instance.goToPage?.(cur - 1);\r\n } else if (action === 'next') {\r\n if (cur < max) instance.goToPage?.(cur + 1);\r\n } else if (typeof page === 'number') {\r\n instance.goToPage?.(page);\r\n }\r\n }\r\n },\r\n {\r\n id: 'zoom-out',\r\n icon: 'zoom-out',\r\n label: 'Zoom Out',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomOut?.()\r\n },\r\n {\r\n id: 'zoom-in',\r\n icon: 'zoom-in',\r\n label: 'Zoom In',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomIn?.()\r\n },\r\n {\r\n id: 'fit-page',\r\n icon: 'fit-page',\r\n label: 'Fit to Page',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.fitToPage?.()\r\n },\r\n {\r\n id: 'reset-zoom',\r\n icon: 'reset-zoom',\r\n label: 'Reset Zoom',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.resetZoom?.()\r\n },\r\n {\r\n id: 'fit-width',\r\n icon: 'fit-width',\r\n label: 'Fit to Width',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.fitToWidth?.()\r\n },\r\n {\r\n id: 'rotate-cw',\r\n icon: 'rotate-cw',\r\n label: 'Rotate Clockwise',\r\n type: 'button',\r\n group: 'view',\r\n execute: () => instance.rotateCW?.()\r\n },\r\n {\r\n id: 'rotate-ccw',\r\n icon: 'rotate-ccw',\r\n label: 'Rotate Counter-Clockwise',\r\n type: 'button',\r\n group: 'view',\r\n execute: () => instance.rotateCCW?.()\r\n },\r\n {\r\n id: 'download',\r\n icon: 'download',\r\n label: 'Download PDF',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => instance.download?.()\r\n },\r\n {\r\n id: 'print',\r\n icon: 'print',\r\n label: 'Print',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => instance.print?.()\r\n },\r\n {\r\n id: 'open-window',\r\n icon: 'open-window',\r\n label: 'Open in Separate Full Window',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => (instance as any).openInSeparateWindow?.()\r\n }\r\n ];\r\n }\r\n\r\n async render(ctx: RenderContext): Promise<PreviewInstance> {\r\n const container = document.createElement('div');\r\n container.className = 'fp-pdf-container';\r\n container.style.width = '100%';\r\n container.style.height = '100%';\r\n container.style.overflowX = 'hidden';\r\n container.style.overflowY = 'auto';\r\n container.style.display = 'flex';\r\n container.style.flexDirection = 'column';\r\n container.style.alignItems = 'center';\r\n container.style.justifyContent = 'flex-start';\r\n container.style.padding = '16px 8px';\r\n container.style.backgroundColor = '#0f172a';\r\n container.style.boxSizing = 'border-box';\r\n container.style.position = 'relative';\r\n\r\n const pageCard = document.createElement('div');\r\n pageCard.className = 'fp-pdf-page-card';\r\n pageCard.style.boxShadow = '0 10px 35px rgba(0, 0, 0, 0.5)';\r\n pageCard.style.backgroundColor = '#ffffff';\r\n pageCard.style.borderRadius = '4px';\r\n pageCard.style.overflow = 'hidden';\r\n pageCard.style.lineHeight = '0';\r\n pageCard.style.position = 'relative';\r\n pageCard.style.flexShrink = '0';\r\n pageCard.style.transition = 'box-shadow 0.2s ease';\r\n\r\n let canvas = document.createElement('canvas');\r\n pageCard.appendChild(canvas);\r\n container.appendChild(pageCard);\r\n ctx.container.appendChild(container);\r\n\r\n const standardFontsUrl = (typeof window !== 'undefined' && (window as any).__PDF_STANDARD_FONTS_URL__) || './standard_fonts/';\r\n const cmapsUrl = (typeof window !== 'undefined' && (window as any).__PDF_CMAPS_URL__) || './cmaps/';\r\n\r\n const loadingTask = pdfjsLib.getDocument({\r\n data: new Uint8Array(ctx.buffer.slice(0)),\r\n cMapUrl: cmapsUrl,\r\n cMapPacked: true,\r\n standardFontDataUrl: standardFontsUrl,\r\n verbosity: 0,\r\n });\r\n\r\n const pdfDoc = await loadingTask.promise;\r\n const totalPages = Math.max(1, pdfDoc.numPages);\r\n\r\n let currentPage = 1;\r\n let zoomScale = 1.0;\r\n let rotation = 0;\r\n let fitMode: 'width' | 'page' = ((ctx as any)?.options?.fitMode as any) || 'width';\r\n let currentRenderTask: any = null;\r\n let textLayerDiv: HTMLElement | null = null;\r\n\r\n const renderPage = async (pageNum: number) => {\r\n if (currentRenderTask) {\r\n try {\r\n currentRenderTask.cancel();\r\n } catch {}\r\n currentRenderTask = null;\r\n }\r\n\r\n // Fresh canvas on every render to eliminate PDF.js canvas collision on fast render/rotation\r\n const newCanvas = document.createElement('canvas');\r\n pageCard.replaceChild(newCanvas, canvas);\r\n canvas = newCanvas;\r\n\r\n if (textLayerDiv) {\r\n textLayerDiv.remove();\r\n textLayerDiv = null;\r\n }\r\n\r\n currentPage = Math.max(1, Math.min(totalPages, pageNum));\r\n ctx.emit('page-change', { page: currentPage, total: totalPages });\r\n\r\n const page = await pdfDoc.getPage(currentPage);\r\n\r\n const containerWidth = container.clientWidth || 900;\r\n const containerHeight = container.clientHeight || 700;\r\n const unscaledVp = page.getViewport({ scale: 1.0, rotation });\r\n\r\n // Minimal side margins (16px on each side, safe from vertical scrollbar)\r\n const availWidth = Math.max(280, containerWidth - 36);\r\n const availHeight = Math.max(280, containerHeight - 32);\r\n const scaleW = availWidth / unscaledVp.width;\r\n const scaleH = availHeight / unscaledVp.height;\r\n\r\n // In 'page' mode: fit page height & width so full document fits comfortably with 0 scroll\r\n // In 'width' mode: fit page width comfortably for reading with minimal side margins\r\n let fitScale: number;\r\n if (fitMode === 'page') {\r\n fitScale = Math.max(0.2, Math.min(4.0, Math.min(scaleW, scaleH)));\r\n } else {\r\n fitScale = Math.max(0.2, Math.min(4.0, scaleW));\r\n }\r\n const effectiveScale = (fitScale > 0 ? fitScale : 1.0) * zoomScale;\r\n\r\n const pixelRatio = window.devicePixelRatio || 1;\r\n const viewport = page.getViewport({ scale: effectiveScale, rotation });\r\n\r\n const displayWidth = Math.floor(viewport.width);\r\n const displayHeight = Math.floor(viewport.height);\r\n\r\n canvas.width = Math.floor(viewport.width * pixelRatio);\r\n canvas.height = Math.floor(viewport.height * pixelRatio);\r\n canvas.style.width = `${displayWidth}px`;\r\n canvas.style.height = `${displayHeight}px`;\r\n\r\n pageCard.style.width = `${displayWidth}px`;\r\n pageCard.style.height = `${displayHeight}px`;\r\n\r\n const canvasCtx = canvas.getContext('2d');\r\n if (!canvasCtx) return;\r\n\r\n canvasCtx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\r\n\r\n currentRenderTask = page.render({\r\n canvasContext: canvasCtx,\r\n viewport,\r\n });\r\n\r\n try {\r\n await currentRenderTask.promise;\r\n } catch (err: any) {\r\n if (err?.name !== 'RenderingCancelledException') {\r\n console.warn('[PdfPlugin] Page render warning:', err);\r\n }\r\n return;\r\n } finally {\r\n currentRenderTask = null;\r\n }\r\n\r\n // Render Text Layer for text selection and copying\r\n try {\r\n textLayerDiv = document.createElement('div');\r\n textLayerDiv.className = 'textLayer';\r\n textLayerDiv.style.width = `${displayWidth}px`;\r\n textLayerDiv.style.height = `${displayHeight}px`;\r\n textLayerDiv.style.position = 'absolute';\r\n textLayerDiv.style.top = '0';\r\n textLayerDiv.style.left = '0';\r\n textLayerDiv.style.lineHeight = '1';\r\n pageCard.appendChild(textLayerDiv);\r\n\r\n if ((pdfjsLib as any).TextLayer) {\r\n const textLayer = new (pdfjsLib as any).TextLayer({\r\n textContentSource: page.streamTextContent(),\r\n container: textLayerDiv,\r\n viewport,\r\n });\r\n await textLayer.render();\r\n }\r\n } catch (err) {\r\n // Non-fatal text layer notice\r\n console.debug('[PdfPlugin] TextLayer notice:', err);\r\n }\r\n };\r\n\r\n renderPage(1);\r\n\r\n // Auto-refit on container resize (window resize, thumbnail panel toggle, fullscreen)\r\n let resizeTimer: ReturnType<typeof setTimeout> | null = null;\r\n const resizeObserver = new ResizeObserver(() => {\r\n if (resizeTimer) clearTimeout(resizeTimer);\r\n resizeTimer = setTimeout(() => {\r\n // Auto-refit if zoom is near 1.0\r\n if (Math.abs(zoomScale - 1.0) < 0.05) {\r\n renderPage(currentPage);\r\n }\r\n }, 120);\r\n });\r\n resizeObserver.observe(container);\r\n\r\n // Ctrl + Wheel / Trackpad Pinch Zoom\r\n const onWheel = (e: WheelEvent) => {\r\n if (e.ctrlKey || e.metaKey) {\r\n e.preventDefault();\r\n const delta = e.deltaY > 0 ? -0.15 : 0.15;\r\n zoomScale = Math.max(0.25, Math.min(4.0, Math.round((zoomScale + delta) * 100) / 100));\r\n renderPage(currentPage);\r\n }\r\n };\r\n container.addEventListener('wheel', onWheel, { passive: false });\r\n\r\n // Keyboard navigation (Left/Right arrows, PageUp/PageDown, Home/End)\r\n const onKeyDown = (e: KeyboardEvent) => {\r\n const tag = (e.target as HTMLElement)?.tagName?.toLowerCase();\r\n if (tag === 'input' || tag === 'textarea' || tag === 'select') return;\r\n\r\n if (e.key === 'ArrowRight' || e.key === 'PageDown') {\r\n if (currentPage < totalPages) {\r\n e.preventDefault();\r\n container.scrollTop = 0;\r\n renderPage(currentPage + 1);\r\n }\r\n } else if (e.key === 'ArrowLeft' || e.key === 'PageUp') {\r\n if (currentPage > 1) {\r\n e.preventDefault();\r\n container.scrollTop = 0;\r\n renderPage(currentPage - 1);\r\n }\r\n } else if (e.key === 'Home') {\r\n e.preventDefault();\r\n container.scrollTop = 0;\r\n renderPage(1);\r\n } else if (e.key === 'End') {\r\n e.preventDefault();\r\n container.scrollTop = 0;\r\n renderPage(totalPages);\r\n }\r\n };\r\n window.addEventListener('keydown', onKeyDown);\r\n\r\n const cleanup = () => {\r\n resizeObserver.disconnect();\r\n window.removeEventListener('keydown', onKeyDown);\r\n container.removeEventListener('wheel', onWheel);\r\n if (resizeTimer) clearTimeout(resizeTimer);\r\n if (currentRenderTask) {\r\n try { currentRenderTask.cancel(); } catch {}\r\n }\r\n try {\r\n pdfDoc.destroy();\r\n } catch {}\r\n container.remove();\r\n ctx.container.innerHTML = '';\r\n };\r\n\r\n ctx.signal.addEventListener('abort', cleanup);\r\n\r\n const instance: PreviewInstance = {\r\n destroy: cleanup,\r\n zoomIn: () => {\r\n zoomScale = Math.min(4.0, Math.round((zoomScale + 0.2) * 10) / 10);\r\n renderPage(currentPage);\r\n },\r\n zoomOut: () => {\r\n zoomScale = Math.max(0.25, Math.round((zoomScale - 0.2) * 10) / 10);\r\n renderPage(currentPage);\r\n },\r\n getZoom: () => zoomScale,\r\n setZoom: (level: number) => {\r\n zoomScale = Math.max(0.25, Math.min(4.0, level));\r\n renderPage(currentPage);\r\n },\r\n fitToPage: () => {\r\n fitMode = 'page';\r\n zoomScale = 1.0;\r\n renderPage(currentPage);\r\n },\r\n resetZoom: () => {\r\n fitMode = 'page';\r\n zoomScale = 1.0;\r\n rotation = 0;\r\n container.scrollTop = 0;\r\n container.scrollLeft = 0;\r\n renderPage(currentPage);\r\n },\r\n fitToWidth: () => {\r\n fitMode = 'width';\r\n zoomScale = 1.0;\r\n renderPage(currentPage);\r\n },\r\n rotateCW: () => {\r\n rotation = (rotation + 90) % 360;\r\n renderPage(currentPage);\r\n },\r\n rotateCCW: () => {\r\n rotation = (rotation - 90 + 360) % 360;\r\n renderPage(currentPage);\r\n },\r\n getRotation: () => rotation,\r\n getPageCount: () => totalPages,\r\n getCurrentPage: () => currentPage,\r\n goToPage: (page: number) => {\r\n container.scrollTop = 0;\r\n renderPage(page);\r\n },\r\n toggleThumbnails: () => {\r\n (ctx as any)?.toggleThumbnails?.();\r\n },\r\n download: () => {\r\n const blob = new Blob([ctx.buffer], { type: 'application/pdf' });\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = ctx.metadata.name || 'document.pdf';\r\n a.click();\r\n URL.revokeObjectURL(url);\r\n },\r\n print: () => {\r\n const blob = new Blob([ctx.buffer], { type: 'application/pdf' });\r\n const url = URL.createObjectURL(blob);\r\n const hiddenIframe = document.createElement('iframe');\r\n hiddenIframe.style.position = 'fixed';\r\n hiddenIframe.style.right = '0';\r\n hiddenIframe.style.bottom = '0';\r\n hiddenIframe.style.width = '0';\r\n hiddenIframe.style.height = '0';\r\n hiddenIframe.style.border = '0';\r\n document.body.appendChild(hiddenIframe);\r\n hiddenIframe.src = url;\r\n hiddenIframe.onload = () => {\r\n setTimeout(() => {\r\n hiddenIframe.contentWindow?.print();\r\n setTimeout(() => {\r\n hiddenIframe.remove();\r\n URL.revokeObjectURL(url);\r\n }, 1000);\r\n }, 300);\r\n };\r\n },\r\n getThumbnails: async (): Promise<Thumbnail[]> => {\r\n const thumbnails: Thumbnail[] = [];\r\n const count = totalPages;\r\n\r\n for (let i = 1; i <= count; i++) {\r\n thumbnails.push({\r\n index: i,\r\n label: `Page ${i}`,\r\n render: async (thumbCanvas: HTMLCanvasElement) => {\r\n try {\r\n const p = await pdfDoc.getPage(i);\r\n const baseVp = p.getViewport({ scale: 1.0, rotation });\r\n const targetW = thumbCanvas.width || 130;\r\n const thumbScale = targetW / baseVp.width;\r\n const thumbVp = p.getViewport({ scale: thumbScale, rotation });\r\n thumbCanvas.height = Math.floor(thumbVp.height);\r\n\r\n const tCtx = thumbCanvas.getContext('2d');\r\n if (tCtx) {\r\n await p.render({ canvasContext: tCtx, viewport: thumbVp }).promise;\r\n }\r\n } catch (e) {\r\n console.warn(`[PdfPlugin] Error generating thumbnail for page ${i}:`, e);\r\n }\r\n }\r\n });\r\n }\r\n return thumbnails;\r\n }\r\n };\r\n\r\n return instance;\r\n }\r\n}\r\n\r\nexport function pdfPlugin(): PdfPlugin {\r\n return new PdfPlugin();\r\n}\r\n\r\nexport default PdfPlugin;\r\n","import type { \r\n FileInfo, \r\n RenderContext, \r\n ToolbarAction, \r\n PreviewPlugin, \r\n PreviewInstance \r\n} from '@patel.sumit51/core';\r\n\r\nconst IMAGE_EXTS = ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.svg', '.bmp', '.ico', '.tiff', '.tif', '.avif'];\r\nconst VIDEO_EXTS = ['.mp4', '.m4v', '.webm', '.ogv', '.ogg', '.mov', '.avi', '.mkv', '.flv', '.wmv', '.3gp', '.mpg', '.mpeg'];\r\nconst AUDIO_EXTS = ['.mp3', '.wav', '.ogg', '.flac', '.aac', '.m4a', '.wma', '.opus', '.weba'];\r\n\r\nexport class MediaPlugin implements PreviewPlugin {\r\n id = 'media';\r\n name = 'Media Preview (Image, Video, Audio)';\r\n extensions = [...IMAGE_EXTS, ...VIDEO_EXTS, ...AUDIO_EXTS];\r\n mimeTypes = [\r\n 'image/jpeg', 'image/png', 'image/gif', 'image/webp', 'image/svg+xml', 'image/bmp', 'image/x-icon', 'image/tiff', 'image/avif',\r\n 'video/mp4', 'video/webm', 'video/ogg', 'video/quicktime', 'video/x-msvideo', 'video/x-matroska', 'video/x-flv', 'video/x-ms-wmv', 'video/3gpp', 'video/mpeg',\r\n 'audio/mpeg', 'audio/wav', 'audio/ogg', 'audio/flac', 'audio/aac', 'audio/mp4', 'audio/x-ms-wma', 'audio/opus', 'audio/webm'\r\n ];\r\n weight = 90;\r\n\r\n supports(file: FileInfo): boolean {\r\n const ext = file.metadata.extension?.toLowerCase() || '';\r\n const mime = file.metadata.mimeType?.toLowerCase() || '';\r\n \r\n return this.extensions.includes(ext) || \r\n this.mimeTypes.some(m => mime.startsWith(m.split('/')[0]));\r\n }\r\n\r\n getToolbarActions(instance: PreviewInstance): ToolbarAction[] {\r\n const actions: ToolbarAction[] = [];\r\n \r\n if (instance.zoomIn) {\r\n actions.push(\r\n {\r\n id: 'zoom-out',\r\n icon: 'zoom-out',\r\n label: 'Zoom Out',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => {\r\n instance.zoomOut?.();\r\n }\r\n },\r\n {\r\n id: 'zoom-in',\r\n icon: 'zoom-in',\r\n label: 'Zoom In',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => {\r\n instance.zoomIn?.();\r\n }\r\n },\r\n {\r\n id: 'fit-page',\r\n icon: 'fit-page',\r\n label: 'Fit to Page',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => {\r\n instance.fitToPage?.();\r\n }\r\n },\r\n {\r\n id: 'reset-zoom',\r\n icon: 'reset-zoom',\r\n label: 'Reset Zoom',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => {\r\n instance.resetZoom?.();\r\n }\r\n },\r\n {\r\n id: 'rotate-cw',\r\n icon: 'rotate-cw',\r\n label: 'Rotate',\r\n type: 'button',\r\n group: 'view',\r\n execute: () => {\r\n instance.rotateCW?.();\r\n }\r\n }\r\n );\r\n }\r\n \r\n if (instance.play) {\r\n actions.push(\r\n {\r\n id: 'replay-10',\r\n icon: 'replay-10',\r\n label: 'Rewind 10s',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => {\r\n instance.rewind?.(10);\r\n }\r\n },\r\n {\r\n id: 'play',\r\n icon: 'play',\r\n label: 'Play',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => {\r\n instance.play?.();\r\n }\r\n },\r\n {\r\n id: 'pause',\r\n icon: 'pause',\r\n label: 'Pause',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => {\r\n instance.pause?.();\r\n }\r\n },\r\n {\r\n id: 'forward-10',\r\n icon: 'forward-10',\r\n label: 'Fast Forward 10s',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => {\r\n instance.fastForward?.(10);\r\n }\r\n },\r\n {\r\n id: 'speed',\r\n icon: 'speed',\r\n label: 'Playback Speed',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => {\r\n (instance as any).cycleSpeed?.();\r\n }\r\n }\r\n );\r\n }\r\n\r\n actions.push({\r\n id: 'download',\r\n icon: 'download',\r\n label: 'Download',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => {\r\n instance.download?.();\r\n }\r\n });\r\n\r\n if (instance.print) {\r\n actions.push({\r\n id: 'print',\r\n icon: 'print',\r\n label: 'Print',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => {\r\n instance.print?.();\r\n }\r\n });\r\n }\r\n\r\n return actions;\r\n }\r\n\r\n async render(ctx: RenderContext): Promise<PreviewInstance> {\r\n const mimeType = ctx.metadata.mimeType || 'application/octet-stream';\r\n const isImage = mimeType.startsWith('image/') || IMAGE_EXTS.includes(ctx.metadata.extension || '');\r\n const isVideo = mimeType.startsWith('video/') || VIDEO_EXTS.includes(ctx.metadata.extension || '');\r\n const isAudio = mimeType.startsWith('audio/') || AUDIO_EXTS.includes(ctx.metadata.extension || '');\r\n \r\n let url = '';\r\n \r\n if (ctx.metadata.extension === '.svg' || mimeType === 'image/svg+xml') {\r\n const decoder = new TextDecoder('utf-8');\r\n const svgText = decoder.decode(ctx.buffer);\r\n const blob = new Blob([svgText], { type: 'image/svg+xml' });\r\n url = URL.createObjectURL(blob);\r\n } else {\r\n const blob = new Blob([ctx.buffer], { type: mimeType });\r\n url = URL.createObjectURL(blob);\r\n }\r\n \r\n let element: HTMLElement;\r\n let currentZoom = 1.0;\r\n let rotation = 0;\r\n let mediaElement: HTMLMediaElement | null = null;\r\n \r\n if (isImage) {\r\n const img = document.createElement('img');\r\n img.src = url;\r\n img.style.maxWidth = '100%';\r\n img.style.maxHeight = '100%';\r\n img.style.objectFit = 'contain';\r\n img.style.transition = 'transform 0.2s ease';\r\n element = img;\r\n } else if (isVideo) {\r\n const video = document.createElement('video');\r\n video.src = url;\r\n video.controls = true;\r\n video.playsInline = true;\r\n video.style.maxWidth = '90%';\r\n video.style.maxHeight = '90%';\r\n video.style.borderRadius = '8px';\r\n video.style.boxShadow = '0 8px 30px rgba(0,0,0,0.3)';\r\n video.style.backgroundColor = '#000000';\r\n element = video;\r\n mediaElement = video;\r\n } else if (isAudio) {\r\n const audio = document.createElement('audio');\r\n audio.src = url;\r\n audio.controls = true;\r\n element = audio;\r\n mediaElement = audio;\r\n } else {\r\n element = document.createElement('div');\r\n element.textContent = 'Unsupported media type';\r\n }\r\n \r\n ctx.container.style.display = 'flex';\r\n ctx.container.style.alignItems = 'center';\r\n ctx.container.style.justifyContent = 'center';\r\n ctx.container.style.overflow = 'hidden';\r\n ctx.container.appendChild(element);\r\n\r\n const applyTransform = () => {\r\n element.style.transform = `scale(${currentZoom}) rotate(${rotation}deg)`;\r\n };\r\n\r\n const cleanup = () => {\r\n if (url) URL.revokeObjectURL(url);\r\n element.remove();\r\n ctx.container.innerHTML = '';\r\n };\r\n\r\n ctx.signal.addEventListener('abort', cleanup);\r\n\r\n return {\r\n destroy: cleanup,\r\n zoomIn: isImage ? () => {\r\n currentZoom += 0.1;\r\n applyTransform();\r\n } : undefined,\r\n zoomOut: isImage ? () => {\r\n currentZoom = Math.max(0.1, currentZoom - 0.1);\r\n applyTransform();\r\n } : undefined,\r\n getZoom: isImage ? () => currentZoom : undefined,\r\n setZoom: isImage ? (level: number) => {\r\n currentZoom = level;\r\n applyTransform();\r\n } : undefined,\r\n fitToPage: isImage ? () => {\r\n currentZoom = 1.0;\r\n rotation = 0;\r\n applyTransform();\r\n } : undefined,\r\n resetZoom: isImage ? () => {\r\n currentZoom = 1.0;\r\n rotation = 0;\r\n ctx.container.scrollTop = 0;\r\n ctx.container.scrollLeft = 0;\r\n applyTransform();\r\n } : undefined,\r\n rotateCW: isImage || isVideo ? () => {\r\n rotation = (rotation + 90) % 360;\r\n applyTransform();\r\n } : undefined,\r\n rotateCCW: isImage || isVideo ? () => {\r\n rotation = (rotation - 90 + 360) % 360;\r\n applyTransform();\r\n } : undefined,\r\n getRotation: () => rotation,\r\n play: mediaElement ? () => mediaElement?.play() : undefined,\r\n pause: mediaElement ? () => mediaElement?.pause() : undefined,\r\n isPlaying: mediaElement ? () => !mediaElement?.paused : undefined,\r\n fastForward: mediaElement ? (seconds = 10) => {\r\n if (mediaElement) {\r\n mediaElement.currentTime = Math.min(mediaElement.duration || Infinity, mediaElement.currentTime + seconds);\r\n }\r\n } : undefined,\r\n rewind: mediaElement ? (seconds = 10) => {\r\n if (mediaElement) {\r\n mediaElement.currentTime = Math.max(0, mediaElement.currentTime - seconds);\r\n }\r\n } : undefined,\r\n cycleSpeed: mediaElement ? () => {\r\n if (mediaElement) {\r\n const speeds = [1.0, 1.25, 1.5, 2.0, 0.5];\r\n const curIndex = speeds.indexOf(mediaElement.playbackRate);\r\n const nextIndex = curIndex === -1 ? 0 : (curIndex + 1) % speeds.length;\r\n mediaElement.playbackRate = speeds[nextIndex];\r\n }\r\n } : undefined,\r\n setPlaybackRate: mediaElement ? (rate: number) => {\r\n if (mediaElement) mediaElement.playbackRate = rate;\r\n } : undefined,\r\n getPlaybackRate: mediaElement ? () => mediaElement?.playbackRate ?? 1.0 : undefined,\r\n download: () => {\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = ctx.metadata.name || 'media';\r\n a.click();\r\n },\r\n print: isImage ? () => {\r\n window.print();\r\n } : undefined\r\n };\r\n }\r\n}\r\n\r\nexport function mediaPlugin(): MediaPlugin {\r\n return new MediaPlugin();\r\n}\r\n\r\nexport default MediaPlugin;\r\n","import type { \r\n FileInfo, \r\n RenderContext, \r\n ToolbarAction, \r\n PreviewPlugin, \r\n PreviewInstance \r\n} from '@patel.sumit51/core';\r\nimport { CfbfReader } from '@patel.sumit51/core';\r\nimport * as docx from 'docx-preview';\r\nimport { unzipSync, strFromU8 } from 'fflate';\r\nimport DOMPurify from 'dompurify';\r\n\r\nexport class DocxPlugin implements PreviewPlugin {\r\n id = 'docx';\r\n name = 'Word Document Preview (.docx, .docm, .dotx, .dotm)';\r\n extensions = ['.docx', '.docm', '.dotx', '.dotm'];\r\n mimeTypes = [\r\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\r\n 'application/vnd.ms-word.document.macroEnabled.12',\r\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',\r\n 'application/vnd.ms-word.template.macroEnabled.12'\r\n ];\r\n weight = 80;\r\n\r\n supports(file: FileInfo): boolean {\r\n const ext = file.metadata.extension?.toLowerCase();\r\n const mime = file.metadata.mimeType?.toLowerCase();\r\n if (ext) {\r\n return this.extensions.includes(ext);\r\n }\r\n return this.mimeTypes.includes(mime || '');\r\n }\r\n\r\n getToolbarActions(instance: PreviewInstance): ToolbarAction[] {\r\n const totalPages = instance.getPageCount?.() ?? 1;\r\n const actions: ToolbarAction[] = [];\r\n\r\n actions.push({\r\n id: 'page-nav',\r\n icon: '',\r\n label: 'Page Navigation',\r\n type: 'page-nav',\r\n group: 'navigation',\r\n value: instance.getCurrentPage?.() ?? 1,\r\n max: totalPages,\r\n execute: (action: unknown, page?: unknown) => {\r\n const cur = instance.getCurrentPage?.() ?? 1;\r\n const max = instance.getPageCount?.() ?? 1;\r\n if (action === 'prev') {\r\n if (cur > 1) instance.goToPage?.(cur - 1);\r\n } else if (action === 'next') {\r\n if (cur < max) instance.goToPage?.(cur + 1);\r\n } else if (typeof page === 'number') {\r\n instance.goToPage?.(page);\r\n }\r\n }\r\n });\r\n\r\n actions.push(\r\n {\r\n id: 'zoom-out',\r\n icon: 'zoom-out',\r\n label: 'Zoom Out',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomOut?.()\r\n },\r\n {\r\n id: 'zoom-in',\r\n icon: 'zoom-in',\r\n label: 'Zoom In',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomIn?.()\r\n },\r\n {\r\n id: 'fit-page',\r\n icon: 'fit-page',\r\n label: 'Fit to Page',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.fitToPage?.()\r\n },\r\n {\r\n id: 'reset-zoom',\r\n icon: 'reset-zoom',\r\n label: 'Reset Zoom',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.resetZoom?.()\r\n },\r\n {\r\n id: 'rotate-cw',\r\n icon: 'rotate-cw',\r\n label: 'Rotate',\r\n type: 'button',\r\n group: 'view',\r\n execute: () => instance.rotateCW?.()\r\n },\r\n {\r\n id: 'download',\r\n icon: 'download',\r\n label: 'Download',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => instance.download?.()\r\n },\r\n {\r\n id: 'print',\r\n icon: 'print',\r\n label: 'Print',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => instance.print?.()\r\n },\r\n {\r\n id: 'open-window',\r\n icon: 'open-window',\r\n label: 'Open in Separate Full Window',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => (instance as any).openInSeparateWindow?.()\r\n }\r\n );\r\n\r\n return actions;\r\n }\r\n\r\n async render(ctx: RenderContext): Promise<PreviewInstance> {\r\n const wrapper = document.createElement('div');\r\n wrapper.className = 'fp-docx-wrapper';\r\n wrapper.style.transformOrigin = 'top center';\r\n wrapper.style.transition = 'transform 0.2s ease';\r\n wrapper.style.padding = '0';\r\n wrapper.style.maxWidth = 'none';\r\n wrapper.style.width = '816px';\r\n wrapper.style.margin = '0 auto';\r\n wrapper.style.display = 'flex';\r\n wrapper.style.flexDirection = 'column';\r\n wrapper.style.alignItems = 'center';\r\n wrapper.style.boxSizing = 'border-box';\r\n \r\n ctx.container.style.overflowX = 'hidden';\r\n ctx.container.style.overflowY = 'auto';\r\n ctx.container.style.padding = '16px 8px';\r\n ctx.container.style.backgroundColor = '#f1f5f9';\r\n ctx.container.appendChild(wrapper);\r\n\r\n // Inject override styles so docx-preview pages match our modern light theme\r\n const styleOverride = document.createElement('style');\r\n styleOverride.textContent = `\r\n .fp-docx-wrapper .docx-wrapper {\r\n background: transparent !important;\r\n padding: 0 !important;\r\n display: flex !important;\r\n flex-direction: column !important;\r\n align-items: center !important;\r\n box-sizing: border-box !important;\r\n }\r\n .fp-docx-wrapper section.docx {\r\n box-shadow: 0 4px 24px rgba(0, 0, 0, 0.08) !important;\r\n border-radius: 4px !important;\r\n margin-bottom: 24px !important;\r\n background-color: #ffffff !important;\r\n }\r\n `;\r\n ctx.container.appendChild(styleOverride);\r\n\r\n let scale = 1.0;\r\n let renderedSuccessfully = false;\r\n const createdBlobUrls: string[] = [];\r\n\r\n // Step 1: Try high-fidelity docx-preview\r\n // IMPORTANT: Pass wrapper as styleContainer (param 3) instead of ctx.container.\r\n // docx-preview calls removeAllElements(styleContainer), which previously deleted wrapper from ctx.container!\r\n try {\r\n await docx.renderAsync(ctx.buffer, wrapper, wrapper, {\r\n inWrapper: true,\r\n ignoreWidth: false,\r\n ignoreHeight: false,\r\n ignoreFonts: true, // Avoid crashes on embedded obfuscated fonts\r\n breakPages: true,\r\n experimental: true,\r\n ignoreLastRenderedPageBreak: false, // Honor Word's exact page breaks!\r\n renderHeaders: true,\r\n renderFooters: true,\r\n renderFootnotes: true,\r\n renderEndnotes: true,\r\n useBase64URL: true,\r\n });\r\n\r\n // Ensure wrapper remains attached to container\r\n if (!ctx.container.contains(wrapper)) {\r\n ctx.container.appendChild(wrapper);\r\n }\r\n\r\n // Check if visible content was actually produced\r\n if (wrapper.children.length > 0 && (wrapper.textContent?.trim().length ?? 0) > 0) {\r\n renderedSuccessfully = true;\r\n\r\n // Inject DrawingML charts that docx-preview drops\r\n try {\r\n const unzipped = unzipSync(new Uint8Array(ctx.buffer));\r\n const chartKeys = Object.keys(unzipped)\r\n .filter(k => k.replace(/^[./\\\\]+/, '').toLowerCase().startsWith('word/charts/chart') && k.endsWith('.xml'))\r\n .sort();\r\n\r\n if (chartKeys.length > 0) {\r\n const allDivs = Array.from(wrapper.querySelectorAll<HTMLElement>('div'));\r\n const emptyContainers = allDivs.filter(div => {\r\n const st = div.getAttribute('style') || '';\r\n return st.includes('width:') && st.includes('height:') && div.children.length === 0 && (div.textContent?.trim().length ?? 0) === 0;\r\n });\r\n\r\n chartKeys.forEach((cKey, idx) => {\r\n const target = emptyContainers[idx];\r\n if (target) {\r\n const xmlStr = strFromU8(unzipped[cKey]);\r\n const svg = this.parseAndRenderChartSvg(xmlStr);\r\n if (svg) {\r\n target.innerHTML = svg;\r\n target.style.display = 'block';\r\n target.style.margin = '12px auto';\r\n }\r\n }\r\n });\r\n }\r\n } catch (chartErr) {\r\n console.warn('[DocxPlugin] Non-critical error rendering DrawingML charts:', chartErr);\r\n }\r\n }\r\n } catch (err) {\r\n console.warn('[DocxPlugin] docx-preview failed, triggering native fallback:', err);\r\n }\r\n\r\n // Step 2: Graceful Native Fallback (100% client-side guarantee)\r\n if (!renderedSuccessfully) {\r\n try {\r\n wrapper.innerHTML = '';\r\n this.renderXmlFallback(ctx, wrapper, createdBlobUrls);\r\n if (!ctx.container.contains(wrapper)) {\r\n ctx.container.appendChild(wrapper);\r\n }\r\n renderedSuccessfully = true;\r\n } catch (fallbackErr: any) {\r\n console.error('[DocxPlugin] Native fallback failed:', fallbackErr);\r\n const isCorrupt = fallbackErr?.message?.includes('invalid zip') || fallbackErr?.message?.includes('corrupted');\r\n wrapper.innerHTML = `\r\n <div style=\"text-align:center; padding: 48px 32px; background: #fff; border-radius: 8px; box-shadow: 0 4px 20px rgba(0,0,0,0.06); max-width: 600px; margin: 40px auto;\">\r\n <div style=\"font-size:48px; margin-bottom: 16px;\">${isCorrupt ? '⚠️' : '📄'}</div>\r\n <h3 style=\"margin: 0 0 8px; color: #1e293b; font-size: 18px;\">${ctx.metadata.name || 'Word Document'}</h3>\r\n <p style=\"color: #64748b; margin: 0 0 16px; font-size: 14px; line-height: 1.5;\">\r\n ${isCorrupt \r\n ? 'This document appears to be corrupted or contains invalid archive data and cannot be opened (matches Microsoft Word on Windows).'\r\n : 'Could not render document content. The file structure may be damaged.'}\r\n </p>\r\n </div>\r\n `;\r\n if (!ctx.container.contains(wrapper)) {\r\n ctx.container.appendChild(wrapper);\r\n }\r\n }\r\n }\r\n\r\n let sections = Array.from(wrapper.querySelectorAll<HTMLElement>('section.docx'));\r\n const cards = Array.from(wrapper.querySelectorAll<HTMLElement>('.fp-docx-page-card'));\r\n\r\n // Check EVERY section and split any section containing multi-page content\r\n if (sections.length > 0 && cards.length === 0) {\r\n const finalSections: HTMLElement[] = [];\r\n\r\n for (const singleSec of sections) {\r\n const contentContainer = (singleSec.querySelector('article') as HTMLElement) || singleSec;\r\n const children = Array.from(contentContainer.children) as HTMLElement[];\r\n\r\n // Measure page height (A4 is ~1122px, US Letter is ~1056px)\r\n const pageH = singleSec.offsetHeight > 1300 ? 1122 : Math.max(1056, singleSec.offsetHeight);\r\n const secH = singleSec.scrollHeight || singleSec.offsetHeight;\r\n\r\n if (secH > pageH * 1.25 && children.length > 1) {\r\n // Record heights while elements are in DOM\r\n const childHeights = children.map(c => {\r\n const rectH = c.getBoundingClientRect().height;\r\n const offH = c.offsetHeight;\r\n const textLen = c.textContent?.trim().length || 0;\r\n const estH = Math.max(24, Math.ceil(textLen / 80) * 22 + 16);\r\n return Math.max(rectH, offH, estH);\r\n });\r\n\r\n const parent = singleSec.parentElement || wrapper;\r\n const headerEl = singleSec.querySelector('header');\r\n const footerEl = singleSec.querySelector('footer');\r\n\r\n contentContainer.innerHTML = '';\r\n singleSec.style.minHeight = `${pageH}px`;\r\n singleSec.style.boxSizing = 'border-box';\r\n\r\n let curContent = contentContainer;\r\n let curSec = singleSec;\r\n let curH = 0;\r\n const maxH = pageH - 140; // Printable area between margins/padding\r\n\r\n finalSections.push(singleSec);\r\n\r\n for (let i = 0; i < children.length; i++) {\r\n const child = children[i];\r\n const chH = childHeights[i];\r\n\r\n curContent.appendChild(child);\r\n curH += chH;\r\n\r\n if (curH >= maxH && i < children.length - 1) {\r\n const nextSec = document.createElement('section');\r\n nextSec.className = singleSec.className;\r\n nextSec.style.cssText = singleSec.style.cssText;\r\n nextSec.style.minHeight = `${pageH}px`;\r\n nextSec.style.boxSizing = 'border-box';\r\n nextSec.style.backgroundColor = '#ffffff';\r\n nextSec.style.boxShadow = '0 4px 24px rgba(0, 0, 0, 0.08)';\r\n nextSec.style.borderRadius = '4px';\r\n nextSec.style.marginBottom = '24px';\r\n\r\n if (headerEl) {\r\n nextSec.appendChild(headerEl.cloneNode(true));\r\n }\r\n\r\n const nextArticle = document.createElement('article');\r\n if (contentContainer.tagName.toLowerCase() === 'article') {\r\n nextArticle.style.cssText = contentContainer.style.cssText;\r\n }\r\n nextSec.appendChild(nextArticle);\r\n\r\n if (footerEl) {\r\n nextSec.appendChild(footerEl.cloneNode(true));\r\n }\r\n\r\n if (curSec.nextSibling) {\r\n parent.insertBefore(nextSec, curSec.nextSibling);\r\n } else {\r\n parent.appendChild(nextSec);\r\n }\r\n\r\n finalSections.push(nextSec);\r\n curSec = nextSec;\r\n curContent = nextArticle;\r\n curH = 0;\r\n }\r\n }\r\n } else {\r\n finalSections.push(singleSec);\r\n }\r\n }\r\n sections = finalSections;\r\n }\r\n\r\n const pageElements: HTMLElement[] = sections.length > 0 ? sections : cards;\r\n const totalPages = Math.max(1, pageElements.length);\r\n let currentPage = 1;\r\n\r\n const showPage = (pageNum: number) => {\r\n currentPage = Math.max(1, Math.min(totalPages, pageNum));\r\n if (pageElements.length > 1) {\r\n pageElements.forEach((sec, idx) => {\r\n sec.style.display = (idx + 1 === currentPage) ? '' : 'none';\r\n });\r\n }\r\n ctx.container.scrollTop = 0;\r\n ctx.emit('page-change', { page: currentPage, total: totalPages });\r\n };\r\n\r\n if (totalPages > 1) {\r\n showPage(1);\r\n }\r\n\r\n scale = 1.0;\r\n let rotation = 0;\r\n let fitMode: 'width' | 'page' = 'page';\r\n let isUserZoomed = false;\r\n\r\n const calculateFitScale = (_mode: 'width' | 'page' = fitMode) => {\r\n const activeEl = pageElements[currentPage - 1] || wrapper.querySelector('section.docx') as HTMLElement || wrapper;\r\n const elW = activeEl.offsetWidth || 816;\r\n \r\n // Minimal side margins (16px on each side, safe from vertical scrollbar)\r\n const availW = Math.max(280, ctx.container.clientWidth - 32);\r\n const sW = availW / elW;\r\n\r\n // Fit to Page fills the frame horizontally with only minimal side margins\r\n return Math.max(0.35, Math.min(3.0, sW));\r\n };\r\n\r\n const applyTransform = () => {\r\n wrapper.style.transform = `scale(${scale}) rotate(${rotation}deg)`;\r\n wrapper.style.transformOrigin = 'top center';\r\n const activeEl = pageElements[currentPage - 1] || wrapper.querySelector('section.docx') as HTMLElement || wrapper;\r\n const elH = activeEl.offsetHeight || 1056;\r\n if (scale > 1.0) {\r\n wrapper.style.marginBottom = `${Math.round((elH * scale) - elH + 32)}px`;\r\n } else {\r\n wrapper.style.marginBottom = '32px';\r\n }\r\n };\r\n\r\n let resizeObserver: ResizeObserver | null = null;\r\n if (typeof ResizeObserver !== 'undefined') {\r\n resizeObserver = new ResizeObserver(() => {\r\n if (!isUserZoomed) {\r\n const newFit = calculateFitScale('page');\r\n if (Math.abs(scale - newFit) > 0.015) {\r\n scale = newFit;\r\n applyTransform();\r\n }\r\n }\r\n });\r\n resizeObserver.observe(ctx.container);\r\n }\r\n\r\n setTimeout(() => {\r\n scale = calculateFitScale('page');\r\n applyTransform();\r\n }, 40);\r\n\r\n const cleanup = () => {\r\n resizeObserver?.disconnect();\r\n resizeObserver = null;\r\n for (const url of createdBlobUrls) {\r\n URL.revokeObjectURL(url);\r\n }\r\n wrapper.remove();\r\n styleOverride.remove();\r\n ctx.container.innerHTML = '';\r\n };\r\n\r\n ctx.signal.addEventListener('abort', cleanup);\r\n\r\n return {\r\n destroy: cleanup,\r\n getPageCount: () => totalPages,\r\n getCurrentPage: () => currentPage,\r\n goToPage: (page: number) => {\r\n showPage(page);\r\n },\r\n zoomIn: () => {\r\n isUserZoomed = true;\r\n scale = Math.min(3.5, scale + 0.15);\r\n applyTransform();\r\n },\r\n zoomOut: () => {\r\n isUserZoomed = true;\r\n scale = Math.max(0.2, scale - 0.15);\r\n applyTransform();\r\n },\r\n getZoom: () => scale,\r\n setZoom: (level: number) => {\r\n isUserZoomed = true;\r\n scale = level;\r\n applyTransform();\r\n },\r\n fitToPage: () => {\r\n isUserZoomed = false;\r\n scale = calculateFitScale('page');\r\n rotation = 0;\r\n applyTransform();\r\n },\r\n resetZoom: () => {\r\n isUserZoomed = false;\r\n scale = calculateFitScale('page');\r\n rotation = 0;\r\n ctx.container.scrollTop = 0;\r\n ctx.container.scrollLeft = 0;\r\n applyTransform();\r\n },\r\n rotateCW: () => {\r\n rotation = (rotation + 90) % 360;\r\n applyTransform();\r\n },\r\n rotateCCW: () => {\r\n rotation = (rotation - 90 + 360) % 360;\r\n applyTransform();\r\n },\r\n download: () => {\r\n const blob = new Blob([ctx.buffer], { type: this.mimeTypes[0] });\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = ctx.metadata.name || 'document.docx';\r\n a.click();\r\n URL.revokeObjectURL(url);\r\n },\r\n print: () => {\r\n window.print();\r\n }\r\n };\r\n }\r\n\r\n private renderXmlFallback(ctx: RenderContext, wrapper: HTMLElement, createdBlobUrls: string[]): void {\r\n // Check if the file is actually a legacy binary CFBF .doc file renamed to .docx\r\n const magic = new Uint8Array(ctx.buffer.slice(0, 8));\r\n if (magic[0] === 0xD0 && magic[1] === 0xCF && magic[2] === 0x11 && magic[3] === 0xE0) {\r\n this.renderBinaryDocFallback(ctx, wrapper);\r\n return;\r\n }\r\n\r\n const unzipped = unzipSync(new Uint8Array(ctx.buffer));\r\n const docKey = Object.keys(unzipped).find(k => k.replace(/^[./\\\\]+/, '').toLowerCase() === 'word/document.xml');\r\n const docXmlEntry = docKey ? unzipped[docKey] : undefined;\r\n if (!docXmlEntry) throw new Error('Missing word/document.xml in DOCX package');\r\n\r\n const xmlStr = strFromU8(docXmlEntry);\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(xmlStr, 'application/xml');\r\n\r\n // Parse image relationships if present\r\n const imageMap: Record<string, string> = {};\r\n const relsKey = Object.keys(unzipped).find(k => k.replace(/^[./\\\\]+/, '').toLowerCase() === 'word/_rels/document.xml.rels');\r\n if (relsKey && unzipped[relsKey]) {\r\n try {\r\n const relsXml = strFromU8(unzipped[relsKey]);\r\n const relsDoc = parser.parseFromString(relsXml, 'application/xml');\r\n const relEls = Array.from(relsDoc.getElementsByTagName('Relationship'));\r\n for (const rel of relEls) {\r\n const rId = rel.getAttribute('Id');\r\n const target = rel.getAttribute('Target');\r\n if (rId && target) {\r\n const cleanTarget = target.replace(/^\\.\\.\\//, '').replace(/^\\//, '');\r\n const fullTargetKey = Object.keys(unzipped).find(k => {\r\n const norm = k.replace(/^[./\\\\]+/, '').toLowerCase();\r\n return norm === ('word/' + cleanTarget).toLowerCase() || norm === cleanTarget.toLowerCase();\r\n });\r\n if (fullTargetKey && unzipped[fullTargetKey]) {\r\n const bytes = unzipped[fullTargetKey];\r\n const ext = cleanTarget.split('.').pop()?.toLowerCase() || 'png';\r\n const mime = ext === 'jpg' || ext === 'jpeg' ? 'image/jpeg' : ext === 'gif' ? 'image/gif' : ext === 'svg' ? 'image/svg+xml' : 'image/png';\r\n const blob = new Blob([bytes], { type: mime });\r\n const blobUrl = URL.createObjectURL(blob);\r\n imageMap[rId] = blobUrl;\r\n createdBlobUrls.push(blobUrl);\r\n }\r\n }\r\n }\r\n } catch (relsErr) {\r\n console.warn('[DocxPlugin] Error parsing relationships:', relsErr);\r\n }\r\n }\r\n\r\n // Parse page dimensions\r\n const sectPrs = Array.from(doc.getElementsByTagNameNS('*', 'sectPr'));\r\n const lastSectPr = sectPrs[sectPrs.length - 1];\r\n \r\n let defaultW = 12240; // US Letter 8.5\"\r\n let defaultH = 15840; // US Letter 11\"\r\n let margins = { top: 1440, right: 1440, bottom: 1440, left: 1440 }; // 1\" margins\r\n \r\n if (lastSectPr) {\r\n const pgSz = lastSectPr.getElementsByTagNameNS('*', 'pgSz')[0];\r\n if (pgSz) {\r\n defaultW = parseInt(pgSz.getAttribute('w:w') || pgSz.getAttribute('w') || '12240', 10);\r\n defaultH = parseInt(pgSz.getAttribute('w:h') || pgSz.getAttribute('h') || '15840', 10);\r\n }\r\n const pgMar = lastSectPr.getElementsByTagNameNS('*', 'pgMar')[0];\r\n if (pgMar) {\r\n margins.top = parseInt(pgMar.getAttribute('w:top') || pgMar.getAttribute('top') || '1440', 10);\r\n margins.bottom = parseInt(pgMar.getAttribute('w:bottom') || pgMar.getAttribute('bottom') || '1440', 10);\r\n margins.left = parseInt(pgMar.getAttribute('w:left') || pgMar.getAttribute('left') || '1440', 10);\r\n margins.right = parseInt(pgMar.getAttribute('w:right') || pgMar.getAttribute('right') || '1440', 10);\r\n }\r\n }\r\n\r\n const createPageCard = () => {\r\n const card = document.createElement('div');\r\n card.className = 'fp-docx-page-card';\r\n card.style.backgroundColor = '#ffffff';\r\n card.style.borderRadius = '4px';\r\n card.style.boxShadow = '0 4px 24px rgba(0,0,0,0.08)';\r\n card.style.fontFamily = 'Calibri, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif';\r\n card.style.color = '#1e293b';\r\n card.style.lineHeight = '1.6';\r\n card.style.boxSizing = 'border-box';\r\n card.style.overflow = 'hidden';\r\n card.style.position = 'relative';\r\n card.style.marginBottom = '24px';\r\n \r\n // Convert twips to px (1 twip = 1/1440 inch, 1 inch = 96px => /15)\r\n card.style.width = `${defaultW / 15}px`;\r\n card.style.height = `${defaultH / 15}px`;\r\n card.style.padding = `${margins.top / 15}px ${margins.right / 15}px ${margins.bottom / 15}px ${margins.left / 15}px`;\r\n \r\n return card;\r\n };\r\n\r\n let currentCard = createPageCard();\r\n let currentHtml = '';\r\n const pages: { card: HTMLElement, html: string }[] = [{ card: currentCard, html: '' }];\r\n\r\n const flushHtml = () => {\r\n pages[pages.length - 1].html += currentHtml;\r\n currentHtml = '';\r\n };\r\n\r\n const newPage = () => {\r\n flushHtml();\r\n currentCard = createPageCard();\r\n pages.push({ card: currentCard, html: '' });\r\n };\r\n\r\n const body = doc.getElementsByTagNameNS('*', 'body')[0] || doc.documentElement;\r\n\r\n for (const child of Array.from(body.children)) {\r\n const tag = child.localName || child.nodeName.split(':').pop();\r\n\r\n if (tag === 'p') {\r\n const pStyle = child.getElementsByTagNameNS('*', 'pStyle')[0];\r\n const styleVal = pStyle?.getAttribute('w:val') || pStyle?.getAttribute('val') || '';\r\n const numPr = child.getElementsByTagNameNS('*', 'numPr')[0];\r\n\r\n const chunks = this.extractParagraphChunks(child, imageMap);\r\n \r\n for (let i = 0; i < chunks.length; i++) {\r\n if (i > 0) {\r\n newPage();\r\n }\r\n \r\n const textContent = chunks[i];\r\n if (!textContent.trim() && !textContent.includes('<img')) {\r\n currentHtml += '<div style=\"height: 10px;\"></div>';\r\n continue;\r\n }\r\n\r\n const lowerStyle = styleVal.toLowerCase();\r\n if (lowerStyle.includes('title')) {\r\n currentHtml += `<h1 style=\"font-size: 28px; font-weight: 700; color: #1e3a8a; margin: 24px 0 12px; border-bottom: 2px solid #e2e8f0; padding-bottom: 8px;\">${textContent}</h1>`;\r\n } else if (lowerStyle.includes('heading1') || styleVal === '1') {\r\n currentHtml += `<h2 style=\"font-size: 22px; font-weight: 700; color: #1e40af; margin: 20px 0 10px;\">${textContent}</h2>`;\r\n } else if (lowerStyle.includes('heading2') || styleVal === '2') {\r\n currentHtml += `<h3 style=\"font-size: 18px; font-weight: 600; color: #2563eb; margin: 16px 0 8px;\">${textContent}</h3>`;\r\n } else if (lowerStyle.includes('heading3') || styleVal === '3') {\r\n currentHtml += `<h4 style=\"font-size: 15px; font-weight: 600; color: #334155; margin: 12px 0 6px;\">${textContent}</h4>`;\r\n } else if (numPr) {\r\n currentHtml += `<div style=\"display: flex; gap: 8px; margin: 4px 0 4px 20px;\"><span style=\"color: #2563eb; font-weight: bold;\">•</span><span>${textContent}</span></div>`;\r\n } else {\r\n currentHtml += `<p style=\"margin: 8px 0; font-size: 14px;\">${textContent}</p>`;\r\n }\r\n }\r\n } else if (tag === 'tbl') {\r\n currentHtml += '<table style=\"width: 100%; border-collapse: collapse; margin: 20px 0; border: 1px solid #cbd5e1;\">';\r\n const rows = Array.from(child.getElementsByTagNameNS('*', 'tr'));\r\n rows.forEach((tr, rIdx) => {\r\n currentHtml += `<tr style=\"${rIdx === 0 ? 'background-color: #f8fafc; font-weight: 600;' : ''}\">`;\r\n const cells = Array.from(tr.getElementsByTagNameNS('*', 'tc'));\r\n cells.forEach((tc) => {\r\n const cellText = this.extractParagraphHtml(tc, imageMap);\r\n currentHtml += `<td style=\"border: 1px solid #cbd5e1; padding: 8px 12px; font-size: 13px;\">${cellText || ' '}</td>`;\r\n });\r\n currentHtml += '</tr>';\r\n });\r\n currentHtml += '</table>';\r\n }\r\n }\r\n flushHtml();\r\n\r\n for (const page of pages) {\r\n page.card.innerHTML = DOMPurify.sanitize(page.html, {\r\n ADD_TAGS: ['h1', 'h2', 'h3', 'h4', 'p', 'table', 'tr', 'td', 'span', 'b', 'i', 'u', 's', 'strike', 'img', 'div', 'br'],\r\n ADD_ATTR: ['style', 'src', 'alt', 'colspan', 'rowspan']\r\n });\r\n wrapper.appendChild(page.card);\r\n }\r\n }\r\n\r\n private extractParagraphHtml(pElement: Element, imageMap: Record<string, string> = {}): string {\r\n return this.extractParagraphChunks(pElement, imageMap).join('<br/>');\r\n }\r\n\r\n private extractParagraphChunks(pElement: Element, imageMap: Record<string, string> = {}): string[] {\r\n const chunks: string[] = [''];\r\n let currentChunkIndex = 0;\r\n\r\n // Check for inline drawings in this paragraph\r\n const drawings = Array.from(pElement.getElementsByTagNameNS('*', 'drawing'));\r\n for (const drawing of drawings) {\r\n const blip = drawing.getElementsByTagNameNS('*', 'blip')[0];\r\n const rId = blip?.getAttribute('r:embed') || blip?.getAttribute('r:id');\r\n if (rId && imageMap[rId]) {\r\n chunks[currentChunkIndex] += `<div style=\"text-align:center; margin: 12px 0;\"><img src=\"${imageMap[rId]}\" style=\"max-width: 100%; height: auto; border-radius: 4px;\" /></div>`;\r\n }\r\n }\r\n\r\n const runs = Array.from(pElement.getElementsByTagNameNS('*', 'r'));\r\n if (runs.length === 0 && !chunks[currentChunkIndex]) {\r\n chunks[currentChunkIndex] = DOMPurify.sanitize(pElement.textContent || '');\r\n return chunks;\r\n }\r\n\r\n for (const r of runs) {\r\n const blip = r.getElementsByTagNameNS('*', 'blip')[0] || r.getElementsByTagNameNS('*', 'imagedata')[0];\r\n const rId = blip?.getAttribute('r:embed') || blip?.getAttribute('r:id');\r\n if (rId && imageMap[rId]) {\r\n chunks[currentChunkIndex] += `<img src=\"${imageMap[rId]}\" style=\"max-width: 100%; height: auto; display: inline-block; margin: 4px;\" />`;\r\n }\r\n\r\n // Check for breaks <w:br/>\r\n const brs = Array.from(r.getElementsByTagNameNS('*', 'br'));\r\n for (const br of brs) {\r\n const type = br.getAttribute('w:type') || br.getAttribute('type');\r\n if (type === 'page') {\r\n chunks.push('');\r\n currentChunkIndex++;\r\n } else {\r\n chunks[currentChunkIndex] += '<br/>';\r\n }\r\n }\r\n\r\n // Check for tabs <w:tab/>\r\n const tabs = r.getElementsByTagNameNS('*', 'tab');\r\n if (tabs.length > 0) {\r\n chunks[currentChunkIndex] += ' ';\r\n }\r\n\r\n const rPr = r.getElementsByTagNameNS('*', 'rPr')[0];\r\n const isBold = !!(rPr?.getElementsByTagNameNS('*', 'b')[0]);\r\n const isItalic = !!(rPr?.getElementsByTagNameNS('*', 'i')[0]);\r\n const isUnderline = !!(rPr?.getElementsByTagNameNS('*', 'u')[0]);\r\n const isStrike = !!(rPr?.getElementsByTagNameNS('*', 'strike')[0]);\r\n const colorNode = rPr?.getElementsByTagNameNS('*', 'color')[0];\r\n const colorVal = colorNode?.getAttribute('w:val') || colorNode?.getAttribute('val');\r\n const szNode = rPr?.getElementsByTagNameNS('*', 'sz')[0];\r\n const szVal = szNode?.getAttribute('w:val') || szNode?.getAttribute('val');\r\n\r\n const texts = Array.from(r.getElementsByTagNameNS('*', 't'));\r\n let text = texts.map(t => t.textContent || '').join('');\r\n if (!text) continue;\r\n text = DOMPurify.sanitize(text);\r\n\r\n let styles = '';\r\n if (isBold) styles += 'font-weight: bold; ';\r\n if (isItalic) styles += 'font-style: italic; ';\r\n if (isUnderline) styles += 'text-decoration: underline; ';\r\n if (isStrike) styles += 'text-decoration: line-through; ';\r\n if (colorVal && colorVal !== 'auto') styles += `color: #${colorVal}; `;\r\n if (szVal) {\r\n const pt = parseInt(szVal, 10) / 2;\r\n if (!isNaN(pt) && pt > 0) styles += `font-size: ${pt}pt; `;\r\n }\r\n\r\n if (styles) {\r\n chunks[currentChunkIndex] += `<span style=\"${styles}\">${text}</span>`;\r\n } else {\r\n chunks[currentChunkIndex] += text;\r\n }\r\n }\r\n\r\n return chunks;\r\n }\r\n\r\n private renderBinaryDocFallback(ctx: RenderContext, wrapper: HTMLElement): void {\r\n const card = document.createElement('div');\r\n card.className = 'fp-docx-page-card';\r\n card.style.backgroundColor = '#ffffff';\r\n card.style.borderRadius = '6px';\r\n card.style.boxShadow = '0 4px 24px rgba(0,0,0,0.08)';\r\n card.style.padding = '48px 56px';\r\n card.style.fontFamily = 'Calibri, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif';\r\n card.style.color = '#1e293b';\r\n card.style.lineHeight = '1.6';\r\n\r\n try {\r\n const cfbf = new CfbfReader(ctx.buffer);\r\n const wordDocStream = cfbf.readStream('WordDocument');\r\n if (wordDocStream && wordDocStream.length >= 512) {\r\n const text = this.extractReadableStrings(wordDocStream);\r\n card.innerHTML = `<div style=\"white-space: pre-wrap;\">${DOMPurify.sanitize(text)}</div>`;\r\n wrapper.appendChild(card);\r\n return;\r\n }\r\n } catch {\r\n // Direct extraction fallback\r\n }\r\n\r\n const text = this.extractReadableStrings(new Uint8Array(ctx.buffer));\r\n card.innerHTML = `<div style=\"white-space: pre-wrap;\">${DOMPurify.sanitize(text)}</div>`;\r\n wrapper.appendChild(card);\r\n }\r\n\r\n private extractReadableStrings(bytes: Uint8Array): string {\r\n let result = '';\r\n let current = '';\r\n for (let i = 0; i < bytes.length; i++) {\r\n const b = bytes[i];\r\n if ((b >= 32 && b <= 126) || b === 10 || b === 13 || b === 9) {\r\n current += String.fromCharCode(b);\r\n } else if (b === 0 && i + 1 < bytes.length && bytes[i + 1] >= 32 && bytes[i + 1] <= 126) {\r\n continue;\r\n } else {\r\n if (current.trim().length > 3) {\r\n result += current.trim() + '\\n\\n';\r\n }\r\n current = '';\r\n }\r\n }\r\n if (current.trim().length > 3) {\r\n result += current.trim();\r\n }\r\n return result;\r\n }\r\n\r\n private parseAndRenderChartSvg(xmlStr: string, width = 500, height = 260): string {\r\n // Extract categories\r\n const catMatches = [...xmlStr.matchAll(/<c:cat>[\\s\\S]*?<c:strCache>([\\s\\S]*?)<\\/c:strCache>/g)];\r\n let categories: string[] = [];\r\n if (catMatches.length > 0) {\r\n categories = [...catMatches[0][1].matchAll(/<c:v>([^<]+)<\\/c:v>/g)].map(m => m[1]);\r\n }\r\n if (categories.length === 0) {\r\n categories = ['Category 1', 'Category 2', 'Category 3', 'Category 4'];\r\n }\r\n\r\n // Extract series\r\n const defaultColors = ['#004586', '#ff420e', '#ffd320', '#579d1c', '#7e0021', '#83caff'];\r\n const sers = [...xmlStr.matchAll(/<c:ser>([\\s\\S]*?)<\\/c:ser>/g)];\r\n const series: { title: string; color: string; values: number[] }[] = [];\r\n\r\n sers.forEach((s, sIdx) => {\r\n const titleMatch = s[1].match(/<c:tx>[\\s\\S]*?<c:v>([^<]+)<\\/c:v>/);\r\n const title = titleMatch ? titleMatch[1] : `Series ${sIdx + 1}`;\r\n\r\n const clrMatch = s[1].match(/<a:srgbClr\\s+val=\"([^\"]+)\"/);\r\n const color = clrMatch ? '#' + clrMatch[1] : defaultColors[sIdx % defaultColors.length];\r\n\r\n const valMatch = s[1].match(/<c:val>[\\s\\S]*?<c:numCache>([\\s\\S]*?)<\\/c:numCache>/);\r\n let values: number[] = [];\r\n if (valMatch) {\r\n values = [...valMatch[1].matchAll(/<c:pt\\s+idx=\"(\\d+)\">\\s*<c:v>([^<]+)<\\/c:v>/g)]\r\n .sort((a, b) => parseInt(a[1], 10) - parseInt(b[1], 10))\r\n .map(m => parseFloat(m[2]) || 0);\r\n }\r\n series.push({ title, color, values });\r\n });\r\n\r\n if (series.length === 0) return '';\r\n\r\n let maxVal = 10;\r\n series.forEach(s => s.values.forEach(v => { if (v > maxVal) maxVal = v; }));\r\n maxVal = Math.ceil(maxVal * 1.15);\r\n if (maxVal % 2 !== 0) maxVal++;\r\n\r\n const padLeft = 45;\r\n const padBottom = 55;\r\n const padTop = 20;\r\n const padRight = 20;\r\n const plotW = width - padLeft - padRight;\r\n const plotH = height - padTop - padBottom;\r\n\r\n const yTicks = 5;\r\n let gridLines = '';\r\n for (let i = 0; i <= yTicks; i++) {\r\n const val = (maxVal / yTicks) * i;\r\n const y = padTop + plotH - (val / maxVal) * plotH;\r\n gridLines += `<line x1=\"${padLeft}\" y1=\"${y}\" x2=\"${padLeft + plotW}\" y2=\"${y}\" stroke=\"#e2e8f0\" stroke-width=\"1\" />`;\r\n gridLines += `<text x=\"${padLeft - 8}\" y=\"${y + 4}\" text-anchor=\"end\" font-size=\"11\" fill=\"#64748b\" font-family=\"Calibri, sans-serif\">${Math.round(val)}</text>`;\r\n }\r\n\r\n const numCats = categories.length;\r\n const numSers = series.length;\r\n const groupW = plotW / numCats;\r\n const barW = Math.max(8, Math.min(28, (groupW * 0.7) / numSers));\r\n const groupPad = (groupW - barW * numSers) / 2;\r\n\r\n let bars = '';\r\n let catLabels = '';\r\n\r\n for (let c = 0; c < numCats; c++) {\r\n const catX = padLeft + c * groupW;\r\n catLabels += `<text x=\"${catX + groupW / 2}\" y=\"${padTop + plotH + 18}\" text-anchor=\"middle\" font-size=\"11\" fill=\"#334155\" font-family=\"Calibri, sans-serif\">${categories[c]}</text>`;\r\n\r\n for (let s = 0; s < numSers; s++) {\r\n const val = series[s].values[c] ?? 0;\r\n const bH = Math.max(0, (val / maxVal) * plotH);\r\n const bX = catX + groupPad + s * barW;\r\n const bY = padTop + plotH - bH;\r\n bars += `<rect x=\"${bX}\" y=\"${bY}\" width=\"${barW - 2}\" height=\"${bH}\" fill=\"${series[s].color}\" rx=\"1\" />`;\r\n }\r\n }\r\n\r\n let legend = '';\r\n const legY = height - 12;\r\n let legX = padLeft + (plotW - numSers * 100) / 2;\r\n series.forEach(s => {\r\n legend += `<rect x=\"${legX}\" y=\"${legY - 9}\" width=\"10\" height=\"10\" fill=\"${s.color}\" rx=\"2\" />`;\r\n legend += `<text x=\"${legX + 15}\" y=\"${legY}\" font-size=\"11\" fill=\"#475569\" font-family=\"Calibri, sans-serif\">${s.title}</text>`;\r\n legX += 95;\r\n });\r\n\r\n return `\r\n <svg viewBox=\"0 0 ${width} ${height}\" width=\"100%\" height=\"100%\" style=\"background:#ffffff; border-radius:4px; overflow:visible;\" xmlns=\"http://www.w3.org/2000/svg\">\r\n ${gridLines}\r\n <line x1=\"${padLeft}\" y1=\"${padTop + plotH}\" x2=\"${padLeft + plotW}\" y2=\"${padTop + plotH}\" stroke=\"#94a3b8\" stroke-width=\"1.5\" />\r\n <line x1=\"${padLeft}\" y1=\"${padTop}\" x2=\"${padLeft}\" y2=\"${padTop + plotH}\" stroke=\"#94a3b8\" stroke-width=\"1.5\" />\r\n ${bars}\r\n ${catLabels}\r\n ${legend}\r\n </svg>\r\n `.trim();\r\n }\r\n}\r\n\r\nexport function docxPlugin(): DocxPlugin {\r\n return new DocxPlugin();\r\n}\r\n\r\nexport default DocxPlugin;\r\n\r\n","import type { \r\n FileInfo, \r\n RenderContext, \r\n ToolbarAction, \r\n PreviewPlugin, \r\n PreviewInstance,\r\n Thumbnail \r\n} from '@patel.sumit51/core';\r\nimport * as XLSX from 'xlsx';\r\n\r\nexport class ExcelPlugin implements PreviewPlugin {\r\n id = 'excel';\r\n name = 'Spreadsheet Preview (Excel / OpenDocument)';\r\n extensions = ['.xlsx', '.xls', '.xlsm', '.xlsb', '.xltx', '.xltm', '.ods'];\r\n mimeTypes = [\r\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\r\n 'application/vnd.ms-excel',\r\n 'application/vnd.ms-excel.sheet.macroEnabled.12',\r\n 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',\r\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',\r\n 'application/vnd.ms-excel.template.macroEnabled.12',\r\n 'application/vnd.oasis.opendocument.spreadsheet'\r\n ];\r\n weight = 85;\r\n\r\n supports(file: FileInfo): boolean {\r\n const ext = file.metadata.extension?.toLowerCase();\r\n const mime = file.metadata.mimeType?.toLowerCase();\r\n if (ext) {\r\n return this.extensions.includes(ext);\r\n }\r\n return this.mimeTypes.includes(mime || '');\r\n }\r\n\r\n getToolbarActions(instance: PreviewInstance): ToolbarAction[] {\r\n const totalSheets = instance.getPageCount?.() ?? 1;\r\n const actions: ToolbarAction[] = [];\r\n\r\n actions.push({\r\n id: 'thumbnails',\r\n icon: 'thumbnails',\r\n label: 'Sheet Thumbnails',\r\n type: 'button',\r\n group: 'navigation',\r\n execute: () => (instance as any).toggleThumbnails?.()\r\n });\r\n\r\n if (totalSheets > 1) {\r\n actions.push({\r\n id: 'page-nav',\r\n icon: '',\r\n label: 'Sheet Navigation',\r\n type: 'page-nav',\r\n group: 'navigation',\r\n value: instance.getCurrentPage?.() ?? 1,\r\n max: totalSheets,\r\n execute: (action: unknown, sheet?: unknown) => {\r\n const cur = instance.getCurrentPage?.() ?? 1;\r\n const max = instance.getPageCount?.() ?? 1;\r\n if (action === 'prev') {\r\n if (cur > 1) instance.goToPage?.(cur - 1);\r\n } else if (action === 'next') {\r\n if (cur < max) instance.goToPage?.(cur + 1);\r\n } else if (typeof sheet === 'number') {\r\n instance.goToPage?.(sheet);\r\n }\r\n }\r\n });\r\n }\r\n\r\n actions.push(\r\n {\r\n id: 'zoom-out',\r\n icon: 'zoom-out',\r\n label: 'Zoom Out',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => {\r\n instance.zoomOut?.();\r\n }\r\n },\r\n {\r\n id: 'zoom-in',\r\n icon: 'zoom-in',\r\n label: 'Zoom In',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => {\r\n instance.zoomIn?.();\r\n }\r\n },\r\n {\r\n id: 'reset-zoom',\r\n icon: 'reset-zoom',\r\n label: 'Reset Zoom',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => {\r\n instance.resetZoom?.();\r\n }\r\n },\r\n {\r\n id: 'download',\r\n icon: 'download',\r\n label: 'Download',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => {\r\n instance.download?.();\r\n }\r\n },\r\n {\r\n id: 'print',\r\n icon: 'print',\r\n label: 'Print',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => {\r\n instance.print?.();\r\n }\r\n },\r\n {\r\n id: 'open-window',\r\n icon: 'open-window',\r\n label: 'Open in Separate Full Window',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => {\r\n (instance as any).openInSeparateWindow?.();\r\n }\r\n }\r\n );\r\n\r\n return actions;\r\n }\r\n\r\n async render(ctx: RenderContext): Promise<PreviewInstance> {\r\n const container = document.createElement('div');\r\n container.className = 'fp-excel-container';\r\n container.style.display = 'flex';\r\n container.style.flexDirection = 'column';\r\n container.style.width = '100%';\r\n container.style.height = '100%';\r\n container.style.overflow = 'hidden';\r\n\r\n const contentArea = document.createElement('div');\r\n contentArea.className = 'fp-excel-content';\r\n contentArea.style.flex = '1';\r\n contentArea.style.overflow = 'auto';\r\n contentArea.style.padding = '16px';\r\n contentArea.style.transformOrigin = 'top left';\r\n\r\n const tabsArea = document.createElement('div');\r\n tabsArea.className = 'fp-excel-tabs';\r\n tabsArea.style.display = 'flex';\r\n tabsArea.style.gap = '6px';\r\n tabsArea.style.padding = '8px 16px';\r\n tabsArea.style.borderTop = '1px solid #e0e0e0';\r\n tabsArea.style.backgroundColor = '#fafafa';\r\n tabsArea.style.overflowX = 'auto';\r\n tabsArea.style.flexShrink = '0';\r\n\r\n container.appendChild(contentArea);\r\n container.appendChild(tabsArea);\r\n ctx.container.appendChild(container);\r\n\r\n let scale = 1.0;\r\n let currentSheetIndex = 1;\r\n let sheetNames: string[] = [];\r\n let wb: XLSX.WorkBook | null = null;\r\n\r\n const applyTransform = () => {\r\n contentArea.style.transform = `scale(${scale})`;\r\n contentArea.style.transformOrigin = 'top left';\r\n };\r\n\r\n const calculateFitScale = () => {\r\n const table = contentArea.querySelector('table');\r\n if (!table) return 1.0;\r\n const availW = Math.max(280, container.clientWidth - 48);\r\n const tW = table.offsetWidth || 800;\r\n // Automatically fit table to visible page width\r\n return Math.max(0.4, Math.min(1.0, availW / tW));\r\n };\r\n\r\n try {\r\n wb = XLSX.read(new Uint8Array(ctx.buffer), { type: 'array', cellDates: true });\r\n sheetNames = wb.SheetNames || [];\r\n } catch (err) {\r\n console.warn('[ExcelPlugin] SheetJS parse failed, rendering fallback:', err);\r\n }\r\n\r\n const tabButtons: HTMLButtonElement[] = [];\r\n\r\n const renderSheet = (index: number) => {\r\n if (!wb || index < 1 || index > sheetNames.length) return;\r\n currentSheetIndex = index;\r\n const sheetName = sheetNames[index - 1];\r\n const ws = wb.Sheets[sheetName];\r\n\r\n contentArea.innerHTML = '';\r\n\r\n if (!ws) {\r\n contentArea.innerHTML = '<div style=\"padding: 24px; color: #888;\">Empty sheet</div>';\r\n return;\r\n }\r\n\r\n const html = XLSX.utils.sheet_to_html(ws, { id: 'fp-sheet-table', editable: false });\r\n contentArea.innerHTML = html;\r\n\r\n // Style the table\r\n const table = contentArea.querySelector('table');\r\n if (table) {\r\n table.style.borderCollapse = 'collapse';\r\n table.style.fontFamily = '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif';\r\n table.style.fontSize = '13px';\r\n table.style.minWidth = '100%';\r\n table.style.border = '1px solid #d0d7de';\r\n table.style.background = '#fff';\r\n\r\n table.querySelectorAll('td, th').forEach((cell) => {\r\n const el = cell as HTMLElement;\r\n el.style.border = '1px solid #d0d7de';\r\n el.style.padding = '6px 12px';\r\n el.style.whiteSpace = 'nowrap';\r\n });\r\n\r\n table.querySelectorAll('tr:first-child td, th').forEach((cell) => {\r\n const el = cell as HTMLElement;\r\n el.style.fontWeight = '600';\r\n el.style.backgroundColor = '#f6f8fa';\r\n });\r\n }\r\n\r\n // Update active tab button\r\n tabButtons.forEach((b, i) => {\r\n if (i === index - 1) {\r\n b.style.backgroundColor = '#2563eb';\r\n b.style.color = '#fff';\r\n b.style.borderColor = '#2563eb';\r\n b.style.fontWeight = '600';\r\n } else {\r\n b.style.backgroundColor = '#fff';\r\n b.style.color = '#333';\r\n b.style.borderColor = '#ccc';\r\n b.style.fontWeight = 'normal';\r\n }\r\n });\r\n\r\n ctx.emit('page-change', { page: currentSheetIndex, total: sheetNames.length });\r\n\r\n // Automatically set fit to page by default\r\n requestAnimationFrame(() => {\r\n scale = calculateFitScale();\r\n applyTransform();\r\n });\r\n };\r\n\r\n const ro = new ResizeObserver(() => {\r\n scale = calculateFitScale();\r\n applyTransform();\r\n });\r\n ro.observe(container);\r\n\r\n if (sheetNames.length > 0) {\r\n sheetNames.forEach((name, idx) => {\r\n const btn = document.createElement('button');\r\n btn.textContent = name;\r\n btn.style.padding = '4px 12px';\r\n btn.style.fontSize = '12px';\r\n btn.style.cursor = 'pointer';\r\n btn.style.border = '1px solid #ccc';\r\n btn.style.borderRadius = '4px';\r\n btn.style.backgroundColor = '#fff';\r\n btn.style.transition = 'all 0.15s ease';\r\n btn.onclick = () => renderSheet(idx + 1);\r\n tabsArea.appendChild(btn);\r\n tabButtons.push(btn);\r\n });\r\n\r\n renderSheet(1);\r\n } else {\r\n contentArea.innerHTML = `\r\n <div style=\"text-align:center; padding: 40px; color: #666;\">\r\n <div style=\"font-size:48px; margin-bottom: 16px;\">📊</div>\r\n <h3>${ctx.metadata.name || 'Spreadsheet'}</h3>\r\n <p>Unable to load sheet data</p>\r\n </div>\r\n `;\r\n }\r\n\r\n const cleanup = () => {\r\n ro.disconnect();\r\n container.remove();\r\n ctx.container.innerHTML = '';\r\n };\r\n\r\n ctx.signal.addEventListener('abort', cleanup);\r\n\r\n return {\r\n destroy: cleanup,\r\n zoomIn: () => {\r\n scale += 0.15;\r\n applyTransform();\r\n },\r\n zoomOut: () => {\r\n scale = Math.max(0.2, scale - 0.15);\r\n applyTransform();\r\n },\r\n getZoom: () => scale,\r\n setZoom: (level: number) => {\r\n scale = level;\r\n applyTransform();\r\n },\r\n fitToPage: () => {\r\n scale = calculateFitScale();\r\n applyTransform();\r\n },\r\n resetZoom: () => {\r\n scale = calculateFitScale();\r\n contentArea.scrollTop = 0;\r\n contentArea.scrollLeft = 0;\r\n applyTransform();\r\n },\r\n rotateCW: () => {},\r\n rotateCCW: () => {},\r\n goToPage: (page: number) => {\r\n if (page > 0 && page <= sheetNames.length) {\r\n renderSheet(page);\r\n }\r\n },\r\n getPageCount: () => sheetNames.length,\r\n getCurrentPage: () => currentSheetIndex,\r\n getThumbnails: (): Thumbnail[] => {\r\n return sheetNames.map((name, idx) => ({\r\n index: idx,\r\n label: name,\r\n render: async (canvas: HTMLCanvasElement) => {\r\n canvas.width = 140;\r\n canvas.height = 100;\r\n const c = canvas.getContext('2d');\r\n if (!c) return;\r\n\r\n // Sheet Paper Background\r\n c.fillStyle = '#ffffff';\r\n c.fillRect(0, 0, canvas.width, canvas.height);\r\n\r\n // Top Header Bar (Excel Green)\r\n c.fillStyle = '#107c41';\r\n c.fillRect(0, 0, canvas.width, 16);\r\n\r\n // Tab icon & name\r\n c.fillStyle = '#ffffff';\r\n c.font = 'bold 8px -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif';\r\n c.fillText(`📊 ${name.slice(0, 16)}`, 6, 11);\r\n\r\n // Grid header row (Columns A, B, C, D)\r\n const startY = 17;\r\n const rowH = 13;\r\n const colW = 30;\r\n const colHeaders = ['A', 'B', 'C', 'D'];\r\n\r\n c.fillStyle = '#f1f5f9';\r\n c.fillRect(0, startY, canvas.width, rowH);\r\n c.strokeStyle = '#cbd5e1';\r\n c.lineWidth = 0.8;\r\n c.strokeRect(0, startY, canvas.width, rowH);\r\n\r\n c.fillStyle = '#64748b';\r\n c.font = 'bold 7px sans-serif';\r\n for (let ci = 0; ci < colHeaders.length; ci++) {\r\n c.fillText(colHeaders[ci], 14 + ci * colW, startY + 9);\r\n }\r\n\r\n // Grid rows\r\n const ws = wb?.Sheets[name];\r\n for (let ri = 1; ri <= 5; ri++) {\r\n const y = startY + ri * rowH;\r\n if (y > canvas.height - 2) break;\r\n\r\n // Row number cell\r\n c.fillStyle = '#f8fafc';\r\n c.fillRect(0, y, 12, rowH);\r\n c.fillStyle = '#94a3b8';\r\n c.font = '6px sans-serif';\r\n c.fillText(String(ri), 3, y + 9);\r\n\r\n // Row border\r\n c.strokeStyle = '#e2e8f0';\r\n c.strokeRect(0, y, canvas.width, rowH);\r\n\r\n // Cell contents\r\n c.fillStyle = '#334155';\r\n c.font = '6px sans-serif';\r\n for (let ci = 0; ci < colHeaders.length; ci++) {\r\n const cellRef = `${colHeaders[ci]}${ri}`;\r\n const cellVal = ws?.[cellRef]?.w || ws?.[cellRef]?.v;\r\n if (cellVal !== undefined) {\r\n c.fillText(String(cellVal).slice(0, 6), 14 + ci * colW, y + 9);\r\n }\r\n }\r\n }\r\n\r\n // Overall border\r\n c.strokeStyle = '#cbd5e1';\r\n c.lineWidth = 1;\r\n c.strokeRect(0.5, 0.5, canvas.width - 1, canvas.height - 1);\r\n }\r\n }));\r\n },\r\n download: () => {\r\n const blob = new Blob([ctx.buffer], { type: this.mimeTypes[0] });\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = ctx.metadata.name || 'spreadsheet.xlsx';\r\n a.click();\r\n URL.revokeObjectURL(url);\r\n },\r\n print: () => {\r\n window.print();\r\n }\r\n };\r\n }\r\n}\r\n\r\nexport function excelPlugin(): ExcelPlugin {\r\n return new ExcelPlugin();\r\n}\r\n\r\nexport default ExcelPlugin;\r\n","import type { \r\n FileInfo, \r\n RenderContext, \r\n ToolbarAction, \r\n PreviewPlugin, \r\n PreviewInstance,\r\n Thumbnail\r\n} from '@patel.sumit51/core';\r\n\r\nexport class CsvPlugin implements PreviewPlugin {\r\n id = 'csv';\r\n name = 'CSV Preview';\r\n extensions = ['.csv', '.tsv'];\r\n mimeTypes = ['text/csv', 'text/tab-separated-values'];\r\n weight = 80;\r\n\r\n supports(file: FileInfo): boolean {\r\n const ext = file.metadata.extension?.toLowerCase();\r\n const mime = file.metadata.mimeType?.toLowerCase();\r\n return ext === '.csv' || ext === '.tsv' || mime === 'text/csv' || mime === 'text/tab-separated-values';\r\n }\r\n\r\n getToolbarActions(instance: PreviewInstance): ToolbarAction[] {\r\n const actions: ToolbarAction[] = [];\r\n\r\n // Sheet Thumbnails\r\n actions.push({\r\n id: 'thumbnails',\r\n icon: 'thumbnails',\r\n label: 'Sheet Thumbnails',\r\n type: 'button',\r\n group: 'navigation',\r\n execute: () => (instance as any).toggleThumbnails?.()\r\n });\r\n\r\n actions.push(\r\n {\r\n id: 'zoom-out',\r\n icon: 'zoom-out',\r\n label: 'Zoom Out',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => {\r\n instance.zoomOut?.();\r\n }\r\n },\r\n {\r\n id: 'zoom-in',\r\n icon: 'zoom-in',\r\n label: 'Zoom In',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => {\r\n instance.zoomIn?.();\r\n }\r\n },\r\n {\r\n id: 'reset-zoom',\r\n icon: 'reset-zoom',\r\n label: 'Reset Zoom',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => {\r\n instance.resetZoom?.();\r\n }\r\n },\r\n {\r\n id: 'download',\r\n icon: 'download',\r\n label: 'Download',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => {\r\n instance.download?.();\r\n }\r\n },\r\n {\r\n id: 'print',\r\n icon: 'print',\r\n label: 'Print',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => {\r\n instance.print?.();\r\n }\r\n },\r\n {\r\n id: 'open-window',\r\n icon: 'open-window',\r\n label: 'Open in Separate Full Window',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => {\r\n (instance as any).openInSeparateWindow?.();\r\n }\r\n }\r\n );\r\n\r\n return actions;\r\n }\r\n\r\n async render(ctx: RenderContext): Promise<PreviewInstance> {\r\n const decoder = new TextDecoder('utf-8');\r\n const text = decoder.decode(ctx.buffer);\r\n \r\n const container = document.createElement('div');\r\n container.style.width = '100%';\r\n container.style.height = '100%';\r\n container.style.overflow = 'auto';\r\n container.style.padding = '16px';\r\n container.style.boxSizing = 'border-box';\r\n\r\n const tableWrapper = document.createElement('div');\r\n tableWrapper.style.transformOrigin = 'top left';\r\n \r\n const delimiter = ctx.metadata.extension === '.tsv' ? '\\t' : ',';\r\n const allLines = text.split(/\\r?\\n/).filter(r => r.trim().length > 0);\r\n const headerLine = allLines[0] || '';\r\n const headerCells = headerLine.split(delimiter);\r\n const dataLines = allLines.slice(1);\r\n\r\n const table = document.createElement('table');\r\n table.style.borderCollapse = 'collapse';\r\n table.style.minWidth = '100%';\r\n table.style.fontFamily = '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, monospace';\r\n table.style.fontSize = '13px';\r\n table.style.background = '#ffffff';\r\n table.style.border = '1px solid #d0d7de';\r\n \r\n // Header row\r\n const headerTr = document.createElement('tr');\r\n headerCells.forEach(cell => {\r\n const th = document.createElement('th');\r\n th.textContent = cell.trim();\r\n th.style.border = '1px solid #d0d7de';\r\n th.style.padding = '8px 12px';\r\n th.style.backgroundColor = '#f6f8fa';\r\n th.style.fontWeight = '600';\r\n th.style.whiteSpace = 'nowrap';\r\n headerTr.appendChild(th);\r\n });\r\n table.appendChild(headerTr);\r\n\r\n // Single continuous load of all data rows\r\n dataLines.forEach((row, idx) => {\r\n const tr = document.createElement('tr');\r\n if (idx % 2 === 1) tr.style.backgroundColor = '#f8fafc';\r\n const cells = row.split(delimiter);\r\n cells.forEach(cell => {\r\n const td = document.createElement('td');\r\n td.textContent = cell.trim();\r\n td.style.border = '1px solid #d0d7de';\r\n td.style.padding = '6px 12px';\r\n td.style.whiteSpace = 'nowrap';\r\n tr.appendChild(td);\r\n });\r\n table.appendChild(tr);\r\n });\r\n\r\n tableWrapper.appendChild(table);\r\n container.appendChild(tableWrapper);\r\n ctx.container.appendChild(container);\r\n\r\n let scale = 1.0;\r\n\r\n const calculateFitScale = () => {\r\n const availW = Math.max(280, container.clientWidth - 48);\r\n const tW = table.offsetWidth || 800;\r\n return Math.max(0.4, Math.min(1.0, availW / tW));\r\n };\r\n\r\n const applyScale = () => {\r\n tableWrapper.style.transform = `scale(${scale})`;\r\n };\r\n\r\n // Automatically fit to page width by default\r\n requestAnimationFrame(() => {\r\n scale = calculateFitScale();\r\n applyScale();\r\n });\r\n\r\n const ro = new ResizeObserver(() => {\r\n scale = calculateFitScale();\r\n applyScale();\r\n });\r\n ro.observe(container);\r\n\r\n const cleanup = () => {\r\n ro.disconnect();\r\n container.remove();\r\n ctx.container.innerHTML = '';\r\n };\r\n\r\n ctx.signal.addEventListener('abort', cleanup);\r\n\r\n return {\r\n destroy: cleanup,\r\n getPageCount: () => 1,\r\n getCurrentPage: () => 1,\r\n goToPage: () => {},\r\n getThumbnails: (): Thumbnail[] => {\r\n const sheetName = ctx.metadata.name?.replace(/\\.[^/.]+$/, '') || 'Sheet1';\r\n return [{\r\n index: 0,\r\n label: sheetName,\r\n render: async (canvas: HTMLCanvasElement) => {\r\n canvas.width = 140;\r\n canvas.height = 100;\r\n const c = canvas.getContext('2d');\r\n if (!c) return;\r\n\r\n // Sheet Paper Background\r\n c.fillStyle = '#ffffff';\r\n c.fillRect(0, 0, canvas.width, canvas.height);\r\n\r\n // Top Header Bar (Excel Green - same as xlsx wise)\r\n c.fillStyle = '#107c41';\r\n c.fillRect(0, 0, canvas.width, 16);\r\n\r\n // Tab icon & name\r\n c.fillStyle = '#ffffff';\r\n c.font = 'bold 8px -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif';\r\n c.fillText(`📊 ${sheetName.slice(0, 16)}`, 6, 11);\r\n\r\n // Grid header row\r\n const startY = 17;\r\n const rowH = 13;\r\n const colW = 30;\r\n const cols = headerCells.slice(0, 4).map(h => h.trim() || 'Col');\r\n\r\n c.fillStyle = '#f1f5f9';\r\n c.fillRect(0, startY, canvas.width, rowH);\r\n c.strokeStyle = '#cbd5e1';\r\n c.lineWidth = 0.8;\r\n c.strokeRect(0, startY, canvas.width, rowH);\r\n\r\n c.fillStyle = '#64748b';\r\n c.font = 'bold 7px sans-serif';\r\n for (let ci = 0; ci < cols.length; ci++) {\r\n c.fillText(cols[ci].slice(0, 5), 14 + ci * colW, startY + 9);\r\n }\r\n\r\n // Grid sample rows\r\n for (let ri = 0; ri < Math.min(5, dataLines.length); ri++) {\r\n const y = startY + (ri + 1) * rowH;\r\n if (y > canvas.height - 2) break;\r\n\r\n // Row number cell\r\n c.fillStyle = '#f8fafc';\r\n c.fillRect(0, y, 12, rowH);\r\n c.fillStyle = '#94a3b8';\r\n c.font = '6px sans-serif';\r\n c.fillText(String(ri + 1), 3, y + 9);\r\n\r\n // Row border\r\n c.strokeStyle = '#e2e8f0';\r\n c.strokeRect(0, y, canvas.width, rowH);\r\n\r\n // Cell contents\r\n const rowCells = dataLines[ri].split(delimiter);\r\n c.fillStyle = '#334155';\r\n c.font = '6px sans-serif';\r\n for (let ci = 0; ci < cols.length; ci++) {\r\n const val = (rowCells[ci] || '').trim();\r\n if (val) {\r\n c.fillText(val.slice(0, 6), 14 + ci * colW, y + 9);\r\n }\r\n }\r\n }\r\n\r\n // Overall border\r\n c.strokeStyle = '#cbd5e1';\r\n c.lineWidth = 1;\r\n c.strokeRect(0.5, 0.5, canvas.width - 1, canvas.height - 1);\r\n }\r\n }];\r\n },\r\n zoomIn: () => {\r\n scale += 0.1;\r\n applyScale();\r\n },\r\n zoomOut: () => {\r\n scale = Math.max(0.2, scale - 0.1);\r\n applyScale();\r\n },\r\n getZoom: () => scale,\r\n setZoom: (level: number) => {\r\n scale = level;\r\n applyScale();\r\n },\r\n fitToPage: () => {\r\n scale = calculateFitScale();\r\n applyScale();\r\n },\r\n resetZoom: () => {\r\n scale = calculateFitScale();\r\n container.scrollTop = 0;\r\n container.scrollLeft = 0;\r\n applyScale();\r\n },\r\n rotateCW: () => {},\r\n rotateCCW: () => {},\r\n download: () => {\r\n const blob = new Blob([ctx.buffer], { type: 'text/csv' });\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = ctx.metadata.name || 'data.csv';\r\n a.click();\r\n URL.revokeObjectURL(url);\r\n },\r\n print: () => {\r\n window.print();\r\n }\r\n };\r\n }\r\n}\r\n\r\nexport function csvPlugin(): CsvPlugin {\r\n return new CsvPlugin();\r\n}\r\n\r\nexport default CsvPlugin;\r\n","import type { \r\n FileInfo, \r\n RenderContext, \r\n ToolbarAction, \r\n PreviewPlugin, \r\n PreviewInstance,\r\n Thumbnail \r\n} from '@patel.sumit51/core';\r\nimport hljs from 'highlight.js';\r\n\r\nconst CODE_EXTENSIONS = [\r\n '.txt', '.json', '.js', '.ts', '.jsx', '.tsx', '.html', '.css', '.scss', '.less',\r\n '.md', '.xml', '.yml', '.yaml', '.sh', '.bash', '.py', \r\n '.java', '.c', '.cpp', '.h', '.cs', '.go', '.rs', '.sql', '.php'\r\n];\r\n\r\nexport class CodePlugin implements PreviewPlugin {\r\n id = 'code';\r\n name = 'Code/Text Preview';\r\n extensions = CODE_EXTENSIONS;\r\n mimeTypes = ['text/plain', 'application/json', 'text/javascript', 'text/html', 'text/css'];\r\n weight = 50; \r\n\r\n supports(file: FileInfo): boolean {\r\n const ext = file.metadata.extension?.toLowerCase();\r\n const mime = file.metadata.mimeType?.toLowerCase();\r\n \r\n if (ext && this.extensions.includes(ext)) return true;\r\n if (mime && (mime.startsWith('text/') || this.mimeTypes.includes(mime))) return true;\r\n \r\n return false;\r\n }\r\n\r\n getToolbarActions(instance: PreviewInstance): ToolbarAction[] {\r\n const totalPages = instance.getPageCount?.() ?? 1;\r\n const actions: ToolbarAction[] = [];\r\n\r\n actions.push({\r\n id: 'thumbnails',\r\n icon: 'thumbnails',\r\n label: 'Page Thumbnails',\r\n type: 'button',\r\n group: 'navigation',\r\n execute: () => (instance as any).toggleThumbnails?.()\r\n });\r\n\r\n actions.push({\r\n id: 'page-nav',\r\n icon: '',\r\n label: 'Page Navigation',\r\n type: 'page-nav',\r\n group: 'navigation',\r\n value: instance.getCurrentPage?.() ?? 1,\r\n max: totalPages,\r\n execute: (action: unknown, page?: unknown) => {\r\n const cur = instance.getCurrentPage?.() ?? 1;\r\n const max = instance.getPageCount?.() ?? 1;\r\n if (action === 'prev') {\r\n if (cur > 1) instance.goToPage?.(cur - 1);\r\n } else if (action === 'next') {\r\n if (cur < max) instance.goToPage?.(cur + 1);\r\n } else if (typeof page === 'number') {\r\n instance.goToPage?.(page);\r\n }\r\n }\r\n });\r\n\r\n actions.push(\r\n {\r\n id: 'zoom-out',\r\n icon: 'zoom-out',\r\n label: 'Zoom Out',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => {\r\n instance.zoomOut?.();\r\n }\r\n },\r\n {\r\n id: 'zoom-in',\r\n icon: 'zoom-in',\r\n label: 'Zoom In',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => {\r\n instance.zoomIn?.();\r\n }\r\n },\r\n {\r\n id: 'reset-zoom',\r\n icon: 'reset-zoom',\r\n label: 'Reset Zoom',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => {\r\n instance.resetZoom?.();\r\n }\r\n },\r\n {\r\n id: 'copy',\r\n icon: 'copy',\r\n label: 'Copy Content',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => {\r\n (instance as any).copy?.();\r\n }\r\n },\r\n {\r\n id: 'download',\r\n icon: 'download',\r\n label: 'Download',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => {\r\n instance.download?.();\r\n }\r\n },\r\n {\r\n id: 'print',\r\n icon: 'print',\r\n label: 'Print',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => {\r\n instance.print?.();\r\n }\r\n },\r\n {\r\n id: 'open-window',\r\n icon: 'open-window',\r\n label: 'Open in Separate Full Window',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => {\r\n (instance as any).openInSeparateWindow?.();\r\n }\r\n }\r\n );\r\n\r\n return actions;\r\n }\r\n\r\n async render(ctx: RenderContext): Promise<PreviewInstance> {\r\n const decoder = new TextDecoder('utf-8');\r\n const fullText = decoder.decode(ctx.buffer);\r\n\r\n const extRaw = ctx.metadata.extension?.toLowerCase();\r\n const mimeRaw = ctx.metadata.mimeType?.toLowerCase();\r\n const isTxt = extRaw === '.txt' || (mimeRaw === 'text/plain' && (!extRaw || !this.extensions.filter(e => e !== '.txt').includes(extRaw)));\r\n\r\n let rawPages: string[] = [];\r\n if (isTxt) {\r\n const explicitPages = fullText.split(/(?:\\f|\\x0C)/);\r\n const charsPerLine = 85;\r\n const maxVisualLines = 45;\r\n const charsPerPage = charsPerLine * maxVisualLines; // ~3825 characters per page\r\n\r\n for (const ep of explicitPages) {\r\n const lines = ep.split(/\\r?\\n/);\r\n let currentChunk: string[] = [];\r\n let currentLines = 0;\r\n\r\n for (let i = 0; i < lines.length; i++) {\r\n const line = lines[i];\r\n const vLines = Math.max(1, Math.ceil((line.length || 1) / charsPerLine));\r\n\r\n if (currentLines + vLines > maxVisualLines && currentChunk.length > 0) {\r\n rawPages.push(currentChunk.join('\\n'));\r\n currentChunk = [];\r\n currentLines = 0;\r\n }\r\n\r\n if (vLines > maxVisualLines) {\r\n // Large uninterrupted paragraph: break cleanly at word boundaries\r\n let remaining = line;\r\n while (remaining.length > charsPerPage) {\r\n let splitIdx = remaining.lastIndexOf(' ', charsPerPage);\r\n if (splitIdx < charsPerPage * 0.75) splitIdx = charsPerPage;\r\n rawPages.push(remaining.slice(0, splitIdx));\r\n remaining = remaining.slice(splitIdx).trimStart();\r\n }\r\n if (remaining.length > 0) {\r\n currentChunk.push(remaining);\r\n currentLines = Math.ceil(remaining.length / charsPerLine);\r\n }\r\n } else {\r\n currentChunk.push(line);\r\n currentLines += vLines;\r\n }\r\n }\r\n if (currentChunk.length > 0) {\r\n rawPages.push(currentChunk.join('\\n'));\r\n }\r\n }\r\n if (rawPages.length === 0) rawPages = [''];\r\n } else {\r\n const pageSplitRegex = /(?:\\f|\\x0C|(?:\\r?\\n|^)\\s*[-=_]{3,}\\s*(?:PAGE|Page|page break|Page Break)[\\s\\d\\w-]*[-=_]{3,}\\s*(?:\\r?\\n|$))/i;\r\n rawPages = fullText.split(pageSplitRegex).map(p => p.trim()).filter(p => p.length > 0);\r\n }\r\n \r\n const totalPages = Math.max(1, rawPages.length);\r\n let currentPage = 1;\r\n \r\n const container = document.createElement('div');\r\n container.style.width = '100%';\r\n container.style.height = '100%';\r\n container.style.overflow = 'auto';\r\n \r\n let fontSize = 13;\r\n let rotation = 0;\r\n let zoomLevel = 1;\r\n let isUserZoomed = false;\r\n const pre = document.createElement('pre');\r\n const code = document.createElement('code');\r\n\r\n if (isTxt) {\r\n container.style.overflowX = 'hidden';\r\n container.style.overflowY = 'auto';\r\n container.style.backgroundColor = '#f1f5f9';\r\n container.style.padding = '16px 8px';\r\n container.style.boxSizing = 'border-box';\r\n container.style.display = 'flex';\r\n container.style.flexDirection = 'column';\r\n container.style.alignItems = 'center';\r\n\r\n pre.style.margin = '0 auto';\r\n pre.style.fontFamily = \"Consolas, 'Courier New', monospace\";\r\n pre.style.fontSize = '13px';\r\n pre.style.color = '#1e293b';\r\n pre.style.lineHeight = '1.5';\r\n pre.style.whiteSpace = 'pre-wrap';\r\n pre.style.wordBreak = 'break-word';\r\n \r\n pre.style.backgroundColor = '#ffffff';\r\n pre.style.width = '816px';\r\n pre.style.minHeight = '1056px';\r\n pre.style.padding = '72px 56px';\r\n pre.style.boxSizing = 'border-box';\r\n pre.style.boxShadow = '0 4px 24px rgba(0, 0, 0, 0.08)';\r\n pre.style.borderRadius = '4px';\r\n pre.style.transformOrigin = 'top center';\r\n pre.style.transition = 'transform 0.15s ease';\r\n } else {\r\n container.style.overflow = 'auto';\r\n container.style.backgroundColor = '#1e1e1e';\r\n container.style.color = '#d4d4d4';\r\n container.style.padding = '16px';\r\n container.style.boxSizing = 'border-box';\r\n\r\n pre.style.margin = '0';\r\n pre.style.fontFamily = 'Consolas, Menlo, Monaco, monospace';\r\n pre.style.fontSize = `${fontSize}px`;\r\n pre.style.lineHeight = '1.5';\r\n pre.style.whiteSpace = 'pre-wrap';\r\n pre.style.wordBreak = 'break-all';\r\n pre.style.transformOrigin = 'top left';\r\n }\r\n\r\n const ext = (ctx.metadata.extension || '').replace('.', '');\r\n\r\n const renderCodePage = (text: string) => {\r\n if (isTxt) {\r\n code.textContent = text;\r\n } else {\r\n try {\r\n if (ext && hljs.getLanguage(ext)) {\r\n code.innerHTML = hljs.highlight(text, { language: ext }).value;\r\n } else {\r\n code.innerHTML = hljs.highlightAuto(text).value;\r\n }\r\n } catch {\r\n code.textContent = text;\r\n }\r\n }\r\n };\r\n\r\n renderCodePage(rawPages[0] || (isTxt ? '' : fullText));\r\n \r\n pre.appendChild(code);\r\n container.appendChild(pre);\r\n\r\n const showPage = (pageNum: number) => {\r\n currentPage = Math.max(1, Math.min(totalPages, pageNum));\r\n renderCodePage(rawPages[currentPage - 1] || (isTxt ? '' : fullText));\r\n container.scrollTop = 0;\r\n ctx.emit('page-change', { page: currentPage, total: totalPages });\r\n };\r\n\r\n if (totalPages > 1) {\r\n showPage(1);\r\n }\r\n\r\n ctx.container.appendChild(container);\r\n\r\n const calculateTxtFit = () => {\r\n // Minimal side margins (16px on each side, safe from vertical scrollbar)\r\n const availW = Math.max(280, container.clientWidth - 32);\r\n return Math.max(0.4, Math.min(3.0, availW / 816));\r\n };\r\n\r\n const updateTransform = () => {\r\n if (isTxt) {\r\n pre.style.transform = `scale(${zoomLevel}) rotate(${rotation}deg)`;\r\n const scaledH = 1056 * zoomLevel;\r\n const extraH = Math.max(0, scaledH - 1056);\r\n pre.style.marginBottom = `${extraH + 32}px`;\r\n } else {\r\n pre.style.transform = `rotate(${rotation}deg)`;\r\n pre.style.fontSize = `${fontSize}px`;\r\n }\r\n };\r\n\r\n let resizeObserver: ResizeObserver | null = null;\r\n if (isTxt) {\r\n setTimeout(() => {\r\n zoomLevel = calculateTxtFit();\r\n updateTransform();\r\n }, 60);\r\n\r\n resizeObserver = typeof ResizeObserver !== 'undefined'\r\n ? new ResizeObserver(() => {\r\n if (!isUserZoomed) {\r\n zoomLevel = calculateTxtFit();\r\n updateTransform();\r\n }\r\n })\r\n : null;\r\n resizeObserver?.observe(container);\r\n }\r\n\r\n const cleanup = () => {\r\n resizeObserver?.disconnect();\r\n container.remove();\r\n ctx.container.innerHTML = '';\r\n };\r\n\r\n ctx.signal.addEventListener('abort', cleanup);\r\n\r\n return {\r\n destroy: cleanup,\r\n getPageCount: () => totalPages,\r\n getCurrentPage: () => currentPage,\r\n goToPage: (page: number) => showPage(page),\r\n getThumbnails: (): Thumbnail[] => {\r\n return rawPages.map((pageText, idx) => ({\r\n index: idx,\r\n label: `Page ${idx + 1}`,\r\n render: async (canvas: HTMLCanvasElement) => {\r\n canvas.width = 140;\r\n canvas.height = 180;\r\n const c = canvas.getContext('2d');\r\n if (!c) return;\r\n\r\n // Page Background\r\n c.fillStyle = '#ffffff';\r\n c.fillRect(0, 0, canvas.width, canvas.height);\r\n\r\n // Subtle paper border\r\n c.strokeStyle = '#cbd5e1';\r\n c.lineWidth = 1;\r\n c.strokeRect(0.5, 0.5, canvas.width - 1, canvas.height - 1);\r\n\r\n // Miniature lines of text\r\n c.fillStyle = '#64748b';\r\n const lines = (pageText || '').split('\\n').slice(0, 24);\r\n const lineH = 6;\r\n const startY = 14;\r\n const startX = 12;\r\n const maxW = canvas.width - 24;\r\n\r\n c.font = '5px monospace';\r\n for (let li = 0; li < lines.length; li++) {\r\n const l = lines[li].trim();\r\n if (!l) continue;\r\n const y = startY + li * lineH;\r\n if (y > canvas.height - 12) break;\r\n c.fillText(l.slice(0, 30), startX, y, maxW);\r\n }\r\n }\r\n }));\r\n },\r\n zoomIn: () => {\r\n isUserZoomed = true;\r\n if (isTxt) {\r\n zoomLevel = Math.min(3.5, zoomLevel + 0.15);\r\n } else {\r\n fontSize = Math.min(32, fontSize + 2);\r\n }\r\n updateTransform();\r\n },\r\n zoomOut: () => {\r\n isUserZoomed = true;\r\n if (isTxt) {\r\n zoomLevel = Math.max(0.1, zoomLevel - 0.15);\r\n } else {\r\n fontSize = Math.max(8, fontSize - 2);\r\n }\r\n updateTransform();\r\n },\r\n getZoom: () => isTxt ? zoomLevel : fontSize / 13,\r\n setZoom: (level: number) => {\r\n isUserZoomed = true;\r\n if (isTxt) {\r\n zoomLevel = level;\r\n } else {\r\n fontSize = Math.round(13 * level);\r\n }\r\n updateTransform();\r\n },\r\n fitToPage: () => {\r\n isUserZoomed = false;\r\n fontSize = 13;\r\n rotation = 0;\r\n zoomLevel = isTxt ? calculateTxtFit() : 1;\r\n updateTransform();\r\n },\r\n resetZoom: () => {\r\n isUserZoomed = false;\r\n fontSize = 13;\r\n rotation = 0;\r\n zoomLevel = isTxt ? calculateTxtFit() : 1;\r\n container.scrollTop = 0;\r\n container.scrollLeft = 0;\r\n updateTransform();\r\n },\r\n rotateCW: () => {\r\n rotation = (rotation + 90) % 360;\r\n updateTransform();\r\n },\r\n rotateCCW: () => {\r\n rotation = (rotation - 90 + 360) % 360;\r\n updateTransform();\r\n },\r\n download: () => {\r\n const mimeType = ctx.metadata.mimeType || 'text/plain';\r\n const blob = new Blob([ctx.buffer], { type: mimeType });\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = ctx.metadata.name || 'code.txt';\r\n a.click();\r\n URL.revokeObjectURL(url);\r\n },\r\n print: () => {\r\n window.print();\r\n },\r\n copy: () => {\r\n navigator.clipboard?.writeText(fullText);\r\n }\r\n };\r\n }\r\n}\r\n\r\nexport function codePlugin(): CodePlugin {\r\n return new CodePlugin();\r\n}\r\n\r\nexport default CodePlugin;\r\n","import type { \r\n FileInfo, \r\n RenderContext, \r\n ToolbarAction, \r\n PreviewPlugin, \r\n PreviewInstance \r\n} from '@patel.sumit51/core';\r\nimport { formatFileSize, downloadFile } from '@patel.sumit51/core';\r\nimport { unzip } from 'fflate';\r\n\r\ninterface ArchiveEntry {\r\n path: string;\r\n name: string;\r\n isDir: boolean;\r\n size: number;\r\n data?: Uint8Array;\r\n}\r\n\r\nexport class ArchivePlugin implements PreviewPlugin {\r\n id = 'archive';\r\n name = 'Archive Explorer';\r\n extensions = ['.zip'];\r\n mimeTypes = ['application/zip', 'application/x-zip-compressed'];\r\n weight = 70;\r\n\r\n supports(file: FileInfo): boolean {\r\n const ext = file.metadata.extension?.toLowerCase();\r\n const mime = file.metadata.mimeType?.toLowerCase();\r\n return ext === '.zip' || this.mimeTypes.includes(mime || '');\r\n }\r\n\r\n getToolbarActions(instance: PreviewInstance): ToolbarAction[] {\r\n return [\r\n {\r\n id: 'zoom-out',\r\n icon: 'zoom-out',\r\n label: 'Zoom Out',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomOut?.()\r\n },\r\n {\r\n id: 'zoom-in',\r\n icon: 'zoom-in',\r\n label: 'Zoom In',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomIn?.()\r\n },\r\n {\r\n id: 'fit-page',\r\n icon: 'fit-page',\r\n label: 'Fit to Page',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.fitToPage?.()\r\n },\r\n {\r\n id: 'reset-zoom',\r\n icon: 'reset-zoom',\r\n label: 'Reset Zoom',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.resetZoom?.()\r\n },\r\n {\r\n id: 'download',\r\n icon: 'download',\r\n label: 'Download Archive',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => instance.download?.()\r\n },\r\n {\r\n id: 'print',\r\n icon: 'print',\r\n label: 'Print File List',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => instance.print?.()\r\n }\r\n ];\r\n }\r\n\r\n async render(ctx: RenderContext): Promise<PreviewInstance> {\r\n const wrapper = document.createElement('div');\r\n wrapper.className = 'fp-archive-wrapper';\r\n wrapper.style.cssText = `\r\n width: 100%;\r\n height: 100%;\r\n overflow: auto;\r\n padding: 24px;\r\n box-sizing: border-box;\r\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\r\n transform-origin: top left;\r\n transition: transform 0.2s ease;\r\n `;\r\n ctx.container.innerHTML = '';\r\n ctx.container.style.overflow = 'auto';\r\n ctx.container.appendChild(wrapper);\r\n\r\n let scale = 1.0;\r\n\r\n const entries = await new Promise<ArchiveEntry[]>((resolve, reject) => {\r\n unzip(new Uint8Array(ctx.buffer), (err, unzipped) => {\r\n if (err) {\r\n reject(err);\r\n return;\r\n }\r\n const list: ArchiveEntry[] = Object.entries(unzipped).map(([path, data]) => {\r\n const isDir = path.endsWith('/');\r\n const parts = path.split('/').filter(Boolean);\r\n const name = parts[parts.length - 1] || path;\r\n return {\r\n path,\r\n name,\r\n isDir,\r\n size: data.length,\r\n data\r\n };\r\n });\r\n resolve(list);\r\n });\r\n });\r\n\r\n const totalUncompressedSize = entries.reduce((acc, e) => acc + e.size, 0);\r\n\r\n const renderUI = (filteredEntries: ArchiveEntry[]) => {\r\n wrapper.innerHTML = `\r\n <div style=\"max-width: 900px; margin: 0 auto; background: var(--fp-bg, #ffffff); border: 1px solid var(--fp-border, #e5e7eb); border-radius: 8px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); overflow: hidden;\">\r\n <div style=\"padding: 16px 20px; background: var(--fp-toolbar-bg, #f9fafb); border-bottom: 1px solid var(--fp-border, #e5e7eb); display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 12px;\">\r\n <div>\r\n <h3 style=\"margin: 0 0 4px 0; font-size: 16px; font-weight: 600; color: var(--fp-text, #111827);\">\r\n 📦 ${ctx.metadata.name || 'Archive.zip'}\r\n </h3>\r\n <div style=\"font-size: 13px; color: var(--fp-text-muted, #6b7280);\">\r\n ${entries.length} items · Total size: ${formatFileSize(totalUncompressedSize)} (Compressed: ${formatFileSize(ctx.buffer.byteLength)})\r\n </div>\r\n </div>\r\n <div>\r\n <input type=\"text\" id=\"fp-archive-search\" placeholder=\"Search files in archive...\" style=\"padding: 6px 12px; font-size: 13px; border: 1px solid var(--fp-border, #d1d5db); border-radius: 6px; outline: none; width: 220px;\" />\r\n </div>\r\n </div>\r\n <div style=\"max-height: 550px; overflow-y: auto;\">\r\n <table style=\"width: 100%; border-collapse: collapse; font-size: 13px; text-align: left;\">\r\n <thead>\r\n <tr style=\"background: var(--fp-toolbar-bg, #f3f4f6); color: var(--fp-text-muted, #4b5563); border-bottom: 1px solid var(--fp-border, #e5e7eb);\">\r\n <th style=\"padding: 10px 16px; font-weight: 600;\">Name / Path</th>\r\n <th style=\"padding: 10px 16px; font-weight: 600; width: 120px;\">Size</th>\r\n <th style=\"padding: 10px 16px; font-weight: 600; width: 100px; text-align: right;\">Action</th>\r\n </tr>\r\n </thead>\r\n <tbody id=\"fp-archive-body\">\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n `;\r\n\r\n const tbody = wrapper.querySelector('#fp-archive-body') as HTMLElement;\r\n if (filteredEntries.length === 0) {\r\n tbody.innerHTML = `<tr><td colspan=\"3\" style=\"padding: 24px; text-align: center; color: #9ca3af;\">No matching files found</td></tr>`;\r\n } else {\r\n tbody.innerHTML = filteredEntries.map((e, idx) => `\r\n <tr style=\"border-bottom: 1px solid var(--fp-border, #f3f4f6); transition: background 0.15s ease;\" onmouseover=\"this.style.background='var(--fp-hover, #f9fafb)'\" onmouseout=\"this.style.background='transparent'\">\r\n <td style=\"padding: 10px 16px; color: var(--fp-text, #1f2937); word-break: break-all;\">\r\n <span style=\"margin-right: 8px;\">${e.isDir ? '📁' : '📄'}</span>\r\n ${e.path}\r\n </td>\r\n <td style=\"padding: 10px 16px; color: var(--fp-text-muted, #6b7280);\">\r\n ${e.isDir ? '-' : formatFileSize(e.size)}\r\n </td>\r\n <td style=\"padding: 10px 16px; text-align: right;\">\r\n ${!e.isDir ? `<button data-idx=\"${idx}\" class=\"fp-entry-dl\" style=\"padding: 4px 8px; font-size: 12px; background: transparent; border: 1px solid var(--fp-border, #d1d5db); border-radius: 4px; cursor: pointer; color: var(--fp-text, #374151);\">⬇️ Save</button>` : ''}\r\n </td>\r\n </tr>\r\n `).join('');\r\n }\r\n\r\n // Handle download individual file\r\n tbody.querySelectorAll('.fp-entry-dl').forEach((btn) => {\r\n btn.addEventListener('click', (ev) => {\r\n const target = ev.currentTarget as HTMLElement;\r\n const idx = Number(target.getAttribute('data-idx'));\r\n const entry = filteredEntries[idx];\r\n if (entry && entry.data) {\r\n downloadFile(entry.data.buffer as ArrayBuffer, entry.name);\r\n }\r\n });\r\n });\r\n\r\n // Handle search\r\n const searchInput = wrapper.querySelector('#fp-archive-search') as HTMLInputElement;\r\n if (searchInput) {\r\n searchInput.addEventListener('input', () => {\r\n const q = searchInput.value.toLowerCase().trim();\r\n const filtered = q ? entries.filter(e => e.path.toLowerCase().includes(q)) : entries;\r\n renderUI(filtered);\r\n const newSearch = wrapper.querySelector('#fp-archive-search') as HTMLInputElement;\r\n if (newSearch) {\r\n newSearch.value = q;\r\n newSearch.focus();\r\n }\r\n });\r\n }\r\n };\r\n\r\n renderUI(entries);\r\n\r\n const cleanup = () => {\r\n wrapper.remove();\r\n ctx.container.innerHTML = '';\r\n };\r\n\r\n ctx.signal.addEventListener('abort', cleanup);\r\n\r\n return {\r\n destroy: cleanup,\r\n zoomIn: () => {\r\n scale += 0.1;\r\n wrapper.style.transform = `scale(${scale})`;\r\n },\r\n zoomOut: () => {\r\n scale = Math.max(0.3, scale - 0.1);\r\n wrapper.style.transform = `scale(${scale})`;\r\n },\r\n getZoom: () => scale,\r\n setZoom: (level: number) => {\r\n scale = level;\r\n wrapper.style.transform = `scale(${scale})`;\r\n },\r\n fitToPage: () => {\r\n scale = 1.0;\r\n wrapper.style.transform = 'scale(1)';\r\n },\r\n resetZoom: () => {\r\n scale = 1.0;\r\n wrapper.style.transform = 'scale(1)';\r\n ctx.container.scrollTop = 0;\r\n ctx.container.scrollLeft = 0;\r\n },\r\n download: () => {\r\n downloadFile(ctx.buffer, ctx.metadata.name || 'archive.zip', 'application/zip');\r\n },\r\n print: () => {\r\n window.print();\r\n }\r\n };\r\n }\r\n}\r\n\r\nexport function archivePlugin(): ArchivePlugin {\r\n return new ArchivePlugin();\r\n}\r\n\r\nexport default ArchivePlugin;\r\n","import type { \r\n FileInfo, \r\n RenderContext, \r\n ToolbarAction, \r\n PreviewPlugin, \r\n PreviewInstance \r\n} from '@patel.sumit51/core';\r\nimport { downloadFile } from '@patel.sumit51/core';\r\nimport { marked } from 'marked';\r\nimport DOMPurify from 'dompurify';\r\nimport hljs from 'highlight.js';\r\n\r\nexport class MarkdownPlugin implements PreviewPlugin {\r\n id = 'markdown';\r\n name = 'Markdown Preview';\r\n extensions = ['.md', '.markdown', '.mdown', '.mkd'];\r\n mimeTypes = ['text/markdown', 'text/x-markdown'];\r\n weight = 90; // Higher than generic text/code plugin\r\n\r\n supports(file: FileInfo): boolean {\r\n const ext = file.metadata.extension?.toLowerCase();\r\n const mime = file.metadata.mimeType?.toLowerCase();\r\n return this.extensions.includes(ext || '') || this.mimeTypes.includes(mime || '');\r\n }\r\n\r\n getToolbarActions(instance: PreviewInstance): ToolbarAction[] {\r\n return [\r\n {\r\n id: 'zoom-out',\r\n icon: 'zoom-out',\r\n label: 'Decrease Font',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomOut?.()\r\n },\r\n {\r\n id: 'zoom-in',\r\n icon: 'zoom-in',\r\n label: 'Increase Font',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomIn?.()\r\n },\r\n {\r\n id: 'fit-page',\r\n icon: 'fit-page',\r\n label: 'Default Size',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.fitToPage?.()\r\n },\r\n {\r\n id: 'reset-zoom',\r\n icon: 'reset-zoom',\r\n label: 'Reset Zoom',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.resetZoom?.()\r\n },\r\n {\r\n id: 'copy',\r\n icon: 'copy',\r\n label: 'Copy Markdown',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => (instance as any).copy?.()\r\n },\r\n {\r\n id: 'download',\r\n icon: 'download',\r\n label: 'Download Markdown',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => instance.download?.()\r\n },\r\n {\r\n id: 'print',\r\n icon: 'print',\r\n label: 'Print Document',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => instance.print?.()\r\n }\r\n ];\r\n }\r\n\r\n async render(ctx: RenderContext): Promise<PreviewInstance> {\r\n const text = new TextDecoder('utf-8', { fatal: false }).decode(ctx.buffer);\r\n \r\n // Parse markdown to HTML\r\n const rawHtml = await marked.parse(text, {\r\n gfm: true,\r\n breaks: true,\r\n });\r\n\r\n // Sanitize generated HTML for security\r\n const cleanHtml = DOMPurify.sanitize(rawHtml, {\r\n USE_PROFILES: { html: true }\r\n });\r\n\r\n const wrapper = document.createElement('div');\r\n wrapper.className = 'fp-markdown-wrapper';\r\n wrapper.style.cssText = `\r\n width: 100%;\r\n height: 100%;\r\n overflow: auto;\r\n padding: 32px 40px;\r\n box-sizing: border-box;\r\n line-height: 1.6;\r\n font-size: 15px;\r\n color: var(--fp-text, #24292f);\r\n background: var(--fp-bg, #ffffff);\r\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Noto Sans\", Helvetica, Arial, sans-serif;\r\n `;\r\n\r\n wrapper.innerHTML = `\r\n <style>\r\n .fp-markdown-wrapper h1, .fp-markdown-wrapper h2, .fp-markdown-wrapper h3,\r\n .fp-markdown-wrapper h4, .fp-markdown-wrapper h5, .fp-markdown-wrapper h6 {\r\n margin-top: 24px;\r\n margin-bottom: 16px;\r\n font-weight: 600;\r\n line-height: 1.25;\r\n color: var(--fp-text, #1f2328);\r\n }\r\n .fp-markdown-wrapper h1 { font-size: 2em; padding-bottom: 0.3em; border-bottom: 1px solid var(--fp-border, #d0d7de); }\r\n .fp-markdown-wrapper h2 { font-size: 1.5em; padding-bottom: 0.3em; border-bottom: 1px solid var(--fp-border, #d0d7de); }\r\n .fp-markdown-wrapper h3 { font-size: 1.25em; }\r\n .fp-markdown-wrapper p { margin-top: 0; margin-bottom: 16px; }\r\n .fp-markdown-wrapper table {\r\n border-spacing: 0;\r\n border-collapse: collapse;\r\n margin-top: 0;\r\n margin-bottom: 16px;\r\n width: 100%;\r\n overflow: auto;\r\n }\r\n .fp-markdown-wrapper table th, .fp-markdown-wrapper table td {\r\n padding: 6px 13px;\r\n border: 1px solid var(--fp-border, #d0d7de);\r\n }\r\n .fp-markdown-wrapper table tr:nth-child(2n) {\r\n background-color: var(--fp-toolbar-bg, #f6f8fa);\r\n }\r\n .fp-markdown-wrapper blockquote {\r\n margin: 0 0 16px 0;\r\n padding: 0 1em;\r\n color: var(--fp-text-muted, #59636e);\r\n border-left: 0.25em solid var(--fp-border, #d0d7de);\r\n }\r\n .fp-markdown-wrapper pre {\r\n padding: 16px;\r\n overflow: auto;\r\n font-size: 85%;\r\n line-height: 1.45;\r\n background-color: var(--fp-toolbar-bg, #f6f8fa);\r\n border-radius: 6px;\r\n border: 1px solid var(--fp-border, #d0d7de);\r\n }\r\n .fp-markdown-wrapper code {\r\n padding: 0.2em 0.4em;\r\n margin: 0;\r\n font-size: 85%;\r\n background-color: rgba(175, 184, 193, 0.2);\r\n border-radius: 4px;\r\n font-family: ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, monospace;\r\n }\r\n .fp-markdown-wrapper pre code {\r\n padding: 0;\r\n background: transparent;\r\n }\r\n .fp-markdown-wrapper ul, .fp-markdown-wrapper ol {\r\n padding-left: 2em;\r\n margin-top: 0;\r\n margin-bottom: 16px;\r\n }\r\n .fp-markdown-wrapper hr {\r\n height: 0.25em;\r\n padding: 0;\r\n margin: 24px 0;\r\n background-color: var(--fp-border, #d0d7de);\r\n border: 0;\r\n }\r\n </style>\r\n <div class=\"fp-markdown-content\" style=\"max-width: 860px; margin: 0 auto;\">\r\n ${cleanHtml}\r\n </div>\r\n `;\r\n\r\n // Apply syntax highlighting to pre code blocks\r\n wrapper.querySelectorAll('pre code').forEach((block) => {\r\n hljs.highlightElement(block as HTMLElement);\r\n });\r\n\r\n ctx.container.innerHTML = '';\r\n ctx.container.style.overflow = 'auto';\r\n ctx.container.appendChild(wrapper);\r\n\r\n let fontSize = 15;\r\n\r\n const cleanup = () => {\r\n wrapper.remove();\r\n ctx.container.innerHTML = '';\r\n };\r\n\r\n ctx.signal.addEventListener('abort', cleanup);\r\n\r\n return {\r\n destroy: cleanup,\r\n zoomIn: () => {\r\n fontSize = Math.min(28, fontSize + 2);\r\n wrapper.style.fontSize = `${fontSize}px`;\r\n },\r\n zoomOut: () => {\r\n fontSize = Math.max(10, fontSize - 2);\r\n wrapper.style.fontSize = `${fontSize}px`;\r\n },\r\n getZoom: () => fontSize / 15,\r\n setZoom: (level: number) => {\r\n fontSize = Math.round(15 * level);\r\n wrapper.style.fontSize = `${fontSize}px`;\r\n },\r\n fitToPage: () => {\r\n fontSize = 15;\r\n wrapper.style.fontSize = '15px';\r\n },\r\n resetZoom: () => {\r\n fontSize = 15;\r\n wrapper.style.fontSize = '15px';\r\n ctx.container.scrollTop = 0;\r\n ctx.container.scrollLeft = 0;\r\n },\r\n download: () => {\r\n downloadFile(ctx.buffer, ctx.metadata.name || 'document.md', 'text/markdown');\r\n },\r\n print: () => {\r\n window.print();\r\n },\r\n copy: () => {\r\n navigator.clipboard?.writeText(text);\r\n }\r\n };\r\n }\r\n}\r\n\r\nexport function markdownPlugin(): MarkdownPlugin {\r\n return new MarkdownPlugin();\r\n}\r\n\r\nexport default MarkdownPlugin;\r\n","import type { \r\n FileInfo, \r\n RenderContext, \r\n ToolbarAction, \r\n PreviewPlugin, \r\n PreviewInstance,\r\n Thumbnail\r\n} from '@patel.sumit51/core';\r\nimport { downloadFile } from '@patel.sumit51/core';\r\nimport { PptxRenderer } from 'pptx-browser';\r\n\r\nexport class PptxPlugin implements PreviewPlugin {\r\n id = 'pptx';\r\n name = 'PowerPoint Presentation';\r\n extensions = ['.pptx', '.ppsx', '.pptm', '.ppsm', '.potx', '.potm'];\r\n mimeTypes = [\r\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\r\n 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',\r\n 'application/vnd.ms-powerpoint.presentation.macroEnabled.12',\r\n 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12',\r\n 'application/vnd.openxmlformats-officedocument.presentationml.template',\r\n 'application/vnd.ms-powerpoint.template.macroEnabled.12'\r\n ];\r\n weight = 80;\r\n\r\n supports(file: FileInfo): boolean {\r\n const ext = file.metadata.extension?.toLowerCase();\r\n const mime = file.metadata.mimeType?.toLowerCase();\r\n if (ext) {\r\n return this.extensions.includes(ext);\r\n }\r\n return this.mimeTypes.includes(mime || '');\r\n }\r\n\r\n getToolbarActions(instance: PreviewInstance): ToolbarAction[] {\r\n return [\r\n {\r\n id: 'thumbnails',\r\n icon: 'thumbnails',\r\n label: 'Slide Thumbnails',\r\n type: 'button',\r\n group: 'navigation',\r\n execute: () => instance.toggleThumbnails?.()\r\n },\r\n {\r\n id: 'page-nav',\r\n icon: '',\r\n label: 'Slide Navigation',\r\n type: 'page-nav',\r\n group: 'navigation',\r\n value: instance.getCurrentPage?.() ?? 1,\r\n max: instance.getPageCount?.() ?? 1,\r\n execute: (action: unknown, page?: unknown) => {\r\n if (action === 'prev') {\r\n const cur = instance.getCurrentPage?.() ?? 1;\r\n if (cur > 1) instance.goToPage?.(cur - 1);\r\n } else if (action === 'next') {\r\n const cur = instance.getCurrentPage?.() ?? 1;\r\n const total = instance.getPageCount?.() ?? 1;\r\n if (cur < total) instance.goToPage?.(cur + 1);\r\n } else if (typeof page === 'number') {\r\n instance.goToPage?.(page);\r\n } else if (typeof action === 'number') {\r\n instance.goToPage?.(action);\r\n }\r\n }\r\n },\r\n {\r\n id: 'zoom-out',\r\n icon: 'zoom-out',\r\n label: 'Zoom Out',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomOut?.()\r\n },\r\n {\r\n id: 'zoom-in',\r\n icon: 'zoom-in',\r\n label: 'Zoom In',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomIn?.()\r\n },\r\n {\r\n id: 'fit-page',\r\n icon: 'fit-page',\r\n label: 'Fit to Slide',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.fitToPage?.()\r\n },\r\n {\r\n id: 'reset-zoom',\r\n icon: 'reset-zoom',\r\n label: 'Reset Zoom',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.resetZoom?.()\r\n },\r\n {\r\n id: 'rotate-cw',\r\n icon: 'rotate-cw',\r\n label: 'Rotate',\r\n type: 'button',\r\n group: 'view',\r\n execute: () => instance.rotateCW?.()\r\n },\r\n {\r\n id: 'download',\r\n icon: 'download',\r\n label: 'Download PPTX',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => instance.download?.()\r\n },\r\n {\r\n id: 'print',\r\n icon: 'print',\r\n label: 'Print Presentation',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => instance.print?.()\r\n }\r\n ];\r\n }\r\n\r\n async render(ctx: RenderContext): Promise<PreviewInstance> {\r\n const renderer = new PptxRenderer();\r\n await renderer.load(ctx.buffer);\r\n\r\n const slideCount = (renderer as any).slidePaths?.length || 1;\r\n let currentSlide = 1;\r\n let scale = 1.0;\r\n let rotation = 0;\r\n\r\n const wrapper = document.createElement('div');\r\n wrapper.className = 'fp-pptx-wrapper';\r\n wrapper.style.cssText = `\r\n width: 100%;\r\n height: 100%;\r\n overflow: auto;\r\n display: flex;\r\n justify-content: center;\r\n align-items: flex-start;\r\n padding: 24px;\r\n box-sizing: border-box;\r\n background: var(--fp-bg-canvas, #525659);\r\n `;\r\n\r\n const slideContainer = document.createElement('div');\r\n slideContainer.className = 'fp-slide-container';\r\n slideContainer.style.cssText = `\r\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.25);\r\n border-radius: 4px;\r\n overflow: hidden;\r\n background: #ffffff;\r\n transform-origin: top center;\r\n transition: transform 0.2s ease;\r\n max-width: calc(100% - 32px);\r\n max-height: calc(100% - 48px);\r\n `;\r\n\r\n const canvas = document.createElement('canvas');\r\n slideContainer.appendChild(canvas);\r\n wrapper.appendChild(slideContainer);\r\n\r\n ctx.container.innerHTML = '';\r\n ctx.container.style.overflow = 'auto';\r\n ctx.container.appendChild(wrapper);\r\n\r\n const calculateFitScale = () => {\r\n const availW = Math.max(200, ctx.container.clientWidth - 48);\r\n const availH = Math.max(200, ctx.container.clientHeight - 72);\r\n const cW = canvas.offsetWidth || 1280;\r\n const cH = canvas.offsetHeight || 720;\r\n return Math.min(1.0, Math.min(availW / cW, availH / cH));\r\n };\r\n\r\n const applyTransform = () => {\r\n slideContainer.style.transform = `scale(${scale}) rotate(${rotation}deg)`;\r\n };\r\n\r\n const renderCurrentSlide = async () => {\r\n try {\r\n await renderer.renderSlide(currentSlide - 1, canvas, 1280);\r\n ctx.emit('page-change', { page: currentSlide, totalPages: slideCount });\r\n scale = calculateFitScale();\r\n applyTransform();\r\n } catch (err) {\r\n console.error('[PptxPlugin] Failed to render slide:', err);\r\n }\r\n };\r\n\r\n await renderCurrentSlide();\r\n\r\n const cleanup = () => {\r\n renderer.destroy();\r\n wrapper.remove();\r\n ctx.container.innerHTML = '';\r\n };\r\n\r\n ctx.signal.addEventListener('abort', cleanup);\r\n\r\n const instance: PreviewInstance = {\r\n destroy: cleanup,\r\n goToPage: (page: number) => {\r\n if (page >= 1 && page <= slideCount) {\r\n currentSlide = page;\r\n renderCurrentSlide();\r\n }\r\n },\r\n getPageCount: () => slideCount,\r\n getCurrentPage: () => currentSlide,\r\n zoomIn: () => {\r\n scale += 0.15;\r\n applyTransform();\r\n },\r\n zoomOut: () => {\r\n scale = Math.max(0.2, scale - 0.15);\r\n applyTransform();\r\n },\r\n getZoom: () => scale,\r\n setZoom: (level: number) => {\r\n scale = level;\r\n applyTransform();\r\n },\r\n fitToPage: () => {\r\n scale = calculateFitScale();\r\n rotation = 0;\r\n applyTransform();\r\n },\r\n resetZoom: () => {\r\n scale = calculateFitScale();\r\n rotation = 0;\r\n wrapper.scrollTop = 0;\r\n wrapper.scrollLeft = 0;\r\n applyTransform();\r\n },\r\n rotateCW: () => {\r\n rotation = (rotation + 90) % 360;\r\n applyTransform();\r\n },\r\n rotateCCW: () => {\r\n rotation = (rotation - 90 + 360) % 360;\r\n applyTransform();\r\n },\r\n getThumbnails: (): Thumbnail[] => {\r\n const list: Thumbnail[] = [];\r\n for (let i = 0; i < slideCount; i++) {\r\n const slideIdx = i;\r\n list.push({\r\n index: slideIdx,\r\n label: `Slide ${slideIdx + 1}`,\r\n render: async (thumbCanvas: HTMLCanvasElement) => {\r\n await renderer.renderSlide(slideIdx, thumbCanvas, 240);\r\n }\r\n });\r\n }\r\n return list;\r\n },\r\n download: () => {\r\n downloadFile(\r\n ctx.buffer,\r\n ctx.metadata.name || 'presentation.pptx',\r\n this.mimeTypes[0]\r\n );\r\n },\r\n print: () => {\r\n window.print();\r\n }\r\n };\r\n\r\n return instance;\r\n }\r\n}\r\n\r\nexport function pptxPlugin(): PptxPlugin {\r\n return new PptxPlugin();\r\n}\r\n\r\nexport default PptxPlugin;\r\n","import type { \r\n FileInfo, \r\n RenderContext, \r\n ToolbarAction, \r\n PreviewPlugin, \r\n PreviewInstance \r\n} from '@patel.sumit51/core';\r\nimport { downloadFile } from '@patel.sumit51/core';\r\nimport * as THREE from 'three';\r\nimport { STLLoader } from 'three/examples/jsm/loaders/STLLoader.js';\r\nimport { OBJLoader } from 'three/examples/jsm/loaders/OBJLoader.js';\r\nimport { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';\r\n\r\nexport class ThreeDPlugin implements PreviewPlugin {\r\n id = '3d';\r\n name = '3D Model Preview';\r\n extensions = ['.stl', '.obj'];\r\n mimeTypes = ['model/stl', 'model/obj', 'application/sla', 'text/plain'];\r\n weight = 75;\r\n\r\n supports(file: FileInfo): boolean {\r\n const ext = file.metadata.extension?.toLowerCase();\r\n return ext === '.stl' || ext === '.obj';\r\n }\r\n\r\n getToolbarActions(instance: PreviewInstance): ToolbarAction[] {\r\n return [\r\n {\r\n id: 'zoom-out',\r\n icon: 'zoom-out',\r\n label: 'Zoom Out',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomOut?.()\r\n },\r\n {\r\n id: 'zoom-in',\r\n icon: 'zoom-in',\r\n label: 'Zoom In',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomIn?.()\r\n },\r\n {\r\n id: 'fit-page',\r\n icon: 'fit-page',\r\n label: 'Reset Camera View',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.fitToPage?.()\r\n },\r\n {\r\n id: 'reset-zoom',\r\n icon: 'reset-zoom',\r\n label: 'Reset Zoom',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.resetZoom?.()\r\n },\r\n {\r\n id: 'rotate-cw',\r\n icon: 'rotate-cw',\r\n label: 'Toggle Wireframe',\r\n type: 'button',\r\n group: 'view',\r\n execute: () => instance.rotateCW?.()\r\n },\r\n {\r\n id: 'download',\r\n icon: 'download',\r\n label: 'Download 3D Model',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => instance.download?.()\r\n }\r\n ];\r\n }\r\n\r\n async render(ctx: RenderContext): Promise<PreviewInstance> {\r\n const container = ctx.container;\r\n container.innerHTML = '';\r\n container.style.overflow = 'hidden';\r\n container.style.position = 'relative';\r\n container.style.width = '100%';\r\n container.style.height = '100%';\r\n container.style.background = '#1a1a1a';\r\n\r\n const width = container.clientWidth || 800;\r\n const height = container.clientHeight || 600;\r\n\r\n // 1. Setup Scene, Camera, Renderer\r\n const scene = new THREE.Scene();\r\n scene.background = new THREE.Color(0x1e1e24);\r\n\r\n const camera = new THREE.PerspectiveCamera(45, width / height, 0.1, 2000);\r\n const renderer = new THREE.WebGLRenderer({ antialias: true });\r\n renderer.setSize(width, height);\r\n renderer.setPixelRatio(window.devicePixelRatio);\r\n renderer.shadowMap.enabled = true;\r\n container.appendChild(renderer.domElement);\r\n\r\n // 2. Setup OrbitControls\r\n const controls = new OrbitControls(camera, renderer.domElement);\r\n controls.enableDamping = true;\r\n controls.dampingFactor = 0.05;\r\n\r\n // 3. Add Lights\r\n const ambientLight = new THREE.AmbientLight(0xffffff, 0.8);\r\n scene.add(ambientLight);\r\n\r\n const dirLight1 = new THREE.DirectionalLight(0xffffff, 1.2);\r\n dirLight1.position.set(100, 200, 100);\r\n scene.add(dirLight1);\r\n\r\n const dirLight2 = new THREE.DirectionalLight(0xffffff, 0.6);\r\n dirLight2.position.set(-100, -100, -100);\r\n scene.add(dirLight2);\r\n\r\n // 4. Add Grid Helper\r\n const grid = new THREE.GridHelper(200, 20, 0x444444, 0x222222);\r\n scene.add(grid);\r\n\r\n // 5. Load and center 3D Model\r\n let meshGroup = new THREE.Group();\r\n let isWireframe = false;\r\n const ext = ctx.metadata.extension?.toLowerCase();\r\n\r\n const materials: THREE.Material[] = [];\r\n\r\n if (ext === '.stl') {\r\n const loader = new STLLoader();\r\n const geometry = loader.parse(ctx.buffer);\r\n geometry.computeVertexNormals();\r\n geometry.center();\r\n\r\n const material = new THREE.MeshStandardMaterial({\r\n color: 0x3b82f6,\r\n roughness: 0.4,\r\n metalness: 0.2\r\n });\r\n materials.push(material);\r\n\r\n const mesh = new THREE.Mesh(geometry, material);\r\n meshGroup.add(mesh);\r\n } else if (ext === '.obj') {\r\n const loader = new OBJLoader();\r\n const text = new TextDecoder().decode(ctx.buffer);\r\n const obj = loader.parse(text);\r\n\r\n obj.traverse((child) => {\r\n if ((child as THREE.Mesh).isMesh) {\r\n const m = child as THREE.Mesh;\r\n m.geometry.computeVertexNormals();\r\n const mat = new THREE.MeshStandardMaterial({\r\n color: 0x10b981,\r\n roughness: 0.5,\r\n metalness: 0.1\r\n });\r\n materials.push(mat);\r\n m.material = mat;\r\n }\r\n });\r\n meshGroup.add(obj);\r\n }\r\n\r\n scene.add(meshGroup);\r\n\r\n // 6. Compute bounding box to frame camera nicely\r\n const box = new THREE.Box3().setFromObject(meshGroup);\r\n const sphere = box.getBoundingSphere(new THREE.Sphere());\r\n const radius = Math.max(sphere.radius, 10);\r\n\r\n const fitCamera = () => {\r\n camera.position.set(radius * 1.5, radius * 1.2, radius * 2);\r\n camera.lookAt(0, 0, 0);\r\n controls.target.set(0, 0, 0);\r\n controls.update();\r\n };\r\n\r\n fitCamera();\r\n\r\n // 7. Animation Loop\r\n let animId: number;\r\n const animate = () => {\r\n animId = requestAnimationFrame(animate);\r\n controls.update();\r\n renderer.render(scene, camera);\r\n };\r\n animate();\r\n\r\n // 8. Handle Resize\r\n const resizeObserver = new ResizeObserver(() => {\r\n const newWidth = container.clientWidth || 800;\r\n const newHeight = container.clientHeight || 600;\r\n camera.aspect = newWidth / newHeight;\r\n camera.updateProjectionMatrix();\r\n renderer.setSize(newWidth, newHeight);\r\n });\r\n resizeObserver.observe(container);\r\n\r\n const cleanup = () => {\r\n cancelAnimationFrame(animId);\r\n resizeObserver.disconnect();\r\n controls.dispose();\r\n renderer.dispose();\r\n materials.forEach(m => m.dispose());\r\n meshGroup.traverse((child) => {\r\n if ((child as THREE.Mesh).geometry) {\r\n (child as THREE.Mesh).geometry.dispose();\r\n }\r\n });\r\n container.innerHTML = '';\r\n };\r\n\r\n ctx.signal.addEventListener('abort', cleanup);\r\n\r\n return {\r\n destroy: cleanup,\r\n zoomIn: () => {\r\n camera.position.multiplyScalar(0.85);\r\n controls.update();\r\n },\r\n zoomOut: () => {\r\n camera.position.multiplyScalar(1.15);\r\n controls.update();\r\n },\r\n fitToPage: fitCamera,\r\n resetZoom: fitCamera,\r\n rotateCW: () => {\r\n isWireframe = !isWireframe;\r\n materials.forEach(m => {\r\n (m as THREE.MeshStandardMaterial).wireframe = isWireframe;\r\n });\r\n },\r\n download: () => {\r\n downloadFile(ctx.buffer, ctx.metadata.name || `model${ext || '.stl'}`);\r\n }\r\n };\r\n }\r\n}\r\n\r\nexport function threeDPlugin(): ThreeDPlugin {\r\n return new ThreeDPlugin();\r\n}\r\n\r\nexport default ThreeDPlugin;\r\n","import type { \r\n FileInfo, \r\n RenderContext, \r\n ToolbarAction, \r\n PreviewPlugin, \r\n PreviewInstance,\r\n Thumbnail\r\n} from '@patel.sumit51/core';\r\n// @ts-ignore - rtf.js bundle has no individual d.ts\r\nimport * as RTFJS from 'rtf.js/dist/RTFJS.bundle.js';\r\n\r\ninterface ParsedRtfTable {\r\n id: string;\r\n rows: string[][];\r\n colPercents: number[];\r\n}\r\n\r\nfunction cleanRtfText(raw: string): string {\r\n return raw\r\n .replace(/\\\\bin\\d+\\s/g, '')\r\n .replace(/{\\\\\\*[^}]+}/g, '')\r\n .replace(/\\\\u(-?\\d+)\\??/g, (_, code) => {\r\n let num = parseInt(code, 10);\r\n if (num < 0) num += 65536;\r\n return String.fromCharCode(num);\r\n })\r\n .replace(/\\\\'([0-9a-fA-F]{2})/g, (_, hex) => {\r\n return String.fromCharCode(parseInt(hex, 16));\r\n })\r\n .replace(/\\\\tab\\b/g, ' ')\r\n .replace(/\\\\emdash\\b/g, '—')\r\n .replace(/\\\\endash\\b/g, '–')\r\n .replace(/\\\\bullet\\b/g, '•')\r\n .replace(/\\\\lquote\\b/g, '‘')\r\n .replace(/\\\\rquote\\b/g, '’')\r\n .replace(/\\\\ldblquote\\b/g, '“')\r\n .replace(/\\\\rdblquote\\b/g, '”')\r\n .replace(/\\\\[a-zA-Z]+-?\\d*\\s?/g, ' ')\r\n .replace(/[{}\\r\\n]/g, ' ')\r\n .replace(/\\s+/g, ' ')\r\n .trim();\r\n}\r\n\r\nfunction parseRtfTables(rtfText: string): ParsedRtfTable[] {\r\n const rowSegments = rtfText.split(/\\\\row\\b/);\r\n if (rowSegments.length <= 1) return [];\r\n\r\n interface RawTable {\r\n id: string;\r\n startPos: number;\r\n lastEnd: number;\r\n rows: { cells: string[]; widths: number[] }[];\r\n columnWidths: number[];\r\n }\r\n\r\n const rawTables: RawTable[] = [];\r\n let currentTable: RawTable | null = null;\r\n let charOffset = 0;\r\n\r\n for (let i = 0; i < rowSegments.length - 1; i++) {\r\n const segment = rowSegments[i];\r\n const segmentStart = charOffset;\r\n const segmentEnd = charOffset + segment.length + 4; // + \\row\r\n\r\n const cellParts = segment.split(/\\\\cell\\b/);\r\n if (cellParts.length > 1) {\r\n const cellxMatches = [...segment.matchAll(/\\\\cellx(\\d+)/g)].map(m => parseInt(m[1], 10));\r\n let cellWidths: number[] = [];\r\n if (cellxMatches.length > 0) {\r\n let seq = [cellxMatches[0]];\r\n for (let k = 1; k < cellxMatches.length; k++) {\r\n if (cellxMatches[k] > cellxMatches[k - 1]) seq.push(cellxMatches[k]);\r\n else break;\r\n }\r\n let prev = 0;\r\n cellWidths = seq.map(x => {\r\n const w = x - prev;\r\n prev = x;\r\n return w;\r\n });\r\n }\r\n\r\n const cells: string[] = [];\r\n for (let c = 0; c < cellParts.length - 1; c++) {\r\n let rawCell = cellParts[c];\r\n if (c === 0) {\r\n const lastTrowd = rawCell.lastIndexOf('\\\\trowd');\r\n if (lastTrowd !== -1) rawCell = rawCell.slice(lastTrowd);\r\n }\r\n cells.push(cleanRtfText(rawCell));\r\n }\r\n\r\n const isNewTable = !currentTable || (segmentStart - currentTable.lastEnd > 2500);\r\n if (isNewTable) {\r\n currentTable = {\r\n id: `RTF_TABLE_${rawTables.length}`,\r\n startPos: segmentStart,\r\n lastEnd: segmentEnd,\r\n rows: [],\r\n columnWidths: cellWidths\r\n };\r\n rawTables.push(currentTable);\r\n }\r\n\r\n if (currentTable) {\r\n currentTable.rows.push({\r\n cells,\r\n widths: cellWidths.length === cells.length ? cellWidths : currentTable.columnWidths\r\n });\r\n currentTable.lastEnd = segmentEnd;\r\n }\r\n }\r\n\r\n charOffset += segment.length + 4;\r\n }\r\n\r\n return rawTables.map(tbl => {\r\n const totalW = (tbl.columnWidths || []).reduce((a, b) => a + b, 0);\r\n const colPercents = totalW > 0\r\n ? tbl.columnWidths.map(w => Math.round((w / totalW) * 100))\r\n : [];\r\n\r\n return {\r\n id: tbl.id,\r\n rows: tbl.rows.map(r => r.cells),\r\n colPercents\r\n };\r\n });\r\n}\r\n\r\nfunction renderRtfTableElement(table: ParsedRtfTable): HTMLElement {\r\n const tableEl = document.createElement('table');\r\n tableEl.className = 'fp-rtf-table';\r\n tableEl.style.width = '100%';\r\n tableEl.style.borderCollapse = 'collapse';\r\n tableEl.style.margin = '16px 0 20px';\r\n tableEl.style.fontSize = '10pt';\r\n tableEl.style.lineHeight = '1.5';\r\n tableEl.style.border = '1px solid #cbd5e1';\r\n tableEl.style.backgroundColor = '#ffffff';\r\n\r\n const thead = document.createElement('thead');\r\n const tbody = document.createElement('tbody');\r\n\r\n table.rows.forEach((rowCells, rIdx) => {\r\n const tr = document.createElement('tr');\r\n const isHeader = rIdx === 0;\r\n\r\n if (isHeader) {\r\n tr.style.backgroundColor = '#f8fafc';\r\n }\r\n\r\n rowCells.forEach((cellText, cIdx) => {\r\n const cellEl = document.createElement(isHeader ? 'th' : 'td');\r\n cellEl.style.padding = '8px 12px';\r\n cellEl.style.border = '1px solid #cbd5e1';\r\n cellEl.style.verticalAlign = 'top';\r\n\r\n if (table.colPercents && table.colPercents[cIdx]) {\r\n cellEl.style.width = `${table.colPercents[cIdx]}%`;\r\n }\r\n\r\n if (/^\\d+$/.test(cellText.trim()) || cellText.trim() === '#') {\r\n cellEl.style.textAlign = 'center';\r\n }\r\n\r\n cellEl.textContent = cellText;\r\n tr.appendChild(cellEl);\r\n });\r\n\r\n if (isHeader) {\r\n thead.appendChild(tr);\r\n } else {\r\n tbody.appendChild(tr);\r\n }\r\n });\r\n\r\n tableEl.appendChild(thead);\r\n tableEl.appendChild(tbody);\r\n return tableEl;\r\n}\r\n\r\nfunction isHeadingElement(el: HTMLElement): boolean {\r\n if (['H1', 'H2', 'H3', 'H4'].includes(el.tagName)) return true;\r\n const spans = el.querySelectorAll ? Array.from(el.querySelectorAll('span, b, strong, div')) : [];\r\n for (const s of spans) {\r\n const hEl = s as HTMLElement;\r\n const fs = parseFloat(hEl.style.fontSize) || 0;\r\n const isBold = hEl.style.fontWeight === 'bold' || parseInt(hEl.style.fontWeight, 10) >= 600 || ['B', 'STRONG'].includes(hEl.tagName);\r\n if (isBold && fs >= 14) return true;\r\n }\r\n const elFs = parseFloat(el.style.fontSize) || 0;\r\n const elBold = el.style.fontWeight === 'bold' || parseInt(el.style.fontWeight, 10) >= 600;\r\n if (elBold && elFs >= 14) return true;\r\n return false;\r\n}\r\n\r\nexport class RtfPlugin implements PreviewPlugin {\r\n id = 'rtf';\r\n name = 'Rich Text Format (RTF)';\r\n extensions = ['.rtf'];\r\n mimeTypes = ['text/rtf', 'application/rtf'];\r\n weight = 80;\r\n\r\n supports(file: FileInfo): boolean {\r\n const ext = file.metadata.extension?.toLowerCase();\r\n const mime = file.metadata.mimeType?.toLowerCase();\r\n return this.extensions.includes(ext || '') || this.mimeTypes.includes(mime || '');\r\n }\r\n\r\n getToolbarActions(instance: PreviewInstance): ToolbarAction[] {\r\n const totalPages = instance.getPageCount?.() ?? 1;\r\n const actions: ToolbarAction[] = [];\r\n\r\n actions.push({\r\n id: 'page-nav',\r\n icon: '',\r\n label: 'Page Navigation',\r\n type: 'page-nav',\r\n group: 'navigation',\r\n value: instance.getCurrentPage?.() ?? 1,\r\n max: totalPages,\r\n execute: (action: unknown, page?: unknown) => {\r\n const cur = instance.getCurrentPage?.() ?? 1;\r\n const max = instance.getPageCount?.() ?? 1;\r\n if (action === 'prev') {\r\n if (cur > 1) instance.goToPage?.(cur - 1);\r\n } else if (action === 'next') {\r\n if (cur < max) instance.goToPage?.(cur + 1);\r\n } else if (typeof page === 'number') {\r\n instance.goToPage?.(page);\r\n }\r\n }\r\n });\r\n\r\n actions.push(\r\n {\r\n id: 'thumbnails',\r\n icon: 'thumbnails',\r\n label: 'Thumbnails',\r\n type: 'button',\r\n group: 'view',\r\n execute: () => (instance as any).toggleThumbnails?.()\r\n },\r\n {\r\n id: 'zoom-out',\r\n icon: 'zoom-out',\r\n label: 'Zoom Out',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomOut?.()\r\n },\r\n {\r\n id: 'zoom-in',\r\n icon: 'zoom-in',\r\n label: 'Zoom In',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomIn?.()\r\n },\r\n {\r\n id: 'fit-page',\r\n icon: 'fit-page',\r\n label: 'Fit to Page',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.fitToPage?.()\r\n },\r\n {\r\n id: 'reset-zoom',\r\n icon: 'reset-zoom',\r\n label: 'Reset Zoom',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.resetZoom?.()\r\n },\r\n {\r\n id: 'rotate-cw',\r\n icon: 'rotate-cw',\r\n label: 'Rotate',\r\n type: 'button',\r\n group: 'view',\r\n execute: () => instance.rotateCW?.()\r\n },\r\n {\r\n id: 'download',\r\n icon: 'download',\r\n label: 'Download',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => instance.download?.()\r\n },\r\n {\r\n id: 'copy',\r\n icon: 'copy',\r\n label: 'Copy Text',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => (instance as any).copy?.()\r\n },\r\n {\r\n id: 'print',\r\n icon: 'print',\r\n label: 'Print',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => instance.print?.()\r\n },\r\n {\r\n id: 'open-window',\r\n icon: 'open-window',\r\n label: 'Open in Separate Full Window',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => (instance as any).openInSeparateWindow?.()\r\n }\r\n );\r\n\r\n return actions;\r\n }\r\n\r\n async render(ctx: RenderContext): Promise<PreviewInstance> {\r\n const rawRtf = new TextDecoder('latin1').decode(ctx.buffer);\r\n\r\n // --- 1. DYNAMIC PAGE SETUP FROM RTF STREAM ---\r\n const paperwMatch = rawRtf.match(/\\\\paperw(\\d+)/);\r\n const paperhMatch = rawRtf.match(/\\\\paperh(\\d+)/);\r\n const marglMatch = rawRtf.match(/\\\\margl(\\d+)/);\r\n const margrMatch = rawRtf.match(/\\\\margr(\\d+)/);\r\n const margtMatch = rawRtf.match(/\\\\margt(\\d+)/);\r\n const margbMatch = rawRtf.match(/\\\\margb(\\d+)/);\r\n\r\n const paperwTwips = paperwMatch ? parseInt(paperwMatch[1], 10) : 11906;\r\n const paperhTwips = paperhMatch ? parseInt(paperhMatch[1], 10) : 16838;\r\n const marglTwips = marglMatch ? parseInt(marglMatch[1], 10) : 1134;\r\n const margrTwips = margrMatch ? parseInt(margrMatch[1], 10) : 1134;\r\n const margtTwips = margtMatch ? parseInt(margtMatch[1], 10) : 1134;\r\n const margbTwips = margbMatch ? parseInt(margbMatch[1], 10) : 1134;\r\n\r\n const pageWidth = Math.round(paperwTwips / 15);\r\n const pageHeight = Math.round(paperhTwips / 15);\r\n const padLeft = Math.round(marglTwips / 15);\r\n const padRight = Math.round(margrTwips / 15);\r\n const padTop = Math.round(margtTwips / 15);\r\n const padBottom = Math.round(margbTwips / 15);\r\n const printableHeight = pageHeight - padTop - padBottom;\r\n\r\n // --- 2. DYNAMIC RAW IMAGE EXTRACTION ---\r\n const extractedImages: { mime: string; dataUrl: string; offset: number }[] = [];\r\n let p = 0;\r\n while ((p = rawRtf.indexOf('\\\\pict', p)) !== -1) {\r\n const startP = p;\r\n p += 5;\r\n const header = rawRtf.substring(startP, startP + 600);\r\n let mime = '';\r\n let magic = '';\r\n if (header.includes('\\\\pngblip')) {\r\n mime = 'image/png';\r\n magic = '89504e47';\r\n } else if (header.includes('\\\\jpegblip')) {\r\n mime = 'image/jpeg';\r\n magic = 'ffd8ff';\r\n }\r\n if (!mime || !magic) continue;\r\n const magicPos = rawRtf.indexOf(magic, startP);\r\n if (magicPos === -1 || magicPos - startP > 3000) continue;\r\n let endP = magicPos;\r\n while (endP < rawRtf.length && /[0-9a-fA-F\\r\\n\\s]/.test(rawRtf[endP])) {\r\n endP++;\r\n }\r\n const cleanHex = rawRtf.substring(magicPos, endP).replace(/[\\r\\n\\s]/g, '');\r\n if (cleanHex.length < 100) continue;\r\n const hexLen = cleanHex.length / 2;\r\n const u8 = new Uint8Array(hexLen);\r\n for (let k = 0; k < hexLen; k++) {\r\n u8[k] = parseInt(cleanHex.substr(k * 2, 2), 16);\r\n }\r\n let bStr = '';\r\n for (let k = 0; k < u8.length; k += 8192) {\r\n bStr += String.fromCharCode.apply(null, Array.from(u8.subarray(k, k + 8192)));\r\n }\r\n extractedImages.push({ mime, dataUrl: `data:${mime};base64,${btoa(bStr)}`, offset: startP });\r\n }\r\n\r\n // --- 3. PARSE DYNAMIC TABLES ---\r\n const tables = parseRtfTables(rawRtf);\r\n\r\n const wrapper = document.createElement('div');\r\n wrapper.className = 'fp-rtf-wrapper';\r\n wrapper.style.padding = '0';\r\n wrapper.style.width = `${pageWidth}px`;\r\n wrapper.style.margin = '0 auto';\r\n wrapper.style.boxSizing = 'border-box';\r\n wrapper.style.display = 'flex';\r\n wrapper.style.flexDirection = 'column';\r\n wrapper.style.alignItems = 'center';\r\n wrapper.style.backgroundColor = 'transparent';\r\n wrapper.style.transformOrigin = 'top center';\r\n wrapper.style.transition = 'transform 0.15s ease';\r\n\r\n ctx.container.style.overflowX = 'hidden';\r\n ctx.container.style.overflowY = 'auto';\r\n ctx.container.style.padding = '16px 8px';\r\n ctx.container.style.backgroundColor = '#f1f5f9';\r\n ctx.container.appendChild(wrapper);\r\n\r\n let scale = 1.0;\r\n let rotation = 0;\r\n let pageElements: HTMLElement[] = [];\r\n let isUserZoomed = false;\r\n let fitMode: 'width' | 'page' = ((ctx as any)?.options?.fitMode as any) || 'width';\r\n\r\n const calculateFitScale = (mode: 'width' | 'page' = fitMode) => {\r\n const elW = pageWidth;\r\n const singlePageH = pageHeight;\r\n const availW = Math.max(280, ctx.container.clientWidth - 32);\r\n const availH = Math.max(280, ctx.container.clientHeight - 32);\r\n\r\n const sW = availW / elW;\r\n const sH = availH / singlePageH;\r\n\r\n if (mode === 'page') {\r\n return Math.max(0.35, Math.min(3.0, Math.min(sW, sH)));\r\n }\r\n return Math.max(0.4, Math.min(3.0, sW));\r\n };\r\n\r\n const applyTransform = () => {\r\n wrapper.style.transform = `scale(${scale}) rotate(${rotation}deg)`;\r\n wrapper.style.transformOrigin = 'top center';\r\n const baseH = pageHeight;\r\n const scaledH = baseH * scale;\r\n const extraH = Math.max(0, scaledH - baseH);\r\n wrapper.style.marginBottom = `${extraH + 32}px`;\r\n };\r\n\r\n const resizeObserver = typeof ResizeObserver !== 'undefined'\r\n ? new ResizeObserver(() => {\r\n if (!isUserZoomed) {\r\n scale = calculateFitScale(fitMode);\r\n applyTransform();\r\n }\r\n })\r\n : null;\r\n resizeObserver?.observe(ctx.container);\r\n\r\n setTimeout(() => {\r\n scale = calculateFitScale(fitMode);\r\n applyTransform();\r\n }, 60);\r\n\r\n try {\r\n if (typeof (RTFJS as any).loggingEnabled === 'function') {\r\n (RTFJS as any).loggingEnabled(false);\r\n }\r\n\r\n // Render document with RTFJS\r\n const doc = new (RTFJS as any).Document(ctx.buffer, {\r\n onPicture: (isLegacy: boolean | null, createPic: () => HTMLElement) => {\r\n if (isLegacy === true) return null;\r\n return createPic();\r\n }\r\n });\r\n const elements: HTMLElement[] = await doc.render();\r\n\r\n // Replace [Unsupported image format] with extracted high-res raw images\r\n let unsupportedIndex = 1;\r\n const usedTables = new Set<number>();\r\n\r\n for (let i = 0; i < elements.length; i++) {\r\n const el = elements[i];\r\n const text = el.textContent || '';\r\n\r\n if (text.includes('[Unsupported image format]')) {\r\n if (extractedImages[unsupportedIndex]) {\r\n const img = document.createElement('img');\r\n img.src = extractedImages[unsupportedIndex].dataUrl;\r\n img.style.width = '100%';\r\n img.style.height = 'auto';\r\n img.style.maxHeight = '430px';\r\n img.style.objectFit = 'contain';\r\n img.style.display = 'block';\r\n img.style.margin = '12px auto';\r\n el.innerHTML = '';\r\n el.appendChild(img);\r\n unsupportedIndex++;\r\n }\r\n }\r\n\r\n // Replace flattened table elements at their natural position\r\n if (tables.length > 0) {\r\n for (let t = 0; t < tables.length; t++) {\r\n if (usedTables.has(t)) continue;\r\n const tbl = tables[t];\r\n if (tbl.rows.length >= 2) {\r\n const sampleCell1 = tbl.rows[1]?.[1] || tbl.rows[0]?.[1] || '';\r\n const sampleCell2 = tbl.rows[2]?.[1] || tbl.rows[1]?.[0] || '';\r\n const match1 = sampleCell1 && text.includes(sampleCell1.slice(0, 15).trim());\r\n const match2 = sampleCell2 && text.includes(sampleCell2.slice(0, 15).trim());\r\n if (match1 && match2) {\r\n el.innerHTML = '';\r\n el.appendChild(renderRtfTableElement(tbl));\r\n usedTables.add(t);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Constrain SVGs and images to standard page boundaries and aspect ratio\r\n elements.forEach(el => {\r\n const svgs = el.querySelectorAll ? Array.from(el.querySelectorAll('svg')) : [];\r\n svgs.forEach(svg => {\r\n svg.removeAttribute('width');\r\n svg.removeAttribute('height');\r\n svg.style.maxWidth = '100%';\r\n svg.style.maxHeight = '430px';\r\n svg.style.height = 'auto';\r\n svg.style.display = 'block';\r\n svg.style.margin = '12px auto';\r\n });\r\n const imgs = el.querySelectorAll ? Array.from(el.querySelectorAll('img')) : [];\r\n imgs.forEach(img => {\r\n img.style.maxWidth = '100%';\r\n img.style.maxHeight = '430px';\r\n img.style.height = 'auto';\r\n img.style.objectFit = 'contain';\r\n img.style.display = 'block';\r\n img.style.margin = '12px auto';\r\n });\r\n });\r\n\r\n // Await all image decodes for exact geometry measurement\r\n const allImgs = Array.from(document.querySelectorAll('img')).concat(\r\n elements.flatMap(el => Array.from(el.querySelectorAll ? el.querySelectorAll('img') : []))\r\n );\r\n await Promise.all(allImgs.map(img => {\r\n if (img.complete && img.naturalHeight > 0) return Promise.resolve();\r\n if (img.decode) return img.decode().catch(() => {});\r\n return new Promise(r => { img.onload = r as any; img.onerror = r as any; });\r\n }));\r\n\r\n // Format bullet items\r\n elements.forEach(el => {\r\n const text = el.textContent || '';\r\n if (text.includes('\\uf0b7')) {\r\n const cleanText = text.replace(/^[\\s\\uf0b7\\t]+/, '');\r\n el.style.display = 'flex';\r\n el.style.alignItems = 'flex-start';\r\n el.style.margin = '6px 0 6px 28px';\r\n el.style.fontSize = '11pt';\r\n el.style.lineHeight = '1.5';\r\n el.innerHTML = `<span style=\"margin-right:10px; user-select:none;\">□</span><span>${cleanText}</span>`;\r\n }\r\n });\r\n\r\n // Apply typography styles\r\n elements.forEach(el => {\r\n const text = (el.textContent || '').trim();\r\n const hasMedia = el.querySelector('img, svg, canvas, table') !== null || ['IMG', 'SVG', 'TABLE'].includes(el.tagName);\r\n if (isHeadingElement(el)) {\r\n el.style.marginTop = '20px';\r\n el.style.marginBottom = '10px';\r\n el.style.lineHeight = '1.25';\r\n } else if (text.length > 0 && !hasMedia) {\r\n el.style.marginBottom = '12px';\r\n el.style.lineHeight = '1.45';\r\n }\r\n });\r\n\r\n // --- 4. MEASURE & DYNAMICALLY LAYOUT ---\r\n const measureCard = document.createElement('div');\r\n measureCard.style.width = `${pageWidth}px`;\r\n measureCard.style.padding = `${padTop}px ${padRight}px ${padBottom}px ${padLeft}px`;\r\n measureCard.style.boxSizing = 'border-box';\r\n measureCard.style.fontFamily = 'Calibri, \"Segoe UI\", Arial, sans-serif';\r\n measureCard.style.lineHeight = '1.45';\r\n measureCard.style.visibility = 'hidden';\r\n measureCard.style.position = 'absolute';\r\n measureCard.style.top = '-99999px';\r\n document.body.appendChild(measureCard);\r\n\r\n const createPageCard = (num: number) => {\r\n const card = document.createElement('div');\r\n card.className = 'fp-rtf-page-card';\r\n card.setAttribute('data-page-number', String(num));\r\n card.style.backgroundColor = '#ffffff';\r\n card.style.boxShadow = '0 4px 24px rgba(0,0,0,0.08), 0 1px 3px rgba(0,0,0,0.04)';\r\n card.style.borderRadius = '4px';\r\n card.style.width = `${pageWidth}px`;\r\n card.style.height = `${pageHeight}px`;\r\n card.style.padding = `${padTop}px ${padRight}px ${padBottom}px ${padLeft}px`;\r\n card.style.boxSizing = 'border-box';\r\n card.style.overflow = 'hidden';\r\n card.style.marginBottom = '24px';\r\n card.style.color = '#1e293b';\r\n card.style.fontFamily = 'Calibri, \"Segoe UI\", Arial, sans-serif';\r\n card.style.lineHeight = '1.45';\r\n card.style.position = 'relative';\r\n card.style.textAlign = 'left';\r\n return card;\r\n };\r\n\r\n const pages: HTMLElement[] = [];\r\n let curCard = createPageCard(1);\r\n pages.push(curCard);\r\n let curHeight = 0;\r\n\r\n for (let i = 0; i < elements.length; i++) {\r\n const el = elements[i];\r\n if (!el || !(el instanceof HTMLElement)) continue;\r\n\r\n const text = (el.textContent || '').trim();\r\n const hasMedia = el.querySelector('img, svg, canvas, table') !== null || ['IMG', 'SVG', 'TABLE'].includes(el.tagName);\r\n const isEmptyPar = !hasMedia && text.length === 0;\r\n\r\n if (isEmptyPar) {\r\n const emptyH = 35;\r\n if (curHeight + emptyH > printableHeight) {\r\n if (curCard.childNodes.length > 0) {\r\n curCard = createPageCard(pages.length + 1);\r\n pages.push(curCard);\r\n curHeight = 0;\r\n }\r\n }\r\n const spacer = document.createElement('div');\r\n spacer.style.height = `${emptyH}px`;\r\n curCard.appendChild(spacer);\r\n curHeight += emptyH;\r\n continue;\r\n }\r\n\r\n measureCard.innerHTML = '';\r\n const clone = el.cloneNode(true) as HTMLElement;\r\n measureCard.appendChild(clone);\r\n const compStyle = window.getComputedStyle(clone);\r\n const mt = parseFloat(compStyle.marginTop) || 0;\r\n const mb = parseFloat(compStyle.marginBottom) || 0;\r\n const elH = clone.offsetHeight + mt + mb;\r\n\r\n const isHeading = isHeadingElement(el);\r\n\r\n // Lookahead for Keep-With-Next\r\n let nextContentH = 0;\r\n if (isHeading || hasMedia) {\r\n for (let j = i + 1; j < elements.length; j++) {\r\n const nextEl = elements[j];\r\n if (nextEl && (nextEl.textContent || '').trim().length > 0) {\r\n measureCard.innerHTML = '';\r\n const nClone = nextEl.cloneNode(true) as HTMLElement;\r\n measureCard.appendChild(nClone);\r\n const nStyle = window.getComputedStyle(nClone);\r\n nextContentH = nClone.offsetHeight + (parseFloat(nStyle.marginTop) || 0) + (parseFloat(nStyle.marginBottom) || 0);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n const remainingSpace = printableHeight - curHeight;\r\n const isLargeMedia = hasMedia && elH > 300;\r\n const keepWithNextOverflow = isHeading && nextContentH > 0 && (elH + nextContentH + 20 > remainingSpace);\r\n const largeMediaOverflow = isLargeMedia && curHeight > 0 && (elH + 80 > remainingSpace);\r\n const shouldBreak = (curHeight + elH > printableHeight || keepWithNextOverflow || largeMediaOverflow) && curCard.childNodes.length > 0;\r\n\r\n if (shouldBreak) {\r\n curCard = createPageCard(pages.length + 1);\r\n pages.push(curCard);\r\n curHeight = 0;\r\n }\r\n\r\n curCard.appendChild(el);\r\n curHeight += elH;\r\n }\r\n\r\n measureCard.remove();\r\n\r\n pageElements = pages.filter(card => {\r\n const hasText = (card.textContent || '').trim().length > 0;\r\n const hasCardMedia = card.querySelector('table, img, svg, canvas') !== null;\r\n return hasText || hasCardMedia;\r\n });\r\n\r\n if (pageElements.length === 0) {\r\n pageElements = [curCard];\r\n }\r\n\r\n wrapper.innerHTML = '';\r\n pageElements.forEach((card, idx) => {\r\n card.setAttribute('data-page-number', String(idx + 1));\r\n card.style.display = idx === 0 ? 'block' : 'none';\r\n wrapper.appendChild(card);\r\n });\r\n\r\n } catch (err) {\r\n console.warn('[RtfPlugin] RTF render error, fallback text:', err);\r\n const text = rawRtf;\r\n const rawPages = text.split(/\\\\page\\b/).map(segment => {\r\n return segment.replace(/\\\\par[d]?/g, '\\n').replace(/\\\\[a-zA-Z0-9\\-]+/g, '').replace(/[{}]/g, '').trim();\r\n }).filter(p => p.length > 0);\r\n\r\n const pages = rawPages.length > 0 ? rawPages : [text.replace(/\\\\par[d]?/g, '\\n').replace(/\\\\[a-zA-Z0-9\\-]+/g, '').replace(/[{}]/g, '').trim()];\r\n \r\n for (let i = 0; i < pages.length; i++) {\r\n const pageCard = document.createElement('div');\r\n pageCard.className = 'fp-rtf-page-card';\r\n pageCard.style.backgroundColor = '#ffffff';\r\n pageCard.style.boxShadow = '0 2px 12px rgba(0,0,0,0.08)';\r\n pageCard.style.borderRadius = '4px';\r\n pageCard.style.padding = `${padTop}px ${padRight}px ${padBottom}px ${padLeft}px`;\r\n pageCard.style.width = `${pageWidth}px`;\r\n pageCard.style.minHeight = `${pageHeight}px`;\r\n pageCard.style.boxSizing = 'border-box';\r\n pageCard.style.fontFamily = 'Calibri, \"Segoe UI\", Arial, sans-serif';\r\n pageCard.style.fontSize = '12pt';\r\n pageCard.style.lineHeight = '1.6';\r\n pageCard.style.color = '#1e293b';\r\n pageCard.style.whiteSpace = 'pre-wrap';\r\n pageCard.style.display = i === 0 ? 'block' : 'none';\r\n pageCard.textContent = pages[i];\r\n\r\n if (i === 1 && tables.length > 0) {\r\n tables.forEach(tbl => pageCard.appendChild(renderRtfTableElement(tbl)));\r\n }\r\n\r\n wrapper.appendChild(pageCard);\r\n pageElements.push(pageCard);\r\n }\r\n }\r\n\r\n const totalPages = Math.max(1, pageElements.length);\r\n let currentPage = 1;\r\n\r\n const showPage = (pageNum: number) => {\r\n currentPage = Math.max(1, Math.min(totalPages, pageNum));\r\n pageElements.forEach((el, idx) => {\r\n el.style.display = idx + 1 === currentPage ? 'block' : 'none';\r\n });\r\n ctx.container.scrollTop = 0;\r\n ctx.emit('page-change', { page: currentPage, total: totalPages });\r\n };\r\n\r\n if (totalPages > 1) {\r\n showPage(1);\r\n }\r\n\r\n const cleanup = () => {\r\n resizeObserver?.disconnect();\r\n wrapper.remove();\r\n ctx.container.innerHTML = '';\r\n };\r\n\r\n ctx.signal.addEventListener('abort', cleanup);\r\n\r\n return {\r\n destroy: cleanup,\r\n getPageCount: () => totalPages,\r\n getCurrentPage: () => currentPage,\r\n goToPage: (page: number) => showPage(page),\r\n getThumbnails: async (): Promise<Thumbnail[]> => {\r\n const items: Thumbnail[] = [];\r\n for (let idx = 0; idx < totalPages; idx++) {\r\n const pageIdx = idx;\r\n items.push({\r\n index: pageIdx,\r\n label: `Page ${pageIdx + 1}`,\r\n render: async (canvas: HTMLCanvasElement) => {\r\n const ctx2d = canvas.getContext('2d');\r\n if (!ctx2d) return;\r\n canvas.width = 140;\r\n canvas.height = 180;\r\n ctx2d.fillStyle = '#ffffff';\r\n ctx2d.fillRect(0, 0, 140, 180);\r\n ctx2d.strokeStyle = '#cbd5e1';\r\n ctx2d.lineWidth = 1;\r\n ctx2d.strokeRect(0.5, 0.5, 139, 179);\r\n ctx2d.fillStyle = '#334155';\r\n ctx2d.font = 'bold 11px -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif';\r\n ctx2d.textAlign = 'center';\r\n ctx2d.fillText(`Page ${pageIdx + 1}`, 70, 95);\r\n }\r\n });\r\n }\r\n return items;\r\n },\r\n zoomIn: () => {\r\n isUserZoomed = true;\r\n scale += 0.15;\r\n applyTransform();\r\n },\r\n zoomOut: () => {\r\n isUserZoomed = true;\r\n scale = Math.max(0.2, scale - 0.15);\r\n applyTransform();\r\n },\r\n getZoom: () => scale,\r\n setZoom: (level: number) => {\r\n isUserZoomed = true;\r\n scale = level;\r\n applyTransform();\r\n },\r\n fitToPage: () => {\r\n isUserZoomed = false;\r\n fitMode = 'width';\r\n scale = calculateFitScale('width');\r\n rotation = 0;\r\n applyTransform();\r\n },\r\n resetZoom: () => {\r\n isUserZoomed = false;\r\n fitMode = 'width';\r\n scale = calculateFitScale('width');\r\n rotation = 0;\r\n ctx.container.scrollTop = 0;\r\n ctx.container.scrollLeft = 0;\r\n applyTransform();\r\n },\r\n rotateCW: () => {\r\n rotation = (rotation + 90) % 360;\r\n applyTransform();\r\n },\r\n rotateCCW: () => {\r\n rotation = (rotation - 90 + 360) % 360;\r\n applyTransform();\r\n },\r\n download: () => {\r\n const blob = new Blob([ctx.buffer], { type: 'application/rtf' });\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = ctx.metadata.name || 'document.rtf';\r\n a.click();\r\n URL.revokeObjectURL(url);\r\n },\r\n copy: () => {\r\n const text = wrapper.textContent || '';\r\n navigator.clipboard?.writeText(text);\r\n },\r\n print: () => {\r\n window.print();\r\n }\r\n };\r\n }\r\n}\r\n\r\nexport function rtfPlugin(): RtfPlugin {\r\n return new RtfPlugin();\r\n}\r\n\r\nexport default RtfPlugin;\r\n","import type { \r\n FileInfo, \r\n RenderContext, \r\n ToolbarAction, \r\n PreviewPlugin, \r\n PreviewInstance \r\n} from '@patel.sumit51/core';\r\nimport DOMPurify from 'dompurify';\r\n\r\nexport class HtmlPreviewPlugin implements PreviewPlugin {\r\n id = 'html-preview';\r\n name = 'HTML Document Preview';\r\n extensions = ['.html', '.htm', '.xhtml'];\r\n mimeTypes = ['text/html', 'application/xhtml+xml'];\r\n weight = 85;\r\n\r\n supports(file: FileInfo): boolean {\r\n const ext = file.metadata.extension?.toLowerCase();\r\n const mime = file.metadata.mimeType?.toLowerCase();\r\n return this.extensions.includes(ext || '') || this.mimeTypes.includes(mime || '');\r\n }\r\n\r\n getToolbarActions(instance: PreviewInstance): ToolbarAction[] {\r\n return [\r\n {\r\n id: 'zoom-out',\r\n icon: 'zoom-out',\r\n label: 'Zoom Out',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomOut?.()\r\n },\r\n {\r\n id: 'zoom-in',\r\n icon: 'zoom-in',\r\n label: 'Zoom In',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomIn?.()\r\n },\r\n {\r\n id: 'fit-page',\r\n icon: 'fit-page',\r\n label: 'Fit to Page',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.fitToPage?.()\r\n },\r\n {\r\n id: 'reset-zoom',\r\n icon: 'reset-zoom',\r\n label: 'Reset Zoom',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.resetZoom?.()\r\n },\r\n {\r\n id: 'copy',\r\n icon: 'copy',\r\n label: 'Copy HTML',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => (instance as any).copy?.()\r\n },\r\n {\r\n id: 'download',\r\n icon: 'download',\r\n label: 'Download',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => instance.download?.()\r\n },\r\n {\r\n id: 'print',\r\n icon: 'print',\r\n label: 'Print',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => instance.print?.()\r\n }\r\n ];\r\n }\r\n\r\n async render(ctx: RenderContext): Promise<PreviewInstance> {\r\n const rawHtml = new TextDecoder('utf-8').decode(ctx.buffer);\r\n const sanitized = DOMPurify.sanitize(rawHtml, {\r\n WHOLE_DOCUMENT: true,\r\n ADD_TAGS: ['style', 'link'],\r\n ADD_ATTR: ['target', 'rel']\r\n });\r\n\r\n const iframe = document.createElement('iframe');\r\n iframe.className = 'fp-html-iframe';\r\n iframe.style.width = '100%';\r\n iframe.style.height = '100%';\r\n iframe.style.border = 'none';\r\n iframe.style.backgroundColor = '#ffffff';\r\n iframe.style.transformOrigin = 'top left';\r\n iframe.style.transition = 'transform 0.2s ease';\r\n // Sandbox without allow-scripts ensures no malicious JS can execute\r\n iframe.sandbox.add('allow-same-origin');\r\n\r\n ctx.container.style.overflow = 'auto';\r\n ctx.container.style.width = '100%';\r\n ctx.container.style.height = '100%';\r\n ctx.container.appendChild(iframe);\r\n\r\n // Set sanitized content via srcdoc\r\n iframe.srcdoc = sanitized;\r\n\r\n let scale = 1.0;\r\n\r\n const cleanup = () => {\r\n iframe.remove();\r\n ctx.container.innerHTML = '';\r\n };\r\n\r\n ctx.signal.addEventListener('abort', cleanup);\r\n\r\n return {\r\n destroy: cleanup,\r\n zoomIn: () => {\r\n scale += 0.1;\r\n iframe.style.transform = `scale(${scale})`;\r\n },\r\n zoomOut: () => {\r\n scale = Math.max(0.2, scale - 0.1);\r\n iframe.style.transform = `scale(${scale})`;\r\n },\r\n getZoom: () => scale,\r\n setZoom: (level: number) => {\r\n scale = level;\r\n iframe.style.transform = `scale(${scale})`;\r\n },\r\n fitToPage: () => {\r\n scale = 1.0;\r\n iframe.style.transform = 'scale(1)';\r\n },\r\n resetZoom: () => {\r\n scale = 1.0;\r\n iframe.style.transform = 'scale(1)';\r\n ctx.container.scrollTop = 0;\r\n ctx.container.scrollLeft = 0;\r\n },\r\n copy: () => {\r\n navigator.clipboard.writeText(rawHtml);\r\n },\r\n download: () => {\r\n const blob = new Blob([ctx.buffer], { type: 'text/html' });\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = ctx.metadata.name || 'document.html';\r\n a.click();\r\n URL.revokeObjectURL(url);\r\n },\r\n print: () => {\r\n iframe.contentWindow?.print();\r\n }\r\n } as any;\r\n }\r\n}\r\n\r\nexport function htmlPreviewPlugin(): HtmlPreviewPlugin {\r\n return new HtmlPreviewPlugin();\r\n}\r\n\r\nexport default HtmlPreviewPlugin;\r\n","import type { \r\n FileInfo, \r\n RenderContext, \r\n ToolbarAction, \r\n PreviewPlugin, \r\n PreviewInstance,\r\n Thumbnail\r\n} from '@patel.sumit51/core';\r\nimport { unzipSync, strFromU8 } from 'fflate';\r\nimport DOMPurify from 'dompurify';\r\n\r\nexport class OpenDocumentPlugin implements PreviewPlugin {\r\n id = 'opendocument';\r\n name = 'OpenDocument Preview (ODT, ODP, ODS, ODG, ODF)';\r\n extensions = ['.odt', '.odp', '.ods', '.odg', '.odf'];\r\n mimeTypes = [\r\n 'application/vnd.oasis.opendocument.text',\r\n 'application/vnd.oasis.opendocument.presentation',\r\n 'application/vnd.oasis.opendocument.spreadsheet',\r\n 'application/vnd.oasis.opendocument.graphics',\r\n 'application/vnd.oasis.opendocument.formula'\r\n ];\r\n weight = 80;\r\n\r\n supports(file: FileInfo): boolean {\r\n const ext = file.metadata.extension?.toLowerCase();\r\n const mime = file.metadata.mimeType?.toLowerCase();\r\n if (ext) {\r\n return this.extensions.includes(ext);\r\n }\r\n return this.mimeTypes.includes(mime || '');\r\n }\r\n\r\n getToolbarActions(instance: PreviewInstance): ToolbarAction[] {\r\n const isPresentation = (instance as any).isPresentation;\r\n const totalPages = instance.getPageCount?.() ?? 1;\r\n const actions: ToolbarAction[] = [];\r\n\r\n actions.push({\r\n id: 'thumbnails',\r\n icon: 'thumbnails',\r\n label: isPresentation ? 'Slide Thumbnails' : 'Page Thumbnails',\r\n type: 'button',\r\n group: 'navigation',\r\n execute: () => instance.toggleThumbnails?.()\r\n });\r\n\r\n actions.push({\r\n id: 'page-nav',\r\n icon: '',\r\n label: isPresentation ? 'Slide Navigation' : 'Page Navigation',\r\n type: 'page-nav',\r\n group: 'navigation',\r\n value: instance.getCurrentPage?.() ?? 1,\r\n max: totalPages,\r\n execute: (action: unknown, page?: unknown) => {\r\n const cur = instance.getCurrentPage?.() ?? 1;\r\n const max = instance.getPageCount?.() ?? 1;\r\n if (action === 'prev') {\r\n if (cur > 1) instance.goToPage?.(cur - 1);\r\n } else if (action === 'next') {\r\n if (cur < max) instance.goToPage?.(cur + 1);\r\n } else if (typeof page === 'number') {\r\n instance.goToPage?.(page);\r\n } else if (typeof action === 'number') {\r\n instance.goToPage?.(action);\r\n }\r\n }\r\n });\r\n\r\n actions.push(\r\n {\r\n id: 'zoom-out',\r\n icon: 'zoom-out',\r\n label: 'Zoom Out',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomOut?.()\r\n },\r\n {\r\n id: 'zoom-in',\r\n icon: 'zoom-in',\r\n label: 'Zoom In',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomIn?.()\r\n },\r\n {\r\n id: 'fit-page',\r\n icon: 'fit-page',\r\n label: isPresentation ? 'Fit to Slide' : 'Fit to Page',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.fitToPage?.()\r\n },\r\n {\r\n id: 'reset-zoom',\r\n icon: 'reset-zoom',\r\n label: 'Reset Zoom',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.resetZoom?.()\r\n },\r\n {\r\n id: 'rotate-cw',\r\n icon: 'rotate-cw',\r\n label: 'Rotate',\r\n type: 'button',\r\n group: 'view',\r\n execute: () => instance.rotateCW?.()\r\n },\r\n {\r\n id: 'download',\r\n icon: 'download',\r\n label: 'Download',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => instance.download?.()\r\n },\r\n {\r\n id: 'print',\r\n icon: 'print',\r\n label: 'Print',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => instance.print?.()\r\n },\r\n {\r\n id: 'open-window',\r\n icon: 'open-window',\r\n label: 'Open in Separate Full Window',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => (instance as any).openInSeparateWindow?.()\r\n }\r\n );\r\n\r\n return actions;\r\n }\r\n\r\n async render(ctx: RenderContext): Promise<PreviewInstance> {\r\n const ext = (ctx.metadata.extension || '').toLowerCase();\r\n const mime = (ctx.metadata.mimeType || '').toLowerCase();\r\n const isPresentation = ext === '.odp' || mime.includes('presentation');\r\n const isFormula = ext === '.odf' || mime.includes('formula');\r\n const isDrawing = ext === '.odg' || mime.includes('graphics');\r\n\r\n let unzipped: Record<string, Uint8Array>;\r\n try {\r\n unzipped = unzipSync(new Uint8Array(ctx.buffer));\r\n } catch {\r\n throw new Error('Failed to decompress OpenDocument package (invalid ZIP format)');\r\n }\r\n\r\n // Pre-cache embedded image URLs\r\n const imageUrls = new Map<string, string>();\r\n for (const [filePath, fileBytes] of Object.entries(unzipped)) {\r\n if (filePath.startsWith('Pictures/')) {\r\n const imageMime = filePath.endsWith('.png') ? 'image/png' :\r\n filePath.endsWith('.jpg') || filePath.endsWith('.jpeg') ? 'image/jpeg' :\r\n filePath.endsWith('.svg') ? 'image/svg+xml' : 'application/octet-stream';\r\n const blob = new Blob([fileBytes], { type: imageMime });\r\n imageUrls.set(filePath, URL.createObjectURL(blob));\r\n }\r\n }\r\n\r\n const contentXmlStr = unzipped['content.xml'] ? strFromU8(unzipped['content.xml']) : '';\r\n const stylesXmlStr = unzipped['styles.xml'] ? strFromU8(unzipped['styles.xml']) : '';\r\n\r\n const parser = new DOMParser();\r\n const contentDoc = parser.parseFromString(contentXmlStr, 'application/xml');\r\n const stylesDoc = stylesXmlStr ? parser.parseFromString(stylesXmlStr, 'application/xml') : null;\r\n\r\n // Extract styles map\r\n const styleMap = this.extractStyles(stylesDoc, contentDoc);\r\n\r\n const container = document.createElement('div');\r\n container.className = 'fp-odf-container';\r\n container.style.width = '100%';\r\n container.style.height = '100%';\r\n container.style.overflowX = 'hidden';\r\n container.style.overflowY = 'auto';\r\n container.style.padding = '16px 8px';\r\n container.style.backgroundColor = '#f1f5f9';\r\n\r\n const wrapper = document.createElement('div');\r\n wrapper.className = 'fp-odf-wrapper';\r\n wrapper.style.margin = '0 auto';\r\n wrapper.style.width = isPresentation ? '960px' : '816px';\r\n wrapper.style.boxSizing = 'border-box';\r\n wrapper.style.backgroundColor = '#ffffff';\r\n wrapper.style.boxShadow = '0 2px 10px rgba(0,0,0,0.08)';\r\n wrapper.style.borderRadius = '4px';\r\n wrapper.style.transformOrigin = 'top center';\r\n wrapper.style.transition = 'transform 0.15s ease';\r\n\r\n container.appendChild(wrapper);\r\n ctx.container.appendChild(container);\r\n\r\n let scale = 1.0;\r\n let rotation = 0;\r\n let isUserZoomed = false;\r\n let fitMode: 'width' | 'page' = ((ctx as any)?.options?.fitMode as any) || 'width';\r\n let currentPage = 1;\r\n let totalPages = 1;\r\n let slides: HTMLElement[] = [];\r\n\r\n const calculateFitScale = (mode: 'width' | 'page' = fitMode) => {\r\n const activeSlide = slides[currentPage - 1];\r\n const elW = isPresentation ? 960 : 816;\r\n const singlePageH = Math.min(activeSlide?.offsetHeight || wrapper.offsetHeight || 1056, Math.round(elW * 1.32));\r\n // Minimal side margins (16px on each side, safe from vertical scrollbar)\r\n const availW = Math.max(280, ctx.container.clientWidth - 32);\r\n const availH = Math.max(280, ctx.container.clientHeight - 32);\r\n\r\n const sW = availW / elW;\r\n const sH = availH / (isPresentation ? 540 : singlePageH);\r\n\r\n if (isPresentation) {\r\n return Math.min(2.5, Math.min(sW, sH));\r\n }\r\n\r\n if (mode === 'page') {\r\n return Math.max(0.35, Math.min(3.0, Math.min(sW, sH)));\r\n }\r\n return Math.max(0.4, Math.min(3.0, sW));\r\n };\r\n\r\n const applyTransform = () => {\r\n wrapper.style.transform = `scale(${scale}) rotate(${rotation}deg)`;\r\n wrapper.style.transformOrigin = 'top center';\r\n const activeSlide = slides[currentPage - 1];\r\n const baseH = activeSlide?.offsetHeight || wrapper.offsetHeight || 1056;\r\n const scaledH = baseH * scale;\r\n const extraH = Math.max(0, scaledH - baseH);\r\n wrapper.style.marginBottom = `${extraH + 32}px`;\r\n };\r\n\r\n const resizeObserver = typeof ResizeObserver !== 'undefined'\r\n ? new ResizeObserver(() => {\r\n if (!isUserZoomed) {\r\n scale = calculateFitScale(fitMode);\r\n applyTransform();\r\n }\r\n })\r\n : null;\r\n resizeObserver?.observe(ctx.container);\r\n\r\n setTimeout(() => {\r\n scale = calculateFitScale(fitMode);\r\n applyTransform();\r\n }, 60);\r\n\r\n if (isPresentation) {\r\n // ODP (Presentation): render slides\r\n wrapper.style.maxWidth = '960px';\r\n wrapper.style.aspectRatio = '16 / 9';\r\n wrapper.style.position = 'relative';\r\n wrapper.style.overflow = 'hidden';\r\n\r\n slides = this.renderSlides(contentDoc, styleMap, imageUrls);\r\n totalPages = Math.max(1, slides.length);\r\n\r\n slides.forEach((slide, idx) => {\r\n slide.style.display = idx === 0 ? 'block' : 'none';\r\n slide.style.width = '100%';\r\n slide.style.height = '100%';\r\n slide.style.position = 'absolute';\r\n slide.style.top = '0';\r\n slide.style.left = '0';\r\n wrapper.appendChild(slide);\r\n });\r\n } else if (isFormula) {\r\n // ODF (Formula): extract MathML\r\n wrapper.style.maxWidth = '800px';\r\n wrapper.style.padding = '48px';\r\n wrapper.style.textAlign = 'center';\r\n wrapper.style.fontSize = '24px';\r\n\r\n const mathEl = contentDoc.querySelector('math');\r\n if (mathEl) {\r\n wrapper.innerHTML = mathEl.outerHTML;\r\n } else {\r\n wrapper.textContent = contentDoc.documentElement.textContent || 'Formula content';\r\n }\r\n } else {\r\n // ODT (Text), ODS (Spreadsheet fallback), ODG (Graphics)\r\n wrapper.style.maxWidth = 'none';\r\n wrapper.style.padding = '0';\r\n wrapper.style.minHeight = '100%';\r\n wrapper.style.backgroundColor = 'transparent';\r\n wrapper.style.boxShadow = 'none';\r\n wrapper.style.position = 'relative';\r\n\r\n const dims = this.getPageDimensions(stylesDoc, contentDoc);\r\n const bodyHtml = this.renderOdfBody(contentDoc, styleMap, imageUrls);\r\n \r\n const tempDiv = document.createElement('div');\r\n tempDiv.style.width = `${dims.width - dims.marginLeft - dims.marginRight}px`;\r\n tempDiv.style.position = 'absolute';\r\n tempDiv.style.visibility = 'hidden';\r\n tempDiv.innerHTML = DOMPurify.sanitize(bodyHtml, {\r\n ADD_TAGS: ['math', 'semantics', 'mrow', 'mi', 'mo', 'mn', 'msup', 'msub', 'hr'],\r\n ADD_ATTR: ['style', 'colspan', 'rowspan']\r\n });\r\n document.body.appendChild(tempDiv);\r\n \r\n const contentHeight = dims.height - dims.marginTop - dims.marginBottom;\r\n const pageElements: Element[][] = [[]];\r\n let currentHeight = 0;\r\n let currentPageIdx = 0;\r\n \r\n Array.from(tempDiv.children).forEach((child) => {\r\n const el = child as HTMLElement;\r\n const style = el.getAttribute('style') || '';\r\n const isBreakBefore = style.includes('page-break-before: always');\r\n const isBreakAfter = style.includes('page-break-after: always');\r\n const isSoftBreak = el.classList.contains('odf-page-break');\r\n \r\n if (isBreakBefore) {\r\n if (pageElements[currentPageIdx].length > 0) {\r\n currentPageIdx++;\r\n pageElements.push([]);\r\n currentHeight = 0;\r\n }\r\n }\r\n \r\n const h = el.offsetHeight || 0;\r\n if (currentHeight + h > contentHeight && pageElements[currentPageIdx].length > 0 && !isSoftBreak) {\r\n currentPageIdx++;\r\n pageElements.push([]);\r\n currentHeight = 0;\r\n }\r\n \r\n if (!isSoftBreak) {\r\n pageElements[currentPageIdx].push(el.cloneNode(true) as Element);\r\n currentHeight += h;\r\n }\r\n \r\n if (isBreakAfter || isSoftBreak) {\r\n currentPageIdx++;\r\n pageElements.push([]);\r\n currentHeight = 0;\r\n }\r\n });\r\n \r\n document.body.removeChild(tempDiv);\r\n \r\n if (pageElements.length > 1 && pageElements[pageElements.length - 1].length === 0) {\r\n pageElements.pop();\r\n }\r\n \r\n totalPages = Math.max(1, pageElements.length);\r\n \r\n pageElements.forEach((elements, idx) => {\r\n const page = document.createElement('div');\r\n page.className = `fp-odt-page fp-odt-page-${idx + 1}`;\r\n page.style.width = `${dims.width}px`;\r\n page.style.minHeight = `${dims.height}px`;\r\n page.style.padding = `${dims.marginTop}px ${dims.marginRight}px ${dims.marginBottom}px ${dims.marginLeft}px`;\r\n page.style.margin = '0 auto';\r\n page.style.backgroundColor = '#ffffff';\r\n page.style.boxShadow = '0 2px 10px rgba(0,0,0,0.08)';\r\n page.style.borderRadius = '4px';\r\n page.style.display = idx === 0 ? 'block' : 'none';\r\n page.style.margin = '0 auto 24px';\r\n page.style.boxShadow = '0 4px 24px rgba(0, 0, 0, 0.08)';\r\n \r\n elements.forEach(el => page.appendChild(el));\r\n wrapper.appendChild(page);\r\n slides.push(page);\r\n });\r\n }\r\n\r\n const cleanup = () => {\r\n resizeObserver?.disconnect();\r\n imageUrls.forEach(url => URL.revokeObjectURL(url));\r\n container.remove();\r\n ctx.container.innerHTML = '';\r\n };\r\n\r\n ctx.signal.addEventListener('abort', cleanup);\r\n\r\n const goToPage = (page: number) => {\r\n if (page < 1 || page > totalPages) return;\r\n currentPage = page;\r\n slides.forEach((s, idx) => {\r\n s.style.display = idx === page - 1 ? 'block' : 'none';\r\n });\r\n container.scrollTop = 0;\r\n ctx.emit('page-change', { page: currentPage, total: totalPages });\r\n };\r\n\r\n return {\r\n destroy: cleanup,\r\n isPresentation,\r\n zoomIn: () => {\r\n isUserZoomed = true;\r\n scale += 0.15;\r\n applyTransform();\r\n },\r\n zoomOut: () => {\r\n isUserZoomed = true;\r\n scale = Math.max(0.2, scale - 0.15);\r\n applyTransform();\r\n },\r\n getZoom: () => scale,\r\n setZoom: (level: number) => {\r\n isUserZoomed = true;\r\n scale = level;\r\n applyTransform();\r\n },\r\n fitToPage: () => {\r\n isUserZoomed = false;\r\n fitMode = 'width';\r\n scale = calculateFitScale('width');\r\n rotation = 0;\r\n applyTransform();\r\n },\r\n resetZoom: () => {\r\n isUserZoomed = false;\r\n fitMode = 'width';\r\n scale = calculateFitScale('width');\r\n rotation = 0;\r\n container.scrollTop = 0;\r\n container.scrollLeft = 0;\r\n applyTransform();\r\n },\r\n rotateCW: () => {\r\n rotation = (rotation + 90) % 360;\r\n applyTransform();\r\n },\r\n rotateCCW: () => {\r\n rotation = (rotation - 90 + 360) % 360;\r\n applyTransform();\r\n },\r\n goToPage,\r\n getPageCount: () => totalPages,\r\n getCurrentPage: () => currentPage,\r\n getThumbnails: async (): Promise<Thumbnail[]> => {\r\n const count = totalPages || slides.length || 1;\r\n const items: Thumbnail[] = [];\r\n for (let idx = 0; idx < count; idx++) {\r\n const itemIdx = idx;\r\n items.push({\r\n index: itemIdx,\r\n label: isPresentation ? `Slide ${itemIdx + 1}` : `Page ${itemIdx + 1}`,\r\n render: async (canvas: HTMLCanvasElement) => {\r\n const ctx2d = canvas.getContext('2d');\r\n if (!ctx2d) return;\r\n if (isPresentation) {\r\n canvas.width = 160;\r\n canvas.height = 90;\r\n ctx2d.fillStyle = '#f8fafc';\r\n ctx2d.fillRect(0, 0, 160, 90);\r\n ctx2d.strokeStyle = '#cbd5e1';\r\n ctx2d.lineWidth = 1;\r\n ctx2d.strokeRect(0.5, 0.5, 159, 89);\r\n ctx2d.fillStyle = '#334155';\r\n ctx2d.font = 'bold 11px sans-serif';\r\n ctx2d.textAlign = 'center';\r\n ctx2d.fillText(`Slide ${itemIdx + 1}`, 80, 50);\r\n } else {\r\n canvas.width = 140;\r\n canvas.height = 180;\r\n ctx2d.fillStyle = '#ffffff';\r\n ctx2d.fillRect(0, 0, 140, 180);\r\n ctx2d.strokeStyle = '#cbd5e1';\r\n ctx2d.lineWidth = 1;\r\n ctx2d.strokeRect(0.5, 0.5, 139, 179);\r\n ctx2d.fillStyle = '#64748b';\r\n ctx2d.font = 'bold 10px sans-serif';\r\n ctx2d.textAlign = 'center';\r\n ctx2d.fillText(`Page ${itemIdx + 1}`, 70, 90);\r\n }\r\n }\r\n });\r\n }\r\n return items;\r\n },\r\n download: () => {\r\n const mimeType = this.mimeTypes.find(m => m.includes(ext.replace('.', ''))) || 'application/octet-stream';\r\n const blob = new Blob([ctx.buffer], { type: mimeType });\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = ctx.metadata.name || `document${ext}`;\r\n a.click();\r\n URL.revokeObjectURL(url);\r\n },\r\n print: () => {\r\n window.print();\r\n }\r\n } as any;\r\n }\r\n\r\n private getPageDimensions(stylesDoc: Document | null, contentDoc: Document) {\r\n let width = 850;\r\n let height = 1123;\r\n let marginTop = 48;\r\n let marginBottom = 48;\r\n let marginLeft = 48;\r\n let marginRight = 48;\r\n\r\n const parseUnit = (val: string | null) => {\r\n if (!val) return null;\r\n if (val.endsWith('cm')) return parseFloat(val) * 37.8;\r\n if (val.endsWith('mm')) return parseFloat(val) * 3.78;\r\n if (val.endsWith('in')) return parseFloat(val) * 96;\r\n if (val.endsWith('pt')) return parseFloat(val) * 1.33;\r\n if (val.endsWith('px')) return parseFloat(val);\r\n return parseFloat(val);\r\n };\r\n\r\n const docs = [stylesDoc, contentDoc].filter(Boolean) as Document[];\r\n for (const doc of docs) {\r\n const pageLayout = doc.querySelector('page-layout-properties, [page-width]');\r\n if (pageLayout) {\r\n const w = parseUnit(pageLayout.getAttribute('fo:page-width') || pageLayout.getAttribute('page-width'));\r\n const h = parseUnit(pageLayout.getAttribute('fo:page-height') || pageLayout.getAttribute('page-height'));\r\n const mt = parseUnit(pageLayout.getAttribute('fo:margin-top') || pageLayout.getAttribute('margin-top'));\r\n const mb = parseUnit(pageLayout.getAttribute('fo:margin-bottom') || pageLayout.getAttribute('margin-bottom'));\r\n const ml = parseUnit(pageLayout.getAttribute('fo:margin-left') || pageLayout.getAttribute('margin-left'));\r\n const mr = parseUnit(pageLayout.getAttribute('fo:margin-right') || pageLayout.getAttribute('margin-right'));\r\n\r\n if (w !== null) width = w;\r\n if (h !== null) height = h;\r\n if (mt !== null) marginTop = mt;\r\n if (mb !== null) marginBottom = mb;\r\n if (ml !== null) marginLeft = ml;\r\n if (mr !== null) marginRight = mr;\r\n break;\r\n }\r\n }\r\n\r\n return { width, height, marginTop, marginBottom, marginLeft, marginRight };\r\n }\r\n\r\n private extractStyles(stylesDoc: Document | null, contentDoc: Document): Map<string, string> {\r\n const map = new Map<string, string>();\r\n const styleNodes: Element[] = [];\r\n\r\n if (stylesDoc) {\r\n styleNodes.push(...Array.from(stylesDoc.querySelectorAll('style, [name]')));\r\n }\r\n styleNodes.push(...Array.from(contentDoc.querySelectorAll('style, [name]')));\r\n\r\n for (const node of styleNodes) {\r\n const name = node.getAttribute('style:name') || node.getAttribute('name');\r\n if (!name) continue;\r\n\r\n let css = '';\r\n const textProp = node.querySelector('text-properties, [font-weight], [font-style], [color]');\r\n if (textProp) {\r\n const weight = textProp.getAttribute('fo:font-weight') || textProp.getAttribute('font-weight');\r\n const style = textProp.getAttribute('fo:font-style') || textProp.getAttribute('font-style');\r\n const color = textProp.getAttribute('fo:color') || textProp.getAttribute('color');\r\n const size = textProp.getAttribute('fo:font-size') || textProp.getAttribute('font-size');\r\n\r\n if (weight === 'bold') css += 'font-weight: bold; ';\r\n if (style === 'italic') css += 'font-style: italic; ';\r\n if (color) css += `color: ${color}; `;\r\n if (size) css += `font-size: ${size}; `;\r\n }\r\n\r\n let paraProp = node.querySelector('paragraph-properties, [text-align]');\r\n if (!paraProp) {\r\n paraProp = Array.from(node.children).find(c => c.tagName.includes('paragraph-properties')) || null;\r\n }\r\n if (paraProp) {\r\n const align = paraProp.getAttribute('fo:text-align') || paraProp.getAttribute('text-align');\r\n const mt = paraProp.getAttribute('fo:margin-top') || paraProp.getAttribute('margin-top');\r\n const mb = paraProp.getAttribute('fo:margin-bottom') || paraProp.getAttribute('margin-bottom');\r\n const breakBefore = paraProp.getAttribute('fo:break-before') || paraProp.getAttribute('break-before');\r\n const breakAfter = paraProp.getAttribute('fo:break-after') || paraProp.getAttribute('break-after');\r\n\r\n if (align) css += `text-align: ${align}; `;\r\n if (mt) css += `margin-top: ${mt}; `;\r\n if (mb) css += `margin-bottom: ${mb}; `;\r\n if (breakBefore === 'page') css += 'page-break-before: always; ';\r\n if (breakAfter === 'page') css += 'page-break-after: always; ';\r\n }\r\n\r\n if (css) map.set(name, css);\r\n }\r\n\r\n return map;\r\n }\r\n\r\n private renderOdfBody(contentDoc: Document, styles: Map<string, string>, images: Map<string, string>): string {\r\n const body = contentDoc.querySelector('body') || contentDoc.documentElement;\r\n let html = '';\r\n\r\n const walk = (node: Element) => {\r\n const tag = node.localName || node.tagName.toLowerCase();\r\n\r\n switch (tag) {\r\n case 'h': {\r\n const level = Math.min(6, Math.max(1, Number(node.getAttribute('text:outline-level') || 1)));\r\n const style = styles.get(node.getAttribute('text:style-name') || '') || '';\r\n html += `<h${level} style=\"${style}; margin: 18px 0 8px; color: #1e3a8a; font-family: Calibri, 'Segoe UI', Arial, sans-serif;\">${node.textContent || ''}</h${level}>`;\r\n break;\r\n }\r\n case 'p': {\r\n const style = styles.get(node.getAttribute('text:style-name') || '') || '';\r\n const inner = this.renderSpans(node, styles, images);\r\n const isInsideLi = node.parentElement?.localName === 'list-item' || node.parentElement?.tagName?.toLowerCase() === 'list-item';\r\n html += `<p style=\"${style}; line-height: 1.5; margin: ${isInsideLi ? '0' : '8px 0 12px'}; font-family: Calibri, 'Segoe UI', Arial, sans-serif;\">${inner}</p>`;\r\n break;\r\n }\r\n case 'list': {\r\n html += '<ul style=\"margin: 8px 0 12px; padding-left: 24px;\">';\r\n Array.from(node.children).forEach(c => walk(c));\r\n html += '</ul>';\r\n break;\r\n }\r\n case 'list-item': {\r\n html += '<li style=\"margin: 4px 0; font-size: 11pt; line-height: 1.5; color: #1e293b;\">';\r\n Array.from(node.children).forEach(c => walk(c));\r\n html += '</li>';\r\n break;\r\n }\r\n case 'table': {\r\n html += '<table style=\"border-collapse: collapse; width: 100%; margin: 16px 0; border: 1px solid #d0d7de;\">';\r\n Array.from(node.children).forEach(c => walk(c));\r\n html += '</table>';\r\n break;\r\n }\r\n case 'table-row': {\r\n html += '<tr>';\r\n Array.from(node.children).forEach(c => walk(c));\r\n html += '</tr>';\r\n break;\r\n }\r\n case 'table-cell': {\r\n html += '<td style=\"border: 1px solid #d0d7de; padding: 8px 12px; font-size: 13px;\">';\r\n Array.from(node.children).forEach(c => walk(c));\r\n html += '</td>';\r\n break;\r\n }\r\n default:\r\n Array.from(node.children).forEach(c => walk(c));\r\n }\r\n };\r\n\r\n Array.from(body.children).forEach(c => walk(c));\r\n\r\n return html || '<p style=\"color: #666; font-style: italic;\">(Document is empty)</p>';\r\n }\r\n\r\n private renderSpans(node: Element, styles: Map<string, string>, images: Map<string, string>): string {\r\n let result = '';\r\n\r\n for (const child of Array.from(node.childNodes)) {\r\n if (child.nodeType === Node.TEXT_NODE) {\r\n result += child.textContent || '';\r\n } else if (child.nodeType === Node.ELEMENT_NODE) {\r\n const el = child as Element;\r\n const tag = el.localName || el.tagName.toLowerCase();\r\n\r\n if (tag === 'span') {\r\n const style = styles.get(el.getAttribute('text:style-name') || '') || '';\r\n result += `<span style=\"${style}\">${el.textContent || ''}</span>`;\r\n } else if (tag === 'image') {\r\n const href = el.getAttribute('xlink:href') || el.getAttribute('href') || '';\r\n const blobUrl = images.get(href);\r\n if (blobUrl) {\r\n result += `<img src=\"${blobUrl}\" style=\"max-width: 100%; height: auto; margin: 8px 0;\" alt=\"Embedded image\" />`;\r\n }\r\n } else if (tag === 's') {\r\n const count = Number(el.getAttribute('text:c') || 1);\r\n result += ' '.repeat(count);\r\n } else if (tag === 'tab') {\r\n result += ' ';\r\n } else if (tag === 'line-break') {\r\n result += '<br/>';\r\n } else if (tag === 'soft-page-break') {\r\n result += '<hr class=\"odf-page-break\" style=\"page-break-after: always; border: none; margin: 0; padding: 0; height: 0;\" />';\r\n } else {\r\n result += el.textContent || '';\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private renderSlides(contentDoc: Document, styles: Map<string, string>, images: Map<string, string>): HTMLElement[] {\r\n const pages = Array.from(contentDoc.querySelectorAll('page, [draw\\\\:name]'));\r\n const slides: HTMLElement[] = [];\r\n\r\n const pageNodes = pages.length > 0 ? pages : Array.from(contentDoc.getElementsByTagNameNS('*', 'page'));\r\n\r\n if (pageNodes.length === 0) {\r\n const fallbackSlide = document.createElement('div');\r\n fallbackSlide.style.padding = '40px';\r\n fallbackSlide.style.textAlign = 'center';\r\n fallbackSlide.innerHTML = '<h2>Presentation</h2><p>No slides found</p>';\r\n return [fallbackSlide];\r\n }\r\n\r\n pageNodes.forEach((pageEl, idx) => {\r\n const slide = document.createElement('div');\r\n slide.className = `fp-odp-slide fp-odp-slide-${idx + 1}`;\r\n slide.style.padding = '40px';\r\n slide.style.boxSizing = 'border-box';\r\n slide.style.display = 'flex';\r\n slide.style.flexDirection = 'column';\r\n slide.style.justifyContent = 'center';\r\n slide.style.alignItems = 'center';\r\n slide.style.background = '#ffffff';\r\n\r\n const textFrames = Array.from(pageEl.querySelectorAll('frame, text-box, [draw\\\\:text-style-name]'));\r\n if (textFrames.length > 0) {\r\n textFrames.forEach((frame) => {\r\n const text = frame.textContent?.trim();\r\n if (text) {\r\n const p = document.createElement('div');\r\n p.style.margin = '12px 0';\r\n p.style.fontSize = idx === 0 ? '24px' : '16px';\r\n p.style.fontWeight = idx === 0 ? 'bold' : 'normal';\r\n p.style.color = '#1e293b';\r\n p.textContent = text;\r\n slide.appendChild(p);\r\n }\r\n });\r\n } else {\r\n slide.innerHTML = `<h3>Slide ${idx + 1}</h3><p>${pageEl.textContent?.trim() || ''}</p>`;\r\n }\r\n\r\n slides.push(slide);\r\n });\r\n\r\n return slides;\r\n }\r\n}\r\n\r\nexport function openDocumentPlugin(): OpenDocumentPlugin {\r\n return new OpenDocumentPlugin();\r\n}\r\n\r\nexport default OpenDocumentPlugin;\r\n","import type { \r\n FileInfo, \r\n RenderContext, \r\n ToolbarAction, \r\n PreviewPlugin, \r\n PreviewInstance \r\n} from '@patel.sumit51/core';\r\nimport { CfbfReader } from '@patel.sumit51/core';\r\nimport DOMPurify from 'dompurify';\r\nimport * as fflate from 'fflate';\r\n\r\nexport class DocPlugin implements PreviewPlugin {\r\n id = 'doc';\r\n name = 'Legacy Word Document Preview (.doc, .dot)';\r\n extensions = ['.doc', '.dot'];\r\n mimeTypes = ['application/msword', 'application/vnd.ms-word'];\r\n weight = 75;\r\n\r\n supports(file: FileInfo): boolean {\r\n const ext = file.metadata.extension?.toLowerCase();\r\n const mime = file.metadata.mimeType?.toLowerCase();\r\n if (ext) {\r\n return this.extensions.includes(ext);\r\n }\r\n return this.mimeTypes.includes(mime || '');\r\n }\r\n\r\n getToolbarActions(instance: PreviewInstance): ToolbarAction[] {\r\n const totalPages = instance.getPageCount?.() ?? 1;\r\n const actions: ToolbarAction[] = [];\r\n\r\n actions.push({\r\n id: 'page-nav',\r\n icon: '',\r\n label: 'Page Navigation',\r\n type: 'page-nav',\r\n group: 'navigation',\r\n value: instance.getCurrentPage?.() ?? 1,\r\n max: totalPages,\r\n execute: (action: unknown, page?: unknown) => {\r\n const cur = instance.getCurrentPage?.() ?? 1;\r\n const max = instance.getPageCount?.() ?? 1;\r\n if (action === 'prev') {\r\n if (cur > 1) instance.goToPage?.(cur - 1);\r\n } else if (action === 'next') {\r\n if (cur < max) instance.goToPage?.(cur + 1);\r\n } else if (typeof page === 'number') {\r\n instance.goToPage?.(page);\r\n }\r\n }\r\n });\r\n\r\n actions.push(\r\n {\r\n id: 'zoom-out',\r\n icon: 'zoom-out',\r\n label: 'Zoom Out',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomOut?.()\r\n },\r\n {\r\n id: 'zoom-in',\r\n icon: 'zoom-in',\r\n label: 'Zoom In',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomIn?.()\r\n },\r\n {\r\n id: 'fit-page',\r\n icon: 'fit-page',\r\n label: 'Fit to Page',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.fitToPage?.()\r\n },\r\n {\r\n id: 'reset-zoom',\r\n icon: 'reset-zoom',\r\n label: 'Reset Zoom',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.resetZoom?.()\r\n },\r\n {\r\n id: 'rotate-cw',\r\n icon: 'rotate-cw',\r\n label: 'Rotate',\r\n type: 'button',\r\n group: 'view',\r\n execute: () => instance.rotateCW?.()\r\n },\r\n {\r\n id: 'copy',\r\n icon: 'copy',\r\n label: 'Copy Text',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => (instance as any).copy?.()\r\n },\r\n {\r\n id: 'download',\r\n icon: 'download',\r\n label: 'Download',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => instance.download?.()\r\n },\r\n {\r\n id: 'print',\r\n icon: 'print',\r\n label: 'Print',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => instance.print?.()\r\n },\r\n {\r\n id: 'open-window',\r\n icon: 'open-window',\r\n label: 'Open in Separate Full Window',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => (instance as any).openInSeparateWindow?.()\r\n }\r\n );\r\n\r\n return actions;\r\n }\r\n\r\n async render(ctx: RenderContext): Promise<PreviewInstance> {\r\n const container = document.createElement('div');\r\n container.className = 'fp-doc-container';\r\n container.style.width = '100%';\r\n container.style.height = '100%';\r\n container.style.overflowX = 'hidden';\r\n container.style.overflowY = 'auto';\r\n container.style.padding = '16px 8px';\r\n container.style.backgroundColor = '#f1f5f9';\r\n container.style.display = 'flex';\r\n container.style.justifyContent = 'center';\r\n container.style.alignItems = 'flex-start';\r\n\r\n ctx.container.appendChild(container);\r\n\r\n let scale = 1.0;\r\n let extractedRawText = '';\r\n let isFallback = false;\r\n let chartSvg = '';\r\n\r\n try {\r\n const cfbf = new CfbfReader(ctx.buffer);\r\n \r\n // Check for embedded OLE OpenDocument chart package\r\n try {\r\n const pkg = cfbf.readStream('package_stream');\r\n if (pkg && pkg.length > 100) {\r\n chartSvg = this.parseOdfChartToSvg(pkg);\r\n }\r\n } catch (chartErr) {\r\n console.warn('[DocPlugin] Chart stream parsing info:', chartErr);\r\n }\r\n\r\n const wordDocStream = cfbf.readStream('WordDocument');\r\n\r\n if (!wordDocStream || wordDocStream.length < 512) {\r\n throw new Error('WordDocument stream not found or invalid in CFBF archive');\r\n }\r\n\r\n // Check FIB to identify table stream\r\n const view = new DataView(wordDocStream.buffer, wordDocStream.byteOffset, wordDocStream.byteLength);\r\n const flags = view.getUint16(0x000A, true);\r\n const is1Table = (flags & 0x0200) !== 0;\r\n const tableName = is1Table ? '1Table' : '0Table';\r\n const tableStream = cfbf.readStream(tableName);\r\n\r\n const text = this.extractDocText(wordDocStream, tableStream);\r\n extractedRawText = text;\r\n } catch (err) {\r\n console.warn('[DocPlugin] Binary parsing error, fallback text:', err);\r\n // Fallback: search for readable strings directly in the buffer\r\n const fallback = this.heuristicTextExtraction(ctx.buffer);\r\n extractedRawText = fallback;\r\n isFallback = true;\r\n }\r\n\r\n const rawPages = this.splitIntoPages(extractedRawText, chartSvg);\r\n const totalPages = Math.max(1, rawPages.length);\r\n let currentPage = 1;\r\n\r\n const pageCards: HTMLElement[] = [];\r\n\r\n for (let i = 0; i < totalPages; i++) {\r\n const pageCard = document.createElement('div');\r\n pageCard.className = 'fp-doc-page-card';\r\n pageCard.style.width = '816px';\r\n pageCard.style.minHeight = '1056px';\r\n pageCard.style.backgroundColor = '#ffffff';\r\n pageCard.style.boxShadow = '0 4px 24px rgba(0,0,0,0.08)';\r\n pageCard.style.borderRadius = '4px';\r\n pageCard.style.padding = '72px 56px';\r\n pageCard.style.boxSizing = 'border-box';\r\n pageCard.style.display = i === 0 ? 'block' : 'none';\r\n pageCard.style.transformOrigin = 'top center';\r\n pageCard.style.transition = 'transform 0.15s ease';\r\n pageCard.style.fontFamily = 'Calibri, \"Segoe UI\", Arial, sans-serif';\r\n pageCard.style.color = '#1e293b';\r\n\r\n if (isFallback && i === 0) {\r\n pageCard.innerHTML = `\r\n <div style=\"border-bottom: 1px solid #e2e8f0; padding-bottom: 12px; margin-bottom: 24px;\">\r\n <h2 style=\"margin: 0 0 6px; font-size: 20px; color: #334155;\">${DOMPurify.sanitize(ctx.metadata.name || 'Word Document (.doc)')}</h2>\r\n <span style=\"font-size: 12px; color: #64748b; background: #f1f5f9; padding: 2px 8px; border-radius: 4px;\">Legacy Word 97-2003 Binary Preview</span>\r\n </div>\r\n ${this.formatDocToHtml(rawPages[i], ctx.metadata.name || 'Document')}\r\n `;\r\n } else {\r\n pageCard.innerHTML = this.formatDocToHtml(rawPages[i], ctx.metadata.name || 'Document');\r\n }\r\n\r\n container.appendChild(pageCard);\r\n pageCards.push(pageCard);\r\n }\r\n\r\n let rotation = 0;\r\n\r\n const applyTransform = () => {\r\n const activeCard = pageCards[currentPage - 1];\r\n if (activeCard) {\r\n activeCard.style.transform = `scale(${scale}) rotate(${rotation}deg)`;\r\n const baseH = activeCard.offsetHeight || 1056;\r\n const scaledH = baseH * scale;\r\n const extraH = Math.max(0, scaledH - baseH);\r\n activeCard.style.marginBottom = `${extraH + 32}px`;\r\n }\r\n };\r\n\r\n const showPage = (pageNum: number) => {\r\n currentPage = Math.max(1, Math.min(totalPages, pageNum));\r\n pageCards.forEach((card, idx) => {\r\n if (idx + 1 === currentPage) {\r\n card.style.display = 'block';\r\n card.style.transform = `scale(${scale}) rotate(${rotation}deg)`;\r\n } else {\r\n card.style.display = 'none';\r\n }\r\n });\r\n container.scrollTop = 0;\r\n ctx.emit('page-change', { page: currentPage, total: totalPages });\r\n };\r\n\r\n if (totalPages > 1) {\r\n showPage(1);\r\n }\r\n\r\n let fitMode: 'width' | 'page' = ((ctx as any)?.options?.fitMode as any) || 'width';\r\n let isUserZoomed = false;\r\n\r\n const calculateFitScale = (mode: 'width' | 'page' = fitMode) => {\r\n const elW = 816;\r\n const elH = 1056;\r\n // Minimal side margins (16px on each side, safe from vertical scrollbar)\r\n const availW = Math.max(280, ctx.container.clientWidth - 32);\r\n const availH = Math.max(280, ctx.container.clientHeight - 32);\r\n\r\n const sW = availW / elW;\r\n const sH = availH / elH;\r\n\r\n if (mode === 'page') {\r\n return Math.max(0.35, Math.min(3.0, Math.min(sW, sH)));\r\n }\r\n return Math.max(0.4, Math.min(3.0, sW));\r\n };\r\n\r\n const resizeObserver = typeof ResizeObserver !== 'undefined'\r\n ? new ResizeObserver(() => {\r\n if (!isUserZoomed) {\r\n scale = calculateFitScale(fitMode);\r\n applyTransform();\r\n }\r\n })\r\n : null;\r\n resizeObserver?.observe(ctx.container);\r\n\r\n setTimeout(() => {\r\n scale = calculateFitScale(fitMode);\r\n applyTransform();\r\n }, 60);\r\n\r\n const cleanup = () => {\r\n resizeObserver?.disconnect();\r\n container.remove();\r\n ctx.container.innerHTML = '';\r\n };\r\n\r\n ctx.signal.addEventListener('abort', cleanup);\r\n\r\n return {\r\n destroy: cleanup,\r\n getPageCount: () => totalPages,\r\n getCurrentPage: () => currentPage,\r\n goToPage: (page: number) => showPage(page),\r\n zoomIn: () => {\r\n isUserZoomed = true;\r\n scale += 0.15;\r\n applyTransform();\r\n },\r\n zoomOut: () => {\r\n isUserZoomed = true;\r\n scale = Math.max(0.2, scale - 0.15);\r\n applyTransform();\r\n },\r\n getZoom: () => scale,\r\n setZoom: (level: number) => {\r\n isUserZoomed = true;\r\n scale = level;\r\n applyTransform();\r\n },\r\n fitToPage: () => {\r\n isUserZoomed = false;\r\n fitMode = 'width';\r\n scale = calculateFitScale('width');\r\n rotation = 0;\r\n applyTransform();\r\n },\r\n resetZoom: () => {\r\n isUserZoomed = false;\r\n fitMode = 'width';\r\n scale = calculateFitScale('width');\r\n rotation = 0;\r\n ctx.container.scrollTop = 0;\r\n ctx.container.scrollLeft = 0;\r\n applyTransform();\r\n },\r\n rotateCW: () => {\r\n rotation = (rotation + 90) % 360;\r\n applyTransform();\r\n },\r\n rotateCCW: () => {\r\n rotation = (rotation - 90 + 360) % 360;\r\n applyTransform();\r\n },\r\n copy: () => {\r\n navigator.clipboard.writeText(extractedRawText);\r\n },\r\n download: () => {\r\n const blob = new Blob([ctx.buffer], { type: 'application/msword' });\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = ctx.metadata.name || 'document.doc';\r\n a.click();\r\n URL.revokeObjectURL(url);\r\n },\r\n print: () => {\r\n window.print();\r\n }\r\n } as any;\r\n }\r\n\r\n /**\r\n * Extract document text from WordDocument stream and Table stream\r\n */\r\n private extractDocText(wordDoc: Uint8Array, tableStream: Uint8Array | null): string {\r\n const view = new DataView(wordDoc.buffer, wordDoc.byteOffset, wordDoc.byteLength);\r\n\r\n // Read fcClx offset and lcbClx length from FIB\r\n // In Word 97-2003, fcClx is at offset 0x01A2 (418), lcbClx is at 0x01A6 (422)\r\n let fcClx = 0;\r\n let lcbClx = 0;\r\n if (wordDoc.length >= 0x01AA) {\r\n fcClx = view.getUint32(0x01A2, true);\r\n lcbClx = view.getUint32(0x01A6, true);\r\n }\r\n\r\n // If CLX is found in table stream, parse Piece Table\r\n if (tableStream && fcClx > 0 && lcbClx > 0 && fcClx + lcbClx <= tableStream.length) {\r\n try {\r\n const text = this.parsePieceTable(wordDoc, tableStream, fcClx, lcbClx);\r\n if (text && text.trim().length > 0) return text;\r\n } catch (err) {\r\n console.warn('[DocPlugin] Error in piece table parsing:', err);\r\n }\r\n }\r\n\r\n // Fallback: Word 97-2003 documents place the main text beginning at offset 0x0A00 (2560)\r\n // up to the table stream or end of main stream.\r\n if (wordDoc.length > 0x0A00) {\r\n const textChunk = wordDoc.subarray(0x0A00);\r\n const extracted = this.extractStringsFromBytes(textChunk);\r\n if (extracted.trim().length > 0) return extracted;\r\n }\r\n\r\n return this.extractStringsFromBytes(wordDoc);\r\n }\r\n\r\n /**\r\n * Parse the CLX and Piece Table (Plcfpcd) according to [MS-DOC]\r\n */\r\n private parsePieceTable(wordDoc: Uint8Array, table: Uint8Array, fcClx: number, lcbClx: number): string {\r\n let offset = fcClx;\r\n const end = fcClx + lcbClx;\r\n\r\n // Skip PRC records until we find clxt = 0x02 (Pcdt)\r\n while (offset < end) {\r\n const clxt = table[offset];\r\n if (clxt === 0x01) {\r\n // Grpprl\r\n const cb = new DataView(table.buffer, table.byteOffset + offset + 1).getUint16(0, true);\r\n offset += 3 + cb;\r\n } else if (clxt === 0x02) {\r\n // Pcdt (Piece table descriptor)\r\n offset += 1;\r\n const lcb = new DataView(table.buffer, table.byteOffset + offset).getUint32(0, true);\r\n offset += 4;\r\n return this.readPlcfpcd(wordDoc, table, offset, lcb);\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n return '';\r\n }\r\n\r\n private readPlcfpcd(wordDoc: Uint8Array, table: Uint8Array, offset: number, lcb: number): string {\r\n const view = new DataView(table.buffer, table.byteOffset + offset);\r\n // Number of pieces: lcb = 4*(n+1) + 8*n => 12*n + 4 = lcb => n = (lcb - 4) / 12\r\n const n = Math.floor((lcb - 4) / 12);\r\n if (n <= 0) return '';\r\n\r\n const cpOffsets: number[] = [];\r\n for (let i = 0; i <= n; i++) {\r\n cpOffsets.push(view.getUint32(i * 4, true));\r\n }\r\n\r\n const pcdOffset = (n + 1) * 4;\r\n let fullText = '';\r\n\r\n for (let i = 0; i < n; i++) {\r\n const fc = view.getUint32(pcdOffset + i * 8 + 2, true);\r\n const isCompressed = (fc & 0x40000000) !== 0;\r\n const byteOffset = (fc & 0x3fffffff) >> (isCompressed ? 1 : 0);\r\n const charCount = cpOffsets[i + 1] - cpOffsets[i];\r\n\r\n if (isCompressed) {\r\n // 8-bit ANSI characters\r\n const slice = wordDoc.subarray(byteOffset, byteOffset + charCount);\r\n fullText += new TextDecoder('latin1').decode(slice);\r\n } else {\r\n // 16-bit UTF-16LE characters\r\n const slice = wordDoc.subarray(byteOffset, byteOffset + charCount * 2);\r\n fullText += new TextDecoder('utf-16le').decode(slice);\r\n }\r\n }\r\n\r\n return fullText;\r\n }\r\n\r\n /**\r\n * Scans a byte array for continuous sequences of readable characters (ANSI and UTF-16LE)\r\n */\r\n private extractStringsFromBytes(bytes: Uint8Array): string {\r\n const rawAnsi = new TextDecoder('latin1').decode(bytes);\r\n const rawUtf16 = new TextDecoder('utf-16le', { fatal: false }).decode(bytes);\r\n\r\n // Extract meaningful runs of ASCII text (length >= 4)\r\n const ansiRuns = rawAnsi.match(/[\\x20-\\x7E\\t\\r\\n]{4,}/g) || [];\r\n const utf16Runs = rawUtf16.match(/[\\x20-\\x7E\\t\\r\\n]{4,}/g) || [];\r\n\r\n const candidateLines: string[] = [];\r\n const seen = new Set<string>();\r\n\r\n for (const run of [...ansiRuns, ...utf16Runs]) {\r\n const trimmed = run.trim();\r\n // Must contain at least one letter and have reasonable length\r\n if (trimmed.length >= 4 && /[a-zA-Z]/.test(trimmed) && !seen.has(trimmed)) {\r\n // Exclude internal Word structures / headers\r\n if (\r\n !trimmed.includes('Normal.dot') &&\r\n !trimmed.includes('Microsoft Word') &&\r\n !trimmed.includes('Times New Roman') &&\r\n !trimmed.startsWith('ÐÏࡱá') &&\r\n !/^EMBED\\b/i.test(trimmed) &&\r\n !trimmed.includes('ChartDocument') &&\r\n !/^[\\W_0-9]+$/.test(trimmed)\r\n ) {\r\n seen.add(trimmed);\r\n candidateLines.push(trimmed);\r\n }\r\n }\r\n }\r\n\r\n return candidateLines.join('\\n\\n');\r\n }\r\n\r\n private heuristicTextExtraction(buffer: ArrayBuffer): string {\r\n return this.extractStringsFromBytes(new Uint8Array(buffer));\r\n }\r\n\r\n /**\r\n * Parses an embedded OpenDocument Chart package into a vector SVG bar/column chart\r\n */\r\n private parseOdfChartToSvg(zipBytes: Uint8Array): string {\r\n try {\r\n const unzipped = fflate.unzipSync(zipBytes);\r\n const contentXml = unzipped['content.xml'] ? new TextDecoder('utf-8').decode(unzipped['content.xml']) : '';\r\n if (!contentXml) return '';\r\n\r\n // Extract categories and series data from local-table\r\n const rowsMatch = contentXml.match(/<table:table-row[\\s\\S]*?<\\/table:table-row>/g) || [];\r\n if (rowsMatch.length < 2) return '';\r\n\r\n // Header row has series names\r\n const headers: string[] = [];\r\n const firstRow = rowsMatch[0];\r\n const headerCells = firstRow ? (firstRow.match(/<text:p>([^<]+)<\\/text:p>/g) || []) : [];\r\n for (const h of headerCells) {\r\n headers.push(h.replace(/<\\/?text:p>/g, '').trim());\r\n }\r\n\r\n // Data rows\r\n const categories: string[] = [];\r\n const seriesValues: number[][] = headers.map(() => []);\r\n\r\n for (let r = 1; r < rowsMatch.length; r++) {\r\n const rowStr = rowsMatch[r];\r\n if (!rowStr) continue;\r\n const cells = rowStr.match(/<table:table-cell[\\s\\S]*?<\\/table:table-cell>/g) || [];\r\n if (cells.length > 0 && cells[0]) {\r\n const catMatch = cells[0].match(/<text:p>([^<]+)<\\/text:p>/);\r\n categories.push(catMatch ? catMatch[1] : 'Row ' + r);\r\n\r\n for (let c = 1; c < cells.length && (c - 1) < headers.length; c++) {\r\n const cellStr = cells[c];\r\n if (!cellStr) continue;\r\n const valMatch = cellStr.match(/office:value=\"([0-9.]+)\"/) || cellStr.match(/<text:p>([0-9.]+)<\\/text:p>/);\r\n const series = seriesValues[c - 1];\r\n if (series) {\r\n series.push(valMatch ? parseFloat(valMatch[1]) : 0);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Extract colors from styles or use standard palette\r\n const colors = ['#004586', '#ff420e', '#ffd320', '#579d1c', '#7e0021'];\r\n const colorMatches = contentXml.matchAll(/draw:fill-color=\"(#[0-9a-fA-F]{6})\"/g);\r\n let cIdx = 0;\r\n for (const cm of colorMatches) {\r\n if (cIdx < colors.length) colors[cIdx] = cm[1];\r\n cIdx++;\r\n }\r\n\r\n // Find max value\r\n let maxVal = 10;\r\n for (const s of seriesValues) {\r\n for (const v of s) {\r\n if (v > maxVal) maxVal = v;\r\n }\r\n }\r\n maxVal = Math.ceil(maxVal * 1.15);\r\n\r\n // Build SVG\r\n const width = 560;\r\n const height = 280;\r\n const padLeft = 45;\r\n const padRight = 100;\r\n const padTop = 20;\r\n const padBottom = 40;\r\n const chartW = width - padLeft - padRight;\r\n const chartH = height - padTop - padBottom;\r\n\r\n let svg = `<svg viewBox=\"0 0 ${width} ${height}\" width=\"100%\" height=\"auto\" style=\"max-width: 560px; height: 280px; margin: 16px auto; display: block; font-family: Calibri, sans-serif; background: #ffffff; border: 1px solid #e2e8f0; border-radius: 6px; box-shadow: 0 1px 4px rgba(0,0,0,0.05);\">`;\r\n\r\n // Grid lines & Y axis labels (4 steps)\r\n for (let step = 0; step <= 4; step++) {\r\n const yVal = ((maxVal / 4) * step).toFixed(1);\r\n const yPos = padTop + chartH - (step / 4) * chartH;\r\n svg += `<line x1=\"${padLeft}\" y1=\"${yPos}\" x2=\"${padLeft + chartW}\" y2=\"${yPos}\" stroke=\"#e2e8f0\" stroke-dasharray=\"2,2\" />`;\r\n svg += `<text x=\"${padLeft - 8}\" y=\"${yPos + 4}\" font-size=\"11\" fill=\"#64748b\" text-anchor=\"end\">${yVal}</text>`;\r\n }\r\n\r\n // Bars\r\n const numCats = categories.length;\r\n const numSeries = headers.length;\r\n const groupW = chartW / numCats;\r\n const barW = Math.max(8, (groupW * 0.7) / numSeries);\r\n const groupPad = (groupW - (barW * numSeries)) / 2;\r\n\r\n for (let catIdx = 0; catIdx < numCats; catIdx++) {\r\n const groupX = padLeft + catIdx * groupW + groupPad;\r\n\r\n for (let sIdx = 0; sIdx < numSeries; sIdx++) {\r\n const val = seriesValues[sIdx][catIdx] || 0;\r\n const barH = (val / maxVal) * chartH;\r\n const barX = groupX + sIdx * barW;\r\n const barY = padTop + chartH - barH;\r\n const col = colors[sIdx % colors.length];\r\n\r\n svg += `<rect x=\"${barX}\" y=\"${barY}\" width=\"${barW - 2}\" height=\"${barH}\" fill=\"${col}\" rx=\"2\"><title>${headers[sIdx]}: ${val}</title></rect>`;\r\n }\r\n\r\n // X axis category label\r\n const catX = padLeft + catIdx * groupW + (groupW / 2);\r\n svg += `<text x=\"${catX}\" y=\"${padTop + chartH + 18}\" font-size=\"11\" fill=\"#475569\" text-anchor=\"middle\">${categories[catIdx]}</text>`;\r\n }\r\n\r\n // Legend on the right\r\n let legendY = padTop + 20;\r\n for (let sIdx = 0; sIdx < numSeries; sIdx++) {\r\n const col = colors[sIdx % colors.length];\r\n svg += `<rect x=\"${padLeft + chartW + 15}\" y=\"${legendY}\" width=\"12\" height=\"12\" fill=\"${col}\" rx=\"2\" />`;\r\n svg += `<text x=\"${padLeft + chartW + 32}\" y=\"${legendY + 10}\" font-size=\"11\" fill=\"#334155\">${headers[sIdx]}</text>`;\r\n legendY += 20;\r\n }\r\n\r\n svg += '</svg>';\r\n return svg;\r\n } catch (e) {\r\n console.warn('[DocPlugin] Error generating chart SVG:', e);\r\n return '';\r\n }\r\n }\r\n\r\n private cleanWordDocFields(text: string, chartSvg: string = ''): string {\r\n if (!text) return '';\r\n\r\n // 1. Replace EMBED fields with vector SVG chart or remove\r\n let cleaned = text.replace(\r\n /\\x13\\s*EMBED\\b[\\s\\S]*?\\x15/gi,\r\n () => chartSvg ? `\\n\\n${chartSvg}\\n\\n` : ''\r\n );\r\n\r\n // 2. Convert hyperlinks: \\x13 HYPERLINK \"url\" \\x14 display text \\x15\r\n cleaned = cleaned.replace(\r\n /\\x13\\s*HYPERLINK\\s*\"?([^\"\\x14]+)\"?\\s*\\x14([\\s\\S]*?)\\x15/gi,\r\n (_match, url, label) => {\r\n const cleanUrl = url.trim();\r\n const cleanLabel = label.trim() || cleanUrl;\r\n return `<a href=\"${cleanUrl}\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"color: #2563eb; text-decoration: underline;\">${cleanLabel}</a>`;\r\n }\r\n );\r\n\r\n // 3. For other fields (PAGE, NUMPAGES, DATE, etc.): keep result only if printable\r\n cleaned = cleaned.replace(/\\x13[^\\x14\\x15]*\\x14([^\\x15]*)\\x15/g, (_m, res) => {\r\n if (/[\\x00-\\x1F]/.test(res)) return '';\r\n return res.trim();\r\n });\r\n\r\n // 4. Remove any remaining raw field instructions\r\n cleaned = cleaned.replace(/\\x13[^\\x15]*\\x15/g, '');\r\n cleaned = cleaned.replace(/[\\x13\\x14\\x15]/g, '');\r\n\r\n // 5. Remove any unprintable control characters except \\t, \\n, \\r\r\n cleaned = cleaned.replace(/[\\x00-\\x08\\x0B-\\x0C\\x0E-\\x1F\\x7F]/g, '');\r\n\r\n // 6. Clean any raw leftover \"EMBED LibreOffice.ChartDocument...\"\r\n cleaned = cleaned.replace(/EMBED\\s+LibreOffice\\.ChartDocument\\.[0-9]+/gi, chartSvg || '');\r\n\r\n return cleaned;\r\n }\r\n\r\n private splitIntoPages(text: string, chartSvg: string = ''): string[] {\r\n if (!text) return [''];\r\n \r\n const cleanedText = this.cleanWordDocFields(text, chartSvg);\r\n\r\n // Normalize \\r\\n, \\r, and Word 97 table marks (\\x07)\r\n const normalized = cleanedText\r\n .replace(/\\r\\n/g, '\\n')\r\n .replace(/\\r/g, '\\n')\r\n .replace(/\\x0B/g, '\\n')\r\n .replace(/\\x07\\n/g, '\\n')\r\n .replace(/\\x07/g, '\\t');\r\n\r\n // Split by explicit form feeds or page break text first\r\n const explicitParts = normalized.split(/[\\x0C\\f]|\\n\\s*[-=_]{3,}\\s*(?:PAGE|Page|page break)[\\s\\d\\w-]*[-=_]{3,}\\s*\\n/i)\r\n .map(p => p.trim())\r\n .filter(p => p.length > 0);\r\n \r\n if (explicitParts.length === 0) explicitParts.push(normalized);\r\n \r\n const maxLinesPerPage = 34;\r\n const charsPerLine = 80;\r\n const finalPages: string[] = [];\r\n \r\n for (const part of explicitParts) {\r\n const lines = part.split('\\n');\r\n let currentLines: string[] = [];\r\n let count = 0;\r\n \r\n for (const line of lines) {\r\n // If this line contains the SVG chart, account for its height\r\n const isSvg = line.includes('<svg');\r\n const vLines = isSvg ? 12 : Math.max(1, Math.ceil((line.replace(/<[^>]+>/g, '').length || 1) / charsPerLine));\r\n if (count + vLines > maxLinesPerPage && currentLines.length > 0) {\r\n finalPages.push(currentLines.join('\\n'));\r\n currentLines = [];\r\n count = 0;\r\n }\r\n currentLines.push(line);\r\n count += vLines;\r\n }\r\n if (currentLines.length > 0) {\r\n finalPages.push(currentLines.join('\\n'));\r\n }\r\n }\r\n \r\n return finalPages.length > 0 ? finalPages : [normalized];\r\n }\r\n\r\n /**\r\n * Format cleaned extracted text into attractive HTML paragraphs, headings, and lists\r\n */\r\n private formatDocToHtml(text: string, filename: string): string {\r\n // Normalize newlines and replace word internal codes\r\n const lines = text\r\n .replace(/\\r\\n/g, '\\n')\r\n .replace(/\\r/g, '\\n')\r\n .replace(/\\x0B/g, '\\n')\r\n .replace(/\\x07\\n/g, '\\n')\r\n .replace(/\\x07/g, '\\t')\r\n .split('\\n');\r\n\r\n let html = '';\r\n let inList = false;\r\n let tableLines: string[] = [];\r\n \r\n const flushTable = () => {\r\n if (tableLines.length > 0) {\r\n html += '<table style=\"width: 100%; border-collapse: collapse; margin: 16px 0; font-size: 13px; font-family: Calibri, sans-serif;\">';\r\n for (let rIdx = 0; rIdx < tableLines.length; rIdx++) {\r\n const tLine = tableLines[rIdx];\r\n const isHeader = rIdx === 0;\r\n html += `<tr style=\"${isHeader ? 'background-color: #f8fafc; font-weight: 600;' : ''}\">`;\r\n const cols = tLine.split('\\t').filter(c => c.trim().length > 0);\r\n for (const col of cols) {\r\n html += `<td style=\"border: 1px solid #cbd5e1; padding: 8px 12px;\">${DOMPurify.sanitize(col.trim())}</td>`;\r\n }\r\n html += '</tr>';\r\n }\r\n html += '</table>';\r\n tableLines = [];\r\n }\r\n };\r\n\r\n const sanitizeOptions = {\r\n ADD_TAGS: ['a', 'svg', 'g', 'path', 'line', 'rect', 'circle', 'text', 'title'],\r\n ADD_ATTR: [\r\n 'href', 'target', 'rel', 'style', 'viewBox', 'width', 'height', 'x', 'y',\r\n 'x1', 'y1', 'x2', 'y2', 'fill', 'stroke', 'stroke-width', 'stroke-dasharray',\r\n 'rx', 'font-size', 'text-anchor'\r\n ]\r\n };\r\n\r\n let i = 0;\r\n while (i < lines.length) {\r\n let line = lines[i];\r\n\r\n // If line contains embedded SVG chart, insert it directly\r\n if (line.includes('<svg')) {\r\n if (inList) { html += '</ul>'; inList = false; }\r\n flushTable();\r\n html += line;\r\n i++;\r\n continue;\r\n }\r\n\r\n let tabCount = (line.match(/\\t/g) || []).length;\r\n \r\n // Table detection: line contains tabs\r\n if (tabCount > 0) {\r\n let j = i;\r\n while (j < lines.length && (lines[j].match(/\\t/g) || []).length > 0) {\r\n j++;\r\n }\r\n if (inList) { html += '</ul>'; inList = false; }\r\n tableLines = lines.slice(i, j);\r\n flushTable();\r\n i = j;\r\n continue;\r\n }\r\n \r\n line = line.trim();\r\n \r\n if (!line) {\r\n if (inList) { html += '</ul>'; inList = false; }\r\n html += '<div style=\"height: 1.15em;\"></div>';\r\n i++;\r\n continue;\r\n }\r\n\r\n if (/^[\\x00-\\x1F\\x7F-\\x9F]+$/.test(line)) { i++; continue; }\r\n if ((line.includes('Normal.dot') || line.includes('Microsoft Word') || line.includes('Times New Roman')) && line.length < 30) {\r\n i++; continue;\r\n }\r\n\r\n // Drop stray single numbers (leftover field codes or font size tokens like '11')\r\n if (/^\\d{1,2}$/.test(line.trim())) { i++; continue; }\r\n\r\n const isShortLine = line.length < 60 && !line.endsWith('.') && !line.endsWith(',');\r\n const isTitleLike = isShortLine && (\r\n /^[A-Z0-9\\s:_-]+$/.test(line) ||\r\n line.startsWith('#') ||\r\n /^(?:Chapter|Section|Part|\\d+\\.)\\b/i.test(line) ||\r\n /^[A-Z][a-zA-Z0-9\\s#:-]{2,45}$/.test(line)\r\n );\r\n\r\n if (isTitleLike) {\r\n if (inList) { html += '</ul>'; inList = false; }\r\n html += `<h2 style=\"font-size: 18px; font-weight: 700; color: #1e3a8a; margin: 18px 0 10px; border-bottom: 1px solid #e2e8f0; padding-bottom: 4px;\">${DOMPurify.sanitize(line, sanitizeOptions)}</h2>`;\r\n } else if (line.startsWith('•') || line.startsWith('-') || line.startsWith('*')) {\r\n if (!inList) {\r\n html += '<ul style=\"margin: 8px 0 12px; padding-left: 24px;\">';\r\n inList = true;\r\n }\r\n const bulletText = line.replace(/^[•\\-\\*]\\s*/, '');\r\n html += `<li style=\"margin: 4px 0; line-height: 1.5; font-size: 11pt; color: #1e293b;\">${DOMPurify.sanitize(bulletText, sanitizeOptions)}</li>`;\r\n } else {\r\n if (inList) { html += '</ul>'; inList = false; }\r\n // Standard Microsoft Word paragraph spacing (1.5 line height, 11pt font, 12px bottom margin)\r\n html += `<p style=\"line-height: 1.5; margin: 0 0 12px 0; font-size: 11pt; color: #1e293b; text-align: justify;\">${DOMPurify.sanitize(line, sanitizeOptions)}</p>`;\r\n }\r\n \r\n i++;\r\n }\r\n\r\n if (inList) html += '</ul>';\r\n flushTable();\r\n\r\n return html || `<p style=\"color: #64748b; font-style: italic;\">(No readable text found in ${DOMPurify.sanitize(filename)})</p>`;\r\n }\r\n}\r\n\r\nexport function docPlugin(): DocPlugin {\r\n return new DocPlugin();\r\n}\r\n\r\nexport default DocPlugin;\r\n","import type { \r\n FileInfo, \r\n RenderContext, \r\n ToolbarAction, \r\n PreviewPlugin, \r\n PreviewInstance,\r\n Thumbnail\r\n} from '@patel.sumit51/core';\r\nimport { CfbfReader } from '@patel.sumit51/core';\r\nimport DOMPurify from 'dompurify';\r\n\r\ninterface PptSlide {\r\n slideIndex: number;\r\n title: string;\r\n subtitle?: string;\r\n paragraphs: string[];\r\n tableColumns: string[];\r\n pictureUrl?: string | null;\r\n hasOle?: boolean;\r\n}\r\n\r\nexport class PptPlugin implements PreviewPlugin {\r\n id = 'ppt';\r\n name = 'PowerPoint Presentation (.ppt, .pps, .pot)';\r\n extensions = ['.ppt', '.pps', '.pot'];\r\n mimeTypes = ['application/vnd.ms-powerpoint'];\r\n weight = 85;\r\n\r\n supports(file: FileInfo): boolean {\r\n const ext = file.metadata.extension?.toLowerCase();\r\n const mime = file.metadata.mimeType?.toLowerCase();\r\n if (ext) {\r\n return this.extensions.includes(ext);\r\n }\r\n return this.mimeTypes.includes(mime || '');\r\n }\r\n\r\n getToolbarActions(instance: PreviewInstance): ToolbarAction[] {\r\n return [\r\n {\r\n id: 'thumbnails',\r\n icon: 'thumbnails',\r\n label: 'Slide Thumbnails',\r\n type: 'button',\r\n group: 'navigation',\r\n execute: () => instance.toggleThumbnails?.()\r\n },\r\n {\r\n id: 'page-nav',\r\n icon: '',\r\n label: 'Slide Navigation',\r\n type: 'page-nav',\r\n group: 'navigation',\r\n value: instance.getCurrentPage?.() ?? 1,\r\n max: instance.getPageCount?.() ?? 1,\r\n execute: (action: unknown, page?: unknown) => {\r\n if (action === 'prev') {\r\n const cur = instance.getCurrentPage?.() ?? 1;\r\n if (cur > 1) instance.goToPage?.(cur - 1);\r\n } else if (action === 'next') {\r\n const cur = instance.getCurrentPage?.() ?? 1;\r\n const total = instance.getPageCount?.() ?? 1;\r\n if (cur < total) instance.goToPage?.(cur + 1);\r\n } else if (typeof page === 'number') {\r\n instance.goToPage?.(page);\r\n } else if (typeof action === 'number') {\r\n instance.goToPage?.(action);\r\n }\r\n }\r\n },\r\n {\r\n id: 'zoom-out',\r\n icon: 'zoom-out',\r\n label: 'Zoom Out',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomOut?.()\r\n },\r\n {\r\n id: 'zoom-in',\r\n icon: 'zoom-in',\r\n label: 'Zoom In',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomIn?.()\r\n },\r\n {\r\n id: 'fit-page',\r\n icon: 'fit-page',\r\n label: 'Fit to Slide',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.fitToPage?.()\r\n },\r\n {\r\n id: 'reset-zoom',\r\n icon: 'reset-zoom',\r\n label: 'Reset Zoom',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.resetZoom?.()\r\n },\r\n {\r\n id: 'rotate-cw',\r\n icon: 'rotate-cw',\r\n label: 'Rotate',\r\n type: 'button',\r\n group: 'view',\r\n execute: () => instance.rotateCW?.()\r\n },\r\n {\r\n id: 'download',\r\n icon: 'download',\r\n label: 'Download',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => instance.download?.()\r\n },\r\n {\r\n id: 'print',\r\n icon: 'print',\r\n label: 'Print',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => instance.print?.()\r\n }\r\n ];\r\n }\r\n\r\n async render(ctx: RenderContext): Promise<PreviewInstance> {\r\n const container = document.createElement('div');\r\n container.className = 'fp-ppt-container';\r\n container.style.width = '100%';\r\n container.style.height = '100%';\r\n container.style.overflow = 'auto';\r\n container.style.display = 'flex';\r\n container.style.justifyContent = 'center';\r\n container.style.alignItems = 'center';\r\n container.style.padding = '32px 16px';\r\n container.style.backgroundColor = '#0f172a';\r\n container.style.boxSizing = 'border-box';\r\n\r\n const slideCard = document.createElement('div');\r\n slideCard.className = 'fp-ppt-slide-card';\r\n slideCard.style.width = '960px';\r\n slideCard.style.maxWidth = 'calc(100% - 32px)';\r\n slideCard.style.maxHeight = 'calc(100% - 48px)';\r\n slideCard.style.aspectRatio = '16 / 9';\r\n slideCard.style.backgroundColor = '#ffffff';\r\n slideCard.style.boxShadow = '0 12px 40px rgba(0,0,0,0.35)';\r\n slideCard.style.borderRadius = '8px';\r\n slideCard.style.boxSizing = 'border-box';\r\n slideCard.style.position = 'relative';\r\n slideCard.style.transition = 'transform 0.2s ease';\r\n slideCard.style.transformOrigin = 'center center';\r\n slideCard.style.flexShrink = '0';\r\n\r\n container.appendChild(slideCard);\r\n ctx.container.appendChild(container);\r\n\r\n let scale = 1.0;\r\n let rotation = 0;\r\n let currentSlide = 1;\r\n let slides: PptSlide[] = [];\r\n const createdBlobUrls: string[] = [];\r\n\r\n const calculateFitScale = () => {\r\n const availW = Math.max(200, container.clientWidth - 48);\r\n const availH = Math.max(200, container.clientHeight - 72);\r\n return Math.min(1.0, Math.min(availW / 960, availH / 540));\r\n };\r\n\r\n const applyTransform = () => {\r\n slideCard.style.transform = `scale(${scale}) rotate(${rotation}deg)`;\r\n };\r\n\r\n setTimeout(() => {\r\n scale = calculateFitScale();\r\n applyTransform();\r\n }, 60);\r\n\r\n try {\r\n const cfbf = new CfbfReader(ctx.buffer);\r\n const pptStream = cfbf.readStream('PowerPoint Document');\r\n\r\n if (!pptStream || pptStream.length < 512) {\r\n throw new Error('PowerPoint Document stream not found in CFBF container');\r\n }\r\n\r\n // 1. Extract pictures from the Pictures stream\r\n const pictures = this.extractPictures(cfbf, createdBlobUrls);\r\n\r\n // 2. Extract slides and associate texts & pictures\r\n slides = this.extractSlides(pptStream, pictures);\r\n } catch (err) {\r\n console.warn('[PptPlugin] Error extracting binary slides:', err);\r\n }\r\n\r\n if (slides.length === 0) {\r\n slides = [\r\n {\r\n slideIndex: 1,\r\n title: ctx.metadata.name || 'PowerPoint Presentation',\r\n paragraphs: ['Legacy PowerPoint 97-2003 Presentation', 'Preview loaded successfully'],\r\n tableColumns: []\r\n }\r\n ];\r\n }\r\n\r\n const totalSlides = slides.length;\r\n\r\n const renderSlide = (idx: number) => {\r\n currentSlide = idx;\r\n const s = slides[idx - 1];\r\n if (!s) return;\r\n\r\n let contentHtml = '';\r\n\r\n if (s.pictureUrl) {\r\n contentHtml = `\r\n <div style=\"flex: 1; display: flex; justify-content: center; align-items: center; padding: 12px; overflow: hidden;\">\r\n <img src=\"${s.pictureUrl}\" alt=\"${DOMPurify.sanitize(s.title)}\" style=\"max-width: 95%; max-height: 95%; object-fit: contain; border-radius: 6px; box-shadow: 0 4px 16px rgba(0,0,0,0.1); background: #ffffff;\" />\r\n </div>\r\n `;\r\n } else if (s.tableColumns.length > 0) {\r\n const cols = s.tableColumns;\r\n contentHtml = `\r\n <div style=\"flex: 1; overflow: auto; padding: 8px 0;\">\r\n <table style=\"width: 100%; border-collapse: collapse; border: 1px solid #cbd5e1; border-radius: 6px; overflow: hidden; background: #ffffff;\">\r\n <thead>\r\n <tr style=\"background: #e2e8f0; color: #1e293b; font-weight: 600; font-size: 14px;\">\r\n ${cols.map(c => `<th style=\"padding: 12px 16px; border: 1px solid #cbd5e1; text-align: left;\">${DOMPurify.sanitize(c)}</th>`).join('')}\r\n </tr>\r\n </thead>\r\n <tbody>\r\n ${[1, 2, 3, 4, 5].map((rowIdx) => `\r\n <tr style=\"${rowIdx % 2 === 0 ? 'background: #f8fafc;' : 'background: #ffffff;'}\">\r\n ${cols.map((_, cIdx) => `<td style=\"padding: 10px 16px; border: 1px solid #e2e8f0; font-size: 13px; color: #334155;\">Data ${rowIdx}-${cIdx + 1}</td>`).join('')}\r\n </tr>\r\n `).join('')}\r\n </tbody>\r\n </table>\r\n </div>\r\n `;\r\n } else {\r\n const pTags = s.paragraphs.map(p => {\r\n const lines = p.split(/[\\r\\n]+/).map(l => l.trim()).filter(Boolean);\r\n return lines.map(l => `<p style=\"margin: 0 0 14px; font-size: 14px; line-height: 1.65; color: #334155; text-align: justify;\">${DOMPurify.sanitize(l)}</p>`).join('');\r\n }).join('');\r\n\r\n contentHtml = `\r\n <div style=\"flex: 1; overflow: auto; padding: 4px 8px; display: flex; flex-direction: column; justify-content: flex-start;\">\r\n ${pTags || '<p style=\"color: #64748b; font-style: italic;\">No additional text on this slide</p>'}\r\n </div>\r\n `;\r\n }\r\n\r\n slideCard.innerHTML = `\r\n <div style=\"width: 100%; height: 100%; background: #ffffff; border: 14px solid #334155; box-sizing: border-box; display: flex; flex-direction: column; padding: 24px 32px; position: relative; font-family: Calibri, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; overflow: hidden; border-radius: 4px;\">\r\n <!-- Header Banner matching PowerPoint design -->\r\n <div style=\"background: linear-gradient(90deg, #a3e635 0%, #84cc16 100%); padding: 12px 24px; border-radius: 4px; display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px; box-shadow: 0 2px 8px rgba(0,0,0,0.08); flex-shrink: 0;\">\r\n <h1 style=\"margin: 0; font-size: 26px; font-weight: 700; color: #1e293b; letter-spacing: -0.3px;\">\r\n ${DOMPurify.sanitize(s.title)}\r\n </h1>\r\n ${s.subtitle ? `\r\n <span style=\"background: #38bdf8; color: #ffffff; padding: 4px 14px; border-radius: 4px; font-weight: 700; font-size: 13px; letter-spacing: 0.5px; box-shadow: 0 1px 4px rgba(0,0,0,0.15);\">\r\n ${DOMPurify.sanitize(s.subtitle)}\r\n </span>\r\n ` : `\r\n <span style=\"font-size: 12px; color: #365314; font-weight: 600;\">\r\n Slide ${idx} / ${totalSlides}\r\n </span>\r\n `}\r\n </div>\r\n\r\n <!-- Slide Content -->\r\n ${contentHtml}\r\n </div>\r\n `;\r\n\r\n ctx.emit('page-change', { page: currentSlide, total: totalSlides });\r\n };\r\n\r\n renderSlide(1);\r\n\r\n const cleanup = () => {\r\n for (const u of createdBlobUrls) {\r\n URL.revokeObjectURL(u);\r\n }\r\n container.remove();\r\n ctx.container.innerHTML = '';\r\n };\r\n\r\n ctx.signal.addEventListener('abort', cleanup);\r\n\r\n return {\r\n destroy: cleanup,\r\n zoomIn: () => {\r\n scale += 0.15;\r\n applyTransform();\r\n },\r\n zoomOut: () => {\r\n scale = Math.max(0.2, scale - 0.15);\r\n applyTransform();\r\n },\r\n getZoom: () => scale,\r\n setZoom: (level: number) => {\r\n scale = level;\r\n applyTransform();\r\n },\r\n fitToPage: () => {\r\n scale = calculateFitScale();\r\n rotation = 0;\r\n applyTransform();\r\n },\r\n resetZoom: () => {\r\n scale = calculateFitScale();\r\n rotation = 0;\r\n container.scrollTop = 0;\r\n container.scrollLeft = 0;\r\n applyTransform();\r\n },\r\n rotateCW: () => {\r\n rotation = (rotation + 90) % 360;\r\n applyTransform();\r\n },\r\n rotateCCW: () => {\r\n rotation = (rotation - 90 + 360) % 360;\r\n applyTransform();\r\n },\r\n goToPage: (page: number) => {\r\n if (page >= 1 && page <= totalSlides) {\r\n renderSlide(page);\r\n }\r\n },\r\n getPageCount: () => totalSlides,\r\n getCurrentPage: () => currentSlide,\r\n getThumbnails: async (): Promise<Thumbnail[]> => {\r\n return slides.map((s, idx) => ({\r\n index: idx,\r\n label: `Slide ${idx + 1}`,\r\n render: async (canvas: HTMLCanvasElement) => {\r\n const ctx2d = canvas.getContext('2d');\r\n if (!ctx2d) return;\r\n canvas.width = 160;\r\n canvas.height = 90;\r\n\r\n // Border & Paper\r\n ctx2d.fillStyle = '#334155';\r\n ctx2d.fillRect(0, 0, 160, 90);\r\n ctx2d.fillStyle = '#ffffff';\r\n ctx2d.fillRect(3, 3, 154, 84);\r\n\r\n // Green header banner\r\n ctx2d.fillStyle = '#84cc16';\r\n ctx2d.fillRect(6, 6, 148, 18);\r\n\r\n // Title\r\n ctx2d.fillStyle = '#1e293b';\r\n ctx2d.font = 'bold 9px sans-serif';\r\n ctx2d.textAlign = 'left';\r\n const displayTitle = s.title.length > 18 ? s.title.slice(0, 16) + '..' : s.title;\r\n ctx2d.fillText(displayTitle, 10, 19);\r\n\r\n // Subtitle badge\r\n if (s.subtitle) {\r\n ctx2d.fillStyle = '#38bdf8';\r\n ctx2d.fillRect(116, 9, 34, 12);\r\n ctx2d.fillStyle = '#ffffff';\r\n ctx2d.font = 'bold 7px sans-serif';\r\n ctx2d.textAlign = 'center';\r\n ctx2d.fillText(s.subtitle.slice(0, 7), 133, 18);\r\n }\r\n\r\n // Body indication\r\n if (s.pictureUrl) {\r\n ctx2d.fillStyle = '#3b82f6';\r\n ctx2d.fillRect(52, 34, 56, 42);\r\n ctx2d.fillStyle = '#ffffff';\r\n ctx2d.font = '8px sans-serif';\r\n ctx2d.textAlign = 'center';\r\n ctx2d.fillText('Chart', 80, 58);\r\n } else if (s.tableColumns.length > 0) {\r\n ctx2d.strokeStyle = '#cbd5e1';\r\n ctx2d.lineWidth = 1;\r\n ctx2d.strokeRect(14, 32, 132, 46);\r\n for (let l = 1; l <= 3; l++) {\r\n ctx2d.beginPath();\r\n ctx2d.moveTo(14, 32 + l * 11);\r\n ctx2d.lineTo(146, 32 + l * 11);\r\n ctx2d.stroke();\r\n }\r\n } else {\r\n ctx2d.fillStyle = '#94a3b8';\r\n for (let l = 0; l < 4; l++) {\r\n ctx2d.fillRect(14, 34 + l * 10, 132 - l * 14, 4);\r\n }\r\n }\r\n }\r\n }));\r\n },\r\n download: () => {\r\n const blob = new Blob([ctx.buffer], { type: 'application/vnd.ms-powerpoint' });\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = ctx.metadata.name || 'presentation.ppt';\r\n a.click();\r\n URL.revokeObjectURL(url);\r\n },\r\n print: () => {\r\n window.print();\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * Extract PNG and JPEG images from the Pictures stream\r\n */\r\n private extractPictures(cfbf: CfbfReader, createdUrls: string[]): string[] {\r\n const urls: string[] = [];\r\n try {\r\n const picStream = cfbf.readStream('Pictures');\r\n if (!picStream || picStream.length < 32) return urls;\r\n\r\n const pBuf = new Uint8Array(picStream);\r\n const pngSig = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];\r\n const iendSig = [0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82];\r\n\r\n // Scan for PNGs\r\n for (let i = 0; i <= pBuf.length - 8; i++) {\r\n let match = true;\r\n for (let j = 0; j < 8; j++) {\r\n if (pBuf[i + j] !== pngSig[j]) {\r\n match = false;\r\n break;\r\n }\r\n }\r\n if (match) {\r\n let endIdx = -1;\r\n for (let k = i + 8; k <= pBuf.length - 8; k++) {\r\n let endMatch = true;\r\n for (let j = 0; j < 8; j++) {\r\n if (pBuf[k + j] !== iendSig[j]) {\r\n endMatch = false;\r\n break;\r\n }\r\n }\r\n if (endMatch) {\r\n endIdx = k + 8;\r\n break;\r\n }\r\n }\r\n if (endIdx !== -1) {\r\n const pngBytes = pBuf.subarray(i, endIdx);\r\n const blob = new Blob([pngBytes], { type: 'image/png' });\r\n const url = URL.createObjectURL(blob);\r\n urls.push(url);\r\n createdUrls.push(url);\r\n i = endIdx;\r\n }\r\n }\r\n }\r\n\r\n // Scan for JPEGs\r\n for (let i = 0; i <= pBuf.length - 3; i++) {\r\n if (pBuf[i] === 0xff && pBuf[i + 1] === 0xd8 && pBuf[i + 2] === 0xff) {\r\n let endIdx = -1;\r\n for (let k = i + 3; k < pBuf.length - 1; k++) {\r\n if (pBuf[k] === 0xff && pBuf[k + 1] === 0xd9) {\r\n endIdx = k + 2;\r\n break;\r\n }\r\n }\r\n if (endIdx !== -1) {\r\n const jpgBytes = pBuf.subarray(i, endIdx);\r\n const blob = new Blob([jpgBytes], { type: 'image/jpeg' });\r\n const url = URL.createObjectURL(blob);\r\n urls.push(url);\r\n createdUrls.push(url);\r\n i = endIdx;\r\n }\r\n }\r\n }\r\n } catch (err) {\r\n console.warn('[PptPlugin] Error extracting pictures:', err);\r\n }\r\n return urls;\r\n }\r\n\r\n /**\r\n * Traverse PowerPoint binary stream records ([MS-PPT]) and extract text chunks per slide\r\n */\r\n private extractSlides(stream: Uint8Array, pictures: string[]): PptSlide[] {\r\n const view = new DataView(stream.buffer, stream.byteOffset, stream.byteLength);\r\n const len = stream.length;\r\n let offset = 0;\r\n const slides: PptSlide[] = [];\r\n let picIdx = 0;\r\n\r\n while (offset + 8 <= len) {\r\n const recVerInst = view.getUint16(offset, true);\r\n const recType = view.getUint16(offset + 2, true);\r\n const recLen = view.getUint32(offset + 4, true);\r\n const isContainer = (recVerInst & 0x000F) === 0x0F;\r\n\r\n if (recType === 0x03EE) { // SlideContainer\r\n const slideEnd = Math.min(len, offset + 8 + recLen);\r\n const rawTexts: string[] = [];\r\n let hasOle = false;\r\n\r\n let sOff = offset + 8;\r\n while (sOff + 8 <= slideEnd) {\r\n const cVerInst = view.getUint16(sOff, true);\r\n const cType = view.getUint16(sOff + 2, true);\r\n const cLen = view.getUint32(sOff + 4, true);\r\n const cIsContainer = (cVerInst & 0x000F) === 0x0F;\r\n\r\n // 0x0FA8 (CString), 0x0F9E (TextBytesAtom)\r\n if ((cType === 0x0FA8 || cType === 0x0F9E) && cLen > 0 && sOff + 8 + cLen <= slideEnd) {\r\n const bytes = stream.subarray(sOff + 8, sOff + 8 + cLen);\r\n const txt = new TextDecoder('latin1').decode(bytes).trim();\r\n if (txt && !/^[\\x00-\\x1F]+$/.test(txt) && !txt.includes('[Content_Types]') && !txt.includes('_rels/')) {\r\n rawTexts.push(txt);\r\n }\r\n }\r\n // 0x0F9F (TextCharsAtom - UTF-16LE)\r\n else if (cType === 0x0F9F && cLen > 0 && sOff + 8 + cLen <= slideEnd) {\r\n const bytes = stream.subarray(sOff + 8, sOff + 8 + cLen);\r\n const txt = new TextDecoder('utf-16le').decode(bytes).trim();\r\n if (txt && !/^[\\x00-\\x1F]+$/.test(txt) && !txt.includes('[Content_Types]') && !txt.includes('_rels/')) {\r\n rawTexts.push(txt);\r\n }\r\n }\r\n // 0x0BC1 / 0x0BC3 (OLE Object / Chart)\r\n else if (cType === 0x0BC1 || cType === 0x0BC3) {\r\n hasOle = true;\r\n }\r\n\r\n if (cIsContainer) sOff += 8; else sOff += 8 + cLen;\r\n }\r\n\r\n let title = '';\r\n let subtitle = '';\r\n const paragraphs: string[] = [];\r\n const tableColumns: string[] = [];\r\n\r\n for (const t of rawTexts) {\r\n if (!title && t.length < 60 && !t.includes('\\n')) {\r\n title = t;\r\n } else if (t.startsWith('Column ') || (title === 'Table' && t.startsWith('Column'))) {\r\n tableColumns.push(t);\r\n } else if (t.length < 35 && (t.includes('#') || t.toUpperCase() === t) && !subtitle) {\r\n subtitle = t;\r\n } else {\r\n paragraphs.push(t);\r\n }\r\n }\r\n\r\n let pictureUrl: string | null = null;\r\n if ((hasOle || rawTexts.some(t => t.toLowerCase().includes('chart') || t.toLowerCase().includes('figure'))) && picIdx < pictures.length) {\r\n pictureUrl = pictures[picIdx++];\r\n }\r\n\r\n slides.push({\r\n slideIndex: slides.length + 1,\r\n title: title || `Slide ${slides.length + 1}`,\r\n subtitle,\r\n paragraphs,\r\n tableColumns,\r\n pictureUrl,\r\n hasOle\r\n });\r\n }\r\n\r\n if (isContainer) offset += 8; else offset += 8 + recLen;\r\n }\r\n\r\n // Fallback: If no structured slide records were identified\r\n if (slides.length === 0) {\r\n const rawText = new TextDecoder('latin1', { fatal: false }).decode(stream);\r\n const matches = rawText.match(/[A-Za-z0-9\\s,.:;!?'\"-]{5,}/g) || [];\r\n const clean = matches\r\n .map(m => m.trim())\r\n .filter(m => m.length > 4 && \r\n !m.includes('PowerPoint') && \r\n !m.includes('Arial') && \r\n !m.includes('Times') &&\r\n !m.includes('[Content_Types]') &&\r\n !m.includes('_rels/') &&\r\n !m.includes('xml')\r\n );\r\n\r\n if (clean.length > 0) {\r\n const chunkSize = 3;\r\n for (let i = 0; i < clean.length; i += chunkSize) {\r\n const chunk = clean.slice(i, i + chunkSize);\r\n slides.push({\r\n slideIndex: slides.length + 1,\r\n title: chunk[0] || `Slide ${Math.floor(i / chunkSize) + 1}`,\r\n subtitle: chunk.length > 2 ? chunk[1] : undefined,\r\n paragraphs: chunk.length > 2 ? chunk.slice(2) : chunk.slice(1),\r\n tableColumns: [],\r\n pictureUrl: pictures[slides.length] || null\r\n });\r\n }\r\n }\r\n }\r\n\r\n return slides;\r\n }\r\n}\r\n\r\nexport function pptPlugin(): PptPlugin {\r\n return new PptPlugin();\r\n}\r\n\r\nexport default PptPlugin;\r\n\r\n","import { FilePreviewViewer as CoreViewer } from '@patel.sumit51/core';\r\nimport { pdfPlugin } from '@patel.sumit51/plugin-pdf';\r\nimport { mediaPlugin } from '@patel.sumit51/plugin-media';\r\nimport { docxPlugin } from '@patel.sumit51/plugin-docx';\r\nimport { excelPlugin } from '@patel.sumit51/plugin-excel';\r\nimport { csvPlugin } from '@patel.sumit51/plugin-csv';\r\nimport { codePlugin } from '@patel.sumit51/plugin-code';\r\nimport { archivePlugin } from '@patel.sumit51/plugin-archive';\r\nimport { markdownPlugin } from '@patel.sumit51/plugin-markdown';\r\nimport { pptxPlugin } from '@patel.sumit51/plugin-pptx';\r\nimport { threeDPlugin } from '@patel.sumit51/plugin-3d';\r\nimport { rtfPlugin } from '@patel.sumit51/plugin-rtf';\r\nimport { htmlPreviewPlugin } from '@patel.sumit51/plugin-html-preview';\r\nimport { openDocumentPlugin } from '@patel.sumit51/plugin-opendocument';\r\nimport { docPlugin } from '@patel.sumit51/plugin-doc';\r\nimport { pptPlugin } from '@patel.sumit51/plugin-ppt';\r\nimport type { PreviewPlugin } from '@patel.sumit51/core';\r\n\r\n/**\r\n * Returns all built-in default preview plugins:\r\n * PDF, Word (DOCX, DOCM, DOTX, DOTM), Legacy Word (DOC, DOT),\r\n * Excel/Spreadsheets (XLSX, XLS, XLSM, XLSB, XLTX, XLTM, ODS),\r\n * PowerPoint (PPTX, PPSX, PPTM, PPSM, POTX, POTM), Legacy PowerPoint (PPT, PPS, POT),\r\n * OpenDocument Suite (ODT, ODP, ODS, ODG, ODF), Rich Text (RTF),\r\n * Sandboxed HTML, CSV/TSV, ZIP Archives, Markdown, 3D Models (STL/OBJ),\r\n * Media (Images/Video/Audio/SVG), and Code/Text (190+ languages).\r\n */\r\nexport function getDefaultPlugins(): PreviewPlugin[] {\r\n return [\r\n pdfPlugin(),\r\n mediaPlugin(),\r\n docxPlugin(),\r\n excelPlugin(),\r\n pptxPlugin(),\r\n docPlugin(),\r\n pptPlugin(),\r\n openDocumentPlugin(),\r\n rtfPlugin(),\r\n htmlPreviewPlugin(),\r\n csvPlugin(),\r\n archivePlugin(),\r\n markdownPlugin(),\r\n threeDPlugin(),\r\n codePlugin(),\r\n ];\r\n}\r\n\r\n/**\r\n * Universal File Preview Viewer.\r\n * Pre-loads all format plugins by default so 50+ file formats can be previewed immediately.\r\n */\r\nexport class FilePreviewViewer extends CoreViewer {\r\n constructor(options?: { autoRegisterDefaults?: boolean }) {\r\n super();\r\n if (options?.autoRegisterDefaults !== false) {\r\n this.registerPlugins(getDefaultPlugins());\r\n }\r\n }\r\n}\r\n\r\n// Re-export individual plugins for custom configurations\r\nexport {\r\n pdfPlugin,\r\n mediaPlugin,\r\n docxPlugin,\r\n excelPlugin,\r\n pptxPlugin,\r\n docPlugin,\r\n pptPlugin,\r\n openDocumentPlugin,\r\n rtfPlugin,\r\n htmlPreviewPlugin,\r\n csvPlugin,\r\n archivePlugin,\r\n markdownPlugin,\r\n threeDPlugin,\r\n codePlugin,\r\n};\r\n\r\n// Re-export all core classes, controllers, and types\r\nexport * from '@patel.sumit51/core';\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../../core/src/events.ts","../../core/src/detect.ts","../../core/src/utils.ts","../../core/src/transfer.ts","../../core/src/toolbar/icons.ts","../../core/src/toolbar/toolbar-controller.ts","../../core/src/thumbnail/thumbnail-panel.ts","../../core/src/engine.ts","../../core/src/cfbf/cfbf-reader.ts","../../plugins/pdf/src/index.ts","../../plugins/media/src/index.ts","../../plugins/docx/src/index.ts","../../plugins/excel/src/index.ts","../../plugins/csv/src/index.ts","../../plugins/code/src/index.ts","../../plugins/archive/src/index.ts","../../plugins/markdown/src/index.ts","../../plugins/pptx/src/index.ts","../../plugins/3d/src/index.ts","../../plugins/rtf/src/index.ts","../../plugins/html-preview/src/index.ts","../../plugins/opendocument/src/index.ts","../../plugins/doc/src/index.ts","../../plugins/ppt/src/index.ts","../src/index.ts"],"names":["DOMPurify","newWin","pdfjsLib","docx","unzipSync","strFromU8","text","XLSX","hljs","unzip","marked","PptxRenderer","THREE","OrbitControls","STLLoader","OBJLoader","RTFJS","p","fflate","FilePreviewViewer"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { EventHandler, Unsubscribe } from './types';\r\n\r\n/**\r\n * Lightweight typed event emitter for the file preview system.\r\n * Supports on/off/emit with automatic cleanup.\r\n */\r\nexport class EventEmitter {\r\n private listeners = new Map<string, Set<EventHandler>>();\r\n\r\n /**\r\n * Subscribe to an event.\r\n * @returns An unsubscribe function.\r\n */\r\n on(event: string, handler: EventHandler): Unsubscribe {\r\n if (!this.listeners.has(event)) {\r\n this.listeners.set(event, new Set());\r\n }\r\n this.listeners.get(event)!.add(handler);\r\n\r\n return () => this.off(event, handler);\r\n }\r\n\r\n /**\r\n * Unsubscribe from an event.\r\n */\r\n off(event: string, handler: EventHandler): void {\r\n const handlers = this.listeners.get(event);\r\n if (handlers) {\r\n handlers.delete(handler);\r\n if (handlers.size === 0) {\r\n this.listeners.delete(event);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Emit an event with optional payload.\r\n */\r\n emit(event: string, data?: unknown): void {\r\n const handlers = this.listeners.get(event);\r\n if (handlers) {\r\n for (const handler of handlers) {\r\n try {\r\n handler(data);\r\n } catch (error) {\r\n console.error(`[FilePreview] Error in '${event}' handler:`, error);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Remove all listeners, optionally for a specific event.\r\n */\r\n removeAll(event?: string): void {\r\n if (event) {\r\n this.listeners.delete(event);\r\n } else {\r\n this.listeners.clear();\r\n }\r\n }\r\n\r\n /**\r\n * Get the count of listeners for a specific event.\r\n */\r\n listenerCount(event: string): number {\r\n return this.listeners.get(event)?.size ?? 0;\r\n }\r\n}\r\n","import type { FileSource, FileMetadata, FileInfo } from './types';\r\n\r\n/** Magic number signatures for common file formats */\r\nconst MAGIC_NUMBERS: Array<{ bytes: number[]; mask?: number[]; offset?: number; mime: string }> = [\r\n { bytes: [0x25, 0x50, 0x44, 0x46], mime: 'application/pdf' }, // %PDF\r\n { bytes: [0x50, 0x4B, 0x03, 0x04], mime: 'application/zip' }, // PK.. (ZIP/DOCX/XLSX/PPTX/ODT/ODS/ODP)\r\n { bytes: [0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1], mime: 'application/x-cfbf' }, // CFBF/OLE2 (DOC/XLS/PPT)\r\n { bytes: [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A], mime: 'image/png' }, // PNG\r\n { bytes: [0xFF, 0xD8, 0xFF], mime: 'image/jpeg' }, // JPEG\r\n { bytes: [0x47, 0x49, 0x46, 0x38], mime: 'image/gif' }, // GIF87a/GIF89a\r\n { bytes: [0x42, 0x4D], mime: 'image/bmp' }, // BMP\r\n { bytes: [0x00, 0x00, 0x01, 0x00], mime: 'image/x-icon' }, // ICO\r\n { bytes: [0x49, 0x49, 0x2A, 0x00], mime: 'image/tiff' }, // TIFF (LE)\r\n { bytes: [0x4D, 0x4D, 0x00, 0x2A], mime: 'image/tiff' }, // TIFF (BE)\r\n { bytes: [0x1A, 0x45, 0xDF, 0xA3], mime: 'video/webm' }, // WebM/MKV\r\n { bytes: [0x66, 0x74, 0x79, 0x70], mime: 'video/mp4', offset: 4 }, // MP4 (ftyp)\r\n { bytes: [0x49, 0x44, 0x33], mime: 'audio/mpeg' }, // MP3 (ID3)\r\n { bytes: [0xFF, 0xFB], mime: 'audio/mpeg' }, // MP3 (sync)\r\n { bytes: [0xFF, 0xF3], mime: 'audio/mpeg' }, // MP3 (sync)\r\n { bytes: [0x4F, 0x67, 0x67, 0x53], mime: 'audio/ogg' }, // OGG\r\n { bytes: [0x52, 0x49, 0x46, 0x46], mime: 'audio/wav' }, // WAV/RIFF (also WebP)\r\n { bytes: [0x66, 0x4C, 0x61, 0x43], mime: 'audio/flac' }, // FLAC\r\n { bytes: [0x7B, 0x5C, 0x72, 0x74, 0x66], mime: 'text/rtf' }, // RTF\r\n];\r\n\r\n/** Extension to MIME type mapping */\r\nconst EXTENSION_MIME_MAP: Record<string, string> = {\r\n // Documents — Modern OOXML\r\n '.pdf': 'application/pdf',\r\n '.docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\r\n '.docm': 'application/vnd.ms-word.document.macroEnabled.12',\r\n '.dotx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',\r\n '.dotm': 'application/vnd.ms-word.template.macroEnabled.12',\r\n '.xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\r\n '.xlsm': 'application/vnd.ms-excel.sheet.macroEnabled.12',\r\n '.xlsb': 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',\r\n '.xltx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',\r\n '.xltm': 'application/vnd.ms-excel.template.macroEnabled.12',\r\n '.xls': 'application/vnd.ms-excel',\r\n '.pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\r\n '.ppsx': 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',\r\n '.pptm': 'application/vnd.ms-powerpoint.presentation.macroEnabled.12',\r\n '.ppsm': 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12',\r\n '.potx': 'application/vnd.openxmlformats-officedocument.presentationml.template',\r\n '.potm': 'application/vnd.ms-powerpoint.template.macroEnabled.12',\r\n '.csv': 'text/csv',\r\n '.tsv': 'text/tab-separated-values',\r\n // Documents — Legacy Binary (CFBF/OLE2)\r\n '.doc': 'application/msword',\r\n '.dot': 'application/msword',\r\n '.ppt': 'application/vnd.ms-powerpoint',\r\n '.pps': 'application/vnd.ms-powerpoint',\r\n '.pot': 'application/vnd.ms-powerpoint',\r\n // Documents — OpenDocument (ODF)\r\n '.odt': 'application/vnd.oasis.opendocument.text',\r\n '.ods': 'application/vnd.oasis.opendocument.spreadsheet',\r\n '.odp': 'application/vnd.oasis.opendocument.presentation',\r\n '.odg': 'application/vnd.oasis.opendocument.graphics',\r\n '.odf': 'application/vnd.oasis.opendocument.formula',\r\n // Documents — RTF\r\n '.rtf': 'text/rtf',\r\n // Images\r\n '.png': 'image/png',\r\n '.jpg': 'image/jpeg',\r\n '.jpeg': 'image/jpeg',\r\n '.gif': 'image/gif',\r\n '.webp': 'image/webp',\r\n '.bmp': 'image/bmp',\r\n '.svg': 'image/svg+xml',\r\n '.ico': 'image/x-icon',\r\n '.tiff': 'image/tiff',\r\n '.tif': 'image/tiff',\r\n // Media\r\n '.mp4': 'video/mp4',\r\n '.webm': 'video/webm',\r\n '.ogg': 'audio/ogg',\r\n '.ogv': 'video/ogg',\r\n '.mov': 'video/quicktime',\r\n '.mp3': 'audio/mpeg',\r\n '.wav': 'audio/wav',\r\n '.aac': 'audio/aac',\r\n '.flac': 'audio/flac',\r\n // Code/Text\r\n '.txt': 'text/plain',\r\n '.log': 'text/plain',\r\n '.json': 'application/json',\r\n '.xml': 'application/xml',\r\n '.html': 'text/html',\r\n '.htm': 'text/html',\r\n '.css': 'text/css',\r\n '.js': 'text/javascript',\r\n '.ts': 'text/typescript',\r\n '.jsx': 'text/jsx',\r\n '.tsx': 'text/tsx',\r\n '.py': 'text/x-python',\r\n '.java': 'text/x-java',\r\n '.c': 'text/x-c',\r\n '.cpp': 'text/x-c++',\r\n '.h': 'text/x-c',\r\n '.go': 'text/x-go',\r\n '.rs': 'text/x-rust',\r\n '.rb': 'text/x-ruby',\r\n '.php': 'text/x-php',\r\n '.sh': 'text/x-shellscript',\r\n '.bash': 'text/x-shellscript',\r\n '.sql': 'text/x-sql',\r\n '.yaml': 'text/yaml',\r\n '.yml': 'text/yaml',\r\n '.toml': 'text/toml',\r\n '.ini': 'text/ini',\r\n '.conf': 'text/plain',\r\n '.env': 'text/plain',\r\n '.md': 'text/markdown',\r\n '.scss': 'text/x-scss',\r\n '.less': 'text/x-less',\r\n '.vue': 'text/x-vue',\r\n '.svelte': 'text/x-svelte',\r\n '.dart': 'text/x-dart',\r\n '.kt': 'text/x-kotlin',\r\n '.swift': 'text/x-swift',\r\n '.r': 'text/x-r',\r\n '.scala': 'text/x-scala',\r\n '.lua': 'text/x-lua',\r\n '.perl': 'text/x-perl',\r\n '.pl': 'text/x-perl',\r\n};\r\n\r\n/**\r\n * Detect MIME type from file buffer magic bytes.\r\n */\r\nexport function detectMagicBytes(buffer: ArrayBuffer): string | null {\r\n const bytes = new Uint8Array(buffer.slice(0, 16));\r\n\r\n for (const sig of MAGIC_NUMBERS) {\r\n const offset = sig.offset ?? 0;\r\n let match = true;\r\n for (let i = 0; i < sig.bytes.length; i++) {\r\n const actual = bytes[offset + i];\r\n const expected = sig.bytes[i];\r\n const mask = sig.mask?.[i] ?? 0xFF;\r\n if ((actual & mask) !== expected) {\r\n match = false;\r\n break;\r\n }\r\n }\r\n if (match) {\r\n // Special case: RIFF could be WAV or WebP\r\n if (sig.mime === 'audio/wav' && bytes.length >= 12) {\r\n const format = String.fromCharCode(bytes[8], bytes[9], bytes[10], bytes[11]);\r\n if (format === 'WEBP') return 'image/webp';\r\n if (format === 'AVI ') return 'video/x-msvideo';\r\n return 'audio/wav';\r\n }\r\n return sig.mime;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Detect ZIP sub-type (OOXML or OpenDocument) by checking ZIP entry names.\r\n * All OOXML formats use ZIP container with PK header.\r\n * OpenDocument formats also use ZIP with a 'mimetype' entry at offset 0.\r\n */\r\nexport function detectOoxmlType(buffer: ArrayBuffer): string | null {\r\n const text = new TextDecoder('ascii', { fatal: false }).decode(\r\n new Uint8Array(buffer.slice(0, 8000))\r\n );\r\n\r\n // OOXML detection\r\n if (text.includes('word/')) {\r\n return 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';\r\n }\r\n if (text.includes('xl/')) {\r\n return 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';\r\n }\r\n if (text.includes('ppt/')) {\r\n return 'application/vnd.openxmlformats-officedocument.presentationml.presentation';\r\n }\r\n\r\n // OpenDocument detection — the 'mimetype' file is stored uncompressed at the start\r\n if (text.includes('application/vnd.oasis.opendocument.text')) {\r\n return 'application/vnd.oasis.opendocument.text';\r\n }\r\n if (text.includes('application/vnd.oasis.opendocument.spreadsheet')) {\r\n return 'application/vnd.oasis.opendocument.spreadsheet';\r\n }\r\n if (text.includes('application/vnd.oasis.opendocument.presentation')) {\r\n return 'application/vnd.oasis.opendocument.presentation';\r\n }\r\n if (text.includes('application/vnd.oasis.opendocument.graphics')) {\r\n return 'application/vnd.oasis.opendocument.graphics';\r\n }\r\n if (text.includes('application/vnd.oasis.opendocument.formula')) {\r\n return 'application/vnd.oasis.opendocument.formula';\r\n }\r\n\r\n return 'application/zip';\r\n}\r\n\r\n/**\r\n * Detect CFBF / OLE2 sub-type (DOC, XLS, PPT) by searching for stream signatures.\r\n */\r\nexport function detectCfbfType(buffer: ArrayBuffer): { mime: string; extension: string } | null {\r\n const bytes = new Uint8Array(buffer);\r\n \r\n const hasUtf16le = (str: string): boolean => {\r\n const target = new Uint8Array(str.length * 2);\r\n for (let i = 0; i < str.length; i++) {\r\n target[i * 2] = str.charCodeAt(i);\r\n target[i * 2 + 1] = 0;\r\n }\r\n const targetLen = target.length;\r\n const max = bytes.length - targetLen;\r\n for (let i = 0; i <= max; i++) {\r\n let match = true;\r\n for (let j = 0; j < targetLen; j++) {\r\n if (bytes[i + j] !== target[j]) {\r\n match = false;\r\n break;\r\n }\r\n }\r\n if (match) return true;\r\n }\r\n return false;\r\n };\r\n\r\n if (hasUtf16le('PowerPoint Document')) {\r\n return { mime: 'application/vnd.ms-powerpoint', extension: '.ppt' };\r\n }\r\n if (hasUtf16le('WordDocument')) {\r\n return { mime: 'application/msword', extension: '.doc' };\r\n }\r\n if (hasUtf16le('Workbook') || hasUtf16le('Book')) {\r\n return { mime: 'application/vnd.ms-excel', extension: '.xls' };\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Extract file extension from a filename or URL.\r\n */\r\nexport function extractExtension(nameOrUrl: string): string | undefined {\r\n try {\r\n // Try as URL first\r\n const url = new URL(nameOrUrl);\r\n const pathname = url.pathname;\r\n const dotIndex = pathname.lastIndexOf('.');\r\n if (dotIndex !== -1) {\r\n return pathname.slice(dotIndex).toLowerCase().split('?')[0];\r\n }\r\n } catch {\r\n // Not a URL, try as filename\r\n const dotIndex = nameOrUrl.lastIndexOf('.');\r\n if (dotIndex !== -1) {\r\n return nameOrUrl.slice(dotIndex).toLowerCase();\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Get MIME type from file extension.\r\n */\r\nexport function mimeFromExtension(extension: string): string | undefined {\r\n return EXTENSION_MIME_MAP[extension.toLowerCase()];\r\n}\r\n\r\n/**\r\n * Convert any FileSource to ArrayBuffer.\r\n */\r\nexport async function sourceToArrayBuffer(\r\n source: FileSource,\r\n signal?: AbortSignal\r\n): Promise<{ buffer: ArrayBuffer; metadata: FileMetadata }> {\r\n let buffer: ArrayBuffer;\r\n const metadata: FileMetadata = {};\r\n\r\n if (typeof source === 'string') {\r\n // URL string\r\n metadata.name = source.split('/').pop()?.split('?')[0];\r\n metadata.extension = extractExtension(source);\r\n\r\n const response = await fetch(source, { signal });\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch file: ${response.status} ${response.statusText}`);\r\n }\r\n metadata.mimeType = response.headers.get('content-type') ?? undefined;\r\n buffer = await response.arrayBuffer();\r\n } else if (source instanceof File) {\r\n metadata.name = source.name;\r\n metadata.size = source.size;\r\n metadata.mimeType = source.type || undefined;\r\n metadata.extension = extractExtension(source.name);\r\n buffer = await source.arrayBuffer();\r\n } else if (source instanceof Blob || (source && typeof (source as any).arrayBuffer === 'function' && typeof (source as any).size === 'number')) {\r\n metadata.size = (source as any).size;\r\n metadata.mimeType = (source as any).type || undefined;\r\n if ((source as any).name) {\r\n metadata.name = (source as any).name;\r\n metadata.extension = extractExtension((source as any).name);\r\n }\r\n buffer = await (source as any).arrayBuffer();\r\n } else if (\r\n source instanceof ArrayBuffer ||\r\n Object.prototype.toString.call(source) === '[object ArrayBuffer]' ||\r\n (source && typeof (source as any).byteLength === 'number' && typeof (source as any).slice === 'function')\r\n ) {\r\n buffer = source as ArrayBuffer;\r\n } else if (source instanceof Uint8Array || ArrayBuffer.isView(source)) {\r\n const view = source as ArrayBufferView;\r\n buffer = view.buffer.slice(\r\n view.byteOffset,\r\n view.byteOffset + view.byteLength\r\n ) as ArrayBuffer;\r\n } else {\r\n throw new Error('Unsupported file source type');\r\n }\r\n\r\n metadata.size = metadata.size ?? buffer.byteLength;\r\n\r\n // Detect MIME from magic bytes if not already known\r\n const magicMime = detectMagicBytes(buffer);\r\n if (magicMime) {\r\n // Special handling for ZIP-based OOXML\r\n if (magicMime === 'application/zip') {\r\n const ooxmlMime = detectOoxmlType(buffer);\r\n if (ooxmlMime && ooxmlMime !== 'application/zip') {\r\n // Preserve extension-derived MIME (e.g. .docm/.dotx/.dotm) if already set\r\n metadata.mimeType = metadata.mimeType ?? ooxmlMime;\r\n // Set extension from OOXML type\r\n if (ooxmlMime.includes('wordprocessing')) metadata.extension = metadata.extension ?? '.docx';\r\n else if (ooxmlMime.includes('spreadsheet')) metadata.extension = metadata.extension ?? '.xlsx';\r\n else if (ooxmlMime.includes('presentation')) metadata.extension = metadata.extension ?? '.pptx';\r\n } else {\r\n metadata.mimeType = metadata.mimeType ?? magicMime;\r\n }\r\n } else if (magicMime === 'application/x-cfbf') {\r\n // Disambiguate legacy CFBF/OLE2 formats (DOC, XLS, PPT)\r\n if (metadata.extension) {\r\n metadata.mimeType = mimeFromExtension(metadata.extension) ?? magicMime;\r\n } else {\r\n const cfbf = detectCfbfType(buffer);\r\n if (cfbf) {\r\n metadata.mimeType = cfbf.mime;\r\n metadata.extension = cfbf.extension;\r\n } else {\r\n metadata.mimeType = magicMime;\r\n }\r\n }\r\n } else {\r\n metadata.mimeType = magicMime;\r\n }\r\n }\r\n\r\n // Fallback: derive MIME from extension\r\n if (!metadata.mimeType && metadata.extension) {\r\n metadata.mimeType = mimeFromExtension(metadata.extension);\r\n }\r\n\r\n return { buffer, metadata };\r\n}\r\n","import DOMPurify from 'dompurify';\r\n\r\n/**\r\n * Sanitize HTML string using DOMPurify to prevent XSS.\r\n */\r\nexport function sanitizeHTML(html: string): string {\r\n return DOMPurify.sanitize(html, {\r\n USE_PROFILES: { html: true },\r\n });\r\n}\r\n\r\n/**\r\n * Sanitize SVG string using DOMPurify.\r\n */\r\nexport function sanitizeSVG(svg: string): string {\r\n return DOMPurify.sanitize(svg, {\r\n USE_PROFILES: { svg: true, svgFilters: true },\r\n });\r\n}\r\n\r\n/**\r\n * Download a file from an ArrayBuffer.\r\n */\r\nexport function downloadFile(buffer: ArrayBuffer, filename: string, mimeType?: string): void {\r\n const blob = new Blob([buffer], { type: mimeType ?? 'application/octet-stream' });\r\n const url = URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.download = filename;\r\n link.style.display = 'none';\r\n document.body.appendChild(link);\r\n link.click();\r\n // Cleanup\r\n setTimeout(() => {\r\n document.body.removeChild(link);\r\n URL.revokeObjectURL(url);\r\n }, 100);\r\n}\r\n\r\n/**\r\n * Print an HTML element by opening a print window.\r\n */\r\nexport function printElement(element: HTMLElement, title?: string): void {\r\n const printWindow = window.open('', '_blank');\r\n if (!printWindow) {\r\n console.warn('[FilePreview] Could not open print window. Pop-ups may be blocked.');\r\n return;\r\n }\r\n\r\n const styles = Array.from(document.querySelectorAll('style, link[rel=\"stylesheet\"]'))\r\n .map(el => el.outerHTML)\r\n .join('\\n');\r\n\r\n printWindow.document.write(`\r\n <!DOCTYPE html>\r\n <html>\r\n <head>\r\n <title>${title ?? 'Print Preview'}</title>\r\n ${styles}\r\n <style>\r\n @media print {\r\n body { margin: 0; padding: 16px; }\r\n }\r\n </style>\r\n </head>\r\n <body>\r\n ${element.innerHTML}\r\n </body>\r\n </html>\r\n `);\r\n printWindow.document.close();\r\n printWindow.focus();\r\n printWindow.print();\r\n printWindow.close();\r\n}\r\n\r\n/**\r\n * Format file size in human-readable format.\r\n */\r\nexport function formatFileSize(bytes: number): string {\r\n if (bytes === 0) return '0 B';\r\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\r\n const i = Math.floor(Math.log(bytes) / Math.log(1024));\r\n const size = bytes / Math.pow(1024, i);\r\n return `${size.toFixed(i > 0 ? 1 : 0)} ${units[i]}`;\r\n}\r\n\r\n/**\r\n * Debounce a function call.\r\n */\r\nexport function debounce<T extends (...args: unknown[]) => void>(\r\n fn: T,\r\n delay: number\r\n): (...args: Parameters<T>) => void {\r\n let timer: ReturnType<typeof setTimeout> | undefined;\r\n return (...args: Parameters<T>) => {\r\n clearTimeout(timer);\r\n timer = setTimeout(() => fn(...args), delay);\r\n };\r\n}\r\n\r\n/**\r\n * Clamp a number between min and max.\r\n */\r\nexport function clamp(value: number, min: number, max: number): number {\r\n return Math.min(Math.max(value, min), max);\r\n}\r\n\r\n/**\r\n * Create a DOM element with optional attributes and children.\r\n */\r\nexport function createElement<K extends keyof HTMLElementTagNameMap>(\r\n tag: K,\r\n attrs?: Record<string, string>,\r\n ...children: (string | Node)[]\r\n): HTMLElementTagNameMap[K] {\r\n const el = document.createElement(tag);\r\n if (attrs) {\r\n for (const [key, value] of Object.entries(attrs)) {\r\n if (key === 'className') {\r\n el.className = value;\r\n } else {\r\n el.setAttribute(key, value);\r\n }\r\n }\r\n }\r\n for (const child of children) {\r\n if (typeof child === 'string') {\r\n el.appendChild(document.createTextNode(child));\r\n } else {\r\n el.appendChild(child);\r\n }\r\n }\r\n return el;\r\n}\r\n","/**\r\n * IndexedDB and in-memory document transfer utility for cross-window preview opening.\r\n */\r\n\r\nexport interface TransferPayload {\r\n buffer: ArrayBuffer;\r\n metadata?: {\r\n name?: string;\r\n extension?: string;\r\n mimeType?: string;\r\n size?: number;\r\n };\r\n options?: Record<string, any>;\r\n}\r\n\r\nconst DB_NAME = 'PreviewFileTransferDB';\r\nconst DB_STORE = 'transfers';\r\n\r\nfunction openDB(): Promise<IDBDatabase> {\r\n return new Promise((resolve, reject) => {\r\n if (typeof indexedDB === 'undefined') {\r\n return reject(new Error('IndexedDB is not available'));\r\n }\r\n const req = indexedDB.open(DB_NAME, 1);\r\n req.onupgradeneeded = () => {\r\n const db = req.result;\r\n if (!db.objectStoreNames.contains(DB_STORE)) {\r\n db.createObjectStore(DB_STORE, { keyPath: 'id' });\r\n }\r\n };\r\n req.onsuccess = () => resolve(req.result);\r\n req.onerror = () => reject(req.error);\r\n });\r\n}\r\n\r\n/**\r\n * Save file payload to IndexedDB and window storage for cross-window retrieval.\r\n */\r\nexport async function saveTransferPayload(id: string, payload: TransferPayload): Promise<void> {\r\n if (typeof window !== 'undefined') {\r\n try {\r\n (window as any)[id] = payload;\r\n (window as any).__lastTransfer = payload;\r\n } catch {}\r\n }\r\n\r\n try {\r\n const db = await openDB();\r\n return new Promise((resolve, reject) => {\r\n const tx = db.transaction(DB_STORE, 'readwrite');\r\n const store = tx.objectStore(DB_STORE);\r\n store.put({ id, ...payload, timestamp: Date.now() });\r\n tx.oncomplete = () => resolve();\r\n tx.onerror = () => reject(tx.error);\r\n });\r\n } catch (e) {\r\n console.warn('[saveTransferPayload] IndexedDB store warning:', e);\r\n }\r\n}\r\n\r\n/**\r\n * Retrieve transferred file payload from opener window or IndexedDB.\r\n */\r\nexport async function getTransferPayload(id: string): Promise<TransferPayload | null> {\r\n if (typeof window !== 'undefined') {\r\n try {\r\n if (window.opener && (window.opener as any)[id]) {\r\n return (window.opener as any)[id];\r\n }\r\n if ((window as any)[id]) {\r\n return (window as any)[id];\r\n }\r\n if (window.opener && (window.opener as any).__lastTransfer) {\r\n return (window.opener as any).__lastTransfer;\r\n }\r\n if ((window as any).__lastTransfer) {\r\n return (window as any).__lastTransfer;\r\n }\r\n } catch {}\r\n }\r\n\r\n try {\r\n const db = await openDB();\r\n return new Promise((resolve) => {\r\n const tx = db.transaction(DB_STORE, 'readonly');\r\n const store = tx.objectStore(DB_STORE);\r\n const req = store.get(id);\r\n req.onsuccess = () => {\r\n if (req.result && req.result.buffer) {\r\n resolve({\r\n buffer: req.result.buffer,\r\n metadata: req.result.metadata,\r\n options: req.result.options\r\n });\r\n } else {\r\n resolve(null);\r\n }\r\n };\r\n req.onerror = () => resolve(null);\r\n });\r\n } catch {\r\n return null;\r\n }\r\n}\r\n","export const ICON_ZOOM_IN = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"11\" cy=\"11\" r=\"8\"></circle><line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"></line><line x1=\"11\" y1=\"8\" x2=\"11\" y2=\"14\"></line><line x1=\"8\" y1=\"11\" x2=\"14\" y2=\"11\"></line></svg>`;\r\nexport const ICON_ZOOM_OUT = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"11\" cy=\"11\" r=\"8\"></circle><line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"></line><line x1=\"8\" y1=\"11\" x2=\"14\" y2=\"11\"></line></svg>`;\r\nexport const ICON_FIT_PAGE = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"></rect><line x1=\"8\" y1=\"12\" x2=\"16\" y2=\"12\"></line><polyline points=\"11 9 8 12 11 15\"></polyline><polyline points=\"13 9 16 12 13 15\"></polyline></svg>`;\r\nexport const ICON_FIT_WIDTH = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"2\" y1=\"12\" x2=\"22\" y2=\"12\"></line><polyline points=\"5 9 2 12 5 15\"></polyline><polyline points=\"19 9 22 12 19 15\"></polyline><line x1=\"2\" y1=\"5\" x2=\"2\" y2=\"19\"></line><line x1=\"22\" y1=\"5\" x2=\"22\" y2=\"19\"></line></svg>`;\r\nexport const ICON_ROTATE_CW = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"23 4 23 10 17 10\"></polyline><path d=\"M20.49 15a9 9 0 1 1-2.12-9.36L23 10\"></path></svg>`;\r\nexport const ICON_ROTATE_CCW = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"1 4 1 10 7 10\"></polyline><path d=\"M3.51 15a9 9 0 1 0 2.13-9.36L1 10\"></path></svg>`;\r\nexport const ICON_DOWNLOAD = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"></path><polyline points=\"7 10 12 15 17 10\"></polyline><line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"></line></svg>`;\r\nexport const ICON_PRINT = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 6 2 18 2 18 9\"></polyline><path d=\"M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2\"></path><rect x=\"6\" y=\"14\" width=\"12\" height=\"8\"></rect></svg>`;\r\nexport const ICON_PAGE_PREV = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"15 18 9 12 15 6\"></polyline></svg>`;\r\nexport const ICON_PAGE_NEXT = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"9 18 15 12 9 6\"></polyline></svg>`;\r\nexport const ICON_PLAY = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polygon points=\"5 3 19 12 5 21 5 3\"></polygon></svg>`;\r\nexport const ICON_PAUSE = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"6\" y=\"4\" width=\"4\" height=\"16\"></rect><rect x=\"14\" y=\"4\" width=\"4\" height=\"16\"></rect></svg>`;\r\nexport const ICON_THUMBNAILS = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"7\" height=\"7\"></rect><rect x=\"14\" y=\"3\" width=\"7\" height=\"7\"></rect><rect x=\"14\" y=\"14\" width=\"7\" height=\"7\"></rect><rect x=\"3\" y=\"14\" width=\"7\" height=\"7\"></rect></svg>`;\r\nexport const ICON_CLOSE = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line></svg>`;\r\nexport const ICON_FULLSCREEN = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M8 3H5a2 2 0 0 0-2 2v3m18 0V5a2 2 0 0 0-2-2h-3m0 18h3a2 2 0 0 0 2-2v-3M3 16v3a2 2 0 0 0 2 2h3\"></path></svg>`;\r\nexport const ICON_CHEVRON_LEFT = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"15 18 9 12 15 6\"></polyline></svg>`;\r\nexport const ICON_CHEVRON_RIGHT = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"9 18 15 12 9 6\"></polyline></svg>`;\r\nexport const ICON_COPY = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"></rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"></path></svg>`;\r\nexport const ICON_FAST_FORWARD = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polygon points=\"13 19 22 12 13 5 13 19\"></polygon><polygon points=\"2 19 11 12 2 5 2 19\"></polygon></svg>`;\r\nexport const ICON_REWIND = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polygon points=\"11 19 2 12 11 5 11 19\"></polygon><polygon points=\"22 19 13 12 22 5 22 19\"></polygon></svg>`;\r\nexport const ICON_SPEED = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><polyline points=\"12 6 12 12 16 14\"></polyline></svg>`;\r\nexport const ICON_EXTERNAL_WINDOW = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"></rect><line x1=\"3\" y1=\"8\" x2=\"21\" y2=\"8\"></line><circle cx=\"6\" cy=\"5.5\" r=\"0.75\" fill=\"currentColor\"></circle><circle cx=\"8.5\" cy=\"5.5\" r=\"0.75\" fill=\"currentColor\"></circle><polyline points=\"14 13 18 13 18 17\"></polyline><line x1=\"11\" y1=\"20\" x2=\"18\" y2=\"13\"></line></svg>`;\r\nexport const ICON_RESET_ZOOM = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"11\" cy=\"11\" r=\"8\"></circle><line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"></line><path d=\"M13 11a3 3 0 1 0-3 3\"></path><path d=\"M10 11v3h3\"></path></svg>`;\r\n\r\n","import './toolbar.css';\r\nimport { createElement, sanitizeSVG } from '../utils';\r\nimport type { ToolbarAction, ToolbarGroup, ToolbarConfig } from '../types';\r\nimport * as icons from './icons';\r\n\r\nconst ICON_MAP: Record<string, string> = {\r\n 'zoom-in': icons.ICON_ZOOM_IN,\r\n 'zoom-out': icons.ICON_ZOOM_OUT,\r\n 'fit-page': icons.ICON_FIT_PAGE,\r\n 'fit-width': icons.ICON_FIT_WIDTH,\r\n 'fit-slide': icons.ICON_FIT_PAGE,\r\n 'rotate-cw': icons.ICON_ROTATE_CW,\r\n 'rotate-ccw': icons.ICON_ROTATE_CCW,\r\n 'download': icons.ICON_DOWNLOAD,\r\n 'print': icons.ICON_PRINT,\r\n 'thumbnails': icons.ICON_THUMBNAILS,\r\n 'fullscreen': icons.ICON_FULLSCREEN,\r\n 'play': icons.ICON_PLAY,\r\n 'pause': icons.ICON_PAUSE,\r\n 'close': icons.ICON_CLOSE,\r\n 'copy': icons.ICON_COPY,\r\n 'prev': icons.ICON_PAGE_PREV,\r\n 'next': icons.ICON_PAGE_NEXT,\r\n 'page-prev': icons.ICON_PAGE_PREV,\r\n 'page-next': icons.ICON_PAGE_NEXT,\r\n 'chevron-left': icons.ICON_PAGE_PREV,\r\n 'chevron-right': icons.ICON_PAGE_NEXT,\r\n 'fast-forward': icons.ICON_FAST_FORWARD,\r\n 'forward-10': icons.ICON_FAST_FORWARD,\r\n 'rewind': icons.ICON_REWIND,\r\n 'replay-10': icons.ICON_REWIND,\r\n 'open-window': icons.ICON_EXTERNAL_WINDOW,\r\n 'external-window': icons.ICON_EXTERNAL_WINDOW,\r\n 'openWindow': icons.ICON_EXTERNAL_WINDOW,\r\n 'openSeparateWindow': icons.ICON_EXTERNAL_WINDOW,\r\n 'reset-zoom': icons.ICON_RESET_ZOOM,\r\n 'zoom-reset': icons.ICON_RESET_ZOOM,\r\n 'resetZoom': icons.ICON_RESET_ZOOM,\r\n};\r\n\r\nexport class ToolbarController {\r\n private el: HTMLElement;\r\n private toolbarEl: HTMLElement;\r\n private actions: ToolbarAction[] = [];\r\n private config: ToolbarConfig = {};\r\n private pageInputEl: HTMLInputElement | null = null;\r\n private pageLabelEl: HTMLElement | null = null;\r\n private prevPageBtn: HTMLButtonElement | null = null;\r\n private nextPageBtn: HTMLButtonElement | null = null;\r\n\r\n constructor(container: HTMLElement, config?: ToolbarConfig) {\r\n this.el = container;\r\n if (config) this.config = { ...config };\r\n this.toolbarEl = createElement('div', { className: 'fp-toolbar' });\r\n this.el.appendChild(this.toolbarEl);\r\n }\r\n\r\n setConfig(config: ToolbarConfig): void {\r\n this.config = { ...config };\r\n this.render();\r\n }\r\n\r\n getConfig(): ToolbarConfig {\r\n return { ...this.config };\r\n }\r\n\r\n hideAction(actionId: string): void {\r\n (this.config as Record<string, any>)[actionId] = false;\r\n if (actionId === 'zoom-in' || actionId === 'zoomIn') this.config.zoomIn = false;\r\n if (actionId === 'zoom-out' || actionId === 'zoomOut') this.config.zoomOut = false;\r\n if (actionId === 'fit-page' || actionId === 'fitPage' || actionId === 'fitToPage' || actionId === 'fit-width') {\r\n this.config.fitPage = false;\r\n this.config.fitToPage = false;\r\n this.config.fitWidth = false;\r\n }\r\n if (actionId === 'reset-zoom' || actionId === 'zoom-reset' || actionId === 'resetZoom') {\r\n this.config.resetZoom = false;\r\n this.config.zoomReset = false;\r\n }\r\n if (actionId === 'rotate-cw' || actionId === 'rotate' || actionId === 'rotateCW') this.config.rotate = false;\r\n if (actionId === 'fullscreen') this.config.fullscreen = false;\r\n if (actionId === 'download') this.config.download = false;\r\n if (actionId === 'print') this.config.print = false;\r\n if (actionId === 'open-window' || actionId === 'openWindow' || actionId === 'openSeparateWindow') {\r\n this.config.openWindow = false;\r\n this.config.openSeparateWindow = false;\r\n }\r\n if (actionId === 'copy') this.config.copy = false;\r\n if (actionId === 'page-nav' || actionId === 'pageNav' || actionId === 'pagination') {\r\n this.config.pageNav = false;\r\n this.config.pagination = false;\r\n }\r\n this.render();\r\n }\r\n\r\n showAction(actionId: string): void {\r\n (this.config as Record<string, any>)[actionId] = true;\r\n if (actionId === 'zoom-in' || actionId === 'zoomIn') this.config.zoomIn = true;\r\n if (actionId === 'zoom-out' || actionId === 'zoomOut') this.config.zoomOut = true;\r\n if (actionId === 'fit-page' || actionId === 'fitPage' || actionId === 'fitToPage' || actionId === 'fit-width') {\r\n this.config.fitPage = true;\r\n this.config.fitToPage = true;\r\n this.config.fitWidth = true;\r\n }\r\n if (actionId === 'reset-zoom' || actionId === 'zoom-reset' || actionId === 'resetZoom') {\r\n this.config.resetZoom = true;\r\n this.config.zoomReset = true;\r\n }\r\n if (actionId === 'rotate-cw' || actionId === 'rotate' || actionId === 'rotateCW') this.config.rotate = true;\r\n if (actionId === 'fullscreen') this.config.fullscreen = true;\r\n if (actionId === 'download') this.config.download = true;\r\n if (actionId === 'print') this.config.print = true;\r\n if (actionId === 'open-window' || actionId === 'openWindow' || actionId === 'openSeparateWindow') {\r\n this.config.openWindow = true;\r\n this.config.openSeparateWindow = true;\r\n }\r\n if (actionId === 'copy') this.config.copy = true;\r\n if (actionId === 'page-nav' || actionId === 'pageNav' || actionId === 'pagination') {\r\n this.config.pageNav = true;\r\n this.config.pagination = true;\r\n }\r\n this.render();\r\n }\r\n\r\n private normalizeActionId(actionId: string): string {\r\n if (actionId === 'zoomIn') return 'zoom-in';\r\n if (actionId === 'zoomOut') return 'zoom-out';\r\n if (actionId === 'fitPage' || actionId === 'fitToPage' || actionId === 'fitWidth') return 'fit-page';\r\n if (actionId === 'resetZoom' || actionId === 'zoomReset') return 'reset-zoom';\r\n if (actionId === 'rotateCW') return 'rotate-cw';\r\n if (actionId === 'rotateCCW') return 'rotate-ccw';\r\n if (actionId === 'openWindow' || actionId === 'openSeparateWindow') return 'open-window';\r\n if (actionId === 'pageNav') return 'page-nav';\r\n return actionId;\r\n }\r\n\r\n enableAction(actionId: string): void {\r\n const norm = this.normalizeActionId(actionId);\r\n const btn = this.toolbarEl.querySelector(`button[data-action-id=\"${actionId}\"], button[data-action-id=\"${norm}\"]`) as HTMLButtonElement | null;\r\n if (btn) {\r\n btn.disabled = false;\r\n btn.classList.remove('disabled');\r\n }\r\n }\r\n\r\n disableAction(actionId: string): void {\r\n const norm = this.normalizeActionId(actionId);\r\n const btn = this.toolbarEl.querySelector(`button[data-action-id=\"${actionId}\"], button[data-action-id=\"${norm}\"]`) as HTMLButtonElement | null;\r\n if (btn) {\r\n btn.disabled = true;\r\n btn.classList.add('disabled');\r\n }\r\n }\r\n\r\n setActionActive(actionId: string, active: boolean): void {\r\n const norm = this.normalizeActionId(actionId);\r\n const btn = this.toolbarEl.querySelector(`button[data-action-id=\"${actionId}\"], button[data-action-id=\"${norm}\"]`) as HTMLButtonElement | null;\r\n if (btn) {\r\n if (active) {\r\n btn.classList.add('active');\r\n } else {\r\n btn.classList.remove('active');\r\n }\r\n }\r\n }\r\n\r\n isActionEnabled(action: ToolbarAction): boolean {\r\n const c: Record<string, any> = this.config;\r\n const id = action.id;\r\n\r\n // Check direct ID or camelCase override\r\n if (c[id] === false) return false;\r\n\r\n if (id === 'zoom-in' && (c.zoomIn === false || c['zoom-in'] === false)) return false;\r\n if (id === 'zoom-out' && (c.zoomOut === false || c['zoom-out'] === false)) return false;\r\n if (\r\n (id === 'fit-page' || id === 'fit-width' || id === 'fit-slide') &&\r\n (c.fitPage === false || c.fitToPage === false || c.fitWidth === false || c['fit-page'] === false || c['fit-width'] === false)\r\n ) {\r\n return false;\r\n }\r\n if (\r\n (id === 'reset-zoom' || id === 'zoom-reset') &&\r\n (c.resetZoom === false || c.zoomReset === false || c['reset-zoom'] === false || c['zoom-reset'] === false)\r\n ) {\r\n return false;\r\n }\r\n if (\r\n (id === 'rotate-cw' || id === 'rotate-ccw' || id === 'rotate') &&\r\n (c.rotate === false || c.rotateCW === false || c.rotateCCW === false || c['rotate-cw'] === false)\r\n ) {\r\n return false;\r\n }\r\n if (id === 'fullscreen' && c.fullscreen === false) return false;\r\n if (id === 'download' && c.download === false) return false;\r\n if (id === 'print' && c.print === false) return false;\r\n if (\r\n (id === 'open-window' || id === 'external-window') &&\r\n (c.openWindow === false || c.openSeparateWindow === false || c['open-window'] === false)\r\n ) {\r\n return false;\r\n }\r\n if (id === 'copy' && c.copy === false) return false;\r\n if (id === 'thumbnails' && c.thumbnails === false) return false;\r\n if (\r\n id === 'page-nav' &&\r\n (c.pageNav === false || c.pagination === false || c['page-nav'] === false)\r\n ) {\r\n return false;\r\n }\r\n if (\r\n (id === 'prev' || id === 'page-prev') &&\r\n (c.prevPage === false || c.prev === false || c['prev'] === false || c.pageNav === false || c.pagination === false)\r\n ) {\r\n return false;\r\n }\r\n if (\r\n (id === 'next' || id === 'page-next') &&\r\n (c.nextPage === false || c.next === false || c['next'] === false || c.pageNav === false || c.pagination === false)\r\n ) {\r\n return false;\r\n }\r\n if (id === 'play' && c.play === false) return false;\r\n if (id === 'pause' && c.pause === false) return false;\r\n if (\r\n (id === 'fast-forward' || id === 'forward-10') &&\r\n (c.fastForward === false || c['fast-forward'] === false)\r\n ) {\r\n return false;\r\n }\r\n if (\r\n (id === 'rewind' || id === 'replay-10') &&\r\n (c.rewind === false || c['rewind'] === false)\r\n ) {\r\n return false;\r\n }\r\n if (id === 'speed' && c.speed === false) return false;\r\n\r\n return true;\r\n }\r\n\r\n setPage(page: number, max?: number): void {\r\n if (this.pageInputEl) {\r\n this.pageInputEl.value = page.toString();\r\n if (max !== undefined) {\r\n this.pageInputEl.max = max.toString();\r\n }\r\n }\r\n if (max !== undefined && this.pageLabelEl) {\r\n this.pageLabelEl.textContent = ` / ${max}`;\r\n }\r\n const currentMax = max !== undefined ? max : (parseInt(this.pageInputEl?.max || '1', 10) || 1);\r\n if (this.prevPageBtn) {\r\n this.prevPageBtn.disabled = page <= 1;\r\n this.prevPageBtn.style.opacity = page <= 1 ? '0.4' : '1';\r\n }\r\n if (this.nextPageBtn) {\r\n this.nextPageBtn.disabled = page >= currentMax;\r\n this.nextPageBtn.style.opacity = page >= currentMax ? '0.4' : '1';\r\n }\r\n }\r\n\r\n update(actions: ToolbarAction[]): void {\r\n this.actions = actions;\r\n this.render();\r\n }\r\n\r\n show(): void {\r\n this.el.style.display = 'block';\r\n }\r\n\r\n hide(): void {\r\n this.el.style.display = 'none';\r\n }\r\n\r\n destroy(): void {\r\n this.el.innerHTML = '';\r\n }\r\n\r\n private render(): void {\r\n this.toolbarEl.innerHTML = '';\r\n\r\n const groups: Record<ToolbarGroup, ToolbarAction[]> = {\r\n navigation: [],\r\n zoom: [],\r\n view: [],\r\n actions: []\r\n };\r\n\r\n // Filter actions through config\r\n const enabledActions = this.actions.filter(a => this.isActionEnabled(a));\r\n\r\n // If a page-nav component is present, deduplicate standalone prev/next buttons\r\n const hasPageNav = enabledActions.some(a => a.type === 'page-nav');\r\n const effectiveActions = hasPageNav\r\n ? enabledActions.filter(a => a.id !== 'page-prev' && a.id !== 'page-next' && a.id !== 'prev' && a.id !== 'next')\r\n : enabledActions;\r\n\r\n for (const action of effectiveActions) {\r\n if (groups[action.group]) {\r\n groups[action.group].push(action);\r\n }\r\n }\r\n\r\n const order: ToolbarGroup[] = ['navigation', 'zoom', 'view', 'actions'];\r\n let isFirstGroup = true;\r\n\r\n for (const group of order) {\r\n const groupActions = groups[group];\r\n if (groupActions.length === 0) continue;\r\n\r\n if (!isFirstGroup) {\r\n this.toolbarEl.appendChild(createElement('div', { className: 'fp-toolbar-separator' }));\r\n }\r\n isFirstGroup = false;\r\n\r\n const groupEl = createElement('div', { className: 'fp-toolbar-group' });\r\n\r\n for (const action of groupActions) {\r\n if (action.type === 'separator') {\r\n groupEl.appendChild(createElement('div', { className: 'fp-toolbar-separator' }));\r\n } else if (action.type === 'page-nav') {\r\n const max = action.max ?? 1;\r\n const prevBtn = this.createButton(\r\n 'prev', icons.ICON_PAGE_PREV, 'Previous Page',\r\n () => {\r\n const cur = parseInt(input.value, 10) || 1;\r\n if (cur > 1) {\r\n input.value = (cur - 1).toString();\r\n action.execute('prev', cur - 1);\r\n }\r\n }\r\n );\r\n const nextBtn = this.createButton(\r\n 'next', icons.ICON_PAGE_NEXT, 'Next Page',\r\n () => {\r\n const cur = parseInt(input.value, 10) || 1;\r\n if (cur < max) {\r\n input.value = (cur + 1).toString();\r\n action.execute('next', cur + 1);\r\n }\r\n }\r\n );\r\n const input = createElement('input', {\r\n className: 'fp-toolbar-input',\r\n type: 'number',\r\n value: (action.value ?? 1).toString(),\r\n min: '1',\r\n max: max.toString()\r\n }) as HTMLInputElement;\r\n \r\n input.addEventListener('change', () => {\r\n let val = parseInt(input.value, 10);\r\n if (isNaN(val)) val = 1;\r\n val = Math.max(1, Math.min(max, val));\r\n input.value = val.toString();\r\n action.execute('go', val);\r\n });\r\n \r\n const label = createElement('span', { className: 'fp-toolbar-label' }, ` / ${max}`);\r\n \r\n const curVal = action.value ?? 1;\r\n prevBtn.disabled = curVal <= 1;\r\n prevBtn.style.opacity = curVal <= 1 ? '0.4' : '1';\r\n nextBtn.disabled = curVal >= max;\r\n nextBtn.style.opacity = curVal >= max ? '0.4' : '1';\r\n\r\n this.prevPageBtn = prevBtn;\r\n this.nextPageBtn = nextBtn;\r\n this.pageInputEl = input;\r\n this.pageLabelEl = label;\r\n\r\n groupEl.appendChild(prevBtn);\r\n groupEl.appendChild(input);\r\n groupEl.appendChild(label);\r\n groupEl.appendChild(nextBtn);\r\n } else if (action.type === 'range') {\r\n const input = createElement('input', {\r\n type: 'range',\r\n min: (action.min ?? 0).toString(),\r\n max: (action.max ?? 100).toString(),\r\n step: (action.step ?? 1).toString(),\r\n value: (action.value ?? 50).toString()\r\n }) as HTMLInputElement;\r\n input.addEventListener('input', () => {\r\n action.execute(parseFloat(input.value));\r\n });\r\n groupEl.appendChild(input);\r\n } else {\r\n const btn = this.createButton(\r\n action.id, action.icon, action.label,\r\n () => action.execute()\r\n );\r\n if (action.enabled === false) btn.disabled = true;\r\n if (action.active) btn.classList.add('active');\r\n groupEl.appendChild(btn);\r\n }\r\n }\r\n\r\n this.toolbarEl.appendChild(groupEl);\r\n }\r\n }\r\n\r\n private createButton(id: string, iconHtml: string, title: string, onClick: () => void): HTMLButtonElement {\r\n const btn = createElement('button', {\r\n className: 'fp-toolbar-btn',\r\n title,\r\n type: 'button',\r\n 'data-action-id': id\r\n }) as HTMLButtonElement;\r\n \r\n const internalSvg = ICON_MAP[iconHtml] || ICON_MAP[id];\r\n if (internalSvg) {\r\n btn.innerHTML = internalSvg;\r\n } else if (iconHtml && iconHtml.startsWith('<svg')) {\r\n btn.innerHTML = sanitizeSVG(iconHtml);\r\n } else {\r\n btn.textContent = title || id; \r\n }\r\n \r\n btn.addEventListener('click', onClick);\r\n return btn;\r\n }\r\n}\r\n","import { createElement } from '../utils';\r\nimport type { Thumbnail } from '../types';\r\nimport { ICON_CLOSE } from '../toolbar/icons';\r\n\r\nexport class ThumbnailPanel {\r\n private el: HTMLElement;\r\n private panelEl: HTMLElement;\r\n private listEl: HTMLElement;\r\n private headerEl: HTMLElement;\r\n private thumbnails: Thumbnail[] = [];\r\n private onSelect?: (index: number) => void;\r\n private onToggleCallback?: (isOpen: boolean) => void;\r\n private activeIndex: number = 0;\r\n private observer?: IntersectionObserver;\r\n private renderedIndices = new Set<number>();\r\n\r\n constructor(container: HTMLElement, onToggle?: (isOpen: boolean) => void) {\r\n this.el = container;\r\n this.onToggleCallback = onToggle;\r\n\r\n this.panelEl = createElement('div', { className: 'fp-thumbnail-panel hidden' });\r\n this.panelEl.style.width = '0px';\r\n this.panelEl.style.minWidth = '0px';\r\n this.panelEl.style.opacity = '0';\r\n\r\n // Header\r\n this.headerEl = createElement('div', { className: 'fp-thumbnail-header' });\r\n const title = createElement('span', { className: 'fp-thumbnail-title' }, 'Pages');\r\n const closeBtn = createElement('button', {\r\n className: 'fp-thumbnail-close-btn',\r\n title: 'Close Thumbnails',\r\n type: 'button'\r\n }) as HTMLButtonElement;\r\n closeBtn.innerHTML = ICON_CLOSE;\r\n closeBtn.addEventListener('click', (e) => {\r\n e.stopPropagation();\r\n this.hide();\r\n });\r\n this.headerEl.appendChild(title);\r\n this.headerEl.appendChild(closeBtn);\r\n\r\n // List container\r\n this.listEl = createElement('div', { className: 'fp-thumbnail-list' });\r\n\r\n this.panelEl.appendChild(this.headerEl);\r\n this.panelEl.appendChild(this.listEl);\r\n this.el.appendChild(this.panelEl);\r\n }\r\n\r\n isOpen(): boolean {\r\n return !this.panelEl.classList.contains('hidden') && this.panelEl.style.width !== '0px';\r\n }\r\n\r\n update(thumbnails: Thumbnail[], onSelect: (index: number) => void): void {\r\n this.thumbnails = thumbnails;\r\n this.onSelect = onSelect;\r\n this.renderedIndices.clear();\r\n\r\n const titleEl = this.headerEl.querySelector('.fp-thumbnail-title');\r\n if (titleEl) {\r\n titleEl.textContent = `Pages (${thumbnails.length})`;\r\n }\r\n\r\n this.render();\r\n\r\n if (this.isOpen()) {\r\n this.renderAllVisible();\r\n }\r\n }\r\n\r\n setActive(index: number): void {\r\n this.activeIndex = index;\r\n const items = this.listEl.querySelectorAll<HTMLElement>('.fp-thumbnail-item');\r\n items.forEach((item, i) => {\r\n if (i === index) {\r\n item.classList.add('active');\r\n item.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\r\n } else {\r\n item.classList.remove('active');\r\n }\r\n });\r\n }\r\n\r\n show(): void {\r\n this.panelEl.classList.remove('hidden');\r\n this.panelEl.style.width = '200px';\r\n this.panelEl.style.minWidth = '200px';\r\n this.panelEl.style.opacity = '1';\r\n this.panelEl.style.display = 'flex';\r\n this.onToggleCallback?.(true);\r\n this.renderAllVisible();\r\n }\r\n\r\n hide(): void {\r\n this.panelEl.classList.add('hidden');\r\n this.panelEl.style.width = '0px';\r\n this.panelEl.style.minWidth = '0px';\r\n this.panelEl.style.opacity = '0';\r\n this.onToggleCallback?.(false);\r\n }\r\n\r\n toggle(): void {\r\n if (this.isOpen()) {\r\n this.hide();\r\n } else {\r\n this.show();\r\n }\r\n }\r\n\r\n destroy(): void {\r\n if (this.observer) {\r\n this.observer.disconnect();\r\n this.observer = undefined;\r\n }\r\n this.renderedIndices.clear();\r\n this.el.innerHTML = '';\r\n }\r\n\r\n renderAllVisible(): void {\r\n const items = this.listEl.querySelectorAll<HTMLElement>('.fp-thumbnail-item');\r\n items.forEach((item) => {\r\n const idx = parseInt(item.dataset.thumbIndex || '-1', 10);\r\n if (idx >= 0 && !this.renderedIndices.has(idx)) {\r\n this.renderThumbnailItem(idx, item);\r\n }\r\n });\r\n }\r\n\r\n private renderThumbnailItem(idx: number, itemEl: HTMLElement): void {\r\n if (this.renderedIndices.has(idx)) return;\r\n this.renderedIndices.add(idx);\r\n const canvas = itemEl.querySelector('canvas') as HTMLCanvasElement | null;\r\n const thumb = this.thumbnails[idx];\r\n if (canvas && thumb) {\r\n Promise.resolve(thumb.render(canvas)).catch((err) => {\r\n console.warn(`[FilePreview] Error rendering thumbnail ${idx}:`, err);\r\n });\r\n }\r\n }\r\n\r\n private render(): void {\r\n if (this.observer) {\r\n this.observer.disconnect();\r\n }\r\n this.listEl.innerHTML = '';\r\n\r\n const useObserver = typeof IntersectionObserver !== 'undefined';\r\n if (useObserver) {\r\n this.observer = new IntersectionObserver(\r\n (entries) => {\r\n for (const entry of entries) {\r\n if (entry.isIntersecting) {\r\n const target = entry.target as HTMLElement;\r\n const idx = parseInt(target.dataset.thumbIndex || '-1', 10);\r\n if (idx >= 0) {\r\n this.renderThumbnailItem(idx, target);\r\n }\r\n }\r\n }\r\n },\r\n {\r\n root: this.listEl,\r\n rootMargin: '120px 0px 120px 0px'\r\n }\r\n );\r\n }\r\n\r\n for (let i = 0; i < this.thumbnails.length; i++) {\r\n const thumb = this.thumbnails[i];\r\n const itemEl = createElement('div', {\r\n className: 'fp-thumbnail-item' + (i === this.activeIndex ? ' active' : '')\r\n }) as HTMLElement;\r\n itemEl.dataset.thumbIndex = i.toString();\r\n\r\n itemEl.addEventListener('click', () => {\r\n this.setActive(i);\r\n this.onSelect?.(i);\r\n });\r\n\r\n const canvasWrapper = createElement('div', { className: 'fp-thumbnail-canvas-wrapper' });\r\n const canvas = createElement('canvas', { width: '130', height: '170' }) as HTMLCanvasElement;\r\n canvasWrapper.appendChild(canvas);\r\n\r\n const label = createElement('span', { className: 'fp-thumbnail-label' }, thumb.label || `Page ${i + 1}`);\r\n\r\n itemEl.appendChild(canvasWrapper);\r\n itemEl.appendChild(label);\r\n this.listEl.appendChild(itemEl);\r\n\r\n if (this.observer) {\r\n this.observer.observe(itemEl);\r\n }\r\n\r\n // Eagerly render first 4 items immediately\r\n if (i < 4) {\r\n this.renderThumbnailItem(i, itemEl);\r\n }\r\n }\r\n }\r\n}\r\n","import { EventEmitter } from './events';\r\nimport { sourceToArrayBuffer } from './detect';\r\nimport { downloadFile } from './utils';\r\nimport { saveTransferPayload } from './transfer';\r\nimport { ToolbarController } from './toolbar/toolbar-controller';\r\nimport { ThumbnailPanel } from './thumbnail/thumbnail-panel';\r\nimport type {\r\n FileSource,\r\n PreviewPlugin,\r\n PreviewInstance,\r\n PreviewViewerOptions,\r\n FileInfo,\r\n EventHandler,\r\n Unsubscribe,\r\n ToolbarConfig,\r\n} from './types';\r\n\r\n/**\r\n * Main file preview viewer engine.\r\n * Manages plugins, rendering lifecycle, toolbar, and thumbnails.\r\n */\r\nexport class FilePreviewViewer {\r\n private plugins: PreviewPlugin[] = [];\r\n private activeInstance: PreviewInstance | null = null;\r\n private abortController: AbortController | null = null;\r\n private eventEmitter = new EventEmitter();\r\n private toolbar: ToolbarController | null = null;\r\n private thumbnailPanel: ThumbnailPanel | null = null;\r\n private wrapperEl: HTMLElement | null = null;\r\n private contentEl: HTMLElement | null = null;\r\n private currentBuffer: ArrayBuffer | null = null;\r\n private currentMetadata: import('./types').FileMetadata | null = null;\r\n private keyHandler: ((e: KeyboardEvent) => void) | null = null;\r\n private currentContainer: HTMLElement | null = null;\r\n private currentOptions: PreviewViewerOptions = {};\r\n private resizeObserver: ResizeObserver | null = null;\r\n private fullscreenHandler: (() => void) | null = null;\r\n private titleBarEl: HTMLElement | null = null;\r\n\r\n /**\r\n * Register a preview plugin.\r\n */\r\n registerPlugin(plugin: PreviewPlugin): this {\r\n this.plugins.push(plugin);\r\n // Sort by weight descending (higher weight = higher priority)\r\n this.plugins.sort((a, b) => (b.weight ?? 0) - (a.weight ?? 0));\r\n return this;\r\n }\r\n\r\n /**\r\n * Register multiple plugins at once.\r\n */\r\n registerPlugins(plugins: PreviewPlugin[]): this {\r\n for (const plugin of plugins) {\r\n this.registerPlugin(plugin);\r\n }\r\n return this;\r\n }\r\n\r\n /**\r\n * Preview a file in the given container element.\r\n */\r\n async preview(\r\n container: HTMLElement,\r\n source: FileSource,\r\n options: PreviewViewerOptions = {}\r\n ): Promise<PreviewInstance> {\r\n this.currentOptions = options;\r\n\r\n // 1. Abort any in-flight operation\r\n this.abort();\r\n this.abortController = new AbortController();\r\n const { signal } = this.abortController;\r\n\r\n // 2. Destroy existing instance\r\n this.destroyInstance();\r\n\r\n // 3. Setup wrapper DOM structure\r\n this.setupDOM(container, options);\r\n\r\n // 4. Emit loading event\r\n this.eventEmitter.emit('loading', { source });\r\n this.showLoading();\r\n\r\n try {\r\n // 5. Normalize source to ArrayBuffer + metadata\r\n const { buffer, metadata } = await sourceToArrayBuffer(source, signal);\r\n if (options.metadata) {\r\n Object.assign(metadata, options.metadata);\r\n }\r\n this.currentBuffer = buffer.slice(0);\r\n this.currentMetadata = metadata;\r\n this.updateTitleBar(options, metadata);\r\n\r\n if (signal.aborted) throw new DOMException('Aborted', 'AbortError');\r\n\r\n // 6. Find matching plugin\r\n const fileInfo: FileInfo = { metadata, buffer };\r\n const matchedPlugin = await this.findPlugin(fileInfo);\r\n\r\n if (!matchedPlugin) {\r\n throw new Error(\r\n `Unsupported file type: ${metadata.extension ?? metadata.mimeType ?? 'unknown'}`\r\n );\r\n }\r\n\r\n if (signal.aborted) throw new DOMException('Aborted', 'AbortError');\r\n\r\n // 7. Clear content area and render\r\n if (this.contentEl) {\r\n this.contentEl.innerHTML = '';\r\n }\r\n\r\n const instance = await matchedPlugin.render({\r\n container: this.contentEl!,\r\n source,\r\n metadata,\r\n buffer,\r\n options,\r\n signal,\r\n emit: (event: string, payload?: unknown) => {\r\n if (event === 'page-change' && payload && typeof (payload as any).page === 'number') {\r\n const total = (payload as any).total ?? (payload as any).totalPages;\r\n this.toolbar?.setPage((payload as any).page, total);\r\n this.thumbnailPanel?.setActive((payload as any).page - 1);\r\n }\r\n this.eventEmitter.emit(event, payload);\r\n },\r\n toggleThumbnails: () => this.toggleThumbnails(),\r\n } as any);\r\n\r\n this.activeInstance = instance;\r\n (instance as any).openInSeparateWindow = () => this.openInSeparateWindow();\r\n (instance as any).toggleThumbnails = () => this.toggleThumbnails();\r\n if (!instance.resetZoom && instance.fitToPage) {\r\n (instance as any).resetZoom = () => instance.fitToPage?.();\r\n }\r\n\r\n // FAST STARTUP: Hide loading immediately once the instance is mounted!\r\n this.hideLoading();\r\n this.eventEmitter.emit('loaded', { metadata, plugin: matchedPlugin.id });\r\n\r\n // 8. Setup toolbar with plugin's actions + auto fullscreen and open-window buttons\r\n const isToolbarVisible = options.showToolbar !== false && options.toolbar !== false;\r\n if (isToolbarVisible && this.toolbar) {\r\n const toolbarConfig = this.extractToolbarConfig(options);\r\n this.toolbar.setConfig(toolbarConfig);\r\n const actions = matchedPlugin.getToolbarActions(instance);\r\n const hasFullscreen = actions.some(a => a.id === 'fullscreen');\r\n if (!hasFullscreen && this.wrapperEl) {\r\n actions.push({\r\n id: 'fullscreen',\r\n icon: 'fullscreen',\r\n label: 'Fullscreen',\r\n type: 'button',\r\n group: 'view',\r\n execute: () => {\r\n try {\r\n if (!document.fullscreenElement) {\r\n this.wrapperEl?.requestFullscreen?.();\r\n this.wrapperEl?.classList.add('fp-fullscreen-active');\r\n } else {\r\n document.exitFullscreen?.();\r\n this.wrapperEl?.classList.remove('fp-fullscreen-active');\r\n }\r\n } catch {\r\n this.wrapperEl?.classList.toggle('fp-fullscreen-active');\r\n }\r\n setTimeout(() => {\r\n this.activeInstance?.fitToPage?.();\r\n }, 120);\r\n }\r\n });\r\n }\r\n\r\n const openWinAction = actions.find(a => a.id === 'open-window');\r\n if (openWinAction) {\r\n if ((options as any)?._isSeparateWindow) {\r\n const idx = actions.indexOf(openWinAction);\r\n if (idx !== -1) actions.splice(idx, 1);\r\n } else {\r\n openWinAction.execute = () => {\r\n this.openInSeparateWindow();\r\n };\r\n }\r\n } else if (!(options as any)?._isSeparateWindow) {\r\n actions.push({\r\n id: 'open-window',\r\n icon: 'open-window',\r\n label: 'Open in Separate Full Window',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => {\r\n this.openInSeparateWindow();\r\n }\r\n });\r\n }\r\n\r\n const thumbAction = actions.find(a => a.id === 'thumbnails');\r\n if (thumbAction) {\r\n thumbAction.execute = () => {\r\n this.toggleThumbnails();\r\n };\r\n }\r\n\r\n this.toolbar.update(actions);\r\n this.toolbar.show();\r\n }\r\n\r\n // 9. Setup thumbnails asynchronously in background so initial preview is instant\r\n if (instance.getThumbnails && this.thumbnailPanel) {\r\n Promise.resolve().then(async () => {\r\n try {\r\n const thumbnails = await Promise.resolve(instance.getThumbnails!());\r\n if (thumbnails && thumbnails.length > 0 && this.thumbnailPanel) {\r\n this.thumbnailPanel.update(thumbnails, (index) => {\r\n instance.goToPage?.(index + 1);\r\n this.toolbar?.setPage(index + 1);\r\n });\r\n if (options.showThumbnails) {\r\n this.thumbnailPanel.show();\r\n }\r\n }\r\n } catch (e) {\r\n console.warn('[FilePreview] Non-critical thumbnail load error:', e);\r\n }\r\n });\r\n }\r\n\r\n return instance;\r\n } catch (error: unknown) {\r\n this.hideLoading();\r\n if (error instanceof DOMException && error.name === 'AbortError') {\r\n throw error;\r\n }\r\n this.showError(error instanceof Error ? error.message : 'Failed to preview file');\r\n this.eventEmitter.emit('error', error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Opens the current file preview in a separate full browser window.\r\n */\r\n openInSeparateWindow(): Window | null {\r\n if (!this.currentBuffer) {\r\n console.warn('[FilePreviewViewer] No active file buffer to open in separate window');\r\n return null;\r\n }\r\n\r\n if (this.currentOptions.onOpenSeparateWindow) {\r\n return this.currentOptions.onOpenSeparateWindow({\r\n buffer: this.currentBuffer,\r\n metadata: this.currentMetadata || { name: 'Document' },\r\n options: this.currentOptions\r\n });\r\n }\r\n\r\n const transferId = 'fp_win_' + Date.now() + '_' + Math.random().toString(36).slice(2, 8);\r\n let clonedBuffer: ArrayBuffer;\r\n try {\r\n clonedBuffer = this.currentBuffer.slice(0);\r\n } catch {\r\n clonedBuffer = this.currentBuffer;\r\n }\r\n const payload = {\r\n buffer: clonedBuffer,\r\n metadata: this.currentMetadata ? { ...this.currentMetadata } : undefined,\r\n options: { ...this.currentOptions, _isSeparateWindow: true }\r\n };\r\n\r\n if (typeof window !== 'undefined') {\r\n try {\r\n (window as any)[transferId] = payload;\r\n (window as any).__lastTransfer = payload;\r\n } catch {}\r\n }\r\n\r\n // Persist asynchronously in IndexedDB for cross-window / process-isolated communication\r\n saveTransferPayload(transferId, payload).catch(err => {\r\n console.warn('[FilePreviewViewer] Transfer payload save warning:', err);\r\n });\r\n\r\n let targetUrl: string | null = null;\r\n if (this.currentOptions.standaloneViewerUrl) {\r\n const u = new URL(this.currentOptions.standaloneViewerUrl, window.location.href);\r\n u.searchParams.set('mode', 'fullscreen');\r\n u.searchParams.set('transferId', transferId);\r\n targetUrl = u.toString();\r\n } else if (typeof window !== 'undefined' && window.location?.href && !window.location.href.startsWith('about:')) {\r\n const u = new URL(window.location.href);\r\n u.searchParams.set('mode', 'fullscreen');\r\n u.searchParams.set('transferId', transferId);\r\n targetUrl = u.toString();\r\n }\r\n\r\n if (targetUrl) {\r\n const newWin = window.open(targetUrl, '_blank');\r\n if (!newWin) {\r\n console.warn('[FilePreviewViewer] Popup blocker prevented opening the preview in a separate window.');\r\n return null;\r\n }\r\n return newWin;\r\n }\r\n\r\n // Fallback for about:blank / test environments without origin\r\n const title = (this.currentMetadata?.name || 'Document Preview') + ' - Full Preview';\r\n const newWin = window.open('', '_blank');\r\n if (!newWin) {\r\n console.warn('[FilePreviewViewer] Popup blocker prevented opening the preview in a separate window.');\r\n return null;\r\n }\r\n\r\n newWin.document.title = title;\r\n newWin.document.body.style.margin = '0';\r\n newWin.document.body.style.padding = '0';\r\n newWin.document.body.style.width = '100vw';\r\n newWin.document.body.style.height = '100vh';\r\n newWin.document.body.style.overflow = 'hidden';\r\n newWin.document.body.style.backgroundColor = '#f8fafc';\r\n\r\n // Clone parent stylesheets and style tags\r\n const headNodes = document.querySelectorAll('link[rel=\"stylesheet\"], style');\r\n headNodes.forEach(node => {\r\n newWin.document.head.appendChild(node.cloneNode(true));\r\n });\r\n\r\n const root = newWin.document.createElement('div');\r\n root.id = 'full-window-preview-root';\r\n root.style.width = '100%';\r\n root.style.height = '100%';\r\n root.style.overflow = 'hidden';\r\n newWin.document.body.appendChild(root);\r\n\r\n const separateViewer = new FilePreviewViewer();\r\n for (const plugin of this.plugins) {\r\n separateViewer.registerPlugin(plugin);\r\n }\r\n\r\n separateViewer.preview(root, this.currentBuffer.slice(0), {\r\n ...this.currentOptions,\r\n showToolbar: true,\r\n toolbarPosition: 'top',\r\n metadata: this.currentMetadata || undefined,\r\n _isSeparateWindow: true\r\n } as any).catch(err => {\r\n console.error('[FilePreviewViewer] Error rendering in separate window:', err);\r\n });\r\n\r\n newWin.addEventListener('beforeunload', () => {\r\n separateViewer.destroy();\r\n });\r\n\r\n return newWin;\r\n }\r\n\r\n /**\r\n * Subscribe to viewer events.\r\n */\r\n on(event: string, handler: EventHandler): Unsubscribe {\r\n return this.eventEmitter.on(event, handler);\r\n }\r\n\r\n /**\r\n * Destroy the viewer and clean up all resources.\r\n */\r\n destroy(): void {\r\n if (this.keyHandler) {\r\n window.removeEventListener('keydown', this.keyHandler);\r\n this.keyHandler = null;\r\n }\r\n if (this.resizeObserver) {\r\n this.resizeObserver.disconnect();\r\n this.resizeObserver = null;\r\n }\r\n if (this.fullscreenHandler) {\r\n document.removeEventListener('fullscreenchange', this.fullscreenHandler);\r\n document.removeEventListener('webkitfullscreenchange', this.fullscreenHandler);\r\n this.fullscreenHandler = null;\r\n }\r\n this.abort();\r\n this.destroyInstance();\r\n this.toolbar?.destroy();\r\n this.thumbnailPanel?.destroy();\r\n this.eventEmitter.emit('destroy', null);\r\n this.eventEmitter.removeAll();\r\n\r\n if (this.wrapperEl?.parentNode) {\r\n this.wrapperEl.parentNode.removeChild(this.wrapperEl);\r\n }\r\n this.wrapperEl = null;\r\n this.contentEl = null;\r\n this.toolbar = null;\r\n this.thumbnailPanel = null;\r\n this.currentBuffer = null;\r\n this.currentMetadata = null;\r\n this.currentContainer = null;\r\n this.titleBarEl = null;\r\n }\r\n\r\n /**\r\n * Get the currently active preview instance.\r\n */\r\n getInstance(): PreviewInstance | null {\r\n return this.activeInstance;\r\n }\r\n\r\n // --- Toolbar Configuration & Feature Toggles ---\r\n\r\n /**\r\n * Configure toolbar features dynamically through options or methods.\r\n * e.g. viewer.setToolbarConfig({ zoomIn: false, print: false })\r\n */\r\n setToolbarConfig(config: ToolbarConfig): void {\r\n this.toolbar?.setConfig(config);\r\n }\r\n\r\n /**\r\n * Get current toolbar configuration.\r\n */\r\n getToolbarConfig(): ToolbarConfig {\r\n return this.toolbar?.getConfig() ?? {};\r\n }\r\n\r\n /**\r\n * Hide a specific toolbar action by ID or alias (e.g. 'zoom-in', 'print', 'download').\r\n */\r\n hideToolbarAction(actionId: string): void {\r\n this.toolbar?.hideAction(actionId);\r\n }\r\n\r\n /**\r\n * Show a specific toolbar action by ID or alias.\r\n */\r\n showToolbarAction(actionId: string): void {\r\n this.toolbar?.showAction(actionId);\r\n }\r\n\r\n /**\r\n * Enable a specific toolbar action button.\r\n */\r\n enableToolbarAction(actionId: string): void {\r\n this.toolbar?.enableAction(actionId);\r\n }\r\n\r\n /**\r\n * Disable a specific toolbar action button.\r\n */\r\n disableToolbarAction(actionId: string): void {\r\n this.toolbar?.disableAction(actionId);\r\n }\r\n\r\n // --- Programmatic Toolbar Action Methods ---\r\n\r\n /**\r\n * Fit document to page so it fills the frame width with minimal margins.\r\n */\r\n fitToPage(): void {\r\n this.activeInstance?.fitToPage?.();\r\n }\r\n\r\n /**\r\n * Reset zoom level to initial/default fit state.\r\n */\r\n resetZoom(): void {\r\n if (this.activeInstance?.resetZoom) {\r\n this.activeInstance.resetZoom();\r\n } else if (this.activeInstance?.fitToPage) {\r\n this.activeInstance.fitToPage();\r\n }\r\n }\r\n\r\n /**\r\n * Zoom in.\r\n */\r\n zoomIn(): void {\r\n this.activeInstance?.zoomIn?.();\r\n }\r\n\r\n /**\r\n * Zoom out.\r\n */\r\n zoomOut(): void {\r\n this.activeInstance?.zoomOut?.();\r\n }\r\n\r\n /**\r\n * Set specific zoom level.\r\n */\r\n setZoom(level: number): void {\r\n this.activeInstance?.setZoom?.(level);\r\n }\r\n\r\n /**\r\n * Get current zoom level.\r\n */\r\n getZoom(): number {\r\n return this.activeInstance?.getZoom?.() ?? 1.0;\r\n }\r\n\r\n /**\r\n * Rotate 90 degrees clockwise.\r\n */\r\n rotateCW(): void {\r\n this.activeInstance?.rotateCW?.();\r\n }\r\n\r\n /**\r\n * Rotate 90 degrees counter-clockwise.\r\n */\r\n rotateCCW(): void {\r\n this.activeInstance?.rotateCCW?.();\r\n }\r\n\r\n /**\r\n * Navigate to a specific page number.\r\n */\r\n goToPage(page: number): void {\r\n this.activeInstance?.goToPage?.(page);\r\n this.toolbar?.setPage(page);\r\n }\r\n\r\n /**\r\n * Navigate to next page.\r\n */\r\n nextPage(): void {\r\n const cur = this.getCurrentPage();\r\n const max = this.getPageCount();\r\n if (cur < max) {\r\n this.goToPage(cur + 1);\r\n }\r\n }\r\n\r\n /**\r\n * Navigate to previous page.\r\n */\r\n prevPage(): void {\r\n const cur = this.getCurrentPage();\r\n if (cur > 1) {\r\n this.goToPage(cur - 1);\r\n }\r\n }\r\n\r\n /**\r\n * Get total page count.\r\n */\r\n getPageCount(): number {\r\n return this.activeInstance?.getPageCount?.() ?? 1;\r\n }\r\n\r\n /**\r\n * Get current page number.\r\n */\r\n getCurrentPage(): number {\r\n return this.activeInstance?.getCurrentPage?.() ?? 1;\r\n }\r\n\r\n /**\r\n * Download the current document.\r\n */\r\n download(): void {\r\n this.activeInstance?.download?.();\r\n }\r\n\r\n /**\r\n * Print the current document.\r\n */\r\n print(): void {\r\n this.activeInstance?.print?.();\r\n }\r\n\r\n /**\r\n * Toggle fullscreen mode.\r\n */\r\n toggleFullscreen(): void {\r\n try {\r\n if (!document.fullscreenElement) {\r\n this.wrapperEl?.requestFullscreen?.();\r\n this.wrapperEl?.classList.add('fp-fullscreen-active');\r\n } else {\r\n document.exitFullscreen?.();\r\n this.wrapperEl?.classList.remove('fp-fullscreen-active');\r\n }\r\n } catch {\r\n this.wrapperEl?.classList.toggle('fp-fullscreen-active');\r\n }\r\n setTimeout(() => {\r\n this.activeInstance?.fitToPage?.();\r\n }, 120);\r\n }\r\n\r\n /**\r\n * Toggle thumbnails sidebar panel.\r\n */\r\n toggleThumbnails(): void {\r\n if (!this.thumbnailPanel) return;\r\n this.thumbnailPanel.toggle();\r\n const isOpen = this.thumbnailPanel.isOpen();\r\n this.toolbar?.setActionActive('thumbnails', isOpen);\r\n setTimeout(() => {\r\n this.activeInstance?.fitToPage?.();\r\n }, 260);\r\n }\r\n\r\n /**\r\n * Set whether to display the file name / title bar above the toolbar.\r\n */\r\n setShowFileName(show: boolean): void {\r\n if (this.currentOptions) {\r\n this.currentOptions.showFileName = show;\r\n }\r\n this.updateTitleBar(this.currentOptions, this.currentMetadata);\r\n }\r\n\r\n /**\r\n * Set or override the displayed file name in the preview panel.\r\n */\r\n setFileName(name: string): void {\r\n if (this.currentOptions) {\r\n this.currentOptions.fileName = name;\r\n }\r\n this.updateTitleBar(this.currentOptions, this.currentMetadata);\r\n }\r\n\r\n // --- Private methods ---\r\n\r\n private updateTitleBar(options?: PreviewViewerOptions, metadata?: import('./types').FileMetadata | null): void {\r\n if (!this.titleBarEl) return;\r\n const show = options?.showFileName !== false;\r\n if (!show) {\r\n this.titleBarEl.style.display = 'none';\r\n return;\r\n }\r\n\r\n const name = options?.fileName || metadata?.name || this.currentMetadata?.name || '';\r\n if (!name) {\r\n this.titleBarEl.style.display = 'none';\r\n return;\r\n }\r\n\r\n this.titleBarEl.style.display = 'flex';\r\n const ext = metadata?.extension || (name.includes('.') ? '.' + name.split('.').pop() : '');\r\n const badge = ext ? ext.replace('.', '').toUpperCase() : '';\r\n this.titleBarEl.innerHTML = `\r\n <div class=\"fp-titlebar-info\">\r\n <span class=\"fp-titlebar-icon\">📄</span>\r\n <span class=\"fp-titlebar-name\" title=\"${name}\">${name}</span>\r\n ${badge ? `<span class=\"fp-titlebar-badge\">${badge}</span>` : ''}\r\n </div>\r\n `;\r\n }\r\n\r\n private extractToolbarConfig(options?: PreviewViewerOptions): ToolbarConfig {\r\n if (!options) return {};\r\n const nested = typeof options.toolbar === 'object' ? options.toolbar : {};\r\n return {\r\n ...options,\r\n ...nested\r\n };\r\n }\r\n\r\n private abort(): void {\r\n if (this.abortController) {\r\n this.abortController.abort();\r\n this.abortController = null;\r\n }\r\n }\r\n\r\n private destroyInstance(): void {\r\n if (this.activeInstance) {\r\n this.activeInstance.destroy();\r\n this.activeInstance = null;\r\n }\r\n }\r\n\r\n private async findPlugin(fileInfo: FileInfo): Promise<PreviewPlugin | null> {\r\n for (const plugin of this.plugins) {\r\n const result = plugin.supports(fileInfo);\r\n const supports = result instanceof Promise ? await result : result;\r\n if (supports) return plugin;\r\n }\r\n return null;\r\n }\r\n\r\n private setupDOM(container: HTMLElement, options: PreviewViewerOptions): void {\r\n this.currentContainer = container;\r\n this.currentOptions = options;\r\n\r\n // Only setup once, or re-setup if container changed\r\n if (this.wrapperEl?.parentNode === container) return;\r\n\r\n // Clean up old wrapper\r\n if (this.wrapperEl?.parentNode) {\r\n this.wrapperEl.parentNode.removeChild(this.wrapperEl);\r\n }\r\n\r\n // Create wrapper structure\r\n const themeClass = options.theme === 'dark' ? 'fp-theme-dark' : '';\r\n const toolbarPos = options.toolbarPosition ?? 'top';\r\n\r\n this.wrapperEl = document.createElement('div');\r\n this.wrapperEl.className = `fp-viewer ${themeClass} ${options.className ?? ''}`.trim();\r\n this.wrapperEl.tabIndex = 0; // allow keyboard focus\r\n\r\n // Toolbar container\r\n const toolbarEl = document.createElement('div');\r\n toolbarEl.className = 'fp-toolbar-container';\r\n\r\n // Content area (where the plugin renders)\r\n this.contentEl = document.createElement('div');\r\n this.contentEl.className = 'fp-content';\r\n\r\n // Thumbnail panel\r\n const thumbnailEl = document.createElement('div');\r\n thumbnailEl.className = 'fp-thumbnail-container';\r\n\r\n // Assemble\r\n const bodyEl = document.createElement('div');\r\n bodyEl.className = 'fp-body';\r\n bodyEl.appendChild(thumbnailEl);\r\n bodyEl.appendChild(this.contentEl);\r\n\r\n // Title / File name bar (above toolbar)\r\n const titleBarEl = document.createElement('div');\r\n titleBarEl.className = 'fp-titlebar';\r\n this.titleBarEl = titleBarEl;\r\n this.updateTitleBar(options, this.currentMetadata);\r\n\r\n if (toolbarPos === 'top') {\r\n this.wrapperEl.appendChild(titleBarEl);\r\n this.wrapperEl.appendChild(toolbarEl);\r\n this.wrapperEl.appendChild(bodyEl);\r\n } else {\r\n this.wrapperEl.appendChild(titleBarEl);\r\n this.wrapperEl.appendChild(bodyEl);\r\n this.wrapperEl.appendChild(toolbarEl);\r\n }\r\n\r\n container.innerHTML = '';\r\n container.appendChild(this.wrapperEl);\r\n\r\n // Initialize toolbar and thumbnail controllers\r\n const initialToolbarConfig = this.extractToolbarConfig(options);\r\n this.toolbar = new ToolbarController(toolbarEl, initialToolbarConfig);\r\n this.thumbnailPanel = new ThumbnailPanel(thumbnailEl, (isOpen) => {\r\n this.toolbar?.setActionActive('thumbnails', isOpen);\r\n setTimeout(() => {\r\n this.activeInstance?.fitToPage?.();\r\n }, 260);\r\n });\r\n\r\n // Enable keyboard shortcuts & drag/drop\r\n this.setupKeyboardShortcuts();\r\n this.setupDragAndDrop(container, options);\r\n this.setupResizeAndFullscreenListeners();\r\n }\r\n\r\n private setupResizeAndFullscreenListeners(): void {\r\n if (this.fullscreenHandler) return;\r\n\r\n this.fullscreenHandler = () => {\r\n setTimeout(() => {\r\n this.activeInstance?.fitToPage?.();\r\n }, 100);\r\n };\r\n\r\n document.addEventListener('fullscreenchange', this.fullscreenHandler);\r\n document.addEventListener('webkitfullscreenchange', this.fullscreenHandler);\r\n\r\n if (typeof ResizeObserver !== 'undefined' && this.contentEl) {\r\n this.resizeObserver = new ResizeObserver(() => {\r\n // Auto-fit content when viewport dimensions resize\r\n if (this.activeInstance && (!this.activeInstance.getZoom || Math.abs((this.activeInstance.getZoom?.() ?? 1) - 1.0) < 0.05)) {\r\n this.activeInstance.fitToPage?.();\r\n }\r\n });\r\n this.resizeObserver.observe(this.contentEl);\r\n }\r\n }\r\n\r\n private setupKeyboardShortcuts(): void {\r\n if (this.keyHandler) return;\r\n\r\n this.keyHandler = (e: KeyboardEvent) => {\r\n // Don't intercept when user is typing in form controls\r\n if (\r\n e.target instanceof HTMLInputElement ||\r\n e.target instanceof HTMLTextAreaElement ||\r\n (e.target as HTMLElement)?.isContentEditable\r\n ) {\r\n return;\r\n }\r\n\r\n if (!this.activeInstance) return;\r\n\r\n if (e.key === 'ArrowRight' || e.key === 'PageDown') {\r\n const cur = this.activeInstance.getCurrentPage?.() ?? 1;\r\n this.activeInstance.goToPage?.(cur + 1);\r\n const nextCur = this.activeInstance.getCurrentPage?.() ?? (cur + 1);\r\n this.toolbar?.setPage(nextCur);\r\n } else if (e.key === 'ArrowLeft' || e.key === 'PageUp') {\r\n const cur = this.activeInstance.getCurrentPage?.() ?? 1;\r\n this.activeInstance.goToPage?.(Math.max(1, cur - 1));\r\n const prevCur = this.activeInstance.getCurrentPage?.() ?? Math.max(1, cur - 1);\r\n this.toolbar?.setPage(prevCur);\r\n } else if (e.key === '+' || e.key === '=') {\r\n this.activeInstance.zoomIn?.();\r\n } else if (e.key === '-' || e.key === '_') {\r\n this.activeInstance.zoomOut?.();\r\n } else if (e.key === '0') {\r\n this.activeInstance.fitToPage?.();\r\n } else if (e.key === 'r' || e.key === 'R') {\r\n this.activeInstance.rotateCW?.();\r\n } else if (e.key === 'f' || e.key === 'F') {\r\n if (!document.fullscreenElement) {\r\n this.wrapperEl?.requestFullscreen?.();\r\n } else {\r\n document.exitFullscreen?.();\r\n }\r\n }\r\n };\r\n\r\n window.addEventListener('keydown', this.keyHandler);\r\n }\r\n\r\n private setupDragAndDrop(container: HTMLElement, options: PreviewViewerOptions): void {\r\n if (!this.wrapperEl) return;\r\n\r\n this.wrapperEl.addEventListener('dragover', (e) => {\r\n e.preventDefault();\r\n this.wrapperEl?.classList.add('fp-dragover');\r\n });\r\n\r\n this.wrapperEl.addEventListener('dragleave', (e) => {\r\n if (e.relatedTarget === null || !this.wrapperEl?.contains(e.relatedTarget as Node)) {\r\n this.wrapperEl?.classList.remove('fp-dragover');\r\n }\r\n });\r\n\r\n this.wrapperEl.addEventListener('drop', (e) => {\r\n e.preventDefault();\r\n this.wrapperEl?.classList.remove('fp-dragover');\r\n const file = e.dataTransfer?.files?.[0];\r\n if (file) {\r\n this.preview(container, file, options);\r\n }\r\n });\r\n }\r\n\r\n private showLoading(): void {\r\n if (!this.contentEl) return;\r\n const loader = document.createElement('div');\r\n loader.className = 'fp-loading';\r\n loader.innerHTML = '<div class=\"fp-spinner\"></div><span>Loading preview...</span>';\r\n this.contentEl.appendChild(loader);\r\n }\r\n\r\n private hideLoading(): void {\r\n if (!this.contentEl) return;\r\n const loader = this.contentEl.querySelector('.fp-loading');\r\n if (loader) loader.remove();\r\n }\r\n\r\n private showError(message: string): void {\r\n if (!this.contentEl) return;\r\n this.contentEl.innerHTML = '';\r\n const errorEl = document.createElement('div');\r\n errorEl.className = 'fp-error';\r\n errorEl.style.display = 'flex';\r\n errorEl.style.flexDirection = 'column';\r\n errorEl.style.alignItems = 'center';\r\n errorEl.style.justifyContent = 'center';\r\n errorEl.style.padding = '32px';\r\n errorEl.style.textAlign = 'center';\r\n\r\n const hasDownload = !!(this.currentBuffer && this.currentMetadata);\r\n\r\n errorEl.innerHTML = `\r\n <div class=\"fp-error-icon\" style=\"font-size:36px;margin-bottom:8px;\">⚠️</div>\r\n <div class=\"fp-error-message\" style=\"font-size:16px;font-weight:600;margin-bottom:6px;\">Cannot preview file</div>\r\n <div class=\"fp-error-sub\" style=\"font-size:13px;color:#64748b;max-width:420px;line-height:1.5;margin-bottom:16px;\">${message}</div>\r\n ${hasDownload ? '<button class=\"fp-error-download-btn\" style=\"padding:8px 16px;background:#3b82f6;color:#ffffff;border:none;border-radius:6px;cursor:pointer;font-weight:500;font-size:13px;transition:background 0.2s;\">Download Original File</button>' : ''}\r\n `;\r\n\r\n if (hasDownload && this.currentBuffer) {\r\n const btn = errorEl.querySelector('.fp-error-download-btn') as HTMLButtonElement;\r\n if (btn) {\r\n btn.addEventListener('click', () => {\r\n downloadFile(this.currentBuffer!, this.currentMetadata?.name || 'download', this.currentMetadata?.mimeType);\r\n });\r\n }\r\n }\r\n\r\n this.contentEl.appendChild(errorEl);\r\n }\r\n}\r\n","/**\r\n * Compound File Binary Format (CFBF / OLE2) parser.\r\n * Implements Microsoft [MS-CFB] specification for legacy Office formats (.doc, .ppt, .xls).\r\n * Zero external dependencies, client-side browser and Node.js compatible.\r\n */\r\n\r\nexport interface CfbfEntry {\r\n name: string;\r\n type: number; // 0=Empty, 1=User Storage, 2=User Stream, 5=Root Storage\r\n size: number;\r\n startSector: number;\r\n}\r\n\r\nexport class CfbfReader {\r\n private view: DataView;\r\n private u8: Uint8Array;\r\n private sectorSize: number;\r\n private miniSectorSize: number;\r\n private miniStreamCutoff: number;\r\n private fat: number[] = [];\r\n private miniFat: number[] = [];\r\n private entries: Map<string, CfbfEntry> = new Map();\r\n private miniStream: Uint8Array = new Uint8Array(0);\r\n\r\n constructor(buffer: ArrayBuffer) {\r\n this.u8 = new Uint8Array(buffer);\r\n this.view = new DataView(buffer);\r\n\r\n if (!this.isValid()) {\r\n throw new Error('Invalid CFBF / OLE2 file header signature');\r\n }\r\n\r\n // Sector shifts\r\n const sectorShift = this.view.getUint16(30, true);\r\n this.sectorSize = 1 << sectorShift;\r\n const miniSectorShift = this.view.getUint16(32, true);\r\n this.miniSectorSize = 1 << miniSectorShift;\r\n this.miniStreamCutoff = this.view.getUint32(56, true) || 4096;\r\n\r\n this.parseFat();\r\n this.parseDirectory();\r\n this.parseMiniFat();\r\n }\r\n\r\n /** Check if the magic 8-byte signature matches [MS-CFB] */\r\n public isValid(): boolean {\r\n if (this.u8.length < 512) return false;\r\n const sig = [0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, 0x1a, 0xe1];\r\n return sig.every((b, i) => this.u8[i] === b);\r\n }\r\n\r\n /** Return all directory stream/storage entries found in the file */\r\n public listEntries(): CfbfEntry[] {\r\n return Array.from(this.entries.values());\r\n }\r\n\r\n /** Check if a stream exists */\r\n public hasStream(name: string): boolean {\r\n return this.entries.has(name) || this.findEntryCaseInsensitive(name) !== null;\r\n }\r\n\r\n /**\r\n * Read raw bytes of a named stream (e.g. \"WordDocument\", \"PowerPoint Document\", \"Workbook\")\r\n */\r\n public readStream(name: string): Uint8Array | null {\r\n const entry = this.entries.get(name) || this.findEntryCaseInsensitive(name);\r\n if (!entry) return null;\r\n if (entry.size === 0) return new Uint8Array(0);\r\n\r\n // Mini Stream vs Regular Stream\r\n if (entry.size < this.miniStreamCutoff && entry.type !== 5) {\r\n return this.readMiniStream(entry.startSector, entry.size);\r\n } else {\r\n return this.readRegularStream(entry.startSector, entry.size);\r\n }\r\n }\r\n\r\n private findEntryCaseInsensitive(name: string): CfbfEntry | null {\r\n const lower = name.toLowerCase();\r\n for (const [key, val] of this.entries.entries()) {\r\n if (key.toLowerCase() === lower) return val;\r\n }\r\n return null;\r\n }\r\n\r\n private getSectorOffset(sectId: number): number {\r\n return (sectId + 1) * this.sectorSize;\r\n }\r\n\r\n private parseFat(): void {\r\n const csectFat = this.view.getUint32(44, true);\r\n const difat: number[] = [];\r\n\r\n // First 109 DIFAT entries stored in header (offset 76..511)\r\n for (let i = 0; i < 109; i++) {\r\n const sect = this.view.getUint32(76 + i * 4, true);\r\n if (sect !== 0xffffffff && sect !== 0xfffffffe) {\r\n difat.push(sect);\r\n }\r\n }\r\n\r\n // Chained DIFAT sectors (if file has > 109 FAT sectors)\r\n let difatSect = this.view.getUint32(68, true);\r\n const csectDif = this.view.getUint32(72, true);\r\n const entriesPerSector = (this.sectorSize / 4) - 1;\r\n\r\n for (let i = 0; i < csectDif && difatSect < 0xfffffffe; i++) {\r\n const offset = this.getSectorOffset(difatSect);\r\n for (let j = 0; j < entriesPerSector; j++) {\r\n const sect = this.view.getUint32(offset + j * 4, true);\r\n if (sect !== 0xffffffff && sect !== 0xfffffffe) {\r\n difat.push(sect);\r\n }\r\n }\r\n difatSect = this.view.getUint32(offset + entriesPerSector * 4, true);\r\n }\r\n\r\n // Read all FAT sectors and construct fat array\r\n for (const fatSect of difat) {\r\n if (fatSect >= 0xfffffffe) continue;\r\n const offset = this.getSectorOffset(fatSect);\r\n const count = this.sectorSize / 4;\r\n for (let j = 0; j < count; j++) {\r\n this.fat.push(this.view.getUint32(offset + j * 4, true));\r\n }\r\n }\r\n }\r\n\r\n private parseDirectory(): void {\r\n const dirStartSect = this.view.getUint32(48, true);\r\n const dirBytes = this.readRegularStream(dirStartSect);\r\n const dirView = new DataView(dirBytes.buffer, dirBytes.byteOffset, dirBytes.byteLength);\r\n const entryCount = dirBytes.length / 128;\r\n\r\n for (let i = 0; i < entryCount; i++) {\r\n const offset = i * 128;\r\n const type = dirView.getUint8(offset + 66);\r\n if (type === 0) continue; // Unallocated\r\n\r\n const nameLen = dirView.getUint16(offset + 64, true);\r\n let name = '';\r\n if (nameLen > 2) {\r\n const charCount = (nameLen / 2) - 1; // exclude null terminator\r\n const chars: string[] = [];\r\n for (let c = 0; c < charCount; c++) {\r\n const charCode = dirView.getUint16(offset + c * 2, true);\r\n chars.push(String.fromCharCode(charCode));\r\n }\r\n name = chars.join('');\r\n }\r\n\r\n const startSector = dirView.getUint32(offset + 116, true);\r\n // Low 32-bits of size (Office files are almost never > 4GB)\r\n const size = dirView.getUint32(offset + 120, true);\r\n\r\n const entry: CfbfEntry = { name, type, size, startSector };\r\n this.entries.set(name, entry);\r\n\r\n // Root entry stores the Mini Stream\r\n if (type === 5) {\r\n this.miniStream = this.readRegularStream(startSector, size);\r\n }\r\n }\r\n }\r\n\r\n private parseMiniFat(): void {\r\n const miniFatStart = this.view.getUint32(60, true);\r\n const csectMiniFat = this.view.getUint32(64, true);\r\n if (miniFatStart >= 0xfffffffe || csectMiniFat === 0) return;\r\n\r\n let sect = miniFatStart;\r\n for (let i = 0; i < csectMiniFat && sect < 0xfffffffe; i++) {\r\n const offset = this.getSectorOffset(sect);\r\n const count = this.sectorSize / 4;\r\n for (let j = 0; j < count; j++) {\r\n this.miniFat.push(this.view.getUint32(offset + j * 4, true));\r\n }\r\n sect = this.fat[sect] ?? 0xfffffffe;\r\n }\r\n }\r\n\r\n private readRegularStream(startSector: number, targetSize?: number): Uint8Array {\r\n if (startSector >= 0xfffffffe) return new Uint8Array(0);\r\n\r\n const chunks: Uint8Array[] = [];\r\n let curr = startSector;\r\n let totalBytes = 0;\r\n const visited = new Set<number>();\r\n\r\n while (curr < 0xfffffffe && !visited.has(curr)) {\r\n visited.add(curr);\r\n const offset = this.getSectorOffset(curr);\r\n if (offset + this.sectorSize <= this.u8.length) {\r\n chunks.push(this.u8.subarray(offset, offset + this.sectorSize));\r\n totalBytes += this.sectorSize;\r\n }\r\n curr = this.fat[curr] ?? 0xfffffffe;\r\n }\r\n\r\n const result = new Uint8Array(totalBytes);\r\n let pos = 0;\r\n for (const chunk of chunks) {\r\n result.set(chunk, pos);\r\n pos += chunk.length;\r\n }\r\n\r\n if (targetSize !== undefined && targetSize < result.length) {\r\n return result.subarray(0, targetSize);\r\n }\r\n return result;\r\n }\r\n\r\n private readMiniStream(startSector: number, targetSize: number): Uint8Array {\r\n if (this.miniStream.length === 0 || startSector >= 0xfffffffe) return new Uint8Array(0);\r\n\r\n const chunks: Uint8Array[] = [];\r\n let curr = startSector;\r\n let totalBytes = 0;\r\n const visited = new Set<number>();\r\n\r\n while (curr < 0xfffffffe && !visited.has(curr)) {\r\n visited.add(curr);\r\n const offset = curr * this.miniSectorSize;\r\n if (offset + this.miniSectorSize <= this.miniStream.length) {\r\n chunks.push(this.miniStream.subarray(offset, offset + this.miniSectorSize));\r\n totalBytes += this.miniSectorSize;\r\n }\r\n curr = this.miniFat[curr] ?? 0xfffffffe;\r\n }\r\n\r\n const result = new Uint8Array(totalBytes);\r\n let pos = 0;\r\n for (const chunk of chunks) {\r\n result.set(chunk, pos);\r\n pos += chunk.length;\r\n }\r\n\r\n return result.subarray(0, targetSize);\r\n }\r\n}\r\n","import type { \r\n FileInfo, \r\n RenderContext, \r\n ToolbarAction, \r\n PreviewPlugin, \r\n PreviewInstance, \r\n Thumbnail \r\n} from '@patel.sumit51/core';\r\nimport * as pdfjsLib from 'pdfjs-dist';\r\n\r\n// Configure PDF.js worker: 100% local, zero external network dependencies\r\nif (typeof window !== 'undefined' && pdfjsLib.GlobalWorkerOptions) {\r\n if (!pdfjsLib.GlobalWorkerOptions.workerPort && !pdfjsLib.GlobalWorkerOptions.workerSrc) {\r\n const customWorker = (window as any).__PDF_WORKER_SRC__;\r\n if (customWorker) {\r\n pdfjsLib.GlobalWorkerOptions.workerSrc = customWorker;\r\n } else {\r\n try {\r\n pdfjsLib.GlobalWorkerOptions.workerPort = new Worker(\r\n new URL('pdfjs-dist/build/pdf.worker.min.mjs', import.meta.url),\r\n { type: 'module' }\r\n );\r\n } catch {\r\n pdfjsLib.GlobalWorkerOptions.workerSrc = './pdf.worker.min.mjs';\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport class PdfPlugin implements PreviewPlugin {\r\n id = 'pdf';\r\n name = 'PDF Document Preview';\r\n extensions = ['.pdf'];\r\n mimeTypes = ['application/pdf'];\r\n weight = 100;\r\n\r\n supports(file: FileInfo): boolean {\r\n const ext = file.metadata.extension?.toLowerCase();\r\n const mime = file.metadata.mimeType?.toLowerCase();\r\n if (ext) return this.extensions.includes(ext);\r\n return this.mimeTypes.includes(mime || '');\r\n }\r\n\r\n getToolbarActions(instance: PreviewInstance): ToolbarAction[] {\r\n const totalPages = instance.getPageCount?.() ?? 1;\r\n const curPage = instance.getCurrentPage?.() ?? 1;\r\n\r\n return [\r\n {\r\n id: 'thumbnails',\r\n icon: 'thumbnails',\r\n label: 'Page Thumbnails',\r\n type: 'button',\r\n group: 'navigation',\r\n execute: () => instance.toggleThumbnails?.()\r\n },\r\n {\r\n id: 'page-nav',\r\n icon: '',\r\n label: 'Page Navigation',\r\n type: 'page-nav',\r\n group: 'navigation',\r\n value: curPage,\r\n max: totalPages,\r\n execute: (action: unknown, page?: unknown) => {\r\n const cur = instance.getCurrentPage?.() ?? 1;\r\n const max = instance.getPageCount?.() ?? 1;\r\n if (action === 'prev') {\r\n if (cur > 1) instance.goToPage?.(cur - 1);\r\n } else if (action === 'next') {\r\n if (cur < max) instance.goToPage?.(cur + 1);\r\n } else if (typeof page === 'number') {\r\n instance.goToPage?.(page);\r\n }\r\n }\r\n },\r\n {\r\n id: 'zoom-out',\r\n icon: 'zoom-out',\r\n label: 'Zoom Out',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomOut?.()\r\n },\r\n {\r\n id: 'zoom-in',\r\n icon: 'zoom-in',\r\n label: 'Zoom In',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomIn?.()\r\n },\r\n {\r\n id: 'fit-page',\r\n icon: 'fit-page',\r\n label: 'Fit to Page',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.fitToPage?.()\r\n },\r\n {\r\n id: 'reset-zoom',\r\n icon: 'reset-zoom',\r\n label: 'Reset Zoom',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.resetZoom?.()\r\n },\r\n {\r\n id: 'fit-width',\r\n icon: 'fit-width',\r\n label: 'Fit to Width',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.fitToWidth?.()\r\n },\r\n {\r\n id: 'rotate-cw',\r\n icon: 'rotate-cw',\r\n label: 'Rotate Clockwise',\r\n type: 'button',\r\n group: 'view',\r\n execute: () => instance.rotateCW?.()\r\n },\r\n {\r\n id: 'rotate-ccw',\r\n icon: 'rotate-ccw',\r\n label: 'Rotate Counter-Clockwise',\r\n type: 'button',\r\n group: 'view',\r\n execute: () => instance.rotateCCW?.()\r\n },\r\n {\r\n id: 'download',\r\n icon: 'download',\r\n label: 'Download PDF',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => instance.download?.()\r\n },\r\n {\r\n id: 'print',\r\n icon: 'print',\r\n label: 'Print',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => instance.print?.()\r\n },\r\n {\r\n id: 'open-window',\r\n icon: 'open-window',\r\n label: 'Open in Separate Full Window',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => (instance as any).openInSeparateWindow?.()\r\n }\r\n ];\r\n }\r\n\r\n async render(ctx: RenderContext): Promise<PreviewInstance> {\r\n const container = document.createElement('div');\r\n container.className = 'fp-pdf-container';\r\n container.style.width = '100%';\r\n container.style.height = '100%';\r\n container.style.overflow = 'auto';\r\n container.style.backgroundColor = '#0f172a';\r\n container.style.boxSizing = 'border-box';\r\n container.style.position = 'relative';\r\n\r\n const scrollWrapper = document.createElement('div');\r\n scrollWrapper.className = 'fp-pdf-scroll-wrapper';\r\n scrollWrapper.style.minWidth = '100%';\r\n scrollWrapper.style.minHeight = '100%';\r\n scrollWrapper.style.width = 'max-content';\r\n scrollWrapper.style.height = 'max-content';\r\n scrollWrapper.style.display = 'flex';\r\n scrollWrapper.style.flexDirection = 'column';\r\n scrollWrapper.style.alignItems = 'center';\r\n scrollWrapper.style.justifyContent = 'flex-start';\r\n scrollWrapper.style.padding = '16px 8px';\r\n scrollWrapper.style.boxSizing = 'border-box';\r\n\r\n const pageCard = document.createElement('div');\r\n pageCard.className = 'fp-pdf-page-card';\r\n pageCard.style.boxShadow = '0 10px 35px rgba(0, 0, 0, 0.5)';\r\n pageCard.style.backgroundColor = '#ffffff';\r\n pageCard.style.borderRadius = '4px';\r\n pageCard.style.overflow = 'hidden';\r\n pageCard.style.lineHeight = '0';\r\n pageCard.style.position = 'relative';\r\n pageCard.style.flexShrink = '0';\r\n pageCard.style.transition = 'box-shadow 0.2s ease';\r\n\r\n let canvas = document.createElement('canvas');\r\n pageCard.appendChild(canvas);\r\n scrollWrapper.appendChild(pageCard);\r\n container.appendChild(scrollWrapper);\r\n ctx.container.appendChild(container);\r\n\r\n const standardFontsUrl = (typeof window !== 'undefined' && (window as any).__PDF_STANDARD_FONTS_URL__) || './standard_fonts/';\r\n const cmapsUrl = (typeof window !== 'undefined' && (window as any).__PDF_CMAPS_URL__) || './cmaps/';\r\n\r\n const loadingTask = pdfjsLib.getDocument({\r\n data: new Uint8Array(ctx.buffer.slice(0)),\r\n cMapUrl: cmapsUrl,\r\n cMapPacked: true,\r\n standardFontDataUrl: standardFontsUrl,\r\n verbosity: 0,\r\n });\r\n\r\n const pdfDoc = await loadingTask.promise;\r\n const totalPages = Math.max(1, pdfDoc.numPages);\r\n\r\n let currentPage = 1;\r\n let zoomScale = 1.0;\r\n let rotation = 0;\r\n let fitMode: 'width' | 'page' = ((ctx as any)?.options?.fitMode as any) || 'width';\r\n let currentRenderTask: any = null;\r\n let textLayerDiv: HTMLElement | null = null;\r\n\r\n const renderPage = async (pageNum: number) => {\r\n if (currentRenderTask) {\r\n try {\r\n currentRenderTask.cancel();\r\n } catch {}\r\n currentRenderTask = null;\r\n }\r\n\r\n // Fresh canvas on every render to eliminate PDF.js canvas collision on fast render/rotation\r\n const newCanvas = document.createElement('canvas');\r\n pageCard.replaceChild(newCanvas, canvas);\r\n canvas = newCanvas;\r\n\r\n if (textLayerDiv) {\r\n textLayerDiv.remove();\r\n textLayerDiv = null;\r\n }\r\n\r\n currentPage = Math.max(1, Math.min(totalPages, pageNum));\r\n ctx.emit('page-change', { page: currentPage, total: totalPages });\r\n\r\n const page = await pdfDoc.getPage(currentPage);\r\n\r\n const containerWidth = container.clientWidth || 900;\r\n const containerHeight = container.clientHeight || 700;\r\n const unscaledVp = page.getViewport({ scale: 1.0, rotation });\r\n\r\n // Minimal side margins (16px on each side, safe from vertical scrollbar)\r\n const availWidth = Math.max(280, containerWidth - 36);\r\n const availHeight = Math.max(280, containerHeight - 32);\r\n const scaleW = availWidth / unscaledVp.width;\r\n const scaleH = availHeight / unscaledVp.height;\r\n\r\n // In 'page' mode: fit page height & width so full document fits comfortably with 0 scroll\r\n // In 'width' mode: fit page width comfortably for reading with minimal side margins\r\n let fitScale: number;\r\n if (fitMode === 'page') {\r\n fitScale = Math.max(0.2, Math.min(4.0, Math.min(scaleW, scaleH)));\r\n } else {\r\n fitScale = Math.max(0.2, Math.min(4.0, scaleW));\r\n }\r\n const effectiveScale = (fitScale > 0 ? fitScale : 1.0) * zoomScale;\r\n\r\n const pixelRatio = window.devicePixelRatio || 1;\r\n const viewport = page.getViewport({ scale: effectiveScale, rotation });\r\n\r\n const displayWidth = Math.floor(viewport.width);\r\n const displayHeight = Math.floor(viewport.height);\r\n\r\n canvas.width = Math.floor(viewport.width * pixelRatio);\r\n canvas.height = Math.floor(viewport.height * pixelRatio);\r\n canvas.style.width = `${displayWidth}px`;\r\n canvas.style.height = `${displayHeight}px`;\r\n\r\n pageCard.style.width = `${displayWidth}px`;\r\n pageCard.style.height = `${displayHeight}px`;\r\n\r\n const canvasCtx = canvas.getContext('2d');\r\n if (!canvasCtx) return;\r\n\r\n canvasCtx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\r\n\r\n currentRenderTask = page.render({\r\n canvasContext: canvasCtx,\r\n viewport,\r\n });\r\n\r\n try {\r\n await currentRenderTask.promise;\r\n } catch (err: any) {\r\n if (err?.name !== 'RenderingCancelledException') {\r\n console.warn('[PdfPlugin] Page render warning:', err);\r\n }\r\n return;\r\n } finally {\r\n currentRenderTask = null;\r\n }\r\n\r\n // Render Text Layer for text selection and copying\r\n try {\r\n textLayerDiv = document.createElement('div');\r\n textLayerDiv.className = 'textLayer';\r\n textLayerDiv.style.width = `${displayWidth}px`;\r\n textLayerDiv.style.height = `${displayHeight}px`;\r\n textLayerDiv.style.position = 'absolute';\r\n textLayerDiv.style.top = '0';\r\n textLayerDiv.style.left = '0';\r\n textLayerDiv.style.lineHeight = '1';\r\n pageCard.appendChild(textLayerDiv);\r\n\r\n if ((pdfjsLib as any).TextLayer) {\r\n const textLayer = new (pdfjsLib as any).TextLayer({\r\n textContentSource: page.streamTextContent(),\r\n container: textLayerDiv,\r\n viewport,\r\n });\r\n await textLayer.render();\r\n }\r\n } catch (err) {\r\n // Non-fatal text layer notice\r\n console.debug('[PdfPlugin] TextLayer notice:', err);\r\n }\r\n };\r\n\r\n renderPage(1);\r\n\r\n // Auto-refit on container resize (window resize, thumbnail panel toggle, fullscreen)\r\n let resizeTimer: ReturnType<typeof setTimeout> | null = null;\r\n const resizeObserver = new ResizeObserver(() => {\r\n if (resizeTimer) clearTimeout(resizeTimer);\r\n resizeTimer = setTimeout(() => {\r\n // Auto-refit if zoom is near 1.0\r\n if (Math.abs(zoomScale - 1.0) < 0.05) {\r\n renderPage(currentPage);\r\n }\r\n }, 120);\r\n });\r\n resizeObserver.observe(container);\r\n\r\n // Ctrl + Wheel / Trackpad Pinch Zoom\r\n const onWheel = (e: WheelEvent) => {\r\n if (e.ctrlKey || e.metaKey) {\r\n e.preventDefault();\r\n const delta = e.deltaY > 0 ? -0.15 : 0.15;\r\n zoomScale = Math.max(0.25, Math.min(4.0, Math.round((zoomScale + delta) * 100) / 100));\r\n renderPage(currentPage);\r\n }\r\n };\r\n container.addEventListener('wheel', onWheel, { passive: false });\r\n\r\n // Keyboard navigation (Left/Right arrows, PageUp/PageDown, Home/End)\r\n const onKeyDown = (e: KeyboardEvent) => {\r\n const tag = (e.target as HTMLElement)?.tagName?.toLowerCase();\r\n if (tag === 'input' || tag === 'textarea' || tag === 'select') return;\r\n\r\n if (e.key === 'ArrowRight' || e.key === 'PageDown') {\r\n if (currentPage < totalPages) {\r\n e.preventDefault();\r\n container.scrollTop = 0;\r\n renderPage(currentPage + 1);\r\n }\r\n } else if (e.key === 'ArrowLeft' || e.key === 'PageUp') {\r\n if (currentPage > 1) {\r\n e.preventDefault();\r\n container.scrollTop = 0;\r\n renderPage(currentPage - 1);\r\n }\r\n } else if (e.key === 'Home') {\r\n e.preventDefault();\r\n container.scrollTop = 0;\r\n renderPage(1);\r\n } else if (e.key === 'End') {\r\n e.preventDefault();\r\n container.scrollTop = 0;\r\n renderPage(totalPages);\r\n }\r\n };\r\n window.addEventListener('keydown', onKeyDown);\r\n\r\n const cleanup = () => {\r\n resizeObserver.disconnect();\r\n window.removeEventListener('keydown', onKeyDown);\r\n container.removeEventListener('wheel', onWheel);\r\n if (resizeTimer) clearTimeout(resizeTimer);\r\n if (currentRenderTask) {\r\n try { currentRenderTask.cancel(); } catch {}\r\n }\r\n try {\r\n pdfDoc.destroy();\r\n } catch {}\r\n container.remove();\r\n ctx.container.innerHTML = '';\r\n };\r\n\r\n ctx.signal.addEventListener('abort', cleanup);\r\n\r\n const instance: PreviewInstance = {\r\n destroy: cleanup,\r\n zoomIn: () => {\r\n zoomScale = Math.min(4.0, Math.round((zoomScale + 0.2) * 10) / 10);\r\n renderPage(currentPage);\r\n },\r\n zoomOut: () => {\r\n zoomScale = Math.max(0.25, Math.round((zoomScale - 0.2) * 10) / 10);\r\n renderPage(currentPage);\r\n },\r\n getZoom: () => zoomScale,\r\n setZoom: (level: number) => {\r\n zoomScale = Math.max(0.25, Math.min(4.0, level));\r\n renderPage(currentPage);\r\n },\r\n fitToPage: () => {\r\n fitMode = 'page';\r\n zoomScale = 1.0;\r\n renderPage(currentPage);\r\n },\r\n resetZoom: () => {\r\n fitMode = 'page';\r\n zoomScale = 1.0;\r\n rotation = 0;\r\n container.scrollTop = 0;\r\n container.scrollLeft = 0;\r\n renderPage(currentPage);\r\n },\r\n fitToWidth: () => {\r\n fitMode = 'width';\r\n zoomScale = 1.0;\r\n renderPage(currentPage);\r\n },\r\n rotateCW: () => {\r\n rotation = (rotation + 90) % 360;\r\n renderPage(currentPage);\r\n },\r\n rotateCCW: () => {\r\n rotation = (rotation - 90 + 360) % 360;\r\n renderPage(currentPage);\r\n },\r\n getRotation: () => rotation,\r\n getPageCount: () => totalPages,\r\n getCurrentPage: () => currentPage,\r\n goToPage: (page: number) => {\r\n container.scrollTop = 0;\r\n renderPage(page);\r\n },\r\n toggleThumbnails: () => {\r\n (ctx as any)?.toggleThumbnails?.();\r\n },\r\n download: () => {\r\n const blob = new Blob([ctx.buffer], { type: 'application/pdf' });\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = ctx.metadata.name || 'document.pdf';\r\n a.click();\r\n URL.revokeObjectURL(url);\r\n },\r\n print: () => {\r\n const blob = new Blob([ctx.buffer], { type: 'application/pdf' });\r\n const url = URL.createObjectURL(blob);\r\n const hiddenIframe = document.createElement('iframe');\r\n hiddenIframe.style.position = 'fixed';\r\n hiddenIframe.style.right = '0';\r\n hiddenIframe.style.bottom = '0';\r\n hiddenIframe.style.width = '0';\r\n hiddenIframe.style.height = '0';\r\n hiddenIframe.style.border = '0';\r\n document.body.appendChild(hiddenIframe);\r\n hiddenIframe.src = url;\r\n hiddenIframe.onload = () => {\r\n setTimeout(() => {\r\n hiddenIframe.contentWindow?.print();\r\n setTimeout(() => {\r\n hiddenIframe.remove();\r\n URL.revokeObjectURL(url);\r\n }, 1000);\r\n }, 300);\r\n };\r\n },\r\n getThumbnails: async (): Promise<Thumbnail[]> => {\r\n const thumbnails: Thumbnail[] = [];\r\n const count = totalPages;\r\n\r\n for (let i = 1; i <= count; i++) {\r\n thumbnails.push({\r\n index: i,\r\n label: `Page ${i}`,\r\n render: async (thumbCanvas: HTMLCanvasElement) => {\r\n try {\r\n const p = await pdfDoc.getPage(i);\r\n const baseVp = p.getViewport({ scale: 1.0, rotation });\r\n const targetW = thumbCanvas.width || 130;\r\n const thumbScale = targetW / baseVp.width;\r\n const thumbVp = p.getViewport({ scale: thumbScale, rotation });\r\n thumbCanvas.height = Math.floor(thumbVp.height);\r\n\r\n const tCtx = thumbCanvas.getContext('2d');\r\n if (tCtx) {\r\n await p.render({ canvasContext: tCtx, viewport: thumbVp }).promise;\r\n }\r\n } catch (e) {\r\n console.warn(`[PdfPlugin] Error generating thumbnail for page ${i}:`, e);\r\n }\r\n }\r\n });\r\n }\r\n return thumbnails;\r\n }\r\n };\r\n\r\n return instance;\r\n }\r\n}\r\n\r\nexport function pdfPlugin(): PdfPlugin {\r\n return new PdfPlugin();\r\n}\r\n\r\nexport default PdfPlugin;\r\n","import type { \r\n FileInfo, \r\n RenderContext, \r\n ToolbarAction, \r\n PreviewPlugin, \r\n PreviewInstance \r\n} from '@patel.sumit51/core';\r\n\r\nconst IMAGE_EXTS = ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.svg', '.bmp', '.ico', '.tiff', '.tif', '.avif'];\r\nconst VIDEO_EXTS = ['.mp4', '.m4v', '.webm', '.ogv', '.ogg', '.mov', '.avi', '.mkv', '.flv', '.wmv', '.3gp', '.mpg', '.mpeg'];\r\nconst AUDIO_EXTS = ['.mp3', '.wav', '.ogg', '.flac', '.aac', '.m4a', '.wma', '.opus', '.weba'];\r\n\r\nexport class MediaPlugin implements PreviewPlugin {\r\n id = 'media';\r\n name = 'Media Preview (Image, Video, Audio)';\r\n extensions = [...IMAGE_EXTS, ...VIDEO_EXTS, ...AUDIO_EXTS];\r\n mimeTypes = [\r\n 'image/jpeg', 'image/png', 'image/gif', 'image/webp', 'image/svg+xml', 'image/bmp', 'image/x-icon', 'image/tiff', 'image/avif',\r\n 'video/mp4', 'video/webm', 'video/ogg', 'video/quicktime', 'video/x-msvideo', 'video/x-matroska', 'video/x-flv', 'video/x-ms-wmv', 'video/3gpp', 'video/mpeg',\r\n 'audio/mpeg', 'audio/wav', 'audio/ogg', 'audio/flac', 'audio/aac', 'audio/mp4', 'audio/x-ms-wma', 'audio/opus', 'audio/webm'\r\n ];\r\n weight = 90;\r\n\r\n supports(file: FileInfo): boolean {\r\n const ext = file.metadata.extension?.toLowerCase() || '';\r\n const mime = file.metadata.mimeType?.toLowerCase() || '';\r\n \r\n return this.extensions.includes(ext) || \r\n this.mimeTypes.some(m => mime.startsWith(m.split('/')[0]));\r\n }\r\n\r\n getToolbarActions(instance: PreviewInstance): ToolbarAction[] {\r\n const actions: ToolbarAction[] = [];\r\n \r\n if (instance.zoomIn) {\r\n actions.push(\r\n {\r\n id: 'zoom-out',\r\n icon: 'zoom-out',\r\n label: 'Zoom Out',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => {\r\n instance.zoomOut?.();\r\n }\r\n },\r\n {\r\n id: 'zoom-in',\r\n icon: 'zoom-in',\r\n label: 'Zoom In',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => {\r\n instance.zoomIn?.();\r\n }\r\n },\r\n {\r\n id: 'fit-page',\r\n icon: 'fit-page',\r\n label: 'Fit to Page',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => {\r\n instance.fitToPage?.();\r\n }\r\n },\r\n {\r\n id: 'reset-zoom',\r\n icon: 'reset-zoom',\r\n label: 'Reset Zoom',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => {\r\n instance.resetZoom?.();\r\n }\r\n },\r\n {\r\n id: 'rotate-cw',\r\n icon: 'rotate-cw',\r\n label: 'Rotate',\r\n type: 'button',\r\n group: 'view',\r\n execute: () => {\r\n instance.rotateCW?.();\r\n }\r\n }\r\n );\r\n }\r\n \r\n if (instance.play) {\r\n actions.push(\r\n {\r\n id: 'replay-10',\r\n icon: 'replay-10',\r\n label: 'Rewind 10s',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => {\r\n instance.rewind?.(10);\r\n }\r\n },\r\n {\r\n id: 'play',\r\n icon: 'play',\r\n label: 'Play',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => {\r\n instance.play?.();\r\n }\r\n },\r\n {\r\n id: 'pause',\r\n icon: 'pause',\r\n label: 'Pause',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => {\r\n instance.pause?.();\r\n }\r\n },\r\n {\r\n id: 'forward-10',\r\n icon: 'forward-10',\r\n label: 'Fast Forward 10s',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => {\r\n instance.fastForward?.(10);\r\n }\r\n },\r\n {\r\n id: 'speed',\r\n icon: 'speed',\r\n label: 'Playback Speed',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => {\r\n (instance as any).cycleSpeed?.();\r\n }\r\n }\r\n );\r\n }\r\n\r\n actions.push({\r\n id: 'download',\r\n icon: 'download',\r\n label: 'Download',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => {\r\n instance.download?.();\r\n }\r\n });\r\n\r\n if (instance.print) {\r\n actions.push({\r\n id: 'print',\r\n icon: 'print',\r\n label: 'Print',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => {\r\n instance.print?.();\r\n }\r\n });\r\n }\r\n\r\n return actions;\r\n }\r\n\r\n async render(ctx: RenderContext): Promise<PreviewInstance> {\r\n const mimeType = ctx.metadata.mimeType || 'application/octet-stream';\r\n const isImage = mimeType.startsWith('image/') || IMAGE_EXTS.includes(ctx.metadata.extension || '');\r\n const isVideo = mimeType.startsWith('video/') || VIDEO_EXTS.includes(ctx.metadata.extension || '');\r\n const isAudio = mimeType.startsWith('audio/') || AUDIO_EXTS.includes(ctx.metadata.extension || '');\r\n \r\n let url = '';\r\n \r\n if (ctx.metadata.extension === '.svg' || mimeType === 'image/svg+xml') {\r\n const decoder = new TextDecoder('utf-8');\r\n const svgText = decoder.decode(ctx.buffer);\r\n const blob = new Blob([svgText], { type: 'image/svg+xml' });\r\n url = URL.createObjectURL(blob);\r\n } else {\r\n const blob = new Blob([ctx.buffer], { type: mimeType });\r\n url = URL.createObjectURL(blob);\r\n }\r\n \r\n let element: HTMLElement;\r\n let currentZoom = 1.0;\r\n let rotation = 0;\r\n let mediaElement: HTMLMediaElement | null = null;\r\n \r\n if (isImage) {\r\n const img = document.createElement('img');\r\n img.src = url;\r\n img.style.maxWidth = '100%';\r\n img.style.maxHeight = '100%';\r\n img.style.objectFit = 'contain';\r\n img.style.transition = 'transform 0.2s ease';\r\n element = img;\r\n } else if (isVideo) {\r\n const video = document.createElement('video');\r\n video.src = url;\r\n video.controls = true;\r\n video.playsInline = true;\r\n video.style.maxWidth = '90%';\r\n video.style.maxHeight = '90%';\r\n video.style.borderRadius = '8px';\r\n video.style.boxShadow = '0 8px 30px rgba(0,0,0,0.3)';\r\n video.style.backgroundColor = '#000000';\r\n element = video;\r\n mediaElement = video;\r\n } else if (isAudio) {\r\n const audio = document.createElement('audio');\r\n audio.src = url;\r\n audio.controls = true;\r\n element = audio;\r\n mediaElement = audio;\r\n } else {\r\n element = document.createElement('div');\r\n element.textContent = 'Unsupported media type';\r\n }\r\n \r\n const scrollWrapper = document.createElement('div');\r\n scrollWrapper.className = 'fp-media-scroll-wrapper';\r\n scrollWrapper.style.minWidth = '100%';\r\n scrollWrapper.style.minHeight = '100%';\r\n scrollWrapper.style.width = 'max-content';\r\n scrollWrapper.style.height = 'max-content';\r\n scrollWrapper.style.display = 'flex';\r\n scrollWrapper.style.justifyContent = 'center';\r\n scrollWrapper.style.alignItems = 'center';\r\n scrollWrapper.style.padding = '16px';\r\n scrollWrapper.style.boxSizing = 'border-box';\r\n\r\n const sizer = document.createElement('div');\r\n sizer.className = 'fp-media-sizer';\r\n sizer.style.position = 'relative';\r\n sizer.style.flexShrink = '0';\r\n sizer.style.display = 'flex';\r\n sizer.style.justifyContent = 'center';\r\n sizer.style.alignItems = 'center';\r\n\r\n sizer.appendChild(element);\r\n scrollWrapper.appendChild(sizer);\r\n\r\n ctx.container.style.overflow = 'auto';\r\n ctx.container.style.padding = '0';\r\n ctx.container.innerHTML = '';\r\n ctx.container.appendChild(scrollWrapper);\r\n\r\n let naturalW = 800;\r\n let naturalH = 600;\r\n let baseW = 800;\r\n let baseH = 600;\r\n\r\n const updateBaseDimensions = () => {\r\n if (!isImage) return;\r\n const img = element as HTMLImageElement;\r\n naturalW = img.naturalWidth || naturalW;\r\n naturalH = img.naturalHeight || naturalH;\r\n\r\n const availW = Math.max(100, ctx.container.clientWidth - 48);\r\n const availH = Math.max(100, ctx.container.clientHeight - 48);\r\n const fitRatio = Math.min(1.0, availW / naturalW, availH / naturalH);\r\n baseW = Math.max(1, Math.round(naturalW * fitRatio));\r\n baseH = Math.max(1, Math.round(naturalH * fitRatio));\r\n };\r\n\r\n const applyTransform = () => {\r\n if (isImage) {\r\n updateBaseDimensions();\r\n const isRotated90 = (rotation % 180 !== 0);\r\n const boxW = Math.round((isRotated90 ? baseH : baseW) * currentZoom);\r\n const boxH = Math.round((isRotated90 ? baseW : baseH) * currentZoom);\r\n\r\n sizer.style.width = `${boxW}px`;\r\n sizer.style.height = `${boxH}px`;\r\n\r\n element.style.width = `${baseW}px`;\r\n element.style.height = `${baseH}px`;\r\n element.style.maxWidth = 'none';\r\n element.style.maxHeight = 'none';\r\n element.style.transform = `scale(${currentZoom}) rotate(${rotation}deg)`;\r\n element.style.transformOrigin = 'center center';\r\n element.style.flexShrink = '0';\r\n } else {\r\n element.style.transform = `scale(${currentZoom}) rotate(${rotation}deg)`;\r\n }\r\n };\r\n\r\n if (isImage) {\r\n const img = element as HTMLImageElement;\r\n if (img.complete && img.naturalWidth > 0) {\r\n updateBaseDimensions();\r\n applyTransform();\r\n } else {\r\n img.onload = () => {\r\n updateBaseDimensions();\r\n applyTransform();\r\n };\r\n }\r\n }\r\n\r\n const ro = typeof ResizeObserver !== 'undefined'\r\n ? new ResizeObserver(() => {\r\n if (currentZoom === 1.0) {\r\n applyTransform();\r\n }\r\n })\r\n : null;\r\n ro?.observe(ctx.container);\r\n\r\n const cleanup = () => {\r\n ro?.disconnect();\r\n if (url) URL.revokeObjectURL(url);\r\n scrollWrapper.remove();\r\n ctx.container.innerHTML = '';\r\n };\r\n\r\n ctx.signal.addEventListener('abort', cleanup);\r\n\r\n return {\r\n destroy: cleanup,\r\n zoomIn: isImage ? () => {\r\n currentZoom += 0.1;\r\n applyTransform();\r\n } : undefined,\r\n zoomOut: isImage ? () => {\r\n currentZoom = Math.max(0.1, currentZoom - 0.1);\r\n applyTransform();\r\n } : undefined,\r\n getZoom: isImage ? () => currentZoom : undefined,\r\n setZoom: isImage ? (level: number) => {\r\n currentZoom = level;\r\n applyTransform();\r\n } : undefined,\r\n fitToPage: isImage ? () => {\r\n currentZoom = 1.0;\r\n rotation = 0;\r\n applyTransform();\r\n } : undefined,\r\n resetZoom: isImage ? () => {\r\n currentZoom = 1.0;\r\n rotation = 0;\r\n ctx.container.scrollTop = 0;\r\n ctx.container.scrollLeft = 0;\r\n applyTransform();\r\n } : undefined,\r\n rotateCW: isImage || isVideo ? () => {\r\n rotation = (rotation + 90) % 360;\r\n applyTransform();\r\n } : undefined,\r\n rotateCCW: isImage || isVideo ? () => {\r\n rotation = (rotation - 90 + 360) % 360;\r\n applyTransform();\r\n } : undefined,\r\n getRotation: () => rotation,\r\n play: mediaElement ? () => mediaElement?.play() : undefined,\r\n pause: mediaElement ? () => mediaElement?.pause() : undefined,\r\n isPlaying: mediaElement ? () => !mediaElement?.paused : undefined,\r\n fastForward: mediaElement ? (seconds = 10) => {\r\n if (mediaElement) {\r\n mediaElement.currentTime = Math.min(mediaElement.duration || Infinity, mediaElement.currentTime + seconds);\r\n }\r\n } : undefined,\r\n rewind: mediaElement ? (seconds = 10) => {\r\n if (mediaElement) {\r\n mediaElement.currentTime = Math.max(0, mediaElement.currentTime - seconds);\r\n }\r\n } : undefined,\r\n cycleSpeed: mediaElement ? () => {\r\n if (mediaElement) {\r\n const speeds = [1.0, 1.25, 1.5, 2.0, 0.5];\r\n const curIndex = speeds.indexOf(mediaElement.playbackRate);\r\n const nextIndex = curIndex === -1 ? 0 : (curIndex + 1) % speeds.length;\r\n mediaElement.playbackRate = speeds[nextIndex];\r\n }\r\n } : undefined,\r\n setPlaybackRate: mediaElement ? (rate: number) => {\r\n if (mediaElement) mediaElement.playbackRate = rate;\r\n } : undefined,\r\n getPlaybackRate: mediaElement ? () => mediaElement?.playbackRate ?? 1.0 : undefined,\r\n download: () => {\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = ctx.metadata.name || 'media';\r\n a.click();\r\n },\r\n print: isImage ? () => {\r\n window.print();\r\n } : undefined\r\n };\r\n }\r\n}\r\n\r\nexport function mediaPlugin(): MediaPlugin {\r\n return new MediaPlugin();\r\n}\r\n\r\nexport default MediaPlugin;\r\n","import type { \r\n FileInfo, \r\n RenderContext, \r\n ToolbarAction, \r\n PreviewPlugin, \r\n PreviewInstance \r\n} from '@patel.sumit51/core';\r\nimport { CfbfReader } from '@patel.sumit51/core';\r\nimport * as docx from 'docx-preview';\r\nimport { unzipSync, strFromU8 } from 'fflate';\r\nimport DOMPurify from 'dompurify';\r\n\r\nexport class DocxPlugin implements PreviewPlugin {\r\n id = 'docx';\r\n name = 'Word Document Preview (.docx, .docm, .dotx, .dotm)';\r\n extensions = ['.docx', '.docm', '.dotx', '.dotm'];\r\n mimeTypes = [\r\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\r\n 'application/vnd.ms-word.document.macroEnabled.12',\r\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',\r\n 'application/vnd.ms-word.template.macroEnabled.12'\r\n ];\r\n weight = 80;\r\n\r\n supports(file: FileInfo): boolean {\r\n const ext = file.metadata.extension?.toLowerCase();\r\n const mime = file.metadata.mimeType?.toLowerCase();\r\n if (ext) {\r\n return this.extensions.includes(ext);\r\n }\r\n return this.mimeTypes.includes(mime || '');\r\n }\r\n\r\n getToolbarActions(instance: PreviewInstance): ToolbarAction[] {\r\n const totalPages = instance.getPageCount?.() ?? 1;\r\n const actions: ToolbarAction[] = [];\r\n\r\n actions.push({\r\n id: 'page-nav',\r\n icon: '',\r\n label: 'Page Navigation',\r\n type: 'page-nav',\r\n group: 'navigation',\r\n value: instance.getCurrentPage?.() ?? 1,\r\n max: totalPages,\r\n execute: (action: unknown, page?: unknown) => {\r\n const cur = instance.getCurrentPage?.() ?? 1;\r\n const max = instance.getPageCount?.() ?? 1;\r\n if (action === 'prev') {\r\n if (cur > 1) instance.goToPage?.(cur - 1);\r\n } else if (action === 'next') {\r\n if (cur < max) instance.goToPage?.(cur + 1);\r\n } else if (typeof page === 'number') {\r\n instance.goToPage?.(page);\r\n }\r\n }\r\n });\r\n\r\n actions.push(\r\n {\r\n id: 'zoom-out',\r\n icon: 'zoom-out',\r\n label: 'Zoom Out',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomOut?.()\r\n },\r\n {\r\n id: 'zoom-in',\r\n icon: 'zoom-in',\r\n label: 'Zoom In',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomIn?.()\r\n },\r\n {\r\n id: 'fit-page',\r\n icon: 'fit-page',\r\n label: 'Fit to Page',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.fitToPage?.()\r\n },\r\n {\r\n id: 'reset-zoom',\r\n icon: 'reset-zoom',\r\n label: 'Reset Zoom',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.resetZoom?.()\r\n },\r\n {\r\n id: 'rotate-cw',\r\n icon: 'rotate-cw',\r\n label: 'Rotate',\r\n type: 'button',\r\n group: 'view',\r\n execute: () => instance.rotateCW?.()\r\n },\r\n {\r\n id: 'download',\r\n icon: 'download',\r\n label: 'Download',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => instance.download?.()\r\n },\r\n {\r\n id: 'print',\r\n icon: 'print',\r\n label: 'Print',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => instance.print?.()\r\n },\r\n {\r\n id: 'open-window',\r\n icon: 'open-window',\r\n label: 'Open in Separate Full Window',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => (instance as any).openInSeparateWindow?.()\r\n }\r\n );\r\n\r\n return actions;\r\n }\r\n\r\n async render(ctx: RenderContext): Promise<PreviewInstance> {\r\n const wrapper = document.createElement('div');\r\n wrapper.className = 'fp-docx-wrapper';\r\n wrapper.style.transformOrigin = 'center center';\r\n wrapper.style.transition = 'transform 0.2s ease';\r\n wrapper.style.padding = '0';\r\n wrapper.style.maxWidth = 'none';\r\n wrapper.style.width = '816px';\r\n wrapper.style.margin = '0 auto';\r\n wrapper.style.display = 'flex';\r\n wrapper.style.flexDirection = 'column';\r\n wrapper.style.alignItems = 'center';\r\n wrapper.style.boxSizing = 'border-box';\r\n wrapper.style.flexShrink = '0';\r\n\r\n const sizer = document.createElement('div');\r\n sizer.className = 'fp-docx-sizer';\r\n sizer.style.position = 'relative';\r\n sizer.style.flexShrink = '0';\r\n sizer.style.display = 'flex';\r\n sizer.style.justifyContent = 'center';\r\n sizer.style.alignItems = 'center';\r\n\r\n const scrollWrapper = document.createElement('div');\r\n scrollWrapper.className = 'fp-docx-scroll-wrapper';\r\n scrollWrapper.style.minWidth = '100%';\r\n scrollWrapper.style.minHeight = '100%';\r\n scrollWrapper.style.width = 'max-content';\r\n scrollWrapper.style.height = 'max-content';\r\n scrollWrapper.style.display = 'flex';\r\n scrollWrapper.style.justifyContent = 'center';\r\n scrollWrapper.style.alignItems = 'flex-start';\r\n scrollWrapper.style.padding = '16px 8px';\r\n scrollWrapper.style.boxSizing = 'border-box';\r\n\r\n sizer.appendChild(wrapper);\r\n scrollWrapper.appendChild(sizer);\r\n \r\n ctx.container.style.overflow = 'auto';\r\n ctx.container.style.padding = '0';\r\n ctx.container.style.backgroundColor = '#f1f5f9';\r\n ctx.container.appendChild(scrollWrapper);\r\n\r\n // Inject override styles so docx-preview pages match our modern light theme\r\n const styleOverride = document.createElement('style');\r\n styleOverride.textContent = `\r\n .fp-docx-wrapper .docx-wrapper {\r\n background: transparent !important;\r\n padding: 0 !important;\r\n display: flex !important;\r\n flex-direction: column !important;\r\n align-items: center !important;\r\n box-sizing: border-box !important;\r\n }\r\n .fp-docx-wrapper section.docx {\r\n box-shadow: 0 4px 24px rgba(0, 0, 0, 0.08) !important;\r\n border-radius: 4px !important;\r\n margin-bottom: 24px !important;\r\n background-color: #ffffff !important;\r\n }\r\n `;\r\n ctx.container.appendChild(styleOverride);\r\n\r\n let scale = 1.0;\r\n let renderedSuccessfully = false;\r\n const createdBlobUrls: string[] = [];\r\n\r\n // Step 1: Try high-fidelity docx-preview\r\n // IMPORTANT: Pass wrapper as styleContainer (param 3) instead of ctx.container.\r\n // docx-preview calls removeAllElements(styleContainer), which previously deleted wrapper from ctx.container!\r\n try {\r\n await docx.renderAsync(ctx.buffer, wrapper, wrapper, {\r\n inWrapper: true,\r\n ignoreWidth: false,\r\n ignoreHeight: false,\r\n ignoreFonts: true, // Avoid crashes on embedded obfuscated fonts\r\n breakPages: true,\r\n experimental: true,\r\n ignoreLastRenderedPageBreak: false, // Honor Word's exact page breaks!\r\n renderHeaders: true,\r\n renderFooters: true,\r\n renderFootnotes: true,\r\n renderEndnotes: true,\r\n useBase64URL: true,\r\n });\r\n\r\n // Ensure wrapper remains attached to sizer\r\n if (!sizer.contains(wrapper)) {\r\n sizer.appendChild(wrapper);\r\n }\r\n\r\n // Check if visible content was actually produced\r\n if (wrapper.children.length > 0 && (wrapper.textContent?.trim().length ?? 0) > 0) {\r\n renderedSuccessfully = true;\r\n\r\n // Inject DrawingML charts that docx-preview drops\r\n try {\r\n const unzipped = unzipSync(new Uint8Array(ctx.buffer));\r\n const chartKeys = Object.keys(unzipped)\r\n .filter(k => k.replace(/^[./\\\\]+/, '').toLowerCase().startsWith('word/charts/chart') && k.endsWith('.xml'))\r\n .sort();\r\n\r\n if (chartKeys.length > 0) {\r\n const allDivs = Array.from(wrapper.querySelectorAll<HTMLElement>('div'));\r\n const emptyContainers = allDivs.filter(div => {\r\n const st = div.getAttribute('style') || '';\r\n return st.includes('width:') && st.includes('height:') && div.children.length === 0 && (div.textContent?.trim().length ?? 0) === 0;\r\n });\r\n\r\n chartKeys.forEach((cKey, idx) => {\r\n const target = emptyContainers[idx];\r\n if (target) {\r\n const xmlStr = strFromU8(unzipped[cKey]);\r\n const svg = this.parseAndRenderChartSvg(xmlStr);\r\n if (svg) {\r\n target.innerHTML = svg;\r\n target.style.display = 'block';\r\n target.style.margin = '12px auto';\r\n }\r\n }\r\n });\r\n }\r\n } catch (chartErr) {\r\n console.warn('[DocxPlugin] Non-critical error rendering DrawingML charts:', chartErr);\r\n }\r\n }\r\n } catch (err) {\r\n console.warn('[DocxPlugin] docx-preview failed, triggering native fallback:', err);\r\n }\r\n\r\n // Step 2: Graceful Native Fallback (100% client-side guarantee)\r\n if (!renderedSuccessfully) {\r\n try {\r\n wrapper.innerHTML = '';\r\n this.renderXmlFallback(ctx, wrapper, createdBlobUrls);\r\n if (!sizer.contains(wrapper)) {\r\n sizer.appendChild(wrapper);\r\n }\r\n renderedSuccessfully = true;\r\n } catch (fallbackErr: any) {\r\n console.error('[DocxPlugin] Native fallback failed:', fallbackErr);\r\n const isCorrupt = fallbackErr?.message?.includes('invalid zip') || fallbackErr?.message?.includes('corrupted');\r\n wrapper.innerHTML = `\r\n <div style=\"text-align:center; padding: 48px 32px; background: #fff; border-radius: 8px; box-shadow: 0 4px 20px rgba(0,0,0,0.06); max-width: 600px; margin: 40px auto;\">\r\n <div style=\"font-size:48px; margin-bottom: 16px;\">${isCorrupt ? '⚠️' : '📄'}</div>\r\n <h3 style=\"margin: 0 0 8px; color: #1e293b; font-size: 18px;\">${ctx.metadata.name || 'Word Document'}</h3>\r\n <p style=\"color: #64748b; margin: 0 0 16px; font-size: 14px; line-height: 1.5;\">\r\n ${isCorrupt \r\n ? 'This document appears to be corrupted or contains invalid archive data and cannot be opened (matches Microsoft Word on Windows).'\r\n : 'Could not render document content. The file structure may be damaged.'}\r\n </p>\r\n </div>\r\n `;\r\n if (!sizer.contains(wrapper)) {\r\n sizer.appendChild(wrapper);\r\n }\r\n }\r\n }\r\n\r\n let sections = Array.from(wrapper.querySelectorAll<HTMLElement>('section.docx'));\r\n const cards = Array.from(wrapper.querySelectorAll<HTMLElement>('.fp-docx-page-card'));\r\n\r\n // Check EVERY section and split any section containing multi-page content\r\n if (sections.length > 0 && cards.length === 0) {\r\n const finalSections: HTMLElement[] = [];\r\n\r\n for (const singleSec of sections) {\r\n const contentContainer = (singleSec.querySelector('article') as HTMLElement) || singleSec;\r\n const children = Array.from(contentContainer.children) as HTMLElement[];\r\n\r\n // Measure page height (A4 is ~1122px, US Letter is ~1056px)\r\n const pageH = singleSec.offsetHeight > 1300 ? 1122 : Math.max(1056, singleSec.offsetHeight);\r\n const secH = singleSec.scrollHeight || singleSec.offsetHeight;\r\n\r\n if (secH > pageH * 1.25 && children.length > 1) {\r\n // Record heights while elements are in DOM\r\n const childHeights = children.map(c => {\r\n const rectH = c.getBoundingClientRect().height;\r\n const offH = c.offsetHeight;\r\n const textLen = c.textContent?.trim().length || 0;\r\n const estH = Math.max(24, Math.ceil(textLen / 80) * 22 + 16);\r\n return Math.max(rectH, offH, estH);\r\n });\r\n\r\n const parent = singleSec.parentElement || wrapper;\r\n const headerEl = singleSec.querySelector('header');\r\n const footerEl = singleSec.querySelector('footer');\r\n\r\n contentContainer.innerHTML = '';\r\n singleSec.style.minHeight = `${pageH}px`;\r\n singleSec.style.boxSizing = 'border-box';\r\n\r\n let curContent = contentContainer;\r\n let curSec = singleSec;\r\n let curH = 0;\r\n const maxH = pageH - 140; // Printable area between margins/padding\r\n\r\n finalSections.push(singleSec);\r\n\r\n for (let i = 0; i < children.length; i++) {\r\n const child = children[i];\r\n const chH = childHeights[i];\r\n\r\n curContent.appendChild(child);\r\n curH += chH;\r\n\r\n if (curH >= maxH && i < children.length - 1) {\r\n const nextSec = document.createElement('section');\r\n nextSec.className = singleSec.className;\r\n nextSec.style.cssText = singleSec.style.cssText;\r\n nextSec.style.minHeight = `${pageH}px`;\r\n nextSec.style.boxSizing = 'border-box';\r\n nextSec.style.backgroundColor = '#ffffff';\r\n nextSec.style.boxShadow = '0 4px 24px rgba(0, 0, 0, 0.08)';\r\n nextSec.style.borderRadius = '4px';\r\n nextSec.style.marginBottom = '24px';\r\n\r\n if (headerEl) {\r\n nextSec.appendChild(headerEl.cloneNode(true));\r\n }\r\n\r\n const nextArticle = document.createElement('article');\r\n if (contentContainer.tagName.toLowerCase() === 'article') {\r\n nextArticle.style.cssText = contentContainer.style.cssText;\r\n }\r\n nextSec.appendChild(nextArticle);\r\n\r\n if (footerEl) {\r\n nextSec.appendChild(footerEl.cloneNode(true));\r\n }\r\n\r\n if (curSec.nextSibling) {\r\n parent.insertBefore(nextSec, curSec.nextSibling);\r\n } else {\r\n parent.appendChild(nextSec);\r\n }\r\n\r\n finalSections.push(nextSec);\r\n curSec = nextSec;\r\n curContent = nextArticle;\r\n curH = 0;\r\n }\r\n }\r\n } else {\r\n finalSections.push(singleSec);\r\n }\r\n }\r\n sections = finalSections;\r\n }\r\n\r\n const pageElements: HTMLElement[] = sections.length > 0 ? sections : cards;\r\n const totalPages = Math.max(1, pageElements.length);\r\n let currentPage = 1;\r\n\r\n const showPage = (pageNum: number) => {\r\n currentPage = Math.max(1, Math.min(totalPages, pageNum));\r\n if (pageElements.length > 1) {\r\n pageElements.forEach((sec, idx) => {\r\n sec.style.display = (idx + 1 === currentPage) ? '' : 'none';\r\n });\r\n }\r\n ctx.container.scrollTop = 0;\r\n ctx.emit('page-change', { page: currentPage, total: totalPages });\r\n };\r\n\r\n if (totalPages > 1) {\r\n showPage(1);\r\n }\r\n\r\n scale = 1.0;\r\n let rotation = 0;\r\n let fitMode: 'width' | 'page' = 'page';\r\n let isUserZoomed = false;\r\n\r\n const calculateFitScale = (_mode: 'width' | 'page' = fitMode) => {\r\n const activeEl = pageElements[currentPage - 1] || wrapper.querySelector('section.docx') as HTMLElement || wrapper;\r\n const elW = activeEl.offsetWidth || 816;\r\n \r\n // Minimal side margins (16px on each side, safe from vertical scrollbar)\r\n const availW = Math.max(280, ctx.container.clientWidth - 32);\r\n const sW = availW / elW;\r\n\r\n // Fit to Page fills the frame horizontally with only minimal side margins\r\n return Math.max(0.35, Math.min(3.0, sW));\r\n };\r\n\r\n const applyTransform = () => {\r\n const activeEl = pageElements[currentPage - 1] || wrapper.querySelector('section.docx') as HTMLElement || wrapper;\r\n const elW = activeEl.offsetWidth || 816;\r\n const elH = activeEl.offsetHeight || 1056;\r\n const isRotated90 = (rotation % 180 !== 0);\r\n const boxW = Math.round((isRotated90 ? elH : elW) * scale);\r\n const boxH = Math.round((isRotated90 ? elW : elH) * scale);\r\n\r\n sizer.style.width = `${boxW}px`;\r\n sizer.style.height = `${boxH}px`;\r\n\r\n wrapper.style.width = `${elW}px`;\r\n wrapper.style.height = `${elH}px`;\r\n wrapper.style.transform = `scale(${scale}) rotate(${rotation}deg)`;\r\n wrapper.style.transformOrigin = 'center center';\r\n };\r\n\r\n let resizeObserver: ResizeObserver | null = null;\r\n if (typeof ResizeObserver !== 'undefined') {\r\n resizeObserver = new ResizeObserver(() => {\r\n if (!isUserZoomed) {\r\n const newFit = calculateFitScale('page');\r\n if (Math.abs(scale - newFit) > 0.015) {\r\n scale = newFit;\r\n applyTransform();\r\n }\r\n }\r\n });\r\n resizeObserver.observe(ctx.container);\r\n }\r\n\r\n setTimeout(() => {\r\n scale = calculateFitScale('page');\r\n applyTransform();\r\n }, 40);\r\n\r\n const cleanup = () => {\r\n resizeObserver?.disconnect();\r\n resizeObserver = null;\r\n for (const url of createdBlobUrls) {\r\n URL.revokeObjectURL(url);\r\n }\r\n scrollWrapper.remove();\r\n styleOverride.remove();\r\n ctx.container.innerHTML = '';\r\n };\r\n\r\n ctx.signal.addEventListener('abort', cleanup);\r\n\r\n return {\r\n destroy: cleanup,\r\n getPageCount: () => totalPages,\r\n getCurrentPage: () => currentPage,\r\n goToPage: (page: number) => {\r\n showPage(page);\r\n },\r\n zoomIn: () => {\r\n isUserZoomed = true;\r\n scale = Math.min(3.5, scale + 0.15);\r\n applyTransform();\r\n },\r\n zoomOut: () => {\r\n isUserZoomed = true;\r\n scale = Math.max(0.2, scale - 0.15);\r\n applyTransform();\r\n },\r\n getZoom: () => scale,\r\n setZoom: (level: number) => {\r\n isUserZoomed = true;\r\n scale = level;\r\n applyTransform();\r\n },\r\n fitToPage: () => {\r\n isUserZoomed = false;\r\n scale = calculateFitScale('page');\r\n rotation = 0;\r\n applyTransform();\r\n },\r\n resetZoom: () => {\r\n isUserZoomed = false;\r\n scale = calculateFitScale('page');\r\n rotation = 0;\r\n ctx.container.scrollTop = 0;\r\n ctx.container.scrollLeft = 0;\r\n applyTransform();\r\n },\r\n rotateCW: () => {\r\n rotation = (rotation + 90) % 360;\r\n applyTransform();\r\n },\r\n rotateCCW: () => {\r\n rotation = (rotation - 90 + 360) % 360;\r\n applyTransform();\r\n },\r\n download: () => {\r\n const blob = new Blob([ctx.buffer], { type: this.mimeTypes[0] });\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = ctx.metadata.name || 'document.docx';\r\n a.click();\r\n URL.revokeObjectURL(url);\r\n },\r\n print: () => {\r\n window.print();\r\n }\r\n };\r\n }\r\n\r\n private renderXmlFallback(ctx: RenderContext, wrapper: HTMLElement, createdBlobUrls: string[]): void {\r\n // Check if the file is actually a legacy binary CFBF .doc file renamed to .docx\r\n const magic = new Uint8Array(ctx.buffer.slice(0, 8));\r\n if (magic[0] === 0xD0 && magic[1] === 0xCF && magic[2] === 0x11 && magic[3] === 0xE0) {\r\n this.renderBinaryDocFallback(ctx, wrapper);\r\n return;\r\n }\r\n\r\n const unzipped = unzipSync(new Uint8Array(ctx.buffer));\r\n const docKey = Object.keys(unzipped).find(k => k.replace(/^[./\\\\]+/, '').toLowerCase() === 'word/document.xml');\r\n const docXmlEntry = docKey ? unzipped[docKey] : undefined;\r\n if (!docXmlEntry) throw new Error('Missing word/document.xml in DOCX package');\r\n\r\n const xmlStr = strFromU8(docXmlEntry);\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(xmlStr, 'application/xml');\r\n\r\n // Parse image relationships if present\r\n const imageMap: Record<string, string> = {};\r\n const relsKey = Object.keys(unzipped).find(k => k.replace(/^[./\\\\]+/, '').toLowerCase() === 'word/_rels/document.xml.rels');\r\n if (relsKey && unzipped[relsKey]) {\r\n try {\r\n const relsXml = strFromU8(unzipped[relsKey]);\r\n const relsDoc = parser.parseFromString(relsXml, 'application/xml');\r\n const relEls = Array.from(relsDoc.getElementsByTagName('Relationship'));\r\n for (const rel of relEls) {\r\n const rId = rel.getAttribute('Id');\r\n const target = rel.getAttribute('Target');\r\n if (rId && target) {\r\n const cleanTarget = target.replace(/^\\.\\.\\//, '').replace(/^\\//, '');\r\n const fullTargetKey = Object.keys(unzipped).find(k => {\r\n const norm = k.replace(/^[./\\\\]+/, '').toLowerCase();\r\n return norm === ('word/' + cleanTarget).toLowerCase() || norm === cleanTarget.toLowerCase();\r\n });\r\n if (fullTargetKey && unzipped[fullTargetKey]) {\r\n const bytes = unzipped[fullTargetKey];\r\n const ext = cleanTarget.split('.').pop()?.toLowerCase() || 'png';\r\n const mime = ext === 'jpg' || ext === 'jpeg' ? 'image/jpeg' : ext === 'gif' ? 'image/gif' : ext === 'svg' ? 'image/svg+xml' : 'image/png';\r\n const blob = new Blob([bytes], { type: mime });\r\n const blobUrl = URL.createObjectURL(blob);\r\n imageMap[rId] = blobUrl;\r\n createdBlobUrls.push(blobUrl);\r\n }\r\n }\r\n }\r\n } catch (relsErr) {\r\n console.warn('[DocxPlugin] Error parsing relationships:', relsErr);\r\n }\r\n }\r\n\r\n // Parse page dimensions\r\n const sectPrs = Array.from(doc.getElementsByTagNameNS('*', 'sectPr'));\r\n const lastSectPr = sectPrs[sectPrs.length - 1];\r\n \r\n let defaultW = 12240; // US Letter 8.5\"\r\n let defaultH = 15840; // US Letter 11\"\r\n let margins = { top: 1440, right: 1440, bottom: 1440, left: 1440 }; // 1\" margins\r\n \r\n if (lastSectPr) {\r\n const pgSz = lastSectPr.getElementsByTagNameNS('*', 'pgSz')[0];\r\n if (pgSz) {\r\n defaultW = parseInt(pgSz.getAttribute('w:w') || pgSz.getAttribute('w') || '12240', 10);\r\n defaultH = parseInt(pgSz.getAttribute('w:h') || pgSz.getAttribute('h') || '15840', 10);\r\n }\r\n const pgMar = lastSectPr.getElementsByTagNameNS('*', 'pgMar')[0];\r\n if (pgMar) {\r\n margins.top = parseInt(pgMar.getAttribute('w:top') || pgMar.getAttribute('top') || '1440', 10);\r\n margins.bottom = parseInt(pgMar.getAttribute('w:bottom') || pgMar.getAttribute('bottom') || '1440', 10);\r\n margins.left = parseInt(pgMar.getAttribute('w:left') || pgMar.getAttribute('left') || '1440', 10);\r\n margins.right = parseInt(pgMar.getAttribute('w:right') || pgMar.getAttribute('right') || '1440', 10);\r\n }\r\n }\r\n\r\n const createPageCard = () => {\r\n const card = document.createElement('div');\r\n card.className = 'fp-docx-page-card';\r\n card.style.backgroundColor = '#ffffff';\r\n card.style.borderRadius = '4px';\r\n card.style.boxShadow = '0 4px 24px rgba(0,0,0,0.08)';\r\n card.style.fontFamily = 'Calibri, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif';\r\n card.style.color = '#1e293b';\r\n card.style.lineHeight = '1.6';\r\n card.style.boxSizing = 'border-box';\r\n card.style.overflow = 'hidden';\r\n card.style.position = 'relative';\r\n card.style.marginBottom = '24px';\r\n \r\n // Convert twips to px (1 twip = 1/1440 inch, 1 inch = 96px => /15)\r\n card.style.width = `${defaultW / 15}px`;\r\n card.style.height = `${defaultH / 15}px`;\r\n card.style.padding = `${margins.top / 15}px ${margins.right / 15}px ${margins.bottom / 15}px ${margins.left / 15}px`;\r\n \r\n return card;\r\n };\r\n\r\n let currentCard = createPageCard();\r\n let currentHtml = '';\r\n const pages: { card: HTMLElement, html: string }[] = [{ card: currentCard, html: '' }];\r\n\r\n const flushHtml = () => {\r\n pages[pages.length - 1].html += currentHtml;\r\n currentHtml = '';\r\n };\r\n\r\n const newPage = () => {\r\n flushHtml();\r\n currentCard = createPageCard();\r\n pages.push({ card: currentCard, html: '' });\r\n };\r\n\r\n const body = doc.getElementsByTagNameNS('*', 'body')[0] || doc.documentElement;\r\n\r\n for (const child of Array.from(body.children)) {\r\n const tag = child.localName || child.nodeName.split(':').pop();\r\n\r\n if (tag === 'p') {\r\n const pStyle = child.getElementsByTagNameNS('*', 'pStyle')[0];\r\n const styleVal = pStyle?.getAttribute('w:val') || pStyle?.getAttribute('val') || '';\r\n const numPr = child.getElementsByTagNameNS('*', 'numPr')[0];\r\n\r\n const chunks = this.extractParagraphChunks(child, imageMap);\r\n \r\n for (let i = 0; i < chunks.length; i++) {\r\n if (i > 0) {\r\n newPage();\r\n }\r\n \r\n const textContent = chunks[i];\r\n if (!textContent.trim() && !textContent.includes('<img')) {\r\n currentHtml += '<div style=\"height: 10px;\"></div>';\r\n continue;\r\n }\r\n\r\n const lowerStyle = styleVal.toLowerCase();\r\n if (lowerStyle.includes('title')) {\r\n currentHtml += `<h1 style=\"font-size: 28px; font-weight: 700; color: #1e3a8a; margin: 24px 0 12px; border-bottom: 2px solid #e2e8f0; padding-bottom: 8px;\">${textContent}</h1>`;\r\n } else if (lowerStyle.includes('heading1') || styleVal === '1') {\r\n currentHtml += `<h2 style=\"font-size: 22px; font-weight: 700; color: #1e40af; margin: 20px 0 10px;\">${textContent}</h2>`;\r\n } else if (lowerStyle.includes('heading2') || styleVal === '2') {\r\n currentHtml += `<h3 style=\"font-size: 18px; font-weight: 600; color: #2563eb; margin: 16px 0 8px;\">${textContent}</h3>`;\r\n } else if (lowerStyle.includes('heading3') || styleVal === '3') {\r\n currentHtml += `<h4 style=\"font-size: 15px; font-weight: 600; color: #334155; margin: 12px 0 6px;\">${textContent}</h4>`;\r\n } else if (numPr) {\r\n currentHtml += `<div style=\"display: flex; gap: 8px; margin: 4px 0 4px 20px;\"><span style=\"color: #2563eb; font-weight: bold;\">•</span><span>${textContent}</span></div>`;\r\n } else {\r\n currentHtml += `<p style=\"margin: 8px 0; font-size: 14px;\">${textContent}</p>`;\r\n }\r\n }\r\n } else if (tag === 'tbl') {\r\n currentHtml += '<table style=\"width: 100%; border-collapse: collapse; margin: 20px 0; border: 1px solid #cbd5e1;\">';\r\n const rows = Array.from(child.getElementsByTagNameNS('*', 'tr'));\r\n rows.forEach((tr, rIdx) => {\r\n currentHtml += `<tr style=\"${rIdx === 0 ? 'background-color: #f8fafc; font-weight: 600;' : ''}\">`;\r\n const cells = Array.from(tr.getElementsByTagNameNS('*', 'tc'));\r\n cells.forEach((tc) => {\r\n const cellText = this.extractParagraphHtml(tc, imageMap);\r\n currentHtml += `<td style=\"border: 1px solid #cbd5e1; padding: 8px 12px; font-size: 13px;\">${cellText || ' '}</td>`;\r\n });\r\n currentHtml += '</tr>';\r\n });\r\n currentHtml += '</table>';\r\n }\r\n }\r\n flushHtml();\r\n\r\n for (const page of pages) {\r\n page.card.innerHTML = DOMPurify.sanitize(page.html, {\r\n ADD_TAGS: ['h1', 'h2', 'h3', 'h4', 'p', 'table', 'tr', 'td', 'span', 'b', 'i', 'u', 's', 'strike', 'img', 'div', 'br'],\r\n ADD_ATTR: ['style', 'src', 'alt', 'colspan', 'rowspan']\r\n });\r\n wrapper.appendChild(page.card);\r\n }\r\n }\r\n\r\n private extractParagraphHtml(pElement: Element, imageMap: Record<string, string> = {}): string {\r\n return this.extractParagraphChunks(pElement, imageMap).join('<br/>');\r\n }\r\n\r\n private extractParagraphChunks(pElement: Element, imageMap: Record<string, string> = {}): string[] {\r\n const chunks: string[] = [''];\r\n let currentChunkIndex = 0;\r\n\r\n // Check for inline drawings in this paragraph\r\n const drawings = Array.from(pElement.getElementsByTagNameNS('*', 'drawing'));\r\n for (const drawing of drawings) {\r\n const blip = drawing.getElementsByTagNameNS('*', 'blip')[0];\r\n const rId = blip?.getAttribute('r:embed') || blip?.getAttribute('r:id');\r\n if (rId && imageMap[rId]) {\r\n chunks[currentChunkIndex] += `<div style=\"text-align:center; margin: 12px 0;\"><img src=\"${imageMap[rId]}\" style=\"max-width: 100%; height: auto; border-radius: 4px;\" /></div>`;\r\n }\r\n }\r\n\r\n const runs = Array.from(pElement.getElementsByTagNameNS('*', 'r'));\r\n if (runs.length === 0 && !chunks[currentChunkIndex]) {\r\n chunks[currentChunkIndex] = DOMPurify.sanitize(pElement.textContent || '');\r\n return chunks;\r\n }\r\n\r\n for (const r of runs) {\r\n const blip = r.getElementsByTagNameNS('*', 'blip')[0] || r.getElementsByTagNameNS('*', 'imagedata')[0];\r\n const rId = blip?.getAttribute('r:embed') || blip?.getAttribute('r:id');\r\n if (rId && imageMap[rId]) {\r\n chunks[currentChunkIndex] += `<img src=\"${imageMap[rId]}\" style=\"max-width: 100%; height: auto; display: inline-block; margin: 4px;\" />`;\r\n }\r\n\r\n // Check for breaks <w:br/>\r\n const brs = Array.from(r.getElementsByTagNameNS('*', 'br'));\r\n for (const br of brs) {\r\n const type = br.getAttribute('w:type') || br.getAttribute('type');\r\n if (type === 'page') {\r\n chunks.push('');\r\n currentChunkIndex++;\r\n } else {\r\n chunks[currentChunkIndex] += '<br/>';\r\n }\r\n }\r\n\r\n // Check for tabs <w:tab/>\r\n const tabs = r.getElementsByTagNameNS('*', 'tab');\r\n if (tabs.length > 0) {\r\n chunks[currentChunkIndex] += ' ';\r\n }\r\n\r\n const rPr = r.getElementsByTagNameNS('*', 'rPr')[0];\r\n const isBold = !!(rPr?.getElementsByTagNameNS('*', 'b')[0]);\r\n const isItalic = !!(rPr?.getElementsByTagNameNS('*', 'i')[0]);\r\n const isUnderline = !!(rPr?.getElementsByTagNameNS('*', 'u')[0]);\r\n const isStrike = !!(rPr?.getElementsByTagNameNS('*', 'strike')[0]);\r\n const colorNode = rPr?.getElementsByTagNameNS('*', 'color')[0];\r\n const colorVal = colorNode?.getAttribute('w:val') || colorNode?.getAttribute('val');\r\n const szNode = rPr?.getElementsByTagNameNS('*', 'sz')[0];\r\n const szVal = szNode?.getAttribute('w:val') || szNode?.getAttribute('val');\r\n\r\n const texts = Array.from(r.getElementsByTagNameNS('*', 't'));\r\n let text = texts.map(t => t.textContent || '').join('');\r\n if (!text) continue;\r\n text = DOMPurify.sanitize(text);\r\n\r\n let styles = '';\r\n if (isBold) styles += 'font-weight: bold; ';\r\n if (isItalic) styles += 'font-style: italic; ';\r\n if (isUnderline) styles += 'text-decoration: underline; ';\r\n if (isStrike) styles += 'text-decoration: line-through; ';\r\n if (colorVal && colorVal !== 'auto') styles += `color: #${colorVal}; `;\r\n if (szVal) {\r\n const pt = parseInt(szVal, 10) / 2;\r\n if (!isNaN(pt) && pt > 0) styles += `font-size: ${pt}pt; `;\r\n }\r\n\r\n if (styles) {\r\n chunks[currentChunkIndex] += `<span style=\"${styles}\">${text}</span>`;\r\n } else {\r\n chunks[currentChunkIndex] += text;\r\n }\r\n }\r\n\r\n return chunks;\r\n }\r\n\r\n private renderBinaryDocFallback(ctx: RenderContext, wrapper: HTMLElement): void {\r\n const card = document.createElement('div');\r\n card.className = 'fp-docx-page-card';\r\n card.style.backgroundColor = '#ffffff';\r\n card.style.borderRadius = '6px';\r\n card.style.boxShadow = '0 4px 24px rgba(0,0,0,0.08)';\r\n card.style.padding = '48px 56px';\r\n card.style.fontFamily = 'Calibri, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif';\r\n card.style.color = '#1e293b';\r\n card.style.lineHeight = '1.6';\r\n\r\n try {\r\n const cfbf = new CfbfReader(ctx.buffer);\r\n const wordDocStream = cfbf.readStream('WordDocument');\r\n if (wordDocStream && wordDocStream.length >= 512) {\r\n const text = this.extractReadableStrings(wordDocStream);\r\n card.innerHTML = `<div style=\"white-space: pre-wrap;\">${DOMPurify.sanitize(text)}</div>`;\r\n wrapper.appendChild(card);\r\n return;\r\n }\r\n } catch {\r\n // Direct extraction fallback\r\n }\r\n\r\n const text = this.extractReadableStrings(new Uint8Array(ctx.buffer));\r\n card.innerHTML = `<div style=\"white-space: pre-wrap;\">${DOMPurify.sanitize(text)}</div>`;\r\n wrapper.appendChild(card);\r\n }\r\n\r\n private extractReadableStrings(bytes: Uint8Array): string {\r\n let result = '';\r\n let current = '';\r\n for (let i = 0; i < bytes.length; i++) {\r\n const b = bytes[i];\r\n if ((b >= 32 && b <= 126) || b === 10 || b === 13 || b === 9) {\r\n current += String.fromCharCode(b);\r\n } else if (b === 0 && i + 1 < bytes.length && bytes[i + 1] >= 32 && bytes[i + 1] <= 126) {\r\n continue;\r\n } else {\r\n if (current.trim().length > 3) {\r\n result += current.trim() + '\\n\\n';\r\n }\r\n current = '';\r\n }\r\n }\r\n if (current.trim().length > 3) {\r\n result += current.trim();\r\n }\r\n return result;\r\n }\r\n\r\n private parseAndRenderChartSvg(xmlStr: string, width = 500, height = 260): string {\r\n // Extract categories\r\n const catMatches = [...xmlStr.matchAll(/<c:cat>[\\s\\S]*?<c:strCache>([\\s\\S]*?)<\\/c:strCache>/g)];\r\n let categories: string[] = [];\r\n if (catMatches.length > 0) {\r\n categories = [...catMatches[0][1].matchAll(/<c:v>([^<]+)<\\/c:v>/g)].map(m => m[1]);\r\n }\r\n if (categories.length === 0) {\r\n categories = ['Category 1', 'Category 2', 'Category 3', 'Category 4'];\r\n }\r\n\r\n // Extract series\r\n const defaultColors = ['#004586', '#ff420e', '#ffd320', '#579d1c', '#7e0021', '#83caff'];\r\n const sers = [...xmlStr.matchAll(/<c:ser>([\\s\\S]*?)<\\/c:ser>/g)];\r\n const series: { title: string; color: string; values: number[] }[] = [];\r\n\r\n sers.forEach((s, sIdx) => {\r\n const titleMatch = s[1].match(/<c:tx>[\\s\\S]*?<c:v>([^<]+)<\\/c:v>/);\r\n const title = titleMatch ? titleMatch[1] : `Series ${sIdx + 1}`;\r\n\r\n const clrMatch = s[1].match(/<a:srgbClr\\s+val=\"([^\"]+)\"/);\r\n const color = clrMatch ? '#' + clrMatch[1] : defaultColors[sIdx % defaultColors.length];\r\n\r\n const valMatch = s[1].match(/<c:val>[\\s\\S]*?<c:numCache>([\\s\\S]*?)<\\/c:numCache>/);\r\n let values: number[] = [];\r\n if (valMatch) {\r\n values = [...valMatch[1].matchAll(/<c:pt\\s+idx=\"(\\d+)\">\\s*<c:v>([^<]+)<\\/c:v>/g)]\r\n .sort((a, b) => parseInt(a[1], 10) - parseInt(b[1], 10))\r\n .map(m => parseFloat(m[2]) || 0);\r\n }\r\n series.push({ title, color, values });\r\n });\r\n\r\n if (series.length === 0) return '';\r\n\r\n let maxVal = 10;\r\n series.forEach(s => s.values.forEach(v => { if (v > maxVal) maxVal = v; }));\r\n maxVal = Math.ceil(maxVal * 1.15);\r\n if (maxVal % 2 !== 0) maxVal++;\r\n\r\n const padLeft = 45;\r\n const padBottom = 55;\r\n const padTop = 20;\r\n const padRight = 20;\r\n const plotW = width - padLeft - padRight;\r\n const plotH = height - padTop - padBottom;\r\n\r\n const yTicks = 5;\r\n let gridLines = '';\r\n for (let i = 0; i <= yTicks; i++) {\r\n const val = (maxVal / yTicks) * i;\r\n const y = padTop + plotH - (val / maxVal) * plotH;\r\n gridLines += `<line x1=\"${padLeft}\" y1=\"${y}\" x2=\"${padLeft + plotW}\" y2=\"${y}\" stroke=\"#e2e8f0\" stroke-width=\"1\" />`;\r\n gridLines += `<text x=\"${padLeft - 8}\" y=\"${y + 4}\" text-anchor=\"end\" font-size=\"11\" fill=\"#64748b\" font-family=\"Calibri, sans-serif\">${Math.round(val)}</text>`;\r\n }\r\n\r\n const numCats = categories.length;\r\n const numSers = series.length;\r\n const groupW = plotW / numCats;\r\n const barW = Math.max(8, Math.min(28, (groupW * 0.7) / numSers));\r\n const groupPad = (groupW - barW * numSers) / 2;\r\n\r\n let bars = '';\r\n let catLabels = '';\r\n\r\n for (let c = 0; c < numCats; c++) {\r\n const catX = padLeft + c * groupW;\r\n catLabels += `<text x=\"${catX + groupW / 2}\" y=\"${padTop + plotH + 18}\" text-anchor=\"middle\" font-size=\"11\" fill=\"#334155\" font-family=\"Calibri, sans-serif\">${categories[c]}</text>`;\r\n\r\n for (let s = 0; s < numSers; s++) {\r\n const val = series[s].values[c] ?? 0;\r\n const bH = Math.max(0, (val / maxVal) * plotH);\r\n const bX = catX + groupPad + s * barW;\r\n const bY = padTop + plotH - bH;\r\n bars += `<rect x=\"${bX}\" y=\"${bY}\" width=\"${barW - 2}\" height=\"${bH}\" fill=\"${series[s].color}\" rx=\"1\" />`;\r\n }\r\n }\r\n\r\n let legend = '';\r\n const legY = height - 12;\r\n let legX = padLeft + (plotW - numSers * 100) / 2;\r\n series.forEach(s => {\r\n legend += `<rect x=\"${legX}\" y=\"${legY - 9}\" width=\"10\" height=\"10\" fill=\"${s.color}\" rx=\"2\" />`;\r\n legend += `<text x=\"${legX + 15}\" y=\"${legY}\" font-size=\"11\" fill=\"#475569\" font-family=\"Calibri, sans-serif\">${s.title}</text>`;\r\n legX += 95;\r\n });\r\n\r\n return `\r\n <svg viewBox=\"0 0 ${width} ${height}\" width=\"100%\" height=\"100%\" style=\"background:#ffffff; border-radius:4px; overflow:visible;\" xmlns=\"http://www.w3.org/2000/svg\">\r\n ${gridLines}\r\n <line x1=\"${padLeft}\" y1=\"${padTop + plotH}\" x2=\"${padLeft + plotW}\" y2=\"${padTop + plotH}\" stroke=\"#94a3b8\" stroke-width=\"1.5\" />\r\n <line x1=\"${padLeft}\" y1=\"${padTop}\" x2=\"${padLeft}\" y2=\"${padTop + plotH}\" stroke=\"#94a3b8\" stroke-width=\"1.5\" />\r\n ${bars}\r\n ${catLabels}\r\n ${legend}\r\n </svg>\r\n `.trim();\r\n }\r\n}\r\n\r\nexport function docxPlugin(): DocxPlugin {\r\n return new DocxPlugin();\r\n}\r\n\r\nexport default DocxPlugin;\r\n\r\n","import type { \r\n FileInfo, \r\n RenderContext, \r\n ToolbarAction, \r\n PreviewPlugin, \r\n PreviewInstance,\r\n Thumbnail \r\n} from '@patel.sumit51/core';\r\nimport * as XLSX from 'xlsx';\r\n\r\nexport class ExcelPlugin implements PreviewPlugin {\r\n id = 'excel';\r\n name = 'Spreadsheet Preview (Excel / OpenDocument)';\r\n extensions = ['.xlsx', '.xls', '.xlsm', '.xlsb', '.xltx', '.xltm', '.ods'];\r\n mimeTypes = [\r\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\r\n 'application/vnd.ms-excel',\r\n 'application/vnd.ms-excel.sheet.macroEnabled.12',\r\n 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',\r\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',\r\n 'application/vnd.ms-excel.template.macroEnabled.12',\r\n 'application/vnd.oasis.opendocument.spreadsheet'\r\n ];\r\n weight = 85;\r\n\r\n supports(file: FileInfo): boolean {\r\n const ext = file.metadata.extension?.toLowerCase();\r\n const mime = file.metadata.mimeType?.toLowerCase();\r\n if (ext) {\r\n return this.extensions.includes(ext);\r\n }\r\n return this.mimeTypes.includes(mime || '');\r\n }\r\n\r\n getToolbarActions(instance: PreviewInstance): ToolbarAction[] {\r\n const totalSheets = instance.getPageCount?.() ?? 1;\r\n const actions: ToolbarAction[] = [];\r\n\r\n actions.push({\r\n id: 'thumbnails',\r\n icon: 'thumbnails',\r\n label: 'Sheet Thumbnails',\r\n type: 'button',\r\n group: 'navigation',\r\n execute: () => (instance as any).toggleThumbnails?.()\r\n });\r\n\r\n if (totalSheets > 1) {\r\n actions.push({\r\n id: 'page-nav',\r\n icon: '',\r\n label: 'Sheet Navigation',\r\n type: 'page-nav',\r\n group: 'navigation',\r\n value: instance.getCurrentPage?.() ?? 1,\r\n max: totalSheets,\r\n execute: (action: unknown, sheet?: unknown) => {\r\n const cur = instance.getCurrentPage?.() ?? 1;\r\n const max = instance.getPageCount?.() ?? 1;\r\n if (action === 'prev') {\r\n if (cur > 1) instance.goToPage?.(cur - 1);\r\n } else if (action === 'next') {\r\n if (cur < max) instance.goToPage?.(cur + 1);\r\n } else if (typeof sheet === 'number') {\r\n instance.goToPage?.(sheet);\r\n }\r\n }\r\n });\r\n }\r\n\r\n actions.push(\r\n {\r\n id: 'zoom-out',\r\n icon: 'zoom-out',\r\n label: 'Zoom Out',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => {\r\n instance.zoomOut?.();\r\n }\r\n },\r\n {\r\n id: 'zoom-in',\r\n icon: 'zoom-in',\r\n label: 'Zoom In',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => {\r\n instance.zoomIn?.();\r\n }\r\n },\r\n {\r\n id: 'reset-zoom',\r\n icon: 'reset-zoom',\r\n label: 'Reset Zoom',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => {\r\n instance.resetZoom?.();\r\n }\r\n },\r\n {\r\n id: 'download',\r\n icon: 'download',\r\n label: 'Download',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => {\r\n instance.download?.();\r\n }\r\n },\r\n {\r\n id: 'print',\r\n icon: 'print',\r\n label: 'Print',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => {\r\n instance.print?.();\r\n }\r\n },\r\n {\r\n id: 'open-window',\r\n icon: 'open-window',\r\n label: 'Open in Separate Full Window',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => {\r\n (instance as any).openInSeparateWindow?.();\r\n }\r\n }\r\n );\r\n\r\n return actions;\r\n }\r\n\r\n async render(ctx: RenderContext): Promise<PreviewInstance> {\r\n const container = document.createElement('div');\r\n container.className = 'fp-excel-container';\r\n container.style.display = 'flex';\r\n container.style.flexDirection = 'column';\r\n container.style.width = '100%';\r\n container.style.height = '100%';\r\n container.style.overflow = 'hidden';\r\n\r\n const contentArea = document.createElement('div');\r\n contentArea.className = 'fp-excel-content';\r\n contentArea.style.flex = '1';\r\n contentArea.style.overflow = 'auto';\r\n contentArea.style.padding = '16px';\r\n contentArea.style.boxSizing = 'border-box';\r\n\r\n const tabsArea = document.createElement('div');\r\n tabsArea.className = 'fp-excel-tabs';\r\n tabsArea.style.display = 'flex';\r\n tabsArea.style.gap = '6px';\r\n tabsArea.style.padding = '8px 16px';\r\n tabsArea.style.borderTop = '1px solid #e0e0e0';\r\n tabsArea.style.backgroundColor = '#fafafa';\r\n tabsArea.style.overflowX = 'auto';\r\n tabsArea.style.flexShrink = '0';\r\n\r\n container.appendChild(contentArea);\r\n container.appendChild(tabsArea);\r\n ctx.container.appendChild(container);\r\n\r\n let scale = 1.0;\r\n let isUserZoomed = false;\r\n let currentSheetIndex = 1;\r\n let sheetNames: string[] = [];\r\n let wb: XLSX.WorkBook | null = null;\r\n\r\n const applyTransform = () => {\r\n const sizer = contentArea.querySelector('.fp-excel-sizer') as HTMLElement;\r\n const table = contentArea.querySelector('table');\r\n if (!sizer || !table) return;\r\n\r\n if (!(table as any)._baseWidth && table.offsetWidth > 0) {\r\n (table as any)._baseWidth = table.offsetWidth;\r\n (table as any)._baseHeight = table.offsetHeight;\r\n }\r\n const baseW = (table as any)._baseWidth || table.offsetWidth || 800;\r\n const baseH = (table as any)._baseHeight || table.offsetHeight || 600;\r\n const scaledW = Math.round(baseW * scale);\r\n const scaledH = Math.round(baseH * scale);\r\n\r\n sizer.style.width = `${scaledW}px`;\r\n sizer.style.height = `${scaledH}px`;\r\n table.style.position = 'absolute';\r\n table.style.top = '0';\r\n table.style.left = '0';\r\n table.style.transform = `scale(${scale})`;\r\n table.style.transformOrigin = 'top left';\r\n };\r\n\r\n const calculateFitScale = () => {\r\n const table = contentArea.querySelector('table');\r\n if (!table) return 1.0;\r\n const availW = Math.max(280, container.clientWidth - 48);\r\n const tW = (table as any)._baseWidth || table.offsetWidth || 800;\r\n // Automatically fit table to visible page width\r\n return Math.max(0.4, Math.min(1.0, availW / tW));\r\n };\r\n\r\n try {\r\n wb = XLSX.read(new Uint8Array(ctx.buffer), { type: 'array', cellDates: true });\r\n sheetNames = wb.SheetNames || [];\r\n } catch (err) {\r\n console.warn('[ExcelPlugin] SheetJS parse failed, rendering fallback:', err);\r\n }\r\n\r\n const tabButtons: HTMLButtonElement[] = [];\r\n\r\n const renderSheet = (index: number) => {\r\n if (!wb || index < 1 || index > sheetNames.length) return;\r\n currentSheetIndex = index;\r\n const sheetName = sheetNames[index - 1];\r\n const ws = wb.Sheets[sheetName];\r\n\r\n contentArea.innerHTML = '';\r\n\r\n if (!ws) {\r\n contentArea.innerHTML = '<div style=\"padding: 24px; color: #888;\">Empty sheet</div>';\r\n return;\r\n }\r\n\r\n const sizer = document.createElement('div');\r\n sizer.className = 'fp-excel-sizer';\r\n sizer.style.position = 'relative';\r\n\r\n const html = XLSX.utils.sheet_to_html(ws, { id: 'fp-sheet-table', editable: false });\r\n sizer.innerHTML = html;\r\n contentArea.appendChild(sizer);\r\n\r\n // Style the table\r\n const table = sizer.querySelector('table');\r\n if (table) {\r\n table.style.borderCollapse = 'collapse';\r\n table.style.fontFamily = '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif';\r\n table.style.fontSize = '13px';\r\n table.style.minWidth = '100%';\r\n table.style.border = '1px solid #d0d7de';\r\n table.style.background = '#fff';\r\n\r\n table.querySelectorAll('td, th').forEach((cell) => {\r\n const el = cell as HTMLElement;\r\n el.style.border = '1px solid #d0d7de';\r\n el.style.padding = '6px 12px';\r\n el.style.whiteSpace = 'nowrap';\r\n });\r\n\r\n table.querySelectorAll('tr:first-child td, th').forEach((cell) => {\r\n const el = cell as HTMLElement;\r\n el.style.fontWeight = '600';\r\n el.style.backgroundColor = '#f6f8fa';\r\n });\r\n }\r\n\r\n // Update active tab button\r\n tabButtons.forEach((b, i) => {\r\n if (i === index - 1) {\r\n b.style.backgroundColor = '#2563eb';\r\n b.style.color = '#fff';\r\n b.style.borderColor = '#2563eb';\r\n b.style.fontWeight = '600';\r\n } else {\r\n b.style.backgroundColor = '#fff';\r\n b.style.color = '#333';\r\n b.style.borderColor = '#ccc';\r\n b.style.fontWeight = 'normal';\r\n }\r\n });\r\n\r\n ctx.emit('page-change', { page: currentSheetIndex, total: sheetNames.length });\r\n\r\n // Automatically set fit to page by default\r\n requestAnimationFrame(() => {\r\n if (!isUserZoomed) {\r\n scale = calculateFitScale();\r\n }\r\n applyTransform();\r\n });\r\n };\r\n\r\n const ro = new ResizeObserver(() => {\r\n if (!isUserZoomed) {\r\n scale = calculateFitScale();\r\n applyTransform();\r\n }\r\n });\r\n ro.observe(container);\r\n\r\n if (sheetNames.length > 0) {\r\n sheetNames.forEach((name, idx) => {\r\n const btn = document.createElement('button');\r\n btn.textContent = name;\r\n btn.style.padding = '4px 12px';\r\n btn.style.fontSize = '12px';\r\n btn.style.cursor = 'pointer';\r\n btn.style.border = '1px solid #ccc';\r\n btn.style.borderRadius = '4px';\r\n btn.style.backgroundColor = '#fff';\r\n btn.style.transition = 'all 0.15s ease';\r\n btn.onclick = () => renderSheet(idx + 1);\r\n tabsArea.appendChild(btn);\r\n tabButtons.push(btn);\r\n });\r\n\r\n renderSheet(1);\r\n } else {\r\n contentArea.innerHTML = `\r\n <div style=\"text-align:center; padding: 40px; color: #666;\">\r\n <div style=\"font-size:48px; margin-bottom: 16px;\">📊</div>\r\n <h3>${ctx.metadata.name || 'Spreadsheet'}</h3>\r\n <p>Unable to load sheet data</p>\r\n </div>\r\n `;\r\n }\r\n\r\n const cleanup = () => {\r\n ro.disconnect();\r\n container.remove();\r\n ctx.container.innerHTML = '';\r\n };\r\n\r\n ctx.signal.addEventListener('abort', cleanup);\r\n\r\n return {\r\n destroy: cleanup,\r\n zoomIn: () => {\r\n isUserZoomed = true;\r\n scale += 0.15;\r\n applyTransform();\r\n },\r\n zoomOut: () => {\r\n isUserZoomed = true;\r\n scale = Math.max(0.2, scale - 0.15);\r\n applyTransform();\r\n },\r\n getZoom: () => scale,\r\n setZoom: (level: number) => {\r\n isUserZoomed = true;\r\n scale = level;\r\n applyTransform();\r\n },\r\n fitToPage: () => {\r\n isUserZoomed = false;\r\n scale = calculateFitScale();\r\n applyTransform();\r\n },\r\n resetZoom: () => {\r\n isUserZoomed = false;\r\n scale = calculateFitScale();\r\n contentArea.scrollTop = 0;\r\n contentArea.scrollLeft = 0;\r\n applyTransform();\r\n },\r\n rotateCW: () => {},\r\n rotateCCW: () => {},\r\n goToPage: (page: number) => {\r\n if (page > 0 && page <= sheetNames.length) {\r\n renderSheet(page);\r\n }\r\n },\r\n getPageCount: () => sheetNames.length,\r\n getCurrentPage: () => currentSheetIndex,\r\n getThumbnails: (): Thumbnail[] => {\r\n return sheetNames.map((name, idx) => ({\r\n index: idx,\r\n label: name,\r\n render: async (canvas: HTMLCanvasElement) => {\r\n canvas.width = 140;\r\n canvas.height = 100;\r\n const c = canvas.getContext('2d');\r\n if (!c) return;\r\n\r\n // Sheet Paper Background\r\n c.fillStyle = '#ffffff';\r\n c.fillRect(0, 0, canvas.width, canvas.height);\r\n\r\n // Top Header Bar (Excel Green)\r\n c.fillStyle = '#107c41';\r\n c.fillRect(0, 0, canvas.width, 16);\r\n\r\n // Tab icon & name\r\n c.fillStyle = '#ffffff';\r\n c.font = 'bold 8px -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif';\r\n c.fillText(`📊 ${name.slice(0, 16)}`, 6, 11);\r\n\r\n // Grid header row (Columns A, B, C, D)\r\n const startY = 17;\r\n const rowH = 13;\r\n const colW = 30;\r\n const colHeaders = ['A', 'B', 'C', 'D'];\r\n\r\n c.fillStyle = '#f1f5f9';\r\n c.fillRect(0, startY, canvas.width, rowH);\r\n c.strokeStyle = '#cbd5e1';\r\n c.lineWidth = 0.8;\r\n c.strokeRect(0, startY, canvas.width, rowH);\r\n\r\n c.fillStyle = '#64748b';\r\n c.font = 'bold 7px sans-serif';\r\n for (let ci = 0; ci < colHeaders.length; ci++) {\r\n c.fillText(colHeaders[ci], 14 + ci * colW, startY + 9);\r\n }\r\n\r\n // Grid rows\r\n const ws = wb?.Sheets[name];\r\n for (let ri = 1; ri <= 5; ri++) {\r\n const y = startY + ri * rowH;\r\n if (y > canvas.height - 2) break;\r\n\r\n // Row number cell\r\n c.fillStyle = '#f8fafc';\r\n c.fillRect(0, y, 12, rowH);\r\n c.fillStyle = '#94a3b8';\r\n c.font = '6px sans-serif';\r\n c.fillText(String(ri), 3, y + 9);\r\n\r\n // Row border\r\n c.strokeStyle = '#e2e8f0';\r\n c.strokeRect(0, y, canvas.width, rowH);\r\n\r\n // Cell contents\r\n c.fillStyle = '#334155';\r\n c.font = '6px sans-serif';\r\n for (let ci = 0; ci < colHeaders.length; ci++) {\r\n const cellRef = `${colHeaders[ci]}${ri}`;\r\n const cellVal = ws?.[cellRef]?.w || ws?.[cellRef]?.v;\r\n if (cellVal !== undefined) {\r\n c.fillText(String(cellVal).slice(0, 6), 14 + ci * colW, y + 9);\r\n }\r\n }\r\n }\r\n\r\n // Overall border\r\n c.strokeStyle = '#cbd5e1';\r\n c.lineWidth = 1;\r\n c.strokeRect(0.5, 0.5, canvas.width - 1, canvas.height - 1);\r\n }\r\n }));\r\n },\r\n download: () => {\r\n const blob = new Blob([ctx.buffer], { type: this.mimeTypes[0] });\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = ctx.metadata.name || 'spreadsheet.xlsx';\r\n a.click();\r\n URL.revokeObjectURL(url);\r\n },\r\n print: () => {\r\n window.print();\r\n }\r\n };\r\n }\r\n}\r\n\r\nexport function excelPlugin(): ExcelPlugin {\r\n return new ExcelPlugin();\r\n}\r\n\r\nexport default ExcelPlugin;\r\n","import type { \r\n FileInfo, \r\n RenderContext, \r\n ToolbarAction, \r\n PreviewPlugin, \r\n PreviewInstance,\r\n Thumbnail\r\n} from '@patel.sumit51/core';\r\n\r\nexport class CsvPlugin implements PreviewPlugin {\r\n id = 'csv';\r\n name = 'CSV Preview';\r\n extensions = ['.csv', '.tsv'];\r\n mimeTypes = ['text/csv', 'text/tab-separated-values'];\r\n weight = 80;\r\n\r\n supports(file: FileInfo): boolean {\r\n const ext = file.metadata.extension?.toLowerCase();\r\n const mime = file.metadata.mimeType?.toLowerCase();\r\n return ext === '.csv' || ext === '.tsv' || mime === 'text/csv' || mime === 'text/tab-separated-values';\r\n }\r\n\r\n getToolbarActions(instance: PreviewInstance): ToolbarAction[] {\r\n const actions: ToolbarAction[] = [];\r\n\r\n // Sheet Thumbnails\r\n actions.push({\r\n id: 'thumbnails',\r\n icon: 'thumbnails',\r\n label: 'Sheet Thumbnails',\r\n type: 'button',\r\n group: 'navigation',\r\n execute: () => (instance as any).toggleThumbnails?.()\r\n });\r\n\r\n actions.push(\r\n {\r\n id: 'zoom-out',\r\n icon: 'zoom-out',\r\n label: 'Zoom Out',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => {\r\n instance.zoomOut?.();\r\n }\r\n },\r\n {\r\n id: 'zoom-in',\r\n icon: 'zoom-in',\r\n label: 'Zoom In',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => {\r\n instance.zoomIn?.();\r\n }\r\n },\r\n {\r\n id: 'reset-zoom',\r\n icon: 'reset-zoom',\r\n label: 'Reset Zoom',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => {\r\n instance.resetZoom?.();\r\n }\r\n },\r\n {\r\n id: 'download',\r\n icon: 'download',\r\n label: 'Download',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => {\r\n instance.download?.();\r\n }\r\n },\r\n {\r\n id: 'print',\r\n icon: 'print',\r\n label: 'Print',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => {\r\n instance.print?.();\r\n }\r\n },\r\n {\r\n id: 'open-window',\r\n icon: 'open-window',\r\n label: 'Open in Separate Full Window',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => {\r\n (instance as any).openInSeparateWindow?.();\r\n }\r\n }\r\n );\r\n\r\n return actions;\r\n }\r\n\r\n async render(ctx: RenderContext): Promise<PreviewInstance> {\r\n const decoder = new TextDecoder('utf-8');\r\n const text = decoder.decode(ctx.buffer);\r\n \r\n const container = document.createElement('div');\r\n container.style.width = '100%';\r\n container.style.height = '100%';\r\n container.style.overflow = 'auto';\r\n container.style.padding = '16px';\r\n container.style.boxSizing = 'border-box';\r\n\r\n const tableWrapper = document.createElement('div');\r\n tableWrapper.style.transformOrigin = 'top left';\r\n \r\n const delimiter = ctx.metadata.extension === '.tsv' ? '\\t' : ',';\r\n const allLines = text.split(/\\r?\\n/).filter(r => r.trim().length > 0);\r\n const headerLine = allLines[0] || '';\r\n const headerCells = headerLine.split(delimiter);\r\n const dataLines = allLines.slice(1);\r\n\r\n const table = document.createElement('table');\r\n table.style.borderCollapse = 'collapse';\r\n table.style.minWidth = '100%';\r\n table.style.fontFamily = '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, monospace';\r\n table.style.fontSize = '13px';\r\n table.style.background = '#ffffff';\r\n table.style.border = '1px solid #d0d7de';\r\n \r\n // Header row\r\n const headerTr = document.createElement('tr');\r\n headerCells.forEach(cell => {\r\n const th = document.createElement('th');\r\n th.textContent = cell.trim();\r\n th.style.border = '1px solid #d0d7de';\r\n th.style.padding = '8px 12px';\r\n th.style.backgroundColor = '#f6f8fa';\r\n th.style.fontWeight = '600';\r\n th.style.whiteSpace = 'nowrap';\r\n headerTr.appendChild(th);\r\n });\r\n table.appendChild(headerTr);\r\n\r\n // Single continuous load of all data rows\r\n dataLines.forEach((row, idx) => {\r\n const tr = document.createElement('tr');\r\n if (idx % 2 === 1) tr.style.backgroundColor = '#f8fafc';\r\n const cells = row.split(delimiter);\r\n cells.forEach(cell => {\r\n const td = document.createElement('td');\r\n td.textContent = cell.trim();\r\n td.style.border = '1px solid #d0d7de';\r\n td.style.padding = '6px 12px';\r\n td.style.whiteSpace = 'nowrap';\r\n tr.appendChild(td);\r\n });\r\n table.appendChild(tr);\r\n });\r\n\r\n tableWrapper.appendChild(table);\r\n container.appendChild(tableWrapper);\r\n ctx.container.appendChild(container);\r\n\r\n let scale = 1.0;\r\n let isUserZoomed = false;\r\n\r\n const calculateFitScale = () => {\r\n const availW = Math.max(280, container.clientWidth - 48);\r\n const tW = (table as any)._baseWidth || table.offsetWidth || 800;\r\n return Math.max(0.4, Math.min(1.0, availW / tW));\r\n };\r\n\r\n const applyScale = () => {\r\n if (!(table as any)._baseWidth && table.offsetWidth > 0) {\r\n (table as any)._baseWidth = table.offsetWidth;\r\n (table as any)._baseHeight = table.offsetHeight;\r\n }\r\n const baseW = (table as any)._baseWidth || table.offsetWidth || 800;\r\n const baseH = (table as any)._baseHeight || table.offsetHeight || 600;\r\n const scaledW = Math.round(baseW * scale);\r\n const scaledH = Math.round(baseH * scale);\r\n\r\n tableWrapper.style.position = 'relative';\r\n tableWrapper.style.width = `${scaledW}px`;\r\n tableWrapper.style.height = `${scaledH}px`;\r\n table.style.position = 'absolute';\r\n table.style.top = '0';\r\n table.style.left = '0';\r\n table.style.transform = `scale(${scale})`;\r\n table.style.transformOrigin = 'top left';\r\n };\r\n\r\n // Automatically fit to page width by default\r\n requestAnimationFrame(() => {\r\n if (!isUserZoomed) {\r\n scale = calculateFitScale();\r\n }\r\n applyScale();\r\n });\r\n\r\n const ro = new ResizeObserver(() => {\r\n if (!isUserZoomed) {\r\n scale = calculateFitScale();\r\n applyScale();\r\n }\r\n });\r\n ro.observe(container);\r\n\r\n const cleanup = () => {\r\n ro.disconnect();\r\n container.remove();\r\n ctx.container.innerHTML = '';\r\n };\r\n\r\n ctx.signal.addEventListener('abort', cleanup);\r\n\r\n return {\r\n destroy: cleanup,\r\n getPageCount: () => 1,\r\n getCurrentPage: () => 1,\r\n goToPage: () => {},\r\n getThumbnails: (): Thumbnail[] => {\r\n const sheetName = ctx.metadata.name?.replace(/\\.[^/.]+$/, '') || 'Sheet1';\r\n return [{\r\n index: 0,\r\n label: sheetName,\r\n render: async (canvas: HTMLCanvasElement) => {\r\n canvas.width = 140;\r\n canvas.height = 100;\r\n const c = canvas.getContext('2d');\r\n if (!c) return;\r\n\r\n // Sheet Paper Background\r\n c.fillStyle = '#ffffff';\r\n c.fillRect(0, 0, canvas.width, canvas.height);\r\n\r\n // Top Header Bar (Excel Green - same as xlsx wise)\r\n c.fillStyle = '#107c41';\r\n c.fillRect(0, 0, canvas.width, 16);\r\n\r\n // Tab icon & name\r\n c.fillStyle = '#ffffff';\r\n c.font = 'bold 8px -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif';\r\n c.fillText(`📊 ${sheetName.slice(0, 16)}`, 6, 11);\r\n\r\n // Grid header row\r\n const startY = 17;\r\n const rowH = 13;\r\n const colW = 30;\r\n const cols = headerCells.slice(0, 4).map(h => h.trim() || 'Col');\r\n\r\n c.fillStyle = '#f1f5f9';\r\n c.fillRect(0, startY, canvas.width, rowH);\r\n c.strokeStyle = '#cbd5e1';\r\n c.lineWidth = 0.8;\r\n c.strokeRect(0, startY, canvas.width, rowH);\r\n\r\n c.fillStyle = '#64748b';\r\n c.font = 'bold 7px sans-serif';\r\n for (let ci = 0; ci < cols.length; ci++) {\r\n c.fillText(cols[ci].slice(0, 5), 14 + ci * colW, startY + 9);\r\n }\r\n\r\n // Grid sample rows\r\n for (let ri = 0; ri < Math.min(5, dataLines.length); ri++) {\r\n const y = startY + (ri + 1) * rowH;\r\n if (y > canvas.height - 2) break;\r\n\r\n // Row number cell\r\n c.fillStyle = '#f8fafc';\r\n c.fillRect(0, y, 12, rowH);\r\n c.fillStyle = '#94a3b8';\r\n c.font = '6px sans-serif';\r\n c.fillText(String(ri + 1), 3, y + 9);\r\n\r\n // Row border\r\n c.strokeStyle = '#e2e8f0';\r\n c.strokeRect(0, y, canvas.width, rowH);\r\n\r\n // Cell contents\r\n const rowCells = dataLines[ri].split(delimiter);\r\n c.fillStyle = '#334155';\r\n c.font = '6px sans-serif';\r\n for (let ci = 0; ci < cols.length; ci++) {\r\n const val = (rowCells[ci] || '').trim();\r\n if (val) {\r\n c.fillText(val.slice(0, 6), 14 + ci * colW, y + 9);\r\n }\r\n }\r\n }\r\n\r\n // Overall border\r\n c.strokeStyle = '#cbd5e1';\r\n c.lineWidth = 1;\r\n c.strokeRect(0.5, 0.5, canvas.width - 1, canvas.height - 1);\r\n }\r\n }];\r\n },\r\n zoomIn: () => {\r\n isUserZoomed = true;\r\n scale += 0.1;\r\n applyScale();\r\n },\r\n zoomOut: () => {\r\n isUserZoomed = true;\r\n scale = Math.max(0.2, scale - 0.1);\r\n applyScale();\r\n },\r\n getZoom: () => scale,\r\n setZoom: (level: number) => {\r\n isUserZoomed = true;\r\n scale = level;\r\n applyScale();\r\n },\r\n fitToPage: () => {\r\n isUserZoomed = false;\r\n scale = calculateFitScale();\r\n applyScale();\r\n },\r\n resetZoom: () => {\r\n isUserZoomed = false;\r\n scale = calculateFitScale();\r\n container.scrollTop = 0;\r\n container.scrollLeft = 0;\r\n applyScale();\r\n },\r\n rotateCW: () => {},\r\n rotateCCW: () => {},\r\n download: () => {\r\n const blob = new Blob([ctx.buffer], { type: 'text/csv' });\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = ctx.metadata.name || 'data.csv';\r\n a.click();\r\n URL.revokeObjectURL(url);\r\n },\r\n print: () => {\r\n window.print();\r\n }\r\n };\r\n }\r\n}\r\n\r\nexport function csvPlugin(): CsvPlugin {\r\n return new CsvPlugin();\r\n}\r\n\r\nexport default CsvPlugin;\r\n","import type { \r\n FileInfo, \r\n RenderContext, \r\n ToolbarAction, \r\n PreviewPlugin, \r\n PreviewInstance,\r\n Thumbnail \r\n} from '@patel.sumit51/core';\r\nimport hljs from 'highlight.js';\r\n\r\nconst CODE_EXTENSIONS = [\r\n '.txt', '.json', '.js', '.ts', '.jsx', '.tsx', '.html', '.css', '.scss', '.less',\r\n '.md', '.xml', '.yml', '.yaml', '.sh', '.bash', '.py', \r\n '.java', '.c', '.cpp', '.h', '.cs', '.go', '.rs', '.sql', '.php'\r\n];\r\n\r\nexport class CodePlugin implements PreviewPlugin {\r\n id = 'code';\r\n name = 'Code/Text Preview';\r\n extensions = CODE_EXTENSIONS;\r\n mimeTypes = ['text/plain', 'application/json', 'text/javascript', 'text/html', 'text/css'];\r\n weight = 50; \r\n\r\n supports(file: FileInfo): boolean {\r\n const ext = file.metadata.extension?.toLowerCase();\r\n const mime = file.metadata.mimeType?.toLowerCase();\r\n \r\n if (ext && this.extensions.includes(ext)) return true;\r\n if (mime && (mime.startsWith('text/') || this.mimeTypes.includes(mime))) return true;\r\n \r\n return false;\r\n }\r\n\r\n getToolbarActions(instance: PreviewInstance): ToolbarAction[] {\r\n const totalPages = instance.getPageCount?.() ?? 1;\r\n const actions: ToolbarAction[] = [];\r\n\r\n actions.push({\r\n id: 'thumbnails',\r\n icon: 'thumbnails',\r\n label: 'Page Thumbnails',\r\n type: 'button',\r\n group: 'navigation',\r\n execute: () => (instance as any).toggleThumbnails?.()\r\n });\r\n\r\n actions.push({\r\n id: 'page-nav',\r\n icon: '',\r\n label: 'Page Navigation',\r\n type: 'page-nav',\r\n group: 'navigation',\r\n value: instance.getCurrentPage?.() ?? 1,\r\n max: totalPages,\r\n execute: (action: unknown, page?: unknown) => {\r\n const cur = instance.getCurrentPage?.() ?? 1;\r\n const max = instance.getPageCount?.() ?? 1;\r\n if (action === 'prev') {\r\n if (cur > 1) instance.goToPage?.(cur - 1);\r\n } else if (action === 'next') {\r\n if (cur < max) instance.goToPage?.(cur + 1);\r\n } else if (typeof page === 'number') {\r\n instance.goToPage?.(page);\r\n }\r\n }\r\n });\r\n\r\n actions.push(\r\n {\r\n id: 'zoom-out',\r\n icon: 'zoom-out',\r\n label: 'Zoom Out',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => {\r\n instance.zoomOut?.();\r\n }\r\n },\r\n {\r\n id: 'zoom-in',\r\n icon: 'zoom-in',\r\n label: 'Zoom In',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => {\r\n instance.zoomIn?.();\r\n }\r\n },\r\n {\r\n id: 'reset-zoom',\r\n icon: 'reset-zoom',\r\n label: 'Reset Zoom',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => {\r\n instance.resetZoom?.();\r\n }\r\n },\r\n {\r\n id: 'copy',\r\n icon: 'copy',\r\n label: 'Copy Content',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => {\r\n (instance as any).copy?.();\r\n }\r\n },\r\n {\r\n id: 'download',\r\n icon: 'download',\r\n label: 'Download',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => {\r\n instance.download?.();\r\n }\r\n },\r\n {\r\n id: 'print',\r\n icon: 'print',\r\n label: 'Print',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => {\r\n instance.print?.();\r\n }\r\n },\r\n {\r\n id: 'open-window',\r\n icon: 'open-window',\r\n label: 'Open in Separate Full Window',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => {\r\n (instance as any).openInSeparateWindow?.();\r\n }\r\n }\r\n );\r\n\r\n return actions;\r\n }\r\n\r\n async render(ctx: RenderContext): Promise<PreviewInstance> {\r\n const decoder = new TextDecoder('utf-8');\r\n const fullText = decoder.decode(ctx.buffer);\r\n\r\n const extRaw = ctx.metadata.extension?.toLowerCase();\r\n const mimeRaw = ctx.metadata.mimeType?.toLowerCase();\r\n const isTxt = extRaw === '.txt' || (mimeRaw === 'text/plain' && (!extRaw || !this.extensions.filter(e => e !== '.txt').includes(extRaw)));\r\n\r\n let rawPages: string[] = [];\r\n if (isTxt) {\r\n const explicitPages = fullText.split(/(?:\\f|\\x0C)/);\r\n const charsPerLine = 85;\r\n const maxVisualLines = 45;\r\n const charsPerPage = charsPerLine * maxVisualLines; // ~3825 characters per page\r\n\r\n for (const ep of explicitPages) {\r\n const lines = ep.split(/\\r?\\n/);\r\n let currentChunk: string[] = [];\r\n let currentLines = 0;\r\n\r\n for (let i = 0; i < lines.length; i++) {\r\n const line = lines[i];\r\n const vLines = Math.max(1, Math.ceil((line.length || 1) / charsPerLine));\r\n\r\n if (currentLines + vLines > maxVisualLines && currentChunk.length > 0) {\r\n rawPages.push(currentChunk.join('\\n'));\r\n currentChunk = [];\r\n currentLines = 0;\r\n }\r\n\r\n if (vLines > maxVisualLines) {\r\n // Large uninterrupted paragraph: break cleanly at word boundaries\r\n let remaining = line;\r\n while (remaining.length > charsPerPage) {\r\n let splitIdx = remaining.lastIndexOf(' ', charsPerPage);\r\n if (splitIdx < charsPerPage * 0.75) splitIdx = charsPerPage;\r\n rawPages.push(remaining.slice(0, splitIdx));\r\n remaining = remaining.slice(splitIdx).trimStart();\r\n }\r\n if (remaining.length > 0) {\r\n currentChunk.push(remaining);\r\n currentLines = Math.ceil(remaining.length / charsPerLine);\r\n }\r\n } else {\r\n currentChunk.push(line);\r\n currentLines += vLines;\r\n }\r\n }\r\n if (currentChunk.length > 0) {\r\n rawPages.push(currentChunk.join('\\n'));\r\n }\r\n }\r\n if (rawPages.length === 0) rawPages = [''];\r\n } else {\r\n const pageSplitRegex = /(?:\\f|\\x0C|(?:\\r?\\n|^)\\s*[-=_]{3,}\\s*(?:PAGE|Page|page break|Page Break)[\\s\\d\\w-]*[-=_]{3,}\\s*(?:\\r?\\n|$))/i;\r\n rawPages = fullText.split(pageSplitRegex).map(p => p.trim()).filter(p => p.length > 0);\r\n }\r\n \r\n const totalPages = Math.max(1, rawPages.length);\r\n let currentPage = 1;\r\n \r\n const container = document.createElement('div');\r\n container.style.width = '100%';\r\n container.style.height = '100%';\r\n container.style.overflow = 'auto';\r\n \r\n let fontSize = 13;\r\n let rotation = 0;\r\n let zoomLevel = 1;\r\n let isUserZoomed = false;\r\n const pre = document.createElement('pre');\r\n const code = document.createElement('code');\r\n const sizer = document.createElement('div');\r\n const scrollWrapper = document.createElement('div');\r\n\r\n if (isTxt) {\r\n container.style.overflow = 'auto';\r\n container.style.backgroundColor = '#f1f5f9';\r\n\r\n scrollWrapper.className = 'fp-code-scroll-wrapper';\r\n scrollWrapper.style.minWidth = '100%';\r\n scrollWrapper.style.minHeight = '100%';\r\n scrollWrapper.style.width = 'max-content';\r\n scrollWrapper.style.height = 'max-content';\r\n scrollWrapper.style.display = 'flex';\r\n scrollWrapper.style.justifyContent = 'center';\r\n scrollWrapper.style.alignItems = 'flex-start';\r\n scrollWrapper.style.padding = '16px 8px';\r\n scrollWrapper.style.boxSizing = 'border-box';\r\n\r\n sizer.className = 'fp-code-sizer';\r\n sizer.style.position = 'relative';\r\n sizer.style.flexShrink = '0';\r\n sizer.style.display = 'flex';\r\n sizer.style.justifyContent = 'center';\r\n sizer.style.alignItems = 'center';\r\n\r\n pre.style.margin = '0 auto';\r\n pre.style.fontFamily = \"Consolas, 'Courier New', monospace\";\r\n pre.style.fontSize = '13px';\r\n pre.style.color = '#1e293b';\r\n pre.style.lineHeight = '1.5';\r\n pre.style.whiteSpace = 'pre-wrap';\r\n pre.style.wordBreak = 'break-word';\r\n \r\n pre.style.backgroundColor = '#ffffff';\r\n pre.style.width = '816px';\r\n pre.style.minHeight = '1056px';\r\n pre.style.padding = '72px 56px';\r\n pre.style.boxSizing = 'border-box';\r\n pre.style.boxShadow = '0 4px 24px rgba(0, 0, 0, 0.08)';\r\n pre.style.borderRadius = '4px';\r\n pre.style.transformOrigin = 'center center';\r\n pre.style.transition = 'transform 0.15s ease';\r\n pre.style.flexShrink = '0';\r\n } else {\r\n container.style.overflow = 'auto';\r\n container.style.backgroundColor = '#1e1e1e';\r\n container.style.color = '#d4d4d4';\r\n container.style.padding = '16px';\r\n container.style.boxSizing = 'border-box';\r\n\r\n pre.style.margin = '0';\r\n pre.style.fontFamily = 'Consolas, Menlo, Monaco, monospace';\r\n pre.style.fontSize = `${fontSize}px`;\r\n pre.style.lineHeight = '1.5';\r\n pre.style.whiteSpace = 'pre-wrap';\r\n pre.style.wordBreak = 'break-all';\r\n pre.style.transformOrigin = 'top left';\r\n }\r\n\r\n const ext = (ctx.metadata.extension || '').replace('.', '');\r\n\r\n const renderCodePage = (text: string) => {\r\n if (isTxt) {\r\n code.textContent = text;\r\n } else {\r\n try {\r\n if (ext && hljs.getLanguage(ext)) {\r\n code.innerHTML = hljs.highlight(text, { language: ext }).value;\r\n } else {\r\n code.innerHTML = hljs.highlightAuto(text).value;\r\n }\r\n } catch {\r\n code.textContent = text;\r\n }\r\n }\r\n };\r\n\r\n renderCodePage(rawPages[0] || (isTxt ? '' : fullText));\r\n \r\n pre.appendChild(code);\r\n if (isTxt) {\r\n sizer.appendChild(pre);\r\n scrollWrapper.appendChild(sizer);\r\n container.appendChild(scrollWrapper);\r\n } else {\r\n container.appendChild(pre);\r\n }\r\n\r\n const showPage = (pageNum: number) => {\r\n currentPage = Math.max(1, Math.min(totalPages, pageNum));\r\n renderCodePage(rawPages[currentPage - 1] || (isTxt ? '' : fullText));\r\n container.scrollTop = 0;\r\n ctx.emit('page-change', { page: currentPage, total: totalPages });\r\n };\r\n\r\n if (totalPages > 1) {\r\n showPage(1);\r\n }\r\n\r\n ctx.container.appendChild(container);\r\n\r\n const calculateTxtFit = () => {\r\n // Minimal side margins (16px on each side, safe from vertical scrollbar)\r\n const availW = Math.max(280, container.clientWidth - 32);\r\n return Math.max(0.4, Math.min(3.0, availW / 816));\r\n };\r\n\r\n const updateTransform = () => {\r\n if (isTxt) {\r\n const elW = 816;\r\n const baseH = pre.offsetHeight || 1056;\r\n const isRotated90 = (rotation % 180 !== 0);\r\n const boxW = Math.round((isRotated90 ? baseH : elW) * zoomLevel);\r\n const boxH = Math.round((isRotated90 ? elW : baseH) * zoomLevel);\r\n\r\n sizer.style.width = `${boxW}px`;\r\n sizer.style.height = `${boxH}px`;\r\n\r\n pre.style.width = `${elW}px`;\r\n pre.style.transform = `scale(${zoomLevel}) rotate(${rotation}deg)`;\r\n pre.style.transformOrigin = 'center center';\r\n } else {\r\n pre.style.transform = `rotate(${rotation}deg)`;\r\n pre.style.fontSize = `${fontSize}px`;\r\n }\r\n };\r\n\r\n let resizeObserver: ResizeObserver | null = null;\r\n if (isTxt) {\r\n setTimeout(() => {\r\n zoomLevel = calculateTxtFit();\r\n updateTransform();\r\n }, 60);\r\n\r\n resizeObserver = typeof ResizeObserver !== 'undefined'\r\n ? new ResizeObserver(() => {\r\n if (!isUserZoomed) {\r\n zoomLevel = calculateTxtFit();\r\n updateTransform();\r\n }\r\n })\r\n : null;\r\n resizeObserver?.observe(container);\r\n }\r\n\r\n const cleanup = () => {\r\n resizeObserver?.disconnect();\r\n container.remove();\r\n ctx.container.innerHTML = '';\r\n };\r\n\r\n ctx.signal.addEventListener('abort', cleanup);\r\n\r\n return {\r\n destroy: cleanup,\r\n getPageCount: () => totalPages,\r\n getCurrentPage: () => currentPage,\r\n goToPage: (page: number) => showPage(page),\r\n getThumbnails: (): Thumbnail[] => {\r\n return rawPages.map((pageText, idx) => ({\r\n index: idx,\r\n label: `Page ${idx + 1}`,\r\n render: async (canvas: HTMLCanvasElement) => {\r\n canvas.width = 140;\r\n canvas.height = 180;\r\n const c = canvas.getContext('2d');\r\n if (!c) return;\r\n\r\n // Page Background\r\n c.fillStyle = '#ffffff';\r\n c.fillRect(0, 0, canvas.width, canvas.height);\r\n\r\n // Subtle paper border\r\n c.strokeStyle = '#cbd5e1';\r\n c.lineWidth = 1;\r\n c.strokeRect(0.5, 0.5, canvas.width - 1, canvas.height - 1);\r\n\r\n // Miniature lines of text\r\n c.fillStyle = '#64748b';\r\n const lines = (pageText || '').split('\\n').slice(0, 24);\r\n const lineH = 6;\r\n const startY = 14;\r\n const startX = 12;\r\n const maxW = canvas.width - 24;\r\n\r\n c.font = '5px monospace';\r\n for (let li = 0; li < lines.length; li++) {\r\n const l = lines[li].trim();\r\n if (!l) continue;\r\n const y = startY + li * lineH;\r\n if (y > canvas.height - 12) break;\r\n c.fillText(l.slice(0, 30), startX, y, maxW);\r\n }\r\n }\r\n }));\r\n },\r\n zoomIn: () => {\r\n isUserZoomed = true;\r\n if (isTxt) {\r\n zoomLevel = Math.min(3.5, zoomLevel + 0.15);\r\n } else {\r\n fontSize = Math.min(32, fontSize + 2);\r\n }\r\n updateTransform();\r\n },\r\n zoomOut: () => {\r\n isUserZoomed = true;\r\n if (isTxt) {\r\n zoomLevel = Math.max(0.1, zoomLevel - 0.15);\r\n } else {\r\n fontSize = Math.max(8, fontSize - 2);\r\n }\r\n updateTransform();\r\n },\r\n getZoom: () => isTxt ? zoomLevel : fontSize / 13,\r\n setZoom: (level: number) => {\r\n isUserZoomed = true;\r\n if (isTxt) {\r\n zoomLevel = level;\r\n } else {\r\n fontSize = Math.round(13 * level);\r\n }\r\n updateTransform();\r\n },\r\n fitToPage: () => {\r\n isUserZoomed = false;\r\n fontSize = 13;\r\n rotation = 0;\r\n zoomLevel = isTxt ? calculateTxtFit() : 1;\r\n updateTransform();\r\n },\r\n resetZoom: () => {\r\n isUserZoomed = false;\r\n fontSize = 13;\r\n rotation = 0;\r\n zoomLevel = isTxt ? calculateTxtFit() : 1;\r\n container.scrollTop = 0;\r\n container.scrollLeft = 0;\r\n updateTransform();\r\n },\r\n rotateCW: () => {\r\n rotation = (rotation + 90) % 360;\r\n updateTransform();\r\n },\r\n rotateCCW: () => {\r\n rotation = (rotation - 90 + 360) % 360;\r\n updateTransform();\r\n },\r\n download: () => {\r\n const mimeType = ctx.metadata.mimeType || 'text/plain';\r\n const blob = new Blob([ctx.buffer], { type: mimeType });\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = ctx.metadata.name || 'code.txt';\r\n a.click();\r\n URL.revokeObjectURL(url);\r\n },\r\n print: () => {\r\n window.print();\r\n },\r\n copy: () => {\r\n navigator.clipboard?.writeText(fullText);\r\n }\r\n };\r\n }\r\n}\r\n\r\nexport function codePlugin(): CodePlugin {\r\n return new CodePlugin();\r\n}\r\n\r\nexport default CodePlugin;\r\n","import type { \r\n FileInfo, \r\n RenderContext, \r\n ToolbarAction, \r\n PreviewPlugin, \r\n PreviewInstance \r\n} from '@patel.sumit51/core';\r\nimport { formatFileSize, downloadFile } from '@patel.sumit51/core';\r\nimport { unzip } from 'fflate';\r\n\r\ninterface ArchiveEntry {\r\n path: string;\r\n name: string;\r\n isDir: boolean;\r\n size: number;\r\n data?: Uint8Array;\r\n}\r\n\r\nexport class ArchivePlugin implements PreviewPlugin {\r\n id = 'archive';\r\n name = 'Archive Explorer';\r\n extensions = ['.zip'];\r\n mimeTypes = ['application/zip', 'application/x-zip-compressed'];\r\n weight = 70;\r\n\r\n supports(file: FileInfo): boolean {\r\n const ext = file.metadata.extension?.toLowerCase();\r\n const mime = file.metadata.mimeType?.toLowerCase();\r\n return ext === '.zip' || this.mimeTypes.includes(mime || '');\r\n }\r\n\r\n getToolbarActions(instance: PreviewInstance): ToolbarAction[] {\r\n return [\r\n {\r\n id: 'zoom-out',\r\n icon: 'zoom-out',\r\n label: 'Zoom Out',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomOut?.()\r\n },\r\n {\r\n id: 'zoom-in',\r\n icon: 'zoom-in',\r\n label: 'Zoom In',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomIn?.()\r\n },\r\n {\r\n id: 'fit-page',\r\n icon: 'fit-page',\r\n label: 'Fit to Page',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.fitToPage?.()\r\n },\r\n {\r\n id: 'reset-zoom',\r\n icon: 'reset-zoom',\r\n label: 'Reset Zoom',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.resetZoom?.()\r\n },\r\n {\r\n id: 'download',\r\n icon: 'download',\r\n label: 'Download Archive',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => instance.download?.()\r\n },\r\n {\r\n id: 'print',\r\n icon: 'print',\r\n label: 'Print File List',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => instance.print?.()\r\n }\r\n ];\r\n }\r\n\r\n async render(ctx: RenderContext): Promise<PreviewInstance> {\r\n const wrapper = document.createElement('div');\r\n wrapper.className = 'fp-archive-wrapper';\r\n wrapper.style.cssText = `\r\n width: 100%;\r\n height: 100%;\r\n overflow: auto;\r\n box-sizing: border-box;\r\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\r\n `;\r\n\r\n const scrollWrapper = document.createElement('div');\r\n scrollWrapper.className = 'fp-archive-scroll-wrapper';\r\n scrollWrapper.style.cssText = `\r\n min-width: 100%;\r\n min-height: 100%;\r\n width: max-content;\r\n height: max-content;\r\n display: flex;\r\n justify-content: center;\r\n align-items: flex-start;\r\n padding: 24px;\r\n box-sizing: border-box;\r\n `;\r\n\r\n const sizer = document.createElement('div');\r\n sizer.className = 'fp-archive-sizer';\r\n sizer.style.cssText = `\r\n position: relative;\r\n flex-shrink: 0;\r\n display: flex;\r\n justify-content: center;\r\n align-items: flex-start;\r\n `;\r\n\r\n const card = document.createElement('div');\r\n card.className = 'fp-archive-card';\r\n card.style.cssText = `\r\n width: 900px;\r\n box-sizing: border-box;\r\n transform-origin: top center;\r\n transition: transform 0.15s ease;\r\n flex-shrink: 0;\r\n `;\r\n\r\n sizer.appendChild(card);\r\n scrollWrapper.appendChild(sizer);\r\n wrapper.appendChild(scrollWrapper);\r\n\r\n ctx.container.innerHTML = '';\r\n ctx.container.style.overflow = 'auto';\r\n ctx.container.appendChild(wrapper);\r\n\r\n let scale = 1.0;\r\n\r\n const applyTransform = () => {\r\n const boxW = Math.round(900 * scale);\r\n const cardH = card.offsetHeight || 600;\r\n const boxH = Math.round(cardH * scale);\r\n sizer.style.width = `${boxW}px`;\r\n sizer.style.height = `${boxH}px`;\r\n card.style.transform = `scale(${scale})`;\r\n card.style.transformOrigin = 'top center';\r\n };\r\n\r\n const entries = await new Promise<ArchiveEntry[]>((resolve, reject) => {\r\n unzip(new Uint8Array(ctx.buffer), (err, unzipped) => {\r\n if (err) {\r\n reject(err);\r\n return;\r\n }\r\n const list: ArchiveEntry[] = Object.entries(unzipped).map(([path, data]) => {\r\n const isDir = path.endsWith('/');\r\n const parts = path.split('/').filter(Boolean);\r\n const name = parts[parts.length - 1] || path;\r\n return {\r\n path,\r\n name,\r\n isDir,\r\n size: data.length,\r\n data\r\n };\r\n });\r\n resolve(list);\r\n });\r\n });\r\n\r\n const totalUncompressedSize = entries.reduce((acc, e) => acc + e.size, 0);\r\n\r\n const renderUI = (filteredEntries: ArchiveEntry[]) => {\r\n card.innerHTML = `\r\n <div style=\"max-width: 900px; margin: 0 auto; background: var(--fp-bg, #ffffff); border: 1px solid var(--fp-border, #e5e7eb); border-radius: 8px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); overflow: hidden;\">\r\n <div style=\"padding: 16px 20px; background: var(--fp-toolbar-bg, #f9fafb); border-bottom: 1px solid var(--fp-border, #e5e7eb); display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 12px;\">\r\n <div>\r\n <h3 style=\"margin: 0 0 4px 0; font-size: 16px; font-weight: 600; color: var(--fp-text, #111827);\">\r\n 📦 ${ctx.metadata.name || 'Archive.zip'}\r\n </h3>\r\n <div style=\"font-size: 13px; color: var(--fp-text-muted, #6b7280);\">\r\n ${entries.length} items · Total size: ${formatFileSize(totalUncompressedSize)} (Compressed: ${formatFileSize(ctx.buffer.byteLength)})\r\n </div>\r\n </div>\r\n <div>\r\n <input type=\"text\" id=\"fp-archive-search\" placeholder=\"Search files in archive...\" style=\"padding: 6px 12px; font-size: 13px; border: 1px solid var(--fp-border, #d1d5db); border-radius: 6px; outline: none; width: 220px;\" />\r\n </div>\r\n </div>\r\n <div style=\"max-height: 550px; overflow-y: auto;\">\r\n <table style=\"width: 100%; border-collapse: collapse; font-size: 13px; text-align: left;\">\r\n <thead>\r\n <tr style=\"background: var(--fp-toolbar-bg, #f3f4f6); color: var(--fp-text-muted, #4b5563); border-bottom: 1px solid var(--fp-border, #e5e7eb);\">\r\n <th style=\"padding: 10px 16px; font-weight: 600;\">Name / Path</th>\r\n <th style=\"padding: 10px 16px; font-weight: 600; width: 120px;\">Size</th>\r\n <th style=\"padding: 10px 16px; font-weight: 600; width: 100px; text-align: right;\">Action</th>\r\n </tr>\r\n </thead>\r\n <tbody id=\"fp-archive-body\">\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n `;\r\n\r\n const tbody = card.querySelector('#fp-archive-body') as HTMLElement;\r\n if (filteredEntries.length === 0) {\r\n tbody.innerHTML = `<tr><td colspan=\"3\" style=\"padding: 24px; text-align: center; color: #9ca3af;\">No matching files found</td></tr>`;\r\n } else {\r\n tbody.innerHTML = filteredEntries.map((e, idx) => `\r\n <tr style=\"border-bottom: 1px solid var(--fp-border, #f3f4f6); transition: background 0.15s ease;\" onmouseover=\"this.style.background='var(--fp-hover, #f9fafb)'\" onmouseout=\"this.style.background='transparent'\">\r\n <td style=\"padding: 10px 16px; color: var(--fp-text, #1f2937); word-break: break-all;\">\r\n <span style=\"margin-right: 8px;\">${e.isDir ? '📁' : '📄'}</span>\r\n ${e.path}\r\n </td>\r\n <td style=\"padding: 10px 16px; color: var(--fp-text-muted, #6b7280);\">\r\n ${e.isDir ? '-' : formatFileSize(e.size)}\r\n </td>\r\n <td style=\"padding: 10px 16px; text-align: right;\">\r\n ${!e.isDir ? `<button data-idx=\"${idx}\" class=\"fp-entry-dl\" style=\"padding: 4px 8px; font-size: 12px; background: transparent; border: 1px solid var(--fp-border, #d1d5db); border-radius: 4px; cursor: pointer; color: var(--fp-text, #374151);\">⬇️ Save</button>` : ''}\r\n </td>\r\n </tr>\r\n `).join('');\r\n }\r\n\r\n // Handle download individual file\r\n tbody.querySelectorAll('.fp-entry-dl').forEach((btn) => {\r\n btn.addEventListener('click', (ev) => {\r\n const target = ev.currentTarget as HTMLElement;\r\n const idx = Number(target.getAttribute('data-idx'));\r\n const entry = filteredEntries[idx];\r\n if (entry && entry.data) {\r\n downloadFile(entry.data.buffer as ArrayBuffer, entry.name);\r\n }\r\n });\r\n });\r\n\r\n // Handle search\r\n const searchInput = card.querySelector('#fp-archive-search') as HTMLInputElement;\r\n if (searchInput) {\r\n searchInput.addEventListener('input', () => {\r\n const q = searchInput.value.toLowerCase().trim();\r\n const filtered = q ? entries.filter(e => e.path.toLowerCase().includes(q)) : entries;\r\n renderUI(filtered);\r\n const newSearch = card.querySelector('#fp-archive-search') as HTMLInputElement;\r\n if (newSearch) {\r\n newSearch.value = q;\r\n newSearch.focus();\r\n }\r\n });\r\n }\r\n\r\n applyTransform();\r\n };\r\n\r\n renderUI(entries);\r\n\r\n const cleanup = () => {\r\n wrapper.remove();\r\n ctx.container.innerHTML = '';\r\n };\r\n\r\n ctx.signal.addEventListener('abort', cleanup);\r\n\r\n return {\r\n destroy: cleanup,\r\n zoomIn: () => {\r\n scale += 0.1;\r\n applyTransform();\r\n },\r\n zoomOut: () => {\r\n scale = Math.max(0.3, scale - 0.1);\r\n applyTransform();\r\n },\r\n getZoom: () => scale,\r\n setZoom: (level: number) => {\r\n scale = level;\r\n applyTransform();\r\n },\r\n fitToPage: () => {\r\n scale = 1.0;\r\n applyTransform();\r\n },\r\n resetZoom: () => {\r\n scale = 1.0;\r\n wrapper.scrollTop = 0;\r\n wrapper.scrollLeft = 0;\r\n applyTransform();\r\n },\r\n download: () => {\r\n downloadFile(ctx.buffer, ctx.metadata.name || 'archive.zip', 'application/zip');\r\n },\r\n print: () => {\r\n window.print();\r\n }\r\n };\r\n }\r\n}\r\n\r\nexport function archivePlugin(): ArchivePlugin {\r\n return new ArchivePlugin();\r\n}\r\n\r\nexport default ArchivePlugin;\r\n","import type { \r\n FileInfo, \r\n RenderContext, \r\n ToolbarAction, \r\n PreviewPlugin, \r\n PreviewInstance \r\n} from '@patel.sumit51/core';\r\nimport { downloadFile } from '@patel.sumit51/core';\r\nimport { marked } from 'marked';\r\nimport DOMPurify from 'dompurify';\r\nimport hljs from 'highlight.js';\r\n\r\nexport class MarkdownPlugin implements PreviewPlugin {\r\n id = 'markdown';\r\n name = 'Markdown Preview';\r\n extensions = ['.md', '.markdown', '.mdown', '.mkd'];\r\n mimeTypes = ['text/markdown', 'text/x-markdown'];\r\n weight = 90; // Higher than generic text/code plugin\r\n\r\n supports(file: FileInfo): boolean {\r\n const ext = file.metadata.extension?.toLowerCase();\r\n const mime = file.metadata.mimeType?.toLowerCase();\r\n return this.extensions.includes(ext || '') || this.mimeTypes.includes(mime || '');\r\n }\r\n\r\n getToolbarActions(instance: PreviewInstance): ToolbarAction[] {\r\n return [\r\n {\r\n id: 'zoom-out',\r\n icon: 'zoom-out',\r\n label: 'Decrease Font',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomOut?.()\r\n },\r\n {\r\n id: 'zoom-in',\r\n icon: 'zoom-in',\r\n label: 'Increase Font',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomIn?.()\r\n },\r\n {\r\n id: 'fit-page',\r\n icon: 'fit-page',\r\n label: 'Default Size',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.fitToPage?.()\r\n },\r\n {\r\n id: 'reset-zoom',\r\n icon: 'reset-zoom',\r\n label: 'Reset Zoom',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.resetZoom?.()\r\n },\r\n {\r\n id: 'copy',\r\n icon: 'copy',\r\n label: 'Copy Markdown',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => (instance as any).copy?.()\r\n },\r\n {\r\n id: 'download',\r\n icon: 'download',\r\n label: 'Download Markdown',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => instance.download?.()\r\n },\r\n {\r\n id: 'print',\r\n icon: 'print',\r\n label: 'Print Document',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => instance.print?.()\r\n }\r\n ];\r\n }\r\n\r\n async render(ctx: RenderContext): Promise<PreviewInstance> {\r\n const text = new TextDecoder('utf-8', { fatal: false }).decode(ctx.buffer);\r\n \r\n // Parse markdown to HTML\r\n const rawHtml = await marked.parse(text, {\r\n gfm: true,\r\n breaks: true,\r\n });\r\n\r\n // Sanitize generated HTML for security\r\n const cleanHtml = DOMPurify.sanitize(rawHtml, {\r\n USE_PROFILES: { html: true }\r\n });\r\n\r\n const wrapper = document.createElement('div');\r\n wrapper.className = 'fp-markdown-wrapper';\r\n wrapper.style.cssText = `\r\n width: 100%;\r\n height: 100%;\r\n overflow: auto;\r\n padding: 32px 40px;\r\n box-sizing: border-box;\r\n line-height: 1.6;\r\n font-size: 15px;\r\n color: var(--fp-text, #24292f);\r\n background: var(--fp-bg, #ffffff);\r\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Noto Sans\", Helvetica, Arial, sans-serif;\r\n `;\r\n\r\n wrapper.innerHTML = `\r\n <style>\r\n .fp-markdown-wrapper h1, .fp-markdown-wrapper h2, .fp-markdown-wrapper h3,\r\n .fp-markdown-wrapper h4, .fp-markdown-wrapper h5, .fp-markdown-wrapper h6 {\r\n margin-top: 24px;\r\n margin-bottom: 16px;\r\n font-weight: 600;\r\n line-height: 1.25;\r\n color: var(--fp-text, #1f2328);\r\n }\r\n .fp-markdown-wrapper h1 { font-size: 2em; padding-bottom: 0.3em; border-bottom: 1px solid var(--fp-border, #d0d7de); }\r\n .fp-markdown-wrapper h2 { font-size: 1.5em; padding-bottom: 0.3em; border-bottom: 1px solid var(--fp-border, #d0d7de); }\r\n .fp-markdown-wrapper h3 { font-size: 1.25em; }\r\n .fp-markdown-wrapper p { margin-top: 0; margin-bottom: 16px; }\r\n .fp-markdown-wrapper table {\r\n border-spacing: 0;\r\n border-collapse: collapse;\r\n margin-top: 0;\r\n margin-bottom: 16px;\r\n width: 100%;\r\n overflow: auto;\r\n }\r\n .fp-markdown-wrapper table th, .fp-markdown-wrapper table td {\r\n padding: 6px 13px;\r\n border: 1px solid var(--fp-border, #d0d7de);\r\n }\r\n .fp-markdown-wrapper table tr:nth-child(2n) {\r\n background-color: var(--fp-toolbar-bg, #f6f8fa);\r\n }\r\n .fp-markdown-wrapper blockquote {\r\n margin: 0 0 16px 0;\r\n padding: 0 1em;\r\n color: var(--fp-text-muted, #59636e);\r\n border-left: 0.25em solid var(--fp-border, #d0d7de);\r\n }\r\n .fp-markdown-wrapper pre {\r\n padding: 16px;\r\n overflow: auto;\r\n font-size: 85%;\r\n line-height: 1.45;\r\n background-color: var(--fp-toolbar-bg, #f6f8fa);\r\n border-radius: 6px;\r\n border: 1px solid var(--fp-border, #d0d7de);\r\n }\r\n .fp-markdown-wrapper code {\r\n padding: 0.2em 0.4em;\r\n margin: 0;\r\n font-size: 85%;\r\n background-color: rgba(175, 184, 193, 0.2);\r\n border-radius: 4px;\r\n font-family: ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, monospace;\r\n }\r\n .fp-markdown-wrapper pre code {\r\n padding: 0;\r\n background: transparent;\r\n }\r\n .fp-markdown-wrapper ul, .fp-markdown-wrapper ol {\r\n padding-left: 2em;\r\n margin-top: 0;\r\n margin-bottom: 16px;\r\n }\r\n .fp-markdown-wrapper hr {\r\n height: 0.25em;\r\n padding: 0;\r\n margin: 24px 0;\r\n background-color: var(--fp-border, #d0d7de);\r\n border: 0;\r\n }\r\n </style>\r\n <div class=\"fp-markdown-content\" style=\"max-width: 860px; margin: 0 auto;\">\r\n ${cleanHtml}\r\n </div>\r\n `;\r\n\r\n // Apply syntax highlighting to pre code blocks\r\n wrapper.querySelectorAll('pre code').forEach((block) => {\r\n hljs.highlightElement(block as HTMLElement);\r\n });\r\n\r\n ctx.container.innerHTML = '';\r\n ctx.container.style.overflow = 'auto';\r\n ctx.container.appendChild(wrapper);\r\n\r\n let fontSize = 15;\r\n\r\n const cleanup = () => {\r\n wrapper.remove();\r\n ctx.container.innerHTML = '';\r\n };\r\n\r\n ctx.signal.addEventListener('abort', cleanup);\r\n\r\n return {\r\n destroy: cleanup,\r\n zoomIn: () => {\r\n fontSize = Math.min(28, fontSize + 2);\r\n wrapper.style.fontSize = `${fontSize}px`;\r\n },\r\n zoomOut: () => {\r\n fontSize = Math.max(10, fontSize - 2);\r\n wrapper.style.fontSize = `${fontSize}px`;\r\n },\r\n getZoom: () => fontSize / 15,\r\n setZoom: (level: number) => {\r\n fontSize = Math.round(15 * level);\r\n wrapper.style.fontSize = `${fontSize}px`;\r\n },\r\n fitToPage: () => {\r\n fontSize = 15;\r\n wrapper.style.fontSize = '15px';\r\n },\r\n resetZoom: () => {\r\n fontSize = 15;\r\n wrapper.style.fontSize = '15px';\r\n ctx.container.scrollTop = 0;\r\n ctx.container.scrollLeft = 0;\r\n },\r\n download: () => {\r\n downloadFile(ctx.buffer, ctx.metadata.name || 'document.md', 'text/markdown');\r\n },\r\n print: () => {\r\n window.print();\r\n },\r\n copy: () => {\r\n navigator.clipboard?.writeText(text);\r\n }\r\n };\r\n }\r\n}\r\n\r\nexport function markdownPlugin(): MarkdownPlugin {\r\n return new MarkdownPlugin();\r\n}\r\n\r\nexport default MarkdownPlugin;\r\n","import type { \r\n FileInfo, \r\n RenderContext, \r\n ToolbarAction, \r\n PreviewPlugin, \r\n PreviewInstance,\r\n Thumbnail\r\n} from '@patel.sumit51/core';\r\nimport { downloadFile } from '@patel.sumit51/core';\r\nimport { PptxRenderer } from 'pptx-browser';\r\n\r\nexport class PptxPlugin implements PreviewPlugin {\r\n id = 'pptx';\r\n name = 'PowerPoint Presentation';\r\n extensions = ['.pptx', '.ppsx', '.pptm', '.ppsm', '.potx', '.potm'];\r\n mimeTypes = [\r\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\r\n 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',\r\n 'application/vnd.ms-powerpoint.presentation.macroEnabled.12',\r\n 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12',\r\n 'application/vnd.openxmlformats-officedocument.presentationml.template',\r\n 'application/vnd.ms-powerpoint.template.macroEnabled.12'\r\n ];\r\n weight = 80;\r\n\r\n supports(file: FileInfo): boolean {\r\n const ext = file.metadata.extension?.toLowerCase();\r\n const mime = file.metadata.mimeType?.toLowerCase();\r\n if (ext) {\r\n return this.extensions.includes(ext);\r\n }\r\n return this.mimeTypes.includes(mime || '');\r\n }\r\n\r\n getToolbarActions(instance: PreviewInstance): ToolbarAction[] {\r\n return [\r\n {\r\n id: 'thumbnails',\r\n icon: 'thumbnails',\r\n label: 'Slide Thumbnails',\r\n type: 'button',\r\n group: 'navigation',\r\n execute: () => instance.toggleThumbnails?.()\r\n },\r\n {\r\n id: 'page-nav',\r\n icon: '',\r\n label: 'Slide Navigation',\r\n type: 'page-nav',\r\n group: 'navigation',\r\n value: instance.getCurrentPage?.() ?? 1,\r\n max: instance.getPageCount?.() ?? 1,\r\n execute: (action: unknown, page?: unknown) => {\r\n if (action === 'prev') {\r\n const cur = instance.getCurrentPage?.() ?? 1;\r\n if (cur > 1) instance.goToPage?.(cur - 1);\r\n } else if (action === 'next') {\r\n const cur = instance.getCurrentPage?.() ?? 1;\r\n const total = instance.getPageCount?.() ?? 1;\r\n if (cur < total) instance.goToPage?.(cur + 1);\r\n } else if (typeof page === 'number') {\r\n instance.goToPage?.(page);\r\n } else if (typeof action === 'number') {\r\n instance.goToPage?.(action);\r\n }\r\n }\r\n },\r\n {\r\n id: 'zoom-out',\r\n icon: 'zoom-out',\r\n label: 'Zoom Out',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomOut?.()\r\n },\r\n {\r\n id: 'zoom-in',\r\n icon: 'zoom-in',\r\n label: 'Zoom In',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomIn?.()\r\n },\r\n {\r\n id: 'fit-page',\r\n icon: 'fit-page',\r\n label: 'Fit to Slide',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.fitToPage?.()\r\n },\r\n {\r\n id: 'reset-zoom',\r\n icon: 'reset-zoom',\r\n label: 'Reset Zoom',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.resetZoom?.()\r\n },\r\n {\r\n id: 'rotate-cw',\r\n icon: 'rotate-cw',\r\n label: 'Rotate',\r\n type: 'button',\r\n group: 'view',\r\n execute: () => instance.rotateCW?.()\r\n },\r\n {\r\n id: 'download',\r\n icon: 'download',\r\n label: 'Download PPTX',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => instance.download?.()\r\n },\r\n {\r\n id: 'print',\r\n icon: 'print',\r\n label: 'Print Presentation',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => instance.print?.()\r\n }\r\n ];\r\n }\r\n\r\n async render(ctx: RenderContext): Promise<PreviewInstance> {\r\n const renderer = new PptxRenderer();\r\n await renderer.load(ctx.buffer);\r\n\r\n const slideCount = (renderer as any).slidePaths?.length || 1;\r\n let currentSlide = 1;\r\n let scale = 1.0;\r\n let rotation = 0;\r\n\r\n const wrapper = document.createElement('div');\r\n wrapper.className = 'fp-pptx-wrapper';\r\n wrapper.style.cssText = `\r\n width: 100%;\r\n height: 100%;\r\n overflow: auto;\r\n box-sizing: border-box;\r\n background: var(--fp-bg-canvas, #525659);\r\n `;\r\n\r\n const scrollWrapper = document.createElement('div');\r\n scrollWrapper.className = 'fp-pptx-scroll-wrapper';\r\n scrollWrapper.style.cssText = `\r\n min-width: 100%;\r\n min-height: 100%;\r\n width: max-content;\r\n height: max-content;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n padding: 24px;\r\n box-sizing: border-box;\r\n `;\r\n\r\n const sizer = document.createElement('div');\r\n sizer.className = 'fp-pptx-sizer';\r\n sizer.style.cssText = `\r\n position: relative;\r\n flex-shrink: 0;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n `;\r\n\r\n const slideContainer = document.createElement('div');\r\n slideContainer.className = 'fp-slide-container';\r\n slideContainer.style.cssText = `\r\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.25);\r\n border-radius: 4px;\r\n overflow: hidden;\r\n background: #ffffff;\r\n transform-origin: center center;\r\n transition: transform 0.2s ease;\r\n flex-shrink: 0;\r\n `;\r\n\r\n const canvas = document.createElement('canvas');\r\n slideContainer.appendChild(canvas);\r\n sizer.appendChild(slideContainer);\r\n scrollWrapper.appendChild(sizer);\r\n wrapper.appendChild(scrollWrapper);\r\n\r\n ctx.container.innerHTML = '';\r\n ctx.container.style.overflow = 'auto';\r\n ctx.container.appendChild(wrapper);\r\n\r\n const calculateFitScale = () => {\r\n const availW = Math.max(200, ctx.container.clientWidth - 48);\r\n const availH = Math.max(200, ctx.container.clientHeight - 72);\r\n const cW = canvas.offsetWidth || 1280;\r\n const cH = canvas.offsetHeight || 720;\r\n return Math.min(1.0, Math.min(availW / cW, availH / cH));\r\n };\r\n\r\n const applyTransform = () => {\r\n const cW = canvas.offsetWidth || 1280;\r\n const cH = canvas.offsetHeight || 720;\r\n const isRotated90 = (rotation % 180 !== 0);\r\n const boxW = Math.round((isRotated90 ? cH : cW) * scale);\r\n const boxH = Math.round((isRotated90 ? cW : cH) * scale);\r\n\r\n sizer.style.width = `${boxW}px`;\r\n sizer.style.height = `${boxH}px`;\r\n\r\n slideContainer.style.width = `${cW}px`;\r\n slideContainer.style.height = `${cH}px`;\r\n slideContainer.style.transform = `scale(${scale}) rotate(${rotation}deg)`;\r\n slideContainer.style.transformOrigin = 'center center';\r\n };\r\n\r\n const renderCurrentSlide = async () => {\r\n try {\r\n await renderer.renderSlide(currentSlide - 1, canvas, 1280);\r\n ctx.emit('page-change', { page: currentSlide, totalPages: slideCount });\r\n scale = calculateFitScale();\r\n applyTransform();\r\n } catch (err) {\r\n console.error('[PptxPlugin] Failed to render slide:', err);\r\n }\r\n };\r\n\r\n await renderCurrentSlide();\r\n\r\n const cleanup = () => {\r\n renderer.destroy();\r\n wrapper.remove();\r\n ctx.container.innerHTML = '';\r\n };\r\n\r\n ctx.signal.addEventListener('abort', cleanup);\r\n\r\n const instance: PreviewInstance = {\r\n destroy: cleanup,\r\n goToPage: (page: number) => {\r\n if (page >= 1 && page <= slideCount) {\r\n currentSlide = page;\r\n renderCurrentSlide();\r\n }\r\n },\r\n getPageCount: () => slideCount,\r\n getCurrentPage: () => currentSlide,\r\n zoomIn: () => {\r\n scale += 0.15;\r\n applyTransform();\r\n },\r\n zoomOut: () => {\r\n scale = Math.max(0.2, scale - 0.15);\r\n applyTransform();\r\n },\r\n getZoom: () => scale,\r\n setZoom: (level: number) => {\r\n scale = level;\r\n applyTransform();\r\n },\r\n fitToPage: () => {\r\n scale = calculateFitScale();\r\n rotation = 0;\r\n applyTransform();\r\n },\r\n resetZoom: () => {\r\n scale = calculateFitScale();\r\n rotation = 0;\r\n wrapper.scrollTop = 0;\r\n wrapper.scrollLeft = 0;\r\n applyTransform();\r\n },\r\n rotateCW: () => {\r\n rotation = (rotation + 90) % 360;\r\n applyTransform();\r\n },\r\n rotateCCW: () => {\r\n rotation = (rotation - 90 + 360) % 360;\r\n applyTransform();\r\n },\r\n getThumbnails: (): Thumbnail[] => {\r\n const list: Thumbnail[] = [];\r\n for (let i = 0; i < slideCount; i++) {\r\n const slideIdx = i;\r\n list.push({\r\n index: slideIdx,\r\n label: `Slide ${slideIdx + 1}`,\r\n render: async (thumbCanvas: HTMLCanvasElement) => {\r\n await renderer.renderSlide(slideIdx, thumbCanvas, 240);\r\n }\r\n });\r\n }\r\n return list;\r\n },\r\n download: () => {\r\n downloadFile(\r\n ctx.buffer,\r\n ctx.metadata.name || 'presentation.pptx',\r\n this.mimeTypes[0]\r\n );\r\n },\r\n print: () => {\r\n window.print();\r\n }\r\n };\r\n\r\n return instance;\r\n }\r\n}\r\n\r\nexport function pptxPlugin(): PptxPlugin {\r\n return new PptxPlugin();\r\n}\r\n\r\nexport default PptxPlugin;\r\n","import type { \r\n FileInfo, \r\n RenderContext, \r\n ToolbarAction, \r\n PreviewPlugin, \r\n PreviewInstance \r\n} from '@patel.sumit51/core';\r\nimport { downloadFile } from '@patel.sumit51/core';\r\nimport * as THREE from 'three';\r\nimport { STLLoader } from 'three/examples/jsm/loaders/STLLoader.js';\r\nimport { OBJLoader } from 'three/examples/jsm/loaders/OBJLoader.js';\r\nimport { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';\r\n\r\nexport class ThreeDPlugin implements PreviewPlugin {\r\n id = '3d';\r\n name = '3D Model Preview';\r\n extensions = ['.stl', '.obj'];\r\n mimeTypes = ['model/stl', 'model/obj', 'application/sla', 'text/plain'];\r\n weight = 75;\r\n\r\n supports(file: FileInfo): boolean {\r\n const ext = file.metadata.extension?.toLowerCase();\r\n return ext === '.stl' || ext === '.obj';\r\n }\r\n\r\n getToolbarActions(instance: PreviewInstance): ToolbarAction[] {\r\n return [\r\n {\r\n id: 'zoom-out',\r\n icon: 'zoom-out',\r\n label: 'Zoom Out',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomOut?.()\r\n },\r\n {\r\n id: 'zoom-in',\r\n icon: 'zoom-in',\r\n label: 'Zoom In',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomIn?.()\r\n },\r\n {\r\n id: 'fit-page',\r\n icon: 'fit-page',\r\n label: 'Reset Camera View',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.fitToPage?.()\r\n },\r\n {\r\n id: 'reset-zoom',\r\n icon: 'reset-zoom',\r\n label: 'Reset Zoom',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.resetZoom?.()\r\n },\r\n {\r\n id: 'rotate-cw',\r\n icon: 'rotate-cw',\r\n label: 'Toggle Wireframe',\r\n type: 'button',\r\n group: 'view',\r\n execute: () => instance.rotateCW?.()\r\n },\r\n {\r\n id: 'download',\r\n icon: 'download',\r\n label: 'Download 3D Model',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => instance.download?.()\r\n }\r\n ];\r\n }\r\n\r\n async render(ctx: RenderContext): Promise<PreviewInstance> {\r\n const container = ctx.container;\r\n container.innerHTML = '';\r\n container.style.overflow = 'hidden';\r\n container.style.position = 'relative';\r\n container.style.width = '100%';\r\n container.style.height = '100%';\r\n container.style.background = '#1a1a1a';\r\n\r\n const width = container.clientWidth || 800;\r\n const height = container.clientHeight || 600;\r\n\r\n // 1. Setup Scene, Camera, Renderer\r\n const scene = new THREE.Scene();\r\n scene.background = new THREE.Color(0x1e1e24);\r\n\r\n const camera = new THREE.PerspectiveCamera(45, width / height, 0.1, 2000);\r\n const renderer = new THREE.WebGLRenderer({ antialias: true });\r\n renderer.setSize(width, height);\r\n renderer.setPixelRatio(window.devicePixelRatio);\r\n renderer.shadowMap.enabled = true;\r\n container.appendChild(renderer.domElement);\r\n\r\n // 2. Setup OrbitControls\r\n const controls = new OrbitControls(camera, renderer.domElement);\r\n controls.enableDamping = true;\r\n controls.dampingFactor = 0.05;\r\n\r\n // 3. Add Lights\r\n const ambientLight = new THREE.AmbientLight(0xffffff, 0.8);\r\n scene.add(ambientLight);\r\n\r\n const dirLight1 = new THREE.DirectionalLight(0xffffff, 1.2);\r\n dirLight1.position.set(100, 200, 100);\r\n scene.add(dirLight1);\r\n\r\n const dirLight2 = new THREE.DirectionalLight(0xffffff, 0.6);\r\n dirLight2.position.set(-100, -100, -100);\r\n scene.add(dirLight2);\r\n\r\n // 4. Add Grid Helper\r\n const grid = new THREE.GridHelper(200, 20, 0x444444, 0x222222);\r\n scene.add(grid);\r\n\r\n // 5. Load and center 3D Model\r\n let meshGroup = new THREE.Group();\r\n let isWireframe = false;\r\n const ext = ctx.metadata.extension?.toLowerCase();\r\n\r\n const materials: THREE.Material[] = [];\r\n\r\n if (ext === '.stl') {\r\n const loader = new STLLoader();\r\n const geometry = loader.parse(ctx.buffer);\r\n geometry.computeVertexNormals();\r\n geometry.center();\r\n\r\n const material = new THREE.MeshStandardMaterial({\r\n color: 0x3b82f6,\r\n roughness: 0.4,\r\n metalness: 0.2\r\n });\r\n materials.push(material);\r\n\r\n const mesh = new THREE.Mesh(geometry, material);\r\n meshGroup.add(mesh);\r\n } else if (ext === '.obj') {\r\n const loader = new OBJLoader();\r\n const text = new TextDecoder().decode(ctx.buffer);\r\n const obj = loader.parse(text);\r\n\r\n obj.traverse((child) => {\r\n if ((child as THREE.Mesh).isMesh) {\r\n const m = child as THREE.Mesh;\r\n m.geometry.computeVertexNormals();\r\n const mat = new THREE.MeshStandardMaterial({\r\n color: 0x10b981,\r\n roughness: 0.5,\r\n metalness: 0.1\r\n });\r\n materials.push(mat);\r\n m.material = mat;\r\n }\r\n });\r\n meshGroup.add(obj);\r\n }\r\n\r\n scene.add(meshGroup);\r\n\r\n // 6. Compute bounding box to frame camera nicely\r\n const box = new THREE.Box3().setFromObject(meshGroup);\r\n const sphere = box.getBoundingSphere(new THREE.Sphere());\r\n const radius = Math.max(sphere.radius, 10);\r\n\r\n const fitCamera = () => {\r\n camera.position.set(radius * 1.5, radius * 1.2, radius * 2);\r\n camera.lookAt(0, 0, 0);\r\n controls.target.set(0, 0, 0);\r\n controls.update();\r\n };\r\n\r\n fitCamera();\r\n\r\n // 7. Animation Loop\r\n let animId: number;\r\n const animate = () => {\r\n animId = requestAnimationFrame(animate);\r\n controls.update();\r\n renderer.render(scene, camera);\r\n };\r\n animate();\r\n\r\n // 8. Handle Resize\r\n const resizeObserver = new ResizeObserver(() => {\r\n const newWidth = container.clientWidth || 800;\r\n const newHeight = container.clientHeight || 600;\r\n camera.aspect = newWidth / newHeight;\r\n camera.updateProjectionMatrix();\r\n renderer.setSize(newWidth, newHeight);\r\n });\r\n resizeObserver.observe(container);\r\n\r\n const cleanup = () => {\r\n cancelAnimationFrame(animId);\r\n resizeObserver.disconnect();\r\n controls.dispose();\r\n renderer.dispose();\r\n materials.forEach(m => m.dispose());\r\n meshGroup.traverse((child) => {\r\n if ((child as THREE.Mesh).geometry) {\r\n (child as THREE.Mesh).geometry.dispose();\r\n }\r\n });\r\n container.innerHTML = '';\r\n };\r\n\r\n ctx.signal.addEventListener('abort', cleanup);\r\n\r\n return {\r\n destroy: cleanup,\r\n zoomIn: () => {\r\n camera.position.multiplyScalar(0.85);\r\n controls.update();\r\n },\r\n zoomOut: () => {\r\n camera.position.multiplyScalar(1.15);\r\n controls.update();\r\n },\r\n fitToPage: fitCamera,\r\n resetZoom: fitCamera,\r\n rotateCW: () => {\r\n isWireframe = !isWireframe;\r\n materials.forEach(m => {\r\n (m as THREE.MeshStandardMaterial).wireframe = isWireframe;\r\n });\r\n },\r\n download: () => {\r\n downloadFile(ctx.buffer, ctx.metadata.name || `model${ext || '.stl'}`);\r\n }\r\n };\r\n }\r\n}\r\n\r\nexport function threeDPlugin(): ThreeDPlugin {\r\n return new ThreeDPlugin();\r\n}\r\n\r\nexport default ThreeDPlugin;\r\n","import type { \r\n FileInfo, \r\n RenderContext, \r\n ToolbarAction, \r\n PreviewPlugin, \r\n PreviewInstance,\r\n Thumbnail\r\n} from '@patel.sumit51/core';\r\n// @ts-ignore - rtf.js bundle has no individual d.ts\r\nimport * as RTFJS from 'rtf.js/dist/RTFJS.bundle.js';\r\n\r\ninterface ParsedRtfTable {\r\n id: string;\r\n rows: string[][];\r\n colPercents: number[];\r\n}\r\n\r\nfunction cleanRtfText(raw: string): string {\r\n return raw\r\n .replace(/\\\\bin\\d+\\s/g, '')\r\n .replace(/{\\\\\\*[^}]+}/g, '')\r\n .replace(/\\\\u(-?\\d+)\\??/g, (_, code) => {\r\n let num = parseInt(code, 10);\r\n if (num < 0) num += 65536;\r\n return String.fromCharCode(num);\r\n })\r\n .replace(/\\\\'([0-9a-fA-F]{2})/g, (_, hex) => {\r\n return String.fromCharCode(parseInt(hex, 16));\r\n })\r\n .replace(/\\\\tab\\b/g, ' ')\r\n .replace(/\\\\emdash\\b/g, '—')\r\n .replace(/\\\\endash\\b/g, '–')\r\n .replace(/\\\\bullet\\b/g, '•')\r\n .replace(/\\\\lquote\\b/g, '‘')\r\n .replace(/\\\\rquote\\b/g, '’')\r\n .replace(/\\\\ldblquote\\b/g, '“')\r\n .replace(/\\\\rdblquote\\b/g, '”')\r\n .replace(/\\\\[a-zA-Z]+-?\\d*\\s?/g, ' ')\r\n .replace(/[{}\\r\\n]/g, ' ')\r\n .replace(/\\s+/g, ' ')\r\n .trim();\r\n}\r\n\r\nfunction parseRtfTables(rtfText: string): ParsedRtfTable[] {\r\n const rowSegments = rtfText.split(/\\\\row\\b/);\r\n if (rowSegments.length <= 1) return [];\r\n\r\n interface RawTable {\r\n id: string;\r\n startPos: number;\r\n lastEnd: number;\r\n rows: { cells: string[]; widths: number[] }[];\r\n columnWidths: number[];\r\n }\r\n\r\n const rawTables: RawTable[] = [];\r\n let currentTable: RawTable | null = null;\r\n let charOffset = 0;\r\n\r\n for (let i = 0; i < rowSegments.length - 1; i++) {\r\n const segment = rowSegments[i];\r\n const segmentStart = charOffset;\r\n const segmentEnd = charOffset + segment.length + 4; // + \\row\r\n\r\n const cellParts = segment.split(/\\\\cell\\b/);\r\n if (cellParts.length > 1) {\r\n const cellxMatches = [...segment.matchAll(/\\\\cellx(\\d+)/g)].map(m => parseInt(m[1], 10));\r\n let cellWidths: number[] = [];\r\n if (cellxMatches.length > 0) {\r\n let seq = [cellxMatches[0]];\r\n for (let k = 1; k < cellxMatches.length; k++) {\r\n if (cellxMatches[k] > cellxMatches[k - 1]) seq.push(cellxMatches[k]);\r\n else break;\r\n }\r\n let prev = 0;\r\n cellWidths = seq.map(x => {\r\n const w = x - prev;\r\n prev = x;\r\n return w;\r\n });\r\n }\r\n\r\n const cells: string[] = [];\r\n for (let c = 0; c < cellParts.length - 1; c++) {\r\n let rawCell = cellParts[c];\r\n if (c === 0) {\r\n const lastTrowd = rawCell.lastIndexOf('\\\\trowd');\r\n if (lastTrowd !== -1) rawCell = rawCell.slice(lastTrowd);\r\n }\r\n cells.push(cleanRtfText(rawCell));\r\n }\r\n\r\n const isNewTable = !currentTable || (segmentStart - currentTable.lastEnd > 2500);\r\n if (isNewTable) {\r\n currentTable = {\r\n id: `RTF_TABLE_${rawTables.length}`,\r\n startPos: segmentStart,\r\n lastEnd: segmentEnd,\r\n rows: [],\r\n columnWidths: cellWidths\r\n };\r\n rawTables.push(currentTable);\r\n }\r\n\r\n if (currentTable) {\r\n currentTable.rows.push({\r\n cells,\r\n widths: cellWidths.length === cells.length ? cellWidths : currentTable.columnWidths\r\n });\r\n currentTable.lastEnd = segmentEnd;\r\n }\r\n }\r\n\r\n charOffset += segment.length + 4;\r\n }\r\n\r\n return rawTables.map(tbl => {\r\n const totalW = (tbl.columnWidths || []).reduce((a, b) => a + b, 0);\r\n const colPercents = totalW > 0\r\n ? tbl.columnWidths.map(w => Math.round((w / totalW) * 100))\r\n : [];\r\n\r\n return {\r\n id: tbl.id,\r\n rows: tbl.rows.map(r => r.cells),\r\n colPercents\r\n };\r\n });\r\n}\r\n\r\nfunction renderRtfTableElement(table: ParsedRtfTable): HTMLElement {\r\n const tableEl = document.createElement('table');\r\n tableEl.className = 'fp-rtf-table';\r\n tableEl.style.width = '100%';\r\n tableEl.style.borderCollapse = 'collapse';\r\n tableEl.style.margin = '16px 0 20px';\r\n tableEl.style.fontSize = '10pt';\r\n tableEl.style.lineHeight = '1.5';\r\n tableEl.style.border = '1px solid #cbd5e1';\r\n tableEl.style.backgroundColor = '#ffffff';\r\n\r\n const thead = document.createElement('thead');\r\n const tbody = document.createElement('tbody');\r\n\r\n table.rows.forEach((rowCells, rIdx) => {\r\n const tr = document.createElement('tr');\r\n const isHeader = rIdx === 0;\r\n\r\n if (isHeader) {\r\n tr.style.backgroundColor = '#f8fafc';\r\n }\r\n\r\n rowCells.forEach((cellText, cIdx) => {\r\n const cellEl = document.createElement(isHeader ? 'th' : 'td');\r\n cellEl.style.padding = '8px 12px';\r\n cellEl.style.border = '1px solid #cbd5e1';\r\n cellEl.style.verticalAlign = 'top';\r\n\r\n if (table.colPercents && table.colPercents[cIdx]) {\r\n cellEl.style.width = `${table.colPercents[cIdx]}%`;\r\n }\r\n\r\n if (/^\\d+$/.test(cellText.trim()) || cellText.trim() === '#') {\r\n cellEl.style.textAlign = 'center';\r\n }\r\n\r\n cellEl.textContent = cellText;\r\n tr.appendChild(cellEl);\r\n });\r\n\r\n if (isHeader) {\r\n thead.appendChild(tr);\r\n } else {\r\n tbody.appendChild(tr);\r\n }\r\n });\r\n\r\n tableEl.appendChild(thead);\r\n tableEl.appendChild(tbody);\r\n return tableEl;\r\n}\r\n\r\nfunction isHeadingElement(el: HTMLElement): boolean {\r\n if (['H1', 'H2', 'H3', 'H4'].includes(el.tagName)) return true;\r\n const spans = el.querySelectorAll ? Array.from(el.querySelectorAll('span, b, strong, div')) : [];\r\n for (const s of spans) {\r\n const hEl = s as HTMLElement;\r\n const fs = parseFloat(hEl.style.fontSize) || 0;\r\n const isBold = hEl.style.fontWeight === 'bold' || parseInt(hEl.style.fontWeight, 10) >= 600 || ['B', 'STRONG'].includes(hEl.tagName);\r\n if (isBold && fs >= 14) return true;\r\n }\r\n const elFs = parseFloat(el.style.fontSize) || 0;\r\n const elBold = el.style.fontWeight === 'bold' || parseInt(el.style.fontWeight, 10) >= 600;\r\n if (elBold && elFs >= 14) return true;\r\n return false;\r\n}\r\n\r\nexport class RtfPlugin implements PreviewPlugin {\r\n id = 'rtf';\r\n name = 'Rich Text Format (RTF)';\r\n extensions = ['.rtf'];\r\n mimeTypes = ['text/rtf', 'application/rtf'];\r\n weight = 80;\r\n\r\n supports(file: FileInfo): boolean {\r\n const ext = file.metadata.extension?.toLowerCase();\r\n const mime = file.metadata.mimeType?.toLowerCase();\r\n return this.extensions.includes(ext || '') || this.mimeTypes.includes(mime || '');\r\n }\r\n\r\n getToolbarActions(instance: PreviewInstance): ToolbarAction[] {\r\n const totalPages = instance.getPageCount?.() ?? 1;\r\n const actions: ToolbarAction[] = [];\r\n\r\n actions.push({\r\n id: 'page-nav',\r\n icon: '',\r\n label: 'Page Navigation',\r\n type: 'page-nav',\r\n group: 'navigation',\r\n value: instance.getCurrentPage?.() ?? 1,\r\n max: totalPages,\r\n execute: (action: unknown, page?: unknown) => {\r\n const cur = instance.getCurrentPage?.() ?? 1;\r\n const max = instance.getPageCount?.() ?? 1;\r\n if (action === 'prev') {\r\n if (cur > 1) instance.goToPage?.(cur - 1);\r\n } else if (action === 'next') {\r\n if (cur < max) instance.goToPage?.(cur + 1);\r\n } else if (typeof page === 'number') {\r\n instance.goToPage?.(page);\r\n }\r\n }\r\n });\r\n\r\n actions.push(\r\n {\r\n id: 'thumbnails',\r\n icon: 'thumbnails',\r\n label: 'Thumbnails',\r\n type: 'button',\r\n group: 'view',\r\n execute: () => (instance as any).toggleThumbnails?.()\r\n },\r\n {\r\n id: 'zoom-out',\r\n icon: 'zoom-out',\r\n label: 'Zoom Out',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomOut?.()\r\n },\r\n {\r\n id: 'zoom-in',\r\n icon: 'zoom-in',\r\n label: 'Zoom In',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomIn?.()\r\n },\r\n {\r\n id: 'fit-page',\r\n icon: 'fit-page',\r\n label: 'Fit to Page',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.fitToPage?.()\r\n },\r\n {\r\n id: 'reset-zoom',\r\n icon: 'reset-zoom',\r\n label: 'Reset Zoom',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.resetZoom?.()\r\n },\r\n {\r\n id: 'rotate-cw',\r\n icon: 'rotate-cw',\r\n label: 'Rotate',\r\n type: 'button',\r\n group: 'view',\r\n execute: () => instance.rotateCW?.()\r\n },\r\n {\r\n id: 'download',\r\n icon: 'download',\r\n label: 'Download',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => instance.download?.()\r\n },\r\n {\r\n id: 'copy',\r\n icon: 'copy',\r\n label: 'Copy Text',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => (instance as any).copy?.()\r\n },\r\n {\r\n id: 'print',\r\n icon: 'print',\r\n label: 'Print',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => instance.print?.()\r\n },\r\n {\r\n id: 'open-window',\r\n icon: 'open-window',\r\n label: 'Open in Separate Full Window',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => (instance as any).openInSeparateWindow?.()\r\n }\r\n );\r\n\r\n return actions;\r\n }\r\n\r\n async render(ctx: RenderContext): Promise<PreviewInstance> {\r\n const rawRtf = new TextDecoder('latin1').decode(ctx.buffer);\r\n\r\n // --- 1. DYNAMIC PAGE SETUP FROM RTF STREAM ---\r\n const paperwMatch = rawRtf.match(/\\\\paperw(\\d+)/);\r\n const paperhMatch = rawRtf.match(/\\\\paperh(\\d+)/);\r\n const marglMatch = rawRtf.match(/\\\\margl(\\d+)/);\r\n const margrMatch = rawRtf.match(/\\\\margr(\\d+)/);\r\n const margtMatch = rawRtf.match(/\\\\margt(\\d+)/);\r\n const margbMatch = rawRtf.match(/\\\\margb(\\d+)/);\r\n\r\n const paperwTwips = paperwMatch ? parseInt(paperwMatch[1], 10) : 11906;\r\n const paperhTwips = paperhMatch ? parseInt(paperhMatch[1], 10) : 16838;\r\n const marglTwips = marglMatch ? parseInt(marglMatch[1], 10) : 1134;\r\n const margrTwips = margrMatch ? parseInt(margrMatch[1], 10) : 1134;\r\n const margtTwips = margtMatch ? parseInt(margtMatch[1], 10) : 1134;\r\n const margbTwips = margbMatch ? parseInt(margbMatch[1], 10) : 1134;\r\n\r\n const pageWidth = Math.round(paperwTwips / 15);\r\n const pageHeight = Math.round(paperhTwips / 15);\r\n const padLeft = Math.round(marglTwips / 15);\r\n const padRight = Math.round(margrTwips / 15);\r\n const padTop = Math.round(margtTwips / 15);\r\n const padBottom = Math.round(margbTwips / 15);\r\n const printableHeight = pageHeight - padTop - padBottom;\r\n\r\n // --- 2. DYNAMIC RAW IMAGE EXTRACTION ---\r\n const extractedImages: { mime: string; dataUrl: string; offset: number }[] = [];\r\n let p = 0;\r\n while ((p = rawRtf.indexOf('\\\\pict', p)) !== -1) {\r\n const startP = p;\r\n p += 5;\r\n const header = rawRtf.substring(startP, startP + 600);\r\n let mime = '';\r\n let magic = '';\r\n if (header.includes('\\\\pngblip')) {\r\n mime = 'image/png';\r\n magic = '89504e47';\r\n } else if (header.includes('\\\\jpegblip')) {\r\n mime = 'image/jpeg';\r\n magic = 'ffd8ff';\r\n }\r\n if (!mime || !magic) continue;\r\n const magicPos = rawRtf.indexOf(magic, startP);\r\n if (magicPos === -1 || magicPos - startP > 3000) continue;\r\n let endP = magicPos;\r\n while (endP < rawRtf.length && /[0-9a-fA-F\\r\\n\\s]/.test(rawRtf[endP])) {\r\n endP++;\r\n }\r\n const cleanHex = rawRtf.substring(magicPos, endP).replace(/[\\r\\n\\s]/g, '');\r\n if (cleanHex.length < 100) continue;\r\n const hexLen = cleanHex.length / 2;\r\n const u8 = new Uint8Array(hexLen);\r\n for (let k = 0; k < hexLen; k++) {\r\n u8[k] = parseInt(cleanHex.substr(k * 2, 2), 16);\r\n }\r\n let bStr = '';\r\n for (let k = 0; k < u8.length; k += 8192) {\r\n bStr += String.fromCharCode.apply(null, Array.from(u8.subarray(k, k + 8192)));\r\n }\r\n extractedImages.push({ mime, dataUrl: `data:${mime};base64,${btoa(bStr)}`, offset: startP });\r\n }\r\n\r\n // --- 3. PARSE DYNAMIC TABLES ---\r\n const tables = parseRtfTables(rawRtf);\r\n\r\n const wrapper = document.createElement('div');\r\n wrapper.className = 'fp-rtf-wrapper';\r\n wrapper.style.padding = '0';\r\n wrapper.style.width = `${pageWidth}px`;\r\n wrapper.style.margin = '0 auto';\r\n wrapper.style.boxSizing = 'border-box';\r\n wrapper.style.display = 'flex';\r\n wrapper.style.flexDirection = 'column';\r\n wrapper.style.alignItems = 'center';\r\n wrapper.style.backgroundColor = 'transparent';\r\n wrapper.style.transformOrigin = 'center center';\r\n wrapper.style.transition = 'transform 0.15s ease';\r\n wrapper.style.flexShrink = '0';\r\n\r\n const sizer = document.createElement('div');\r\n sizer.className = 'fp-rtf-sizer';\r\n sizer.style.position = 'relative';\r\n sizer.style.flexShrink = '0';\r\n sizer.style.display = 'flex';\r\n sizer.style.justifyContent = 'center';\r\n sizer.style.alignItems = 'center';\r\n\r\n const scrollWrapper = document.createElement('div');\r\n scrollWrapper.className = 'fp-rtf-scroll-wrapper';\r\n scrollWrapper.style.minWidth = '100%';\r\n scrollWrapper.style.minHeight = '100%';\r\n scrollWrapper.style.width = 'max-content';\r\n scrollWrapper.style.height = 'max-content';\r\n scrollWrapper.style.display = 'flex';\r\n scrollWrapper.style.justifyContent = 'center';\r\n scrollWrapper.style.alignItems = 'flex-start';\r\n scrollWrapper.style.padding = '16px 8px';\r\n scrollWrapper.style.boxSizing = 'border-box';\r\n\r\n sizer.appendChild(wrapper);\r\n scrollWrapper.appendChild(sizer);\r\n\r\n ctx.container.style.overflow = 'auto';\r\n ctx.container.style.padding = '0';\r\n ctx.container.style.backgroundColor = '#f1f5f9';\r\n ctx.container.appendChild(scrollWrapper);\r\n\r\n let scale = 1.0;\r\n let rotation = 0;\r\n let pageElements: HTMLElement[] = [];\r\n let isUserZoomed = false;\r\n let fitMode: 'width' | 'page' = ((ctx as any)?.options?.fitMode as any) || 'width';\r\n\r\n const calculateFitScale = (mode: 'width' | 'page' = fitMode) => {\r\n const elW = pageWidth;\r\n const singlePageH = pageHeight;\r\n const availW = Math.max(280, ctx.container.clientWidth - 32);\r\n const availH = Math.max(280, ctx.container.clientHeight - 32);\r\n\r\n const sW = availW / elW;\r\n const sH = availH / singlePageH;\r\n\r\n if (mode === 'page') {\r\n return Math.max(0.35, Math.min(3.0, Math.min(sW, sH)));\r\n }\r\n return Math.max(0.4, Math.min(3.0, sW));\r\n };\r\n\r\n const applyTransform = () => {\r\n const elW = pageWidth;\r\n const baseH = pageHeight;\r\n const isRotated90 = (rotation % 180 !== 0);\r\n const boxW = Math.round((isRotated90 ? baseH : elW) * scale);\r\n const boxH = Math.round((isRotated90 ? elW : baseH) * scale);\r\n\r\n sizer.style.width = `${boxW}px`;\r\n sizer.style.height = `${boxH}px`;\r\n\r\n wrapper.style.width = `${elW}px`;\r\n wrapper.style.height = `${baseH}px`;\r\n wrapper.style.transform = `scale(${scale}) rotate(${rotation}deg)`;\r\n wrapper.style.transformOrigin = 'center center';\r\n };\r\n\r\n const resizeObserver = typeof ResizeObserver !== 'undefined'\r\n ? new ResizeObserver(() => {\r\n if (!isUserZoomed) {\r\n scale = calculateFitScale(fitMode);\r\n applyTransform();\r\n }\r\n })\r\n : null;\r\n resizeObserver?.observe(ctx.container);\r\n\r\n setTimeout(() => {\r\n scale = calculateFitScale(fitMode);\r\n applyTransform();\r\n }, 60);\r\n\r\n try {\r\n if (typeof (RTFJS as any).loggingEnabled === 'function') {\r\n (RTFJS as any).loggingEnabled(false);\r\n }\r\n\r\n // Render document with RTFJS\r\n const doc = new (RTFJS as any).Document(ctx.buffer, {\r\n onPicture: (isLegacy: boolean | null, createPic: () => HTMLElement) => {\r\n if (isLegacy === true) return null;\r\n return createPic();\r\n }\r\n });\r\n const elements: HTMLElement[] = await doc.render();\r\n\r\n // Replace [Unsupported image format] with extracted high-res raw images\r\n let unsupportedIndex = 1;\r\n const usedTables = new Set<number>();\r\n\r\n for (let i = 0; i < elements.length; i++) {\r\n const el = elements[i];\r\n const text = el.textContent || '';\r\n\r\n if (text.includes('[Unsupported image format]')) {\r\n if (extractedImages[unsupportedIndex]) {\r\n const img = document.createElement('img');\r\n img.src = extractedImages[unsupportedIndex].dataUrl;\r\n img.style.width = '100%';\r\n img.style.height = 'auto';\r\n img.style.maxHeight = '430px';\r\n img.style.objectFit = 'contain';\r\n img.style.display = 'block';\r\n img.style.margin = '12px auto';\r\n el.innerHTML = '';\r\n el.appendChild(img);\r\n unsupportedIndex++;\r\n }\r\n }\r\n\r\n // Replace flattened table elements at their natural position\r\n if (tables.length > 0) {\r\n for (let t = 0; t < tables.length; t++) {\r\n if (usedTables.has(t)) continue;\r\n const tbl = tables[t];\r\n if (tbl.rows.length >= 2) {\r\n const sampleCell1 = tbl.rows[1]?.[1] || tbl.rows[0]?.[1] || '';\r\n const sampleCell2 = tbl.rows[2]?.[1] || tbl.rows[1]?.[0] || '';\r\n const match1 = sampleCell1 && text.includes(sampleCell1.slice(0, 15).trim());\r\n const match2 = sampleCell2 && text.includes(sampleCell2.slice(0, 15).trim());\r\n if (match1 && match2) {\r\n el.innerHTML = '';\r\n el.appendChild(renderRtfTableElement(tbl));\r\n usedTables.add(t);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Constrain SVGs and images to standard page boundaries and aspect ratio\r\n elements.forEach(el => {\r\n const svgs = el.querySelectorAll ? Array.from(el.querySelectorAll('svg')) : [];\r\n svgs.forEach(svg => {\r\n svg.removeAttribute('width');\r\n svg.removeAttribute('height');\r\n svg.style.maxWidth = '100%';\r\n svg.style.maxHeight = '430px';\r\n svg.style.height = 'auto';\r\n svg.style.display = 'block';\r\n svg.style.margin = '12px auto';\r\n });\r\n const imgs = el.querySelectorAll ? Array.from(el.querySelectorAll('img')) : [];\r\n imgs.forEach(img => {\r\n img.style.maxWidth = '100%';\r\n img.style.maxHeight = '430px';\r\n img.style.height = 'auto';\r\n img.style.objectFit = 'contain';\r\n img.style.display = 'block';\r\n img.style.margin = '12px auto';\r\n });\r\n });\r\n\r\n // Await all image decodes for exact geometry measurement\r\n const allImgs = Array.from(document.querySelectorAll('img')).concat(\r\n elements.flatMap(el => Array.from(el.querySelectorAll ? el.querySelectorAll('img') : []))\r\n );\r\n await Promise.all(allImgs.map(img => {\r\n if (img.complete && img.naturalHeight > 0) return Promise.resolve();\r\n if (img.decode) return img.decode().catch(() => {});\r\n return new Promise(r => { img.onload = r as any; img.onerror = r as any; });\r\n }));\r\n\r\n // Format bullet items\r\n elements.forEach(el => {\r\n const text = el.textContent || '';\r\n if (text.includes('\\uf0b7')) {\r\n const cleanText = text.replace(/^[\\s\\uf0b7\\t]+/, '');\r\n el.style.display = 'flex';\r\n el.style.alignItems = 'flex-start';\r\n el.style.margin = '6px 0 6px 28px';\r\n el.style.fontSize = '11pt';\r\n el.style.lineHeight = '1.5';\r\n el.innerHTML = `<span style=\"margin-right:10px; user-select:none;\">□</span><span>${cleanText}</span>`;\r\n }\r\n });\r\n\r\n // Apply typography styles\r\n elements.forEach(el => {\r\n const text = (el.textContent || '').trim();\r\n const hasMedia = el.querySelector('img, svg, canvas, table') !== null || ['IMG', 'SVG', 'TABLE'].includes(el.tagName);\r\n if (isHeadingElement(el)) {\r\n el.style.marginTop = '20px';\r\n el.style.marginBottom = '10px';\r\n el.style.lineHeight = '1.25';\r\n } else if (text.length > 0 && !hasMedia) {\r\n el.style.marginBottom = '12px';\r\n el.style.lineHeight = '1.45';\r\n }\r\n });\r\n\r\n // --- 4. MEASURE & DYNAMICALLY LAYOUT ---\r\n const measureCard = document.createElement('div');\r\n measureCard.style.width = `${pageWidth}px`;\r\n measureCard.style.padding = `${padTop}px ${padRight}px ${padBottom}px ${padLeft}px`;\r\n measureCard.style.boxSizing = 'border-box';\r\n measureCard.style.fontFamily = 'Calibri, \"Segoe UI\", Arial, sans-serif';\r\n measureCard.style.lineHeight = '1.45';\r\n measureCard.style.visibility = 'hidden';\r\n measureCard.style.position = 'absolute';\r\n measureCard.style.top = '-99999px';\r\n document.body.appendChild(measureCard);\r\n\r\n const createPageCard = (num: number) => {\r\n const card = document.createElement('div');\r\n card.className = 'fp-rtf-page-card';\r\n card.setAttribute('data-page-number', String(num));\r\n card.style.backgroundColor = '#ffffff';\r\n card.style.boxShadow = '0 4px 24px rgba(0,0,0,0.08), 0 1px 3px rgba(0,0,0,0.04)';\r\n card.style.borderRadius = '4px';\r\n card.style.width = `${pageWidth}px`;\r\n card.style.height = `${pageHeight}px`;\r\n card.style.padding = `${padTop}px ${padRight}px ${padBottom}px ${padLeft}px`;\r\n card.style.boxSizing = 'border-box';\r\n card.style.overflow = 'hidden';\r\n card.style.marginBottom = '24px';\r\n card.style.color = '#1e293b';\r\n card.style.fontFamily = 'Calibri, \"Segoe UI\", Arial, sans-serif';\r\n card.style.lineHeight = '1.45';\r\n card.style.position = 'relative';\r\n card.style.textAlign = 'left';\r\n return card;\r\n };\r\n\r\n const pages: HTMLElement[] = [];\r\n let curCard = createPageCard(1);\r\n pages.push(curCard);\r\n let curHeight = 0;\r\n\r\n for (let i = 0; i < elements.length; i++) {\r\n const el = elements[i];\r\n if (!el || !(el instanceof HTMLElement)) continue;\r\n\r\n const text = (el.textContent || '').trim();\r\n const hasMedia = el.querySelector('img, svg, canvas, table') !== null || ['IMG', 'SVG', 'TABLE'].includes(el.tagName);\r\n const isEmptyPar = !hasMedia && text.length === 0;\r\n\r\n if (isEmptyPar) {\r\n const emptyH = 35;\r\n if (curHeight + emptyH > printableHeight) {\r\n if (curCard.childNodes.length > 0) {\r\n curCard = createPageCard(pages.length + 1);\r\n pages.push(curCard);\r\n curHeight = 0;\r\n }\r\n }\r\n const spacer = document.createElement('div');\r\n spacer.style.height = `${emptyH}px`;\r\n curCard.appendChild(spacer);\r\n curHeight += emptyH;\r\n continue;\r\n }\r\n\r\n measureCard.innerHTML = '';\r\n const clone = el.cloneNode(true) as HTMLElement;\r\n measureCard.appendChild(clone);\r\n const compStyle = window.getComputedStyle(clone);\r\n const mt = parseFloat(compStyle.marginTop) || 0;\r\n const mb = parseFloat(compStyle.marginBottom) || 0;\r\n const elH = clone.offsetHeight + mt + mb;\r\n\r\n const isHeading = isHeadingElement(el);\r\n\r\n // Lookahead for Keep-With-Next\r\n let nextContentH = 0;\r\n if (isHeading || hasMedia) {\r\n for (let j = i + 1; j < elements.length; j++) {\r\n const nextEl = elements[j];\r\n if (nextEl && (nextEl.textContent || '').trim().length > 0) {\r\n measureCard.innerHTML = '';\r\n const nClone = nextEl.cloneNode(true) as HTMLElement;\r\n measureCard.appendChild(nClone);\r\n const nStyle = window.getComputedStyle(nClone);\r\n nextContentH = nClone.offsetHeight + (parseFloat(nStyle.marginTop) || 0) + (parseFloat(nStyle.marginBottom) || 0);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n const remainingSpace = printableHeight - curHeight;\r\n const isLargeMedia = hasMedia && elH > 300;\r\n const keepWithNextOverflow = isHeading && nextContentH > 0 && (elH + nextContentH + 20 > remainingSpace);\r\n const largeMediaOverflow = isLargeMedia && curHeight > 0 && (elH + 80 > remainingSpace);\r\n const shouldBreak = (curHeight + elH > printableHeight || keepWithNextOverflow || largeMediaOverflow) && curCard.childNodes.length > 0;\r\n\r\n if (shouldBreak) {\r\n curCard = createPageCard(pages.length + 1);\r\n pages.push(curCard);\r\n curHeight = 0;\r\n }\r\n\r\n curCard.appendChild(el);\r\n curHeight += elH;\r\n }\r\n\r\n measureCard.remove();\r\n\r\n pageElements = pages.filter(card => {\r\n const hasText = (card.textContent || '').trim().length > 0;\r\n const hasCardMedia = card.querySelector('table, img, svg, canvas') !== null;\r\n return hasText || hasCardMedia;\r\n });\r\n\r\n if (pageElements.length === 0) {\r\n pageElements = [curCard];\r\n }\r\n\r\n wrapper.innerHTML = '';\r\n pageElements.forEach((card, idx) => {\r\n card.setAttribute('data-page-number', String(idx + 1));\r\n card.style.display = idx === 0 ? 'block' : 'none';\r\n wrapper.appendChild(card);\r\n });\r\n\r\n } catch (err) {\r\n console.warn('[RtfPlugin] RTF render error, fallback text:', err);\r\n const text = rawRtf;\r\n const rawPages = text.split(/\\\\page\\b/).map(segment => {\r\n return segment.replace(/\\\\par[d]?/g, '\\n').replace(/\\\\[a-zA-Z0-9\\-]+/g, '').replace(/[{}]/g, '').trim();\r\n }).filter(p => p.length > 0);\r\n\r\n const pages = rawPages.length > 0 ? rawPages : [text.replace(/\\\\par[d]?/g, '\\n').replace(/\\\\[a-zA-Z0-9\\-]+/g, '').replace(/[{}]/g, '').trim()];\r\n \r\n for (let i = 0; i < pages.length; i++) {\r\n const pageCard = document.createElement('div');\r\n pageCard.className = 'fp-rtf-page-card';\r\n pageCard.style.backgroundColor = '#ffffff';\r\n pageCard.style.boxShadow = '0 2px 12px rgba(0,0,0,0.08)';\r\n pageCard.style.borderRadius = '4px';\r\n pageCard.style.padding = `${padTop}px ${padRight}px ${padBottom}px ${padLeft}px`;\r\n pageCard.style.width = `${pageWidth}px`;\r\n pageCard.style.minHeight = `${pageHeight}px`;\r\n pageCard.style.boxSizing = 'border-box';\r\n pageCard.style.fontFamily = 'Calibri, \"Segoe UI\", Arial, sans-serif';\r\n pageCard.style.fontSize = '12pt';\r\n pageCard.style.lineHeight = '1.6';\r\n pageCard.style.color = '#1e293b';\r\n pageCard.style.whiteSpace = 'pre-wrap';\r\n pageCard.style.display = i === 0 ? 'block' : 'none';\r\n pageCard.textContent = pages[i];\r\n\r\n if (i === 1 && tables.length > 0) {\r\n tables.forEach(tbl => pageCard.appendChild(renderRtfTableElement(tbl)));\r\n }\r\n\r\n wrapper.appendChild(pageCard);\r\n pageElements.push(pageCard);\r\n }\r\n }\r\n\r\n const totalPages = Math.max(1, pageElements.length);\r\n let currentPage = 1;\r\n\r\n const showPage = (pageNum: number) => {\r\n currentPage = Math.max(1, Math.min(totalPages, pageNum));\r\n pageElements.forEach((el, idx) => {\r\n el.style.display = idx + 1 === currentPage ? 'block' : 'none';\r\n });\r\n ctx.container.scrollTop = 0;\r\n ctx.emit('page-change', { page: currentPage, total: totalPages });\r\n };\r\n\r\n if (totalPages > 1) {\r\n showPage(1);\r\n }\r\n\r\n const cleanup = () => {\r\n resizeObserver?.disconnect();\r\n scrollWrapper.remove();\r\n ctx.container.innerHTML = '';\r\n };\r\n\r\n ctx.signal.addEventListener('abort', cleanup);\r\n\r\n return {\r\n destroy: cleanup,\r\n getPageCount: () => totalPages,\r\n getCurrentPage: () => currentPage,\r\n goToPage: (page: number) => showPage(page),\r\n getThumbnails: async (): Promise<Thumbnail[]> => {\r\n const items: Thumbnail[] = [];\r\n for (let idx = 0; idx < totalPages; idx++) {\r\n const pageIdx = idx;\r\n items.push({\r\n index: pageIdx,\r\n label: `Page ${pageIdx + 1}`,\r\n render: async (canvas: HTMLCanvasElement) => {\r\n const ctx2d = canvas.getContext('2d');\r\n if (!ctx2d) return;\r\n canvas.width = 140;\r\n canvas.height = 180;\r\n ctx2d.fillStyle = '#ffffff';\r\n ctx2d.fillRect(0, 0, 140, 180);\r\n ctx2d.strokeStyle = '#cbd5e1';\r\n ctx2d.lineWidth = 1;\r\n ctx2d.strokeRect(0.5, 0.5, 139, 179);\r\n ctx2d.fillStyle = '#334155';\r\n ctx2d.font = 'bold 11px -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif';\r\n ctx2d.textAlign = 'center';\r\n ctx2d.fillText(`Page ${pageIdx + 1}`, 70, 95);\r\n }\r\n });\r\n }\r\n return items;\r\n },\r\n zoomIn: () => {\r\n isUserZoomed = true;\r\n scale += 0.15;\r\n applyTransform();\r\n },\r\n zoomOut: () => {\r\n isUserZoomed = true;\r\n scale = Math.max(0.2, scale - 0.15);\r\n applyTransform();\r\n },\r\n getZoom: () => scale,\r\n setZoom: (level: number) => {\r\n isUserZoomed = true;\r\n scale = level;\r\n applyTransform();\r\n },\r\n fitToPage: () => {\r\n isUserZoomed = false;\r\n fitMode = 'width';\r\n scale = calculateFitScale('width');\r\n rotation = 0;\r\n applyTransform();\r\n },\r\n resetZoom: () => {\r\n isUserZoomed = false;\r\n fitMode = 'width';\r\n scale = calculateFitScale('width');\r\n rotation = 0;\r\n ctx.container.scrollTop = 0;\r\n ctx.container.scrollLeft = 0;\r\n applyTransform();\r\n },\r\n rotateCW: () => {\r\n rotation = (rotation + 90) % 360;\r\n applyTransform();\r\n },\r\n rotateCCW: () => {\r\n rotation = (rotation - 90 + 360) % 360;\r\n applyTransform();\r\n },\r\n download: () => {\r\n const blob = new Blob([ctx.buffer], { type: 'application/rtf' });\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = ctx.metadata.name || 'document.rtf';\r\n a.click();\r\n URL.revokeObjectURL(url);\r\n },\r\n copy: () => {\r\n const text = wrapper.textContent || '';\r\n navigator.clipboard?.writeText(text);\r\n },\r\n print: () => {\r\n window.print();\r\n }\r\n };\r\n }\r\n}\r\n\r\nexport function rtfPlugin(): RtfPlugin {\r\n return new RtfPlugin();\r\n}\r\n\r\nexport default RtfPlugin;\r\n","import type { \r\n FileInfo, \r\n RenderContext, \r\n ToolbarAction, \r\n PreviewPlugin, \r\n PreviewInstance \r\n} from '@patel.sumit51/core';\r\nimport DOMPurify from 'dompurify';\r\n\r\nexport class HtmlPreviewPlugin implements PreviewPlugin {\r\n id = 'html-preview';\r\n name = 'HTML Document Preview';\r\n extensions = ['.html', '.htm', '.xhtml'];\r\n mimeTypes = ['text/html', 'application/xhtml+xml'];\r\n weight = 85;\r\n\r\n supports(file: FileInfo): boolean {\r\n const ext = file.metadata.extension?.toLowerCase();\r\n const mime = file.metadata.mimeType?.toLowerCase();\r\n return this.extensions.includes(ext || '') || this.mimeTypes.includes(mime || '');\r\n }\r\n\r\n getToolbarActions(instance: PreviewInstance): ToolbarAction[] {\r\n return [\r\n {\r\n id: 'zoom-out',\r\n icon: 'zoom-out',\r\n label: 'Zoom Out',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomOut?.()\r\n },\r\n {\r\n id: 'zoom-in',\r\n icon: 'zoom-in',\r\n label: 'Zoom In',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomIn?.()\r\n },\r\n {\r\n id: 'fit-page',\r\n icon: 'fit-page',\r\n label: 'Fit to Page',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.fitToPage?.()\r\n },\r\n {\r\n id: 'reset-zoom',\r\n icon: 'reset-zoom',\r\n label: 'Reset Zoom',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.resetZoom?.()\r\n },\r\n {\r\n id: 'copy',\r\n icon: 'copy',\r\n label: 'Copy HTML',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => (instance as any).copy?.()\r\n },\r\n {\r\n id: 'download',\r\n icon: 'download',\r\n label: 'Download',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => instance.download?.()\r\n },\r\n {\r\n id: 'print',\r\n icon: 'print',\r\n label: 'Print',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => instance.print?.()\r\n }\r\n ];\r\n }\r\n\r\n async render(ctx: RenderContext): Promise<PreviewInstance> {\r\n const rawHtml = new TextDecoder('utf-8').decode(ctx.buffer);\r\n const sanitized = DOMPurify.sanitize(rawHtml, {\r\n WHOLE_DOCUMENT: true,\r\n ADD_TAGS: ['style', 'link'],\r\n ADD_ATTR: ['target', 'rel']\r\n });\r\n\r\n const sizer = document.createElement('div');\r\n sizer.className = 'fp-html-sizer';\r\n sizer.style.position = 'relative';\r\n\r\n const iframe = document.createElement('iframe');\r\n iframe.className = 'fp-html-iframe';\r\n iframe.style.border = 'none';\r\n iframe.style.backgroundColor = '#ffffff';\r\n iframe.style.transformOrigin = 'top left';\r\n iframe.style.transition = 'transform 0.2s ease';\r\n // Sandbox without allow-scripts ensures no malicious JS can execute\r\n iframe.sandbox.add('allow-same-origin');\r\n\r\n sizer.appendChild(iframe);\r\n\r\n ctx.container.style.overflow = 'auto';\r\n ctx.container.style.width = '100%';\r\n ctx.container.style.height = '100%';\r\n ctx.container.innerHTML = '';\r\n ctx.container.appendChild(sizer);\r\n\r\n // Set sanitized content via srcdoc\r\n iframe.srcdoc = sanitized;\r\n\r\n let scale = 1.0;\r\n\r\n const applyTransform = () => {\r\n const baseW = Math.max(600, ctx.container.clientWidth || 800);\r\n const baseH = Math.max(400, ctx.container.clientHeight || 600);\r\n const scaledW = Math.round(baseW * scale);\r\n const scaledH = Math.round(baseH * scale);\r\n\r\n sizer.style.width = `${scaledW}px`;\r\n sizer.style.height = `${scaledH}px`;\r\n\r\n iframe.style.position = 'absolute';\r\n iframe.style.top = '0';\r\n iframe.style.left = '0';\r\n iframe.style.width = `${baseW}px`;\r\n iframe.style.height = `${baseH}px`;\r\n iframe.style.transform = `scale(${scale})`;\r\n iframe.style.transformOrigin = 'top left';\r\n };\r\n\r\n requestAnimationFrame(() => {\r\n applyTransform();\r\n });\r\n\r\n const cleanup = () => {\r\n sizer.remove();\r\n ctx.container.innerHTML = '';\r\n };\r\n\r\n ctx.signal.addEventListener('abort', cleanup);\r\n\r\n return {\r\n destroy: cleanup,\r\n zoomIn: () => {\r\n scale += 0.1;\r\n applyTransform();\r\n },\r\n zoomOut: () => {\r\n scale = Math.max(0.2, scale - 0.1);\r\n applyTransform();\r\n },\r\n getZoom: () => scale,\r\n setZoom: (level: number) => {\r\n scale = level;\r\n applyTransform();\r\n },\r\n fitToPage: () => {\r\n scale = 1.0;\r\n applyTransform();\r\n },\r\n resetZoom: () => {\r\n scale = 1.0;\r\n ctx.container.scrollTop = 0;\r\n ctx.container.scrollLeft = 0;\r\n applyTransform();\r\n },\r\n copy: () => {\r\n navigator.clipboard.writeText(rawHtml);\r\n },\r\n download: () => {\r\n const blob = new Blob([ctx.buffer], { type: 'text/html' });\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = ctx.metadata.name || 'document.html';\r\n a.click();\r\n URL.revokeObjectURL(url);\r\n },\r\n print: () => {\r\n iframe.contentWindow?.print();\r\n }\r\n } as any;\r\n }\r\n}\r\n\r\nexport function htmlPreviewPlugin(): HtmlPreviewPlugin {\r\n return new HtmlPreviewPlugin();\r\n}\r\n\r\nexport default HtmlPreviewPlugin;\r\n","import type { \r\n FileInfo, \r\n RenderContext, \r\n ToolbarAction, \r\n PreviewPlugin, \r\n PreviewInstance,\r\n Thumbnail\r\n} from '@patel.sumit51/core';\r\nimport { unzipSync, strFromU8 } from 'fflate';\r\nimport DOMPurify from 'dompurify';\r\n\r\nexport class OpenDocumentPlugin implements PreviewPlugin {\r\n id = 'opendocument';\r\n name = 'OpenDocument Preview (ODT, ODP, ODS, ODG, ODF)';\r\n extensions = ['.odt', '.odp', '.ods', '.odg', '.odf'];\r\n mimeTypes = [\r\n 'application/vnd.oasis.opendocument.text',\r\n 'application/vnd.oasis.opendocument.presentation',\r\n 'application/vnd.oasis.opendocument.spreadsheet',\r\n 'application/vnd.oasis.opendocument.graphics',\r\n 'application/vnd.oasis.opendocument.formula'\r\n ];\r\n weight = 80;\r\n\r\n supports(file: FileInfo): boolean {\r\n const ext = file.metadata.extension?.toLowerCase();\r\n const mime = file.metadata.mimeType?.toLowerCase();\r\n if (ext) {\r\n return this.extensions.includes(ext);\r\n }\r\n return this.mimeTypes.includes(mime || '');\r\n }\r\n\r\n getToolbarActions(instance: PreviewInstance): ToolbarAction[] {\r\n const isPresentation = (instance as any).isPresentation;\r\n const totalPages = instance.getPageCount?.() ?? 1;\r\n const actions: ToolbarAction[] = [];\r\n\r\n actions.push({\r\n id: 'thumbnails',\r\n icon: 'thumbnails',\r\n label: isPresentation ? 'Slide Thumbnails' : 'Page Thumbnails',\r\n type: 'button',\r\n group: 'navigation',\r\n execute: () => instance.toggleThumbnails?.()\r\n });\r\n\r\n actions.push({\r\n id: 'page-nav',\r\n icon: '',\r\n label: isPresentation ? 'Slide Navigation' : 'Page Navigation',\r\n type: 'page-nav',\r\n group: 'navigation',\r\n value: instance.getCurrentPage?.() ?? 1,\r\n max: totalPages,\r\n execute: (action: unknown, page?: unknown) => {\r\n const cur = instance.getCurrentPage?.() ?? 1;\r\n const max = instance.getPageCount?.() ?? 1;\r\n if (action === 'prev') {\r\n if (cur > 1) instance.goToPage?.(cur - 1);\r\n } else if (action === 'next') {\r\n if (cur < max) instance.goToPage?.(cur + 1);\r\n } else if (typeof page === 'number') {\r\n instance.goToPage?.(page);\r\n } else if (typeof action === 'number') {\r\n instance.goToPage?.(action);\r\n }\r\n }\r\n });\r\n\r\n actions.push(\r\n {\r\n id: 'zoom-out',\r\n icon: 'zoom-out',\r\n label: 'Zoom Out',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomOut?.()\r\n },\r\n {\r\n id: 'zoom-in',\r\n icon: 'zoom-in',\r\n label: 'Zoom In',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomIn?.()\r\n },\r\n {\r\n id: 'fit-page',\r\n icon: 'fit-page',\r\n label: isPresentation ? 'Fit to Slide' : 'Fit to Page',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.fitToPage?.()\r\n },\r\n {\r\n id: 'reset-zoom',\r\n icon: 'reset-zoom',\r\n label: 'Reset Zoom',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.resetZoom?.()\r\n },\r\n {\r\n id: 'rotate-cw',\r\n icon: 'rotate-cw',\r\n label: 'Rotate',\r\n type: 'button',\r\n group: 'view',\r\n execute: () => instance.rotateCW?.()\r\n },\r\n {\r\n id: 'download',\r\n icon: 'download',\r\n label: 'Download',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => instance.download?.()\r\n },\r\n {\r\n id: 'print',\r\n icon: 'print',\r\n label: 'Print',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => instance.print?.()\r\n },\r\n {\r\n id: 'open-window',\r\n icon: 'open-window',\r\n label: 'Open in Separate Full Window',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => (instance as any).openInSeparateWindow?.()\r\n }\r\n );\r\n\r\n return actions;\r\n }\r\n\r\n async render(ctx: RenderContext): Promise<PreviewInstance> {\r\n const ext = (ctx.metadata.extension || '').toLowerCase();\r\n const mime = (ctx.metadata.mimeType || '').toLowerCase();\r\n const isPresentation = ext === '.odp' || mime.includes('presentation');\r\n const isFormula = ext === '.odf' || mime.includes('formula');\r\n const isDrawing = ext === '.odg' || mime.includes('graphics');\r\n\r\n let unzipped: Record<string, Uint8Array>;\r\n try {\r\n unzipped = unzipSync(new Uint8Array(ctx.buffer));\r\n } catch {\r\n throw new Error('Failed to decompress OpenDocument package (invalid ZIP format)');\r\n }\r\n\r\n // Pre-cache embedded image URLs\r\n const imageUrls = new Map<string, string>();\r\n for (const [filePath, fileBytes] of Object.entries(unzipped)) {\r\n if (filePath.startsWith('Pictures/')) {\r\n const imageMime = filePath.endsWith('.png') ? 'image/png' :\r\n filePath.endsWith('.jpg') || filePath.endsWith('.jpeg') ? 'image/jpeg' :\r\n filePath.endsWith('.svg') ? 'image/svg+xml' : 'application/octet-stream';\r\n const blob = new Blob([fileBytes], { type: imageMime });\r\n imageUrls.set(filePath, URL.createObjectURL(blob));\r\n }\r\n }\r\n\r\n const contentXmlStr = unzipped['content.xml'] ? strFromU8(unzipped['content.xml']) : '';\r\n const stylesXmlStr = unzipped['styles.xml'] ? strFromU8(unzipped['styles.xml']) : '';\r\n\r\n const parser = new DOMParser();\r\n const contentDoc = parser.parseFromString(contentXmlStr, 'application/xml');\r\n const stylesDoc = stylesXmlStr ? parser.parseFromString(stylesXmlStr, 'application/xml') : null;\r\n\r\n // Extract styles map\r\n const styleMap = this.extractStyles(stylesDoc, contentDoc);\r\n\r\n const container = document.createElement('div');\r\n container.className = 'fp-odf-container';\r\n container.style.width = '100%';\r\n container.style.height = '100%';\r\n container.style.overflow = 'auto';\r\n container.style.backgroundColor = '#f1f5f9';\r\n\r\n const scrollWrapper = document.createElement('div');\r\n scrollWrapper.className = 'fp-odf-scroll-wrapper';\r\n scrollWrapper.style.minWidth = '100%';\r\n scrollWrapper.style.minHeight = '100%';\r\n scrollWrapper.style.width = 'max-content';\r\n scrollWrapper.style.height = 'max-content';\r\n scrollWrapper.style.display = 'flex';\r\n scrollWrapper.style.justifyContent = 'center';\r\n scrollWrapper.style.alignItems = 'flex-start';\r\n scrollWrapper.style.padding = '16px 8px';\r\n scrollWrapper.style.boxSizing = 'border-box';\r\n\r\n const sizer = document.createElement('div');\r\n sizer.className = 'fp-odf-sizer';\r\n sizer.style.position = 'relative';\r\n sizer.style.flexShrink = '0';\r\n sizer.style.display = 'flex';\r\n sizer.style.justifyContent = 'center';\r\n sizer.style.alignItems = 'center';\r\n\r\n const wrapper = document.createElement('div');\r\n wrapper.className = 'fp-odf-wrapper';\r\n wrapper.style.margin = '0 auto';\r\n wrapper.style.width = isPresentation ? '960px' : '816px';\r\n wrapper.style.boxSizing = 'border-box';\r\n wrapper.style.backgroundColor = '#ffffff';\r\n wrapper.style.boxShadow = '0 2px 10px rgba(0,0,0,0.08)';\r\n wrapper.style.borderRadius = '4px';\r\n wrapper.style.transformOrigin = 'center center';\r\n wrapper.style.transition = 'transform 0.15s ease';\r\n wrapper.style.flexShrink = '0';\r\n\r\n sizer.appendChild(wrapper);\r\n scrollWrapper.appendChild(sizer);\r\n container.appendChild(scrollWrapper);\r\n ctx.container.appendChild(container);\r\n\r\n let scale = 1.0;\r\n let rotation = 0;\r\n let isUserZoomed = false;\r\n let fitMode: 'width' | 'page' = ((ctx as any)?.options?.fitMode as any) || 'width';\r\n let currentPage = 1;\r\n let totalPages = 1;\r\n let slides: HTMLElement[] = [];\r\n\r\n const calculateFitScale = (mode: 'width' | 'page' = fitMode) => {\r\n const activeSlide = slides[currentPage - 1];\r\n const elW = isPresentation ? 960 : 816;\r\n const singlePageH = Math.min(activeSlide?.offsetHeight || wrapper.offsetHeight || 1056, Math.round(elW * 1.32));\r\n // Minimal side margins (16px on each side, safe from vertical scrollbar)\r\n const availW = Math.max(280, ctx.container.clientWidth - 32);\r\n const availH = Math.max(280, ctx.container.clientHeight - 32);\r\n\r\n const sW = availW / elW;\r\n const sH = availH / (isPresentation ? 540 : singlePageH);\r\n\r\n if (isPresentation) {\r\n return Math.min(2.5, Math.min(sW, sH));\r\n }\r\n\r\n if (mode === 'page') {\r\n return Math.max(0.35, Math.min(3.0, Math.min(sW, sH)));\r\n }\r\n return Math.max(0.4, Math.min(3.0, sW));\r\n };\r\n\r\n const applyTransform = () => {\r\n const activeSlide = slides[currentPage - 1];\r\n const elW = isPresentation ? 960 : 816;\r\n const baseH = activeSlide?.offsetHeight || wrapper.offsetHeight || 1056;\r\n const isRotated90 = (rotation % 180 !== 0);\r\n const boxW = Math.round((isRotated90 ? baseH : elW) * scale);\r\n const boxH = Math.round((isRotated90 ? elW : baseH) * scale);\r\n\r\n sizer.style.width = `${boxW}px`;\r\n sizer.style.height = `${boxH}px`;\r\n\r\n wrapper.style.width = `${elW}px`;\r\n wrapper.style.height = `${baseH}px`;\r\n wrapper.style.transform = `scale(${scale}) rotate(${rotation}deg)`;\r\n wrapper.style.transformOrigin = 'center center';\r\n };\r\n\r\n const resizeObserver = typeof ResizeObserver !== 'undefined'\r\n ? new ResizeObserver(() => {\r\n if (!isUserZoomed) {\r\n scale = calculateFitScale(fitMode);\r\n applyTransform();\r\n }\r\n })\r\n : null;\r\n resizeObserver?.observe(ctx.container);\r\n\r\n setTimeout(() => {\r\n scale = calculateFitScale(fitMode);\r\n applyTransform();\r\n }, 60);\r\n\r\n if (isPresentation) {\r\n // ODP (Presentation): render slides\r\n wrapper.style.maxWidth = '960px';\r\n wrapper.style.aspectRatio = '16 / 9';\r\n wrapper.style.position = 'relative';\r\n wrapper.style.overflow = 'hidden';\r\n\r\n slides = this.renderSlides(contentDoc, styleMap, imageUrls);\r\n totalPages = Math.max(1, slides.length);\r\n\r\n slides.forEach((slide, idx) => {\r\n slide.style.display = idx === 0 ? 'block' : 'none';\r\n slide.style.width = '100%';\r\n slide.style.height = '100%';\r\n slide.style.position = 'absolute';\r\n slide.style.top = '0';\r\n slide.style.left = '0';\r\n wrapper.appendChild(slide);\r\n });\r\n } else if (isFormula) {\r\n // ODF (Formula): extract MathML\r\n wrapper.style.maxWidth = '800px';\r\n wrapper.style.padding = '48px';\r\n wrapper.style.textAlign = 'center';\r\n wrapper.style.fontSize = '24px';\r\n\r\n const mathEl = contentDoc.querySelector('math');\r\n if (mathEl) {\r\n wrapper.innerHTML = mathEl.outerHTML;\r\n } else {\r\n wrapper.textContent = contentDoc.documentElement.textContent || 'Formula content';\r\n }\r\n } else {\r\n // ODT (Text), ODS (Spreadsheet fallback), ODG (Graphics)\r\n wrapper.style.maxWidth = 'none';\r\n wrapper.style.padding = '0';\r\n wrapper.style.minHeight = '100%';\r\n wrapper.style.backgroundColor = 'transparent';\r\n wrapper.style.boxShadow = 'none';\r\n wrapper.style.position = 'relative';\r\n\r\n const dims = this.getPageDimensions(stylesDoc, contentDoc);\r\n const bodyHtml = this.renderOdfBody(contentDoc, styleMap, imageUrls);\r\n \r\n const tempDiv = document.createElement('div');\r\n tempDiv.style.width = `${dims.width - dims.marginLeft - dims.marginRight}px`;\r\n tempDiv.style.position = 'absolute';\r\n tempDiv.style.visibility = 'hidden';\r\n tempDiv.innerHTML = DOMPurify.sanitize(bodyHtml, {\r\n ADD_TAGS: ['math', 'semantics', 'mrow', 'mi', 'mo', 'mn', 'msup', 'msub', 'hr'],\r\n ADD_ATTR: ['style', 'colspan', 'rowspan']\r\n });\r\n document.body.appendChild(tempDiv);\r\n \r\n const contentHeight = dims.height - dims.marginTop - dims.marginBottom;\r\n const pageElements: Element[][] = [[]];\r\n let currentHeight = 0;\r\n let currentPageIdx = 0;\r\n \r\n Array.from(tempDiv.children).forEach((child) => {\r\n const el = child as HTMLElement;\r\n const style = el.getAttribute('style') || '';\r\n const isBreakBefore = style.includes('page-break-before: always');\r\n const isBreakAfter = style.includes('page-break-after: always');\r\n const isSoftBreak = el.classList.contains('odf-page-break');\r\n \r\n if (isBreakBefore) {\r\n if (pageElements[currentPageIdx].length > 0) {\r\n currentPageIdx++;\r\n pageElements.push([]);\r\n currentHeight = 0;\r\n }\r\n }\r\n \r\n const h = el.offsetHeight || 0;\r\n if (currentHeight + h > contentHeight && pageElements[currentPageIdx].length > 0 && !isSoftBreak) {\r\n currentPageIdx++;\r\n pageElements.push([]);\r\n currentHeight = 0;\r\n }\r\n \r\n if (!isSoftBreak) {\r\n pageElements[currentPageIdx].push(el.cloneNode(true) as Element);\r\n currentHeight += h;\r\n }\r\n \r\n if (isBreakAfter || isSoftBreak) {\r\n currentPageIdx++;\r\n pageElements.push([]);\r\n currentHeight = 0;\r\n }\r\n });\r\n \r\n document.body.removeChild(tempDiv);\r\n \r\n if (pageElements.length > 1 && pageElements[pageElements.length - 1].length === 0) {\r\n pageElements.pop();\r\n }\r\n \r\n totalPages = Math.max(1, pageElements.length);\r\n \r\n pageElements.forEach((elements, idx) => {\r\n const page = document.createElement('div');\r\n page.className = `fp-odt-page fp-odt-page-${idx + 1}`;\r\n page.style.width = `${dims.width}px`;\r\n page.style.minHeight = `${dims.height}px`;\r\n page.style.padding = `${dims.marginTop}px ${dims.marginRight}px ${dims.marginBottom}px ${dims.marginLeft}px`;\r\n page.style.margin = '0 auto';\r\n page.style.backgroundColor = '#ffffff';\r\n page.style.boxShadow = '0 2px 10px rgba(0,0,0,0.08)';\r\n page.style.borderRadius = '4px';\r\n page.style.display = idx === 0 ? 'block' : 'none';\r\n page.style.margin = '0 auto 24px';\r\n page.style.boxShadow = '0 4px 24px rgba(0, 0, 0, 0.08)';\r\n \r\n elements.forEach(el => page.appendChild(el));\r\n wrapper.appendChild(page);\r\n slides.push(page);\r\n });\r\n }\r\n\r\n const cleanup = () => {\r\n resizeObserver?.disconnect();\r\n imageUrls.forEach(url => URL.revokeObjectURL(url));\r\n container.remove();\r\n ctx.container.innerHTML = '';\r\n };\r\n\r\n ctx.signal.addEventListener('abort', cleanup);\r\n\r\n const goToPage = (page: number) => {\r\n if (page < 1 || page > totalPages) return;\r\n currentPage = page;\r\n slides.forEach((s, idx) => {\r\n s.style.display = idx === page - 1 ? 'block' : 'none';\r\n });\r\n container.scrollTop = 0;\r\n ctx.emit('page-change', { page: currentPage, total: totalPages });\r\n };\r\n\r\n return {\r\n destroy: cleanup,\r\n isPresentation,\r\n zoomIn: () => {\r\n isUserZoomed = true;\r\n scale += 0.15;\r\n applyTransform();\r\n },\r\n zoomOut: () => {\r\n isUserZoomed = true;\r\n scale = Math.max(0.2, scale - 0.15);\r\n applyTransform();\r\n },\r\n getZoom: () => scale,\r\n setZoom: (level: number) => {\r\n isUserZoomed = true;\r\n scale = level;\r\n applyTransform();\r\n },\r\n fitToPage: () => {\r\n isUserZoomed = false;\r\n fitMode = 'width';\r\n scale = calculateFitScale('width');\r\n rotation = 0;\r\n applyTransform();\r\n },\r\n resetZoom: () => {\r\n isUserZoomed = false;\r\n fitMode = 'width';\r\n scale = calculateFitScale('width');\r\n rotation = 0;\r\n container.scrollTop = 0;\r\n container.scrollLeft = 0;\r\n applyTransform();\r\n },\r\n rotateCW: () => {\r\n rotation = (rotation + 90) % 360;\r\n applyTransform();\r\n },\r\n rotateCCW: () => {\r\n rotation = (rotation - 90 + 360) % 360;\r\n applyTransform();\r\n },\r\n goToPage,\r\n getPageCount: () => totalPages,\r\n getCurrentPage: () => currentPage,\r\n getThumbnails: async (): Promise<Thumbnail[]> => {\r\n const count = totalPages || slides.length || 1;\r\n const items: Thumbnail[] = [];\r\n for (let idx = 0; idx < count; idx++) {\r\n const itemIdx = idx;\r\n items.push({\r\n index: itemIdx,\r\n label: isPresentation ? `Slide ${itemIdx + 1}` : `Page ${itemIdx + 1}`,\r\n render: async (canvas: HTMLCanvasElement) => {\r\n const ctx2d = canvas.getContext('2d');\r\n if (!ctx2d) return;\r\n if (isPresentation) {\r\n canvas.width = 160;\r\n canvas.height = 90;\r\n ctx2d.fillStyle = '#f8fafc';\r\n ctx2d.fillRect(0, 0, 160, 90);\r\n ctx2d.strokeStyle = '#cbd5e1';\r\n ctx2d.lineWidth = 1;\r\n ctx2d.strokeRect(0.5, 0.5, 159, 89);\r\n ctx2d.fillStyle = '#334155';\r\n ctx2d.font = 'bold 11px sans-serif';\r\n ctx2d.textAlign = 'center';\r\n ctx2d.fillText(`Slide ${itemIdx + 1}`, 80, 50);\r\n } else {\r\n canvas.width = 140;\r\n canvas.height = 180;\r\n ctx2d.fillStyle = '#ffffff';\r\n ctx2d.fillRect(0, 0, 140, 180);\r\n ctx2d.strokeStyle = '#cbd5e1';\r\n ctx2d.lineWidth = 1;\r\n ctx2d.strokeRect(0.5, 0.5, 139, 179);\r\n ctx2d.fillStyle = '#64748b';\r\n ctx2d.font = 'bold 10px sans-serif';\r\n ctx2d.textAlign = 'center';\r\n ctx2d.fillText(`Page ${itemIdx + 1}`, 70, 90);\r\n }\r\n }\r\n });\r\n }\r\n return items;\r\n },\r\n download: () => {\r\n const mimeType = this.mimeTypes.find(m => m.includes(ext.replace('.', ''))) || 'application/octet-stream';\r\n const blob = new Blob([ctx.buffer], { type: mimeType });\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = ctx.metadata.name || `document${ext}`;\r\n a.click();\r\n URL.revokeObjectURL(url);\r\n },\r\n print: () => {\r\n window.print();\r\n }\r\n } as any;\r\n }\r\n\r\n private getPageDimensions(stylesDoc: Document | null, contentDoc: Document) {\r\n let width = 850;\r\n let height = 1123;\r\n let marginTop = 48;\r\n let marginBottom = 48;\r\n let marginLeft = 48;\r\n let marginRight = 48;\r\n\r\n const parseUnit = (val: string | null) => {\r\n if (!val) return null;\r\n if (val.endsWith('cm')) return parseFloat(val) * 37.8;\r\n if (val.endsWith('mm')) return parseFloat(val) * 3.78;\r\n if (val.endsWith('in')) return parseFloat(val) * 96;\r\n if (val.endsWith('pt')) return parseFloat(val) * 1.33;\r\n if (val.endsWith('px')) return parseFloat(val);\r\n return parseFloat(val);\r\n };\r\n\r\n const docs = [stylesDoc, contentDoc].filter(Boolean) as Document[];\r\n for (const doc of docs) {\r\n const pageLayout = doc.querySelector('page-layout-properties, [page-width]');\r\n if (pageLayout) {\r\n const w = parseUnit(pageLayout.getAttribute('fo:page-width') || pageLayout.getAttribute('page-width'));\r\n const h = parseUnit(pageLayout.getAttribute('fo:page-height') || pageLayout.getAttribute('page-height'));\r\n const mt = parseUnit(pageLayout.getAttribute('fo:margin-top') || pageLayout.getAttribute('margin-top'));\r\n const mb = parseUnit(pageLayout.getAttribute('fo:margin-bottom') || pageLayout.getAttribute('margin-bottom'));\r\n const ml = parseUnit(pageLayout.getAttribute('fo:margin-left') || pageLayout.getAttribute('margin-left'));\r\n const mr = parseUnit(pageLayout.getAttribute('fo:margin-right') || pageLayout.getAttribute('margin-right'));\r\n\r\n if (w !== null) width = w;\r\n if (h !== null) height = h;\r\n if (mt !== null) marginTop = mt;\r\n if (mb !== null) marginBottom = mb;\r\n if (ml !== null) marginLeft = ml;\r\n if (mr !== null) marginRight = mr;\r\n break;\r\n }\r\n }\r\n\r\n return { width, height, marginTop, marginBottom, marginLeft, marginRight };\r\n }\r\n\r\n private extractStyles(stylesDoc: Document | null, contentDoc: Document): Map<string, string> {\r\n const map = new Map<string, string>();\r\n const styleNodes: Element[] = [];\r\n\r\n if (stylesDoc) {\r\n styleNodes.push(...Array.from(stylesDoc.querySelectorAll('style, [name]')));\r\n }\r\n styleNodes.push(...Array.from(contentDoc.querySelectorAll('style, [name]')));\r\n\r\n for (const node of styleNodes) {\r\n const name = node.getAttribute('style:name') || node.getAttribute('name');\r\n if (!name) continue;\r\n\r\n let css = '';\r\n const textProp = node.querySelector('text-properties, [font-weight], [font-style], [color]');\r\n if (textProp) {\r\n const weight = textProp.getAttribute('fo:font-weight') || textProp.getAttribute('font-weight');\r\n const style = textProp.getAttribute('fo:font-style') || textProp.getAttribute('font-style');\r\n const color = textProp.getAttribute('fo:color') || textProp.getAttribute('color');\r\n const size = textProp.getAttribute('fo:font-size') || textProp.getAttribute('font-size');\r\n\r\n if (weight === 'bold') css += 'font-weight: bold; ';\r\n if (style === 'italic') css += 'font-style: italic; ';\r\n if (color) css += `color: ${color}; `;\r\n if (size) css += `font-size: ${size}; `;\r\n }\r\n\r\n let paraProp = node.querySelector('paragraph-properties, [text-align]');\r\n if (!paraProp) {\r\n paraProp = Array.from(node.children).find(c => c.tagName.includes('paragraph-properties')) || null;\r\n }\r\n if (paraProp) {\r\n const align = paraProp.getAttribute('fo:text-align') || paraProp.getAttribute('text-align');\r\n const mt = paraProp.getAttribute('fo:margin-top') || paraProp.getAttribute('margin-top');\r\n const mb = paraProp.getAttribute('fo:margin-bottom') || paraProp.getAttribute('margin-bottom');\r\n const breakBefore = paraProp.getAttribute('fo:break-before') || paraProp.getAttribute('break-before');\r\n const breakAfter = paraProp.getAttribute('fo:break-after') || paraProp.getAttribute('break-after');\r\n\r\n if (align) css += `text-align: ${align}; `;\r\n if (mt) css += `margin-top: ${mt}; `;\r\n if (mb) css += `margin-bottom: ${mb}; `;\r\n if (breakBefore === 'page') css += 'page-break-before: always; ';\r\n if (breakAfter === 'page') css += 'page-break-after: always; ';\r\n }\r\n\r\n if (css) map.set(name, css);\r\n }\r\n\r\n return map;\r\n }\r\n\r\n private renderOdfBody(contentDoc: Document, styles: Map<string, string>, images: Map<string, string>): string {\r\n const body = contentDoc.querySelector('body') || contentDoc.documentElement;\r\n let html = '';\r\n\r\n const walk = (node: Element) => {\r\n const tag = node.localName || node.tagName.toLowerCase();\r\n\r\n switch (tag) {\r\n case 'h': {\r\n const level = Math.min(6, Math.max(1, Number(node.getAttribute('text:outline-level') || 1)));\r\n const style = styles.get(node.getAttribute('text:style-name') || '') || '';\r\n html += `<h${level} style=\"${style}; margin: 18px 0 8px; color: #1e3a8a; font-family: Calibri, 'Segoe UI', Arial, sans-serif;\">${node.textContent || ''}</h${level}>`;\r\n break;\r\n }\r\n case 'p': {\r\n const style = styles.get(node.getAttribute('text:style-name') || '') || '';\r\n const inner = this.renderSpans(node, styles, images);\r\n const isInsideLi = node.parentElement?.localName === 'list-item' || node.parentElement?.tagName?.toLowerCase() === 'list-item';\r\n html += `<p style=\"${style}; line-height: 1.5; margin: ${isInsideLi ? '0' : '8px 0 12px'}; font-family: Calibri, 'Segoe UI', Arial, sans-serif;\">${inner}</p>`;\r\n break;\r\n }\r\n case 'list': {\r\n html += '<ul style=\"margin: 8px 0 12px; padding-left: 24px;\">';\r\n Array.from(node.children).forEach(c => walk(c));\r\n html += '</ul>';\r\n break;\r\n }\r\n case 'list-item': {\r\n html += '<li style=\"margin: 4px 0; font-size: 11pt; line-height: 1.5; color: #1e293b;\">';\r\n Array.from(node.children).forEach(c => walk(c));\r\n html += '</li>';\r\n break;\r\n }\r\n case 'table': {\r\n html += '<table style=\"border-collapse: collapse; width: 100%; margin: 16px 0; border: 1px solid #d0d7de;\">';\r\n Array.from(node.children).forEach(c => walk(c));\r\n html += '</table>';\r\n break;\r\n }\r\n case 'table-row': {\r\n html += '<tr>';\r\n Array.from(node.children).forEach(c => walk(c));\r\n html += '</tr>';\r\n break;\r\n }\r\n case 'table-cell': {\r\n html += '<td style=\"border: 1px solid #d0d7de; padding: 8px 12px; font-size: 13px;\">';\r\n Array.from(node.children).forEach(c => walk(c));\r\n html += '</td>';\r\n break;\r\n }\r\n default:\r\n Array.from(node.children).forEach(c => walk(c));\r\n }\r\n };\r\n\r\n Array.from(body.children).forEach(c => walk(c));\r\n\r\n return html || '<p style=\"color: #666; font-style: italic;\">(Document is empty)</p>';\r\n }\r\n\r\n private renderSpans(node: Element, styles: Map<string, string>, images: Map<string, string>): string {\r\n let result = '';\r\n\r\n for (const child of Array.from(node.childNodes)) {\r\n if (child.nodeType === Node.TEXT_NODE) {\r\n result += child.textContent || '';\r\n } else if (child.nodeType === Node.ELEMENT_NODE) {\r\n const el = child as Element;\r\n const tag = el.localName || el.tagName.toLowerCase();\r\n\r\n if (tag === 'span') {\r\n const style = styles.get(el.getAttribute('text:style-name') || '') || '';\r\n result += `<span style=\"${style}\">${el.textContent || ''}</span>`;\r\n } else if (tag === 'image') {\r\n const href = el.getAttribute('xlink:href') || el.getAttribute('href') || '';\r\n const blobUrl = images.get(href);\r\n if (blobUrl) {\r\n result += `<img src=\"${blobUrl}\" style=\"max-width: 100%; height: auto; margin: 8px 0;\" alt=\"Embedded image\" />`;\r\n }\r\n } else if (tag === 's') {\r\n const count = Number(el.getAttribute('text:c') || 1);\r\n result += ' '.repeat(count);\r\n } else if (tag === 'tab') {\r\n result += ' ';\r\n } else if (tag === 'line-break') {\r\n result += '<br/>';\r\n } else if (tag === 'soft-page-break') {\r\n result += '<hr class=\"odf-page-break\" style=\"page-break-after: always; border: none; margin: 0; padding: 0; height: 0;\" />';\r\n } else {\r\n result += el.textContent || '';\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private renderSlides(contentDoc: Document, styles: Map<string, string>, images: Map<string, string>): HTMLElement[] {\r\n const pages = Array.from(contentDoc.querySelectorAll('page, [draw\\\\:name]'));\r\n const slides: HTMLElement[] = [];\r\n\r\n const pageNodes = pages.length > 0 ? pages : Array.from(contentDoc.getElementsByTagNameNS('*', 'page'));\r\n\r\n if (pageNodes.length === 0) {\r\n const fallbackSlide = document.createElement('div');\r\n fallbackSlide.style.padding = '40px';\r\n fallbackSlide.style.textAlign = 'center';\r\n fallbackSlide.innerHTML = '<h2>Presentation</h2><p>No slides found</p>';\r\n return [fallbackSlide];\r\n }\r\n\r\n pageNodes.forEach((pageEl, idx) => {\r\n const slide = document.createElement('div');\r\n slide.className = `fp-odp-slide fp-odp-slide-${idx + 1}`;\r\n slide.style.padding = '40px';\r\n slide.style.boxSizing = 'border-box';\r\n slide.style.display = 'flex';\r\n slide.style.flexDirection = 'column';\r\n slide.style.justifyContent = 'center';\r\n slide.style.alignItems = 'center';\r\n slide.style.background = '#ffffff';\r\n\r\n const textFrames = Array.from(pageEl.querySelectorAll('frame, text-box, [draw\\\\:text-style-name]'));\r\n if (textFrames.length > 0) {\r\n textFrames.forEach((frame) => {\r\n const text = frame.textContent?.trim();\r\n if (text) {\r\n const p = document.createElement('div');\r\n p.style.margin = '12px 0';\r\n p.style.fontSize = idx === 0 ? '24px' : '16px';\r\n p.style.fontWeight = idx === 0 ? 'bold' : 'normal';\r\n p.style.color = '#1e293b';\r\n p.textContent = text;\r\n slide.appendChild(p);\r\n }\r\n });\r\n } else {\r\n slide.innerHTML = `<h3>Slide ${idx + 1}</h3><p>${pageEl.textContent?.trim() || ''}</p>`;\r\n }\r\n\r\n slides.push(slide);\r\n });\r\n\r\n return slides;\r\n }\r\n}\r\n\r\nexport function openDocumentPlugin(): OpenDocumentPlugin {\r\n return new OpenDocumentPlugin();\r\n}\r\n\r\nexport default OpenDocumentPlugin;\r\n","import type { \r\n FileInfo, \r\n RenderContext, \r\n ToolbarAction, \r\n PreviewPlugin, \r\n PreviewInstance \r\n} from '@patel.sumit51/core';\r\nimport { CfbfReader } from '@patel.sumit51/core';\r\nimport DOMPurify from 'dompurify';\r\nimport * as fflate from 'fflate';\r\n\r\nexport class DocPlugin implements PreviewPlugin {\r\n id = 'doc';\r\n name = 'Legacy Word Document Preview (.doc, .dot)';\r\n extensions = ['.doc', '.dot'];\r\n mimeTypes = ['application/msword', 'application/vnd.ms-word'];\r\n weight = 75;\r\n\r\n supports(file: FileInfo): boolean {\r\n const ext = file.metadata.extension?.toLowerCase();\r\n const mime = file.metadata.mimeType?.toLowerCase();\r\n if (ext) {\r\n return this.extensions.includes(ext);\r\n }\r\n return this.mimeTypes.includes(mime || '');\r\n }\r\n\r\n getToolbarActions(instance: PreviewInstance): ToolbarAction[] {\r\n const totalPages = instance.getPageCount?.() ?? 1;\r\n const actions: ToolbarAction[] = [];\r\n\r\n actions.push({\r\n id: 'page-nav',\r\n icon: '',\r\n label: 'Page Navigation',\r\n type: 'page-nav',\r\n group: 'navigation',\r\n value: instance.getCurrentPage?.() ?? 1,\r\n max: totalPages,\r\n execute: (action: unknown, page?: unknown) => {\r\n const cur = instance.getCurrentPage?.() ?? 1;\r\n const max = instance.getPageCount?.() ?? 1;\r\n if (action === 'prev') {\r\n if (cur > 1) instance.goToPage?.(cur - 1);\r\n } else if (action === 'next') {\r\n if (cur < max) instance.goToPage?.(cur + 1);\r\n } else if (typeof page === 'number') {\r\n instance.goToPage?.(page);\r\n }\r\n }\r\n });\r\n\r\n actions.push(\r\n {\r\n id: 'zoom-out',\r\n icon: 'zoom-out',\r\n label: 'Zoom Out',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomOut?.()\r\n },\r\n {\r\n id: 'zoom-in',\r\n icon: 'zoom-in',\r\n label: 'Zoom In',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomIn?.()\r\n },\r\n {\r\n id: 'fit-page',\r\n icon: 'fit-page',\r\n label: 'Fit to Page',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.fitToPage?.()\r\n },\r\n {\r\n id: 'reset-zoom',\r\n icon: 'reset-zoom',\r\n label: 'Reset Zoom',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.resetZoom?.()\r\n },\r\n {\r\n id: 'rotate-cw',\r\n icon: 'rotate-cw',\r\n label: 'Rotate',\r\n type: 'button',\r\n group: 'view',\r\n execute: () => instance.rotateCW?.()\r\n },\r\n {\r\n id: 'copy',\r\n icon: 'copy',\r\n label: 'Copy Text',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => (instance as any).copy?.()\r\n },\r\n {\r\n id: 'download',\r\n icon: 'download',\r\n label: 'Download',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => instance.download?.()\r\n },\r\n {\r\n id: 'print',\r\n icon: 'print',\r\n label: 'Print',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => instance.print?.()\r\n },\r\n {\r\n id: 'open-window',\r\n icon: 'open-window',\r\n label: 'Open in Separate Full Window',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => (instance as any).openInSeparateWindow?.()\r\n }\r\n );\r\n\r\n return actions;\r\n }\r\n\r\n async render(ctx: RenderContext): Promise<PreviewInstance> {\r\n const container = document.createElement('div');\r\n container.className = 'fp-doc-container';\r\n container.style.width = '100%';\r\n container.style.height = '100%';\r\n container.style.overflow = 'auto';\r\n container.style.backgroundColor = '#f1f5f9';\r\n\r\n const scrollWrapper = document.createElement('div');\r\n scrollWrapper.className = 'fp-doc-scroll-wrapper';\r\n scrollWrapper.style.minWidth = '100%';\r\n scrollWrapper.style.minHeight = '100%';\r\n scrollWrapper.style.width = 'max-content';\r\n scrollWrapper.style.height = 'max-content';\r\n scrollWrapper.style.display = 'flex';\r\n scrollWrapper.style.justifyContent = 'center';\r\n scrollWrapper.style.alignItems = 'flex-start';\r\n scrollWrapper.style.padding = '16px 8px';\r\n scrollWrapper.style.boxSizing = 'border-box';\r\n\r\n const sizer = document.createElement('div');\r\n sizer.className = 'fp-doc-sizer';\r\n sizer.style.position = 'relative';\r\n sizer.style.flexShrink = '0';\r\n sizer.style.display = 'flex';\r\n sizer.style.justifyContent = 'center';\r\n sizer.style.alignItems = 'center';\r\n\r\n scrollWrapper.appendChild(sizer);\r\n container.appendChild(scrollWrapper);\r\n ctx.container.appendChild(container);\r\n\r\n let scale = 1.0;\r\n let extractedRawText = '';\r\n let isFallback = false;\r\n let chartSvg = '';\r\n\r\n try {\r\n const cfbf = new CfbfReader(ctx.buffer);\r\n \r\n // Check for embedded OLE OpenDocument chart package\r\n try {\r\n const pkg = cfbf.readStream('package_stream');\r\n if (pkg && pkg.length > 100) {\r\n chartSvg = this.parseOdfChartToSvg(pkg);\r\n }\r\n } catch (chartErr) {\r\n console.warn('[DocPlugin] Chart stream parsing info:', chartErr);\r\n }\r\n\r\n const wordDocStream = cfbf.readStream('WordDocument');\r\n\r\n if (!wordDocStream || wordDocStream.length < 512) {\r\n throw new Error('WordDocument stream not found or invalid in CFBF archive');\r\n }\r\n\r\n // Check FIB to identify table stream\r\n const view = new DataView(wordDocStream.buffer, wordDocStream.byteOffset, wordDocStream.byteLength);\r\n const flags = view.getUint16(0x000A, true);\r\n const is1Table = (flags & 0x0200) !== 0;\r\n const tableName = is1Table ? '1Table' : '0Table';\r\n const tableStream = cfbf.readStream(tableName);\r\n\r\n const text = this.extractDocText(wordDocStream, tableStream);\r\n extractedRawText = text;\r\n } catch (err) {\r\n console.warn('[DocPlugin] Binary parsing error, fallback text:', err);\r\n // Fallback: search for readable strings directly in the buffer\r\n const fallback = this.heuristicTextExtraction(ctx.buffer);\r\n extractedRawText = fallback;\r\n isFallback = true;\r\n }\r\n\r\n const rawPages = this.splitIntoPages(extractedRawText, chartSvg);\r\n const totalPages = Math.max(1, rawPages.length);\r\n let currentPage = 1;\r\n\r\n const pageCards: HTMLElement[] = [];\r\n\r\n for (let i = 0; i < totalPages; i++) {\r\n const pageCard = document.createElement('div');\r\n pageCard.className = 'fp-doc-page-card';\r\n pageCard.style.width = '816px';\r\n pageCard.style.minHeight = '1056px';\r\n pageCard.style.backgroundColor = '#ffffff';\r\n pageCard.style.boxShadow = '0 4px 24px rgba(0,0,0,0.08)';\r\n pageCard.style.borderRadius = '4px';\r\n pageCard.style.padding = '72px 56px';\r\n pageCard.style.boxSizing = 'border-box';\r\n pageCard.style.display = i === 0 ? 'block' : 'none';\r\n pageCard.style.transformOrigin = 'center center';\r\n pageCard.style.transition = 'transform 0.15s ease';\r\n pageCard.style.fontFamily = 'Calibri, \"Segoe UI\", Arial, sans-serif';\r\n pageCard.style.color = '#1e293b';\r\n pageCard.style.flexShrink = '0';\r\n\r\n if (isFallback && i === 0) {\r\n pageCard.innerHTML = `\r\n <div style=\"border-bottom: 1px solid #e2e8f0; padding-bottom: 12px; margin-bottom: 24px;\">\r\n <h2 style=\"margin: 0 0 6px; font-size: 20px; color: #334155;\">${DOMPurify.sanitize(ctx.metadata.name || 'Word Document (.doc)')}</h2>\r\n <span style=\"font-size: 12px; color: #64748b; background: #f1f5f9; padding: 2px 8px; border-radius: 4px;\">Legacy Word 97-2003 Binary Preview</span>\r\n </div>\r\n ${this.formatDocToHtml(rawPages[i], ctx.metadata.name || 'Document')}\r\n `;\r\n } else {\r\n pageCard.innerHTML = this.formatDocToHtml(rawPages[i], ctx.metadata.name || 'Document');\r\n }\r\n\r\n sizer.appendChild(pageCard);\r\n pageCards.push(pageCard);\r\n }\r\n\r\n let rotation = 0;\r\n\r\n const applyTransform = () => {\r\n const activeCard = pageCards[currentPage - 1];\r\n if (activeCard) {\r\n const baseW = 816;\r\n const baseH = activeCard.offsetHeight || 1056;\r\n const isRotated90 = (rotation % 180 !== 0);\r\n const boxW = Math.round((isRotated90 ? baseH : baseW) * scale);\r\n const boxH = Math.round((isRotated90 ? baseW : baseH) * scale);\r\n\r\n sizer.style.width = `${boxW}px`;\r\n sizer.style.height = `${boxH}px`;\r\n\r\n activeCard.style.width = `${baseW}px`;\r\n activeCard.style.transform = `scale(${scale}) rotate(${rotation}deg)`;\r\n activeCard.style.transformOrigin = 'center center';\r\n }\r\n };\r\n\r\n const showPage = (pageNum: number) => {\r\n currentPage = Math.max(1, Math.min(totalPages, pageNum));\r\n pageCards.forEach((card, idx) => {\r\n if (idx + 1 === currentPage) {\r\n card.style.display = 'block';\r\n } else {\r\n card.style.display = 'none';\r\n }\r\n });\r\n applyTransform();\r\n container.scrollTop = 0;\r\n ctx.emit('page-change', { page: currentPage, total: totalPages });\r\n };\r\n\r\n if (totalPages > 1) {\r\n showPage(1);\r\n }\r\n\r\n let fitMode: 'width' | 'page' = ((ctx as any)?.options?.fitMode as any) || 'width';\r\n let isUserZoomed = false;\r\n\r\n const calculateFitScale = (mode: 'width' | 'page' = fitMode) => {\r\n const elW = 816;\r\n const elH = 1056;\r\n // Minimal side margins (16px on each side, safe from vertical scrollbar)\r\n const availW = Math.max(280, ctx.container.clientWidth - 32);\r\n const availH = Math.max(280, ctx.container.clientHeight - 32);\r\n\r\n const sW = availW / elW;\r\n const sH = availH / elH;\r\n\r\n if (mode === 'page') {\r\n return Math.max(0.35, Math.min(3.0, Math.min(sW, sH)));\r\n }\r\n return Math.max(0.4, Math.min(3.0, sW));\r\n };\r\n\r\n const resizeObserver = typeof ResizeObserver !== 'undefined'\r\n ? new ResizeObserver(() => {\r\n if (!isUserZoomed) {\r\n scale = calculateFitScale(fitMode);\r\n applyTransform();\r\n }\r\n })\r\n : null;\r\n resizeObserver?.observe(ctx.container);\r\n\r\n setTimeout(() => {\r\n scale = calculateFitScale(fitMode);\r\n applyTransform();\r\n }, 60);\r\n\r\n const cleanup = () => {\r\n resizeObserver?.disconnect();\r\n container.remove();\r\n ctx.container.innerHTML = '';\r\n };\r\n\r\n ctx.signal.addEventListener('abort', cleanup);\r\n\r\n return {\r\n destroy: cleanup,\r\n getPageCount: () => totalPages,\r\n getCurrentPage: () => currentPage,\r\n goToPage: (page: number) => showPage(page),\r\n zoomIn: () => {\r\n isUserZoomed = true;\r\n scale += 0.15;\r\n applyTransform();\r\n },\r\n zoomOut: () => {\r\n isUserZoomed = true;\r\n scale = Math.max(0.2, scale - 0.15);\r\n applyTransform();\r\n },\r\n getZoom: () => scale,\r\n setZoom: (level: number) => {\r\n isUserZoomed = true;\r\n scale = level;\r\n applyTransform();\r\n },\r\n fitToPage: () => {\r\n isUserZoomed = false;\r\n fitMode = 'width';\r\n scale = calculateFitScale('width');\r\n rotation = 0;\r\n applyTransform();\r\n },\r\n resetZoom: () => {\r\n isUserZoomed = false;\r\n fitMode = 'width';\r\n scale = calculateFitScale('width');\r\n rotation = 0;\r\n container.scrollTop = 0;\r\n container.scrollLeft = 0;\r\n ctx.container.scrollTop = 0;\r\n ctx.container.scrollLeft = 0;\r\n applyTransform();\r\n },\r\n rotateCW: () => {\r\n rotation = (rotation + 90) % 360;\r\n applyTransform();\r\n },\r\n rotateCCW: () => {\r\n rotation = (rotation - 90 + 360) % 360;\r\n applyTransform();\r\n },\r\n copy: () => {\r\n navigator.clipboard.writeText(extractedRawText);\r\n },\r\n download: () => {\r\n const blob = new Blob([ctx.buffer], { type: 'application/msword' });\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = ctx.metadata.name || 'document.doc';\r\n a.click();\r\n URL.revokeObjectURL(url);\r\n },\r\n print: () => {\r\n window.print();\r\n }\r\n } as any;\r\n }\r\n\r\n /**\r\n * Extract document text from WordDocument stream and Table stream\r\n */\r\n private extractDocText(wordDoc: Uint8Array, tableStream: Uint8Array | null): string {\r\n const view = new DataView(wordDoc.buffer, wordDoc.byteOffset, wordDoc.byteLength);\r\n\r\n // Read fcClx offset and lcbClx length from FIB\r\n // In Word 97-2003, fcClx is at offset 0x01A2 (418), lcbClx is at 0x01A6 (422)\r\n let fcClx = 0;\r\n let lcbClx = 0;\r\n if (wordDoc.length >= 0x01AA) {\r\n fcClx = view.getUint32(0x01A2, true);\r\n lcbClx = view.getUint32(0x01A6, true);\r\n }\r\n\r\n // If CLX is found in table stream, parse Piece Table\r\n if (tableStream && fcClx > 0 && lcbClx > 0 && fcClx + lcbClx <= tableStream.length) {\r\n try {\r\n const text = this.parsePieceTable(wordDoc, tableStream, fcClx, lcbClx);\r\n if (text && text.trim().length > 0) return text;\r\n } catch (err) {\r\n console.warn('[DocPlugin] Error in piece table parsing:', err);\r\n }\r\n }\r\n\r\n // Fallback: Word 97-2003 documents place the main text beginning at offset 0x0A00 (2560)\r\n // up to the table stream or end of main stream.\r\n if (wordDoc.length > 0x0A00) {\r\n const textChunk = wordDoc.subarray(0x0A00);\r\n const extracted = this.extractStringsFromBytes(textChunk);\r\n if (extracted.trim().length > 0) return extracted;\r\n }\r\n\r\n return this.extractStringsFromBytes(wordDoc);\r\n }\r\n\r\n /**\r\n * Parse the CLX and Piece Table (Plcfpcd) according to [MS-DOC]\r\n */\r\n private parsePieceTable(wordDoc: Uint8Array, table: Uint8Array, fcClx: number, lcbClx: number): string {\r\n let offset = fcClx;\r\n const end = fcClx + lcbClx;\r\n\r\n // Skip PRC records until we find clxt = 0x02 (Pcdt)\r\n while (offset < end) {\r\n const clxt = table[offset];\r\n if (clxt === 0x01) {\r\n // Grpprl\r\n const cb = new DataView(table.buffer, table.byteOffset + offset + 1).getUint16(0, true);\r\n offset += 3 + cb;\r\n } else if (clxt === 0x02) {\r\n // Pcdt (Piece table descriptor)\r\n offset += 1;\r\n const lcb = new DataView(table.buffer, table.byteOffset + offset).getUint32(0, true);\r\n offset += 4;\r\n return this.readPlcfpcd(wordDoc, table, offset, lcb);\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n return '';\r\n }\r\n\r\n private readPlcfpcd(wordDoc: Uint8Array, table: Uint8Array, offset: number, lcb: number): string {\r\n const view = new DataView(table.buffer, table.byteOffset + offset);\r\n // Number of pieces: lcb = 4*(n+1) + 8*n => 12*n + 4 = lcb => n = (lcb - 4) / 12\r\n const n = Math.floor((lcb - 4) / 12);\r\n if (n <= 0) return '';\r\n\r\n const cpOffsets: number[] = [];\r\n for (let i = 0; i <= n; i++) {\r\n cpOffsets.push(view.getUint32(i * 4, true));\r\n }\r\n\r\n const pcdOffset = (n + 1) * 4;\r\n let fullText = '';\r\n\r\n for (let i = 0; i < n; i++) {\r\n const fc = view.getUint32(pcdOffset + i * 8 + 2, true);\r\n const isCompressed = (fc & 0x40000000) !== 0;\r\n const byteOffset = (fc & 0x3fffffff) >> (isCompressed ? 1 : 0);\r\n const charCount = cpOffsets[i + 1] - cpOffsets[i];\r\n\r\n if (isCompressed) {\r\n // 8-bit ANSI characters\r\n const slice = wordDoc.subarray(byteOffset, byteOffset + charCount);\r\n fullText += new TextDecoder('latin1').decode(slice);\r\n } else {\r\n // 16-bit UTF-16LE characters\r\n const slice = wordDoc.subarray(byteOffset, byteOffset + charCount * 2);\r\n fullText += new TextDecoder('utf-16le').decode(slice);\r\n }\r\n }\r\n\r\n return fullText;\r\n }\r\n\r\n /**\r\n * Scans a byte array for continuous sequences of readable characters (ANSI and UTF-16LE)\r\n */\r\n private extractStringsFromBytes(bytes: Uint8Array): string {\r\n const rawAnsi = new TextDecoder('latin1').decode(bytes);\r\n const rawUtf16 = new TextDecoder('utf-16le', { fatal: false }).decode(bytes);\r\n\r\n // Extract meaningful runs of ASCII text (length >= 4)\r\n const ansiRuns = rawAnsi.match(/[\\x20-\\x7E\\t\\r\\n]{4,}/g) || [];\r\n const utf16Runs = rawUtf16.match(/[\\x20-\\x7E\\t\\r\\n]{4,}/g) || [];\r\n\r\n const candidateLines: string[] = [];\r\n const seen = new Set<string>();\r\n\r\n for (const run of [...ansiRuns, ...utf16Runs]) {\r\n const trimmed = run.trim();\r\n // Must contain at least one letter and have reasonable length\r\n if (trimmed.length >= 4 && /[a-zA-Z]/.test(trimmed) && !seen.has(trimmed)) {\r\n // Exclude internal Word structures / headers\r\n if (\r\n !trimmed.includes('Normal.dot') &&\r\n !trimmed.includes('Microsoft Word') &&\r\n !trimmed.includes('Times New Roman') &&\r\n !trimmed.startsWith('ÐÏࡱá') &&\r\n !/^EMBED\\b/i.test(trimmed) &&\r\n !trimmed.includes('ChartDocument') &&\r\n !/^[\\W_0-9]+$/.test(trimmed)\r\n ) {\r\n seen.add(trimmed);\r\n candidateLines.push(trimmed);\r\n }\r\n }\r\n }\r\n\r\n return candidateLines.join('\\n\\n');\r\n }\r\n\r\n private heuristicTextExtraction(buffer: ArrayBuffer): string {\r\n return this.extractStringsFromBytes(new Uint8Array(buffer));\r\n }\r\n\r\n /**\r\n * Parses an embedded OpenDocument Chart package into a vector SVG bar/column chart\r\n */\r\n private parseOdfChartToSvg(zipBytes: Uint8Array): string {\r\n try {\r\n const unzipped = fflate.unzipSync(zipBytes);\r\n const contentXml = unzipped['content.xml'] ? new TextDecoder('utf-8').decode(unzipped['content.xml']) : '';\r\n if (!contentXml) return '';\r\n\r\n // Extract categories and series data from local-table\r\n const rowsMatch = contentXml.match(/<table:table-row[\\s\\S]*?<\\/table:table-row>/g) || [];\r\n if (rowsMatch.length < 2) return '';\r\n\r\n // Header row has series names\r\n const headers: string[] = [];\r\n const firstRow = rowsMatch[0];\r\n const headerCells = firstRow ? (firstRow.match(/<text:p>([^<]+)<\\/text:p>/g) || []) : [];\r\n for (const h of headerCells) {\r\n headers.push(h.replace(/<\\/?text:p>/g, '').trim());\r\n }\r\n\r\n // Data rows\r\n const categories: string[] = [];\r\n const seriesValues: number[][] = headers.map(() => []);\r\n\r\n for (let r = 1; r < rowsMatch.length; r++) {\r\n const rowStr = rowsMatch[r];\r\n if (!rowStr) continue;\r\n const cells = rowStr.match(/<table:table-cell[\\s\\S]*?<\\/table:table-cell>/g) || [];\r\n if (cells.length > 0 && cells[0]) {\r\n const catMatch = cells[0].match(/<text:p>([^<]+)<\\/text:p>/);\r\n categories.push(catMatch ? catMatch[1] : 'Row ' + r);\r\n\r\n for (let c = 1; c < cells.length && (c - 1) < headers.length; c++) {\r\n const cellStr = cells[c];\r\n if (!cellStr) continue;\r\n const valMatch = cellStr.match(/office:value=\"([0-9.]+)\"/) || cellStr.match(/<text:p>([0-9.]+)<\\/text:p>/);\r\n const series = seriesValues[c - 1];\r\n if (series) {\r\n series.push(valMatch ? parseFloat(valMatch[1]) : 0);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Extract colors from styles or use standard palette\r\n const colors = ['#004586', '#ff420e', '#ffd320', '#579d1c', '#7e0021'];\r\n const colorMatches = contentXml.matchAll(/draw:fill-color=\"(#[0-9a-fA-F]{6})\"/g);\r\n let cIdx = 0;\r\n for (const cm of colorMatches) {\r\n if (cIdx < colors.length) colors[cIdx] = cm[1];\r\n cIdx++;\r\n }\r\n\r\n // Find max value\r\n let maxVal = 10;\r\n for (const s of seriesValues) {\r\n for (const v of s) {\r\n if (v > maxVal) maxVal = v;\r\n }\r\n }\r\n maxVal = Math.ceil(maxVal * 1.15);\r\n\r\n // Build SVG\r\n const width = 560;\r\n const height = 280;\r\n const padLeft = 45;\r\n const padRight = 100;\r\n const padTop = 20;\r\n const padBottom = 40;\r\n const chartW = width - padLeft - padRight;\r\n const chartH = height - padTop - padBottom;\r\n\r\n let svg = `<svg viewBox=\"0 0 ${width} ${height}\" width=\"100%\" height=\"auto\" style=\"max-width: 560px; height: 280px; margin: 16px auto; display: block; font-family: Calibri, sans-serif; background: #ffffff; border: 1px solid #e2e8f0; border-radius: 6px; box-shadow: 0 1px 4px rgba(0,0,0,0.05);\">`;\r\n\r\n // Grid lines & Y axis labels (4 steps)\r\n for (let step = 0; step <= 4; step++) {\r\n const yVal = ((maxVal / 4) * step).toFixed(1);\r\n const yPos = padTop + chartH - (step / 4) * chartH;\r\n svg += `<line x1=\"${padLeft}\" y1=\"${yPos}\" x2=\"${padLeft + chartW}\" y2=\"${yPos}\" stroke=\"#e2e8f0\" stroke-dasharray=\"2,2\" />`;\r\n svg += `<text x=\"${padLeft - 8}\" y=\"${yPos + 4}\" font-size=\"11\" fill=\"#64748b\" text-anchor=\"end\">${yVal}</text>`;\r\n }\r\n\r\n // Bars\r\n const numCats = categories.length;\r\n const numSeries = headers.length;\r\n const groupW = chartW / numCats;\r\n const barW = Math.max(8, (groupW * 0.7) / numSeries);\r\n const groupPad = (groupW - (barW * numSeries)) / 2;\r\n\r\n for (let catIdx = 0; catIdx < numCats; catIdx++) {\r\n const groupX = padLeft + catIdx * groupW + groupPad;\r\n\r\n for (let sIdx = 0; sIdx < numSeries; sIdx++) {\r\n const val = seriesValues[sIdx][catIdx] || 0;\r\n const barH = (val / maxVal) * chartH;\r\n const barX = groupX + sIdx * barW;\r\n const barY = padTop + chartH - barH;\r\n const col = colors[sIdx % colors.length];\r\n\r\n svg += `<rect x=\"${barX}\" y=\"${barY}\" width=\"${barW - 2}\" height=\"${barH}\" fill=\"${col}\" rx=\"2\"><title>${headers[sIdx]}: ${val}</title></rect>`;\r\n }\r\n\r\n // X axis category label\r\n const catX = padLeft + catIdx * groupW + (groupW / 2);\r\n svg += `<text x=\"${catX}\" y=\"${padTop + chartH + 18}\" font-size=\"11\" fill=\"#475569\" text-anchor=\"middle\">${categories[catIdx]}</text>`;\r\n }\r\n\r\n // Legend on the right\r\n let legendY = padTop + 20;\r\n for (let sIdx = 0; sIdx < numSeries; sIdx++) {\r\n const col = colors[sIdx % colors.length];\r\n svg += `<rect x=\"${padLeft + chartW + 15}\" y=\"${legendY}\" width=\"12\" height=\"12\" fill=\"${col}\" rx=\"2\" />`;\r\n svg += `<text x=\"${padLeft + chartW + 32}\" y=\"${legendY + 10}\" font-size=\"11\" fill=\"#334155\">${headers[sIdx]}</text>`;\r\n legendY += 20;\r\n }\r\n\r\n svg += '</svg>';\r\n return svg;\r\n } catch (e) {\r\n console.warn('[DocPlugin] Error generating chart SVG:', e);\r\n return '';\r\n }\r\n }\r\n\r\n private cleanWordDocFields(text: string, chartSvg: string = ''): string {\r\n if (!text) return '';\r\n\r\n // 1. Replace EMBED fields with vector SVG chart or remove\r\n let cleaned = text.replace(\r\n /\\x13\\s*EMBED\\b[\\s\\S]*?\\x15/gi,\r\n () => chartSvg ? `\\n\\n${chartSvg}\\n\\n` : ''\r\n );\r\n\r\n // 2. Convert hyperlinks: \\x13 HYPERLINK \"url\" \\x14 display text \\x15\r\n cleaned = cleaned.replace(\r\n /\\x13\\s*HYPERLINK\\s*\"?([^\"\\x14]+)\"?\\s*\\x14([\\s\\S]*?)\\x15/gi,\r\n (_match, url, label) => {\r\n const cleanUrl = url.trim();\r\n const cleanLabel = label.trim() || cleanUrl;\r\n return `<a href=\"${cleanUrl}\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"color: #2563eb; text-decoration: underline;\">${cleanLabel}</a>`;\r\n }\r\n );\r\n\r\n // 3. For other fields (PAGE, NUMPAGES, DATE, etc.): keep result only if printable\r\n cleaned = cleaned.replace(/\\x13[^\\x14\\x15]*\\x14([^\\x15]*)\\x15/g, (_m, res) => {\r\n if (/[\\x00-\\x1F]/.test(res)) return '';\r\n return res.trim();\r\n });\r\n\r\n // 4. Remove any remaining raw field instructions\r\n cleaned = cleaned.replace(/\\x13[^\\x15]*\\x15/g, '');\r\n cleaned = cleaned.replace(/[\\x13\\x14\\x15]/g, '');\r\n\r\n // 5. Remove any unprintable control characters except \\t, \\n, \\r\r\n cleaned = cleaned.replace(/[\\x00-\\x08\\x0B-\\x0C\\x0E-\\x1F\\x7F]/g, '');\r\n\r\n // 6. Clean any raw leftover \"EMBED LibreOffice.ChartDocument...\"\r\n cleaned = cleaned.replace(/EMBED\\s+LibreOffice\\.ChartDocument\\.[0-9]+/gi, chartSvg || '');\r\n\r\n return cleaned;\r\n }\r\n\r\n private splitIntoPages(text: string, chartSvg: string = ''): string[] {\r\n if (!text) return [''];\r\n \r\n const cleanedText = this.cleanWordDocFields(text, chartSvg);\r\n\r\n // Normalize \\r\\n, \\r, and Word 97 table marks (\\x07)\r\n const normalized = cleanedText\r\n .replace(/\\r\\n/g, '\\n')\r\n .replace(/\\r/g, '\\n')\r\n .replace(/\\x0B/g, '\\n')\r\n .replace(/\\x07\\n/g, '\\n')\r\n .replace(/\\x07/g, '\\t');\r\n\r\n // Split by explicit form feeds or page break text first\r\n const explicitParts = normalized.split(/[\\x0C\\f]|\\n\\s*[-=_]{3,}\\s*(?:PAGE|Page|page break)[\\s\\d\\w-]*[-=_]{3,}\\s*\\n/i)\r\n .map(p => p.trim())\r\n .filter(p => p.length > 0);\r\n \r\n if (explicitParts.length === 0) explicitParts.push(normalized);\r\n \r\n const maxLinesPerPage = 34;\r\n const charsPerLine = 80;\r\n const finalPages: string[] = [];\r\n \r\n for (const part of explicitParts) {\r\n const lines = part.split('\\n');\r\n let currentLines: string[] = [];\r\n let count = 0;\r\n \r\n for (const line of lines) {\r\n // If this line contains the SVG chart, account for its height\r\n const isSvg = line.includes('<svg');\r\n const vLines = isSvg ? 12 : Math.max(1, Math.ceil((line.replace(/<[^>]+>/g, '').length || 1) / charsPerLine));\r\n if (count + vLines > maxLinesPerPage && currentLines.length > 0) {\r\n finalPages.push(currentLines.join('\\n'));\r\n currentLines = [];\r\n count = 0;\r\n }\r\n currentLines.push(line);\r\n count += vLines;\r\n }\r\n if (currentLines.length > 0) {\r\n finalPages.push(currentLines.join('\\n'));\r\n }\r\n }\r\n \r\n return finalPages.length > 0 ? finalPages : [normalized];\r\n }\r\n\r\n /**\r\n * Format cleaned extracted text into attractive HTML paragraphs, headings, and lists\r\n */\r\n private formatDocToHtml(text: string, filename: string): string {\r\n // Normalize newlines and replace word internal codes\r\n const lines = text\r\n .replace(/\\r\\n/g, '\\n')\r\n .replace(/\\r/g, '\\n')\r\n .replace(/\\x0B/g, '\\n')\r\n .replace(/\\x07\\n/g, '\\n')\r\n .replace(/\\x07/g, '\\t')\r\n .split('\\n');\r\n\r\n let html = '';\r\n let inList = false;\r\n let tableLines: string[] = [];\r\n \r\n const flushTable = () => {\r\n if (tableLines.length > 0) {\r\n html += '<table style=\"width: 100%; border-collapse: collapse; margin: 16px 0; font-size: 13px; font-family: Calibri, sans-serif;\">';\r\n for (let rIdx = 0; rIdx < tableLines.length; rIdx++) {\r\n const tLine = tableLines[rIdx];\r\n const isHeader = rIdx === 0;\r\n html += `<tr style=\"${isHeader ? 'background-color: #f8fafc; font-weight: 600;' : ''}\">`;\r\n const cols = tLine.split('\\t').filter(c => c.trim().length > 0);\r\n for (const col of cols) {\r\n html += `<td style=\"border: 1px solid #cbd5e1; padding: 8px 12px;\">${DOMPurify.sanitize(col.trim())}</td>`;\r\n }\r\n html += '</tr>';\r\n }\r\n html += '</table>';\r\n tableLines = [];\r\n }\r\n };\r\n\r\n const sanitizeOptions = {\r\n ADD_TAGS: ['a', 'svg', 'g', 'path', 'line', 'rect', 'circle', 'text', 'title'],\r\n ADD_ATTR: [\r\n 'href', 'target', 'rel', 'style', 'viewBox', 'width', 'height', 'x', 'y',\r\n 'x1', 'y1', 'x2', 'y2', 'fill', 'stroke', 'stroke-width', 'stroke-dasharray',\r\n 'rx', 'font-size', 'text-anchor'\r\n ]\r\n };\r\n\r\n let i = 0;\r\n while (i < lines.length) {\r\n let line = lines[i];\r\n\r\n // If line contains embedded SVG chart, insert it directly\r\n if (line.includes('<svg')) {\r\n if (inList) { html += '</ul>'; inList = false; }\r\n flushTable();\r\n html += line;\r\n i++;\r\n continue;\r\n }\r\n\r\n let tabCount = (line.match(/\\t/g) || []).length;\r\n \r\n // Table detection: line contains tabs\r\n if (tabCount > 0) {\r\n let j = i;\r\n while (j < lines.length && (lines[j].match(/\\t/g) || []).length > 0) {\r\n j++;\r\n }\r\n if (inList) { html += '</ul>'; inList = false; }\r\n tableLines = lines.slice(i, j);\r\n flushTable();\r\n i = j;\r\n continue;\r\n }\r\n \r\n line = line.trim();\r\n \r\n if (!line) {\r\n if (inList) { html += '</ul>'; inList = false; }\r\n html += '<div style=\"height: 1.15em;\"></div>';\r\n i++;\r\n continue;\r\n }\r\n\r\n if (/^[\\x00-\\x1F\\x7F-\\x9F]+$/.test(line)) { i++; continue; }\r\n if ((line.includes('Normal.dot') || line.includes('Microsoft Word') || line.includes('Times New Roman')) && line.length < 30) {\r\n i++; continue;\r\n }\r\n\r\n // Drop stray single numbers (leftover field codes or font size tokens like '11')\r\n if (/^\\d{1,2}$/.test(line.trim())) { i++; continue; }\r\n\r\n const isShortLine = line.length < 60 && !line.endsWith('.') && !line.endsWith(',');\r\n const isTitleLike = isShortLine && (\r\n /^[A-Z0-9\\s:_-]+$/.test(line) ||\r\n line.startsWith('#') ||\r\n /^(?:Chapter|Section|Part|\\d+\\.)\\b/i.test(line) ||\r\n /^[A-Z][a-zA-Z0-9\\s#:-]{2,45}$/.test(line)\r\n );\r\n\r\n if (isTitleLike) {\r\n if (inList) { html += '</ul>'; inList = false; }\r\n html += `<h2 style=\"font-size: 18px; font-weight: 700; color: #1e3a8a; margin: 18px 0 10px; border-bottom: 1px solid #e2e8f0; padding-bottom: 4px;\">${DOMPurify.sanitize(line, sanitizeOptions)}</h2>`;\r\n } else if (line.startsWith('•') || line.startsWith('-') || line.startsWith('*')) {\r\n if (!inList) {\r\n html += '<ul style=\"margin: 8px 0 12px; padding-left: 24px;\">';\r\n inList = true;\r\n }\r\n const bulletText = line.replace(/^[•\\-\\*]\\s*/, '');\r\n html += `<li style=\"margin: 4px 0; line-height: 1.5; font-size: 11pt; color: #1e293b;\">${DOMPurify.sanitize(bulletText, sanitizeOptions)}</li>`;\r\n } else {\r\n if (inList) { html += '</ul>'; inList = false; }\r\n // Standard Microsoft Word paragraph spacing (1.5 line height, 11pt font, 12px bottom margin)\r\n html += `<p style=\"line-height: 1.5; margin: 0 0 12px 0; font-size: 11pt; color: #1e293b; text-align: justify;\">${DOMPurify.sanitize(line, sanitizeOptions)}</p>`;\r\n }\r\n \r\n i++;\r\n }\r\n\r\n if (inList) html += '</ul>';\r\n flushTable();\r\n\r\n return html || `<p style=\"color: #64748b; font-style: italic;\">(No readable text found in ${DOMPurify.sanitize(filename)})</p>`;\r\n }\r\n}\r\n\r\nexport function docPlugin(): DocPlugin {\r\n return new DocPlugin();\r\n}\r\n\r\nexport default DocPlugin;\r\n","import type { \r\n FileInfo, \r\n RenderContext, \r\n ToolbarAction, \r\n PreviewPlugin, \r\n PreviewInstance,\r\n Thumbnail\r\n} from '@patel.sumit51/core';\r\nimport { CfbfReader } from '@patel.sumit51/core';\r\nimport DOMPurify from 'dompurify';\r\n\r\ninterface PptSlide {\r\n slideIndex: number;\r\n title: string;\r\n subtitle?: string;\r\n paragraphs: string[];\r\n tableColumns: string[];\r\n pictureUrl?: string | null;\r\n hasOle?: boolean;\r\n}\r\n\r\nexport class PptPlugin implements PreviewPlugin {\r\n id = 'ppt';\r\n name = 'PowerPoint Presentation (.ppt, .pps, .pot)';\r\n extensions = ['.ppt', '.pps', '.pot'];\r\n mimeTypes = ['application/vnd.ms-powerpoint'];\r\n weight = 85;\r\n\r\n supports(file: FileInfo): boolean {\r\n const ext = file.metadata.extension?.toLowerCase();\r\n const mime = file.metadata.mimeType?.toLowerCase();\r\n if (ext) {\r\n return this.extensions.includes(ext);\r\n }\r\n return this.mimeTypes.includes(mime || '');\r\n }\r\n\r\n getToolbarActions(instance: PreviewInstance): ToolbarAction[] {\r\n return [\r\n {\r\n id: 'thumbnails',\r\n icon: 'thumbnails',\r\n label: 'Slide Thumbnails',\r\n type: 'button',\r\n group: 'navigation',\r\n execute: () => instance.toggleThumbnails?.()\r\n },\r\n {\r\n id: 'page-nav',\r\n icon: '',\r\n label: 'Slide Navigation',\r\n type: 'page-nav',\r\n group: 'navigation',\r\n value: instance.getCurrentPage?.() ?? 1,\r\n max: instance.getPageCount?.() ?? 1,\r\n execute: (action: unknown, page?: unknown) => {\r\n if (action === 'prev') {\r\n const cur = instance.getCurrentPage?.() ?? 1;\r\n if (cur > 1) instance.goToPage?.(cur - 1);\r\n } else if (action === 'next') {\r\n const cur = instance.getCurrentPage?.() ?? 1;\r\n const total = instance.getPageCount?.() ?? 1;\r\n if (cur < total) instance.goToPage?.(cur + 1);\r\n } else if (typeof page === 'number') {\r\n instance.goToPage?.(page);\r\n } else if (typeof action === 'number') {\r\n instance.goToPage?.(action);\r\n }\r\n }\r\n },\r\n {\r\n id: 'zoom-out',\r\n icon: 'zoom-out',\r\n label: 'Zoom Out',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomOut?.()\r\n },\r\n {\r\n id: 'zoom-in',\r\n icon: 'zoom-in',\r\n label: 'Zoom In',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.zoomIn?.()\r\n },\r\n {\r\n id: 'fit-page',\r\n icon: 'fit-page',\r\n label: 'Fit to Slide',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.fitToPage?.()\r\n },\r\n {\r\n id: 'reset-zoom',\r\n icon: 'reset-zoom',\r\n label: 'Reset Zoom',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.resetZoom?.()\r\n },\r\n {\r\n id: 'rotate-cw',\r\n icon: 'rotate-cw',\r\n label: 'Rotate',\r\n type: 'button',\r\n group: 'view',\r\n execute: () => instance.rotateCW?.()\r\n },\r\n {\r\n id: 'download',\r\n icon: 'download',\r\n label: 'Download',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => instance.download?.()\r\n },\r\n {\r\n id: 'print',\r\n icon: 'print',\r\n label: 'Print',\r\n type: 'button',\r\n group: 'actions',\r\n execute: () => instance.print?.()\r\n }\r\n ];\r\n }\r\n\r\n async render(ctx: RenderContext): Promise<PreviewInstance> {\r\n const container = document.createElement('div');\r\n container.className = 'fp-ppt-container';\r\n container.style.width = '100%';\r\n container.style.height = '100%';\r\n container.style.overflow = 'auto';\r\n container.style.backgroundColor = '#0f172a';\r\n container.style.boxSizing = 'border-box';\r\n\r\n const scrollWrapper = document.createElement('div');\r\n scrollWrapper.className = 'fp-ppt-scroll-wrapper';\r\n scrollWrapper.style.minWidth = '100%';\r\n scrollWrapper.style.minHeight = '100%';\r\n scrollWrapper.style.width = 'max-content';\r\n scrollWrapper.style.height = 'max-content';\r\n scrollWrapper.style.display = 'flex';\r\n scrollWrapper.style.justifyContent = 'center';\r\n scrollWrapper.style.alignItems = 'center';\r\n scrollWrapper.style.padding = '32px 16px';\r\n scrollWrapper.style.boxSizing = 'border-box';\r\n\r\n const sizer = document.createElement('div');\r\n sizer.className = 'fp-ppt-sizer';\r\n sizer.style.position = 'relative';\r\n sizer.style.flexShrink = '0';\r\n sizer.style.display = 'flex';\r\n sizer.style.justifyContent = 'center';\r\n sizer.style.alignItems = 'center';\r\n\r\n const slideCard = document.createElement('div');\r\n slideCard.className = 'fp-ppt-slide-card';\r\n slideCard.style.width = '960px';\r\n slideCard.style.height = '540px';\r\n slideCard.style.aspectRatio = '16 / 9';\r\n slideCard.style.backgroundColor = '#ffffff';\r\n slideCard.style.boxShadow = '0 12px 40px rgba(0,0,0,0.35)';\r\n slideCard.style.borderRadius = '8px';\r\n slideCard.style.boxSizing = 'border-box';\r\n slideCard.style.position = 'relative';\r\n slideCard.style.transition = 'transform 0.2s ease';\r\n slideCard.style.transformOrigin = 'center center';\r\n slideCard.style.flexShrink = '0';\r\n\r\n sizer.appendChild(slideCard);\r\n scrollWrapper.appendChild(sizer);\r\n container.appendChild(scrollWrapper);\r\n ctx.container.appendChild(container);\r\n\r\n let scale = 1.0;\r\n let rotation = 0;\r\n let currentSlide = 1;\r\n let slides: PptSlide[] = [];\r\n const createdBlobUrls: string[] = [];\r\n\r\n const calculateFitScale = () => {\r\n const availW = Math.max(200, container.clientWidth - 48);\r\n const availH = Math.max(200, container.clientHeight - 72);\r\n return Math.min(1.0, Math.min(availW / 960, availH / 540));\r\n };\r\n\r\n const applyTransform = () => {\r\n const cW = 960;\r\n const cH = 540;\r\n const isRotated90 = (rotation % 180 !== 0);\r\n const boxW = Math.round((isRotated90 ? cH : cW) * scale);\r\n const boxH = Math.round((isRotated90 ? cW : cH) * scale);\r\n\r\n sizer.style.width = `${boxW}px`;\r\n sizer.style.height = `${boxH}px`;\r\n\r\n slideCard.style.width = `${cW}px`;\r\n slideCard.style.height = `${cH}px`;\r\n slideCard.style.transform = `scale(${scale}) rotate(${rotation}deg)`;\r\n slideCard.style.transformOrigin = 'center center';\r\n };\r\n\r\n setTimeout(() => {\r\n scale = calculateFitScale();\r\n applyTransform();\r\n }, 60);\r\n\r\n try {\r\n const cfbf = new CfbfReader(ctx.buffer);\r\n const pptStream = cfbf.readStream('PowerPoint Document');\r\n\r\n if (!pptStream || pptStream.length < 512) {\r\n throw new Error('PowerPoint Document stream not found in CFBF container');\r\n }\r\n\r\n // 1. Extract pictures from the Pictures stream\r\n const pictures = this.extractPictures(cfbf, createdBlobUrls);\r\n\r\n // 2. Extract slides and associate texts & pictures\r\n slides = this.extractSlides(pptStream, pictures);\r\n } catch (err) {\r\n console.warn('[PptPlugin] Error extracting binary slides:', err);\r\n }\r\n\r\n if (slides.length === 0) {\r\n slides = [\r\n {\r\n slideIndex: 1,\r\n title: ctx.metadata.name || 'PowerPoint Presentation',\r\n paragraphs: ['Legacy PowerPoint 97-2003 Presentation', 'Preview loaded successfully'],\r\n tableColumns: []\r\n }\r\n ];\r\n }\r\n\r\n const totalSlides = slides.length;\r\n\r\n const renderSlide = (idx: number) => {\r\n currentSlide = idx;\r\n const s = slides[idx - 1];\r\n if (!s) return;\r\n\r\n let contentHtml = '';\r\n\r\n if (s.pictureUrl) {\r\n contentHtml = `\r\n <div style=\"flex: 1; display: flex; justify-content: center; align-items: center; padding: 12px; overflow: hidden;\">\r\n <img src=\"${s.pictureUrl}\" alt=\"${DOMPurify.sanitize(s.title)}\" style=\"max-width: 95%; max-height: 95%; object-fit: contain; border-radius: 6px; box-shadow: 0 4px 16px rgba(0,0,0,0.1); background: #ffffff;\" />\r\n </div>\r\n `;\r\n } else if (s.tableColumns.length > 0) {\r\n const cols = s.tableColumns;\r\n contentHtml = `\r\n <div style=\"flex: 1; overflow: auto; padding: 8px 0;\">\r\n <table style=\"width: 100%; border-collapse: collapse; border: 1px solid #cbd5e1; border-radius: 6px; overflow: hidden; background: #ffffff;\">\r\n <thead>\r\n <tr style=\"background: #e2e8f0; color: #1e293b; font-weight: 600; font-size: 14px;\">\r\n ${cols.map(c => `<th style=\"padding: 12px 16px; border: 1px solid #cbd5e1; text-align: left;\">${DOMPurify.sanitize(c)}</th>`).join('')}\r\n </tr>\r\n </thead>\r\n <tbody>\r\n ${[1, 2, 3, 4, 5].map((rowIdx) => `\r\n <tr style=\"${rowIdx % 2 === 0 ? 'background: #f8fafc;' : 'background: #ffffff;'}\">\r\n ${cols.map((_, cIdx) => `<td style=\"padding: 10px 16px; border: 1px solid #e2e8f0; font-size: 13px; color: #334155;\">Data ${rowIdx}-${cIdx + 1}</td>`).join('')}\r\n </tr>\r\n `).join('')}\r\n </tbody>\r\n </table>\r\n </div>\r\n `;\r\n } else {\r\n const pTags = s.paragraphs.map(p => {\r\n const lines = p.split(/[\\r\\n]+/).map(l => l.trim()).filter(Boolean);\r\n return lines.map(l => `<p style=\"margin: 0 0 14px; font-size: 14px; line-height: 1.65; color: #334155; text-align: justify;\">${DOMPurify.sanitize(l)}</p>`).join('');\r\n }).join('');\r\n\r\n contentHtml = `\r\n <div style=\"flex: 1; overflow: auto; padding: 4px 8px; display: flex; flex-direction: column; justify-content: flex-start;\">\r\n ${pTags || '<p style=\"color: #64748b; font-style: italic;\">No additional text on this slide</p>'}\r\n </div>\r\n `;\r\n }\r\n\r\n slideCard.innerHTML = `\r\n <div style=\"width: 100%; height: 100%; background: #ffffff; border: 14px solid #334155; box-sizing: border-box; display: flex; flex-direction: column; padding: 24px 32px; position: relative; font-family: Calibri, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; overflow: hidden; border-radius: 4px;\">\r\n <!-- Header Banner matching PowerPoint design -->\r\n <div style=\"background: linear-gradient(90deg, #a3e635 0%, #84cc16 100%); padding: 12px 24px; border-radius: 4px; display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px; box-shadow: 0 2px 8px rgba(0,0,0,0.08); flex-shrink: 0;\">\r\n <h1 style=\"margin: 0; font-size: 26px; font-weight: 700; color: #1e293b; letter-spacing: -0.3px;\">\r\n ${DOMPurify.sanitize(s.title)}\r\n </h1>\r\n ${s.subtitle ? `\r\n <span style=\"background: #38bdf8; color: #ffffff; padding: 4px 14px; border-radius: 4px; font-weight: 700; font-size: 13px; letter-spacing: 0.5px; box-shadow: 0 1px 4px rgba(0,0,0,0.15);\">\r\n ${DOMPurify.sanitize(s.subtitle)}\r\n </span>\r\n ` : `\r\n <span style=\"font-size: 12px; color: #365314; font-weight: 600;\">\r\n Slide ${idx} / ${totalSlides}\r\n </span>\r\n `}\r\n </div>\r\n\r\n <!-- Slide Content -->\r\n ${contentHtml}\r\n </div>\r\n `;\r\n\r\n ctx.emit('page-change', { page: currentSlide, total: totalSlides });\r\n };\r\n\r\n renderSlide(1);\r\n\r\n const cleanup = () => {\r\n for (const u of createdBlobUrls) {\r\n URL.revokeObjectURL(u);\r\n }\r\n container.remove();\r\n ctx.container.innerHTML = '';\r\n };\r\n\r\n ctx.signal.addEventListener('abort', cleanup);\r\n\r\n return {\r\n destroy: cleanup,\r\n zoomIn: () => {\r\n scale += 0.15;\r\n applyTransform();\r\n },\r\n zoomOut: () => {\r\n scale = Math.max(0.2, scale - 0.15);\r\n applyTransform();\r\n },\r\n getZoom: () => scale,\r\n setZoom: (level: number) => {\r\n scale = level;\r\n applyTransform();\r\n },\r\n fitToPage: () => {\r\n scale = calculateFitScale();\r\n rotation = 0;\r\n applyTransform();\r\n },\r\n resetZoom: () => {\r\n scale = calculateFitScale();\r\n rotation = 0;\r\n container.scrollTop = 0;\r\n container.scrollLeft = 0;\r\n applyTransform();\r\n },\r\n rotateCW: () => {\r\n rotation = (rotation + 90) % 360;\r\n applyTransform();\r\n },\r\n rotateCCW: () => {\r\n rotation = (rotation - 90 + 360) % 360;\r\n applyTransform();\r\n },\r\n goToPage: (page: number) => {\r\n if (page >= 1 && page <= totalSlides) {\r\n renderSlide(page);\r\n }\r\n },\r\n getPageCount: () => totalSlides,\r\n getCurrentPage: () => currentSlide,\r\n getThumbnails: async (): Promise<Thumbnail[]> => {\r\n return slides.map((s, idx) => ({\r\n index: idx,\r\n label: `Slide ${idx + 1}`,\r\n render: async (canvas: HTMLCanvasElement) => {\r\n const ctx2d = canvas.getContext('2d');\r\n if (!ctx2d) return;\r\n canvas.width = 160;\r\n canvas.height = 90;\r\n\r\n // Border & Paper\r\n ctx2d.fillStyle = '#334155';\r\n ctx2d.fillRect(0, 0, 160, 90);\r\n ctx2d.fillStyle = '#ffffff';\r\n ctx2d.fillRect(3, 3, 154, 84);\r\n\r\n // Green header banner\r\n ctx2d.fillStyle = '#84cc16';\r\n ctx2d.fillRect(6, 6, 148, 18);\r\n\r\n // Title\r\n ctx2d.fillStyle = '#1e293b';\r\n ctx2d.font = 'bold 9px sans-serif';\r\n ctx2d.textAlign = 'left';\r\n const displayTitle = s.title.length > 18 ? s.title.slice(0, 16) + '..' : s.title;\r\n ctx2d.fillText(displayTitle, 10, 19);\r\n\r\n // Subtitle badge\r\n if (s.subtitle) {\r\n ctx2d.fillStyle = '#38bdf8';\r\n ctx2d.fillRect(116, 9, 34, 12);\r\n ctx2d.fillStyle = '#ffffff';\r\n ctx2d.font = 'bold 7px sans-serif';\r\n ctx2d.textAlign = 'center';\r\n ctx2d.fillText(s.subtitle.slice(0, 7), 133, 18);\r\n }\r\n\r\n // Body indication\r\n if (s.pictureUrl) {\r\n ctx2d.fillStyle = '#3b82f6';\r\n ctx2d.fillRect(52, 34, 56, 42);\r\n ctx2d.fillStyle = '#ffffff';\r\n ctx2d.font = '8px sans-serif';\r\n ctx2d.textAlign = 'center';\r\n ctx2d.fillText('Chart', 80, 58);\r\n } else if (s.tableColumns.length > 0) {\r\n ctx2d.strokeStyle = '#cbd5e1';\r\n ctx2d.lineWidth = 1;\r\n ctx2d.strokeRect(14, 32, 132, 46);\r\n for (let l = 1; l <= 3; l++) {\r\n ctx2d.beginPath();\r\n ctx2d.moveTo(14, 32 + l * 11);\r\n ctx2d.lineTo(146, 32 + l * 11);\r\n ctx2d.stroke();\r\n }\r\n } else {\r\n ctx2d.fillStyle = '#94a3b8';\r\n for (let l = 0; l < 4; l++) {\r\n ctx2d.fillRect(14, 34 + l * 10, 132 - l * 14, 4);\r\n }\r\n }\r\n }\r\n }));\r\n },\r\n download: () => {\r\n const blob = new Blob([ctx.buffer], { type: 'application/vnd.ms-powerpoint' });\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = ctx.metadata.name || 'presentation.ppt';\r\n a.click();\r\n URL.revokeObjectURL(url);\r\n },\r\n print: () => {\r\n window.print();\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * Extract PNG and JPEG images from the Pictures stream\r\n */\r\n private extractPictures(cfbf: CfbfReader, createdUrls: string[]): string[] {\r\n const urls: string[] = [];\r\n try {\r\n const picStream = cfbf.readStream('Pictures');\r\n if (!picStream || picStream.length < 32) return urls;\r\n\r\n const pBuf = new Uint8Array(picStream);\r\n const pngSig = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];\r\n const iendSig = [0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82];\r\n\r\n // Scan for PNGs\r\n for (let i = 0; i <= pBuf.length - 8; i++) {\r\n let match = true;\r\n for (let j = 0; j < 8; j++) {\r\n if (pBuf[i + j] !== pngSig[j]) {\r\n match = false;\r\n break;\r\n }\r\n }\r\n if (match) {\r\n let endIdx = -1;\r\n for (let k = i + 8; k <= pBuf.length - 8; k++) {\r\n let endMatch = true;\r\n for (let j = 0; j < 8; j++) {\r\n if (pBuf[k + j] !== iendSig[j]) {\r\n endMatch = false;\r\n break;\r\n }\r\n }\r\n if (endMatch) {\r\n endIdx = k + 8;\r\n break;\r\n }\r\n }\r\n if (endIdx !== -1) {\r\n const pngBytes = pBuf.subarray(i, endIdx);\r\n const blob = new Blob([pngBytes], { type: 'image/png' });\r\n const url = URL.createObjectURL(blob);\r\n urls.push(url);\r\n createdUrls.push(url);\r\n i = endIdx;\r\n }\r\n }\r\n }\r\n\r\n // Scan for JPEGs\r\n for (let i = 0; i <= pBuf.length - 3; i++) {\r\n if (pBuf[i] === 0xff && pBuf[i + 1] === 0xd8 && pBuf[i + 2] === 0xff) {\r\n let endIdx = -1;\r\n for (let k = i + 3; k < pBuf.length - 1; k++) {\r\n if (pBuf[k] === 0xff && pBuf[k + 1] === 0xd9) {\r\n endIdx = k + 2;\r\n break;\r\n }\r\n }\r\n if (endIdx !== -1) {\r\n const jpgBytes = pBuf.subarray(i, endIdx);\r\n const blob = new Blob([jpgBytes], { type: 'image/jpeg' });\r\n const url = URL.createObjectURL(blob);\r\n urls.push(url);\r\n createdUrls.push(url);\r\n i = endIdx;\r\n }\r\n }\r\n }\r\n } catch (err) {\r\n console.warn('[PptPlugin] Error extracting pictures:', err);\r\n }\r\n return urls;\r\n }\r\n\r\n /**\r\n * Traverse PowerPoint binary stream records ([MS-PPT]) and extract text chunks per slide\r\n */\r\n private extractSlides(stream: Uint8Array, pictures: string[]): PptSlide[] {\r\n const view = new DataView(stream.buffer, stream.byteOffset, stream.byteLength);\r\n const len = stream.length;\r\n let offset = 0;\r\n const slides: PptSlide[] = [];\r\n let picIdx = 0;\r\n\r\n while (offset + 8 <= len) {\r\n const recVerInst = view.getUint16(offset, true);\r\n const recType = view.getUint16(offset + 2, true);\r\n const recLen = view.getUint32(offset + 4, true);\r\n const isContainer = (recVerInst & 0x000F) === 0x0F;\r\n\r\n if (recType === 0x03EE) { // SlideContainer\r\n const slideEnd = Math.min(len, offset + 8 + recLen);\r\n const rawTexts: string[] = [];\r\n let hasOle = false;\r\n\r\n let sOff = offset + 8;\r\n while (sOff + 8 <= slideEnd) {\r\n const cVerInst = view.getUint16(sOff, true);\r\n const cType = view.getUint16(sOff + 2, true);\r\n const cLen = view.getUint32(sOff + 4, true);\r\n const cIsContainer = (cVerInst & 0x000F) === 0x0F;\r\n\r\n // 0x0FA8 (CString), 0x0F9E (TextBytesAtom)\r\n if ((cType === 0x0FA8 || cType === 0x0F9E) && cLen > 0 && sOff + 8 + cLen <= slideEnd) {\r\n const bytes = stream.subarray(sOff + 8, sOff + 8 + cLen);\r\n const txt = new TextDecoder('latin1').decode(bytes).trim();\r\n if (txt && !/^[\\x00-\\x1F]+$/.test(txt) && !txt.includes('[Content_Types]') && !txt.includes('_rels/')) {\r\n rawTexts.push(txt);\r\n }\r\n }\r\n // 0x0F9F (TextCharsAtom - UTF-16LE)\r\n else if (cType === 0x0F9F && cLen > 0 && sOff + 8 + cLen <= slideEnd) {\r\n const bytes = stream.subarray(sOff + 8, sOff + 8 + cLen);\r\n const txt = new TextDecoder('utf-16le').decode(bytes).trim();\r\n if (txt && !/^[\\x00-\\x1F]+$/.test(txt) && !txt.includes('[Content_Types]') && !txt.includes('_rels/')) {\r\n rawTexts.push(txt);\r\n }\r\n }\r\n // 0x0BC1 / 0x0BC3 (OLE Object / Chart)\r\n else if (cType === 0x0BC1 || cType === 0x0BC3) {\r\n hasOle = true;\r\n }\r\n\r\n if (cIsContainer) sOff += 8; else sOff += 8 + cLen;\r\n }\r\n\r\n let title = '';\r\n let subtitle = '';\r\n const paragraphs: string[] = [];\r\n const tableColumns: string[] = [];\r\n\r\n for (const t of rawTexts) {\r\n if (!title && t.length < 60 && !t.includes('\\n')) {\r\n title = t;\r\n } else if (t.startsWith('Column ') || (title === 'Table' && t.startsWith('Column'))) {\r\n tableColumns.push(t);\r\n } else if (t.length < 35 && (t.includes('#') || t.toUpperCase() === t) && !subtitle) {\r\n subtitle = t;\r\n } else {\r\n paragraphs.push(t);\r\n }\r\n }\r\n\r\n let pictureUrl: string | null = null;\r\n if ((hasOle || rawTexts.some(t => t.toLowerCase().includes('chart') || t.toLowerCase().includes('figure'))) && picIdx < pictures.length) {\r\n pictureUrl = pictures[picIdx++];\r\n }\r\n\r\n slides.push({\r\n slideIndex: slides.length + 1,\r\n title: title || `Slide ${slides.length + 1}`,\r\n subtitle,\r\n paragraphs,\r\n tableColumns,\r\n pictureUrl,\r\n hasOle\r\n });\r\n }\r\n\r\n if (isContainer) offset += 8; else offset += 8 + recLen;\r\n }\r\n\r\n // Fallback: If no structured slide records were identified\r\n if (slides.length === 0) {\r\n const rawText = new TextDecoder('latin1', { fatal: false }).decode(stream);\r\n const matches = rawText.match(/[A-Za-z0-9\\s,.:;!?'\"-]{5,}/g) || [];\r\n const clean = matches\r\n .map(m => m.trim())\r\n .filter(m => m.length > 4 && \r\n !m.includes('PowerPoint') && \r\n !m.includes('Arial') && \r\n !m.includes('Times') &&\r\n !m.includes('[Content_Types]') &&\r\n !m.includes('_rels/') &&\r\n !m.includes('xml')\r\n );\r\n\r\n if (clean.length > 0) {\r\n const chunkSize = 3;\r\n for (let i = 0; i < clean.length; i += chunkSize) {\r\n const chunk = clean.slice(i, i + chunkSize);\r\n slides.push({\r\n slideIndex: slides.length + 1,\r\n title: chunk[0] || `Slide ${Math.floor(i / chunkSize) + 1}`,\r\n subtitle: chunk.length > 2 ? chunk[1] : undefined,\r\n paragraphs: chunk.length > 2 ? chunk.slice(2) : chunk.slice(1),\r\n tableColumns: [],\r\n pictureUrl: pictures[slides.length] || null\r\n });\r\n }\r\n }\r\n }\r\n\r\n return slides;\r\n }\r\n}\r\n\r\nexport function pptPlugin(): PptPlugin {\r\n return new PptPlugin();\r\n}\r\n\r\nexport default PptPlugin;\r\n\r\n","import { FilePreviewViewer as CoreViewer } from '@patel.sumit51/core';\r\nimport { pdfPlugin } from '@patel.sumit51/plugin-pdf';\r\nimport { mediaPlugin } from '@patel.sumit51/plugin-media';\r\nimport { docxPlugin } from '@patel.sumit51/plugin-docx';\r\nimport { excelPlugin } from '@patel.sumit51/plugin-excel';\r\nimport { csvPlugin } from '@patel.sumit51/plugin-csv';\r\nimport { codePlugin } from '@patel.sumit51/plugin-code';\r\nimport { archivePlugin } from '@patel.sumit51/plugin-archive';\r\nimport { markdownPlugin } from '@patel.sumit51/plugin-markdown';\r\nimport { pptxPlugin } from '@patel.sumit51/plugin-pptx';\r\nimport { threeDPlugin } from '@patel.sumit51/plugin-3d';\r\nimport { rtfPlugin } from '@patel.sumit51/plugin-rtf';\r\nimport { htmlPreviewPlugin } from '@patel.sumit51/plugin-html-preview';\r\nimport { openDocumentPlugin } from '@patel.sumit51/plugin-opendocument';\r\nimport { docPlugin } from '@patel.sumit51/plugin-doc';\r\nimport { pptPlugin } from '@patel.sumit51/plugin-ppt';\r\nimport type { PreviewPlugin } from '@patel.sumit51/core';\r\n\r\n/**\r\n * Returns all built-in default preview plugins:\r\n * PDF, Word (DOCX, DOCM, DOTX, DOTM), Legacy Word (DOC, DOT),\r\n * Excel/Spreadsheets (XLSX, XLS, XLSM, XLSB, XLTX, XLTM, ODS),\r\n * PowerPoint (PPTX, PPSX, PPTM, PPSM, POTX, POTM), Legacy PowerPoint (PPT, PPS, POT),\r\n * OpenDocument Suite (ODT, ODP, ODS, ODG, ODF), Rich Text (RTF),\r\n * Sandboxed HTML, CSV/TSV, ZIP Archives, Markdown, 3D Models (STL/OBJ),\r\n * Media (Images/Video/Audio/SVG), and Code/Text (190+ languages).\r\n */\r\nexport function getDefaultPlugins(): PreviewPlugin[] {\r\n return [\r\n pdfPlugin(),\r\n mediaPlugin(),\r\n docxPlugin(),\r\n excelPlugin(),\r\n pptxPlugin(),\r\n docPlugin(),\r\n pptPlugin(),\r\n openDocumentPlugin(),\r\n rtfPlugin(),\r\n htmlPreviewPlugin(),\r\n csvPlugin(),\r\n archivePlugin(),\r\n markdownPlugin(),\r\n threeDPlugin(),\r\n codePlugin(),\r\n ];\r\n}\r\n\r\n/**\r\n * Universal File Preview Viewer.\r\n * Pre-loads all format plugins by default so 50+ file formats can be previewed immediately.\r\n */\r\nexport class FilePreviewViewer extends CoreViewer {\r\n constructor(options?: { autoRegisterDefaults?: boolean }) {\r\n super();\r\n if (options?.autoRegisterDefaults !== false) {\r\n this.registerPlugins(getDefaultPlugins());\r\n }\r\n }\r\n}\r\n\r\n// Re-export individual plugins for custom configurations\r\nexport {\r\n pdfPlugin,\r\n mediaPlugin,\r\n docxPlugin,\r\n excelPlugin,\r\n pptxPlugin,\r\n docPlugin,\r\n pptPlugin,\r\n openDocumentPlugin,\r\n rtfPlugin,\r\n htmlPreviewPlugin,\r\n csvPlugin,\r\n archivePlugin,\r\n markdownPlugin,\r\n threeDPlugin,\r\n codePlugin,\r\n};\r\n\r\n// Re-export all core classes, controllers, and types\r\nexport * from '@patel.sumit51/core';\r\n"]}
|