@files-preview-app/preview-file 1.1.5 → 1.2.0

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/vue.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../core/src/events.ts","../../core/src/detect.ts","../../core/src/utils.ts","../../core/src/toolbar/icons.ts","../../core/src/toolbar/toolbar-controller.ts","../../core/src/thumbnail/thumbnail-panel.ts","../../core/src/engine.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","../src/index.ts","../src/vue.ts"],"names":["DOMPurify","docx","ExcelJS","hljs","unzip","marked","PptxRenderer","THREE","OrbitControls","STLLoader","OBJLoader","FilePreviewViewer","defineComponent","ref","onMounted","watch","onBeforeUnmount","h"],"mappings":"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","file":"vue.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)\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\r\n '.pdf': 'application/pdf',\r\n '.docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\r\n '.xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\r\n '.xls': 'application/vnd.ms-excel',\r\n '.pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\r\n '.csv': 'text/csv',\r\n '.tsv': 'text/tab-separated-values',\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 OOXML sub-type (docx vs xlsx vs pptx) by checking ZIP entry names.\r\n * All OOXML formats use ZIP container with PK header.\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, 4000))\r\n );\r\n\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 return 'application/zip';\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) {\r\n metadata.size = source.size;\r\n metadata.mimeType = source.type || undefined;\r\n buffer = await source.arrayBuffer();\r\n } else if (source instanceof ArrayBuffer) {\r\n buffer = source;\r\n } else if (source instanceof Uint8Array) {\r\n buffer = source.buffer.slice(\r\n source.byteOffset,\r\n source.byteOffset + source.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 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 {\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","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\"><polyline points=\"15 3 21 3 21 9\"></polyline><polyline points=\"9 21 3 21 3 15\"></polyline><line x1=\"21\" y1=\"3\" x2=\"14\" y2=\"10\"></line><line x1=\"3\" y1=\"21\" x2=\"10\" y2=\"14\"></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\n","import './toolbar.css';\r\nimport { createElement, sanitizeSVG } from '../utils';\r\nimport type { ToolbarAction, ToolbarGroup } 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-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};\r\n\r\nexport class ToolbarController {\r\n private el: HTMLElement;\r\n private toolbarEl: HTMLElement;\r\n private actions: ToolbarAction[] = [];\r\n\r\n constructor(container: HTMLElement) {\r\n this.el = container;\r\n this.toolbarEl = createElement('div', { className: 'fp-toolbar' });\r\n this.el.appendChild(this.toolbarEl);\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 for (const action of this.actions) {\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 prevBtn = this.createButton(\r\n 'prev', icons.ICON_PAGE_PREV, 'Previous Page',\r\n () => action.execute('prev')\r\n );\r\n const nextBtn = this.createButton(\r\n 'next', icons.ICON_PAGE_NEXT, 'Next Page',\r\n () => action.execute('next')\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: (action.max ?? 1).toString()\r\n }) as HTMLInputElement;\r\n \r\n input.addEventListener('change', () => {\r\n action.execute('go', parseInt(input.value, 10));\r\n });\r\n \r\n const label = createElement('span', { className: 'fp-toolbar-label' }, ` / ${action.max ?? 1}`);\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 svg = ICON_MAP[iconHtml] || iconHtml;\r\n if (svg && svg.startsWith('<svg')) {\r\n btn.innerHTML = sanitizeSVG(svg);\r\n } else {\r\n btn.textContent = svg || title; \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\n\r\nexport class ThumbnailPanel {\r\n private el: HTMLElement;\r\n private panelEl: HTMLElement;\r\n private thumbnails: Thumbnail[] = [];\r\n private onSelect?: (index: number) => void;\r\n private activeIndex: number = 0;\r\n\r\n constructor(container: HTMLElement) {\r\n this.el = container;\r\n this.panelEl = createElement('div', { className: 'fp-thumbnail-panel hidden' });\r\n this.el.appendChild(this.panelEl);\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.render();\r\n }\r\n\r\n setActive(index: number): void {\r\n this.activeIndex = index;\r\n const items = this.panelEl.querySelectorAll('.fp-thumbnail-item');\r\n items.forEach((item, i) => {\r\n if (i === index) {\r\n item.classList.add('active');\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 }\r\n\r\n hide(): void {\r\n this.panelEl.classList.add('hidden');\r\n }\r\n\r\n toggle(): void {\r\n this.panelEl.classList.toggle('hidden');\r\n }\r\n\r\n destroy(): void {\r\n this.el.innerHTML = '';\r\n }\r\n\r\n private async render(): Promise<void> {\r\n this.panelEl.innerHTML = '';\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', { className: 'fp-thumbnail-item' });\r\n if (i === this.activeIndex) {\r\n itemEl.classList.add('active');\r\n }\r\n\r\n itemEl.addEventListener('click', () => {\r\n this.setActive(i);\r\n this.onSelect?.(i);\r\n });\r\n\r\n const canvas = createElement('canvas', { width: '150', height: '200' }) as HTMLCanvasElement;\r\n const label = createElement('span', { className: 'fp-thumbnail-label' }, thumb.label);\r\n\r\n itemEl.appendChild(canvas);\r\n itemEl.appendChild(label);\r\n this.panelEl.appendChild(itemEl);\r\n\r\n try {\r\n await thumb.render(canvas);\r\n } catch (err) {\r\n console.error(`[FilePreview] Error rendering thumbnail ${i}:`, err);\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 { 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} 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\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 // 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 this.currentBuffer = buffer;\r\n this.currentMetadata = 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, payload) => this.eventEmitter.emit(event, payload),\r\n });\r\n\r\n this.activeInstance = instance;\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 button\r\n if (options.showToolbar !== false && this.toolbar) {\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: 'Toggle Fullscreen',\r\n type: 'button',\r\n group: 'view',\r\n execute: () => {\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 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 });\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 * 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 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 }\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 // --- Private methods ---\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 if (toolbarPos === 'top') {\r\n this.wrapperEl.appendChild(toolbarEl);\r\n this.wrapperEl.appendChild(bodyEl);\r\n } else {\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 this.toolbar = new ToolbarController(toolbarEl);\r\n this.thumbnailPanel = new ThumbnailPanel(thumbnailEl);\r\n\r\n // Enable keyboard shortcuts & drag/drop\r\n this.setupKeyboardShortcuts();\r\n this.setupDragAndDrop(container, options);\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 } 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 } 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","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 PdfPlugin implements PreviewPlugin {\r\n id = 'pdf';\r\n name = 'PDF 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 return ext === '.pdf' || mime === 'application/pdf';\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: () => {\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: '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 id: 'page-nav',\r\n icon: 'page-nav',\r\n label: 'Page Navigation',\r\n type: 'page-nav',\r\n group: 'navigation',\r\n execute: (page?: unknown) => {\r\n if (typeof page === 'number') instance.goToPage?.(page);\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 }\r\n\r\n async render(ctx: RenderContext): Promise<PreviewInstance> {\r\n const blob = new Blob([ctx.buffer], { type: 'application/pdf' });\r\n const url = URL.createObjectURL(blob);\r\n \r\n const wrapper = document.createElement('div');\r\n wrapper.style.width = '100%';\r\n wrapper.style.height = '100%';\r\n wrapper.style.overflow = 'hidden';\r\n wrapper.style.display = 'flex';\r\n wrapper.style.justifyContent = 'center';\r\n wrapper.style.alignItems = 'center';\r\n\r\n const iframe = document.createElement('iframe');\r\n iframe.src = url;\r\n iframe.style.width = '100%';\r\n iframe.style.height = '100%';\r\n iframe.style.border = 'none';\r\n \r\n wrapper.appendChild(iframe);\r\n ctx.container.appendChild(wrapper);\r\n \r\n let currentPage = 1;\r\n let currentZoom = 1.0;\r\n let rotation = 0;\r\n\r\n const cleanup = () => {\r\n URL.revokeObjectURL(url);\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 currentZoom += 0.1;\r\n iframe.style.transform = `scale(${currentZoom}) rotate(${rotation}deg)`;\r\n },\r\n zoomOut: () => {\r\n currentZoom = Math.max(0.2, currentZoom - 0.1);\r\n iframe.style.transform = `scale(${currentZoom}) rotate(${rotation}deg)`;\r\n },\r\n getZoom: () => currentZoom,\r\n setZoom: (level: number) => {\r\n currentZoom = level;\r\n iframe.style.transform = `scale(${currentZoom}) rotate(${rotation}deg)`;\r\n },\r\n fitToPage: () => {\r\n currentZoom = 1.0;\r\n iframe.style.transform = `scale(1) rotate(${rotation}deg)`;\r\n },\r\n rotateCW: () => {\r\n rotation = (rotation + 90) % 360;\r\n iframe.style.transform = `scale(${currentZoom}) rotate(${rotation}deg)`;\r\n },\r\n rotateCCW: () => {\r\n rotation = (rotation - 90 + 360) % 360;\r\n iframe.style.transform = `scale(${currentZoom}) rotate(${rotation}deg)`;\r\n },\r\n getRotation: () => rotation,\r\n goToPage: (page: number) => {\r\n currentPage = page;\r\n // In iframe viewer, appending #page=N to the hash navigates in native PDF viewer\r\n iframe.src = `${url}#page=${page}`;\r\n },\r\n getCurrentPage: () => currentPage,\r\n download: () => {\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 },\r\n print: () => {\r\n iframe.contentWindow?.print();\r\n },\r\n getThumbnails: async (): Promise<Thumbnail[]> => {\r\n return [\r\n {\r\n index: 1,\r\n label: 'Page 1',\r\n render: async (canvas: HTMLCanvasElement) => {\r\n const context = canvas.getContext('2d');\r\n if (context) {\r\n context.fillStyle = '#fff';\r\n context.fillRect(0, 0, canvas.width, canvas.height);\r\n context.fillStyle = '#333';\r\n context.font = '12px sans-serif';\r\n context.fillText('PDF Preview', 10, 20);\r\n }\r\n }\r\n }\r\n ];\r\n }\r\n };\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'];\r\nconst VIDEO_EXTS = ['.mp4', '.webm', '.ogg'];\r\nconst AUDIO_EXTS = ['.mp3', '.wav', '.ogg'];\r\n\r\nexport class MediaPlugin implements PreviewPlugin {\r\n id = 'media';\r\n name = 'Media Preview';\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',\r\n 'video/mp4', 'video/webm', 'video/ogg',\r\n 'audio/mpeg', 'audio/wav', 'audio/ogg'\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: '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: '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 }\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.style.maxWidth = '100%';\r\n video.style.maxHeight = '100%';\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 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 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 * as docx from 'docx-preview';\r\n\r\nexport class DocxPlugin implements PreviewPlugin {\r\n id = 'docx';\r\n name = 'Word Document Preview';\r\n extensions = ['.docx'];\r\n mimeTypes = ['application/vnd.openxmlformats-officedocument.wordprocessingml.document'];\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 === '.docx' || 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: () => {\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: '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 }\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 = '16px';\r\n \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 try {\r\n await docx.renderAsync(ctx.buffer, wrapper, ctx.container, {\r\n inWrapper: true,\r\n ignoreWidth: false,\r\n ignoreHeight: false,\r\n });\r\n } catch {\r\n wrapper.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 || 'Word Document'}</h3>\r\n <p>DOCX render preview</p>\r\n </div>\r\n `;\r\n }\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.2, 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 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\r\nexport function docxPlugin(): DocxPlugin {\r\n return new DocxPlugin();\r\n}\r\n\r\nexport default DocxPlugin;\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 ExcelJS from 'exceljs';\r\n\r\nexport class ExcelPlugin implements PreviewPlugin {\r\n id = 'excel';\r\n name = 'Excel Spreadsheet Preview';\r\n extensions = ['.xlsx', '.xls'];\r\n mimeTypes = [\r\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\r\n 'application/vnd.ms-excel'\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 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: () => {\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: 'page-nav',\r\n icon: 'page-nav',\r\n label: 'Sheet Navigation',\r\n type: 'page-nav',\r\n group: 'navigation',\r\n execute: (sheet?: unknown) => {\r\n if (typeof sheet === 'number') instance.goToPage?.(sheet);\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 }\r\n\r\n async render(ctx: RenderContext): Promise<PreviewInstance> {\r\n const container = document.createElement('div');\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.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.style.display = 'flex';\r\n tabsArea.style.gap = '8px';\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\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 const workbook = new ExcelJS.Workbook();\r\n\r\n try {\r\n await workbook.xlsx.load(ctx.buffer);\r\n } catch {\r\n // Fallback\r\n }\r\n\r\n const renderSheet = (index: number) => {\r\n contentArea.innerHTML = '';\r\n const sheet = workbook.getWorksheet(index);\r\n if (!sheet) return;\r\n\r\n const table = document.createElement('table');\r\n table.style.borderCollapse = 'collapse';\r\n table.style.fontFamily = 'sans-serif';\r\n table.style.fontSize = '13px';\r\n table.style.minWidth = '100%';\r\n\r\n sheet.eachRow({ includeEmpty: false }, (row) => {\r\n const tr = document.createElement('tr');\r\n row.eachCell({ includeEmpty: true }, (cell) => {\r\n const td = document.createElement('td');\r\n td.style.border = '1px solid #d0d7de';\r\n td.style.padding = '6px 12px';\r\n td.textContent = cell.text || '';\r\n tr.appendChild(td);\r\n });\r\n table.appendChild(tr);\r\n });\r\n\r\n contentArea.appendChild(table);\r\n currentSheetIndex = index;\r\n };\r\n\r\n workbook.worksheets.forEach((sheet, idx) => {\r\n const btn = document.createElement('button');\r\n btn.textContent = sheet.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.onclick = () => renderSheet(idx + 1);\r\n tabsArea.appendChild(btn);\r\n });\r\n\r\n if (workbook.worksheets.length > 0) {\r\n renderSheet(1);\r\n }\r\n\r\n const cleanup = () => {\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.1;\r\n contentArea.style.transform = `scale(${scale})`;\r\n },\r\n zoomOut: () => {\r\n scale = Math.max(0.2, scale - 0.1);\r\n contentArea.style.transform = `scale(${scale})`;\r\n },\r\n getZoom: () => scale,\r\n setZoom: (level: number) => {\r\n scale = level;\r\n contentArea.style.transform = `scale(${scale})`;\r\n },\r\n goToPage: (page: number) => {\r\n if (page > 0 && page <= workbook.worksheets.length) {\r\n renderSheet(page);\r\n }\r\n },\r\n getPageCount: () => workbook.worksheets.length,\r\n getCurrentPage: () => currentSheetIndex,\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} 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 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: () => {\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: '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 }\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 container.style.transformOrigin = 'top left';\r\n \r\n const table = document.createElement('table');\r\n table.style.borderCollapse = 'collapse';\r\n table.style.width = '100%';\r\n table.style.fontFamily = 'monospace';\r\n table.style.fontSize = '13px';\r\n \r\n const delimiter = ctx.metadata.extension === '.tsv' ? '\\t' : ',';\r\n const rows = text.split(/\\r?\\n/).slice(0, 500); \r\n \r\n rows.forEach((row, rowIndex) => {\r\n if (!row.trim()) return;\r\n const tr = document.createElement('tr');\r\n const cells = row.split(delimiter);\r\n \r\n cells.forEach(cell => {\r\n const td = document.createElement(rowIndex === 0 ? 'th' : 'td');\r\n td.textContent = cell.trim();\r\n td.style.border = '1px solid #d0d7de';\r\n td.style.padding = '6px 12px';\r\n if (rowIndex === 0) {\r\n td.style.backgroundColor = '#f6f8fa';\r\n td.style.fontWeight = 'bold';\r\n }\r\n tr.appendChild(td);\r\n });\r\n table.appendChild(tr);\r\n });\r\n \r\n container.appendChild(table);\r\n ctx.container.appendChild(container);\r\n\r\n let scale = 1.0;\r\n\r\n const cleanup = () => {\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.1;\r\n container.style.transform = `scale(${scale})`;\r\n },\r\n zoomOut: () => {\r\n scale = Math.max(0.2, scale - 0.1);\r\n container.style.transform = `scale(${scale})`;\r\n },\r\n getZoom: () => scale,\r\n setZoom: (level: number) => {\r\n scale = level;\r\n container.style.transform = `scale(${scale})`;\r\n },\r\n fitToPage: () => {\r\n scale = 1.0;\r\n container.style.transform = `scale(1)`;\r\n },\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} 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 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: () => {\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: '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 }\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.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 let fontSize = 13;\r\n const pre = document.createElement('pre');\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\r\n const code = document.createElement('code');\r\n const ext = (ctx.metadata.extension || '').replace('.', '');\r\n\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 pre.appendChild(code);\r\n container.appendChild(pre);\r\n ctx.container.appendChild(container);\r\n\r\n const cleanup = () => {\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 fontSize = Math.min(32, fontSize + 2);\r\n pre.style.fontSize = `${fontSize}px`;\r\n },\r\n zoomOut: () => {\r\n fontSize = Math.max(8, fontSize - 2);\r\n pre.style.fontSize = `${fontSize}px`;\r\n },\r\n getZoom: () => fontSize / 13,\r\n setZoom: (level: number) => {\r\n fontSize = Math.round(13 * level);\r\n pre.style.fontSize = `${fontSize}px`;\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(text);\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: 'Reset Zoom',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.fitToPage?.()\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 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: '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 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'];\r\n mimeTypes = [\r\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\r\n 'application/vnd.openxmlformats-officedocument.presentationml.slideshow'\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 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: '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-prev',\r\n icon: 'page-prev',\r\n label: 'Previous Slide',\r\n type: 'button',\r\n group: 'navigation',\r\n execute: () => {\r\n const cur = instance.getCurrentPage?.() ?? 1;\r\n if (cur > 1) instance.goToPage?.(cur - 1);\r\n }\r\n },\r\n {\r\n id: 'page-nav',\r\n icon: '',\r\n label: 'Slide Number',\r\n type: 'page-nav',\r\n group: 'navigation',\r\n execute: (page: unknown) => instance.goToPage?.(Number(page))\r\n },\r\n {\r\n id: 'page-next',\r\n icon: 'page-next',\r\n label: 'Next Slide',\r\n type: 'button',\r\n group: 'navigation',\r\n execute: () => {\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 }\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: '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\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 `;\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 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 } 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.1;\r\n slideContainer.style.transform = `scale(${scale})`;\r\n },\r\n zoomOut: () => {\r\n scale = Math.max(0.2, scale - 0.1);\r\n slideContainer.style.transform = `scale(${scale})`;\r\n },\r\n getZoom: () => scale,\r\n setZoom: (level: number) => {\r\n scale = level;\r\n slideContainer.style.transform = `scale(${scale})`;\r\n },\r\n fitToPage: () => {\r\n scale = 1.0;\r\n slideContainer.style.transform = 'scale(1)';\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: '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 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 { 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 type { PreviewPlugin } from '@patel.sumit51/core';\r\n\r\n/**\r\n * Returns all built-in default preview plugins:\r\n * PDF, Word (DOCX), Excel (XLSX), PowerPoint (PPTX), CSV/TSV,\r\n * ZIP Archives, Markdown, 3D Models (STL/OBJ), Media (Images/Video/Audio/SVG), and Code/Text.\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 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 any file format 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 csvPlugin,\r\n archivePlugin,\r\n markdownPlugin,\r\n threeDPlugin,\r\n codePlugin,\r\n};\r\n\r\n// Re-export all core types, utilities, controllers, and events\r\nexport * from '@patel.sumit51/core';\r\n","import { defineComponent, h, ref, onMounted, onBeforeUnmount, watch, type PropType } from 'vue';\r\nimport {\r\n FilePreviewViewer,\r\n getDefaultPlugins,\r\n type FileSource,\r\n type PreviewPlugin,\r\n type PreviewViewerOptions,\r\n type PreviewInstance,\r\n} from './index';\r\n\r\nexport const FilePreview = defineComponent({\r\n name: 'FilePreview',\r\n props: {\r\n src: {\r\n type: [String, Object] as PropType<FileSource>,\r\n required: true,\r\n },\r\n plugins: {\r\n type: Array as PropType<PreviewPlugin[]>,\r\n default: undefined,\r\n },\r\n options: {\r\n type: Object as PropType<PreviewViewerOptions>,\r\n default: () => ({}),\r\n },\r\n },\r\n emits: ['loading', 'loaded', 'error', 'page-change', 'zoom-change'],\r\n setup(props, { emit, expose }) {\r\n const containerRef = ref<HTMLDivElement | null>(null);\r\n let viewer: FilePreviewViewer | null = null;\r\n let instance: PreviewInstance | null = null;\r\n\r\n const renderPreview = async () => {\r\n const el = containerRef.value;\r\n if (!viewer || !el || !props.src) return;\r\n try {\r\n instance = await viewer.preview(el, props.src, props.options);\r\n } catch (error: unknown) {\r\n if (error instanceof DOMException && error.name === 'AbortError') return;\r\n emit('error', error);\r\n }\r\n };\r\n\r\n onMounted(() => {\r\n viewer = new FilePreviewViewer({ autoRegisterDefaults: false });\r\n const activePlugins = props.plugins && props.plugins.length > 0 ? props.plugins : getDefaultPlugins();\r\n viewer.registerPlugins(activePlugins);\r\n\r\n viewer.on('loading', (data) => emit('loading', data));\r\n viewer.on('loaded', (data) => emit('loaded', data));\r\n viewer.on('error', (data) => emit('error', data));\r\n viewer.on('page-change', (data) => emit('page-change', data));\r\n viewer.on('zoom-change', (data) => emit('zoom-change', data));\r\n\r\n renderPreview();\r\n });\r\n\r\n watch(() => props.src, renderPreview);\r\n watch(() => props.options, renderPreview, { deep: true });\r\n\r\n onBeforeUnmount(() => {\r\n viewer?.destroy();\r\n viewer = null;\r\n instance = null;\r\n });\r\n\r\n expose({\r\n getInstance: () => instance,\r\n getViewer: () => viewer,\r\n destroy: () => viewer?.destroy(),\r\n });\r\n\r\n return () => {\r\n return h('div', {\r\n ref: containerRef,\r\n style: { width: '100%', height: '100%', position: 'relative' },\r\n });\r\n };\r\n },\r\n});\r\n\r\nexport default FilePreview;\r\n"]}
1
+ {"version":3,"sources":["../../core/src/events.ts","../../core/src/detect.ts","../../core/src/utils.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","../src/vue.ts"],"names":["DOMPurify","docx","XLSX","hljs","unzip","marked","PptxRenderer","THREE","OrbitControls","STLLoader","OBJLoader","RTFJS","unzipSync","strFromU8","FilePreviewViewer","defineComponent","ref","onMounted","watch","onBeforeUnmount","h"],"mappings":"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","file":"vue.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 * 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) {\r\n metadata.size = source.size;\r\n metadata.mimeType = source.type || undefined;\r\n buffer = await source.arrayBuffer();\r\n } else if (source instanceof ArrayBuffer) {\r\n buffer = source;\r\n } else if (source instanceof Uint8Array) {\r\n buffer = source.buffer.slice(\r\n source.byteOffset,\r\n source.byteOffset + source.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 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 {\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","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\"><polyline points=\"15 3 21 3 21 9\"></polyline><polyline points=\"9 21 3 21 3 15\"></polyline><line x1=\"21\" y1=\"3\" x2=\"14\" y2=\"10\"></line><line x1=\"3\" y1=\"21\" x2=\"10\" y2=\"14\"></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\n\r\n","import './toolbar.css';\r\nimport { createElement, sanitizeSVG } from '../utils';\r\nimport type { ToolbarAction, ToolbarGroup } 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-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};\r\n\r\nexport class ToolbarController {\r\n private el: HTMLElement;\r\n private toolbarEl: HTMLElement;\r\n private actions: ToolbarAction[] = [];\r\n\r\n constructor(container: HTMLElement) {\r\n this.el = container;\r\n this.toolbarEl = createElement('div', { className: 'fp-toolbar' });\r\n this.el.appendChild(this.toolbarEl);\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 for (const action of this.actions) {\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 prevBtn = this.createButton(\r\n 'prev', icons.ICON_PAGE_PREV, 'Previous Page',\r\n () => action.execute('prev')\r\n );\r\n const nextBtn = this.createButton(\r\n 'next', icons.ICON_PAGE_NEXT, 'Next Page',\r\n () => action.execute('next')\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: (action.max ?? 1).toString()\r\n }) as HTMLInputElement;\r\n \r\n input.addEventListener('change', () => {\r\n action.execute('go', parseInt(input.value, 10));\r\n });\r\n \r\n const label = createElement('span', { className: 'fp-toolbar-label' }, ` / ${action.max ?? 1}`);\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 svg = ICON_MAP[iconHtml] || iconHtml;\r\n if (svg && svg.startsWith('<svg')) {\r\n btn.innerHTML = sanitizeSVG(svg);\r\n } else {\r\n btn.textContent = svg || title; \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\n\r\nexport class ThumbnailPanel {\r\n private el: HTMLElement;\r\n private panelEl: HTMLElement;\r\n private thumbnails: Thumbnail[] = [];\r\n private onSelect?: (index: number) => void;\r\n private activeIndex: number = 0;\r\n\r\n constructor(container: HTMLElement) {\r\n this.el = container;\r\n this.panelEl = createElement('div', { className: 'fp-thumbnail-panel hidden' });\r\n this.el.appendChild(this.panelEl);\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.render();\r\n }\r\n\r\n setActive(index: number): void {\r\n this.activeIndex = index;\r\n const items = this.panelEl.querySelectorAll('.fp-thumbnail-item');\r\n items.forEach((item, i) => {\r\n if (i === index) {\r\n item.classList.add('active');\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 }\r\n\r\n hide(): void {\r\n this.panelEl.classList.add('hidden');\r\n }\r\n\r\n toggle(): void {\r\n this.panelEl.classList.toggle('hidden');\r\n }\r\n\r\n destroy(): void {\r\n this.el.innerHTML = '';\r\n }\r\n\r\n private async render(): Promise<void> {\r\n this.panelEl.innerHTML = '';\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', { className: 'fp-thumbnail-item' });\r\n if (i === this.activeIndex) {\r\n itemEl.classList.add('active');\r\n }\r\n\r\n itemEl.addEventListener('click', () => {\r\n this.setActive(i);\r\n this.onSelect?.(i);\r\n });\r\n\r\n const canvas = createElement('canvas', { width: '150', height: '200' }) as HTMLCanvasElement;\r\n const label = createElement('span', { className: 'fp-thumbnail-label' }, thumb.label);\r\n\r\n itemEl.appendChild(canvas);\r\n itemEl.appendChild(label);\r\n this.panelEl.appendChild(itemEl);\r\n\r\n try {\r\n await thumb.render(canvas);\r\n } catch (err) {\r\n console.error(`[FilePreview] Error rendering thumbnail ${i}:`, err);\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 { 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} 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\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 // 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 this.currentBuffer = buffer;\r\n this.currentMetadata = 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, payload) => this.eventEmitter.emit(event, payload),\r\n });\r\n\r\n this.activeInstance = instance;\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 button\r\n if (options.showToolbar !== false && this.toolbar) {\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: 'Toggle Fullscreen',\r\n type: 'button',\r\n group: 'view',\r\n execute: () => {\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 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 });\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 * 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 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 }\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 // --- Private methods ---\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 if (toolbarPos === 'top') {\r\n this.wrapperEl.appendChild(toolbarEl);\r\n this.wrapperEl.appendChild(bodyEl);\r\n } else {\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 this.toolbar = new ToolbarController(toolbarEl);\r\n this.thumbnailPanel = new ThumbnailPanel(thumbnailEl);\r\n\r\n // Enable keyboard shortcuts & drag/drop\r\n this.setupKeyboardShortcuts();\r\n this.setupDragAndDrop(container, options);\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 } 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 } 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","/**\n * Compound File Binary Format (CFBF / OLE2) parser.\n * Implements Microsoft [MS-CFB] specification for legacy Office formats (.doc, .ppt, .xls).\n * Zero external dependencies, client-side browser and Node.js compatible.\n */\n\nexport interface CfbfEntry {\n name: string;\n type: number; // 0=Empty, 1=User Storage, 2=User Stream, 5=Root Storage\n size: number;\n startSector: number;\n}\n\nexport class CfbfReader {\n private view: DataView;\n private u8: Uint8Array;\n private sectorSize: number;\n private miniSectorSize: number;\n private miniStreamCutoff: number;\n private fat: number[] = [];\n private miniFat: number[] = [];\n private entries: Map<string, CfbfEntry> = new Map();\n private miniStream: Uint8Array = new Uint8Array(0);\n\n constructor(buffer: ArrayBuffer) {\n this.u8 = new Uint8Array(buffer);\n this.view = new DataView(buffer);\n\n if (!this.isValid()) {\n throw new Error('Invalid CFBF / OLE2 file header signature');\n }\n\n // Sector shifts\n const sectorShift = this.view.getUint16(30, true);\n this.sectorSize = 1 << sectorShift;\n const miniSectorShift = this.view.getUint16(32, true);\n this.miniSectorSize = 1 << miniSectorShift;\n this.miniStreamCutoff = this.view.getUint32(56, true) || 4096;\n\n this.parseFat();\n this.parseDirectory();\n this.parseMiniFat();\n }\n\n /** Check if the magic 8-byte signature matches [MS-CFB] */\n public isValid(): boolean {\n if (this.u8.length < 512) return false;\n const sig = [0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, 0x1a, 0xe1];\n return sig.every((b, i) => this.u8[i] === b);\n }\n\n /** Return all directory stream/storage entries found in the file */\n public listEntries(): CfbfEntry[] {\n return Array.from(this.entries.values());\n }\n\n /** Check if a stream exists */\n public hasStream(name: string): boolean {\n return this.entries.has(name) || this.findEntryCaseInsensitive(name) !== null;\n }\n\n /**\n * Read raw bytes of a named stream (e.g. \"WordDocument\", \"PowerPoint Document\", \"Workbook\")\n */\n public readStream(name: string): Uint8Array | null {\n const entry = this.entries.get(name) || this.findEntryCaseInsensitive(name);\n if (!entry) return null;\n if (entry.size === 0) return new Uint8Array(0);\n\n // Mini Stream vs Regular Stream\n if (entry.size < this.miniStreamCutoff && entry.type !== 5) {\n return this.readMiniStream(entry.startSector, entry.size);\n } else {\n return this.readRegularStream(entry.startSector, entry.size);\n }\n }\n\n private findEntryCaseInsensitive(name: string): CfbfEntry | null {\n const lower = name.toLowerCase();\n for (const [key, val] of this.entries.entries()) {\n if (key.toLowerCase() === lower) return val;\n }\n return null;\n }\n\n private getSectorOffset(sectId: number): number {\n return (sectId + 1) * this.sectorSize;\n }\n\n private parseFat(): void {\n const csectFat = this.view.getUint32(44, true);\n const difat: number[] = [];\n\n // First 109 DIFAT entries stored in header (offset 76..511)\n for (let i = 0; i < 109; i++) {\n const sect = this.view.getUint32(76 + i * 4, true);\n if (sect !== 0xffffffff && sect !== 0xfffffffe) {\n difat.push(sect);\n }\n }\n\n // Chained DIFAT sectors (if file has > 109 FAT sectors)\n let difatSect = this.view.getUint32(68, true);\n const csectDif = this.view.getUint32(72, true);\n const entriesPerSector = (this.sectorSize / 4) - 1;\n\n for (let i = 0; i < csectDif && difatSect < 0xfffffffe; i++) {\n const offset = this.getSectorOffset(difatSect);\n for (let j = 0; j < entriesPerSector; j++) {\n const sect = this.view.getUint32(offset + j * 4, true);\n if (sect !== 0xffffffff && sect !== 0xfffffffe) {\n difat.push(sect);\n }\n }\n difatSect = this.view.getUint32(offset + entriesPerSector * 4, true);\n }\n\n // Read all FAT sectors and construct fat array\n for (const fatSect of difat) {\n if (fatSect >= 0xfffffffe) continue;\n const offset = this.getSectorOffset(fatSect);\n const count = this.sectorSize / 4;\n for (let j = 0; j < count; j++) {\n this.fat.push(this.view.getUint32(offset + j * 4, true));\n }\n }\n }\n\n private parseDirectory(): void {\n const dirStartSect = this.view.getUint32(48, true);\n const dirBytes = this.readRegularStream(dirStartSect);\n const dirView = new DataView(dirBytes.buffer, dirBytes.byteOffset, dirBytes.byteLength);\n const entryCount = dirBytes.length / 128;\n\n for (let i = 0; i < entryCount; i++) {\n const offset = i * 128;\n const type = dirView.getUint8(offset + 66);\n if (type === 0) continue; // Unallocated\n\n const nameLen = dirView.getUint16(offset + 64, true);\n let name = '';\n if (nameLen > 2) {\n const charCount = (nameLen / 2) - 1; // exclude null terminator\n const chars: string[] = [];\n for (let c = 0; c < charCount; c++) {\n const charCode = dirView.getUint16(offset + c * 2, true);\n chars.push(String.fromCharCode(charCode));\n }\n name = chars.join('');\n }\n\n const startSector = dirView.getUint32(offset + 116, true);\n // Low 32-bits of size (Office files are almost never > 4GB)\n const size = dirView.getUint32(offset + 120, true);\n\n const entry: CfbfEntry = { name, type, size, startSector };\n this.entries.set(name, entry);\n\n // Root entry stores the Mini Stream\n if (type === 5) {\n this.miniStream = this.readRegularStream(startSector, size);\n }\n }\n }\n\n private parseMiniFat(): void {\n const miniFatStart = this.view.getUint32(60, true);\n const csectMiniFat = this.view.getUint32(64, true);\n if (miniFatStart >= 0xfffffffe || csectMiniFat === 0) return;\n\n let sect = miniFatStart;\n for (let i = 0; i < csectMiniFat && sect < 0xfffffffe; i++) {\n const offset = this.getSectorOffset(sect);\n const count = this.sectorSize / 4;\n for (let j = 0; j < count; j++) {\n this.miniFat.push(this.view.getUint32(offset + j * 4, true));\n }\n sect = this.fat[sect] ?? 0xfffffffe;\n }\n }\n\n private readRegularStream(startSector: number, targetSize?: number): Uint8Array {\n if (startSector >= 0xfffffffe) return new Uint8Array(0);\n\n const chunks: Uint8Array[] = [];\n let curr = startSector;\n let totalBytes = 0;\n const visited = new Set<number>();\n\n while (curr < 0xfffffffe && !visited.has(curr)) {\n visited.add(curr);\n const offset = this.getSectorOffset(curr);\n if (offset + this.sectorSize <= this.u8.length) {\n chunks.push(this.u8.subarray(offset, offset + this.sectorSize));\n totalBytes += this.sectorSize;\n }\n curr = this.fat[curr] ?? 0xfffffffe;\n }\n\n const result = new Uint8Array(totalBytes);\n let pos = 0;\n for (const chunk of chunks) {\n result.set(chunk, pos);\n pos += chunk.length;\n }\n\n if (targetSize !== undefined && targetSize < result.length) {\n return result.subarray(0, targetSize);\n }\n return result;\n }\n\n private readMiniStream(startSector: number, targetSize: number): Uint8Array {\n if (this.miniStream.length === 0 || startSector >= 0xfffffffe) return new Uint8Array(0);\n\n const chunks: Uint8Array[] = [];\n let curr = startSector;\n let totalBytes = 0;\n const visited = new Set<number>();\n\n while (curr < 0xfffffffe && !visited.has(curr)) {\n visited.add(curr);\n const offset = curr * this.miniSectorSize;\n if (offset + this.miniSectorSize <= this.miniStream.length) {\n chunks.push(this.miniStream.subarray(offset, offset + this.miniSectorSize));\n totalBytes += this.miniSectorSize;\n }\n curr = this.miniFat[curr] ?? 0xfffffffe;\n }\n\n const result = new Uint8Array(totalBytes);\n let pos = 0;\n for (const chunk of chunks) {\n result.set(chunk, pos);\n pos += chunk.length;\n }\n\n return result.subarray(0, targetSize);\n }\n}\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 PdfPlugin implements PreviewPlugin {\r\n id = 'pdf';\r\n name = 'PDF 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 return ext === '.pdf' || mime === 'application/pdf';\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: () => {\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: '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 id: 'page-nav',\r\n icon: 'page-nav',\r\n label: 'Page Navigation',\r\n type: 'page-nav',\r\n group: 'navigation',\r\n execute: (page?: unknown) => {\r\n if (typeof page === 'number') instance.goToPage?.(page);\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 }\r\n\r\n async render(ctx: RenderContext): Promise<PreviewInstance> {\r\n const blob = new Blob([ctx.buffer], { type: 'application/pdf' });\r\n const url = URL.createObjectURL(blob);\r\n \r\n const wrapper = document.createElement('div');\r\n wrapper.style.width = '100%';\r\n wrapper.style.height = '100%';\r\n wrapper.style.overflow = 'hidden';\r\n wrapper.style.display = 'flex';\r\n wrapper.style.justifyContent = 'center';\r\n wrapper.style.alignItems = 'center';\r\n\r\n const iframe = document.createElement('iframe');\r\n iframe.src = url;\r\n iframe.style.width = '100%';\r\n iframe.style.height = '100%';\r\n iframe.style.border = 'none';\r\n \r\n wrapper.appendChild(iframe);\r\n ctx.container.appendChild(wrapper);\r\n \r\n let currentPage = 1;\r\n let currentZoom = 1.0;\r\n let rotation = 0;\r\n\r\n const cleanup = () => {\r\n URL.revokeObjectURL(url);\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 currentZoom += 0.1;\r\n iframe.style.transform = `scale(${currentZoom}) rotate(${rotation}deg)`;\r\n },\r\n zoomOut: () => {\r\n currentZoom = Math.max(0.2, currentZoom - 0.1);\r\n iframe.style.transform = `scale(${currentZoom}) rotate(${rotation}deg)`;\r\n },\r\n getZoom: () => currentZoom,\r\n setZoom: (level: number) => {\r\n currentZoom = level;\r\n iframe.style.transform = `scale(${currentZoom}) rotate(${rotation}deg)`;\r\n },\r\n fitToPage: () => {\r\n currentZoom = 1.0;\r\n iframe.style.transform = `scale(1) rotate(${rotation}deg)`;\r\n },\r\n rotateCW: () => {\r\n rotation = (rotation + 90) % 360;\r\n iframe.style.transform = `scale(${currentZoom}) rotate(${rotation}deg)`;\r\n },\r\n rotateCCW: () => {\r\n rotation = (rotation - 90 + 360) % 360;\r\n iframe.style.transform = `scale(${currentZoom}) rotate(${rotation}deg)`;\r\n },\r\n getRotation: () => rotation,\r\n goToPage: (page: number) => {\r\n currentPage = page;\r\n // In iframe viewer, appending #page=N to the hash navigates in native PDF viewer\r\n iframe.src = `${url}#page=${page}`;\r\n },\r\n getCurrentPage: () => currentPage,\r\n download: () => {\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 },\r\n print: () => {\r\n iframe.contentWindow?.print();\r\n },\r\n getThumbnails: async (): Promise<Thumbnail[]> => {\r\n return [\r\n {\r\n index: 1,\r\n label: 'Page 1',\r\n render: async (canvas: HTMLCanvasElement) => {\r\n const context = canvas.getContext('2d');\r\n if (context) {\r\n context.fillStyle = '#fff';\r\n context.fillRect(0, 0, canvas.width, canvas.height);\r\n context.fillStyle = '#333';\r\n context.font = '12px sans-serif';\r\n context.fillText('PDF Preview', 10, 20);\r\n }\r\n }\r\n }\r\n ];\r\n }\r\n };\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'];\r\nconst VIDEO_EXTS = ['.mp4', '.webm', '.ogg'];\r\nconst AUDIO_EXTS = ['.mp3', '.wav', '.ogg'];\r\n\r\nexport class MediaPlugin implements PreviewPlugin {\r\n id = 'media';\r\n name = 'Media Preview';\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',\r\n 'video/mp4', 'video/webm', 'video/ogg',\r\n 'audio/mpeg', 'audio/wav', 'audio/ogg'\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: '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: '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 }\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.style.maxWidth = '100%';\r\n video.style.maxHeight = '100%';\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 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 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 * as docx from 'docx-preview';\r\n\r\nexport class DocxPlugin implements PreviewPlugin {\r\n id = 'docx';\r\n name = 'Word Document Preview';\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 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: () => {\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: '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 }\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 = '16px';\r\n \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 try {\r\n await docx.renderAsync(ctx.buffer, wrapper, ctx.container, {\r\n inWrapper: true,\r\n ignoreWidth: false,\r\n ignoreHeight: false,\r\n });\r\n } catch {\r\n wrapper.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 || 'Word Document'}</h3>\r\n <p>DOCX render preview</p>\r\n </div>\r\n `;\r\n }\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.2, 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 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\r\nexport function docxPlugin(): DocxPlugin {\r\n return new DocxPlugin();\r\n}\r\n\r\nexport default DocxPlugin;\r\n","import type { \n FileInfo, \n RenderContext, \n ToolbarAction, \n PreviewPlugin, \n PreviewInstance \n} from '@patel.sumit51/core';\nimport * as XLSX from 'xlsx';\n\nexport class ExcelPlugin implements PreviewPlugin {\n id = 'excel';\n name = 'Spreadsheet Preview (Excel / OpenDocument)';\n extensions = ['.xlsx', '.xls', '.xlsm', '.xlsb', '.xltx', '.xltm', '.ods'];\n mimeTypes = [\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'application/vnd.ms-excel',\n 'application/vnd.ms-excel.sheet.macroEnabled.12',\n 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',\n 'application/vnd.ms-excel.template.macroEnabled.12',\n 'application/vnd.oasis.opendocument.spreadsheet'\n ];\n weight = 80;\n\n supports(file: FileInfo): boolean {\n const ext = file.metadata.extension?.toLowerCase();\n const mime = file.metadata.mimeType?.toLowerCase();\n return this.extensions.includes(ext || '') || this.mimeTypes.includes(mime || '');\n }\n\n getToolbarActions(instance: PreviewInstance): ToolbarAction[] {\n return [\n {\n id: 'zoom-out',\n icon: 'zoom-out',\n label: 'Zoom Out',\n type: 'button',\n group: 'zoom',\n execute: () => {\n instance.zoomOut?.();\n }\n },\n {\n id: 'zoom-in',\n icon: 'zoom-in',\n label: 'Zoom In',\n type: 'button',\n group: 'zoom',\n execute: () => {\n instance.zoomIn?.();\n }\n },\n {\n id: 'page-nav',\n icon: 'page-nav',\n label: 'Sheet Navigation',\n type: 'page-nav',\n group: 'navigation',\n execute: (sheet?: unknown) => {\n if (typeof sheet === 'number') instance.goToPage?.(sheet);\n }\n },\n {\n id: 'download',\n icon: 'download',\n label: 'Download',\n type: 'button',\n group: 'actions',\n execute: () => {\n instance.download?.();\n }\n },\n {\n id: 'print',\n icon: 'print',\n label: 'Print',\n type: 'button',\n group: 'actions',\n execute: () => {\n instance.print?.();\n }\n }\n ];\n }\n\n async render(ctx: RenderContext): Promise<PreviewInstance> {\n const container = document.createElement('div');\n container.className = 'fp-excel-container';\n container.style.display = 'flex';\n container.style.flexDirection = 'column';\n container.style.width = '100%';\n container.style.height = '100%';\n container.style.overflow = 'hidden';\n\n const contentArea = document.createElement('div');\n contentArea.className = 'fp-excel-content';\n contentArea.style.flex = '1';\n contentArea.style.overflow = 'auto';\n contentArea.style.padding = '16px';\n contentArea.style.transformOrigin = 'top left';\n\n const tabsArea = document.createElement('div');\n tabsArea.className = 'fp-excel-tabs';\n tabsArea.style.display = 'flex';\n tabsArea.style.gap = '6px';\n tabsArea.style.padding = '8px 16px';\n tabsArea.style.borderTop = '1px solid #e0e0e0';\n tabsArea.style.backgroundColor = '#fafafa';\n tabsArea.style.overflowX = 'auto';\n tabsArea.style.flexShrink = '0';\n\n container.appendChild(contentArea);\n container.appendChild(tabsArea);\n ctx.container.appendChild(container);\n\n let scale = 1.0;\n let currentSheetIndex = 1;\n let sheetNames: string[] = [];\n let wb: XLSX.WorkBook | null = null;\n\n try {\n wb = XLSX.read(new Uint8Array(ctx.buffer), { type: 'array', cellDates: true });\n sheetNames = wb.SheetNames || [];\n } catch (err) {\n console.warn('[ExcelPlugin] SheetJS parse failed, rendering fallback:', err);\n }\n\n const tabButtons: HTMLButtonElement[] = [];\n\n const renderSheet = (index: number) => {\n if (!wb || index < 1 || index > sheetNames.length) return;\n currentSheetIndex = index;\n const sheetName = sheetNames[index - 1];\n const ws = wb.Sheets[sheetName];\n\n contentArea.innerHTML = '';\n\n if (!ws) {\n contentArea.innerHTML = '<div style=\"padding: 24px; color: #888;\">Empty sheet</div>';\n return;\n }\n\n const html = XLSX.utils.sheet_to_html(ws, { id: 'fp-sheet-table', editable: false });\n contentArea.innerHTML = html;\n\n // Style the table\n const table = contentArea.querySelector('table');\n if (table) {\n table.style.borderCollapse = 'collapse';\n table.style.fontFamily = '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif';\n table.style.fontSize = '13px';\n table.style.minWidth = '100%';\n table.style.border = '1px solid #d0d7de';\n table.style.background = '#fff';\n\n table.querySelectorAll('td, th').forEach((cell) => {\n const el = cell as HTMLElement;\n el.style.border = '1px solid #d0d7de';\n el.style.padding = '6px 12px';\n el.style.whiteSpace = 'nowrap';\n });\n\n table.querySelectorAll('tr:first-child td, th').forEach((cell) => {\n const el = cell as HTMLElement;\n el.style.fontWeight = '600';\n el.style.backgroundColor = '#f6f8fa';\n });\n }\n\n // Update active tab button\n tabButtons.forEach((b, i) => {\n if (i === index - 1) {\n b.style.backgroundColor = '#2563eb';\n b.style.color = '#fff';\n b.style.borderColor = '#2563eb';\n b.style.fontWeight = '600';\n } else {\n b.style.backgroundColor = '#fff';\n b.style.color = '#333';\n b.style.borderColor = '#ccc';\n b.style.fontWeight = 'normal';\n }\n });\n };\n\n if (sheetNames.length > 0) {\n sheetNames.forEach((name, idx) => {\n const btn = document.createElement('button');\n btn.textContent = name;\n btn.style.padding = '4px 12px';\n btn.style.fontSize = '12px';\n btn.style.cursor = 'pointer';\n btn.style.border = '1px solid #ccc';\n btn.style.borderRadius = '4px';\n btn.style.backgroundColor = '#fff';\n btn.style.transition = 'all 0.15s ease';\n btn.onclick = () => renderSheet(idx + 1);\n tabsArea.appendChild(btn);\n tabButtons.push(btn);\n });\n\n renderSheet(1);\n } else {\n contentArea.innerHTML = `\n <div style=\"text-align:center; padding: 40px; color: #666;\">\n <div style=\"font-size:48px; margin-bottom: 16px;\">📊</div>\n <h3>${ctx.metadata.name || 'Spreadsheet'}</h3>\n <p>Unable to load sheet data</p>\n </div>\n `;\n }\n\n const cleanup = () => {\n container.remove();\n ctx.container.innerHTML = '';\n };\n\n ctx.signal.addEventListener('abort', cleanup);\n\n return {\n destroy: cleanup,\n zoomIn: () => {\n scale += 0.1;\n contentArea.style.transform = `scale(${scale})`;\n },\n zoomOut: () => {\n scale = Math.max(0.2, scale - 0.1);\n contentArea.style.transform = `scale(${scale})`;\n },\n getZoom: () => scale,\n setZoom: (level: number) => {\n scale = level;\n contentArea.style.transform = `scale(${scale})`;\n },\n goToPage: (page: number) => {\n if (page > 0 && page <= sheetNames.length) {\n renderSheet(page);\n }\n },\n getPageCount: () => sheetNames.length,\n getCurrentPage: () => currentSheetIndex,\n download: () => {\n const blob = new Blob([ctx.buffer], { type: this.mimeTypes[0] });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = ctx.metadata.name || 'spreadsheet.xlsx';\n a.click();\n URL.revokeObjectURL(url);\n },\n print: () => {\n window.print();\n }\n };\n }\n}\n\nexport function excelPlugin(): ExcelPlugin {\n return new ExcelPlugin();\n}\n\nexport default ExcelPlugin;\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\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 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: () => {\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: '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 }\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 container.style.transformOrigin = 'top left';\r\n \r\n const table = document.createElement('table');\r\n table.style.borderCollapse = 'collapse';\r\n table.style.width = '100%';\r\n table.style.fontFamily = 'monospace';\r\n table.style.fontSize = '13px';\r\n \r\n const delimiter = ctx.metadata.extension === '.tsv' ? '\\t' : ',';\r\n const rows = text.split(/\\r?\\n/).slice(0, 500); \r\n \r\n rows.forEach((row, rowIndex) => {\r\n if (!row.trim()) return;\r\n const tr = document.createElement('tr');\r\n const cells = row.split(delimiter);\r\n \r\n cells.forEach(cell => {\r\n const td = document.createElement(rowIndex === 0 ? 'th' : 'td');\r\n td.textContent = cell.trim();\r\n td.style.border = '1px solid #d0d7de';\r\n td.style.padding = '6px 12px';\r\n if (rowIndex === 0) {\r\n td.style.backgroundColor = '#f6f8fa';\r\n td.style.fontWeight = 'bold';\r\n }\r\n tr.appendChild(td);\r\n });\r\n table.appendChild(tr);\r\n });\r\n \r\n container.appendChild(table);\r\n ctx.container.appendChild(container);\r\n\r\n let scale = 1.0;\r\n\r\n const cleanup = () => {\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.1;\r\n container.style.transform = `scale(${scale})`;\r\n },\r\n zoomOut: () => {\r\n scale = Math.max(0.2, scale - 0.1);\r\n container.style.transform = `scale(${scale})`;\r\n },\r\n getZoom: () => scale,\r\n setZoom: (level: number) => {\r\n scale = level;\r\n container.style.transform = `scale(${scale})`;\r\n },\r\n fitToPage: () => {\r\n scale = 1.0;\r\n container.style.transform = `scale(1)`;\r\n },\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} 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 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: () => {\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: '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 }\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.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 let fontSize = 13;\r\n const pre = document.createElement('pre');\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\r\n const code = document.createElement('code');\r\n const ext = (ctx.metadata.extension || '').replace('.', '');\r\n\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 pre.appendChild(code);\r\n container.appendChild(pre);\r\n ctx.container.appendChild(container);\r\n\r\n const cleanup = () => {\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 fontSize = Math.min(32, fontSize + 2);\r\n pre.style.fontSize = `${fontSize}px`;\r\n },\r\n zoomOut: () => {\r\n fontSize = Math.max(8, fontSize - 2);\r\n pre.style.fontSize = `${fontSize}px`;\r\n },\r\n getZoom: () => fontSize / 13,\r\n setZoom: (level: number) => {\r\n fontSize = Math.round(13 * level);\r\n pre.style.fontSize = `${fontSize}px`;\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(text);\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: 'Reset Zoom',\r\n type: 'button',\r\n group: 'zoom',\r\n execute: () => instance.fitToPage?.()\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 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: '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 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 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: '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-prev',\r\n icon: 'page-prev',\r\n label: 'Previous Slide',\r\n type: 'button',\r\n group: 'navigation',\r\n execute: () => {\r\n const cur = instance.getCurrentPage?.() ?? 1;\r\n if (cur > 1) instance.goToPage?.(cur - 1);\r\n }\r\n },\r\n {\r\n id: 'page-nav',\r\n icon: '',\r\n label: 'Slide Number',\r\n type: 'page-nav',\r\n group: 'navigation',\r\n execute: (page: unknown) => instance.goToPage?.(Number(page))\r\n },\r\n {\r\n id: 'page-next',\r\n icon: 'page-next',\r\n label: 'Next Slide',\r\n type: 'button',\r\n group: 'navigation',\r\n execute: () => {\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 }\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: '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\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 `;\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 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 } 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.1;\r\n slideContainer.style.transform = `scale(${scale})`;\r\n },\r\n zoomOut: () => {\r\n scale = Math.max(0.2, scale - 0.1);\r\n slideContainer.style.transform = `scale(${scale})`;\r\n },\r\n getZoom: () => scale,\r\n setZoom: (level: number) => {\r\n scale = level;\r\n slideContainer.style.transform = `scale(${scale})`;\r\n },\r\n fitToPage: () => {\r\n scale = 1.0;\r\n slideContainer.style.transform = 'scale(1)';\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: '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 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 { \n FileInfo, \n RenderContext, \n ToolbarAction, \n PreviewPlugin, \n PreviewInstance \n} from '@patel.sumit51/core';\nimport { RTFJS } from 'rtf.js';\n\nexport class RtfPlugin implements PreviewPlugin {\n id = 'rtf';\n name = 'Rich Text Format (RTF)';\n extensions = ['.rtf'];\n mimeTypes = ['text/rtf', 'application/rtf'];\n weight = 80;\n\n supports(file: FileInfo): boolean {\n const ext = file.metadata.extension?.toLowerCase();\n const mime = file.metadata.mimeType?.toLowerCase();\n return this.extensions.includes(ext || '') || this.mimeTypes.includes(mime || '');\n }\n\n getToolbarActions(instance: PreviewInstance): ToolbarAction[] {\n return [\n {\n id: 'zoom-out',\n icon: 'zoom-out',\n label: 'Zoom Out',\n type: 'button',\n group: 'zoom',\n execute: () => instance.zoomOut?.()\n },\n {\n id: 'zoom-in',\n icon: 'zoom-in',\n label: 'Zoom In',\n type: 'button',\n group: 'zoom',\n execute: () => instance.zoomIn?.()\n },\n {\n id: 'fit-page',\n icon: 'fit-page',\n label: 'Fit to Page',\n type: 'button',\n group: 'zoom',\n execute: () => instance.fitToPage?.()\n },\n {\n id: 'download',\n icon: 'download',\n label: 'Download',\n type: 'button',\n group: 'actions',\n execute: () => instance.download?.()\n },\n {\n id: 'print',\n icon: 'print',\n label: 'Print',\n type: 'button',\n group: 'actions',\n execute: () => instance.print?.()\n }\n ];\n }\n\n async render(ctx: RenderContext): Promise<PreviewInstance> {\n const wrapper = document.createElement('div');\n wrapper.className = 'fp-rtf-wrapper';\n wrapper.style.padding = '32px';\n wrapper.style.maxWidth = '850px';\n wrapper.style.margin = '0 auto';\n wrapper.style.backgroundColor = '#fff';\n wrapper.style.boxShadow = '0 2px 8px rgba(0,0,0,0.08)';\n wrapper.style.borderRadius = '4px';\n wrapper.style.minHeight = '100%';\n wrapper.style.transformOrigin = 'top center';\n wrapper.style.transition = 'transform 0.2s ease';\n\n ctx.container.style.overflow = 'auto';\n ctx.container.style.padding = '24px';\n ctx.container.style.backgroundColor = '#f1f5f9';\n ctx.container.appendChild(wrapper);\n\n let scale = 1.0;\n\n try {\n const doc = new RTFJS.Document(ctx.buffer, {});\n const htmlElements = await doc.render();\n for (const el of htmlElements) {\n wrapper.appendChild(el);\n }\n } catch (err) {\n console.warn('[RtfPlugin] RTF render error, fallback text:', err);\n const text = new TextDecoder('latin1').decode(ctx.buffer);\n const clean = text.replace(/\\\\par[d]?/g, '\\n').replace(/\\\\[a-zA-Z0-9\\-]+/g, '').replace(/[{}]/g, '');\n wrapper.innerHTML = `<pre style=\"white-space: pre-wrap; font-family: serif; color: #333;\">${clean}</pre>`;\n }\n\n const cleanup = () => {\n wrapper.remove();\n ctx.container.innerHTML = '';\n };\n\n ctx.signal.addEventListener('abort', cleanup);\n\n return {\n destroy: cleanup,\n zoomIn: () => {\n scale += 0.1;\n wrapper.style.transform = `scale(${scale})`;\n },\n zoomOut: () => {\n scale = Math.max(0.2, scale - 0.1);\n wrapper.style.transform = `scale(${scale})`;\n },\n getZoom: () => scale,\n setZoom: (level: number) => {\n scale = level;\n wrapper.style.transform = `scale(${scale})`;\n },\n fitToPage: () => {\n scale = 1.0;\n wrapper.style.transform = 'scale(1)';\n },\n download: () => {\n const blob = new Blob([ctx.buffer], { type: 'application/rtf' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = ctx.metadata.name || 'document.rtf';\n a.click();\n URL.revokeObjectURL(url);\n },\n print: () => {\n window.print();\n }\n };\n }\n}\n\nexport function rtfPlugin(): RtfPlugin {\n return new RtfPlugin();\n}\n\nexport default RtfPlugin;\n","import type { \n FileInfo, \n RenderContext, \n ToolbarAction, \n PreviewPlugin, \n PreviewInstance \n} from '@patel.sumit51/core';\nimport DOMPurify from 'dompurify';\n\nexport class HtmlPreviewPlugin implements PreviewPlugin {\n id = 'html-preview';\n name = 'HTML Document Preview';\n extensions = ['.html', '.htm', '.xhtml'];\n mimeTypes = ['text/html', 'application/xhtml+xml'];\n weight = 85;\n\n supports(file: FileInfo): boolean {\n const ext = file.metadata.extension?.toLowerCase();\n const mime = file.metadata.mimeType?.toLowerCase();\n return this.extensions.includes(ext || '') || this.mimeTypes.includes(mime || '');\n }\n\n getToolbarActions(instance: PreviewInstance): ToolbarAction[] {\n return [\n {\n id: 'zoom-out',\n icon: 'zoom-out',\n label: 'Zoom Out',\n type: 'button',\n group: 'zoom',\n execute: () => instance.zoomOut?.()\n },\n {\n id: 'zoom-in',\n icon: 'zoom-in',\n label: 'Zoom In',\n type: 'button',\n group: 'zoom',\n execute: () => instance.zoomIn?.()\n },\n {\n id: 'fit-page',\n icon: 'fit-page',\n label: 'Fit to Page',\n type: 'button',\n group: 'zoom',\n execute: () => instance.fitToPage?.()\n },\n {\n id: 'copy',\n icon: 'copy',\n label: 'Copy HTML',\n type: 'button',\n group: 'actions',\n execute: () => (instance as any).copy?.()\n },\n {\n id: 'download',\n icon: 'download',\n label: 'Download',\n type: 'button',\n group: 'actions',\n execute: () => instance.download?.()\n },\n {\n id: 'print',\n icon: 'print',\n label: 'Print',\n type: 'button',\n group: 'actions',\n execute: () => instance.print?.()\n }\n ];\n }\n\n async render(ctx: RenderContext): Promise<PreviewInstance> {\n const rawHtml = new TextDecoder('utf-8').decode(ctx.buffer);\n const sanitized = DOMPurify.sanitize(rawHtml, {\n WHOLE_DOCUMENT: true,\n ADD_TAGS: ['style', 'link'],\n ADD_ATTR: ['target', 'rel']\n });\n\n const iframe = document.createElement('iframe');\n iframe.className = 'fp-html-iframe';\n iframe.style.width = '100%';\n iframe.style.height = '100%';\n iframe.style.border = 'none';\n iframe.style.backgroundColor = '#ffffff';\n iframe.style.transformOrigin = 'top left';\n iframe.style.transition = 'transform 0.2s ease';\n // Sandbox without allow-scripts ensures no malicious JS can execute\n iframe.sandbox.add('allow-same-origin');\n\n ctx.container.style.overflow = 'auto';\n ctx.container.style.width = '100%';\n ctx.container.style.height = '100%';\n ctx.container.appendChild(iframe);\n\n // Set sanitized content via srcdoc\n iframe.srcdoc = sanitized;\n\n let scale = 1.0;\n\n const cleanup = () => {\n iframe.remove();\n ctx.container.innerHTML = '';\n };\n\n ctx.signal.addEventListener('abort', cleanup);\n\n return {\n destroy: cleanup,\n zoomIn: () => {\n scale += 0.1;\n iframe.style.transform = `scale(${scale})`;\n },\n zoomOut: () => {\n scale = Math.max(0.2, scale - 0.1);\n iframe.style.transform = `scale(${scale})`;\n },\n getZoom: () => scale,\n setZoom: (level: number) => {\n scale = level;\n iframe.style.transform = `scale(${scale})`;\n },\n fitToPage: () => {\n scale = 1.0;\n iframe.style.transform = 'scale(1)';\n },\n copy: () => {\n navigator.clipboard.writeText(rawHtml);\n },\n download: () => {\n const blob = new Blob([ctx.buffer], { type: 'text/html' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = ctx.metadata.name || 'document.html';\n a.click();\n URL.revokeObjectURL(url);\n },\n print: () => {\n iframe.contentWindow?.print();\n }\n } as any;\n }\n}\n\nexport function htmlPreviewPlugin(): HtmlPreviewPlugin {\n return new HtmlPreviewPlugin();\n}\n\nexport default HtmlPreviewPlugin;\n","import type { \n FileInfo, \n RenderContext, \n ToolbarAction, \n PreviewPlugin, \n PreviewInstance,\n Thumbnail\n} from '@patel.sumit51/core';\nimport { unzipSync, strFromU8 } from 'fflate';\nimport DOMPurify from 'dompurify';\n\nexport class OpenDocumentPlugin implements PreviewPlugin {\n id = 'opendocument';\n name = 'OpenDocument Preview (ODT, ODP, ODS, ODG, ODF)';\n extensions = ['.odt', '.odp', '.ods', '.odg', '.odf'];\n mimeTypes = [\n 'application/vnd.oasis.opendocument.text',\n 'application/vnd.oasis.opendocument.presentation',\n 'application/vnd.oasis.opendocument.spreadsheet',\n 'application/vnd.oasis.opendocument.graphics',\n 'application/vnd.oasis.opendocument.formula'\n ];\n weight = 80;\n\n supports(file: FileInfo): boolean {\n const ext = file.metadata.extension?.toLowerCase();\n const mime = file.metadata.mimeType?.toLowerCase();\n return this.extensions.includes(ext || '') || this.mimeTypes.includes(mime || '');\n }\n\n getToolbarActions(instance: PreviewInstance): ToolbarAction[] {\n const isPresentation = (instance as any).isPresentation;\n const actions: ToolbarAction[] = [];\n\n if (isPresentation) {\n actions.push(\n {\n id: 'thumbnails',\n icon: 'thumbnails',\n label: 'Slide Thumbnails',\n type: 'button',\n group: 'navigation',\n execute: () => instance.toggleThumbnails?.()\n },\n {\n id: 'page-prev',\n icon: 'page-prev',\n label: 'Previous Slide',\n type: 'button',\n group: 'navigation',\n execute: () => {\n const cur = instance.getCurrentPage?.() ?? 1;\n if (cur > 1) instance.goToPage?.(cur - 1);\n }\n },\n {\n id: 'page-nav',\n icon: '',\n label: 'Slide Number',\n type: 'page-nav',\n group: 'navigation',\n execute: (p: unknown) => instance.goToPage?.(Number(p))\n },\n {\n id: 'page-next',\n icon: 'page-next',\n label: 'Next Slide',\n type: 'button',\n group: 'navigation',\n execute: () => {\n const cur = instance.getCurrentPage?.() ?? 1;\n const total = instance.getPageCount?.() ?? 1;\n if (cur < total) instance.goToPage?.(cur + 1);\n }\n }\n );\n }\n\n actions.push(\n {\n id: 'zoom-out',\n icon: 'zoom-out',\n label: 'Zoom Out',\n type: 'button',\n group: 'zoom',\n execute: () => instance.zoomOut?.()\n },\n {\n id: 'zoom-in',\n icon: 'zoom-in',\n label: 'Zoom In',\n type: 'button',\n group: 'zoom',\n execute: () => instance.zoomIn?.()\n },\n {\n id: 'fit-page',\n icon: 'fit-page',\n label: 'Fit to Page',\n type: 'button',\n group: 'zoom',\n execute: () => instance.fitToPage?.()\n },\n {\n id: 'download',\n icon: 'download',\n label: 'Download',\n type: 'button',\n group: 'actions',\n execute: () => instance.download?.()\n },\n {\n id: 'print',\n icon: 'print',\n label: 'Print',\n type: 'button',\n group: 'actions',\n execute: () => instance.print?.()\n }\n );\n\n return actions;\n }\n\n async render(ctx: RenderContext): Promise<PreviewInstance> {\n const ext = (ctx.metadata.extension || '').toLowerCase();\n const mime = (ctx.metadata.mimeType || '').toLowerCase();\n const isPresentation = ext === '.odp' || mime.includes('presentation');\n const isFormula = ext === '.odf' || mime.includes('formula');\n const isDrawing = ext === '.odg' || mime.includes('graphics');\n\n let unzipped: Record<string, Uint8Array>;\n try {\n unzipped = unzipSync(new Uint8Array(ctx.buffer));\n } catch {\n throw new Error('Failed to decompress OpenDocument package (invalid ZIP format)');\n }\n\n // Pre-cache embedded image URLs\n const imageUrls = new Map<string, string>();\n for (const [filePath, fileBytes] of Object.entries(unzipped)) {\n if (filePath.startsWith('Pictures/')) {\n const imageMime = filePath.endsWith('.png') ? 'image/png' :\n filePath.endsWith('.jpg') || filePath.endsWith('.jpeg') ? 'image/jpeg' :\n filePath.endsWith('.svg') ? 'image/svg+xml' : 'application/octet-stream';\n const blob = new Blob([fileBytes], { type: imageMime });\n imageUrls.set(filePath, URL.createObjectURL(blob));\n }\n }\n\n const contentXmlStr = unzipped['content.xml'] ? strFromU8(unzipped['content.xml']) : '';\n const stylesXmlStr = unzipped['styles.xml'] ? strFromU8(unzipped['styles.xml']) : '';\n\n const parser = new DOMParser();\n const contentDoc = parser.parseFromString(contentXmlStr, 'application/xml');\n const stylesDoc = stylesXmlStr ? parser.parseFromString(stylesXmlStr, 'application/xml') : null;\n\n // Extract styles map\n const styleMap = this.extractStyles(stylesDoc, contentDoc);\n\n const container = document.createElement('div');\n container.className = 'fp-odf-container';\n container.style.width = '100%';\n container.style.height = '100%';\n container.style.overflow = 'auto';\n container.style.padding = '24px';\n container.style.backgroundColor = '#f1f5f9';\n\n const wrapper = document.createElement('div');\n wrapper.className = 'fp-odf-wrapper';\n wrapper.style.margin = '0 auto';\n wrapper.style.backgroundColor = '#ffffff';\n wrapper.style.boxShadow = '0 2px 10px rgba(0,0,0,0.08)';\n wrapper.style.borderRadius = '4px';\n wrapper.style.transformOrigin = 'top center';\n wrapper.style.transition = 'transform 0.2s ease';\n\n container.appendChild(wrapper);\n ctx.container.appendChild(container);\n\n let scale = 1.0;\n let currentPage = 1;\n let totalPages = 1;\n let slides: HTMLElement[] = [];\n\n if (isPresentation) {\n // ODP (Presentation): render slides\n wrapper.style.maxWidth = '960px';\n wrapper.style.aspectRatio = '16 / 9';\n wrapper.style.position = 'relative';\n wrapper.style.overflow = 'hidden';\n\n slides = this.renderSlides(contentDoc, styleMap, imageUrls);\n totalPages = Math.max(1, slides.length);\n\n slides.forEach((slide, idx) => {\n slide.style.display = idx === 0 ? 'block' : 'none';\n slide.style.width = '100%';\n slide.style.height = '100%';\n slide.style.position = 'absolute';\n slide.style.top = '0';\n slide.style.left = '0';\n wrapper.appendChild(slide);\n });\n } else if (isFormula) {\n // ODF (Formula): extract MathML\n wrapper.style.maxWidth = '800px';\n wrapper.style.padding = '48px';\n wrapper.style.textAlign = 'center';\n wrapper.style.fontSize = '24px';\n\n const mathEl = contentDoc.querySelector('math');\n if (mathEl) {\n wrapper.innerHTML = mathEl.outerHTML;\n } else {\n wrapper.textContent = contentDoc.documentElement.textContent || 'Formula content';\n }\n } else {\n // ODT (Text), ODS (Spreadsheet fallback), ODG (Graphics)\n wrapper.style.maxWidth = '850px';\n wrapper.style.padding = '48px';\n wrapper.style.minHeight = '100%';\n\n const bodyHtml = this.renderOdfBody(contentDoc, styleMap, imageUrls);\n wrapper.innerHTML = DOMPurify.sanitize(bodyHtml, {\n ADD_TAGS: ['math', 'semantics', 'mrow', 'mi', 'mo', 'mn', 'msup', 'msub'],\n ADD_ATTR: ['style', 'colspan', 'rowspan']\n });\n }\n\n const cleanup = () => {\n imageUrls.forEach(url => URL.revokeObjectURL(url));\n container.remove();\n ctx.container.innerHTML = '';\n };\n\n ctx.signal.addEventListener('abort', cleanup);\n\n const goToPage = (page: number) => {\n if (!isPresentation || page < 1 || page > totalPages) return;\n currentPage = page;\n slides.forEach((s, idx) => {\n s.style.display = idx === page - 1 ? 'block' : 'none';\n });\n ctx.emit('page-change', { page: currentPage, total: totalPages });\n };\n\n return {\n destroy: cleanup,\n isPresentation,\n zoomIn: () => {\n scale += 0.1;\n wrapper.style.transform = `scale(${scale})`;\n },\n zoomOut: () => {\n scale = Math.max(0.2, scale - 0.1);\n wrapper.style.transform = `scale(${scale})`;\n },\n getZoom: () => scale,\n setZoom: (level: number) => {\n scale = level;\n wrapper.style.transform = `scale(${scale})`;\n },\n fitToPage: () => {\n scale = 1.0;\n wrapper.style.transform = 'scale(1)';\n },\n goToPage,\n getPageCount: () => totalPages,\n getCurrentPage: () => currentPage,\n getThumbnails: async (): Promise<Thumbnail[]> => {\n if (!isPresentation) return [];\n return slides.map((_, idx) => ({\n index: idx,\n label: `Slide ${idx + 1}`,\n render: async (canvas: HTMLCanvasElement) => {\n const ctx2d = canvas.getContext('2d');\n if (!ctx2d) return;\n canvas.width = 160;\n canvas.height = 90;\n ctx2d.fillStyle = '#f8fafc';\n ctx2d.fillRect(0, 0, 160, 90);\n ctx2d.fillStyle = '#334155';\n ctx2d.font = 'bold 12px sans-serif';\n ctx2d.textAlign = 'center';\n ctx2d.fillText(`Slide ${idx + 1}`, 80, 50);\n }\n }));\n },\n download: () => {\n const mimeType = this.mimeTypes.find(m => m.includes(ext.replace('.', ''))) || 'application/octet-stream';\n const blob = new Blob([ctx.buffer], { type: mimeType });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = ctx.metadata.name || `document${ext}`;\n a.click();\n URL.revokeObjectURL(url);\n },\n print: () => {\n window.print();\n }\n } as any;\n }\n\n private extractStyles(stylesDoc: Document | null, contentDoc: Document): Map<string, string> {\n const map = new Map<string, string>();\n const styleNodes: Element[] = [];\n\n if (stylesDoc) {\n styleNodes.push(...Array.from(stylesDoc.querySelectorAll('style, [name]')));\n }\n styleNodes.push(...Array.from(contentDoc.querySelectorAll('style, [name]')));\n\n for (const node of styleNodes) {\n const name = node.getAttribute('style:name') || node.getAttribute('name');\n if (!name) continue;\n\n let css = '';\n const textProp = node.querySelector('text-properties, [font-weight], [font-style], [color]');\n if (textProp) {\n const weight = textProp.getAttribute('fo:font-weight') || textProp.getAttribute('font-weight');\n const style = textProp.getAttribute('fo:font-style') || textProp.getAttribute('font-style');\n const color = textProp.getAttribute('fo:color') || textProp.getAttribute('color');\n const size = textProp.getAttribute('fo:font-size') || textProp.getAttribute('font-size');\n\n if (weight === 'bold') css += 'font-weight: bold; ';\n if (style === 'italic') css += 'font-style: italic; ';\n if (color) css += `color: ${color}; `;\n if (size) css += `font-size: ${size}; `;\n }\n\n const paraProp = node.querySelector('paragraph-properties, [text-align]');\n if (paraProp) {\n const align = paraProp.getAttribute('fo:text-align') || paraProp.getAttribute('text-align');\n const mt = paraProp.getAttribute('fo:margin-top') || paraProp.getAttribute('margin-top');\n const mb = paraProp.getAttribute('fo:margin-bottom') || paraProp.getAttribute('margin-bottom');\n\n if (align) css += `text-align: ${align}; `;\n if (mt) css += `margin-top: ${mt}; `;\n if (mb) css += `margin-bottom: ${mb}; `;\n }\n\n if (css) map.set(name, css);\n }\n\n return map;\n }\n\n private renderOdfBody(contentDoc: Document, styles: Map<string, string>, images: Map<string, string>): string {\n const body = contentDoc.querySelector('body') || contentDoc.documentElement;\n let html = '';\n\n const walk = (node: Element) => {\n const tag = node.localName || node.tagName.toLowerCase();\n\n switch (tag) {\n case 'h': {\n const level = Math.min(6, Math.max(1, Number(node.getAttribute('text:outline-level') || 1)));\n const style = styles.get(node.getAttribute('text:style-name') || '') || '';\n html += `<h${level} style=\"${style}; font-family: -apple-system, BlinkMacSystemFont, sans-serif;\">${node.textContent || ''}</h${level}>`;\n break;\n }\n case 'p': {\n const style = styles.get(node.getAttribute('text:style-name') || '') || '';\n const inner = this.renderSpans(node, styles, images);\n html += `<p style=\"${style}; line-height: 1.6; margin: 8px 0; font-family: -apple-system, BlinkMacSystemFont, sans-serif;\">${inner}</p>`;\n break;\n }\n case 'list': {\n html += '<ul style=\"margin: 8px 0; padding-left: 24px;\">';\n Array.from(node.children).forEach(c => walk(c));\n html += '</ul>';\n break;\n }\n case 'list-item': {\n html += '<li>';\n Array.from(node.children).forEach(c => walk(c));\n html += '</li>';\n break;\n }\n case 'table': {\n html += '<table style=\"border-collapse: collapse; width: 100%; margin: 16px 0; border: 1px solid #d0d7de;\">';\n Array.from(node.children).forEach(c => walk(c));\n html += '</table>';\n break;\n }\n case 'table-row': {\n html += '<tr>';\n Array.from(node.children).forEach(c => walk(c));\n html += '</tr>';\n break;\n }\n case 'table-cell': {\n html += '<td style=\"border: 1px solid #d0d7de; padding: 8px 12px; font-size: 13px;\">';\n Array.from(node.children).forEach(c => walk(c));\n html += '</td>';\n break;\n }\n default:\n Array.from(node.children).forEach(c => walk(c));\n }\n };\n\n Array.from(body.children).forEach(c => walk(c));\n\n return html || '<p style=\"color: #666; font-style: italic;\">(Document is empty)</p>';\n }\n\n private renderSpans(node: Element, styles: Map<string, string>, images: Map<string, string>): string {\n let result = '';\n\n for (const child of Array.from(node.childNodes)) {\n if (child.nodeType === Node.TEXT_NODE) {\n result += child.textContent || '';\n } else if (child.nodeType === Node.ELEMENT_NODE) {\n const el = child as Element;\n const tag = el.localName || el.tagName.toLowerCase();\n\n if (tag === 'span') {\n const style = styles.get(el.getAttribute('text:style-name') || '') || '';\n result += `<span style=\"${style}\">${el.textContent || ''}</span>`;\n } else if (tag === 'image') {\n const href = el.getAttribute('xlink:href') || el.getAttribute('href') || '';\n const blobUrl = images.get(href);\n if (blobUrl) {\n result += `<img src=\"${blobUrl}\" style=\"max-width: 100%; height: auto; margin: 8px 0;\" alt=\"Embedded image\" />`;\n }\n } else if (tag === 's') {\n const count = Number(el.getAttribute('text:c') || 1);\n result += '&nbsp;'.repeat(count);\n } else if (tag === 'tab') {\n result += '&emsp;';\n } else if (tag === 'line-break') {\n result += '<br/>';\n } else {\n result += el.textContent || '';\n }\n }\n }\n\n return result;\n }\n\n private renderSlides(contentDoc: Document, styles: Map<string, string>, images: Map<string, string>): HTMLElement[] {\n const pages = Array.from(contentDoc.querySelectorAll('page, [draw\\\\:name]'));\n const slides: HTMLElement[] = [];\n\n const pageNodes = pages.length > 0 ? pages : Array.from(contentDoc.getElementsByTagNameNS('*', 'page'));\n\n if (pageNodes.length === 0) {\n const fallbackSlide = document.createElement('div');\n fallbackSlide.style.padding = '40px';\n fallbackSlide.style.textAlign = 'center';\n fallbackSlide.innerHTML = '<h2>Presentation</h2><p>No slides found</p>';\n return [fallbackSlide];\n }\n\n pageNodes.forEach((pageEl, idx) => {\n const slide = document.createElement('div');\n slide.className = `fp-odp-slide fp-odp-slide-${idx + 1}`;\n slide.style.padding = '40px';\n slide.style.boxSizing = 'border-box';\n slide.style.display = 'flex';\n slide.style.flexDirection = 'column';\n slide.style.justifyContent = 'center';\n slide.style.alignItems = 'center';\n slide.style.background = '#ffffff';\n\n const textFrames = Array.from(pageEl.querySelectorAll('frame, text-box, [draw\\\\:text-style-name]'));\n if (textFrames.length > 0) {\n textFrames.forEach((frame) => {\n const text = frame.textContent?.trim();\n if (text) {\n const p = document.createElement('div');\n p.style.margin = '12px 0';\n p.style.fontSize = idx === 0 ? '24px' : '16px';\n p.style.fontWeight = idx === 0 ? 'bold' : 'normal';\n p.style.color = '#1e293b';\n p.textContent = text;\n slide.appendChild(p);\n }\n });\n } else {\n slide.innerHTML = `<h3>Slide ${idx + 1}</h3><p>${pageEl.textContent?.trim() || ''}</p>`;\n }\n\n slides.push(slide);\n });\n\n return slides;\n }\n}\n\nexport function openDocumentPlugin(): OpenDocumentPlugin {\n return new OpenDocumentPlugin();\n}\n\nexport default OpenDocumentPlugin;\n","import type { \n FileInfo, \n RenderContext, \n ToolbarAction, \n PreviewPlugin, \n PreviewInstance \n} from '@patel.sumit51/core';\nimport { CfbfReader } from '@patel.sumit51/core';\nimport DOMPurify from 'dompurify';\n\nexport class DocPlugin implements PreviewPlugin {\n id = 'doc';\n name = 'Legacy Word Document Preview (.doc, .dot)';\n extensions = ['.doc', '.dot'];\n mimeTypes = ['application/msword', 'application/vnd.ms-word'];\n weight = 75;\n\n supports(file: FileInfo): boolean {\n const ext = file.metadata.extension?.toLowerCase();\n const mime = file.metadata.mimeType?.toLowerCase();\n return this.extensions.includes(ext || '') || this.mimeTypes.includes(mime || '');\n }\n\n getToolbarActions(instance: PreviewInstance): ToolbarAction[] {\n return [\n {\n id: 'zoom-out',\n icon: 'zoom-out',\n label: 'Zoom Out',\n type: 'button',\n group: 'zoom',\n execute: () => instance.zoomOut?.()\n },\n {\n id: 'zoom-in',\n icon: 'zoom-in',\n label: 'Zoom In',\n type: 'button',\n group: 'zoom',\n execute: () => instance.zoomIn?.()\n },\n {\n id: 'fit-page',\n icon: 'fit-page',\n label: 'Fit to Page',\n type: 'button',\n group: 'zoom',\n execute: () => instance.fitToPage?.()\n },\n {\n id: 'copy',\n icon: 'copy',\n label: 'Copy Text',\n type: 'button',\n group: 'actions',\n execute: () => (instance as any).copy?.()\n },\n {\n id: 'download',\n icon: 'download',\n label: 'Download',\n type: 'button',\n group: 'actions',\n execute: () => instance.download?.()\n },\n {\n id: 'print',\n icon: 'print',\n label: 'Print',\n type: 'button',\n group: 'actions',\n execute: () => instance.print?.()\n }\n ];\n }\n\n async render(ctx: RenderContext): Promise<PreviewInstance> {\n const container = document.createElement('div');\n container.className = 'fp-doc-container';\n container.style.width = '100%';\n container.style.height = '100%';\n container.style.overflow = 'auto';\n container.style.padding = '32px 16px';\n container.style.backgroundColor = '#f1f5f9';\n\n const wrapper = document.createElement('div');\n wrapper.className = 'fp-doc-wrapper';\n wrapper.style.maxWidth = '850px';\n wrapper.style.margin = '0 auto';\n wrapper.style.backgroundColor = '#ffffff';\n wrapper.style.boxShadow = '0 2px 12px rgba(0,0,0,0.08)';\n wrapper.style.borderRadius = '4px';\n wrapper.style.padding = '56px 48px';\n wrapper.style.minHeight = '100%';\n wrapper.style.transformOrigin = 'top center';\n wrapper.style.transition = 'transform 0.2s ease';\n wrapper.style.fontFamily = 'Calibri, \"Segoe UI\", Arial, sans-serif';\n wrapper.style.color = '#1e293b';\n\n container.appendChild(wrapper);\n ctx.container.appendChild(container);\n\n let scale = 1.0;\n let extractedRawText = '';\n\n try {\n const cfbf = new CfbfReader(ctx.buffer);\n const wordDocStream = cfbf.readStream('WordDocument');\n\n if (!wordDocStream || wordDocStream.length < 512) {\n throw new Error('WordDocument stream not found or invalid in CFBF archive');\n }\n\n // Check FIB to identify table stream\n const view = new DataView(wordDocStream.buffer, wordDocStream.byteOffset, wordDocStream.byteLength);\n const flags = view.getUint16(0x000A, true);\n const is1Table = (flags & 0x0200) !== 0;\n const tableName = is1Table ? '1Table' : '0Table';\n const tableStream = cfbf.readStream(tableName);\n\n const text = this.extractDocText(wordDocStream, tableStream);\n extractedRawText = text;\n\n wrapper.innerHTML = this.formatDocToHtml(text, ctx.metadata.name || 'Document');\n } catch (err) {\n console.warn('[DocPlugin] Binary parsing error, fallback text:', err);\n // Fallback: search for readable strings directly in the buffer\n const fallback = this.heuristicTextExtraction(ctx.buffer);\n extractedRawText = fallback;\n wrapper.innerHTML = `\n <div style=\"border-bottom: 1px solid #e2e8f0; padding-bottom: 12px; margin-bottom: 24px;\">\n <h2 style=\"margin: 0 0 6px; font-size: 20px; color: #334155;\">${ctx.metadata.name || 'Word Document (.doc)'}</h2>\n <span style=\"font-size: 12px; color: #64748b; background: #f1f5f9; padding: 2px 8px; border-radius: 4px;\">Legacy Word 97-2003 Binary Preview</span>\n </div>\n ${this.formatDocToHtml(fallback, ctx.metadata.name || 'Document')}\n `;\n }\n\n const cleanup = () => {\n container.remove();\n ctx.container.innerHTML = '';\n };\n\n ctx.signal.addEventListener('abort', cleanup);\n\n return {\n destroy: cleanup,\n zoomIn: () => {\n scale += 0.1;\n wrapper.style.transform = `scale(${scale})`;\n },\n zoomOut: () => {\n scale = Math.max(0.2, scale - 0.1);\n wrapper.style.transform = `scale(${scale})`;\n },\n getZoom: () => scale,\n setZoom: (level: number) => {\n scale = level;\n wrapper.style.transform = `scale(${scale})`;\n },\n fitToPage: () => {\n scale = 1.0;\n wrapper.style.transform = 'scale(1)';\n },\n copy: () => {\n navigator.clipboard.writeText(extractedRawText);\n },\n download: () => {\n const blob = new Blob([ctx.buffer], { type: 'application/msword' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = ctx.metadata.name || 'document.doc';\n a.click();\n URL.revokeObjectURL(url);\n },\n print: () => {\n window.print();\n }\n } as any;\n }\n\n /**\n * Extract document text from WordDocument stream and Table stream\n */\n private extractDocText(wordDoc: Uint8Array, tableStream: Uint8Array | null): string {\n const view = new DataView(wordDoc.buffer, wordDoc.byteOffset, wordDoc.byteLength);\n\n // Read fcClx offset and lcbClx length from FIB\n // In Word 97-2003, fcClx is at offset 0x01A2 (418), lcbClx is at 0x01A6 (422)\n let fcClx = 0;\n let lcbClx = 0;\n if (wordDoc.length >= 0x01AA) {\n fcClx = view.getUint32(0x01A2, true);\n lcbClx = view.getUint32(0x01A6, true);\n }\n\n // If CLX is found in table stream, parse Piece Table\n if (tableStream && fcClx > 0 && lcbClx > 0 && fcClx + lcbClx <= tableStream.length) {\n try {\n const text = this.parsePieceTable(wordDoc, tableStream, fcClx, lcbClx);\n if (text && text.trim().length > 0) return text;\n } catch (err) {\n console.warn('[DocPlugin] Error in piece table parsing:', err);\n }\n }\n\n // Fallback: Word 97-2003 documents place the main text beginning at offset 0x0A00 (2560)\n // up to the table stream or end of main stream.\n if (wordDoc.length > 0x0A00) {\n const textChunk = wordDoc.subarray(0x0A00);\n const extracted = this.extractStringsFromBytes(textChunk);\n if (extracted.trim().length > 0) return extracted;\n }\n\n return this.extractStringsFromBytes(wordDoc);\n }\n\n /**\n * Parse the CLX and Piece Table (Plcfpcd) according to [MS-DOC]\n */\n private parsePieceTable(wordDoc: Uint8Array, table: Uint8Array, fcClx: number, lcbClx: number): string {\n let offset = fcClx;\n const end = fcClx + lcbClx;\n\n // Skip PRC records until we find clxt = 0x02 (Pcdt)\n while (offset < end) {\n const clxt = table[offset];\n if (clxt === 0x01) {\n // Grpprl\n const cb = new DataView(table.buffer, table.byteOffset + offset + 1).getUint16(0, true);\n offset += 3 + cb;\n } else if (clxt === 0x02) {\n // Pcdt (Piece table descriptor)\n offset += 1;\n const lcb = new DataView(table.buffer, table.byteOffset + offset).getUint32(0, true);\n offset += 4;\n return this.readPlcfpcd(wordDoc, table, offset, lcb);\n } else {\n break;\n }\n }\n\n return '';\n }\n\n private readPlcfpcd(wordDoc: Uint8Array, table: Uint8Array, offset: number, lcb: number): string {\n const view = new DataView(table.buffer, table.byteOffset + offset);\n // Number of pieces: lcb = 4*(n+1) + 8*n => 12*n + 4 = lcb => n = (lcb - 4) / 12\n const n = Math.floor((lcb - 4) / 12);\n if (n <= 0) return '';\n\n const cpOffsets: number[] = [];\n for (let i = 0; i <= n; i++) {\n cpOffsets.push(view.getUint32(i * 4, true));\n }\n\n const pcdOffset = (n + 1) * 4;\n let fullText = '';\n\n for (let i = 0; i < n; i++) {\n const fc = view.getUint32(pcdOffset + i * 8 + 2, true);\n const isCompressed = (fc & 0x40000000) !== 0;\n const byteOffset = (fc & 0x3fffffff) >> (isCompressed ? 1 : 0);\n const charCount = cpOffsets[i + 1] - cpOffsets[i];\n\n if (isCompressed) {\n // 8-bit ANSI characters\n const slice = wordDoc.subarray(byteOffset, byteOffset + charCount);\n fullText += new TextDecoder('latin1').decode(slice);\n } else {\n // 16-bit UTF-16LE characters\n const slice = wordDoc.subarray(byteOffset, byteOffset + charCount * 2);\n fullText += new TextDecoder('utf-16le').decode(slice);\n }\n }\n\n return fullText;\n }\n\n /**\n * Scans a byte array for continuous sequences of readable characters (ANSI and UTF-16LE)\n */\n private extractStringsFromBytes(bytes: Uint8Array): string {\n const chars: string[] = [];\n const len = bytes.length;\n\n for (let i = 0; i < len; i++) {\n const b = bytes[i];\n // Check printable ASCII and common control codes\n if (b === 0x0D || b === 0x0A || b === 0x09 || (b >= 0x20 && b <= 0x7E) || (b >= 0xA0 && b <= 0xFF)) {\n chars.push(String.fromCharCode(b));\n } else if (b === 0x00 && i + 1 < len && bytes[i + 1] >= 0x20 && bytes[i + 1] <= 0x7E) {\n // UTF-16LE pattern where ASCII is second byte\n chars.push(String.fromCharCode(bytes[i + 1]));\n i++;\n } else if (b === 0x07) {\n // Table cell divider in Word\n chars.push('\\t');\n } else if (b === 0x0C) {\n // Page break\n chars.push('\\n\\n---PAGE---\\n\\n');\n }\n }\n\n return chars.join('');\n }\n\n private heuristicTextExtraction(buffer: ArrayBuffer): string {\n return this.extractStringsFromBytes(new Uint8Array(buffer));\n }\n\n /**\n * Format cleaned extracted text into attractive HTML paragraphs, headings, and lists\n */\n private formatDocToHtml(text: string, filename: string): string {\n // Normalize newlines and replace word internal codes\n const lines = text\n .replace(/\\r\\n/g, '\\n')\n .replace(/\\r/g, '\\n')\n .replace(/\\x0B/g, '\\n') // Line break\n .replace(/\\x0C/g, '\\n\\n') // Page break\n .split('\\n');\n\n let html = '';\n let inList = false;\n\n for (const rawLine of lines) {\n const line = rawLine.trim();\n if (!line) {\n if (inList) {\n html += '</ul>';\n inList = false;\n }\n continue;\n }\n\n // Filter out binary noise strings (e.g. font tables, internal IDs)\n if (/^[\\x00-\\x1F\\x7F-\\x9F]+$/.test(line)) continue;\n if (line.includes('Normal.dot') || line.includes('Microsoft Word') || line.includes('Times New Roman') && line.length < 30) {\n continue;\n }\n\n // Check if heading (short, all caps or title style)\n if (line.length < 60 && !line.endsWith('.') && (/^[A-Z0-9\\s:_-]+$/.test(line) || line.startsWith('#'))) {\n if (inList) {\n html += '</ul>';\n inList = false;\n }\n html += `<h2 style=\"font-size: 18px; font-weight: 700; color: #1e3a8a; margin: 20px 0 8px; border-bottom: 1px solid #e2e8f0; padding-bottom: 4px;\">${DOMPurify.sanitize(line)}</h2>`;\n } else if (line.startsWith('•') || line.startsWith('-') || line.startsWith('*')) {\n if (!inList) {\n html += '<ul style=\"margin: 8px 0; padding-left: 24px;\">';\n inList = true;\n }\n const bulletText = line.replace(/^[•\\-\\*]\\s*/, '');\n html += `<li style=\"margin: 4px 0; line-height: 1.6;\">${DOMPurify.sanitize(bulletText)}</li>`;\n } else {\n if (inList) {\n html += '</ul>';\n inList = false;\n }\n html += `<p style=\"line-height: 1.7; margin: 10px 0; font-size: 14px; text-align: justify;\">${DOMPurify.sanitize(line)}</p>`;\n }\n }\n\n if (inList) html += '</ul>';\n\n return html || `<p style=\"color: #64748b; font-style: italic;\">(No readable text found in ${DOMPurify.sanitize(filename)})</p>`;\n }\n}\n\nexport function docPlugin(): DocPlugin {\n return new DocPlugin();\n}\n\nexport default DocPlugin;\n","import type { \n FileInfo, \n RenderContext, \n ToolbarAction, \n PreviewPlugin, \n PreviewInstance,\n Thumbnail\n} from '@patel.sumit51/core';\nimport { CfbfReader } from '@patel.sumit51/core';\nimport DOMPurify from 'dompurify';\n\ninterface PptSlide {\n title: string;\n texts: string[];\n}\n\nexport class PptPlugin implements PreviewPlugin {\n id = 'ppt';\n name = 'Legacy PowerPoint Presentation (.ppt, .pps, .pot)';\n extensions = ['.ppt', '.pps', '.pot'];\n mimeTypes = ['application/vnd.ms-powerpoint'];\n weight = 75;\n\n supports(file: FileInfo): boolean {\n const ext = file.metadata.extension?.toLowerCase();\n const mime = file.metadata.mimeType?.toLowerCase();\n return this.extensions.includes(ext || '') || this.mimeTypes.includes(mime || '');\n }\n\n getToolbarActions(instance: PreviewInstance): ToolbarAction[] {\n return [\n {\n id: 'thumbnails',\n icon: 'thumbnails',\n label: 'Slide Thumbnails',\n type: 'button',\n group: 'navigation',\n execute: () => instance.toggleThumbnails?.()\n },\n {\n id: 'page-prev',\n icon: 'page-prev',\n label: 'Previous Slide',\n type: 'button',\n group: 'navigation',\n execute: () => {\n const cur = instance.getCurrentPage?.() ?? 1;\n if (cur > 1) instance.goToPage?.(cur - 1);\n }\n },\n {\n id: 'page-nav',\n icon: '',\n label: 'Slide Number',\n type: 'page-nav',\n group: 'navigation',\n execute: (p: unknown) => instance.goToPage?.(Number(p))\n },\n {\n id: 'page-next',\n icon: 'page-next',\n label: 'Next Slide',\n type: 'button',\n group: 'navigation',\n execute: () => {\n const cur = instance.getCurrentPage?.() ?? 1;\n const total = instance.getPageCount?.() ?? 1;\n if (cur < total) instance.goToPage?.(cur + 1);\n }\n },\n {\n id: 'zoom-out',\n icon: 'zoom-out',\n label: 'Zoom Out',\n type: 'button',\n group: 'zoom',\n execute: () => instance.zoomOut?.()\n },\n {\n id: 'zoom-in',\n icon: 'zoom-in',\n label: 'Zoom In',\n type: 'button',\n group: 'zoom',\n execute: () => instance.zoomIn?.()\n },\n {\n id: 'fit-page',\n icon: 'fit-page',\n label: 'Fit to Slide',\n type: 'button',\n group: 'zoom',\n execute: () => instance.fitToPage?.()\n },\n {\n id: 'download',\n icon: 'download',\n label: 'Download',\n type: 'button',\n group: 'actions',\n execute: () => instance.download?.()\n },\n {\n id: 'print',\n icon: 'print',\n label: 'Print',\n type: 'button',\n group: 'actions',\n execute: () => instance.print?.()\n }\n ];\n }\n\n async render(ctx: RenderContext): Promise<PreviewInstance> {\n const container = document.createElement('div');\n container.className = 'fp-ppt-container';\n container.style.width = '100%';\n container.style.height = '100%';\n container.style.overflow = 'auto';\n container.style.display = 'flex';\n container.style.justifyContent = 'center';\n container.style.alignItems = 'center';\n container.style.padding = '32px 16px';\n container.style.backgroundColor = '#0f172a';\n\n const slideCard = document.createElement('div');\n slideCard.className = 'fp-ppt-slide-card';\n slideCard.style.width = '960px';\n slideCard.style.maxWidth = '90%';\n slideCard.style.aspectRatio = '16 / 9';\n slideCard.style.backgroundColor = '#ffffff';\n slideCard.style.boxShadow = '0 8px 30px rgba(0,0,0,0.3)';\n slideCard.style.borderRadius = '8px';\n slideCard.style.padding = '48px';\n slideCard.style.display = 'flex';\n slideCard.style.flexDirection = 'column';\n slideCard.style.justifyContent = 'center';\n slideCard.style.alignItems = 'center';\n slideCard.style.boxSizing = 'border-box';\n slideCard.style.position = 'relative';\n slideCard.style.overflow = 'hidden';\n slideCard.style.transformOrigin = 'center center';\n slideCard.style.transition = 'transform 0.2s ease';\n\n container.appendChild(slideCard);\n ctx.container.appendChild(container);\n\n let scale = 1.0;\n let currentSlide = 1;\n let slides: PptSlide[] = [];\n\n try {\n const cfbf = new CfbfReader(ctx.buffer);\n const pptStream = cfbf.readStream('PowerPoint Document');\n\n if (!pptStream || pptStream.length < 512) {\n throw new Error('PowerPoint Document stream not found in CFBF container');\n }\n\n slides = this.extractSlides(pptStream);\n } catch (err) {\n console.warn('[PptPlugin] Error extracting binary slides:', err);\n }\n\n if (slides.length === 0) {\n slides = [\n {\n title: ctx.metadata.name || 'PowerPoint Presentation',\n texts: ['Legacy PowerPoint 97-2003 Presentation', 'Preview loaded successfully']\n }\n ];\n }\n\n const totalSlides = slides.length;\n\n const renderSlide = (idx: number) => {\n currentSlide = idx;\n const s = slides[idx - 1];\n if (!s) return;\n\n slideCard.innerHTML = `\n <div style=\"position: absolute; top: 20px; right: 24px; font-size: 12px; color: #94a3b8; font-weight: 600;\">\n Slide ${idx} of ${totalSlides}\n </div>\n <div style=\"text-align: center; width: 100%;\">\n <h1 style=\"font-size: ${idx === 1 ? '36px' : '28px'}; color: #1e3a8a; margin: 0 0 24px; font-family: -apple-system, BlinkMacSystemFont, sans-serif; font-weight: 700;\">\n ${DOMPurify.sanitize(s.title || `Slide ${idx}`)}\n </h1>\n <div style=\"display: flex; flex-direction: column; gap: 12px; max-width: 80%; margin: 0 auto; text-align: ${idx === 1 ? 'center' : 'left'};\">\n ${s.texts.map(t => `<div style=\"font-size: 18px; color: #334155; line-height: 1.5; font-family: -apple-system, BlinkMacSystemFont, sans-serif;\">${DOMPurify.sanitize(t)}</div>`).join('')}\n </div>\n </div>\n `;\n ctx.emit('page-change', { page: currentSlide, total: totalSlides });\n };\n\n renderSlide(1);\n\n const cleanup = () => {\n container.remove();\n ctx.container.innerHTML = '';\n };\n\n ctx.signal.addEventListener('abort', cleanup);\n\n return {\n destroy: cleanup,\n zoomIn: () => {\n scale += 0.1;\n slideCard.style.transform = `scale(${scale})`;\n },\n zoomOut: () => {\n scale = Math.max(0.3, scale - 0.1);\n slideCard.style.transform = `scale(${scale})`;\n },\n getZoom: () => scale,\n setZoom: (level: number) => {\n scale = level;\n slideCard.style.transform = `scale(${scale})`;\n },\n fitToPage: () => {\n scale = 1.0;\n slideCard.style.transform = 'scale(1)';\n },\n goToPage: (page: number) => {\n if (page >= 1 && page <= totalSlides) {\n renderSlide(page);\n }\n },\n getPageCount: () => totalSlides,\n getCurrentPage: () => currentSlide,\n getThumbnails: async (): Promise<Thumbnail[]> => {\n return slides.map((s, idx) => ({\n index: idx,\n label: `Slide ${idx + 1}`,\n render: async (canvas: HTMLCanvasElement) => {\n const ctx2d = canvas.getContext('2d');\n if (!ctx2d) return;\n canvas.width = 160;\n canvas.height = 90;\n ctx2d.fillStyle = '#ffffff';\n ctx2d.fillRect(0, 0, 160, 90);\n ctx2d.fillStyle = '#1e3a8a';\n ctx2d.font = 'bold 11px sans-serif';\n ctx2d.textAlign = 'center';\n const title = s.title.slice(0, 18) || `Slide ${idx + 1}`;\n ctx2d.fillText(title, 80, 50);\n }\n }));\n },\n download: () => {\n const blob = new Blob([ctx.buffer], { type: 'application/vnd.ms-powerpoint' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = ctx.metadata.name || 'presentation.ppt';\n a.click();\n URL.revokeObjectURL(url);\n },\n print: () => {\n window.print();\n }\n };\n }\n\n /**\n * Traverse PowerPoint binary stream records ([MS-PPT]) and extract text chunks per slide\n */\n private extractSlides(stream: Uint8Array): PptSlide[] {\n const view = new DataView(stream.buffer, stream.byteOffset, stream.byteLength);\n const len = stream.length;\n let offset = 0;\n\n const slides: PptSlide[] = [];\n let currentSlideTexts: string[] = [];\n\n while (offset + 8 <= len) {\n const recVerInst = view.getUint16(offset, true);\n const recType = view.getUint16(offset + 2, true);\n const recLen = view.getUint32(offset + 4, true);\n\n // SlideContainer = 0x03EE (1006)\n if (recType === 0x03EE) {\n if (currentSlideTexts.length > 0) {\n const title = currentSlideTexts[0] || 'Slide';\n const texts = currentSlideTexts.slice(1);\n slides.push({ title, texts });\n currentSlideTexts = [];\n }\n offset += 8;\n continue;\n }\n\n // TextBytesAtom = 0x0F9E (3998) -> 8-bit ANSI text\n if (recType === 0x0F9E && recLen > 0 && offset + 8 + recLen <= len) {\n const bytes = stream.subarray(offset + 8, offset + 8 + recLen);\n const text = new TextDecoder('latin1').decode(bytes).trim();\n if (text && text.length > 1 && !/^[\\x00-\\x1F\\x7F-\\x9F]+$/.test(text)) {\n currentSlideTexts.push(text);\n }\n }\n\n // TextCharsAtom = 0x0F9F (3999) -> 16-bit UTF-16LE text\n if (recType === 0x0F9F && recLen > 0 && offset + 8 + recLen <= len) {\n const bytes = stream.subarray(offset + 8, offset + 8 + recLen);\n const text = new TextDecoder('utf-16le').decode(bytes).trim();\n if (text && text.length > 1 && !/^[\\x00-\\x1F\\x7F-\\x9F]+$/.test(text)) {\n currentSlideTexts.push(text);\n }\n }\n\n // Move to next record (if container, children are inside; if atom, skip data)\n const isContainer = (recVerInst & 0x000F) === 0x0F;\n if (isContainer) {\n offset += 8;\n } else {\n offset += 8 + recLen;\n }\n }\n\n if (currentSlideTexts.length > 0) {\n const title = currentSlideTexts[0] || 'Slide';\n const texts = currentSlideTexts.slice(1);\n slides.push({ title, texts });\n }\n\n // Fallback: If no structured slide records were identified, do heuristic text extraction\n if (slides.length === 0) {\n const rawText = new TextDecoder('latin1', { fatal: false }).decode(stream);\n const matches = rawText.match(/[A-Za-z0-9\\s,.:;!?'\"-]{4,}/g) || [];\n const filtered = matches\n .map(m => m.trim())\n .filter(m => m.length > 4 && !m.includes('PowerPoint') && !m.includes('Arial') && !m.includes('Times'));\n\n if (filtered.length > 0) {\n // Chunk into groups of 3-4 items per slide\n const chunkSize = 4;\n for (let i = 0; i < filtered.length; i += chunkSize) {\n const chunk = filtered.slice(i, i + chunkSize);\n slides.push({\n title: chunk[0] || `Slide ${Math.floor(i / chunkSize) + 1}`,\n texts: chunk.slice(1)\n });\n }\n }\n }\n\n return slides;\n }\n}\n\nexport function pptPlugin(): PptPlugin {\n return new PptPlugin();\n}\n\nexport default PptPlugin;\n","import { FilePreviewViewer as CoreViewer } from '@patel.sumit51/core';\nimport { pdfPlugin } from '@patel.sumit51/plugin-pdf';\nimport { mediaPlugin } from '@patel.sumit51/plugin-media';\nimport { docxPlugin } from '@patel.sumit51/plugin-docx';\nimport { excelPlugin } from '@patel.sumit51/plugin-excel';\nimport { csvPlugin } from '@patel.sumit51/plugin-csv';\nimport { codePlugin } from '@patel.sumit51/plugin-code';\nimport { archivePlugin } from '@patel.sumit51/plugin-archive';\nimport { markdownPlugin } from '@patel.sumit51/plugin-markdown';\nimport { pptxPlugin } from '@patel.sumit51/plugin-pptx';\nimport { threeDPlugin } from '@patel.sumit51/plugin-3d';\nimport { rtfPlugin } from '@patel.sumit51/plugin-rtf';\nimport { htmlPreviewPlugin } from '@patel.sumit51/plugin-html-preview';\nimport { openDocumentPlugin } from '@patel.sumit51/plugin-opendocument';\nimport { docPlugin } from '@patel.sumit51/plugin-doc';\nimport { pptPlugin } from '@patel.sumit51/plugin-ppt';\nimport type { PreviewPlugin } from '@patel.sumit51/core';\n\n/**\n * Returns all built-in default preview plugins:\n * PDF, Word (DOCX, DOCM, DOTX, DOTM), Legacy Word (DOC, DOT),\n * Excel/Spreadsheets (XLSX, XLS, XLSM, XLSB, XLTX, XLTM, ODS),\n * PowerPoint (PPTX, PPSX, PPTM, PPSM, POTX, POTM), Legacy PowerPoint (PPT, PPS, POT),\n * OpenDocument Suite (ODT, ODP, ODS, ODG, ODF), Rich Text (RTF),\n * Sandboxed HTML, CSV/TSV, ZIP Archives, Markdown, 3D Models (STL/OBJ),\n * Media (Images/Video/Audio/SVG), and Code/Text (190+ languages).\n */\nexport function getDefaultPlugins(): PreviewPlugin[] {\n return [\n pdfPlugin(),\n mediaPlugin(),\n docxPlugin(),\n excelPlugin(),\n pptxPlugin(),\n docPlugin(),\n pptPlugin(),\n openDocumentPlugin(),\n rtfPlugin(),\n htmlPreviewPlugin(),\n csvPlugin(),\n archivePlugin(),\n markdownPlugin(),\n threeDPlugin(),\n codePlugin(),\n ];\n}\n\n/**\n * Universal File Preview Viewer.\n * Pre-loads all format plugins by default so 50+ file formats can be previewed immediately.\n */\nexport class FilePreviewViewer extends CoreViewer {\n constructor(options?: { autoRegisterDefaults?: boolean }) {\n super();\n if (options?.autoRegisterDefaults !== false) {\n this.registerPlugins(getDefaultPlugins());\n }\n }\n}\n\n// Re-export individual plugins for custom configurations\nexport {\n pdfPlugin,\n mediaPlugin,\n docxPlugin,\n excelPlugin,\n pptxPlugin,\n docPlugin,\n pptPlugin,\n openDocumentPlugin,\n rtfPlugin,\n htmlPreviewPlugin,\n csvPlugin,\n archivePlugin,\n markdownPlugin,\n threeDPlugin,\n codePlugin,\n};\n\n// Re-export all core classes, controllers, and types\nexport * from '@patel.sumit51/core';\n","import { defineComponent, h, ref, onMounted, onBeforeUnmount, watch, type PropType } from 'vue';\r\nimport {\r\n FilePreviewViewer,\r\n getDefaultPlugins,\r\n type FileSource,\r\n type PreviewPlugin,\r\n type PreviewViewerOptions,\r\n type PreviewInstance,\r\n} from './index';\r\n\r\nexport const FilePreview = defineComponent({\r\n name: 'FilePreview',\r\n props: {\r\n src: {\r\n type: [String, Object] as PropType<FileSource>,\r\n required: true,\r\n },\r\n plugins: {\r\n type: Array as PropType<PreviewPlugin[]>,\r\n default: undefined,\r\n },\r\n options: {\r\n type: Object as PropType<PreviewViewerOptions>,\r\n default: () => ({}),\r\n },\r\n },\r\n emits: ['loading', 'loaded', 'error', 'page-change', 'zoom-change'],\r\n setup(props, { emit, expose }) {\r\n const containerRef = ref<HTMLDivElement | null>(null);\r\n let viewer: FilePreviewViewer | null = null;\r\n let instance: PreviewInstance | null = null;\r\n\r\n const renderPreview = async () => {\r\n const el = containerRef.value;\r\n if (!viewer || !el || !props.src) return;\r\n try {\r\n instance = await viewer.preview(el, props.src, props.options);\r\n } catch (error: unknown) {\r\n if (error instanceof DOMException && error.name === 'AbortError') return;\r\n emit('error', error);\r\n }\r\n };\r\n\r\n onMounted(() => {\r\n viewer = new FilePreviewViewer({ autoRegisterDefaults: false });\r\n const activePlugins = props.plugins && props.plugins.length > 0 ? props.plugins : getDefaultPlugins();\r\n viewer.registerPlugins(activePlugins);\r\n\r\n viewer.on('loading', (data) => emit('loading', data));\r\n viewer.on('loaded', (data) => emit('loaded', data));\r\n viewer.on('error', (data) => emit('error', data));\r\n viewer.on('page-change', (data) => emit('page-change', data));\r\n viewer.on('zoom-change', (data) => emit('zoom-change', data));\r\n\r\n renderPreview();\r\n });\r\n\r\n watch(() => props.src, renderPreview);\r\n watch(() => props.options, renderPreview, { deep: true });\r\n\r\n onBeforeUnmount(() => {\r\n viewer?.destroy();\r\n viewer = null;\r\n instance = null;\r\n });\r\n\r\n expose({\r\n getInstance: () => instance,\r\n getViewer: () => viewer,\r\n destroy: () => viewer?.destroy(),\r\n });\r\n\r\n return () => {\r\n return h('div', {\r\n ref: containerRef,\r\n style: { width: '100%', height: '100%', position: 'relative' },\r\n });\r\n };\r\n },\r\n});\r\n\r\nexport default FilePreview;\r\n"]}