flea-qml 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (637) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +511 -2
  3. package/THIRD-PARTY-NOTICES.md +29 -0
  4. package/demos/App.java +5 -0
  5. package/demos/Dockerfile +4 -0
  6. package/demos/Main.kt +3 -0
  7. package/demos/Program.cs +1 -0
  8. package/demos/README.md +12 -0
  9. package/demos/app.dart +3 -0
  10. package/demos/app.deb +0 -0
  11. package/demos/app.js +1 -0
  12. package/demos/backup.tar +0 -0
  13. package/demos/budget.xlsx +0 -0
  14. package/demos/build.sh +2 -0
  15. package/demos/bundle.zip +0 -0
  16. package/demos/clip.mp4 +0 -0
  17. package/demos/data.sqlite +0 -0
  18. package/demos/disk.iso +0 -0
  19. package/demos/engine.cpp +5 -0
  20. package/demos/firmware.bin +0 -0
  21. package/demos/flake.nix +4 -0
  22. package/demos/folder/inside.txt +1 -0
  23. package/demos/font.ttf +0 -0
  24. package/demos/index.html +5 -0
  25. package/demos/index.php +2 -0
  26. package/demos/init.lua +1 -0
  27. package/demos/letter.docx +0 -0
  28. package/demos/lib.rs +3 -0
  29. package/demos/main.c +6 -0
  30. package/demos/main.h +3 -0
  31. package/demos/math-and-diagrams.md +200 -0
  32. package/demos/notes.tar.gz +0 -0
  33. package/demos/notes.txt +3 -0
  34. package/demos/photo.png +0 -0
  35. package/demos/program +2 -0
  36. package/demos/report.pdf +32 -0
  37. package/demos/script.py +1 -0
  38. package/demos/server.go +7 -0
  39. package/demos/settings.json +4 -0
  40. package/demos/slides.pptx +0 -0
  41. package/demos/song.mp3 +0 -0
  42. package/demos/style.css +4 -0
  43. package/demos/tool.rb +1 -0
  44. package/demos/types.ts +2 -0
  45. package/docs/pele.md +23 -0
  46. package/docs/protocol.md +3420 -0
  47. package/docs/temml.md +63 -0
  48. package/index.js +107 -0
  49. package/package.json +34 -4
  50. package/src/archive.js +407 -0
  51. package/src/archiveops.js +728 -0
  52. package/src/backend.js +369 -0
  53. package/src/bulkrename.js +95 -0
  54. package/src/clip-host.js +76 -0
  55. package/src/clip.js +462 -0
  56. package/src/code.js +168 -0
  57. package/src/compare.js +74 -0
  58. package/src/create.js +128 -0
  59. package/src/dirsize.js +147 -0
  60. package/src/figure-svg.js +530 -0
  61. package/src/figure-thread.js +23 -0
  62. package/src/figure.js +132 -0
  63. package/src/find.js +55 -0
  64. package/src/flea.js +39 -0
  65. package/src/fsinfo.js +39 -0
  66. package/src/highlight.js +141 -0
  67. package/src/html.js +52 -0
  68. package/src/kinds.js +89 -0
  69. package/src/listing.js +130 -0
  70. package/src/markdown-html.js +317 -0
  71. package/src/mathml.js +186 -0
  72. package/src/menu.js +180 -0
  73. package/src/meta.js +135 -0
  74. package/src/office.js +810 -0
  75. package/src/order.js +100 -0
  76. package/src/peek.js +49 -0
  77. package/src/pele-wrapper.js +695 -0
  78. package/src/permissions.js +180 -0
  79. package/src/places.js +313 -0
  80. package/src/preview-language.js +10 -0
  81. package/src/terminal-server.js +95 -0
  82. package/src/terminal-shell.js +26 -0
  83. package/src/transfer.js +669 -0
  84. package/src/trash-record.js +41 -0
  85. package/src/trash.js +210 -0
  86. package/src/trashbrowse.js +327 -0
  87. package/src/uistate.js +393 -0
  88. package/src/uistore.js +168 -0
  89. package/src/vendor/LICENSES/Apache-2.0.txt +202 -0
  90. package/src/vendor/LICENSES/MIT-katex-2015.txt +27 -0
  91. package/src/vendor/LICENSES/MIT-katex.txt +21 -0
  92. package/src/vendor/LICENSES/MIT-mermaid.txt +21 -0
  93. package/src/vendor/LICENSES/MIT-pele.txt +40 -0
  94. package/src/vendor/LICENSES/MIT-perseus.txt +18 -0
  95. package/src/vendor/LICENSES/MIT-temml.txt +21 -0
  96. package/src/vendor/pele.js +145 -0
  97. package/src/vendor/temml.mjs +14708 -0
  98. package/src/watch.js +98 -0
  99. package/src/wayland/client.js +109 -0
  100. package/src/wayland/protocol.js +55 -0
  101. package/src/wayland/protocols/ext-data-control-v1.xml +276 -0
  102. package/src/wayland/protocols/wayland.xml +3248 -0
  103. package/src/wayland/protocols/wlr-data-control-unstable-v1.xml +278 -0
  104. package/src/wayland/resource-io.js +6 -0
  105. package/src/wayland/socket-discovery.js +26 -0
  106. package/src/wayland/transport-posix.js +120 -0
  107. package/src/wayland/transport-win32.js +11 -0
  108. package/src/wayland/transport.js +3 -0
  109. package/src/wayland/win32-resources.js +80 -0
  110. package/src/wayland/win32-wire.js +62 -0
  111. package/test/archive.test.js +80 -0
  112. package/test/bench-markdown-scroll.mjs +190 -0
  113. package/test/clip-host.test.js +113 -0
  114. package/test/code-preview.test.js +35 -0
  115. package/test/compare-ui-paths.test.js +24 -0
  116. package/test/compare.test.js +54 -0
  117. package/test/delete-trash.test.js +67 -0
  118. package/test/dirsize.test.js +138 -0
  119. package/test/file-ops.test.js +307 -0
  120. package/test/file-url.test.js +24 -0
  121. package/test/find-contents.test.js +161 -0
  122. package/test/find-input.test.js +66 -0
  123. package/test/fixtures/pele-parity.json +1006 -0
  124. package/test/highlight-launcher.test.js +35 -0
  125. package/test/html-preview.test.js +22 -0
  126. package/test/input.test.js +15 -0
  127. package/test/keymap.test.js +26 -0
  128. package/test/language-icons.test.js +36 -0
  129. package/test/launcher.test.js +51 -0
  130. package/test/manual-archive-here-ui.mjs +47 -0
  131. package/test/manual-code-scroll.mjs +28 -0
  132. package/test/manual-column-scroll.mjs +24 -0
  133. package/test/manual-compare-ui.mjs +20 -0
  134. package/test/manual-find-status.mjs +37 -0
  135. package/test/manual-folder-focus.mjs +63 -0
  136. package/test/manual-html-security.mjs +23 -0
  137. package/test/manual-html-ui.mjs +30 -0
  138. package/test/manual-syntax-preview.mjs +26 -0
  139. package/test/manual-terminal-lifecycle.mjs +42 -0
  140. package/test/manual-terminal-navigation.mjs +48 -0
  141. package/test/manual-terminal-ui.mjs +47 -0
  142. package/test/manual-trash-ui.mjs +86 -0
  143. package/test/markdown-diagrams.test.js +93 -0
  144. package/test/markdown-html.test.js +105 -0
  145. package/test/mathml.test.js +92 -0
  146. package/test/menu-transfer.test.js +57 -0
  147. package/test/office-preview.test.js +154 -0
  148. package/test/pele-parity.test.js +28 -0
  149. package/test/places.test.js +134 -0
  150. package/test/preview-keys.test.js +60 -0
  151. package/test/preview-language.test.js +22 -0
  152. package/test/status-filename.test.js +20 -0
  153. package/test/transfer-replace-merge.test.js +187 -0
  154. package/test/trash-address.test.js +23 -0
  155. package/test/trash-view.test.js +37 -0
  156. package/test/trashbrowse.test.js +135 -0
  157. package/ui/AboutFacts.qml +78 -0
  158. package/ui/ArchiveCards.qml +95 -0
  159. package/ui/ArchiveCompressDialog.qml +378 -0
  160. package/ui/ArchiveHereConfirm.qml +127 -0
  161. package/ui/ArchivePasswordDialog.qml +257 -0
  162. package/ui/Backend.qml +775 -0
  163. package/ui/BulkOldNames.qml +47 -0
  164. package/ui/BulkRenameDialog.qml +380 -0
  165. package/ui/CardFrame.qml +67 -0
  166. package/ui/CardScroll.qml +79 -0
  167. package/ui/CheckBox.qml +73 -0
  168. package/ui/ChromeBar.qml +360 -0
  169. package/ui/ChromeButton.qml +131 -0
  170. package/ui/ChromeModes.qml +43 -0
  171. package/ui/CodeLines.qml +256 -0
  172. package/ui/CodeRefusal.qml +52 -0
  173. package/ui/CollideConfirm.qml +147 -0
  174. package/ui/CollideHost.qml +167 -0
  175. package/ui/ColumnPane.qml +525 -0
  176. package/ui/ColumnRow.qml +380 -0
  177. package/ui/ColumnsArea.qml +594 -0
  178. package/ui/ColumnsLanding.qml +147 -0
  179. package/ui/CompareView.qml +321 -0
  180. package/ui/ContextMenu.qml +743 -0
  181. package/ui/ConvertDialog.qml +456 -0
  182. package/ui/CountedWorker.qml +7 -0
  183. package/ui/Crumb.qml +64 -0
  184. package/ui/CrumbDrop.qml +25 -0
  185. package/ui/CsvTable.qml +394 -0
  186. package/ui/CursorMark.qml +41 -0
  187. package/ui/DefaultClaim.qml +130 -0
  188. package/ui/DeviceLock.qml +47 -0
  189. package/ui/DeviceMounts.qml +540 -0
  190. package/ui/DialogButton.qml +150 -0
  191. package/ui/DialogField.qml +147 -0
  192. package/ui/DialogHeader.qml +31 -0
  193. package/ui/DialogScrim.qml +20 -0
  194. package/ui/DialogTitle.qml +37 -0
  195. package/ui/Divider.qml +9 -0
  196. package/ui/DropInto.qml +126 -0
  197. package/ui/DropTarget.qml +35 -0
  198. package/ui/DropboxMark.qml +60 -0
  199. package/ui/EmptyState.qml +150 -0
  200. package/ui/EscapeHint.qml +11 -0
  201. package/ui/FactsTable.qml +54 -0
  202. package/ui/FastScrollHandler.qml +476 -0
  203. package/ui/FatNamesConfirm.qml +157 -0
  204. package/ui/Favourites.qml +143 -0
  205. package/ui/FigureService.qml +120 -0
  206. package/ui/FileDrag.qml +267 -0
  207. package/ui/FilterStrip.qml +133 -0
  208. package/ui/FitMetrics.qml +22 -0
  209. package/ui/FlashDriveRows.qml +137 -0
  210. package/ui/FlashHost.qml +72 -0
  211. package/ui/FlashImageRow.qml +104 -0
  212. package/ui/FlashRunner.qml +119 -0
  213. package/ui/FlashStepRow.qml +172 -0
  214. package/ui/FlashStrip.qml +38 -0
  215. package/ui/FlashView.qml +397 -0
  216. package/ui/FleaMark.qml +88 -0
  217. package/ui/FlyoutFade.qml +23 -0
  218. package/ui/FontPane.qml +170 -0
  219. package/ui/Glass.qml +114 -0
  220. package/ui/GlassTagger.qml +59 -0
  221. package/ui/Glyph.qml +64 -0
  222. package/ui/GlyphSolid.qml +22 -0
  223. package/ui/GridArea.qml +664 -0
  224. package/ui/GridTile.qml +325 -0
  225. package/ui/GvfsBridge.qml +164 -0
  226. package/ui/Header.qml +433 -0
  227. package/ui/HoverTimers.qml +39 -0
  228. package/ui/HtmlClip.qml +30 -0
  229. package/ui/HtmlPane.qml +63 -0
  230. package/ui/HyprlandMark.qml +45 -0
  231. package/ui/Ipc.qml +1005 -0
  232. package/ui/IpcControls.qml +7 -0
  233. package/ui/IpcMenuState.qml +48 -0
  234. package/ui/IpcPreviewState.qml +185 -0
  235. package/ui/JumpPath.qml +51 -0
  236. package/ui/KeymapSheet.qml +561 -0
  237. package/ui/KeymapSheetResult.qml +89 -0
  238. package/ui/KindStack.qml +40 -0
  239. package/ui/LangMark.qml +51 -0
  240. package/ui/LangMarkLoader.qml +26 -0
  241. package/ui/List.qml +480 -0
  242. package/ui/LoadingState.qml +54 -0
  243. package/ui/LocalSend.qml +56 -0
  244. package/ui/LocalSendMark.qml +73 -0
  245. package/ui/MarkdownBlockView.qml +311 -0
  246. package/ui/MarkdownBlocks.qml +35 -0
  247. package/ui/MarkdownFigure.qml +254 -0
  248. package/ui/MarkdownImages.qml +72 -0
  249. package/ui/MarkdownList.qml +81 -0
  250. package/ui/MarkdownMathsText.qml +97 -0
  251. package/ui/MarkdownPane.qml +83 -0
  252. package/ui/MarkdownPictures.qml +41 -0
  253. package/ui/MarkdownQuote.qml +52 -0
  254. package/ui/MarkdownRemote.qml +82 -0
  255. package/ui/MarkdownSource.qml +155 -0
  256. package/ui/MarkdownTable.qml +222 -0
  257. package/ui/MarkdownTableScroll.qml +64 -0
  258. package/ui/MarkdownTableWheel.qml +126 -0
  259. package/ui/MarkdownText.qml +87 -0
  260. package/ui/MarkdownWorker.js +132 -0
  261. package/ui/MatchText.qml +99 -0
  262. package/ui/MediaSession.qml +38 -0
  263. package/ui/MediaSound.qml +26 -0
  264. package/ui/MediaStrip.qml +191 -0
  265. package/ui/MediaTrack.qml +36 -0
  266. package/ui/MediaVolume.qml +54 -0
  267. package/ui/MenuActionDialog.qml +396 -0
  268. package/ui/MenuEdgeFade.qml +24 -0
  269. package/ui/MenuHost.qml +227 -0
  270. package/ui/MenuRow.qml +351 -0
  271. package/ui/MountListing.qml +100 -0
  272. package/ui/NetworkDialog.qml +435 -0
  273. package/ui/NetworkForm.qml +426 -0
  274. package/ui/NetworkMounts.qml +913 -0
  275. package/ui/NetworkPlaces.qml +127 -0
  276. package/ui/OpenWithDialog.qml +613 -0
  277. package/ui/Opener.qml +95 -0
  278. package/ui/Pane.qml +1320 -0
  279. package/ui/PaneMenuActions.qml +527 -0
  280. package/ui/PanePath.qml +90 -0
  281. package/ui/PaneRail.qml +268 -0
  282. package/ui/PaneStates.qml +88 -0
  283. package/ui/PaneSwap.qml +339 -0
  284. package/ui/PaneWire.qml +601 -0
  285. package/ui/ParkedWait.qml +9 -0
  286. package/ui/PathEntry.qml +186 -0
  287. package/ui/PathJump.qml +400 -0
  288. package/ui/PdfViewer.qml +297 -0
  289. package/ui/PermissionsDialog.qml +658 -0
  290. package/ui/PermissionsHeadings.qml +31 -0
  291. package/ui/PhoneMounts.qml +67 -0
  292. package/ui/PickerAnswers.qml +75 -0
  293. package/ui/PickerBox.qml +26 -0
  294. package/ui/PickerChrome.qml +295 -0
  295. package/ui/PickerFilter.qml +97 -0
  296. package/ui/PickerGrid.qml +308 -0
  297. package/ui/PickerHeader.qml +28 -0
  298. package/ui/PickerLifecycle.qml +27 -0
  299. package/ui/PickerList.qml +218 -0
  300. package/ui/PickerListing.qml +149 -0
  301. package/ui/PickerPathBar.qml +127 -0
  302. package/ui/PickerPlaces.qml +189 -0
  303. package/ui/PickerRecent.qml +92 -0
  304. package/ui/PickerSave.qml +101 -0
  305. package/ui/PickerSelection.qml +155 -0
  306. package/ui/PickerWindow.qml +846 -0
  307. package/ui/PowerSectorsReader.qml +10 -0
  308. package/ui/PrebuildDriver.qml +146 -0
  309. package/ui/Preview.qml +1005 -0
  310. package/ui/PreviewAnimation.qml +24 -0
  311. package/ui/PreviewArchive.qml +91 -0
  312. package/ui/PreviewColumn.qml +553 -0
  313. package/ui/PreviewEdge.qml +63 -0
  314. package/ui/PreviewFacts.qml +30 -0
  315. package/ui/PreviewFactsLine.qml +34 -0
  316. package/ui/PreviewHtml.qml +233 -0
  317. package/ui/PreviewImage.qml +253 -0
  318. package/ui/PreviewImagePan.qml +13 -0
  319. package/ui/PreviewImageSharp.qml +32 -0
  320. package/ui/PreviewLines.qml +106 -0
  321. package/ui/PreviewMarkdown.qml +706 -0
  322. package/ui/PreviewMedia.qml +250 -0
  323. package/ui/PreviewPdf.qml +482 -0
  324. package/ui/PreviewScroll.qml +201 -0
  325. package/ui/PreviewSwap.qml +335 -0
  326. package/ui/PreviewText.qml +149 -0
  327. package/ui/ProtocolChip.qml +18 -0
  328. package/ui/QuickLookArchive.qml +41 -0
  329. package/ui/QuickLookBar.qml +103 -0
  330. package/ui/QuickLookPrepare.qml +355 -0
  331. package/ui/QuickLookSwap.qml +10 -0
  332. package/ui/QuickLookWarm.qml +65 -0
  333. package/ui/RailDrop.qml +155 -0
  334. package/ui/RailHeading.qml +19 -0
  335. package/ui/RailPlaces.qml +38 -0
  336. package/ui/RailTrashRow.qml +67 -0
  337. package/ui/RenameField.qml +353 -0
  338. package/ui/RendererRetry.qml +11 -0
  339. package/ui/ResizeHandle.qml +52 -0
  340. package/ui/Reveal.qml +54 -0
  341. package/ui/Row.qml +476 -0
  342. package/ui/RowDrag.qml +213 -0
  343. package/ui/RowDropTarget.qml +27 -0
  344. package/ui/RunCard.qml +286 -0
  345. package/ui/Scripts.qml +65 -0
  346. package/ui/SearchStrip.qml +232 -0
  347. package/ui/SelectionBand.qml +140 -0
  348. package/ui/SelectionPreview.qml +370 -0
  349. package/ui/SettingsFavourite.qml +122 -0
  350. package/ui/SettingsGroup.qml +96 -0
  351. package/ui/SettingsHint.qml +12 -0
  352. package/ui/SettingsMetrics.qml +29 -0
  353. package/ui/SettingsPane.qml +178 -0
  354. package/ui/SettingsPanel.qml +547 -0
  355. package/ui/SettingsRail.qml +128 -0
  356. package/ui/SettingsRow.qml +409 -0
  357. package/ui/SettingsRuler.qml +85 -0
  358. package/ui/SettingsSegment.qml +85 -0
  359. package/ui/ShareBrowser.qml +113 -0
  360. package/ui/ShareLink.qml +67 -0
  361. package/ui/ShelfPins.qml +101 -0
  362. package/ui/Sidebar.qml +728 -0
  363. package/ui/SidebarRow.qml +358 -0
  364. package/ui/Spinner.qml +60 -0
  365. package/ui/StableModel.qml +89 -0
  366. package/ui/StateMessage.qml +84 -0
  367. package/ui/StatusBar.qml +512 -0
  368. package/ui/StatusFileName.qml +27 -0
  369. package/ui/TabBar.qml +673 -0
  370. package/ui/TabDragGeometry.qml +60 -0
  371. package/ui/TagMenuMark.qml +52 -0
  372. package/ui/TagRailSection.qml +53 -0
  373. package/ui/TagSlot.qml +40 -0
  374. package/ui/TagState.qml +150 -0
  375. package/ui/TagSwatch.qml +28 -0
  376. package/ui/Taildrop.qml +86 -0
  377. package/ui/TailscaleMark.qml +50 -0
  378. package/ui/TerminalService.qml +69 -0
  379. package/ui/TerminalTab.qml +48 -0
  380. package/ui/TerminalTabs.qml +27 -0
  381. package/ui/Theme.qml +460 -0
  382. package/ui/ThemeColors.qml +43 -0
  383. package/ui/TransferCard.qml +239 -0
  384. package/ui/TrashConfirm.qml +129 -0
  385. package/ui/TrashDropHandler.qml +11 -0
  386. package/ui/TrashHost.qml +202 -0
  387. package/ui/TrashMonitor.qml +30 -0
  388. package/ui/TrashToolbar.qml +19 -0
  389. package/ui/TrashView.qml +492 -0
  390. package/ui/UnlockDialog.qml +450 -0
  391. package/ui/UnlockHost.qml +206 -0
  392. package/ui/UpdateCheck.qml +97 -0
  393. package/ui/UserDirs.qml +25 -0
  394. package/ui/ViewState.qml +565 -0
  395. package/ui/ViewportScrollBar.qml +195 -0
  396. package/ui/ViewportScrollBars.qml +25 -0
  397. package/ui/WebPreview.qml +33 -0
  398. package/ui/WebPreviewView.qml +26 -0
  399. package/ui/WindowBody.qml +829 -0
  400. package/ui/WindowDrag.qml +35 -0
  401. package/ui/boot/Commons/AudioNodes.qml +50 -0
  402. package/ui/boot/Commons/AudioNodesModel.js +96 -0
  403. package/ui/boot/Commons/Border.qml +243 -0
  404. package/ui/boot/Commons/BorderGeometry.js +373 -0
  405. package/ui/boot/Commons/Color.qml +258 -0
  406. package/ui/boot/Commons/I18n.qml +118 -0
  407. package/ui/boot/Commons/InputDevices.qml +112 -0
  408. package/ui/boot/Commons/InputMethodState.qml +38 -0
  409. package/ui/boot/Commons/IpcRegistry.qml +77 -0
  410. package/ui/boot/Commons/Numbers.js +19 -0
  411. package/ui/boot/Commons/Plural.js +91 -0
  412. package/ui/boot/Commons/ShellIpc.qml +12 -0
  413. package/ui/boot/Commons/Style.qml +561 -0
  414. package/ui/boot/Commons/Translations.qml +100 -0
  415. package/ui/boot/Commons/UntypedInput.qml +152 -0
  416. package/ui/boot/Commons/Util.qml +188 -0
  417. package/ui/boot/Commons/qmldir +13 -0
  418. package/ui/boot/LICENSE-omarchy +20 -0
  419. package/ui/boot/Ui/BackgroundMedia.qml +49 -0
  420. package/ui/boot/Ui/BarIconButton.qml +106 -0
  421. package/ui/boot/Ui/BarIconContent.qml +38 -0
  422. package/ui/boot/Ui/BarIndicator.qml +53 -0
  423. package/ui/boot/Ui/BarWidget.qml +50 -0
  424. package/ui/boot/Ui/BorderOverlay.qml +54 -0
  425. package/ui/boot/Ui/BorderSurface.qml +40 -0
  426. package/ui/boot/Ui/Button.qml +224 -0
  427. package/ui/boot/Ui/ButtonGroup.qml +131 -0
  428. package/ui/boot/Ui/ConfirmDialog.qml +134 -0
  429. package/ui/boot/Ui/CursorSurface.qml +42 -0
  430. package/ui/boot/Ui/Dropdown.qml +245 -0
  431. package/ui/boot/Ui/FilterInput.qml +26 -0
  432. package/ui/boot/Ui/IconContentBounds.qml +141 -0
  433. package/ui/boot/Ui/KeyboardPanel.qml +453 -0
  434. package/ui/boot/Ui/MultiSelect.qml +624 -0
  435. package/ui/boot/Ui/NumberField.qml +86 -0
  436. package/ui/boot/Ui/OpticalGlyph.qml +68 -0
  437. package/ui/boot/Ui/OverlayWindow.qml +102 -0
  438. package/ui/boot/Ui/Panel.qml +60 -0
  439. package/ui/boot/Ui/PanelActionButton.qml +105 -0
  440. package/ui/boot/Ui/PanelController.qml +16 -0
  441. package/ui/boot/Ui/PanelHero.qml +112 -0
  442. package/ui/boot/Ui/PanelKeyCatcher.qml +100 -0
  443. package/ui/boot/Ui/PanelSectionHeader.qml +31 -0
  444. package/ui/boot/Ui/PanelSeparator.qml +19 -0
  445. package/ui/boot/Ui/PanelSlider.qml +156 -0
  446. package/ui/boot/Ui/PanelToolTip.qml +50 -0
  447. package/ui/boot/Ui/PluginBarApi.qml +89 -0
  448. package/ui/boot/Ui/PointerMoveGate.qml +54 -0
  449. package/ui/boot/Ui/PopupCard.qml +181 -0
  450. package/ui/boot/Ui/ScreenMoveRemap.qml +43 -0
  451. package/ui/boot/Ui/SearchableDropdown.qml +354 -0
  452. package/ui/boot/Ui/SizedImage.qml +125 -0
  453. package/ui/boot/Ui/SpeedTestOverlay.qml +412 -0
  454. package/ui/boot/Ui/TextField.qml +58 -0
  455. package/ui/boot/Ui/Toggle.qml +118 -0
  456. package/ui/boot/Ui/ToggleSwitch.qml +115 -0
  457. package/ui/boot/Ui/WidgetButton.qml +172 -0
  458. package/ui/boot/Ui/qmldir +41 -0
  459. package/ui/boot/fleatab.qml +50 -0
  460. package/ui/boot/picker.qml +39 -0
  461. package/ui/boot/shell.qml +131 -0
  462. package/ui/boot/tabtearoff.qml +51 -0
  463. package/ui/js/Anchor.js +379 -0
  464. package/ui/js/AnchorHold.js +162 -0
  465. package/ui/js/Archive.js +157 -0
  466. package/ui/js/ArchiveCard.js +44 -0
  467. package/ui/js/ArchiveOps.js +44 -0
  468. package/ui/js/BackReturn.js +118 -0
  469. package/ui/js/BulkRename.js +100 -0
  470. package/ui/js/Buttons.js +54 -0
  471. package/ui/js/ChromeKeys.js +116 -0
  472. package/ui/js/ClipMarks.js +73 -0
  473. package/ui/js/ClipSelection.js +67 -0
  474. package/ui/js/Clipboard.js +179 -0
  475. package/ui/js/Cloud.js +97 -0
  476. package/ui/js/CodeRuns.js +72 -0
  477. package/ui/js/Collide.js +212 -0
  478. package/ui/js/ColumnFit.js +28 -0
  479. package/ui/js/ColumnMenu.js +111 -0
  480. package/ui/js/Columns.js +298 -0
  481. package/ui/js/ColumnsCarry.js +103 -0
  482. package/ui/js/Compare.js +74 -0
  483. package/ui/js/Contrast.js +157 -0
  484. package/ui/js/ControlReader.js +42 -0
  485. package/ui/js/Convert.js +52 -0
  486. package/ui/js/CopyAs.js +52 -0
  487. package/ui/js/Crumbs.js +178 -0
  488. package/ui/js/Csv.js +231 -0
  489. package/ui/js/Density.js +44 -0
  490. package/ui/js/Devices.js +440 -0
  491. package/ui/js/DirSizes.js +180 -0
  492. package/ui/js/Drag.js +360 -0
  493. package/ui/js/DragOut.js +166 -0
  494. package/ui/js/DropDev.js +52 -0
  495. package/ui/js/Dropbox.js +41 -0
  496. package/ui/js/Eject.js +217 -0
  497. package/ui/js/Errors.js +188 -0
  498. package/ui/js/ExtThumbs.js +115 -0
  499. package/ui/js/Facts.js +402 -0
  500. package/ui/js/FigureDate.js +14 -0
  501. package/ui/js/Filter.js +285 -0
  502. package/ui/js/Find.js +46 -0
  503. package/ui/js/Flash.js +184 -0
  504. package/ui/js/FlashCard.js +79 -0
  505. package/ui/js/FlashEndings.js +125 -0
  506. package/ui/js/FlashPane.js +116 -0
  507. package/ui/js/FleaBin.js +12 -0
  508. package/ui/js/Focus.js +504 -0
  509. package/ui/js/FolderSorts.js +108 -0
  510. package/ui/js/FolderViews.js +44 -0
  511. package/ui/js/Format.js +314 -0
  512. package/ui/js/Fuzzy.js +141 -0
  513. package/ui/js/GlassTag.js +72 -0
  514. package/ui/js/Grid.js +33 -0
  515. package/ui/js/GridGeometry.js +90 -0
  516. package/ui/js/GridNames.js +153 -0
  517. package/ui/js/GvfsBridge.js +200 -0
  518. package/ui/js/HostClipboard.js +29 -0
  519. package/ui/js/Icons.js +218 -0
  520. package/ui/js/Input.js +50 -0
  521. package/ui/js/Jump.js +200 -0
  522. package/ui/js/KeyName.js +64 -0
  523. package/ui/js/Keymap.js +401 -0
  524. package/ui/js/Kinds.js +164 -0
  525. package/ui/js/LICENSES/ISC-lucide.txt +43 -0
  526. package/ui/js/LangMarkPaths.js +47 -0
  527. package/ui/js/LangMarks.js +120 -0
  528. package/ui/js/Lists.js +11 -0
  529. package/ui/js/LocalSend.js +39 -0
  530. package/ui/js/LockedMenu.js +63 -0
  531. package/ui/js/MakeDefault.js +186 -0
  532. package/ui/js/MarkBox.js +7 -0
  533. package/ui/js/Markdown.js +119 -0
  534. package/ui/js/MarkdownLists.js +86 -0
  535. package/ui/js/MarkdownMaths.js +58 -0
  536. package/ui/js/MarkdownPictures.js +32 -0
  537. package/ui/js/MarkdownPrepared.js +139 -0
  538. package/ui/js/MarkdownTableFit.js +34 -0
  539. package/ui/js/Marks.js +148 -0
  540. package/ui/js/Marquee.js +96 -0
  541. package/ui/js/Match.js +93 -0
  542. package/ui/js/Material.js +109 -0
  543. package/ui/js/MdBlocks.js +437 -0
  544. package/ui/js/MdBreak.js +71 -0
  545. package/ui/js/MdChunks.js +70 -0
  546. package/ui/js/MdContainer.js +137 -0
  547. package/ui/js/MdDocument.js +337 -0
  548. package/ui/js/MdEmph.js +97 -0
  549. package/ui/js/MdEntity.js +108 -0
  550. package/ui/js/MdEntityTable.js +223 -0
  551. package/ui/js/MdEscape.js +59 -0
  552. package/ui/js/MdFront.js +37 -0
  553. package/ui/js/MdHold.js +32 -0
  554. package/ui/js/MdHtml.js +307 -0
  555. package/ui/js/MdHtmlBlock.js +290 -0
  556. package/ui/js/MdHtmlHeading.js +53 -0
  557. package/ui/js/MdHtmlImage.js +179 -0
  558. package/ui/js/MdInline.js +154 -0
  559. package/ui/js/MdItems.js +212 -0
  560. package/ui/js/MdLeaf.js +309 -0
  561. package/ui/js/MdLink.js +196 -0
  562. package/ui/js/MdMath.js +67 -0
  563. package/ui/js/MdParagraphs.js +138 -0
  564. package/ui/js/MdRefs.js +232 -0
  565. package/ui/js/MdResolve.js +226 -0
  566. package/ui/js/MdRun.js +300 -0
  567. package/ui/js/MdUrl.js +226 -0
  568. package/ui/js/Menu.js +514 -0
  569. package/ui/js/MenuContext.js +85 -0
  570. package/ui/js/MenuFit.js +13 -0
  571. package/ui/js/MenuRefresh.js +74 -0
  572. package/ui/js/MenuWheel.js +35 -0
  573. package/ui/js/Messages.js +186 -0
  574. package/ui/js/Motion.js +16 -0
  575. package/ui/js/Mounts.js +320 -0
  576. package/ui/js/MouseNav.js +13 -0
  577. package/ui/js/Nav.js +329 -0
  578. package/ui/js/NetFs.js +26 -0
  579. package/ui/js/OpenWith.js +83 -0
  580. package/ui/js/Ops.js +585 -0
  581. package/ui/js/Palette.js +33 -0
  582. package/ui/js/PathBar.js +260 -0
  583. package/ui/js/Permissions.js +179 -0
  584. package/ui/js/Phones.js +112 -0
  585. package/ui/js/Picker.js +353 -0
  586. package/ui/js/PlaceMenu.js +96 -0
  587. package/ui/js/Places.js +265 -0
  588. package/ui/js/PreviewAsk.js +21 -0
  589. package/ui/js/PreviewKeys.js +155 -0
  590. package/ui/js/PreviewSettle.js +29 -0
  591. package/ui/js/PreviewSwap.js +101 -0
  592. package/ui/js/PropertyFacts.js +144 -0
  593. package/ui/js/Protocols.js +296 -0
  594. package/ui/js/QuickLookKinds.js +27 -0
  595. package/ui/js/QuickLookRect.js +24 -0
  596. package/ui/js/RailDrop.js +51 -0
  597. package/ui/js/RailKeys.js +87 -0
  598. package/ui/js/RailMenu.js +133 -0
  599. package/ui/js/Recent.js +135 -0
  600. package/ui/js/RecentMode.js +156 -0
  601. package/ui/js/Reload.js +60 -0
  602. package/ui/js/Renderer.js +9 -0
  603. package/ui/js/RunFile.js +143 -0
  604. package/ui/js/Scripts.js +28 -0
  605. package/ui/js/Scroll.js +304 -0
  606. package/ui/js/ScrollOff.js +69 -0
  607. package/ui/js/Search.js +478 -0
  608. package/ui/js/Selection.js +97 -0
  609. package/ui/js/Settings.js +476 -0
  610. package/ui/js/SettingsAbout.js +97 -0
  611. package/ui/js/SettingsShelf.js +52 -0
  612. package/ui/js/SheetKeys.js +42 -0
  613. package/ui/js/SheetQuery.js +281 -0
  614. package/ui/js/ShelfPile.js +27 -0
  615. package/ui/js/SlowClick.js +53 -0
  616. package/ui/js/SlowOp.js +6 -0
  617. package/ui/js/Sort.js +134 -0
  618. package/ui/js/Startup.js +63 -0
  619. package/ui/js/StateWords.js +17 -0
  620. package/ui/js/Status.js +238 -0
  621. package/ui/js/Swap.js +166 -0
  622. package/ui/js/TabMove.js +39 -0
  623. package/ui/js/Tabs.js +751 -0
  624. package/ui/js/Tags.js +134 -0
  625. package/ui/js/Taildrop.js +128 -0
  626. package/ui/js/Tap.js +180 -0
  627. package/ui/js/TextSize.js +107 -0
  628. package/ui/js/Thumbs.js +158 -0
  629. package/ui/js/Transfer.js +172 -0
  630. package/ui/js/Trash.js +84 -0
  631. package/ui/js/TrashDates.js +47 -0
  632. package/ui/js/TrashDrop.js +64 -0
  633. package/ui/js/UiState.js +438 -0
  634. package/ui/js/Unlock.js +152 -0
  635. package/ui/js/Update.js +130 -0
  636. package/ui/js/UserDirs.js +56 -0
  637. package/ui/qmldir +230 -0
@@ -0,0 +1,238 @@
1
+ .pragma library
2
+
3
+ .import "DirSizes.js" as DirSizes
4
+ .import "Format.js" as Format
5
+ .import "Keymap.js" as Keymap
6
+ .import "Match.js" as Match
7
+
8
+ // A finished operation names its own reversal and the clipboard names the key that spends it. The
9
+ // strip draws either in its secondary, so no sentence it shows ends in advice of its own.
10
+ // The key comes from the running preset, so the default preset draws " · z undoes" and " · p pastes" and another preset draws its own.
11
+ var HINTS = {
12
+ undo: " · %1 undoes",
13
+ paste: " · %1 pastes",
14
+ deletes: " · %1 deletes",
15
+ note: " · %1",
16
+ noteUndo: " · %1 · %2 undoes"
17
+ }
18
+ function undoHint() {
19
+ var key = Keymap.hintFor("undo")
20
+ return key.length > 0 ? Format.fill(HINTS.undo, key) : ""
21
+ }
22
+ function pasteHint() {
23
+ var key = Keymap.hintFor("paste")
24
+ return key.length > 0 ? Format.fill(HINTS.paste, key) : ""
25
+ }
26
+ // The hint is the strip's second lane, so a finished line takes it as its tail and hintOf splits it off again.
27
+ function withUndo(line) { return line + undoHint() }
28
+ function withPaste(line) { return line + pasteHint() }
29
+
30
+ // The key that still removes the rows where there is no Trash, drawn in the secondary lane.
31
+ function trashHint() {
32
+ var key = Keymap.hintFor("deletePermanently")
33
+ return key.length > 0 ? Format.fill(HINTS.deletes, key) : ""
34
+ }
35
+
36
+ // Refusal where gio has no Trash: the place in the primary, the key that still works in the secondary.
37
+ var NO_TRASH = "This location has no Trash"
38
+ function noTrashLine() { return NO_TRASH + trashHint() }
39
+
40
+ // An arm's record: its owner (the pane, or the Trash view while it is open) and the stamp that owner set before the prompt.
41
+ function armOf(owner, stamp) { return { owner: owner, stamp: stamp } }
42
+
43
+ // Live while the bar still has that owner and the owner still holds that stamp; its second press, any other key and a new listing zero it.
44
+ function armLive(arm, owner) { return arm !== null && arm.stamp > 0 && arm.owner === owner && owner.trashArmedAt === arm.stamp }
45
+
46
+ // What the arm has left by its owner's clock, the stamp, so a Qt timer that fires early never ends it while the key still acts.
47
+ function armLeft(arm, now, armMs) { return arm === null ? 0 : armMs - (now - arm.stamp) }
48
+
49
+ // A live arm's prompt, else the oldest unacknowledged error, else the notice: a hidden live prompt's second press acts unannounced.
50
+ function transientOf(errors, notice, prompt, live) {
51
+ if (live === true) return { text: prompt, isError: false, detail: "" }
52
+ if (errors.length) return { text: errors[0].text, isError: true, detail: errors[0].detail }
53
+ return { text: notice, isError: false, detail: "" }
54
+ }
55
+
56
+ // The no-Trash refusal names its place and replaces its own copy there, where it stands; other errors name none.
57
+ function withError(errors, text, detail, place) {
58
+ var entry = { text: text, detail: detail || "", place: text === noTrashLine() ? place : "" }
59
+ var at = entry.place.length === 0 ? -1
60
+ : errors.findIndex(function (e) { return e.text === text && e.place === entry.place })
61
+ if (at < 0) return errors.concat([entry])
62
+ var next = errors.slice()
63
+ next[at] = entry
64
+ return next
65
+ }
66
+
67
+ // Leaving a place drops its refusals; other errors wait for dismissal, and an unchanged queue is the same array.
68
+ function errorsAt(errors, place) {
69
+ var kept = errors.filter(function (entry) { return entry.place.length === 0 || entry.place === place })
70
+ return kept.length === errors.length ? errors : kept
71
+ }
72
+
73
+ // The durable verdict's own notes, mirrored from src/backend/durable.rs: a done line
74
+ // carrying one draws "Copied N items" with "<note> · z undoes" beside it, the way the
75
+ // CloudMounts board draws the rclone upload sentence.
76
+ var VERDICT_NOTES = ["rclone uploads them in the background", "copied, but the drive did not confirm the folder"]
77
+
78
+ // Which hint a result carries, if any.
79
+ function hintOf(notice) {
80
+ var text = String(notice || "")
81
+ for (var i = 0; i < VERDICT_NOTES.length; i++) {
82
+ var undoKey = Keymap.hintFor("undo")
83
+ var tail = undoKey.length > 0 ? Format.fill(HINTS.noteUndo, VERDICT_NOTES[i], undoKey) : Format.fill(HINTS.note, VERDICT_NOTES[i])
84
+ if (text.length >= tail.length && text.lastIndexOf(tail) === text.length - tail.length)
85
+ return tail
86
+ }
87
+ if (undoHint().length > 0 && text.indexOf(undoHint()) >= 0) {
88
+ return undoHint()
89
+ }
90
+ if (pasteHint().length > 0 && text.indexOf(pasteHint()) >= 0) {
91
+ return pasteHint()
92
+ }
93
+ var trash = trashHint()
94
+ if (trash.length > 0 && text.indexOf(trash) >= 0) {
95
+ return trash
96
+ }
97
+ return ""
98
+ }
99
+
100
+ // Sample input: " · rclone uploads them in the background · z undoes"; any hint ending in undoHint() carries undo.
101
+ function hasUndoHint(hint) {
102
+ var text = String(hint || "")
103
+ var undo = undoHint()
104
+ return undo.length > 0 && text.length >= undo.length
105
+ && text.lastIndexOf(undo) === text.length - undo.length
106
+ }
107
+
108
+ // Only the displayed activity's Starting line walks the busy mark, never one queued behind it; the record says so, not its text.
109
+ function displayedStarting(activities) {
110
+ var list = activities || []
111
+ return list.length > 0 && list[0].starting === true
112
+ }
113
+
114
+ // The key it names. ui/StatusBar.qml draws the separator itself, so the key arrives without one.
115
+ function hintKey(hint) {
116
+ return hint.replace(" \u00b7 ", "")
117
+ }
118
+
119
+ // Sample input: "esc dismisses · z undoes". The undo segment lifted out of a hint, so the strip
120
+ // can draw it as its own click target; the middot between them stays muted.
121
+ function withoutUndoKey(keyHint) {
122
+ var undo = hintKey(undoHint())
123
+ if (keyHint === undo) {
124
+ return ""
125
+ }
126
+ var tail = " \u00b7 " + undo
127
+ if (keyHint.length > tail.length && keyHint.lastIndexOf(tail) === keyHint.length - tail.length) {
128
+ return keyHint.substring(0, keyHint.length - tail.length)
129
+ }
130
+ return keyHint
131
+ }
132
+
133
+ // Sample input: keyHint "z undoes" with nothing else standing. The secondary lane as one string,
134
+ // so ui/StatusBar.qml draws the rest beside the undo target from this same join.
135
+ function secondaryText(keyHint, transientIsError, stickyHere, sticky, activities, searching, searchLine, retryLine) {
136
+ var extra = activities.slice(1).map(function (entry) { return entry.text }).join(" · ")
137
+ return [keyHint,
138
+ transientIsError && stickyHere ? sticky : "",
139
+ extra,
140
+ stickyHere && !transientIsError && searching ? searchLine : "",
141
+ transientIsError ? "" : retryLine]
142
+ .filter(function (s) { return s.length > 0 }).map(function (s) { return " · " + s }).join("")
143
+ }
144
+
145
+ // Sample input: { transient: "Copy failed", transientIsError: true, searching: true, searchLine: "3 found in 1.6 s", stickyHere: true, sticky: "Copying 2 of 5" }
146
+ function errorHere(slot) {
147
+ return slot.transient.length > 0 && slot.transientIsError
148
+ }
149
+
150
+ function promptHere(slot) {
151
+ return slot.armLive === true
152
+ }
153
+
154
+ // The centre zone is what just happened, and nothing else. The disk facts have a zone of their own,
155
+ // so this no longer falls back to them: an idle bar's centre is empty. StatusBar board rule 1.
156
+ // The ordering rule: acknowledged errors leave the slot; activity cannot displace them.
157
+ function centreText(slot) {
158
+ // A prompt stands over activity and search as well, for the reason transientOf gives.
159
+ if (errorHere(slot) || promptHere(slot))
160
+ return slot.transient
161
+ if (slot.stickyHere)
162
+ return slot.sticky
163
+ if (slot.searching)
164
+ return slot.searchLine
165
+ return slot.transient
166
+ }
167
+
168
+ function centreRole(slot) {
169
+ return errorHere(slot) ? "error" : "foreground"
170
+ }
171
+
172
+ // Whether the centre draws the notice, whose display time is the one ui/StatusBar.qml's timer ends.
173
+ function noticeShown(slot) {
174
+ return !promptHere(slot) && slot.transient.length > 0 && !slot.transientIsError && !slot.stickyHere && !slot.searching
175
+ }
176
+
177
+ // The selection's byte total, or -1 when the bar may not claim one. StatusBar board rule 3: every
178
+ // selected row has to be held and every size known and complete, and nothing here starts a sweep.
179
+ // A file carries its own bytes; a directory has them only from a finished DirSizes answer.
180
+ function selectionBytes(pane) {
181
+ var count = pane.selection.count()
182
+ // More rows selected than the window holds means at least one of them is not here to measure.
183
+ if (count === 0 || count > pane.rows.length) {
184
+ return -1
185
+ }
186
+ var indices = pane.selection.indices()
187
+ var bytes = 0
188
+ for (var i = 0; i < indices.length; i++) {
189
+ var row = pane.rows[indices[i] - pane.held]
190
+ if (!row) {
191
+ return -1
192
+ }
193
+ if (row.d) {
194
+ var walked = DirSizes.known(DirSizes.sizeFor(pane.dirSizeState, indices[i]), row)
195
+ if (!walked || walked.partial) {
196
+ return -1
197
+ }
198
+ bytes += walked.bytes
199
+ continue
200
+ }
201
+ bytes += row.s
202
+ }
203
+ return bytes
204
+ }
205
+
206
+ // Each backend numbers its own transfers, so an id is meaningful only with its pane owner.
207
+ function activityChanged(activities, owner, text, transfer, starting) {
208
+ var next = activities.slice()
209
+ var at = next.findIndex(function (activity) { return activity.owner === owner })
210
+ if (!text) {
211
+ if (at >= 0) next.splice(at, 1)
212
+ return next
213
+ }
214
+ var previous = at >= 0 ? next[at] : null
215
+ var activity = { owner: owner, text: text, transfer: transfer, starting: starting === true,
216
+ cancelling: !!(previous && previous.transfer.id === transfer.id && previous.cancelling) }
217
+ if (at >= 0) next[at] = activity
218
+ else next.push(activity)
219
+ return next
220
+ }
221
+
222
+ function cancelActivity(activities) {
223
+ if (!activities.length || !activities[0].transfer.running || activities[0].cancelling)
224
+ return activities
225
+ var next = activities.slice()
226
+ next[0] = Object.assign({}, next[0], { cancelling: true })
227
+ return next
228
+ }
229
+
230
+ // One marked item wins; otherwise name the visible cursor row, including in a
231
+ // multi-selection. Reuse display names so Trash never leaks collision-safe names.
232
+ function fileName(pane) {
233
+ if (!pane || pane.listInFlight) return ""
234
+ var indices = pane.selection.indices()
235
+ var index = indices.length === 1 ? indices[0] : pane.cursorIndex
236
+ if (indices.length !== 1 && pane.shown !== null && pane.shown.indexOf(index) < 0) return ""
237
+ return Match.rowName(pane.rowFor(index), true)
238
+ }
package/ui/js/Swap.js ADDED
@@ -0,0 +1,166 @@
1
+ .pragma library
2
+
3
+ // The listing swap's decisions, see AGENTS.md "The listing swap"; ui/PaneSwap.qml holds the state and the timer.
4
+
5
+ // Both swaps' cap, the pane mark's hold-off and a PDF page render's cap: with four 120 Hz frames for input, the Timer and the draw, the mark shows by 100 ms.
6
+ var CAP_MS = 66
7
+
8
+ // The hold-off of a loading state nothing keeps MIN_SHOW_MS: LoadingState outside the pane, the folder fallback, a search walk's mark.
9
+ var HOLD_MS = 150
10
+
11
+ // A drawn loading state stands this long before content replaces it; under 100 ms the two changes read as one blink.
12
+ var MIN_SHOW_MS = 100
13
+
14
+ // Answered while a listing is out: the navigations take its place, escape touches no row, the rest change the window.
15
+ var ANSWERED_WHILE_LISTING = ["open", "parent", "historyBack", "historyForward", "escape",
16
+ "viewList", "viewColumns", "viewGrid", "viewDual", "sidebar", "windowNew", "togglePreview",
17
+ "reload"]
18
+
19
+ // What a swallowed key says, the sentence every refused navigation already gives.
20
+ var LOADING = "A directory is already loading."
21
+
22
+ // What a listed or rows line does: dropped, kept for the rows behind it, applied alone, or landed with the kept line.
23
+ var DROP = "drop"
24
+ var KEEP = "keep"
25
+ var APPLY = "apply"
26
+ var LAND = "land"
27
+ var WAIT = "wait"
28
+
29
+ function idle() {
30
+ return { holding: false, listed: null, fellBack: false, waits: false, walk: false, query: "", since: 0, relist: false }
31
+ }
32
+
33
+ // Only a settled listing is held, plus a walk's drawn state for a listing after it; see ui/PaneSwap.qml hold.
34
+ function begin(state, listingState, searchMode, ask, now) {
35
+ // The exit holds the whole search state, strip and rows, until the folder lands in one turn.
36
+ var exit = ask.holdWalk === true
37
+ var afterWalk = state.walk === true && !exit
38
+ var holding = ask.clearAtOnce !== true && listingState !== "loading" && (searchMode === "" || exit) && !afterWalk
39
+ // An unheld Back or Forward still keeps its listed line, so the count, the rows and the cursor land in one turn.
40
+ var waits = !holding && !!ask.restore && String(ask.restore.name || "").length > 0
41
+ return { holding: holding, listed: null, fellBack: false, waits: waits, walk: state.walk, query: ask.keptQuery || "", since: now,
42
+ relist: ask.relist === true }
43
+ }
44
+
45
+ // A session line lands only on its open session's newest sent gen; a closed exit's lines never land either.
46
+ function dropSessionLine(searchMode, gen, searchGen, leaving, openedGen) {
47
+ if (gen > 0 && leaving === true) {
48
+ return true
49
+ }
50
+ return gen > 0 && ((searchMode || "").length === 0 || gen !== searchGen || gen <= (openedGen || 0))
51
+ }
52
+
53
+ // A live answer holds old rows until its own rows land, no listing out.
54
+ function keepLive(searchMode, inFlight) {
55
+ return (searchMode || "").length > 0 && inFlight !== true
56
+ }
57
+
58
+ // While a list is out, only a listed line naming the directory asked for answers it; an earlier sort's or search's is dropped.
59
+ // Held rows, a fallback or a loading mark already drawn keep it for the rows, so the mark never gives way to a count over none.
60
+ function onListed(state, inFlight, path, asked, marked) {
61
+ if (inFlight === true && path.length > 0 && path !== asked)
62
+ return DROP
63
+ return state.holding || state.fellBack || state.waits || marked === true ? KEEP : APPLY
64
+ }
65
+
66
+ // A rows line ahead of its listed line answers a listing already replaced; one behind a kept listed line lands with it,
67
+ // once the loading mark it replaces has stood waitMs more.
68
+ function onRows(state, inFlight, listedSeen, waitMs) {
69
+ if (inFlight === true && listedSeen !== true)
70
+ return DROP
71
+ if (state.listed === null)
72
+ return APPLY
73
+ return waitMs > 0 ? WAIT : LAND
74
+ }
75
+
76
+ // How much longer a loading state drawn at since stands before it may go; 0 when none is drawn.
77
+ function showLeft(since, now) {
78
+ return since > 0 ? Math.max(0, since + MIN_SHOW_MS - now) : 0
79
+ }
80
+
81
+ // How long a held listing begun at state.since still holds before it falls back; -1 when nothing is held.
82
+ function capLeft(state, now) {
83
+ return state.holding === true ? Math.max(0, state.since + CAP_MS - now) : -1
84
+ }
85
+
86
+ // The pane mark's hold-off: a directory listing keeps its mark MIN_SHOW_MS, so it draws at the cap; a walk's does not.
87
+ function markHoldOff(searchMode) {
88
+ return (searchMode || "") === "" ? CAP_MS : HOLD_MS
89
+ }
90
+
91
+ // A directory listing out under a drawn mark; a walk's or a search's matches stream into a loading pane, never waiting on it.
92
+ function marked(since, inFlight, searchMode, walk) {
93
+ return since > 0 && inFlight === true && (searchMode || "") === "" && walk !== true
94
+ }
95
+
96
+ function kept(state, listed) {
97
+ return Object.assign({}, state, { listed: listed })
98
+ }
99
+
100
+ // Every listed line that is applied rather than kept says whether the rows it brings are a walk's.
101
+ function heard(state, walk) {
102
+ return Object.assign({}, state, { walk: walk === true })
103
+ }
104
+
105
+ // A held listing is only ever a directory's, which is what begin() asked for.
106
+ function landed(state) {
107
+ return Object.assign({}, state, { holding: false, listed: null, fellBack: false, waits: false, walk: false, relist: false })
108
+ }
109
+
110
+ // The cap ran out: the pane shows the loading state until the rows land, and a listed line already kept waits for them.
111
+ function expired(state) {
112
+ return Object.assign({}, state, { holding: false, fellBack: true })
113
+ }
114
+
115
+ // A failed or refused listing ends the hold without a swap; the failure draws what it always did.
116
+ function dropped(state) {
117
+ return Object.assign({}, state, { holding: false, listed: null, fellBack: false, waits: false, relist: false })
118
+ }
119
+
120
+ // The listing is no longer out, however it ended.
121
+ function ended(state) {
122
+ return Object.assign({}, state, { holding: false, listed: null, fellBack: false, waits: false, relist: false })
123
+ }
124
+
125
+ // A stale or window refusal ended only its own request, and so does a scan failure naming a folder no longer asked for; any other failure ends the listing, letting held rows go while it is still out.
126
+ function failListing(pane, where, path) {
127
+ if (where === "stale" || where === "window")
128
+ return false
129
+ if (where === "scan" && !!path && path !== pane.listingPath)
130
+ return false
131
+ // An Esc relist that died leaves no cursor file armed for whatever listing comes next.
132
+ if (pane.swap.phase.relist === true)
133
+ pane.pendingSelect = ""
134
+ pane.swap.drop()
135
+ pane.listInFlight = false
136
+ pane.listedSeen = false
137
+ return true
138
+ }
139
+
140
+ // Sample input: {"c":"transfer","op":"move","rows":[3],"dest":"/home/gm/omarchy"} with held 7 gains "listing":7, unless it names one.
141
+ function named(request, held) {
142
+ if (request.rows === undefined || request.listing !== undefined || !(held > 0))
143
+ return request
144
+ return Object.assign({}, request, { listing: held })
145
+ }
146
+
147
+ // A key swallowed while a listing is out, held or loading: the backend already numbers rows for the directory asked for.
148
+ function swallows(inFlight, action) {
149
+ return inFlight === true && action.length > 0 && ANSWERED_WHILE_LISTING.indexOf(action) < 0
150
+ }
151
+
152
+ // A re-sort renumbers every row without a new list, so a selection made while it was in flight names other files once the new numbering lands.
153
+ function clearsSelection(oldHeld, listing) {
154
+ return oldHeld > 0 && listing > 0 && listing !== oldHeld
155
+ }
156
+
157
+ // A blank frame: a listing out and loading before the cap, or no row drawn while a live count still names rows.
158
+ function frameKind(inFlight, listingState, fellBack, drawn, named, live) {
159
+ if (inFlight === true && listingState === "loading") {
160
+ return fellBack === true ? "loading" : "blank"
161
+ }
162
+ if (live === true && drawn === 0 && named > 0) {
163
+ return "blank"
164
+ }
165
+ return ""
166
+ }
@@ -0,0 +1,39 @@
1
+ .pragma library
2
+
3
+ // Reorder is pure with no pane; Tabs.js snapshots around it.
4
+ // Sample input: items ["a","b","c"], from 0.
5
+
6
+ // A drag names the insertion point, not the tab it takes.
7
+ function insertionAt(x, tabWidth, count) {
8
+ if (!(tabWidth > 0) || !(count > 0))
9
+ return 0
10
+ return Math.max(0, Math.min(count, Math.floor(x / tabWidth + 0.5)))
11
+ }
12
+
13
+ // The { and } keys move one place, clamping at either end rather than wrapping.
14
+ function step(from, delta, count) {
15
+ return Math.max(0, Math.min(count - 1, from + delta))
16
+ }
17
+
18
+ // A favourite drag answers where the row lands and the line draws: (40, 1, 30, 5) drops at 2, line at 3.
19
+ function railReorder(dy, from, rowHeight, count) {
20
+ var n = Math.max(1, count)
21
+ var step = Math.round(dy / rowHeight)
22
+ return { to: Math.max(0, Math.min(n - 1, from + step)),
23
+ line: Math.max(0, Math.min(n, from + step + (dy >= 0 ? 1 : 0))) }
24
+ }
25
+
26
+ // A move keeps the current tab current: the dragged tab follows its destination, and a crossed tab shifts back.
27
+ function reorder(items, from, to, index) {
28
+ if (from < 0 || from >= items.length || to < 0 || to >= items.length || from === to)
29
+ return index
30
+ var moving = items.splice(from, 1)[0]
31
+ items.splice(to, 0, moving)
32
+ if (index === from)
33
+ return to
34
+ if (from < index && to >= index)
35
+ return index - 1
36
+ if (from > index && to <= index)
37
+ return index + 1
38
+ return index
39
+ }