@eternalheart/angular-file-preview 1.6.5
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/LICENSE +22 -0
- package/README.md +879 -0
- package/README.zh-CN.md +876 -0
- package/lib/LICENSE +22 -0
- package/lib/README.md +879 -0
- package/lib/components/preview/file-preview-toolbar.d.ts +19 -0
- package/lib/components/preview/nav-arrows.d.ts +25 -0
- package/lib/components/preview/renderer-outlet.d.ts +23 -0
- package/lib/components/preview/toolbar-button.d.ts +12 -0
- package/lib/components/resizable-split.d.ts +32 -0
- package/lib/di/locale.service.d.ts +12 -0
- package/lib/di/request.service.d.ts +20 -0
- package/lib/di/theme-mode.d.ts +6 -0
- package/lib/di/theme.service.d.ts +9 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-avifLoader-BP3fgcMm-CZsJ9svm.mjs +55 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-avifLoader-BP3fgcMm-CZsJ9svm.mjs.map +1 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-RendererError-DtNihCIX-DtNihCIX.mjs +58 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-RendererError-DtNihCIX-DtNihCIX.mjs.map +1 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-UobTf36G.mjs +5835 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-UobTf36G.mjs.map +1 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-base.types-D5x7QPey-D5x7QPey.mjs +17 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-base.types-D5x7QPey-D5x7QPey.mjs.map +1 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index--7d8Hgi0-D-sg24Qs.mjs +284 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index--7d8Hgi0-D-sg24Qs.mjs.map +1 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-6dZS_Cfs-B1itLV5R.mjs +703 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-6dZS_Cfs-B1itLV5R.mjs.map +1 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-B1ANUCTy-BRs7TMLn.mjs +231 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-B1ANUCTy-BRs7TMLn.mjs.map +1 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-BEaqpRV8-BidVIVlO.mjs +552 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-BEaqpRV8-BidVIVlO.mjs.map +1 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-BGqTRZbm-CAOLRw20.mjs +688 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-BGqTRZbm-CAOLRw20.mjs.map +1 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-Bv3JRXKn-B4Wewc-4.mjs +273 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-Bv3JRXKn-B4Wewc-4.mjs.map +1 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-C0McUoqT-DJ35bhIz.mjs +288 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-C0McUoqT-DJ35bhIz.mjs.map +1 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-C518mdUd-B5SCzrzU.mjs +550 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-C518mdUd-B5SCzrzU.mjs.map +1 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-CDjKPqyW-CmX5sdkL.mjs +102 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-CDjKPqyW-CmX5sdkL.mjs.map +1 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-CHi9tOe0-NOeQYAnM.mjs +516 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-CHi9tOe0-NOeQYAnM.mjs.map +1 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-CQwhffym-DAGw4Xy_.mjs +823 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-CQwhffym-DAGw4Xy_.mjs.map +1 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-CSCTj7ft-BfqruUyY.mjs +164 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-CSCTj7ft-BfqruUyY.mjs.map +1 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-Cb1RLXeO-Bj9gjS1Z.mjs +655 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-Cb1RLXeO-Bj9gjS1Z.mjs.map +1 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-Cw90Kdyg-BzrW_cyx.mjs +207 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-Cw90Kdyg-BzrW_cyx.mjs.map +1 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-D35x1nwM-CugEEXjg.mjs +199 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-D35x1nwM-CugEEXjg.mjs.map +1 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-D9jJNzeM-mWX59Aj2.mjs +194 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-D9jJNzeM-mWX59Aj2.mjs.map +1 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-DbmuvdvN-C29uLyt2.mjs +94 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-DbmuvdvN-C29uLyt2.mjs.map +1 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-DsNNZ59Q-C8MaSME6.mjs +468 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-DsNNZ59Q-C8MaSME6.mjs.map +1 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-DufW2Fuc-CTosCut6.mjs +193 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-DufW2Fuc-CTosCut6.mjs.map +1 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-TSTa_Q7E-DBhkL6pV.mjs +184 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-TSTa_Q7E-DBhkL6pV.mjs.map +1 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-pG0Ko5mI-DthQJg-X.mjs +492 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-pG0Ko5mI-DthQJg-X.mjs.map +1 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-shiki-highlight-CL9cG481-BKfwdOpN.mjs +68 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-shiki-highlight-CL9cG481-BKfwdOpN.mjs.map +1 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-heicLoader-CH_raQNn-BSXHd_oi.mjs +36 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-heicLoader-CH_raQNn-BSXHd_oi.mjs.map +1 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-jp2Loader-ldvCSsvm-DJEhfimG.mjs +121 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-jp2Loader-ldvCSsvm-DJEhfimG.mjs.map +1 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-psdLoader-D5CkupyY-D5Gegcdg.mjs +78 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-psdLoader-D5CkupyY-D5Gegcdg.mjs.map +1 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-rawLoader-0mLvxCNp-CCXn9Rdp.mjs +81 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-rawLoader-0mLvxCNp-CCXn9Rdp.mjs.map +1 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-tiffLoader-CmUAD1vO-0JqIws9t.mjs +59 -0
- package/lib/fesm2022/eternalheart-angular-file-preview-tiffLoader-CmUAD1vO-0JqIws9t.mjs.map +1 -0
- package/lib/fesm2022/eternalheart-angular-file-preview.mjs +2 -0
- package/lib/fesm2022/eternalheart-angular-file-preview.mjs.map +1 -0
- package/lib/file-preview-content.d.ts +65 -0
- package/lib/file-preview-embed.d.ts +30 -0
- package/lib/file-preview-modal.d.ts +34 -0
- package/lib/fp-core.d.ts +1 -0
- package/lib/index.css +2119 -0
- package/lib/index.d.ts +11 -0
- package/lib/renderers/Audio/index.d.ts +74 -0
- package/lib/renderers/Cad/index.d.ts +45 -0
- package/lib/renderers/Cad/toolbar.d.ts +15 -0
- package/lib/renderers/Csv/index.d.ts +26 -0
- package/lib/renderers/Doc/index.d.ts +19 -0
- package/lib/renderers/Docx/index.d.ts +42 -0
- package/lib/renderers/Epub/index.d.ts +57 -0
- package/lib/renderers/Font/font-preview-line.d.ts +26 -0
- package/lib/renderers/Font/index.d.ts +52 -0
- package/lib/renderers/Image/index.d.ts +79 -0
- package/lib/renderers/Json/index.d.ts +61 -0
- package/lib/renderers/Markdown/index.d.ts +35 -0
- package/lib/renderers/Mobi/index.d.ts +51 -0
- package/lib/renderers/Msg/index.d.ts +47 -0
- package/lib/renderers/Pdf/index.d.ts +55 -0
- package/lib/renderers/Ppt/index.d.ts +19 -0
- package/lib/renderers/Pptx/index.d.ts +29 -0
- package/lib/renderers/RendererError.d.ts +9 -0
- package/lib/renderers/RendererLoading.d.ts +7 -0
- package/lib/renderers/Subtitle/index.d.ts +25 -0
- package/lib/renderers/Text/index.d.ts +29 -0
- package/lib/renderers/Unsupported/index.d.ts +15 -0
- package/lib/renderers/Video/index.d.ts +28 -0
- package/lib/renderers/Xlsx/index.d.ts +25 -0
- package/lib/renderers/Xml/index.d.ts +26 -0
- package/lib/renderers/Zip/index.d.ts +58 -0
- package/lib/renderers/Zip/tree-item.d.ts +29 -0
- package/lib/renderers/base.types.d.ts +10 -0
- package/lib/renderers/lazy.d.ts +23 -0
- package/lib/renderers/registry.d.ts +13 -0
- package/lib/renderers/toolbar.types.d.ts +19 -0
- package/lib/types.d.ts +26 -0
- package/lib/utils/audio-player.d.ts +20 -0
- package/lib/utils/shiki-highlight.d.ts +7 -0
- package/package.json +119 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-BGqTRZbm-CAOLRw20.mjs","sources":["../fesm2022/eternalheart-angular-file-preview-index-BGqTRZbm.mjs"],"sourcesContent":["import * as i0 from '@angular/core';\nimport { input, viewChild, inject, DestroyRef, signal, computed, effect, ChangeDetectionStrategy, Component, output, untracked } from '@angular/core';\nimport { L as LocaleService, R as RequestService, g as getFallbackTranslator, F as FilePreviewContent } from './eternalheart-angular-file-preview-eternalheart-angular-file-preview-DXwNhxAB.mjs';\nimport { R as RendererError } from './eternalheart-angular-file-preview-RendererError-DtNihCIX.mjs';\nimport { T as ToolbarEventEmitter } from './eternalheart-angular-file-preview-base.types-D5x7QPey.mjs';\nimport * as i1 from 'lucide-angular';\nimport { ChevronRight, Folder, FolderOpen, FileImage, FileText, FileCode, File, LucideAngularModule } from 'lucide-angular';\nimport { formatFileSize, getFileType, inferMimeType, readZipEntryBlob, loadZip, listZipEntries, buildZipTree } from '@eternalheart/file-preview-core';\n\nclass ResizableSplit {\n constructor() {\n this.initialLeftWidth = input(280);\n this.minLeftWidth = input(160);\n this.maxLeftWidth = input(640);\n this.minRightWidth = input(200);\n this.storageKey = input(undefined);\n this.desktopMedia = input('(min-width: 768px)');\n this.mobileTabMode = input(false);\n this.leftTabLabel = input('文件树');\n this.rightTabLabel = input('预览');\n this.container = viewChild('containerRef');\n this.destroyRef = inject(DestroyRef);\n this.leftWidth = signal(280);\n this.dragging = signal(false);\n this.isDesktop = signal(false);\n this.activeTab = signal('left');\n this.isMobileTab = computed(() => this.mobileTabMode() && !this.isDesktop());\n this.leftStyle = computed(() => this.isDesktop() ? { width: `${this.leftWidth()}px` } : undefined);\n this.leftPaneClass = computed(() => this.isMobileTab()\n ? 'afp-flex-1 afp-min-h-0 afp-min-w-0 afp-w-full afp-overflow-hidden'\n : 'afp-min-h-0 afp-min-w-0 afp-flex-shrink-0 afp-w-full afp-max-h-60 md:afp-h-full md:afp-max-h-none');\n this.rightPaneClass = computed(() => this.isMobileTab()\n ? 'afp-flex-1 afp-min-h-0 afp-min-w-0 afp-w-full afp-overflow-hidden'\n : 'afp-flex-1 afp-min-w-0 afp-min-h-0 afp-overflow-hidden');\n this.storageApplied = false;\n this.onMove = (e) => {\n const el = this.container()?.nativeElement;\n if (!el)\n return;\n const rect = el.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const cap = rect.width - this.minRightWidth() - 6;\n const effectiveMax = Math.min(this.maxLeftWidth(), cap);\n this.leftWidth.set(Math.max(this.minLeftWidth(), Math.min(effectiveMax, x)));\n };\n this.onUp = () => {\n if (!this.dragging())\n return;\n this.dragging.set(false);\n window.removeEventListener('mousemove', this.onMove);\n window.removeEventListener('mouseup', this.onUp);\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n const key = this.storageKey();\n if (key) {\n try {\n window.localStorage.setItem(key, String(this.leftWidth()));\n }\n catch {\n /* ignore */\n }\n }\n };\n effect(() => {\n const key = this.storageKey();\n const initial = this.initialLeftWidth();\n if (!this.storageApplied) {\n this.storageApplied = true;\n if (key && typeof window !== 'undefined') {\n const saved = Number(window.localStorage.getItem(key));\n if (!isNaN(saved) && saved > 0) {\n this.leftWidth.set(saved);\n return;\n }\n }\n this.leftWidth.set(initial);\n return;\n }\n if (!key)\n this.leftWidth.set(initial);\n });\n effect((onCleanup) => {\n const media = this.desktopMedia();\n if (typeof window === 'undefined')\n return;\n const mq = window.matchMedia(media);\n const handler = () => {\n this.isDesktop.set(mq.matches);\n };\n handler();\n mq.addEventListener('change', handler);\n onCleanup(() => mq.removeEventListener('change', handler));\n });\n this.destroyRef.onDestroy(() => {\n window.removeEventListener('mousemove', this.onMove);\n window.removeEventListener('mouseup', this.onUp);\n if (this.dragging()) {\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n }\n });\n }\n switchTab(tab) {\n this.activeTab.set(tab);\n }\n onDividerDown(e) {\n e.preventDefault();\n this.dragging.set(true);\n window.addEventListener('mousemove', this.onMove);\n window.addEventListener('mouseup', this.onUp);\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"19.2.25\", ngImport: i0, type: ResizableSplit, deps: [], target: i0.ɵɵFactoryTarget.Component }); }\n static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.0.0\", version: \"19.2.25\", type: ResizableSplit, isStandalone: true, selector: \"afp-resizable-split\", inputs: { initialLeftWidth: { classPropertyName: \"initialLeftWidth\", publicName: \"initialLeftWidth\", isSignal: true, isRequired: false, transformFunction: null }, minLeftWidth: { classPropertyName: \"minLeftWidth\", publicName: \"minLeftWidth\", isSignal: true, isRequired: false, transformFunction: null }, maxLeftWidth: { classPropertyName: \"maxLeftWidth\", publicName: \"maxLeftWidth\", isSignal: true, isRequired: false, transformFunction: null }, minRightWidth: { classPropertyName: \"minRightWidth\", publicName: \"minRightWidth\", isSignal: true, isRequired: false, transformFunction: null }, storageKey: { classPropertyName: \"storageKey\", publicName: \"storageKey\", isSignal: true, isRequired: false, transformFunction: null }, desktopMedia: { classPropertyName: \"desktopMedia\", publicName: \"desktopMedia\", isSignal: true, isRequired: false, transformFunction: null }, mobileTabMode: { classPropertyName: \"mobileTabMode\", publicName: \"mobileTabMode\", isSignal: true, isRequired: false, transformFunction: null }, leftTabLabel: { classPropertyName: \"leftTabLabel\", publicName: \"leftTabLabel\", isSignal: true, isRequired: false, transformFunction: null }, rightTabLabel: { classPropertyName: \"rightTabLabel\", publicName: \"rightTabLabel\", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: \"container\", first: true, predicate: [\"containerRef\"], descendants: true, isSignal: true }], ngImport: i0, template: `\n <div\n #containerRef\n class=\"afp-w-full afp-h-full afp-flex afp-flex-col md:afp-flex-row afp-min-h-0 afp-min-w-0\"\n >\n @if (isMobileTab()) {\n <div class=\"afp-flex afp-flex-shrink-0 afp-border-b afp-border-line-weak afp-bg-surface-toolbar\">\n <button\n type=\"button\"\n class=\"afp-flex-1 afp-py-2.5 afp-text-sm afp-transition-colors\"\n [class.afp-text-fg-primary]=\"activeTab() === 'left'\"\n [class.afp-border-b-2]=\"activeTab() === 'left'\"\n [class.afp-border-fg-primary]=\"activeTab() === 'left'\"\n [class.-afp-mb-px]=\"activeTab() === 'left'\"\n [class.afp-text-fg-secondary]=\"activeTab() !== 'left'\"\n (click)=\"switchTab('left')\"\n >\n {{ leftTabLabel() }}\n </button>\n <button\n type=\"button\"\n class=\"afp-flex-1 afp-py-2.5 afp-text-sm afp-transition-colors\"\n [class.afp-text-fg-primary]=\"activeTab() === 'right'\"\n [class.afp-border-b-2]=\"activeTab() === 'right'\"\n [class.afp-border-fg-primary]=\"activeTab() === 'right'\"\n [class.-afp-mb-px]=\"activeTab() === 'right'\"\n [class.afp-text-fg-secondary]=\"activeTab() !== 'right'\"\n (click)=\"switchTab('right')\"\n >\n {{ rightTabLabel() }}\n </button>\n </div>\n }\n <div\n [class]=\"leftPaneClass()\"\n [style]=\"isMobileTab() ? null : leftStyle()\"\n [hidden]=\"isMobileTab() && activeTab() !== 'left'\"\n >\n <ng-content select=\"[splitLeft]\" />\n </div>\n @if (!isMobileTab()) {\n <div\n role=\"separator\"\n aria-orientation=\"vertical\"\n class=\"split-divider afp-hidden md:afp-block afp-relative afp-w-1.5 afp-flex-shrink-0 afp-cursor-col-resize afp-transition-colors\"\n [class.dragging]=\"dragging()\"\n (mousedown)=\"onDividerDown($event)\"\n >\n <span class=\"afp-absolute afp-inset-y-0 hit-area\"></span>\n </div>\n }\n <div\n [class]=\"rightPaneClass()\"\n [hidden]=\"isMobileTab() && activeTab() !== 'right'\"\n >\n <ng-content select=\"[splitRight]\" />\n </div>\n </div>\n `, isInline: true, styles: [\":host{display:block;width:100%;height:100%}.split-divider{background:var(--fp-line-weak)}.split-divider:hover{background:var(--fp-line)}.split-divider.dragging{background:var(--fp-line-strong)}.hit-area{left:-4px;right:-4px}\\n\"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"19.2.25\", ngImport: i0, type: ResizableSplit, decorators: [{\n type: Component,\n args: [{ selector: 'afp-resizable-split', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: `\n <div\n #containerRef\n class=\"afp-w-full afp-h-full afp-flex afp-flex-col md:afp-flex-row afp-min-h-0 afp-min-w-0\"\n >\n @if (isMobileTab()) {\n <div class=\"afp-flex afp-flex-shrink-0 afp-border-b afp-border-line-weak afp-bg-surface-toolbar\">\n <button\n type=\"button\"\n class=\"afp-flex-1 afp-py-2.5 afp-text-sm afp-transition-colors\"\n [class.afp-text-fg-primary]=\"activeTab() === 'left'\"\n [class.afp-border-b-2]=\"activeTab() === 'left'\"\n [class.afp-border-fg-primary]=\"activeTab() === 'left'\"\n [class.-afp-mb-px]=\"activeTab() === 'left'\"\n [class.afp-text-fg-secondary]=\"activeTab() !== 'left'\"\n (click)=\"switchTab('left')\"\n >\n {{ leftTabLabel() }}\n </button>\n <button\n type=\"button\"\n class=\"afp-flex-1 afp-py-2.5 afp-text-sm afp-transition-colors\"\n [class.afp-text-fg-primary]=\"activeTab() === 'right'\"\n [class.afp-border-b-2]=\"activeTab() === 'right'\"\n [class.afp-border-fg-primary]=\"activeTab() === 'right'\"\n [class.-afp-mb-px]=\"activeTab() === 'right'\"\n [class.afp-text-fg-secondary]=\"activeTab() !== 'right'\"\n (click)=\"switchTab('right')\"\n >\n {{ rightTabLabel() }}\n </button>\n </div>\n }\n <div\n [class]=\"leftPaneClass()\"\n [style]=\"isMobileTab() ? null : leftStyle()\"\n [hidden]=\"isMobileTab() && activeTab() !== 'left'\"\n >\n <ng-content select=\"[splitLeft]\" />\n </div>\n @if (!isMobileTab()) {\n <div\n role=\"separator\"\n aria-orientation=\"vertical\"\n class=\"split-divider afp-hidden md:afp-block afp-relative afp-w-1.5 afp-flex-shrink-0 afp-cursor-col-resize afp-transition-colors\"\n [class.dragging]=\"dragging()\"\n (mousedown)=\"onDividerDown($event)\"\n >\n <span class=\"afp-absolute afp-inset-y-0 hit-area\"></span>\n </div>\n }\n <div\n [class]=\"rightPaneClass()\"\n [hidden]=\"isMobileTab() && activeTab() !== 'right'\"\n >\n <ng-content select=\"[splitRight]\" />\n </div>\n </div>\n `, styles: [\":host{display:block;width:100%;height:100%}.split-divider{background:var(--fp-line-weak)}.split-divider:hover{background:var(--fp-line)}.split-divider.dragging{background:var(--fp-line-strong)}.hit-area{left:-4px;right:-4px}\\n\"] }]\n }], ctorParameters: () => [] });\n\nclass ZipTreeItem {\n constructor() {\n this.node = input.required();\n this.depth = input.required();\n this.selectedPath = input(null);\n this.expanded = input.required();\n this.toggle = output();\n this.select = output();\n this.hover = output();\n this.leave = output();\n this.chevronRight = ChevronRight;\n this.folder = Folder;\n this.folderOpen = FolderOpen;\n this.formatFileSize = formatFileSize;\n this.padStyle = computed(() => ({ paddingLeft: `${this.depth() * 14 + 10}px` }));\n this.isOpen = computed(() => this.expanded().has(this.node().path));\n this.isSelected = computed(() => this.selectedPath() === this.node().path);\n this.fileIcon = computed(() => {\n const name = this.node().name;\n const ft = getFileType({ id: '', name, url: '', type: '' });\n if (ft === 'image')\n return FileImage;\n if (ft === 'text' || ft === 'markdown' || ft === 'json' || ft === 'csv' || ft === 'xml' || ft === 'subtitle') {\n return (name.endsWith('.md') || name.endsWith('.markdown')) ? FileText : FileCode;\n }\n return File;\n });\n }\n handleEnter(e) {\n const rect = e.currentTarget.getBoundingClientRect();\n this.hover.emit({ text: this.node().name || '/', rect });\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"19.2.25\", ngImport: i0, type: ZipTreeItem, deps: [], target: i0.ɵɵFactoryTarget.Component }); }\n static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.0.0\", version: \"19.2.25\", type: ZipTreeItem, isStandalone: true, selector: \"afp-zip-tree-item\", inputs: { node: { classPropertyName: \"node\", publicName: \"node\", isSignal: true, isRequired: true, transformFunction: null }, depth: { classPropertyName: \"depth\", publicName: \"depth\", isSignal: true, isRequired: true, transformFunction: null }, selectedPath: { classPropertyName: \"selectedPath\", publicName: \"selectedPath\", isSignal: true, isRequired: false, transformFunction: null }, expanded: { classPropertyName: \"expanded\", publicName: \"expanded\", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { toggle: \"toggle\", select: \"select\", hover: \"hover\", leave: \"leave\" }, ngImport: i0, template: `\n @if (node().isDir) {\n <div>\n <button\n type=\"button\"\n class=\"tree-row dir-row\"\n [style]=\"padStyle()\"\n (click)=\"toggle.emit(node().path)\"\n (mouseenter)=\"handleEnter($event)\"\n (mouseleave)=\"leave.emit()\"\n >\n <i-lucide\n [img]=\"chevronRight\"\n class=\"afp-w-3.5 afp-h-3.5 afp-flex-shrink-0 afp-transition-transform\"\n [class.afp-rotate-90]=\"isOpen()\"\n />\n <i-lucide\n [img]=\"isOpen() ? folderOpen : folder\"\n class=\"afp-w-4 afp-h-4 afp-flex-shrink-0 afp-text-amber-300/80\"\n />\n <span class=\"afp-truncate afp-flex-1 afp-min-w-0\">{{ node().name || '/' }}</span>\n </button>\n @if (isOpen() && node().children) {\n @for (child of node().children; track child.path) {\n <afp-zip-tree-item\n [node]=\"child\"\n [depth]=\"depth() + 1\"\n [selectedPath]=\"selectedPath()\"\n [expanded]=\"expanded()\"\n (toggle)=\"toggle.emit($event)\"\n (select)=\"select.emit($event)\"\n (hover)=\"hover.emit($event)\"\n (leave)=\"leave.emit()\"\n />\n }\n }\n </div>\n } @else {\n <button\n type=\"button\"\n class=\"tree-row file-row\"\n [class.selected]=\"isSelected()\"\n [style]=\"padStyle()\"\n (click)=\"select.emit(node())\"\n (mouseenter)=\"handleEnter($event)\"\n (mouseleave)=\"leave.emit()\"\n >\n <span class=\"afp-w-3.5 afp-h-3.5 afp-flex-shrink-0\"></span>\n <i-lucide [img]=\"fileIcon()\" class=\"afp-w-4 afp-h-4 afp-flex-shrink-0 afp-text-fg-tertiary\" />\n <span class=\"afp-flex-1 afp-truncate afp-min-w-0\">{{ node().name }}</span>\n <span class=\"afp-text-xs afp-text-fg-disabled afp-flex-shrink-0 afp-ml-2\">{{ formatFileSize(node().size) }}</span>\n </button>\n }\n `, isInline: true, styles: [\":host{display:block;width:100%}.tree-row{width:100%;display:flex;align-items:center;gap:.375rem;padding-top:.375rem;padding-bottom:.375rem;padding-right:.5rem;text-align:left;font-size:.875rem;background:transparent;border:0;cursor:pointer}.dir-row,.file-row{color:var(--fp-fg-secondary)}.tree-row:hover{background:var(--fp-surface-1)}.file-row.selected{background:var(--fp-line);color:var(--fp-fg-inverse)}\\n\"], dependencies: [{ kind: \"component\", type: ZipTreeItem, selector: \"afp-zip-tree-item\", inputs: [\"node\", \"depth\", \"selectedPath\", \"expanded\"], outputs: [\"toggle\", \"select\", \"hover\", \"leave\"] }, { kind: \"ngmodule\", type: LucideAngularModule }, { kind: \"component\", type: i1.LucideAngularComponent, selector: \"lucide-angular, lucide-icon, i-lucide, span-lucide\", inputs: [\"class\", \"name\", \"img\", \"color\", \"absoluteStrokeWidth\", \"size\", \"strokeWidth\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"19.2.25\", ngImport: i0, type: ZipTreeItem, decorators: [{\n type: Component,\n args: [{ selector: 'afp-zip-tree-item', standalone: true, imports: [LucideAngularModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `\n @if (node().isDir) {\n <div>\n <button\n type=\"button\"\n class=\"tree-row dir-row\"\n [style]=\"padStyle()\"\n (click)=\"toggle.emit(node().path)\"\n (mouseenter)=\"handleEnter($event)\"\n (mouseleave)=\"leave.emit()\"\n >\n <i-lucide\n [img]=\"chevronRight\"\n class=\"afp-w-3.5 afp-h-3.5 afp-flex-shrink-0 afp-transition-transform\"\n [class.afp-rotate-90]=\"isOpen()\"\n />\n <i-lucide\n [img]=\"isOpen() ? folderOpen : folder\"\n class=\"afp-w-4 afp-h-4 afp-flex-shrink-0 afp-text-amber-300/80\"\n />\n <span class=\"afp-truncate afp-flex-1 afp-min-w-0\">{{ node().name || '/' }}</span>\n </button>\n @if (isOpen() && node().children) {\n @for (child of node().children; track child.path) {\n <afp-zip-tree-item\n [node]=\"child\"\n [depth]=\"depth() + 1\"\n [selectedPath]=\"selectedPath()\"\n [expanded]=\"expanded()\"\n (toggle)=\"toggle.emit($event)\"\n (select)=\"select.emit($event)\"\n (hover)=\"hover.emit($event)\"\n (leave)=\"leave.emit()\"\n />\n }\n }\n </div>\n } @else {\n <button\n type=\"button\"\n class=\"tree-row file-row\"\n [class.selected]=\"isSelected()\"\n [style]=\"padStyle()\"\n (click)=\"select.emit(node())\"\n (mouseenter)=\"handleEnter($event)\"\n (mouseleave)=\"leave.emit()\"\n >\n <span class=\"afp-w-3.5 afp-h-3.5 afp-flex-shrink-0\"></span>\n <i-lucide [img]=\"fileIcon()\" class=\"afp-w-4 afp-h-4 afp-flex-shrink-0 afp-text-fg-tertiary\" />\n <span class=\"afp-flex-1 afp-truncate afp-min-w-0\">{{ node().name }}</span>\n <span class=\"afp-text-xs afp-text-fg-disabled afp-flex-shrink-0 afp-ml-2\">{{ formatFileSize(node().size) }}</span>\n </button>\n }\n `, styles: [\":host{display:block;width:100%}.tree-row{width:100%;display:flex;align-items:center;gap:.375rem;padding-top:.375rem;padding-bottom:.375rem;padding-right:.5rem;text-align:left;font-size:.875rem;background:transparent;border:0;cursor:pointer}.dir-row,.file-row{color:var(--fp-fg-secondary)}.tree-row:hover{background:var(--fp-surface-1)}.file-row.selected{background:var(--fp-line);color:var(--fp-fg-inverse)}\\n\"] }]\n }] });\n\nconst ZIP_TIP_STYLE_ID = 'afp-zip-tip-styles';\nfunction ensureZipTipStyles() {\n if (typeof document === 'undefined')\n return;\n if (document.getElementById(ZIP_TIP_STYLE_ID))\n return;\n const el = document.createElement('style');\n el.id = ZIP_TIP_STYLE_ID;\n el.textContent = `\n .afp-zip-tip {\n position: fixed;\n z-index: 9999;\n pointer-events: none;\n transform: translateY(-50%);\n padding: 4px 8px;\n background: rgba(0, 0, 0, 0.85);\n color: var(--fp-fg-inverse, #fff);\n font-size: 12px;\n line-height: 1.5;\n border-radius: 4px;\n white-space: nowrap;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);\n }\n `;\n document.head.appendChild(el);\n}\nclass ZipRenderer {\n constructor() {\n this.url = input.required();\n this.nestingDepth = input(0);\n this.emitter = new ToolbarEventEmitter();\n this.locale = inject(LocaleService, { optional: true });\n this.request = inject(RequestService, { optional: true });\n this.t = this.locale?.t() ?? getFallbackTranslator();\n this.splitRef = viewChild(ResizableSplit);\n this.zip = signal(null);\n this.tree = signal(null);\n this.loading = signal(true);\n this.error = signal(null);\n this.expanded = signal(new Set(['']));\n this.selected = signal(null);\n this.previewLoading = signal(false);\n this.previewError = signal(null);\n this.hoverTip = signal(null);\n this.totalStats = computed(() => {\n const root = this.tree();\n if (!root)\n return null;\n let files = 0, dirs = 0, size = 0;\n const walk = (n) => {\n if (n.isDir) {\n if (n.path)\n dirs++;\n n.children?.forEach(walk);\n }\n else {\n files++;\n size += n.size;\n }\n };\n walk(root);\n return { files, dirs, size };\n });\n this.previewFiles = computed(() => {\n const sel = this.selected();\n if (!sel)\n return [];\n return [{ name: sel.name, url: sel.blobUrl, type: inferMimeType(sel.name) }];\n });\n this.tipEl = null;\n this.getToolbarGroups = () => [];\n this.onToolbarChange = (listener) => this.emitter.subscribe(listener);\n ensureZipTipStyles();\n effect(() => {\n const url = this.url();\n if (!url)\n return;\n untracked(() => { void this.load(); });\n });\n effect(() => {\n this.totalStats();\n this.emitter.notify();\n });\n effect(() => {\n const tip = this.hoverTip();\n untracked(() => this.syncTip(tip));\n });\n inject(DestroyRef).onDestroy(() => {\n this.revokeCurrent();\n this.syncTip(null);\n });\n }\n handleToggle(path) {\n const next = new Set(this.expanded());\n if (next.has(path))\n next.delete(path);\n else\n next.add(path);\n this.expanded.set(next);\n }\n handleHover(payload) {\n this.hoverTip.set({ text: payload.text, x: payload.rect.right + 8, y: payload.rect.top + payload.rect.height / 2 });\n }\n handleLeave() {\n this.hoverTip.set(null);\n }\n async handleSelect(node) {\n const z = this.zip();\n if (!z || node.isDir)\n return;\n this.revokeCurrent();\n this.previewLoading.set(true);\n this.previewError.set(null);\n try {\n const mime = inferMimeType(node.name);\n const blob = await readZipEntryBlob(z, node.path, mime !== 'application/octet-stream' ? mime : undefined);\n const blobUrl = URL.createObjectURL(blob);\n this.selected.set({ path: node.path, name: node.name, size: node.size, blobUrl });\n this.splitRef()?.switchTab('right');\n }\n catch (err) {\n console.error(err);\n this.previewError.set('条目读取失败');\n }\n finally {\n this.previewLoading.set(false);\n }\n }\n revokeCurrent() {\n const sel = this.selected();\n if (sel?.blobUrl)\n URL.revokeObjectURL(sel.blobUrl);\n }\n syncTip(tip) {\n if (!tip) {\n this.tipEl?.remove();\n this.tipEl = null;\n return;\n }\n if (!this.tipEl) {\n this.tipEl = document.createElement('div');\n this.tipEl.className = 'afp-zip-tip';\n document.body.appendChild(this.tipEl);\n }\n this.tipEl.textContent = tip.text;\n this.tipEl.style.left = `${tip.x}px`;\n this.tipEl.style.top = `${tip.y}px`;\n }\n async load() {\n this.revokeCurrent();\n this.selected.set(null);\n this.loading.set(true);\n this.error.set(null);\n try {\n const fetcher = this.request?.fetcher() ?? ((u, init) => fetch(u, init));\n const res = await fetcher(this.url());\n if (!res.ok)\n throw new Error('加载失败');\n const buf = await res.arrayBuffer();\n const z = await loadZip(buf);\n const entries = listZipEntries(z);\n const root = buildZipTree(entries);\n this.zip.set(z);\n this.tree.set(root);\n const init = new Set(['']);\n if (root.children)\n for (const c of root.children)\n if (c.isDir)\n init.add(c.path);\n this.expanded.set(init);\n }\n catch (err) {\n console.error(err);\n this.error.set(this.t('zip.load_failed'));\n }\n finally {\n this.loading.set(false);\n }\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"19.2.25\", ngImport: i0, type: ZipRenderer, deps: [], target: i0.ɵɵFactoryTarget.Component }); }\n static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.0.0\", version: \"19.2.25\", type: ZipRenderer, isStandalone: true, selector: \"afp-zip-renderer\", inputs: { url: { classPropertyName: \"url\", publicName: \"url\", isSignal: true, isRequired: true, transformFunction: null }, nestingDepth: { classPropertyName: \"nestingDepth\", publicName: \"nestingDepth\", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: \"afp-block afp-w-full afp-h-full\" }, viewQueries: [{ propertyName: \"splitRef\", first: true, predicate: ResizableSplit, descendants: true, isSignal: true }], ngImport: i0, template: `\n @if (loading()) {\n <div class=\"afp-flex afp-items-center afp-justify-center afp-w-full afp-h-full\">\n <div class=\"afp-w-12 afp-h-12 afp-border-4 afp-border-line-strong afp-border-t-spinner-head afp-rounded-full afp-animate-spin\"></div>\n </div>\n } @else if (error() || !tree()) {\n <afp-renderer-error [message]=\"error() || t('zip.parse_failed')\" />\n } @else {\n <afp-resizable-split\n [initialLeftWidth]=\"280\"\n [minLeftWidth]=\"180\"\n [maxLeftWidth]=\"560\"\n storageKey=\"afp-zip-split-left\"\n [mobileTabMode]=\"true\"\n leftTabLabel=\"文件树\"\n rightTabLabel=\"预览\"\n >\n <div splitLeft class=\"afp-w-full afp-h-full afp-overflow-auto\">\n @for (child of tree()!.children || []; track child.path) {\n <afp-zip-tree-item\n [node]=\"child\"\n [depth]=\"0\"\n [selectedPath]=\"selected()?.path ?? null\"\n [expanded]=\"expanded()\"\n (toggle)=\"handleToggle($event)\"\n (select)=\"handleSelect($event)\"\n (hover)=\"handleHover($event)\"\n (leave)=\"handleLeave()\"\n />\n }\n </div>\n <div splitRight class=\"afp-w-full afp-h-full afp-flex afp-flex-col\">\n @if (!selected()) {\n <div class=\"afp-flex-1 afp-flex afp-items-center afp-justify-center afp-text-fg-muted afp-text-sm afp-p-6\">\n 从左侧选择一个文件以预览\n </div>\n } @else if (previewLoading()) {\n <div class=\"afp-flex-1 afp-flex afp-items-center afp-justify-center\">\n <div class=\"afp-w-8 afp-h-8 afp-border-4 afp-border-line-strong afp-border-t-spinner-head afp-rounded-full afp-animate-spin\"></div>\n </div>\n } @else if (previewError()) {\n <div class=\"afp-flex-1 afp-flex afp-items-center afp-justify-center afp-text-fg-secondary\">{{ previewError() }}</div>\n } @else {\n <div class=\"afp-flex-1 afp-min-h-0 afp-overflow-hidden afp-flex afp-relative afp-z-0\">\n <FilePreviewContent\n mode=\"embed\"\n [files]=\"previewFiles()\"\n [currentIndex]=\"0\"\n [zipNestingDepth]=\"nestingDepth() + 1\"\n />\n </div>\n }\n </div>\n </afp-resizable-split>\n }\n `, isInline: true, dependencies: [{ kind: \"component\", type: RendererError, selector: \"afp-renderer-error\", inputs: [\"message\", \"detail\", \"showIcon\"] }, { kind: \"component\", type: ResizableSplit, selector: \"afp-resizable-split\", inputs: [\"initialLeftWidth\", \"minLeftWidth\", \"maxLeftWidth\", \"minRightWidth\", \"storageKey\", \"desktopMedia\", \"mobileTabMode\", \"leftTabLabel\", \"rightTabLabel\"] }, { kind: \"component\", type: ZipTreeItem, selector: \"afp-zip-tree-item\", inputs: [\"node\", \"depth\", \"selectedPath\", \"expanded\"], outputs: [\"toggle\", \"select\", \"hover\", \"leave\"] }, { kind: \"component\", type: FilePreviewContent, selector: \"FilePreviewContent, afp-file-preview-content\", inputs: [\"files\", \"currentIndex\", \"customRenderers\", \"mode\", \"zipNestingDepth\", \"locale\", \"messages\", \"headless\", \"theme\", \"requestInit\", \"requestHandler\", \"shouldFetchAsBlob\", \"onDownload\", \"showClose\", \"showDownload\"], outputs: [\"navigate\", \"close\", \"customEvent\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"19.2.25\", ngImport: i0, type: ZipRenderer, decorators: [{\n type: Component,\n args: [{\n selector: 'afp-zip-renderer',\n standalone: true,\n imports: [RendererError, ResizableSplit, ZipTreeItem, FilePreviewContent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'afp-block afp-w-full afp-h-full' },\n template: `\n @if (loading()) {\n <div class=\"afp-flex afp-items-center afp-justify-center afp-w-full afp-h-full\">\n <div class=\"afp-w-12 afp-h-12 afp-border-4 afp-border-line-strong afp-border-t-spinner-head afp-rounded-full afp-animate-spin\"></div>\n </div>\n } @else if (error() || !tree()) {\n <afp-renderer-error [message]=\"error() || t('zip.parse_failed')\" />\n } @else {\n <afp-resizable-split\n [initialLeftWidth]=\"280\"\n [minLeftWidth]=\"180\"\n [maxLeftWidth]=\"560\"\n storageKey=\"afp-zip-split-left\"\n [mobileTabMode]=\"true\"\n leftTabLabel=\"文件树\"\n rightTabLabel=\"预览\"\n >\n <div splitLeft class=\"afp-w-full afp-h-full afp-overflow-auto\">\n @for (child of tree()!.children || []; track child.path) {\n <afp-zip-tree-item\n [node]=\"child\"\n [depth]=\"0\"\n [selectedPath]=\"selected()?.path ?? null\"\n [expanded]=\"expanded()\"\n (toggle)=\"handleToggle($event)\"\n (select)=\"handleSelect($event)\"\n (hover)=\"handleHover($event)\"\n (leave)=\"handleLeave()\"\n />\n }\n </div>\n <div splitRight class=\"afp-w-full afp-h-full afp-flex afp-flex-col\">\n @if (!selected()) {\n <div class=\"afp-flex-1 afp-flex afp-items-center afp-justify-center afp-text-fg-muted afp-text-sm afp-p-6\">\n 从左侧选择一个文件以预览\n </div>\n } @else if (previewLoading()) {\n <div class=\"afp-flex-1 afp-flex afp-items-center afp-justify-center\">\n <div class=\"afp-w-8 afp-h-8 afp-border-4 afp-border-line-strong afp-border-t-spinner-head afp-rounded-full afp-animate-spin\"></div>\n </div>\n } @else if (previewError()) {\n <div class=\"afp-flex-1 afp-flex afp-items-center afp-justify-center afp-text-fg-secondary\">{{ previewError() }}</div>\n } @else {\n <div class=\"afp-flex-1 afp-min-h-0 afp-overflow-hidden afp-flex afp-relative afp-z-0\">\n <FilePreviewContent\n mode=\"embed\"\n [files]=\"previewFiles()\"\n [currentIndex]=\"0\"\n [zipNestingDepth]=\"nestingDepth() + 1\"\n />\n </div>\n }\n </div>\n </afp-resizable-split>\n }\n `,\n }]\n }], ctorParameters: () => [] });\n\nexport { ZipRenderer };\n//# sourceMappingURL=eternalheart-angular-file-preview-index-BGqTRZbm.mjs.map\n"],"names":["formatFileSize","getFileType","inferMimeType","readZipEntryBlob","loadZip","listZipEntries","buildZipTree"],"mappings":"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AE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,cAAc,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE;AAC3kD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,oOAAoO,CAAC,EAAE,eAAe,EAAE,EAAE,CAAC,uBAAuB,CAAC,MAAM,EAAE,CAAC,CAAC;AAC3T;AACA,EAAE,CAAC,wBAAwB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC;AACzH,YAAY,IAAI,EAAE,SAAS;AAC3B,YAAY,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,qBAAqB,EAAE,UAAU,EAAE,IAAI,EAAE,eAAe,EAAE,uBAAuB,CAAC,MAAM,EAAE,QAAQ,EAAE;AACnI;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,oOAAoO,CAAC,EAAE;AACrP,SAAS,CAAC,EAAE,cAAc,EAAE,MAAM,EAAE,EAA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"}
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { input, inject, Injector, signal, viewChild, computed, effect, untracked, afterNextRender, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
|
+
import { DomSanitizer } from '@angular/platform-browser';
|
|
4
|
+
import MarkdownIt from 'markdown-it';
|
|
5
|
+
import MarkdownItKatex from '@traptitech/markdown-it-katex';
|
|
6
|
+
import { codeToHtml } from 'shiki';
|
|
7
|
+
import { Code, Eye } from 'lucide-angular';
|
|
8
|
+
import { L as LocaleService, R as RequestService, T as ThemeService, g as getFallbackTranslator, e as e0 } from './eternalheart-angular-file-preview-eternalheart-angular-file-preview-UobTf36G.mjs';
|
|
9
|
+
import { R as RendererError } from './eternalheart-angular-file-preview-eternalheart-angular-file-preview-RendererError-DtNihCIX-DtNihCIX.mjs';
|
|
10
|
+
import { T as ToolbarEventEmitter } from './eternalheart-angular-file-preview-eternalheart-angular-file-preview-base.types-D5x7QPey-D5x7QPey.mjs';
|
|
11
|
+
import 'katex/dist/katex.min.css';
|
|
12
|
+
|
|
13
|
+
class MarkdownRenderer {
|
|
14
|
+
constructor() {
|
|
15
|
+
this.url = input.required();
|
|
16
|
+
this.emitter = new ToolbarEventEmitter();
|
|
17
|
+
this.locale = inject(LocaleService, { optional: true });
|
|
18
|
+
this.request = inject(RequestService, { optional: true });
|
|
19
|
+
this.themeService = inject(ThemeService, { optional: true });
|
|
20
|
+
this.sanitizer = inject(DomSanitizer);
|
|
21
|
+
this.injector = inject(Injector);
|
|
22
|
+
this.t = this.locale?.t() ?? getFallbackTranslator();
|
|
23
|
+
this.viewMode = signal('preview');
|
|
24
|
+
this.content = signal('');
|
|
25
|
+
this.html = signal('');
|
|
26
|
+
this.highlightedSource = signal('');
|
|
27
|
+
this.loading = signal(true);
|
|
28
|
+
this.error = signal(null);
|
|
29
|
+
this.container = viewChild('container');
|
|
30
|
+
this.shikiTheme = computed(() => (this.themeService?.theme() ?? 'dark') === 'light' ? 'github-light' : 'github-dark');
|
|
31
|
+
this.trustedHtml = computed(() => this.sanitizer.bypassSecurityTrustHtml(this.html()));
|
|
32
|
+
this.trustedSource = computed(() => this.sanitizer.bypassSecurityTrustHtml(this.highlightedSource()));
|
|
33
|
+
this.md = MarkdownRenderer.createMarkdownIt();
|
|
34
|
+
this.themeWatchStarted = false;
|
|
35
|
+
this.getToolbarGroups = () => {
|
|
36
|
+
const groups = [];
|
|
37
|
+
groups.push({
|
|
38
|
+
items: [
|
|
39
|
+
{
|
|
40
|
+
type: 'button',
|
|
41
|
+
icon: this.viewMode() === 'preview' ? Code : Eye,
|
|
42
|
+
tooltip: this.viewMode() === 'preview' ? this.t('toolbar.source') : this.t('toolbar.preview'),
|
|
43
|
+
action: () => {
|
|
44
|
+
this.viewMode.set(this.viewMode() === 'preview' ? 'source' : 'preview');
|
|
45
|
+
},
|
|
46
|
+
active: this.viewMode() === 'source',
|
|
47
|
+
},
|
|
48
|
+
],
|
|
49
|
+
});
|
|
50
|
+
return groups;
|
|
51
|
+
};
|
|
52
|
+
this.onToolbarChange = (listener) => this.emitter.subscribe(listener);
|
|
53
|
+
effect(() => {
|
|
54
|
+
this.url();
|
|
55
|
+
void this.loadMarkdown();
|
|
56
|
+
});
|
|
57
|
+
effect(() => {
|
|
58
|
+
this.shikiTheme();
|
|
59
|
+
if (!this.themeWatchStarted) {
|
|
60
|
+
this.themeWatchStarted = true;
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
untracked(() => {
|
|
64
|
+
if (this.content())
|
|
65
|
+
void this.loadMarkdown();
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
effect(() => {
|
|
69
|
+
this.viewMode();
|
|
70
|
+
this.loading();
|
|
71
|
+
this.emitter.notify();
|
|
72
|
+
});
|
|
73
|
+
effect(() => {
|
|
74
|
+
const html = this.html();
|
|
75
|
+
const mode = this.viewMode();
|
|
76
|
+
const loading = this.loading();
|
|
77
|
+
if (!html || loading || mode !== 'preview')
|
|
78
|
+
return;
|
|
79
|
+
afterNextRender(() => {
|
|
80
|
+
void this.highlightAndInjectCopyButtons();
|
|
81
|
+
}, { injector: this.injector });
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
static createMarkdownIt() {
|
|
85
|
+
const md = new MarkdownIt({
|
|
86
|
+
html: true,
|
|
87
|
+
linkify: true,
|
|
88
|
+
typographer: false,
|
|
89
|
+
breaks: false,
|
|
90
|
+
});
|
|
91
|
+
md.use(MarkdownItKatex);
|
|
92
|
+
md.renderer.rules.fence = (tokens, idx) => {
|
|
93
|
+
const token = tokens[idx];
|
|
94
|
+
const info = token.info ? token.info.trim() : '';
|
|
95
|
+
const code = token.content;
|
|
96
|
+
if (!info) {
|
|
97
|
+
return `<div class="code-block-wrapper">
|
|
98
|
+
<pre class="no-lang-pre"><code>${md.utils.escapeHtml(code)}</code></pre>
|
|
99
|
+
</div>`;
|
|
100
|
+
}
|
|
101
|
+
return `<div class="code-block-wrapper">
|
|
102
|
+
<div class="code-block-header">
|
|
103
|
+
<span>${info}</span>
|
|
104
|
+
</div>
|
|
105
|
+
<pre data-shiki-pending="1" data-lang="${info}"><code>${md.utils.escapeHtml(code)}</code></pre>
|
|
106
|
+
</div>`;
|
|
107
|
+
};
|
|
108
|
+
md.renderer.rules.code_block = (tokens, idx) => {
|
|
109
|
+
const code = tokens[idx].content;
|
|
110
|
+
return `<div class="code-block-wrapper">
|
|
111
|
+
<pre class="no-lang-pre"><code>${md.utils.escapeHtml(code)}</code></pre>
|
|
112
|
+
</div>`;
|
|
113
|
+
};
|
|
114
|
+
const defaultTableOpen = md.renderer.rules.table_open ||
|
|
115
|
+
((tokens, idx, options, _env, self) => self.renderToken(tokens, idx, options));
|
|
116
|
+
md.renderer.rules.table_open = (tokens, idx, options, env, self) => {
|
|
117
|
+
return '<div class="table-wrapper">' + defaultTableOpen(tokens, idx, options, env, self);
|
|
118
|
+
};
|
|
119
|
+
const defaultTableClose = md.renderer.rules.table_close ||
|
|
120
|
+
((tokens, idx, options, _env, self) => self.renderToken(tokens, idx, options));
|
|
121
|
+
md.renderer.rules.table_close = (tokens, idx, options, env, self) => {
|
|
122
|
+
return defaultTableClose(tokens, idx, options, env, self) + '</div>';
|
|
123
|
+
};
|
|
124
|
+
return md;
|
|
125
|
+
}
|
|
126
|
+
async loadMarkdown() {
|
|
127
|
+
this.loading.set(true);
|
|
128
|
+
this.error.set(null);
|
|
129
|
+
try {
|
|
130
|
+
const fetcher = this.request?.fetcher() ?? ((u, init) => fetch(u, init));
|
|
131
|
+
const text = await e0(this.url(), { fetcher });
|
|
132
|
+
this.content.set(text);
|
|
133
|
+
this.html.set(this.md.render(text));
|
|
134
|
+
this.loading.set(false);
|
|
135
|
+
try {
|
|
136
|
+
this.highlightedSource.set(await codeToHtml(text, { lang: 'markdown', theme: this.shikiTheme() }));
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
this.highlightedSource.set('');
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
catch (err) {
|
|
143
|
+
console.error(err);
|
|
144
|
+
this.error.set(this.t('markdown.load_failed'));
|
|
145
|
+
this.loading.set(false);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
createCopyButton(code, inline) {
|
|
149
|
+
const COPY_SVG_SM = `<svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="14" height="14" x="8" y="8" rx="2" ry="2"/><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/></svg>`;
|
|
150
|
+
const COPY_SVG_MD = `<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="14" height="14" x="8" y="8" rx="2" ry="2"/><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/></svg>`;
|
|
151
|
+
const CHECK_SVG_SM = `<svg xmlns="http://www.w3.org/2000/svg" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6 9 17l-5-5"/></svg>`;
|
|
152
|
+
const CHECK_SVG_MD = `<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 6 9 17l-5-5"/></svg>`;
|
|
153
|
+
const btn = document.createElement('button');
|
|
154
|
+
btn.type = 'button';
|
|
155
|
+
btn.className = inline ? 'code-copy-btn' : 'code-copy-btn code-copy-float';
|
|
156
|
+
btn.title = this.t('markdown.copy_code');
|
|
157
|
+
btn.innerHTML = inline ? COPY_SVG_SM : COPY_SVG_MD;
|
|
158
|
+
btn.addEventListener('click', async (e) => {
|
|
159
|
+
e.stopPropagation();
|
|
160
|
+
try {
|
|
161
|
+
await navigator.clipboard.writeText(code);
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
const ta = document.createElement('textarea');
|
|
165
|
+
ta.value = code;
|
|
166
|
+
document.body.appendChild(ta);
|
|
167
|
+
ta.select();
|
|
168
|
+
document.execCommand('copy');
|
|
169
|
+
document.body.removeChild(ta);
|
|
170
|
+
}
|
|
171
|
+
btn.innerHTML = inline ? CHECK_SVG_SM : CHECK_SVG_MD;
|
|
172
|
+
btn.title = this.t('markdown.copied');
|
|
173
|
+
setTimeout(() => {
|
|
174
|
+
btn.innerHTML = inline ? COPY_SVG_SM : COPY_SVG_MD;
|
|
175
|
+
btn.title = this.t('markdown.copy_code');
|
|
176
|
+
}, 2000);
|
|
177
|
+
});
|
|
178
|
+
return btn;
|
|
179
|
+
}
|
|
180
|
+
async highlightAndInjectCopyButtons() {
|
|
181
|
+
const el = this.container()?.nativeElement;
|
|
182
|
+
if (!el)
|
|
183
|
+
return;
|
|
184
|
+
const pending = el.querySelectorAll('pre[data-shiki-pending="1"]');
|
|
185
|
+
for (const pre of pending) {
|
|
186
|
+
const lang = pre.getAttribute('data-lang') || 'text';
|
|
187
|
+
const code = pre.querySelector('code')?.textContent || '';
|
|
188
|
+
try {
|
|
189
|
+
const highlighted = await codeToHtml(code, { lang, theme: this.shikiTheme() });
|
|
190
|
+
const tmp = document.createElement('div');
|
|
191
|
+
tmp.innerHTML = highlighted;
|
|
192
|
+
const newPre = tmp.firstElementChild;
|
|
193
|
+
if (newPre)
|
|
194
|
+
pre.replaceWith(newPre);
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
pre.style.backgroundColor = 'var(--fp-code-bg)';
|
|
198
|
+
pre.removeAttribute('data-shiki-pending');
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
const wrappers = el.querySelectorAll('.code-block-wrapper');
|
|
202
|
+
for (const wrapper of wrappers) {
|
|
203
|
+
if (wrapper.querySelector('.code-copy-btn'))
|
|
204
|
+
continue;
|
|
205
|
+
const header = wrapper.querySelector('.code-block-header');
|
|
206
|
+
const pre = wrapper.querySelector('pre');
|
|
207
|
+
const code = pre?.querySelector('code')?.textContent ?? pre?.textContent ?? '';
|
|
208
|
+
if (header) {
|
|
209
|
+
header.appendChild(this.createCopyButton(code, true));
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
wrapper.appendChild(this.createCopyButton(code, false));
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: MarkdownRenderer, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
217
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: MarkdownRenderer, isStandalone: true, selector: "afp-markdown-renderer", inputs: { url: { classPropertyName: "url", publicName: "url", isSignal: true, isRequired: true, transformFunction: null } }, host: { classAttribute: "afp-block afp-w-full afp-h-full" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
218
|
+
@if (loading()) {
|
|
219
|
+
<div class="afp-flex afp-items-center afp-justify-center afp-w-full afp-h-full">
|
|
220
|
+
<div
|
|
221
|
+
class="afp-w-12 afp-h-12 afp-border-4 afp-border-line-strong afp-border-t-spinner-head afp-rounded-full afp-animate-spin"
|
|
222
|
+
></div>
|
|
223
|
+
</div>
|
|
224
|
+
} @else if (error()) {
|
|
225
|
+
<afp-renderer-error [message]="error()!" />
|
|
226
|
+
} @else if (viewMode() === 'source') {
|
|
227
|
+
<div class="afp-w-full afp-h-full afp-overflow-auto" style="background: var(--fp-code-bg);">
|
|
228
|
+
@if (!highlightedSource()) {
|
|
229
|
+
<pre
|
|
230
|
+
class="afp-p-6 afp-text-fg-primary afp-font-mono afp-text-sm afp-whitespace-pre-wrap afp-break-words"
|
|
231
|
+
>{{ content() }}</pre>
|
|
232
|
+
} @else {
|
|
233
|
+
<div class="shiki-wrapper" [innerHTML]="trustedSource()"></div>
|
|
234
|
+
}
|
|
235
|
+
</div>
|
|
236
|
+
} @else {
|
|
237
|
+
<div class="afp-w-full afp-h-full afp-overflow-auto afp-py-6 afp-px-4">
|
|
238
|
+
<div #container class="markdown-body" [innerHTML]="trustedHtml()"></div>
|
|
239
|
+
</div>
|
|
240
|
+
}
|
|
241
|
+
`, isInline: true, styles: [".markdown-body ::ng-deep .table-wrapper{overflow-x:auto;margin:1rem 0;border-radius:.375rem;border:1px solid var(--fp-surface-3)}.markdown-body ::ng-deep .table-wrapper>table{margin:0;border:0;border-radius:0}.markdown-body ::ng-deep .code-block-wrapper pre.shiki{margin:0;border-top-left-radius:0;border-top-right-radius:0;border-top:0}.markdown-body ::ng-deep .code-block-wrapper{overflow:visible}.markdown-body ::ng-deep .code-block-wrapper pre{overflow:visible}.markdown-body ::ng-deep .no-lang-pre{margin:0;padding:1rem;background:var(--fp-code-bg);border-radius:.375rem;border:1px solid var(--fp-line)}.markdown-body ::ng-deep .no-lang-pre code{display:block;font-size:.8125rem;line-height:1.5;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;color:var(--fp-fg-primary);white-space:pre;overflow-x:auto}.markdown-body ::ng-deep pre.shiki code{display:block;padding:1rem;font-size:.8125rem;line-height:1.5;overflow-x:auto;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace}.markdown-body ::ng-deep .katex{color:var(--fp-fg-primary)}.markdown-body ::ng-deep .katex-display{margin:1.25rem 0;overflow-x:auto;overflow-y:hidden}.shiki-wrapper ::ng-deep pre{margin:0;padding:1.5rem;background:transparent!important;font-size:.875rem;overflow-x:auto}.shiki-wrapper ::ng-deep code{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace}\n"], dependencies: [{ kind: "component", type: RendererError, selector: "afp-renderer-error", inputs: ["message", "detail", "showIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
242
|
+
}
|
|
243
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: MarkdownRenderer, decorators: [{
|
|
244
|
+
type: Component,
|
|
245
|
+
args: [{ selector: 'afp-markdown-renderer', standalone: true, imports: [RendererError], changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'afp-block afp-w-full afp-h-full' }, template: `
|
|
246
|
+
@if (loading()) {
|
|
247
|
+
<div class="afp-flex afp-items-center afp-justify-center afp-w-full afp-h-full">
|
|
248
|
+
<div
|
|
249
|
+
class="afp-w-12 afp-h-12 afp-border-4 afp-border-line-strong afp-border-t-spinner-head afp-rounded-full afp-animate-spin"
|
|
250
|
+
></div>
|
|
251
|
+
</div>
|
|
252
|
+
} @else if (error()) {
|
|
253
|
+
<afp-renderer-error [message]="error()!" />
|
|
254
|
+
} @else if (viewMode() === 'source') {
|
|
255
|
+
<div class="afp-w-full afp-h-full afp-overflow-auto" style="background: var(--fp-code-bg);">
|
|
256
|
+
@if (!highlightedSource()) {
|
|
257
|
+
<pre
|
|
258
|
+
class="afp-p-6 afp-text-fg-primary afp-font-mono afp-text-sm afp-whitespace-pre-wrap afp-break-words"
|
|
259
|
+
>{{ content() }}</pre>
|
|
260
|
+
} @else {
|
|
261
|
+
<div class="shiki-wrapper" [innerHTML]="trustedSource()"></div>
|
|
262
|
+
}
|
|
263
|
+
</div>
|
|
264
|
+
} @else {
|
|
265
|
+
<div class="afp-w-full afp-h-full afp-overflow-auto afp-py-6 afp-px-4">
|
|
266
|
+
<div #container class="markdown-body" [innerHTML]="trustedHtml()"></div>
|
|
267
|
+
</div>
|
|
268
|
+
}
|
|
269
|
+
`, styles: [".markdown-body ::ng-deep .table-wrapper{overflow-x:auto;margin:1rem 0;border-radius:.375rem;border:1px solid var(--fp-surface-3)}.markdown-body ::ng-deep .table-wrapper>table{margin:0;border:0;border-radius:0}.markdown-body ::ng-deep .code-block-wrapper pre.shiki{margin:0;border-top-left-radius:0;border-top-right-radius:0;border-top:0}.markdown-body ::ng-deep .code-block-wrapper{overflow:visible}.markdown-body ::ng-deep .code-block-wrapper pre{overflow:visible}.markdown-body ::ng-deep .no-lang-pre{margin:0;padding:1rem;background:var(--fp-code-bg);border-radius:.375rem;border:1px solid var(--fp-line)}.markdown-body ::ng-deep .no-lang-pre code{display:block;font-size:.8125rem;line-height:1.5;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;color:var(--fp-fg-primary);white-space:pre;overflow-x:auto}.markdown-body ::ng-deep pre.shiki code{display:block;padding:1rem;font-size:.8125rem;line-height:1.5;overflow-x:auto;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace}.markdown-body ::ng-deep .katex{color:var(--fp-fg-primary)}.markdown-body ::ng-deep .katex-display{margin:1.25rem 0;overflow-x:auto;overflow-y:hidden}.shiki-wrapper ::ng-deep pre{margin:0;padding:1.5rem;background:transparent!important;font-size:.875rem;overflow-x:auto}.shiki-wrapper ::ng-deep code{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace}\n"] }]
|
|
270
|
+
}], ctorParameters: () => [] });
|
|
271
|
+
|
|
272
|
+
export { MarkdownRenderer };
|
|
273
|
+
//# sourceMappingURL=eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-Bv3JRXKn-B4Wewc-4.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-Bv3JRXKn-B4Wewc-4.mjs","sources":["../fesm2022/eternalheart-angular-file-preview-index-Bv3JRXKn.mjs"],"sourcesContent":["import * as i0 from '@angular/core';\nimport { input, inject, Injector, signal, viewChild, computed, effect, untracked, afterNextRender, ChangeDetectionStrategy, Component } from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport MarkdownIt from 'markdown-it';\nimport MarkdownItKatex from '@traptitech/markdown-it-katex';\nimport { codeToHtml } from 'shiki';\nimport { Code, Eye } from 'lucide-angular';\nimport { L as LocaleService, R as RequestService, T as ThemeService, g as getFallbackTranslator } from './eternalheart-angular-file-preview-eternalheart-angular-file-preview-DXwNhxAB.mjs';\nimport { R as RendererError } from './eternalheart-angular-file-preview-RendererError-DtNihCIX.mjs';\nimport { T as ToolbarEventEmitter } from './eternalheart-angular-file-preview-base.types-D5x7QPey.mjs';\nimport 'katex/dist/katex.min.css';\nimport { fetchTextUtf8 } from '@eternalheart/file-preview-core';\n\nclass MarkdownRenderer {\n constructor() {\n this.url = input.required();\n this.emitter = new ToolbarEventEmitter();\n this.locale = inject(LocaleService, { optional: true });\n this.request = inject(RequestService, { optional: true });\n this.themeService = inject(ThemeService, { optional: true });\n this.sanitizer = inject(DomSanitizer);\n this.injector = inject(Injector);\n this.t = this.locale?.t() ?? getFallbackTranslator();\n this.viewMode = signal('preview');\n this.content = signal('');\n this.html = signal('');\n this.highlightedSource = signal('');\n this.loading = signal(true);\n this.error = signal(null);\n this.container = viewChild('container');\n this.shikiTheme = computed(() => (this.themeService?.theme() ?? 'dark') === 'light' ? 'github-light' : 'github-dark');\n this.trustedHtml = computed(() => this.sanitizer.bypassSecurityTrustHtml(this.html()));\n this.trustedSource = computed(() => this.sanitizer.bypassSecurityTrustHtml(this.highlightedSource()));\n this.md = MarkdownRenderer.createMarkdownIt();\n this.themeWatchStarted = false;\n this.getToolbarGroups = () => {\n const groups = [];\n groups.push({\n items: [\n {\n type: 'button',\n icon: this.viewMode() === 'preview' ? Code : Eye,\n tooltip: this.viewMode() === 'preview' ? this.t('toolbar.source') : this.t('toolbar.preview'),\n action: () => {\n this.viewMode.set(this.viewMode() === 'preview' ? 'source' : 'preview');\n },\n active: this.viewMode() === 'source',\n },\n ],\n });\n return groups;\n };\n this.onToolbarChange = (listener) => this.emitter.subscribe(listener);\n effect(() => {\n this.url();\n void this.loadMarkdown();\n });\n effect(() => {\n this.shikiTheme();\n if (!this.themeWatchStarted) {\n this.themeWatchStarted = true;\n return;\n }\n untracked(() => {\n if (this.content())\n void this.loadMarkdown();\n });\n });\n effect(() => {\n this.viewMode();\n this.loading();\n this.emitter.notify();\n });\n effect(() => {\n const html = this.html();\n const mode = this.viewMode();\n const loading = this.loading();\n if (!html || loading || mode !== 'preview')\n return;\n afterNextRender(() => {\n void this.highlightAndInjectCopyButtons();\n }, { injector: this.injector });\n });\n }\n static createMarkdownIt() {\n const md = new MarkdownIt({\n html: true,\n linkify: true,\n typographer: false,\n breaks: false,\n });\n md.use(MarkdownItKatex);\n md.renderer.rules.fence = (tokens, idx) => {\n const token = tokens[idx];\n const info = token.info ? token.info.trim() : '';\n const code = token.content;\n if (!info) {\n return `<div class=\"code-block-wrapper\">\n <pre class=\"no-lang-pre\"><code>${md.utils.escapeHtml(code)}</code></pre>\n </div>`;\n }\n return `<div class=\"code-block-wrapper\">\n <div class=\"code-block-header\">\n <span>${info}</span>\n </div>\n <pre data-shiki-pending=\"1\" data-lang=\"${info}\"><code>${md.utils.escapeHtml(code)}</code></pre>\n </div>`;\n };\n md.renderer.rules.code_block = (tokens, idx) => {\n const code = tokens[idx].content;\n return `<div class=\"code-block-wrapper\">\n <pre class=\"no-lang-pre\"><code>${md.utils.escapeHtml(code)}</code></pre>\n </div>`;\n };\n const defaultTableOpen = md.renderer.rules.table_open ||\n ((tokens, idx, options, _env, self) => self.renderToken(tokens, idx, options));\n md.renderer.rules.table_open = (tokens, idx, options, env, self) => {\n return '<div class=\"table-wrapper\">' + defaultTableOpen(tokens, idx, options, env, self);\n };\n const defaultTableClose = md.renderer.rules.table_close ||\n ((tokens, idx, options, _env, self) => self.renderToken(tokens, idx, options));\n md.renderer.rules.table_close = (tokens, idx, options, env, self) => {\n return defaultTableClose(tokens, idx, options, env, self) + '</div>';\n };\n return md;\n }\n async loadMarkdown() {\n this.loading.set(true);\n this.error.set(null);\n try {\n const fetcher = this.request?.fetcher() ?? ((u, init) => fetch(u, init));\n const text = await fetchTextUtf8(this.url(), { fetcher });\n this.content.set(text);\n this.html.set(this.md.render(text));\n this.loading.set(false);\n try {\n this.highlightedSource.set(await codeToHtml(text, { lang: 'markdown', theme: this.shikiTheme() }));\n }\n catch {\n this.highlightedSource.set('');\n }\n }\n catch (err) {\n console.error(err);\n this.error.set(this.t('markdown.load_failed'));\n this.loading.set(false);\n }\n }\n createCopyButton(code, inline) {\n const COPY_SVG_SM = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg>`;\n const COPY_SVG_MD = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg>`;\n const CHECK_SVG_SM = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 6 9 17l-5-5\"/></svg>`;\n const CHECK_SVG_MD = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 6 9 17l-5-5\"/></svg>`;\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = inline ? 'code-copy-btn' : 'code-copy-btn code-copy-float';\n btn.title = this.t('markdown.copy_code');\n btn.innerHTML = inline ? COPY_SVG_SM : COPY_SVG_MD;\n btn.addEventListener('click', async (e) => {\n e.stopPropagation();\n try {\n await navigator.clipboard.writeText(code);\n }\n catch {\n const ta = document.createElement('textarea');\n ta.value = code;\n document.body.appendChild(ta);\n ta.select();\n document.execCommand('copy');\n document.body.removeChild(ta);\n }\n btn.innerHTML = inline ? CHECK_SVG_SM : CHECK_SVG_MD;\n btn.title = this.t('markdown.copied');\n setTimeout(() => {\n btn.innerHTML = inline ? COPY_SVG_SM : COPY_SVG_MD;\n btn.title = this.t('markdown.copy_code');\n }, 2000);\n });\n return btn;\n }\n async highlightAndInjectCopyButtons() {\n const el = this.container()?.nativeElement;\n if (!el)\n return;\n const pending = el.querySelectorAll('pre[data-shiki-pending=\"1\"]');\n for (const pre of pending) {\n const lang = pre.getAttribute('data-lang') || 'text';\n const code = pre.querySelector('code')?.textContent || '';\n try {\n const highlighted = await codeToHtml(code, { lang, theme: this.shikiTheme() });\n const tmp = document.createElement('div');\n tmp.innerHTML = highlighted;\n const newPre = tmp.firstElementChild;\n if (newPre)\n pre.replaceWith(newPre);\n }\n catch {\n pre.style.backgroundColor = 'var(--fp-code-bg)';\n pre.removeAttribute('data-shiki-pending');\n }\n }\n const wrappers = el.querySelectorAll('.code-block-wrapper');\n for (const wrapper of wrappers) {\n if (wrapper.querySelector('.code-copy-btn'))\n continue;\n const header = wrapper.querySelector('.code-block-header');\n const pre = wrapper.querySelector('pre');\n const code = pre?.querySelector('code')?.textContent ?? pre?.textContent ?? '';\n if (header) {\n header.appendChild(this.createCopyButton(code, true));\n }\n else {\n wrapper.appendChild(this.createCopyButton(code, false));\n }\n }\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"19.2.25\", ngImport: i0, type: MarkdownRenderer, deps: [], target: i0.ɵɵFactoryTarget.Component }); }\n static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.0.0\", version: \"19.2.25\", type: MarkdownRenderer, isStandalone: true, selector: \"afp-markdown-renderer\", inputs: { url: { classPropertyName: \"url\", publicName: \"url\", isSignal: true, isRequired: true, transformFunction: null } }, host: { classAttribute: \"afp-block afp-w-full afp-h-full\" }, viewQueries: [{ propertyName: \"container\", first: true, predicate: [\"container\"], descendants: true, isSignal: true }], ngImport: i0, template: `\n @if (loading()) {\n <div class=\"afp-flex afp-items-center afp-justify-center afp-w-full afp-h-full\">\n <div\n class=\"afp-w-12 afp-h-12 afp-border-4 afp-border-line-strong afp-border-t-spinner-head afp-rounded-full afp-animate-spin\"\n ></div>\n </div>\n } @else if (error()) {\n <afp-renderer-error [message]=\"error()!\" />\n } @else if (viewMode() === 'source') {\n <div class=\"afp-w-full afp-h-full afp-overflow-auto\" style=\"background: var(--fp-code-bg);\">\n @if (!highlightedSource()) {\n <pre\n class=\"afp-p-6 afp-text-fg-primary afp-font-mono afp-text-sm afp-whitespace-pre-wrap afp-break-words\"\n >{{ content() }}</pre>\n } @else {\n <div class=\"shiki-wrapper\" [innerHTML]=\"trustedSource()\"></div>\n }\n </div>\n } @else {\n <div class=\"afp-w-full afp-h-full afp-overflow-auto afp-py-6 afp-px-4\">\n <div #container class=\"markdown-body\" [innerHTML]=\"trustedHtml()\"></div>\n </div>\n }\n `, isInline: true, styles: [\".markdown-body ::ng-deep .table-wrapper{overflow-x:auto;margin:1rem 0;border-radius:.375rem;border:1px solid var(--fp-surface-3)}.markdown-body ::ng-deep .table-wrapper>table{margin:0;border:0;border-radius:0}.markdown-body ::ng-deep .code-block-wrapper pre.shiki{margin:0;border-top-left-radius:0;border-top-right-radius:0;border-top:0}.markdown-body ::ng-deep .code-block-wrapper{overflow:visible}.markdown-body ::ng-deep .code-block-wrapper pre{overflow:visible}.markdown-body ::ng-deep .no-lang-pre{margin:0;padding:1rem;background:var(--fp-code-bg);border-radius:.375rem;border:1px solid var(--fp-line)}.markdown-body ::ng-deep .no-lang-pre code{display:block;font-size:.8125rem;line-height:1.5;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;color:var(--fp-fg-primary);white-space:pre;overflow-x:auto}.markdown-body ::ng-deep pre.shiki code{display:block;padding:1rem;font-size:.8125rem;line-height:1.5;overflow-x:auto;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace}.markdown-body ::ng-deep .katex{color:var(--fp-fg-primary)}.markdown-body ::ng-deep .katex-display{margin:1.25rem 0;overflow-x:auto;overflow-y:hidden}.shiki-wrapper ::ng-deep pre{margin:0;padding:1.5rem;background:transparent!important;font-size:.875rem;overflow-x:auto}.shiki-wrapper ::ng-deep code{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace}\\n\"], dependencies: [{ kind: \"component\", type: RendererError, selector: \"afp-renderer-error\", inputs: [\"message\", \"detail\", \"showIcon\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"19.2.25\", ngImport: i0, type: MarkdownRenderer, decorators: [{\n type: Component,\n args: [{ selector: 'afp-markdown-renderer', standalone: true, imports: [RendererError], changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'afp-block afp-w-full afp-h-full' }, template: `\n @if (loading()) {\n <div class=\"afp-flex afp-items-center afp-justify-center afp-w-full afp-h-full\">\n <div\n class=\"afp-w-12 afp-h-12 afp-border-4 afp-border-line-strong afp-border-t-spinner-head afp-rounded-full afp-animate-spin\"\n ></div>\n </div>\n } @else if (error()) {\n <afp-renderer-error [message]=\"error()!\" />\n } @else if (viewMode() === 'source') {\n <div class=\"afp-w-full afp-h-full afp-overflow-auto\" style=\"background: var(--fp-code-bg);\">\n @if (!highlightedSource()) {\n <pre\n class=\"afp-p-6 afp-text-fg-primary afp-font-mono afp-text-sm afp-whitespace-pre-wrap afp-break-words\"\n >{{ content() }}</pre>\n } @else {\n <div class=\"shiki-wrapper\" [innerHTML]=\"trustedSource()\"></div>\n }\n </div>\n } @else {\n <div class=\"afp-w-full afp-h-full afp-overflow-auto afp-py-6 afp-px-4\">\n <div #container class=\"markdown-body\" [innerHTML]=\"trustedHtml()\"></div>\n </div>\n }\n `, styles: [\".markdown-body ::ng-deep .table-wrapper{overflow-x:auto;margin:1rem 0;border-radius:.375rem;border:1px solid var(--fp-surface-3)}.markdown-body ::ng-deep .table-wrapper>table{margin:0;border:0;border-radius:0}.markdown-body ::ng-deep .code-block-wrapper pre.shiki{margin:0;border-top-left-radius:0;border-top-right-radius:0;border-top:0}.markdown-body ::ng-deep .code-block-wrapper{overflow:visible}.markdown-body ::ng-deep .code-block-wrapper pre{overflow:visible}.markdown-body ::ng-deep .no-lang-pre{margin:0;padding:1rem;background:var(--fp-code-bg);border-radius:.375rem;border:1px solid var(--fp-line)}.markdown-body ::ng-deep .no-lang-pre code{display:block;font-size:.8125rem;line-height:1.5;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;color:var(--fp-fg-primary);white-space:pre;overflow-x:auto}.markdown-body ::ng-deep pre.shiki code{display:block;padding:1rem;font-size:.8125rem;line-height:1.5;overflow-x:auto;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace}.markdown-body ::ng-deep .katex{color:var(--fp-fg-primary)}.markdown-body ::ng-deep .katex-display{margin:1.25rem 0;overflow-x:auto;overflow-y:hidden}.shiki-wrapper ::ng-deep pre{margin:0;padding:1.5rem;background:transparent!important;font-size:.875rem;overflow-x:auto}.shiki-wrapper ::ng-deep code{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace}\\n\"] }]\n }], ctorParameters: () => [] });\n\nexport { MarkdownRenderer };\n//# sourceMappingURL=eternalheart-angular-file-preview-index-Bv3JRXKn.mjs.map\n"],"names":["fetchTextUtf8"],"mappings":"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"}
|