@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,193 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, inject, signal, computed, effect, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { DomSanitizer } from '@angular/platform-browser';
4
+ import { WrapText, Code, Eye } from 'lucide-angular';
5
+ import { L as LocaleService, R as RequestService, g as getFallbackTranslator, h as a0, e as e0 } from './eternalheart-angular-file-preview-eternalheart-angular-file-preview-UobTf36G.mjs';
6
+ import { R as RendererError } from './eternalheart-angular-file-preview-eternalheart-angular-file-preview-RendererError-DtNihCIX-DtNihCIX.mjs';
7
+ import { T as ToolbarEventEmitter } from './eternalheart-angular-file-preview-eternalheart-angular-file-preview-base.types-D5x7QPey-D5x7QPey.mjs';
8
+ import { c as createShikiHighlight } from './eternalheart-angular-file-preview-eternalheart-angular-file-preview-shiki-highlight-CL9cG481-BKfwdOpN.mjs';
9
+
10
+ class TextRenderer {
11
+ constructor() {
12
+ this.url = input.required();
13
+ this.fileName = input.required();
14
+ this.emitter = new ToolbarEventEmitter();
15
+ this.locale = inject(LocaleService, { optional: true });
16
+ this.request = inject(RequestService, { optional: true });
17
+ this.sanitizer = inject(DomSanitizer);
18
+ this.t = this.locale?.t() ?? getFallbackTranslator();
19
+ this.wordWrap = signal(true);
20
+ this.htmlPreview = signal(false);
21
+ this.content = signal('');
22
+ this.loading = signal(true);
23
+ this.error = signal(null);
24
+ this.language = computed(() => a0(this.fileName()));
25
+ this.isHtml = computed(() => this.language() === 'html');
26
+ this.lines = computed(() => this.content().split('\n'));
27
+ this.shiki = createShikiHighlight(() => (this.language() !== 'text' ? this.content() : ''), () => this.language());
28
+ this.lineHtmls = this.shiki.lineHtmls;
29
+ this.getToolbarGroups = () => {
30
+ const groups = [
31
+ {
32
+ items: [
33
+ {
34
+ type: 'button',
35
+ icon: WrapText,
36
+ tooltip: this.wordWrap() ? this.t('toolbar.wrap_off') : this.t('toolbar.wrap_on'),
37
+ action: () => this.wordWrap.update((v) => !v),
38
+ active: this.wordWrap(),
39
+ },
40
+ ],
41
+ },
42
+ ];
43
+ if (this.isHtml()) {
44
+ groups.push({
45
+ items: [
46
+ {
47
+ type: 'button',
48
+ icon: this.htmlPreview() ? Code : Eye,
49
+ tooltip: this.htmlPreview() ? this.t('toolbar.source') : this.t('toolbar.preview'),
50
+ action: () => this.htmlPreview.update((v) => !v),
51
+ active: this.htmlPreview(),
52
+ },
53
+ ],
54
+ });
55
+ }
56
+ return groups;
57
+ };
58
+ this.onToolbarChange = (listener) => this.emitter.subscribe(listener);
59
+ effect(() => {
60
+ this.url();
61
+ void this.loadText();
62
+ });
63
+ effect(() => {
64
+ this.content();
65
+ this.language();
66
+ void this.shiki.highlight();
67
+ });
68
+ effect(() => {
69
+ this.wordWrap();
70
+ this.htmlPreview();
71
+ this.loading();
72
+ this.isHtml();
73
+ this.emitter.notify();
74
+ });
75
+ }
76
+ trust(html) {
77
+ return this.sanitizer.bypassSecurityTrustHtml(html);
78
+ }
79
+ async loadText() {
80
+ this.loading.set(true);
81
+ this.error.set(null);
82
+ try {
83
+ const fetcher = this.request?.fetcher() ?? ((u, init) => fetch(u, init));
84
+ const text = await e0(this.url(), { fetcher });
85
+ this.content.set(text);
86
+ }
87
+ catch (err) {
88
+ console.error(err);
89
+ this.error.set(this.t('text.load_failed'));
90
+ }
91
+ finally {
92
+ this.loading.set(false);
93
+ }
94
+ }
95
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: TextRenderer, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
96
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: TextRenderer, isStandalone: true, selector: "afp-text-renderer", inputs: { url: { classPropertyName: "url", publicName: "url", isSignal: true, isRequired: true, transformFunction: null }, fileName: { classPropertyName: "fileName", publicName: "fileName", isSignal: true, isRequired: true, transformFunction: null } }, host: { classAttribute: "afp-block afp-w-full afp-h-full" }, ngImport: i0, template: `
97
+ @if (loading()) {
98
+ <div class="afp-flex afp-items-center afp-justify-center afp-w-full afp-h-full">
99
+ <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>
100
+ </div>
101
+ } @else if (error()) {
102
+ <afp-renderer-error [message]="error()!" />
103
+ } @else if (htmlPreview() && language() === 'html') {
104
+ <div class="afp-w-full afp-h-full afp-bg-surface-toolbar">
105
+ <iframe
106
+ [srcdoc]="content()"
107
+ sandbox="allow-same-origin"
108
+ class="afp-w-full afp-h-full afp-border-0"
109
+ [title]="fileName()"
110
+ ></iframe>
111
+ </div>
112
+ } @else if (language() === 'text' || lineHtmls().length === 0) {
113
+ <div class="afp-w-full afp-h-full afp-overflow-auto" style="background: var(--fp-code-bg);">
114
+ <pre
115
+ class="afp-py-6 afp-px-4 afp-text-fg-primary afp-font-mono afp-text-sm"
116
+ [class.afp-whitespace-pre-wrap]="wordWrap()"
117
+ [class.afp-break-words]="wordWrap()"
118
+ [class.afp-whitespace-pre]="!wordWrap()"
119
+ >{{ content() }}</pre>
120
+ </div>
121
+ } @else {
122
+ <div class="afp-w-full afp-h-full afp-overflow-auto" style="background: var(--fp-code-bg);">
123
+ <div
124
+ class="afp-code-block with-line-numbers afp-w-full"
125
+ [class.no-wrap]="!wordWrap()"
126
+ [style.gridTemplateRows]="'repeat(' + lines().length + ', auto) minmax(1.5rem, 1fr)'"
127
+ >
128
+ @for (line of lines(); track $index) {
129
+ <span class="afp-code-gutter">{{ $index + 1 }}</span>
130
+ <span class="afp-code-line" [innerHTML]="trust(lineHtmls()[$index] ?? '')"></span>
131
+ }
132
+ <span class="afp-code-gutter-filler"></span>
133
+ <span class="afp-code-line-filler"></span>
134
+ </div>
135
+ </div>
136
+ }
137
+ `, isInline: true, dependencies: [{ kind: "component", type: RendererError, selector: "afp-renderer-error", inputs: ["message", "detail", "showIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
138
+ }
139
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: TextRenderer, decorators: [{
140
+ type: Component,
141
+ args: [{
142
+ selector: 'afp-text-renderer',
143
+ standalone: true,
144
+ imports: [RendererError],
145
+ changeDetection: ChangeDetectionStrategy.OnPush,
146
+ host: { class: 'afp-block afp-w-full afp-h-full' },
147
+ template: `
148
+ @if (loading()) {
149
+ <div class="afp-flex afp-items-center afp-justify-center afp-w-full afp-h-full">
150
+ <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>
151
+ </div>
152
+ } @else if (error()) {
153
+ <afp-renderer-error [message]="error()!" />
154
+ } @else if (htmlPreview() && language() === 'html') {
155
+ <div class="afp-w-full afp-h-full afp-bg-surface-toolbar">
156
+ <iframe
157
+ [srcdoc]="content()"
158
+ sandbox="allow-same-origin"
159
+ class="afp-w-full afp-h-full afp-border-0"
160
+ [title]="fileName()"
161
+ ></iframe>
162
+ </div>
163
+ } @else if (language() === 'text' || lineHtmls().length === 0) {
164
+ <div class="afp-w-full afp-h-full afp-overflow-auto" style="background: var(--fp-code-bg);">
165
+ <pre
166
+ class="afp-py-6 afp-px-4 afp-text-fg-primary afp-font-mono afp-text-sm"
167
+ [class.afp-whitespace-pre-wrap]="wordWrap()"
168
+ [class.afp-break-words]="wordWrap()"
169
+ [class.afp-whitespace-pre]="!wordWrap()"
170
+ >{{ content() }}</pre>
171
+ </div>
172
+ } @else {
173
+ <div class="afp-w-full afp-h-full afp-overflow-auto" style="background: var(--fp-code-bg);">
174
+ <div
175
+ class="afp-code-block with-line-numbers afp-w-full"
176
+ [class.no-wrap]="!wordWrap()"
177
+ [style.gridTemplateRows]="'repeat(' + lines().length + ', auto) minmax(1.5rem, 1fr)'"
178
+ >
179
+ @for (line of lines(); track $index) {
180
+ <span class="afp-code-gutter">{{ $index + 1 }}</span>
181
+ <span class="afp-code-line" [innerHTML]="trust(lineHtmls()[$index] ?? '')"></span>
182
+ }
183
+ <span class="afp-code-gutter-filler"></span>
184
+ <span class="afp-code-line-filler"></span>
185
+ </div>
186
+ </div>
187
+ }
188
+ `,
189
+ }]
190
+ }], ctorParameters: () => [] });
191
+
192
+ export { TextRenderer };
193
+ //# sourceMappingURL=eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-DufW2Fuc-CTosCut6.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-DufW2Fuc-CTosCut6.mjs","sources":["../fesm2022/eternalheart-angular-file-preview-index-DufW2Fuc.mjs"],"sourcesContent":["import * as i0 from '@angular/core';\nimport { input, inject, signal, computed, effect, ChangeDetectionStrategy, Component } from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { WrapText, Code, Eye } from 'lucide-angular';\nimport { L as LocaleService, R as RequestService, 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 { c as createShikiHighlight } from './eternalheart-angular-file-preview-shiki-highlight-CL9cG481.mjs';\nimport { getLanguageFromFileName, fetchTextUtf8 } from '@eternalheart/file-preview-core';\n\nclass TextRenderer {\n constructor() {\n this.url = input.required();\n this.fileName = input.required();\n this.emitter = new ToolbarEventEmitter();\n this.locale = inject(LocaleService, { optional: true });\n this.request = inject(RequestService, { optional: true });\n this.sanitizer = inject(DomSanitizer);\n this.t = this.locale?.t() ?? getFallbackTranslator();\n this.wordWrap = signal(true);\n this.htmlPreview = signal(false);\n this.content = signal('');\n this.loading = signal(true);\n this.error = signal(null);\n this.language = computed(() => getLanguageFromFileName(this.fileName()));\n this.isHtml = computed(() => this.language() === 'html');\n this.lines = computed(() => this.content().split('\\n'));\n this.shiki = createShikiHighlight(() => (this.language() !== 'text' ? this.content() : ''), () => this.language());\n this.lineHtmls = this.shiki.lineHtmls;\n this.getToolbarGroups = () => {\n const groups = [\n {\n items: [\n {\n type: 'button',\n icon: WrapText,\n tooltip: this.wordWrap() ? this.t('toolbar.wrap_off') : this.t('toolbar.wrap_on'),\n action: () => this.wordWrap.update((v) => !v),\n active: this.wordWrap(),\n },\n ],\n },\n ];\n if (this.isHtml()) {\n groups.push({\n items: [\n {\n type: 'button',\n icon: this.htmlPreview() ? Code : Eye,\n tooltip: this.htmlPreview() ? this.t('toolbar.source') : this.t('toolbar.preview'),\n action: () => this.htmlPreview.update((v) => !v),\n active: this.htmlPreview(),\n },\n ],\n });\n }\n return groups;\n };\n this.onToolbarChange = (listener) => this.emitter.subscribe(listener);\n effect(() => {\n this.url();\n void this.loadText();\n });\n effect(() => {\n this.content();\n this.language();\n void this.shiki.highlight();\n });\n effect(() => {\n this.wordWrap();\n this.htmlPreview();\n this.loading();\n this.isHtml();\n this.emitter.notify();\n });\n }\n trust(html) {\n return this.sanitizer.bypassSecurityTrustHtml(html);\n }\n async loadText() {\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 }\n catch (err) {\n console.error(err);\n this.error.set(this.t('text.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: TextRenderer, deps: [], target: i0.ɵɵFactoryTarget.Component }); }\n static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.0.0\", version: \"19.2.25\", type: TextRenderer, isStandalone: true, selector: \"afp-text-renderer\", inputs: { url: { classPropertyName: \"url\", publicName: \"url\", isSignal: true, isRequired: true, transformFunction: null }, fileName: { classPropertyName: \"fileName\", publicName: \"fileName\", isSignal: true, isRequired: true, transformFunction: null } }, host: { classAttribute: \"afp-block afp-w-full afp-h-full\" }, 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()) {\n <afp-renderer-error [message]=\"error()!\" />\n } @else if (htmlPreview() && language() === 'html') {\n <div class=\"afp-w-full afp-h-full afp-bg-surface-toolbar\">\n <iframe\n [srcdoc]=\"content()\"\n sandbox=\"allow-same-origin\"\n class=\"afp-w-full afp-h-full afp-border-0\"\n [title]=\"fileName()\"\n ></iframe>\n </div>\n } @else if (language() === 'text' || lineHtmls().length === 0) {\n <div class=\"afp-w-full afp-h-full afp-overflow-auto\" style=\"background: var(--fp-code-bg);\">\n <pre\n class=\"afp-py-6 afp-px-4 afp-text-fg-primary afp-font-mono afp-text-sm\"\n [class.afp-whitespace-pre-wrap]=\"wordWrap()\"\n [class.afp-break-words]=\"wordWrap()\"\n [class.afp-whitespace-pre]=\"!wordWrap()\"\n >{{ content() }}</pre>\n </div>\n } @else {\n <div class=\"afp-w-full afp-h-full afp-overflow-auto\" style=\"background: var(--fp-code-bg);\">\n <div\n class=\"afp-code-block with-line-numbers afp-w-full\"\n [class.no-wrap]=\"!wordWrap()\"\n [style.gridTemplateRows]=\"'repeat(' + lines().length + ', auto) minmax(1.5rem, 1fr)'\"\n >\n @for (line of lines(); track $index) {\n <span class=\"afp-code-gutter\">{{ $index + 1 }}</span>\n <span class=\"afp-code-line\" [innerHTML]=\"trust(lineHtmls()[$index] ?? '')\"></span>\n }\n <span class=\"afp-code-gutter-filler\"></span>\n <span class=\"afp-code-line-filler\"></span>\n </div>\n </div>\n }\n `, isInline: true, 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: TextRenderer, decorators: [{\n type: Component,\n args: [{\n selector: 'afp-text-renderer',\n standalone: true,\n imports: [RendererError],\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()) {\n <afp-renderer-error [message]=\"error()!\" />\n } @else if (htmlPreview() && language() === 'html') {\n <div class=\"afp-w-full afp-h-full afp-bg-surface-toolbar\">\n <iframe\n [srcdoc]=\"content()\"\n sandbox=\"allow-same-origin\"\n class=\"afp-w-full afp-h-full afp-border-0\"\n [title]=\"fileName()\"\n ></iframe>\n </div>\n } @else if (language() === 'text' || lineHtmls().length === 0) {\n <div class=\"afp-w-full afp-h-full afp-overflow-auto\" style=\"background: var(--fp-code-bg);\">\n <pre\n class=\"afp-py-6 afp-px-4 afp-text-fg-primary afp-font-mono afp-text-sm\"\n [class.afp-whitespace-pre-wrap]=\"wordWrap()\"\n [class.afp-break-words]=\"wordWrap()\"\n [class.afp-whitespace-pre]=\"!wordWrap()\"\n >{{ content() }}</pre>\n </div>\n } @else {\n <div class=\"afp-w-full afp-h-full afp-overflow-auto\" style=\"background: var(--fp-code-bg);\">\n <div\n class=\"afp-code-block with-line-numbers afp-w-full\"\n [class.no-wrap]=\"!wordWrap()\"\n [style.gridTemplateRows]=\"'repeat(' + lines().length + ', auto) minmax(1.5rem, 1fr)'\"\n >\n @for (line of lines(); track $index) {\n <span class=\"afp-code-gutter\">{{ $index + 1 }}</span>\n <span class=\"afp-code-line\" [innerHTML]=\"trust(lineHtmls()[$index] ?? '')\"></span>\n }\n <span class=\"afp-code-gutter-filler\"></span>\n <span class=\"afp-code-line-filler\"></span>\n </div>\n </div>\n }\n `,\n }]\n }], ctorParameters: () => [] });\n\nexport { TextRenderer };\n//# sourceMappingURL=eternalheart-angular-file-preview-index-DufW2Fuc.mjs.map\n"],"names":["getLanguageFromFileName","fetchTextUtf8"],"mappings":"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"}
@@ -0,0 +1,184 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, inject, signal, viewChild, computed, effect, untracked, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { DomSanitizer } from '@angular/platform-browser';
4
+ import mammoth from 'mammoth';
5
+ import { L as LocaleService, R as RequestService, g as getFallbackTranslator, j as jg, B as Bg, X as Xg } from './eternalheart-angular-file-preview-eternalheart-angular-file-preview-UobTf36G.mjs';
6
+ import { R as RendererError } from './eternalheart-angular-file-preview-eternalheart-angular-file-preview-RendererError-DtNihCIX-DtNihCIX.mjs';
7
+
8
+ const PAGE_HEIGHT = 1123;
9
+ const PAGE_PADDING_Y = 60;
10
+ const PAGE_PADDING_X = 50;
11
+ const PAGE_CONTENT_HEIGHT = PAGE_HEIGHT - PAGE_PADDING_Y * 2;
12
+ const PAGE_GAP = 24;
13
+ function themeToContentStyle(theme) {
14
+ return Xg(theme);
15
+ }
16
+ class DocxRenderer {
17
+ constructor() {
18
+ this.url = input.required();
19
+ this.locale = inject(LocaleService, { optional: true });
20
+ this.request = inject(RequestService, { optional: true });
21
+ this.sanitizer = inject(DomSanitizer);
22
+ this.t = this.locale?.t() ?? getFallbackTranslator();
23
+ this.html = signal('');
24
+ this.loading = signal(true);
25
+ this.error = signal(null);
26
+ this.pages = signal([]);
27
+ this.theme = signal({});
28
+ this.measureRef = viewChild('measureRef');
29
+ this.pageGap = PAGE_GAP;
30
+ this.contentStyle = computed(() => themeToContentStyle(this.theme()));
31
+ this.measureStyle = computed(() => ({
32
+ ...themeToContentStyle(this.theme()),
33
+ position: 'absolute',
34
+ visibility: 'hidden',
35
+ width: `${794 - PAGE_PADDING_X * 2}px`,
36
+ pointerEvents: 'none',
37
+ }));
38
+ this.pageBoxStyle = {
39
+ width: '100%',
40
+ maxWidth: '794px',
41
+ minHeight: `${PAGE_HEIGHT}px`,
42
+ background: 'white',
43
+ boxShadow: '0 4px 6px rgba(0, 0, 0, 0.07), 0 10px 20px rgba(0, 0, 0, 0.10)',
44
+ flexShrink: 0,
45
+ padding: `${PAGE_PADDING_Y}px ${PAGE_PADDING_X}px`,
46
+ };
47
+ this.getToolbarGroups = () => [];
48
+ this.displayPages = computed(() => {
49
+ const pages = this.pages();
50
+ return pages.length > 0 ? pages : [''];
51
+ });
52
+ effect(() => {
53
+ const newUrl = this.url();
54
+ if (newUrl) {
55
+ untracked(() => {
56
+ void this.loadDocx();
57
+ });
58
+ }
59
+ });
60
+ effect(() => {
61
+ const content = this.html();
62
+ const el = this.measureRef();
63
+ if (!content || !el)
64
+ return;
65
+ untracked(() => {
66
+ requestAnimationFrame(() => this.paginate());
67
+ });
68
+ });
69
+ }
70
+ trust(html) {
71
+ return this.sanitizer.bypassSecurityTrustHtml(html);
72
+ }
73
+ async loadDocx() {
74
+ this.loading.set(true);
75
+ this.error.set(null);
76
+ this.html.set('');
77
+ this.pages.set([]);
78
+ this.theme.set({});
79
+ try {
80
+ const fetcher = this.request?.fetcher() ?? ((u, init) => fetch(u, init));
81
+ const response = await fetcher(this.url());
82
+ if (!response.ok)
83
+ throw new Error('文件加载失败');
84
+ const arrayBuffer = await response.arrayBuffer();
85
+ const [converted, theme] = await Promise.all([
86
+ mammoth.convertToHtml({ arrayBuffer }, { styleMap: jg }),
87
+ Bg(arrayBuffer).catch(() => ({})),
88
+ ]);
89
+ this.theme.set(theme);
90
+ this.html.set(converted.value);
91
+ }
92
+ catch (err) {
93
+ console.error('Docx 解析错误:', err);
94
+ this.error.set(this.t('docx.parse_failed'));
95
+ }
96
+ finally {
97
+ this.loading.set(false);
98
+ }
99
+ }
100
+ paginate() {
101
+ const container = this.measureRef()?.nativeElement;
102
+ if (!container || !this.html())
103
+ return;
104
+ const children = Array.from(container.children);
105
+ if (children.length === 0) {
106
+ this.pages.set([this.html()]);
107
+ return;
108
+ }
109
+ const result = [[]];
110
+ let currentPageUsed = 0;
111
+ for (const child of children) {
112
+ const h = child.offsetHeight;
113
+ if (currentPageUsed > 0 && currentPageUsed + h > PAGE_CONTENT_HEIGHT) {
114
+ result.push([]);
115
+ currentPageUsed = 0;
116
+ }
117
+ result[result.length - 1].push(child.outerHTML);
118
+ currentPageUsed += h;
119
+ }
120
+ if (result.length === 0)
121
+ result.push([]);
122
+ this.pages.set(result.map((blocks) => blocks.join('')));
123
+ }
124
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: DocxRenderer, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
125
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: DocxRenderer, isStandalone: true, selector: "afp-docx-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: "measureRef", first: true, predicate: ["measureRef"], descendants: true, isSignal: true }], ngImport: i0, template: `
126
+ @if (loading()) {
127
+ <div class="afp-flex afp-items-center afp-justify-center afp-w-full afp-h-full">
128
+ <div
129
+ 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"
130
+ ></div>
131
+ </div>
132
+ } @else if (error()) {
133
+ <afp-renderer-error [message]="error()!" />
134
+ } @else {
135
+ <div class="afp-docx-container afp-w-full afp-h-full afp-overflow-auto" style="background: rgba(0, 0, 0, 0.15)">
136
+ <div #measureRef [style]="measureStyle()" [innerHTML]="trust(html())"></div>
137
+
138
+ <div class="afp-flex afp-flex-col afp-items-center" [style.gap.px]="pageGap">
139
+ @for (pageHtml of displayPages(); track $index) {
140
+ <div [style]="pageBoxStyle">
141
+ <div [style]="contentStyle()" [innerHTML]="trust(pageHtml)"></div>
142
+ </div>
143
+ }
144
+ </div>
145
+ </div>
146
+ }
147
+ `, isInline: true, dependencies: [{ kind: "component", type: RendererError, selector: "afp-renderer-error", inputs: ["message", "detail", "showIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
148
+ }
149
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: DocxRenderer, decorators: [{
150
+ type: Component,
151
+ args: [{
152
+ selector: 'afp-docx-renderer',
153
+ standalone: true,
154
+ imports: [RendererError],
155
+ changeDetection: ChangeDetectionStrategy.OnPush,
156
+ host: { class: 'afp-block afp-w-full afp-h-full' },
157
+ template: `
158
+ @if (loading()) {
159
+ <div class="afp-flex afp-items-center afp-justify-center afp-w-full afp-h-full">
160
+ <div
161
+ 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"
162
+ ></div>
163
+ </div>
164
+ } @else if (error()) {
165
+ <afp-renderer-error [message]="error()!" />
166
+ } @else {
167
+ <div class="afp-docx-container afp-w-full afp-h-full afp-overflow-auto" style="background: rgba(0, 0, 0, 0.15)">
168
+ <div #measureRef [style]="measureStyle()" [innerHTML]="trust(html())"></div>
169
+
170
+ <div class="afp-flex afp-flex-col afp-items-center" [style.gap.px]="pageGap">
171
+ @for (pageHtml of displayPages(); track $index) {
172
+ <div [style]="pageBoxStyle">
173
+ <div [style]="contentStyle()" [innerHTML]="trust(pageHtml)"></div>
174
+ </div>
175
+ }
176
+ </div>
177
+ </div>
178
+ }
179
+ `,
180
+ }]
181
+ }], ctorParameters: () => [] });
182
+
183
+ export { DocxRenderer };
184
+ //# sourceMappingURL=eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-TSTa_Q7E-DBhkL6pV.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-TSTa_Q7E-DBhkL6pV.mjs","sources":["../fesm2022/eternalheart-angular-file-preview-index-TSTa_Q7E.mjs"],"sourcesContent":["import * as i0 from '@angular/core';\nimport { input, inject, signal, viewChild, computed, effect, untracked, ChangeDetectionStrategy, Component } from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport mammoth from 'mammoth';\nimport { L as LocaleService, R as RequestService, 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 { docxThemeToCssVars, DOCX_MAMMOTH_STYLE_MAP, readDocxTheme } from '@eternalheart/file-preview-core';\n\nconst PAGE_HEIGHT = 1123;\nconst PAGE_PADDING_Y = 60;\nconst PAGE_PADDING_X = 50;\nconst PAGE_CONTENT_HEIGHT = PAGE_HEIGHT - PAGE_PADDING_Y * 2;\nconst PAGE_GAP = 24;\nfunction themeToContentStyle(theme) {\n return docxThemeToCssVars(theme);\n}\nclass DocxRenderer {\n constructor() {\n this.url = input.required();\n this.locale = inject(LocaleService, { optional: true });\n this.request = inject(RequestService, { optional: true });\n this.sanitizer = inject(DomSanitizer);\n this.t = this.locale?.t() ?? getFallbackTranslator();\n this.html = signal('');\n this.loading = signal(true);\n this.error = signal(null);\n this.pages = signal([]);\n this.theme = signal({});\n this.measureRef = viewChild('measureRef');\n this.pageGap = PAGE_GAP;\n this.contentStyle = computed(() => themeToContentStyle(this.theme()));\n this.measureStyle = computed(() => ({\n ...themeToContentStyle(this.theme()),\n position: 'absolute',\n visibility: 'hidden',\n width: `${794 - PAGE_PADDING_X * 2}px`,\n pointerEvents: 'none',\n }));\n this.pageBoxStyle = {\n width: '100%',\n maxWidth: '794px',\n minHeight: `${PAGE_HEIGHT}px`,\n background: 'white',\n boxShadow: '0 4px 6px rgba(0, 0, 0, 0.07), 0 10px 20px rgba(0, 0, 0, 0.10)',\n flexShrink: 0,\n padding: `${PAGE_PADDING_Y}px ${PAGE_PADDING_X}px`,\n };\n this.getToolbarGroups = () => [];\n this.displayPages = computed(() => {\n const pages = this.pages();\n return pages.length > 0 ? pages : [''];\n });\n effect(() => {\n const newUrl = this.url();\n if (newUrl) {\n untracked(() => {\n void this.loadDocx();\n });\n }\n });\n effect(() => {\n const content = this.html();\n const el = this.measureRef();\n if (!content || !el)\n return;\n untracked(() => {\n requestAnimationFrame(() => this.paginate());\n });\n });\n }\n trust(html) {\n return this.sanitizer.bypassSecurityTrustHtml(html);\n }\n async loadDocx() {\n this.loading.set(true);\n this.error.set(null);\n this.html.set('');\n this.pages.set([]);\n this.theme.set({});\n try {\n const fetcher = this.request?.fetcher() ?? ((u, init) => fetch(u, init));\n const response = await fetcher(this.url());\n if (!response.ok)\n throw new Error('文件加载失败');\n const arrayBuffer = await response.arrayBuffer();\n const [converted, theme] = await Promise.all([\n mammoth.convertToHtml({ arrayBuffer }, { styleMap: DOCX_MAMMOTH_STYLE_MAP }),\n readDocxTheme(arrayBuffer).catch(() => ({})),\n ]);\n this.theme.set(theme);\n this.html.set(converted.value);\n }\n catch (err) {\n console.error('Docx 解析错误:', err);\n this.error.set(this.t('docx.parse_failed'));\n }\n finally {\n this.loading.set(false);\n }\n }\n paginate() {\n const container = this.measureRef()?.nativeElement;\n if (!container || !this.html())\n return;\n const children = Array.from(container.children);\n if (children.length === 0) {\n this.pages.set([this.html()]);\n return;\n }\n const result = [[]];\n let currentPageUsed = 0;\n for (const child of children) {\n const h = child.offsetHeight;\n if (currentPageUsed > 0 && currentPageUsed + h > PAGE_CONTENT_HEIGHT) {\n result.push([]);\n currentPageUsed = 0;\n }\n result[result.length - 1].push(child.outerHTML);\n currentPageUsed += h;\n }\n if (result.length === 0)\n result.push([]);\n this.pages.set(result.map((blocks) => blocks.join('')));\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"19.2.25\", ngImport: i0, type: DocxRenderer, deps: [], target: i0.ɵɵFactoryTarget.Component }); }\n static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.0.0\", version: \"19.2.25\", type: DocxRenderer, isStandalone: true, selector: \"afp-docx-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: \"measureRef\", first: true, predicate: [\"measureRef\"], 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 {\n <div class=\"afp-docx-container afp-w-full afp-h-full afp-overflow-auto\" style=\"background: rgba(0, 0, 0, 0.15)\">\n <div #measureRef [style]=\"measureStyle()\" [innerHTML]=\"trust(html())\"></div>\n\n <div class=\"afp-flex afp-flex-col afp-items-center\" [style.gap.px]=\"pageGap\">\n @for (pageHtml of displayPages(); track $index) {\n <div [style]=\"pageBoxStyle\">\n <div [style]=\"contentStyle()\" [innerHTML]=\"trust(pageHtml)\"></div>\n </div>\n }\n </div>\n </div>\n }\n `, isInline: true, 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: DocxRenderer, decorators: [{\n type: Component,\n args: [{\n selector: 'afp-docx-renderer',\n standalone: true,\n imports: [RendererError],\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\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 {\n <div class=\"afp-docx-container afp-w-full afp-h-full afp-overflow-auto\" style=\"background: rgba(0, 0, 0, 0.15)\">\n <div #measureRef [style]=\"measureStyle()\" [innerHTML]=\"trust(html())\"></div>\n\n <div class=\"afp-flex afp-flex-col afp-items-center\" [style.gap.px]=\"pageGap\">\n @for (pageHtml of displayPages(); track $index) {\n <div [style]=\"pageBoxStyle\">\n <div [style]=\"contentStyle()\" [innerHTML]=\"trust(pageHtml)\"></div>\n </div>\n }\n </div>\n </div>\n }\n `,\n }]\n }], ctorParameters: () => [] });\n\nexport { DocxRenderer };\n//# sourceMappingURL=eternalheart-angular-file-preview-index-TSTa_Q7E.mjs.map\n"],"names":["docxThemeToCssVars","DOCX_MAMMOTH_STYLE_MAP","readDocxTheme"],"mappings":"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"}