@file-viewer/core 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/LICENSE +160 -0
  2. package/README.en.md +78 -0
  3. package/README.md +83 -0
  4. package/dist/assets.d.ts +62 -0
  5. package/dist/assets.js +260 -0
  6. package/dist/browser.d.ts +1 -0
  7. package/dist/browser.js +1 -0
  8. package/dist/capabilities.d.ts +24 -0
  9. package/dist/capabilities.js +95 -0
  10. package/dist/document.d.ts +9 -0
  11. package/dist/document.js +86 -0
  12. package/dist/documentDom/anchors.d.ts +7 -0
  13. package/dist/documentDom/anchors.js +196 -0
  14. package/dist/documentDom/index.d.ts +5 -0
  15. package/dist/documentDom/index.js +3 -0
  16. package/dist/documentDom/providers.d.ts +13 -0
  17. package/dist/documentDom/providers.js +52 -0
  18. package/dist/documentDom/scroll.d.ts +12 -0
  19. package/dist/documentDom/scroll.js +42 -0
  20. package/dist/documentDom.d.ts +5 -0
  21. package/dist/documentDom.js +3 -0
  22. package/dist/documentEvents.d.ts +73 -0
  23. package/dist/documentEvents.js +150 -0
  24. package/dist/documentSearch.d.ts +50 -0
  25. package/dist/documentSearch.js +459 -0
  26. package/dist/documentZoom.d.ts +47 -0
  27. package/dist/documentZoom.js +184 -0
  28. package/dist/export.d.ts +26 -0
  29. package/dist/export.js +466 -0
  30. package/dist/formats.d.ts +305 -0
  31. package/dist/formats.js +207 -0
  32. package/dist/headless.d.ts +25 -0
  33. package/dist/headless.js +14 -0
  34. package/dist/index.d.ts +78 -0
  35. package/dist/index.js +118 -0
  36. package/dist/lifecycleFacade.d.ts +46 -0
  37. package/dist/lifecycleFacade.js +68 -0
  38. package/dist/loading.d.ts +59 -0
  39. package/dist/loading.js +489 -0
  40. package/dist/operations.d.ts +287 -0
  41. package/dist/operations.js +485 -0
  42. package/dist/options.d.ts +16 -0
  43. package/dist/options.js +92 -0
  44. package/dist/presentation.d.ts +14 -0
  45. package/dist/presentation.js +16 -0
  46. package/dist/printLayout.d.ts +19 -0
  47. package/dist/printLayout.js +83 -0
  48. package/dist/registry.d.ts +2 -0
  49. package/dist/registry.js +63 -0
  50. package/dist/rendererDispatcher.d.ts +21 -0
  51. package/dist/rendererDispatcher.js +42 -0
  52. package/dist/rendererHandler.d.ts +165 -0
  53. package/dist/rendererHandler.js +354 -0
  54. package/dist/renderers/archive.d.ts +2 -0
  55. package/dist/renderers/archive.js +547 -0
  56. package/dist/renderers/archiveCache.d.ts +10 -0
  57. package/dist/renderers/archiveCache.js +96 -0
  58. package/dist/renderers/archiveFallback.d.ts +7 -0
  59. package/dist/renderers/archiveFallback.js +166 -0
  60. package/dist/renderers/archiveShared.d.ts +23 -0
  61. package/dist/renderers/archiveShared.js +71 -0
  62. package/dist/renderers/audio.d.ts +8 -0
  63. package/dist/renderers/audio.js +219 -0
  64. package/dist/renderers/cad.d.ts +2 -0
  65. package/dist/renderers/cad.js +445 -0
  66. package/dist/renderers/code.d.ts +11 -0
  67. package/dist/renderers/code.js +233 -0
  68. package/dist/renderers/data.d.ts +7 -0
  69. package/dist/renderers/data.js +370 -0
  70. package/dist/renderers/drawing.d.ts +10 -0
  71. package/dist/renderers/drawing.js +537 -0
  72. package/dist/renderers/eda.d.ts +2 -0
  73. package/dist/renderers/eda.js +434 -0
  74. package/dist/renderers/edaParser.d.ts +77 -0
  75. package/dist/renderers/edaParser.js +569 -0
  76. package/dist/renderers/email.d.ts +2 -0
  77. package/dist/renderers/email.js +463 -0
  78. package/dist/renderers/epub.d.ts +2 -0
  79. package/dist/renderers/epub.js +330 -0
  80. package/dist/renderers/geo.d.ts +2 -0
  81. package/dist/renderers/geo.js +284 -0
  82. package/dist/renderers/image.d.ts +2 -0
  83. package/dist/renderers/image.js +179 -0
  84. package/dist/renderers/index.d.ts +21 -0
  85. package/dist/renderers/index.js +207 -0
  86. package/dist/renderers/markdown.d.ts +2 -0
  87. package/dist/renderers/markdown.js +83 -0
  88. package/dist/renderers/model.d.ts +2 -0
  89. package/dist/renderers/model.js +566 -0
  90. package/dist/renderers/ofd.d.ts +2 -0
  91. package/dist/renderers/ofd.js +255 -0
  92. package/dist/renderers/openDocument.d.ts +2 -0
  93. package/dist/renderers/openDocument.js +122 -0
  94. package/dist/renderers/pdf.d.ts +3 -0
  95. package/dist/renderers/pdf.js +846 -0
  96. package/dist/renderers/pdfStyles.d.ts +1 -0
  97. package/dist/renderers/pdfStyles.js +1 -0
  98. package/dist/renderers/pptx.d.ts +2 -0
  99. package/dist/renderers/pptx.js +202 -0
  100. package/dist/renderers/spreadsheet/state.d.ts +80 -0
  101. package/dist/renderers/spreadsheet/state.js +96 -0
  102. package/dist/renderers/spreadsheet/view.d.ts +25 -0
  103. package/dist/renderers/spreadsheet/view.js +833 -0
  104. package/dist/renderers/spreadsheet/worker/index.d.ts +2 -0
  105. package/dist/renderers/spreadsheet/worker/index.js +1 -0
  106. package/dist/renderers/spreadsheet/worker/sheetjs/SheetJsModel.d.ts +73 -0
  107. package/dist/renderers/spreadsheet/worker/sheetjs/SheetJsModel.js +623 -0
  108. package/dist/renderers/spreadsheet/worker/sheetjs/color.d.ts +2 -0
  109. package/dist/renderers/spreadsheet/worker/sheetjs/color.js +73 -0
  110. package/dist/renderers/spreadsheet/worker/sheetjs/index.d.ts +1 -0
  111. package/dist/renderers/spreadsheet/worker/sheetjs/index.js +1 -0
  112. package/dist/renderers/spreadsheet/worker/sheetjs/parser.d.ts +18 -0
  113. package/dist/renderers/spreadsheet/worker/sheetjs/parser.js +106 -0
  114. package/dist/renderers/spreadsheet/worker/sheetjs/sheet.worker.d.ts +1 -0
  115. package/dist/renderers/spreadsheet/worker/sheetjs/sheet.worker.js +11 -0
  116. package/dist/renderers/spreadsheet/worker/type.d.ts +57 -0
  117. package/dist/renderers/spreadsheet/worker/type.js +1 -0
  118. package/dist/renderers/spreadsheet.d.ts +3 -0
  119. package/dist/renderers/spreadsheet.js +929 -0
  120. package/dist/renderers/typst.d.ts +8 -0
  121. package/dist/renderers/typst.js +415 -0
  122. package/dist/renderers/umd/parser.d.ts +30 -0
  123. package/dist/renderers/umd/parser.js +408 -0
  124. package/dist/renderers/umd.d.ts +2 -0
  125. package/dist/renderers/umd.js +297 -0
  126. package/dist/renderers/video.d.ts +8 -0
  127. package/dist/renderers/video.js +108 -0
  128. package/dist/renderers/wordDoc.d.ts +5 -0
  129. package/dist/renderers/wordDoc.js +284 -0
  130. package/dist/renderers/wordDocx.d.ts +5 -0
  131. package/dist/renderers/wordDocx.js +501 -0
  132. package/dist/renderers/wordDocx.worker.d.ts +1 -0
  133. package/dist/renderers/wordDocx.worker.js +96 -0
  134. package/dist/source.d.ts +18 -0
  135. package/dist/source.js +152 -0
  136. package/dist/sourceLoading.d.ts +566 -0
  137. package/dist/sourceLoading.js +918 -0
  138. package/dist/state.d.ts +16 -0
  139. package/dist/state.js +81 -0
  140. package/dist/types.d.ts +446 -0
  141. package/dist/types.js +1 -0
  142. package/dist/viewer.d.ts +8 -0
  143. package/dist/viewer.js +285 -0
  144. package/dist/viewerOperations.d.ts +88 -0
  145. package/dist/viewerOperations.js +242 -0
  146. package/dist/watermark.d.ts +15 -0
  147. package/dist/watermark.js +81 -0
  148. package/dist/worker.d.ts +34 -0
  149. package/dist/worker.js +101 -0
  150. package/package.json +109 -0
  151. package/vendor/ofd/dltech/jbig2/arithmetic_decoder.js +183 -0
  152. package/vendor/ofd/dltech/jbig2/ccitt.js +1070 -0
  153. package/vendor/ofd/dltech/jbig2/compatibility.js +12 -0
  154. package/vendor/ofd/dltech/jbig2/core_utils.js +180 -0
  155. package/vendor/ofd/dltech/jbig2/is_node.js +27 -0
  156. package/vendor/ofd/dltech/jbig2/jbig2.js +2589 -0
  157. package/vendor/ofd/dltech/jbig2/jbig2_stream.js +81 -0
  158. package/vendor/ofd/dltech/jbig2/primitives.js +387 -0
  159. package/vendor/ofd/dltech/jbig2/stream.js +1348 -0
  160. package/vendor/ofd/dltech/jbig2/util.js +972 -0
  161. package/vendor/ofd/dltech/ofd/ofd.d.ts +11 -0
  162. package/vendor/ofd/dltech/ofd/ofd.js +100 -0
  163. package/vendor/ofd/dltech/ofd/ofd_parser.js +395 -0
  164. package/vendor/ofd/dltech/ofd/ofd_render.js +473 -0
  165. package/vendor/ofd/dltech/ofd/ofd_util.js +350 -0
  166. package/vendor/ofd/dltech/ofd/pipeline.js +26 -0
@@ -0,0 +1,445 @@
1
+ import { CadViewer, } from '@flyfish-dev/cad-viewer';
2
+ import { resolveFileViewerCadAssetUrls } from '../assets.js';
3
+ import { registerFileViewerZoomProvider, unregisterFileViewerZoomProvider, } from '../documentDom.js';
4
+ import { createFileViewerZoomChangeEmitter } from '../documentZoom.js';
5
+ const CAD_WORKER_TIMEOUT = 120000;
6
+ const cadStyle = `
7
+ .cad-shell{display:flex;height:100%;min-height:100%;flex-direction:column;background:#f5f7fb;color:#142335}
8
+ .cad-shell *{box-sizing:border-box}
9
+ .cad-toolbar{display:flex;min-height:48px;align-items:center;justify-content:space-between;gap:16px;padding:0 14px;border-bottom:1px solid rgba(15,23,42,.08);background:#fff}
10
+ .cad-tools,.cad-meta{display:flex;align-items:center;gap:8px}
11
+ .cad-tools button{min-width:34px;min-height:30px;border:0;border-radius:8px;background:rgba(15,23,42,.06);color:#25344c;cursor:pointer;font-weight:800;letter-spacing:0;transition:background-color .18s ease,color .18s ease}
12
+ .cad-tools button:hover{background:rgba(31,150,110,.14);color:#0f8f62}
13
+ .cad-zoom,.cad-meta span{color:#64748b;font-size:12px;font-weight:800;letter-spacing:0}
14
+ .cad-meta span{border-radius:999px;padding:5px 9px;background:rgba(15,23,42,.06)}
15
+ .cad-body{display:grid;min-height:0;flex:1;grid-template-columns:minmax(168px,220px) minmax(0,1fr) minmax(150px,190px);background:#eef2f7}
16
+ .cad-body.without-layers{grid-template-columns:minmax(0,1fr) minmax(150px,190px)}
17
+ .cad-layers,.cad-inspector{min-height:0;overflow:auto;border-right:1px solid rgba(15,23,42,.08);background:#fff}
18
+ .cad-layers[hidden]{display:none}
19
+ .cad-inspector{border-right:0;border-left:1px solid rgba(15,23,42,.08);padding:14px}
20
+ .cad-layers-head{position:sticky;top:0;display:flex;align-items:center;justify-content:space-between;padding:12px 12px 8px;background:#fff;color:#1f2a3d;font-size:13px;z-index:1}
21
+ .cad-layers-head span{color:#7b8ca5;font-size:12px;font-weight:700}
22
+ .cad-layers-list{display:flex;flex-direction:column;padding:0 0 8px}
23
+ .cad-layers button{display:flex;width:calc(100% - 16px);min-height:34px;align-items:center;gap:8px;margin:0 8px 6px;border:1px solid rgba(148,163,184,.22);border-radius:8px;background:#f8fafc;color:#25344c;cursor:pointer;font-size:12px;font-weight:700;text-align:left}
24
+ .cad-layers button.muted{opacity:.48}
25
+ .cad-layer-color{width:10px;height:10px;flex:0 0 auto;border-radius:50%;background:#1f966e;box-shadow:inset 0 0 0 1px rgba(15,23,42,.14)}
26
+ .cad-canvas-wrap{position:relative;min-width:0;min-height:0;overflow:hidden;background:linear-gradient(90deg,rgba(15,23,42,.04) 1px,transparent 1px),linear-gradient(180deg,rgba(15,23,42,.04) 1px,transparent 1px),#f8fafc;background-size:28px 28px}
27
+ .cad-stage{position:relative;width:100%;height:100%;min-height:420px;overflow:hidden}
28
+ .cad-stage canvas{position:absolute;inset:0;display:block;width:100%!important;height:100%!important}
29
+ .cad-native-stage{position:absolute;inset:0;z-index:2;display:none;overflow:hidden}
30
+ .cad-native-stage:not(:empty),.cad-native-stage.is-active{display:block}
31
+ .cad-native-stage *{box-sizing:border-box}
32
+ .dwfv-root{height:100%;min-height:0;display:grid;grid-template-rows:auto 1fr;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;color:#111827}
33
+ .dwfv-toolbar{display:flex;gap:8px;align-items:center;padding:8px 12px;background:#fff;border-bottom:1px solid #e5e7eb}
34
+ .dwfv-toolbar button,.dwfv-toolbar select{font:inherit}
35
+ .dwfv-workspace{min-height:0;display:grid;grid-template-columns:minmax(220px,300px) 1fr}
36
+ .dwfv-tree{overflow:auto;border-right:1px solid #d6d8dd;background:#fff;font-size:12px;padding:8px}
37
+ .dwfv-tree[style*="display: none"]+.dwfv-stage{grid-column:1/-1}
38
+ .dwfv-tree-header{font-weight:700;margin-bottom:4px}
39
+ .dwfv-tree-stats{color:#6b7280;margin-bottom:8px}
40
+ .dwfv-tree details{margin-left:8px}
41
+ .dwfv-tree summary{cursor:pointer;padding:2px 0}
42
+ .dwfv-tree-meta{color:#6b7280;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:10px;padding-left:14px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
43
+ .dwfv-stage{position:relative;overflow:hidden;background:#e5e7eb}
44
+ .dwfv-canvas{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%}
45
+ .dwfv-webgl-canvas{pointer-events:none}
46
+ .dwfv-overlay-canvas{pointer-events:auto;touch-action:none;cursor:grab}
47
+ .dwfv-overlay-canvas:active{cursor:grabbing}
48
+ .dwfv-status{margin-left:auto;font-size:12px;color:#4b5563}
49
+ .dwfv-warn{color:#92400e}
50
+ .cad-viewer-container{position:relative;overflow:hidden;min-width:0;min-height:0}
51
+ .cad-viewer-canvas{display:block;width:100%;height:100%;cursor:grab;touch-action:none;-webkit-user-select:none;user-select:none}
52
+ .cad-viewer-canvas.is-dragging{cursor:grabbing}
53
+ .cad-viewer-webgl-canvas{position:relative;z-index:0}
54
+ .cad-viewer-text-overlay{display:block;contain:strict;-webkit-user-select:none;user-select:none}
55
+ .cad-viewer-native-host{position:absolute;top:0;right:0;bottom:0;left:0;display:none;z-index:2;min-width:0;min-height:0;background:#05070d}
56
+ .cad-viewer-native-host.is-active{display:block}
57
+ .cad-viewer-native-host .dwfv-root{height:100%;min-height:0;color:#dbeafe;background:#05070d}
58
+ .cad-viewer-native-host .dwfv-toolbar{min-height:34px;padding:5px 8px;gap:6px;border-bottom:1px solid rgba(71,85,105,.65);background:#0f172af5;color:#e5e7eb}
59
+ .cad-viewer-native-host .dwfv-toolbar button,.cad-viewer-native-host .dwfv-toolbar select{height:24px;border:1px solid rgba(100,116,139,.75);border-radius:6px;background:#111827;color:#e5e7eb;font-size:12px}
60
+ .cad-viewer-native-host .dwfv-toolbar button{padding:0 8px;cursor:pointer}
61
+ .cad-viewer-native-host .dwfv-toolbar button:hover,.cad-viewer-native-host .dwfv-toolbar select:hover{border-color:#60a5fa;color:#bfdbfe}
62
+ .cad-viewer-native-host .dwfv-status{color:#93c5fd;font-size:12px}
63
+ .cad-viewer-native-host .dwfv-workspace{min-height:0;background:#05070d}
64
+ .cad-viewer-native-host .dwfv-stage{background:#05070d}
65
+ .cad-viewer-native-host .dwfv-tree{border-right:1px solid rgba(71,85,105,.7);background:#0f172a;color:#dbeafe}
66
+ .cad-viewer-native-host .dwfv-tree-stats,.cad-viewer-native-host .dwfv-tree-meta{color:#94a3b8}
67
+ .cad-viewer-native-host .dwfv-warn{color:#fbbf24}
68
+ .cad-native-stage .dwfv-root,.cad-native-stage .dwfv-workspace,.cad-native-stage .dwfv-stage{width:100%;min-width:0;min-height:0}
69
+ .cad-native-stage .dwfv-root{height:100%}
70
+ .cad-state{position:absolute;inset:50% auto auto 50%;max-width:min(520px,calc(100% - 48px));transform:translate(-50%,-50%);border-radius:12px;padding:14px 18px;background:rgba(255,255,255,.92);box-shadow:0 14px 38px rgba(15,23,42,.12);color:#53637a;font-size:13px;font-weight:800;text-align:center}
71
+ .cad-state.error{color:#b42318}
72
+ .cad-inspector strong{display:block;margin-bottom:12px;color:#1f2a3d;font-size:13px}
73
+ .cad-inspector dl{display:grid;gap:8px;margin:0}
74
+ .cad-inspector dl div{display:flex;align-items:center;justify-content:space-between;gap:12px;border-radius:8px;padding:8px 10px;background:#f8fafc}
75
+ .cad-inspector dt,.cad-inspector dd{margin:0;font-size:12px}
76
+ .cad-inspector dt{color:#7b8ca5;font-weight:700}
77
+ .cad-inspector dd{color:#20304a;font-weight:900}
78
+ .cad-warning{margin:12px 0 0;border-radius:8px;padding:10px;background:rgba(245,158,11,.13);color:#92400e;font-size:12px;line-height:1.55}
79
+ .file-viewer[data-viewer-theme='dark'] .cad-shell{background:#111827;color:#e5edf6}
80
+ .file-viewer[data-viewer-theme='dark'] .cad-toolbar,.file-viewer[data-viewer-theme='dark'] .cad-layers,.file-viewer[data-viewer-theme='dark'] .cad-inspector{background:#fff;color:#142335}
81
+ @media (prefers-color-scheme:dark){.file-viewer[data-viewer-theme='system'] .cad-shell{background:#111827;color:#e5edf6}.file-viewer[data-viewer-theme='system'] .cad-toolbar,.file-viewer[data-viewer-theme='system'] .cad-layers,.file-viewer[data-viewer-theme='system'] .cad-inspector{background:#fff;color:#142335}}
82
+ @media (max-width:860px){.cad-body,.cad-body.without-layers{grid-template-columns:minmax(0,1fr)}.cad-layers,.cad-inspector{display:none}}
83
+ `;
84
+ const createStyle = () => {
85
+ const style = document.createElement('style');
86
+ style.textContent = cadStyle;
87
+ return style;
88
+ };
89
+ const createElement = (tagName, className, text) => {
90
+ const element = document.createElement(tagName);
91
+ if (className) {
92
+ element.className = className;
93
+ }
94
+ if (text !== undefined) {
95
+ element.textContent = text;
96
+ }
97
+ return element;
98
+ };
99
+ const normalizeType = (type) => {
100
+ return (type || 'dxf').toLowerCase();
101
+ };
102
+ const collectLayers = (result) => {
103
+ if (!result) {
104
+ return [];
105
+ }
106
+ return Object.entries(result.document.layers)
107
+ .map(([name, layer]) => ({ ...layer, name }))
108
+ .sort((left, right) => left.name.localeCompare(right.name));
109
+ };
110
+ const formatNumber = (value) => {
111
+ if (!Number.isFinite(value)) {
112
+ return '0';
113
+ }
114
+ return new Intl.NumberFormat('zh-CN').format(Math.round(value || 0));
115
+ };
116
+ const getCadDocumentBaseUrl = (target) => {
117
+ var _a;
118
+ return ((_a = target.ownerDocument) === null || _a === void 0 ? void 0 : _a.baseURI) || 'http://localhost/';
119
+ };
120
+ export default async function renderCad(buffer, target, type = 'dxf', context) {
121
+ var _a;
122
+ const normalizedType = normalizeType(type);
123
+ const options = ((_a = context === null || context === void 0 ? void 0 : context.options) === null || _a === void 0 ? void 0 : _a.cad) || {};
124
+ let status = 'loading';
125
+ let progressMessage = '正在加载 CAD 预览器...';
126
+ let errorMessage = '';
127
+ let loadResult = null;
128
+ let renderStats = null;
129
+ let viewState = null;
130
+ let layers = [];
131
+ let viewer = null;
132
+ let resizeObserver = null;
133
+ let abortController = null;
134
+ let disposed = false;
135
+ const style = createStyle();
136
+ const shell = createElement('div', 'cad-shell');
137
+ shell.dataset.viewerZoomProvider = 'cad';
138
+ const toolbar = createElement('div', 'cad-toolbar');
139
+ const tools = createElement('div', 'cad-tools');
140
+ const fitButton = createElement('button', undefined, '适配');
141
+ const zoomOutButton = createElement('button', undefined, '-');
142
+ const zoomText = createElement('span', 'cad-zoom', '100%');
143
+ const zoomInButton = createElement('button', undefined, '+');
144
+ const meta = createElement('div', 'cad-meta');
145
+ const typeMeta = createElement('span', undefined, normalizedType.toUpperCase());
146
+ const backendMeta = createElement('span', undefined, 'AUTO');
147
+ [fitButton, zoomOutButton, zoomInButton].forEach(button => {
148
+ button.type = 'button';
149
+ });
150
+ zoomOutButton.title = '缩小';
151
+ zoomInButton.title = '放大';
152
+ tools.append(fitButton, zoomOutButton, zoomText, zoomInButton);
153
+ meta.append(typeMeta, backendMeta);
154
+ toolbar.append(tools, meta);
155
+ const body = createElement('div', 'cad-body without-layers');
156
+ const layersPanel = createElement('aside', 'cad-layers');
157
+ layersPanel.hidden = true;
158
+ const layersHead = createElement('div', 'cad-layers-head');
159
+ const layersCount = createElement('span', undefined, '0 项');
160
+ layersHead.append(createElement('strong', undefined, '图层'), layersCount);
161
+ const layersList = createElement('div', 'cad-layers-list');
162
+ layersPanel.append(layersHead, layersList);
163
+ const canvasWrap = createElement('div', 'cad-canvas-wrap');
164
+ const stage = createElement('div', 'cad-stage');
165
+ const nativeHost = createElement('div', 'cad-native-stage');
166
+ stage.append(nativeHost);
167
+ const state = createElement('div', 'cad-state', progressMessage);
168
+ canvasWrap.append(stage, state);
169
+ const inspector = createElement('aside', 'cad-inspector');
170
+ const inspectorTitle = createElement('strong', undefined, '结构');
171
+ const inspectorList = createElement('dl');
172
+ const warningText = createElement('p', 'cad-warning');
173
+ warningText.hidden = true;
174
+ inspector.append(inspectorTitle, inspectorList, warningText);
175
+ body.append(layersPanel, canvasWrap, inspector);
176
+ shell.append(toolbar, body);
177
+ target.replaceChildren(style, shell);
178
+ const buildFileName = () => {
179
+ return (context === null || context === void 0 ? void 0 : context.filename) || `drawing.${normalizedType}`;
180
+ };
181
+ const getWarnings = () => (loadResult === null || loadResult === void 0 ? void 0 : loadResult.warnings) || (loadResult === null || loadResult === void 0 ? void 0 : loadResult.document.warnings) || [];
182
+ const getZoomPercent = () => {
183
+ var _a, _b, _c;
184
+ const zoom = (_c = (_a = viewState === null || viewState === void 0 ? void 0 : viewState.zoomPercent) !== null && _a !== void 0 ? _a : (_b = viewer === null || viewer === void 0 ? void 0 : viewer.getZoomPercent) === null || _b === void 0 ? void 0 : _b.call(viewer)) !== null && _c !== void 0 ? _c : 100;
185
+ return Number.isFinite(zoom) ? Math.round(zoom) : 100;
186
+ };
187
+ const getCadZoomState = () => {
188
+ const ready = status === 'ready' && !!viewer;
189
+ const zoomPercent = getZoomPercent();
190
+ return {
191
+ scale: zoomPercent / 100,
192
+ label: `${zoomPercent}%`,
193
+ canZoomIn: ready,
194
+ canZoomOut: ready,
195
+ canReset: ready,
196
+ minScale: 0.05,
197
+ maxScale: 16,
198
+ };
199
+ };
200
+ const cadZoomEmitter = createFileViewerZoomChangeEmitter();
201
+ const syncInspector = () => {
202
+ const summary = loadResult === null || loadResult === void 0 ? void 0 : loadResult.summary;
203
+ const rows = [
204
+ ['实体', formatNumber(summary === null || summary === void 0 ? void 0 : summary.entityCount)],
205
+ ['块', formatNumber(summary === null || summary === void 0 ? void 0 : summary.blockCount)],
206
+ ['页面', formatNumber(summary === null || summary === void 0 ? void 0 : summary.pageCount)],
207
+ ['绘制', formatNumber(renderStats === null || renderStats === void 0 ? void 0 : renderStats.drawn)],
208
+ ];
209
+ inspectorList.replaceChildren(...rows.map(([label, value]) => {
210
+ const row = createElement('div');
211
+ row.append(createElement('dt', undefined, label), createElement('dd', undefined, value));
212
+ return row;
213
+ }));
214
+ const warning = getWarnings()[0];
215
+ warningText.textContent = warning || '';
216
+ warningText.hidden = !warning;
217
+ };
218
+ const syncLayers = () => {
219
+ layersCount.textContent = `${layers.length} 项`;
220
+ layersPanel.hidden = layers.length === 0;
221
+ body.classList.toggle('without-layers', layers.length === 0);
222
+ layersList.replaceChildren(...layers.map(layer => {
223
+ const button = createElement('button');
224
+ button.type = 'button';
225
+ button.classList.toggle('muted', layer.isVisible === false || !!layer.isFrozen);
226
+ const color = createElement('span', 'cad-layer-color');
227
+ if (typeof layer.color === 'string') {
228
+ color.style.background = layer.color;
229
+ }
230
+ button.append(color, createElement('span', undefined, layer.name));
231
+ button.addEventListener('click', () => {
232
+ const document = viewer === null || viewer === void 0 ? void 0 : viewer.getDocument();
233
+ if (!(document === null || document === void 0 ? void 0 : document.layers[layer.name])) {
234
+ return;
235
+ }
236
+ const current = document.layers[layer.name];
237
+ current.isVisible = current.isVisible === false;
238
+ loadResult = (viewer === null || viewer === void 0 ? void 0 : viewer.setDocument(document, buildFileName())) || null;
239
+ layers = collectLayers(loadResult);
240
+ syncUi();
241
+ queueMicrotask(() => {
242
+ viewer === null || viewer === void 0 ? void 0 : viewer.fit();
243
+ cadZoomEmitter.emit();
244
+ });
245
+ });
246
+ return button;
247
+ }));
248
+ };
249
+ const syncState = () => {
250
+ zoomText.textContent = `${getZoomPercent()}%`;
251
+ backendMeta.textContent = ((renderStats === null || renderStats === void 0 ? void 0 : renderStats.backend) || 'auto').toUpperCase();
252
+ state.hidden = status === 'ready';
253
+ state.classList.toggle('error', status === 'error');
254
+ if (status === 'loading') {
255
+ state.textContent = progressMessage;
256
+ }
257
+ else if (status === 'error') {
258
+ state.textContent = errorMessage;
259
+ }
260
+ };
261
+ const syncUi = () => {
262
+ syncState();
263
+ syncLayers();
264
+ syncInspector();
265
+ };
266
+ const updateProgress = (progress) => {
267
+ const prefix = progress.format ? `${progress.format.toUpperCase()} ` : '';
268
+ const percent = Number.isFinite(progress.percent) ? ` ${Math.round(progress.percent || 0)}%` : '';
269
+ progressMessage = `${prefix}${progress.message}${percent}`;
270
+ syncState();
271
+ };
272
+ const fitToView = () => {
273
+ viewer === null || viewer === void 0 ? void 0 : viewer.fit();
274
+ cadZoomEmitter.emit();
275
+ syncState();
276
+ };
277
+ const zoomIn = () => {
278
+ viewer === null || viewer === void 0 ? void 0 : viewer.zoomIn();
279
+ cadZoomEmitter.emit();
280
+ syncState();
281
+ };
282
+ const zoomOut = () => {
283
+ viewer === null || viewer === void 0 ? void 0 : viewer.zoomOut();
284
+ cadZoomEmitter.emit();
285
+ syncState();
286
+ };
287
+ registerFileViewerZoomProvider(shell, {
288
+ zoomIn: () => {
289
+ zoomIn();
290
+ return getCadZoomState();
291
+ },
292
+ zoomOut: () => {
293
+ zoomOut();
294
+ return getCadZoomState();
295
+ },
296
+ resetZoom: () => {
297
+ fitToView();
298
+ return getCadZoomState();
299
+ },
300
+ getState: getCadZoomState,
301
+ subscribe: cadZoomEmitter.subscribe,
302
+ });
303
+ fitButton.addEventListener('click', fitToView);
304
+ zoomInButton.addEventListener('click', zoomIn);
305
+ zoomOutButton.addEventListener('click', zoomOut);
306
+ const createViewer = () => {
307
+ var _a, _b, _c, _d, _e, _f, _g;
308
+ const { wasmPath, workerUrl, dwfWasmUrl } = resolveFileViewerCadAssetUrls(options, getCadDocumentBaseUrl(target));
309
+ const canvasOptions = {
310
+ background: '#f8fafc',
311
+ foreground: '#0f172a',
312
+ contrastMode: 'adaptive',
313
+ minColorContrast: 2.4,
314
+ showPageBounds: true,
315
+ showUnsupportedMarkers: true,
316
+ enableSpatialIndex: true,
317
+ maxVisibleTextLabels: 2400,
318
+ ...(options.canvasOptions || {}),
319
+ };
320
+ const nextViewer = new CadViewer({
321
+ container: stage,
322
+ nativeHost,
323
+ renderer: options.renderer || 'auto',
324
+ wasmPath,
325
+ workerUrl,
326
+ dwfWasmUrl,
327
+ dxfEncoding: options.dxfEncoding,
328
+ useWorker: (_a = options.useWorker) !== null && _a !== void 0 ? _a : true,
329
+ workerTimeoutMs: (_b = options.workerTimeoutMs) !== null && _b !== void 0 ? _b : CAD_WORKER_TIMEOUT,
330
+ preferDwgWasm: (_c = options.preferDwgWasm) !== null && _c !== void 0 ? _c : true,
331
+ includePaperSpace: (_d = options.includePaperSpace) !== null && _d !== void 0 ? _d : true,
332
+ maxInsertDepth: options.maxInsertDepth,
333
+ keepRaw: (_e = options.keepRaw) !== null && _e !== void 0 ? _e : false,
334
+ dwfPreferWebgl: (_f = options.dwfPreferWebgl) !== null && _f !== void 0 ? _f : true,
335
+ dwfPreferWasm: (_g = options.dwfPreferWasm) !== null && _g !== void 0 ? _g : true,
336
+ dwfBackground: options.dwfBackground || '#f8fafc',
337
+ dwfMaxDevicePixelRatio: options.dwfMaxDevicePixelRatio,
338
+ dwfMaxCanvasPixels: options.dwfMaxCanvasPixels,
339
+ dwfMaxGpuCacheBytes: options.dwfMaxGpuCacheBytes,
340
+ dwfMaxCachedScenes: options.dwfMaxCachedScenes,
341
+ dwfLineWeightMode: options.dwfLineWeightMode,
342
+ dwfMinStrokeCssPx: options.dwfMinStrokeCssPx,
343
+ dwfMaxOverviewStrokeCssPx: options.dwfMaxOverviewStrokeCssPx,
344
+ dwfMinTextCssPx: options.dwfMinTextCssPx,
345
+ dwfMinFilledAreaCssPx: options.dwfMinFilledAreaCssPx,
346
+ autoFit: true,
347
+ canvasOptions,
348
+ onLoadProgress: updateProgress,
349
+ onRenderStats: stats => {
350
+ renderStats = stats;
351
+ syncState();
352
+ syncInspector();
353
+ },
354
+ onViewChange: event => {
355
+ viewState = event;
356
+ cadZoomEmitter.emit();
357
+ syncState();
358
+ },
359
+ onLoad: result => {
360
+ loadResult = result;
361
+ layers = collectLayers(result);
362
+ syncUi();
363
+ },
364
+ onError: error => {
365
+ errorMessage = error.message || 'CAD 文件解析失败';
366
+ syncState();
367
+ },
368
+ });
369
+ if (options.preloadDwg !== false && normalizedType === 'dwg') {
370
+ void nextViewer.preloadDwg({ wasmPath, workerUrl }).catch(() => {
371
+ // 预热失败不阻断真实加载,loadBuffer 会返回完整错误上下文。
372
+ });
373
+ }
374
+ return nextViewer;
375
+ };
376
+ const loadCad = async () => {
377
+ status = 'loading';
378
+ progressMessage = '正在解析 CAD...';
379
+ errorMessage = '';
380
+ loadResult = null;
381
+ renderStats = null;
382
+ viewState = null;
383
+ layers = [];
384
+ syncUi();
385
+ abortController === null || abortController === void 0 ? void 0 : abortController.abort();
386
+ const controller = new AbortController();
387
+ abortController = controller;
388
+ try {
389
+ viewer === null || viewer === void 0 ? void 0 : viewer.destroy();
390
+ viewer = createViewer();
391
+ const cadAssets = resolveFileViewerCadAssetUrls(options, getCadDocumentBaseUrl(target));
392
+ const result = await viewer.loadBuffer(buffer.slice(0), buildFileName(), {
393
+ signal: controller.signal,
394
+ transferInputBuffer: false,
395
+ dxfEncoding: options.dxfEncoding,
396
+ wasmPath: cadAssets.wasmPath,
397
+ workerUrl: cadAssets.workerUrl,
398
+ dwfWasmUrl: cadAssets.dwfWasmUrl,
399
+ });
400
+ if (disposed || controller.signal.aborted) {
401
+ return;
402
+ }
403
+ loadResult = result;
404
+ layers = collectLayers(result);
405
+ status = 'ready';
406
+ syncUi();
407
+ queueMicrotask(() => {
408
+ viewer === null || viewer === void 0 ? void 0 : viewer.fit();
409
+ cadZoomEmitter.emit();
410
+ syncState();
411
+ });
412
+ }
413
+ catch (reason) {
414
+ if (disposed || controller.signal.aborted) {
415
+ return;
416
+ }
417
+ console.error(reason);
418
+ status = 'error';
419
+ errorMessage = reason instanceof Error ? reason.message : 'CAD 文件解析失败';
420
+ syncUi();
421
+ }
422
+ };
423
+ if (typeof ResizeObserver !== 'undefined') {
424
+ resizeObserver = new ResizeObserver(() => {
425
+ viewer === null || viewer === void 0 ? void 0 : viewer.resize();
426
+ });
427
+ resizeObserver.observe(stage);
428
+ }
429
+ syncUi();
430
+ void loadCad();
431
+ return {
432
+ $el: shell,
433
+ unmount() {
434
+ disposed = true;
435
+ unregisterFileViewerZoomProvider(shell);
436
+ abortController === null || abortController === void 0 ? void 0 : abortController.abort();
437
+ abortController = null;
438
+ resizeObserver === null || resizeObserver === void 0 ? void 0 : resizeObserver.disconnect();
439
+ resizeObserver = null;
440
+ viewer === null || viewer === void 0 ? void 0 : viewer.destroy();
441
+ viewer = null;
442
+ target.replaceChildren();
443
+ },
444
+ };
445
+ }
@@ -0,0 +1,11 @@
1
+ import type { FileViewerRenderedInstance } from '../types';
2
+ /**
3
+ * Framework-neutral text/code renderer.
4
+ *
5
+ * highlight.js core and language definitions are loaded lazily by format. HTML
6
+ * and XML are highlighted as escaped source text, never executed as real DOM.
7
+ * @param buffer 文本二进制内容
8
+ * @param target 目标
9
+ * @param type 文件扩展名,用于选择 highlight.js 语言
10
+ */
11
+ export default function renderText(buffer: ArrayBuffer, target: HTMLDivElement, type?: string): Promise<FileViewerRenderedInstance>;