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
package/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 GM
4
+ Copyright (c) 2026 Dr. John (醫者小智)
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in all
14
+ copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,512 @@
1
- # Temporary Holding Version
1
+ # flea-qml
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Flea QML is a cross-platform file manager written in Bun JavaScript & QML. It's an unofficial fork of [Flea](https://github.com/thisisgm/flea), the fast GUI file manager for Omarchy
4
+
5
+ > **Preserve the experience, simplify the implementation, extend the capabilities.**
6
+
7
+ - **Preserve the experience**: Flea's QML interface, its views, keys, cards, previews and wording, carried over
8
+ - **Simplify the implementation**: replace the Rust backend with Bun JavaScript, so the build step isn't mandatory anymore
9
+ - **Extend the capabilities**: run across platforms, on Windows, Linux and
10
+ Android, wherever a QML runtime and a JS engine do, including [buninu-browser](https://github.com/jjtseng93/buninu-browser)'s QML frontend.
11
+
12
+ > [!WARNING]
13
+ > Flea QML is still in early development. Features and APIs may be unstable and may change without notice.
14
+
15
+ ## Running it
16
+
17
+ 1. Install Bun first, then check that it is available on PATH:
18
+
19
+ ```sh
20
+ npm i -g bun
21
+ bun --version
22
+ ```
23
+
24
+ 2. Enter the [Buninu userspace](https://github.com/jjtseng93/buninu)
25
+
26
+ ```sh
27
+ # Run a server & open in a browser
28
+ bunx buninu
29
+
30
+ # Open in the current terminal
31
+ # Kitty graphics support is required if you want to show Flea QML inside it directly
32
+ bunx buninu --local
33
+
34
+ # Or do nothing in a @drxiaozhi/minapk Android App
35
+ ```
36
+
37
+ 3. Start Flea QML with npx or bunx:
38
+
39
+ ```sh
40
+ npx flea-qml
41
+ ```
42
+
43
+ Or, from the root of this repository:
44
+
45
+ ```sh
46
+ bun index.js
47
+ ```
48
+
49
+ The launcher queries Kitty graphics support.
50
+ When available it uses buninu-browser's default terminal frontend; otherwise
51
+ Windows uses `--win32`, and Linux/Android use `--wayland`.
52
+
53
+ A first argument starting with `--` (except the information options below) bypasses detection and is forwarded unchanged
54
+ to buninu-browser, which decides how to handle it. There is no frontend allowlist:
55
+
56
+ ```sh
57
+ npx flea-qml --casty
58
+ npx flea-qml --win32
59
+ npx flea-qml --wayland
60
+ npx flea-qml --headless
61
+ npx flea-qml --help
62
+ npx flea-qml --version
63
+ npx flea-qml --readme
64
+ ```
65
+
66
+ `--help`/`-h`, `--version`/`-V`, and `--readme` run locally without probing Kitty
67
+ or starting the browser. `--version` also shows the browser version pinned in
68
+ `package.json`. `--readme` always prints coloured ANSI Markdown with
69
+ links, including when its output is redirected.
70
+
71
+ When launched, Flea automatically spawns
72
+ [buninu-browser](https://github.com/jjtseng93/buninu-browser) to display its QML
73
+ interface. The browser version is pinned in `package.json` under
74
+ `scripts.browser`. The launcher reads the package
75
+ specification from this field, while still choosing npx, bunx or bun x as below.
76
+ Changing this field updates the requested version for all three launch methods;
77
+ clearing a cache does not change the pinned version.
78
+
79
+ To reinstall cached packages from scratch, see [Clearing package caches](#clearing-package-caches).
80
+
81
+ The browser receives the absolute, URL-escaped `file://` address of the bundled
82
+ `ui/boot/shell.qml`, including on Windows. Remaining arguments go to the browser.
83
+ Package launch order matches buninu-browser's Casty launcher: npx when both npx
84
+ and Bun are on PATH, then bunx, then `bun x` using Bun on PATH or the running Bun.
85
+ A missing Kitty response falls back after 800 ms; explicit selection skips the
86
+ probe. Wayland requires a running compositor. Other non-Windows platforms also
87
+ fall back to Wayland; no native macOS frontend is selected automatically.
88
+
89
+ The npm package is public and includes the full project, without a `files`
90
+ allowlist or project ignore rules (npm's mandatory exclusions still apply).
91
+
92
+ `FLEA_PATH=/some/folder` opens that folder first; for example, from this
93
+ checkout on Linux/Android:
94
+
95
+ ```sh
96
+ FLEA_PATH="$PWD/demos" bun index.js
97
+ ```
98
+
99
+ For development, you can also launch a browser checkout directly from this
100
+ repository root, with a Wayland compositor running:
101
+
102
+ ```sh
103
+ bun ../buninu-browser/index.js --quickshell-wayland -p ui/boot/shell.qml
104
+ ```
105
+
106
+ ## Keyboard shortcuts
107
+
108
+ These are the implemented bindings for the **default** key preset. Letters are
109
+ case-sensitive (`H` means Shift+H). Listing shortcuts apply when the file list
110
+ has focus, not while typing in a text field. Other presets can change bindings;
111
+ press `?` to view or search the current keymap. A terminal, compositor or browser
112
+ frontend may intercept a shortcut before Flea receives it.
113
+
114
+ ### Navigation and views
115
+
116
+ | Keys | Action |
117
+ | --- | --- |
118
+ | Up / Down, `k` / `j` | Move through files |
119
+ | Home / End, `g` / `G` | First / last file |
120
+ | PageUp / PageDown | Move by half the visible rows |
121
+ | Left, Backspace, `h` | Parent folder |
122
+ | Right, `l` | Enter a folder or preview a file |
123
+ | Enter | Open the selected item |
124
+ | `H` / `L` | Back / forward in navigation history |
125
+ | `:` | Edit the folder address |
126
+ | Ctrl+1 / Ctrl+2 / Ctrl+3 / Ctrl+4 | List / columns / grid / dual-pane view |
127
+ | `t` | New Flea tab |
128
+ | Ctrl+Enter | Open the selected folder in a tab |
129
+ | `w`, Ctrl+W | Close the current tab |
130
+ | `[` / `]`, Ctrl+PageUp / Ctrl+PageDown | Previous / next tab |
131
+ | `{` / `}`, Ctrl+Shift+PageUp / Ctrl+Shift+PageDown | Move the current tab left / right |
132
+ | Tab / Shift+Tab | Move focus between available interface areas |
133
+ | Ctrl+B | Toggle the sidebar |
134
+ | `.`, Ctrl+Shift+. | Show / hide hidden files |
135
+ | `s` / `S` | Change sort field / reverse sort order |
136
+ | F4 | Fit list columns to their contents |
137
+ | F5, Ctrl+R | Reload the folder |
138
+ | Ctrl++ / Ctrl+- / Ctrl+0 | Increase / decrease / reset text size (Ctrl+Shift variants also work) |
139
+ | `,`, Ctrl+, | Open settings |
140
+ | `?` | Open the searchable keymap |
141
+
142
+ Enter on an ordinary file invokes `xdg-open` from PATH on every platform,
143
+ including Windows. Install or provide an `xdg-open` command there; Flea does not
144
+ substitute a platform-specific opener. Folders navigate inside Flea and archives
145
+ open the built-in preview (except AppImage). Space uses the built-in preview.
146
+
147
+ ### Selection and file operations
148
+
149
+ | Keys | Action |
150
+ | --- | --- |
151
+ | `v` | Toggle the current file's selection |
152
+ | Shift+Up / Shift+Down, `K` / `J` | Extend the selection |
153
+ | Ctrl+A | Select all |
154
+ | `V` | Invert the selection |
155
+ | `y`, Ctrl+C | Copy selected files |
156
+ | `x`, Ctrl+X | Cut selected files |
157
+ | `p`, Ctrl+V | Paste files into the current folder |
158
+ | `Y` | Copy the current folder's path |
159
+ | Ctrl+Shift+C | Copy selected file paths |
160
+ | `c` / `P` | Open Copy as / Paste as options |
161
+ | `r`, F2 | Rename; multiple selected files open Bulk rename |
162
+ | Ctrl+Shift+N | Create a folder |
163
+ | Delete, `dd` (press `d` twice) | Move to Trash; in Trash, request permanent deletion |
164
+ | Shift+Delete | Request permanent deletion with confirmation |
165
+ | `=`, Alt+= | Calculate selected/current folders' sizes / all folders' sizes |
166
+ | `m`, Menu, Shift+F10 | Open the item's context menu |
167
+
168
+ ### Find and Filter
169
+
170
+ | Keys | Action |
171
+ | --- | --- |
172
+ | `/` | Filter the current listing by name |
173
+ | `f`, Ctrl+F | Open Find |
174
+ | Ctrl+G | Search file contents; in Find, toggle name/content search |
175
+ | Enter in Find | Start the search |
176
+ | Tab / Shift+Tab in Find | Cycle the search scope |
177
+ | Enter in Filter | Return to the list with the filter applied |
178
+ | Up / Down, PageUp / PageDown in a query | Navigate results |
179
+ | `o` in results | Reveal the current item in its containing folder |
180
+ | Esc in Filter | Close Filter |
181
+ | Esc in Find | Stop a running search; when idle, close Find |
182
+ | Esc in the file list | Dismiss Filter first, then Find on a subsequent press |
183
+
184
+ Find and Filter keep their own text-editing focus. Left/Right move the caret;
185
+ clicking the query returns focus to its input. When either query owns focus,
186
+ Esc acts on that query rather than the other one.
187
+
188
+ ### Preview and Quick Look
189
+
190
+ | Keys | Action |
191
+ | --- | --- |
192
+ | Space on a file | Open Quick Look |
193
+ | Space / Esc in Quick Look | Close it (Space does not pause media) |
194
+ | Alt+P | Toggle the preview column |
195
+ | Ctrl+Space | Load the selection's preview |
196
+ | Ctrl+Tab | Focus the preview column; from Quick Look, close Quick Look |
197
+ | `i` | Toggle file facts in the visible preview column |
198
+ | Up / Down, `k` / `j` in Quick Look | Preview the previous / next file |
199
+ | PageUp / PageDown, `B` / `F` | Scroll the preview by a page |
200
+ | `B` / `F` in the file list | Scroll the preview column by a page |
201
+ | `w` in text/code Quick Look | Toggle line wrapping |
202
+ | `r` in document Quick Look | Switch between rendered document and source |
203
+ | `p` in media Quick Look | Play / pause |
204
+ | `m` in media Quick Look | Mute / unmute |
205
+ | Left / Right in media Quick Look | Seek backward / forward by 5 seconds |
206
+ | Left / Right in PDF preview | Previous / next PDF page |
207
+ | `-` / `+` in image, HTML or PDF Quick Look | Zoom out / in |
208
+ | `0` in image Quick Look | Fit the image |
209
+ | `e` in PDF Quick Look | Toggle expanded view |
210
+ | `y` in Compare Quick Look | Copy the diff patch |
211
+
212
+ ### Extracting archives
213
+
214
+ Both Quick Look and the right preview column offer **Extract to Folder** and
215
+ **Extract here** for ZIP, TAR, TAR.GZ/TGZ and TAR.ZST/TZST archives. Extract to
216
+ Folder uses the archive name without its extension; existing destinations get
217
+ ` copy`, ` copy 2`, and so on. Extract here places the contents beside the archive
218
+ and asks for confirmation when the archive contains more than five top-level items
219
+ (files and directories; nested contents count only toward their top-level folder). Cancel is the default.
220
+ Existing items are kept: colliding names get a copy suffix, and existing folders
221
+ are not merged. Work is prepared under a hidden unique name at the destination,
222
+ not in the system temporary directory, so publication stays on the same filesystem.
223
+
224
+ ### Menus and dialogs
225
+
226
+ Use Up/Down (or `k`/`j`) to choose a menu row, Right/`l` to enter a submenu,
227
+ Left/`h` to return, Enter to activate, and Esc to dismiss. In Copy as, `p`, `n`,
228
+ `e`, `f`, `u`, and `s` select path, name, stem, folder path, URI, and shell-quoted
229
+ path respectively. Tab/Shift+Tab move between dialog controls; text fields keep
230
+ normal caret, selection, copy and paste editing.
231
+
232
+ ## Runtime and supported features
233
+
234
+ The repository aims to be self-contained, needing only buninu-browser to run.
235
+ The backend reads no system database; the one system file it reads is Linux's
236
+ mount table, for a folder's filesystem name. For the clipboard it speaks
237
+ Wayland data-control itself, loading only libc (kernel32 on Windows) to pass
238
+ file descriptors. Without a usable Wayland data-control connection, the QML
239
+ frontend uses Quickshell's text clipboard instead (buninu-browser prefers xclip,
240
+ then its existing platform fallbacks). Paste reads it on demand, with no polling.
241
+ File paths keep their POSIX single-quoted form on every platform, including
242
+ Windows; a cut adds `""` at both ends. This is a text representation of the file
243
+ selection, not Android's native file clipboard. Syntax highlighting runs
244
+ [jsmdcui](https://github.com/jjtseng93/jsmdcui), for syntax colours in previews,
245
+ found beside this repository as `../jsmdcui` or on PATH as `jmi` or `jsmdcui`;
246
+ without it previews are plain text. Compare also runs `diff` through bunmsh or
247
+ a system provider, as described below. Some interface
248
+ code carried over from upstream and Omarchy still asks Linux tools such as
249
+ `hyprctl`, `lsblk` and `fc-match`, and does without them where they are missing.
250
+
251
+ Ported so far: the backend's `list`, `window`, `sort`, `fsinfo`, `peek`,
252
+ `meta`, `code`, `clipSet`, `clipGet`, `clipClear`, `clipWatch`, `collisions`, `mergecollisions`,
253
+ `transfer`, `transfercancel`, `trash`, `trashbrowse`, `menuaction` (selection snapshots and permanent-delete confirmation),
254
+ `mkdir`, `newfile`, `duplicate`, `bulkrename`, `permissions`, `permissionsBatch`, `formats`, `archive` and `quit`, and `flea --ui-state`, which keeps
255
+ `~/.local/state/flea/ui.json` the way upstream does. A transfer copies and moves
256
+ files, folders and links and answers keep, skip, refuse, replace and merge; it has no undo yet,
257
+ and refuses special files. Replace moves the item already there to flea's Trash first and puts it
258
+ back when the transfer fails; merge folds a folder into the folder already there, asking once
259
+ about the names both hold. Other requests and `flea`
260
+ modes are not ported yet; the interface reports them as failed, as with an
261
+ unreachable backend.
262
+ Setting `FLEA_BIN` to upstream's `flea` binary uses it instead, for what is
263
+ not ported yet.
264
+
265
+ Archive previews list ZIP, tar, tar.gz/tgz and tar.zst/tzst without loading the
266
+ whole archive into memory.
267
+
268
+ Compress writes `.zip`, `.tar`, `.tar.gz` and `.tar.zst`, and Extract reads the
269
+ same four, in JavaScript with `node:zlib`; no `bsdtar` or `7z` runs. Both stream
270
+ member data, work under a hidden `.flea-work-*` name beside the result and publish
271
+ it under the first free name (`pack.zip`, `pack copy.zip`, ...), so a failed or
272
+ cancelled run leaves nothing under a real name. Extraction refuses absolute and
273
+ `..` member names and any member that would be written through a link, applies the
274
+ umask to stored modes, and copies a tar hard-link member's bytes instead of
275
+ linking. Passwords, `.7z`, `.rar`, `.tar.xz`, `.tar.bz2`, packages and the
276
+ free-space check are not ported; those are refused with a sentence.
277
+
278
+ New folder, New file, Duplicate, Bulk rename and Permissions follow upstream's
279
+ rules: names are bare (no separator or NUL), creations are exclusive, a bulk rename
280
+ is checked whole before anything moves and swaps through temporary names, and a
281
+ permissions batch changes every item or puts back what it changed. None of these
282
+ is in an undo journal yet. File tags (`settags`, `tagstates`) are not ported. Compressed tar member data is streamed and discarded;
283
+ metadata records over 1 MiB and malformed or truncated archives are rejected.
284
+ Keyboard hints are enabled by default; an explicitly saved disabled setting is
285
+ preserved.
286
+
287
+ ## Where it comes from
288
+
289
+ `ui/` started as upstream's `ui/`, exported from
290
+ [`thisisgm/flea@73f3c23`](https://github.com/thisisgm/flea/commit/73f3c23971106f6d47f78bd758f783af3e5b5c78)
291
+ (0.4.0 plus 7 commits). Upstream has since moved its window to GPUI and no
292
+ longer launches this interface; this fork keeps it as the frontend. Changes
293
+ so far:
294
+
295
+ - A row's icon is the emoji the backend sends; language logos give way to it.
296
+ - The interface runs this repository's `src/flea.js` (`ui/js/FleaBin.js`)
297
+ instead of a `flea` on PATH.
298
+ - Upstream's links to `/usr/share/omarchy/shell` are replaced by a copy of the
299
+ two Omarchy QML modules the interface imports, `ui/boot/Commons` and
300
+ `ui/boot/Ui`, from
301
+ [`omacom/omarchy@3c7027d`](https://github.com/omacom/omarchy/commit/3c7027db2a4fa9fa6a49d7af7f87c27ac48e677d).
302
+ - Markdown formulas are set as MathML by Temml (`src/mathml.js`), and Mermaid
303
+ diagrams are drawn by the backend (`src/figure.js`: Pele in a Bun Worker, one
304
+ diagram at a time under a deadline). The HTML preview embeds each diagram as an
305
+ SVG picture; the block view asks the backend for the same SVG. Upstream's
306
+ sandboxed quickjs figure helper and its figure cache are not used.
307
+
308
+ ## Layout
309
+
310
+ | Path | What it is |
311
+ | --- | --- |
312
+ | `ui/` | The QML interface and its JS libraries |
313
+ | `ui/boot/Commons`, `ui/boot/Ui` | Omarchy's `Commons` (theme, colours) and `Ui` (panels, dialogs) modules, where `import qs.Commons` finds them: Quickshell's `qs` is the folder `shell.qml` sits in |
314
+ | `src/flea.js` | The `flea` the interface runs; `--backend` answers `ui/Backend.qml` |
315
+ | `src/` (rest) | The backend: listing, ordering, kinds and emoji, filesystem facts |
316
+ | `docs/protocol.md` | Upstream's description of the backend line protocol |
317
+ | `demos/` | One file for every emoji a row can show, and `math-and-diagrams.md` for formulas and Mermaid |
318
+
319
+ ## Sidebar places
320
+
321
+ Sidebar places are found by looking, not read from `user-dirs.dirs` alone or
322
+ asked of `lsblk`: a standard folder (Desktop, Downloads, Documents, Pictures,
323
+ Camera, Screenshots, Music, Videos) is listed once it directly holds a file,
324
+ every system lists its temporary folder, and DEVICES adds each root that can be
325
+ listed (`/`, or the drive letters on Windows) and what is mounted under
326
+ `/Volumes`, `/media` and `/run/media`. Android, recognised by
327
+ `/system/bin/linker64`, always lists `/sdcard` and `/sdcard/Download`, and an
328
+ app whose `$TMPDIR` lies in its private folder also gets that folder and
329
+ `/sdcard/Android/media/PACKAGE`. The backend looks again every five seconds
330
+ only while a sidebar is shown; see `docs/protocol.md` "flea-qml probed places".
331
+
332
+ ## Deleting files
333
+
334
+ Trash uses the ordinary file pane: Space opens Quick Look, `/` filters,
335
+ and the existing selection, sorting, copy/cut and folder navigation work on
336
+ its real files. The toolbar adds Restore, Restore all and Empty Trash; deletion
337
+ still requires confirmation. Original locations and deletion dates are shown.
338
+ Returning from a trashed folder restores the Trash collection. Moving a file
339
+ out removes its `.trashinfo`; copying leaves it intact. Renaming updates its
340
+ restoration name and refuses collisions.
341
+
342
+ Trash is a virtual collection across volumes, not a writable directory: open
343
+ a real folder before pasting, creating files or using recursive Find (`f`).
344
+ Filter works directly on the collection. This does not add backend features
345
+ that are otherwise unimplemented (for example bulk rename or undo).
346
+
347
+ `bun test/manual-trash-ui.mjs` exercises the shared pane with the sibling
348
+ buninu-browser, isolated HOME/XDG fixtures, preview, filtering, folder Back,
349
+ selected restore, and deletion review/cancellation. It never activates Empty
350
+ Trash, since mounted-volume trash can exist outside those isolated directories.
351
+
352
+ Move to Trash uses freedesktop-style `Trash/files` and `Trash/info`, without
353
+ invoking `gio`. Windows also uses this private Trash folder, not the Windows
354
+ Recycle Bin. Cross-filesystem copies are not attempted: an unusable Trash leaves
355
+ the source in place. Trash browsing, restore and confirmed permanent deletion/emptying
356
+ are supported; undo is not yet ported. Restore refuses an occupied destination.
357
+ The backend discovers home and mounted-volume Trash folders and remembers the
358
+ per-drive folders it has used. Sidebar counts use filesystem watches with a
359
+ five-second reconciliation for newly available volumes, without GIO processes.
360
+ Same-count replacements also refresh the listing. Deletion reviews reuse the
361
+ bounded, non-following tree checks below, including descendant changes and
362
+ single-use confirmation tokens; cancelling invalidates the review.
363
+
364
+ Permanent deletion requires a fresh confirmation token. Changes to the reviewed
365
+ tree invalidate it; refresh reviews only the originally selected paths. Reviews
366
+ refuse filesystem roots, cross-device subtrees, unreadable entries, and trees
367
+ exceeding 100,000 entries or the two-second walk budget. Review failures never
368
+ pretend to be complete totals. Path-based filesystem checks do not provide
369
+ atomic protection against concurrent renames by other processes.
370
+
371
+ ## The clipboard
372
+
373
+ Copied files are offered the way other file managers read them
374
+ (`text/uri-list`, GNOME's and KDE's forms) and, as plain text, shell-quoted on
375
+ one line, so a paste into a shell is ready to use:
376
+
377
+ ```sh
378
+ '/home/a/file a' '/home/a/it'\''s' # copied
379
+ ""'/home/a/file a' '/home/a/it'\''s'"" # cut: the same words between two empty ""
380
+ ```
381
+
382
+ There is no clipboard daemon: the backend owns the selection and gives it up
383
+ when it exits. The plain text is what a compositor such as buninu-land keeps
384
+ after that, so a later Flea still reads it back as a copy or a cut, as long as
385
+ every path in it exists.
386
+
387
+ Text-only Copy as and share links use the QML runtime's clipboard. Query-field
388
+ paste accepts either synchronous Quickshell text or buninu-browser's asynchronous
389
+ host clipboard read. These operations do not require `wl-copy`.
390
+
391
+ ## Clearing package caches
392
+
393
+ To reinstall cached packages from scratch:
394
+
395
+ ```sh
396
+ # npm 11 or later: list the cache keys and their packages
397
+ npm cache npx ls
398
+
399
+ # Use the keys from your own listing for flea-qml, buninu-browser or Casty.
400
+ # The package specification (including its version) affects the key.
401
+ npm cache npx rm FLEA_KEY BROWSER_KEY CASTY_KEY
402
+
403
+ # Or clear all npx packages, including other tools
404
+ npm cache npx rm --force
405
+
406
+ # For packages launched through bunx or bun x
407
+ bun pm cache rm
408
+ ```
409
+
410
+ With an older npm, delete the npx cache directory: `~/.npm/_npx`
411
+ (Windows: `%LocalAppData%\npm-cache\_npx`).
412
+
413
+ ## Tests
414
+
415
+ Run `bun test test` for archive bounds, menu identity/transfer lifetime and
416
+ clipboard tests. Fixtures are generated in temporary directories and removed
417
+ afterward; no compositor is required.
418
+
419
+ ## License
420
+
421
+ MIT, as upstream. See [LICENSE](LICENSE): GM's copyright notice for Flea is
422
+ kept, followed by Dr. John's (醫者小智) for this fork.
423
+
424
+ The tree also carries Omarchy's QML modules, Lucide icon geometry, Temml (with
425
+ mhchem), Pele, and simple-icons and markdown-mark logos, each under its own licence;
426
+ see [THIRD-PARTY-NOTICES.md](THIRD-PARTY-NOTICES.md).
427
+
428
+ ### Preview fallback and syntax audit
429
+
430
+ Unknown file types are previewed as text. Local text previews read at most the
431
+ first 1 MiB, replace binary control bytes with visible control pictures, and split
432
+ lines longer than 4096 characters to bound text layout work. Large files and binary
433
+ content use plain text; a notice in the preview indicates truncation or line splitting.
434
+ Failed image, media, or document previews leave the content area blank.
435
+
436
+ To audit syntax colours using a jsmdcui checkout (HTML is excluded):
437
+
438
+ ```sh
439
+ bun test/manual-syntax-preview.mjs ../jsmdcui
440
+ ```
441
+
442
+ The script discovers `runtime/syntax/*.yaml`, uses that checkout's
443
+ `tests/syntax-parity/samples`, and runs four jobs at a time. It checks explicit
444
+ language highlighting separately from Flea's automatic file preview. The detailed
445
+ report is `flea-syntax-results.json` in the system temporary directory.
446
+
447
+ The current 158 definitions contain three HTML variants, which are skipped.
448
+ All remaining 155 produce colour with an explicit filetype; 149 have verified
449
+ automatically selected, coloured Flea text previews. Markdown normally uses a
450
+ rendered document instead of source colouring. `default`, V and Jinja2 have no
451
+ filename detector; Objective-C shares extensions with other languages; Privoxy's
452
+ config detector requires a directory although jsmdcui matches the basename.
453
+ These are detection limitations, not missing colour rules. The lexical samples
454
+ prove colour reaches the preview backend, not exhaustive syntax correctness or a
455
+ visual check of every language.
456
+
457
+ Flea additionally recognizes V function declarations in the first 64 KiB of `.v`
458
+ files and requests `-filetype v`. Comments and strings are ignored; a Verilog
459
+ `endmodule` keeps the normal detector. Ambiguous files without such evidence keep
460
+ jsmdcui's existing detection. This hint is implemented in Flea, not jsmdcui.
461
+ To explicitly request a language from jsmdcui yourself, use **one dash**:
462
+
463
+ ```sh
464
+ bun ../jsmdcui/src/index.js --cat --edit -filetype v /path/to/main.v
465
+ # Or, with the installed launcher:
466
+ jmi --cat --edit -filetype v /path/to/main.v
467
+ ```
468
+
469
+ The value is the YAML definition's `filetype`, not necessarily its filename or
470
+ extension. Flea's internal `highlightFile(path, signal, filetype)` forwards this
471
+ setting as separate arguments; failures still fall back to plain text.
472
+
473
+ The Trash address bar displays `trash:///`. Enter `trash:/`, `trash://`, or
474
+ `trash:///` to open the same collection as the sidebar. These root addresses are
475
+ UI aliases only: stored paths, preview readers, restore and deletion are unchanged.
476
+ Trash item URIs and remote authorities are not supported by these aliases.
477
+
478
+ The bottom status bar shows the selected item's full name after the count/size.
479
+ With multiple marked items it shows the current cursor item; Trash uses its
480
+ original name. Long names scroll horizontally instead of being elided. Notices
481
+ and errors temporarily take priority over the name.
482
+
483
+ HTML previews rebuild a passive fragment with Bun's HTMLRewriter: only fixed
484
+ structural/text tags (including nested `div`) are emitted, never source attributes.
485
+ Text's literal angle brackets are escaped; scripts, styles, embedded documents,
486
+ SVG and MathML subtrees are omitted. No source CSS, images or links are loaded.
487
+ The result uses QML RichText with the current theme and local text reflow, rather
488
+ than an external browser screenshot. Source view remains available. HTML reads
489
+ are limited to 1 MiB; larger documents keep the existing plain-text preview path.
490
+
491
+ `bun test test/html-preview.test.js` tests rebuilding and bounded reads.
492
+ With sibling buninu-browser available,
493
+ `bun test/manual-html-security.mjs` checks adversarial fragments in a live page
494
+ using a harmless script counter, and `bun test/manual-html-ui.mjs` checks the real
495
+ backend/QML preview and scrolling. These are regression checks, not a proof
496
+ against every possible parser discrepancy. Never decode the rebuilt fragment's
497
+ entities before parsing it as HTML.
498
+
499
+
500
+ Compare two marked regular files with **m → Compare**. The backend searches
501
+ for the sibling `../bunmsh/index.js` first, then `bunmsh` on PATH, invoking
502
+ `bunmsh -cc builtin diff` (with Bun before the sibling entry). Finally it tries
503
+ `Bun.which("diff")`. All providers receive `-u --label A --label B -- A B`
504
+ as separate arguments, without shell interpolation. Providers that cannot run
505
+ or lack unified support fall back to the next candidate.
506
+
507
+ Comparison retains upstream's 1 MiB per-file limit and binary screening, caps
508
+ patch output at 8 MiB, and terminates a diff after 10 seconds. A superseded
509
+ comparison is cancelled and its reply discarded. Requires a bunmsh version
510
+ with unified diff support or a compatible system diff. Test with
511
+ `bun test test/compare.test.js`; with sibling buninu-browser available,
512
+ `bun test/manual-compare-ui.mjs` checks the real backend and Compare view.
@@ -0,0 +1,29 @@
1
+ # Third-party notices
2
+
3
+ flea-qml is MIT licensed; see [LICENSE](LICENSE). It carries the following
4
+ work by others, each under its own licence, kept beside it in this tree.
5
+
6
+ | Component | Where | Licence | Text |
7
+ | --- | --- | --- | --- |
8
+ | [Flea](https://github.com/thisisgm/flea), GM | `ui/`, `docs/protocol.md`, `src/pele-wrapper.js` wrapper and diagram test fixtures; `src/order.js` ports its name order | MIT | [LICENSE](LICENSE) |
9
+ | [Omarchy](https://github.com/omacom/omarchy) `shell/Commons` and `shell/Ui`, David Heinemeier Hansson | `ui/boot/Commons/`, `ui/boot/Ui/` | MIT | [ui/boot/LICENSE-omarchy](ui/boot/LICENSE-omarchy) |
10
+ | [Lucide](https://github.com/lucide-icons/lucide) icon geometry, some derived from Feather | `ui/js/Icons.js` | ISC; MIT for the Feather-derived icons | [ui/js/LICENSES/ISC-lucide.txt](ui/js/LICENSES/ISC-lucide.txt) |
11
+ | [Pele](https://github.com/obsidianmd/pele) 1.6.0 | `src/vendor/pele.js`, official npm `dist/pele.js`, unchanged (see [source and wrapper notes](docs/pele.md)) | MIT | [src/vendor/LICENSES/MIT-pele.txt](src/vendor/LICENSES/MIT-pele.txt) |
12
+ | [Mermaid](https://github.com/mermaid-js/mermaid) documentation examples, via Pele and Flea | `test/fixtures/pele-parity.json` | MIT | [src/vendor/LICENSES/MIT-mermaid.txt](src/vendor/LICENSES/MIT-mermaid.txt) |
13
+ | [Temml](https://github.com/ronkok/Temml) 0.14.0, Ron Kok | `src/vendor/temml.mjs`: the npm package's `dist/temml.mjs`, unchanged (SHA-256 `09e55a0c364d35b8ef66be49486b90884240a7e66c463a825e096faf27b0d59d`) | MIT | [src/vendor/LICENSES/MIT-temml.txt](src/vendor/LICENSES/MIT-temml.txt) |
14
+ | [KaTeX](https://github.com/KaTeX/KaTeX), Khan Academy and contributors | inherited implementation within `src/vendor/temml.mjs` | MIT | [MIT-katex.txt](src/vendor/LICENSES/MIT-katex.txt), [historical licence](src/vendor/LICENSES/MIT-katex-2015.txt) |
15
+ | [Perseus](https://github.com/Khan/perseus), Khan Academy, via KaTeX | `findEndOfMath` within `src/vendor/temml.mjs` | MIT | [MIT-perseus.txt](src/vendor/LICENSES/MIT-perseus.txt); [provenance limits](docs/temml.md#katex-and-perseus) |
16
+ | [React](https://github.com/facebook/react/tree/v0.3.0), Facebook | `hyphenate` and `escape` adaptations within `src/vendor/temml.mjs` | Apache-2.0, as credited by Temml | [Apache-2.0.txt](src/vendor/LICENSES/Apache-2.0.txt); [historical sources](docs/temml.md#react-utilities) |
17
+ | [mhchem](https://mhchem.github.io/MathJax-mhchem/) 3.3.0 (The MathJax Consortium, Martin Hensel) and Kolen Cheung's MathJax extension, as adapted inside Temml | within `src/vendor/temml.mjs` | Apache-2.0 | [src/vendor/LICENSES/Apache-2.0.txt](src/vendor/LICENSES/Apache-2.0.txt) |
18
+ | [Wayland](https://gitlab.freedesktop.org/wayland/wayland) `wayland.xml`, Kristian Høgsberg, Intel Corporation, Collabora | `src/wayland/protocols/` | MIT | inside the file |
19
+ | [wayland-protocols](https://gitlab.freedesktop.org/wayland/wayland-protocols) `ext-data-control-v1.xml` and [wlr-protocols](https://gitlab.freedesktop.org/wlroots/wlr-protocols) `wlr-data-control-unstable-v1.xml`, Simon Ser, Ivan Molodetskikh, Neal Gompa | `src/wayland/protocols/` | MIT-style | inside each file |
20
+ | [simple-icons](https://github.com/simple-icons/simple-icons) logo geometry | `ui/js/LangMarkPaths.js` | CC0 1.0 | none required |
21
+ | [markdown-mark](https://github.com/dcurtis/markdown-mark), Dustin Curtis | the Markdown mark in `ui/js/Icons.js` | CC0 1.0 | none required |
22
+
23
+ `src/wayland/` adapts buninu-browser's Wayland transport (MIT, Dr. John, as
24
+ [LICENSE](LICENSE)); the XML files are unchanged.
25
+
26
+ The language marks drawn from simple-icons remain their owners' trademarks.
27
+
28
+ See [Temml source and inherited notices](docs/temml.md) for the verified
29
+ distribution checksum, historical references and attribution limits.
package/demos/App.java ADDED
@@ -0,0 +1,5 @@
1
+ public class App {
2
+ public static void main(String[] args) {
3
+ System.out.println("Hello from Java");
4
+ }
5
+ }
@@ -0,0 +1,4 @@
1
+ FROM oven/bun:1-alpine
2
+ WORKDIR /app
3
+ COPY app.js .
4
+ CMD ["bun", "app.js"]
package/demos/Main.kt ADDED
@@ -0,0 +1,3 @@
1
+ fun main() {
2
+ println("Hello from Kotlin")
3
+ }
@@ -0,0 +1 @@
1
+ System.Console.WriteLine("Hello from C#");
@@ -0,0 +1,12 @@
1
+ # Demos
2
+
3
+ One file for **every emoji** a row can show.
4
+
5
+ - Folders, links and programs
6
+ - Documents, media and archives
7
+ - Source code in a dozen languages
8
+
9
+ ```js
10
+ const greeting = "Hello from a code block";
11
+ console.log(greeting);
12
+ ```
package/demos/app.dart ADDED
@@ -0,0 +1,3 @@
1
+ void main() {
2
+ print('Hello from Dart');
3
+ }
package/demos/app.deb ADDED
Binary file
package/demos/app.js ADDED
@@ -0,0 +1 @@
1
+ console.log("Hello from JavaScript");
Binary file
Binary file
package/demos/build.sh ADDED
@@ -0,0 +1,2 @@
1
+ #!/bin/sh
2
+ echo "Hello from shell"
Binary file
package/demos/clip.mp4 ADDED
Binary file
Binary file
package/demos/disk.iso ADDED
Binary file
@@ -0,0 +1,5 @@
1
+ #include <iostream>
2
+
3
+ int main() {
4
+ std::cout << "Hello from C++\n";
5
+ }
Binary file
@@ -0,0 +1,4 @@
1
+ {
2
+ description = "flea-qml demo";
3
+ outputs = { self }: { };
4
+ }
@@ -0,0 +1 @@
1
+ A file inside the folder.
package/demos/font.ttf ADDED
Binary file
@@ -0,0 +1,5 @@
1
+ <!doctype html>
2
+ <html>
3
+ <head><title>Demo</title></head>
4
+ <body><h1>Hello from HTML</h1></body>
5
+ </html>