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,380 @@
1
+ import QtQuick
2
+ import qs.Commons
3
+ import "." as Flea
4
+ import "js/Drag.js" as DragOps
5
+ import "js/Icons.js" as Icons
6
+ import "js/LangMarks.js" as LangMarks
7
+ import "js/Format.js" as Format
8
+ import "js/DirSizes.js" as DirSizes
9
+ import "js/Match.js" as Match
10
+
11
+ // One row of a Miller column: a mark, a name, and the chevron a chosen directory carries. Simpler
12
+ // than a list row on purpose, because a column has no size, date, mode or kind to draw.
13
+ Item {
14
+ id: root
15
+
16
+ // {n, d, i} as a peek answers them, or a listing row, which carries the same three fields.
17
+ property var row: null
18
+ // The pane's thumbnail path for this row, empty for a peek's row: only the listing's own column asks for any.
19
+ property string thumb: ""
20
+ // A path is not a thumbnail: a cache file evicted between the answer and the decode leaves the mark to the glyph.
21
+ readonly property bool thumbDrawn: root.thumb.length > 0 && thumbImage.status !== Image.Error
22
+ // One filename lookup; only a mapped row without a thumbnail builds the mark's Loader.
23
+ readonly property string langSlug: ViewState.langMarks ? LangMarks.slugForRow(root.row) : ""
24
+ property var langLoader: null
25
+ function syncLangMark() { LangMarks.syncMark(root, markGlyph, Qt.resolvedUrl("LangMarkLoader.qml"), Component.Ready) }
26
+ onLangSlugChanged: root.syncLangMark()
27
+ onThumbDrawnChanged: root.syncLangMark()
28
+ readonly property alias iconStatus: thumbImage.status
29
+ readonly property Item thumbItem: thumbImage
30
+ // The row this column's own cursor is on. Only the active column paints it in the accent.
31
+ property bool cursor: false
32
+ // A member of the pane's selection, which only the column drawing the pane's own listing has.
33
+ property bool selected: false
34
+ // The same row in an ancestor column: the cursor trail, lifted like a hover rather than accented.
35
+ property bool lifted: false
36
+ // The active column draws a size; a peek column cannot ask for one and leaves this false.
37
+ property bool showSize: false
38
+ // The recursive size of a directory row, resolved by index the way the list resolves it.
39
+ property var dirSize: null
40
+ // An ancestor column that is not on the trail reads back, so its text drops to muted.
41
+ property bool dim: false
42
+ property bool hovered: false
43
+ // False while ui/ColumnPane.qml's view holds the row pooled, which parks its listing reads and turns its hover off.
44
+ property bool live: true
45
+ ListView.onPooled: root.live = false
46
+ ListView.onReused: root.live = true
47
+ property bool dropTarget: false
48
+ property bool dropCopying: false
49
+ property bool dropLinking: false
50
+ // The area derives it per visible row, so an empty clipboard costs nothing.
51
+ property string clipMark: ""
52
+ // A cut row dims to the ClipMarks board's own opacity, content only.
53
+ readonly property bool clipCut: root.clipMark === "scissors"
54
+ // One dim for the content below, so one ternary serves the mark, the name and the size.
55
+ readonly property real dimOpacity: root.clipCut ? Theme.disabledOpacity : 1
56
+ // One helper, so each dimmed colour multiplies the cut without a second binding.
57
+ function dimmed(base) { return Util.alpha(base, root.dimOpacity) }
58
+ // The mark's own size: 12 px in the muted role, 9 px after the name, per the board.
59
+ readonly property int clipPx: Theme.clipMarkSize
60
+ // The pane's own column hands it over; a peek has none and never marks.
61
+ property var pane: null
62
+ // The column is drawn: a hidden Columns view keeps its rows still and builds no mark on them.
63
+ readonly property bool shown: root.ListView.view === null || root.ListView.view.visible
64
+ // The query List marks on this row, "" for none: a search's answered query, else the "/" filter's.
65
+ readonly property string markQuery: root.pane === null || !root.shown ? "" : root.pane.filterQuery.length > 0 ? root.pane.filterQuery : root.pane.searchMode.length > 0 ? root.pane.swap.answeredQuery : ""
66
+ readonly property bool marking: root.markQuery.length > 0 && root.row !== null
67
+ // List's markArmed: built with the filter strip, or after a search strip's first frame on pooled rows too, so no key or answer builds it.
68
+ readonly property bool markArmed: root.shown && root.pane !== null && (root.pane.searchMode.length > 0 ? root.pane.swap.searchWarm === true : root.row !== null && (root.pane.filterTyping || root.pane.filterQuery.length > 0))
69
+ // The column hands one budget for every row, with ElideMiddle as the backstop.
70
+ property int nameBudget: -1
71
+ property real paintWidth: 0 // Caller view width; fills paint to it under the lane, content keeps rowWidth.
72
+
73
+ // Truthiness, like the two readers below: ui/ColumnPane.qml hands this rows[index] raw, so a
74
+ // listing that shrank leaves a surviving delegate holding undefined, which is not null.
75
+ readonly property bool isDir: !!root.row && root.row.d === true
76
+ // The cut dim lives in the ink, so no child carries its own opacity binding.
77
+ readonly property color ink: root.dimmed(root.cursor ? Theme.color.accent : root.dim ? Theme.color.muted : Theme.color.foreground)
78
+
79
+ // ui/ColumnPane.qml sets it on the renaming (cursor) row: the error line pushes the rows below down as ui/Row.qml's does.
80
+ property real errorGrowth: 0
81
+ // Set by ui/ColumnPane.qml while its editor stands over this row, so the name under it is not drawn twice.
82
+ property bool renaming: false
83
+ // The editor is drawn over the row by ui/ColumnPane.qml, so its y is plain arithmetic on this row height.
84
+ implicitHeight: Theme.fileRowHeight + root.errorGrowth
85
+
86
+ Rectangle {
87
+ width: root.paintWidth > 0 ? root.paintWidth : parent.width
88
+ height: parent.height
89
+ // Match the active listing's cursor and marked-selection roles.
90
+ color: root.cursor ? Style.selectedAccentFill
91
+ : root.selected ? Style.selectionFill
92
+ : root.lifted ? Style.hoverFill
93
+ : root.hovered ? Style.hoverFill
94
+ : "transparent"
95
+ }
96
+
97
+ Rectangle {
98
+ width: Theme.spacing.hairline * 2
99
+ height: parent.height
100
+ color: root.cursor ? Theme.color.accent : "transparent"
101
+ }
102
+
103
+ // The drop wash builds behind the row content, so the accent never tints the text.
104
+ Loader {
105
+ id: washLoader
106
+ active: root.dropTarget
107
+ width: root.paintWidth > 0 ? root.paintWidth : parent.width
108
+ height: parent.height
109
+ // The board's accent hairline over a faint wash at the hover rung's alpha: the token wins over the mock's own 0.07.
110
+ sourceComponent: Rectangle {
111
+ anchors.fill: parent
112
+ color: Util.alpha(Theme.color.accent, Style.hoverFillAlpha)
113
+ border.width: Theme.spacing.hairline
114
+ border.color: Theme.color.accent
115
+ }
116
+ }
117
+
118
+ // The row's first line: its content centres here, so an error line that grows the row never moves the name.
119
+ Item {
120
+ id: line
121
+ width: parent.width
122
+ height: Theme.fileRowHeight
123
+ }
124
+
125
+ Item {
126
+ id: markSlot
127
+ anchors.left: parent.left
128
+ anchors.leftMargin: Theme.spacing.rowPaddingX
129
+ anchors.verticalCenter: line.verticalCenter
130
+ width: Theme.iconSize
131
+ height: Theme.iconSize
132
+
133
+ // Sized on purpose, the same decode arm as ui/Row.qml: the cache PNG is capped at the icon's own size.
134
+ Image {
135
+ id: thumbImage
136
+ anchors.fill: parent
137
+ visible: root.thumbDrawn
138
+ opacity: root.dimOpacity
139
+ sourceSize.width: Theme.iconSize
140
+ sourceSize.height: Theme.iconSize
141
+ fillMode: Image.PreserveAspectFit
142
+ asynchronous: true
143
+ // No cache by URL: a regenerated thumbnail keeps its path, and a cached decode would keep the old pixels.
144
+ cache: false
145
+ source: root.thumb.length > 0 ? Format.fileUri(root.thumb) : ""
146
+ }
147
+
148
+ Flea.Glyph {
149
+ id: markGlyph
150
+ anchors.fill: parent
151
+ visible: !root.thumbDrawn && root.langSlug === ""
152
+ name: root.row ? Icons.glyphForRow(root.row.i, root.row.p) : "file"
153
+ color: root.dimmed(root.cursor ? Theme.color.accent : Theme.color.mutedFrame)
154
+ }
155
+ }
156
+
157
+ // corner: arbitrary filename text draws PlainText and elides in the middle per Names040.
158
+ Text {
159
+ id: nameText
160
+ anchors.left: markSlot.right
161
+ anchors.leftMargin: Theme.spacing.gap
162
+ anchors.right: sizeCell.left
163
+ anchors.rightMargin: (root.row && root.row.shown ? Theme.tagSlotWidth + Theme.spacing.gap : 0) + (root.showSize ? Theme.spacing.gap : 0) + (root.clipMark.length > 0 ? Theme.spacing.gap + root.clipPx : 0)
164
+ anchors.verticalCenter: line.verticalCenter
165
+ visible: !root.renaming && !root.marking
166
+ text: root.row && root.nameBudget >= 0 ? Format.middleElide(Match.rowName(root.row, false), Math.max(0, root.nameBudget - (root.clipMark.length > 0 ? Math.ceil((Theme.spacing.gap + root.clipPx) / Theme.bodyAdvance) : 0))) : Match.rowName(root.row, false)
167
+ color: root.ink
168
+ font.family: Theme.font.family
169
+ font.pixelSize: Theme.font.body
170
+ textFormat: Text.PlainText
171
+ elide: Text.ElideMiddle
172
+ }
173
+
174
+ // A tagged row mounts its swatches (ui/TagSlot.qml) on first need and keeps them; an untagged row builds nothing.
175
+ property var tagItem: null
176
+ onRowChanged: {
177
+ var names = root.row ? root.row.tg : undefined
178
+ if (root.tagItem !== null) root.tagItem.tags = names || []
179
+ else if (names !== undefined) root.tagItem = Qt.createComponent("TagSlot.qml").createObject(root, { tags: names, after: nameText, hug: true })
180
+ }
181
+
182
+ // Only the active column carries a number (ColumnsTabs board rule 3); the size holds its right edge off the parent by the chevron width.
183
+ Text {
184
+ id: sizeCell
185
+ anchors.right: parent.right
186
+ anchors.rightMargin: Theme.spacing.rowPaddingX + chevronSlot.width + (root.showSize ? Theme.spacing.gap : 0)
187
+ anchors.verticalCenter: line.verticalCenter
188
+ visible: root.showSize && !root.dropTarget
189
+ width: visible ? Theme.column.size : 0
190
+ text: root.showSize && root.row ? root.sizeText() : ""
191
+ color: root.ink
192
+ horizontalAlignment: Text.AlignRight
193
+ font.family: Theme.font.family
194
+ font.pixelSize: Theme.font.caption
195
+ textFormat: Text.PlainText
196
+ // A narrow cell loses the ⚖️ before any digit of the size.
197
+ elide: Text.ElideLeft
198
+ }
199
+
200
+ // The drop label, the clip mark and the match mark build above the row content, so a row at rest builds none.
201
+ Loader {
202
+ id: dropClipLoader
203
+ active: root.dropTarget || root.clipMark.length > 0 || root.marking || root.markArmed
204
+ anchors.fill: line
205
+ sourceComponent: Item {
206
+ readonly property Item label: dropParts.item ? dropParts.item.label : null
207
+ readonly property Item mark: dropParts.item ? dropParts.item.mark : null
208
+ property alias names: markContent
209
+ anchors.fill: parent
210
+ // List's match mark and search split, built while a query marks or the strip is up: a row at rest builds none.
211
+ Loader {
212
+ id: markContent
213
+ active: root.marking || root.markArmed
214
+ x: root.markX()
215
+ width: root.markWidth()
216
+ height: parent.height
217
+ visible: root.marking && !root.renaming
218
+ sourceComponent: Item {
219
+ id: markParts
220
+ property alias label: matchName
221
+ readonly property Item folder: folderLoader.item as Item
222
+ // A search row draws its folder beside the name, as List's locating rows do; a "/" filter row keeps the plain name.
223
+ readonly property bool locating: root.pane !== null && root.pane.searchMode.length > 0
224
+ readonly property string path: root.row ? root.row.n : ""
225
+ readonly property string shownName: Match.rowName(root.row, markParts.locating)
226
+ readonly property var run: Match.run(shownName, root.markQuery)
227
+ Flea.MatchText {
228
+ id: matchName
229
+ anchors.left: parent.left
230
+ anchors.verticalCenter: parent.verticalCenter
231
+ width: markParts.locating ? Math.min(implicitWidth, parent.width * Theme.searchNameShare) : parent.width
232
+ text: parent.shownName
233
+ matchStart: parent.run.start
234
+ matchLength: parent.run.length
235
+ color: root.ink
236
+ accent: root.dimmed(Theme.color.accent)
237
+ armed: root.markArmed
238
+ elideMiddle: true
239
+ }
240
+ // Only a search row draws its folder; a "/" filter row builds none.
241
+ Loader {
242
+ id: folderLoader
243
+ active: markParts.locating
244
+ anchors.left: matchName.right
245
+ anchors.leftMargin: Theme.spacing.gap + (root.clipMark.length > 0 ? Theme.spacing.gap + root.clipPx : 0)
246
+ anchors.right: parent.right
247
+ anchors.verticalCenter: parent.verticalCenter
248
+ sourceComponent: Text {
249
+ text: Match.location(markParts.path)
250
+ // List's metadata ink (ui/Row.qml cellInk): foreground on a lifted row, a darker foreground at rest.
251
+ color: root.dimmed(root.cursor || root.lifted || root.hovered || root.selected || root.dropTarget ? Theme.color.foreground : Theme.color.metadata)
252
+ font.family: Theme.font.family
253
+ font.pixelSize: Theme.font.caption
254
+ elide: Text.ElideLeft
255
+ textFormat: Text.PlainText
256
+ }
257
+ }
258
+ }
259
+ }
260
+ // Built only on a drop target or a clipped row, so a marked row builds neither.
261
+ Loader {
262
+ id: dropParts
263
+ active: root.dropTarget || root.clipMark.length > 0
264
+ anchors.fill: parent
265
+ sourceComponent: Item {
266
+ property alias label: dropLabel
267
+ property alias mark: clipMarkGlyph
268
+ // The label the glyph follows: the match label while a query marks, else the plain name.
269
+ readonly property Item clipLabel: root.marking && markContent.item ? markContent.item.label : nameText
270
+ Text {
271
+ id: dropLabel
272
+ visible: root.dropTarget
273
+ anchors.right: parent.right
274
+ anchors.rightMargin: Theme.spacing.rowPaddingX
275
+ anchors.verticalCenter: parent.verticalCenter
276
+ text: DragOps.label(root.dropCopying, root.dropLinking)
277
+ color: Theme.color.accent
278
+ font.family: Theme.font.family
279
+ font.pixelSize: Theme.font.caption
280
+ textFormat: Text.PlainText
281
+ }
282
+ // The board's own nudge: the mark sits one pixel above the text centre line.
283
+ Flea.Glyph {
284
+ id: clipMarkGlyph
285
+ visible: root.clipMark.length > 0
286
+ width: root.clipPx
287
+ height: root.clipPx
288
+ x: (root.marking && markContent.item ? markContent.x : 0) + parent.clipLabel.x + Math.min(parent.clipLabel.implicitWidth, parent.clipLabel.width) + Theme.spacing.gap
289
+ anchors.verticalCenter: parent.verticalCenter
290
+ anchors.verticalCenterOffset: -1
291
+ name: root.clipMark
292
+ color: Theme.color.mutedFrame
293
+ }
294
+ }
295
+ }
296
+ }
297
+ }
298
+
299
+ // The list's own cell text, so a size reads the same wherever it is drawn.
300
+ function sizeText() {
301
+ if (Format.isSymlink(root.row.p)) return "link"
302
+ if (!root.row.d) return Format.size(root.row.s)
303
+ return DirSizes.folderText(root.dirSize, root.row)
304
+ }
305
+
306
+ // A folder's Size cell takes a click: measure it, as ui/Row.qml's does.
307
+ function onSizeCell(point) {
308
+ if (!root.row || !root.row.d || Format.isSymlink(root.row.p) || !sizeCell.visible || sizeCell.width <= 0) return false
309
+ var at = sizeCell.mapFromItem(root, point.x, point.y)
310
+ return at.x >= 0 && at.x < sizeCell.width
311
+ }
312
+
313
+ // Only a chosen directory carries it: it says the column to the right is showing what is inside.
314
+ Item {
315
+ id: chevronSlot
316
+ anchors.right: parent.right
317
+ anchors.rightMargin: Theme.spacing.rowPaddingX
318
+ anchors.verticalCenter: line.verticalCenter
319
+ width: root.dropTarget && dropClipLoader.item && dropClipLoader.item.label ? dropClipLoader.item.label.implicitWidth : root.showChevron ? Theme.font.caption : 0
320
+ height: root.dropTarget && dropClipLoader.item && dropClipLoader.item.label ? dropClipLoader.item.label.implicitHeight : Theme.font.caption
321
+
322
+ // Built only on the row that draws it, so a row at rest holds no Shape for it, and kept once built so a cursor that moves on hides it without a destroy and rebuild in the frame an answer lands.
323
+ Loader {
324
+ id: chevronLoader
325
+ property bool built: false
326
+ readonly property bool drawn: root.showChevron && !root.dropTarget
327
+ anchors.fill: parent
328
+ visible: drawn
329
+ active: built || drawn
330
+ onDrawnChanged: if (drawn) built = true
331
+ Component.onCompleted: if (drawn) built = true
332
+ sourceComponent: Flea.Glyph {
333
+ name: "chevron-right"
334
+ color: root.cursor ? Theme.color.accent : Theme.color.mutedFrame
335
+ }
336
+ }
337
+ }
338
+
339
+ readonly property bool showChevron: root.isDir && (root.cursor || root.lifted)
340
+
341
+ HoverHandler {
342
+ id: hover
343
+ enabled: root.live
344
+ onHoveredChanged: root.hovered = hovered
345
+ }
346
+
347
+ // Test seam as functions, so no row at rest binds to name geometry (tests/columnscost.qml).
348
+ function clipGlyph() { var m = dropClipLoader.item ? dropClipLoader.item.mark : null; return m && m.visible && m.width > 0 ? m : null }
349
+ function dropClipBuilt() { return dropClipLoader.item !== null && dropClipLoader.item.mark !== null }
350
+ function clipX() { var m = root.clipGlyph(); return m ? m.x : 0 }
351
+ // Paint order as a value: the wash builds behind the content, the label and mark above it.
352
+ function stackingOk() {
353
+ var kids = root.children
354
+ var wash = -1
355
+ var mark = -1
356
+ var top = -1
357
+ for (var i = 0; i < kids.length; i++) {
358
+ if (kids[i] === washLoader) wash = i
359
+ if (kids[i] === markSlot) mark = i
360
+ if (kids[i] === dropClipLoader) top = i
361
+ }
362
+ return wash >= 0 && mark >= 0 && top >= 0 && wash < mark && top > mark
363
+ }
364
+ function clipExpectedX() { var n = root.nameItem(); return n.mapToItem(root, 0, 0).x + Math.min(n.implicitWidth, n.width) + Theme.spacing.gap }
365
+ // Where a marked label starts and how wide it may run: after the mark slot, short of the size cell and the clip mark.
366
+ function markX() { return markSlot.x + markSlot.width + Theme.spacing.gap }
367
+ function markWidth() { return Math.max(0, sizeCell.x - root.markX() - (root.showSize ? Theme.spacing.gap : 0) - (root.clipMark.length > 0 ? Theme.spacing.gap + root.clipPx : 0)) }
368
+ function displayText() { return nameText.text }
369
+ // The drawn label: the match mark while a query marks, so a slow click still lands on the visible name.
370
+ function markPart() { var c = root.marking ? dropClipLoader.item : null; return c ? c.names.item : null }
371
+ function nameItem() { var p = root.markPart(); return p ? p.label : nameText }
372
+ function folderItem() { var p = root.markPart(); return p ? p.folder : null }
373
+ function markItem() { return markGlyph }
374
+ function sizeItem() { return sizeCell }
375
+ // Row-relative boxes for the geometry suite, so the probe reads the drawn layout and not the source.
376
+ function markRight() { return markSlot.x + markSlot.width }
377
+ function nameGeom() { return [nameText.x, nameText.width] }
378
+ function sizeGeom() { return [sizeCell.x, sizeCell.width] }
379
+ function chevronGeom() { return [chevronSlot.x, chevronSlot.width] }
380
+ }