@l1yp/file-viewer 0.1.1 → 0.1.2

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 (431) hide show
  1. package/README.md +1 -0
  2. package/dist/FileViewer.js +2 -0
  3. package/dist/FileViewer.js.map +1 -0
  4. package/dist/FileViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  5. package/dist/FileViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  6. package/dist/components/AppxViewer.js +2 -0
  7. package/dist/components/AppxViewer.js.map +1 -0
  8. package/dist/components/AppxViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  9. package/dist/components/AppxViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  10. package/dist/components/ArchiveBrowser.js +2 -0
  11. package/dist/components/ArchiveBrowser.js.map +1 -0
  12. package/dist/components/ArchiveBrowser.vue_vue_type_script_setup_true_lang.js +2 -0
  13. package/dist/components/ArchiveBrowser.vue_vue_type_script_setup_true_lang.js.map +1 -0
  14. package/dist/components/AudioViewer.js +2 -0
  15. package/dist/components/AudioViewer.js.map +1 -0
  16. package/dist/components/AudioViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  17. package/dist/components/AudioViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  18. package/dist/components/BinObjBrowser.js +2 -0
  19. package/dist/components/BinObjBrowser.js.map +1 -0
  20. package/dist/components/BinObjBrowser.vue_vue_type_script_setup_true_lang.js +2 -0
  21. package/dist/components/BinObjBrowser.vue_vue_type_script_setup_true_lang.js.map +1 -0
  22. package/dist/components/CertViewer.js +2 -0
  23. package/dist/components/CertViewer.js.map +1 -0
  24. package/dist/components/CertViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  25. package/dist/components/CertViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  26. package/dist/components/ClassViewer.js +2 -0
  27. package/dist/components/ClassViewer.js.map +1 -0
  28. package/dist/components/ClassViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  29. package/dist/components/ClassViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  30. package/dist/components/CodeBlock.js +2 -0
  31. package/dist/components/CodeBlock.js.map +1 -0
  32. package/dist/components/CodeBlock.vue_vue_type_script_setup_true_lang.js +2 -0
  33. package/dist/components/CodeBlock.vue_vue_type_script_setup_true_lang.js.map +1 -0
  34. package/dist/components/CodeView.js +2 -0
  35. package/dist/components/CodeView.js.map +1 -0
  36. package/dist/components/CodeView.vue_vue_type_script_setup_true_lang.js +2 -0
  37. package/dist/components/CodeView.vue_vue_type_script_setup_true_lang.js.map +1 -0
  38. package/dist/components/CsvViewer.js +2 -0
  39. package/dist/components/CsvViewer.js.map +1 -0
  40. package/dist/components/CsvViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  41. package/dist/components/CsvViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  42. package/dist/components/DicomViewer.js +2 -0
  43. package/dist/components/DicomViewer.js.map +1 -0
  44. package/dist/components/DicomViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  45. package/dist/components/DicomViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  46. package/dist/components/DocxNavigationPane.js +2 -0
  47. package/dist/components/DocxNavigationPane.js.map +1 -0
  48. package/dist/components/DocxNavigationPane.vue_vue_type_script_setup_true_lang.js +2 -0
  49. package/dist/components/DocxNavigationPane.vue_vue_type_script_setup_true_lang.js.map +1 -0
  50. package/dist/components/DocxViewer.js +2 -0
  51. package/dist/components/DocxViewer.js.map +1 -0
  52. package/dist/components/DocxViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  53. package/dist/components/DocxViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  54. package/dist/components/DrawioViewer.js +2 -0
  55. package/dist/components/DrawioViewer.js.map +1 -0
  56. package/dist/components/DrawioViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  57. package/dist/components/DrawioViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  58. package/dist/components/DxfViewer.js +2 -0
  59. package/dist/components/DxfViewer.js.map +1 -0
  60. package/dist/components/DxfViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  61. package/dist/components/DxfViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  62. package/dist/components/EbookViewer.js +2 -0
  63. package/dist/components/EbookViewer.js.map +1 -0
  64. package/dist/components/EbookViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  65. package/dist/components/EbookViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  66. package/dist/components/EmlViewer.js +2 -0
  67. package/dist/components/EmlViewer.js.map +1 -0
  68. package/dist/components/EmlViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  69. package/dist/components/EmlViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  70. package/dist/components/EplViewer.js +2 -0
  71. package/dist/components/EplViewer.js.map +1 -0
  72. package/dist/components/EplViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  73. package/dist/components/EplViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  74. package/dist/components/FileViewerBody.js +2 -0
  75. package/dist/components/FileViewerBody.js.map +1 -0
  76. package/dist/components/FileViewerBody.vue_vue_type_script_setup_true_lang.js +2 -0
  77. package/dist/components/FileViewerBody.vue_vue_type_script_setup_true_lang.js.map +1 -0
  78. package/dist/components/FileViewerPanel.js +2 -0
  79. package/dist/components/FileViewerPanel.js.map +1 -0
  80. package/dist/components/FileViewerPanel.vue_vue_type_script_setup_true_lang.js +2 -0
  81. package/dist/components/FileViewerPanel.vue_vue_type_script_setup_true_lang.js.map +1 -0
  82. package/dist/components/FontViewer.js +2 -0
  83. package/dist/components/FontViewer.js.map +1 -0
  84. package/dist/components/FontViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  85. package/dist/components/FontViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  86. package/dist/components/FrontmatterCard.js +2 -0
  87. package/dist/components/FrontmatterCard.js.map +1 -0
  88. package/dist/components/FrontmatterCard.vue_vue_type_script_setup_true_lang.js +2 -0
  89. package/dist/components/FrontmatterCard.vue_vue_type_script_setup_true_lang.js.map +1 -0
  90. package/dist/components/GeoViewer.js +2 -0
  91. package/dist/components/GeoViewer.js.map +1 -0
  92. package/dist/components/GeoViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  93. package/dist/components/GeoViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  94. package/dist/components/HarViewer.js +2 -0
  95. package/dist/components/HarViewer.js.map +1 -0
  96. package/dist/components/HarViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  97. package/dist/components/HarViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  98. package/dist/components/HexViewer.js +2 -0
  99. package/dist/components/HexViewer.js.map +1 -0
  100. package/dist/components/HexViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  101. package/dist/components/HexViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  102. package/dist/components/HprofViewer.js +2 -0
  103. package/dist/components/HprofViewer.js.map +1 -0
  104. package/dist/components/HprofViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  105. package/dist/components/HprofViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  106. package/dist/components/ImageLightbox.js +2 -0
  107. package/dist/components/ImageLightbox.js.map +1 -0
  108. package/dist/components/ImageLightbox.vue_vue_type_script_setup_true_lang.js +2 -0
  109. package/dist/components/ImageLightbox.vue_vue_type_script_setup_true_lang.js.map +1 -0
  110. package/dist/components/InlineText.js +2 -0
  111. package/dist/components/InlineText.js.map +1 -0
  112. package/dist/components/JksViewer.js +2 -0
  113. package/dist/components/JksViewer.js.map +1 -0
  114. package/dist/components/JksViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  115. package/dist/components/JksViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  116. package/dist/components/JsonlViewer.js +2 -0
  117. package/dist/components/JsonlViewer.js.map +1 -0
  118. package/dist/components/JsonlViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  119. package/dist/components/JsonlViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  120. package/dist/components/LogViewer.js +2 -0
  121. package/dist/components/LogViewer.js.map +1 -0
  122. package/dist/components/LogViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  123. package/dist/components/LogViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  124. package/dist/components/LrcViewer.js +2 -0
  125. package/dist/components/LrcViewer.js.map +1 -0
  126. package/dist/components/LrcViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  127. package/dist/components/LrcViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  128. package/dist/components/MarkdownTable.js +2 -0
  129. package/dist/components/MarkdownTable.js.map +1 -0
  130. package/dist/components/MarkdownTable.vue_vue_type_script_setup_true_lang.js +2 -0
  131. package/dist/components/MarkdownTable.vue_vue_type_script_setup_true_lang.js.map +1 -0
  132. package/dist/components/MarkdownText.js +2 -0
  133. package/dist/components/MarkdownText.js.map +1 -0
  134. package/dist/components/MhtViewer.js +2 -0
  135. package/dist/components/MhtViewer.js.map +1 -0
  136. package/dist/components/MhtViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  137. package/dist/components/MhtViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  138. package/dist/components/MindMapView.js +2 -0
  139. package/dist/components/MindMapView.js.map +1 -0
  140. package/dist/components/MindMapView.vue_vue_type_script_setup_true_lang.js +2 -0
  141. package/dist/components/MindMapView.vue_vue_type_script_setup_true_lang.js.map +1 -0
  142. package/dist/components/MissingDependency.js +2 -0
  143. package/dist/components/MissingDependency.js.map +1 -0
  144. package/dist/components/MissingDependency.vue_vue_type_script_setup_true_lang.js +2 -0
  145. package/dist/components/MissingDependency.vue_vue_type_script_setup_true_lang.js.map +1 -0
  146. package/dist/components/ModelViewer.js +2 -0
  147. package/dist/components/ModelViewer.js.map +1 -0
  148. package/dist/components/ModelViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  149. package/dist/components/ModelViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  150. package/dist/components/MsiViewer.js +2 -0
  151. package/dist/components/MsiViewer.js.map +1 -0
  152. package/dist/components/MsiViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  153. package/dist/components/MsiViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  154. package/dist/components/NotebookViewer.js +2 -0
  155. package/dist/components/NotebookViewer.js.map +1 -0
  156. package/dist/components/NotebookViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  157. package/dist/components/NotebookViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  158. package/dist/components/PdfViewer.js +2 -0
  159. package/dist/components/PdfViewer.js.map +1 -0
  160. package/dist/components/PdfViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  161. package/dist/components/PdfViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  162. package/dist/components/PptxNavigationPane.js +2 -0
  163. package/dist/components/PptxNavigationPane.js.map +1 -0
  164. package/dist/components/PptxNavigationPane.vue_vue_type_script_setup_true_lang.js +2 -0
  165. package/dist/components/PptxNavigationPane.vue_vue_type_script_setup_true_lang.js.map +1 -0
  166. package/dist/components/PptxViewer.js +3 -1
  167. package/dist/components/PptxViewer.js.map +1 -0
  168. package/dist/components/PptxViewer.vue_vue_type_script_setup_true_lang.js +55 -49
  169. package/dist/components/PptxViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  170. package/dist/components/PsdViewer.js +2 -0
  171. package/dist/components/PsdViewer.js.map +1 -0
  172. package/dist/components/PsdViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  173. package/dist/components/PsdViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  174. package/dist/components/QmcAudioViewer.js +2 -0
  175. package/dist/components/QmcAudioViewer.js.map +1 -0
  176. package/dist/components/QmcAudioViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  177. package/dist/components/QmcAudioViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  178. package/dist/components/RasterViewer.js +2 -0
  179. package/dist/components/RasterViewer.js.map +1 -0
  180. package/dist/components/RasterViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  181. package/dist/components/RasterViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  182. package/dist/components/RtfViewer.js +2 -0
  183. package/dist/components/RtfViewer.js.map +1 -0
  184. package/dist/components/RtfViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  185. package/dist/components/RtfViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  186. package/dist/components/SevenZipBrowser.js +2 -0
  187. package/dist/components/SevenZipBrowser.js.map +1 -0
  188. package/dist/components/SevenZipBrowser.vue_vue_type_script_setup_true_lang.js +2 -0
  189. package/dist/components/SevenZipBrowser.vue_vue_type_script_setup_true_lang.js.map +1 -0
  190. package/dist/components/SqliteViewer.js +2 -0
  191. package/dist/components/SqliteViewer.js.map +1 -0
  192. package/dist/components/SqliteViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  193. package/dist/components/SqliteViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  194. package/dist/components/SubtitleViewer.js +2 -0
  195. package/dist/components/SubtitleViewer.js.map +1 -0
  196. package/dist/components/SubtitleViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  197. package/dist/components/SubtitleViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  198. package/dist/components/XlsxChart.js +2 -0
  199. package/dist/components/XlsxChart.js.map +1 -0
  200. package/dist/components/XlsxChart.vue_vue_type_script_setup_true_lang.js +2 -0
  201. package/dist/components/XlsxChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  202. package/dist/components/XlsxViewer.js +2 -0
  203. package/dist/components/XlsxViewer.js.map +1 -0
  204. package/dist/components/XlsxViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  205. package/dist/components/XlsxViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  206. package/dist/components/XmindViewer.js +2 -0
  207. package/dist/components/XmindViewer.js.map +1 -0
  208. package/dist/components/XmindViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  209. package/dist/components/XmindViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  210. package/dist/components/ZipBrowser.js +2 -0
  211. package/dist/components/ZipBrowser.js.map +1 -0
  212. package/dist/components/ZipBrowser.vue_vue_type_script_setup_true_lang.js +2 -0
  213. package/dist/components/ZipBrowser.vue_vue_type_script_setup_true_lang.js.map +1 -0
  214. package/dist/components/ZoomImage.js +2 -0
  215. package/dist/components/ZoomImage.js.map +1 -0
  216. package/dist/components/ZoomImage.vue_vue_type_script_setup_true_lang.js +2 -0
  217. package/dist/components/ZoomImage.vue_vue_type_script_setup_true_lang.js.map +1 -0
  218. package/dist/components/epl/EplCodeBlock.js +2 -0
  219. package/dist/components/epl/EplCodeBlock.js.map +1 -0
  220. package/dist/components/epl/EplCodeBlock.vue_vue_type_script_setup_true_lang.js +2 -0
  221. package/dist/components/epl/EplCodeBlock.vue_vue_type_script_setup_true_lang.js.map +1 -0
  222. package/dist/components/epl/EplDoc.js +2 -0
  223. package/dist/components/epl/EplDoc.js.map +1 -0
  224. package/dist/components/epl/EplDoc.vue_vue_type_script_setup_true_lang.js +2 -0
  225. package/dist/components/epl/EplDoc.vue_vue_type_script_setup_true_lang.js.map +1 -0
  226. package/dist/components/epl/EplMethod.js +2 -0
  227. package/dist/components/epl/EplMethod.js.map +1 -0
  228. package/dist/components/epl/EplMethod.vue_vue_type_script_setup_true_lang.js +2 -0
  229. package/dist/components/epl/EplMethod.vue_vue_type_script_setup_true_lang.js.map +1 -0
  230. package/dist/components/epl/EplResource.js +2 -0
  231. package/dist/components/epl/EplResource.js.map +1 -0
  232. package/dist/components/epl/EplResource.vue_vue_type_script_setup_true_lang.js +2 -0
  233. package/dist/components/epl/EplResource.vue_vue_type_script_setup_true_lang.js.map +1 -0
  234. package/dist/components/epl/EplTree.js +2 -0
  235. package/dist/components/epl/EplTree.js.map +1 -0
  236. package/dist/components/epl/EplTree.vue_vue_type_script_setup_true_lang.js +2 -0
  237. package/dist/components/epl/EplTree.vue_vue_type_script_setup_true_lang.js.map +1 -0
  238. package/dist/components/epl/EplVarTable.js +2 -0
  239. package/dist/components/epl/EplVarTable.js.map +1 -0
  240. package/dist/components/epl/EplVarTable.vue_vue_type_script_setup_true_lang.js +2 -0
  241. package/dist/components/epl/EplVarTable.vue_vue_type_script_setup_true_lang.js.map +1 -0
  242. package/dist/components/epl/numbering.js +2 -0
  243. package/dist/components/epl/numbering.js.map +1 -0
  244. package/dist/components/icons/Icon.js +2 -0
  245. package/dist/components/icons/Icon.js.map +1 -0
  246. package/dist/components/icons/Icon.vue_vue_type_script_setup_true_lang.js +2 -0
  247. package/dist/components/icons/Icon.vue_vue_type_script_setup_true_lang.js.map +1 -0
  248. package/dist/components/icons/iconPaths.js +2 -0
  249. package/dist/components/icons/iconPaths.js.map +1 -0
  250. package/dist/components/optionalViewer.js +2 -0
  251. package/dist/components/optionalViewer.js.map +1 -0
  252. package/dist/components/ui/ClampBlock.js +2 -0
  253. package/dist/components/ui/ClampBlock.js.map +1 -0
  254. package/dist/composables/useElementNavigation.js +2 -0
  255. package/dist/composables/useElementNavigation.js.map +1 -0
  256. package/dist/composables/useFileViewer.js +2 -0
  257. package/dist/composables/useFileViewer.js.map +1 -0
  258. package/dist/composables/useLightbox.js +2 -0
  259. package/dist/composables/useLightbox.js.map +1 -0
  260. package/dist/composables/useLogRules.js +2 -0
  261. package/dist/composables/useLogRules.js.map +1 -0
  262. package/dist/lib/aes.js +2 -0
  263. package/dist/lib/aes.js.map +1 -0
  264. package/dist/lib/appx.js +2 -0
  265. package/dist/lib/appx.js.map +1 -0
  266. package/dist/lib/archiveHtml.js +2 -0
  267. package/dist/lib/archiveHtml.js.map +1 -0
  268. package/dist/lib/asn1.js +2 -0
  269. package/dist/lib/asn1.js.map +1 -0
  270. package/dist/lib/binobj.js +2 -0
  271. package/dist/lib/binobj.js.map +1 -0
  272. package/dist/lib/brotli.js +2 -0
  273. package/dist/lib/brotli.js.map +1 -0
  274. package/dist/lib/bzip2.js +2 -0
  275. package/dist/lib/bzip2.js.map +1 -0
  276. package/dist/lib/classfile.js +2 -0
  277. package/dist/lib/classfile.js.map +1 -0
  278. package/dist/lib/codePreview.js +2 -0
  279. package/dist/lib/codePreview.js.map +1 -0
  280. package/dist/lib/codefold.js +2 -0
  281. package/dist/lib/codefold.js.map +1 -0
  282. package/dist/lib/codeformat.js +2 -0
  283. package/dist/lib/codeformat.js.map +1 -0
  284. package/dist/lib/csv.js +2 -0
  285. package/dist/lib/csv.js.map +1 -0
  286. package/dist/lib/des.js +2 -0
  287. package/dist/lib/des.js.map +1 -0
  288. package/dist/lib/diagram.js +2 -0
  289. package/dist/lib/diagram.js.map +1 -0
  290. package/dist/lib/dicom.js +2 -0
  291. package/dist/lib/dicom.js.map +1 -0
  292. package/dist/lib/dicomCodecs.js +2 -0
  293. package/dist/lib/dicomCodecs.js.map +1 -0
  294. package/dist/lib/dicomRender.js +2 -0
  295. package/dist/lib/dicomRender.js.map +1 -0
  296. package/dist/lib/docxNavigation.js +2 -0
  297. package/dist/lib/docxNavigation.js.map +1 -0
  298. package/dist/lib/dxf.js +2 -0
  299. package/dist/lib/dxf.js.map +1 -0
  300. package/dist/lib/eml.js +2 -0
  301. package/dist/lib/eml.js.map +1 -0
  302. package/dist/lib/encoding.js +2 -0
  303. package/dist/lib/encoding.js.map +1 -0
  304. package/dist/lib/epl/code/codeDataParser.js +2 -0
  305. package/dist/lib/epl/code/codeDataParser.js.map +1 -0
  306. package/dist/lib/epl/code/codeLines.js +2 -0
  307. package/dist/lib/epl/code/codeLines.js.map +1 -0
  308. package/dist/lib/epl/code/textCode.js +2 -0
  309. package/dist/lib/epl/code/textCode.js.map +1 -0
  310. package/dist/lib/epl/eplDocument.js +2 -0
  311. package/dist/lib/epl/eplDocument.js.map +1 -0
  312. package/dist/lib/epl/imageList.js +2 -0
  313. package/dist/lib/epl/imageList.js.map +1 -0
  314. package/dist/lib/epl/index.js +2 -0
  315. package/dist/lib/epl/index.js.map +1 -0
  316. package/dist/lib/epl/io/binaryReader.js +2 -0
  317. package/dist/lib/epl/io/binaryReader.js.map +1 -0
  318. package/dist/lib/epl/io/encoding.js +2 -0
  319. package/dist/lib/epl/io/encoding.js.map +1 -0
  320. package/dist/lib/epl/model/eplSystemId.js +2 -0
  321. package/dist/lib/epl/model/eplSystemId.js.map +1 -0
  322. package/dist/lib/epl/names/eplLibData.js +2 -0
  323. package/dist/lib/epl/names/eplLibData.js.map +1 -0
  324. package/dist/lib/epl/names/idToNameMap.js +2 -0
  325. package/dist/lib/epl/names/idToNameMap.js.map +1 -0
  326. package/dist/lib/epl/names/libNameProvider.js +2 -0
  327. package/dist/lib/epl/names/libNameProvider.js.map +1 -0
  328. package/dist/lib/epl/program.js +2 -0
  329. package/dist/lib/epl/program.js.map +1 -0
  330. package/dist/lib/epl/projectFileReader.js +2 -0
  331. package/dist/lib/epl/projectFileReader.js.map +1 -0
  332. package/dist/lib/fb2.js +2 -0
  333. package/dist/lib/fb2.js.map +1 -0
  334. package/dist/lib/fileType.js +2 -0
  335. package/dist/lib/fileType.js.map +1 -0
  336. package/dist/lib/fonts.js +2 -0
  337. package/dist/lib/fonts.js.map +1 -0
  338. package/dist/lib/format.js +2 -0
  339. package/dist/lib/format.js.map +1 -0
  340. package/dist/lib/frontmatter.js +2 -0
  341. package/dist/lib/frontmatter.js.map +1 -0
  342. package/dist/lib/geo.js +2 -0
  343. package/dist/lib/geo.js.map +1 -0
  344. package/dist/lib/har.js +2 -0
  345. package/dist/lib/har.js.map +1 -0
  346. package/dist/lib/highlight.js +2 -0
  347. package/dist/lib/highlight.js.map +1 -0
  348. package/dist/lib/highlightLangs.js +2 -0
  349. package/dist/lib/highlightLangs.js.map +1 -0
  350. package/dist/lib/hprof.js +2 -0
  351. package/dist/lib/hprof.js.map +1 -0
  352. package/dist/lib/ipynb.js +2 -0
  353. package/dist/lib/ipynb.js.map +1 -0
  354. package/dist/lib/jks.js +2 -0
  355. package/dist/lib/jks.js.map +1 -0
  356. package/dist/lib/jsonl.js +2 -0
  357. package/dist/lib/jsonl.js.map +1 -0
  358. package/dist/lib/lrc.js +2 -0
  359. package/dist/lib/lrc.js.map +1 -0
  360. package/dist/lib/lzma.js +2 -0
  361. package/dist/lib/lzma.js.map +1 -0
  362. package/dist/lib/markdown/blocks.js +2 -0
  363. package/dist/lib/markdown/blocks.js.map +1 -0
  364. package/dist/lib/markdown/inline.js +2 -0
  365. package/dist/lib/markdown/inline.js.map +1 -0
  366. package/dist/lib/markdown/math.js +2 -0
  367. package/dist/lib/markdown/math.js.map +1 -0
  368. package/dist/lib/markdown/segmentize.js +2 -0
  369. package/dist/lib/markdown/segmentize.js.map +1 -0
  370. package/dist/lib/markdown/styles.js +2 -0
  371. package/dist/lib/markdown/styles.js.map +1 -0
  372. package/dist/lib/mht.js +2 -0
  373. package/dist/lib/mht.js.map +1 -0
  374. package/dist/lib/midi.js +2 -0
  375. package/dist/lib/midi.js.map +1 -0
  376. package/dist/lib/mime.js +2 -0
  377. package/dist/lib/mime.js.map +1 -0
  378. package/dist/lib/mindmap.js +2 -0
  379. package/dist/lib/mindmap.js.map +1 -0
  380. package/dist/lib/mobi.js +2 -0
  381. package/dist/lib/mobi.js.map +1 -0
  382. package/dist/lib/msi.js +2 -0
  383. package/dist/lib/msi.js.map +1 -0
  384. package/dist/lib/optionalDep.js +2 -0
  385. package/dist/lib/optionalDep.js.map +1 -0
  386. package/dist/lib/pkcs12.js +2 -0
  387. package/dist/lib/pkcs12.js.map +1 -0
  388. package/dist/lib/pptxNavigation.js +2 -0
  389. package/dist/lib/pptxNavigation.js.map +1 -0
  390. package/dist/lib/qmc.js +2 -0
  391. package/dist/lib/qmc.js.map +1 -0
  392. package/dist/lib/rar.js +2 -0
  393. package/dist/lib/rar.js.map +1 -0
  394. package/dist/lib/rawPreview.js +2 -0
  395. package/dist/lib/rawPreview.js.map +1 -0
  396. package/dist/lib/rc2.js +2 -0
  397. package/dist/lib/rc2.js.map +1 -0
  398. package/dist/lib/resolveInput.js +2 -0
  399. package/dist/lib/resolveInput.js.map +1 -0
  400. package/dist/lib/rtf.js +2 -0
  401. package/dist/lib/rtf.js.map +1 -0
  402. package/dist/lib/sevenZip.js +2 -0
  403. package/dist/lib/sevenZip.js.map +1 -0
  404. package/dist/lib/sha1.js +2 -0
  405. package/dist/lib/sha1.js.map +1 -0
  406. package/dist/lib/sha256.js +2 -0
  407. package/dist/lib/sha256.js.map +1 -0
  408. package/dist/lib/speechAudio.js +2 -0
  409. package/dist/lib/speechAudio.js.map +1 -0
  410. package/dist/lib/sqlite.js +2 -0
  411. package/dist/lib/sqlite.js.map +1 -0
  412. package/dist/lib/subtitle.js +2 -0
  413. package/dist/lib/subtitle.js.map +1 -0
  414. package/dist/lib/tarball.js +2 -0
  415. package/dist/lib/tarball.js.map +1 -0
  416. package/dist/lib/viewerFormats.js +2 -0
  417. package/dist/lib/viewerFormats.js.map +1 -0
  418. package/dist/lib/viewerKind.js +2 -0
  419. package/dist/lib/viewerKind.js.map +1 -0
  420. package/dist/lib/x509.js +2 -0
  421. package/dist/lib/x509.js.map +1 -0
  422. package/dist/lib/xlsx.js +2 -0
  423. package/dist/lib/xlsx.js.map +1 -0
  424. package/dist/lib/xlsxCharts.js +2 -0
  425. package/dist/lib/xlsxCharts.js.map +1 -0
  426. package/dist/lib/xmind.js +2 -0
  427. package/dist/lib/xmind.js.map +1 -0
  428. package/dist/lib/zip.js +2 -0
  429. package/dist/lib/zip.js.map +1 -0
  430. package/dist/style.css +1 -1
  431. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EplDoc.js","names":[],"sources":["../../../src/components/epl/EplDoc.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { EplProgram, EplClassView } from '@/lib/epl'\nimport EplVarTable, { type EplCol } from './EplVarTable.vue'\nimport EplMethod from './EplMethod.vue'\nimport EplResource from './EplResource.vue'\nimport type { EplDocRef } from './docTypes'\nimport { LineCounter, type MethodNos } from './numbering'\n\n/**\n * The right-pane content for the active document. Switches on {@link EplDocRef.kind}: a class renders its\n * header table + member table + every method ({@link EplMethod}); the project-level tables (全局变量 /\n * 自定义数据类型 / Dll命令 / 常量表 / 图片·声音资源 / 资源表 / 模块引用表) render as bordered tables matching\n * the IDE (图片/声音 as media cards via {@link EplResource}).\n *\n * Every document carries a single continuous line-number gutter (see {@link LineCounter}): each *body* row and\n * code line takes the next number, header rows none. The numbering is threaded here (only the active kind\n * computes) and handed to the tables / methods so the gutter stays continuous across the whole document.\n */\nconst props = defineProps<{ program: EplProgram; doc: EplDocRef }>()\n\nconst cls = computed<EplClassView | null>(() =>\n props.doc.kind === 'class'\n ? (props.program.classes.find((c) => c.id === props.doc.classId) ?? null)\n : null,\n)\n\n// ── numbering: only the active document kind threads a counter ────────────────────────────────────\nconst classModel = computed(() => {\n if (props.doc.kind !== 'class' || !cls.value) return null\n const c = new LineCounter()\n const k = cls.value\n return {\n cls: k,\n header: c.next(),\n members: c.take(k.members.length),\n methods: k.methods.map((m) => ({\n method: m,\n nos: {\n head: c.next(),\n params: c.take(m.parameters.length),\n locals: c.take(m.locals.length),\n // A hidden terminator row (noNo) renders but takes no number — the gutter stays continuous around it.\n code: m.lines.map((ln) => (ln.noNo ? null : c.next())),\n } satisfies MethodNos,\n })),\n }\n})\n\nconst globalsNos = computed(() =>\n props.doc.kind === 'globals' ? new LineCounter().take(props.program.globals.length) : [],\n)\nconst structModels = computed(() => {\n if (props.doc.kind !== 'structs') return []\n const c = new LineCounter()\n return props.program.structs.map((st) => ({\n st,\n header: c.next(),\n members: c.take(st.members.length),\n }))\n})\nconst dllModels = computed(() => {\n if (props.doc.kind !== 'dll') return []\n const c = new LineCounter()\n return props.program.dllDeclares.map((d) => ({\n d,\n header: c.next(),\n lib: c.next(),\n entry: c.next(),\n params: c.take(d.parameters.length),\n }))\n})\nconst constantsNos = computed(() =>\n props.doc.kind === 'constants' ? new LineCounter().take(props.program.constants.length) : [],\n)\nconst formModels = computed(() => {\n if (props.doc.kind !== 'forms') return []\n const c = new LineCounter()\n return props.program.forms.map((f) => ({\n f,\n header: c.next(),\n elements: c.take(f.elements.length),\n }))\n})\nconst librariesNos = computed(() =>\n props.doc.kind === 'libraries' ? new LineCounter().take(props.program.libraries.length) : [],\n)\n\nconst MEMBER_COLS: EplCol[] = [\n { key: 'name', label: '变量名' },\n { key: 'type', label: '类型' },\n { key: 'arrayBound', label: '数组' },\n { key: 'comment', label: '备注' },\n]\nconst GLOBAL_COLS: EplCol[] = [\n { key: 'name', label: '变量名' },\n { key: 'type', label: '类型' },\n { key: 'public', label: '公开' },\n { key: 'arrayBound', label: '数组' },\n { key: 'comment', label: '备注' },\n]\nconst STRUCT_MEMBER_COLS: EplCol[] = [\n { key: 'name', label: '成员名' },\n { key: 'type', label: '类型' },\n { key: 'byAddress', label: '传址' },\n { key: 'arrayBound', label: '数组' },\n { key: 'comment', label: '备注' },\n]\n</script>\n\n<template>\n <div class=\"doc\">\n <!-- ── class / 程序集 / 窗口程序集 ───────────────────────────────────────── -->\n <template v-if=\"doc.kind === 'class' && classModel\">\n <table class=\"hd\">\n <thead>\n <tr v-if=\"classModel.cls.kind === 'class'\">\n <th class=\"hd__gut\" />\n <th>类名</th>\n <th>基类</th>\n <th class=\"hd__bool\">公开</th>\n <th class=\"hd__cmt\">备注</th>\n </tr>\n <tr v-else>\n <th class=\"hd__gut\" />\n <th>程序集名</th>\n <th>保留</th>\n <th>保留</th>\n <th class=\"hd__cmt\">备注</th>\n </tr>\n </thead>\n <tbody>\n <tr v-if=\"classModel.cls.kind === 'class'\">\n <td class=\"hd__gut\">{{ classModel.header }}</td>\n <td class=\"hd__ident\">{{ classModel.cls.name }}</td>\n <td class=\"hd__ident\">{{ classModel.cls.baseName }}</td>\n <td class=\"hd__bool\" />\n <td class=\"hd__cmt hd__cmttext\">{{ classModel.cls.comment }}</td>\n </tr>\n <tr v-else>\n <td class=\"hd__gut\">{{ classModel.header }}</td>\n <td class=\"hd__ident\">{{ classModel.cls.name }}</td>\n <td />\n <td />\n <td class=\"hd__cmt hd__cmttext\">{{ classModel.cls.comment }}</td>\n </tr>\n </tbody>\n </table>\n\n <EplVarTable\n v-if=\"classModel.cls.members.length\"\n :columns=\"MEMBER_COLS\"\n :rows=\"classModel.cls.members\"\n :nos=\"classModel.members\"\n />\n\n <div class=\"doc__methods\">\n <EplMethod\n v-for=\"mm in classModel.methods\"\n :key=\"mm.method.id\"\n :method=\"mm.method\"\n :nos=\"mm.nos\"\n />\n <p v-if=\"!classModel.cls.methods.length\" class=\"doc__empty\">(无子程序)</p>\n </div>\n </template>\n\n <!-- ── 全局变量表 ──────────────────────────────────────────────────────── -->\n <template v-else-if=\"doc.kind === 'globals'\">\n <h3 class=\"doc__h\">全局变量表</h3>\n <EplVarTable\n v-if=\"program.globals.length\"\n :columns=\"GLOBAL_COLS\"\n :rows=\"program.globals\"\n :nos=\"globalsNos\"\n />\n <p v-else class=\"doc__empty\">(无全局变量)</p>\n </template>\n\n <!-- ── 自定义数据类型表 ─────────────────────────────────────────────────── -->\n <template v-else-if=\"doc.kind === 'structs'\">\n <h3 class=\"doc__h\">自定义数据类型表</h3>\n <section v-for=\"sm in structModels\" :key=\"sm.st.id\" class=\"blk\">\n <table class=\"hd\">\n <thead>\n <tr>\n <th class=\"hd__gut\" />\n <th>数据类型名</th>\n <th class=\"hd__bool\">公开</th>\n <th class=\"hd__cmt\">备注</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td class=\"hd__gut\">{{ sm.header }}</td>\n <td class=\"hd__ident\">{{ sm.st.name }}</td>\n <td class=\"hd__bool hd__check\">{{ sm.st.isPublic ? '✓' : '' }}</td>\n <td class=\"hd__cmt hd__cmttext\">{{ sm.st.comment }}</td>\n </tr>\n </tbody>\n </table>\n <EplVarTable\n v-if=\"sm.st.members.length\"\n :columns=\"STRUCT_MEMBER_COLS\"\n :rows=\"sm.st.members\"\n :nos=\"sm.members\"\n />\n </section>\n <p v-if=\"!program.structs.length\" class=\"doc__empty\">(无自定义数据类型)</p>\n </template>\n\n <!-- ── Dll命令定义表 ───────────────────────────────────────────────────── -->\n <!-- Each DLL command is ONE table (no inner gaps): the command header row, then 库文件名 / 在库中对应命令名,\n each as a full-width label row followed by its full-width value row, then the parameter sub-table\n inlined — matching the e-language IDE (label and value on separate lines). -->\n <template v-else-if=\"doc.kind === 'dll'\">\n <h3 class=\"doc__h\">Dll命令定义表</h3>\n <section v-for=\"dm in dllModels\" :key=\"dm.d.id\" class=\"blk\">\n <table class=\"hd dll\">\n <thead>\n <tr>\n <th class=\"hd__gut\" />\n <th>Dll命令名</th>\n <th>返回值类型</th>\n <th class=\"hd__bool\">公开</th>\n <th class=\"hd__bool\">易包</th>\n <th class=\"hd__cmt\">备注</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td class=\"hd__gut\">{{ dm.header }}</td>\n <td class=\"hd__ident\">{{ dm.d.name }}</td>\n <td class=\"hd__ident\">{{ dm.d.returnType }}</td>\n <td class=\"hd__bool hd__check\">{{ dm.d.isPublic ? '✓' : '' }}</td>\n <td class=\"hd__bool\" />\n <td class=\"hd__cmt hd__cmttext\">{{ dm.d.comment }}</td>\n </tr>\n <tr>\n <td class=\"hd__gut\" />\n <td class=\"dll__lbl\" colspan=\"5\">库文件名</td>\n </tr>\n <tr>\n <td class=\"hd__gut\">{{ dm.lib }}</td>\n <td class=\"dll__val\" colspan=\"5\">{{ dm.d.libraryName }}</td>\n </tr>\n <tr>\n <td class=\"hd__gut\" />\n <td class=\"dll__lbl\" colspan=\"5\">在库中对应命令名</td>\n </tr>\n <tr>\n <td class=\"hd__gut\">{{ dm.entry }}</td>\n <td class=\"dll__val\" colspan=\"5\">{{ dm.d.entryPoint || dm.d.name }}</td>\n </tr>\n <template v-if=\"dm.d.parameters.length\">\n <tr>\n <th class=\"hd__gut\" />\n <th>参数名</th>\n <th>类型</th>\n <th class=\"hd__bool\">传址</th>\n <th class=\"hd__bool\">数组</th>\n <th class=\"hd__cmt\">备注</th>\n </tr>\n <tr v-for=\"(p, i) in dm.d.parameters\" :key=\"i\">\n <td class=\"hd__gut\">{{ dm.params[i] }}</td>\n <td class=\"hd__ident\">{{ p.name }}</td>\n <td class=\"hd__ident\">{{ p.type }}</td>\n <td class=\"hd__bool hd__check\">{{ p.byAddress ? '✓' : '' }}</td>\n <td class=\"hd__bool hd__check\">{{ p.isArray ? '✓' : '' }}</td>\n <td class=\"hd__cmt hd__cmttext\">{{ p.comment }}</td>\n </tr>\n </template>\n </tbody>\n </table>\n </section>\n <p v-if=\"!program.dllDeclares.length\" class=\"doc__empty\">(无 DLL 命令)</p>\n </template>\n\n <!-- ── 常量表 ──────────────────────────────────────────────────────────── -->\n <template v-else-if=\"doc.kind === 'constants'\">\n <h3 class=\"doc__h\">常量表</h3>\n <table v-if=\"program.constants.length\" class=\"hd\">\n <thead>\n <tr>\n <th class=\"hd__gut\" />\n <th>常量名</th>\n <th>常量值</th>\n <th class=\"hd__cmt\">备注</th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(c, i) in program.constants\" :key=\"c.id\">\n <td class=\"hd__gut\">{{ constantsNos[i] }}</td>\n <td class=\"hd__ident\">{{ c.name }}</td>\n <td class=\"hd__val\">{{ c.value }}</td>\n <td class=\"hd__cmt hd__cmttext\">{{ c.comment }}</td>\n </tr>\n </tbody>\n </table>\n <p v-else class=\"doc__empty\">(无常量)</p>\n </template>\n\n <!-- ── 图片/声音资源(图片组拆帧 / 单图 / 声音) ──────────────────────── -->\n <template v-else-if=\"doc.kind === 'resources'\">\n <h3 class=\"doc__h\">图片/声音资源</h3>\n <section v-for=\"r in program.resources\" :key=\"r.id\" class=\"res\">\n <div class=\"res__hd\">\n <span class=\"res__name\">{{ r.name }}</span>\n <span v-if=\"r.comment\" class=\"res__cmt\">{{ r.comment }}</span>\n </div>\n <EplResource :resource=\"r\" />\n </section>\n <p v-if=\"!program.resources.length\" class=\"doc__empty\">(无图片/声音资源)</p>\n </template>\n\n <!-- ── 资源表(窗口) ──────────────────────────────────────────────────── -->\n <template v-else-if=\"doc.kind === 'forms'\">\n <h3 class=\"doc__h\">资源表</h3>\n <section v-for=\"fm in formModels\" :key=\"fm.f.id\" class=\"blk\">\n <table class=\"hd\">\n <thead>\n <tr>\n <th class=\"hd__gut\" />\n <th>窗口名</th>\n <th>类</th>\n <th class=\"hd__cmt\">备注</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td class=\"hd__gut\">{{ fm.header }}</td>\n <td class=\"hd__ident\">{{ fm.f.name }}</td>\n <td class=\"hd__ident\">{{ fm.f.className }}</td>\n <td class=\"hd__cmt hd__cmttext\">{{ fm.f.comment }}</td>\n </tr>\n </tbody>\n </table>\n <table v-if=\"fm.f.elements.length\" class=\"hd\">\n <thead>\n <tr>\n <th class=\"hd__gut\" />\n <th>组件名</th>\n <th>类型</th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(e, i) in fm.f.elements\" :key=\"e.id\">\n <td class=\"hd__gut\">{{ fm.elements[i] }}</td>\n <td class=\"hd__ident\">{{ e.name }}</td>\n <td class=\"hd__ident\">{{ e.type }}</td>\n </tr>\n </tbody>\n </table>\n </section>\n <p v-if=\"!program.forms.length\" class=\"doc__empty\">(无窗口资源)</p>\n </template>\n\n <!-- ── 模块引用表(支持库) ────────────────────────────────────────────── -->\n <template v-else-if=\"doc.kind === 'libraries'\">\n <h3 class=\"doc__h\">模块引用表</h3>\n <table v-if=\"program.libraries.length\" class=\"hd\">\n <thead>\n <tr>\n <th class=\"hd__gut\" />\n <th>名称</th>\n <th>文件名</th>\n <th>版本</th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(l, i) in program.libraries\" :key=\"i\">\n <td class=\"hd__gut\">{{ librariesNos[i] }}</td>\n <td class=\"hd__ident\">{{ l.name }}</td>\n <td>{{ l.fileName }}</td>\n <td>{{ l.version }}</td>\n </tr>\n </tbody>\n </table>\n <p v-else class=\"doc__empty\">(无引用模块)</p>\n </template>\n </div>\n</template>\n\n<style scoped>\n.doc {\n padding: 12px 14px 40px;\n width: max-content;\n min-width: 100%;\n box-sizing: border-box;\n}\n.doc__h {\n margin: 0 0 8px;\n font-size: 13px;\n font-weight: 600;\n color: var(--epl-th-fg);\n}\n.doc__methods {\n margin-top: 10px;\n}\n.doc__empty {\n color: var(--epl-gutter);\n font-size: 12.5px;\n margin: 8px 0;\n}\n.blk {\n margin: 0 0 16px;\n}\n.res {\n margin: 0 0 18px;\n padding: 10px 12px;\n border: 1px solid var(--epl-border);\n border-radius: 4px;\n background: var(--epl-bg);\n}\n.res__hd {\n display: flex;\n align-items: baseline;\n gap: 10px;\n margin-bottom: 8px;\n}\n.res__name {\n color: var(--epl-ident);\n font-weight: 600;\n font-size: 13px;\n}\n.res__cmt {\n color: var(--epl-comment);\n font-size: 12px;\n}\n\n.hd {\n border-collapse: collapse;\n font-size: 12.5px;\n background: var(--epl-bg);\n margin: 2px 0;\n}\n.hd th,\n.hd td {\n border: 1px solid var(--epl-border);\n padding: 2px 8px;\n text-align: left;\n white-space: nowrap;\n color: var(--epl-fg);\n}\n.hd th {\n background: var(--epl-th-bg);\n color: var(--epl-th-fg);\n font-weight: 600;\n}\n.hd__bool {\n text-align: center;\n min-width: 2.6em;\n}\n.hd__check {\n color: var(--epl-check);\n font-weight: 700;\n}\n.hd__ident {\n color: var(--epl-ident);\n}\n.hd__val {\n white-space: normal;\n max-width: 460px;\n word-break: break-all;\n}\n.hd__cmt {\n white-space: normal;\n}\n.hd__cmttext {\n color: var(--epl-comment);\n}\n/* DLL 库文件名 / 在库中对应命令名: a full-width (colspan) label row, then its value row underneath. */\n.dll__lbl {\n color: var(--epl-th-fg);\n background: var(--epl-th-bg);\n}\n.dll__val {\n color: var(--epl-string);\n}\nth.hd__gut,\ntd.hd__gut {\n width: 3.4em;\n min-width: 3.4em;\n box-sizing: border-box;\n padding: 2px 10px 2px 0;\n text-align: right;\n border: none;\n background: var(--epl-gutter-bg);\n color: var(--epl-gutter);\n font-weight: normal;\n user-select: none;\n position: sticky;\n left: 0;\n z-index: 1;\n}\n</style>\n"],"mappings":""}
@@ -325,3 +325,5 @@ var te = { class: "doc" }, ne = { class: "hd" }, re = { key: 0 }, ie = { key: 1
325
325
  });
326
326
  //#endregion
327
327
  export { X as default };
328
+
329
+ //# sourceMappingURL=EplDoc.vue_vue_type_script_setup_true_lang.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EplDoc.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/epl/EplDoc.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { EplProgram, EplClassView } from '@/lib/epl'\nimport EplVarTable, { type EplCol } from './EplVarTable.vue'\nimport EplMethod from './EplMethod.vue'\nimport EplResource from './EplResource.vue'\nimport type { EplDocRef } from './docTypes'\nimport { LineCounter, type MethodNos } from './numbering'\n\n/**\n * The right-pane content for the active document. Switches on {@link EplDocRef.kind}: a class renders its\n * header table + member table + every method ({@link EplMethod}); the project-level tables (全局变量 /\n * 自定义数据类型 / Dll命令 / 常量表 / 图片·声音资源 / 资源表 / 模块引用表) render as bordered tables matching\n * the IDE (图片/声音 as media cards via {@link EplResource}).\n *\n * Every document carries a single continuous line-number gutter (see {@link LineCounter}): each *body* row and\n * code line takes the next number, header rows none. The numbering is threaded here (only the active kind\n * computes) and handed to the tables / methods so the gutter stays continuous across the whole document.\n */\nconst props = defineProps<{ program: EplProgram; doc: EplDocRef }>()\n\nconst cls = computed<EplClassView | null>(() =>\n props.doc.kind === 'class'\n ? (props.program.classes.find((c) => c.id === props.doc.classId) ?? null)\n : null,\n)\n\n// ── numbering: only the active document kind threads a counter ────────────────────────────────────\nconst classModel = computed(() => {\n if (props.doc.kind !== 'class' || !cls.value) return null\n const c = new LineCounter()\n const k = cls.value\n return {\n cls: k,\n header: c.next(),\n members: c.take(k.members.length),\n methods: k.methods.map((m) => ({\n method: m,\n nos: {\n head: c.next(),\n params: c.take(m.parameters.length),\n locals: c.take(m.locals.length),\n // A hidden terminator row (noNo) renders but takes no number — the gutter stays continuous around it.\n code: m.lines.map((ln) => (ln.noNo ? null : c.next())),\n } satisfies MethodNos,\n })),\n }\n})\n\nconst globalsNos = computed(() =>\n props.doc.kind === 'globals' ? new LineCounter().take(props.program.globals.length) : [],\n)\nconst structModels = computed(() => {\n if (props.doc.kind !== 'structs') return []\n const c = new LineCounter()\n return props.program.structs.map((st) => ({\n st,\n header: c.next(),\n members: c.take(st.members.length),\n }))\n})\nconst dllModels = computed(() => {\n if (props.doc.kind !== 'dll') return []\n const c = new LineCounter()\n return props.program.dllDeclares.map((d) => ({\n d,\n header: c.next(),\n lib: c.next(),\n entry: c.next(),\n params: c.take(d.parameters.length),\n }))\n})\nconst constantsNos = computed(() =>\n props.doc.kind === 'constants' ? new LineCounter().take(props.program.constants.length) : [],\n)\nconst formModels = computed(() => {\n if (props.doc.kind !== 'forms') return []\n const c = new LineCounter()\n return props.program.forms.map((f) => ({\n f,\n header: c.next(),\n elements: c.take(f.elements.length),\n }))\n})\nconst librariesNos = computed(() =>\n props.doc.kind === 'libraries' ? new LineCounter().take(props.program.libraries.length) : [],\n)\n\nconst MEMBER_COLS: EplCol[] = [\n { key: 'name', label: '变量名' },\n { key: 'type', label: '类型' },\n { key: 'arrayBound', label: '数组' },\n { key: 'comment', label: '备注' },\n]\nconst GLOBAL_COLS: EplCol[] = [\n { key: 'name', label: '变量名' },\n { key: 'type', label: '类型' },\n { key: 'public', label: '公开' },\n { key: 'arrayBound', label: '数组' },\n { key: 'comment', label: '备注' },\n]\nconst STRUCT_MEMBER_COLS: EplCol[] = [\n { key: 'name', label: '成员名' },\n { key: 'type', label: '类型' },\n { key: 'byAddress', label: '传址' },\n { key: 'arrayBound', label: '数组' },\n { key: 'comment', label: '备注' },\n]\n</script>\n\n<template>\n <div class=\"doc\">\n <!-- ── class / 程序集 / 窗口程序集 ───────────────────────────────────────── -->\n <template v-if=\"doc.kind === 'class' && classModel\">\n <table class=\"hd\">\n <thead>\n <tr v-if=\"classModel.cls.kind === 'class'\">\n <th class=\"hd__gut\" />\n <th>类名</th>\n <th>基类</th>\n <th class=\"hd__bool\">公开</th>\n <th class=\"hd__cmt\">备注</th>\n </tr>\n <tr v-else>\n <th class=\"hd__gut\" />\n <th>程序集名</th>\n <th>保留</th>\n <th>保留</th>\n <th class=\"hd__cmt\">备注</th>\n </tr>\n </thead>\n <tbody>\n <tr v-if=\"classModel.cls.kind === 'class'\">\n <td class=\"hd__gut\">{{ classModel.header }}</td>\n <td class=\"hd__ident\">{{ classModel.cls.name }}</td>\n <td class=\"hd__ident\">{{ classModel.cls.baseName }}</td>\n <td class=\"hd__bool\" />\n <td class=\"hd__cmt hd__cmttext\">{{ classModel.cls.comment }}</td>\n </tr>\n <tr v-else>\n <td class=\"hd__gut\">{{ classModel.header }}</td>\n <td class=\"hd__ident\">{{ classModel.cls.name }}</td>\n <td />\n <td />\n <td class=\"hd__cmt hd__cmttext\">{{ classModel.cls.comment }}</td>\n </tr>\n </tbody>\n </table>\n\n <EplVarTable\n v-if=\"classModel.cls.members.length\"\n :columns=\"MEMBER_COLS\"\n :rows=\"classModel.cls.members\"\n :nos=\"classModel.members\"\n />\n\n <div class=\"doc__methods\">\n <EplMethod\n v-for=\"mm in classModel.methods\"\n :key=\"mm.method.id\"\n :method=\"mm.method\"\n :nos=\"mm.nos\"\n />\n <p v-if=\"!classModel.cls.methods.length\" class=\"doc__empty\">(无子程序)</p>\n </div>\n </template>\n\n <!-- ── 全局变量表 ──────────────────────────────────────────────────────── -->\n <template v-else-if=\"doc.kind === 'globals'\">\n <h3 class=\"doc__h\">全局变量表</h3>\n <EplVarTable\n v-if=\"program.globals.length\"\n :columns=\"GLOBAL_COLS\"\n :rows=\"program.globals\"\n :nos=\"globalsNos\"\n />\n <p v-else class=\"doc__empty\">(无全局变量)</p>\n </template>\n\n <!-- ── 自定义数据类型表 ─────────────────────────────────────────────────── -->\n <template v-else-if=\"doc.kind === 'structs'\">\n <h3 class=\"doc__h\">自定义数据类型表</h3>\n <section v-for=\"sm in structModels\" :key=\"sm.st.id\" class=\"blk\">\n <table class=\"hd\">\n <thead>\n <tr>\n <th class=\"hd__gut\" />\n <th>数据类型名</th>\n <th class=\"hd__bool\">公开</th>\n <th class=\"hd__cmt\">备注</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td class=\"hd__gut\">{{ sm.header }}</td>\n <td class=\"hd__ident\">{{ sm.st.name }}</td>\n <td class=\"hd__bool hd__check\">{{ sm.st.isPublic ? '✓' : '' }}</td>\n <td class=\"hd__cmt hd__cmttext\">{{ sm.st.comment }}</td>\n </tr>\n </tbody>\n </table>\n <EplVarTable\n v-if=\"sm.st.members.length\"\n :columns=\"STRUCT_MEMBER_COLS\"\n :rows=\"sm.st.members\"\n :nos=\"sm.members\"\n />\n </section>\n <p v-if=\"!program.structs.length\" class=\"doc__empty\">(无自定义数据类型)</p>\n </template>\n\n <!-- ── Dll命令定义表 ───────────────────────────────────────────────────── -->\n <!-- Each DLL command is ONE table (no inner gaps): the command header row, then 库文件名 / 在库中对应命令名,\n each as a full-width label row followed by its full-width value row, then the parameter sub-table\n inlined — matching the e-language IDE (label and value on separate lines). -->\n <template v-else-if=\"doc.kind === 'dll'\">\n <h3 class=\"doc__h\">Dll命令定义表</h3>\n <section v-for=\"dm in dllModels\" :key=\"dm.d.id\" class=\"blk\">\n <table class=\"hd dll\">\n <thead>\n <tr>\n <th class=\"hd__gut\" />\n <th>Dll命令名</th>\n <th>返回值类型</th>\n <th class=\"hd__bool\">公开</th>\n <th class=\"hd__bool\">易包</th>\n <th class=\"hd__cmt\">备注</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td class=\"hd__gut\">{{ dm.header }}</td>\n <td class=\"hd__ident\">{{ dm.d.name }}</td>\n <td class=\"hd__ident\">{{ dm.d.returnType }}</td>\n <td class=\"hd__bool hd__check\">{{ dm.d.isPublic ? '✓' : '' }}</td>\n <td class=\"hd__bool\" />\n <td class=\"hd__cmt hd__cmttext\">{{ dm.d.comment }}</td>\n </tr>\n <tr>\n <td class=\"hd__gut\" />\n <td class=\"dll__lbl\" colspan=\"5\">库文件名</td>\n </tr>\n <tr>\n <td class=\"hd__gut\">{{ dm.lib }}</td>\n <td class=\"dll__val\" colspan=\"5\">{{ dm.d.libraryName }}</td>\n </tr>\n <tr>\n <td class=\"hd__gut\" />\n <td class=\"dll__lbl\" colspan=\"5\">在库中对应命令名</td>\n </tr>\n <tr>\n <td class=\"hd__gut\">{{ dm.entry }}</td>\n <td class=\"dll__val\" colspan=\"5\">{{ dm.d.entryPoint || dm.d.name }}</td>\n </tr>\n <template v-if=\"dm.d.parameters.length\">\n <tr>\n <th class=\"hd__gut\" />\n <th>参数名</th>\n <th>类型</th>\n <th class=\"hd__bool\">传址</th>\n <th class=\"hd__bool\">数组</th>\n <th class=\"hd__cmt\">备注</th>\n </tr>\n <tr v-for=\"(p, i) in dm.d.parameters\" :key=\"i\">\n <td class=\"hd__gut\">{{ dm.params[i] }}</td>\n <td class=\"hd__ident\">{{ p.name }}</td>\n <td class=\"hd__ident\">{{ p.type }}</td>\n <td class=\"hd__bool hd__check\">{{ p.byAddress ? '✓' : '' }}</td>\n <td class=\"hd__bool hd__check\">{{ p.isArray ? '✓' : '' }}</td>\n <td class=\"hd__cmt hd__cmttext\">{{ p.comment }}</td>\n </tr>\n </template>\n </tbody>\n </table>\n </section>\n <p v-if=\"!program.dllDeclares.length\" class=\"doc__empty\">(无 DLL 命令)</p>\n </template>\n\n <!-- ── 常量表 ──────────────────────────────────────────────────────────── -->\n <template v-else-if=\"doc.kind === 'constants'\">\n <h3 class=\"doc__h\">常量表</h3>\n <table v-if=\"program.constants.length\" class=\"hd\">\n <thead>\n <tr>\n <th class=\"hd__gut\" />\n <th>常量名</th>\n <th>常量值</th>\n <th class=\"hd__cmt\">备注</th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(c, i) in program.constants\" :key=\"c.id\">\n <td class=\"hd__gut\">{{ constantsNos[i] }}</td>\n <td class=\"hd__ident\">{{ c.name }}</td>\n <td class=\"hd__val\">{{ c.value }}</td>\n <td class=\"hd__cmt hd__cmttext\">{{ c.comment }}</td>\n </tr>\n </tbody>\n </table>\n <p v-else class=\"doc__empty\">(无常量)</p>\n </template>\n\n <!-- ── 图片/声音资源(图片组拆帧 / 单图 / 声音) ──────────────────────── -->\n <template v-else-if=\"doc.kind === 'resources'\">\n <h3 class=\"doc__h\">图片/声音资源</h3>\n <section v-for=\"r in program.resources\" :key=\"r.id\" class=\"res\">\n <div class=\"res__hd\">\n <span class=\"res__name\">{{ r.name }}</span>\n <span v-if=\"r.comment\" class=\"res__cmt\">{{ r.comment }}</span>\n </div>\n <EplResource :resource=\"r\" />\n </section>\n <p v-if=\"!program.resources.length\" class=\"doc__empty\">(无图片/声音资源)</p>\n </template>\n\n <!-- ── 资源表(窗口) ──────────────────────────────────────────────────── -->\n <template v-else-if=\"doc.kind === 'forms'\">\n <h3 class=\"doc__h\">资源表</h3>\n <section v-for=\"fm in formModels\" :key=\"fm.f.id\" class=\"blk\">\n <table class=\"hd\">\n <thead>\n <tr>\n <th class=\"hd__gut\" />\n <th>窗口名</th>\n <th>类</th>\n <th class=\"hd__cmt\">备注</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td class=\"hd__gut\">{{ fm.header }}</td>\n <td class=\"hd__ident\">{{ fm.f.name }}</td>\n <td class=\"hd__ident\">{{ fm.f.className }}</td>\n <td class=\"hd__cmt hd__cmttext\">{{ fm.f.comment }}</td>\n </tr>\n </tbody>\n </table>\n <table v-if=\"fm.f.elements.length\" class=\"hd\">\n <thead>\n <tr>\n <th class=\"hd__gut\" />\n <th>组件名</th>\n <th>类型</th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(e, i) in fm.f.elements\" :key=\"e.id\">\n <td class=\"hd__gut\">{{ fm.elements[i] }}</td>\n <td class=\"hd__ident\">{{ e.name }}</td>\n <td class=\"hd__ident\">{{ e.type }}</td>\n </tr>\n </tbody>\n </table>\n </section>\n <p v-if=\"!program.forms.length\" class=\"doc__empty\">(无窗口资源)</p>\n </template>\n\n <!-- ── 模块引用表(支持库) ────────────────────────────────────────────── -->\n <template v-else-if=\"doc.kind === 'libraries'\">\n <h3 class=\"doc__h\">模块引用表</h3>\n <table v-if=\"program.libraries.length\" class=\"hd\">\n <thead>\n <tr>\n <th class=\"hd__gut\" />\n <th>名称</th>\n <th>文件名</th>\n <th>版本</th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(l, i) in program.libraries\" :key=\"i\">\n <td class=\"hd__gut\">{{ librariesNos[i] }}</td>\n <td class=\"hd__ident\">{{ l.name }}</td>\n <td>{{ l.fileName }}</td>\n <td>{{ l.version }}</td>\n </tr>\n </tbody>\n </table>\n <p v-else class=\"doc__empty\">(无引用模块)</p>\n </template>\n </div>\n</template>\n\n<style scoped>\n.doc {\n padding: 12px 14px 40px;\n width: max-content;\n min-width: 100%;\n box-sizing: border-box;\n}\n.doc__h {\n margin: 0 0 8px;\n font-size: 13px;\n font-weight: 600;\n color: var(--epl-th-fg);\n}\n.doc__methods {\n margin-top: 10px;\n}\n.doc__empty {\n color: var(--epl-gutter);\n font-size: 12.5px;\n margin: 8px 0;\n}\n.blk {\n margin: 0 0 16px;\n}\n.res {\n margin: 0 0 18px;\n padding: 10px 12px;\n border: 1px solid var(--epl-border);\n border-radius: 4px;\n background: var(--epl-bg);\n}\n.res__hd {\n display: flex;\n align-items: baseline;\n gap: 10px;\n margin-bottom: 8px;\n}\n.res__name {\n color: var(--epl-ident);\n font-weight: 600;\n font-size: 13px;\n}\n.res__cmt {\n color: var(--epl-comment);\n font-size: 12px;\n}\n\n.hd {\n border-collapse: collapse;\n font-size: 12.5px;\n background: var(--epl-bg);\n margin: 2px 0;\n}\n.hd th,\n.hd td {\n border: 1px solid var(--epl-border);\n padding: 2px 8px;\n text-align: left;\n white-space: nowrap;\n color: var(--epl-fg);\n}\n.hd th {\n background: var(--epl-th-bg);\n color: var(--epl-th-fg);\n font-weight: 600;\n}\n.hd__bool {\n text-align: center;\n min-width: 2.6em;\n}\n.hd__check {\n color: var(--epl-check);\n font-weight: 700;\n}\n.hd__ident {\n color: var(--epl-ident);\n}\n.hd__val {\n white-space: normal;\n max-width: 460px;\n word-break: break-all;\n}\n.hd__cmt {\n white-space: normal;\n}\n.hd__cmttext {\n color: var(--epl-comment);\n}\n/* DLL 库文件名 / 在库中对应命令名: a full-width (colspan) label row, then its value row underneath. */\n.dll__lbl {\n color: var(--epl-th-fg);\n background: var(--epl-th-bg);\n}\n.dll__val {\n color: var(--epl-string);\n}\nth.hd__gut,\ntd.hd__gut {\n width: 3.4em;\n min-width: 3.4em;\n box-sizing: border-box;\n padding: 2px 10px 2px 0;\n text-align: right;\n border: none;\n background: var(--epl-gutter-bg);\n color: var(--epl-gutter);\n font-weight: normal;\n user-select: none;\n position: sticky;\n left: 0;\n z-index: 1;\n}\n</style>\n"],"mappings":"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"}
@@ -5,3 +5,5 @@ import t from "./EplMethod.vue_vue_type_script_setup_true_lang.js";
5
5
  var n = /*#__PURE__*/ e(t, [["__scopeId", "data-v-e540f854"]]);
6
6
  //#endregion
7
7
  export { n as default };
8
+
9
+ //# sourceMappingURL=EplMethod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EplMethod.js","names":[],"sources":["../../../src/components/epl/EplMethod.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { EplMethodView } from '@/lib/epl'\nimport EplVarTable, { type EplCol } from './EplVarTable.vue'\nimport EplCodeBlock from './EplCodeBlock.vue'\nimport type { MethodNos } from './numbering'\n\n/**\n * One 子程序 (method): the IDE shows a header table (子程序名 / 返回值类型 / 公开 / 易包 / 备注), then a\n * parameter table and a local-variable table (each only when non-empty), then the decompiled body. Carries a\n * DOM id so the tree's method nodes can scroll to it. `nos` are the document-wide line numbers for its rows.\n */\nconst props = defineProps<{ method: EplMethodView; nos: MethodNos }>()\n\nconst PARAM_COLS: EplCol[] = [\n { key: 'name', label: '参数名' },\n { key: 'type', label: '类型' },\n { key: 'byReference', label: '参考' },\n { key: 'nullable', label: '可空' },\n { key: 'arrayFlag', label: '数组' },\n { key: 'comment', label: '备注' },\n]\nconst LOCAL_COLS: EplCol[] = [\n { key: 'name', label: '变量名' },\n { key: 'type', label: '类型' },\n { key: 'static', label: '静态' },\n { key: 'arrayBound', label: '数组' },\n { key: 'comment', label: '备注' },\n]\n\nconst anchorId = `epl-m-${props.method.id >>> 0}`\n</script>\n\n<template>\n <section :id=\"anchorId\" class=\"m\">\n <table class=\"m__head\">\n <thead>\n <tr>\n <th class=\"m__gut\" />\n <th>子程序名</th>\n <th>返回值类型</th>\n <th class=\"m__bool\">公开</th>\n <th class=\"m__bool\">易包</th>\n <th class=\"m__cmt\">备注</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td class=\"m__gut\">{{ nos.head }}</td>\n <td class=\"m__ident\">{{ method.name }}</td>\n <td class=\"m__ident\">{{ method.returnType }}</td>\n <td class=\"m__bool m__check\">{{ method.isPublic ? '✓' : '' }}</td>\n <td class=\"m__bool\" />\n <td class=\"m__cmt m__cmttext\">{{ method.comment }}</td>\n </tr>\n </tbody>\n </table>\n\n <EplVarTable\n v-if=\"method.parameters.length\"\n :columns=\"PARAM_COLS\"\n :rows=\"method.parameters\"\n :nos=\"nos.params\"\n />\n <EplVarTable\n v-if=\"method.locals.length\"\n :columns=\"LOCAL_COLS\"\n :rows=\"method.locals\"\n :nos=\"nos.locals\"\n />\n\n <EplCodeBlock\n v-if=\"method.lines.length\"\n class=\"m__code\"\n :lines=\"method.lines\"\n :nos=\"nos.code\"\n />\n </section>\n</template>\n\n<style scoped>\n.m {\n margin: 0 0 18px;\n}\n.m__head {\n border-collapse: collapse;\n font-size: 12.5px;\n background: var(--epl-bg);\n}\n.m__head th,\n.m__head td {\n border: 1px solid var(--epl-border);\n padding: 2px 8px;\n text-align: left;\n white-space: nowrap;\n color: var(--epl-fg);\n}\n.m__head th {\n background: var(--epl-th-bg);\n color: var(--epl-th-fg);\n font-weight: 600;\n}\n.m__bool {\n text-align: center;\n min-width: 2.6em;\n}\n.m__check {\n color: var(--epl-check);\n font-weight: 700;\n}\n.m__ident {\n color: var(--epl-ident);\n}\n.m__cmt {\n white-space: normal;\n}\n.m__cmttext {\n color: var(--epl-comment);\n}\nth.m__gut,\ntd.m__gut {\n width: 3.4em;\n min-width: 3.4em;\n box-sizing: border-box;\n padding: 2px 10px 2px 0;\n text-align: right;\n border: none;\n background: var(--epl-gutter-bg);\n color: var(--epl-gutter);\n font-weight: normal;\n user-select: none;\n position: sticky;\n left: 0;\n z-index: 1;\n}\n.m__code {\n margin-top: 4px;\n}\n</style>\n"],"mappings":""}
@@ -98,3 +98,5 @@ var l = { class: "m__head" }, u = { class: "m__gut" }, d = { class: "m__ident" }
98
98
  });
99
99
  //#endregion
100
100
  export { h as default };
101
+
102
+ //# sourceMappingURL=EplMethod.vue_vue_type_script_setup_true_lang.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EplMethod.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/epl/EplMethod.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { EplMethodView } from '@/lib/epl'\nimport EplVarTable, { type EplCol } from './EplVarTable.vue'\nimport EplCodeBlock from './EplCodeBlock.vue'\nimport type { MethodNos } from './numbering'\n\n/**\n * One 子程序 (method): the IDE shows a header table (子程序名 / 返回值类型 / 公开 / 易包 / 备注), then a\n * parameter table and a local-variable table (each only when non-empty), then the decompiled body. Carries a\n * DOM id so the tree's method nodes can scroll to it. `nos` are the document-wide line numbers for its rows.\n */\nconst props = defineProps<{ method: EplMethodView; nos: MethodNos }>()\n\nconst PARAM_COLS: EplCol[] = [\n { key: 'name', label: '参数名' },\n { key: 'type', label: '类型' },\n { key: 'byReference', label: '参考' },\n { key: 'nullable', label: '可空' },\n { key: 'arrayFlag', label: '数组' },\n { key: 'comment', label: '备注' },\n]\nconst LOCAL_COLS: EplCol[] = [\n { key: 'name', label: '变量名' },\n { key: 'type', label: '类型' },\n { key: 'static', label: '静态' },\n { key: 'arrayBound', label: '数组' },\n { key: 'comment', label: '备注' },\n]\n\nconst anchorId = `epl-m-${props.method.id >>> 0}`\n</script>\n\n<template>\n <section :id=\"anchorId\" class=\"m\">\n <table class=\"m__head\">\n <thead>\n <tr>\n <th class=\"m__gut\" />\n <th>子程序名</th>\n <th>返回值类型</th>\n <th class=\"m__bool\">公开</th>\n <th class=\"m__bool\">易包</th>\n <th class=\"m__cmt\">备注</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td class=\"m__gut\">{{ nos.head }}</td>\n <td class=\"m__ident\">{{ method.name }}</td>\n <td class=\"m__ident\">{{ method.returnType }}</td>\n <td class=\"m__bool m__check\">{{ method.isPublic ? '✓' : '' }}</td>\n <td class=\"m__bool\" />\n <td class=\"m__cmt m__cmttext\">{{ method.comment }}</td>\n </tr>\n </tbody>\n </table>\n\n <EplVarTable\n v-if=\"method.parameters.length\"\n :columns=\"PARAM_COLS\"\n :rows=\"method.parameters\"\n :nos=\"nos.params\"\n />\n <EplVarTable\n v-if=\"method.locals.length\"\n :columns=\"LOCAL_COLS\"\n :rows=\"method.locals\"\n :nos=\"nos.locals\"\n />\n\n <EplCodeBlock\n v-if=\"method.lines.length\"\n class=\"m__code\"\n :lines=\"method.lines\"\n :nos=\"nos.code\"\n />\n </section>\n</template>\n\n<style scoped>\n.m {\n margin: 0 0 18px;\n}\n.m__head {\n border-collapse: collapse;\n font-size: 12.5px;\n background: var(--epl-bg);\n}\n.m__head th,\n.m__head td {\n border: 1px solid var(--epl-border);\n padding: 2px 8px;\n text-align: left;\n white-space: nowrap;\n color: var(--epl-fg);\n}\n.m__head th {\n background: var(--epl-th-bg);\n color: var(--epl-th-fg);\n font-weight: 600;\n}\n.m__bool {\n text-align: center;\n min-width: 2.6em;\n}\n.m__check {\n color: var(--epl-check);\n font-weight: 700;\n}\n.m__ident {\n color: var(--epl-ident);\n}\n.m__cmt {\n white-space: normal;\n}\n.m__cmttext {\n color: var(--epl-comment);\n}\nth.m__gut,\ntd.m__gut {\n width: 3.4em;\n min-width: 3.4em;\n box-sizing: border-box;\n padding: 2px 10px 2px 0;\n text-align: right;\n border: none;\n background: var(--epl-gutter-bg);\n color: var(--epl-gutter);\n font-weight: normal;\n user-select: none;\n position: sticky;\n left: 0;\n z-index: 1;\n}\n.m__code {\n margin-top: 4px;\n}\n</style>\n"],"mappings":";;;;;;;;;;;EAWA,IAAM,IAAQ,GAER,IAAuB;GAC3B;IAAE,KAAK;IAAQ,OAAO;GAAM;GAC5B;IAAE,KAAK;IAAQ,OAAO;GAAK;GAC3B;IAAE,KAAK;IAAe,OAAO;GAAK;GAClC;IAAE,KAAK;IAAY,OAAO;GAAK;GAC/B;IAAE,KAAK;IAAa,OAAO;GAAK;GAChC;IAAE,KAAK;IAAW,OAAO;GAAK;EAChC,GACM,IAAuB;GAC3B;IAAE,KAAK;IAAQ,OAAO;GAAM;GAC5B;IAAE,KAAK;IAAQ,OAAO;GAAK;GAC3B;IAAE,KAAK;IAAU,OAAO;GAAK;GAC7B;IAAE,KAAK;IAAc,OAAO;GAAK;GACjC;IAAE,KAAK;IAAW,OAAO;GAAK;EAChC,GAEM,IAAW,SAAS,EAAM,OAAO,OAAO;yBAI5C,EA2CU,WAAA;GA3CA,IAAI;GAAU,OAAM;;GAC5B,EAqBQ,SArBR,GAqBQ,CAAA,AAAA,EAAA,OApBN,EASQ,SAAA,MAAA,CARN,EAOK,MAAA,MAAA;IANH,EAAqB,MAAA,EAAjB,OAAM,SAAQ,CAAA;IAClB,EAAa,MAAA,MAAT,MAAI;IACR,EAAc,MAAA,MAAV,OAAK;IACT,EAA2B,MAAA,EAAvB,OAAM,UAAS,GAAC,IAAE;IACtB,EAA2B,MAAA,EAAvB,OAAM,UAAS,GAAC,IAAE;IACtB,EAA0B,MAAA,EAAtB,OAAM,SAAQ,GAAC,IAAE;aAGzB,EASQ,SAAA,MAAA,CARN,EAOK,MAAA,MAAA;IANH,EAAsC,MAAtC,GAAsC,EAAhB,EAAA,IAAI,IAAI,GAAA,CAAA;IAC9B,EAA2C,MAA3C,GAA2C,EAAnB,EAAA,OAAO,IAAI,GAAA,CAAA;IACnC,EAAiD,MAAjD,GAAiD,EAAzB,EAAA,OAAO,UAAU,GAAA,CAAA;IACzC,EAAkE,MAAlE,GAAkE,EAAlC,EAAA,OAAO,WAAQ,MAAA,EAAA,GAAA,CAAA;aAC/C,EAAsB,MAAA,EAAlB,OAAM,UAAS,GAAA,MAAA,EAAA;IACnB,EAAuD,MAAvD,GAAuD,EAAtB,EAAA,OAAO,OAAO,GAAA,CAAA;;GAM7C,EAAA,OAAO,WAAW,UAAA,EAAA,GAD1B,EAKE,GAAA;;IAHC,SAAS;IACT,MAAM,EAAA,OAAO;IACb,KAAK,EAAA,IAAI;;GAGJ,EAAA,OAAO,OAAO,UAAA,EAAA,GADtB,EAKE,GAAA;;IAHC,SAAS;IACT,MAAM,EAAA,OAAO;IACb,KAAK,EAAA,IAAI;;GAIJ,EAAA,OAAO,MAAM,UAAA,EAAA,GADrB,EAKE,GAAA;;IAHA,OAAM;IACL,OAAO,EAAA,OAAO;IACd,KAAK,EAAA,IAAI"}
@@ -5,3 +5,5 @@ import t from "./EplResource.vue_vue_type_script_setup_true_lang.js";
5
5
  var n = /*#__PURE__*/ e(t, [["__scopeId", "data-v-c9bf3476"]]);
6
6
  //#endregion
7
7
  export { n as default };
8
+
9
+ //# sourceMappingURL=EplResource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EplResource.js","names":[],"sources":["../../../src/components/epl/EplResource.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { onBeforeUnmount, onMounted, ref, shallowRef } from 'vue'\nimport { parseEplImageList, type EplImageFrame, type EplResourceRow } from '@/lib/epl'\n\n/**\n * Renders one 图片 / 声音 resource's media (the surrounding name/备注 card is drawn by {@link EplDoc}). An image\n * is first tried as a 图片组 (Windows ImageList — {@link parseEplImageList}); if so its frames are decoded to\n * RGBA and painted to per-frame canvases → data URLs. Otherwise the bytes are sniffed by magic: a browser-native\n * image shows inline, a playable sound gets an <audio>, and anything else degrades to a labelled download card.\n * All Blob URLs are built in onMounted (browser-only) and revoked on unmount. Upstream bytes are only ever\n * decoded as a raster image / audio track — never executed.\n */\nconst props = defineProps<{ resource: EplResourceRow }>()\n\ntype Sniff = { mime: string; ext: string; ok: boolean }\nfunction starts(b: Uint8Array, sig: number[], off = 0): boolean {\n for (let i = 0; i < sig.length; i++) if (b[off + i] !== sig[i]) return false\n return true\n}\nfunction sniffImage(b: Uint8Array): Sniff {\n if (starts(b, [0x89, 0x50, 0x4e, 0x47])) return { mime: 'image/png', ext: 'png', ok: true }\n if (starts(b, [0xff, 0xd8, 0xff])) return { mime: 'image/jpeg', ext: 'jpg', ok: true }\n if (starts(b, [0x47, 0x49, 0x46, 0x38])) return { mime: 'image/gif', ext: 'gif', ok: true }\n if (starts(b, [0x42, 0x4d])) return { mime: 'image/bmp', ext: 'bmp', ok: true }\n if (starts(b, [0x52, 0x49, 0x46, 0x46]) && starts(b, [0x57, 0x45, 0x42, 0x50], 8))\n return { mime: 'image/webp', ext: 'webp', ok: true }\n if (starts(b, [0x00, 0x00, 0x01, 0x00])) return { mime: 'image/x-icon', ext: 'ico', ok: true }\n return { mime: 'application/octet-stream', ext: 'bin', ok: false }\n}\nfunction sniffSound(b: Uint8Array): Sniff {\n if (starts(b, [0x52, 0x49, 0x46, 0x46]) && starts(b, [0x57, 0x41, 0x56, 0x45], 8))\n return { mime: 'audio/wav', ext: 'wav', ok: true }\n if (\n starts(b, [0x49, 0x44, 0x33]) ||\n starts(b, [0xff, 0xfb]) ||\n starts(b, [0xff, 0xf3]) ||\n starts(b, [0xff, 0xf2])\n )\n return { mime: 'audio/mpeg', ext: 'mp3', ok: true }\n if (starts(b, [0x4f, 0x67, 0x67, 0x53])) return { mime: 'audio/ogg', ext: 'ogg', ok: true }\n if (starts(b, [0x4d, 0x54, 0x68, 0x64])) return { mime: 'audio/midi', ext: 'mid', ok: false } // <audio> can't play MIDI\n return { mime: 'application/octet-stream', ext: 'bin', ok: false }\n}\n\nfunction fmtSize(n: number): string {\n if (n < 1024) return n + ' B'\n if (n < 1024 * 1024) return (n / 1024).toFixed(1) + ' KB'\n return (n / 1024 / 1024).toFixed(1) + ' MB'\n}\n\nfunction frameToDataUrl(f: EplImageFrame): string {\n const cv = document.createElement('canvas')\n cv.width = f.width\n cv.height = f.height\n const ctx = cv.getContext('2d')\n if (!ctx) return ''\n ctx.putImageData(new ImageData(f.rgba, f.width, f.height), 0, 0)\n return cv.toDataURL('image/png')\n}\n\nconst mode = ref<'group' | 'image' | 'sound' | 'file'>('file')\nconst url = ref('') // Blob URL for a single image / sound\nconst sniff = ref<Sniff | null>(null)\nconst broken = ref(false)\nconst downloadName = ref('')\nconst size = ref(0)\nconst frames = shallowRef<string[]>([]) // 图片组 frame data URLs\nconst group = ref<{ count: number; cx: number; cy: number } | null>(null)\n\nonMounted(() => {\n const r = props.resource\n size.value = r.bytes.length\n downloadName.value = r.name\n if (r.kind === 'image') {\n const list = parseEplImageList(r.bytes)\n if (list) {\n group.value = { count: list.frames.length, cx: list.cx, cy: list.cy }\n frames.value = list.frames.map(frameToDataUrl)\n mode.value = 'group'\n return\n }\n const s = sniffImage(r.bytes)\n sniff.value = s\n downloadName.value = `${r.name}.${s.ext}`\n url.value = URL.createObjectURL(new Blob([r.bytes], { type: s.mime }))\n mode.value = s.ok ? 'image' : 'file'\n return\n }\n const s = sniffSound(r.bytes)\n sniff.value = s\n downloadName.value = `${r.name}.${s.ext}`\n url.value = URL.createObjectURL(new Blob([r.bytes], { type: s.mime }))\n mode.value = s.ok ? 'sound' : 'file'\n})\nonBeforeUnmount(() => {\n if (url.value) URL.revokeObjectURL(url.value)\n})\n</script>\n\n<template>\n <!-- 图片组 (Windows ImageList): a grid of the individual frames -->\n <div v-if=\"mode === 'group' && group\" class=\"r-group\">\n <div class=\"r-group__hd\">图片组 · {{ group.count }} 张 · {{ group.cx }}×{{ group.cy }}</div>\n <div class=\"r-group__grid\">\n <a\n v-for=\"(f, i) in frames\"\n :key=\"i\"\n :href=\"f\"\n target=\"_blank\"\n rel=\"noopener\"\n class=\"r-frame\"\n :title=\"`#${i}`\"\n >\n <img :src=\"f\" :alt=\"`#${i}`\" class=\"r-frame__img\" />\n </a>\n </div>\n </div>\n\n <!-- single browser-native image -->\n <div v-else-if=\"mode === 'image' && !broken\" class=\"r-single\">\n <a :href=\"url\" target=\"_blank\" rel=\"noopener\" class=\"r-single__link\">\n <img :src=\"url\" :alt=\"resource.name\" class=\"r-single__img\" @error=\"broken = true\" />\n </a>\n <span class=\"r-meta\">{{ fmtSize(size) }}</span>\n </div>\n\n <!-- playable sound -->\n <div v-else-if=\"mode === 'sound'\" class=\"r-sound\">\n <audio :src=\"url\" controls class=\"r-audio\" />\n <a :href=\"url\" :download=\"downloadName\" class=\"r-dl\">下载</a>\n </div>\n\n <!-- fallback: unknown image format / non-playable sound -->\n <div v-else class=\"r-file\">\n <span class=\"r-file__ico\">{{ resource.kind === 'image' ? '🖼' : '🔊' }}</span>\n <span class=\"r-meta\"\n >{{ resource.kind === 'image' ? '图片' : '声音' }} · {{ fmtSize(size) }} ·\n {{ resource.kind === 'image' ? '格式无法预览' : '格式无法播放' }}</span\n >\n <a v-if=\"url\" :href=\"url\" :download=\"downloadName\" class=\"r-dl\">下载</a>\n </div>\n</template>\n\n<style scoped>\n.r-group__hd {\n color: var(--epl-gutter);\n font-size: 12px;\n margin-bottom: 6px;\n}\n.r-group__grid {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n.r-frame {\n display: inline-flex;\n padding: 3px;\n border: 1px solid var(--epl-border);\n border-radius: 3px;\n background:\n linear-gradient(45deg, #e8e8e8 25%, transparent 25%, transparent 75%, #e8e8e8 75%) 0 0/12px 12px,\n linear-gradient(45deg, #e8e8e8 25%, #fff 25%, #fff 75%, #e8e8e8 75%) 6px 6px/12px 12px;\n line-height: 0;\n}\n.r-frame__img {\n height: 30px;\n width: auto;\n image-rendering: pixelated;\n}\n.r-single__link {\n display: inline-flex;\n line-height: 0;\n}\n.r-single__img {\n max-height: 220px;\n max-width: 100%;\n border: 1px solid var(--epl-border);\n border-radius: 3px;\n background: #fff;\n object-fit: contain;\n}\n.r-single {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n.r-meta {\n color: var(--epl-gutter);\n font-size: 12px;\n}\n.r-sound,\n.r-file {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n.r-audio {\n height: 32px;\n vertical-align: middle;\n}\n.r-file__ico {\n font-size: 16px;\n}\n.r-dl {\n color: var(--epl-keyword);\n text-decoration: none;\n font-size: 12px;\n}\n.r-dl:hover {\n text-decoration: underline;\n}\n</style>\n"],"mappings":""}
@@ -202,3 +202,5 @@ var p = {
202
202
  });
203
203
  //#endregion
204
204
  export { k as default };
205
+
206
+ //# sourceMappingURL=EplResource.vue_vue_type_script_setup_true_lang.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EplResource.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/epl/EplResource.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { onBeforeUnmount, onMounted, ref, shallowRef } from 'vue'\nimport { parseEplImageList, type EplImageFrame, type EplResourceRow } from '@/lib/epl'\n\n/**\n * Renders one 图片 / 声音 resource's media (the surrounding name/备注 card is drawn by {@link EplDoc}). An image\n * is first tried as a 图片组 (Windows ImageList — {@link parseEplImageList}); if so its frames are decoded to\n * RGBA and painted to per-frame canvases → data URLs. Otherwise the bytes are sniffed by magic: a browser-native\n * image shows inline, a playable sound gets an <audio>, and anything else degrades to a labelled download card.\n * All Blob URLs are built in onMounted (browser-only) and revoked on unmount. Upstream bytes are only ever\n * decoded as a raster image / audio track — never executed.\n */\nconst props = defineProps<{ resource: EplResourceRow }>()\n\ntype Sniff = { mime: string; ext: string; ok: boolean }\nfunction starts(b: Uint8Array, sig: number[], off = 0): boolean {\n for (let i = 0; i < sig.length; i++) if (b[off + i] !== sig[i]) return false\n return true\n}\nfunction sniffImage(b: Uint8Array): Sniff {\n if (starts(b, [0x89, 0x50, 0x4e, 0x47])) return { mime: 'image/png', ext: 'png', ok: true }\n if (starts(b, [0xff, 0xd8, 0xff])) return { mime: 'image/jpeg', ext: 'jpg', ok: true }\n if (starts(b, [0x47, 0x49, 0x46, 0x38])) return { mime: 'image/gif', ext: 'gif', ok: true }\n if (starts(b, [0x42, 0x4d])) return { mime: 'image/bmp', ext: 'bmp', ok: true }\n if (starts(b, [0x52, 0x49, 0x46, 0x46]) && starts(b, [0x57, 0x45, 0x42, 0x50], 8))\n return { mime: 'image/webp', ext: 'webp', ok: true }\n if (starts(b, [0x00, 0x00, 0x01, 0x00])) return { mime: 'image/x-icon', ext: 'ico', ok: true }\n return { mime: 'application/octet-stream', ext: 'bin', ok: false }\n}\nfunction sniffSound(b: Uint8Array): Sniff {\n if (starts(b, [0x52, 0x49, 0x46, 0x46]) && starts(b, [0x57, 0x41, 0x56, 0x45], 8))\n return { mime: 'audio/wav', ext: 'wav', ok: true }\n if (\n starts(b, [0x49, 0x44, 0x33]) ||\n starts(b, [0xff, 0xfb]) ||\n starts(b, [0xff, 0xf3]) ||\n starts(b, [0xff, 0xf2])\n )\n return { mime: 'audio/mpeg', ext: 'mp3', ok: true }\n if (starts(b, [0x4f, 0x67, 0x67, 0x53])) return { mime: 'audio/ogg', ext: 'ogg', ok: true }\n if (starts(b, [0x4d, 0x54, 0x68, 0x64])) return { mime: 'audio/midi', ext: 'mid', ok: false } // <audio> can't play MIDI\n return { mime: 'application/octet-stream', ext: 'bin', ok: false }\n}\n\nfunction fmtSize(n: number): string {\n if (n < 1024) return n + ' B'\n if (n < 1024 * 1024) return (n / 1024).toFixed(1) + ' KB'\n return (n / 1024 / 1024).toFixed(1) + ' MB'\n}\n\nfunction frameToDataUrl(f: EplImageFrame): string {\n const cv = document.createElement('canvas')\n cv.width = f.width\n cv.height = f.height\n const ctx = cv.getContext('2d')\n if (!ctx) return ''\n ctx.putImageData(new ImageData(f.rgba, f.width, f.height), 0, 0)\n return cv.toDataURL('image/png')\n}\n\nconst mode = ref<'group' | 'image' | 'sound' | 'file'>('file')\nconst url = ref('') // Blob URL for a single image / sound\nconst sniff = ref<Sniff | null>(null)\nconst broken = ref(false)\nconst downloadName = ref('')\nconst size = ref(0)\nconst frames = shallowRef<string[]>([]) // 图片组 frame data URLs\nconst group = ref<{ count: number; cx: number; cy: number } | null>(null)\n\nonMounted(() => {\n const r = props.resource\n size.value = r.bytes.length\n downloadName.value = r.name\n if (r.kind === 'image') {\n const list = parseEplImageList(r.bytes)\n if (list) {\n group.value = { count: list.frames.length, cx: list.cx, cy: list.cy }\n frames.value = list.frames.map(frameToDataUrl)\n mode.value = 'group'\n return\n }\n const s = sniffImage(r.bytes)\n sniff.value = s\n downloadName.value = `${r.name}.${s.ext}`\n url.value = URL.createObjectURL(new Blob([r.bytes], { type: s.mime }))\n mode.value = s.ok ? 'image' : 'file'\n return\n }\n const s = sniffSound(r.bytes)\n sniff.value = s\n downloadName.value = `${r.name}.${s.ext}`\n url.value = URL.createObjectURL(new Blob([r.bytes], { type: s.mime }))\n mode.value = s.ok ? 'sound' : 'file'\n})\nonBeforeUnmount(() => {\n if (url.value) URL.revokeObjectURL(url.value)\n})\n</script>\n\n<template>\n <!-- 图片组 (Windows ImageList): a grid of the individual frames -->\n <div v-if=\"mode === 'group' && group\" class=\"r-group\">\n <div class=\"r-group__hd\">图片组 · {{ group.count }} 张 · {{ group.cx }}×{{ group.cy }}</div>\n <div class=\"r-group__grid\">\n <a\n v-for=\"(f, i) in frames\"\n :key=\"i\"\n :href=\"f\"\n target=\"_blank\"\n rel=\"noopener\"\n class=\"r-frame\"\n :title=\"`#${i}`\"\n >\n <img :src=\"f\" :alt=\"`#${i}`\" class=\"r-frame__img\" />\n </a>\n </div>\n </div>\n\n <!-- single browser-native image -->\n <div v-else-if=\"mode === 'image' && !broken\" class=\"r-single\">\n <a :href=\"url\" target=\"_blank\" rel=\"noopener\" class=\"r-single__link\">\n <img :src=\"url\" :alt=\"resource.name\" class=\"r-single__img\" @error=\"broken = true\" />\n </a>\n <span class=\"r-meta\">{{ fmtSize(size) }}</span>\n </div>\n\n <!-- playable sound -->\n <div v-else-if=\"mode === 'sound'\" class=\"r-sound\">\n <audio :src=\"url\" controls class=\"r-audio\" />\n <a :href=\"url\" :download=\"downloadName\" class=\"r-dl\">下载</a>\n </div>\n\n <!-- fallback: unknown image format / non-playable sound -->\n <div v-else class=\"r-file\">\n <span class=\"r-file__ico\">{{ resource.kind === 'image' ? '🖼' : '🔊' }}</span>\n <span class=\"r-meta\"\n >{{ resource.kind === 'image' ? '图片' : '声音' }} · {{ fmtSize(size) }} ·\n {{ resource.kind === 'image' ? '格式无法预览' : '格式无法播放' }}</span\n >\n <a v-if=\"url\" :href=\"url\" :download=\"downloadName\" class=\"r-dl\">下载</a>\n </div>\n</template>\n\n<style scoped>\n.r-group__hd {\n color: var(--epl-gutter);\n font-size: 12px;\n margin-bottom: 6px;\n}\n.r-group__grid {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n.r-frame {\n display: inline-flex;\n padding: 3px;\n border: 1px solid var(--epl-border);\n border-radius: 3px;\n background:\n linear-gradient(45deg, #e8e8e8 25%, transparent 25%, transparent 75%, #e8e8e8 75%) 0 0/12px 12px,\n linear-gradient(45deg, #e8e8e8 25%, #fff 25%, #fff 75%, #e8e8e8 75%) 6px 6px/12px 12px;\n line-height: 0;\n}\n.r-frame__img {\n height: 30px;\n width: auto;\n image-rendering: pixelated;\n}\n.r-single__link {\n display: inline-flex;\n line-height: 0;\n}\n.r-single__img {\n max-height: 220px;\n max-width: 100%;\n border: 1px solid var(--epl-border);\n border-radius: 3px;\n background: #fff;\n object-fit: contain;\n}\n.r-single {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n.r-meta {\n color: var(--epl-gutter);\n font-size: 12px;\n}\n.r-sound,\n.r-file {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n.r-audio {\n height: 32px;\n vertical-align: middle;\n}\n.r-file__ico {\n font-size: 16px;\n}\n.r-dl {\n color: var(--epl-keyword);\n text-decoration: none;\n font-size: 12px;\n}\n.r-dl:hover {\n text-decoration: underline;\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;EAYA,IAAM,IAAQ;EAGd,SAAS,EAAO,GAAe,GAAe,IAAM,GAAY;GAC9D,KAAK,IAAI,IAAI,GAAG,IAAI,EAAI,QAAQ,KAAK,IAAI,EAAE,IAAM,OAAO,EAAI,IAAI,OAAO;GACvE,OAAO;EACT;EACA,SAAS,EAAW,GAAsB;GAQxC,OAPI,EAAO,GAAG;IAAC;IAAM;IAAM;IAAM;GAAI,CAAC,IAAU;IAAE,MAAM;IAAa,KAAK;IAAO,IAAI;GAAK,IACtF,EAAO,GAAG;IAAC;IAAM;IAAM;GAAI,CAAC,IAAU;IAAE,MAAM;IAAc,KAAK;IAAO,IAAI;GAAK,IACjF,EAAO,GAAG;IAAC;IAAM;IAAM;IAAM;GAAI,CAAC,IAAU;IAAE,MAAM;IAAa,KAAK;IAAO,IAAI;GAAK,IACtF,EAAO,GAAG,CAAC,IAAM,EAAI,CAAC,IAAU;IAAE,MAAM;IAAa,KAAK;IAAO,IAAI;GAAK,IAC1E,EAAO,GAAG;IAAC;IAAM;IAAM;IAAM;GAAI,CAAC,KAAK,EAAO,GAAG;IAAC;IAAM;IAAM;IAAM;GAAI,GAAG,CAAC,IACvE;IAAE,MAAM;IAAc,KAAK;IAAQ,IAAI;GAAK,IACjD,EAAO,GAAG;IAAC;IAAM;IAAM;IAAM;GAAI,CAAC,IAAU;IAAE,MAAM;IAAgB,KAAK;IAAO,IAAI;GAAK,IACtF;IAAE,MAAM;IAA4B,KAAK;IAAO,IAAI;GAAM;EACnE;EACA,SAAS,EAAW,GAAsB;GAYxC,OAXI,EAAO,GAAG;IAAC;IAAM;IAAM;IAAM;GAAI,CAAC,KAAK,EAAO,GAAG;IAAC;IAAM;IAAM;IAAM;GAAI,GAAG,CAAC,IACvE;IAAE,MAAM;IAAa,KAAK;IAAO,IAAI;GAAK,IAEjD,EAAO,GAAG;IAAC;IAAM;IAAM;GAAI,CAAC,KAC5B,EAAO,GAAG,CAAC,KAAM,GAAI,CAAC,KACtB,EAAO,GAAG,CAAC,KAAM,GAAI,CAAC,KACtB,EAAO,GAAG,CAAC,KAAM,GAAI,CAAC,IAEf;IAAE,MAAM;IAAc,KAAK;IAAO,IAAI;GAAK,IAChD,EAAO,GAAG;IAAC;IAAM;IAAM;IAAM;GAAI,CAAC,IAAU;IAAE,MAAM;IAAa,KAAK;IAAO,IAAI;GAAK,IACtF,EAAO,GAAG;IAAC;IAAM;IAAM;IAAM;GAAI,CAAC,IAAU;IAAE,MAAM;IAAc,KAAK;IAAO,IAAI;GAAM,IACrF;IAAE,MAAM;IAA4B,KAAK;IAAO,IAAI;GAAM;EACnE;EAEA,SAAS,EAAQ,GAAmB;GAGlC,OAFI,IAAI,OAAa,IAAI,OACrB,IAAI,OAAO,QAAc,IAAI,KAAA,CAAM,QAAQ,CAAC,IAAI,SAC5C,IAAI,OAAO,KAAA,CAAM,QAAQ,CAAC,IAAI;EACxC;EAEA,SAAS,EAAe,GAA0B;GAChD,IAAM,IAAK,SAAS,cAAc,QAAQ;GAE1C,AADA,EAAG,QAAQ,EAAE,OACb,EAAG,SAAS,EAAE;GACd,IAAM,IAAM,EAAG,WAAW,IAAI;GAG9B,OAFK,KACL,EAAI,aAAa,IAAI,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC,GACxD,EAAG,UAAU,WAAW,KAFd;EAGnB;EAEA,IAAM,IAAO,EAA0C,MAAM,GACvD,IAAM,EAAI,EAAE,GACZ,IAAQ,EAAkB,IAAI,GAC9B,IAAS,EAAI,EAAK,GAClB,IAAe,EAAI,EAAE,GACrB,IAAO,EAAI,CAAC,GACZ,IAAS,EAAqB,CAAC,CAAC,GAChC,IAAQ,EAAsD,IAAI;SAExE,QAAgB;GACd,IAAM,IAAI,EAAM;GAGhB,IAFA,EAAK,QAAQ,EAAE,MAAM,QACrB,EAAa,QAAQ,EAAE,MACnB,EAAE,SAAS,SAAS;IACtB,IAAM,IAAO,EAAkB,EAAE,KAAK;IACtC,IAAI,GAAM;KAGR,AAFA,EAAM,QAAQ;MAAE,OAAO,EAAK,OAAO;MAAQ,IAAI,EAAK;MAAI,IAAI,EAAK;KAAG,GACpE,EAAO,QAAQ,EAAK,OAAO,IAAI,CAAc,GAC7C,EAAK,QAAQ;KACb;IACF;IACA,IAAM,IAAI,EAAW,EAAE,KAAK;IAI5B,AAHA,EAAM,QAAQ,GACd,EAAa,QAAQ,GAAG,EAAE,KAAK,GAAG,EAAE,OACpC,EAAI,QAAQ,IAAI,gBAAgB,IAAI,KAAK,CAAC,EAAE,KAAK,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,GACrE,EAAK,QAAQ,EAAE,KAAK,UAAU;IAC9B;GACF;GACA,IAAM,IAAI,EAAW,EAAE,KAAK;GAI5B,AAHA,EAAM,QAAQ,GACd,EAAa,QAAQ,GAAG,EAAE,KAAK,GAAG,EAAE,OACpC,EAAI,QAAQ,IAAI,gBAAgB,IAAI,KAAK,CAAC,EAAE,KAAK,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,GACrE,EAAK,QAAQ,EAAE,KAAK,UAAU;EAChC,CAAC,GACD,QAAsB;GACpB,AAAI,EAAI,SAAO,IAAI,gBAAgB,EAAI,KAAK;EAC9C,CAAC,aAKY,EAAA,UAAI,WAAgB,EAAA,SAAA,EAAA,GAA/B,EAeM,OAfN,GAeM,CAdJ,EAAwF,OAAxF,GAAyB,WAAM,EAAG,EAAA,MAAM,KAAK,IAAG,UAAK,EAAG,EAAA,MAAM,EAAE,IAAG,MAAC,EAAG,EAAA,MAAM,EAAE,GAAA,CAAA,GAC/E,EAYM,OAZN,GAYM,EAAA,EAAA,EAAA,GAXJ,EAUI,GAAA,MAAA,EATe,EAAA,QAAT,GAAG,YADb,EAUI,KAAA;GARD,KAAK;GACL,MAAM;GACP,QAAO;GACP,KAAI;GACJ,OAAM;GACL,OAAK,IAAM;MAEZ,EAAoD,OAAA;GAA9C,KAAK;GAAI,KAAG,IAAM;GAAK,OAAM;yCAMzB,EAAA,UAAI,WAAA,CAAiB,EAAA,SAAA,EAAA,GAArC,EAKM,OALN,GAKM,CAJJ,EAEI,KAAA;GAFA,MAAM,EAAA;GAAK,QAAO;GAAS,KAAI;GAAW,OAAM;MAClD,EAAoF,OAAA;GAA9E,KAAK,EAAA;GAAM,KAAK,EAAA,SAAS;GAAM,OAAM;GAAiB,SAAK,AAAA,EAAA,QAAA,MAAE,EAAA,QAAM;2BAE3E,EAA+C,QAA/C,GAA+C,EAAvB,EAAQ,EAAA,KAAI,CAAA,GAAA,CAAA,CAAA,CAAA,KAItB,EAAA,UAAI,WAAA,EAAA,GAApB,EAGM,OAHN,GAGM,CAFJ,EAA6C,SAAA;GAArC,KAAK,EAAA;GAAK,UAAA;GAAS,OAAM;kBACjC,EAA2D,KAAA;GAAvD,MAAM,EAAA;GAAM,UAAU,EAAA;GAAc,OAAM;KAAO,MAAE,GAAA,CAAA,CAAA,CAAA,MAAA,EAAA,GAIzD,EAOM,OAPN,GAOM;GANJ,EAA8E,QAA9E,GAA8E,EAAjD,EAAA,SAAS,SAAI,UAAA,OAAA,IAAA,GAAA,CAAA;GAC1C,EAGC,QAHD,GAGC,EAFK,EAAA,SAAS,SAAI,UAAA,OAAA,IAAA,IAA6B,QAAG,EAAG,EAAQ,EAAA,KAAI,CAAA,IAAI,QACpE,EAAG,EAAA,SAAS,SAAI,UAAA,WAAA,QAAA,GAAA,CAAA;GAET,EAAA,SAAA,EAAA,GAAT,EAAsE,KAAA;;IAAvD,MAAM,EAAA;IAAM,UAAU,EAAA;IAAc,OAAM;MAAO,MAAE,GAAA,CAAA,KAAA,EAAA,IAAA,EAAA"}
@@ -5,3 +5,5 @@ import t from "./EplTree.vue_vue_type_script_setup_true_lang.js";
5
5
  var n = /*#__PURE__*/ e(t, [["__scopeId", "data-v-855ef1ee"]]);
6
6
  //#endregion
7
7
  export { n as default };
8
+
9
+ //# sourceMappingURL=EplTree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EplTree.js","names":[],"sources":["../../../src/components/epl/EplTree.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport type { EplProgram, EplClassKind } from '@/lib/epl'\nimport type { EplDocRef, EplDocKind } from './docTypes'\n\n/**\n * The 易语言 IDE「程序」tree: every 程序集 / 窗口程序集 / 类 at the top level (expandable to its 子程序), then\n * the project-level tables (全局变量 / 自定义数据类型 / Dll命令 / 常量表 / 资源表 / 模块引用表) — each shown\n * only when it has content. Clicking a node opens its document; clicking a method jumps to it inside the class\n * document.\n */\nconst props = defineProps<{ program: EplProgram; activeId: string }>()\nconst emit = defineEmits<{\n (e: 'select', ref: EplDocRef): void\n (e: 'selectMethod', payload: { classId: number; methodId: number }): void\n}>()\n\nconst expanded = ref<Set<number>>(new Set())\nfunction toggle(classId: number): void {\n const s = new Set(expanded.value)\n if (s.has(classId)) s.delete(classId)\n else s.add(classId)\n expanded.value = s\n}\n\nconst KIND_ICON: Record<EplClassKind, { ch: string; cls: string }> = {\n static: { ch: '集', cls: 'ico--static' },\n form: { ch: '窗', cls: 'ico--form' },\n class: { ch: '类', cls: 'ico--class' },\n}\n\ninterface TableNode {\n kind: EplDocKind\n title: string\n count: number\n}\nconst tableNodes = computed<TableNode[]>(() => {\n const p = props.program\n const all: TableNode[] = [\n { kind: 'globals', title: '全局变量', count: p.globals.length },\n { kind: 'structs', title: '自定义数据类型', count: p.structs.length },\n { kind: 'dll', title: 'Dll命令', count: p.dllDeclares.length },\n { kind: 'constants', title: '常量表', count: p.constants.length },\n { kind: 'resources', title: '图片/声音', count: p.resources.length },\n { kind: 'forms', title: '资源表', count: p.forms.length },\n { kind: 'libraries', title: '模块引用表', count: p.libraries.length },\n ]\n return all.filter((n) => n.count > 0)\n})\n\nfunction selectClass(classId: number, title: string): void {\n emit('select', { id: `class:${classId >>> 0}`, kind: 'class', classId, title })\n}\nfunction selectTable(n: TableNode): void {\n emit('select', { id: n.kind, kind: n.kind, title: n.title })\n}\n</script>\n\n<template>\n <div class=\"tree\">\n <div class=\"tree__root\">程序数据</div>\n\n <div v-for=\"c in program.classes\" :key=\"c.id\" class=\"tree__group\">\n <div class=\"tree__node\" :class=\"{ 'is-active': activeId === `class:${c.id >>> 0}` }\">\n <button\n v-if=\"c.methods.length\"\n type=\"button\"\n class=\"tree__caret\"\n :class=\"{ 'is-open': expanded.has(c.id) }\"\n @click=\"toggle(c.id)\"\n >\n ▶\n </button>\n <span v-else class=\"tree__caret tree__caret--empty\" />\n <button type=\"button\" class=\"tree__label\" @click=\"selectClass(c.id, c.name)\">\n <span class=\"ico\" :class=\"KIND_ICON[c.kind].cls\">{{ KIND_ICON[c.kind].ch }}</span>\n <span class=\"tree__name\">{{ c.name }}</span>\n </button>\n </div>\n <div v-if=\"expanded.has(c.id)\" class=\"tree__children\">\n <button\n v-for=\"m in c.methods\"\n :key=\"m.id\"\n type=\"button\"\n class=\"tree__method\"\n @click=\"emit('selectMethod', { classId: c.id, methodId: m.id })\"\n >\n <span class=\"ico ico--method\">子</span>\n <span class=\"tree__name\">{{ m.name }}</span>\n </button>\n </div>\n </div>\n\n <button\n v-for=\"n in tableNodes\"\n :key=\"n.kind\"\n type=\"button\"\n class=\"tree__node tree__label tree__table\"\n :class=\"{ 'is-active': activeId === n.kind }\"\n @click=\"selectTable(n)\"\n >\n <span class=\"ico ico--table\">表</span>\n <span class=\"tree__name\">{{ n.title }}</span>\n </button>\n </div>\n</template>\n\n<style scoped>\n.tree {\n font-size: 12.5px;\n padding: 6px 0;\n user-select: none;\n color: var(--epl-fg);\n}\n.tree__root {\n padding: 2px 10px 4px;\n font-weight: 600;\n color: var(--epl-th-fg);\n}\n.tree__node {\n display: flex;\n align-items: center;\n gap: 2px;\n width: 100%;\n}\n.tree__node.is-active,\n.tree__table.is-active {\n background: var(--epl-sel);\n}\n.tree__caret {\n flex: 0 0 auto;\n width: 16px;\n height: 18px;\n padding: 0;\n border: none;\n background: none;\n cursor: pointer;\n color: var(--epl-gutter);\n font-size: 8px;\n transition: transform 0.1s;\n}\n.tree__caret.is-open {\n transform: rotate(90deg);\n}\n.tree__caret--empty {\n cursor: default;\n}\n.tree__label {\n display: flex;\n align-items: center;\n gap: 6px;\n flex: 1 1 auto;\n min-width: 0;\n padding: 2px 10px 2px 0;\n border: none;\n background: none;\n cursor: pointer;\n text-align: left;\n color: inherit;\n font: inherit;\n}\n.tree__label:hover {\n color: var(--epl-ident);\n}\n.tree__table {\n padding-left: 18px;\n}\n.tree__children {\n display: flex;\n flex-direction: column;\n}\n.tree__method {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 1px 10px 1px 34px;\n border: none;\n background: none;\n cursor: pointer;\n text-align: left;\n color: inherit;\n font: inherit;\n}\n.tree__method:hover {\n color: var(--epl-ident);\n}\n.tree__name {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.ico {\n flex: 0 0 auto;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 15px;\n height: 15px;\n border-radius: 3px;\n font-size: 10px;\n color: #fff;\n line-height: 1;\n}\n.ico--static {\n background: #5b8def;\n}\n.ico--form {\n background: #8a6fd0;\n}\n.ico--class {\n background: #2fa37a;\n}\n.ico--method {\n background: #c0894a;\n}\n.ico--table {\n background: #888;\n}\n</style>\n"],"mappings":""}
@@ -121,3 +121,5 @@ var d = { class: "tree" }, f = ["onClick"], p = {
121
121
  });
122
122
  //#endregion
123
123
  export { x as default };
124
+
125
+ //# sourceMappingURL=EplTree.vue_vue_type_script_setup_true_lang.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EplTree.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/epl/EplTree.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport type { EplProgram, EplClassKind } from '@/lib/epl'\nimport type { EplDocRef, EplDocKind } from './docTypes'\n\n/**\n * The 易语言 IDE「程序」tree: every 程序集 / 窗口程序集 / 类 at the top level (expandable to its 子程序), then\n * the project-level tables (全局变量 / 自定义数据类型 / Dll命令 / 常量表 / 资源表 / 模块引用表) — each shown\n * only when it has content. Clicking a node opens its document; clicking a method jumps to it inside the class\n * document.\n */\nconst props = defineProps<{ program: EplProgram; activeId: string }>()\nconst emit = defineEmits<{\n (e: 'select', ref: EplDocRef): void\n (e: 'selectMethod', payload: { classId: number; methodId: number }): void\n}>()\n\nconst expanded = ref<Set<number>>(new Set())\nfunction toggle(classId: number): void {\n const s = new Set(expanded.value)\n if (s.has(classId)) s.delete(classId)\n else s.add(classId)\n expanded.value = s\n}\n\nconst KIND_ICON: Record<EplClassKind, { ch: string; cls: string }> = {\n static: { ch: '集', cls: 'ico--static' },\n form: { ch: '窗', cls: 'ico--form' },\n class: { ch: '类', cls: 'ico--class' },\n}\n\ninterface TableNode {\n kind: EplDocKind\n title: string\n count: number\n}\nconst tableNodes = computed<TableNode[]>(() => {\n const p = props.program\n const all: TableNode[] = [\n { kind: 'globals', title: '全局变量', count: p.globals.length },\n { kind: 'structs', title: '自定义数据类型', count: p.structs.length },\n { kind: 'dll', title: 'Dll命令', count: p.dllDeclares.length },\n { kind: 'constants', title: '常量表', count: p.constants.length },\n { kind: 'resources', title: '图片/声音', count: p.resources.length },\n { kind: 'forms', title: '资源表', count: p.forms.length },\n { kind: 'libraries', title: '模块引用表', count: p.libraries.length },\n ]\n return all.filter((n) => n.count > 0)\n})\n\nfunction selectClass(classId: number, title: string): void {\n emit('select', { id: `class:${classId >>> 0}`, kind: 'class', classId, title })\n}\nfunction selectTable(n: TableNode): void {\n emit('select', { id: n.kind, kind: n.kind, title: n.title })\n}\n</script>\n\n<template>\n <div class=\"tree\">\n <div class=\"tree__root\">程序数据</div>\n\n <div v-for=\"c in program.classes\" :key=\"c.id\" class=\"tree__group\">\n <div class=\"tree__node\" :class=\"{ 'is-active': activeId === `class:${c.id >>> 0}` }\">\n <button\n v-if=\"c.methods.length\"\n type=\"button\"\n class=\"tree__caret\"\n :class=\"{ 'is-open': expanded.has(c.id) }\"\n @click=\"toggle(c.id)\"\n >\n ▶\n </button>\n <span v-else class=\"tree__caret tree__caret--empty\" />\n <button type=\"button\" class=\"tree__label\" @click=\"selectClass(c.id, c.name)\">\n <span class=\"ico\" :class=\"KIND_ICON[c.kind].cls\">{{ KIND_ICON[c.kind].ch }}</span>\n <span class=\"tree__name\">{{ c.name }}</span>\n </button>\n </div>\n <div v-if=\"expanded.has(c.id)\" class=\"tree__children\">\n <button\n v-for=\"m in c.methods\"\n :key=\"m.id\"\n type=\"button\"\n class=\"tree__method\"\n @click=\"emit('selectMethod', { classId: c.id, methodId: m.id })\"\n >\n <span class=\"ico ico--method\">子</span>\n <span class=\"tree__name\">{{ m.name }}</span>\n </button>\n </div>\n </div>\n\n <button\n v-for=\"n in tableNodes\"\n :key=\"n.kind\"\n type=\"button\"\n class=\"tree__node tree__label tree__table\"\n :class=\"{ 'is-active': activeId === n.kind }\"\n @click=\"selectTable(n)\"\n >\n <span class=\"ico ico--table\">表</span>\n <span class=\"tree__name\">{{ n.title }}</span>\n </button>\n </div>\n</template>\n\n<style scoped>\n.tree {\n font-size: 12.5px;\n padding: 6px 0;\n user-select: none;\n color: var(--epl-fg);\n}\n.tree__root {\n padding: 2px 10px 4px;\n font-weight: 600;\n color: var(--epl-th-fg);\n}\n.tree__node {\n display: flex;\n align-items: center;\n gap: 2px;\n width: 100%;\n}\n.tree__node.is-active,\n.tree__table.is-active {\n background: var(--epl-sel);\n}\n.tree__caret {\n flex: 0 0 auto;\n width: 16px;\n height: 18px;\n padding: 0;\n border: none;\n background: none;\n cursor: pointer;\n color: var(--epl-gutter);\n font-size: 8px;\n transition: transform 0.1s;\n}\n.tree__caret.is-open {\n transform: rotate(90deg);\n}\n.tree__caret--empty {\n cursor: default;\n}\n.tree__label {\n display: flex;\n align-items: center;\n gap: 6px;\n flex: 1 1 auto;\n min-width: 0;\n padding: 2px 10px 2px 0;\n border: none;\n background: none;\n cursor: pointer;\n text-align: left;\n color: inherit;\n font: inherit;\n}\n.tree__label:hover {\n color: var(--epl-ident);\n}\n.tree__table {\n padding-left: 18px;\n}\n.tree__children {\n display: flex;\n flex-direction: column;\n}\n.tree__method {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 1px 10px 1px 34px;\n border: none;\n background: none;\n cursor: pointer;\n text-align: left;\n color: inherit;\n font: inherit;\n}\n.tree__method:hover {\n color: var(--epl-ident);\n}\n.tree__name {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.ico {\n flex: 0 0 auto;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 15px;\n height: 15px;\n border-radius: 3px;\n font-size: 10px;\n color: #fff;\n line-height: 1;\n}\n.ico--static {\n background: #5b8def;\n}\n.ico--form {\n background: #8a6fd0;\n}\n.ico--class {\n background: #2fa37a;\n}\n.ico--method {\n background: #c0894a;\n}\n.ico--table {\n background: #888;\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;EAWA,IAAM,IAAQ,GACR,IAAO,GAKP,IAAW,kBAAiB,IAAI,IAAI,CAAC;EAC3C,SAAS,EAAO,GAAuB;GACrC,IAAM,IAAI,IAAI,IAAI,EAAS,KAAK;GAGhC,AAFI,EAAE,IAAI,CAAO,IAAG,EAAE,OAAO,CAAO,IAC/B,EAAE,IAAI,CAAO,GAClB,EAAS,QAAQ;EACnB;EAEA,IAAM,IAA+D;GACnE,QAAQ;IAAE,IAAI;IAAK,KAAK;GAAc;GACtC,MAAM;IAAE,IAAI;IAAK,KAAK;GAAY;GAClC,OAAO;IAAE,IAAI;IAAK,KAAK;GAAa;EACtC,GAOM,IAAa,QAA4B;GAC7C,IAAM,IAAI,EAAM;GAUhB,OAAO;IARL;KAAE,MAAM;KAAW,OAAO;KAAQ,OAAO,EAAE,QAAQ;IAAO;IAC1D;KAAE,MAAM;KAAW,OAAO;KAAW,OAAO,EAAE,QAAQ;IAAO;IAC7D;KAAE,MAAM;KAAO,OAAO;KAAS,OAAO,EAAE,YAAY;IAAO;IAC3D;KAAE,MAAM;KAAa,OAAO;KAAO,OAAO,EAAE,UAAU;IAAO;IAC7D;KAAE,MAAM;KAAa,OAAO;KAAS,OAAO,EAAE,UAAU;IAAO;IAC/D;KAAE,MAAM;KAAS,OAAO;KAAO,OAAO,EAAE,MAAM;IAAO;IACrD;KAAE,MAAM;KAAa,OAAO;KAAS,OAAO,EAAE,UAAU;IAAO;GAE1D,CAAA,CAAI,QAAQ,MAAM,EAAE,QAAQ,CAAC;EACtC,CAAC;EAED,SAAS,EAAY,GAAiB,GAAqB;GACzD,EAAK,UAAU;IAAE,IAAI,SAAS,MAAY;IAAK,MAAM;IAAS;IAAS;GAAM,CAAC;EAChF;EACA,SAAS,EAAY,GAAoB;GACvC,EAAK,UAAU;IAAE,IAAI,EAAE;IAAM,MAAM,EAAE;IAAM,OAAO,EAAE;GAAM,CAAC;EAC7D;yBAIE,EA6CM,OA7CN,GA6CM;YA5CJ,EAAkC,OAAA,EAA7B,OAAM,aAAY,GAAC,QAAI,EAAA;WAE5B,EA6BM,GAAA,MAAA,EA7BW,EAAA,QAAQ,UAAb,YAAZ,EA6BM,OAAA;IA7B6B,KAAK,EAAE;IAAI,OAAM;OAClD,EAeM,OAAA,EAfD,OAAK,EAAA,CAAC,cAAY,EAAA,aAAwB,EAAA,aAAQ,SAAc,EAAE,OAAE,IAAA,CAAA,CAAA,EAAA,GAAA,CAE/D,EAAE,QAAQ,UAAA,EAAA,GADlB,EAQS,UAAA;;IANP,MAAK;IACL,OAAK,EAAA,CAAC,eAAa,EAAA,WACE,EAAA,MAAS,IAAI,EAAE,EAAE,EAAA,CAAA,CAAA;IACrC,UAAK,MAAE,EAAO,EAAE,EAAE;MACpB,OAED,IAAA,CAAA,MAAA,EAAA,GACA,EAAsD,QAAtD,CAAsD,IACtD,EAGS,UAAA;IAHD,MAAK;IAAS,OAAM;IAAe,UAAK,MAAE,EAAY,EAAE,IAAI,EAAE,IAAI;OACxE,EAAkF,QAAA,EAA5E,OAAK,EAAA,CAAC,OAAc,EAAU,EAAE,KAAI,CAAE,GAAG,CAAA,EAAA,GAAA,EAAK,EAAU,EAAE,KAAI,CAAE,EAAE,GAAA,CAAA,GACxE,EAA4C,QAA5C,GAA4C,EAAhB,EAAE,IAAI,GAAA,CAAA,CAAA,GAAA,GAAA,CAAA,CAAA,GAAA,CAAA,GAG3B,EAAA,MAAS,IAAI,EAAE,EAAE,KAAA,EAAA,GAA5B,EAWM,OAXN,GAWM,EAAA,EAAA,EAAA,GAVJ,EASS,GAAA,MAAA,EARK,EAAE,UAAP,YADT,EASS,UAAA;IAPN,KAAK,EAAE;IACR,MAAK;IACL,OAAM;IACL,UAAK,MAAE,EAAI,gBAAA;KAAA,SAA4B,EAAE;KAAE,UAAY,EAAE;IAAE,CAAA;gBAE5D,EAAsC,QAAA,EAAhC,OAAM,kBAAiB,GAAC,KAAC,EAAA,GAC/B,EAA4C,QAA5C,GAA4C,EAAhB,EAAE,IAAI,GAAA,CAAA,CAAA,GAAA,GAAA,CAAA;WAKxC,EAUS,GAAA,MAAA,EATK,EAAA,QAAL,YADT,EAUS,UAAA;IARN,KAAK,EAAE;IACR,MAAK;IACL,OAAK,EAAA,CAAC,sCAAoC,EAAA,aACnB,EAAA,aAAa,EAAE,KAAI,CAAA,CAAA;IACzC,UAAK,MAAE,EAAY,CAAC;gBAErB,EAAqC,QAAA,EAA/B,OAAM,iBAAgB,GAAC,KAAC,EAAA,GAC9B,EAA6C,QAA7C,GAA6C,EAAjB,EAAE,KAAK,GAAA,CAAA,CAAA,GAAA,IAAA,CAAA"}
@@ -5,3 +5,5 @@ import t from "./EplVarTable.vue_vue_type_script_setup_true_lang.js";
5
5
  var n = /*#__PURE__*/ e(t, [["__scopeId", "data-v-eff7e67b"]]);
6
6
  //#endregion
7
7
  export { n as default };
8
+
9
+ //# sourceMappingURL=EplVarTable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EplVarTable.js","names":[],"sources":["../../../src/components/epl/EplVarTable.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { EplVarRow } from '@/lib/epl'\n\n/**\n * The 易语言 IDE renders every definition (参数 / 局部变量 / 成员 / 全局变量 / DLL 参数) as a bordered table\n * with a pale header row. This is the shared table: the caller picks the columns (label + which {@link EplVarRow}\n * field each maps to), so one component covers all the variation between parameter / variable / member tables.\n * Boolean columns (公开 / 静态 / 传址 / 参考 / 可空 / 数组) render a centered ✓.\n */\nexport type EplColKey =\n | 'name'\n | 'type'\n | 'public'\n | 'static'\n | 'byAddress'\n | 'byReference'\n | 'nullable'\n | 'arrayBound'\n | 'arrayFlag'\n | 'comment'\n\nexport interface EplCol {\n key: EplColKey\n label: string\n}\n\n/** `nos` are the document-wide line numbers for each row (one per `rows` entry); the header row gets none. */\nconst props = defineProps<{ columns: EplCol[]; rows: EplVarRow[]; nos?: number[] }>()\n\nfunction rowNo(i: number): number {\n return props.nos?.[i] ?? i + 1\n}\n\nconst BOOL_KEYS = new Set<EplColKey>([\n 'public',\n 'static',\n 'byAddress',\n 'byReference',\n 'nullable',\n 'arrayFlag',\n])\n\nfunction isBool(key: EplColKey): boolean {\n return BOOL_KEYS.has(key)\n}\n\nfunction cell(row: EplVarRow, key: EplColKey): string {\n switch (key) {\n case 'name':\n return row.name\n case 'type':\n return row.type\n case 'public':\n return row.isPublic ? '✓' : ''\n case 'static':\n return row.isStatic ? '✓' : ''\n case 'byAddress':\n return row.byAddress ? '✓' : ''\n case 'byReference':\n return row.byReference ? '✓' : ''\n case 'nullable':\n return row.nullable ? '✓' : ''\n case 'arrayBound':\n return row.arrayBound\n case 'arrayFlag':\n return row.isArray ? '✓' : ''\n case 'comment':\n return row.comment\n }\n}\n\n/** Is this column an identifier-ish one (rendered in the IDE's blue link color)? */\nfunction isIdent(key: EplColKey): boolean {\n return key === 'name' || key === 'type'\n}\n</script>\n\n<template>\n <table class=\"vt\">\n <thead>\n <tr>\n <th class=\"vt__gut\" />\n <th\n v-for=\"col in columns\"\n :key=\"col.key\"\n :class=\"{ 'vt__th--bool': isBool(col.key), 'vt__th--cmt': col.key === 'comment' }\"\n >\n {{ col.label }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(row, i) in rows\" :key=\"i\">\n <td class=\"vt__gut\">{{ rowNo(i) }}</td>\n <td\n v-for=\"col in columns\"\n :key=\"col.key\"\n :class=\"{\n 'vt__td--bool': isBool(col.key),\n 'vt__td--ident': isIdent(col.key),\n 'vt__td--cmt': col.key === 'comment',\n }\"\n >\n {{ cell(row, col.key) }}\n </td>\n </tr>\n </tbody>\n </table>\n</template>\n\n<style scoped>\n.vt {\n border-collapse: collapse;\n font-size: 12.5px;\n margin: 2px 0 0;\n background: var(--epl-bg);\n table-layout: auto;\n}\n.vt th,\n.vt td {\n border: 1px solid var(--epl-border);\n padding: 2px 8px;\n text-align: left;\n white-space: nowrap;\n color: var(--epl-fg);\n}\n.vt th {\n background: var(--epl-th-bg);\n color: var(--epl-th-fg);\n font-weight: 600;\n}\n.vt__th--bool,\n.vt__td--bool {\n text-align: center;\n min-width: 2.6em;\n}\n.vt__td--bool {\n color: var(--epl-check);\n font-weight: 700;\n}\n.vt__td--ident {\n color: var(--epl-ident);\n}\n.vt__th--cmt,\n.vt__td--cmt {\n white-space: normal;\n}\n.vt__td--cmt {\n color: var(--epl-comment);\n}\nth.vt__gut,\ntd.vt__gut {\n width: 3.4em;\n min-width: 3.4em;\n box-sizing: border-box;\n padding: 2px 10px 2px 0;\n text-align: right;\n border: none;\n background: var(--epl-gutter-bg);\n color: var(--epl-gutter);\n font-weight: normal;\n user-select: none;\n position: sticky;\n left: 0;\n z-index: 1;\n}\n</style>\n"],"mappings":""}
@@ -58,3 +58,5 @@ var c = { class: "vt" }, l = { class: "vt__gut" }, u = /*@__PURE__*/ r({
58
58
  });
59
59
  //#endregion
60
60
  export { u as default };
61
+
62
+ //# sourceMappingURL=EplVarTable.vue_vue_type_script_setup_true_lang.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EplVarTable.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/epl/EplVarTable.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { EplVarRow } from '@/lib/epl'\n\n/**\n * The 易语言 IDE renders every definition (参数 / 局部变量 / 成员 / 全局变量 / DLL 参数) as a bordered table\n * with a pale header row. This is the shared table: the caller picks the columns (label + which {@link EplVarRow}\n * field each maps to), so one component covers all the variation between parameter / variable / member tables.\n * Boolean columns (公开 / 静态 / 传址 / 参考 / 可空 / 数组) render a centered ✓.\n */\nexport type EplColKey =\n | 'name'\n | 'type'\n | 'public'\n | 'static'\n | 'byAddress'\n | 'byReference'\n | 'nullable'\n | 'arrayBound'\n | 'arrayFlag'\n | 'comment'\n\nexport interface EplCol {\n key: EplColKey\n label: string\n}\n\n/** `nos` are the document-wide line numbers for each row (one per `rows` entry); the header row gets none. */\nconst props = defineProps<{ columns: EplCol[]; rows: EplVarRow[]; nos?: number[] }>()\n\nfunction rowNo(i: number): number {\n return props.nos?.[i] ?? i + 1\n}\n\nconst BOOL_KEYS = new Set<EplColKey>([\n 'public',\n 'static',\n 'byAddress',\n 'byReference',\n 'nullable',\n 'arrayFlag',\n])\n\nfunction isBool(key: EplColKey): boolean {\n return BOOL_KEYS.has(key)\n}\n\nfunction cell(row: EplVarRow, key: EplColKey): string {\n switch (key) {\n case 'name':\n return row.name\n case 'type':\n return row.type\n case 'public':\n return row.isPublic ? '✓' : ''\n case 'static':\n return row.isStatic ? '✓' : ''\n case 'byAddress':\n return row.byAddress ? '✓' : ''\n case 'byReference':\n return row.byReference ? '✓' : ''\n case 'nullable':\n return row.nullable ? '✓' : ''\n case 'arrayBound':\n return row.arrayBound\n case 'arrayFlag':\n return row.isArray ? '✓' : ''\n case 'comment':\n return row.comment\n }\n}\n\n/** Is this column an identifier-ish one (rendered in the IDE's blue link color)? */\nfunction isIdent(key: EplColKey): boolean {\n return key === 'name' || key === 'type'\n}\n</script>\n\n<template>\n <table class=\"vt\">\n <thead>\n <tr>\n <th class=\"vt__gut\" />\n <th\n v-for=\"col in columns\"\n :key=\"col.key\"\n :class=\"{ 'vt__th--bool': isBool(col.key), 'vt__th--cmt': col.key === 'comment' }\"\n >\n {{ col.label }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(row, i) in rows\" :key=\"i\">\n <td class=\"vt__gut\">{{ rowNo(i) }}</td>\n <td\n v-for=\"col in columns\"\n :key=\"col.key\"\n :class=\"{\n 'vt__td--bool': isBool(col.key),\n 'vt__td--ident': isIdent(col.key),\n 'vt__td--cmt': col.key === 'comment',\n }\"\n >\n {{ cell(row, col.key) }}\n </td>\n </tr>\n </tbody>\n </table>\n</template>\n\n<style scoped>\n.vt {\n border-collapse: collapse;\n font-size: 12.5px;\n margin: 2px 0 0;\n background: var(--epl-bg);\n table-layout: auto;\n}\n.vt th,\n.vt td {\n border: 1px solid var(--epl-border);\n padding: 2px 8px;\n text-align: left;\n white-space: nowrap;\n color: var(--epl-fg);\n}\n.vt th {\n background: var(--epl-th-bg);\n color: var(--epl-th-fg);\n font-weight: 600;\n}\n.vt__th--bool,\n.vt__td--bool {\n text-align: center;\n min-width: 2.6em;\n}\n.vt__td--bool {\n color: var(--epl-check);\n font-weight: 700;\n}\n.vt__td--ident {\n color: var(--epl-ident);\n}\n.vt__th--cmt,\n.vt__td--cmt {\n white-space: normal;\n}\n.vt__td--cmt {\n color: var(--epl-comment);\n}\nth.vt__gut,\ntd.vt__gut {\n width: 3.4em;\n min-width: 3.4em;\n box-sizing: border-box;\n padding: 2px 10px 2px 0;\n text-align: right;\n border: none;\n background: var(--epl-gutter-bg);\n color: var(--epl-gutter);\n font-weight: normal;\n user-select: none;\n position: sticky;\n left: 0;\n z-index: 1;\n}\n</style>\n"],"mappings":";;;;;;;;;;EA2BA,IAAM,IAAQ;EAEd,SAAS,EAAM,GAAmB;GAChC,OAAO,EAAM,MAAM,MAAM,IAAI;EAC/B;EAEA,IAAM,IAAY,IAAI,IAAe;GACnC;GACA;GACA;GACA;GACA;GACA;EACF,CAAC;EAED,SAAS,EAAO,GAAyB;GACvC,OAAO,EAAU,IAAI,CAAG;EAC1B;EAEA,SAAS,EAAK,GAAgB,GAAwB;GACpD,QAAQ,GAAR;IACE,KAAK,QACH,OAAO,EAAI;IACb,KAAK,QACH,OAAO,EAAI;IACb,KAAK,UACH,OAAO,EAAI,WAAW,MAAM;IAC9B,KAAK,UACH,OAAO,EAAI,WAAW,MAAM;IAC9B,KAAK,aACH,OAAO,EAAI,YAAY,MAAM;IAC/B,KAAK,eACH,OAAO,EAAI,cAAc,MAAM;IACjC,KAAK,YACH,OAAO,EAAI,WAAW,MAAM;IAC9B,KAAK,cACH,OAAO,EAAI;IACb,KAAK,aACH,OAAO,EAAI,UAAU,MAAM;IAC7B,KAAK,WACH,OAAO,EAAI;GACf;EACF;EAGA,SAAS,EAAQ,GAAyB;GACxC,OAAO,MAAQ,UAAU,MAAQ;EACnC;yBAIE,EA6BQ,SA7BR,GA6BQ,CA5BN,EAWQ,SAAA,MAAA,CAVN,EASK,MAAA,MAAA,CAAA,AAAA,EAAA,OARH,EAAsB,MAAA,EAAlB,OAAM,UAAS,GAAA,MAAA,EAAA,IAAA,EAAA,EAAA,GACnB,EAMK,GAAA,MAAA,EALW,EAAA,UAAP,YADT,EAMK,MAAA;GAJF,KAAK,EAAI;GACT,OAAK,EAAA;IAAA,gBAAoB,EAAO,EAAI,GAAG;IAAA,eAAkB,EAAI,QAAG;GAAA,CAAA;OAE9D,EAAI,KAAK,GAAA,CAAA,gBAIlB,EAeQ,SAAA,MAAA,EAAA,EAAA,EAAA,GAdN,EAaK,GAAA,MAAA,EAbkB,EAAA,OAAX,GAAK,YAAjB,EAaK,MAAA,EAbyB,KAAK,EAAC,GAAA,CAClC,EAAuC,MAAvC,GAAuC,EAAhB,EAAM,CAAC,CAAA,GAAA,CAAA,IAAA,EAAA,EAAA,GAC9B,EAUK,GAAA,MAAA,EATW,EAAA,UAAP,YADT,EAUK,MAAA;GARF,KAAK,EAAI;GACT,OAAK,EAAA;oBAAgC,EAAO,EAAI,GAAG;qBAAgC,EAAQ,EAAI,GAAG;mBAA8B,EAAI,QAAG;;OAMrI,EAAK,GAAK,EAAI,GAAG,CAAA,GAAA,CAAA"}
@@ -12,3 +12,5 @@ var e = class {
12
12
  };
13
13
  //#endregion
14
14
  export { e as LineCounter };
15
+
16
+ //# sourceMappingURL=numbering.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"numbering.js","names":[],"sources":["../../../src/components/epl/numbering.ts"],"sourcesContent":["/**\n * Document-wide line numbering for the IDE-style viewer. The 易语言 source view puts a single continuous\n * line-number gutter down the whole document: every *body* row (the 程序集/类 row, each 子程序 / 参数 / 局部 /\n * 成员 / 全局 row, and every code line — blanks included) takes the next number, while column-header rows do\n * not. So numbering can't live inside one table or one method; it threads through the active document here, and\n * the components just render the numbers they're handed.\n */\n\n/** Per-method numbers: the 子程序名 header row, then parameter / local-variable rows, then code lines.\n * A code entry is `null` for a row that takes no number (a hidden control-flow terminator). */\nexport interface MethodNos {\n head: number\n params: number[]\n locals: number[]\n code: (number | null)[]\n}\n\n/** A running 1-based counter that hands out single numbers or contiguous runs in document order. */\nexport class LineCounter {\n private n = 1\n next(): number {\n return this.n++\n }\n take(count: number): number[] {\n const out: number[] = []\n for (let i = 0; i < count; i++) out.push(this.n++)\n return out\n }\n}\n"],"mappings":";AAkBA,IAAa,IAAb,MAAyB;CACvB,IAAY;CACZ,OAAe;EACb,OAAO,KAAK;CACd;CACA,KAAK,GAAyB;EAC5B,IAAM,IAAgB,CAAC;EACvB,KAAK,IAAI,IAAI,GAAG,IAAI,GAAO,KAAK,EAAI,KAAK,KAAK,GAAG;EACjD,OAAO;CACT;AACF"}
@@ -5,3 +5,5 @@ import t from "./Icon.vue_vue_type_script_setup_true_lang.js";
5
5
  var n = /*#__PURE__*/ e(t, [["__scopeId", "data-v-5d3b9e77"]]);
6
6
  //#endregion
7
7
  export { n as default };
8
+
9
+ //# sourceMappingURL=Icon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Icon.js","names":[],"sources":["../../../src/components/icons/Icon.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { STROKE_ICONS, type StrokeIconName } from './iconPaths'\n\n/** Outline icon (viewBox 24, stroke currentColor). Pass a known `name` or raw `path`. */\nconst props = withDefaults(\n defineProps<{\n name?: StrokeIconName\n path?: string\n size?: number\n strokeWidth?: number\n }>(),\n { size: 15, strokeWidth: 1.8 },\n)\n\nconst inner = computed(() => props.path ?? (props.name ? STROKE_ICONS[props.name] : ''))\n</script>\n\n<template>\n <span class=\"dc-icon\">\n <svg\n :width=\"size\"\n :height=\"size\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n :stroke-width=\"strokeWidth\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n v-html=\"inner\"\n />\n </span>\n</template>\n\n<style scoped>\n.dc-icon {\n display: inline-flex;\n line-height: 0;\n}\n</style>\n"],"mappings":""}
@@ -31,3 +31,5 @@ var a = { class: "dc-icon" }, o = [
31
31
  });
32
32
  //#endregion
33
33
  export { s as default };
34
+
35
+ //# sourceMappingURL=Icon.vue_vue_type_script_setup_true_lang.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Icon.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/icons/Icon.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { STROKE_ICONS, type StrokeIconName } from './iconPaths'\n\n/** Outline icon (viewBox 24, stroke currentColor). Pass a known `name` or raw `path`. */\nconst props = withDefaults(\n defineProps<{\n name?: StrokeIconName\n path?: string\n size?: number\n strokeWidth?: number\n }>(),\n { size: 15, strokeWidth: 1.8 },\n)\n\nconst inner = computed(() => props.path ?? (props.name ? STROKE_ICONS[props.name] : ''))\n</script>\n\n<template>\n <span class=\"dc-icon\">\n <svg\n :width=\"size\"\n :height=\"size\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n :stroke-width=\"strokeWidth\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n v-html=\"inner\"\n />\n </span>\n</template>\n\n<style scoped>\n.dc-icon {\n display: inline-flex;\n line-height: 0;\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;EAKA,IAAM,IAAQ,GAUR,IAAQ,QAAe,EAAM,SAAS,EAAM,OAAO,EAAa,EAAM,QAAQ,GAAG;yBAIrF,EAYO,QAZP,GAYO,EAAA,EAAA,GAXL,EAUE,OAAA;GATC,OAAO,EAAA;GACP,QAAQ,EAAA;GACT,SAAQ;GACR,MAAK;GACL,QAAO;GACN,gBAAc,EAAA;GACf,kBAAe;GACf,mBAAgB;GAChB,WAAQ,EAAA"}
@@ -52,3 +52,5 @@ var e = {
52
52
  };
53
53
  //#endregion
54
54
  export { e as FILL_ICONS, t as STROKE_ICONS };
55
+
56
+ //# sourceMappingURL=iconPaths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iconPaths.js","names":[],"sources":["../../../src/components/icons/iconPaths.ts"],"sourcesContent":["/**\n * Centralized SVG path data, lifted from the inline SVGs scattered through the\n * original viewer. Two families:\n * - FILL_ICONS: filled glyphs, viewBox 0 0 20 20, fill currentColor (old icoF / ICONS)\n * - STROKE_ICONS: outline glyphs, viewBox 0 0 24 24, stroke currentColor (old ico)\n */\n\nexport const FILL_ICONS = {\n thinking:\n '<path d=\"M10.386 2.51A7.5 7.5 0 1 1 2.5 10a.5.5 0 0 1 1 0 6.5 6.5 0 1 0 6.835-6.491L10 3.5l-.1-.01a.5.5 0 0 1 .1-.99zM10 5.5a.5.5 0 0 1 .5.5v3.69l2.724 1.363a.5.5 0 0 1-.353.93l-.095-.036-3-1.5A.5.5 0 0 1 9.5 10V6a.5.5 0 0 1 .5-.5M3.662 6.941a.661.661 0 1 1 0 1.323.661.661 0 0 1 0-1.323m1.294-2.647a.662.662 0 1 1-.001 1.323.662.662 0 0 1 .001-1.323M7.603 3a.662.662 0 1 1-.001 1.325.662.662 0 0 1 0-1.325\"/>',\n bash: '<path fill-rule=\"evenodd\" d=\"M3.5 4A1.5 1.5 0 0 0 2 5.5v9A1.5 1.5 0 0 0 3.5 16h13a1.5 1.5 0 0 0 1.5-1.5v-9A1.5 1.5 0 0 0 16.5 4zm0 1.2h13a.3.3 0 0 1 .3.3v9a.3.3 0 0 1-.3.3h-13a.3.3 0 0 1-.3-.3v-9a.3.3 0 0 1 .3-.3z\" clip-rule=\"evenodd\"/><path d=\"M5.3 7.2a.6.6 0 0 1 .85 0l2.1 2.1a.6.6 0 0 1 0 .85l-2.1 2.1a.6.6 0 1 1-.85-.85L6.99 9.7 5.3 8.05a.6.6 0 0 1 0-.85M9.6 11.6a.6.6 0 0 0 0 1.2h3.6a.6.6 0 0 0 0-1.2z\"/>',\n skill:\n '<path d=\"M13.04 7.304a.5.5 0 0 1 .92.392C13.665 8.386 13.089 9 12.3 9c-.487 0-.892-.234-1.2-.574-.309.34-.713.574-1.2.574-.486 0-.892-.234-1.2-.574-.31.34-.714.574-1.2.574a.5.5 0 0 1 0-1c.212 0 .52-.18.74-.696a.5.5 0 0 1 .92 0c.221.516.528.696.74.696.213 0 .52-.18.74-.696l.035-.067a.5.5 0 0 1 .885.067c.22.516.527.696.74.696s.519-.18.74-.696\"/><path fill-rule=\"evenodd\" d=\"M14 3a2 2 0 0 1 2 2v8h1.5a.5.5 0 0 1 .5.5V15a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V4H4a1 1 0 0 0-.745 1.667.5.5 0 0 1-.745.666A2 2 0 0 1 4 3zM6 15a1 1 0 1 0 2 0v-1.5a.5.5 0 0 1 .5-.5H15V5a1 1 0 0 0-1-1H6zm3 0c0 .365-.1.706-.27 1H16a1 1 0 0 0 1-1v-1H9z\" clip-rule=\"evenodd\"/>',\n edit: '<path d=\"M14.3 2.7a2.05 2.05 0 0 1 2.9 2.9l-.79.79-2.9-2.9zM12.79 4.21l2.9 2.9-7.86 7.86a1 1 0 0 1-.43.25l-3.2.9a.5.5 0 0 1-.62-.62l.9-3.2a1 1 0 0 1 .25-.43z\"/>',\n file: '<path fill-rule=\"evenodd\" d=\"M5.5 2.5A1.5 1.5 0 0 0 4 4v12a1.5 1.5 0 0 0 1.5 1.5h9A1.5 1.5 0 0 0 16 16V7.62a1.5 1.5 0 0 0-.44-1.06l-3.12-3.12a1.5 1.5 0 0 0-1.06-.44zm6 1.96 2.54 2.54H12a.5.5 0 0 1-.5-.5z\" clip-rule=\"evenodd\"/>',\n check:\n '<path d=\"M16.74 5.8a1 1 0 0 1 .04 1.41l-7.02 7.32a1 1 0 0 1-1.45.01l-3-3.13a1 1 0 1 1 1.44-1.38l2.28 2.37 6.3-6.56a1 1 0 0 1 1.41-.04z\"/>',\n tool: '<circle cx=\"10\" cy=\"10\" r=\"3\"/>',\n // \"Search past conversations\" (conversation_search / \"memory\"): a chat squiggle inside a refresh ring.\n // Used on the conversation_search timeline rail (see ChatSearchStep).\n conversation:\n '<path d=\"M13.29 8.804a.5.5 0 0 1 .92.392c-.36.84-1.046 1.554-1.96 1.554-.613 0-1.122-.321-1.5-.785-.378.464-.887.785-1.5.785s-1.122-.321-1.5-.785c-.378.464-.887.785-1.5.785a.5.5 0 0 1 0-1c.338 0 .755-.28 1.04-.946l.034-.067a.5.5 0 0 1 .886.067l.112.231c.276.5.632.715.928.715.338 0 .755-.28 1.04-.946l.034-.067a.5.5 0 0 1 .886.067l.112.231c.276.5.633.715.928.715.338 0 .755-.28 1.04-.946\"/><path d=\"M17.5 9.5A7.5 7.5 0 0 0 2.516 9c-.018.275.208.5.484.5a.53.53 0 0 0 .519-.5A6.5 6.5 0 1 1 10 16l-5.855.004.828-.834a.497.497 0 0 0-.706-.701l-1.576 1.584a.656.656 0 0 0 0 .926l1.542 1.55a.51.51 0 1 0 .722-.723l-.81-.802L10 17a7.5 7.5 0 0 0 7.5-7.5\"/>',\n // \"Open in new\" — a window with a diagonal arrow out the top-right. Used by web_fetch rich links.\n external:\n '<path d=\"M9.5 3a.5.5 0 0 1 0 1h-5a.5.5 0 0 0-.5.5v11a.5.5 0 0 0 .5.5h11a.5.5 0 0 0 .5-.5v-5a.5.5 0 0 1 1 0v5a1.5 1.5 0 0 1-1.5 1.5h-11A1.5 1.5 0 0 1 3 15.5v-11A1.5 1.5 0 0 1 4.5 3zm7 0a.5.5 0 0 1 .18.034l.021.01q.03.014.059.03l.023.014a.5.5 0 0 1 .07.058l.065.079q.015.025.026.052l.018.034a.5.5 0 0 1 .032.128Q17 3.47 17 3.5v4a.5.5 0 0 1-1 0V4.707l-4.146 4.147a.5.5 0 1 1-.707-.708L15.293 4H12.5a.5.5 0 0 1 0-1z\"/>',\n} as const\n\nexport type IconKey = keyof typeof FILL_ICONS\n\nexport const STROKE_ICONS = {\n copy: '<rect x=\"9\" y=\"9\" width=\"11\" height=\"11\" rx=\"2\"/><path d=\"M5 15V5a2 2 0 0 1 2-2h10\"/>',\n fileOutline:\n '<path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><path d=\"M14 2v6h6\"/>',\n arrowLeft: '<path d=\"M19 12H5\"/><path d=\"M12 19l-7-7 7-7\"/>',\n logout:\n '<path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\"/><path d=\"M16 17l5-5-5-5\"/><path d=\"M21 12H9\"/>',\n download:\n '<path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"/><path d=\"M7 10l5 5 5-5\"/><path d=\"M12 15V3\"/>',\n close: '<path d=\"M18 6 6 18\"/><path d=\"M6 6l12 12\"/>',\n eye: '<path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\"/><circle cx=\"12\" cy=\"12\" r=\"3.5\"/>',\n code: '<path d=\"M16 18l6-6-6-6\"/><path d=\"M8 6l-6 6 6 6\"/>',\n globe:\n '<circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M3 12h18M12 3c2.5 2.6 2.5 15.4 0 18M12 3c-2.5 2.6-2.5 15.4 0 18\"/>',\n link: '<path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"/>',\n chevronRight: '<path d=\"M9 6l6 6-6 6\"/>',\n chevronLeft: '<path d=\"M15 6l-6 6 6 6\"/>',\n chevronDown: '<path d=\"M6 9l6 6 6-6\"/>',\n // Speech bubble — one past chat in a conversation_search result list (ChatSearchStep rows).\n chat: '<path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"/>',\n folder:\n '<path d=\"M3 7a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.7.9l.8 1.1H19a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\"/>',\n archive:\n '<rect x=\"3\" y=\"4\" width=\"18\" height=\"4\" rx=\"1\"/><path d=\"M5 8v11a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V8\"/><path d=\"M10 12h4\"/>',\n image:\n '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/><circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"/><path d=\"M21 15l-5-5L5 21\"/>',\n play: '<circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M10 8.5l5 3.5-5 3.5z\"/>',\n music: '<path d=\"M9 18V5l12-2v13\"/><circle cx=\"6\" cy=\"18\" r=\"3\"/><circle cx=\"18\" cy=\"16\" r=\"3\"/>',\n arrowDown: '<path d=\"M12 5v14\"/><path d=\"M5 12l7 7 7-7\"/>',\n arrowUp: '<path d=\"M12 19V5\"/><path d=\"M5 12l7-7 7 7\"/>',\n chart:\n '<path d=\"M3 3v18h18\"/><rect x=\"7\" y=\"11\" width=\"3\" height=\"6\"/><rect x=\"13\" y=\"7\" width=\"3\" height=\"10\"/>',\n pot: '<path d=\"M2 12h20\"/><path d=\"M20 12v7a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2v-7\"/><path d=\"m4 8 16-4\"/><path d=\"m8.9 6.8-.5-1.8a2 2 0 0 1 1.5-2.4l1.9-.5a2 2 0 0 1 2.4 1.5l.5 1.8\"/>',\n clock: '<circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 7v5l3 2\"/>',\n info: '<circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M12 16v-4\"/><path d=\"M12 8h.01\"/>',\n retry: '<path d=\"M21 12a9 9 0 1 1-2.64-6.36M21 4v5h-5\"/>',\n thumb:\n '<path d=\"M7 10v11M7 10l4-7a2 2 0 0 1 2.6 2.6L12 10h5.6a2 2 0 0 1 2 2.4l-1.3 6A2 2 0 0 1 16.3 21H7\"/>',\n help: '<circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M9.1 9a3 3 0 0 1 5.8 1c0 2-3 3-3 3\"/><path d=\"M12 17h.01\"/>',\n key: '<circle cx=\"7.5\" cy=\"15.5\" r=\"5.5\"/><path d=\"m11.4 11.6 9.6-9.6\"/><path d=\"m15.5 7.5 3 3L22 7l-3-3\"/>',\n users:\n '<path d=\"M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\"/><circle cx=\"9\" cy=\"7\" r=\"4\"/><path d=\"M23 21v-2a4 4 0 0 0-3-3.87\"/><path d=\"M16 3.13a4 4 0 0 1 0 7.75\"/>',\n plus: '<path d=\"M12 5v14\"/><path d=\"M5 12h14\"/>',\n check: '<path d=\"M20 6 9 17l-5-5\"/>',\n trash:\n '<path d=\"M3 6h18\"/><path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\"/><path d=\"M10 11v6\"/><path d=\"M14 11v6\"/>',\n // Four corner brackets — \"expand to full screen\" (used by the HTML preview's in-app fullscreen overlay).\n maximize:\n '<path d=\"M8 3H5a2 2 0 0 0-2 2v3\"/><path d=\"M21 8V5a2 2 0 0 0-2-2h-3\"/><path d=\"M3 16v3a2 2 0 0 0 2 2h3\"/><path d=\"M16 21h3a2 2 0 0 0 2-2v-3\"/>',\n // Paperclip — \"this conversation has attached files\" (the listing's file marker).\n paperclip:\n '<path d=\"M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48\"/>',\n // Stacked documents — \"open this conversation's associated-file list\" (the detail page's top-right button).\n files:\n '<path d=\"M20 7h-3a2 2 0 0 1-2-2V2\"/><path d=\"M9 18a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h7l4 4v10a2 2 0 0 1-2 2Z\"/><path d=\"M3 7.6v12.8A1.6 1.6 0 0 0 4.6 22h9.8\"/>',\n // Target/crosshair — \"locate this file in the conversation\" (the file panel's jump cue).\n locate: '<circle cx=\"12\" cy=\"12\" r=\"3\"/><path d=\"M12 2v4M12 18v4M2 12h4M18 12h4\"/>',\n // Byte grid in a frame — \"view raw bytes / hex dump\" (the unpreviewable-file \"open with\" hex chooser).\n hex: '<rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\"/><path d=\"M7 9h.01M11 9h.01M15 9h.01M7 13h.01M11 13h.01M15 13h.01\"/>',\n // Four tiles — \"open with / choose a viewer\" (the file panel's universal formatter menu trigger).\n apps: '<rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" rx=\"1.5\"/><rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" rx=\"1.5\"/><rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" rx=\"1.5\"/><rect x=\"14\" y=\"14\" width=\"7\" height=\"7\" rx=\"1.5\"/>',\n} as const\n\nexport type StrokeIconName = keyof typeof STROKE_ICONS\n"],"mappings":";AAOA,IAAa,IAAa;CACxB,UACE;CACF,MAAM;CACN,OACE;CACF,MAAM;CACN,MAAM;CACN,OACE;CACF,MAAM;CAGN,cACE;CAEF,UACE;AACJ,GAIa,IAAe;CAC1B,MAAM;CACN,aACE;CACF,WAAW;CACX,QACE;CACF,UACE;CACF,OAAO;CACP,KAAK;CACL,MAAM;CACN,OACE;CACF,MAAM;CACN,cAAc;CACd,aAAa;CACb,aAAa;CAEb,MAAM;CACN,QACE;CACF,SACE;CACF,OACE;CACF,MAAM;CACN,OAAO;CACP,WAAW;CACX,SAAS;CACT,OACE;CACF,KAAK;CACL,OAAO;CACP,MAAM;CACN,OAAO;CACP,OACE;CACF,MAAM;CACN,KAAK;CACL,OACE;CACF,MAAM;CACN,OAAO;CACP,OACE;CAEF,UACE;CAEF,WACE;CAEF,OACE;CAEF,QAAQ;CAER,KAAK;CAEL,MAAM;AACR"}
@@ -35,3 +35,5 @@ function i(i, a, o) {
35
35
  }
36
36
  //#endregion
37
37
  export { i as optionalViewer };
38
+
39
+ //# sourceMappingURL=optionalViewer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optionalViewer.js","names":[],"sources":["../../src/components/optionalViewer.ts"],"sourcesContent":["import { defineAsyncComponent, defineComponent, h, type Component } from 'vue'\nimport MissingDependency from '@/components/MissingDependency.vue'\n\n/**\n * Wrap a heavy viewer's async loader so that, when its OPTIONAL peer dependency isn't installed in the\n * consumer's app, the chunk-load failure shows a {@link MissingDependency} card (\"npm i <pkg>\") instead of a\n * blank error (see docs/file-viewer-package-design.md §4). The dep is `external` in the library build, so a\n * viewer that statically imports it fails to evaluate its chunk when the dep is absent — which lands here.\n *\n * The error component receives the SAME props the viewer was given (`url`/`name`/`size`), so the card can keep\n * the file downloadable. Only for viewers whose dep is imported STATICALLY (pdf/docx/xlsx/pptx/sqlite/model/\n * dicom); viewers that import their engine dynamically at runtime (geo/raster/ebook) handle absence themselves.\n */\nexport function optionalViewer(\n loader: () => Promise<Component | { default: Component }>,\n deps: string | string[],\n label: string,\n): Component {\n const pkg = Array.isArray(deps) ? deps : [deps]\n return defineAsyncComponent({\n loader: loader as () => Promise<Component>,\n errorComponent: defineComponent({\n name: 'ViewerDependencyMissing',\n props: {\n url: { type: String, default: '' },\n name: { type: String, default: '' },\n size: { type: Number, default: undefined },\n },\n setup: (props) => () =>\n h(MissingDependency, {\n pkg,\n label,\n downloadUrl: props.url,\n downloadName: props.name,\n }),\n }),\n // Any failure to load this viewer's chunk → show the \"install <pkg>\" card (the dominant cause for a\n // published package is a missing optional dep). Don't retry.\n onError(_error, _retry, fail) {\n fail()\n },\n })\n}\n"],"mappings":";;;AAaA,SAAgB,EACd,GACA,GACA,GACW;CACX,IAAM,IAAM,MAAM,QAAQ,CAAI,IAAI,IAAO,CAAC,CAAI;CAC9C,OAAO,EAAqB;EAClB;EACR,gBAAgB,EAAgB;GAC9B,MAAM;GACN,OAAO;IACL,KAAK;KAAE,MAAM;KAAQ,SAAS;IAAG;IACjC,MAAM;KAAE,MAAM;KAAQ,SAAS;IAAG;IAClC,MAAM;KAAE,MAAM;KAAQ,SAAS,KAAA;IAAU;GAC3C;GACA,QAAQ,YACN,EAAE,GAAmB;IACnB;IACA;IACA,aAAa,EAAM;IACnB,cAAc,EAAM;GACtB,CAAC;EACL,CAAC;EAGD,QAAQ,GAAQ,GAAQ,GAAM;GAC5B,EAAK;EACP;CACF,CAAC;AACH"}
@@ -61,3 +61,5 @@ var o = t({
61
61
  });
62
62
  //#endregion
63
63
  export { o as default };
64
+
65
+ //# sourceMappingURL=ClampBlock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClampBlock.js","names":[],"sources":["../../../src/components/ui/ClampBlock.ts"],"sourcesContent":["import { computed, defineComponent, h, onBeforeUnmount, onMounted, ref, type VNode } from 'vue'\n\n/**\n * Clamp tall content to a collapsed height with a Show more / Show less toggle —\n * claude.ai's long-block behavior. When collapsed and overflowing, the bottom\n * fades into `fade` (a soft shadow cue that more lies below). The toggle is a\n * plain-text link hidden until you hover the block (the fade), brightening when\n * you hover the text itself. Content that fits renders untouched: no clip, no\n * fade, no toggle.\n *\n * A render function (not an SFC) on purpose: a compiled `<slot/>` trips the\n * server renderer in the SSR smoke harness (renderSlot → null instance), so we\n * invoke the slot directly. Styling lives in assets/styles/clamp.css.\n */\nexport default defineComponent({\n name: 'ClampBlock',\n props: {\n /** Collapsed height cap, in px. */\n maxHeight: { type: Number, default: 360 },\n /** Color the bottom gradient fades to — match the content's own background. */\n fade: { type: String, default: 'var(--bg)' },\n /** Px of overflow tolerated before the toggle appears (avoids clamping near-fits). */\n slack: { type: Number, default: 28 },\n /** Left inset of the toggle, in px — align it with padded content (e.g. a code block). */\n inset: { type: Number, default: 0 },\n moreLabel: { type: String, default: 'Show more' },\n lessLabel: { type: String, default: 'Show less' },\n },\n setup(props, { slots }) {\n const open = ref(false)\n const overflowing = ref(false)\n const content = ref<HTMLElement | null>(null)\n let ro: ResizeObserver | undefined\n\n const measure = () => {\n const el = content.value\n if (el) overflowing.value = el.scrollHeight > props.maxHeight + props.slack\n }\n\n onMounted(() => {\n measure()\n // Re-measure as fonts/highlighting/images settle or the pane is resized.\n if (typeof ResizeObserver !== 'undefined') {\n ro = new ResizeObserver(measure)\n if (content.value) ro.observe(content.value)\n }\n })\n onBeforeUnmount(() => ro?.disconnect())\n\n const collapsed = computed(() => overflowing.value && !open.value)\n\n return () => {\n const kids: VNode[] = [\n h(\n 'div',\n {\n ref: content,\n class: ['clamp__content', { 'clamp__content--clip': collapsed.value }],\n style: collapsed.value ? { maxHeight: props.maxHeight + 'px' } : undefined,\n },\n slots.default?.(),\n ),\n ]\n\n if (collapsed.value) {\n kids.push(\n h('div', {\n class: 'clamp__fade',\n 'aria-hidden': 'true',\n style: { backgroundImage: `linear-gradient(to bottom, transparent, ${props.fade})` },\n }),\n )\n }\n\n if (overflowing.value) {\n kids.push(\n h(\n 'div',\n {\n class: ['clamp__toggle', { 'clamp__toggle--float': collapsed.value }],\n style: props.inset ? { paddingLeft: props.inset + 'px' } : undefined,\n },\n h(\n 'button',\n {\n type: 'button',\n class: 'clamp__btn',\n 'aria-expanded': open.value,\n onClick: () => (open.value = !open.value),\n },\n open.value ? props.lessLabel : props.moreLabel,\n ),\n ),\n )\n }\n\n return h('div', { class: 'clamp' }, kids)\n }\n },\n})\n"],"mappings":";;AAcA,IAAA,IAAe,EAAgB;CAC7B,MAAM;CACN,OAAO;EAEL,WAAW;GAAE,MAAM;GAAQ,SAAS;EAAI;EAExC,MAAM;GAAE,MAAM;GAAQ,SAAS;EAAY;EAE3C,OAAO;GAAE,MAAM;GAAQ,SAAS;EAAG;EAEnC,OAAO;GAAE,MAAM;GAAQ,SAAS;EAAE;EAClC,WAAW;GAAE,MAAM;GAAQ,SAAS;EAAY;EAChD,WAAW;GAAE,MAAM;GAAQ,SAAS;EAAY;CAClD;CACA,MAAM,GAAO,EAAE,YAAS;EACtB,IAAM,IAAO,EAAI,EAAK,GAChB,IAAc,EAAI,EAAK,GACvB,IAAU,EAAwB,IAAI,GACxC,GAEE,UAAgB;GACpB,IAAM,IAAK,EAAQ;GACnB,AAAI,MAAI,EAAY,QAAQ,EAAG,eAAe,EAAM,YAAY,EAAM;EACxE;EAUA,AARA,QAAgB;GAGd,AAFA,EAAQ,GAEJ,OAAO,iBAAmB,QAC5B,IAAK,IAAI,eAAe,CAAO,GAC3B,EAAQ,SAAO,EAAG,QAAQ,EAAQ,KAAK;EAE/C,CAAC,GACD,QAAsB,GAAI,WAAW,CAAC;EAEtC,IAAM,IAAY,QAAe,EAAY,SAAS,CAAC,EAAK,KAAK;EAEjE,aAAa;GACX,IAAM,IAAgB,CACpB,EACE,OACA;IACE,KAAK;IACL,OAAO,CAAC,kBAAkB,EAAE,wBAAwB,EAAU,MAAM,CAAC;IACrE,OAAO,EAAU,QAAQ,EAAE,WAAW,EAAM,YAAY,KAAK,IAAI,KAAA;GACnE,GACA,EAAM,UAAU,CAClB,CACF;GAkCA,OAhCI,EAAU,SACZ,EAAK,KACH,EAAE,OAAO;IACP,OAAO;IACP,eAAe;IACf,OAAO,EAAE,iBAAiB,2CAA2C,EAAM,KAAK,GAAG;GACrF,CAAC,CACH,GAGE,EAAY,SACd,EAAK,KACH,EACE,OACA;IACE,OAAO,CAAC,iBAAiB,EAAE,wBAAwB,EAAU,MAAM,CAAC;IACpE,OAAO,EAAM,QAAQ,EAAE,aAAa,EAAM,QAAQ,KAAK,IAAI,KAAA;GAC7D,GACA,EACE,UACA;IACE,MAAM;IACN,OAAO;IACP,iBAAiB,EAAK;IACtB,eAAgB,EAAK,QAAQ,CAAC,EAAK;GACrC,GACA,EAAK,QAAQ,EAAM,YAAY,EAAM,SACvC,CACF,CACF,GAGK,EAAE,OAAO,EAAE,OAAO,QAAQ,GAAG,CAAI;EAC1C;CACF;AACF,CAAC"}
@@ -59,3 +59,5 @@ function r(r) {
59
59
  }
60
60
  //#endregion
61
61
  export { r as useElementNavigation };
62
+
63
+ //# sourceMappingURL=useElementNavigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useElementNavigation.js","names":[],"sources":["../../src/composables/useElementNavigation.ts"],"sourcesContent":["import { onBeforeUnmount, shallowRef, watch, type ShallowRef } from 'vue'\n\nexport interface ElementNavigationItem {\n id: string\n title: string\n level: number\n target: HTMLElement\n}\n\n/**\n * Scroll-spy + in-container navigation for DOM-backed document viewers.\n *\n * The rendered document remains the only source of scroll state. Navigation entries retain their target\n * elements, while this composable exposes readonly-by-convention refs and explicit mutation actions.\n */\nexport function useElementNavigation(scrollRoot: Readonly<ShallowRef<HTMLElement | null>>) {\n const outlineItems = shallowRef<ElementNavigationItem[]>([])\n const pageItems = shallowRef<ElementNavigationItem[]>([])\n const activeOutlineId = shallowRef('')\n const activePageId = shallowRef('')\n\n let frame = 0\n let listeningRoot: HTMLElement | null = null\n\n function activeItem(items: readonly ElementNavigationItem[], line: number) {\n if (!items.length) return undefined\n let active = items[0]\n for (const item of items) {\n if (item.target.getBoundingClientRect().top > line) break\n active = item\n }\n return active\n }\n\n function refreshActive(): void {\n frame = 0\n const root = scrollRoot.value\n if (!root) return\n const line = root.getBoundingClientRect().top + 32\n activeOutlineId.value = activeItem(outlineItems.value, line)?.id ?? ''\n activePageId.value = activeItem(pageItems.value, line)?.id ?? ''\n }\n\n function queueRefresh(): void {\n if (frame) return\n if (typeof requestAnimationFrame === 'undefined') {\n refreshActive()\n return\n }\n frame = requestAnimationFrame(refreshActive)\n }\n\n function bindRoot(root: HTMLElement | null): void {\n listeningRoot?.removeEventListener('scroll', queueRefresh)\n listeningRoot = root\n listeningRoot?.addEventListener('scroll', queueRefresh, { passive: true })\n queueRefresh()\n }\n\n const stopRootWatch = watch(scrollRoot, bindRoot, { immediate: true, flush: 'post' })\n\n function setItems(\n outline: readonly ElementNavigationItem[],\n pages: readonly ElementNavigationItem[],\n ): void {\n outlineItems.value = [...outline]\n pageItems.value = [...pages]\n activeOutlineId.value = outline[0]?.id ?? ''\n activePageId.value = pages[0]?.id ?? ''\n queueRefresh()\n }\n\n function navigate(item: ElementNavigationItem): void {\n const root = scrollRoot.value\n if (!root) return\n const rootTop = root.getBoundingClientRect().top\n const targetTop = item.target.getBoundingClientRect().top\n root.scrollTo({ top: root.scrollTop + targetTop - rootTop - 18, behavior: 'smooth' })\n }\n\n onBeforeUnmount(() => {\n stopRootWatch()\n listeningRoot?.removeEventListener('scroll', queueRefresh)\n if (frame && typeof cancelAnimationFrame !== 'undefined') cancelAnimationFrame(frame)\n })\n\n return {\n outlineItems,\n pageItems,\n activeOutlineId,\n activePageId,\n setItems,\n navigate,\n }\n}\n"],"mappings":";;AAeA,SAAgB,EAAqB,GAAsD;CACzF,IAAM,IAAe,EAAoC,CAAC,CAAC,GACrD,IAAY,EAAoC,CAAC,CAAC,GAClD,IAAkB,EAAW,EAAE,GAC/B,IAAe,EAAW,EAAE,GAE9B,IAAQ,GACR,IAAoC;CAExC,SAAS,EAAW,GAAyC,GAAc;EACzE,IAAI,CAAC,EAAM,QAAQ;EACnB,IAAI,IAAS,EAAM;EACnB,KAAK,IAAM,KAAQ,GAAO;GACxB,IAAI,EAAK,OAAO,sBAAsB,CAAC,CAAC,MAAM,GAAM;GACpD,IAAS;EACX;EACA,OAAO;CACT;CAEA,SAAS,IAAsB;EAC7B,IAAQ;EACR,IAAM,IAAO,EAAW;EACxB,IAAI,CAAC,GAAM;EACX,IAAM,IAAO,EAAK,sBAAsB,CAAC,CAAC,MAAM;EAEhD,AADA,EAAgB,QAAQ,EAAW,EAAa,OAAO,CAAI,CAAC,EAAE,MAAM,IACpE,EAAa,QAAQ,EAAW,EAAU,OAAO,CAAI,CAAC,EAAE,MAAM;CAChE;CAEA,SAAS,IAAqB;EACxB,QACJ;OAAI,OAAO,wBAA0B,KAAa;IAChD,EAAc;IACd;GACF;GACA,IAAQ,sBAAsB,CAAa;EAD3C;CAEF;CAEA,SAAS,EAAS,GAAgC;EAIhD,AAHA,GAAe,oBAAoB,UAAU,CAAY,GACzD,IAAgB,GAChB,GAAe,iBAAiB,UAAU,GAAc,EAAE,SAAS,GAAK,CAAC,GACzE,EAAa;CACf;CAEA,IAAM,IAAgB,EAAM,GAAY,GAAU;EAAE,WAAW;EAAM,OAAO;CAAO,CAAC;CAEpF,SAAS,EACP,GACA,GACM;EAKN,AAJA,EAAa,QAAQ,CAAC,GAAG,CAAO,GAChC,EAAU,QAAQ,CAAC,GAAG,CAAK,GAC3B,EAAgB,QAAQ,EAAQ,EAAE,EAAE,MAAM,IAC1C,EAAa,QAAQ,EAAM,EAAE,EAAE,MAAM,IACrC,EAAa;CACf;CAEA,SAAS,EAAS,GAAmC;EACnD,IAAM,IAAO,EAAW;EACxB,IAAI,CAAC,GAAM;EACX,IAAM,IAAU,EAAK,sBAAsB,CAAC,CAAC,KACvC,IAAY,EAAK,OAAO,sBAAsB,CAAC,CAAC;EACtD,EAAK,SAAS;GAAE,KAAK,EAAK,YAAY,IAAY,IAAU;GAAI,UAAU;EAAS,CAAC;CACtF;CAQA,OANA,QAAsB;EAGpB,AAFA,EAAc,GACd,GAAe,oBAAoB,UAAU,CAAY,GACrD,KAAS,OAAO,uBAAyB,OAAa,qBAAqB,CAAK;CACtF,CAAC,GAEM;EACL;EACA;EACA;EACA;EACA;EACA;CACF;AACF"}
@@ -25,3 +25,5 @@ function c() {
25
25
  }
26
26
  //#endregion
27
27
  export { c as useFileViewer };
28
+
29
+ //# sourceMappingURL=useFileViewer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFileViewer.js","names":[],"sources":["../../src/composables/useFileViewer.ts"],"sourcesContent":["import { computed, ref } from 'vue'\n\n/** A file opened in the side viewer: its display name, fetch/download URL, and highlight language. */\nexport interface ViewerFile {\n name: string\n /** Download endpoint URL — fetched as text and reused by the download button. Omit when `content` is set. */\n url?: string\n /** highlight.js language id, '' for plain text, or 'markdown' (the panel renders markdown instead of highlighting). */\n lang: string\n /** HTML document: the panel offers a render/source toggle, rendering the markup in a sandboxed iframe. */\n html?: boolean\n /** SVG document: the panel offers a render/source toggle — render shows the picture, source the XML. */\n svg?: boolean\n /** ZIP archive: the panel fetches the bytes and hands them to the in-browser archive browser. */\n zip?: boolean\n /** 7z archive: the panel fetches the bytes and hands them to the in-browser 7z browser. */\n sevenZip?: boolean\n /**\n * tar-family ('tar': tar/gz/tgz/xz/txz/bz2/tbz2) or rar ('rar') archive: the panel hands the URL + this\n * kind to the generic in-browser ArchiveBrowser, which decompresses the bytes and browses the entries.\n */\n archive?: 'tar' | 'rar'\n /** Native binary object (.so/.dll): the panel hands the URL to the in-browser symbol browser. */\n binobj?: boolean\n /** E-language (.e/.ec) project: the panel hands the URL to the in-browser EPL viewer (parse + decompile). */\n epl?: boolean\n /** DICOM (.dcm) medical image: the panel hands the URL to the in-browser DICOM viewer. */\n dicom?: boolean\n /** Word (.docx) document: the panel hands the URL to the in-browser Word viewer (docx-preview). */\n docx?: boolean\n /** Excel (.xlsx/.xlsm) workbook: the panel hands the URL to the in-browser spreadsheet viewer (exceljs). */\n xlsx?: boolean\n /** PowerPoint (.pptx/.pptm/.ppsx) deck: the panel hands the URL to the in-browser slide viewer (pptx-renderer). */\n pptx?: boolean\n /** Rich Text (.rtf) document: the panel hands the URL to the in-browser rich-text viewer (hand-rolled RTF parser). */\n rtf?: boolean\n /** PDF (.pdf) document: the panel hands the URL to the in-browser PDF viewer (pdfjs-dist). */\n pdf?: boolean\n /** OPML / FreeMind (.opml/.mm) outline: the panel fetches the text and renders it as an interactive mind map. */\n mindmap?: boolean\n /** XMind workbook (.xmind): the panel hands the URL to the in-browser XMind viewer (unzip → mind-map tree). */\n xmind?: boolean\n /** Email (.eml) message: the panel hands the URL to the in-browser email viewer (MIME parser). */\n eml?: boolean\n /** Web archive (.mht/.mhtml): the panel hands the URL to the in-browser web-archive viewer (MIME parser). */\n mht?: boolean\n /** HAR (.har) capture: the panel hands the URL to the in-browser HAR viewer (hand-rolled JSON parser). */\n har?: boolean\n /** SQLite database (.sqlite/.db/…): the panel hands the URL to the in-browser SQLite viewer (sql.js). */\n sqlite?: boolean\n /** Certificate / key (.pem/.crt/.der/.csr/.p12/…): the panel hands the URL to the in-browser cert viewer (ASN.1/X.509). */\n cert?: boolean\n /** Keystore (.jks/.keystore/.jceks + PKCS#12 .p12/.pfx): the panel hands the URL to the in-browser keystore viewer (sniffs format, parse + password decrypt). */\n jks?: boolean\n /** Subtitle (.srt/.vtt/.ass/.ssa): the panel renders the fetched text as a parsed cue list (render/source toggle). */\n subtitle?: boolean\n /** CSV / TSV (.csv/.tsv): the panel renders the fetched text as a parsed table (render/source toggle). */\n csv?: boolean\n /** JSON Lines (.jsonl/.ndjson): the panel renders the fetched text as a record list — truncated rows, click to expand (render/source toggle). */\n jsonl?: boolean\n /** Java bytecode (.class): the panel hands the URL to the in-browser class viewer (parse structure → fields/methods). */\n javaClass?: boolean\n /** JVM heap dump (.hprof): the panel hands the URL to the in-browser HPROF viewer (stream-parse → class histogram + per-class object drill-in). */\n hprof?: boolean\n /** Windows Installer (.msi/.msp/.msm): the panel hands the URL to the in-browser MSI viewer (OLE compound file → product identity + summary). */\n msi?: boolean\n /** Windows app package (.appx/.msix/.appxbundle/.msixbundle): the panel hands the URL to the in-browser APPX viewer (unzip manifest → identity/deps/capabilities). */\n appx?: boolean\n /** Font (.ttf/.otf/.woff/.woff2): the panel hands the URL to the in-browser font specimen (FontFace API). */\n font?: boolean\n /** Jupyter Notebook (.ipynb): the panel hands the URL to the in-browser notebook viewer (hand-rolled JSON parser). */\n ipynb?: boolean\n /** Geodata (.geojson/.kml/.gpx): the panel renders the fetched text as an offline SVG map (render/source toggle). */\n geo?: boolean\n /** Audio (mp3/wav/flac/ogg/m4a/aac/opus, or .mid): the panel hands the URL to the in-browser audio player. */\n audio?: boolean\n /** QQ Music encrypted audio (.mflac/.mgg/…): the panel hands the URL to the QMC player (decrypts in-browser, then plays). */\n qmc?: boolean\n /** LRC lyrics (.lrc): the panel hands the URL to the lyrics viewer (self-fetches + sniffs GBK, then renders synced lines). */\n lrc?: boolean\n /** Large text / `.log`: the panel hands the URL to the in-browser streaming log viewer (virtual-scrolled). */\n log?: boolean\n /** 3D model (.stl/.obj/.ply/.glb/.gltf): the panel hands the URL to the in-browser three.js model viewer. */\n model?: boolean\n /** Decoding image (TIFF/PSD/HEIC/RAW): the panel hands the URL + kind to the in-browser raster viewer. */\n raster?: 'tiff' | 'psd' | 'heic' | 'raw'\n /** E-book (EPUB/FB2/MOBI/DjVu): the panel hands the URL + kind to the in-browser e-book reader. */\n ebook?: 'epub' | 'fb2' | 'mobi' | 'djvu'\n /** Diagram (.drawio/.excalidraw): the panel renders the fetched text as an SVG (render/source toggle). */\n diagram?: 'drawio' | 'excalidraw'\n /** DXF (.dxf) CAD drawing: the panel hands the URL to the in-browser DXF viewer (parse → SVG, pan/zoom/layers). */\n dxf?: boolean\n /**\n * Raster image (png/jpg/…/svg-as-picture): rendered inline as a zoomable picture. The main FileChip flow\n * routes images to the LIGHTBOX, so this is set only for archive entries (browsed inside the side viewer,\n * where there is no lightbox) — see classifyViewerFile.\n */\n image?: boolean\n /** Video (mp4/webm/…): rendered inline with a native <video> player. Like {@link image}, set only for archive entries. */\n video?: boolean\n /** Unpreviewable binary: the body shows a \"can't preview — download\" card. Set only for archive entries with no matching viewer. */\n binary?: boolean\n /**\n * Hex dump: the panel hands the URL to the in-browser hex viewer (offset + raw bytes + ASCII gutter). Never\n * auto-detected — set only when the user picks \"十六进制\" from the unpreviewable-binary card's \"open with\"\n * chooser (any bytes can be inspected this way), see FileViewerBody.\n */\n hex?: boolean\n /** File size in bytes (from the manifest) when known — drives the symbol browser's large-file gate. */\n size?: number\n /** Inline text to render directly (e.g. a loaded skill's SKILL.md) — when set, the panel skips fetching. */\n content?: string\n}\n\n// Module-level singleton: a file chip (deep in the message tree) opens the viewer, and the panel\n// (mounted by DetailView) reads the same ref. The detail view closes it on navigation/unmount.\nconst current = ref<ViewerFile | null>(null)\n\n// Shared panel width (px), driven by the drag splitter. DetailView feeds it into `--fv-width` so the\n// conversation column reflows and the panel resizes together; the panel reads it for the drag baseline.\nconst MIN_WIDTH = 360\nconst MAX_WIDTH = 760\n\n// Open at the viewer's original responsive width — clamp(360, 42vw, 760) — so it starts wide; the\n// drag splitter adjusts from there. (No window under SSR: fall back to a sensible fixed default.)\nfunction defaultWidth(): number {\n if (typeof window === 'undefined') return 680\n return Math.min(MAX_WIDTH, Math.max(MIN_WIDTH, Math.round(window.innerWidth * 0.42)))\n}\nconst width = ref(defaultWidth())\n\n/** Clamp to a sane range: never narrower than MIN_WIDTH, and always leave ~320px for the conversation. */\nfunction setWidth(px: number): void {\n const max = typeof window !== 'undefined' ? Math.max(MIN_WIDTH, window.innerWidth - 320) : 900\n width.value = Math.min(max, Math.max(MIN_WIDTH, Math.round(px)))\n}\n\nexport function useFileViewer() {\n return {\n current,\n width,\n setWidth,\n isOpen: computed(() => current.value !== null),\n open(file: ViewerFile): void {\n current.value = file\n },\n close(): void {\n current.value = null\n },\n }\n}\n"],"mappings":";;AAoHA,IAAM,IAAU,EAAuB,IAAI,GAIrC,IAAY,KACZ,IAAY;AAIlB,SAAS,IAAuB;CAE9B,OADI,OAAO,SAAW,MAAoB,MACnC,KAAK,IAAI,GAAW,KAAK,IAAI,GAAW,KAAK,MAAM,OAAO,aAAa,GAAI,CAAC,CAAC;AACtF;AACA,IAAM,IAAQ,EAAI,EAAa,CAAC;AAGhC,SAAS,EAAS,GAAkB;CAClC,IAAM,IAAM,OAAO,SAAW,MAAc,KAAK,IAAI,GAAW,OAAO,aAAa,GAAG,IAAI;CAC3F,EAAM,QAAQ,KAAK,IAAI,GAAK,KAAK,IAAI,GAAW,KAAK,MAAM,CAAE,CAAC,CAAC;AACjE;AAEA,SAAgB,IAAgB;CAC9B,OAAO;EACL;EACA;EACA;EACA,QAAQ,QAAe,EAAQ,UAAU,IAAI;EAC7C,KAAK,GAAwB;GAC3B,EAAQ,QAAQ;EAClB;EACA,QAAc;GACZ,EAAQ,QAAQ;EAClB;CACF;AACF"}
@@ -15,3 +15,5 @@ function r() {
15
15
  }
16
16
  //#endregion
17
17
  export { r as useLightbox };
18
+
19
+ //# sourceMappingURL=useLightbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLightbox.js","names":[],"sources":["../../src/composables/useLightbox.ts"],"sourcesContent":["import { computed, ref } from 'vue'\n\n/** Media shown full-screen in the lightbox: its source URL, an alt/title, and the kind to render. */\nexport interface LightboxImage {\n src: string\n alt?: string\n /** 'video' fetches the source and plays it in a <video> (blob-backed); default 'image' shows an <img>. */\n kind?: 'image' | 'video'\n /** A \"long image\" (tall screenshot): show it at a readable width inside a vertical-scroll frame, not letterboxed. */\n long?: boolean\n}\n\n// Module-level singleton: a thumbnail anywhere in the message tree opens the lightbox, and the single\n// ImageLightbox overlay (mounted in App.vue) reads the same ref. Mirrors useFileViewer's pattern.\nconst current = ref<LightboxImage | null>(null)\n\nexport function useLightbox() {\n return {\n current,\n isOpen: computed(() => current.value !== null),\n open(img: LightboxImage): void {\n if (img.src) current.value = img\n },\n close(): void {\n current.value = null\n },\n }\n}\n"],"mappings":";;AAcA,IAAM,IAAU,EAA0B,IAAI;AAE9C,SAAgB,IAAc;CAC5B,OAAO;EACL;EACA,QAAQ,QAAe,EAAQ,UAAU,IAAI;EAC7C,KAAK,GAA0B;GAC7B,AAAI,EAAI,QAAK,EAAQ,QAAQ;EAC/B;EACA,QAAc;GACZ,EAAQ,QAAQ;EAClB;CACF;AACF"}
@@ -72,3 +72,5 @@ function c() {
72
72
  }
73
73
  //#endregion
74
74
  export { c as useLogRules };
75
+
76
+ //# sourceMappingURL=useLogRules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLogRules.js","names":[],"sources":["../../src/composables/useLogRules.ts"],"sourcesContent":["import { ref, watch } from 'vue'\n\n/**\n * A single line-coloring rule for the log viewer: match lines by substring or regex, then paint their\n * background and/or text. Rules apply top-to-bottom, first match wins (see LogViewer's `styleFor`).\n */\nexport interface ColorRule {\n id: string\n pattern: string\n regex: boolean // treat `pattern` as a RegExp instead of a plain substring\n caseSensitive: boolean\n bgOn: boolean\n bg: string // hex background color, applied when bgOn\n fgOn: boolean\n fg: string // hex text color, applied when fgOn\n enabled: boolean\n}\n\nconst STORAGE_KEY = 'viewer-log-color-rules'\n\nfunction newId(): string {\n try {\n return crypto.randomUUID()\n } catch {\n // Non-secure contexts / very old engines lack randomUUID — a timestamp-ish id is unique enough for a\n // local, per-browser preference list.\n return 'r' + Date.now().toString(36) + Math.floor(Math.random() * 1e9).toString(36)\n }\n}\n\nexport function defaultRule(): ColorRule {\n return {\n id: newId(),\n pattern: '',\n regex: false,\n caseSensitive: false,\n bgOn: true,\n bg: '#fde68a',\n fgOn: false,\n fg: '#111827',\n enabled: true,\n }\n}\n\n// Tolerate absent / partial / garbled persisted entries by filling each field from a default.\nfunction sanitize(x: unknown): ColorRule | null {\n if (!x || typeof x !== 'object') return null\n const o = x as Record<string, unknown>\n const d = defaultRule()\n return {\n id: typeof o.id === 'string' ? o.id : d.id,\n pattern: typeof o.pattern === 'string' ? o.pattern : '',\n regex: !!o.regex,\n caseSensitive: !!o.caseSensitive,\n bgOn: o.bgOn !== false,\n bg: typeof o.bg === 'string' ? o.bg : d.bg,\n fgOn: !!o.fgOn,\n fg: typeof o.fg === 'string' ? o.fg : d.fg,\n enabled: o.enabled !== false,\n }\n}\n\nfunction readInitial(): ColorRule[] {\n if (typeof localStorage !== 'undefined') {\n try {\n const raw = localStorage.getItem(STORAGE_KEY)\n if (raw) {\n const arr = JSON.parse(raw)\n if (Array.isArray(arr)) {\n return arr.map(sanitize).filter((r): r is ColorRule => r !== null)\n }\n }\n } catch {\n // Malformed JSON — ignore and start empty.\n }\n }\n return []\n}\n\n// Module-level singleton so rules persist across files, viewer re-mounts, and reloads.\nconst rules = ref<ColorRule[]>(readInitial())\nwatch(\n rules,\n (v) => {\n if (typeof localStorage !== 'undefined') {\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(v))\n } catch {\n // Storage full / disabled — the rules still work for this session.\n }\n }\n },\n { deep: true },\n)\n\n/**\n * Persisted, browser-global line-coloring rules for the log viewer. A singleton (like {@link useListPrefs})\n * so the set sticks across navigation and reloads; every mutation reassigns/deep-touches `rules` so the\n * watcher writes through to localStorage.\n */\nexport function useLogRules() {\n function add(): void {\n rules.value = [...rules.value, defaultRule()]\n }\n function remove(id: string): void {\n rules.value = rules.value.filter((r) => r.id !== id)\n }\n // Reorder (first-match precedence): swap a rule with its neighbor.\n function move(id: string, dir: -1 | 1): void {\n const arr = [...rules.value]\n const i = arr.findIndex((r) => r.id === id)\n const j = i + dir\n if (i < 0 || j < 0 || j >= arr.length) return\n ;[arr[i], arr[j]] = [arr[j], arr[i]]\n rules.value = arr\n }\n return { rules, add, remove, move }\n}\n"],"mappings":";;AAkBA,IAAM,IAAc;AAEpB,SAAS,IAAgB;CACvB,IAAI;EACF,OAAO,OAAO,WAAW;CAC3B,QAAQ;EAGN,OAAO,MAAM,KAAK,IAAI,CAAC,CAAC,SAAS,EAAE,IAAI,KAAK,MAAM,KAAK,OAAO,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE;CACpF;AACF;AAEA,SAAgB,IAAyB;CACvC,OAAO;EACL,IAAI,EAAM;EACV,SAAS;EACT,OAAO;EACP,eAAe;EACf,MAAM;EACN,IAAI;EACJ,MAAM;EACN,IAAI;EACJ,SAAS;CACX;AACF;AAGA,SAAS,EAAS,GAA8B;CAC9C,IAAI,CAAC,KAAK,OAAO,KAAM,UAAU,OAAO;CACxC,IAAM,IAAI,GACJ,IAAI,EAAY;CACtB,OAAO;EACL,IAAI,OAAO,EAAE,MAAO,WAAW,EAAE,KAAK,EAAE;EACxC,SAAS,OAAO,EAAE,WAAY,WAAW,EAAE,UAAU;EACrD,OAAO,CAAC,CAAC,EAAE;EACX,eAAe,CAAC,CAAC,EAAE;EACnB,MAAM,EAAE,SAAS;EACjB,IAAI,OAAO,EAAE,MAAO,WAAW,EAAE,KAAK,EAAE;EACxC,MAAM,CAAC,CAAC,EAAE;EACV,IAAI,OAAO,EAAE,MAAO,WAAW,EAAE,KAAK,EAAE;EACxC,SAAS,EAAE,YAAY;CACzB;AACF;AAEA,SAAS,IAA2B;CAClC,IAAI,OAAO,eAAiB,KAC1B,IAAI;EACF,IAAM,IAAM,aAAa,QAAQ,CAAW;EAC5C,IAAI,GAAK;GACP,IAAM,IAAM,KAAK,MAAM,CAAG;GAC1B,IAAI,MAAM,QAAQ,CAAG,GACnB,OAAO,EAAI,IAAI,CAAQ,CAAC,CAAC,QAAQ,MAAsB,MAAM,IAAI;EAErE;CACF,QAAQ,CAER;CAEF,OAAO,CAAC;AACV;AAGA,IAAM,IAAQ,EAAiB,EAAY,CAAC;AAC5C,EACE,IACC,MAAM;CACL,IAAI,OAAO,eAAiB,KAC1B,IAAI;EACF,aAAa,QAAQ,GAAa,KAAK,UAAU,CAAC,CAAC;CACrD,QAAQ,CAER;AAEJ,GACA,EAAE,MAAM,GAAK,CACf;AAOA,SAAgB,IAAc;CAC5B,SAAS,IAAY;EACnB,EAAM,QAAQ,CAAC,GAAG,EAAM,OAAO,EAAY,CAAC;CAC9C;CACA,SAAS,EAAO,GAAkB;EAChC,EAAM,QAAQ,EAAM,MAAM,QAAQ,MAAM,EAAE,OAAO,CAAE;CACrD;CAEA,SAAS,EAAK,GAAY,GAAmB;EAC3C,IAAM,IAAM,CAAC,GAAG,EAAM,KAAK,GACrB,IAAI,EAAI,WAAW,MAAM,EAAE,OAAO,CAAE,GACpC,IAAI,IAAI;EACV,IAAI,KAAK,IAAI,KAAK,KAAK,EAAI,WAC9B,CAAC,EAAI,IAAI,EAAI,MAAM,CAAC,EAAI,IAAI,EAAI,EAAE,GACnC,EAAM,QAAQ;CAChB;CACA,OAAO;EAAE;EAAO;EAAK;EAAQ;CAAK;AACpC"}
package/dist/lib/aes.js CHANGED
@@ -97,3 +97,5 @@ function u(e, t, n) {
97
97
  }
98
98
  //#endregion
99
99
  export { u as aesCbcDecrypt, l as aesCtrXor };
100
+
101
+ //# sourceMappingURL=aes.js.map