omni-viewer-core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (387) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +80 -0
  3. package/THIRD_PARTY_NOTICES.md +49 -0
  4. package/dist/assets/audio-engine/audio_engine.mjs +2 -0
  5. package/dist/assets/audio-engine/audio_engine.wasm +0 -0
  6. package/dist/assets/pdfjs/pdf.worker.min.mjs +21 -0
  7. package/dist/host/index.d.ts +133 -0
  8. package/dist/host/index.js +10 -0
  9. package/dist/i18n/catalog.en.d.ts +1 -0
  10. package/dist/i18n/catalog.en.js +411 -0
  11. package/dist/i18n/catalog.ko.d.ts +1 -0
  12. package/dist/i18n/catalog.ko.js +68 -0
  13. package/dist/i18n/index.d.ts +18 -0
  14. package/dist/i18n/index.js +41 -0
  15. package/dist/licenses/emscripten.txt +101 -0
  16. package/dist/licenses/kissfft.txt +28 -0
  17. package/dist/licenses/pdfjs-dist.txt +177 -0
  18. package/dist/parsers/a2l/index.d.ts +1 -0
  19. package/dist/parsers/a2l/index.js +1 -0
  20. package/dist/parsers/archive/index.d.ts +22 -0
  21. package/dist/parsers/archive/index.js +46 -0
  22. package/dist/parsers/archive/model.d.ts +29 -0
  23. package/dist/parsers/archive/model.js +1 -0
  24. package/dist/parsers/archive/worker.d.ts +21 -0
  25. package/dist/parsers/archive/worker.js +1 -0
  26. package/dist/parsers/arxml/index.d.ts +1 -0
  27. package/dist/parsers/arxml/index.js +1 -0
  28. package/dist/parsers/asc/index.d.ts +1 -0
  29. package/dist/parsers/asc/index.js +1 -0
  30. package/dist/parsers/audio/index.d.ts +9 -0
  31. package/dist/parsers/audio/index.js +46 -0
  32. package/dist/parsers/automotive/index.d.ts +33 -0
  33. package/dist/parsers/automotive/index.js +973 -0
  34. package/dist/parsers/blf/index.d.ts +1 -0
  35. package/dist/parsers/blf/index.js +1 -0
  36. package/dist/parsers/csv/delimiter.d.ts +31 -0
  37. package/dist/parsers/csv/delimiter.js +151 -0
  38. package/dist/parsers/csv/index.d.ts +30 -0
  39. package/dist/parsers/csv/index.js +108 -0
  40. package/dist/parsers/csv/parseText.d.ts +20 -0
  41. package/dist/parsers/csv/parseText.js +108 -0
  42. package/dist/parsers/csv/sort.d.ts +26 -0
  43. package/dist/parsers/csv/sort.js +224 -0
  44. package/dist/parsers/csv/statistics.d.ts +49 -0
  45. package/dist/parsers/csv/statistics.js +150 -0
  46. package/dist/parsers/dbc/index.d.ts +56 -0
  47. package/dist/parsers/dbc/index.js +94 -0
  48. package/dist/parsers/doc-binary/index.d.ts +35 -0
  49. package/dist/parsers/doc-binary/index.js +267 -0
  50. package/dist/parsers/doc-binary/vscode-parser.d.ts +142 -0
  51. package/dist/parsers/doc-binary/vscode-parser.js +3747 -0
  52. package/dist/parsers/excel/index.d.ts +17 -0
  53. package/dist/parsers/excel/index.js +406 -0
  54. package/dist/parsers/excel/model.d.ts +80 -0
  55. package/dist/parsers/excel/model.js +48 -0
  56. package/dist/parsers/excel/serialize.d.ts +3 -0
  57. package/dist/parsers/excel/serialize.js +78 -0
  58. package/dist/parsers/hdf5/index.d.ts +75 -0
  59. package/dist/parsers/hdf5/index.js +658 -0
  60. package/dist/parsers/hdf5/node.d.ts +21 -0
  61. package/dist/parsers/hdf5/node.js +95 -0
  62. package/dist/parsers/json/index.d.ts +15 -0
  63. package/dist/parsers/json/index.js +102 -0
  64. package/dist/parsers/json/model.d.ts +42 -0
  65. package/dist/parsers/json/model.js +140 -0
  66. package/dist/parsers/json/parse.d.ts +22 -0
  67. package/dist/parsers/json/parse.js +279 -0
  68. package/dist/parsers/json/tokenizer.d.ts +17 -0
  69. package/dist/parsers/json/tokenizer.js +175 -0
  70. package/dist/parsers/jsonl/index.d.ts +14 -0
  71. package/dist/parsers/jsonl/index.js +18 -0
  72. package/dist/parsers/jsonl/model.d.ts +23 -0
  73. package/dist/parsers/jsonl/model.js +1 -0
  74. package/dist/parsers/jsonl/parse.d.ts +7 -0
  75. package/dist/parsers/jsonl/parse.js +34 -0
  76. package/dist/parsers/markdown/index.d.ts +37 -0
  77. package/dist/parsers/markdown/index.js +59 -0
  78. package/dist/parsers/mat/index.d.ts +31 -0
  79. package/dist/parsers/mat/index.js +426 -0
  80. package/dist/parsers/mermaid/index.d.ts +5 -0
  81. package/dist/parsers/mermaid/index.js +3 -0
  82. package/dist/parsers/mf4/index.d.ts +1 -0
  83. package/dist/parsers/mf4/index.js +1 -0
  84. package/dist/parsers/parquet/index.d.ts +21 -0
  85. package/dist/parsers/parquet/index.js +68 -0
  86. package/dist/parsers/pcap/index.d.ts +1 -0
  87. package/dist/parsers/pcap/index.js +1 -0
  88. package/dist/parsers/pcapng/index.d.ts +1 -0
  89. package/dist/parsers/pcapng/index.js +1 -0
  90. package/dist/parsers/plantuml/index.d.ts +5 -0
  91. package/dist/parsers/plantuml/index.js +4 -0
  92. package/dist/parsers/ppt-binary/index.d.ts +5 -0
  93. package/dist/parsers/ppt-binary/index.js +62 -0
  94. package/dist/parsers/ppt-binary/pptBinaryBuildContext.d.ts +12 -0
  95. package/dist/parsers/ppt-binary/pptBinaryBuildContext.js +40 -0
  96. package/dist/parsers/ppt-binary/pptBinaryContainer.d.ts +4 -0
  97. package/dist/parsers/ppt-binary/pptBinaryContainer.js +174 -0
  98. package/dist/parsers/ppt-binary/pptBinaryTypes.d.ts +125 -0
  99. package/dist/parsers/ppt-binary/pptBinaryTypes.js +1 -0
  100. package/dist/parsers/ppt-binary/pptSlideLayouts.d.ts +9 -0
  101. package/dist/parsers/ppt-binary/pptSlideLayouts.js +510 -0
  102. package/dist/parsers/ppt-binary/vscode-parser.d.ts +116 -0
  103. package/dist/parsers/ppt-binary/vscode-parser.js +2853 -0
  104. package/dist/parsers/ppt-binary/vscode.d.ts +4 -0
  105. package/dist/parsers/ppt-binary/vscode.js +12 -0
  106. package/dist/parsers/pptx/index.d.ts +15 -0
  107. package/dist/parsers/pptx/index.js +88 -0
  108. package/dist/parsers/pptx/vscode-parser.d.ts +167 -0
  109. package/dist/parsers/pptx/vscode-parser.js +1503 -0
  110. package/dist/parsers/pptx/vscode.d.ts +4 -0
  111. package/dist/parsers/pptx/vscode.js +18 -0
  112. package/dist/parsers/pptx/zip-reader.d.ts +3 -0
  113. package/dist/parsers/pptx/zip-reader.js +20 -0
  114. package/dist/parsers/proto/index.d.ts +90 -0
  115. package/dist/parsers/proto/index.js +197 -0
  116. package/dist/parsers/psd/index.d.ts +16 -0
  117. package/dist/parsers/psd/index.js +10 -0
  118. package/dist/parsers/shapefile/dbf.d.ts +23 -0
  119. package/dist/parsers/shapefile/dbf.js +112 -0
  120. package/dist/parsers/shapefile/index.d.ts +44 -0
  121. package/dist/parsers/shapefile/index.js +119 -0
  122. package/dist/parsers/shapefile/reproject.d.ts +10 -0
  123. package/dist/parsers/shapefile/reproject.js +41 -0
  124. package/dist/parsers/slide-model.d.ts +106 -0
  125. package/dist/parsers/slide-model.js +1 -0
  126. package/dist/parsers/toml/index.d.ts +15 -0
  127. package/dist/parsers/toml/index.js +18 -0
  128. package/dist/parsers/toml/model.d.ts +15 -0
  129. package/dist/parsers/toml/model.js +1 -0
  130. package/dist/parsers/toml/parse.d.ts +16 -0
  131. package/dist/parsers/toml/parse.js +266 -0
  132. package/dist/parsers/types.d.ts +103 -0
  133. package/dist/parsers/types.js +106 -0
  134. package/dist/parsers/video/index.d.ts +6 -0
  135. package/dist/parsers/video/index.js +2 -0
  136. package/dist/parsers/yaml/index.d.ts +16 -0
  137. package/dist/parsers/yaml/index.js +58 -0
  138. package/dist/parsers/yaml/model.d.ts +22 -0
  139. package/dist/parsers/yaml/model.js +1 -0
  140. package/dist/parsers/yaml/self-loading.d.ts +3 -0
  141. package/dist/parsers/yaml/self-loading.js +19 -0
  142. package/dist/parsers/zip-scan.d.ts +8 -0
  143. package/dist/parsers/zip-scan.js +80 -0
  144. package/dist/registry/container.d.ts +17 -0
  145. package/dist/registry/container.js +49 -0
  146. package/dist/registry/index.d.ts +133 -0
  147. package/dist/registry/index.js +348 -0
  148. package/dist/registry/probe.d.ts +3 -0
  149. package/dist/registry/probe.js +177 -0
  150. package/dist/registry/sniff.d.ts +17 -0
  151. package/dist/registry/sniff.js +57 -0
  152. package/dist/styles/archive.css +10 -0
  153. package/dist/styles/audio.css +66 -0
  154. package/dist/styles/automotive.css +1 -0
  155. package/dist/styles/csv.css +262 -0
  156. package/dist/styles/excel.css +212 -0
  157. package/dist/styles/fallback.css +48 -0
  158. package/dist/styles/hdf5.css +3 -0
  159. package/dist/styles/hwp.css +12 -0
  160. package/dist/styles/image.css +115 -0
  161. package/dist/styles/json.css +342 -0
  162. package/dist/styles/jsonl.css +1 -0
  163. package/dist/styles/markdown.css +10 -0
  164. package/dist/styles/mat.css +2 -0
  165. package/dist/styles/mermaid.css +1 -0
  166. package/dist/styles/parquet.css +2 -0
  167. package/dist/styles/pdf.css +551 -0
  168. package/dist/styles/plantuml.css +1 -0
  169. package/dist/styles/ppt.css +1 -0
  170. package/dist/styles/proto.css +2 -0
  171. package/dist/styles/psd.css +1 -0
  172. package/dist/styles/shapefile.css +25 -0
  173. package/dist/styles/toml.css +1 -0
  174. package/dist/styles/video.css +74 -0
  175. package/dist/styles/word.css +685 -0
  176. package/dist/styles/yaml.css +1 -0
  177. package/dist/viewers/a2l/index.d.ts +15 -0
  178. package/dist/viewers/a2l/index.js +5 -0
  179. package/dist/viewers/archive/archive-preview-decoder.d.ts +4 -0
  180. package/dist/viewers/archive/archive-preview-decoder.js +223 -0
  181. package/dist/viewers/archive/controller.d.ts +24 -0
  182. package/dist/viewers/archive/controller.js +18 -0
  183. package/dist/viewers/archive/index.d.ts +25 -0
  184. package/dist/viewers/archive/index.js +230 -0
  185. package/dist/viewers/archive/preview.d.ts +2 -0
  186. package/dist/viewers/archive/preview.js +2 -0
  187. package/dist/viewers/archive/styles.d.ts +1 -0
  188. package/dist/viewers/archive/styles.js +11 -0
  189. package/dist/viewers/arxml/index.d.ts +15 -0
  190. package/dist/viewers/arxml/index.js +5 -0
  191. package/dist/viewers/asc/index.d.ts +15 -0
  192. package/dist/viewers/asc/index.js +5 -0
  193. package/dist/viewers/audio/controller.d.ts +33 -0
  194. package/dist/viewers/audio/controller.js +49 -0
  195. package/dist/viewers/audio/engine.d.ts +44 -0
  196. package/dist/viewers/audio/engine.js +108 -0
  197. package/dist/viewers/audio/index.d.ts +92 -0
  198. package/dist/viewers/audio/index.js +448 -0
  199. package/dist/viewers/audio/self-loading.d.ts +7 -0
  200. package/dist/viewers/audio/self-loading.js +42 -0
  201. package/dist/viewers/audio/styles.d.ts +1 -0
  202. package/dist/viewers/audio/styles.js +73 -0
  203. package/dist/viewers/automotive/index.d.ts +8 -0
  204. package/dist/viewers/automotive/index.js +152 -0
  205. package/dist/viewers/automotive/styles.d.ts +1 -0
  206. package/dist/viewers/automotive/styles.js +1 -0
  207. package/dist/viewers/avro/index.d.ts +15 -0
  208. package/dist/viewers/avro/index.js +5 -0
  209. package/dist/viewers/bag/index.d.ts +15 -0
  210. package/dist/viewers/bag/index.js +5 -0
  211. package/dist/viewers/blf/index.d.ts +15 -0
  212. package/dist/viewers/blf/index.js +5 -0
  213. package/dist/viewers/csv/controller.d.ts +126 -0
  214. package/dist/viewers/csv/controller.js +598 -0
  215. package/dist/viewers/csv/index.d.ts +48 -0
  216. package/dist/viewers/csv/index.js +846 -0
  217. package/dist/viewers/csv/styles.d.ts +1 -0
  218. package/dist/viewers/csv/styles.js +267 -0
  219. package/dist/viewers/db3/index.d.ts +15 -0
  220. package/dist/viewers/db3/index.js +5 -0
  221. package/dist/viewers/dbc/index.d.ts +15 -0
  222. package/dist/viewers/dbc/index.js +5 -0
  223. package/dist/viewers/diagram.d.ts +14 -0
  224. package/dist/viewers/diagram.js +95 -0
  225. package/dist/viewers/excel/controller.d.ts +108 -0
  226. package/dist/viewers/excel/controller.js +548 -0
  227. package/dist/viewers/excel/grid.d.ts +28 -0
  228. package/dist/viewers/excel/grid.js +99 -0
  229. package/dist/viewers/excel/index.d.ts +37 -0
  230. package/dist/viewers/excel/index.js +620 -0
  231. package/dist/viewers/excel/self-loading.d.ts +6 -0
  232. package/dist/viewers/excel/self-loading.js +13 -0
  233. package/dist/viewers/excel/styles.d.ts +1 -0
  234. package/dist/viewers/excel/styles.js +216 -0
  235. package/dist/viewers/fallback/index.d.ts +17 -0
  236. package/dist/viewers/fallback/index.js +130 -0
  237. package/dist/viewers/fallback/styles.d.ts +1 -0
  238. package/dist/viewers/fallback/styles.js +49 -0
  239. package/dist/viewers/hdf5/index.d.ts +19 -0
  240. package/dist/viewers/hdf5/index.js +170 -0
  241. package/dist/viewers/hdf5/styles.d.ts +1 -0
  242. package/dist/viewers/hdf5/styles.js +4 -0
  243. package/dist/viewers/hwp/controller.d.ts +19 -0
  244. package/dist/viewers/hwp/controller.js +22 -0
  245. package/dist/viewers/hwp/index.d.ts +39 -0
  246. package/dist/viewers/hwp/index.js +271 -0
  247. package/dist/viewers/hwp/self-loading.d.ts +2 -0
  248. package/dist/viewers/hwp/self-loading.js +6 -0
  249. package/dist/viewers/hwp/styles.d.ts +1 -0
  250. package/dist/viewers/hwp/styles.js +13 -0
  251. package/dist/viewers/image/controller.d.ts +210 -0
  252. package/dist/viewers/image/controller.js +336 -0
  253. package/dist/viewers/image/decode.d.ts +54 -0
  254. package/dist/viewers/image/decode.js +150 -0
  255. package/dist/viewers/image/index.d.ts +38 -0
  256. package/dist/viewers/image/index.js +749 -0
  257. package/dist/viewers/image/limits.d.ts +18 -0
  258. package/dist/viewers/image/limits.js +20 -0
  259. package/dist/viewers/image/styles.d.ts +1 -0
  260. package/dist/viewers/image/styles.js +119 -0
  261. package/dist/viewers/json/controller.d.ts +89 -0
  262. package/dist/viewers/json/controller.js +411 -0
  263. package/dist/viewers/json/index.d.ts +25 -0
  264. package/dist/viewers/json/index.js +503 -0
  265. package/dist/viewers/json/styles.d.ts +1 -0
  266. package/dist/viewers/json/styles.js +346 -0
  267. package/dist/viewers/json/transforms.d.ts +27 -0
  268. package/dist/viewers/json/transforms.js +253 -0
  269. package/dist/viewers/jsonl/controller.d.ts +48 -0
  270. package/dist/viewers/jsonl/controller.js +136 -0
  271. package/dist/viewers/jsonl/index.d.ts +22 -0
  272. package/dist/viewers/jsonl/index.js +184 -0
  273. package/dist/viewers/jsonl/styles.d.ts +1 -0
  274. package/dist/viewers/jsonl/styles.js +1 -0
  275. package/dist/viewers/markdown/controller.d.ts +50 -0
  276. package/dist/viewers/markdown/controller.js +62 -0
  277. package/dist/viewers/markdown/index.d.ts +64 -0
  278. package/dist/viewers/markdown/index.js +425 -0
  279. package/dist/viewers/markdown/math.d.ts +21 -0
  280. package/dist/viewers/markdown/math.js +100 -0
  281. package/dist/viewers/markdown/self-loading.d.ts +5 -0
  282. package/dist/viewers/markdown/self-loading.js +48 -0
  283. package/dist/viewers/markdown/styles.d.ts +1 -0
  284. package/dist/viewers/markdown/styles.js +11 -0
  285. package/dist/viewers/mat/index.d.ts +19 -0
  286. package/dist/viewers/mat/index.js +113 -0
  287. package/dist/viewers/mat/styles.d.ts +1 -0
  288. package/dist/viewers/mat/styles.js +3 -0
  289. package/dist/viewers/media.d.ts +9 -0
  290. package/dist/viewers/media.js +77 -0
  291. package/dist/viewers/mermaid/index.d.ts +17 -0
  292. package/dist/viewers/mermaid/index.js +6 -0
  293. package/dist/viewers/mermaid/self-loading.d.ts +2 -0
  294. package/dist/viewers/mermaid/self-loading.js +2 -0
  295. package/dist/viewers/mf4/index.d.ts +15 -0
  296. package/dist/viewers/mf4/index.js +5 -0
  297. package/dist/viewers/parquet/controller.d.ts +37 -0
  298. package/dist/viewers/parquet/controller.js +26 -0
  299. package/dist/viewers/parquet/index.d.ts +23 -0
  300. package/dist/viewers/parquet/index.js +134 -0
  301. package/dist/viewers/parquet/styles.d.ts +1 -0
  302. package/dist/viewers/parquet/styles.js +3 -0
  303. package/dist/viewers/pcap/index.d.ts +15 -0
  304. package/dist/viewers/pcap/index.js +5 -0
  305. package/dist/viewers/pcapng/index.d.ts +15 -0
  306. package/dist/viewers/pcapng/index.js +5 -0
  307. package/dist/viewers/pdf/controller.d.ts +120 -0
  308. package/dist/viewers/pdf/controller.js +191 -0
  309. package/dist/viewers/pdf/editing.d.ts +26 -0
  310. package/dist/viewers/pdf/editing.js +265 -0
  311. package/dist/viewers/pdf/index.d.ts +88 -0
  312. package/dist/viewers/pdf/index.js +1400 -0
  313. package/dist/viewers/pdf/self-loading.d.ts +6 -0
  314. package/dist/viewers/pdf/self-loading.js +14 -0
  315. package/dist/viewers/pdf/styles.d.ts +1 -0
  316. package/dist/viewers/pdf/styles.js +555 -0
  317. package/dist/viewers/plantuml/index.d.ts +17 -0
  318. package/dist/viewers/plantuml/index.js +6 -0
  319. package/dist/viewers/plantuml/self-loading.d.ts +2 -0
  320. package/dist/viewers/plantuml/self-loading.js +2 -0
  321. package/dist/viewers/ppt/chart.d.ts +8 -0
  322. package/dist/viewers/ppt/chart.js +83 -0
  323. package/dist/viewers/ppt/controller.d.ts +34 -0
  324. package/dist/viewers/ppt/controller.js +27 -0
  325. package/dist/viewers/ppt/index.d.ts +33 -0
  326. package/dist/viewers/ppt/index.js +101 -0
  327. package/dist/viewers/ppt/render.d.ts +5 -0
  328. package/dist/viewers/ppt/render.js +144 -0
  329. package/dist/viewers/ppt/self-loading.d.ts +9 -0
  330. package/dist/viewers/ppt/self-loading.js +4 -0
  331. package/dist/viewers/ppt/styles.d.ts +1 -0
  332. package/dist/viewers/ppt/styles.js +1 -0
  333. package/dist/viewers/proto/index.d.ts +17 -0
  334. package/dist/viewers/proto/index.js +170 -0
  335. package/dist/viewers/proto/styles.d.ts +1 -0
  336. package/dist/viewers/proto/styles.js +2 -0
  337. package/dist/viewers/psd/index.d.ts +27 -0
  338. package/dist/viewers/psd/index.js +39 -0
  339. package/dist/viewers/psd/self-loading.d.ts +10 -0
  340. package/dist/viewers/psd/self-loading.js +20 -0
  341. package/dist/viewers/psd/styles.d.ts +1 -0
  342. package/dist/viewers/psd/styles.js +1 -0
  343. package/dist/viewers/reqif/index.d.ts +15 -0
  344. package/dist/viewers/reqif/index.js +5 -0
  345. package/dist/viewers/shapefile/index.d.ts +35 -0
  346. package/dist/viewers/shapefile/index.js +336 -0
  347. package/dist/viewers/shapefile/self-loading.d.ts +7 -0
  348. package/dist/viewers/shapefile/self-loading.js +32 -0
  349. package/dist/viewers/shapefile/styles.d.ts +1 -0
  350. package/dist/viewers/shapefile/styles.js +28 -0
  351. package/dist/viewers/stp/index.d.ts +15 -0
  352. package/dist/viewers/stp/index.js +5 -0
  353. package/dist/viewers/structured-styles.d.ts +1 -0
  354. package/dist/viewers/structured-styles.js +1 -0
  355. package/dist/viewers/structured.d.ts +36 -0
  356. package/dist/viewers/structured.js +138 -0
  357. package/dist/viewers/toml/controller.d.ts +38 -0
  358. package/dist/viewers/toml/controller.js +61 -0
  359. package/dist/viewers/toml/index.d.ts +18 -0
  360. package/dist/viewers/toml/index.js +34 -0
  361. package/dist/viewers/types.d.ts +36 -0
  362. package/dist/viewers/types.js +9 -0
  363. package/dist/viewers/video/controller.d.ts +29 -0
  364. package/dist/viewers/video/controller.js +54 -0
  365. package/dist/viewers/video/index.d.ts +18 -0
  366. package/dist/viewers/video/index.js +305 -0
  367. package/dist/viewers/video/styles.d.ts +1 -0
  368. package/dist/viewers/video/styles.js +79 -0
  369. package/dist/viewers/word/controller.d.ts +19 -0
  370. package/dist/viewers/word/controller.js +22 -0
  371. package/dist/viewers/word/docx-preprocess.d.ts +63 -0
  372. package/dist/viewers/word/docx-preprocess.js +136 -0
  373. package/dist/viewers/word/index.d.ts +32 -0
  374. package/dist/viewers/word/index.js +187 -0
  375. package/dist/viewers/word/normalize-docx.d.ts +2 -0
  376. package/dist/viewers/word/normalize-docx.js +50 -0
  377. package/dist/viewers/word/paginate.d.ts +1 -0
  378. package/dist/viewers/word/paginate.js +1035 -0
  379. package/dist/viewers/word/self-loading.d.ts +2 -0
  380. package/dist/viewers/word/self-loading.js +7 -0
  381. package/dist/viewers/word/styles.d.ts +1 -0
  382. package/dist/viewers/word/styles.js +686 -0
  383. package/dist/viewers/yaml/controller.d.ts +42 -0
  384. package/dist/viewers/yaml/controller.js +41 -0
  385. package/dist/viewers/yaml/index.d.ts +21 -0
  386. package/dist/viewers/yaml/index.js +20 -0
  387. package/package.json +375 -0
@@ -0,0 +1,113 @@
1
+ import { parseMat } from '../../parsers/mat/index.js';
2
+ import { MountAbortedError, VIEWER_ROOT_CLASS } from '../types.js';
3
+ import { matViewerCss } from './styles.js';
4
+ export { parseMat } from '../../parsers/mat/index.js';
5
+ export { matViewerCss } from './styles.js';
6
+ export const MAT_VIEWER_META = {
7
+ id: 'mat', displayNameKey: 'mat.title', extensions: ['mat'], priority: 20,
8
+ requiredServices: [], optionalServices: ['clipboard'],
9
+ inputOwnership: 'borrows'
10
+ };
11
+ export const MAT_RENDER_ROW_LIMIT = 1000;
12
+ export async function mountMatViewer(input, container, ctx, options = {}) {
13
+ if (options.signal?.aborted)
14
+ throw new MountAbortedError();
15
+ const model = await parseMat(input.data);
16
+ if (options.signal?.aborted)
17
+ throw new MountAbortedError();
18
+ const t = ctx.i18n.t.bind(ctx.i18n);
19
+ let root = container;
20
+ if ((options.styleIsolation ?? 'shadow') === 'shadow' && typeof container.attachShadow === 'function') {
21
+ root = container.shadowRoot ?? container.attachShadow({ mode: 'open' });
22
+ const style = document.createElement('style');
23
+ style.textContent = matViewerCss;
24
+ root.append(style);
25
+ }
26
+ else
27
+ container.classList.add(VIEWER_ROOT_CLASS, 'omni-viewer--mat');
28
+ const el = (tag, className, text) => {
29
+ const node = document.createElement(tag);
30
+ if (className)
31
+ node.className = className;
32
+ if (text !== undefined)
33
+ node.textContent = text;
34
+ return node;
35
+ };
36
+ const disposers = [];
37
+ const on = (target, type, listener) => { target.addEventListener(type, listener); disposers.push(() => target.removeEventListener(type, listener)); };
38
+ const frame = el('div', 'omni-mat');
39
+ const header = el('header', 'omni-mat__header');
40
+ const heading = el('div', 'omni-mat__heading');
41
+ heading.append(el('h1', undefined, input.fileName), el('div', 'omni-mat__subtitle', `${model.title} · ${model.fileSize}`));
42
+ header.append(el('div', 'omni-mat__mark', 'MAT'), heading);
43
+ const summary = el('section', 'omni-mat__summary');
44
+ model.summary.forEach(item => { const card = el('div', 'omni-mat__stat'); card.append(el('span', 'omni-mat__stat-label', item.label), el('span', 'omni-mat__stat-value', String(item.value))); summary.append(card); });
45
+ const toolbar = el('nav', 'omni-mat__toolbar');
46
+ const content = el('main', 'omni-mat__content');
47
+ const search = el('input', 'omni-mat__search');
48
+ search.type = 'search';
49
+ search.placeholder = t('mat.search');
50
+ search.setAttribute('aria-label', t('mat.search'));
51
+ const copy = el('button', undefined, t('mat.copyJson'));
52
+ copy.type = 'button';
53
+ copy.disabled = !ctx.clipboard;
54
+ copy.title = ctx.clipboard ? '' : t('common.noClipboard');
55
+ let active = 0;
56
+ const buttons = new Map();
57
+ const addViewButton = (view, label) => { const button = el('button', undefined, label); button.type = 'button'; button.dataset.view = String(view); on(button, 'click', () => { active = view; render(); }); buttons.set(view, button); toolbar.append(button); };
58
+ model.tables.forEach((table, index) => addViewButton(index, table.title));
59
+ if (model.rawPreview)
60
+ addViewButton('raw', t('mat.rawPreview'));
61
+ toolbar.append(copy, search);
62
+ const warnings = model.warnings.length ? el('div', 'omni-mat__warnings', model.warnings.join(' · ')) : null;
63
+ const activeTable = () => typeof active === 'number' ? model.tables[active] : undefined;
64
+ const filteredRows = (table) => {
65
+ const query = search.value.trim().toLocaleLowerCase();
66
+ return query ? table.rows.filter(row => row.some(value => String(value).toLocaleLowerCase().includes(query))) : table.rows;
67
+ };
68
+ const renderTable = (table) => {
69
+ const wrap = el('div', 'omni-mat__table-wrap');
70
+ const tableNode = el('table');
71
+ const head = el('thead');
72
+ const headRow = el('tr');
73
+ table.headers.forEach(value => headRow.append(el('th', undefined, value)));
74
+ head.append(headRow);
75
+ tableNode.append(head);
76
+ const body = el('tbody');
77
+ const rows = filteredRows(table);
78
+ const shown = rows.slice(0, MAT_RENDER_ROW_LIMIT);
79
+ shown.forEach(row => { const tr = el('tr'); row.forEach(value => { const td = el('td', undefined, String(value)); td.title = String(value); tr.append(td); }); body.append(tr); });
80
+ tableNode.append(body);
81
+ wrap.append(tableNode);
82
+ if (rows.length)
83
+ content.append(el('div', 'omni-mat__caption', t('mat.rowsShown', { shown: shown.length, total: rows.length })), wrap);
84
+ else
85
+ content.append(el('div', 'omni-mat__empty', t('mat.noMatches')));
86
+ };
87
+ const render = () => {
88
+ content.replaceChildren();
89
+ buttons.forEach((button, view) => button.setAttribute('aria-pressed', String(view === active)));
90
+ search.hidden = active === 'raw';
91
+ copy.disabled = !ctx.clipboard;
92
+ const table = activeTable();
93
+ if (table)
94
+ renderTable(table);
95
+ else
96
+ content.append(el('pre', 'omni-mat__raw', model.rawPreview ?? ''));
97
+ };
98
+ on(search, 'input', render);
99
+ on(copy, 'click', () => {
100
+ if (!ctx.clipboard)
101
+ return;
102
+ void ctx.clipboard.writeText(JSON.stringify(model, null, 2)).catch(error => ctx.logger.log('error', `MAT JSON copy failed: ${String(error)}`));
103
+ });
104
+ frame.append(header, summary, toolbar, content);
105
+ if (warnings)
106
+ frame.append(warnings);
107
+ root.append(frame);
108
+ render();
109
+ return { dispose() { disposers.splice(0).forEach(dispose => dispose()); frame.remove(); if (root instanceof ShadowRoot)
110
+ root.replaceChildren();
111
+ else
112
+ container.classList.remove(VIEWER_ROOT_CLASS, 'omni-viewer--mat'); } };
113
+ }
@@ -0,0 +1 @@
1
+ export declare const matViewerCss = "\n:host{display:block;height:100%;color:var(--omni-fg,#d4d4d4);background:var(--omni-bg,#1e1e1e);font:13px system-ui,sans-serif}.omni-mat{display:flex;flex-direction:column;height:100%;min-height:360px}.omni-mat__header{display:flex;align-items:center;gap:12px;padding:12px 16px;border-bottom:1px solid var(--omni-border,#3c3c3c)}.omni-mat__mark{display:grid;place-items:center;width:42px;height:42px;border-radius:9px;background:linear-gradient(145deg,#e76f00,#9e3d00);color:white;font-weight:800;letter-spacing:.04em}.omni-mat__heading{min-width:0}.omni-mat__heading h1{font-size:16px;line-height:1.3;margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.omni-mat__subtitle{margin-top:3px;color:var(--omni-muted,#999)}.omni-mat__summary{display:flex;gap:8px;padding:10px 16px;overflow-x:auto;border-bottom:1px solid var(--omni-border,#3c3c3c)}.omni-mat__stat{min-width:110px;padding:8px 10px;border:1px solid var(--omni-border,#3c3c3c);border-radius:6px;background:var(--omni-panel,#252526)}.omni-mat__stat-label{display:block;color:var(--omni-muted,#999);font-size:11px;margin-bottom:4px}.omni-mat__stat-value{font-weight:650}.omni-mat__toolbar{display:flex;align-items:center;gap:8px;padding:8px 16px;border-bottom:1px solid var(--omni-border,#3c3c3c);flex-wrap:wrap}.omni-mat button,.omni-mat input{font:inherit;color:inherit;background:var(--omni-control,#2d2d2d);border:1px solid var(--omni-border,#555);border-radius:4px;padding:5px 9px}.omni-mat button{cursor:pointer}.omni-mat button[aria-pressed=true]{background:var(--omni-accent,#0e639c);border-color:var(--omni-accent,#0e639c);color:#fff}.omni-mat button:disabled{opacity:.55;cursor:default}.omni-mat__search{min-width:220px;margin-left:auto}.omni-mat__content{flex:1;min-height:0;overflow:auto;padding:14px 16px}.omni-mat__caption{margin:0 0 7px;color:var(--omni-muted,#999);font-size:12px}.omni-mat__table-wrap{overflow:auto;border:1px solid var(--omni-border,#3c3c3c);border-radius:6px}.omni-mat table{border-collapse:collapse;width:100%;min-width:720px;font-size:12px}.omni-mat th,.omni-mat td{padding:8px 10px;text-align:left;border-bottom:1px solid var(--omni-border,#3c3c3c);white-space:nowrap;max-width:520px;overflow:hidden;text-overflow:ellipsis}.omni-mat th{position:sticky;top:0;background:var(--omni-panel,#252526);z-index:1;color:var(--omni-muted,#bbb);font-weight:650}.omni-mat tr:last-child td{border-bottom:0}.omni-mat tbody tr:hover{background:color-mix(in srgb,var(--omni-accent,#0e639c) 12%,transparent)}.omni-mat__raw{margin:0;padding:14px;border:1px solid var(--omni-border,#3c3c3c);border-radius:6px;background:var(--omni-panel,#252526);font:12px/1.55 ui-monospace,monospace;white-space:pre;overflow:auto}.omni-mat__warnings{padding:8px 16px;color:#f0c674;border-top:1px solid var(--omni-border,#3c3c3c);background:color-mix(in srgb,#f0c674 8%,transparent)}.omni-mat__empty{padding:32px;text-align:center;color:var(--omni-muted,#999)}@media(max-width:700px){.omni-mat__summary{padding:8px}.omni-mat__toolbar,.omni-mat__content{padding-left:8px;padding-right:8px}.omni-mat__search{order:2;width:100%;margin-left:0}}\n";
@@ -0,0 +1,3 @@
1
+ export const matViewerCss = `
2
+ :host{display:block;height:100%;color:var(--omni-fg,#d4d4d4);background:var(--omni-bg,#1e1e1e);font:13px system-ui,sans-serif}.omni-mat{display:flex;flex-direction:column;height:100%;min-height:360px}.omni-mat__header{display:flex;align-items:center;gap:12px;padding:12px 16px;border-bottom:1px solid var(--omni-border,#3c3c3c)}.omni-mat__mark{display:grid;place-items:center;width:42px;height:42px;border-radius:9px;background:linear-gradient(145deg,#e76f00,#9e3d00);color:white;font-weight:800;letter-spacing:.04em}.omni-mat__heading{min-width:0}.omni-mat__heading h1{font-size:16px;line-height:1.3;margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.omni-mat__subtitle{margin-top:3px;color:var(--omni-muted,#999)}.omni-mat__summary{display:flex;gap:8px;padding:10px 16px;overflow-x:auto;border-bottom:1px solid var(--omni-border,#3c3c3c)}.omni-mat__stat{min-width:110px;padding:8px 10px;border:1px solid var(--omni-border,#3c3c3c);border-radius:6px;background:var(--omni-panel,#252526)}.omni-mat__stat-label{display:block;color:var(--omni-muted,#999);font-size:11px;margin-bottom:4px}.omni-mat__stat-value{font-weight:650}.omni-mat__toolbar{display:flex;align-items:center;gap:8px;padding:8px 16px;border-bottom:1px solid var(--omni-border,#3c3c3c);flex-wrap:wrap}.omni-mat button,.omni-mat input{font:inherit;color:inherit;background:var(--omni-control,#2d2d2d);border:1px solid var(--omni-border,#555);border-radius:4px;padding:5px 9px}.omni-mat button{cursor:pointer}.omni-mat button[aria-pressed=true]{background:var(--omni-accent,#0e639c);border-color:var(--omni-accent,#0e639c);color:#fff}.omni-mat button:disabled{opacity:.55;cursor:default}.omni-mat__search{min-width:220px;margin-left:auto}.omni-mat__content{flex:1;min-height:0;overflow:auto;padding:14px 16px}.omni-mat__caption{margin:0 0 7px;color:var(--omni-muted,#999);font-size:12px}.omni-mat__table-wrap{overflow:auto;border:1px solid var(--omni-border,#3c3c3c);border-radius:6px}.omni-mat table{border-collapse:collapse;width:100%;min-width:720px;font-size:12px}.omni-mat th,.omni-mat td{padding:8px 10px;text-align:left;border-bottom:1px solid var(--omni-border,#3c3c3c);white-space:nowrap;max-width:520px;overflow:hidden;text-overflow:ellipsis}.omni-mat th{position:sticky;top:0;background:var(--omni-panel,#252526);z-index:1;color:var(--omni-muted,#bbb);font-weight:650}.omni-mat tr:last-child td{border-bottom:0}.omni-mat tbody tr:hover{background:color-mix(in srgb,var(--omni-accent,#0e639c) 12%,transparent)}.omni-mat__raw{margin:0;padding:14px;border:1px solid var(--omni-border,#3c3c3c);border-radius:6px;background:var(--omni-panel,#252526);font:12px/1.55 ui-monospace,monospace;white-space:pre;overflow:auto}.omni-mat__warnings{padding:8px 16px;color:#f0c674;border-top:1px solid var(--omni-border,#3c3c3c);background:color-mix(in srgb,#f0c674 8%,transparent)}.omni-mat__empty{padding:32px;text-align:center;color:var(--omni-muted,#999)}@media(max-width:700px){.omni-mat__summary{padding:8px}.omni-mat__toolbar,.omni-mat__content{padding-left:8px;padding-right:8px}.omni-mat__search{order:2;width:100%;margin-left:0}}
3
+ `;
@@ -0,0 +1,9 @@
1
+ import type { HostContext } from '../host/index.js';
2
+ import { type MountOptions, type ViewerHandle, type ViewerInput } from './types.js';
3
+ export declare const mediaViewerCss = ".omni-media{box-sizing:border-box;min-height:100%;padding:20px;background:var(--omni-bg,#181818);color:var(--omni-fg,#eee);font:14px/1.45 system-ui,sans-serif}.omni-media *{box-sizing:border-box}.omni-media__header{display:flex;justify-content:space-between;gap:16px;margin-bottom:18px}.omni-media__title{font-size:18px;font-weight:650;overflow-wrap:anywhere}.omni-media__meta{color:var(--omni-muted,#aaa)}.omni-media__stage{display:grid;place-items:center;min-height:280px;border:1px solid var(--omni-border,#444);border-radius:10px;background:#000;padding:18px}.omni-media audio,.omni-media video{display:block;width:min(100%,1100px);max-height:75vh}.omni-media__warning{margin-top:12px;padding:10px 12px;border:1px solid #b98b2f;border-radius:7px;background:#3b2d10;color:#ffd98a;white-space:pre-wrap}";
4
+ export interface MediaMountOptions extends MountOptions {
5
+ maxBytes?: number;
6
+ createObjectUrl?(blob: Blob): string;
7
+ revokeObjectUrl?(url: string): void;
8
+ }
9
+ export declare function mountMediaViewer(kind: 'audio' | 'video', input: ViewerInput, container: HTMLElement, _ctx: HostContext, mimeType: string, warnings: string[], options?: MediaMountOptions): Promise<ViewerHandle>;
@@ -0,0 +1,77 @@
1
+ import { MountAbortedError, VIEWER_ROOT_CLASS } from './types.js';
2
+ export const mediaViewerCss = `.omni-media{box-sizing:border-box;min-height:100%;padding:20px;background:var(--omni-bg,#181818);color:var(--omni-fg,#eee);font:14px/1.45 system-ui,sans-serif}.omni-media *{box-sizing:border-box}.omni-media__header{display:flex;justify-content:space-between;gap:16px;margin-bottom:18px}.omni-media__title{font-size:18px;font-weight:650;overflow-wrap:anywhere}.omni-media__meta{color:var(--omni-muted,#aaa)}.omni-media__stage{display:grid;place-items:center;min-height:280px;border:1px solid var(--omni-border,#444);border-radius:10px;background:#000;padding:18px}.omni-media audio,.omni-media video{display:block;width:min(100%,1100px);max-height:75vh}.omni-media__warning{margin-top:12px;padding:10px 12px;border:1px solid #b98b2f;border-radius:7px;background:#3b2d10;color:#ffd98a;white-space:pre-wrap}`;
3
+ export async function mountMediaViewer(kind, input, container, _ctx, mimeType, warnings, options = {}) {
4
+ if (options.signal?.aborted)
5
+ throw new MountAbortedError();
6
+ const max = options.maxBytes ?? 128 * 1024 * 1024;
7
+ const root = options.styleIsolation !== 'scoped' && container.attachShadow ? (container.shadowRoot ?? container.attachShadow({ mode: 'open' })) : container;
8
+ if (root === container)
9
+ container.classList.add(VIEWER_ROOT_CLASS, `omni-viewer--${kind}`);
10
+ else {
11
+ const style = document.createElement('style');
12
+ style.textContent = mediaViewerCss;
13
+ root.append(style);
14
+ }
15
+ const shell = document.createElement('section');
16
+ shell.className = `${VIEWER_ROOT_CLASS} omni-media omni-media--${kind}`;
17
+ const header = document.createElement('header');
18
+ header.className = 'omni-media__header';
19
+ const title = document.createElement('div');
20
+ title.className = 'omni-media__title';
21
+ title.textContent = input.fileName;
22
+ const meta = document.createElement('div');
23
+ meta.className = 'omni-media__meta';
24
+ meta.textContent = `${mimeType} · ${formatBytes(input.data.byteLength)}`;
25
+ header.append(title, meta);
26
+ const stage = document.createElement('main');
27
+ stage.className = 'omni-media__stage';
28
+ const media = document.createElement(kind);
29
+ media.controls = true;
30
+ media.preload = input.data.byteLength > 50 * 1024 * 1024 ? 'metadata' : 'auto';
31
+ const messages = document.createElement('div');
32
+ messages.className = 'omni-media__warning';
33
+ messages.hidden = true;
34
+ shell.append(header, stage, messages);
35
+ root.append(shell);
36
+ let url;
37
+ let disposed = false;
38
+ const show = (message) => { messages.hidden = false; messages.textContent = [...warnings, message].filter(Boolean).join('\n'); };
39
+ if (input.data.byteLength > max)
40
+ show(`The file exceeds the ${formatBytes(max)} browser preview limit.`);
41
+ else if (input.data.byteLength === 0)
42
+ show('The media file is empty.');
43
+ else {
44
+ try {
45
+ const create = options.createObjectUrl ?? URL.createObjectURL.bind(URL);
46
+ url = create(new Blob([blobPart(input.data)], { type: mimeType }));
47
+ media.src = url;
48
+ stage.append(media);
49
+ if (warnings.length)
50
+ show('');
51
+ }
52
+ catch {
53
+ show('This environment cannot create a browser media source.');
54
+ }
55
+ }
56
+ const onError = () => show(`The browser could not decode this ${kind} codec. Try a host with the required codec or transcode the file.`);
57
+ media.addEventListener('error', onError);
58
+ if (options.signal?.aborted) {
59
+ media.removeEventListener('error', onError);
60
+ shell.remove();
61
+ if (url)
62
+ (options.revokeObjectUrl ?? URL.revokeObjectURL.bind(URL))(url);
63
+ throw new MountAbortedError();
64
+ }
65
+ return { dispose() { if (disposed)
66
+ return; disposed = true; media.pause(); media.removeAttribute('src'); media.load(); media.removeEventListener('error', onError); if (url)
67
+ (options.revokeObjectUrl ?? URL.revokeObjectURL.bind(URL))(url); shell.remove(); if (root === container)
68
+ container.classList.remove(VIEWER_ROOT_CLASS, `omni-viewer--${kind}`);
69
+ else
70
+ root.replaceChildren(); } };
71
+ }
72
+ function blobPart(data) { return data.buffer instanceof ArrayBuffer ? data : new Uint8Array(data); }
73
+ function formatBytes(bytes) { if (bytes < 1024)
74
+ return `${bytes} B`; const units = ['KiB', 'MiB', 'GiB']; let v = bytes / 1024, i = 0; while (v >= 1024 && i < 2) {
75
+ v /= 1024;
76
+ i++;
77
+ } return `${v.toFixed(v >= 10 ? 1 : 2)} ${units[i]}`; }
@@ -0,0 +1,17 @@
1
+ import type { HostContext } from '../../host/index.js';
2
+ import { diagramViewerCss, type DiagramMountOptions } from '../diagram.js';
3
+ import type { ViewerHandle, ViewerInput } from '../types.js';
4
+ export { parseMermaid } from '../../parsers/mermaid/index.js';
5
+ export { diagramViewerCss as mermaidViewerCss };
6
+ export type MermaidViewerContext = HostContext;
7
+ export type MermaidMountOptions = DiagramMountOptions;
8
+ export declare const MERMAID_VIEWER_META: {
9
+ id: string;
10
+ displayNameKey: string;
11
+ extensions: string[];
12
+ priority: number;
13
+ requiredServices: readonly [];
14
+ optionalServices: readonly [];
15
+ inputOwnership: "borrows";
16
+ };
17
+ export declare function mountMermaidViewer(input: ViewerInput, container: HTMLElement, ctx: MermaidViewerContext, options?: MermaidMountOptions): Promise<ViewerHandle>;
@@ -0,0 +1,6 @@
1
+ import { parseMermaid } from '../../parsers/mermaid/index.js';
2
+ import { diagramViewerCss, mountDiagramViewer } from '../diagram.js';
3
+ export { parseMermaid } from '../../parsers/mermaid/index.js';
4
+ export { diagramViewerCss as mermaidViewerCss };
5
+ export const MERMAID_VIEWER_META = { id: 'mermaid', displayNameKey: 'mermaid.title', extensions: ['mmd', 'mermaid'], priority: 20, requiredServices: [], optionalServices: [], inputOwnership: 'borrows' };
6
+ export function mountMermaidViewer(input, container, ctx, options = {}) { return mountDiagramViewer('mermaid', parseMermaid(input.data), input, container, ctx, options); }
@@ -0,0 +1,2 @@
1
+ import type { MermaidMountOptions } from './index.js';
2
+ export declare function loadMermaidRenderer(): Promise<Pick<MermaidMountOptions, 'renderMermaid'>>;
@@ -0,0 +1,2 @@
1
+ export async function loadMermaidRenderer() { const mod = await import('mermaid'); const mermaid = mod.default; if (!mermaid)
2
+ throw new Error('Mermaid renderer is unavailable.'); mermaid.initialize({ startOnLoad: false, securityLevel: 'strict', maxTextSize: 200_000, htmlLabels: false }); return { renderMermaid: async (id, source) => (await mermaid.render(id, source)).svg }; }
@@ -0,0 +1,15 @@
1
+ import type { AutomotiveViewerContext } from '../automotive/index.js';
2
+ import type { MountOptions, ViewerHandle, ViewerInput } from '../types.js';
3
+ export { parseMf4 } from '../../parsers/mf4/index.js';
4
+ export { automotiveViewerCss as mf4ViewerCss } from '../automotive/styles.js';
5
+ export type Mf4ViewerContext = AutomotiveViewerContext;
6
+ export declare const MF4_VIEWER_META: {
7
+ id: string;
8
+ displayNameKey: string;
9
+ extensions: string[];
10
+ priority: number;
11
+ requiredServices: readonly [];
12
+ optionalServices: readonly ["clipboard"];
13
+ inputOwnership: "borrows";
14
+ };
15
+ export declare const mountMf4Viewer: (input: ViewerInput, container: HTMLElement, ctx: Mf4ViewerContext, options?: MountOptions) => Promise<ViewerHandle>;
@@ -0,0 +1,5 @@
1
+ import { mountAutomotiveViewer } from '../automotive/index.js';
2
+ export { parseMf4 } from '../../parsers/mf4/index.js';
3
+ export { automotiveViewerCss as mf4ViewerCss } from '../automotive/styles.js';
4
+ export const MF4_VIEWER_META = { id: 'mf4', displayNameKey: 'mf4.title', extensions: ['mf4'], priority: 20, requiredServices: [], optionalServices: ['clipboard'], inputOwnership: 'borrows' };
5
+ export const mountMf4Viewer = (input, container, ctx, options = {}) => mountAutomotiveViewer('mf4', input, container, ctx, options);
@@ -0,0 +1,37 @@
1
+ import type { ParquetCell, ParquetDocument } from '../../parsers/parquet/index.js';
2
+ export interface ParquetViewState {
3
+ search: string;
4
+ sortColumn: number | null;
5
+ sortDirection: 'asc' | 'desc' | null;
6
+ page: number;
7
+ pageSize: number;
8
+ pageCount: number;
9
+ matchedRows: number;
10
+ viewMode: 'table' | 'raw';
11
+ }
12
+ export type ParquetAction = {
13
+ type: 'search';
14
+ value: string;
15
+ } | {
16
+ type: 'sort';
17
+ column: number;
18
+ } | {
19
+ type: 'page';
20
+ page: number;
21
+ } | {
22
+ type: 'page-size';
23
+ size: number;
24
+ } | {
25
+ type: 'view';
26
+ mode: 'table' | 'raw';
27
+ };
28
+ export interface ParquetController {
29
+ readonly state: ParquetViewState;
30
+ dispatch(action: ParquetAction): void;
31
+ appendRows(rows: ParquetCell[][]): void;
32
+ subscribe(fn: (s: ParquetViewState) => void): () => void;
33
+ visibleRows(): ParquetCell[][];
34
+ filteredRows(): readonly ParquetCell[][];
35
+ toJson(): string;
36
+ }
37
+ export declare function createParquetController(document: ParquetDocument): ParquetController;
@@ -0,0 +1,26 @@
1
+ export function createParquetController(document) {
2
+ const listeners = new Set();
3
+ let state = { search: '', sortColumn: null, sortDirection: null, page: 0, pageSize: 100, pageCount: 1, matchedRows: document.rows.length, viewMode: 'table' };
4
+ let filtered = document.rows.slice();
5
+ const text = (v) => typeof v === 'object' && v !== null ? JSON.stringify(v) : String(v ?? '');
6
+ function rebuild() {
7
+ const q = state.search.toLowerCase();
8
+ filtered = document.rows.filter(r => !q || r.some(v => text(v).toLowerCase().includes(q)));
9
+ if (state.sortColumn !== null && state.sortDirection) {
10
+ const c = state.sortColumn, d = state.sortDirection === 'asc' ? 1 : -1;
11
+ filtered = filtered.map((row, i) => ({ row, i })).sort((a, b) => { const x = text(a.row[c] ?? null), y = text(b.row[c] ?? null); if (x === '' || y === '')
12
+ return x === y ? a.i - b.i : x === '' ? 1 : -1; const xn = Number(x), yn = Number(y); const cmp = Number.isFinite(xn) && Number.isFinite(yn) ? xn - yn : x.localeCompare(y, undefined, { numeric: true }); return cmp ? cmp * d : a.i - b.i; }).map(x => x.row);
13
+ }
14
+ const pageCount = Math.max(1, Math.ceil(filtered.length / state.pageSize));
15
+ state = { ...state, matchedRows: filtered.length, pageCount, page: Math.min(state.page, pageCount - 1) };
16
+ }
17
+ return { get state() { return state; }, dispatch(a) { if (a.type === 'search')
18
+ state = { ...state, search: a.value, page: 0 }; if (a.type === 'sort') {
19
+ const same = state.sortColumn === a.column;
20
+ const next = !same ? 'asc' : state.sortDirection === 'asc' ? 'desc' : state.sortDirection === 'desc' ? null : 'asc';
21
+ state = { ...state, sortColumn: next ? a.column : null, sortDirection: next, page: 0 };
22
+ } if (a.type === 'page')
23
+ state = { ...state, page: Math.max(0, Math.min(a.page, state.pageCount - 1)) }; if (a.type === 'page-size')
24
+ state = { ...state, pageSize: a.size, page: 0 }; if (a.type === 'view')
25
+ state = { ...state, viewMode: a.mode }; rebuild(); listeners.forEach(f => f(state)); }, appendRows(rows) { document.rows.push(...rows); document.loadedRows = document.rows.length; document.isLimited = document.loadedRows < document.totalRows; rebuild(); listeners.forEach(f => f(state)); }, subscribe(fn) { listeners.add(fn); return () => listeners.delete(fn); }, visibleRows() { const start = state.page * state.pageSize; return filtered.slice(start, start + state.pageSize); }, filteredRows() { return filtered; }, toJson() { return JSON.stringify({ schema: document.schema, headers: document.headers, rows: filtered, metadata: { totalRows: document.totalRows, loadedRows: document.loadedRows, columns: document.headers.length, fileSizeBytes: document.fileSizeBytes } }, null, 2); } };
26
+ }
@@ -0,0 +1,23 @@
1
+ import type { ClipboardService, FileSaveService, HostContext } from '../../host/index.js';
2
+ import { type ParquetParseOptions } from '../../parsers/parquet/index.js';
3
+ import { type MountOptions, type ViewerHandle, type ViewerInput } from '../types.js';
4
+ export { createParquetController } from './controller.js';
5
+ export type { ParquetController, ParquetAction, ParquetViewState } from './controller.js';
6
+ export { parquetViewerCss } from './styles.js';
7
+ export declare const PARQUET_VIEWER_META: {
8
+ id: string;
9
+ displayNameKey: string;
10
+ extensions: string[];
11
+ priority: number;
12
+ requiredServices: readonly [];
13
+ optionalServices: readonly ["clipboard", "save"];
14
+ inputOwnership: "borrows";
15
+ };
16
+ export type ParquetViewerContext = HostContext & {
17
+ clipboard?: ClipboardService;
18
+ save?: FileSaveService;
19
+ };
20
+ export interface ParquetMountOptions extends MountOptions {
21
+ parse?: ParquetParseOptions;
22
+ }
23
+ export declare function mountParquetViewer(input: ViewerInput, container: HTMLElement, ctx: ParquetViewerContext, options?: ParquetMountOptions): Promise<ViewerHandle>;
@@ -0,0 +1,134 @@
1
+ import { PARQUET_PREVIEW_ROWS, parseParquet } from '../../parsers/parquet/index.js';
2
+ import { MountAbortedError, VIEWER_ROOT_CLASS } from '../types.js';
3
+ import { createParquetController } from './controller.js';
4
+ import { parquetViewerCss } from './styles.js';
5
+ export { createParquetController } from './controller.js';
6
+ export { parquetViewerCss } from './styles.js';
7
+ export const PARQUET_VIEWER_META = { id: 'parquet', displayNameKey: 'parquet.title', extensions: ['parquet'], priority: 20, requiredServices: [], optionalServices: ['clipboard', 'save'], inputOwnership: 'borrows' };
8
+ export async function mountParquetViewer(input, container, ctx, options = {}) {
9
+ if (options.signal?.aborted)
10
+ throw new MountAbortedError();
11
+ const parseOptions = { ...options.parse };
12
+ if (options.signal)
13
+ parseOptions.signal = options.signal;
14
+ let doc;
15
+ try {
16
+ doc = await parseParquet(input.data, parseOptions);
17
+ }
18
+ catch (error) {
19
+ if (options.signal?.aborted)
20
+ throw new MountAbortedError();
21
+ throw error;
22
+ }
23
+ const ctl = createParquetController(doc), off = [];
24
+ let disposed = false, loadingMore = false;
25
+ let root = container;
26
+ const columnWidths = doc.headers.map((header, index) => estimateColumnWidth(header, index));
27
+ let resize = null;
28
+ if ((options.styleIsolation ?? 'shadow') === 'shadow' && container.attachShadow) {
29
+ root = container.shadowRoot ?? container.attachShadow({ mode: 'open' });
30
+ const style = el('style');
31
+ style.textContent = parquetViewerCss;
32
+ root.append(style);
33
+ }
34
+ else
35
+ container.classList.add(VIEWER_ROOT_CLASS, 'omni-viewer--parquet');
36
+ const frame = el('div', 'omni-parquet'), bar = el('div', 'omni-parquet__toolbar'), search = el('input'), view = el('button'), copy = el('button', undefined, ctx.i18n.t('parquet.copyJson')), save = el('button', undefined, ctx.i18n.t('parquet.exportJson')), info = el('span', 'omni-parquet__info');
37
+ frame.tabIndex = 0;
38
+ search.type = 'search';
39
+ search.placeholder = ctx.i18n.t('parquet.search');
40
+ bar.append(search, view, copy, save, info);
41
+ const warning = el('div', 'omni-parquet__warning'), warningText = el('span'), loadMore = el('button');
42
+ warning.append(warningText, loadMore);
43
+ const loadError = el('div', 'omni-parquet__error'), wrap = el('div', 'omni-parquet__wrap'), foot = el('div', 'omni-parquet__footer'), prev = el('button', undefined, ctx.i18n.t('common.prevPage')), next = el('button', undefined, ctx.i18n.t('common.nextPage')), page = el('span'), menu = el('div', 'omni-parquet__menu');
44
+ foot.append(prev, page, next);
45
+ frame.append(bar, warning, loadError, wrap, foot, menu);
46
+ root.append(frame);
47
+ const on = (target, type, fn) => { target.addEventListener(type, fn); off.push(() => target.removeEventListener(type, fn)); };
48
+ on(search, 'input', () => ctl.dispatch({ type: 'search', value: search.value }));
49
+ on(view, 'click', () => ctl.dispatch({ type: 'view', mode: ctl.state.viewMode === 'table' ? 'raw' : 'table' }));
50
+ on(prev, 'click', () => ctl.dispatch({ type: 'page', page: ctl.state.page - 1 }));
51
+ on(next, 'click', () => ctl.dispatch({ type: 'page', page: ctl.state.page + 1 }));
52
+ on(loadMore, 'click', () => void loadNext());
53
+ on(frame, 'keydown', (event) => { const e = event; if (!(e.ctrlKey || e.metaKey))
54
+ return; if (e.key.toLowerCase() === 'f') {
55
+ e.preventDefault();
56
+ search.focus();
57
+ }
58
+ else if (e.key.toLowerCase() === 'c' && ctx.clipboard) {
59
+ e.preventDefault();
60
+ void copyTable();
61
+ }
62
+ else if (e.key.toLowerCase() === 'j' && ctx.save) {
63
+ e.preventDefault();
64
+ void exportJson();
65
+ } });
66
+ on(document, 'mousemove', (event) => { if (!resize)
67
+ return; applyColumnWidth(resize.column, resize.startWidth + event.clientX - resize.startX); });
68
+ on(document, 'mouseup', () => { resize = null; });
69
+ on(document, 'click', () => hideMenu());
70
+ on(wrap, 'scroll', () => hideMenu());
71
+ if (ctx.clipboard)
72
+ on(copy, 'click', () => void ctx.clipboard.writeText(ctl.toJson()));
73
+ else {
74
+ copy.disabled = true;
75
+ copy.title = ctx.i18n.t('common.noClipboard');
76
+ }
77
+ if (ctx.save)
78
+ on(save, 'click', () => void exportJson());
79
+ else {
80
+ save.disabled = true;
81
+ save.title = ctx.i18n.t('common.noFileSave');
82
+ }
83
+ async function exportJson() { if (ctx.save)
84
+ await ctx.save.saveFile(input.fileName.replace(/\.parquet$/i, '') + '-export.json', new TextEncoder().encode(ctl.toJson()), 'application/json'); }
85
+ async function copyText(text) { if (ctx.clipboard)
86
+ await ctx.clipboard.writeText(text); }
87
+ async function copyTable() { const header = doc.headers.join('\t'), rows = ctl.filteredRows().map(row => row.map(formatCell).join('\t')).join('\n'); await copyText(`${header}\n${rows}`); }
88
+ function copyColumn(index) { return copyText(ctl.filteredRows().map(row => formatCell(row[index] ?? null)).join('\n')); }
89
+ function rowJson(row) { return JSON.stringify(Object.fromEntries(doc.headers.map((header, index) => [header || `col${index}`, row[index] ?? null])), null, 2); }
90
+ function showMenu(event, items) { event.preventDefault(); event.stopPropagation(); menu.replaceChildren(); items.forEach(item => { const button = el('button', undefined, item.label); button.disabled = !ctx.clipboard && item.label !== ctx.i18n.t('parquet.autoFit'); button.onclick = () => { item.action(); hideMenu(); }; menu.append(button); }); menu.style.left = `${event.clientX}px`; menu.style.top = `${event.clientY}px`; menu.style.display = 'flex'; }
91
+ function hideMenu() { menu.style.display = 'none'; }
92
+ function estimateColumnWidth(header, index) { const sample = Math.max(0, ...doc.rows.slice(0, 50).map(row => formatCell(row[index] ?? null).length * 7 + 24)); return Math.min(360, Math.max(120, header.length * 8 + 68, sample)); }
93
+ function applyColumnWidth(index, width) { columnWidths[index] = Math.max(48, Math.min(800, width)); const col = wrap.querySelectorAll('col')[index]; if (col)
94
+ col.style.width = `${columnWidths[index]}px`; const table = wrap.querySelector('table'); if (table)
95
+ table.style.width = `${columnWidths.reduce((sum, value) => sum + value, 0)}px`; }
96
+ function autoFit(index) { applyColumnWidth(index, estimateColumnWidth(doc.headers[index] ?? '', index)); }
97
+ async function loadNext() { if (loadingMore || disposed || !doc.isLimited)
98
+ return; loadingMore = true; loadError.textContent = ''; renderStatus(); try {
99
+ const chunk = await parseParquet(input.data, { ...parseOptions, rowStart: doc.loadedRows });
100
+ if (!disposed)
101
+ ctl.appendRows(chunk.rows);
102
+ }
103
+ catch (error) {
104
+ if (!disposed && !options.signal?.aborted)
105
+ loadError.textContent = ctx.i18n.t('parquet.loadFailed', { message: error instanceof Error ? error.message : String(error) });
106
+ }
107
+ finally {
108
+ loadingMore = false;
109
+ if (!disposed)
110
+ renderStatus();
111
+ } }
112
+ function renderStatus() { warning.style.display = doc.isLimited ? 'flex' : 'none'; warningText.textContent = ctx.i18n.t('parquet.limited', { loaded: doc.loadedRows, total: doc.totalRows }); loadMore.disabled = loadingMore; loadMore.textContent = ctx.i18n.t(loadingMore ? 'parquet.loading' : 'parquet.loadMore', { count: PARQUET_PREVIEW_ROWS }); }
113
+ function render() { wrap.replaceChildren(); renderStatus(); info.textContent = `${ctl.state.matchedRows.toLocaleString()} / ${doc.loadedRows.toLocaleString()} ${ctx.i18n.t('parquet.rows')} · ${doc.headers.length} ${ctx.i18n.t('parquet.columns')}`; view.textContent = ctx.i18n.t(ctl.state.viewMode === 'table' ? 'parquet.raw' : 'parquet.table'); page.textContent = ctx.i18n.t('common.page', { page: ctl.state.page + 1, pages: ctl.state.pageCount }); prev.disabled = ctl.state.page === 0; next.disabled = ctl.state.page + 1 >= ctl.state.pageCount; if (ctl.state.viewMode === 'raw') {
114
+ wrap.append(el('pre', undefined, ctl.toJson()));
115
+ return;
116
+ } const table = el('table'), cols = el('colgroup'), head = el('thead'), hr = el('tr'); columnWidths.forEach(width => { const col = el('col'); col.style.width = `${width}px`; cols.append(col); }); table.style.width = `${columnWidths.reduce((sum, value) => sum + value, 0)}px`; doc.headers.forEach((h, i) => { const th = el('th'), label = el('span', undefined, h), handle = el('span', 'omni-parquet__resizer'); th.title = h; handle.title = ctx.i18n.t('parquet.resize'); handle.setAttribute('role', 'separator'); handle.tabIndex = 0; handle.onclick = (event) => event.stopPropagation(); handle.onmousedown = (event) => { event.preventDefault(); event.stopPropagation(); resize = { column: i, startX: event.clientX, startWidth: columnWidths[i] ?? 120 }; }; handle.ondblclick = (event) => { event.preventDefault(); event.stopPropagation(); autoFit(i); }; handle.onkeydown = (event) => { if (event.key === 'Enter') {
117
+ event.preventDefault();
118
+ event.stopPropagation();
119
+ autoFit(i);
120
+ }
121
+ else if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') {
122
+ event.preventDefault();
123
+ event.stopPropagation();
124
+ applyColumnWidth(i, (columnWidths[i] ?? 120) + (event.key === 'ArrowRight' ? 10 : -10));
125
+ } }; th.onclick = () => ctl.dispatch({ type: 'sort', column: i }); th.oncontextmenu = (event) => showMenu(event, [{ label: ctx.i18n.t('parquet.copyColumn'), action: () => void copyColumn(i) }, { label: ctx.i18n.t('parquet.autoFit'), action: () => autoFit(i) }]); th.append(label, handle); hr.append(th); }); head.append(hr); const body = el('tbody'); ctl.visibleRows().forEach(row => { const tr = el('tr'); row.forEach((cell, index) => { const value = formatCell(cell), td = el('td', undefined, value); td.title = value; if (cell == null)
126
+ td.style.fontStyle = 'italic'; td.ondblclick = () => void copyText(value); td.oncontextmenu = (event) => showMenu(event, [{ label: ctx.i18n.t('parquet.copyCell'), action: () => void copyText(value) }, { label: ctx.i18n.t('parquet.copyRow'), action: () => void copyText(rowJson(row)) }, { label: ctx.i18n.t('parquet.copyColumn'), action: () => void copyColumn(index) }]); tr.append(td); }); body.append(tr); }); table.append(cols, head, body); wrap.append(table); }
127
+ const unsubscribe = ctl.subscribe(render);
128
+ render();
129
+ return { dispose() { disposed = true; unsubscribe(); off.splice(0).forEach(fn => fn()); frame.remove(); } };
130
+ }
131
+ function el(tag, className, text) { const node = document.createElement(tag); if (className)
132
+ node.className = className; if (text !== undefined)
133
+ node.textContent = text; return node; }
134
+ function formatCell(cell) { return typeof cell === 'object' && cell !== null ? JSON.stringify(cell) : String(cell ?? ''); }
@@ -0,0 +1 @@
1
+ export declare const parquetViewerCss = "\n.omni-parquet{font:13px system-ui;color:var(--omni-fg,#222);height:100%;display:flex;flex-direction:column;position:relative}.omni-parquet__toolbar,.omni-parquet__footer{display:flex;gap:8px;align-items:center;padding:8px;border-bottom:1px solid var(--omni-border,#ddd)}.omni-parquet__toolbar input{min-width:180px;padding:5px}.omni-parquet__info{margin-left:auto;color:var(--omni-muted,#666)}.omni-parquet__warning{padding:8px;background:var(--omni-warning-bg,#fff4ce);gap:12px;align-items:center}.omni-parquet__error{color:var(--omni-error,#b42318);padding:0 8px}.omni-parquet__error:empty{display:none}.omni-parquet__wrap{overflow:auto;flex:1}.omni-parquet table{border-collapse:collapse;table-layout:fixed}.omni-parquet th,.omni-parquet td{border:1px solid var(--omni-border,#ddd);padding:6px 8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.omni-parquet th{position:sticky;top:0;background:var(--omni-header-bg,#f5f5f5);text-align:left;cursor:pointer}.omni-parquet th{position:sticky}.omni-parquet__resizer{position:absolute;right:-3px;top:0;width:7px;height:100%;cursor:col-resize;z-index:2}.omni-parquet__resizer:focus{outline:2px solid var(--omni-focus,#2684ff)}.omni-parquet__menu{display:none;position:fixed;z-index:1000;flex-direction:column;min-width:160px;padding:4px;background:var(--omni-menu-bg,#fff);border:1px solid var(--omni-border,#ccc);box-shadow:0 4px 16px #0003}.omni-parquet__menu button{text-align:left;border:0;background:transparent;padding:6px 10px}.omni-parquet__menu button:hover{background:var(--omni-hover,#eee)}.omni-parquet pre{margin:0;padding:12px;white-space:pre-wrap}.omni-parquet button:disabled{opacity:.5}\n";
@@ -0,0 +1,3 @@
1
+ export const parquetViewerCss = `
2
+ .omni-parquet{font:13px system-ui;color:var(--omni-fg,#222);height:100%;display:flex;flex-direction:column;position:relative}.omni-parquet__toolbar,.omni-parquet__footer{display:flex;gap:8px;align-items:center;padding:8px;border-bottom:1px solid var(--omni-border,#ddd)}.omni-parquet__toolbar input{min-width:180px;padding:5px}.omni-parquet__info{margin-left:auto;color:var(--omni-muted,#666)}.omni-parquet__warning{padding:8px;background:var(--omni-warning-bg,#fff4ce);gap:12px;align-items:center}.omni-parquet__error{color:var(--omni-error,#b42318);padding:0 8px}.omni-parquet__error:empty{display:none}.omni-parquet__wrap{overflow:auto;flex:1}.omni-parquet table{border-collapse:collapse;table-layout:fixed}.omni-parquet th,.omni-parquet td{border:1px solid var(--omni-border,#ddd);padding:6px 8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.omni-parquet th{position:sticky;top:0;background:var(--omni-header-bg,#f5f5f5);text-align:left;cursor:pointer}.omni-parquet th{position:sticky}.omni-parquet__resizer{position:absolute;right:-3px;top:0;width:7px;height:100%;cursor:col-resize;z-index:2}.omni-parquet__resizer:focus{outline:2px solid var(--omni-focus,#2684ff)}.omni-parquet__menu{display:none;position:fixed;z-index:1000;flex-direction:column;min-width:160px;padding:4px;background:var(--omni-menu-bg,#fff);border:1px solid var(--omni-border,#ccc);box-shadow:0 4px 16px #0003}.omni-parquet__menu button{text-align:left;border:0;background:transparent;padding:6px 10px}.omni-parquet__menu button:hover{background:var(--omni-hover,#eee)}.omni-parquet pre{margin:0;padding:12px;white-space:pre-wrap}.omni-parquet button:disabled{opacity:.5}
3
+ `;
@@ -0,0 +1,15 @@
1
+ import type { AutomotiveViewerContext } from '../automotive/index.js';
2
+ import type { MountOptions, ViewerHandle, ViewerInput } from '../types.js';
3
+ export { parsePcap } from '../../parsers/pcap/index.js';
4
+ export { automotiveViewerCss as pcapViewerCss } from '../automotive/styles.js';
5
+ export type PcapViewerContext = AutomotiveViewerContext;
6
+ export declare const PCAP_VIEWER_META: {
7
+ id: string;
8
+ displayNameKey: string;
9
+ extensions: string[];
10
+ priority: number;
11
+ requiredServices: readonly [];
12
+ optionalServices: readonly ["clipboard"];
13
+ inputOwnership: "borrows";
14
+ };
15
+ export declare const mountPcapViewer: (input: ViewerInput, container: HTMLElement, ctx: PcapViewerContext, options?: MountOptions) => Promise<ViewerHandle>;
@@ -0,0 +1,5 @@
1
+ import { mountAutomotiveViewer } from '../automotive/index.js';
2
+ export { parsePcap } from '../../parsers/pcap/index.js';
3
+ export { automotiveViewerCss as pcapViewerCss } from '../automotive/styles.js';
4
+ export const PCAP_VIEWER_META = { id: 'pcap', displayNameKey: 'pcap.title', extensions: ['pcap'], priority: 20, requiredServices: [], optionalServices: ['clipboard'], inputOwnership: 'borrows' };
5
+ export const mountPcapViewer = (input, container, ctx, options = {}) => mountAutomotiveViewer('pcap', input, container, ctx, options);
@@ -0,0 +1,15 @@
1
+ import type { AutomotiveViewerContext } from '../automotive/index.js';
2
+ import type { MountOptions, ViewerHandle, ViewerInput } from '../types.js';
3
+ export { parsePcapng } from '../../parsers/pcapng/index.js';
4
+ export { automotiveViewerCss as pcapngViewerCss } from '../automotive/styles.js';
5
+ export type PcapngViewerContext = AutomotiveViewerContext;
6
+ export declare const PCAPNG_VIEWER_META: {
7
+ id: string;
8
+ displayNameKey: string;
9
+ extensions: string[];
10
+ priority: number;
11
+ requiredServices: readonly [];
12
+ optionalServices: readonly ["clipboard"];
13
+ inputOwnership: "borrows";
14
+ };
15
+ export declare const mountPcapngViewer: (input: ViewerInput, container: HTMLElement, ctx: PcapngViewerContext, options?: MountOptions) => Promise<ViewerHandle>;
@@ -0,0 +1,5 @@
1
+ import { mountAutomotiveViewer } from '../automotive/index.js';
2
+ export { parsePcapng } from '../../parsers/pcapng/index.js';
3
+ export { automotiveViewerCss as pcapngViewerCss } from '../automotive/styles.js';
4
+ export const PCAPNG_VIEWER_META = { id: 'pcapng', displayNameKey: 'pcapng.title', extensions: ['pcapng'], priority: 20, requiredServices: [], optionalServices: ['clipboard'], inputOwnership: 'borrows' };
5
+ export const mountPcapngViewer = (input, container, ctx, options = {}) => mountAutomotiveViewer('pcapng', input, container, ctx, options);