@flyfish-group/file-viewer 1.0.24 → 1.0.25

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 (231) hide show
  1. package/README.en.md +390 -0
  2. package/README.md +37 -22
  3. package/dist/components/3MFLoader.js +1 -1
  4. package/dist/components/AMFLoader.js +1 -1
  5. package/dist/components/ArchiveViewer.js +314 -139
  6. package/dist/components/AudioViewer.js +1 -1
  7. package/dist/components/CadViewer.js +1 -1
  8. package/dist/components/CodeViewer.js +1 -1
  9. package/dist/components/ColladaLoader.js +1 -1
  10. package/dist/components/DrawingViewer.js +1 -1
  11. package/dist/components/EdaViewer.js +1 -1
  12. package/dist/components/EmailViewer.js +1 -1
  13. package/dist/components/EpubViewer.js +1 -1
  14. package/dist/components/FBXLoader.js +1 -1
  15. package/dist/components/GLTFLoader.js +1 -1
  16. package/dist/components/ImageViewer.js +1 -1
  17. package/dist/components/KMZLoader.js +1 -1
  18. package/dist/components/MarkdownViewer.js +1 -1
  19. package/dist/components/OBJLoader.js +1 -1
  20. package/dist/components/OfdViewer.js +1 -1
  21. package/dist/components/PCDLoader.js +1 -1
  22. package/dist/components/PLYLoader.js +1 -1
  23. package/dist/components/PdfView.js +5839 -5668
  24. package/dist/components/PptxRender.js +2356 -2332
  25. package/dist/components/STLLoader.js +1 -1
  26. package/dist/components/TDSLoader.js +1 -1
  27. package/dist/components/TypstViewer.js +320 -300
  28. package/dist/components/USDLoader.js +1 -1
  29. package/dist/components/UmdViewer.js +2 -2
  30. package/dist/components/VRMLLoader.js +1 -1
  31. package/dist/components/VTKLoader.js +1 -1
  32. package/dist/components/XYZLoader.js +1 -1
  33. package/dist/components/XlsxTable.js +1 -1
  34. package/dist/components/___vite-browser-external_commonjs-proxy.js +1 -1
  35. package/dist/components/_commonjs-dynamic-modules.js +1 -1
  36. package/dist/components/_commonjsHelpers.js +1 -1
  37. package/dist/components/ar-SA-G6X2FPQ2.js +1 -1
  38. package/dist/components/arc.js +1 -1
  39. package/dist/components/architecture-7EHR7CIX.js +1 -1
  40. package/dist/components/architectureDiagram-3BPJPVTR.js +1 -1
  41. package/dist/components/az-AZ-76LH7QW2.js +1 -1
  42. package/dist/components/bash.js +1 -0
  43. package/dist/components/bg-BG-XCXSNQG7.js +1 -1
  44. package/dist/components/blockDiagram-GPEHLZMM.js +1 -1
  45. package/dist/components/bn-BD-2XOGV67Q.js +1 -1
  46. package/dist/components/c4Diagram-AAUBKEIU.js +1 -1
  47. package/dist/components/ca-ES-6MX7JW3Y.js +1 -1
  48. package/dist/components/cfb.js +1 -1
  49. package/dist/components/channel.js +1 -1
  50. package/dist/components/chunk-2J33WTMH.js +1 -1
  51. package/dist/components/chunk-4BX2VUAB.js +1 -1
  52. package/dist/components/chunk-55IACEB6.js +1 -1
  53. package/dist/components/chunk-727SXJPM.js +1 -1
  54. package/dist/components/chunk-AQP2D5EJ.js +1 -1
  55. package/dist/components/chunk-FMBD7UC4.js +1 -1
  56. package/dist/components/chunk-ND2GUHAM.js +1 -1
  57. package/dist/components/chunk-QZHKN3VN.js +1 -1
  58. package/dist/components/classDiagram-4FO5ZUOK.js +1 -1
  59. package/dist/components/classDiagram-v2-Q7XG4LA2.js +1 -1
  60. package/dist/components/core.js +1 -0
  61. package/dist/components/cose-bilkent-S5V4N54A.js +1 -1
  62. package/dist/components/cpp.js +1 -0
  63. package/dist/components/cs-CZ-2BRQDIVT.js +1 -1
  64. package/dist/components/csharp.js +1 -0
  65. package/dist/components/css.js +1 -0
  66. package/dist/components/cytoscape.esm.js +1 -1
  67. package/dist/components/da-DK-5WZEPLOC.js +1 -1
  68. package/dist/components/dagre-BM42HDAG.js +1 -1
  69. package/dist/components/de-DE-XR44H4JA.js +1 -1
  70. package/dist/components/defaultLocale.js +1 -1
  71. package/dist/components/diagram-2AECGRRQ.js +1 -1
  72. package/dist/components/diagram-5GNKFQAL.js +1 -1
  73. package/dist/components/diagram-KO2AKTUF.js +1 -1
  74. package/dist/components/diagram-LMA3HP47.js +1 -1
  75. package/dist/components/diagram-OG6HWLK6.js +1 -1
  76. package/dist/components/diff.js +1 -0
  77. package/dist/components/directory-open-01563666.js +1 -1
  78. package/dist/components/directory-open-4ed118d0.js +1 -1
  79. package/dist/components/docx-preview.js +2 -2
  80. package/dist/components/el-GR-BZB4AONW.js +1 -1
  81. package/dist/components/en-B4ZKOASM.js +1 -1
  82. package/dist/components/erDiagram-TEJ5UH35.js +1 -1
  83. package/dist/components/es-ES-U4NZUMDT.js +1 -1
  84. package/dist/components/eu-ES-A7QVB2H4.js +1 -1
  85. package/dist/components/eventmodeling-FCH6USID.js +1 -1
  86. package/dist/components/fa-IR-HGAKTJCU.js +1 -1
  87. package/dist/components/fflate.module.js +1 -1
  88. package/dist/components/fi-FI-Z5N7JZ37.js +1 -1
  89. package/dist/components/file-open-002ab408.js +1 -1
  90. package/dist/components/file-open-7c801643.js +1 -1
  91. package/dist/components/file-save-3189631c.js +1 -1
  92. package/dist/components/file-save-745eba88.js +1 -1
  93. package/dist/components/flowDiagram-I6XJVG4X.js +1 -1
  94. package/dist/components/fr-FR-RHASNOE6.js +1 -1
  95. package/dist/components/ganttDiagram-6RSMTGT7.js +1 -1
  96. package/dist/components/gitGraph-WXDBUCRP.js +1 -1
  97. package/dist/components/gitGraphDiagram-PVQCEYII.js +1 -1
  98. package/dist/components/gl-ES-HMX3MZ6V.js +1 -1
  99. package/dist/components/global-compiler.js +1 -1
  100. package/dist/components/global-renderer.js +1 -1
  101. package/dist/components/go.js +1 -0
  102. package/dist/components/graph.js +1 -1
  103. package/dist/components/he-IL-6SHJWFNN.js +1 -1
  104. package/dist/components/hi-IN-IWLTKZ5I.js +1 -1
  105. package/dist/components/hu-HU-A5ZG7DT2.js +1 -1
  106. package/dist/components/id-ID-SAP4L64H.js +1 -1
  107. package/dist/components/image-GAAHSSAO.js +1 -1
  108. package/dist/components/image-blob-reduce.esm.js +1 -1
  109. package/dist/components/index10.js +1 -1
  110. package/dist/components/index11.js +1 -1
  111. package/dist/components/index12.js +1 -1
  112. package/dist/components/index13.js +1 -1
  113. package/dist/components/index14.js +1 -1
  114. package/dist/components/index15.js +1 -1
  115. package/dist/components/index16.js +1 -1
  116. package/dist/components/index17.js +1 -1
  117. package/dist/components/index18.js +1 -1
  118. package/dist/components/index19.js +1 -1
  119. package/dist/components/index2.js +1 -1
  120. package/dist/components/index20.js +1 -1
  121. package/dist/components/index21.js +1 -1
  122. package/dist/components/index22.js +2 -2
  123. package/dist/components/index23.js +1 -1
  124. package/dist/components/index24.js +1 -1
  125. package/dist/components/index3.js +1 -1
  126. package/dist/components/index4.js +1 -1
  127. package/dist/components/index5.js +1 -1
  128. package/dist/components/index6.js +1 -1
  129. package/dist/components/index7.js +1 -1
  130. package/dist/components/index8.js +1 -1
  131. package/dist/components/index9.js +1 -1
  132. package/dist/components/info-J43DQDTF.js +1 -1
  133. package/dist/components/infoDiagram-5YYISTIA.js +1 -1
  134. package/dist/components/ini.js +1 -0
  135. package/dist/components/init.js +1 -1
  136. package/dist/components/ishikawaDiagram-YF4QCWOH.js +1 -1
  137. package/dist/components/it-IT-JPQ66NNP.js +1 -1
  138. package/dist/components/ja-JP-DBVTYXUO.js +1 -1
  139. package/dist/components/java.js +1 -0
  140. package/dist/components/javascript.js +1 -0
  141. package/dist/components/journeyDiagram-JHISSGLW.js +1 -1
  142. package/dist/components/json.js +1 -0
  143. package/dist/components/jszip.min.js +1 -1
  144. package/dist/components/kaa-6HZHGXH3.js +1 -1
  145. package/dist/components/kab-KAB-ZGHBKWFO.js +1 -1
  146. package/dist/components/kanban-definition-UN3LZRKU.js +1 -1
  147. package/dist/components/katex.js +1 -1
  148. package/dist/components/kk-KZ-P5N5QNE5.js +1 -1
  149. package/dist/components/km-KH-HSX4SM5Z.js +1 -1
  150. package/dist/components/ko-KR-MTYHY66A.js +1 -1
  151. package/dist/components/ku-TR-6OUDTVRD.js +1 -1
  152. package/dist/components/layout.js +1 -1
  153. package/dist/components/libarchive.js +1 -1
  154. package/dist/components/linear.js +1 -1
  155. package/dist/components/lt-LT-XHIRWOB4.js +1 -1
  156. package/dist/components/lv-LV-5QDEKY6T.js +1 -1
  157. package/dist/components/markdown.js +1 -0
  158. package/dist/components/mermaid-parser.core.js +2 -2
  159. package/dist/components/mindmap-definition-RKZ34NQL.js +1 -1
  160. package/dist/components/mr-IN-CRQNXWMA.js +1 -1
  161. package/dist/components/my-MM-5M5IBNSE.js +1 -1
  162. package/dist/components/nb-NO-T6EIAALU.js +1 -1
  163. package/dist/components/nestedRender.js +1 -1
  164. package/dist/components/nl-NL-IS3SIHDZ.js +1 -1
  165. package/dist/components/nn-NO-6E72VCQL.js +1 -1
  166. package/dist/components/oc-FR-POXYY2M6.js +1 -1
  167. package/dist/components/ofd.js +1 -1
  168. package/dist/components/ordinal.js +1 -1
  169. package/dist/components/pa-IN-N4M65BXN.js +1 -1
  170. package/dist/components/packet-YPE3B663.js +1 -1
  171. package/dist/components/percentages-BXMCSKIN.js +1 -1
  172. package/dist/components/php.js +1 -0
  173. package/dist/components/pica.js +1 -1
  174. package/dist/components/pie-LRSECV5Y.js +1 -1
  175. package/dist/components/pie.js +1 -1
  176. package/dist/components/pieDiagram-4H26LBE5.js +1 -1
  177. package/dist/components/pl-PL-T2D74RX3.js +1 -1
  178. package/dist/components/postal-mime.js +1 -1
  179. package/dist/components/printLayout.js +1 -1
  180. package/dist/components/pt-BR-5N22H2LF.js +1 -1
  181. package/dist/components/pt-PT-UZXXM6DQ.js +1 -1
  182. package/dist/components/python.js +1 -0
  183. package/dist/components/quadrantDiagram-W4KKPZXB.js +1 -1
  184. package/dist/components/radar-GUYGQ44K.js +1 -1
  185. package/dist/components/requirementDiagram-4Y6WPE33.js +1 -1
  186. package/dist/components/ro-RO-JPDTUUEW.js +1 -1
  187. package/dist/components/rough.esm.js +1 -1
  188. package/dist/components/roundRect.js +1 -1
  189. package/dist/components/ru-RU-B4JR7IUQ.js +1 -1
  190. package/dist/components/rust.js +1 -0
  191. package/dist/components/sankeyDiagram-5OEKKPKP.js +1 -1
  192. package/dist/components/sequenceDiagram-3UESZ5HK.js +1 -1
  193. package/dist/components/si-LK-N5RQ5JYF.js +1 -1
  194. package/dist/components/sk-SK-C5VTKIMK.js +1 -1
  195. package/dist/components/sl-SI-NN7IZMDC.js +1 -1
  196. package/dist/components/sql.js +1 -0
  197. package/dist/components/stateDiagram-AJRCARHV.js +1 -1
  198. package/dist/components/stateDiagram-v2-BHNVJYJU.js +1 -1
  199. package/dist/components/subset-shared.chunk.js +1 -1
  200. package/dist/components/subset-worker.chunk.js +1 -1
  201. package/dist/components/sv-SE-XGPEYMSR.js +1 -1
  202. package/dist/components/ta-IN-2NMHFXQM.js +1 -1
  203. package/dist/components/th-TH-HPSO5L25.js +1 -1
  204. package/dist/components/time.js +1 -1
  205. package/dist/components/timeline-definition-PNZ67QCA.js +1 -1
  206. package/dist/components/tr-TR-DEFEU3FU.js +1 -1
  207. package/dist/components/transform.js +1 -1
  208. package/dist/components/treeView-BLDUP644.js +1 -1
  209. package/dist/components/treemap-LRROVOQU.js +1 -1
  210. package/dist/components/typescript.js +1 -0
  211. package/dist/components/uk-UA-QMV73CPH.js +1 -1
  212. package/dist/components/vennDiagram-CIIHVFJN.js +1 -1
  213. package/dist/components/vi-VN-M7AON7JQ.js +1 -1
  214. package/dist/components/wardley-L42UT6IY.js +1 -1
  215. package/dist/components/wardleyDiagram-YWT4CUSO.js +1 -1
  216. package/dist/components/wasm-pack-shim.js +1 -1
  217. package/dist/components/wasm-pack-shim2.js +1 -1
  218. package/dist/components/worker-ref.js +1 -1
  219. package/dist/components/xml.js +1 -0
  220. package/dist/components/xychartDiagram-2RQKCTM6.js +1 -1
  221. package/dist/components/yaml.js +1 -0
  222. package/dist/components/zh-CN-LNUGB5OW.js +1 -1
  223. package/dist/components/zh-HK-E62DVLB3.js +1 -1
  224. package/dist/components/zh-TW-RAJ6MFWO.js +1 -1
  225. package/dist/index.d.ts +248 -11
  226. package/dist/index.mjs +1 -1
  227. package/dist/style.css +3 -12
  228. package/dist/wasm/cad/dwg-worker.js +24 -349
  229. package/package.json +4 -2
  230. package/dist/wasm/cad/DwgWorker-CuZJ5EUe.js +0 -349
  231. package/dist/wasm/cad/index-C365l3i9.js +0 -4161
package/README.en.md ADDED
@@ -0,0 +1,390 @@
1
+ # Flyfish Viewer
2
+
3
+ [Simplified Chinese](README.md) | [English](README.en.md)
4
+
5
+ Bring Word, Excel, PowerPoint, PDF, Typst, archives, email, audio, ebooks, drawings, CAD, 3D models, Markdown, images, and source code preview into the browser with a clean, deployable viewer.
6
+
7
+ `@flyfish-group/file-viewer3` is a pure frontend file preview component built with Vue 3, TypeScript, and Vite. Vue 2.7 projects should use the matching `@flyfish-group/file-viewer` package. The Vue 3 build is also the baseline runtime for the React, vanilla JavaScript, and iframe integration packages.
8
+
9
+ The viewer does not require a backend conversion service. It is designed for OA systems, knowledge bases, attachment centers, workflow platforms, customer support portals, document approval flows, intranet systems, and offline-capable deployments where file preview should feel like a maintained product module rather than a temporary feature.
10
+
11
+ - npm for Vue 3: [@flyfish-group/file-viewer3](https://www.npmjs.com/package/@flyfish-group/file-viewer3)
12
+ - npm for Vue 2.7: [@flyfish-group/file-viewer](https://www.npmjs.com/package/@flyfish-group/file-viewer)
13
+ - npm for React: [@flyfish-group/file-viewer-react](https://www.npmjs.com/package/@flyfish-group/file-viewer-react)
14
+ - npm for vanilla JavaScript: [@flyfish-group/file-viewer-web](https://www.npmjs.com/package/@flyfish-group/file-viewer-web)
15
+ - Official documentation: [doc.flyfish.dev](https://doc.flyfish.dev)
16
+ - Online demo: [viewer.flyfish.dev](https://viewer.flyfish.dev)
17
+ - Document comparison demo: [viewer.flyfish.dev/compare.html](https://viewer.flyfish.dev/compare.html)
18
+ - Release downloads: [github.com/flyfish-dev/file-viewer/releases](https://github.com/flyfish-dev/file-viewer/releases)
19
+ - GitHub artifact repository: [github.com/flyfish-dev/file-viewer](https://github.com/flyfish-dev/file-viewer)
20
+ - Gitee artifact mirror: [gitee.com/flyfish-dev/file-viewer](https://gitee.com/flyfish-dev/file-viewer)
21
+ - Source access and commercial customization: [https://dev.flyfish.group/shop](https://dev.flyfish.group/shop)
22
+
23
+ ## Current Packages
24
+
25
+ | Stack | Package | Version | Recommended branch | Notes |
26
+ | --- | --- | --- | --- | --- |
27
+ | Vue 3 | `@flyfish-group/file-viewer3` | `1.0.25` | `v3` | Recommended version and the runtime baseline for React / vanilla JS iframe integrations |
28
+ | Vue 2.7 | `@flyfish-group/file-viewer` | `1.0.25` | `main` | Vue 2 compatible package with the same format coverage and API semantics |
29
+ | React 17 / 18 / 19 | `@flyfish-group/file-viewer-react` | `1.0.25` | adapter package | iframe component that loads `/file-viewer/index.html` by default |
30
+ | Vanilla JavaScript | `@flyfish-group/file-viewer-web` | `1.0.25` | adapter package | iframe helpers and static viewer asset copier |
31
+
32
+ For intranet or offline environments, this artifact repository also ships npm tarballs under `artifacts/`:
33
+
34
+ ```bash
35
+ npm install ./artifacts/flyfish-group-file-viewer3-1.0.25.tgz
36
+ npm install ./artifacts/flyfish-group-file-viewer-1.0.25.tgz
37
+ npm install ./artifacts/flyfish-group-file-viewer-web-1.0.25.tgz
38
+ npm install ./artifacts/flyfish-group-file-viewer-react-1.0.25.tgz
39
+ ```
40
+
41
+ When installing the React tarball offline, install the same-version web tarball first because the React package depends on `@flyfish-group/file-viewer-web`.
42
+
43
+ If you use pnpm 10 and see `Ignored build scripts: @flyfish-group/file-viewer-web`, run:
44
+
45
+ ```bash
46
+ pnpm approve-builds
47
+ ```
48
+
49
+ Then allow `@flyfish-group/file-viewer-web`, or manually copy the bundled viewer assets:
50
+
51
+ ```bash
52
+ pnpm exec file-viewer-copy-assets ./public/file-viewer
53
+ ```
54
+
55
+ GitHub Releases provide all distribution downloads:
56
+
57
+ | File | Purpose |
58
+ | --- | --- |
59
+ | `file-viewer-v3-*-demo.tar.gz` | Main demo / iframe private deployment static site; extract it and use `/index.html?url=...` |
60
+ | `file-viewer-v3-*-adapter-demo.tar.gz` | React / vanilla JavaScript adapter demo site |
61
+ | `file-viewer-v3-*-lib-dist.tar.gz` | Vue 3 library dist for offline inspection or self-hosted packaging |
62
+ | `file-viewer-v3-*-docs.tar.gz` | Documentation site static output |
63
+ | `flyfish-group-file-viewer3-*.tgz` | Vue 3 local npm package |
64
+ | `flyfish-group-file-viewer-*.tgz` | Vue 2.7 local npm package |
65
+ | `flyfish-group-file-viewer-web-*.tgz` | Vanilla JavaScript iframe helper with viewer asset copy tooling |
66
+ | `flyfish-group-file-viewer-react-*.tgz` | React iframe component; install the same-version web package together with it |
67
+
68
+ ![Flyfish Viewer demo](docs/_images/demo-main.png)
69
+
70
+ ## Why Use It
71
+
72
+ - **Pure frontend and serverless.** File parsing and rendering happen in the browser. You do not need Office Server, a LibreOffice daemon, or a document conversion backend.
73
+ - **Broad format coverage.** The current release maps 152 extensions across 20 preview pipelines, including Office, PDF, OFD, Typst, archives, email, EDA files, CAD, 3D models, Excalidraw, draw.io, EPUB, UMD, Markdown, images, audio, video, and source code.
74
+ - **Lazy loaded renderers.** Heavy PDF, Office, OFD, Typst, archive, email, CAD, 3D, ebook, Markdown, and code highlighting dependencies are loaded only when the file type needs them.
75
+ - **Production-ready operations.** The viewer includes original file download, full rendered printing, rendered HTML export, watermark options, theme options, lifecycle hooks, iframe events, and before-operation guards for permission checks.
76
+ - **Better document reading.** Word and PDF keep a grey workspace, white paper surface, centered reading, width fitting, navigation, zoom, rotation, and complete print / HTML export paths.
77
+ - **Renderer-native zoom controls.** The common toolbar can zoom in, zoom out, and reset through per-format providers for PDF, Word, PPTX, virtual Excel tables, images, CAD, OFD, Typst, Markdown, code, and drawing files, avoiding fragile host-level CSS transforms.
78
+ - **Controlled theming.** `options.theme` supports `light`, `dark`, and `system`. Light business UIs can lock the viewer to `light` even when the operating system is in dark mode.
79
+ - **PDF toolbar ergonomics.** `toolbar.position` supports `auto`, `top`, and `bottom-right`. In `auto` mode, PDF uses a bottom-right floating operation bar to avoid duplicating the PDF navigation toolbar.
80
+ - **Demo and comparison views.** The repository includes the main demo and a standalone `/compare.html` page for side-by-side document comparison.
81
+ - **Component and standalone modes.** Use it as a Vue component, or deploy the static viewer and embed it through iframe in any system.
82
+ - **Artifact-first delivery.** This public repository contains minified build artifacts, static demos, documentation output, sample files, Docker deployment assets, and npm tarballs. It does not contain the private source tree.
83
+
84
+ ## Supported Formats
85
+
86
+ The viewer is organized around preview pipelines rather than one-off file extensions.
87
+
88
+ | Category | Extensions | Rendering pipeline | Typical use |
89
+ | --- | --- | --- | --- |
90
+ | Word | `docx`, `docm`, `dotx`, `dotm` | `docx-preview`, read-only page preview, print and HTML export | Modern Word documents and templates |
91
+ | Legacy Word | `doc`, `dot` | `msdoc-viewer` with Word-like paper surface and CFB tolerance fixes | Old Word 97-2003 files |
92
+ | Excel | `xlsx`, `xltx` | `styled-exceljs` plus virtual table rendering, merged cells, styles, auto text color, workbook images | Business spreadsheets and templates |
93
+ | Excel-compatible | `xlsm`, `xlsb`, `xls`, `xlt`, `xltm`, `csv`, `ods`, `fods`, `numbers` | Progressive spreadsheet parsing and virtual rendering | Legacy spreadsheets and lightweight data preview |
94
+ | PowerPoint | `pptx`, `pptm`, `potx`, `potm`, `ppsx`, `ppsm` | Slide preview with images, shapes, theme backgrounds, clipping, and EMF fallback | Presentations, training decks, proposals |
95
+ | PDF | `pdf` | `pdfjs-dist`, streaming same-origin loading, Range support, zoom, rotation, page thumbnails, outline tree, width fitting, print, HTML export | Contracts, invoices, official layout documents |
96
+ | OFD | `ofd` | Browser-side OFD preview based on `DLTech21/ofd.js` source | Chinese e-invoices, government documents, archives |
97
+ | Typst | `typ`, `typst` | Direct Typst source rendering with browser WASM compiler and SVG pages | Technical reports, papers, engineering documents |
98
+ | Archives | `zip`, `zipx`, `7z`, `rar`, `tar`, `gz`, `tgz`, `bz2`, `xz`, `zst`, `cab`, `iso`, `jar`, `apk`, `cbz`, `cbr`, and more | `libarchive.js` Worker, directory listing, lazy extraction, IndexedDB cache | Attachment packages and internal document bundles |
99
+ | Email | `eml`, `msg` | `postal-mime` for EML, `@kenjiuno/msgreader` for MSG, headers, HTML/text body, attachment preview | Email archives and support tickets |
100
+ | EDA | `olb`, `dra` | CFB-based OrCAD / Allegro structure inspection, trees, symbols, footprints, padstack candidates, properties, strings, diagnostics | Component libraries and EDA attachments |
101
+ | CAD | `dwg`, `dxf`, `dwf`, `dwfx`, `xps` | `@flyfish-dev/cad-viewer` preview. DWG uses Worker + LibreDWG WASM, DXF uses a JS parser, and DWF/DWFx/XPS use the native `dwf-viewer` path for W2D/W3D/XPS graphics | Engineering drawings and AutoCAD archives |
102
+ | 3D models | `glb`, `gltf`, `obj`, `stl`, `ply`, `fbx`, `dae`, `3ds`, `3mf`, `amf`, `usd`, `usda`, `usdc`, `usdz`, `kmz`, `pcd`, `wrl`, `vrml`, `xyz`, `vtk`, `vtp`, `step`, `stp`, `iges`, `igs`, `ifc`, `3dm` | Three.js interactive preview, with conversion guidance for heavy CAD/BIM kernels | 3D assets, point clouds, design models |
103
+ | Excalidraw | `excalidraw` | Official `@excalidraw/excalidraw` restore and `exportToSvg` read-only rendering | Whiteboard sketches and product diagrams |
104
+ | draw.io | `drawio`, `dio` | Official diagrams.net `GraphViewer` | Flowcharts and architecture diagrams |
105
+ | EPUB | `epub` | `epubjs` table of contents and scrolling reader | Ebooks and long training materials |
106
+ | UMD ebook | `umd` | UMD metadata, chapters, offsets, zlib text blocks | Legacy mobile ebooks |
107
+ | Markdown | `md`, `markdown` | Markdown reading surface with theme-aware styles | README files and knowledge base articles |
108
+ | Images | `gif`, `jpg`, `jpeg`, `bmp`, `tiff`, `tif`, `png`, `svg`, `webp` | Native image preview | Image attachments and design assets |
109
+ | Source and text | `txt`, `json`, `js`, `mjs`, `cjs`, `css`, `java`, `py`, `html`, `htm`, `jsx`, `ts`, `tsx`, `xml`, `log`, `vue`, `yaml`, `yml`, `ini`, `sh`, `bash`, `sql`, `go`, `rs`, `php`, `c`, `cpp`, `cc`, `h`, `hpp`, `cs`, `diff` | Lightweight `highlight.js` language-specific highlighting, HTML shown as source | Logs, configs, code snippets, API responses |
110
+ | Audio | `mp3`, `mpeg`, `wav`, `ogg`, `oga`, `opus`, `m4a`, `aac`, `flac`, `weba` | Native browser audio player | Recordings and audio attachments |
111
+ | Video | `mp4` | Native browser video player | Screen recordings and demo videos |
112
+
113
+ ## Vue 3 Integration
114
+
115
+ ```bash
116
+ npm install @flyfish-group/file-viewer3
117
+ ```
118
+
119
+ ```ts
120
+ import { createApp } from 'vue'
121
+ import App from './App.vue'
122
+ import FileViewer from '@flyfish-group/file-viewer3'
123
+
124
+ createApp(App).use(FileViewer).mount('#app')
125
+ ```
126
+
127
+ ```vue
128
+ <script setup lang="ts">
129
+ import { ref } from 'vue'
130
+
131
+ const url = ref('/files/demo.pdf')
132
+
133
+ const options = {
134
+ theme: 'light',
135
+ toolbar: { position: 'bottom-right', download: true, print: true, exportHtml: true },
136
+ watermark: { text: 'Internal Preview', opacity: 0.14 },
137
+ pdf: { streaming: 'same-origin', rangeChunkSize: 64 * 1024 }
138
+ }
139
+ </script>
140
+
141
+ <template>
142
+ <div style="height: 100vh">
143
+ <file-viewer :url="url" :options="options" />
144
+ </div>
145
+ </template>
146
+ ```
147
+
148
+ For local files or authenticated downloads, pass a `File` object:
149
+
150
+ ```ts
151
+ const response = await fetch('/api/files/contract', { credentials: 'include' })
152
+ const blob = await response.blob()
153
+
154
+ file.value = new File([blob], 'contract.pdf', { type: blob.type })
155
+ ```
156
+
157
+ The filename matters. The viewer uses the extension to choose the correct rendering pipeline.
158
+
159
+ ## Vue 2.7 Integration
160
+
161
+ ```bash
162
+ npm install @flyfish-group/file-viewer
163
+ ```
164
+
165
+ ```ts
166
+ import Vue from 'vue'
167
+ import FileViewer from '@flyfish-group/file-viewer'
168
+
169
+ Vue.use(FileViewer)
170
+ ```
171
+
172
+ ```vue
173
+ <template>
174
+ <div style="height: 100vh">
175
+ <file-viewer :url="url" :options="options" />
176
+ </div>
177
+ </template>
178
+
179
+ <script>
180
+ export default {
181
+ data() {
182
+ return {
183
+ url: '/files/demo.pdf',
184
+ options: {
185
+ theme: 'light',
186
+ toolbar: { position: 'bottom-right' }
187
+ }
188
+ }
189
+ }
190
+ }
191
+ </script>
192
+ ```
193
+
194
+ The Vue 2 and Vue 3 package lines share the same user-facing capabilities and option semantics.
195
+
196
+ ## React Integration
197
+
198
+ The React package is an iframe adapter. It reuses the Vue 3 baseline viewer that is bundled by `@flyfish-group/file-viewer-web`.
199
+
200
+ ```bash
201
+ npm install @flyfish-group/file-viewer-react
202
+ ```
203
+
204
+ ```tsx
205
+ import FileViewer from '@flyfish-group/file-viewer-react'
206
+
207
+ export function Preview() {
208
+ return (
209
+ <div style={{ height: '100vh' }}>
210
+ <FileViewer
211
+ url="/files/demo.pdf"
212
+ options={{
213
+ theme: 'light',
214
+ toolbar: { position: 'bottom-right' },
215
+ watermark: { text: 'Internal Preview', opacity: 0.14 }
216
+ }}
217
+ onViewerEvent={(event) => {
218
+ console.log(event.type, event.event, event.payload)
219
+ }}
220
+ />
221
+ </div>
222
+ )
223
+ }
224
+ ```
225
+
226
+ By default, the iframe loads `/file-viewer/index.html`. If your static assets are deployed elsewhere, pass `viewerUrl`.
227
+
228
+ ## Vanilla JavaScript Integration
229
+
230
+ ```bash
231
+ npm install @flyfish-group/file-viewer-web
232
+ ```
233
+
234
+ ```html
235
+ <div id="viewer" style="height: 100vh"></div>
236
+
237
+ <script type="module">
238
+ import { mountViewerFrame } from '@flyfish-group/file-viewer-web'
239
+
240
+ mountViewerFrame(document.getElementById('viewer'), {
241
+ url: '/files/demo.pdf',
242
+ options: {
243
+ theme: 'light',
244
+ toolbar: { position: 'bottom-right' },
245
+ archive: { cache: true, workerTimeoutMs: 30000 }
246
+ },
247
+ onEvent(event) {
248
+ console.log(event.type, event.event, event.payload)
249
+ }
250
+ })
251
+ </script>
252
+ ```
253
+
254
+ The web package copies the static viewer into `public/file-viewer` during installation. If your package manager blocks install scripts, run:
255
+
256
+ ```bash
257
+ npx file-viewer-copy-assets ./public/file-viewer
258
+ ```
259
+
260
+ ## iframe Protocol
261
+
262
+ If you cannot use npm helpers, deploy the static viewer and pass a file URL through query parameters:
263
+
264
+ ```html
265
+ <iframe
266
+ src="/file-viewer/index.html?url=%2Ffiles%2Fdemo.pdf&options=%7B%22theme%22%3A%22light%22%2C%22toolbar%22%3A%7B%22position%22%3A%22bottom-right%22%7D%7D"
267
+ style="width: 100%; height: 100vh; border: 0"
268
+ ></iframe>
269
+ ```
270
+
271
+ For authenticated files, download the file in the host system and push a `Blob` to the iframe:
272
+
273
+ ```ts
274
+ const viewerUrl = '/file-viewer/index.html'
275
+ const viewerOrigin = location.origin
276
+ const filename = 'contract.pdf'
277
+ const options = { theme: 'light', toolbar: { position: 'bottom-right' } }
278
+ const frame = document.getElementById('viewer') as HTMLIFrameElement
279
+
280
+ frame.src =
281
+ `${viewerUrl}?name=${encodeURIComponent(filename)}` +
282
+ `&from=${encodeURIComponent(location.origin)}` +
283
+ `&options=${encodeURIComponent(JSON.stringify(options))}`
284
+
285
+ frame.onload = async () => {
286
+ const response = await fetch('/api/files/contract', { credentials: 'include' })
287
+ const blob = await response.blob()
288
+ frame.contentWindow?.postMessage(blob, viewerOrigin)
289
+ }
290
+ ```
291
+
292
+ The viewer validates `event.origin === from` and only accepts `Blob` messages from the declared origin.
293
+
294
+ ## Core Options
295
+
296
+ | Option | Description |
297
+ | --- | --- |
298
+ | `theme` | `light`, `dark`, or `system`. Default is `system`. Use `light` when embedding in a fixed light UI. |
299
+ | `toolbar` | `true`, `false`, or an object that controls download, print, HTML export, unified zoom controls, and toolbar position. |
300
+ | `toolbar.zoom` | Shows or hides the built-in zoom group. The actual capability is provided by each renderer, so unsupported or interaction-sensitive formats are not force-scaled. |
301
+ | `toolbar.position` | `auto`, `top`, or `bottom-right`. Default `auto` floats the operation bar at bottom right for PDF and keeps other formats at top. |
302
+ | `watermark` | Text or image watermark configuration. Watermark participates in preview, print, and exported HTML. |
303
+ | `archive.workerUrl` | Custom `libarchive.js` Worker URL for special private deployments. By default the viewer tries `vendor/libarchive/worker-bundle.js` under the current base and falls back to the bundled Worker automatically. |
304
+ | `archive.wasmUrl` | Custom libarchive WASM URL used by the bundled Worker fallback. |
305
+ | `archive.workerTimeoutMs` | Worker initialization, encryption check, and directory-read timeout. Defaults to 30000ms and then falls back to ZIP/TAR/GZIP compatibility mode when possible. |
306
+ | `archive.cache` | Enables IndexedDB cache for extracted archive entries. |
307
+ | `archive.maxArchiveSize` | Maximum archive size allowed for directory parsing. |
308
+ | `archive.maxEntryPreviewSize` | Maximum extracted entry size allowed for online preview. |
309
+ | `pdf.streaming` | PDF URL loading strategy. Same-origin streaming is enabled by default. |
310
+ | `pdf.rangeChunkSize` | PDF.js Range request chunk size. |
311
+ | `typst.compilerWasmUrl` | Custom Typst compiler WASM URL. |
312
+ | `hooks` | Vue component lifecycle hooks for load and unload events. |
313
+ | `beforeOperation` | Vue component guard before download, print, HTML export, or zoom actions. Return `false` to cancel. |
314
+
315
+ React, vanilla JavaScript, and iframe integrations cannot serialize function hooks into query parameters. Use `onViewerEvent` or `onEvent` to receive lifecycle and operation events from the iframe.
316
+
317
+ ## Printing, Exporting, and Watermarks
318
+
319
+ - Download keeps the original file bytes. It does not write rendered output back into the source file.
320
+ - Print opens a print-only document containing the rendered body and watermark, without the demo shell or host UI.
321
+ - PDF print and HTML export use a dedicated adapter that renders complete pages rather than only the visible canvas.
322
+ - Word print and HTML export preserve the white paper surface and page sizing while removing preview-only layout wrappers.
323
+ - Spreadsheet, archive, email, EPUB, audio, video, and 3D pipelines hide unreliable print buttons when the full document cannot be printed consistently.
324
+ - HTML export clones the current rendered output and converts canvas content where possible.
325
+
326
+ ## Document Comparison
327
+
328
+ The production demo includes a standalone comparison page:
329
+
330
+ [https://viewer.flyfish.dev/compare.html](https://viewer.flyfish.dev/compare.html)
331
+
332
+ It supports two-pane document preview, built-in samples, URL input, local upload, swapping panes, reset, and synchronized scrolling. The comparison page is intentionally separate from the main viewer entry so that the primary component API stays small and predictable.
333
+
334
+ ## Private Deployment
335
+
336
+ For npm-based iframe integrations, make sure your final static output contains:
337
+
338
+ ```txt
339
+ file-viewer/index.html
340
+ file-viewer/assets/*
341
+ file-viewer/vendor/libarchive/worker-bundle.js # optional unless you want a static Worker path
342
+ file-viewer/vendor/libarchive/libarchive.wasm # keep next to worker-bundle.js when using archive.workerUrl
343
+ ```
344
+
345
+ The artifact repository also contains:
346
+
347
+ | Path | Purpose |
348
+ | --- | --- |
349
+ | `dist/` | Minified library build artifacts |
350
+ | `demo/` | Static production demo, including `index.html` and `compare.html` |
351
+ | `adapter-demo/` | React and vanilla JavaScript integration demo |
352
+ | `docs/` | Static documentation site output |
353
+ | `example/` | Sample files used by the demo |
354
+ | `artifacts/` | npm tarballs and packaged static build archives |
355
+ | `README.md` | Default Chinese documentation |
356
+ | `README.en.md` | English documentation |
357
+ | `LICENSE` | Apache-2.0 license |
358
+
359
+ ## Docker
360
+
361
+ The project provides a static nginx runtime image and build scripts for `linux/amd64` and `linux/arm64`. A typical deployment can serve the demo and comparison page directly:
362
+
363
+ ```bash
364
+ docker run --rm -p 8080:80 flyfishdev/file-viewer:1.0.25
365
+ ```
366
+
367
+ Then open:
368
+
369
+ ```txt
370
+ http://localhost:8080/
371
+ http://localhost:8080/compare.html
372
+ ```
373
+
374
+ If you build the image yourself, use the provided `Dockerfile` and keep the static viewer assets, examples, and vendor WASM files together.
375
+
376
+ ## Public Artifacts vs Source Code
377
+
378
+ This public repository is for artifact delivery. It contains minified build output, static demo sites, sample files, documentation output, and npm tarballs. It intentionally does not include the private source tree. The Gitee mirror is synchronized from a clean latest-artifact snapshot when needed, so domestic users can clone the full expanded artifact repository without inheriting oversized binary release history.
379
+
380
+ If you need source code access, second development resources, or commercial customization, use the self-service source access portal:
381
+
382
+ [https://dev.flyfish.group/shop](https://dev.flyfish.group/shop)
383
+
384
+ The self-service source access price is 4.99. It is designed to make legitimate second development and commercial evaluation straightforward without mixing source delivery into the public artifact repository.
385
+
386
+ ## License and Attribution
387
+
388
+ Flyfish Viewer is distributed under the Apache-2.0 license. You may use the public artifacts according to that license.
389
+
390
+ For second development or commercial use, please keep clear attribution to Flyfish Viewer and contribute useful fixes or compatibility improvements back whenever possible. This keeps the preview ecosystem healthier for everyone using the component in real business systems.
package/README.md CHANGED
@@ -15,7 +15,8 @@
15
15
  - 官方文档: [doc.flyfish.dev](https://doc.flyfish.dev)
16
16
  - 在线 Demo: [viewer.flyfish.dev](https://viewer.flyfish.dev)
17
17
  - 文档比对 Demo: [viewer.flyfish.dev/compare.html](https://viewer.flyfish.dev/compare.html)
18
- - Docker 镜像发布目标: `flyfishdev/file-viewer:1.0.24`
18
+ - Release 下载: [github.com/flyfish-dev/file-viewer/releases](https://github.com/flyfish-dev/file-viewer/releases)
19
+ - Docker 镜像发布目标: `flyfishdev/file-viewer:1.0.25`
19
20
  - 公开成品仓库(GitHub): [github.com/flyfish-dev/file-viewer](https://github.com/flyfish-dev/file-viewer)
20
21
  - 公开成品仓库(Gitee): [gitee.com/flyfish-dev/file-viewer](https://gitee.com/flyfish-dev/file-viewer)
21
22
  - 源码自助开通: [https://dev.flyfish.group/shop](https://dev.flyfish.group/shop)
@@ -24,22 +25,35 @@
24
25
 
25
26
  | 技术栈 | npm 包 | 最新版本 | 推荐分支 | 说明 |
26
27
  | --- | --- | --- | --- | --- |
27
- | Vue3 | `@flyfish-group/file-viewer3` | `1.0.24` | `v3` | 主推版本,也是 React / 纯 Web 私有化 iframe 适配层的构建基线 |
28
- | Vue2.7 | `@flyfish-group/file-viewer` | `1.0.24` | `main` | 兼容 Vue2 项目,格式能力与 Vue3 保持一致 |
29
- | React 17 / 18 / 19 | `@flyfish-group/file-viewer-react` | `1.0.24` | 当前仓库子工程 | iframe 组件,默认加载 `/file-viewer/index.html` |
30
- | 纯 JS | `@flyfish-group/file-viewer-web` | `1.0.24` | 当前仓库子工程 | iframe helper 和 viewer 产物复制工具 |
28
+ | Vue3 | `@flyfish-group/file-viewer3` | `1.0.25` | `v3` | 主推版本,也是 React / 纯 Web 私有化 iframe 适配层的构建基线 |
29
+ | Vue2.7 | `@flyfish-group/file-viewer` | `1.0.25` | `main` | 兼容 Vue2 项目,格式能力与 Vue3 保持一致 |
30
+ | React 17 / 18 / 19 | `@flyfish-group/file-viewer-react` | `1.0.25` | 当前仓库子工程 | iframe 组件,默认加载 `/file-viewer/index.html` |
31
+ | 纯 JS | `@flyfish-group/file-viewer-web` | `1.0.25` | 当前仓库子工程 | iframe helper 和 viewer 产物复制工具 |
31
32
 
32
33
  如果你在内网、离线环境,或者 npm 发布权限还没有完成配置,也可以直接使用公开成品仓库 `artifacts/` 里的 tarball。离线安装 React 包时请先安装同版本 web 包:
33
34
 
34
35
  ```bash
35
- npm install ./artifacts/flyfish-group-file-viewer3-1.0.24.tgz
36
- npm install ./artifacts/flyfish-group-file-viewer-1.0.24.tgz
37
- npm install ./artifacts/flyfish-group-file-viewer-web-1.0.24.tgz
38
- npm install ./artifacts/flyfish-group-file-viewer-react-1.0.24.tgz
36
+ npm install ./artifacts/flyfish-group-file-viewer3-1.0.25.tgz
37
+ npm install ./artifacts/flyfish-group-file-viewer-1.0.25.tgz
38
+ npm install ./artifacts/flyfish-group-file-viewer-web-1.0.25.tgz
39
+ npm install ./artifacts/flyfish-group-file-viewer-react-1.0.25.tgz
39
40
  ```
40
41
 
41
42
  Vue3、Vue2、React 和纯 JS tarball 都会随公开成品仓库一起生成。离线安装 React 包时请先安装同版本 web 包;React / 纯 JS 包推荐用 `npm install` 获得安装即复制的体验。pnpm 10 默认会拦截依赖包的 `postinstall`,如果看到 `Ignored build scripts: @flyfish-group/file-viewer-web`,请执行 `pnpm approve-builds` 允许该包,或安装后运行 `pnpm exec file-viewer-copy-assets ./public/file-viewer`。
42
43
 
44
+ GitHub Release 会同步提供完整下载项:
45
+
46
+ | 文件 | 用途 |
47
+ | --- | --- |
48
+ | `file-viewer-v3-*-demo.tar.gz` | 主 Demo / iframe 私有化部署静态站,解压后即可用 `/index.html?url=...` 接入 |
49
+ | `file-viewer-v3-*-adapter-demo.tar.gz` | React / 纯 JS 适配层演示站 |
50
+ | `file-viewer-v3-*-lib-dist.tar.gz` | Vue3 组件库构建产物,适合离线检查 dist 内容 |
51
+ | `file-viewer-v3-*-docs.tar.gz` | 文档站静态产物 |
52
+ | `flyfish-group-file-viewer3-*.tgz` | Vue3 本地 npm 安装包 |
53
+ | `flyfish-group-file-viewer-*.tgz` | Vue2.7 本地 npm 安装包 |
54
+ | `flyfish-group-file-viewer-web-*.tgz` | 纯 JS iframe helper,本地安装后复制 viewer 静态产物 |
55
+ | `flyfish-group-file-viewer-react-*.tgz` | React iframe 组件,本地安装时请同时安装同版本 web 包 |
56
+
43
57
  ![Flyfish Viewer demo](docs/_images/demo-main.png)
44
58
 
45
59
  ## 为什么值得接入
@@ -180,8 +194,8 @@ React 与纯 Web 适配层不再复制渲染器,只通过 iframe 加载 Vue3
180
194
  官网 Demo 可用于快速验证预览效果,但 React / 纯 JS 组件不会把官网 Demo 地址作为内置 viewer 地址。
181
195
 
182
196
  ```bash
183
- npm install @flyfish-group/file-viewer-react@1.0.24
184
- npm install @flyfish-group/file-viewer-web@1.0.24
197
+ npm install @flyfish-group/file-viewer-react@1.0.25
198
+ npm install @flyfish-group/file-viewer-web@1.0.25
185
199
  ```
186
200
 
187
201
  ```tsx
@@ -224,7 +238,7 @@ docker run -d \
224
238
  --name flyfish-viewer \
225
239
  --restart unless-stopped \
226
240
  -p 8080:80 \
227
- flyfishdev/file-viewer:1.0.24
241
+ flyfishdev/file-viewer:1.0.25
228
242
  ```
229
243
 
230
244
  访问:
@@ -236,7 +250,7 @@ docker run -d \
236
250
 
237
251
  ```bash
238
252
  pnpm docker:build
239
- docker run --rm -p 8080:80 flyfishdev/file-viewer:1.0.24
253
+ docker run --rm -p 8080:80 flyfishdev/file-viewer:1.0.25
240
254
  ```
241
255
 
242
256
  ## 使用说明
@@ -250,7 +264,8 @@ docker run --rm -p 8080:80 flyfishdev/file-viewer:1.0.24
250
264
  - 如果下载地址本身没有明确扩展名,建议先在业务侧取回文件,再包装成 `File`
251
265
  - PPTX 渲染器会尽量还原常见组合图形、旋转/翻转、主题背景、图片裁剪和 EMF 矢量图片;复杂 Office 特效仍建议用真实业务文件做回归
252
266
  - OFD、Typst、压缩包、邮件、OLB/DRA、CAD、3D 模型、绘图、EPUB、UMD、PDF、Office、Markdown、音频和代码高亮渲染器都按需异步加载,只有命中格式时才拉取对应代码块;Typst compiler WASM 可通过 `options.typst.compilerWasmUrl` 指向自托管地址,默认仅在打开 `.typ` / `.typst` 时加载
253
- - `options.theme` 支持 `light`、`dark`、`system`,默认继续跟随系统;`options.docx.worker` 默认开启,让 DOCX Worker 内用 `docx-preview` 构建 HTML,`options.docx.progressive` 默认开启,把 docx-preview 页面按批次挂载以便先看到内容;CSP 或低版本浏览器不兼容时可设为 `worker: false` 回退原生主线程渲染;`options.watermark` 支持文字或图片水印;`options.toolbar` 可控制下载原文件、打印完整渲染结果、导出 HTML 和操作栏位置,`toolbar.position` 支持 `auto`、`top`、`bottom-right`,PDF 默认悬浮到右下角以避开自身导航栏;`options.pdf.toolbar` 可隐藏 PDF 自身页码缩放工具栏;`options.search` 可控制搜索高亮、整词/大小写和命中数量;`options.ai` 可开启文本切片结构,返回行号、页码、锚点和 label 等溯源字段,便于业务侧做向量化、召回、AI 摘要、高亮回填和来源定位;`options.hooks` 可接收加载/卸载生命周期;`options.beforeOperation` 可在下载、打印、导出前做权限校验;打印按钮会结合当前文件类型、渲染完成状态和导出适配器动态显隐,Word / PDF 会生成完整页面,Excel 等虚拟表格会隐藏打印按钮,避免只打印当前视口或第一页
267
+ - `options.archive` 一般只需要配置 `cache`、`workerTimeoutMs` 和体积上限;预览器会先尝试当前部署 base 下的 `vendor/libarchive/worker-bundle.js`,失败后自动使用打包内置 Worker。手机 WebView、本地临时服务器、MIME CSP 导致 Worker 初始化超时时,会继续降级到 ZIP/TAR/GZIP 兼容模式,避免压缩包一直停在 loading。只有静态目录或 CDN 路径特殊时,才需要显式传 `archive.workerUrl` / `archive.wasmUrl`
268
+ - `options.theme` 支持 `light`、`dark`、`system`,默认继续跟随系统;`options.docx.worker` 默认开启,让 DOCX 在 Worker 内用 `docx-preview` 构建 HTML,`options.docx.progressive` 默认开启,把 docx-preview 页面按批次挂载以便先看到内容;CSP 或低版本浏览器不兼容时可设为 `worker: false` 回退原生主线程渲染;`options.watermark` 支持文字或图片水印;`options.toolbar` 可控制下载原文件、打印完整渲染结果、导出 HTML、统一缩放按钮和操作栏位置,`toolbar.zoom` 可单独控制缩放按钮显示,`toolbar.position` 支持 `auto`、`top`、`bottom-right`,PDF 默认悬浮到右下角以避开自身导航栏;统一缩放通过渲染器内部 provider 适配 PDF、Word、PPTX、Excel 虚拟表格、图片、CAD、OFD、Typst、Markdown、代码和绘图等链路,避免业务侧外层 CSS 缩放造成表格坐标或 canvas 交互偏移;`options.pdf.toolbar` 可隐藏 PDF 自身页码缩放工具栏;`options.search` 可控制搜索高亮、整词/大小写和命中数量;`options.ai` 可开启文本切片结构,返回行号、页码、锚点和 label 等溯源字段,便于业务侧做向量化、召回、AI 摘要、高亮回填和来源定位;`options.hooks` 可接收加载/卸载生命周期;`options.beforeOperation` 可在下载、打印、导出和缩放前做权限校验;打印按钮会结合当前文件类型、渲染完成状态和导出适配器动态显隐,Word / PDF 会生成完整页面,Excel 等虚拟表格会隐藏打印按钮,避免只打印当前视口或第一页
254
269
 
255
270
  ```ts
256
271
  const blob = await response.blob()
@@ -332,17 +347,17 @@ npm publish --access public
332
347
 
333
348
  如果 npm 账号启用了 MFA,请使用交互式终端完成浏览器确认后再等待发布结果。
334
349
 
335
- 公开 GitHub / Gitee 成品仓库只提交可直接使用的构建产物、示例、文档和 npm tarball,不提交当前源码目录。需要源码、二开包或商业自助开通的用户,可以前往 [https://dev.flyfish.group/shop](https://dev.flyfish.group/shop),付费 4.99 后自助开通。
350
+ 公开 GitHub / Gitee 成品仓库只提交可直接使用的构建产物、Demo、文档站、示例文件和 npm tarball,不提交当前源码目录。为避免 Gitee 因历史二进制膨胀超过 1GB,同步 Gitee 时会使用最新完整成品快照的干净历史,而不是把多轮构建产物历史全部带过去。需要源码、二开包或商业自助开通的用户,可以前往 [https://dev.flyfish.group/shop](https://dev.flyfish.group/shop),付费 4.99 后自助开通。
336
351
 
337
352
  ## 文档导航
338
353
 
339
- - [文档导览](docs/guide/index.md)
340
- - [快速开始](docs/guide/quickstart.md)
341
- - [Demo 说明](docs/guide/demo.md)
342
- - [组件用法](docs/guide/usage.md)
343
- - [支持格式](docs/guide/formats.md)
344
- - [本地开发与打包](docs/guide/development.md)
345
- - [Docker 部署](docs/guide/docker.md)
354
+ - [文档导览](https://doc.flyfish.dev/guide/)
355
+ - [快速开始](https://doc.flyfish.dev/guide/quickstart)
356
+ - [Demo 说明](https://doc.flyfish.dev/guide/demo)
357
+ - [组件用法](https://doc.flyfish.dev/guide/usage)
358
+ - [支持格式](https://doc.flyfish.dev/guide/formats)
359
+ - [本地开发与打包](https://doc.flyfish.dev/guide/development)
360
+ - [Docker 部署](https://doc.flyfish.dev/guide/docker)
346
361
 
347
362
  ## 开源说明
348
363
 
@@ -1 +1 @@
1
- function a(){const bF=['4115992rWpRzJ','2737290SRjelE','load','clone','build','tilestyleu','i:in','toLowerCase','wrapT','colors','setIndex','nodeName','querySelectorAll','texture2dgroup','path','2795408mjuwWL','10213578ipcJcg','vertices','model','length','1182633EKqOQI','4mefQLI','Rating','wrap','availableExtensions','mesh','colorgroup','vertices\x20vertex','name','magFilter','keys','resources','target','getAttribute','basematerials','triangles\x20triangle','push','revokeObjectURL','color','87396Sinthb','error','objectId','contenttype','extensions','forEach','parseFromString','default','pid','Relationship','roughness','mirror','1RgBVha','texture','vertexColors','transform','setPath','attributes','71394kpBTAv','objectid','THREE.3MFLoader:\x20fflate\x20missing\x20and\x20file\x20is\x20compressed.','value','position'];a=function(){return bF;};return a();}(function(w,x){const b4=b,y=w();while(!![]){try{const z=-parseInt(b4(0xcd))/0x1*(parseInt(b4(0xd3))/0x2)+-parseInt(b4(0xae))/0x3+-parseInt(b4(0xaf))/0x4*(-parseInt(b4(0xd9))/0x5)+-parseInt(b4(0xc1))/0x6+-parseInt(b4(0xa9))/0x7+-parseInt(b4(0xd8))/0x8+parseInt(b4(0xaa))/0x9;if(z===x)break;else y['push'](y['shift']());}catch(A){y['push'](y['shift']());}}}(a,0x4f18f));import{L as c,F as d,T as e,G,C as f,i as g,S as h,B as i,a as j,f as k,c as l,g as m,j as n,R as o,k as p,l as r,m as s,n as t,N as u}from'./ModelViewer.js';import{u as v}from'./fflate.module.js';import'vue';function b(c,d){c=c-0x9e;const e=a();let f=e[c];return f;}import'./index7.js';const U=h;class Be extends c{constructor(x){const b5=b;super(x),this[b5(0xb2)]=[];}['load'](x,y,z,A){const b6=b,B=this,F=new d(B['manager']);F[b6(0xd1)](B['path']),F['setResponseType']('arraybuffer'),F['setRequestHeader'](B['requestHeader']),F['setWithCredentials'](B['withCredentials']),F[b6(0xda)](x,function(H){try{y(B['parse'](H));}catch(N){A?A(N):console['error'](N),B['manager']['itemError'](x);}},z,A);}['parse'](x){const y=this,A=new e(this['manager']);function B(az){const b7=b;let aA=null,aB=null,aC,aD;const aE=[],aF=[];let aG;const aH={},aI={},aJ={},aK=new TextDecoder();try{aA=v(new Uint8Array(az));}catch(aP){if(aP instanceof ReferenceError)return console[b7(0xc2)](b7(0xd5)),null;}let aL=null;for(aB in aA)aB['match'](/\_rels\/.rels$/)?aC=aB:aB['match'](/3D\/_rels\/.*\.model\.rels$/)?aD=aB:aB['match'](/^3D\/[^\/]*\.model$/)?aL=aB:aB['match'](/^3D\/.*\/.*\.model$/)?aE['push'](aB):aB['match'](/^3D\/Textures?\/.*/)&&aF['push'](aB);if(aE['push'](aL),aC===void 0x0)throw new Error('THREE.ThreeMFLoader:\x20Cannot\x20find\x20relationship\x20file\x20`rels`\x20in\x203MF\x20archive.');const aM=aA[aC],aN=aK['decode'](aM),aO=F(aN);if(aD){const aQ=aA[aD],aR=aK['decode'](aQ);aG=F(aR);}for(let aS=0x0;aS<aE['length'];aS++){const aT=aE[aS],aU=aA[aT],aV=aK['decode'](aU),aW=new DOMParser()['parseFromString'](aV,'application/xml');aW['documentElement']['nodeName'][b7(0xa1)]()!==b7(0xac)&&console['error']('THREE.3MFLoader:\x20Error\x20loading\x203MF\x20-\x20no\x203MF\x20document\x20found:\x20',aT);const aX=aW['querySelector']('model'),aY={};for(let b0=0x0;b0<aX['attributes']['length'];b0++){const b1=aX[b7(0xd2)][b0];b1['name']['match'](/^xmlns:(.+)$/)&&(aY[b1[b7(0xd6)]]=RegExp['$1']);}const aZ=af(aX);aZ['xml']=aX,0x0<Object[b7(0xb8)](aY)[b7(0xad)]&&(aZ[b7(0xc5)]=aY),aH[aT]=aZ;}for(let b2=0x0;b2<aF['length'];b2++){const b3=aF[b2];aJ[b3]=aA[b3]['buffer'];}return{'rels':aO,'modelRels':aG,'model':aH,'printTicket':aI,'texture':aJ};}function F(az){const b8=b,aA=[],aB=new DOMParser()[b8(0xc7)](az,'application/xml')['querySelectorAll'](b8(0xca));for(let aC=0x0;aC<aB['length'];aC++){const aD=aB[aC],aE={'target':aD['getAttribute']('Target'),'id':aD['getAttribute']('Id'),'type':aD['getAttribute']('Type')};aA['push'](aE);}return aA;}function N(az){const b9=b,aA={};for(let aB=0x0;aB<az[b9(0xad)];aB++){const aC=az[aB],aD=aC['getAttribute'](b9(0xb6));0x0<=['Title','Designer','Description','Copyright','LicenseTerms',b9(0xb0),'CreationDate','ModificationDate']['indexOf'](aD)&&(aA[aD]=aC['textContent']);}return aA;}function W(az){const ba=b,aA={'id':az['getAttribute']('id'),'basematerials':[]},aB=az[ba(0xa6)]('base');for(let aC=0x0;aC<aB['length'];aC++){const aD=aB[aC],aE=a6(aD);aE['index']=aC,aA[ba(0xbc)]['push'](aE);}return aA;}function a0(az){const bb=b;return{'id':az[bb(0xbb)]('id'),'path':az[bb(0xbb)]('path'),'contenttype':az[bb(0xbb)]('contenttype'),'tilestyleu':az['getAttribute'](bb(0x9f)),'tilestylev':az['getAttribute']('tilestylev'),'filter':az[bb(0xbb)]('filter')};}function a1(az){const bc=b,aA={'id':az[bc(0xbb)]('id'),'texid':az['getAttribute']('texid'),'displaypropertiesid':az['getAttribute']('displaypropertiesid')},aB=az['querySelectorAll']('tex2coord'),aC=[];for(let aD=0x0;aD<aB[bc(0xad)];aD++){const aE=aB[aD],aF=aE[bc(0xbb)]('u'),aG=aE['getAttribute']('v');aC[bc(0xbe)](parseFloat(aF),parseFloat(aG));}return aA['uvs']=new Float32Array(aC),aA;}function a2(az){const bd=b,aA={'id':az['getAttribute']('id'),'displaypropertiesid':az['getAttribute']('displaypropertiesid')},aB=az['querySelectorAll'](bd(0xc0)),aC=[],aD=new f();for(let aE=0x0;aE<aB['length'];aE++){const aF=aB[aE]['getAttribute']('color');aD['setStyle'](aF['substring'](0x0,0x7),U),aC['push'](aD['r'],aD['g'],aD['b']);}return aA[bd(0xa3)]=new Float32Array(aC),aA;}function a3(az){const be=b,aA=az['children'],aB={};for(let aC=0x0;aC<aA['length'];aC++){const aD={'type':aA[aC]['nodeName']['substring'](0x2)};for(let aE=0x0;aE<aA[aC]['attributes']['length'];aE++){const aF=aA[aC][be(0xd2)][aE];aF['specified']&&(aD[aF[be(0xb6)]]=aF['value']);}aB[aA[aC]['getAttribute']('identifier')]=aD;}return aB;}function a4(az){const bf=b,aA={'id':az['getAttribute']('id'),'displayname':az['getAttribute']('displayname')},aB=az['children'],aC={};for(let aD=0x0;aD<aB['length'];aD++){const aE=aB[aD];if(aE[bf(0xa5)]===bf(0xa0)||aE['nodeName']==='i:out')aC[aE['nodeName']==='i:in'?'inputs':'outputs']=a3(aE);else{const aF=aE['children'],aG={'op':aE['nodeName']['substring'](0x2),'identifier':aE['getAttribute']('identifier')};for(let aH=0x0;aH<aF['length'];aH++)aG[aF[aH]['nodeName']['substring'](0x2)]=a3(aF[aH]);aC[aG['identifier']]=aG;}}return aA['operations']=aC,aA;}function a5(az){const bg=b,aA={'id':az['getAttribute']('id')},aB=az['querySelectorAll']('pbmetallic'),aC=[];for(let aD=0x0;aD<aB['length'];aD++){const aE=aB[aD];aC['push']({'name':aE['getAttribute'](bg(0xb6)),'metallicness':parseFloat(aE['getAttribute']('metallicness')),'roughness':parseFloat(aE['getAttribute']('roughness'))});}return aA['data']=aC,aA;}function a6(az){const aA={};return aA['name']=az['getAttribute']('name'),aA['displaycolor']=az['getAttribute']('displaycolor'),aA['displaypropertiesid']=az['getAttribute']('displaypropertiesid'),aA;}function a7(az){const bh=b,aA={},aB=[],aC=az['querySelectorAll'](bh(0xb5));for(let aG=0x0;aG<aC['length'];aG++){const aH=aC[aG],aI=aH['getAttribute']('x'),aJ=aH[bh(0xbb)]('y'),aK=aH['getAttribute']('z');aB['push'](parseFloat(aI),parseFloat(aJ),parseFloat(aK));}aA['vertices']=new Float32Array(aB);const aD=[],aE=[],aF=az['querySelectorAll'](bh(0xbd));for(let aL=0x0;aL<aF['length'];aL++){const aM=aF[aL],aN=aM['getAttribute']('v1'),aO=aM['getAttribute']('v2'),aP=aM['getAttribute']('v3'),aQ=aM['getAttribute']('p1'),aR=aM['getAttribute']('p2'),aS=aM['getAttribute']('p3'),aT=aM['getAttribute']('pid'),aU={};aU['v1']=parseInt(aN,0xa),aU['v2']=parseInt(aO,0xa),aU['v3']=parseInt(aP,0xa),aE['push'](aU['v1'],aU['v2'],aU['v3']),aQ&&(aU['p1']=parseInt(aQ,0xa)),aR&&(aU['p2']=parseInt(aR,0xa)),aS&&(aU['p3']=parseInt(aS,0xa)),aT&&(aU[bh(0xc9)]=aT),0x0<Object[bh(0xb8)](aU)['length']&&aD['push'](aU);}return aA['triangleProperties']=aD,aA['triangles']=new Uint32Array(aE),aA;}function a8(az){const aA=[],aB=az['querySelectorAll']('component');for(let aC=0x0;aC<aB['length'];aC++){const aD=aB[aC],aE=a9(aD);aA['push'](aE);}return aA;}function a9(az){const bi=b,aA={};aA['objectId']=az['getAttribute'](bi(0xd4));const aB=az['getAttribute'](bi(0xd0));return aB&&(aA['transform']=aa(aB)),aA;}function aa(az){const bj=b,aA=[];az['split']('\x20')[bj(0xc6)](function(aC){aA['push'](parseFloat(aC));});const aB=new g();return aB['set'](aA[0x0],aA[0x3],aA[0x6],aA[0x9],aA[0x1],aA[0x4],aA[0x7],aA[0xa],aA[0x2],aA[0x5],aA[0x8],aA[0xb],0x0,0x0,0x0,0x1),aB;}function ab(az){const bk=b,aA={'type':az['getAttribute']('type')},aB=az['getAttribute']('id');aB&&(aA['id']=aB);const aC=az['getAttribute']('pid');aC&&(aA['pid']=aC);const aD=az['getAttribute']('pindex');aD&&(aA['pindex']=aD);const aE=az['getAttribute']('thumbnail');aE&&(aA['thumbnail']=aE);const aF=az['getAttribute']('partnumber');aF&&(aA['partnumber']=aF);const aG=az[bk(0xbb)]('name');aG&&(aA['name']=aG);const aH=az['querySelector'](bk(0xb3));aH&&(aA['mesh']=a7(aH));const aI=az['querySelector']('components');return aI&&(aA['components']=a8(aI)),aA;}function ac(az){const bl=b,aA={};aA['basematerials']={};const aB=az['querySelectorAll']('basematerials');for(let aI=0x0;aI<aB['length'];aI++){const aJ=aB[aI],aK=W(aJ);aA['basematerials'][aK['id']]=aK;}aA['texture2d']={};const aC=az['querySelectorAll']('texture2d');for(let aL=0x0;aL<aC['length'];aL++){const aM=aC[aL],aN=a0(aM);aA['texture2d'][aN['id']]=aN;}aA['colorgroup']={};const aD=az[bl(0xa6)](bl(0xb4));for(let aO=0x0;aO<aD['length'];aO++){const aP=aD[aO],aQ=a2(aP);aA[bl(0xb4)][aQ['id']]=aQ;}const aE=az[bl(0xa6)]('implicitfunction');aE['length']>0x0&&(aA['implicitfunction']={});for(let aR=0x0;aR<aE[bl(0xad)];aR++){const aS=aE[aR],aT=a4(aS);aA['implicitfunction'][aT['id']]=aT;}aA['pbmetallicdisplayproperties']={};const aF=az['querySelectorAll']('pbmetallicdisplayproperties');for(let aU=0x0;aU<aF['length'];aU++){const aV=aF[aU],aW=a5(aV);aA['pbmetallicdisplayproperties'][aW['id']]=aW;}aA['texture2dgroup']={};const aG=az['querySelectorAll'](bl(0xa7));for(let aX=0x0;aX<aG[bl(0xad)];aX++){const aY=aG[aX],aZ=a1(aY);aA['texture2dgroup'][aZ['id']]=aZ;}aA['object']={};const aH=az['querySelectorAll']('object');for(let b0=0x0;b0<aH['length'];b0++){const b1=aH[b0],b2=ab(b1);aA['object'][b2['id']]=b2;}return aA;}function ad(az){const bm=b,aA=[],aB=az[bm(0xa6)]('item');for(let aC=0x0;aC<aB['length'];aC++){const aD=aB[aC],aE={'objectId':aD['getAttribute'](bm(0xd4))},aF=aD['getAttribute']('transform');aF&&(aE[bm(0xd0)]=aa(aF)),aA['push'](aE);}return aA;}function af(az){const bn=b,aA={'unit':az['getAttribute']('unit')||'millimeter'},aB=az['querySelectorAll']('metadata');aB&&(aA['metadata']=N(aB));const aC=az['querySelector']('resources');aC&&(aA['resources']=ac(aC));const aD=az['querySelector'](bn(0x9e));return aD&&(aA['build']=ad(aD)),aA;}function ag(az,aA,aB,aC){const bo=b,aD=az['texid'],aE=aB['resources']['texture2d'][aD];if(aE){const aF=aC[aE[bo(0xa8)]],aG=aE[bo(0xc4)],aH=new Blob([aF],{'type':aG}),aI=URL['createObjectURL'](aH),aJ=A['load'](aI,function(){const bp=bo;URL[bp(0xbf)](aI);});switch(aJ['colorSpace']=U,aE[bo(0x9f)]){case bo(0xb1):aJ['wrapS']=o;break;case bo(0xcc):aJ['wrapS']=r;break;case'none':case'clamp':aJ['wrapS']=p;break;default:aJ['wrapS']=o;}switch(aE['tilestylev']){case'wrap':aJ['wrapT']=o;break;case'mirror':aJ['wrapT']=r;break;case'none':case'clamp':aJ[bo(0xa2)]=p;break;default:aJ['wrapT']=o;}switch(aE['filter']){case'auto':aJ['magFilter']=s,aJ['minFilter']=t;break;case'linear':aJ[bo(0xb7)]=s,aJ['minFilter']=s,aJ['generateMipmaps']=!0x1;break;case'nearest':aJ['magFilter']=u,aJ['minFilter']=u,aJ['generateMipmaps']=!0x1;break;default:aJ['magFilter']=s,aJ['minFilter']=t;}return aJ;}else return null;}function ah(az,aA,aB,aC,aD,aE,aF){const bq=b,aG=aF['pindex'],aH={};for(let aK=0x0,aL=aA[bq(0xad)];aK<aL;aK++){const aM=aA[aK],aN=aM['p1']!==void 0x0?aM['p1']:aG;aH[aN]===void 0x0&&(aH[aN]=[]),aH[aN]['push'](aM);}const aI=Object['keys'](aH),aJ=[];for(let aO=0x0,aP=aI['length'];aO<aP;aO++){const aQ=aI[aO],aR=aH[aQ],aS=az['basematerials'][aQ],aT=aq(aS,aC,aD,aE,aF,ar),aU=new i(),aV=[],aW=aB['vertices'];for(let aY=0x0,aZ=aR['length'];aY<aZ;aY++){const b0=aR[aY];aV['push'](aW[b0['v1']*0x3+0x0]),aV[bq(0xbe)](aW[b0['v1']*0x3+0x1]),aV['push'](aW[b0['v1']*0x3+0x2]),aV['push'](aW[b0['v2']*0x3+0x0]),aV['push'](aW[b0['v2']*0x3+0x1]),aV['push'](aW[b0['v2']*0x3+0x2]),aV['push'](aW[b0['v3']*0x3+0x0]),aV['push'](aW[b0['v3']*0x3+0x1]),aV['push'](aW[b0['v3']*0x3+0x2]);}aU['setAttribute']('position',new j(aV,0x3));const aX=new k(aU,aT);aJ['push'](aX);}return aJ;}function ai(az,aA,aB,aC,aD,aE,aF){const br=b,aG=new i(),aH=[],aI=[],aJ=aB[br(0xab)],aK=az['uvs'];for(let aN=0x0,aO=aA['length'];aN<aO;aN++){const aP=aA[aN];aH['push'](aJ[aP['v1']*0x3+0x0]),aH['push'](aJ[aP['v1']*0x3+0x1]),aH['push'](aJ[aP['v1']*0x3+0x2]),aH['push'](aJ[aP['v2']*0x3+0x0]),aH['push'](aJ[aP['v2']*0x3+0x1]),aH['push'](aJ[aP['v2']*0x3+0x2]),aH['push'](aJ[aP['v3']*0x3+0x0]),aH[br(0xbe)](aJ[aP['v3']*0x3+0x1]),aH[br(0xbe)](aJ[aP['v3']*0x3+0x2]),aI['push'](aK[aP['p1']*0x2+0x0]),aI[br(0xbe)](aK[aP['p1']*0x2+0x1]),aI['push'](aK[aP['p2']*0x2+0x0]),aI['push'](aK[aP['p2']*0x2+0x1]),aI[br(0xbe)](aK[aP['p3']*0x2+0x0]),aI['push'](aK[aP['p3']*0x2+0x1]);}aG['setAttribute']('position',new j(aH,0x3)),aG['setAttribute']('uv',new j(aI,0x2));const aL=aq(az,aC,aD,aE,aF,ag),aM=new l({'map':aL,'flatShading':!0x0});return new k(aG,aM);}function aj(az,aA,aB,aC){const bs=b,aD=new i(),aE=[],aF=[],aG=aB['vertices'],aH=az['colors'];for(let aJ=0x0,aK=aA['length'];aJ<aK;aJ++){const aL=aA[aJ],aM=aL['v1'],aN=aL['v2'],aO=aL['v3'];aE['push'](aG[aM*0x3+0x0]),aE['push'](aG[aM*0x3+0x1]),aE['push'](aG[aM*0x3+0x2]),aE['push'](aG[aN*0x3+0x0]),aE[bs(0xbe)](aG[aN*0x3+0x1]),aE['push'](aG[aN*0x3+0x2]),aE[bs(0xbe)](aG[aO*0x3+0x0]),aE['push'](aG[aO*0x3+0x1]),aE['push'](aG[aO*0x3+0x2]);const aP=aL['p1']!==void 0x0?aL['p1']:aC['pindex'],aQ=aL['p2']!==void 0x0?aL['p2']:aP,aR=aL['p3']!==void 0x0?aL['p3']:aP;aF['push'](aH[aP*0x3+0x0]),aF[bs(0xbe)](aH[aP*0x3+0x1]),aF['push'](aH[aP*0x3+0x2]),aF['push'](aH[aQ*0x3+0x0]),aF['push'](aH[aQ*0x3+0x1]),aF['push'](aH[aQ*0x3+0x2]),aF['push'](aH[aR*0x3+0x0]),aF['push'](aH[aR*0x3+0x1]),aF['push'](aH[aR*0x3+0x2]);}aD['setAttribute'](bs(0xd7),new j(aE,0x3)),aD['setAttribute']('color',new j(aF,0x3));const aI=new l({'vertexColors':!0x0,'flatShading':!0x0});return new k(aD,aI);}function ak(az){const bt=b,aA=new i();aA[bt(0xa4)](new m(az['triangles'],0x1)),aA['setAttribute'](bt(0xd7),new m(az[bt(0xab)],0x3));const aB=new l({'name':c['DEFAULT_MATERIAL_NAME'],'color':0xffffff,'flatShading':!0x0});return new k(aA,aB);}function al(az,aA,aB,aC,aD,aE){const bu=b,aF=Object['keys'](az),aG=[];for(let aH=0x0,aI=aF['length'];aH<aI;aH++){const aJ=aF[aH],aK=az[aJ];switch(am(aJ,aC)){case'material':const aL=aC['resources']['basematerials'][aJ],aM=ah(aL,aK,aA,aB,aC,aD,aE);for(let aP=0x0,aQ=aM['length'];aP<aQ;aP++)aG['push'](aM[aP]);break;case'texture':const aN=aC['resources']['texture2dgroup'][aJ];aG['push'](ai(aN,aK,aA,aB,aC,aD,aE));break;case bu(0xcf):const aO=aC['resources']['colorgroup'][aJ];aG['push'](aj(aO,aK,aA,aE));break;case'default':aG[bu(0xbe)](ak(aA));break;default:console[bu(0xc2)]('THREE.3MFLoader:\x20Unsupported\x20resource\x20type.');}}if(aE[bu(0xb6)]){for(let aR=0x0;aR<aG['length'];aR++)aG[aR]['name']=aE['name'];}return aG;}function am(az,aA){const bv=b;return aA['resources']['texture2dgroup'][az]!==void 0x0?bv(0xce):aA['resources']['basematerials'][az]!==void 0x0?'material':aA['resources']['colorgroup'][az]!==void 0x0?'vertexColors':az==='default'?'default':void 0x0;}function an(az,aA){const bw=b,aB={},aC=az['triangleProperties'],aD=aA[bw(0xc9)];for(let aE=0x0,aF=aC['length'];aE<aF;aE++){const aG=aC[aE];let aH=aG['pid']!==void 0x0?aG['pid']:aD;aH===void 0x0&&(aH=bw(0xc8)),aB[aH]===void 0x0&&(aB[aH]=[]),aB[aH][bw(0xbe)](aG);}return aB;}function ao(az,aA,aB,aC,aD){const bx=b,aE=new G(),aF=an(az,aD),aG=al(aF,az,aA,aB,aC,aD);for(let aH=0x0,aI=aG[bx(0xad)];aH<aI;aH++)aE['add'](aG[aH]);return aE;}function ap(az,aA,aB){const by=b;if(!az)return;const aC=[],aD=Object['keys'](az);for(let aE=0x0;aE<aD['length'];aE++){const aF=aD[aE];for(let aG=0x0;aG<y['availableExtensions']['length'];aG++){const aH=y['availableExtensions'][aG];aH['ns']===aF&&aC[by(0xbe)](aH);}}for(let aI=0x0;aI<aC['length'];aI++){const aJ=aC[aI];aJ['apply'](aB,az[aJ['ns']],aA);}}function aq(az,aA,aB,aC,aD,aE){const bz=b;return az[bz(0x9e)]!==void 0x0||(az['build']=aE(az,aA,aB,aC,aD)),az['build'];}function ar(az,aA,aB){const bA=b;let aC;const aD=az['displaypropertiesid'],aE=aB['resources']['pbmetallicdisplayproperties'];if(aD!==null&&aE[aD]!==void 0x0){const aH=aE[aD]['data'][az['index']];aC=new n({'flatShading':!0x0,'roughness':aH[bA(0xcb)],'metalness':aH['metallicness']});}else aC=new l({'flatShading':!0x0});aC['name']=az[bA(0xb6)];const aF=az['displaycolor'],aG=aF['substring'](0x0,0x7);return aC['color']['setStyle'](aG,U),aF['length']===0x9&&(aC['opacity']=parseInt(aF['charAt'](0x7)+aF['charAt'](0x8),0x10)/0xff),aC;}function as(az,aA,aB,aC){const aD=new G();for(let aE=0x0;aE<az['length'];aE++){const aF=az[aE];let aG=aA[aF['objectId']];aG===void 0x0&&(at(aF['objectId'],aA,aB,aC),aG=aA[aF['objectId']]);const aH=aG['clone'](),aI=aF['transform'];aI&&aH['applyMatrix4'](aI),aD['add'](aH);}return aD;}function at(az,aA,aB,aC){const bB=b,aD=aB['resources']['object'][az];if(aD['mesh']){const aE=aD[bB(0xb3)],aF=aB['extensions'],aG=aB['xml'];ap(aF,aE,aG),aA[aD['id']]=aq(aE,aA,aB,aC,aD,ao);}else{const aH=aD['components'];aA[aD['id']]=aq(aH,aA,aB,aC,aD,as);}aD[bB(0xb6)]&&(aA[aD['id']][bB(0xb6)]=aD['name']),aB['resources']['implicitfunction']&&console['warn']('THREE.ThreeMFLoader:\x20Implicit\x20Functions\x20are\x20implemented\x20in\x20data-only.',aB['resources']['implicitfunction']);}function au(az){const bC=b,aA=az['model'],aB=az['modelRels'],aC={},aD=Object['keys'](aA),aE={};if(aB)for(let aF=0x0,aG=aB['length'];aF<aG;aF++){const aH=aB[aF],aI=aH['target']['substring'](0x1);az['texture'][aI]&&(aE[aH[bC(0xba)]]=az['texture'][aI]);}for(let aJ=0x0;aJ<aD['length'];aJ++){const aK=aD[aJ],aL=aA[aK],aM=Object['keys'](aL[bC(0xb9)]['object']);for(let aN=0x0;aN<aM['length'];aN++){const aO=aM[aN];at(aO,aC,aL,aE);}}return aC;}function av(az){for(let aA=0x0;aA<az['length'];aA++){const aB=az[aA];if(aB['target']['split']('.')['pop']()['toLowerCase']()==='model')return aB;}}function aw(az,aA){const bD=b,aB=new G(),aC=av(aA['rels']),aD=aA['model'][aC['target']['substring'](0x1)]['build'];for(let aE=0x0;aE<aD['length'];aE++){const aF=aD[aE],aG=az[aF[bD(0xc3)]][bD(0xdb)](),aH=aF['transform'];aH&&aG['applyMatrix4'](aH),aB['add'](aG);}return aB;}const ax=B(x),ay=au(ax);return aw(ay,ax);}['addExtension'](x){const bE=b;this['availableExtensions'][bE(0xbe)](x);}}export{Be as ThreeMFLoader};
1
+ const b6=b;(function(w,x){const b4=b,y=w();while(!![]){try{const z=parseInt(b4(0xa3))/0x1*(-parseInt(b4(0xa4))/0x2)+parseInt(b4(0x83))/0x3+parseInt(b4(0x8b))/0x4*(parseInt(b4(0xb1))/0x5)+parseInt(b4(0xa9))/0x6+-parseInt(b4(0x8e))/0x7+-parseInt(b4(0x9a))/0x8*(parseInt(b4(0x8f))/0x9)+parseInt(b4(0x95))/0xa;if(z===x)break;else y['push'](y['shift']());}catch(A){y['push'](y['shift']());}}}(a,0x2aed0));import{L as c,F as d,T as e,G,C as f,i as g,S as h,B as i,a as j,f as k,c as l,g as m,j as n,R as o,k as p,l as r,m as s,n as t,N as u}from'./ModelViewer.js';import{u as v}from'./fflate.module.js';import'vue';import'./index7.js';function a(){const bE=['4MlYTTO','triangles','millimeter','components','identifier','674130PnfkEn','data','nodeName','wrapT','material','getAttribute','name','generateMipmaps','19115rIcmaI','decode','none','THREE.3MFLoader:\x20Unsupported\x20resource\x20type.','position','build','Title','querySelector','availableExtensions','keys','clone','clamp','xml','substring','Copyright','value','basematerials','error','641157OghjIC','split','pid','model','parse','wrapS','push','objectId','44RSNIMk','pindex','ModificationDate','320250PGczOb','63eeqide','texture2dgroup','tilestyleu','resources','pbmetallicdisplayproperties','item','1375060RrQtVV','length','opacity','querySelectorAll','documentElement','321864SqWBrc','object','implicitfunction','match','target','charAt','vertices','texture','children','1214lexQVw'];a=function(){return bE;};return a();}const U=h;function b(c,d){c=c-0x81;const e=a();let f=e[c];return f;}class Be extends c{constructor(x){super(x),this['availableExtensions']=[];}['load'](x,y,z,A){const B=this,F=new d(B['manager']);F['setPath'](B['path']),F['setResponseType']('arraybuffer'),F['setRequestHeader'](B['requestHeader']),F['setWithCredentials'](B['withCredentials']),F['load'](x,function(H){const b5=b;try{y(B[b5(0x87)](H));}catch(N){A?A(N):console['error'](N),B['manager']['itemError'](x);}},z,A);}[b6(0x87)](x){const y=this,A=new e(this['manager']);function B(az){const b7=b;let aA=null,aB=null,aC,aD;const aE=[],aF=[];let aG;const aH={},aI={},aJ={},aK=new TextDecoder();try{aA=v(new Uint8Array(az));}catch(aP){if(aP instanceof ReferenceError)return console['error']('THREE.3MFLoader:\x20fflate\x20missing\x20and\x20file\x20is\x20compressed.'),null;}let aL=null;for(aB in aA)aB['match'](/\_rels\/.rels$/)?aC=aB:aB['match'](/3D\/_rels\/.*\.model\.rels$/)?aD=aB:aB[b7(0x9d)](/^3D\/[^\/]*\.model$/)?aL=aB:aB['match'](/^3D\/.*\/.*\.model$/)?aE['push'](aB):aB[b7(0x9d)](/^3D\/Textures?\/.*/)&&aF['push'](aB);if(aE['push'](aL),aC===void 0x0)throw new Error('THREE.ThreeMFLoader:\x20Cannot\x20find\x20relationship\x20file\x20`rels`\x20in\x203MF\x20archive.');const aM=aA[aC],aN=aK[b7(0xb2)](aM),aO=F(aN);if(aD){const aQ=aA[aD],aR=aK['decode'](aQ);aG=F(aR);}for(let aS=0x0;aS<aE['length'];aS++){const aT=aE[aS],aU=aA[aT],aV=aK[b7(0xb2)](aU),aW=new DOMParser()['parseFromString'](aV,'application/xml');aW[b7(0x99)][b7(0xab)]['toLowerCase']()!=='model'&&console[b7(0x82)]('THREE.3MFLoader:\x20Error\x20loading\x203MF\x20-\x20no\x203MF\x20document\x20found:\x20',aT);const aX=aW[b7(0xb8)]('model'),aY={};for(let b0=0x0;b0<aX['attributes']['length'];b0++){const b1=aX['attributes'][b0];b1['name']['match'](/^xmlns:(.+)$/)&&(aY[b1['value']]=RegExp['$1']);}const aZ=af(aX);aZ[b7(0xbd)]=aX,0x0<Object['keys'](aY)['length']&&(aZ['extensions']=aY),aH[aT]=aZ;}for(let b2=0x0;b2<aF['length'];b2++){const b3=aF[b2];aJ[b3]=aA[b3]['buffer'];}return{'rels':aO,'modelRels':aG,'model':aH,'printTicket':aI,'texture':aJ};}function F(az){const b8=b,aA=[],aB=new DOMParser()['parseFromString'](az,'application/xml')[b8(0x98)]('Relationship');for(let aC=0x0;aC<aB['length'];aC++){const aD=aB[aC],aE={'target':aD['getAttribute']('Target'),'id':aD['getAttribute']('Id'),'type':aD['getAttribute']('Type')};aA['push'](aE);}return aA;}function N(az){const b9=b,aA={};for(let aB=0x0;aB<az['length'];aB++){const aC=az[aB],aD=aC['getAttribute']('name');0x0<=[b9(0xb7),'Designer','Description',b9(0xbf),'LicenseTerms','Rating','CreationDate',b9(0x8d)]['indexOf'](aD)&&(aA[aD]=aC['textContent']);}return aA;}function W(az){const ba=b,aA={'id':az[ba(0xae)]('id'),'basematerials':[]},aB=az[ba(0x98)]('base');for(let aC=0x0;aC<aB['length'];aC++){const aD=aB[aC],aE=a6(aD);aE['index']=aC,aA[ba(0x81)]['push'](aE);}return aA;}function a0(az){const bb=b;return{'id':az['getAttribute']('id'),'path':az['getAttribute']('path'),'contenttype':az['getAttribute']('contenttype'),'tilestyleu':az['getAttribute'](bb(0x91)),'tilestylev':az['getAttribute']('tilestylev'),'filter':az['getAttribute']('filter')};}function a1(az){const aA={'id':az['getAttribute']('id'),'texid':az['getAttribute']('texid'),'displaypropertiesid':az['getAttribute']('displaypropertiesid')},aB=az['querySelectorAll']('tex2coord'),aC=[];for(let aD=0x0;aD<aB['length'];aD++){const aE=aB[aD],aF=aE['getAttribute']('u'),aG=aE['getAttribute']('v');aC['push'](parseFloat(aF),parseFloat(aG));}return aA['uvs']=new Float32Array(aC),aA;}function a2(az){const bc=b,aA={'id':az['getAttribute']('id'),'displaypropertiesid':az['getAttribute']('displaypropertiesid')},aB=az['querySelectorAll']('color'),aC=[],aD=new f();for(let aE=0x0;aE<aB['length'];aE++){const aF=aB[aE][bc(0xae)]('color');aD['setStyle'](aF['substring'](0x0,0x7),U),aC['push'](aD['r'],aD['g'],aD['b']);}return aA['colors']=new Float32Array(aC),aA;}function a3(az){const bd=b,aA=az['children'],aB={};for(let aC=0x0;aC<aA[bd(0x96)];aC++){const aD={'type':aA[aC]['nodeName']['substring'](0x2)};for(let aE=0x0;aE<aA[aC]['attributes']['length'];aE++){const aF=aA[aC]['attributes'][aE];aF['specified']&&(aD[aF[bd(0xaf)]]=aF[bd(0xc0)]);}aB[aA[aC]['getAttribute']('identifier')]=aD;}return aB;}function a4(az){const be=b,aA={'id':az['getAttribute']('id'),'displayname':az['getAttribute']('displayname')},aB=az['children'],aC={};for(let aD=0x0;aD<aB['length'];aD++){const aE=aB[aD];if(aE['nodeName']==='i:in'||aE['nodeName']==='i:out')aC[aE[be(0xab)]==='i:in'?'inputs':'outputs']=a3(aE);else{const aF=aE[be(0xa2)],aG={'op':aE['nodeName']['substring'](0x2),'identifier':aE['getAttribute']('identifier')};for(let aH=0x0;aH<aF['length'];aH++)aG[aF[aH][be(0xab)]['substring'](0x2)]=a3(aF[aH]);aC[aG[be(0xa8)]]=aG;}}return aA['operations']=aC,aA;}function a5(az){const bf=b,aA={'id':az[bf(0xae)]('id')},aB=az[bf(0x98)]('pbmetallic'),aC=[];for(let aD=0x0;aD<aB['length'];aD++){const aE=aB[aD];aC['push']({'name':aE['getAttribute']('name'),'metallicness':parseFloat(aE[bf(0xae)]('metallicness')),'roughness':parseFloat(aE['getAttribute']('roughness'))});}return aA[bf(0xaa)]=aC,aA;}function a6(az){const bg=b,aA={};return aA[bg(0xaf)]=az['getAttribute']('name'),aA['displaycolor']=az[bg(0xae)]('displaycolor'),aA['displaypropertiesid']=az['getAttribute']('displaypropertiesid'),aA;}function a7(az){const bh=b,aA={},aB=[],aC=az['querySelectorAll']('vertices\x20vertex');for(let aG=0x0;aG<aC['length'];aG++){const aH=aC[aG],aI=aH['getAttribute']('x'),aJ=aH['getAttribute']('y'),aK=aH['getAttribute']('z');aB['push'](parseFloat(aI),parseFloat(aJ),parseFloat(aK));}aA['vertices']=new Float32Array(aB);const aD=[],aE=[],aF=az['querySelectorAll']('triangles\x20triangle');for(let aL=0x0;aL<aF[bh(0x96)];aL++){const aM=aF[aL],aN=aM['getAttribute']('v1'),aO=aM['getAttribute']('v2'),aP=aM['getAttribute']('v3'),aQ=aM['getAttribute']('p1'),aR=aM['getAttribute']('p2'),aS=aM[bh(0xae)]('p3'),aT=aM['getAttribute']('pid'),aU={};aU['v1']=parseInt(aN,0xa),aU['v2']=parseInt(aO,0xa),aU['v3']=parseInt(aP,0xa),aE['push'](aU['v1'],aU['v2'],aU['v3']),aQ&&(aU['p1']=parseInt(aQ,0xa)),aR&&(aU['p2']=parseInt(aR,0xa)),aS&&(aU['p3']=parseInt(aS,0xa)),aT&&(aU['pid']=aT),0x0<Object[bh(0xba)](aU)['length']&&aD['push'](aU);}return aA['triangleProperties']=aD,aA['triangles']=new Uint32Array(aE),aA;}function a8(az){const aA=[],aB=az['querySelectorAll']('component');for(let aC=0x0;aC<aB['length'];aC++){const aD=aB[aC],aE=a9(aD);aA['push'](aE);}return aA;}function a9(az){const bi=b,aA={};aA['objectId']=az['getAttribute']('objectid');const aB=az[bi(0xae)]('transform');return aB&&(aA['transform']=aa(aB)),aA;}function aa(az){const bj=b,aA=[];az[bj(0x84)]('\x20')['forEach'](function(aC){const bk=bj;aA[bk(0x89)](parseFloat(aC));});const aB=new g();return aB['set'](aA[0x0],aA[0x3],aA[0x6],aA[0x9],aA[0x1],aA[0x4],aA[0x7],aA[0xa],aA[0x2],aA[0x5],aA[0x8],aA[0xb],0x0,0x0,0x0,0x1),aB;}function ab(az){const bl=b,aA={'type':az['getAttribute']('type')},aB=az['getAttribute']('id');aB&&(aA['id']=aB);const aC=az[bl(0xae)]('pid');aC&&(aA['pid']=aC);const aD=az['getAttribute']('pindex');aD&&(aA['pindex']=aD);const aE=az['getAttribute']('thumbnail');aE&&(aA['thumbnail']=aE);const aF=az['getAttribute']('partnumber');aF&&(aA['partnumber']=aF);const aG=az['getAttribute'](bl(0xaf));aG&&(aA['name']=aG);const aH=az['querySelector']('mesh');aH&&(aA['mesh']=a7(aH));const aI=az['querySelector']('components');return aI&&(aA[bl(0xa7)]=a8(aI)),aA;}function ac(az){const bm=b,aA={};aA[bm(0x81)]={};const aB=az['querySelectorAll']('basematerials');for(let aI=0x0;aI<aB['length'];aI++){const aJ=aB[aI],aK=W(aJ);aA['basematerials'][aK['id']]=aK;}aA['texture2d']={};const aC=az['querySelectorAll']('texture2d');for(let aL=0x0;aL<aC['length'];aL++){const aM=aC[aL],aN=a0(aM);aA['texture2d'][aN['id']]=aN;}aA['colorgroup']={};const aD=az['querySelectorAll']('colorgroup');for(let aO=0x0;aO<aD['length'];aO++){const aP=aD[aO],aQ=a2(aP);aA['colorgroup'][aQ['id']]=aQ;}const aE=az[bm(0x98)](bm(0x9c));aE['length']>0x0&&(aA['implicitfunction']={});for(let aR=0x0;aR<aE['length'];aR++){const aS=aE[aR],aT=a4(aS);aA['implicitfunction'][aT['id']]=aT;}aA['pbmetallicdisplayproperties']={};const aF=az['querySelectorAll'](bm(0x93));for(let aU=0x0;aU<aF[bm(0x96)];aU++){const aV=aF[aU],aW=a5(aV);aA['pbmetallicdisplayproperties'][aW['id']]=aW;}aA['texture2dgroup']={};const aG=az['querySelectorAll'](bm(0x90));for(let aX=0x0;aX<aG['length'];aX++){const aY=aG[aX],aZ=a1(aY);aA['texture2dgroup'][aZ['id']]=aZ;}aA['object']={};const aH=az['querySelectorAll']('object');for(let b0=0x0;b0<aH['length'];b0++){const b1=aH[b0],b2=ab(b1);aA['object'][b2['id']]=b2;}return aA;}function ad(az){const bn=b,aA=[],aB=az['querySelectorAll'](bn(0x94));for(let aC=0x0;aC<aB['length'];aC++){const aD=aB[aC],aE={'objectId':aD['getAttribute']('objectid')},aF=aD['getAttribute']('transform');aF&&(aE['transform']=aa(aF)),aA['push'](aE);}return aA;}function af(az){const bo=b,aA={'unit':az['getAttribute']('unit')||bo(0xa6)},aB=az['querySelectorAll']('metadata');aB&&(aA['metadata']=N(aB));const aC=az['querySelector']('resources');aC&&(aA[bo(0x92)]=ac(aC));const aD=az['querySelector']('build');return aD&&(aA[bo(0xb6)]=ad(aD)),aA;}function ag(az,aA,aB,aC){const bp=b,aD=az['texid'],aE=aB[bp(0x92)]['texture2d'][aD];if(aE){const aF=aC[aE['path']],aG=aE['contenttype'],aH=new Blob([aF],{'type':aG}),aI=URL['createObjectURL'](aH),aJ=A['load'](aI,function(){URL['revokeObjectURL'](aI);});switch(aJ['colorSpace']=U,aE['tilestyleu']){case'wrap':aJ['wrapS']=o;break;case'mirror':aJ[bp(0x88)]=r;break;case'none':case bp(0xbc):aJ['wrapS']=p;break;default:aJ['wrapS']=o;}switch(aE['tilestylev']){case'wrap':aJ['wrapT']=o;break;case'mirror':aJ[bp(0xac)]=r;break;case bp(0xb3):case bp(0xbc):aJ['wrapT']=p;break;default:aJ['wrapT']=o;}switch(aE['filter']){case'auto':aJ['magFilter']=s,aJ['minFilter']=t;break;case'linear':aJ['magFilter']=s,aJ['minFilter']=s,aJ[bp(0xb0)]=!0x1;break;case'nearest':aJ['magFilter']=u,aJ['minFilter']=u,aJ['generateMipmaps']=!0x1;break;default:aJ['magFilter']=s,aJ['minFilter']=t;}return aJ;}else return null;}function ah(az,aA,aB,aC,aD,aE,aF){const bq=b,aG=aF['pindex'],aH={};for(let aK=0x0,aL=aA['length'];aK<aL;aK++){const aM=aA[aK],aN=aM['p1']!==void 0x0?aM['p1']:aG;aH[aN]===void 0x0&&(aH[aN]=[]),aH[aN]['push'](aM);}const aI=Object[bq(0xba)](aH),aJ=[];for(let aO=0x0,aP=aI[bq(0x96)];aO<aP;aO++){const aQ=aI[aO],aR=aH[aQ],aS=az['basematerials'][aQ],aT=aq(aS,aC,aD,aE,aF,ar),aU=new i(),aV=[],aW=aB[bq(0xa0)];for(let aY=0x0,aZ=aR['length'];aY<aZ;aY++){const b0=aR[aY];aV[bq(0x89)](aW[b0['v1']*0x3+0x0]),aV['push'](aW[b0['v1']*0x3+0x1]),aV['push'](aW[b0['v1']*0x3+0x2]),aV[bq(0x89)](aW[b0['v2']*0x3+0x0]),aV['push'](aW[b0['v2']*0x3+0x1]),aV[bq(0x89)](aW[b0['v2']*0x3+0x2]),aV['push'](aW[b0['v3']*0x3+0x0]),aV['push'](aW[b0['v3']*0x3+0x1]),aV['push'](aW[b0['v3']*0x3+0x2]);}aU['setAttribute'](bq(0xb5),new j(aV,0x3));const aX=new k(aU,aT);aJ['push'](aX);}return aJ;}function ai(az,aA,aB,aC,aD,aE,aF){const br=b,aG=new i(),aH=[],aI=[],aJ=aB['vertices'],aK=az['uvs'];for(let aN=0x0,aO=aA[br(0x96)];aN<aO;aN++){const aP=aA[aN];aH['push'](aJ[aP['v1']*0x3+0x0]),aH['push'](aJ[aP['v1']*0x3+0x1]),aH['push'](aJ[aP['v1']*0x3+0x2]),aH[br(0x89)](aJ[aP['v2']*0x3+0x0]),aH['push'](aJ[aP['v2']*0x3+0x1]),aH[br(0x89)](aJ[aP['v2']*0x3+0x2]),aH['push'](aJ[aP['v3']*0x3+0x0]),aH[br(0x89)](aJ[aP['v3']*0x3+0x1]),aH[br(0x89)](aJ[aP['v3']*0x3+0x2]),aI['push'](aK[aP['p1']*0x2+0x0]),aI['push'](aK[aP['p1']*0x2+0x1]),aI['push'](aK[aP['p2']*0x2+0x0]),aI['push'](aK[aP['p2']*0x2+0x1]),aI['push'](aK[aP['p3']*0x2+0x0]),aI['push'](aK[aP['p3']*0x2+0x1]);}aG['setAttribute']('position',new j(aH,0x3)),aG['setAttribute']('uv',new j(aI,0x2));const aL=aq(az,aC,aD,aE,aF,ag),aM=new l({'map':aL,'flatShading':!0x0});return new k(aG,aM);}function aj(az,aA,aB,aC){const bs=b,aD=new i(),aE=[],aF=[],aG=aB[bs(0xa0)],aH=az['colors'];for(let aJ=0x0,aK=aA['length'];aJ<aK;aJ++){const aL=aA[aJ],aM=aL['v1'],aN=aL['v2'],aO=aL['v3'];aE['push'](aG[aM*0x3+0x0]),aE[bs(0x89)](aG[aM*0x3+0x1]),aE[bs(0x89)](aG[aM*0x3+0x2]),aE['push'](aG[aN*0x3+0x0]),aE['push'](aG[aN*0x3+0x1]),aE['push'](aG[aN*0x3+0x2]),aE['push'](aG[aO*0x3+0x0]),aE['push'](aG[aO*0x3+0x1]),aE['push'](aG[aO*0x3+0x2]);const aP=aL['p1']!==void 0x0?aL['p1']:aC[bs(0x8c)],aQ=aL['p2']!==void 0x0?aL['p2']:aP,aR=aL['p3']!==void 0x0?aL['p3']:aP;aF['push'](aH[aP*0x3+0x0]),aF['push'](aH[aP*0x3+0x1]),aF['push'](aH[aP*0x3+0x2]),aF['push'](aH[aQ*0x3+0x0]),aF['push'](aH[aQ*0x3+0x1]),aF['push'](aH[aQ*0x3+0x2]),aF[bs(0x89)](aH[aR*0x3+0x0]),aF[bs(0x89)](aH[aR*0x3+0x1]),aF['push'](aH[aR*0x3+0x2]);}aD['setAttribute']('position',new j(aE,0x3)),aD['setAttribute']('color',new j(aF,0x3));const aI=new l({'vertexColors':!0x0,'flatShading':!0x0});return new k(aD,aI);}function ak(az){const bt=b,aA=new i();aA['setIndex'](new m(az[bt(0xa5)],0x1)),aA['setAttribute']('position',new m(az['vertices'],0x3));const aB=new l({'name':c['DEFAULT_MATERIAL_NAME'],'color':0xffffff,'flatShading':!0x0});return new k(aA,aB);}function al(az,aA,aB,aC,aD,aE){const bu=b,aF=Object[bu(0xba)](az),aG=[];for(let aH=0x0,aI=aF['length'];aH<aI;aH++){const aJ=aF[aH],aK=az[aJ];switch(am(aJ,aC)){case'material':const aL=aC['resources']['basematerials'][aJ],aM=ah(aL,aK,aA,aB,aC,aD,aE);for(let aP=0x0,aQ=aM['length'];aP<aQ;aP++)aG['push'](aM[aP]);break;case'texture':const aN=aC[bu(0x92)]['texture2dgroup'][aJ];aG['push'](ai(aN,aK,aA,aB,aC,aD,aE));break;case'vertexColors':const aO=aC[bu(0x92)]['colorgroup'][aJ];aG['push'](aj(aO,aK,aA,aE));break;case'default':aG['push'](ak(aA));break;default:console['error'](bu(0xb4));}}if(aE['name']){for(let aR=0x0;aR<aG['length'];aR++)aG[aR]['name']=aE['name'];}return aG;}function am(az,aA){const bv=b;return aA['resources']['texture2dgroup'][az]!==void 0x0?bv(0xa1):aA['resources']['basematerials'][az]!==void 0x0?bv(0xad):aA['resources']['colorgroup'][az]!==void 0x0?'vertexColors':az==='default'?'default':void 0x0;}function an(az,aA){const bw=b,aB={},aC=az['triangleProperties'],aD=aA['pid'];for(let aE=0x0,aF=aC['length'];aE<aF;aE++){const aG=aC[aE];let aH=aG['pid']!==void 0x0?aG[bw(0x85)]:aD;aH===void 0x0&&(aH='default'),aB[aH]===void 0x0&&(aB[aH]=[]),aB[aH]['push'](aG);}return aB;}function ao(az,aA,aB,aC,aD){const aE=new G(),aF=an(az,aD),aG=al(aF,az,aA,aB,aC,aD);for(let aH=0x0,aI=aG['length'];aH<aI;aH++)aE['add'](aG[aH]);return aE;}function ap(az,aA,aB){const bx=b;if(!az)return;const aC=[],aD=Object['keys'](az);for(let aE=0x0;aE<aD[bx(0x96)];aE++){const aF=aD[aE];for(let aG=0x0;aG<y[bx(0xb9)]['length'];aG++){const aH=y['availableExtensions'][aG];aH['ns']===aF&&aC['push'](aH);}}for(let aI=0x0;aI<aC[bx(0x96)];aI++){const aJ=aC[aI];aJ['apply'](aB,az[aJ['ns']],aA);}}function aq(az,aA,aB,aC,aD,aE){return az['build']!==void 0x0||(az['build']=aE(az,aA,aB,aC,aD)),az['build'];}function ar(az,aA,aB){const by=b;let aC;const aD=az['displaypropertiesid'],aE=aB['resources'][by(0x93)];if(aD!==null&&aE[aD]!==void 0x0){const aH=aE[aD][by(0xaa)][az['index']];aC=new n({'flatShading':!0x0,'roughness':aH['roughness'],'metalness':aH['metallicness']});}else aC=new l({'flatShading':!0x0});aC['name']=az['name'];const aF=az['displaycolor'],aG=aF['substring'](0x0,0x7);return aC['color']['setStyle'](aG,U),aF['length']===0x9&&(aC[by(0x97)]=parseInt(aF[by(0x9f)](0x7)+aF['charAt'](0x8),0x10)/0xff),aC;}function as(az,aA,aB,aC){const bz=b,aD=new G();for(let aE=0x0;aE<az[bz(0x96)];aE++){const aF=az[aE];let aG=aA[aF['objectId']];aG===void 0x0&&(at(aF[bz(0x8a)],aA,aB,aC),aG=aA[aF['objectId']]);const aH=aG[bz(0xbb)](),aI=aF['transform'];aI&&aH['applyMatrix4'](aI),aD['add'](aH);}return aD;}function at(az,aA,aB,aC){const bA=b,aD=aB[bA(0x92)]['object'][az];if(aD['mesh']){const aE=aD['mesh'],aF=aB['extensions'],aG=aB['xml'];ap(aF,aE,aG),aA[aD['id']]=aq(aE,aA,aB,aC,aD,ao);}else{const aH=aD[bA(0xa7)];aA[aD['id']]=aq(aH,aA,aB,aC,aD,as);}aD['name']&&(aA[aD['id']][bA(0xaf)]=aD['name']),aB['resources']['implicitfunction']&&console['warn']('THREE.ThreeMFLoader:\x20Implicit\x20Functions\x20are\x20implemented\x20in\x20data-only.',aB[bA(0x92)][bA(0x9c)]);}function au(az){const bB=b,aA=az['model'],aB=az['modelRels'],aC={},aD=Object['keys'](aA),aE={};if(aB)for(let aF=0x0,aG=aB['length'];aF<aG;aF++){const aH=aB[aF],aI=aH['target']['substring'](0x1);az['texture'][aI]&&(aE[aH[bB(0x9e)]]=az['texture'][aI]);}for(let aJ=0x0;aJ<aD['length'];aJ++){const aK=aD[aJ],aL=aA[aK],aM=Object['keys'](aL['resources'][bB(0x9b)]);for(let aN=0x0;aN<aM['length'];aN++){const aO=aM[aN];at(aO,aC,aL,aE);}}return aC;}function av(az){const bC=b;for(let aA=0x0;aA<az['length'];aA++){const aB=az[aA];if(aB['target']['split']('.')['pop']()['toLowerCase']()===bC(0x86))return aB;}}function aw(az,aA){const bD=b,aB=new G(),aC=av(aA['rels']),aD=aA[bD(0x86)][aC[bD(0x9e)][bD(0xbe)](0x1)]['build'];for(let aE=0x0;aE<aD['length'];aE++){const aF=aD[aE],aG=az[aF['objectId']]['clone'](),aH=aF['transform'];aH&&aG['applyMatrix4'](aH),aB['add'](aG);}return aB;}const ax=B(x),ay=au(ax);return aw(ay,ax);}['addExtension'](x){this['availableExtensions']['push'](x);}}export{Be as ThreeMFLoader};