flea-qml 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (637) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +511 -2
  3. package/THIRD-PARTY-NOTICES.md +29 -0
  4. package/demos/App.java +5 -0
  5. package/demos/Dockerfile +4 -0
  6. package/demos/Main.kt +3 -0
  7. package/demos/Program.cs +1 -0
  8. package/demos/README.md +12 -0
  9. package/demos/app.dart +3 -0
  10. package/demos/app.deb +0 -0
  11. package/demos/app.js +1 -0
  12. package/demos/backup.tar +0 -0
  13. package/demos/budget.xlsx +0 -0
  14. package/demos/build.sh +2 -0
  15. package/demos/bundle.zip +0 -0
  16. package/demos/clip.mp4 +0 -0
  17. package/demos/data.sqlite +0 -0
  18. package/demos/disk.iso +0 -0
  19. package/demos/engine.cpp +5 -0
  20. package/demos/firmware.bin +0 -0
  21. package/demos/flake.nix +4 -0
  22. package/demos/folder/inside.txt +1 -0
  23. package/demos/font.ttf +0 -0
  24. package/demos/index.html +5 -0
  25. package/demos/index.php +2 -0
  26. package/demos/init.lua +1 -0
  27. package/demos/letter.docx +0 -0
  28. package/demos/lib.rs +3 -0
  29. package/demos/main.c +6 -0
  30. package/demos/main.h +3 -0
  31. package/demos/math-and-diagrams.md +200 -0
  32. package/demos/notes.tar.gz +0 -0
  33. package/demos/notes.txt +3 -0
  34. package/demos/photo.png +0 -0
  35. package/demos/program +2 -0
  36. package/demos/report.pdf +32 -0
  37. package/demos/script.py +1 -0
  38. package/demos/server.go +7 -0
  39. package/demos/settings.json +4 -0
  40. package/demos/slides.pptx +0 -0
  41. package/demos/song.mp3 +0 -0
  42. package/demos/style.css +4 -0
  43. package/demos/tool.rb +1 -0
  44. package/demos/types.ts +2 -0
  45. package/docs/pele.md +23 -0
  46. package/docs/protocol.md +3420 -0
  47. package/docs/temml.md +63 -0
  48. package/index.js +107 -0
  49. package/package.json +34 -4
  50. package/src/archive.js +407 -0
  51. package/src/archiveops.js +728 -0
  52. package/src/backend.js +369 -0
  53. package/src/bulkrename.js +95 -0
  54. package/src/clip-host.js +76 -0
  55. package/src/clip.js +462 -0
  56. package/src/code.js +168 -0
  57. package/src/compare.js +74 -0
  58. package/src/create.js +128 -0
  59. package/src/dirsize.js +147 -0
  60. package/src/figure-svg.js +530 -0
  61. package/src/figure-thread.js +23 -0
  62. package/src/figure.js +132 -0
  63. package/src/find.js +55 -0
  64. package/src/flea.js +39 -0
  65. package/src/fsinfo.js +39 -0
  66. package/src/highlight.js +141 -0
  67. package/src/html.js +52 -0
  68. package/src/kinds.js +89 -0
  69. package/src/listing.js +130 -0
  70. package/src/markdown-html.js +317 -0
  71. package/src/mathml.js +186 -0
  72. package/src/menu.js +180 -0
  73. package/src/meta.js +135 -0
  74. package/src/office.js +810 -0
  75. package/src/order.js +100 -0
  76. package/src/peek.js +49 -0
  77. package/src/pele-wrapper.js +695 -0
  78. package/src/permissions.js +180 -0
  79. package/src/places.js +313 -0
  80. package/src/preview-language.js +10 -0
  81. package/src/terminal-server.js +95 -0
  82. package/src/terminal-shell.js +26 -0
  83. package/src/transfer.js +669 -0
  84. package/src/trash-record.js +41 -0
  85. package/src/trash.js +210 -0
  86. package/src/trashbrowse.js +327 -0
  87. package/src/uistate.js +393 -0
  88. package/src/uistore.js +168 -0
  89. package/src/vendor/LICENSES/Apache-2.0.txt +202 -0
  90. package/src/vendor/LICENSES/MIT-katex-2015.txt +27 -0
  91. package/src/vendor/LICENSES/MIT-katex.txt +21 -0
  92. package/src/vendor/LICENSES/MIT-mermaid.txt +21 -0
  93. package/src/vendor/LICENSES/MIT-pele.txt +40 -0
  94. package/src/vendor/LICENSES/MIT-perseus.txt +18 -0
  95. package/src/vendor/LICENSES/MIT-temml.txt +21 -0
  96. package/src/vendor/pele.js +145 -0
  97. package/src/vendor/temml.mjs +14708 -0
  98. package/src/watch.js +98 -0
  99. package/src/wayland/client.js +109 -0
  100. package/src/wayland/protocol.js +55 -0
  101. package/src/wayland/protocols/ext-data-control-v1.xml +276 -0
  102. package/src/wayland/protocols/wayland.xml +3248 -0
  103. package/src/wayland/protocols/wlr-data-control-unstable-v1.xml +278 -0
  104. package/src/wayland/resource-io.js +6 -0
  105. package/src/wayland/socket-discovery.js +26 -0
  106. package/src/wayland/transport-posix.js +120 -0
  107. package/src/wayland/transport-win32.js +11 -0
  108. package/src/wayland/transport.js +3 -0
  109. package/src/wayland/win32-resources.js +80 -0
  110. package/src/wayland/win32-wire.js +62 -0
  111. package/test/archive.test.js +80 -0
  112. package/test/bench-markdown-scroll.mjs +190 -0
  113. package/test/clip-host.test.js +113 -0
  114. package/test/code-preview.test.js +35 -0
  115. package/test/compare-ui-paths.test.js +24 -0
  116. package/test/compare.test.js +54 -0
  117. package/test/delete-trash.test.js +67 -0
  118. package/test/dirsize.test.js +138 -0
  119. package/test/file-ops.test.js +307 -0
  120. package/test/file-url.test.js +24 -0
  121. package/test/find-contents.test.js +161 -0
  122. package/test/find-input.test.js +66 -0
  123. package/test/fixtures/pele-parity.json +1006 -0
  124. package/test/highlight-launcher.test.js +35 -0
  125. package/test/html-preview.test.js +22 -0
  126. package/test/input.test.js +15 -0
  127. package/test/keymap.test.js +26 -0
  128. package/test/language-icons.test.js +36 -0
  129. package/test/launcher.test.js +51 -0
  130. package/test/manual-archive-here-ui.mjs +47 -0
  131. package/test/manual-code-scroll.mjs +28 -0
  132. package/test/manual-column-scroll.mjs +24 -0
  133. package/test/manual-compare-ui.mjs +20 -0
  134. package/test/manual-find-status.mjs +37 -0
  135. package/test/manual-folder-focus.mjs +63 -0
  136. package/test/manual-html-security.mjs +23 -0
  137. package/test/manual-html-ui.mjs +30 -0
  138. package/test/manual-syntax-preview.mjs +26 -0
  139. package/test/manual-terminal-lifecycle.mjs +42 -0
  140. package/test/manual-terminal-navigation.mjs +48 -0
  141. package/test/manual-terminal-ui.mjs +47 -0
  142. package/test/manual-trash-ui.mjs +86 -0
  143. package/test/markdown-diagrams.test.js +93 -0
  144. package/test/markdown-html.test.js +105 -0
  145. package/test/mathml.test.js +92 -0
  146. package/test/menu-transfer.test.js +57 -0
  147. package/test/office-preview.test.js +154 -0
  148. package/test/pele-parity.test.js +28 -0
  149. package/test/places.test.js +134 -0
  150. package/test/preview-keys.test.js +60 -0
  151. package/test/preview-language.test.js +22 -0
  152. package/test/status-filename.test.js +20 -0
  153. package/test/transfer-replace-merge.test.js +187 -0
  154. package/test/trash-address.test.js +23 -0
  155. package/test/trash-view.test.js +37 -0
  156. package/test/trashbrowse.test.js +135 -0
  157. package/ui/AboutFacts.qml +78 -0
  158. package/ui/ArchiveCards.qml +95 -0
  159. package/ui/ArchiveCompressDialog.qml +378 -0
  160. package/ui/ArchiveHereConfirm.qml +127 -0
  161. package/ui/ArchivePasswordDialog.qml +257 -0
  162. package/ui/Backend.qml +775 -0
  163. package/ui/BulkOldNames.qml +47 -0
  164. package/ui/BulkRenameDialog.qml +380 -0
  165. package/ui/CardFrame.qml +67 -0
  166. package/ui/CardScroll.qml +79 -0
  167. package/ui/CheckBox.qml +73 -0
  168. package/ui/ChromeBar.qml +360 -0
  169. package/ui/ChromeButton.qml +131 -0
  170. package/ui/ChromeModes.qml +43 -0
  171. package/ui/CodeLines.qml +256 -0
  172. package/ui/CodeRefusal.qml +52 -0
  173. package/ui/CollideConfirm.qml +147 -0
  174. package/ui/CollideHost.qml +167 -0
  175. package/ui/ColumnPane.qml +525 -0
  176. package/ui/ColumnRow.qml +380 -0
  177. package/ui/ColumnsArea.qml +594 -0
  178. package/ui/ColumnsLanding.qml +147 -0
  179. package/ui/CompareView.qml +321 -0
  180. package/ui/ContextMenu.qml +743 -0
  181. package/ui/ConvertDialog.qml +456 -0
  182. package/ui/CountedWorker.qml +7 -0
  183. package/ui/Crumb.qml +64 -0
  184. package/ui/CrumbDrop.qml +25 -0
  185. package/ui/CsvTable.qml +394 -0
  186. package/ui/CursorMark.qml +41 -0
  187. package/ui/DefaultClaim.qml +130 -0
  188. package/ui/DeviceLock.qml +47 -0
  189. package/ui/DeviceMounts.qml +540 -0
  190. package/ui/DialogButton.qml +150 -0
  191. package/ui/DialogField.qml +147 -0
  192. package/ui/DialogHeader.qml +31 -0
  193. package/ui/DialogScrim.qml +20 -0
  194. package/ui/DialogTitle.qml +37 -0
  195. package/ui/Divider.qml +9 -0
  196. package/ui/DropInto.qml +126 -0
  197. package/ui/DropTarget.qml +35 -0
  198. package/ui/DropboxMark.qml +60 -0
  199. package/ui/EmptyState.qml +150 -0
  200. package/ui/EscapeHint.qml +11 -0
  201. package/ui/FactsTable.qml +54 -0
  202. package/ui/FastScrollHandler.qml +476 -0
  203. package/ui/FatNamesConfirm.qml +157 -0
  204. package/ui/Favourites.qml +143 -0
  205. package/ui/FigureService.qml +120 -0
  206. package/ui/FileDrag.qml +267 -0
  207. package/ui/FilterStrip.qml +133 -0
  208. package/ui/FitMetrics.qml +22 -0
  209. package/ui/FlashDriveRows.qml +137 -0
  210. package/ui/FlashHost.qml +72 -0
  211. package/ui/FlashImageRow.qml +104 -0
  212. package/ui/FlashRunner.qml +119 -0
  213. package/ui/FlashStepRow.qml +172 -0
  214. package/ui/FlashStrip.qml +38 -0
  215. package/ui/FlashView.qml +397 -0
  216. package/ui/FleaMark.qml +88 -0
  217. package/ui/FlyoutFade.qml +23 -0
  218. package/ui/FontPane.qml +170 -0
  219. package/ui/Glass.qml +114 -0
  220. package/ui/GlassTagger.qml +59 -0
  221. package/ui/Glyph.qml +64 -0
  222. package/ui/GlyphSolid.qml +22 -0
  223. package/ui/GridArea.qml +664 -0
  224. package/ui/GridTile.qml +325 -0
  225. package/ui/GvfsBridge.qml +164 -0
  226. package/ui/Header.qml +433 -0
  227. package/ui/HoverTimers.qml +39 -0
  228. package/ui/HtmlClip.qml +30 -0
  229. package/ui/HtmlPane.qml +63 -0
  230. package/ui/HyprlandMark.qml +45 -0
  231. package/ui/Ipc.qml +1005 -0
  232. package/ui/IpcControls.qml +7 -0
  233. package/ui/IpcMenuState.qml +48 -0
  234. package/ui/IpcPreviewState.qml +185 -0
  235. package/ui/JumpPath.qml +51 -0
  236. package/ui/KeymapSheet.qml +561 -0
  237. package/ui/KeymapSheetResult.qml +89 -0
  238. package/ui/KindStack.qml +40 -0
  239. package/ui/LangMark.qml +51 -0
  240. package/ui/LangMarkLoader.qml +26 -0
  241. package/ui/List.qml +480 -0
  242. package/ui/LoadingState.qml +54 -0
  243. package/ui/LocalSend.qml +56 -0
  244. package/ui/LocalSendMark.qml +73 -0
  245. package/ui/MarkdownBlockView.qml +311 -0
  246. package/ui/MarkdownBlocks.qml +35 -0
  247. package/ui/MarkdownFigure.qml +254 -0
  248. package/ui/MarkdownImages.qml +72 -0
  249. package/ui/MarkdownList.qml +81 -0
  250. package/ui/MarkdownMathsText.qml +97 -0
  251. package/ui/MarkdownPane.qml +83 -0
  252. package/ui/MarkdownPictures.qml +41 -0
  253. package/ui/MarkdownQuote.qml +52 -0
  254. package/ui/MarkdownRemote.qml +82 -0
  255. package/ui/MarkdownSource.qml +155 -0
  256. package/ui/MarkdownTable.qml +222 -0
  257. package/ui/MarkdownTableScroll.qml +64 -0
  258. package/ui/MarkdownTableWheel.qml +126 -0
  259. package/ui/MarkdownText.qml +87 -0
  260. package/ui/MarkdownWorker.js +132 -0
  261. package/ui/MatchText.qml +99 -0
  262. package/ui/MediaSession.qml +38 -0
  263. package/ui/MediaSound.qml +26 -0
  264. package/ui/MediaStrip.qml +191 -0
  265. package/ui/MediaTrack.qml +36 -0
  266. package/ui/MediaVolume.qml +54 -0
  267. package/ui/MenuActionDialog.qml +396 -0
  268. package/ui/MenuEdgeFade.qml +24 -0
  269. package/ui/MenuHost.qml +227 -0
  270. package/ui/MenuRow.qml +351 -0
  271. package/ui/MountListing.qml +100 -0
  272. package/ui/NetworkDialog.qml +435 -0
  273. package/ui/NetworkForm.qml +426 -0
  274. package/ui/NetworkMounts.qml +913 -0
  275. package/ui/NetworkPlaces.qml +127 -0
  276. package/ui/OpenWithDialog.qml +613 -0
  277. package/ui/Opener.qml +95 -0
  278. package/ui/Pane.qml +1320 -0
  279. package/ui/PaneMenuActions.qml +527 -0
  280. package/ui/PanePath.qml +90 -0
  281. package/ui/PaneRail.qml +268 -0
  282. package/ui/PaneStates.qml +88 -0
  283. package/ui/PaneSwap.qml +339 -0
  284. package/ui/PaneWire.qml +601 -0
  285. package/ui/ParkedWait.qml +9 -0
  286. package/ui/PathEntry.qml +186 -0
  287. package/ui/PathJump.qml +400 -0
  288. package/ui/PdfViewer.qml +297 -0
  289. package/ui/PermissionsDialog.qml +658 -0
  290. package/ui/PermissionsHeadings.qml +31 -0
  291. package/ui/PhoneMounts.qml +67 -0
  292. package/ui/PickerAnswers.qml +75 -0
  293. package/ui/PickerBox.qml +26 -0
  294. package/ui/PickerChrome.qml +295 -0
  295. package/ui/PickerFilter.qml +97 -0
  296. package/ui/PickerGrid.qml +308 -0
  297. package/ui/PickerHeader.qml +28 -0
  298. package/ui/PickerLifecycle.qml +27 -0
  299. package/ui/PickerList.qml +218 -0
  300. package/ui/PickerListing.qml +149 -0
  301. package/ui/PickerPathBar.qml +127 -0
  302. package/ui/PickerPlaces.qml +189 -0
  303. package/ui/PickerRecent.qml +92 -0
  304. package/ui/PickerSave.qml +101 -0
  305. package/ui/PickerSelection.qml +155 -0
  306. package/ui/PickerWindow.qml +846 -0
  307. package/ui/PowerSectorsReader.qml +10 -0
  308. package/ui/PrebuildDriver.qml +146 -0
  309. package/ui/Preview.qml +1005 -0
  310. package/ui/PreviewAnimation.qml +24 -0
  311. package/ui/PreviewArchive.qml +91 -0
  312. package/ui/PreviewColumn.qml +553 -0
  313. package/ui/PreviewEdge.qml +63 -0
  314. package/ui/PreviewFacts.qml +30 -0
  315. package/ui/PreviewFactsLine.qml +34 -0
  316. package/ui/PreviewHtml.qml +233 -0
  317. package/ui/PreviewImage.qml +253 -0
  318. package/ui/PreviewImagePan.qml +13 -0
  319. package/ui/PreviewImageSharp.qml +32 -0
  320. package/ui/PreviewLines.qml +106 -0
  321. package/ui/PreviewMarkdown.qml +706 -0
  322. package/ui/PreviewMedia.qml +250 -0
  323. package/ui/PreviewPdf.qml +482 -0
  324. package/ui/PreviewScroll.qml +201 -0
  325. package/ui/PreviewSwap.qml +335 -0
  326. package/ui/PreviewText.qml +149 -0
  327. package/ui/ProtocolChip.qml +18 -0
  328. package/ui/QuickLookArchive.qml +41 -0
  329. package/ui/QuickLookBar.qml +103 -0
  330. package/ui/QuickLookPrepare.qml +355 -0
  331. package/ui/QuickLookSwap.qml +10 -0
  332. package/ui/QuickLookWarm.qml +65 -0
  333. package/ui/RailDrop.qml +155 -0
  334. package/ui/RailHeading.qml +19 -0
  335. package/ui/RailPlaces.qml +38 -0
  336. package/ui/RailTrashRow.qml +67 -0
  337. package/ui/RenameField.qml +353 -0
  338. package/ui/RendererRetry.qml +11 -0
  339. package/ui/ResizeHandle.qml +52 -0
  340. package/ui/Reveal.qml +54 -0
  341. package/ui/Row.qml +476 -0
  342. package/ui/RowDrag.qml +213 -0
  343. package/ui/RowDropTarget.qml +27 -0
  344. package/ui/RunCard.qml +286 -0
  345. package/ui/Scripts.qml +65 -0
  346. package/ui/SearchStrip.qml +232 -0
  347. package/ui/SelectionBand.qml +140 -0
  348. package/ui/SelectionPreview.qml +370 -0
  349. package/ui/SettingsFavourite.qml +122 -0
  350. package/ui/SettingsGroup.qml +96 -0
  351. package/ui/SettingsHint.qml +12 -0
  352. package/ui/SettingsMetrics.qml +29 -0
  353. package/ui/SettingsPane.qml +178 -0
  354. package/ui/SettingsPanel.qml +547 -0
  355. package/ui/SettingsRail.qml +128 -0
  356. package/ui/SettingsRow.qml +409 -0
  357. package/ui/SettingsRuler.qml +85 -0
  358. package/ui/SettingsSegment.qml +85 -0
  359. package/ui/ShareBrowser.qml +113 -0
  360. package/ui/ShareLink.qml +67 -0
  361. package/ui/ShelfPins.qml +101 -0
  362. package/ui/Sidebar.qml +728 -0
  363. package/ui/SidebarRow.qml +358 -0
  364. package/ui/Spinner.qml +60 -0
  365. package/ui/StableModel.qml +89 -0
  366. package/ui/StateMessage.qml +84 -0
  367. package/ui/StatusBar.qml +512 -0
  368. package/ui/StatusFileName.qml +27 -0
  369. package/ui/TabBar.qml +673 -0
  370. package/ui/TabDragGeometry.qml +60 -0
  371. package/ui/TagMenuMark.qml +52 -0
  372. package/ui/TagRailSection.qml +53 -0
  373. package/ui/TagSlot.qml +40 -0
  374. package/ui/TagState.qml +150 -0
  375. package/ui/TagSwatch.qml +28 -0
  376. package/ui/Taildrop.qml +86 -0
  377. package/ui/TailscaleMark.qml +50 -0
  378. package/ui/TerminalService.qml +69 -0
  379. package/ui/TerminalTab.qml +48 -0
  380. package/ui/TerminalTabs.qml +27 -0
  381. package/ui/Theme.qml +460 -0
  382. package/ui/ThemeColors.qml +43 -0
  383. package/ui/TransferCard.qml +239 -0
  384. package/ui/TrashConfirm.qml +129 -0
  385. package/ui/TrashDropHandler.qml +11 -0
  386. package/ui/TrashHost.qml +202 -0
  387. package/ui/TrashMonitor.qml +30 -0
  388. package/ui/TrashToolbar.qml +19 -0
  389. package/ui/TrashView.qml +492 -0
  390. package/ui/UnlockDialog.qml +450 -0
  391. package/ui/UnlockHost.qml +206 -0
  392. package/ui/UpdateCheck.qml +97 -0
  393. package/ui/UserDirs.qml +25 -0
  394. package/ui/ViewState.qml +565 -0
  395. package/ui/ViewportScrollBar.qml +195 -0
  396. package/ui/ViewportScrollBars.qml +25 -0
  397. package/ui/WebPreview.qml +33 -0
  398. package/ui/WebPreviewView.qml +26 -0
  399. package/ui/WindowBody.qml +829 -0
  400. package/ui/WindowDrag.qml +35 -0
  401. package/ui/boot/Commons/AudioNodes.qml +50 -0
  402. package/ui/boot/Commons/AudioNodesModel.js +96 -0
  403. package/ui/boot/Commons/Border.qml +243 -0
  404. package/ui/boot/Commons/BorderGeometry.js +373 -0
  405. package/ui/boot/Commons/Color.qml +258 -0
  406. package/ui/boot/Commons/I18n.qml +118 -0
  407. package/ui/boot/Commons/InputDevices.qml +112 -0
  408. package/ui/boot/Commons/InputMethodState.qml +38 -0
  409. package/ui/boot/Commons/IpcRegistry.qml +77 -0
  410. package/ui/boot/Commons/Numbers.js +19 -0
  411. package/ui/boot/Commons/Plural.js +91 -0
  412. package/ui/boot/Commons/ShellIpc.qml +12 -0
  413. package/ui/boot/Commons/Style.qml +561 -0
  414. package/ui/boot/Commons/Translations.qml +100 -0
  415. package/ui/boot/Commons/UntypedInput.qml +152 -0
  416. package/ui/boot/Commons/Util.qml +188 -0
  417. package/ui/boot/Commons/qmldir +13 -0
  418. package/ui/boot/LICENSE-omarchy +20 -0
  419. package/ui/boot/Ui/BackgroundMedia.qml +49 -0
  420. package/ui/boot/Ui/BarIconButton.qml +106 -0
  421. package/ui/boot/Ui/BarIconContent.qml +38 -0
  422. package/ui/boot/Ui/BarIndicator.qml +53 -0
  423. package/ui/boot/Ui/BarWidget.qml +50 -0
  424. package/ui/boot/Ui/BorderOverlay.qml +54 -0
  425. package/ui/boot/Ui/BorderSurface.qml +40 -0
  426. package/ui/boot/Ui/Button.qml +224 -0
  427. package/ui/boot/Ui/ButtonGroup.qml +131 -0
  428. package/ui/boot/Ui/ConfirmDialog.qml +134 -0
  429. package/ui/boot/Ui/CursorSurface.qml +42 -0
  430. package/ui/boot/Ui/Dropdown.qml +245 -0
  431. package/ui/boot/Ui/FilterInput.qml +26 -0
  432. package/ui/boot/Ui/IconContentBounds.qml +141 -0
  433. package/ui/boot/Ui/KeyboardPanel.qml +453 -0
  434. package/ui/boot/Ui/MultiSelect.qml +624 -0
  435. package/ui/boot/Ui/NumberField.qml +86 -0
  436. package/ui/boot/Ui/OpticalGlyph.qml +68 -0
  437. package/ui/boot/Ui/OverlayWindow.qml +102 -0
  438. package/ui/boot/Ui/Panel.qml +60 -0
  439. package/ui/boot/Ui/PanelActionButton.qml +105 -0
  440. package/ui/boot/Ui/PanelController.qml +16 -0
  441. package/ui/boot/Ui/PanelHero.qml +112 -0
  442. package/ui/boot/Ui/PanelKeyCatcher.qml +100 -0
  443. package/ui/boot/Ui/PanelSectionHeader.qml +31 -0
  444. package/ui/boot/Ui/PanelSeparator.qml +19 -0
  445. package/ui/boot/Ui/PanelSlider.qml +156 -0
  446. package/ui/boot/Ui/PanelToolTip.qml +50 -0
  447. package/ui/boot/Ui/PluginBarApi.qml +89 -0
  448. package/ui/boot/Ui/PointerMoveGate.qml +54 -0
  449. package/ui/boot/Ui/PopupCard.qml +181 -0
  450. package/ui/boot/Ui/ScreenMoveRemap.qml +43 -0
  451. package/ui/boot/Ui/SearchableDropdown.qml +354 -0
  452. package/ui/boot/Ui/SizedImage.qml +125 -0
  453. package/ui/boot/Ui/SpeedTestOverlay.qml +412 -0
  454. package/ui/boot/Ui/TextField.qml +58 -0
  455. package/ui/boot/Ui/Toggle.qml +118 -0
  456. package/ui/boot/Ui/ToggleSwitch.qml +115 -0
  457. package/ui/boot/Ui/WidgetButton.qml +172 -0
  458. package/ui/boot/Ui/qmldir +41 -0
  459. package/ui/boot/fleatab.qml +50 -0
  460. package/ui/boot/picker.qml +39 -0
  461. package/ui/boot/shell.qml +131 -0
  462. package/ui/boot/tabtearoff.qml +51 -0
  463. package/ui/js/Anchor.js +379 -0
  464. package/ui/js/AnchorHold.js +162 -0
  465. package/ui/js/Archive.js +157 -0
  466. package/ui/js/ArchiveCard.js +44 -0
  467. package/ui/js/ArchiveOps.js +44 -0
  468. package/ui/js/BackReturn.js +118 -0
  469. package/ui/js/BulkRename.js +100 -0
  470. package/ui/js/Buttons.js +54 -0
  471. package/ui/js/ChromeKeys.js +116 -0
  472. package/ui/js/ClipMarks.js +73 -0
  473. package/ui/js/ClipSelection.js +67 -0
  474. package/ui/js/Clipboard.js +179 -0
  475. package/ui/js/Cloud.js +97 -0
  476. package/ui/js/CodeRuns.js +72 -0
  477. package/ui/js/Collide.js +212 -0
  478. package/ui/js/ColumnFit.js +28 -0
  479. package/ui/js/ColumnMenu.js +111 -0
  480. package/ui/js/Columns.js +298 -0
  481. package/ui/js/ColumnsCarry.js +103 -0
  482. package/ui/js/Compare.js +74 -0
  483. package/ui/js/Contrast.js +157 -0
  484. package/ui/js/ControlReader.js +42 -0
  485. package/ui/js/Convert.js +52 -0
  486. package/ui/js/CopyAs.js +52 -0
  487. package/ui/js/Crumbs.js +178 -0
  488. package/ui/js/Csv.js +231 -0
  489. package/ui/js/Density.js +44 -0
  490. package/ui/js/Devices.js +440 -0
  491. package/ui/js/DirSizes.js +180 -0
  492. package/ui/js/Drag.js +360 -0
  493. package/ui/js/DragOut.js +166 -0
  494. package/ui/js/DropDev.js +52 -0
  495. package/ui/js/Dropbox.js +41 -0
  496. package/ui/js/Eject.js +217 -0
  497. package/ui/js/Errors.js +188 -0
  498. package/ui/js/ExtThumbs.js +115 -0
  499. package/ui/js/Facts.js +402 -0
  500. package/ui/js/FigureDate.js +14 -0
  501. package/ui/js/Filter.js +285 -0
  502. package/ui/js/Find.js +46 -0
  503. package/ui/js/Flash.js +184 -0
  504. package/ui/js/FlashCard.js +79 -0
  505. package/ui/js/FlashEndings.js +125 -0
  506. package/ui/js/FlashPane.js +116 -0
  507. package/ui/js/FleaBin.js +12 -0
  508. package/ui/js/Focus.js +504 -0
  509. package/ui/js/FolderSorts.js +108 -0
  510. package/ui/js/FolderViews.js +44 -0
  511. package/ui/js/Format.js +314 -0
  512. package/ui/js/Fuzzy.js +141 -0
  513. package/ui/js/GlassTag.js +72 -0
  514. package/ui/js/Grid.js +33 -0
  515. package/ui/js/GridGeometry.js +90 -0
  516. package/ui/js/GridNames.js +153 -0
  517. package/ui/js/GvfsBridge.js +200 -0
  518. package/ui/js/HostClipboard.js +29 -0
  519. package/ui/js/Icons.js +218 -0
  520. package/ui/js/Input.js +50 -0
  521. package/ui/js/Jump.js +200 -0
  522. package/ui/js/KeyName.js +64 -0
  523. package/ui/js/Keymap.js +401 -0
  524. package/ui/js/Kinds.js +164 -0
  525. package/ui/js/LICENSES/ISC-lucide.txt +43 -0
  526. package/ui/js/LangMarkPaths.js +47 -0
  527. package/ui/js/LangMarks.js +120 -0
  528. package/ui/js/Lists.js +11 -0
  529. package/ui/js/LocalSend.js +39 -0
  530. package/ui/js/LockedMenu.js +63 -0
  531. package/ui/js/MakeDefault.js +186 -0
  532. package/ui/js/MarkBox.js +7 -0
  533. package/ui/js/Markdown.js +119 -0
  534. package/ui/js/MarkdownLists.js +86 -0
  535. package/ui/js/MarkdownMaths.js +58 -0
  536. package/ui/js/MarkdownPictures.js +32 -0
  537. package/ui/js/MarkdownPrepared.js +139 -0
  538. package/ui/js/MarkdownTableFit.js +34 -0
  539. package/ui/js/Marks.js +148 -0
  540. package/ui/js/Marquee.js +96 -0
  541. package/ui/js/Match.js +93 -0
  542. package/ui/js/Material.js +109 -0
  543. package/ui/js/MdBlocks.js +437 -0
  544. package/ui/js/MdBreak.js +71 -0
  545. package/ui/js/MdChunks.js +70 -0
  546. package/ui/js/MdContainer.js +137 -0
  547. package/ui/js/MdDocument.js +337 -0
  548. package/ui/js/MdEmph.js +97 -0
  549. package/ui/js/MdEntity.js +108 -0
  550. package/ui/js/MdEntityTable.js +223 -0
  551. package/ui/js/MdEscape.js +59 -0
  552. package/ui/js/MdFront.js +37 -0
  553. package/ui/js/MdHold.js +32 -0
  554. package/ui/js/MdHtml.js +307 -0
  555. package/ui/js/MdHtmlBlock.js +290 -0
  556. package/ui/js/MdHtmlHeading.js +53 -0
  557. package/ui/js/MdHtmlImage.js +179 -0
  558. package/ui/js/MdInline.js +154 -0
  559. package/ui/js/MdItems.js +212 -0
  560. package/ui/js/MdLeaf.js +309 -0
  561. package/ui/js/MdLink.js +196 -0
  562. package/ui/js/MdMath.js +67 -0
  563. package/ui/js/MdParagraphs.js +138 -0
  564. package/ui/js/MdRefs.js +232 -0
  565. package/ui/js/MdResolve.js +226 -0
  566. package/ui/js/MdRun.js +300 -0
  567. package/ui/js/MdUrl.js +226 -0
  568. package/ui/js/Menu.js +514 -0
  569. package/ui/js/MenuContext.js +85 -0
  570. package/ui/js/MenuFit.js +13 -0
  571. package/ui/js/MenuRefresh.js +74 -0
  572. package/ui/js/MenuWheel.js +35 -0
  573. package/ui/js/Messages.js +186 -0
  574. package/ui/js/Motion.js +16 -0
  575. package/ui/js/Mounts.js +320 -0
  576. package/ui/js/MouseNav.js +13 -0
  577. package/ui/js/Nav.js +329 -0
  578. package/ui/js/NetFs.js +26 -0
  579. package/ui/js/OpenWith.js +83 -0
  580. package/ui/js/Ops.js +585 -0
  581. package/ui/js/Palette.js +33 -0
  582. package/ui/js/PathBar.js +260 -0
  583. package/ui/js/Permissions.js +179 -0
  584. package/ui/js/Phones.js +112 -0
  585. package/ui/js/Picker.js +353 -0
  586. package/ui/js/PlaceMenu.js +96 -0
  587. package/ui/js/Places.js +265 -0
  588. package/ui/js/PreviewAsk.js +21 -0
  589. package/ui/js/PreviewKeys.js +155 -0
  590. package/ui/js/PreviewSettle.js +29 -0
  591. package/ui/js/PreviewSwap.js +101 -0
  592. package/ui/js/PropertyFacts.js +144 -0
  593. package/ui/js/Protocols.js +296 -0
  594. package/ui/js/QuickLookKinds.js +27 -0
  595. package/ui/js/QuickLookRect.js +24 -0
  596. package/ui/js/RailDrop.js +51 -0
  597. package/ui/js/RailKeys.js +87 -0
  598. package/ui/js/RailMenu.js +133 -0
  599. package/ui/js/Recent.js +135 -0
  600. package/ui/js/RecentMode.js +156 -0
  601. package/ui/js/Reload.js +60 -0
  602. package/ui/js/Renderer.js +9 -0
  603. package/ui/js/RunFile.js +143 -0
  604. package/ui/js/Scripts.js +28 -0
  605. package/ui/js/Scroll.js +304 -0
  606. package/ui/js/ScrollOff.js +69 -0
  607. package/ui/js/Search.js +478 -0
  608. package/ui/js/Selection.js +97 -0
  609. package/ui/js/Settings.js +476 -0
  610. package/ui/js/SettingsAbout.js +97 -0
  611. package/ui/js/SettingsShelf.js +52 -0
  612. package/ui/js/SheetKeys.js +42 -0
  613. package/ui/js/SheetQuery.js +281 -0
  614. package/ui/js/ShelfPile.js +27 -0
  615. package/ui/js/SlowClick.js +53 -0
  616. package/ui/js/SlowOp.js +6 -0
  617. package/ui/js/Sort.js +134 -0
  618. package/ui/js/Startup.js +63 -0
  619. package/ui/js/StateWords.js +17 -0
  620. package/ui/js/Status.js +238 -0
  621. package/ui/js/Swap.js +166 -0
  622. package/ui/js/TabMove.js +39 -0
  623. package/ui/js/Tabs.js +751 -0
  624. package/ui/js/Tags.js +134 -0
  625. package/ui/js/Taildrop.js +128 -0
  626. package/ui/js/Tap.js +180 -0
  627. package/ui/js/TextSize.js +107 -0
  628. package/ui/js/Thumbs.js +158 -0
  629. package/ui/js/Transfer.js +172 -0
  630. package/ui/js/Trash.js +84 -0
  631. package/ui/js/TrashDates.js +47 -0
  632. package/ui/js/TrashDrop.js +64 -0
  633. package/ui/js/UiState.js +438 -0
  634. package/ui/js/Unlock.js +152 -0
  635. package/ui/js/Update.js +130 -0
  636. package/ui/js/UserDirs.js +56 -0
  637. package/ui/qmldir +230 -0
@@ -0,0 +1,530 @@
1
+ // Diagram SVG from Pele (src/pele-wrapper.js), made safe and themed for a passive page or Qt SVG.
2
+ // Pure functions: src/figure-thread.js runs them in a Bun Worker beside the bundle.
3
+
4
+ export var MERMAID_LIMIT = 32768;
5
+
6
+ // A start or end tag whole, a quoted value holding ">" included; the words between two tags are never inside one.
7
+ var TAG = /<[^<>"']*(?:(?:"[^"]*"|'[^']*')[^<>"']*)*>/g;
8
+ var ATTRIBUTE = /([^\s=<>"'\/]+)\s*=\s*(?:"([^"]*)"|'([^']*)')/g;
9
+ var NAMED_REFERENCES = { amp: "&", lt: "<", gt: ">", quot: '"', apos: "'" };
10
+ var DECIMAL_RADIX = 10;
11
+ var HEX_RADIX = 16;
12
+ var MAX_CODE_POINT = 0x10ffff;
13
+
14
+ // Sample input: "&#102;ile:x" reads "file:x" and "&amp;#102;" reads "&#102;", in one pass, as an XML parser reads an attribute value.
15
+ function decodeReferences(text) {
16
+ return text.replace(/&(?:#(\d+)|#x([0-9a-f]+)|(\w+));/gi, function (all, decimal, hex, name) {
17
+ if (decimal === undefined && hex === undefined)
18
+ return Object.prototype.hasOwnProperty.call(NAMED_REFERENCES, name) ? NAMED_REFERENCES[name] : all;
19
+ var code = decimal !== undefined ? parseInt(decimal, DECIMAL_RADIX) : parseInt(hex, HEX_RADIX);
20
+ return code > 0 && code <= MAX_CODE_POINT ? String.fromCodePoint(code) : all;
21
+ });
22
+ }
23
+
24
+ // The corpus vocabulary, the diagrams' output and every style attribute the post-pass writes; anything else refuses.
25
+ var ELEMENTS = ["a", "circle", "desc", "ellipse", "g", "line", "path", "polygon", "rect", "svg", "text", "title", "tspan"];
26
+ var ATTRIBUTES = ["class", "cx", "cy", "d", "fill", "fill-opacity", "focusable", "font-family", "font-size", "font-style",
27
+ "font-weight", "height", "href", "id", "letter-spacing", "opacity", "pointer-events", "points", "preserveAspectRatio", "r", "role",
28
+ "rx", "ry", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-opacity", "stroke-width",
29
+ "style", "text-anchor", "text-decoration", "transform", "viewBox", "width", "word-spacing", "x", "x1", "x2", "xml:space", "y", "y1", "y2"];
30
+ // A data attribute holds words, a formula's TeX among them, which no renderer loads or paints, so only its name is checked.
31
+ var DATA_ATTRIBUTES = ["array-padding", "bgcolor", "c", "frame", "frame-styles", "hitbox", "icon", "id", "id-align", "idbox", "labels", "latex",
32
+ "line", "mjx-linebox", "mjx-lineno", "mjx-linestack", "mjx-texclass", "mjx-viewBox", "mml-node", "table", "variant", "width-includes-label"];
33
+ var STYLE_PROPERTIES = ["min-width", "vertical-align"];
34
+ var SVG_NAMESPACE = "http://www.w3.org/2000/svg";
35
+
36
+ // Sample input: "vertical-align: -2.5px; min-width: 40px" answers null and "fill: red" "style property"; a declaration is an allowed property and a length.
37
+ function styleError(style) {
38
+ var declarations = style.split(";");
39
+ for (var i = 0; i < declarations.length; i++) {
40
+ var declaration = /^\s*([a-z-]+)\s*:\s*-?\d*\.?\d+(?:px)?\s*$/i.exec(declarations[i]);
41
+ if (declarations[i].trim() !== "" && (declaration === null || STYLE_PROPERTIES.indexOf(declaration[1].toLowerCase()) < 0))
42
+ return "style property";
43
+ }
44
+ return null;
45
+ }
46
+
47
+ // Sample input: ("href", "#glyph") answers null and ("href", "x.svg#a") "remote link"; the value arrives decoded, and a link or url() reads without the spaces and controls a URL parser drops.
48
+ function attributeError(name, value) {
49
+ if (name === "xmlns")
50
+ return value === SVG_NAMESPACE ? null : "namespace";
51
+ if (/^data-/.test(name))
52
+ return DATA_ATTRIBUTES.indexOf(name.slice("data-".length)) >= 0 ? null : "unlisted attribute " + name;
53
+ if (ATTRIBUTES.indexOf(name) < 0)
54
+ return "unlisted attribute " + name;
55
+ var compact = value.replace(/[\x00-\x20\x7f]/g, "");
56
+ if (name === "href" && compact !== "" && compact.charAt(0) !== "#")
57
+ return "remote link";
58
+ if (/url\((?!#)/i.test(compact))
59
+ return "non-local url";
60
+ if (/https?:/i.test(compact))
61
+ return "remote reference";
62
+ if (/var\(|color-mix\(/i.test(compact))
63
+ return "unresolved style";
64
+ return name === "style" ? styleError(value) : null;
65
+ }
66
+
67
+ // Sample input: <svg xmlns="http://www.w3.org/2000/svg"><a href="#e"><path d="M0 0"/></a></svg> answers null; anything the figure corpus never draws answers its reason.
68
+ export function checkSafe(svg) {
69
+ var reason = null;
70
+ // Every "<" opens a tag read whole, so a comment, a document type, an instruction or character data is an unlisted element.
71
+ var words = svg.replace(TAG, function (tag) {
72
+ var name = /^<\/?([^\s\/>]*)/.exec(tag)[1];
73
+ if (ELEMENTS.indexOf(name) < 0)
74
+ reason = reason || "unlisted element " + name;
75
+ var unread = tag.slice(0, -1).replace(/^<\/?[^\s\/>]*/, "").replace(ATTRIBUTE, function (all, attribute, double, single) {
76
+ reason = reason || attributeError(attribute, decodeReferences(double !== undefined ? double : single));
77
+ return "";
78
+ });
79
+ if (!/^\s*\/?$/.test(unread))
80
+ reason = reason || "unread tag text";
81
+ return "";
82
+ });
83
+ if (words.indexOf("<") >= 0)
84
+ return reason || "unread markup";
85
+ // The literal checks read all but the namespace name, so a label's words or a formula's TeX still refuse a remote reference.
86
+ var s = svg.replace(/\sxmlns\s*=\s*(?:"[^"]*"|'[^']*')/g, "");
87
+ if (/@import/i.test(s))
88
+ return reason || "remote import";
89
+ if (s.indexOf("http:") >= 0 || s.indexOf("https:") >= 0)
90
+ return reason || "remote reference";
91
+ if (/url\((?!\s*#)/.test(s))
92
+ return reason || "non-local url";
93
+ return reason;
94
+ }
95
+
96
+ // Sample input: <text fill="currentColor">currentColor</text> with a rewrite to "#fff" reads <text fill="#fff">currentColor</text>: every attribute value, in either quote style, and never a label's words.
97
+ function inAttributes(svg, rewrite) {
98
+ return svg.replace(TAG, function (tag) {
99
+ return tag.replace(/(=\s*)(?:"([^"]*)"|'([^']*)')/g, function (all, equals, double, single) {
100
+ return double !== undefined ? equals + '"' + rewrite(double) + '"' : equals + "'" + rewrite(single) + "'";
101
+ });
102
+ });
103
+ }
104
+
105
+ function escAttr(s) {
106
+ return String(s).replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;");
107
+ }
108
+
109
+ // Presentation attributes a Pele style attribute carries, as attributes since Qt SVG reads no rx and no var() from a style; no font family, since every label is measured in the theme font the root names.
110
+ var STYLE_ATTRIBUTES = ["fill", "fill-opacity", "stroke", "stroke-width", "stroke-dasharray", "stroke-dashoffset",
111
+ "stroke-linecap", "stroke-linejoin", "stroke-opacity", "opacity", "rx", "ry",
112
+ "font-size", "font-weight", "font-style", "text-decoration", "letter-spacing", "word-spacing"];
113
+
114
+ // Sample input: <rect x="1" style="rx:4px;fill:#fff"/> reads <rect x="1" rx="4" fill="#fff"/>; a property already set as an attribute keeps the attribute.
115
+ function styleToAttributes(svg) {
116
+ return svg.replace(/<([a-zA-Z]+)((?:\s[^<>]*?)?)\sstyle="([^"]*)"([^<>]*?)(\/?)>/g, function (tag, name, before, style, after, self) {
117
+ if (name === "svg")
118
+ return tag;
119
+ var attrs = before + after;
120
+ var add = [];
121
+ style.split(";").forEach(function (declaration) {
122
+ var at = declaration.indexOf(":");
123
+ if (at <= 0)
124
+ return;
125
+ var prop = declaration.slice(0, at).trim().toLowerCase();
126
+ var value = declaration.slice(at + 1).trim();
127
+ if (STYLE_ATTRIBUTES.indexOf(prop) < 0 || new RegExp("\\s" + prop + "=").test(attrs + " " + add.join(" ")))
128
+ return;
129
+ if (prop === "rx" || prop === "ry")
130
+ value = value.replace(/px$/, "");
131
+ add.push(prop + '="' + escAttr(value) + '"');
132
+ });
133
+ return "<" + name + attrs + (add.length ? " " + add.join(" ") : "") + self + ">";
134
+ });
135
+ }
136
+
137
+ // Sample input: <svg class="pele-icon" x="10" y="8" width="20" height="20" viewBox="0 0 24 24" fill="none"><path/></svg> reads a group translated to 10,8 and scaled by 20/24.
138
+ function iconGroups(svg) {
139
+ var open = /<svg\b([^<>]*)>/g;
140
+ var root = open.exec(svg);
141
+ if (!root)
142
+ return svg;
143
+ var head = svg.slice(0, open.lastIndex);
144
+ var body = svg.slice(open.lastIndex).replace(/<svg\b([^<>]*)>([\s\S]*?)<\/svg>(?=[\s\S]*<\/svg>\s*$)/g, function (all, attrs, inner) {
145
+ function num(name, fallback) {
146
+ var found = attrs.match(new RegExp("\\s" + name + '="([^"]*)"'));
147
+ return found ? Number(found[1]) : fallback;
148
+ }
149
+ var box = (attrs.match(/\sviewBox="([^"]*)"/) || [0, ""])[1].trim().split(/[\s,]+/).map(Number);
150
+ var width = num("width", NaN);
151
+ var height = num("height", NaN);
152
+ if (box.length !== 4 || !box.every(Number.isFinite) || !(box[2] > 0) || !(box[3] > 0) || !Number.isFinite(width) || !Number.isFinite(height))
153
+ return "";
154
+ var keep = attrs.replace(/\s(?:x|y|width|height|viewBox|xmlns|preserveAspectRatio)="[^"]*"/g, "");
155
+ var transform = "translate(" + num("x", 0) + "," + num("y", 0) + ") scale(" + width / box[2] + "," + height / box[3] + ") translate(" + -box[0] + "," + -box[1] + ")";
156
+ return "<g" + keep + ' transform="' + transform + '">' + inner + "</g>";
157
+ });
158
+ return head + body;
159
+ }
160
+
161
+ // Sample input: <svg ... style="max-width:100%;--_bg:#101315;font:14px sans-serif;font-family:mono" fill="#c0caf5" role="graphics-document document"> keeps its size and fill and names its font.
162
+ function rootFont(svg, t) {
163
+ return svg.replace(/<svg\b[^<>]*>/, function (root) {
164
+ var out = root.replace(/\s(?:style|role|aria-[\w-]+|class)="[^"]*"/g, "");
165
+ return out.replace(/>$/, ' font-family="' + escAttr(t.font || "sans-serif") + '" font-size="' + MERMAID_LAYOUT_PX + '">');
166
+ });
167
+ }
168
+
169
+ // Sample input: <text a="1"><tspan x="0" y="-9">The </tspan><tspan font-weight="bold">dog</tspan><tspan x="0" y="9">ran</tspan></text> reads two texts, <text a="1" x="0" y="-9">The <tspan font-weight="bold">dog</tspan></text> and <text a="1" x="0" y="9">ran</text>, because Qt SVG places no tspan by its own x and y.
170
+ function lineTexts(svg) {
171
+ return svg.replace(/<text\b([^<>]*)>((?:<tspan\b[^<>]*>[^<]*<\/tspan>)+)<\/text>/g, function (all, attrs, content) {
172
+ if (/\s(?:x|y)="/.test(attrs))
173
+ return all;
174
+ var lines = [];
175
+ content.replace(/<tspan\b([^<>]*)>([^<]*)<\/tspan>/g, function (span, own, words) {
176
+ var x = own.match(/\sx="([^"]*)"/);
177
+ var y = own.match(/\sy="([^"]*)"/);
178
+ if (x && y)
179
+ lines.push({ x: x[1], y: y[1], runs: [] });
180
+ else if (x || y || lines.length === 0)
181
+ lines = null;
182
+ if (lines)
183
+ lines[lines.length - 1].runs.push({ attrs: own.replace(/\s(?:x|y)="[^"]*"/g, ""), words: words });
184
+ return span;
185
+ });
186
+ if (!lines)
187
+ return all;
188
+ return lines.map(function (line) {
189
+ var body = line.runs.map(function (run) {
190
+ return /\S/.test(run.attrs) ? "<tspan" + run.attrs + ">" + run.words + "</tspan>" : run.words;
191
+ }).join("");
192
+ return "<text" + attrs + ' x="' + line.x + '" y="' + line.y + '">' + body + "</text>";
193
+ }).join("");
194
+ });
195
+ }
196
+
197
+ // Sample input: <g class="pele-edges" stroke="#565f89"><g class="pele-edge"><path class="pele-marker" fill="#565f89" stroke="none"/></g></g> fills the mark with the accent, as Flea drew a link's marks before; a mark inheriting the stroke gets an accent stroke, and an edge a user style colours keeps its marks.
198
+ function accentMarks(svg, t) {
199
+ var edges = svg.match(/<g class="pele-edges"[^<>]*\sstroke="([^"]*)"/);
200
+ if (!edges)
201
+ return svg;
202
+ var line = edges[1];
203
+ var accent = escAttr(t.accent || t.fg);
204
+ // One entry per open group: true inside an edge no user style colours, false inside a styled one, or the enclosing group's value.
205
+ var open = [];
206
+ return svg.replace(/<\/g>|<g\b[^<>]*>|<[a-z]+\b[^<>]*\sclass="pele-marker(?:\s[^"]*)?"[^<>]*>/g, function (tag) {
207
+ if (tag === "</g>") {
208
+ open.pop();
209
+ return tag;
210
+ }
211
+ var inherited = open.length ? open[open.length - 1] : false;
212
+ if (/^<g\b/.test(tag)) {
213
+ open.push(/\sclass="pele-edge(?:\s[^"]*)?"/.test(tag) ? !/\sstroke="/.test(tag) : inherited);
214
+ return tag;
215
+ }
216
+ if (!inherited)
217
+ return tag;
218
+ var out = tag.split('fill="' + line + '"').join('fill="' + accent + '"').split('stroke="' + line + '"').join('stroke="' + accent + '"');
219
+ return /\sstroke="/.test(out) ? out : out.replace(/\s*(\/?)>$/, ' stroke="' + accent + '"$1>');
220
+ });
221
+ }
222
+
223
+ // The bundle lays a diagram out at body 13 and scales its canvas to the theme's body size, as v0.3.12 did, so its text is set at 13.
224
+ const MERMAID_LAYOUT_PX = 13;
225
+
226
+ // SVG's defaults for a stroke the figure does not style: one unit wide, mitred joins cut off past a ratio of 4, butt caps.
227
+ const DEFAULT_STROKE_WIDTH = 1;
228
+ const DEFAULT_MITER_LIMIT = 4;
229
+ const HALF_STROKE = 0.5;
230
+ // The middle of two ends, and the quarter of a half turn in degrees.
231
+ const HALF = 0.5;
232
+ const RIGHT_ANGLE = 90;
233
+ const DEGREES = 180;
234
+ // The canvas grows in hundredths of a unit, rounded outward, so a stroke on its edge is never cut by rounding.
235
+ const ROOM_PRECISION = 100;
236
+ const IDENTITY = [1, 0, 0, 1, 0, 0];
237
+ const PATH_ARGUMENTS = { M: 2, L: 2, H: 1, V: 1, C: 6, S: 4, Q: 4, T: 2, A: 7, Z: 0 };
238
+
239
+ // Sample input: ([1, 0, 0, 1, 5, 0], [2, 0, 0, 2, 0, 0]) answers [2, 0, 0, 2, 5, 0], the second applied first.
240
+ function compose(m, n) {
241
+ return [m[0] * n[0] + m[2] * n[1], m[1] * n[0] + m[3] * n[1], m[0] * n[2] + m[2] * n[3], m[1] * n[2] + m[3] * n[3],
242
+ m[0] * n[4] + m[2] * n[5] + m[4], m[1] * n[4] + m[3] * n[5] + m[5]];
243
+ }
244
+
245
+ // Sample input: "translate(10,4) rotate(90)" answers [0, 1, -1, 0, 10, 4]; a skew or anything unread answers null.
246
+ function transformOf(text) {
247
+ var m = IDENTITY;
248
+ var rest = String(text).replace(/([a-zA-Z]+)\s*\(([^()]*)\)/g, function (all, name, args) {
249
+ var a = args.trim() === "" ? [] : args.trim().split(/[\s,]+/).map(Number);
250
+ var r;
251
+ if (!a.every(Number.isFinite))
252
+ m = null;
253
+ else if (name === "translate" && (a.length === 1 || a.length === 2))
254
+ r = [1, 0, 0, 1, a[0], a.length > 1 ? a[1] : 0];
255
+ else if (name === "scale" && (a.length === 1 || a.length === 2))
256
+ r = [a[0], 0, 0, a.length > 1 ? a[1] : a[0], 0, 0];
257
+ else if (name === "rotate" && (a.length === 1 || a.length === 3)) {
258
+ var t = a[0] * Math.PI / DEGREES;
259
+ var cx = a.length > 1 ? a[1] : 0;
260
+ var cy = a.length > 1 ? a[2] : 0;
261
+ r = compose(compose([1, 0, 0, 1, cx, cy], [Math.cos(t), Math.sin(t), -Math.sin(t), Math.cos(t), 0, 0]), [1, 0, 0, 1, -cx, -cy]);
262
+ } else if (name === "matrix" && a.length === 6)
263
+ r = a;
264
+ else
265
+ m = null;
266
+ if (m)
267
+ m = compose(m, r);
268
+ return "";
269
+ });
270
+ return rest.trim() === "" ? m : null;
271
+ }
272
+
273
+ // Sample input: "4px" answers 4 and "2" answers 2; a width in any other unit answers NaN, which the figure cannot place.
274
+ function strokeWidthOf(text) {
275
+ var found = String(text).trim().match(/^(\d+(?:\.\d+)?|\.\d+)(px)?$/);
276
+ return found ? Number(found[1]) : NaN;
277
+ }
278
+
279
+ // Sample input: <polygon points="0,0 10,0 5,8"/> answers one closed run of three joins, and <path d="M0,0C5,5 5,5 10,0"/> an open run whose control points join nothing: a shape's outline as runs of points, each marked where a stroke joins two segments, plus the loose points a curve or arc may reach.
280
+ function outlineOf(name, attrs) {
281
+ function num(key, fallback) {
282
+ var found = attrs.match(new RegExp("\\s" + key + '="([^"]*)"'));
283
+ return found ? Number(found[1]) : fallback;
284
+ }
285
+ var runs = [];
286
+ var loose = [];
287
+ if (name === "rect" || name === "circle" || name === "ellipse") {
288
+ var rect = name === "rect";
289
+ var rx = rect ? 0 : name === "circle" ? num("r", NaN) : num("rx", NaN);
290
+ var ry = rect ? 0 : name === "circle" ? num("r", NaN) : num("ry", NaN);
291
+ var x = rect ? num("x", 0) : num("cx", 0) - rx;
292
+ var y = rect ? num("y", 0) : num("cy", 0) - ry;
293
+ var w = rect ? num("width", NaN) : 2 * rx;
294
+ var h = rect ? num("height", NaN) : 2 * ry;
295
+ // A rounded rect, a circle and an ellipse have no corner for a miter, so only a sharp rect joins at its corners.
296
+ var sharp = rect && !(num("rx", 0) > 0) && !(num("ry", 0) > 0);
297
+ runs.push({ closed: true, points: [[x, y, sharp], [x + w, y, sharp], [x + w, y + h, sharp], [x, y + h, sharp]] });
298
+ } else if (name === "line") {
299
+ runs.push({ closed: false, points: [[num("x1", 0), num("y1", 0), false], [num("x2", 0), num("y2", 0), false]] });
300
+ } else if (name === "polygon") {
301
+ var found = attrs.match(/\spoints="([^"]*)"/);
302
+ var n = found ? found[1].trim().split(/[\s,]+/).map(Number) : [];
303
+ var points = [];
304
+ for (var i = 0; i + 1 < n.length; i += 2)
305
+ points.push([n[i], n[i + 1], true]);
306
+ if (n.length % 2 !== 0)
307
+ points.push([NaN, NaN, false]);
308
+ runs.push({ closed: true, points: points });
309
+ } else if (name === "path") {
310
+ var d = attrs.match(/\sd="([^"]*)"/);
311
+ var px = 0;
312
+ var py = 0;
313
+ var run = null;
314
+ String(d ? d[1] : "").replace(/([MLHVCSQTAZmlhvcsqtaz])([^MLHVCSQTAZmlhvcsqtaz]*)/g, function (all, letter, body) {
315
+ var cmd = letter.toUpperCase();
316
+ var relative = letter !== cmd;
317
+ var a = body.match(/[-+]?(?:\d*\.\d+|\d+\.?\d*)(?:[eE][-+]?\d+)?/g) || [];
318
+ var step = PATH_ARGUMENTS[cmd];
319
+ if (cmd === "Z") {
320
+ if (run)
321
+ run.closed = true;
322
+ run = null;
323
+ return all;
324
+ }
325
+ if (a.length === 0 || a.length % step !== 0) {
326
+ runs.push({ closed: false, points: [[NaN, NaN, false]] });
327
+ return all;
328
+ }
329
+ for (var k = 0; k < a.length; k += step) {
330
+ var v = a.slice(k, k + step).map(Number);
331
+ var ox = relative ? px : 0;
332
+ var oy = relative ? py : 0;
333
+ if (cmd === "M" && k === 0) {
334
+ run = { closed: false, points: [] };
335
+ runs.push(run);
336
+ } else if (!run) {
337
+ run = { closed: false, points: [[px, py, true]] };
338
+ runs.push(run);
339
+ }
340
+ if (cmd === "H")
341
+ px = ox + v[0];
342
+ else if (cmd === "V")
343
+ py = oy + v[0];
344
+ else if (cmd === "A") {
345
+ var ex = ox + v[5];
346
+ var ey = oy + v[6];
347
+ loose.push.apply(loose, arcExtremes(px, py, v[0], v[1], v[2], v[3] !== 0, v[4] !== 0, ex, ey));
348
+ px = ex;
349
+ py = ey;
350
+ } else {
351
+ // A curve stays inside the hull of its control points, which stand in the run so a join reads the curve's tangent from them.
352
+ for (var c = 0; c + 2 < step; c += 2)
353
+ run.points.push([ox + v[c], oy + v[c + 1], false]);
354
+ px = ox + v[step - 2];
355
+ py = oy + v[step - 1];
356
+ }
357
+ run.points.push([px, py, true]);
358
+ }
359
+ return all;
360
+ });
361
+ }
362
+ return { runs: runs, loose: loose };
363
+ }
364
+
365
+ const QUARTER_TURN = Math.PI * HALF;
366
+ const FULL_TURN = 2 * Math.PI;
367
+ const QUARTERS = 4;
368
+ // Sample input: (10, 0, 10, 10, 0, false, true, -10, 0), the lower half turn about (0, 0), answers its bottom point [[0, 10]], its ends counting elsewhere: the points of an arc reaching furthest up, down, left and right, from SVG's endpoint form (F.6.5); an axis-aligned ellipse is a circle with y stretched by ry / rx, and one turned off the axes answers its ends' box grown by its larger radius.
369
+ function arcExtremes(x0, y0, rx, ry, turn, large, sweep, x1, y1) {
370
+ var quarter = Math.abs(turn) % DEGREES;
371
+ var across = quarter === RIGHT_ANGLE;
372
+ var r = Math.abs(across ? ry : rx);
373
+ var stretch = r > 0 ? Math.abs(across ? rx : ry) / r : 0;
374
+ if ((quarter !== 0 && !across) || !(stretch > 0)) {
375
+ var far = Math.max(Math.abs(rx), Math.abs(ry));
376
+ return [[Math.min(x0, x1) - far, Math.min(y0, y1) - far], [Math.max(x0, x1) + far, Math.max(y0, y1) + far]];
377
+ }
378
+ var hx = (x0 - x1) * HALF;
379
+ var hy = (y0 - y1) / stretch * HALF;
380
+ var chord = hx * hx + hy * hy;
381
+ if (!(chord > 0))
382
+ return [];
383
+ // A radius too short for its chord grows until the arc is a half turn.
384
+ r = Math.max(r, Math.sqrt(chord));
385
+ var lift = Math.sqrt(Math.max(0, (r * r - chord) / chord)) * (large === sweep ? -1 : 1);
386
+ var cx = lift * hy + (x0 + x1) * HALF;
387
+ var cy = -lift * hx + (y0 + y1) / stretch * HALF;
388
+ var from = Math.atan2(y0 / stretch - cy, x0 - cx);
389
+ var span = Math.atan2(y1 / stretch - cy, x1 - cx) - from;
390
+ if (sweep && span < 0)
391
+ span += FULL_TURN;
392
+ else if (!sweep && span > 0)
393
+ span -= FULL_TURN;
394
+ var out = [];
395
+ for (var q = -QUARTERS; q <= 2 * QUARTERS; q++) {
396
+ var a = q * QUARTER_TURN;
397
+ var into = sweep ? a - from : from - a;
398
+ if (into > 0 && into < Math.abs(span))
399
+ out.push([cx + r * Math.cos(a), (cy + r * Math.sin(a)) * stretch]);
400
+ }
401
+ return out;
402
+ }
403
+
404
+ // Sample input: a right-angled corner answers the miter ratio 1.41; a join sharper than the limit is bevelled, so it answers 1.
405
+ function miterRatio(prev, at, next, limit) {
406
+ var ux = prev[0] - at[0];
407
+ var uy = prev[1] - at[1];
408
+ var vx = next[0] - at[0];
409
+ var vy = next[1] - at[1];
410
+ var lu = Math.hypot(ux, uy);
411
+ var lv = Math.hypot(vx, vy);
412
+ if (!(lu > 0) || !(lv > 0))
413
+ return 1;
414
+ var cos = (ux * vx + uy * vy) / (lu * lv);
415
+ var sinHalf = Math.sqrt(Math.max(0, (1 - cos) * HALF));
416
+ var ratio = sinHalf > 0 ? 1 / sinHalf : Infinity;
417
+ return ratio <= limit ? Math.max(1, ratio) : 1;
418
+ }
419
+
420
+ // Sample input: <svg viewBox="0 0 50 140" width="50" height="140"><rect x="1" y="94" width="48" height="45" stroke="#fff" stroke-width="8"/></svg> reads viewBox="-3 -3 56 146" width="56" height="146": the canvas grows, never shrinks, to hold every stroke as it paints, half its width past its outline and more at a mitred join or a square cap; a stroke inside the canvas, or a shape it cannot place, leaves it alone.
421
+ function strokeRoom(svg) {
422
+ var root = svg.match(/<svg\b[^<>]*>/);
423
+ var view = root ? root[0].match(/\sviewBox="([^"]*)"/) : null;
424
+ var box = view ? view[1].trim().split(/[\s,]+/).map(Number) : [];
425
+ if (box.length !== 4 || !box.every(Number.isFinite) || !(box[2] > 0) || !(box[3] > 0))
426
+ return svg;
427
+ var low = [box[0], box[1]];
428
+ var high = [box[0] + box[2], box[1] + box[3]];
429
+ var stack = [{ m: IDENTITY, stroke: "none", width: DEFAULT_STROKE_WIDTH, join: "miter", cap: "butt", limit: DEFAULT_MITER_LIMIT }];
430
+ function own(attrs, key) {
431
+ var found = attrs.match(new RegExp("\\s" + key + '="([^"]*)"'));
432
+ return found ? found[1] : null;
433
+ }
434
+ function reach(m, x, y, pad) {
435
+ // A transform stretches the stroke by at most the larger of its column lengths.
436
+ var stretch = m ? Math.max(Math.hypot(m[0], m[1]), Math.hypot(m[2], m[3])) : 0;
437
+ var tx = m[0] * x + m[2] * y + m[4];
438
+ var ty = m[1] * x + m[3] * y + m[5];
439
+ low = [Math.min(low[0], tx - pad * stretch), Math.min(low[1], ty - pad * stretch)];
440
+ high = [Math.max(high[0], tx + pad * stretch), Math.max(high[1], ty + pad * stretch)];
441
+ }
442
+ var body = svg.slice(root.index + root[0].length);
443
+ var placed = true;
444
+ body.replace(/<(\/?)([a-zA-Z][\w:-]*)((?:\s[^<>]*?)?)(\/?)>/g, function (tag, closing, name, attrs, self) {
445
+ if (closing) {
446
+ if (stack.length > 1)
447
+ stack.pop();
448
+ return tag;
449
+ }
450
+ var up = stack[stack.length - 1];
451
+ var transform = own(attrs, "transform");
452
+ var m = up.m && transform !== null ? (transformOf(transform) ? compose(up.m, transformOf(transform)) : null) : up.m;
453
+ var widthText = own(attrs, "stroke-width");
454
+ var limitText = own(attrs, "stroke-miterlimit");
455
+ var state = { m: m, stroke: own(attrs, "stroke") !== null ? own(attrs, "stroke") : up.stroke,
456
+ width: widthText !== null ? strokeWidthOf(widthText) : up.width, join: own(attrs, "stroke-linejoin") || up.join,
457
+ cap: own(attrs, "stroke-linecap") || up.cap, limit: limitText !== null ? Number(limitText) : up.limit };
458
+ var shape = /^(rect|circle|ellipse|line|polygon|path)$/.test(name);
459
+ if (shape && state.stroke !== "none" && state.stroke !== "transparent") {
460
+ var outline = outlineOf(name, attrs);
461
+ var half = state.width * HALF_STROKE;
462
+ var capRatio = state.cap === "square" ? Math.SQRT2 : 1;
463
+ var mitred = state.join === "miter" || state.join === "miter-clip" || state.join === "arcs";
464
+ var known = state.m !== null && Number.isFinite(half) && half >= 0 && state.limit >= 1;
465
+ outline.runs.forEach(function (run) {
466
+ var n = run.points.length;
467
+ run.points.forEach(function (p, i) {
468
+ if (!Number.isFinite(p[0]) || !Number.isFinite(p[1]) || !known) {
469
+ placed = false;
470
+ return;
471
+ }
472
+ var end = !run.closed && (i === 0 || i === n - 1);
473
+ var ratio = end ? capRatio : p[2] && mitred && n > 2
474
+ ? miterRatio(run.points[(i + n - 1) % n], p, run.points[(i + 1) % n], state.limit) : 1;
475
+ reach(state.m, p[0], p[1], half * ratio);
476
+ });
477
+ });
478
+ outline.loose.forEach(function (p) {
479
+ if (known && Number.isFinite(p[0]) && Number.isFinite(p[1]))
480
+ reach(state.m, p[0], p[1], half);
481
+ else
482
+ placed = false;
483
+ });
484
+ }
485
+ if (!self)
486
+ stack.push(state);
487
+ return tag;
488
+ });
489
+ var grown = [Math.floor(low[0] * ROOM_PRECISION) / ROOM_PRECISION, Math.floor(low[1] * ROOM_PRECISION) / ROOM_PRECISION];
490
+ var far = [Math.ceil(high[0] * ROOM_PRECISION) / ROOM_PRECISION, Math.ceil(high[1] * ROOM_PRECISION) / ROOM_PRECISION];
491
+ if (!placed || (grown[0] >= box[0] && grown[1] >= box[1] && far[0] <= box[0] + box[2] && far[1] <= box[1] + box[3]))
492
+ return svg;
493
+ var x = Math.min(box[0], grown[0]);
494
+ var y = Math.min(box[1], grown[1]);
495
+ var w = Math.round((Math.max(box[0] + box[2], far[0]) - x) * ROOM_PRECISION) / ROOM_PRECISION;
496
+ var h = Math.round((Math.max(box[1] + box[3], far[1]) - y) * ROOM_PRECISION) / ROOM_PRECISION;
497
+ // The canvas keeps its scale: the root's width and height grow by the share its viewBox does.
498
+ var head = root[0].replace(/\sviewBox="[^"]*"/, ' viewBox="' + x + " " + y + " " + w + " " + h + '"')
499
+ .replace(/\s(width|height)="([\d.]+)"/g, function (all, key, value) {
500
+ var share = key === "width" ? w / box[2] : h / box[3];
501
+ return " " + key + '="' + Math.round(Number(value) * share * ROOM_PRECISION) / ROOM_PRECISION + '"';
502
+ });
503
+ return svg.slice(0, root.index) + head + body;
504
+ }
505
+
506
+ // Pele's SVG with every value concrete, rewritten into the subset Qt SVG and the GPUI renderer both draw, then checked.
507
+ export function postMermaid(svg, t) {
508
+ var out = lineTexts(iconGroups(rootFont(styleToAttributes(svg), t)));
509
+ // An icon draws in currentColor, which the root's text colour set before its style went.
510
+ out = inAttributes(out, function (value) { return value.split("currentColor").join(t.fg); });
511
+ out = accentMarks(out, t);
512
+ // A link and an image never ship: the bundle renders neither, and a stray one unwraps or goes.
513
+ out = out.replace(/<a\s[^<>]*>/g, "").replace(/<\/a>/g, "").replace(/<image\b[^<>]*\/?>/g, "");
514
+ // The layout pads its geometry by one unit, so a border wider than two units, a user style's, would be cut at the canvas edge.
515
+ out = strokeRoom(out);
516
+ var bad = checkSafe(out);
517
+ if (bad)
518
+ throw new Error("unsafe diagram: " + bad);
519
+ return out;
520
+ }
521
+
522
+ // A diagram's SVG through the bundle's entry point in `api`, or an Error whose message the caller shows.
523
+ export function renderFigure(kind, source, display, theme, api) {
524
+ if (kind !== "mermaid")
525
+ throw new Error("unknown figure kind");
526
+ if (source.length > MERMAID_LIMIT)
527
+ throw new Error("diagram over 32 KiB");
528
+ // The bundle takes the whole theme: its colour roles, its font and body size, and the font's own advance tables, so every label is sized from the font that is drawn.
529
+ return postMermaid(api.mermaidToSvg(source, theme), theme);
530
+ }
@@ -0,0 +1,23 @@
1
+ // The diagram Worker (src/figure.js starts it): Pele parses and lays out here, off the backend's
2
+ // own thread, so a slow layout never holds a listing, and a stuck one can be terminated.
3
+ // Requests are {id, source, theme}; answers are {id, svg} or {id, error}.
4
+ import { renderFigure } from "./figure-svg.js";
5
+
6
+ // An error's words on one bounded line, as the preview shows it under the diagram's source: a
7
+ // parse error's position, then what was expected; the caret line pointing at it is left out.
8
+ const ERROR_CHARS = 160;
9
+ const reasonOf = (error) => String(error?.message ?? error).split("\n")
10
+ .filter((line) => line.trim() && !/^[\s^~-]*$/.test(line)).join(" ").replace(/\s+/g, " ").slice(0, ERROR_CHARS) || "render failed";
11
+
12
+ // Load the wrapper and official Pele module on the first diagram, not at start.
13
+ let api = null;
14
+
15
+ self.onmessage = async ({ data }) => {
16
+ const { id, source, theme } = data;
17
+ try {
18
+ api ??= await import("./pele-wrapper.js");
19
+ postMessage({ id, svg: await renderFigure("mermaid", String(source), true, theme, api) });
20
+ } catch (error) {
21
+ postMessage({ id, error: reasonOf(error) });
22
+ }
23
+ };