@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.
Files changed (119) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +879 -0
  3. package/README.zh-CN.md +876 -0
  4. package/lib/LICENSE +22 -0
  5. package/lib/README.md +879 -0
  6. package/lib/components/preview/file-preview-toolbar.d.ts +19 -0
  7. package/lib/components/preview/nav-arrows.d.ts +25 -0
  8. package/lib/components/preview/renderer-outlet.d.ts +23 -0
  9. package/lib/components/preview/toolbar-button.d.ts +12 -0
  10. package/lib/components/resizable-split.d.ts +32 -0
  11. package/lib/di/locale.service.d.ts +12 -0
  12. package/lib/di/request.service.d.ts +20 -0
  13. package/lib/di/theme-mode.d.ts +6 -0
  14. package/lib/di/theme.service.d.ts +9 -0
  15. package/lib/fesm2022/eternalheart-angular-file-preview-avifLoader-BP3fgcMm-CZsJ9svm.mjs +55 -0
  16. package/lib/fesm2022/eternalheart-angular-file-preview-avifLoader-BP3fgcMm-CZsJ9svm.mjs.map +1 -0
  17. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-RendererError-DtNihCIX-DtNihCIX.mjs +58 -0
  18. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-RendererError-DtNihCIX-DtNihCIX.mjs.map +1 -0
  19. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-UobTf36G.mjs +5835 -0
  20. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-UobTf36G.mjs.map +1 -0
  21. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-base.types-D5x7QPey-D5x7QPey.mjs +17 -0
  22. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-base.types-D5x7QPey-D5x7QPey.mjs.map +1 -0
  23. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index--7d8Hgi0-D-sg24Qs.mjs +284 -0
  24. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index--7d8Hgi0-D-sg24Qs.mjs.map +1 -0
  25. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-6dZS_Cfs-B1itLV5R.mjs +703 -0
  26. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-6dZS_Cfs-B1itLV5R.mjs.map +1 -0
  27. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-B1ANUCTy-BRs7TMLn.mjs +231 -0
  28. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-B1ANUCTy-BRs7TMLn.mjs.map +1 -0
  29. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-BEaqpRV8-BidVIVlO.mjs +552 -0
  30. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-BEaqpRV8-BidVIVlO.mjs.map +1 -0
  31. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-BGqTRZbm-CAOLRw20.mjs +688 -0
  32. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-BGqTRZbm-CAOLRw20.mjs.map +1 -0
  33. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-Bv3JRXKn-B4Wewc-4.mjs +273 -0
  34. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-Bv3JRXKn-B4Wewc-4.mjs.map +1 -0
  35. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-C0McUoqT-DJ35bhIz.mjs +288 -0
  36. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-C0McUoqT-DJ35bhIz.mjs.map +1 -0
  37. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-C518mdUd-B5SCzrzU.mjs +550 -0
  38. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-C518mdUd-B5SCzrzU.mjs.map +1 -0
  39. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-CDjKPqyW-CmX5sdkL.mjs +102 -0
  40. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-CDjKPqyW-CmX5sdkL.mjs.map +1 -0
  41. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-CHi9tOe0-NOeQYAnM.mjs +516 -0
  42. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-CHi9tOe0-NOeQYAnM.mjs.map +1 -0
  43. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-CQwhffym-DAGw4Xy_.mjs +823 -0
  44. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-CQwhffym-DAGw4Xy_.mjs.map +1 -0
  45. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-CSCTj7ft-BfqruUyY.mjs +164 -0
  46. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-CSCTj7ft-BfqruUyY.mjs.map +1 -0
  47. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-Cb1RLXeO-Bj9gjS1Z.mjs +655 -0
  48. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-Cb1RLXeO-Bj9gjS1Z.mjs.map +1 -0
  49. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-Cw90Kdyg-BzrW_cyx.mjs +207 -0
  50. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-Cw90Kdyg-BzrW_cyx.mjs.map +1 -0
  51. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-D35x1nwM-CugEEXjg.mjs +199 -0
  52. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-D35x1nwM-CugEEXjg.mjs.map +1 -0
  53. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-D9jJNzeM-mWX59Aj2.mjs +194 -0
  54. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-D9jJNzeM-mWX59Aj2.mjs.map +1 -0
  55. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-DbmuvdvN-C29uLyt2.mjs +94 -0
  56. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-DbmuvdvN-C29uLyt2.mjs.map +1 -0
  57. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-DsNNZ59Q-C8MaSME6.mjs +468 -0
  58. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-DsNNZ59Q-C8MaSME6.mjs.map +1 -0
  59. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-DufW2Fuc-CTosCut6.mjs +193 -0
  60. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-DufW2Fuc-CTosCut6.mjs.map +1 -0
  61. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-TSTa_Q7E-DBhkL6pV.mjs +184 -0
  62. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-TSTa_Q7E-DBhkL6pV.mjs.map +1 -0
  63. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-pG0Ko5mI-DthQJg-X.mjs +492 -0
  64. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-pG0Ko5mI-DthQJg-X.mjs.map +1 -0
  65. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-shiki-highlight-CL9cG481-BKfwdOpN.mjs +68 -0
  66. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-shiki-highlight-CL9cG481-BKfwdOpN.mjs.map +1 -0
  67. package/lib/fesm2022/eternalheart-angular-file-preview-heicLoader-CH_raQNn-BSXHd_oi.mjs +36 -0
  68. package/lib/fesm2022/eternalheart-angular-file-preview-heicLoader-CH_raQNn-BSXHd_oi.mjs.map +1 -0
  69. package/lib/fesm2022/eternalheart-angular-file-preview-jp2Loader-ldvCSsvm-DJEhfimG.mjs +121 -0
  70. package/lib/fesm2022/eternalheart-angular-file-preview-jp2Loader-ldvCSsvm-DJEhfimG.mjs.map +1 -0
  71. package/lib/fesm2022/eternalheart-angular-file-preview-psdLoader-D5CkupyY-D5Gegcdg.mjs +78 -0
  72. package/lib/fesm2022/eternalheart-angular-file-preview-psdLoader-D5CkupyY-D5Gegcdg.mjs.map +1 -0
  73. package/lib/fesm2022/eternalheart-angular-file-preview-rawLoader-0mLvxCNp-CCXn9Rdp.mjs +81 -0
  74. package/lib/fesm2022/eternalheart-angular-file-preview-rawLoader-0mLvxCNp-CCXn9Rdp.mjs.map +1 -0
  75. package/lib/fesm2022/eternalheart-angular-file-preview-tiffLoader-CmUAD1vO-0JqIws9t.mjs +59 -0
  76. package/lib/fesm2022/eternalheart-angular-file-preview-tiffLoader-CmUAD1vO-0JqIws9t.mjs.map +1 -0
  77. package/lib/fesm2022/eternalheart-angular-file-preview.mjs +2 -0
  78. package/lib/fesm2022/eternalheart-angular-file-preview.mjs.map +1 -0
  79. package/lib/file-preview-content.d.ts +65 -0
  80. package/lib/file-preview-embed.d.ts +30 -0
  81. package/lib/file-preview-modal.d.ts +34 -0
  82. package/lib/fp-core.d.ts +1 -0
  83. package/lib/index.css +2119 -0
  84. package/lib/index.d.ts +11 -0
  85. package/lib/renderers/Audio/index.d.ts +74 -0
  86. package/lib/renderers/Cad/index.d.ts +45 -0
  87. package/lib/renderers/Cad/toolbar.d.ts +15 -0
  88. package/lib/renderers/Csv/index.d.ts +26 -0
  89. package/lib/renderers/Doc/index.d.ts +19 -0
  90. package/lib/renderers/Docx/index.d.ts +42 -0
  91. package/lib/renderers/Epub/index.d.ts +57 -0
  92. package/lib/renderers/Font/font-preview-line.d.ts +26 -0
  93. package/lib/renderers/Font/index.d.ts +52 -0
  94. package/lib/renderers/Image/index.d.ts +79 -0
  95. package/lib/renderers/Json/index.d.ts +61 -0
  96. package/lib/renderers/Markdown/index.d.ts +35 -0
  97. package/lib/renderers/Mobi/index.d.ts +51 -0
  98. package/lib/renderers/Msg/index.d.ts +47 -0
  99. package/lib/renderers/Pdf/index.d.ts +55 -0
  100. package/lib/renderers/Ppt/index.d.ts +19 -0
  101. package/lib/renderers/Pptx/index.d.ts +29 -0
  102. package/lib/renderers/RendererError.d.ts +9 -0
  103. package/lib/renderers/RendererLoading.d.ts +7 -0
  104. package/lib/renderers/Subtitle/index.d.ts +25 -0
  105. package/lib/renderers/Text/index.d.ts +29 -0
  106. package/lib/renderers/Unsupported/index.d.ts +15 -0
  107. package/lib/renderers/Video/index.d.ts +28 -0
  108. package/lib/renderers/Xlsx/index.d.ts +25 -0
  109. package/lib/renderers/Xml/index.d.ts +26 -0
  110. package/lib/renderers/Zip/index.d.ts +58 -0
  111. package/lib/renderers/Zip/tree-item.d.ts +29 -0
  112. package/lib/renderers/base.types.d.ts +10 -0
  113. package/lib/renderers/lazy.d.ts +23 -0
  114. package/lib/renderers/registry.d.ts +13 -0
  115. package/lib/renderers/toolbar.types.d.ts +19 -0
  116. package/lib/types.d.ts +26 -0
  117. package/lib/utils/audio-player.d.ts +20 -0
  118. package/lib/utils/shiki-highlight.d.ts +7 -0
  119. 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":";;;;;;;;AASA,MAAM,cAAc,CAAC;AACrB,IAAI,WAAW,GAAG;AAClB,QAAQ,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,GAAG,CAAC;AAC1C,QAAQ,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC;AACtC,QAAQ,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC;AACtC,QAAQ,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC;AACvC,QAAQ,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,SAAS,CAAC;AAC1C,QAAQ,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,oBAAoB,CAAC;AACvD,QAAQ,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC;AACzC,QAAQ,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC;AACxC,QAAQ,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC;AACxC,QAAQ,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,cAAc,CAAC;AAClD,QAAQ,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC5C,QAAQ,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC;AACpC,QAAQ,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC;AACrC,QAAQ,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC;AACtC,QAAQ,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;AACvC,QAAQ,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;AACpF,QAAQ,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,SAAS,CAAC;AAC1G,QAAQ,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW;AAC5D,cAAc;AACd,cAAc,mGAAmG,CAAC;AAClH,QAAQ,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW;AAC7D,cAAc;AACd,cAAc,wDAAwD,CAAC;AACvE,QAAQ,IAAI,CAAC,cAAc,GAAG,KAAK;AACnC,QAAQ,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK;AAC7B,YAAY,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,EAAE,aAAa;AACtD,YAAY,IAAI,CAAC,EAAE;AACnB,gBAAgB;AAChB,YAAY,MAAM,IAAI,GAAG,EAAE,CAAC,qBAAqB,EAAE;AACnD,YAAY,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI;AAC3C,YAAY,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC;AAC7D,YAAY,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,GAAG,CAAC;AACnE,YAAY,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;AACxF,QAAQ,CAAC;AACT,QAAQ,IAAI,CAAC,IAAI,GAAG,MAAM;AAC1B,YAAY,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;AAChC,gBAAgB;AAChB,YAAY,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AACpC,YAAY,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC;AAChE,YAAY,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC;AAC5D,YAAY,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE;AAC3C,YAAY,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE;AAC/C,YAAY,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE;AACzC,YAAY,IAAI,GAAG,EAAE;AACrB,gBAAgB,IAAI;AACpB,oBAAoB,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;AAC9E,gBAAgB;AAChB,gBAAgB,MAAM;AACtB;AACA,gBAAgB;AAChB,YAAY;AACZ,QAAQ,CAAC;AACT,QAAQ,MAAM,CAAC,MAAM;AACrB,YAAY,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE;AACzC,YAAY,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,EAAE;AACnD,YAAY,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;AACtC,gBAAgB,IAAI,CAAC,cAAc,GAAG,IAAI;AAC1C,gBAAgB,IAAI,GAAG,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;AAC1D,oBAAoB,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAC1E,oBAAoB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE;AACpD,wBAAwB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;AACjD,wBAAwB;AACxB,oBAAoB;AACpB,gBAAgB;AAChB,gBAAgB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC;AAC3C,gBAAgB;AAChB,YAAY;AACZ,YAAY,IAAI,CAAC,GAAG;AACpB,gBAAgB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC;AAC3C,QAAQ,CAAC,CAAC;AACV,QAAQ,MAAM,CAAC,CAAC,SAAS,KAAK;AAC9B,YAAY,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE;AAC7C,YAAY,IAAI,OAAO,MAAM,KAAK,WAAW;AAC7C,gBAAgB;AAChB,YAAY,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC;AAC/C,YAAY,MAAM,OAAO,GAAG,MAAM;AAClC,gBAAgB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC;AAC9C,YAAY,CAAC;AACb,YAAY,OAAO,EAAE;AACrB,YAAY,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC;AAClD,YAAY,SAAS,CAAC,MAAM,EAAE,CAAC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACtE,QAAQ,CAAC,CAAC;AACV,QAAQ,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM;AACxC,YAAY,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC;AAChE,YAAY,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC;AAC5D,YAAY,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;AACjC,gBAAgB,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE;AAC/C,gBAAgB,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE;AACnD,YAAY;AACZ,QAAQ,CAAC,CAAC;AACV,IAAI;AACJ,IAAI,SAAS,CAAC,GAAG,EAAE;AACnB,QAAQ,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;AAC/B,IAAI;AACJ,IAAI,aAAa,CAAC,CAAC,EAAE;AACrB,QAAQ,CAAC,CAAC,cAAc,EAAE;AAC1B,QAAQ,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AAC/B,QAAQ,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC;AACzD,QAAQ,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC;AACrD,QAAQ,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,YAAY;AACjD,QAAQ,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,MAAM;AAC/C,IAAI;AACJ,IAAI,SAAS,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,kBAAkB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC,CAAC;AACjL,IAAI,SAAS,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,oBAAoB,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,qBAAqB,EAAE,MAAM,EAAE,EAAE,gBAAgB,EAAE,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,UAAU,EAAE,kBAAkB,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,YAAY,EAAE,EAAE,iBAAiB,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,YAAY,EAAE,EAAE,iBAAiB,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,aAAa,EAAE,EAAE,iBAAiB,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,EAAE,iBAAiB,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,YAAY,EAAE,EAAE,iBAAiB,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,aAAa,EAAE,EAAE,iBAAiB,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,YAAY,EAAE,EAAE,iBAAiB,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,aAAa,EAAE,EAAE,iBAAiB,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,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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"}