file-viewer3 1.0.8 → 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.
- package/LICENSE +160 -0
- package/README.en.md +390 -0
- package/README.md +306 -89
- package/dist/_headers +22 -0
- package/dist/assets/3MFLoader--yjh7udp.js +1 -0
- package/dist/assets/AMFLoader-C0y7NIAO.js +1 -0
- package/dist/assets/ArchiveViewer-6AvBZVl3.js +2 -0
- package/dist/assets/ArchiveViewer-B2pHxHFv.css +1 -0
- package/dist/assets/AudioViewer-0CSMvCtp.css +1 -0
- package/dist/assets/AudioViewer-6a_DDcur.js +1 -0
- package/dist/assets/CadViewer-A9PKtCth.css +1 -0
- package/dist/assets/CadViewer-D94LUXKO.js +110 -0
- package/dist/assets/CodeViewer-BdZGsbFh.js +2 -0
- package/dist/assets/CodeViewer-CR2CsPRi.css +1 -0
- package/dist/assets/ColladaLoader-DTiuvWJL.js +3 -0
- package/dist/assets/DrawingViewer-BplS278E.js +2 -0
- package/dist/assets/DrawingViewer-DXiF5YWV.css +1 -0
- package/dist/assets/EdaViewer-BXH1Jmwr.js +8 -0
- package/dist/assets/EdaViewer-CKf1YQnh.css +1 -0
- package/dist/assets/EmailViewer-BsBKZ_A5.js +4 -0
- package/dist/assets/EmailViewer-BwvGE4ns.css +1 -0
- package/dist/assets/EpubViewer-Cci0l1Vm.css +1 -0
- package/dist/assets/EpubViewer-DlGzr8_x.js +2 -0
- package/dist/assets/FBXLoader-Bj34Z_uf.js +1 -0
- package/dist/assets/GLTFLoader-BNUIXeRP.js +1 -0
- package/dist/assets/ImageViewer-BKp7YpMs.css +10 -0
- package/dist/assets/ImageViewer-D1Yc0jYg.js +1 -0
- package/dist/assets/KMZLoader-DTmXWzX_.js +1 -0
- package/dist/assets/MarkdownViewer-CIljbLlu.css +1 -0
- package/dist/assets/MarkdownViewer-CRi0rhWw.js +64 -0
- package/dist/assets/ModelViewer-C4ir9AyI.css +1 -0
- package/dist/assets/ModelViewer-yxcVdLzz.js +2 -0
- package/dist/assets/OBJLoader-DW4Mv-mq.js +5 -0
- package/dist/assets/OfdViewer-DbkG1-Bp.js +2 -0
- package/dist/assets/OfdViewer-Ulv-WZWh.css +1 -0
- package/dist/assets/PCDLoader-CHA1g8rk.js +3 -0
- package/dist/assets/PLYLoader-DwTzA-Dg.js +2 -0
- package/dist/assets/PdfView-_Uu48dkU.js +558 -0
- package/dist/assets/PdfView-fKwbB_8j.css +1 -0
- package/dist/assets/PptxRender-BNoW_9_0.css +1 -0
- package/dist/assets/PptxRender-myCCfHiR.js +32 -0
- package/dist/assets/STLLoader-Bt7FMgMu.js +1 -0
- package/dist/assets/TDSLoader-D__OhSS9.js +1 -0
- package/dist/assets/TypstViewer-4dMAIp9x.js +60 -0
- package/dist/assets/TypstViewer-BgYR02wU.css +1 -0
- package/dist/assets/USDLoader-BovI5HgZ.js +6 -0
- package/dist/assets/UmdViewer-BfIWw5dV.js +3 -0
- package/dist/assets/UmdViewer-DpObj56a.css +1 -0
- package/dist/assets/VRMLLoader-_VxVXPvX.js +140 -0
- package/dist/assets/VTKLoader-BfnzBXsa.js +3 -0
- package/dist/assets/XYZLoader-DbQZs-aZ.js +2 -0
- package/dist/assets/XlsxTable-CKmWT6Iw.js +5 -0
- package/dist/assets/XlsxTable-Ccp_ksQc.css +1 -0
- package/dist/assets/__vite-browser-external-j1Zxnfxm.js +1 -0
- package/dist/assets/ar-SA-G6X2FPQ2-h0GtAVoD.js +10 -0
- package/dist/assets/arc-C_eH0vTw.js +1 -0
- package/dist/assets/architecture-7EHR7CIX-nPLvVkG5.js +1 -0
- package/dist/assets/architectureDiagram-3BPJPVTR-Cx8fJaC_.js +36 -0
- package/dist/assets/archive-D-0w4Z7t.js +2 -0
- package/dist/assets/audio-IkwcqgJA.js +2 -0
- package/dist/assets/az-AZ-76LH7QW2-D_aQ-6Zd.js +1 -0
- package/dist/assets/bash-LmRjUKlR.js +1 -0
- package/dist/assets/bg-BG-XCXSNQG7-H7Czia1L.js +5 -0
- package/dist/assets/blockDiagram-GPEHLZMM-v3Efy6dm.js +132 -0
- package/dist/assets/bn-BD-2XOGV67Q-f6ymEr9g.js +5 -0
- package/dist/assets/c4Diagram-AAUBKEIU-BdstYnMv.js +10 -0
- package/dist/assets/ca-ES-6MX7JW3Y-DTzyqWmS.js +8 -0
- package/dist/assets/cad-DFnQbJJO.js +2 -0
- package/dist/assets/cfb-Bv6fOQ4m.js +11 -0
- package/dist/assets/channel-C66J400U.js +1 -0
- package/dist/assets/chunk-2J33WTMH-BoyKZPbs.js +1 -0
- package/dist/assets/chunk-3OPIFGDE-a_QAVzsM.js +62 -0
- package/dist/assets/chunk-4BX2VUAB-DZj4_o2K.js +1 -0
- package/dist/assets/chunk-55IACEB6-C7hP08Mf.js +1 -0
- package/dist/assets/chunk-5ZQYHXKU-DBQ_7Zc2.js +2 -0
- package/dist/assets/chunk-6U3AYISY-C6-Mtja1.js +12 -0
- package/dist/assets/chunk-727SXJPM-BVNP_kQ-.js +206 -0
- package/dist/assets/chunk-AGHRB4JF-DrBKq3qz.js +1 -0
- package/dist/assets/chunk-AQP2D5EJ-0N6k4ROT.js +231 -0
- package/dist/assets/chunk-BSJP7CBP-b8olRIQO.js +1 -0
- package/dist/assets/chunk-CSCIHK7Q-B5j-yHKS.js +124 -0
- package/dist/assets/chunk-EIO257PC-C6qii-N9.js +22 -0
- package/dist/assets/chunk-FMBD7UC4-CBBZh2UU.js +15 -0
- package/dist/assets/chunk-K2UTITRG-Cx4xt2xV.js +35 -0
- package/dist/assets/chunk-KSCS5N6A-Dwg0HTxH.js +10 -0
- package/dist/assets/chunk-L5ZTLDWV-BPuCpePB.js +1 -0
- package/dist/assets/chunk-LZXEDZCA-CvLuVK3G.js +2 -0
- package/dist/assets/chunk-ND2GUHAM-CWJPhGEg.js +1 -0
- package/dist/assets/chunk-NNHCCRGN-DlpIbxXb.js +159 -0
- package/dist/assets/chunk-NZK2D7GU-DuaLWEa1.js +1 -0
- package/dist/assets/chunk-O5CBEL6O-dK2KeDfH.js +70 -0
- package/dist/assets/chunk-QZHKN3VN-4Bf82riF.js +1 -0
- package/dist/assets/chunk-SRAX5OIU-BhbLEiib.js +1 -0
- package/dist/assets/chunk-WU5MYG2G-DLkui5D2.js +1 -0
- package/dist/assets/chunk-XPW4576I-BvXQTKbm.js +32 -0
- package/dist/assets/chunk-Z3N5DIM6-D9TMVU7m.js +1 -0
- package/dist/assets/chunk-ZUYEQ4TG-BzFOpW--.js +7 -0
- package/dist/assets/classDiagram-4FO5ZUOK-DKj6zlra.js +1 -0
- package/dist/assets/classDiagram-v2-Q7XG4LA2-DKj6zlra.js +1 -0
- package/dist/assets/compare-BA1y8ff-.css +1 -0
- package/dist/assets/compare-QN3IusOj.js +1 -0
- package/dist/assets/compiler-qgJWLAtm.js +1 -0
- package/dist/assets/core-S5OLGxXP.js +3 -0
- package/dist/assets/cose-bilkent-S5V4N54A-CslZOqNN.js +1 -0
- package/dist/assets/cpp-V0F2hNk9.js +1 -0
- package/dist/assets/cs-CZ-2BRQDIVT-BRw0NNL_.js +11 -0
- package/dist/assets/csharp-GZmu99Fo.js +1 -0
- package/dist/assets/css-D5l_8KUR.js +1 -0
- package/dist/assets/cytoscape.esm-C8YCVR3_.js +321 -0
- package/dist/assets/da-DK-5WZEPLOC-q5u_UoZe.js +5 -0
- package/dist/assets/dagre-BM42HDAG-D6fpH9H3.js +4 -0
- package/dist/assets/dagre-Bx709z4p.js +1 -0
- package/dist/assets/de-DE-XR44H4JA-B79lsSt9.js +8 -0
- package/dist/assets/defaultLocale-C8Fc0cco.js +1 -0
- package/dist/assets/diagram-2AECGRRQ-DGviV3zF.js +43 -0
- package/dist/assets/diagram-5GNKFQAL-D8edmK5r.js +10 -0
- package/dist/assets/diagram-KO2AKTUF-DonC_-9l.js +3 -0
- package/dist/assets/diagram-LMA3HP47-T0-OD5uV.js +24 -0
- package/dist/assets/diagram-OG6HWLK6-BsRJiZE3.js +24 -0
- package/dist/assets/diff-CJb8JxGC.js +1 -0
- package/dist/assets/directory-open-01563666-D4xXyWb_.js +1 -0
- package/dist/assets/directory-open-4ed118d0-1i309Asm.js +1 -0
- package/dist/assets/dist-ND9DUPs_.js +1 -0
- package/dist/assets/dist-S-2Hyh3N.js +1 -0
- package/dist/assets/dist-jshluroQ.js +27 -0
- package/dist/assets/docx-preview-CAHEyNQy.js +20 -0
- package/dist/assets/drawing-B3sCN7BX.js +2 -0
- package/dist/assets/ebook-DDycOGR3.js +2 -0
- package/dist/assets/eda-JxVOVy9j.js +2 -0
- package/dist/assets/el-GR-BZB4AONW-DVV0CNhT.js +10 -0
- package/dist/assets/email-D9tCfCzQ.js +2 -0
- package/dist/assets/en-B4ZKOASM-CpbJugBW.js +1 -0
- package/dist/assets/erDiagram-TEJ5UH35-O-dDoXsU.js +85 -0
- package/dist/assets/es-ES-U4NZUMDT-DUvN9FXg.js +9 -0
- package/dist/assets/eu-ES-A7QVB2H4-DV6UAZB_.js +11 -0
- package/dist/assets/eventmodeling-FCH6USID-BONfeu8r.js +1 -0
- package/dist/assets/fa-IR-HGAKTJCU-0ql2xhuq.js +8 -0
- package/dist/assets/fflate.module-BIQmJeC9.js +1 -0
- package/dist/assets/fi-FI-Z5N7JZ37-CxtRUMtw.js +6 -0
- package/dist/assets/file-open-002ab408-BHUWm0Sh.js +1 -0
- package/dist/assets/file-open-7c801643-DZtJT5zp.js +1 -0
- package/dist/assets/file-save-3189631c-CO9S4HFW.js +1 -0
- package/dist/assets/file-save-745eba88-Bwdfz6OZ.js +1 -0
- package/dist/assets/flowDiagram-I6XJVG4X-DsWkZiFB.js +162 -0
- package/dist/assets/fr-FR-RHASNOE6-CLi1nCBA.js +9 -0
- package/dist/assets/ganttDiagram-6RSMTGT7-r5IfYmu1.js +292 -0
- package/dist/assets/gitGraph-WXDBUCRP-BPjRwtiT.js +1 -0
- package/dist/assets/gitGraphDiagram-PVQCEYII-DGYT-2sl.js +106 -0
- package/dist/assets/gl-ES-HMX3MZ6V-NMLOwshd.js +10 -0
- package/dist/assets/global-compiler-D1EEBbpA.js +1 -0
- package/dist/assets/global-renderer-AKzBLvRw.js +1 -0
- package/dist/assets/go-B-PCS5zA.js +1 -0
- package/dist/assets/graphlib-B8gBHxth.js +1 -0
- package/dist/assets/he-IL-6SHJWFNN-BWPkP_3r.js +10 -0
- package/dist/assets/hi-IN-IWLTKZ5I-KNyxys-k.js +4 -0
- package/dist/assets/hu-HU-A5ZG7DT2-BjcxkVW9.js +7 -0
- package/dist/assets/id-ID-SAP4L64H-B-oUkzcH.js +10 -0
- package/dist/assets/image-6zdrB4g6.js +2 -0
- package/dist/assets/image-GAAHSSAO-7tK5sChZ.js +1 -0
- package/dist/assets/image-blob-reduce.esm-NzmDxm1v.js +2 -0
- package/dist/assets/info-J43DQDTF-sQY7EXUc.js +1 -0
- package/dist/assets/infoDiagram-5YYISTIA-Dzg1KIdJ.js +2 -0
- package/dist/assets/ini-B1CroMsf.js +1 -0
- package/dist/assets/init-D6jRqBbL.js +1 -0
- package/dist/assets/ishikawaDiagram-YF4QCWOH-C4gAmRlT.js +70 -0
- package/dist/assets/it-IT-JPQ66NNP-Bwud0QsX.js +11 -0
- package/dist/assets/ja-JP-DBVTYXUO-DgNQ5bjg.js +8 -0
- package/dist/assets/java-ChVphriW.js +1 -0
- package/dist/assets/javascript-w9aIBC1S.js +1 -0
- package/dist/assets/journeyDiagram-JHISSGLW-ofw85AZe.js +139 -0
- package/dist/assets/json-DS4EA3dC.js +1 -0
- package/dist/assets/jszip.min-C7VJhIfM.js +2 -0
- package/dist/assets/kaa-6HZHGXH3-BMz8LTXv.js +1 -0
- package/dist/assets/kab-KAB-ZGHBKWFO-B9w0Zir8.js +8 -0
- package/dist/assets/kanban-definition-UN3LZRKU-CljG07f4.js +89 -0
- package/dist/assets/katex-Vhh-h91d.js +257 -0
- package/dist/assets/kk-KZ-P5N5QNE5-2tUcaoKh.js +1 -0
- package/dist/assets/km-KH-HSX4SM5Z-_kaSqGhJ.js +11 -0
- package/dist/assets/ko-KR-MTYHY66A-CIjaox2B.js +9 -0
- package/dist/assets/ku-TR-6OUDTVRD-CkLMAwgC.js +9 -0
- package/dist/assets/lib-CxFoY_GP.js +6 -0
- package/dist/assets/libarchive-DknIq1tb.js +1 -0
- package/dist/assets/libarchive-DxGirPmi.wasm +0 -0
- package/dist/assets/linear-DAeDjlp3.js +1 -0
- package/dist/assets/logo-DG62cSZK.png +0 -0
- package/dist/assets/lt-LT-XHIRWOB4-BsH7UAds.js +3 -0
- package/dist/assets/lv-LV-5QDEKY6T-DH8to9BS.js +7 -0
- package/dist/assets/main-B8S7RFzE.js +4 -0
- package/dist/assets/main-BZ1u3qpM.css +1 -0
- package/dist/assets/markdown-C8bVcNXx.js +1 -0
- package/dist/assets/md-OHaN-Ra2.js +2 -0
- package/dist/assets/mermaid-parser.core-DX-qibXo.js +4 -0
- package/dist/assets/mindmap-definition-RKZ34NQL-5NZ4x9hJ.js +96 -0
- package/dist/assets/model-B6Ua5SnP.js +2 -0
- package/dist/assets/mp4-Dho29Zd7.js +1 -0
- package/dist/assets/mr-IN-CRQNXWMA-BrKaFNSo.js +13 -0
- package/dist/assets/my-MM-5M5IBNSE-BZSEmctA.js +1 -0
- package/dist/assets/nb-NO-T6EIAALU-6a9gavJA.js +10 -0
- package/dist/assets/nestedRender-vUCW8qgY.js +3 -0
- package/dist/assets/nl-NL-IS3SIHDZ-uxPhLMYz.js +8 -0
- package/dist/assets/nn-NO-6E72VCQL-D4PNCwHO.js +8 -0
- package/dist/assets/oc-FR-POXYY2M6-C7kpaHdZ.js +8 -0
- package/dist/assets/ofd-CM51fmds.js +2 -0
- package/dist/assets/ofd-CsX4S_yH.js +6 -0
- package/dist/assets/ordinal-hYBb2elL.js +1 -0
- package/dist/assets/pa-IN-N4M65BXN-DudflUsb.js +4 -0
- package/dist/assets/package-BuR3Qm_h.css +1 -0
- package/dist/assets/package-DbhUOWuO.js +296 -0
- package/dist/assets/packet-YPE3B663-zJFiRlih.js +1 -0
- package/dist/assets/pdf-CZTifdsT.js +2 -0
- package/dist/assets/percentages-BXMCSKIN-DuKjcyNK.js +1 -0
- package/dist/assets/php-5k5YNuRS.js +2 -0
- package/dist/assets/pica-W1nY7k4k.js +2 -0
- package/dist/assets/pie-CZr-MxNa.js +1 -0
- package/dist/assets/pie-LRSECV5Y-ChrxPon2.js +1 -0
- package/dist/assets/pieDiagram-4H26LBE5-rqS9xOI6.js +30 -0
- package/dist/assets/pl-PL-T2D74RX3-BjwyDbo2.js +9 -0
- package/dist/assets/postal-mime-kkzCFkih.js +29 -0
- package/dist/assets/pptx-HCi3sDR0.js +2 -0
- package/dist/assets/printLayout-D2pf0W9y.js +24 -0
- package/dist/assets/prod-CAexHIHC.js +149 -0
- package/dist/assets/pt-BR-5N22H2LF-dhO4g53z.js +9 -0
- package/dist/assets/pt-PT-UZXXM6DQ-B0FVw5E6.js +9 -0
- package/dist/assets/python-DwhXSSGr.js +1 -0
- package/dist/assets/quadrantDiagram-W4KKPZXB-CvbA748i.js +7 -0
- package/dist/assets/radar-GUYGQ44K-Ch58tAlJ.js +1 -0
- package/dist/assets/reactivity.esm-bundler-Bfmlzvr-.js +1 -0
- package/dist/assets/renderer-69XMfifI.js +1 -0
- package/dist/assets/requirementDiagram-4Y6WPE33-Ek_Wtky1.js +84 -0
- package/dist/assets/ro-RO-JPDTUUEW-CRyQ9zJm.js +11 -0
- package/dist/assets/rough.esm-CIepY_sA.js +1 -0
- package/dist/assets/roundRect-D01gJrlt.js +1 -0
- package/dist/assets/ru-RU-B4JR7IUQ-Ccj6OqLf.js +9 -0
- package/dist/assets/runtime-core.esm-bundler-CR6OOEFf.js +1 -0
- package/dist/assets/rust-Dk33Kfe-.js +1 -0
- package/dist/assets/sankeyDiagram-5OEKKPKP-D3gZ6xE7.js +40 -0
- package/dist/assets/sequenceDiagram-3UESZ5HK-C5489xFA.js +162 -0
- package/dist/assets/si-LK-N5RQ5JYF-BwS2qaTv.js +1 -0
- package/dist/assets/sk-SK-C5VTKIMK-ly1tHoOw.js +6 -0
- package/dist/assets/sl-SI-NN7IZMDC-iZiOFm2y.js +6 -0
- package/dist/assets/sql-DWRKyvJ-.js +1 -0
- package/dist/assets/src-BrOGWJpF.js +1 -0
- package/dist/assets/src-D_n3k0l_.js +5 -0
- package/dist/assets/stateDiagram-AJRCARHV-1hoVbE34.js +1 -0
- package/dist/assets/stateDiagram-v2-BHNVJYJU-CZmypPHd.js +1 -0
- package/dist/assets/style-x1XGuNl0.css +1 -0
- package/dist/assets/subset-shared.chunk-CK2m59fy.js +1 -0
- package/dist/assets/subset-worker.chunk-B5G7hWyg.js +1 -0
- package/dist/assets/sv-SE-XGPEYMSR-BNpkY1PO.js +10 -0
- package/dist/assets/ta-IN-2NMHFXQM-DsldkrWk.js +9 -0
- package/dist/assets/text-CMp0EW11.js +2 -0
- package/dist/assets/th-TH-HPSO5L25-AVrKqKOh.js +2 -0
- package/dist/assets/three.module-BFsVh7r1.js +4104 -0
- package/dist/assets/time-B8nkukJS.js +1 -0
- package/dist/assets/timeline-definition-PNZ67QCA-CfMKM_FS.js +120 -0
- package/dist/assets/tr-TR-DEFEU3FU-DYarL0Oa.js +7 -0
- package/dist/assets/treeView-BLDUP644-CGGdcSoP.js +1 -0
- package/dist/assets/treemap-LRROVOQU-C3Zg5qig.js +1 -0
- package/dist/assets/typescript-BvteI6YB.js +1 -0
- package/dist/assets/typst-DOlgRigg.js +2 -0
- package/dist/assets/typst_ts_renderer_bg-DRRWm1TP.wasm +0 -0
- package/dist/assets/uk-UA-QMV73CPH-D36-a0jl.js +6 -0
- package/dist/assets/umd-r51rBtd2.js +2 -0
- package/dist/assets/vennDiagram-CIIHVFJN-GrdHiqIf.js +34 -0
- package/dist/assets/vi-VN-M7AON7JQ-zdUBY1Fz.js +5 -0
- package/dist/assets/wardley-L42UT6IY-ilBO1QYS.js +1 -0
- package/dist/assets/wardleyDiagram-YWT4CUSO-Cgr3uPws.js +78 -0
- package/dist/assets/wasm-C3ukMqzA.js +1 -0
- package/dist/assets/wasm-pack-shim-BShYmbRf.js +1 -0
- package/dist/assets/wasm-pack-shim-BnuNh1z7.js +1 -0
- package/dist/assets/word-DQCwLNG7.js +150 -0
- package/dist/assets/worker-bundle-Dx5mKZOL.js +6 -0
- package/dist/assets/worker-ref-BbTnHTC-.js +1 -0
- package/dist/assets/xlsx-B1qUDXfb.js +2 -0
- package/dist/assets/xlsx-ff7ER-JZ.png +0 -0
- package/dist/assets/xml-DasnpDVC.js +1 -0
- package/dist/assets/xychartDiagram-2RQKCTM6-BwoaSxOF.js +7 -0
- package/dist/assets/yaml-1XF8XcZB.js +1 -0
- package/dist/assets/zh-CN-LNUGB5OW-WQ7J6JkH.js +10 -0
- package/dist/assets/zh-HK-E62DVLB3-BoGXaBos.js +1 -0
- package/dist/assets/zh-TW-RAJ6MFWO-DZQOFop7.js +9 -0
- package/dist/compare.html +21 -0
- package/dist/example/README.md +137 -0
- package/dist/example/SOURCES.md +49 -0
- package/dist/example/app.log +13 -0
- package/dist/example/archive.tar.gz +0 -0
- package/dist/example/archive.zip +0 -0
- package/dist/example/audio.mp3 +0 -0
- package/dist/example/audio.ogg +0 -0
- package/dist/example/book.epub +0 -0
- package/dist/example/book.umd +0 -0
- package/dist/example/change.diff +40 -0
- package/dist/example/code.cjs +38 -0
- package/dist/example/code.css +64 -0
- package/dist/example/code.java +55 -0
- package/dist/example/code.js +55 -0
- package/dist/example/code.jsx +43 -0
- package/dist/example/code.mjs +36 -0
- package/dist/example/code.py +56 -0
- package/dist/example/code.ts +78 -0
- package/dist/example/code.tsx +36 -0
- package/dist/example/component.vue +68 -0
- package/dist/example/config.yaml +48 -0
- package/dist/example/config.yml +25 -0
- package/dist/example/data.json +50 -0
- package/dist/example/data.xml +47 -0
- package/dist/example/drawing.dxf +22186 -0
- package/dist/example/embedded.html +316 -0
- package/dist/example/excel.fods +0 -0
- package/dist/example/excel.numbers +0 -0
- package/dist/example/excel.ods +0 -0
- package/dist/example/excel.xls +0 -0
- package/dist/example/excel.xlsb +0 -0
- package/dist/example/excel.xlsm +0 -0
- package/dist/example/excel.xlsx +0 -0
- package/dist/example/flow.excalidraw +1 -0
- package/dist/example/index.php +44 -0
- package/dist/example/main.c +39 -0
- package/dist/example/main.cpp +50 -0
- package/dist/example/main.go +55 -0
- package/dist/example/main.h +22 -0
- package/dist/example/main.hpp +28 -0
- package/dist/example/main.rs +36 -0
- package/dist/example/markdown.md +84 -0
- package/dist/example/model.gltf +66 -0
- package/dist/example/model.obj +10 -0
- package/dist/example/model.ply +18 -0
- package/dist/example/model.step +9 -0
- package/dist/example/model.stl +30 -0
- package/dist/example/module.cc +36 -0
- package/dist/example/notes.markdown +15 -0
- package/dist/example/ofd.ofd +0 -0
- package/dist/example/page.htm +29 -0
- package/dist/example/page.html +33 -0
- package/dist/example/pdf.pdf +9125 -3
- package/dist/example/pic.bmp +0 -0
- package/dist/example/pic.gif +0 -0
- package/dist/example/pic.jpeg +0 -0
- package/dist/example/pic.jpg +0 -0
- package/dist/example/pic.png +0 -0
- package/dist/example/pic.tif +0 -0
- package/dist/example/pic.tiff +0 -0
- package/dist/example/pic.webp +0 -0
- package/dist/example/ppt.pptx +0 -0
- package/dist/example/process.drawio +249 -0
- package/dist/example/program.cs +42 -0
- package/dist/example/query.sql +30 -0
- package/dist/example/report.typ +90 -0
- package/dist/example/sample.dra +0 -0
- package/dist/example/sample.dwg +0 -0
- package/dist/example/sample.eml +46 -0
- package/dist/example/sample.msg +0 -0
- package/dist/example/sample.olb +0 -0
- package/dist/example/samples/apache/blocks_and_tables.dwf +0 -0
- package/dist/example/samples/autodesk/house.dwfx +0 -0
- package/dist/example/samples/autodesk/robot-arm.dwfx +0 -0
- package/dist/example/script.bash +36 -0
- package/dist/example/script.sh +24 -0
- package/dist/example/settings.ini +23 -0
- package/dist/example/table.csv +4 -0
- package/dist/example/template.dot +0 -0
- package/dist/example/test.doc +0 -0
- package/dist/example/text.txt +3 -0
- package/dist/example/vector.svg +6 -0
- package/dist/example/video.mp4 +0 -0
- package/dist/example/word.docx +0 -0
- package/dist/index.html +302 -0
- package/dist/vendor/libarchive/libarchive.wasm +0 -0
- package/dist/vendor/libarchive/worker-bundle.js +6 -0
- package/dist/wasm/cad/dwfv-render.wasm +0 -0
- package/dist/wasm/cad/dwg-worker.js +24 -0
- package/dist/wasm/cad/libredwg-web.js +15 -0
- package/dist/wasm/cad/libredwg-web.wasm +0 -0
- package/package.json +118 -42
- package/.vscode/extensions.json +0 -3
- package/dist/components/ImageViewer.js +0 -1898
- package/dist/components/MarkdownViewer.js +0 -1577
- package/dist/components/PdfView.js +0 -21660
- package/dist/components/PptxRender.js +0 -21165
- package/dist/components/XlsxTable.js +0 -69881
- package/dist/components/_commonjs-dynamic-modules.js +0 -6
- package/dist/components/_commonjsHelpers.js +0 -36
- package/dist/components/docx-preview.min.js +0 -5287
- package/dist/components/index.js +0 -1717
- package/dist/components/worker-ref.js +0 -21
- package/dist/index.mjs +0 -6
- package/dist/index.umd.js +0 -436
- package/dist/src/package/common/type.d.ts +0 -30
- package/dist/src/package/common/util.d.ts +0 -5
- package/dist/src/package/common/worker-ref.d.ts +0 -12
- package/dist/src/package/components/FileViewer/FileViewer.vue.d.ts +0 -25
- package/dist/src/package/components/FileViewer/index.d.ts +0 -2
- package/dist/src/package/components/FileViewer/util.d.ts +0 -2
- package/dist/src/package/index.d.ts +0 -12
- package/dist/src/package/use/index.d.ts +0 -1
- package/dist/src/package/use/worker.d.ts +0 -24
- package/dist/src/package/vendors/docx/index.d.ts +0 -4
- package/dist/src/package/vendors/image/ImageViewer.vue.d.ts +0 -13
- package/dist/src/package/vendors/image/index.d.ts +0 -4
- package/dist/src/package/vendors/md/MarkdownViewer.vue.d.ts +0 -13
- package/dist/src/package/vendors/md/index.d.ts +0 -4
- package/dist/src/package/vendors/mp4/index.d.ts +0 -4
- package/dist/src/package/vendors/pdf/PdfView.vue.d.ts +0 -13
- package/dist/src/package/vendors/pdf/index.d.ts +0 -1
- package/dist/src/package/vendors/pdf/worker/index.d.ts +0 -4
- package/dist/src/package/vendors/pptx/PptxRender.vue.d.ts +0 -81
- package/dist/src/package/vendors/pptx/index.d.ts +0 -6
- package/dist/src/package/vendors/pptx/options.d.ts +0 -39
- package/dist/src/package/vendors/pptx/support/chart.d.ts +0 -4
- package/dist/src/package/vendors/pptx/worker/index.d.ts +0 -4
- package/dist/src/package/vendors/renders.d.ts +0 -3
- package/dist/src/package/vendors/text/CodeViewer.vue.d.ts +0 -13
- package/dist/src/package/vendors/text/index.d.ts +0 -6
- package/dist/src/package/vendors/xlsx/XlsxTable.vue.d.ts +0 -21
- package/dist/src/package/vendors/xlsx/index.d.ts +0 -5
- package/dist/src/package/vendors/xlsx/render.d.ts +0 -6
- package/dist/src/package/vendors/xlsx/util.d.ts +0 -8
- package/dist/src/package/vendors/xlsx/worker/index.d.ts +0 -6
- package/dist/src/package/vendors/xlsx/worker/xls/SheetJsModel.d.ts +0 -36
- package/dist/src/package/vendors/xlsx/worker/xls/index.d.ts +0 -4
- package/dist/src/package/vendors/xlsx/worker/xlsx/ExcelJsModel.d.ts +0 -39
- package/dist/src/package/vendors/xlsx/worker/xlsx/color.d.ts +0 -2
- package/dist/src/package/vendors/xlsx/worker/xlsx/context.d.ts +0 -7
- package/dist/src/package/vendors/xlsx/worker/xlsx/index.d.ts +0 -4
- package/dist/src/package/vendors/xlsx/worker/xlsx/util.d.ts +0 -10
- package/dist/style.css +0 -57
- package/dist/worker/pdf.worker.js +0 -66
- package/dist/worker/pptx.worker.js +0 -21
- package/dist/worker/sheet.worker.js +0 -38
- package/dist/worker/xlsx.worker.js +0 -65
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Public Sample Sources
|
|
2
|
+
|
|
3
|
+
本目录中的 PDF、DOCX、PPTX、CAD、3D 模型、绘图、音频、EPUB 和 MSG 示例文件使用项目方提供的真实资料、可追溯的公开样本或项目内最小夹具;UMD、EML、OLB、DRA 和压缩包示例文件由项目内生成,用于固定回归对应结构。后续替换这些文件时,请优先选择许可清楚、可直接访问 raw 文件的公开仓库、国际组织公开文档或项目方明确授权的资料,并同步更新本文件与 `README.md`。
|
|
4
|
+
|
|
5
|
+
| Local file | Source | License | Purpose |
|
|
6
|
+
| --- | --- | --- | --- |
|
|
7
|
+
| `drawing.dxf` | `https://github.com/mozman/ezdxf/blob/master/examples_dxf/wipeout_door.dxf` | MIT | Real DXF CAD drawing for pan, zoom and layer smoke tests |
|
|
8
|
+
| `word.docx` | `https://www.basel.int/Portals/4/download.aspx?d=UNEP-CHW.15-6-Add.5-Rev.1.Chinese.docx` | Public Basel Convention document, source attribution required | Rich Chinese DOCX preview with headings, long-form text, tables, drawings, responsive white paper and print/export smoke tests |
|
|
9
|
+
| `template.dot` | Copied from project `test.doc` fixture and saved with the Word 97-2003 template extension | Apache-2.0 | DOT extension routing smoke test for legacy Word template preview |
|
|
10
|
+
| `ppt.pptx` | `https://github.com/hcp4715/R4Psy/blob/main/slides/chapter_1.pptx` | CC-BY-4.0 | Rich Chinese presentation smoke test for slide layout, images, theme styling and media-heavy PPTX rendering |
|
|
11
|
+
| `pdf.pdf` | Project-owner provided `PDF沉浸式翻译技术说明.pdf` | Demo distribution authorized by project owner | 13-page PDF toolbar, scale, page/tree sidebar, print, export and dark-shell isolation smoke tests |
|
|
12
|
+
| `sample.dwg` | `https://github.com/dshn06/cad-webviewer-unity/blob/main/cad-webview/public/cad-data/data/baseline-sample.dwg` | MIT | Real DWG sample for Worker + LibreDWG WASM geometry smoke tests |
|
|
13
|
+
| `samples/apache/blocks_and_tables.dwf` | `https://issues.apache.org/jira/browse/TIKA-1823` attachment `blocks_and_tables.dwf` | Apache Software Foundation Jira attachment | Native DWF 6 container smoke test for blocks, tables, W2D graphics and MIME/header handling |
|
|
14
|
+
| `samples/autodesk/house.dwfx` | `https://github.com/Developer-Autodesk/viewer-javascript-tutorial/blob/master/Sample%20files/House.dwfx` | MIT | Official Autodesk Viewer tutorial DWFx sample for native DWFx/XPS rendering, multi-page structure and CAD viewport smoke tests |
|
|
15
|
+
| `samples/autodesk/robot-arm.dwfx` | `https://github.com/Developer-Autodesk/viewer-javascript-tutorial/blob/master/Sample%20files/RobotArm1.dwfx` | MIT | Official Autodesk Viewer tutorial DWFx sample for W2D/W3D native rendering and assembly drawing smoke tests |
|
|
16
|
+
| `model.gltf` / `model.obj` / `model.stl` / `model.ply` / `model.step` | Project-generated minimal fixtures | Apache-2.0 | Three.js model rendering and engineering-format fallback smoke tests |
|
|
17
|
+
| `flow.excalidraw` | `https://github.com/neo4j-labs/agent-memory/blob/main/docs/assets/images/diagrams/excalidraw/poleo-model.excalidraw` | Apache-2.0 | Real Excalidraw scene for official restore/export smoke tests |
|
|
18
|
+
| `process.drawio` | `https://github.com/jgraph/drawio-diagrams/blob/dev/blog/data-flow.drawio` | Apache-2.0 | Official draw.io sample for diagrams.net viewer smoke tests |
|
|
19
|
+
| `book.umd` | 项目内生成的最小 UMD 文本电子书 fixture | Apache-2.0 | UMD ebook metadata, table-of-contents and zlib text smoke tests |
|
|
20
|
+
| `report.typ` | Project-generated Typst multi-page fixture | Apache-2.0 | Direct Typst source preview and browser WASM smoke tests |
|
|
21
|
+
| `archive.zip` / `archive.tar.gz` | Project-packaged PDF, public DOCX, Markdown, TypeScript and JSON sample set | See bundled file sources | Archive directory, lazy extraction, cache and nested preview smoke tests |
|
|
22
|
+
| `sample.eml` | Project-generated MIME email fixture | Apache-2.0 | EML headers, text/html body, attachment download and attachment preview smoke tests |
|
|
23
|
+
| `sample.msg` | `https://github.com/HiraokaHyperTools/msgreader/blob/master/test/A%20memo.msg` | MIT | Outlook MSG parsing smoke test through @kenjiuno/msgreader |
|
|
24
|
+
| `sample.olb` / `sample.dra` | Project-generated CFB EDA fixtures | Apache-2.0 | OLB/DRA structure tree, entity, property and readable-string smoke tests |
|
|
25
|
+
| `audio.mp3` | `https://interactive-examples.mdn.mozilla.net/media/cc0-audio/t-rex-roar.mp3` | CC0 | Small MP3 sample for native audio playback smoke tests |
|
|
26
|
+
| `audio.ogg` | `https://commons.wikimedia.org/wiki/File:Example.ogg` | CC BY-SA 3.0 | OGG Vorbis sample for native audio playback smoke tests |
|
|
27
|
+
| `book.epub` | `https://www.gutenberg.org/ebooks/928.epub3.images` | Public domain in the USA | EPUB sample for epubjs table-of-contents and paginated reading smoke tests |
|
|
28
|
+
|
|
29
|
+
运行时说明:
|
|
30
|
+
|
|
31
|
+
- `sample.dwg` 是真实 DWG 文件;运行时通过 `@flyfish-dev/cad-viewer` 按需加载 DWG Worker 和 LibreDWG WASM,验证浏览器本地 DWG 几何预览链路。
|
|
32
|
+
- `samples/apache/blocks_and_tables.dwf` 来自 Apache Tika `TIKA-1823` 的公开 Jira 附件,保留 `(DWF V06.00)PK` 文件头,用于验证原生 DWF 6 ZIP 容器、块、表格、W2D 图形和 MIME/header 识别。
|
|
33
|
+
- `samples/autodesk/house.dwfx` 来自 Autodesk 官方 Viewer 教程仓库,用于验证 DWFx / XPS native renderer、图形、多页结构和视图适配;该文件约 17MB,但只在用户选择样例时按需加载。
|
|
34
|
+
- `samples/autodesk/robot-arm.dwfx` 同样来自 Autodesk 官方 Viewer 教程仓库,用于验证 W2D/W3D native renderer 和复杂装配图形。
|
|
35
|
+
- `word.docx` 来自 Basel Convention 公开中文正式文档,覆盖标题层级、长正文、表格、图示、白色纸张和完整打印回归;该样本保留真实文档复杂度,但避免默认 Demo 首屏触发超大 DOCX 保护。
|
|
36
|
+
- `template.dot` 复用 `test.doc` 的二进制内容,仅用于验证 Word 97-2003 模板扩展名能正确进入老 Word 渲染链路。
|
|
37
|
+
- `ppt.pptx` 来自 `hcp4715/R4Psy` 的 CC-BY-4.0 中文课程课件,覆盖多页幻灯片、图片资源、主题样式、组合元素和富文本排版。
|
|
38
|
+
- `pdf.pdf` 是项目方提供的 13 页真实技术说明 PDF,覆盖缩放、页侧边栏、树形导航、打印、导出和暗色外壳隔离回归。
|
|
39
|
+
- `model.gltf`、`model.obj`、`model.stl`、`model.ply` 和 `model.step` 是最小 3D fixture,用于验证 Three.js 预览和工程格式转换提示。
|
|
40
|
+
- `flow.excalidraw` 先经过 `@excalidraw/excalidraw` 的官方 `restore`,再用 `exportToSvg` 输出只读预览,以兼容公开样例中常见的精简字段。
|
|
41
|
+
- `process.drawio` 由 diagrams.net 官方 `GraphViewer` 解析,组件不自行实现 draw.io 方言解析。
|
|
42
|
+
- `audio.mp3` 与 `audio.ogg` 只用于验证浏览器原生音频播放能力;不同浏览器对编码的支持存在差异。
|
|
43
|
+
- `book.epub` 来自 Project Gutenberg,运行时由 `epubjs` 解析 EPUB 包、目录和章节资源。
|
|
44
|
+
- `book.umd` 由项目内生成,覆盖 UMD 文件头、元数据、章节偏移、章节标题和 zlib 压缩正文段。
|
|
45
|
+
- `report.typ` 由项目内编写,覆盖 Typst 标题、表格、公式、代码块、多页输出、页面尺寸和打印/HTML 导出,线上 Demo 会直接读取源文件并通过浏览器端 WASM 编译预览。
|
|
46
|
+
- `archive.zip` 与 `archive.tar.gz` 由本目录中的 PDF、DOCX、Markdown、TypeScript 和 JSON 示例打包,用于验证 `libarchive.js` Worker、按需解压、IndexedDB 缓存和内部文件继续预览;其中 DOCX 同步使用当前公开中文 Word 样例。
|
|
47
|
+
- `sample.eml` 是标准 MIME fixture,用于验证 EML 头信息、HTML/文本正文和附件链路。
|
|
48
|
+
- `sample.msg` 来自 `HiraokaHyperTools/msgreader` 测试样例,用于验证 Outlook MSG 解析。
|
|
49
|
+
- `sample.olb` 与 `sample.dra` 是项目内生成的 CFB 夹具,用于验证 OLB / DRA 结构树、对象候选、属性和可读字符串索引。
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
2026-06-12T10:00:00+08:00 INFO viewer boot version=1.0.23 framework=vue3
|
|
2
|
+
2026-05-19T10:00:01+08:00 INFO sample-picker open groups=7 default=document
|
|
3
|
+
2026-05-19T10:00:02+08:00 INFO preview start file=/example/word.docx source=url
|
|
4
|
+
2026-05-19T10:00:03+08:00 INFO renderer loaded name=word chunk=docx-preview elapsed=86ms
|
|
5
|
+
2026-05-19T10:00:04+08:00 INFO preview ready pages=3 scale=fit-width
|
|
6
|
+
2026-05-19T10:01:10+08:00 INFO preview start file=/example/code.ts source=url
|
|
7
|
+
2026-05-19T10:01:10+08:00 INFO renderer loaded name=code chunk=highlight.js language=typescript
|
|
8
|
+
2026-05-19T10:01:11+08:00 WARN remote-url cors-check status=skipped reason=local-sample
|
|
9
|
+
2026-06-12T10:02:20+08:00 INFO preview start file=/example/sample.dwg source=url
|
|
10
|
+
2026-06-12T10:02:21+08:00 INFO renderer loaded name=cad chunk=@flyfish-dev/cad-viewer worker=libredwg wasm=true
|
|
11
|
+
2026-06-12T10:02:22+08:00 INFO preview ready file=/example/samples/apache/blocks_and_tables.dwf renderer=dwf-viewer canvases=4
|
|
12
|
+
2026-05-19T10:03:00+08:00 ERROR pdf-load requestId=qa-42 message="network aborted by new preview"
|
|
13
|
+
2026-05-19T10:03:01+08:00 INFO request ignored requestId=qa-42 reason=stale-render-version
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
diff --git a/viewer.ts b/viewer.ts
|
|
2
|
+
index 1111111..3333333 100644
|
|
3
|
+
--- a/viewer.ts
|
|
4
|
+
+++ b/viewer.ts
|
|
5
|
+
@@ -1,8 +1,24 @@
|
|
6
|
+
-const renderer = 'text'
|
|
7
|
+
+const renderer = 'highlight.js'
|
|
8
|
+
+
|
|
9
|
+
+type PreviewMode = 'url' | 'file'
|
|
10
|
+
+
|
|
11
|
+
export default renderer
|
|
12
|
+
|
|
13
|
+
-export function open(url: string) {
|
|
14
|
+
- return fetch(url)
|
|
15
|
+
+export async function open(url: string, mode: PreviewMode = 'url') {
|
|
16
|
+
+ const response = await fetch(url, { credentials: 'include' })
|
|
17
|
+
+ if (!response.ok) {
|
|
18
|
+
+ throw new Error(`Preview download failed: ${response.status}`)
|
|
19
|
+
+ }
|
|
20
|
+
+
|
|
21
|
+
+ const blob = await response.blob()
|
|
22
|
+
+ if (mode === 'file') {
|
|
23
|
+
+ const filename = decodeURIComponent(url.split('/').pop() || 'preview.bin')
|
|
24
|
+
+ return new File([blob], filename, { type: blob.type })
|
|
25
|
+
+ }
|
|
26
|
+
+
|
|
27
|
+
+ return blob
|
|
28
|
+
}
|
|
29
|
+
diff --git a/styles.css b/styles.css
|
|
30
|
+
index aaaaaaa..bbbbbbb 100644
|
|
31
|
+
--- a/styles.css
|
|
32
|
+
+++ b/styles.css
|
|
33
|
+
@@ -4,6 +4,9 @@
|
|
34
|
+
.preview-shell {
|
|
35
|
+
min-height: 100vh;
|
|
36
|
+
overflow: hidden;
|
|
37
|
+
+ display: grid;
|
|
38
|
+
+ grid-template-columns: minmax(260px, 320px) minmax(0, 1fr);
|
|
39
|
+
+ background: #f6f8fb;
|
|
40
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
const fs = require('node:fs')
|
|
2
|
+
const path = require('node:path')
|
|
3
|
+
|
|
4
|
+
const rootDir = path.resolve(__dirname, '..', '..')
|
|
5
|
+
const distDir = path.join(rootDir, 'dist')
|
|
6
|
+
|
|
7
|
+
function readManifest() {
|
|
8
|
+
const manifestPath = path.join(distDir, '.vite', 'manifest.json')
|
|
9
|
+
if (!fs.existsSync(manifestPath)) {
|
|
10
|
+
return {}
|
|
11
|
+
}
|
|
12
|
+
return JSON.parse(fs.readFileSync(manifestPath, 'utf8'))
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function pickAssets(manifest) {
|
|
16
|
+
return Object.entries(manifest)
|
|
17
|
+
.filter(([, entry]) => entry.isEntry || entry.file.endsWith('.css'))
|
|
18
|
+
.map(([source, entry]) => ({
|
|
19
|
+
source,
|
|
20
|
+
file: entry.file,
|
|
21
|
+
css: entry.css || []
|
|
22
|
+
}))
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
module.exports = {
|
|
26
|
+
rootDir,
|
|
27
|
+
distDir,
|
|
28
|
+
readManifest,
|
|
29
|
+
pickAssets,
|
|
30
|
+
createReport() {
|
|
31
|
+
const assets = pickAssets(readManifest())
|
|
32
|
+
return {
|
|
33
|
+
generatedAt: new Date().toISOString(),
|
|
34
|
+
assetCount: assets.length,
|
|
35
|
+
assets
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
--viewer-bg: #f6f8fb;
|
|
3
|
+
--viewer-card: #ffffff;
|
|
4
|
+
--viewer-border: rgba(15, 23, 42, 0.1);
|
|
5
|
+
--viewer-accent: #2563eb;
|
|
6
|
+
--viewer-success: #16a34a;
|
|
7
|
+
--viewer-text: #0f172a;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
.viewer-shell {
|
|
11
|
+
display: grid;
|
|
12
|
+
grid-template-columns: minmax(260px, 320px) minmax(0, 1fr);
|
|
13
|
+
min-height: 100vh;
|
|
14
|
+
background: var(--viewer-bg);
|
|
15
|
+
color: var(--viewer-text);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.sample-sidebar {
|
|
19
|
+
display: flex;
|
|
20
|
+
flex-direction: column;
|
|
21
|
+
gap: 12px;
|
|
22
|
+
padding: 16px;
|
|
23
|
+
border-right: 1px solid var(--viewer-border);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.sample-card {
|
|
27
|
+
display: grid;
|
|
28
|
+
grid-template-columns: 42px minmax(0, 1fr) auto;
|
|
29
|
+
gap: 12px;
|
|
30
|
+
align-items: center;
|
|
31
|
+
padding: 12px;
|
|
32
|
+
border: 1px solid var(--viewer-border);
|
|
33
|
+
border-radius: 8px;
|
|
34
|
+
background: var(--viewer-card);
|
|
35
|
+
transition: border-color 160ms ease, transform 160ms ease;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.sample-card:hover {
|
|
39
|
+
border-color: color-mix(in srgb, var(--viewer-accent), white 55%);
|
|
40
|
+
transform: translateY(-1px);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
.sample-card[aria-current='true'] {
|
|
44
|
+
border-color: var(--viewer-success);
|
|
45
|
+
box-shadow: 0 10px 28px rgba(22, 163, 74, 0.12);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.viewer-panel {
|
|
49
|
+
min-width: 0;
|
|
50
|
+
overflow: hidden;
|
|
51
|
+
border: 1px solid var(--viewer-border);
|
|
52
|
+
background: #e5e7eb;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
@media (max-width: 780px) {
|
|
56
|
+
.viewer-shell {
|
|
57
|
+
grid-template-columns: 1fr;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.sample-sidebar {
|
|
61
|
+
border-right: 0;
|
|
62
|
+
border-bottom: 1px solid var(--viewer-border);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import java.util.List;
|
|
2
|
+
import java.util.Locale;
|
|
3
|
+
import java.util.Map;
|
|
4
|
+
import java.util.Optional;
|
|
5
|
+
|
|
6
|
+
public final class PreviewFile {
|
|
7
|
+
private static final Map<String, String> RENDERERS = Map.of(
|
|
8
|
+
"pdf", "pdfjs-dist",
|
|
9
|
+
"ofd", "DLTech21/ofd.js",
|
|
10
|
+
"typ", "typst.ts",
|
|
11
|
+
"dxf", "@flyfish-dev/cad-viewer",
|
|
12
|
+
"dwg", "@flyfish-dev/cad-viewer",
|
|
13
|
+
"dwf", "@flyfish-dev/cad-viewer",
|
|
14
|
+
"dwfx", "@flyfish-dev/cad-viewer",
|
|
15
|
+
"xps", "@flyfish-dev/cad-viewer",
|
|
16
|
+
"json", "highlight.js"
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
private final String name;
|
|
20
|
+
private final long size;
|
|
21
|
+
|
|
22
|
+
public PreviewFile(String name, long size) {
|
|
23
|
+
this.name = name;
|
|
24
|
+
this.size = size;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
public String extension() {
|
|
28
|
+
int index = name.lastIndexOf('.');
|
|
29
|
+
return index >= 0 ? name.substring(index + 1).toLowerCase(Locale.ROOT) : "";
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
public Optional<String> renderer() {
|
|
33
|
+
return Optional.ofNullable(RENDERERS.get(extension()));
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
public boolean requiresAsyncChunk() {
|
|
37
|
+
return renderer().isPresent() || size > 1024 * 1024;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
public static void main(String[] args) {
|
|
41
|
+
List<PreviewFile> files = List.of(
|
|
42
|
+
new PreviewFile("contract.pdf", 827_000),
|
|
43
|
+
new PreviewFile("invoice.ofd", 4_278_691),
|
|
44
|
+
new PreviewFile("report.typ", 18_000),
|
|
45
|
+
new PreviewFile("snippet.java", 2_400)
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
files.forEach(file -> System.out.printf(
|
|
49
|
+
"%s -> %s async=%s%n",
|
|
50
|
+
file.name,
|
|
51
|
+
file.renderer().orElse("fallback"),
|
|
52
|
+
file.requiresAsyncChunk()
|
|
53
|
+
));
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
const RENDERER_GROUPS = {
|
|
2
|
+
document: ['doc', 'docx', 'pdf', 'ofd', 'typ', 'typst'],
|
|
3
|
+
sheet: ['xlsx', 'xls', 'csv', 'ods'],
|
|
4
|
+
drawing: ['dxf', 'dwg', 'dwf', 'dwfx', 'xps'],
|
|
5
|
+
source: ['js', 'ts', 'tsx', 'vue', 'json', 'yaml']
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
const DEFAULT_ICON = {
|
|
9
|
+
label: 'FILE',
|
|
10
|
+
tone: '#64748b'
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function normalizeExtension(filename = '') {
|
|
14
|
+
const cleanName = filename.split('?')[0].split('#')[0]
|
|
15
|
+
const dotIndex = cleanName.lastIndexOf('.')
|
|
16
|
+
return dotIndex >= 0 ? cleanName.slice(dotIndex + 1).toLowerCase() : ''
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function resolvePreviewMeta(filename) {
|
|
20
|
+
const extension = normalizeExtension(filename)
|
|
21
|
+
|
|
22
|
+
for (const [group, extensions] of Object.entries(RENDERER_GROUPS)) {
|
|
23
|
+
if (extensions.includes(extension)) {
|
|
24
|
+
return {
|
|
25
|
+
group,
|
|
26
|
+
extension,
|
|
27
|
+
icon: extension.toUpperCase(),
|
|
28
|
+
supported: true
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return {
|
|
34
|
+
group: 'unknown',
|
|
35
|
+
extension,
|
|
36
|
+
icon: DEFAULT_ICON.label,
|
|
37
|
+
supported: false
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export async function createPreviewFile(url, fallbackName = 'download.bin') {
|
|
42
|
+
const response = await fetch(url, { credentials: 'include' })
|
|
43
|
+
if (!response.ok) {
|
|
44
|
+
throw new Error(`Download failed with ${response.status}`)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const blob = await response.blob()
|
|
48
|
+
const name = decodeURIComponent(url.split('/').pop() || fallbackName)
|
|
49
|
+
return new File([blob], name, { type: blob.type })
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const samples = ['invoice.ofd', 'report.typ', 'drawing.dxf', 'component.vue', 'archive.unknown']
|
|
53
|
+
const summary = samples.map(resolvePreviewMeta)
|
|
54
|
+
|
|
55
|
+
console.table(summary)
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { useMemo, useState } from 'react'
|
|
2
|
+
|
|
3
|
+
const formatGroups = [
|
|
4
|
+
{ title: 'Documents', items: ['docx', 'pdf', 'ofd'] },
|
|
5
|
+
{ title: 'Drawings', items: ['dxf', 'dwg', 'dwf', 'dwfx', 'xps'] },
|
|
6
|
+
{ title: 'Code', items: ['js', 'ts', 'vue', 'json'] }
|
|
7
|
+
]
|
|
8
|
+
|
|
9
|
+
export function PreviewPicker({ onSelect }) {
|
|
10
|
+
const [activeGroup, setActiveGroup] = useState('Documents')
|
|
11
|
+
|
|
12
|
+
const visibleItems = useMemo(() => {
|
|
13
|
+
return formatGroups.find(group => group.title === activeGroup)?.items || []
|
|
14
|
+
}, [activeGroup])
|
|
15
|
+
|
|
16
|
+
return (
|
|
17
|
+
<section className="preview-picker">
|
|
18
|
+
<nav aria-label="Preview groups">
|
|
19
|
+
{formatGroups.map(group => (
|
|
20
|
+
<button
|
|
21
|
+
key={group.title}
|
|
22
|
+
className={group.title === activeGroup ? 'active' : ''}
|
|
23
|
+
type="button"
|
|
24
|
+
onClick={() => setActiveGroup(group.title)}
|
|
25
|
+
>
|
|
26
|
+
{group.title}
|
|
27
|
+
</button>
|
|
28
|
+
))}
|
|
29
|
+
</nav>
|
|
30
|
+
|
|
31
|
+
<ul>
|
|
32
|
+
{visibleItems.map(type => (
|
|
33
|
+
<li key={type}>
|
|
34
|
+
<button type="button" onClick={() => onSelect(type)}>
|
|
35
|
+
<strong>{type.toUpperCase()}</strong>
|
|
36
|
+
<span>Open sample.{type}</span>
|
|
37
|
+
</button>
|
|
38
|
+
</li>
|
|
39
|
+
))}
|
|
40
|
+
</ul>
|
|
41
|
+
</section>
|
|
42
|
+
)
|
|
43
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export const runtime = 'browser-module'
|
|
2
|
+
|
|
3
|
+
const rendererLoaders = {
|
|
4
|
+
pdf: () => import('/src/package/vendors/pdf'),
|
|
5
|
+
ofd: () => import('/src/package/vendors/ofd'),
|
|
6
|
+
dxf: () => import('/src/package/vendors/cad'),
|
|
7
|
+
json: () => import('/src/package/vendors/text')
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function getExtension(url) {
|
|
11
|
+
return new URL(url, window.location.href)
|
|
12
|
+
.pathname
|
|
13
|
+
.split('.')
|
|
14
|
+
.pop()
|
|
15
|
+
.toLowerCase()
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export async function loadRenderer(url) {
|
|
19
|
+
const extension = getExtension(url)
|
|
20
|
+
const loader = rendererLoaders[extension] || rendererLoaders.json
|
|
21
|
+
const startedAt = performance.now()
|
|
22
|
+
const module = await loader()
|
|
23
|
+
|
|
24
|
+
return {
|
|
25
|
+
extension,
|
|
26
|
+
module,
|
|
27
|
+
elapsed: Math.round(performance.now() - startedAt)
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export async function preview(url, target) {
|
|
32
|
+
const { extension, module, elapsed } = await loadRenderer(url)
|
|
33
|
+
target.dataset.extension = extension
|
|
34
|
+
target.dataset.loadedIn = `${elapsed}ms`
|
|
35
|
+
return module.default
|
|
36
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
from typing import Iterable
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
@dataclass(frozen=True)
|
|
7
|
+
class PreviewFile:
|
|
8
|
+
name: str
|
|
9
|
+
size: int
|
|
10
|
+
source: str = "url"
|
|
11
|
+
|
|
12
|
+
@property
|
|
13
|
+
def extension(self) -> str:
|
|
14
|
+
return Path(self.name).suffix.removeprefix(".").lower()
|
|
15
|
+
|
|
16
|
+
@property
|
|
17
|
+
def is_large(self) -> bool:
|
|
18
|
+
return self.size > 5 * 1024 * 1024
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
RENDERERS = {
|
|
22
|
+
"pdf": "pdfjs-dist",
|
|
23
|
+
"ofd": "DLTech21/ofd.js",
|
|
24
|
+
"typ": "typst.ts",
|
|
25
|
+
"typst": "typst.ts",
|
|
26
|
+
"dxf": "@flyfish-dev/cad-viewer",
|
|
27
|
+
"dwg": "@flyfish-dev/cad-viewer",
|
|
28
|
+
"dwf": "@flyfish-dev/cad-viewer",
|
|
29
|
+
"dwfx": "@flyfish-dev/cad-viewer",
|
|
30
|
+
"xps": "@flyfish-dev/cad-viewer",
|
|
31
|
+
"json": "highlight.js",
|
|
32
|
+
"py": "highlight.js",
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def build_preview_queue(files: Iterable[PreviewFile]) -> list[dict[str, str]]:
|
|
37
|
+
queue = []
|
|
38
|
+
for item in files:
|
|
39
|
+
renderer = RENDERERS.get(item.extension, "fallback")
|
|
40
|
+
queue.append({
|
|
41
|
+
"name": item.name,
|
|
42
|
+
"renderer": renderer,
|
|
43
|
+
"priority": "low" if item.is_large else "normal",
|
|
44
|
+
})
|
|
45
|
+
return queue
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
samples = [
|
|
49
|
+
PreviewFile("invoice.ofd", 428000),
|
|
50
|
+
PreviewFile("report.typ", 18000),
|
|
51
|
+
PreviewFile("house.dwfx", 17_000_000),
|
|
52
|
+
PreviewFile("trace.log", 12000),
|
|
53
|
+
]
|
|
54
|
+
|
|
55
|
+
for job in build_preview_queue(samples):
|
|
56
|
+
print(f"{job['name']}: {job['renderer']} ({job['priority']})")
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { computed, ref } from 'vue'
|
|
2
|
+
|
|
3
|
+
type PreviewStatus = 'idle' | 'downloading' | 'rendering' | 'ready' | 'error'
|
|
4
|
+
type PreviewKind = 'document' | 'sheet' | 'drawing' | 'source' | 'media' | 'unknown'
|
|
5
|
+
|
|
6
|
+
interface PreviewSource {
|
|
7
|
+
id: string
|
|
8
|
+
filename: string
|
|
9
|
+
url: string
|
|
10
|
+
size?: number
|
|
11
|
+
updatedAt?: string
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
interface RenderPlan {
|
|
15
|
+
kind: PreviewKind
|
|
16
|
+
extension: string
|
|
17
|
+
lazyChunk: string
|
|
18
|
+
preferredInput: 'url' | 'file'
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const chunkMap: Record<string, RenderPlan['kind']> = {
|
|
22
|
+
doc: 'document',
|
|
23
|
+
docx: 'document',
|
|
24
|
+
pdf: 'document',
|
|
25
|
+
ofd: 'document',
|
|
26
|
+
typ: 'document',
|
|
27
|
+
typst: 'document',
|
|
28
|
+
xlsx: 'sheet',
|
|
29
|
+
csv: 'sheet',
|
|
30
|
+
dxf: 'drawing',
|
|
31
|
+
dwg: 'drawing',
|
|
32
|
+
ts: 'source',
|
|
33
|
+
json: 'source',
|
|
34
|
+
mp4: 'media'
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export const activeSource = ref<PreviewSource>({
|
|
38
|
+
id: 'sample-typst',
|
|
39
|
+
filename: 'report.typ',
|
|
40
|
+
url: '/example/report.typ',
|
|
41
|
+
updatedAt: '2026-06-06T17:40:00+08:00'
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
export const status = ref<PreviewStatus>('idle')
|
|
45
|
+
export const statusText = computed(() => `${activeSource.value.filename} / ${status.value}`)
|
|
46
|
+
|
|
47
|
+
function getExtension(filename: string) {
|
|
48
|
+
const dotIndex = filename.lastIndexOf('.')
|
|
49
|
+
return dotIndex >= 0 ? filename.slice(dotIndex + 1).toLowerCase() : ''
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export function createRenderPlan(source: PreviewSource): RenderPlan {
|
|
53
|
+
const extension = getExtension(source.filename)
|
|
54
|
+
const kind = chunkMap[extension] || 'unknown'
|
|
55
|
+
|
|
56
|
+
return {
|
|
57
|
+
kind,
|
|
58
|
+
extension,
|
|
59
|
+
lazyChunk: kind === 'unknown' ? 'fallback' : `${kind}-${extension}`,
|
|
60
|
+
preferredInput: source.url.includes('/download') ? 'file' : 'url'
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export async function openPreview(source: PreviewSource) {
|
|
65
|
+
activeSource.value = source
|
|
66
|
+
status.value = 'downloading'
|
|
67
|
+
|
|
68
|
+
const response = await fetch(source.url, { credentials: 'include' })
|
|
69
|
+
if (!response.ok) {
|
|
70
|
+
status.value = 'error'
|
|
71
|
+
throw new Error(`Download failed: ${response.status}`)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
status.value = 'rendering'
|
|
75
|
+
const blob = await response.blob()
|
|
76
|
+
status.value = 'ready'
|
|
77
|
+
return new File([blob], source.filename, { type: blob.type })
|
|
78
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { useMemo } from 'react'
|
|
2
|
+
|
|
3
|
+
type PreviewState = 'idle' | 'loading' | 'ready' | 'error'
|
|
4
|
+
|
|
5
|
+
type PreviewBadgeProps = {
|
|
6
|
+
type: string
|
|
7
|
+
state: PreviewState
|
|
8
|
+
filename: string
|
|
9
|
+
onOpen?: (filename: string) => void
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const toneByState: Record<PreviewState, string> = {
|
|
13
|
+
idle: '#64748b',
|
|
14
|
+
loading: '#2563eb',
|
|
15
|
+
ready: '#16a34a',
|
|
16
|
+
error: '#dc2626'
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function PreviewBadge({ type, state, filename, onOpen }: PreviewBadgeProps) {
|
|
20
|
+
const label = useMemo(() => {
|
|
21
|
+
return `${type.toUpperCase()} / ${state}`
|
|
22
|
+
}, [type, state])
|
|
23
|
+
|
|
24
|
+
return (
|
|
25
|
+
<button
|
|
26
|
+
className='preview-badge'
|
|
27
|
+
style={{ borderColor: toneByState[state], color: toneByState[state] }}
|
|
28
|
+
type='button'
|
|
29
|
+
aria-label={`Open ${filename}`}
|
|
30
|
+
onClick={() => onOpen?.(filename)}
|
|
31
|
+
>
|
|
32
|
+
<strong>{label}</strong>
|
|
33
|
+
<span>{filename}</span>
|
|
34
|
+
</button>
|
|
35
|
+
)
|
|
36
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { computed, ref } from 'vue'
|
|
3
|
+
|
|
4
|
+
type SampleFile = {
|
|
5
|
+
name: string
|
|
6
|
+
type: string
|
|
7
|
+
size: number
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const files = ref<SampleFile[]>([
|
|
11
|
+
{ name: 'contract.pdf', type: 'pdf', size: 184320 },
|
|
12
|
+
{ name: 'invoice.ofd', type: 'ofd', size: 98304 },
|
|
13
|
+
{ name: 'drawing.dxf', type: 'dxf', size: 42752 }
|
|
14
|
+
])
|
|
15
|
+
|
|
16
|
+
const selected = ref(files.value[0])
|
|
17
|
+
|
|
18
|
+
const title = computed(() => {
|
|
19
|
+
return `${selected.value.name} / ${selected.value.type.toUpperCase()}`
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
function selectFile(file: SampleFile) {
|
|
23
|
+
selected.value = file
|
|
24
|
+
}
|
|
25
|
+
</script>
|
|
26
|
+
|
|
27
|
+
<template>
|
|
28
|
+
<section class="sample">
|
|
29
|
+
<header>
|
|
30
|
+
<span>Flyfish Viewer</span>
|
|
31
|
+
<strong>{{ title }}</strong>
|
|
32
|
+
</header>
|
|
33
|
+
|
|
34
|
+
<button
|
|
35
|
+
v-for="file in files"
|
|
36
|
+
:key="file.name"
|
|
37
|
+
type="button"
|
|
38
|
+
:class="{ active: file.name === selected.name }"
|
|
39
|
+
@click="selectFile(file)"
|
|
40
|
+
>
|
|
41
|
+
<span>{{ file.type }}</span>
|
|
42
|
+
<strong>{{ file.name }}</strong>
|
|
43
|
+
<em>{{ Math.round(file.size / 1024) }} KB</em>
|
|
44
|
+
</button>
|
|
45
|
+
</section>
|
|
46
|
+
</template>
|
|
47
|
+
|
|
48
|
+
<style scoped>
|
|
49
|
+
.sample {
|
|
50
|
+
display: grid;
|
|
51
|
+
gap: 10px;
|
|
52
|
+
padding: 16px;
|
|
53
|
+
color: #21a366;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.sample button {
|
|
57
|
+
display: grid;
|
|
58
|
+
grid-template-columns: 42px minmax(0, 1fr) auto;
|
|
59
|
+
gap: 8px;
|
|
60
|
+
border: 1px solid #d8e3dc;
|
|
61
|
+
border-radius: 8px;
|
|
62
|
+
background: #fff;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.sample button.active {
|
|
66
|
+
border-color: currentColor;
|
|
67
|
+
}
|
|
68
|
+
</style>
|