flea-qml 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (625) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +478 -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 +402 -0
  51. package/src/archiveops.js +697 -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 +129 -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/transfer.js +669 -0
  82. package/src/trash-record.js +41 -0
  83. package/src/trash.js +210 -0
  84. package/src/trashbrowse.js +326 -0
  85. package/src/uistate.js +393 -0
  86. package/src/uistore.js +168 -0
  87. package/src/vendor/LICENSES/Apache-2.0.txt +202 -0
  88. package/src/vendor/LICENSES/MIT-katex-2015.txt +27 -0
  89. package/src/vendor/LICENSES/MIT-katex.txt +21 -0
  90. package/src/vendor/LICENSES/MIT-mermaid.txt +21 -0
  91. package/src/vendor/LICENSES/MIT-pele.txt +40 -0
  92. package/src/vendor/LICENSES/MIT-perseus.txt +18 -0
  93. package/src/vendor/LICENSES/MIT-temml.txt +21 -0
  94. package/src/vendor/pele.js +145 -0
  95. package/src/vendor/temml.mjs +14708 -0
  96. package/src/watch.js +98 -0
  97. package/src/wayland/client.js +109 -0
  98. package/src/wayland/protocol.js +55 -0
  99. package/src/wayland/protocols/ext-data-control-v1.xml +276 -0
  100. package/src/wayland/protocols/wayland.xml +3248 -0
  101. package/src/wayland/protocols/wlr-data-control-unstable-v1.xml +278 -0
  102. package/src/wayland/resource-io.js +6 -0
  103. package/src/wayland/socket-discovery.js +26 -0
  104. package/src/wayland/transport-posix.js +120 -0
  105. package/src/wayland/transport-win32.js +11 -0
  106. package/src/wayland/transport.js +3 -0
  107. package/src/wayland/win32-resources.js +80 -0
  108. package/src/wayland/win32-wire.js +62 -0
  109. package/test/archive.test.js +80 -0
  110. package/test/bench-markdown-scroll.mjs +190 -0
  111. package/test/clip-host.test.js +113 -0
  112. package/test/code-preview.test.js +35 -0
  113. package/test/compare-ui-paths.test.js +24 -0
  114. package/test/compare.test.js +54 -0
  115. package/test/delete-trash.test.js +67 -0
  116. package/test/dirsize.test.js +138 -0
  117. package/test/file-ops.test.js +241 -0
  118. package/test/find-contents.test.js +161 -0
  119. package/test/find-input.test.js +66 -0
  120. package/test/fixtures/pele-parity.json +1006 -0
  121. package/test/highlight-launcher.test.js +35 -0
  122. package/test/html-preview.test.js +22 -0
  123. package/test/input.test.js +15 -0
  124. package/test/keymap.test.js +26 -0
  125. package/test/language-icons.test.js +36 -0
  126. package/test/launcher.test.js +51 -0
  127. package/test/manual-code-scroll.mjs +28 -0
  128. package/test/manual-column-scroll.mjs +24 -0
  129. package/test/manual-compare-ui.mjs +20 -0
  130. package/test/manual-find-status.mjs +37 -0
  131. package/test/manual-html-security.mjs +23 -0
  132. package/test/manual-html-ui.mjs +30 -0
  133. package/test/manual-syntax-preview.mjs +26 -0
  134. package/test/manual-trash-ui.mjs +86 -0
  135. package/test/markdown-diagrams.test.js +93 -0
  136. package/test/markdown-html.test.js +105 -0
  137. package/test/mathml.test.js +92 -0
  138. package/test/menu-transfer.test.js +57 -0
  139. package/test/office-preview.test.js +154 -0
  140. package/test/pele-parity.test.js +28 -0
  141. package/test/places.test.js +134 -0
  142. package/test/preview-keys.test.js +60 -0
  143. package/test/preview-language.test.js +22 -0
  144. package/test/status-filename.test.js +20 -0
  145. package/test/transfer-replace-merge.test.js +187 -0
  146. package/test/trash-address.test.js +23 -0
  147. package/test/trash-view.test.js +37 -0
  148. package/test/trashbrowse.test.js +135 -0
  149. package/ui/AboutFacts.qml +78 -0
  150. package/ui/ArchiveCards.qml +68 -0
  151. package/ui/ArchiveCompressDialog.qml +378 -0
  152. package/ui/ArchivePasswordDialog.qml +257 -0
  153. package/ui/Backend.qml +771 -0
  154. package/ui/BulkOldNames.qml +47 -0
  155. package/ui/BulkRenameDialog.qml +380 -0
  156. package/ui/CardFrame.qml +67 -0
  157. package/ui/CardScroll.qml +79 -0
  158. package/ui/CheckBox.qml +73 -0
  159. package/ui/ChromeBar.qml +360 -0
  160. package/ui/ChromeButton.qml +131 -0
  161. package/ui/ChromeModes.qml +43 -0
  162. package/ui/CodeLines.qml +256 -0
  163. package/ui/CodeRefusal.qml +52 -0
  164. package/ui/CollideConfirm.qml +147 -0
  165. package/ui/CollideHost.qml +167 -0
  166. package/ui/ColumnPane.qml +523 -0
  167. package/ui/ColumnRow.qml +380 -0
  168. package/ui/ColumnsArea.qml +594 -0
  169. package/ui/ColumnsLanding.qml +147 -0
  170. package/ui/CompareView.qml +321 -0
  171. package/ui/ContextMenu.qml +743 -0
  172. package/ui/ConvertDialog.qml +456 -0
  173. package/ui/CountedWorker.qml +7 -0
  174. package/ui/Crumb.qml +64 -0
  175. package/ui/CrumbDrop.qml +25 -0
  176. package/ui/CsvTable.qml +394 -0
  177. package/ui/CursorMark.qml +41 -0
  178. package/ui/DefaultClaim.qml +130 -0
  179. package/ui/DeviceLock.qml +47 -0
  180. package/ui/DeviceMounts.qml +540 -0
  181. package/ui/DialogButton.qml +150 -0
  182. package/ui/DialogField.qml +147 -0
  183. package/ui/DialogHeader.qml +31 -0
  184. package/ui/DialogScrim.qml +20 -0
  185. package/ui/DialogTitle.qml +37 -0
  186. package/ui/Divider.qml +9 -0
  187. package/ui/DropInto.qml +126 -0
  188. package/ui/DropTarget.qml +35 -0
  189. package/ui/DropboxMark.qml +60 -0
  190. package/ui/EmptyState.qml +150 -0
  191. package/ui/EscapeHint.qml +11 -0
  192. package/ui/FactsTable.qml +54 -0
  193. package/ui/FastScrollHandler.qml +476 -0
  194. package/ui/FatNamesConfirm.qml +157 -0
  195. package/ui/Favourites.qml +143 -0
  196. package/ui/FigureService.qml +120 -0
  197. package/ui/FileDrag.qml +267 -0
  198. package/ui/FilterStrip.qml +133 -0
  199. package/ui/FitMetrics.qml +22 -0
  200. package/ui/FlashDriveRows.qml +137 -0
  201. package/ui/FlashHost.qml +72 -0
  202. package/ui/FlashImageRow.qml +104 -0
  203. package/ui/FlashRunner.qml +119 -0
  204. package/ui/FlashStepRow.qml +172 -0
  205. package/ui/FlashStrip.qml +38 -0
  206. package/ui/FlashView.qml +397 -0
  207. package/ui/FleaMark.qml +88 -0
  208. package/ui/FlyoutFade.qml +23 -0
  209. package/ui/FontPane.qml +170 -0
  210. package/ui/Glass.qml +114 -0
  211. package/ui/GlassTagger.qml +59 -0
  212. package/ui/Glyph.qml +64 -0
  213. package/ui/GlyphSolid.qml +22 -0
  214. package/ui/GridArea.qml +664 -0
  215. package/ui/GridTile.qml +325 -0
  216. package/ui/GvfsBridge.qml +164 -0
  217. package/ui/Header.qml +433 -0
  218. package/ui/HoverTimers.qml +39 -0
  219. package/ui/HtmlClip.qml +30 -0
  220. package/ui/HtmlPane.qml +63 -0
  221. package/ui/HyprlandMark.qml +45 -0
  222. package/ui/Ipc.qml +1005 -0
  223. package/ui/IpcControls.qml +7 -0
  224. package/ui/IpcMenuState.qml +48 -0
  225. package/ui/IpcPreviewState.qml +185 -0
  226. package/ui/JumpPath.qml +51 -0
  227. package/ui/KeymapSheet.qml +561 -0
  228. package/ui/KeymapSheetResult.qml +89 -0
  229. package/ui/KindStack.qml +40 -0
  230. package/ui/LangMark.qml +51 -0
  231. package/ui/LangMarkLoader.qml +26 -0
  232. package/ui/List.qml +480 -0
  233. package/ui/LoadingState.qml +54 -0
  234. package/ui/LocalSend.qml +56 -0
  235. package/ui/LocalSendMark.qml +73 -0
  236. package/ui/MarkdownBlockView.qml +311 -0
  237. package/ui/MarkdownBlocks.qml +35 -0
  238. package/ui/MarkdownFigure.qml +254 -0
  239. package/ui/MarkdownImages.qml +72 -0
  240. package/ui/MarkdownList.qml +81 -0
  241. package/ui/MarkdownMathsText.qml +97 -0
  242. package/ui/MarkdownPane.qml +83 -0
  243. package/ui/MarkdownPictures.qml +41 -0
  244. package/ui/MarkdownQuote.qml +52 -0
  245. package/ui/MarkdownRemote.qml +82 -0
  246. package/ui/MarkdownSource.qml +155 -0
  247. package/ui/MarkdownTable.qml +222 -0
  248. package/ui/MarkdownTableScroll.qml +64 -0
  249. package/ui/MarkdownTableWheel.qml +126 -0
  250. package/ui/MarkdownText.qml +87 -0
  251. package/ui/MarkdownWorker.js +132 -0
  252. package/ui/MatchText.qml +99 -0
  253. package/ui/MediaSession.qml +38 -0
  254. package/ui/MediaSound.qml +26 -0
  255. package/ui/MediaStrip.qml +191 -0
  256. package/ui/MediaTrack.qml +36 -0
  257. package/ui/MediaVolume.qml +54 -0
  258. package/ui/MenuActionDialog.qml +396 -0
  259. package/ui/MenuEdgeFade.qml +24 -0
  260. package/ui/MenuHost.qml +227 -0
  261. package/ui/MenuRow.qml +351 -0
  262. package/ui/MountListing.qml +100 -0
  263. package/ui/NetworkDialog.qml +435 -0
  264. package/ui/NetworkForm.qml +426 -0
  265. package/ui/NetworkMounts.qml +913 -0
  266. package/ui/NetworkPlaces.qml +127 -0
  267. package/ui/OpenWithDialog.qml +613 -0
  268. package/ui/Opener.qml +115 -0
  269. package/ui/Pane.qml +1296 -0
  270. package/ui/PaneMenuActions.qml +527 -0
  271. package/ui/PanePath.qml +90 -0
  272. package/ui/PaneRail.qml +239 -0
  273. package/ui/PaneStates.qml +88 -0
  274. package/ui/PaneSwap.qml +339 -0
  275. package/ui/PaneWire.qml +605 -0
  276. package/ui/ParkedWait.qml +9 -0
  277. package/ui/PathEntry.qml +186 -0
  278. package/ui/PathJump.qml +400 -0
  279. package/ui/PdfViewer.qml +297 -0
  280. package/ui/PermissionsDialog.qml +658 -0
  281. package/ui/PermissionsHeadings.qml +31 -0
  282. package/ui/PhoneMounts.qml +67 -0
  283. package/ui/PickerAnswers.qml +75 -0
  284. package/ui/PickerBox.qml +26 -0
  285. package/ui/PickerChrome.qml +295 -0
  286. package/ui/PickerFilter.qml +97 -0
  287. package/ui/PickerGrid.qml +308 -0
  288. package/ui/PickerHeader.qml +28 -0
  289. package/ui/PickerLifecycle.qml +27 -0
  290. package/ui/PickerList.qml +218 -0
  291. package/ui/PickerListing.qml +149 -0
  292. package/ui/PickerPathBar.qml +127 -0
  293. package/ui/PickerPlaces.qml +189 -0
  294. package/ui/PickerRecent.qml +92 -0
  295. package/ui/PickerSave.qml +101 -0
  296. package/ui/PickerSelection.qml +155 -0
  297. package/ui/PickerWindow.qml +846 -0
  298. package/ui/PowerSectorsReader.qml +10 -0
  299. package/ui/PrebuildDriver.qml +146 -0
  300. package/ui/Preview.qml +1004 -0
  301. package/ui/PreviewAnimation.qml +24 -0
  302. package/ui/PreviewArchive.qml +66 -0
  303. package/ui/PreviewColumn.qml +551 -0
  304. package/ui/PreviewEdge.qml +63 -0
  305. package/ui/PreviewFacts.qml +30 -0
  306. package/ui/PreviewFactsLine.qml +34 -0
  307. package/ui/PreviewHtml.qml +233 -0
  308. package/ui/PreviewImage.qml +253 -0
  309. package/ui/PreviewImagePan.qml +13 -0
  310. package/ui/PreviewImageSharp.qml +32 -0
  311. package/ui/PreviewLines.qml +106 -0
  312. package/ui/PreviewMarkdown.qml +706 -0
  313. package/ui/PreviewMedia.qml +250 -0
  314. package/ui/PreviewPdf.qml +482 -0
  315. package/ui/PreviewScroll.qml +201 -0
  316. package/ui/PreviewSwap.qml +335 -0
  317. package/ui/PreviewText.qml +149 -0
  318. package/ui/ProtocolChip.qml +18 -0
  319. package/ui/QuickLookArchive.qml +38 -0
  320. package/ui/QuickLookBar.qml +103 -0
  321. package/ui/QuickLookPrepare.qml +355 -0
  322. package/ui/QuickLookSwap.qml +10 -0
  323. package/ui/QuickLookWarm.qml +65 -0
  324. package/ui/RailDrop.qml +155 -0
  325. package/ui/RailHeading.qml +19 -0
  326. package/ui/RailPlaces.qml +38 -0
  327. package/ui/RailTrashRow.qml +67 -0
  328. package/ui/RenameField.qml +353 -0
  329. package/ui/RendererRetry.qml +11 -0
  330. package/ui/ResizeHandle.qml +52 -0
  331. package/ui/Reveal.qml +54 -0
  332. package/ui/Row.qml +476 -0
  333. package/ui/RowDrag.qml +213 -0
  334. package/ui/RowDropTarget.qml +27 -0
  335. package/ui/RunCard.qml +286 -0
  336. package/ui/Scripts.qml +65 -0
  337. package/ui/SearchStrip.qml +232 -0
  338. package/ui/SelectionBand.qml +140 -0
  339. package/ui/SelectionPreview.qml +370 -0
  340. package/ui/SettingsFavourite.qml +122 -0
  341. package/ui/SettingsGroup.qml +96 -0
  342. package/ui/SettingsHint.qml +12 -0
  343. package/ui/SettingsMetrics.qml +29 -0
  344. package/ui/SettingsPane.qml +178 -0
  345. package/ui/SettingsPanel.qml +547 -0
  346. package/ui/SettingsRail.qml +128 -0
  347. package/ui/SettingsRow.qml +409 -0
  348. package/ui/SettingsRuler.qml +85 -0
  349. package/ui/SettingsSegment.qml +85 -0
  350. package/ui/ShareBrowser.qml +113 -0
  351. package/ui/ShareLink.qml +67 -0
  352. package/ui/ShelfPins.qml +101 -0
  353. package/ui/Sidebar.qml +732 -0
  354. package/ui/SidebarRow.qml +358 -0
  355. package/ui/Spinner.qml +60 -0
  356. package/ui/StableModel.qml +89 -0
  357. package/ui/StateMessage.qml +84 -0
  358. package/ui/StatusBar.qml +512 -0
  359. package/ui/StatusFileName.qml +27 -0
  360. package/ui/TabBar.qml +673 -0
  361. package/ui/TabDragGeometry.qml +60 -0
  362. package/ui/TagMenuMark.qml +52 -0
  363. package/ui/TagRailSection.qml +53 -0
  364. package/ui/TagSlot.qml +40 -0
  365. package/ui/TagState.qml +150 -0
  366. package/ui/TagSwatch.qml +28 -0
  367. package/ui/Taildrop.qml +86 -0
  368. package/ui/TailscaleMark.qml +50 -0
  369. package/ui/Theme.qml +460 -0
  370. package/ui/ThemeColors.qml +43 -0
  371. package/ui/TransferCard.qml +239 -0
  372. package/ui/TrashConfirm.qml +129 -0
  373. package/ui/TrashDropHandler.qml +11 -0
  374. package/ui/TrashHost.qml +202 -0
  375. package/ui/TrashMonitor.qml +30 -0
  376. package/ui/TrashToolbar.qml +19 -0
  377. package/ui/TrashView.qml +492 -0
  378. package/ui/UnlockDialog.qml +450 -0
  379. package/ui/UnlockHost.qml +206 -0
  380. package/ui/UpdateCheck.qml +97 -0
  381. package/ui/UserDirs.qml +25 -0
  382. package/ui/ViewState.qml +565 -0
  383. package/ui/ViewportScrollBar.qml +195 -0
  384. package/ui/ViewportScrollBars.qml +25 -0
  385. package/ui/WebPreview.qml +33 -0
  386. package/ui/WebPreviewView.qml +26 -0
  387. package/ui/WindowBody.qml +827 -0
  388. package/ui/WindowDrag.qml +35 -0
  389. package/ui/boot/Commons/AudioNodes.qml +50 -0
  390. package/ui/boot/Commons/AudioNodesModel.js +96 -0
  391. package/ui/boot/Commons/Border.qml +243 -0
  392. package/ui/boot/Commons/BorderGeometry.js +373 -0
  393. package/ui/boot/Commons/Color.qml +258 -0
  394. package/ui/boot/Commons/I18n.qml +118 -0
  395. package/ui/boot/Commons/InputDevices.qml +112 -0
  396. package/ui/boot/Commons/InputMethodState.qml +38 -0
  397. package/ui/boot/Commons/IpcRegistry.qml +77 -0
  398. package/ui/boot/Commons/Numbers.js +19 -0
  399. package/ui/boot/Commons/Plural.js +91 -0
  400. package/ui/boot/Commons/ShellIpc.qml +12 -0
  401. package/ui/boot/Commons/Style.qml +561 -0
  402. package/ui/boot/Commons/Translations.qml +100 -0
  403. package/ui/boot/Commons/UntypedInput.qml +152 -0
  404. package/ui/boot/Commons/Util.qml +188 -0
  405. package/ui/boot/Commons/qmldir +13 -0
  406. package/ui/boot/LICENSE-omarchy +20 -0
  407. package/ui/boot/Ui/BackgroundMedia.qml +49 -0
  408. package/ui/boot/Ui/BarIconButton.qml +106 -0
  409. package/ui/boot/Ui/BarIconContent.qml +38 -0
  410. package/ui/boot/Ui/BarIndicator.qml +53 -0
  411. package/ui/boot/Ui/BarWidget.qml +50 -0
  412. package/ui/boot/Ui/BorderOverlay.qml +54 -0
  413. package/ui/boot/Ui/BorderSurface.qml +40 -0
  414. package/ui/boot/Ui/Button.qml +224 -0
  415. package/ui/boot/Ui/ButtonGroup.qml +131 -0
  416. package/ui/boot/Ui/ConfirmDialog.qml +134 -0
  417. package/ui/boot/Ui/CursorSurface.qml +42 -0
  418. package/ui/boot/Ui/Dropdown.qml +245 -0
  419. package/ui/boot/Ui/FilterInput.qml +26 -0
  420. package/ui/boot/Ui/IconContentBounds.qml +141 -0
  421. package/ui/boot/Ui/KeyboardPanel.qml +453 -0
  422. package/ui/boot/Ui/MultiSelect.qml +624 -0
  423. package/ui/boot/Ui/NumberField.qml +86 -0
  424. package/ui/boot/Ui/OpticalGlyph.qml +68 -0
  425. package/ui/boot/Ui/OverlayWindow.qml +102 -0
  426. package/ui/boot/Ui/Panel.qml +60 -0
  427. package/ui/boot/Ui/PanelActionButton.qml +105 -0
  428. package/ui/boot/Ui/PanelController.qml +16 -0
  429. package/ui/boot/Ui/PanelHero.qml +112 -0
  430. package/ui/boot/Ui/PanelKeyCatcher.qml +100 -0
  431. package/ui/boot/Ui/PanelSectionHeader.qml +31 -0
  432. package/ui/boot/Ui/PanelSeparator.qml +19 -0
  433. package/ui/boot/Ui/PanelSlider.qml +156 -0
  434. package/ui/boot/Ui/PanelToolTip.qml +50 -0
  435. package/ui/boot/Ui/PluginBarApi.qml +89 -0
  436. package/ui/boot/Ui/PointerMoveGate.qml +54 -0
  437. package/ui/boot/Ui/PopupCard.qml +181 -0
  438. package/ui/boot/Ui/ScreenMoveRemap.qml +43 -0
  439. package/ui/boot/Ui/SearchableDropdown.qml +354 -0
  440. package/ui/boot/Ui/SizedImage.qml +125 -0
  441. package/ui/boot/Ui/SpeedTestOverlay.qml +412 -0
  442. package/ui/boot/Ui/TextField.qml +58 -0
  443. package/ui/boot/Ui/Toggle.qml +118 -0
  444. package/ui/boot/Ui/ToggleSwitch.qml +115 -0
  445. package/ui/boot/Ui/WidgetButton.qml +172 -0
  446. package/ui/boot/Ui/qmldir +41 -0
  447. package/ui/boot/fleatab.qml +50 -0
  448. package/ui/boot/picker.qml +39 -0
  449. package/ui/boot/shell.qml +122 -0
  450. package/ui/boot/tabtearoff.qml +51 -0
  451. package/ui/js/Anchor.js +379 -0
  452. package/ui/js/AnchorHold.js +162 -0
  453. package/ui/js/Archive.js +157 -0
  454. package/ui/js/ArchiveCard.js +44 -0
  455. package/ui/js/ArchiveOps.js +44 -0
  456. package/ui/js/BackReturn.js +118 -0
  457. package/ui/js/BulkRename.js +100 -0
  458. package/ui/js/Buttons.js +54 -0
  459. package/ui/js/ChromeKeys.js +116 -0
  460. package/ui/js/ClipMarks.js +73 -0
  461. package/ui/js/ClipSelection.js +67 -0
  462. package/ui/js/Clipboard.js +179 -0
  463. package/ui/js/Cloud.js +97 -0
  464. package/ui/js/CodeRuns.js +72 -0
  465. package/ui/js/Collide.js +212 -0
  466. package/ui/js/ColumnFit.js +28 -0
  467. package/ui/js/ColumnMenu.js +111 -0
  468. package/ui/js/Columns.js +298 -0
  469. package/ui/js/ColumnsCarry.js +103 -0
  470. package/ui/js/Compare.js +74 -0
  471. package/ui/js/Contrast.js +157 -0
  472. package/ui/js/ControlReader.js +42 -0
  473. package/ui/js/Convert.js +52 -0
  474. package/ui/js/CopyAs.js +52 -0
  475. package/ui/js/Crumbs.js +178 -0
  476. package/ui/js/Csv.js +231 -0
  477. package/ui/js/Density.js +44 -0
  478. package/ui/js/Devices.js +440 -0
  479. package/ui/js/DirSizes.js +180 -0
  480. package/ui/js/Drag.js +364 -0
  481. package/ui/js/DragOut.js +166 -0
  482. package/ui/js/DropDev.js +52 -0
  483. package/ui/js/Dropbox.js +41 -0
  484. package/ui/js/Eject.js +217 -0
  485. package/ui/js/Errors.js +188 -0
  486. package/ui/js/ExtThumbs.js +115 -0
  487. package/ui/js/Facts.js +402 -0
  488. package/ui/js/FigureDate.js +14 -0
  489. package/ui/js/Filter.js +285 -0
  490. package/ui/js/Find.js +46 -0
  491. package/ui/js/Flash.js +184 -0
  492. package/ui/js/FlashCard.js +79 -0
  493. package/ui/js/FlashEndings.js +125 -0
  494. package/ui/js/FlashPane.js +116 -0
  495. package/ui/js/FleaBin.js +12 -0
  496. package/ui/js/Focus.js +502 -0
  497. package/ui/js/FolderSorts.js +108 -0
  498. package/ui/js/FolderViews.js +44 -0
  499. package/ui/js/Format.js +305 -0
  500. package/ui/js/Fuzzy.js +141 -0
  501. package/ui/js/GlassTag.js +72 -0
  502. package/ui/js/Grid.js +33 -0
  503. package/ui/js/GridGeometry.js +90 -0
  504. package/ui/js/GridNames.js +153 -0
  505. package/ui/js/GvfsBridge.js +200 -0
  506. package/ui/js/HostClipboard.js +29 -0
  507. package/ui/js/Icons.js +218 -0
  508. package/ui/js/Input.js +50 -0
  509. package/ui/js/Jump.js +200 -0
  510. package/ui/js/KeyName.js +64 -0
  511. package/ui/js/Keymap.js +401 -0
  512. package/ui/js/Kinds.js +164 -0
  513. package/ui/js/LICENSES/ISC-lucide.txt +43 -0
  514. package/ui/js/LangMarkPaths.js +47 -0
  515. package/ui/js/LangMarks.js +120 -0
  516. package/ui/js/Lists.js +11 -0
  517. package/ui/js/LocalSend.js +39 -0
  518. package/ui/js/LockedMenu.js +63 -0
  519. package/ui/js/MakeDefault.js +186 -0
  520. package/ui/js/MarkBox.js +7 -0
  521. package/ui/js/Markdown.js +119 -0
  522. package/ui/js/MarkdownLists.js +86 -0
  523. package/ui/js/MarkdownMaths.js +58 -0
  524. package/ui/js/MarkdownPictures.js +32 -0
  525. package/ui/js/MarkdownPrepared.js +139 -0
  526. package/ui/js/MarkdownTableFit.js +34 -0
  527. package/ui/js/Marks.js +148 -0
  528. package/ui/js/Marquee.js +96 -0
  529. package/ui/js/Match.js +93 -0
  530. package/ui/js/Material.js +109 -0
  531. package/ui/js/MdBlocks.js +437 -0
  532. package/ui/js/MdBreak.js +71 -0
  533. package/ui/js/MdChunks.js +70 -0
  534. package/ui/js/MdContainer.js +137 -0
  535. package/ui/js/MdDocument.js +337 -0
  536. package/ui/js/MdEmph.js +97 -0
  537. package/ui/js/MdEntity.js +108 -0
  538. package/ui/js/MdEntityTable.js +223 -0
  539. package/ui/js/MdEscape.js +59 -0
  540. package/ui/js/MdFront.js +37 -0
  541. package/ui/js/MdHold.js +32 -0
  542. package/ui/js/MdHtml.js +307 -0
  543. package/ui/js/MdHtmlBlock.js +290 -0
  544. package/ui/js/MdHtmlHeading.js +53 -0
  545. package/ui/js/MdHtmlImage.js +179 -0
  546. package/ui/js/MdInline.js +154 -0
  547. package/ui/js/MdItems.js +212 -0
  548. package/ui/js/MdLeaf.js +309 -0
  549. package/ui/js/MdLink.js +196 -0
  550. package/ui/js/MdMath.js +67 -0
  551. package/ui/js/MdParagraphs.js +138 -0
  552. package/ui/js/MdRefs.js +232 -0
  553. package/ui/js/MdResolve.js +226 -0
  554. package/ui/js/MdRun.js +300 -0
  555. package/ui/js/MdUrl.js +226 -0
  556. package/ui/js/Menu.js +514 -0
  557. package/ui/js/MenuContext.js +85 -0
  558. package/ui/js/MenuFit.js +13 -0
  559. package/ui/js/MenuRefresh.js +74 -0
  560. package/ui/js/MenuWheel.js +35 -0
  561. package/ui/js/Messages.js +186 -0
  562. package/ui/js/Motion.js +16 -0
  563. package/ui/js/Mounts.js +320 -0
  564. package/ui/js/MouseNav.js +13 -0
  565. package/ui/js/Nav.js +329 -0
  566. package/ui/js/NetFs.js +26 -0
  567. package/ui/js/OpenWith.js +83 -0
  568. package/ui/js/Ops.js +585 -0
  569. package/ui/js/Palette.js +33 -0
  570. package/ui/js/PathBar.js +260 -0
  571. package/ui/js/Permissions.js +179 -0
  572. package/ui/js/Phones.js +112 -0
  573. package/ui/js/Picker.js +353 -0
  574. package/ui/js/PlaceMenu.js +96 -0
  575. package/ui/js/Places.js +265 -0
  576. package/ui/js/PreviewAsk.js +21 -0
  577. package/ui/js/PreviewKeys.js +155 -0
  578. package/ui/js/PreviewSettle.js +29 -0
  579. package/ui/js/PreviewSwap.js +101 -0
  580. package/ui/js/PropertyFacts.js +144 -0
  581. package/ui/js/Protocols.js +296 -0
  582. package/ui/js/QuickLookKinds.js +27 -0
  583. package/ui/js/QuickLookRect.js +24 -0
  584. package/ui/js/RailDrop.js +51 -0
  585. package/ui/js/RailKeys.js +87 -0
  586. package/ui/js/RailMenu.js +133 -0
  587. package/ui/js/Recent.js +135 -0
  588. package/ui/js/RecentMode.js +156 -0
  589. package/ui/js/Reload.js +60 -0
  590. package/ui/js/Renderer.js +9 -0
  591. package/ui/js/RunFile.js +143 -0
  592. package/ui/js/Scripts.js +28 -0
  593. package/ui/js/Scroll.js +304 -0
  594. package/ui/js/ScrollOff.js +69 -0
  595. package/ui/js/Search.js +478 -0
  596. package/ui/js/Selection.js +97 -0
  597. package/ui/js/Settings.js +476 -0
  598. package/ui/js/SettingsAbout.js +97 -0
  599. package/ui/js/SettingsShelf.js +52 -0
  600. package/ui/js/SheetKeys.js +42 -0
  601. package/ui/js/SheetQuery.js +281 -0
  602. package/ui/js/ShelfPile.js +27 -0
  603. package/ui/js/SlowClick.js +53 -0
  604. package/ui/js/SlowOp.js +6 -0
  605. package/ui/js/Sort.js +134 -0
  606. package/ui/js/Startup.js +63 -0
  607. package/ui/js/StateWords.js +17 -0
  608. package/ui/js/Status.js +238 -0
  609. package/ui/js/Swap.js +166 -0
  610. package/ui/js/TabMove.js +39 -0
  611. package/ui/js/Tabs.js +736 -0
  612. package/ui/js/Tags.js +134 -0
  613. package/ui/js/Taildrop.js +128 -0
  614. package/ui/js/Tap.js +174 -0
  615. package/ui/js/TextSize.js +107 -0
  616. package/ui/js/Thumbs.js +158 -0
  617. package/ui/js/Transfer.js +172 -0
  618. package/ui/js/Trash.js +81 -0
  619. package/ui/js/TrashDates.js +47 -0
  620. package/ui/js/TrashDrop.js +64 -0
  621. package/ui/js/UiState.js +438 -0
  622. package/ui/js/Unlock.js +152 -0
  623. package/ui/js/Update.js +130 -0
  624. package/ui/js/UserDirs.js +56 -0
  625. package/ui/qmldir +228 -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,479 @@
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
+ ## Running it
13
+
14
+ Install Bun first, then check that it is available on PATH:
15
+
16
+ ```sh
17
+ npm i -g bun
18
+ bun --version
19
+ ```
20
+
21
+ Start Flea QML with:
22
+
23
+ ```sh
24
+ npx flea-qml
25
+ ```
26
+
27
+ Or, from the root of this repository:
28
+
29
+ ```sh
30
+ bun index.js
31
+ ```
32
+
33
+ The launcher queries Kitty graphics support.
34
+ When available it uses buninu-browser's default terminal frontend; otherwise
35
+ Windows uses `--win32`, and Linux/Android use `--wayland`.
36
+
37
+ A first argument starting with `--` (except the information options below) bypasses detection and is forwarded unchanged
38
+ to buninu-browser, which decides how to handle it. There is no frontend allowlist:
39
+
40
+ ```sh
41
+ npx flea-qml --casty
42
+ npx flea-qml --win32
43
+ npx flea-qml --wayland
44
+ npx flea-qml --headless
45
+ npx flea-qml --help
46
+ npx flea-qml --version
47
+ npx flea-qml --readme
48
+ ```
49
+
50
+ `--help`/`-h`, `--version`/`-V`, and `--readme` run locally without probing Kitty
51
+ or starting the browser. `--version` also shows the browser version pinned in
52
+ `package.json`. `--readme` always prints coloured ANSI Markdown with
53
+ links, including when its output is redirected.
54
+
55
+ When launched, Flea automatically spawns
56
+ [buninu-browser](https://github.com/jjtseng93/buninu-browser) to display its QML
57
+ interface. The browser version is pinned in `package.json` under
58
+ `scripts.browser`. The launcher reads the package
59
+ specification from this field, while still choosing npx, bunx or bun x as below.
60
+ Changing this field updates the requested version for all three launch methods;
61
+ clearing a cache does not change the pinned version.
62
+
63
+ To reinstall cached packages from scratch, see [Clearing package caches](#clearing-package-caches).
64
+
65
+ The browser receives the absolute, URL-escaped `file://` address of the bundled
66
+ `ui/boot/shell.qml`, including on Windows. Remaining arguments go to the browser.
67
+ Package launch order matches buninu-browser's Casty launcher: npx when both npx
68
+ and Bun are on PATH, then bunx, then `bun x` using Bun on PATH or the running Bun.
69
+ A missing Kitty response falls back after 800 ms; explicit selection skips the
70
+ probe. Wayland requires a running compositor. Other non-Windows platforms also
71
+ fall back to Wayland; no native macOS frontend is selected automatically.
72
+
73
+ The npm package is public and includes the full project, without a `files`
74
+ allowlist or project ignore rules (npm's mandatory exclusions still apply).
75
+
76
+ `FLEA_PATH=/some/folder` opens that folder first; for example, from this
77
+ checkout on Linux/Android:
78
+
79
+ ```sh
80
+ FLEA_PATH="$PWD/demos" bun index.js
81
+ ```
82
+
83
+ For development, you can also launch a browser checkout directly from this
84
+ repository root, with a Wayland compositor running:
85
+
86
+ ```sh
87
+ bun ../buninu-browser/index.js --quickshell-wayland -p ui/boot/shell.qml
88
+ ```
89
+
90
+ ## Keyboard shortcuts
91
+
92
+ These are the implemented bindings for the **default** key preset. Letters are
93
+ case-sensitive (`H` means Shift+H). Listing shortcuts apply when the file list
94
+ has focus, not while typing in a text field. Other presets can change bindings;
95
+ press `?` to view or search the current keymap. A terminal, compositor or browser
96
+ frontend may intercept a shortcut before Flea receives it.
97
+
98
+ ### Navigation and views
99
+
100
+ | Keys | Action |
101
+ | --- | --- |
102
+ | Up / Down, `k` / `j` | Move through files |
103
+ | Home / End, `g` / `G` | First / last file |
104
+ | PageUp / PageDown | Move by half the visible rows |
105
+ | Left, Backspace, `h` | Parent folder |
106
+ | Right, `l` | Enter a folder or preview a file |
107
+ | Enter | Open the selected item |
108
+ | `H` / `L` | Back / forward in navigation history |
109
+ | `:` | Edit the folder address |
110
+ | Ctrl+1 / Ctrl+2 / Ctrl+3 / Ctrl+4 | List / columns / grid / dual-pane view |
111
+ | `t` | New Flea tab |
112
+ | Ctrl+Enter | Open the selected folder in a tab |
113
+ | `w`, Ctrl+W | Close the current tab |
114
+ | `[` / `]`, Ctrl+PageUp / Ctrl+PageDown | Previous / next tab |
115
+ | `{` / `}`, Ctrl+Shift+PageUp / Ctrl+Shift+PageDown | Move the current tab left / right |
116
+ | Tab / Shift+Tab | Move focus between available interface areas |
117
+ | Ctrl+B | Toggle the sidebar |
118
+ | `.`, Ctrl+Shift+. | Show / hide hidden files |
119
+ | `s` / `S` | Change sort field / reverse sort order |
120
+ | F4 | Fit list columns to their contents |
121
+ | F5, Ctrl+R | Reload the folder |
122
+ | Ctrl++ / Ctrl+- / Ctrl+0 | Increase / decrease / reset text size (Ctrl+Shift variants also work) |
123
+ | `,`, Ctrl+, | Open settings |
124
+ | `?` | Open the searchable keymap |
125
+
126
+ ### Selection and file operations
127
+
128
+ | Keys | Action |
129
+ | --- | --- |
130
+ | `v` | Toggle the current file's selection |
131
+ | Shift+Up / Shift+Down, `K` / `J` | Extend the selection |
132
+ | Ctrl+A | Select all |
133
+ | `V` | Invert the selection |
134
+ | `y`, Ctrl+C | Copy selected files |
135
+ | `x`, Ctrl+X | Cut selected files |
136
+ | `p`, Ctrl+V | Paste files into the current folder |
137
+ | `Y` | Copy the current folder's path |
138
+ | Ctrl+Shift+C | Copy selected file paths |
139
+ | `c` / `P` | Open Copy as / Paste as options |
140
+ | `r`, F2 | Rename; multiple selected files open Bulk rename |
141
+ | Ctrl+Shift+N | Create a folder |
142
+ | Delete, `dd` (press `d` twice) | Move to Trash; in Trash, request permanent deletion |
143
+ | Shift+Delete | Request permanent deletion with confirmation |
144
+ | `=`, Alt+= | Calculate selected/current folders' sizes / all folders' sizes |
145
+ | `m`, Menu, Shift+F10 | Open the item's context menu |
146
+
147
+ ### Find and Filter
148
+
149
+ | Keys | Action |
150
+ | --- | --- |
151
+ | `/` | Filter the current listing by name |
152
+ | `f`, Ctrl+F | Open Find |
153
+ | Ctrl+G | Search file contents; in Find, toggle name/content search |
154
+ | Enter in Find | Start the search |
155
+ | Tab / Shift+Tab in Find | Cycle the search scope |
156
+ | Enter in Filter | Return to the list with the filter applied |
157
+ | Up / Down, PageUp / PageDown in a query | Navigate results |
158
+ | `o` in results | Reveal the current item in its containing folder |
159
+ | Esc in Filter | Close Filter |
160
+ | Esc in Find | Stop a running search; when idle, close Find |
161
+ | Esc in the file list | Dismiss Filter first, then Find on a subsequent press |
162
+
163
+ Find and Filter keep their own text-editing focus. Left/Right move the caret;
164
+ clicking the query returns focus to its input. When either query owns focus,
165
+ Esc acts on that query rather than the other one.
166
+
167
+ ### Preview and Quick Look
168
+
169
+ | Keys | Action |
170
+ | --- | --- |
171
+ | Space on a file | Open Quick Look |
172
+ | Space / Esc in Quick Look | Close it (Space does not pause media) |
173
+ | Alt+P | Toggle the preview column |
174
+ | Ctrl+Space | Load the selection's preview |
175
+ | Ctrl+Tab | Focus the preview column; from Quick Look, close Quick Look |
176
+ | `i` | Toggle file facts in the visible preview column |
177
+ | Up / Down, `k` / `j` in Quick Look | Preview the previous / next file |
178
+ | PageUp / PageDown, `B` / `F` | Scroll the preview by a page |
179
+ | `B` / `F` in the file list | Scroll the preview column by a page |
180
+ | `w` in text/code Quick Look | Toggle line wrapping |
181
+ | `r` in document Quick Look | Switch between rendered document and source |
182
+ | `p` in media Quick Look | Play / pause |
183
+ | `m` in media Quick Look | Mute / unmute |
184
+ | Left / Right in media Quick Look | Seek backward / forward by 5 seconds |
185
+ | Left / Right in PDF preview | Previous / next PDF page |
186
+ | `-` / `+` in image, HTML or PDF Quick Look | Zoom out / in |
187
+ | `0` in image Quick Look | Fit the image |
188
+ | `e` in PDF Quick Look | Toggle expanded view |
189
+ | `y` in Compare Quick Look | Copy the diff patch |
190
+
191
+ ### Menus and dialogs
192
+
193
+ Use Up/Down (or `k`/`j`) to choose a menu row, Right/`l` to enter a submenu,
194
+ Left/`h` to return, Enter to activate, and Esc to dismiss. In Copy as, `p`, `n`,
195
+ `e`, `f`, `u`, and `s` select path, name, stem, folder path, URI, and shell-quoted
196
+ path respectively. Tab/Shift+Tab move between dialog controls; text fields keep
197
+ normal caret, selection, copy and paste editing.
198
+
199
+ ## Runtime and supported features
200
+
201
+ The repository aims to be self-contained, needing only buninu-browser to run.
202
+ The backend reads no system database; the one system file it reads is Linux's
203
+ mount table, for a folder's filesystem name. For the clipboard it speaks
204
+ Wayland data-control itself, loading only libc (kernel32 on Windows) to pass
205
+ file descriptors. Without a usable Wayland data-control connection, the QML
206
+ frontend uses Quickshell's text clipboard instead (buninu-browser prefers xclip,
207
+ then its existing platform fallbacks). Paste reads it on demand, with no polling.
208
+ File paths keep their POSIX single-quoted form on every platform, including
209
+ Windows; a cut adds `""` at both ends. This is a text representation of the file
210
+ selection, not Android's native file clipboard. Syntax highlighting runs
211
+ [jsmdcui](https://github.com/jjtseng93/jsmdcui), for syntax colours in previews,
212
+ found beside this repository as `../jsmdcui` or on PATH as `jmi` or `jsmdcui`;
213
+ without it previews are plain text. Compare also runs `diff` through bunmsh or
214
+ a system provider, as described below. Some interface
215
+ code carried over from upstream and Omarchy still asks Linux tools such as
216
+ `hyprctl`, `lsblk` and `fc-match`, and does without them where they are missing.
217
+
218
+ Ported so far: the backend's `list`, `window`, `sort`, `fsinfo`, `peek`,
219
+ `meta`, `code`, `clipSet`, `clipGet`, `clipClear`, `clipWatch`, `collisions`, `mergecollisions`,
220
+ `transfer`, `transfercancel`, `trash`, `trashbrowse`, `menuaction` (selection snapshots and permanent-delete confirmation),
221
+ `mkdir`, `newfile`, `duplicate`, `bulkrename`, `permissions`, `permissionsBatch`, `formats`, `archive` and `quit`, and `flea --ui-state`, which keeps
222
+ `~/.local/state/flea/ui.json` the way upstream does. A transfer copies and moves
223
+ files, folders and links and answers keep, skip, refuse, replace and merge; it has no undo yet,
224
+ and refuses special files. Replace moves the item already there to flea's Trash first and puts it
225
+ back when the transfer fails; merge folds a folder into the folder already there, asking once
226
+ about the names both hold. Other requests and `flea`
227
+ modes are not ported yet; the interface reports them as failed, as with an
228
+ unreachable backend.
229
+ Setting `FLEA_BIN` to upstream's `flea` binary uses it instead, for what is
230
+ not ported yet.
231
+
232
+ Archive previews list ZIP, tar, tar.gz/tgz and tar.zst/tzst without loading the
233
+ whole archive into memory.
234
+
235
+ Compress writes `.zip`, `.tar`, `.tar.gz` and `.tar.zst`, and Extract reads the
236
+ same four, in JavaScript with `node:zlib`; no `bsdtar` or `7z` runs. Both stream
237
+ member data, work under a hidden `.flea-work-*` name beside the result and publish
238
+ it under the first free name (`pack.zip`, `pack copy.zip`, ...), so a failed or
239
+ cancelled run leaves nothing under a real name. Extraction refuses absolute and
240
+ `..` member names and any member that would be written through a link, applies the
241
+ umask to stored modes, and copies a tar hard-link member's bytes instead of
242
+ linking. Passwords, `.7z`, `.rar`, `.tar.xz`, `.tar.bz2`, packages and the
243
+ free-space check are not ported; those are refused with a sentence.
244
+
245
+ New folder, New file, Duplicate, Bulk rename and Permissions follow upstream's
246
+ rules: names are bare (no separator or NUL), creations are exclusive, a bulk rename
247
+ is checked whole before anything moves and swaps through temporary names, and a
248
+ permissions batch changes every item or puts back what it changed. None of these
249
+ is in an undo journal yet. File tags (`settags`, `tagstates`) are not ported. Compressed tar member data is streamed and discarded;
250
+ metadata records over 1 MiB and malformed or truncated archives are rejected.
251
+ Keyboard hints are enabled by default; an explicitly saved disabled setting is
252
+ preserved.
253
+
254
+ ## Where it comes from
255
+
256
+ `ui/` started as upstream's `ui/`, exported from
257
+ [`thisisgm/flea@73f3c23`](https://github.com/thisisgm/flea/commit/73f3c23971106f6d47f78bd758f783af3e5b5c78)
258
+ (0.4.0 plus 7 commits). Upstream has since moved its window to GPUI and no
259
+ longer launches this interface; this fork keeps it as the frontend. Changes
260
+ so far:
261
+
262
+ - A row's icon is the emoji the backend sends; language logos give way to it.
263
+ - The interface runs this repository's `src/flea.js` (`ui/js/FleaBin.js`)
264
+ instead of a `flea` on PATH.
265
+ - Upstream's links to `/usr/share/omarchy/shell` are replaced by a copy of the
266
+ two Omarchy QML modules the interface imports, `ui/boot/Commons` and
267
+ `ui/boot/Ui`, from
268
+ [`omacom/omarchy@3c7027d`](https://github.com/omacom/omarchy/commit/3c7027db2a4fa9fa6a49d7af7f87c27ac48e677d).
269
+ - Markdown formulas are set as MathML by Temml (`src/mathml.js`), and Mermaid
270
+ diagrams are drawn by the backend (`src/figure.js`: Pele in a Bun Worker, one
271
+ diagram at a time under a deadline). The HTML preview embeds each diagram as an
272
+ SVG picture; the block view asks the backend for the same SVG. Upstream's
273
+ sandboxed quickjs figure helper and its figure cache are not used.
274
+
275
+ ## Layout
276
+
277
+ | Path | What it is |
278
+ | --- | --- |
279
+ | `ui/` | The QML interface and its JS libraries |
280
+ | `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 |
281
+ | `src/flea.js` | The `flea` the interface runs; `--backend` answers `ui/Backend.qml` |
282
+ | `src/` (rest) | The backend: listing, ordering, kinds and emoji, filesystem facts |
283
+ | `docs/protocol.md` | Upstream's description of the backend line protocol |
284
+ | `demos/` | One file for every emoji a row can show, and `math-and-diagrams.md` for formulas and Mermaid |
285
+
286
+ ## Sidebar places
287
+
288
+ Sidebar places are found by looking, not read from `user-dirs.dirs` alone or
289
+ asked of `lsblk`: a standard folder (Desktop, Downloads, Documents, Pictures,
290
+ Camera, Screenshots, Music, Videos) is listed once it directly holds a file,
291
+ every system lists its temporary folder, and DEVICES adds each root that can be
292
+ listed (`/`, or the drive letters on Windows) and what is mounted under
293
+ `/Volumes`, `/media` and `/run/media`. Android, recognised by
294
+ `/system/bin/linker64`, always lists `/sdcard` and `/sdcard/Download`, and an
295
+ app whose `$TMPDIR` lies in its private folder also gets that folder and
296
+ `/sdcard/Android/media/PACKAGE`. The backend looks again every five seconds
297
+ only while a sidebar is shown; see `docs/protocol.md` "flea-qml probed places".
298
+
299
+ ## Deleting files
300
+
301
+ Trash uses the ordinary file pane: Space opens Quick Look, `/` filters,
302
+ and the existing selection, sorting, copy/cut and folder navigation work on
303
+ its real files. The toolbar adds Restore, Restore all and Empty Trash; deletion
304
+ still requires confirmation. Original locations and deletion dates are shown.
305
+ Returning from a trashed folder restores the Trash collection. Moving a file
306
+ out removes its `.trashinfo`; copying leaves it intact. Renaming updates its
307
+ restoration name and refuses collisions.
308
+
309
+ Trash is a virtual collection across volumes, not a writable directory: open
310
+ a real folder before pasting, creating files or using recursive Find (`f`).
311
+ Filter works directly on the collection. This does not add backend features
312
+ that are otherwise unimplemented (for example bulk rename or undo).
313
+
314
+ `bun test/manual-trash-ui.mjs` exercises the shared pane with the sibling
315
+ buninu-browser, isolated HOME/XDG fixtures, preview, filtering, folder Back,
316
+ selected restore, and deletion review/cancellation. It never activates Empty
317
+ Trash, since mounted-volume trash can exist outside those isolated directories.
318
+
319
+ Move to Trash uses freedesktop-style `Trash/files` and `Trash/info`, without
320
+ invoking `gio`. Windows also uses this private Trash folder, not the Windows
321
+ Recycle Bin. Cross-filesystem copies are not attempted: an unusable Trash leaves
322
+ the source in place. Trash browsing, restore and confirmed permanent deletion/emptying
323
+ are supported; undo is not yet ported. Restore refuses an occupied destination.
324
+ The backend discovers home and mounted-volume Trash folders and remembers the
325
+ per-drive folders it has used. Sidebar counts use filesystem watches with a
326
+ five-second reconciliation for newly available volumes, without GIO processes.
327
+ Same-count replacements also refresh the listing. Deletion reviews reuse the
328
+ bounded, non-following tree checks below, including descendant changes and
329
+ single-use confirmation tokens; cancelling invalidates the review.
330
+
331
+ Permanent deletion requires a fresh confirmation token. Changes to the reviewed
332
+ tree invalidate it; refresh reviews only the originally selected paths. Reviews
333
+ refuse filesystem roots, cross-device subtrees, unreadable entries, and trees
334
+ exceeding 100,000 entries or the two-second walk budget. Review failures never
335
+ pretend to be complete totals. Path-based filesystem checks do not provide
336
+ atomic protection against concurrent renames by other processes.
337
+
338
+ ## The clipboard
339
+
340
+ Copied files are offered the way other file managers read them
341
+ (`text/uri-list`, GNOME's and KDE's forms) and, as plain text, shell-quoted on
342
+ one line, so a paste into a shell is ready to use:
343
+
344
+ ```sh
345
+ '/home/a/file a' '/home/a/it'\''s' # copied
346
+ ""'/home/a/file a' '/home/a/it'\''s'"" # cut: the same words between two empty ""
347
+ ```
348
+
349
+ There is no clipboard daemon: the backend owns the selection and gives it up
350
+ when it exits. The plain text is what a compositor such as buninu-land keeps
351
+ after that, so a later Flea still reads it back as a copy or a cut, as long as
352
+ every path in it exists.
353
+
354
+ Text-only Copy as and share links use the QML runtime's clipboard. Query-field
355
+ paste accepts either synchronous Quickshell text or buninu-browser's asynchronous
356
+ host clipboard read. These operations do not require `wl-copy`.
357
+
358
+ ## Clearing package caches
359
+
360
+ To reinstall cached packages from scratch:
361
+
362
+ ```sh
363
+ # npm 11 or later: list the cache keys and their packages
364
+ npm cache npx ls
365
+
366
+ # Use the keys from your own listing for flea-qml, buninu-browser or Casty.
367
+ # The package specification (including its version) affects the key.
368
+ npm cache npx rm FLEA_KEY BROWSER_KEY CASTY_KEY
369
+
370
+ # Or clear all npx packages, including other tools
371
+ npm cache npx rm --force
372
+
373
+ # For packages launched through bunx or bun x
374
+ bun pm cache rm
375
+ ```
376
+
377
+ With an older npm, delete the npx cache directory: `~/.npm/_npx`
378
+ (Windows: `%LocalAppData%\npm-cache\_npx`).
379
+
380
+ ## Tests
381
+
382
+ Run `bun test test` for archive bounds, menu identity/transfer lifetime and
383
+ clipboard tests. Fixtures are generated in temporary directories and removed
384
+ afterward; no compositor is required.
385
+
386
+ ## License
387
+
388
+ MIT, as upstream. See [LICENSE](LICENSE): GM's copyright notice for Flea is
389
+ kept, followed by Dr. John's (醫者小智) for this fork.
390
+
391
+ The tree also carries Omarchy's QML modules, Lucide icon geometry, Temml (with
392
+ mhchem), Pele, and simple-icons and markdown-mark logos, each under its own licence;
393
+ see [THIRD-PARTY-NOTICES.md](THIRD-PARTY-NOTICES.md).
394
+
395
+ ### Preview fallback and syntax audit
396
+
397
+ Unknown file types are previewed as text. Local text previews read at most the
398
+ first 1 MiB, replace binary control bytes with visible control pictures, and split
399
+ lines longer than 4096 characters to bound text layout work. Large files and binary
400
+ content use plain text; a notice in the preview indicates truncation or line splitting.
401
+ Failed image, media, or document previews leave the content area blank.
402
+
403
+ To audit syntax colours using a jsmdcui checkout (HTML is excluded):
404
+
405
+ ```sh
406
+ bun test/manual-syntax-preview.mjs ../jsmdcui
407
+ ```
408
+
409
+ The script discovers `runtime/syntax/*.yaml`, uses that checkout's
410
+ `tests/syntax-parity/samples`, and runs four jobs at a time. It checks explicit
411
+ language highlighting separately from Flea's automatic file preview. The detailed
412
+ report is `flea-syntax-results.json` in the system temporary directory.
413
+
414
+ The current 158 definitions contain three HTML variants, which are skipped.
415
+ All remaining 155 produce colour with an explicit filetype; 149 have verified
416
+ automatically selected, coloured Flea text previews. Markdown normally uses a
417
+ rendered document instead of source colouring. `default`, V and Jinja2 have no
418
+ filename detector; Objective-C shares extensions with other languages; Privoxy's
419
+ config detector requires a directory although jsmdcui matches the basename.
420
+ These are detection limitations, not missing colour rules. The lexical samples
421
+ prove colour reaches the preview backend, not exhaustive syntax correctness or a
422
+ visual check of every language.
423
+
424
+ Flea additionally recognizes V function declarations in the first 64 KiB of `.v`
425
+ files and requests `-filetype v`. Comments and strings are ignored; a Verilog
426
+ `endmodule` keeps the normal detector. Ambiguous files without such evidence keep
427
+ jsmdcui's existing detection. This hint is implemented in Flea, not jsmdcui.
428
+ To explicitly request a language from jsmdcui yourself, use **one dash**:
429
+
430
+ ```sh
431
+ bun ../jsmdcui/src/index.js --cat --edit -filetype v /path/to/main.v
432
+ # Or, with the installed launcher:
433
+ jmi --cat --edit -filetype v /path/to/main.v
434
+ ```
435
+
436
+ The value is the YAML definition's `filetype`, not necessarily its filename or
437
+ extension. Flea's internal `highlightFile(path, signal, filetype)` forwards this
438
+ setting as separate arguments; failures still fall back to plain text.
439
+
440
+ The Trash address bar displays `trash:///`. Enter `trash:/`, `trash://`, or
441
+ `trash:///` to open the same collection as the sidebar. These root addresses are
442
+ UI aliases only: stored paths, preview readers, restore and deletion are unchanged.
443
+ Trash item URIs and remote authorities are not supported by these aliases.
444
+
445
+ The bottom status bar shows the selected item's full name after the count/size.
446
+ With multiple marked items it shows the current cursor item; Trash uses its
447
+ original name. Long names scroll horizontally instead of being elided. Notices
448
+ and errors temporarily take priority over the name.
449
+
450
+ HTML previews rebuild a passive fragment with Bun's HTMLRewriter: only fixed
451
+ structural/text tags (including nested `div`) are emitted, never source attributes.
452
+ Text's literal angle brackets are escaped; scripts, styles, embedded documents,
453
+ SVG and MathML subtrees are omitted. No source CSS, images or links are loaded.
454
+ The result uses QML RichText with the current theme and local text reflow, rather
455
+ than an external browser screenshot. Source view remains available. HTML reads
456
+ are limited to 1 MiB; larger documents keep the existing plain-text preview path.
457
+
458
+ `bun test test/html-preview.test.js` tests rebuilding and bounded reads.
459
+ With sibling buninu-browser available,
460
+ `bun test/manual-html-security.mjs` checks adversarial fragments in a live page
461
+ using a harmless script counter, and `bun test/manual-html-ui.mjs` checks the real
462
+ backend/QML preview and scrolling. These are regression checks, not a proof
463
+ against every possible parser discrepancy. Never decode the rebuilt fragment's
464
+ entities before parsing it as HTML.
465
+
466
+
467
+ Compare two marked regular files with **m → Compare**. The backend searches
468
+ for the sibling `../bunmsh/index.js` first, then `bunmsh` on PATH, invoking
469
+ `bunmsh -cc builtin diff` (with Bun before the sibling entry). Finally it tries
470
+ `Bun.which("diff")`. All providers receive `-u --label A --label B -- A B`
471
+ as separate arguments, without shell interpolation. Providers that cannot run
472
+ or lack unified support fall back to the next candidate.
473
+
474
+ Comparison retains upstream's 1 MiB per-file limit and binary screening, caps
475
+ patch output at 8 MiB, and terminates a diff after 10 seconds. A superseded
476
+ comparison is cancelled and its reply discarded. Requires a bunmsh version
477
+ with unified diff support or a compatible system diff. Test with
478
+ `bun test test/compare.test.js`; with sibling buninu-browser available,
479
+ `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>
@@ -0,0 +1,2 @@
1
+ <?php
2
+ echo "Hello from PHP\n";
package/demos/init.lua ADDED
@@ -0,0 +1 @@
1
+ print("Hello from Lua")
Binary file
package/demos/lib.rs ADDED
@@ -0,0 +1,3 @@
1
+ fn main() {
2
+ println!("Hello from Rust");
3
+ }
package/demos/main.c ADDED
@@ -0,0 +1,6 @@
1
+ #include <stdio.h>
2
+
3
+ int main(void) {
4
+ puts("Hello from C");
5
+ return 0;
6
+ }
package/demos/main.h ADDED
@@ -0,0 +1,3 @@
1
+ #pragma once
2
+
3
+ int greet(void);