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,172 @@
1
+ import QtQuick
2
+ import qs.Commons
3
+ import qs.Commons as Commons
4
+
5
+ Item {
6
+ id: root
7
+
8
+ property var bar: null
9
+ property string text: ""
10
+ property string fontFamily: bar ? bar.fontFamily : Style.font.family
11
+ property real fontSize: Style.font.body
12
+ property color foreground: bar ? bar.barForeground : Commons.Color.foreground
13
+ property color activeColor: bar ? bar.urgent : Commons.Color.urgent
14
+ property bool active: false
15
+ property real horizontalMargin: 8.5
16
+ property real verticalPadding: 6
17
+ property real fixedWidth: -1
18
+ property real fixedHeight: -1
19
+ property real textRotation: 0
20
+ property bool keepSpace: false
21
+ property bool dimmed: false
22
+ property bool concealed: false
23
+ property bool interactive: true
24
+ property bool pressable: true
25
+ property bool useActiveColor: true
26
+ property bool maintainIndicatorReveal: false
27
+ property bool labelVisible: true
28
+ // Off for icon-font labels, whose figure metrics say nothing about the glyph.
29
+ property bool centerFigures: true
30
+ property bool hasVisualContent: text !== ""
31
+ property var revealHost: bar
32
+ property string tooltipText: ""
33
+ property var registeredBar: null
34
+
35
+ signal pressed(int button)
36
+ signal wheelMoved(int delta)
37
+
38
+ function triggerPress(button) {
39
+ if (root.bar) root.bar.hideTooltip(root)
40
+ root.pressed(button)
41
+ }
42
+
43
+ function hideOwnTooltip() {
44
+ if (root.bar) root.bar.hideTooltip(root)
45
+ }
46
+
47
+ function syncClickRegistration() {
48
+ if (registeredBar && registeredBar.unregisterClickTarget) registeredBar.unregisterClickTarget(root)
49
+ registeredBar = root.bar
50
+ if (registeredBar && registeredBar.registerClickTarget) registeredBar.registerClickTarget(root)
51
+ }
52
+
53
+ onBarChanged: syncClickRegistration()
54
+ onVisibleChanged: if (!visible) hideOwnTooltip()
55
+ onInteractiveChanged: if (!interactive) hideOwnTooltip()
56
+ onConcealedChanged: if (concealed) hideOwnTooltip()
57
+ Component.onCompleted: syncClickRegistration()
58
+ Component.onDestruction: if (registeredBar && registeredBar.unregisterClickTarget) registeredBar.unregisterClickTarget(root)
59
+
60
+ readonly property bool vertical: bar ? bar.vertical : false
61
+ readonly property int barSize: bar ? bar.barSize : Style.bar.sizeHorizontal
62
+ readonly property real scaledHorizontalMargin: Style.spaceReal(horizontalMargin)
63
+ readonly property real scaledVerticalPadding: Style.spaceReal(verticalPadding)
64
+ readonly property bool tooltipHovered: visible && interactive && !concealed && mouseArea.containsMouse
65
+ // Width of the painted label, for bar chrome that wants to line up with the
66
+ // text rather than with the slot it sits in. Zero on icon-only buttons.
67
+ readonly property real labelWidth: label.visible ? label.implicitWidth : 0
68
+ readonly property bool iconLabel: labelVisible && isIconGlyph(text)
69
+ readonly property real iconPaintedWidth: iconLabel && iconLoader.item ? iconLoader.item.paintedWidth : 0
70
+ readonly property real iconPaintedHeight: iconLabel && iconLoader.item ? iconLoader.item.paintedHeight : 0
71
+ readonly property real iconCenterErrorX: iconLabel && iconLoader.item
72
+ ? iconLoader.x + iconLoader.item.paintedCenterX - width / 2 : 0
73
+ readonly property real iconCenterErrorY: iconLabel && iconLoader.item
74
+ ? iconLoader.y + iconLoader.item.paintedCenterY - height / 2 : 0
75
+
76
+ function isIconGlyph(value) {
77
+ var text = String(value || "")
78
+ if (!text) return false
79
+ var code = text.codePointAt(0)
80
+ if (text.length !== (code > 0xffff ? 2 : 1)) return false
81
+ return (code >= 0xe000 && code <= 0xf8ff)
82
+ || (code >= 0xf0000 && code <= 0xffffd)
83
+ || (code >= 0x100000 && code <= 0x10fffd)
84
+ || (code >= 0x2190 && code <= 0x2bff)
85
+ }
86
+
87
+ visible: hasVisualContent || keepSpace
88
+ opacity: !hasVisualContent || concealed ? 0 : (dimmed ? 0.45 : 1)
89
+ implicitWidth: fixedWidth > 0 ? fixedWidth
90
+ : (vertical ? barSize : (iconLabel ? Style.bar.iconSlot : Math.max(12, label.implicitWidth + scaledHorizontalMargin * 2)))
91
+ implicitHeight: fixedHeight > 0 ? fixedHeight
92
+ : (vertical ? (iconLabel ? Style.bar.iconSlot : Math.max(12, label.implicitHeight + scaledVerticalPadding * 2)) : barSize)
93
+
94
+ Behavior on opacity {
95
+ NumberAnimation { duration: Style.duration(140); easing.type: Easing.OutCubic }
96
+ }
97
+
98
+ Text {
99
+ id: label
100
+ textFormat: Text.PlainText
101
+ visible: root.labelVisible && !root.iconLabel
102
+ anchors.centerIn: parent
103
+ // Centering the line box puts the figures above the bar's middle, since
104
+ // the box keeps room for descenders. Center the figure height instead, so
105
+ // labels line up with the icons beside them.
106
+ anchors.verticalCenterOffset: !root.centerFigures || root.vertical || root.text.indexOf("\n") !== -1
107
+ ? 0
108
+ : (labelMetrics.descent - labelMetrics.ascent + labelMetrics.tightBoundingRect("0").height) / 2
109
+ text: root.text
110
+ color: root.active && root.useActiveColor ? root.activeColor : root.foreground
111
+ font.family: root.fontFamily
112
+ font.pixelSize: root.fontSize
113
+ renderType: Text.NativeRendering
114
+ rotation: root.textRotation
115
+ horizontalAlignment: Text.AlignHCenter
116
+ verticalAlignment: Text.AlignVCenter
117
+
118
+ Behavior on color {
119
+ enabled: !root.bar || root.bar.foregroundAnimationEnabled
120
+ ColorAnimation { duration: Style.duration(160) }
121
+ }
122
+ }
123
+
124
+ FontMetrics {
125
+ id: labelMetrics
126
+ font: label.font
127
+ }
128
+
129
+ Loader {
130
+ id: iconLoader
131
+ active: root.iconLabel
132
+ width: Style.bar.iconCanvas
133
+ height: Style.bar.iconCanvas
134
+ x: (root.width - width) / 2
135
+ y: (root.height - height) / 2
136
+ sourceComponent: Component {
137
+ OpticalGlyph {
138
+ text: root.text
139
+ fontFamily: root.fontFamily
140
+ fontSize: root.fontSize
141
+ paintedSize: Style.bar.iconSize
142
+ color: root.active && root.useActiveColor ? root.activeColor : root.foreground
143
+ rotation: root.textRotation
144
+ }
145
+ }
146
+ }
147
+
148
+ MouseArea {
149
+ id: mouseArea
150
+ anchors.fill: parent
151
+ acceptedButtons: Qt.LeftButton | Qt.RightButton | Qt.MiddleButton
152
+ enabled: root.interactive
153
+ hoverEnabled: true
154
+ cursorShape: root.pressable ? Qt.PointingHandCursor : Qt.ArrowCursor
155
+ onEntered: {
156
+ if (root.bar) {
157
+ root.bar.showTooltip(root, root.tooltipText)
158
+ }
159
+ if (root.maintainIndicatorReveal && root.revealHost && root.revealHost.setIndicatorItemHovered)
160
+ root.revealHost.setIndicatorItemHovered(true)
161
+ }
162
+ onExited: {
163
+ if (root.bar) {
164
+ root.bar.hideTooltip(root)
165
+ }
166
+ if (root.maintainIndicatorReveal && root.revealHost && root.revealHost.setIndicatorItemHovered)
167
+ root.revealHost.setIndicatorItemHovered(false)
168
+ }
169
+ onClicked: function(mouse) { if (root.pressable) root.triggerPress(mouse.button) }
170
+ onWheel: function(wheel) { root.wheelMoved(wheel.angleDelta.y) }
171
+ }
172
+ }
@@ -0,0 +1,41 @@
1
+ module qs.Ui
2
+
3
+ BarIndicator 1.0 BarIndicator.qml
4
+ BarIconButton 1.0 BarIconButton.qml
5
+ BarIconContent 1.0 BarIconContent.qml
6
+ BarWidget 1.0 BarWidget.qml
7
+ BackgroundMedia 1.0 BackgroundMedia.qml
8
+ BorderOverlay 1.0 BorderOverlay.qml
9
+ BorderSurface 1.0 BorderSurface.qml
10
+ Button 1.0 Button.qml
11
+ ButtonGroup 1.0 ButtonGroup.qml
12
+ ConfirmDialog 1.0 ConfirmDialog.qml
13
+ CursorSurface 1.0 CursorSurface.qml
14
+ Dropdown 1.0 Dropdown.qml
15
+ FilterInput 1.0 FilterInput.qml
16
+ IconContentBounds 1.0 IconContentBounds.qml
17
+ KeyboardPanel 1.0 KeyboardPanel.qml
18
+ MultiSelect 1.0 MultiSelect.qml
19
+ NumberField 1.0 NumberField.qml
20
+ OpticalGlyph 1.0 OpticalGlyph.qml
21
+ OverlayWindow 1.0 OverlayWindow.qml
22
+ Panel 1.0 Panel.qml
23
+ PanelActionButton 1.0 PanelActionButton.qml
24
+ PanelController 1.0 PanelController.qml
25
+ PanelKeyCatcher 1.0 PanelKeyCatcher.qml
26
+ PanelHero 1.0 PanelHero.qml
27
+ PanelSectionHeader 1.0 PanelSectionHeader.qml
28
+ PanelSeparator 1.0 PanelSeparator.qml
29
+ PanelSlider 1.0 PanelSlider.qml
30
+ PanelToolTip 1.0 PanelToolTip.qml
31
+ PluginBarApi 1.0 PluginBarApi.qml
32
+ PointerMoveGate 1.0 PointerMoveGate.qml
33
+ ScreenMoveRemap 1.0 ScreenMoveRemap.qml
34
+ PopupCard 1.0 PopupCard.qml
35
+ SearchableDropdown 1.0 SearchableDropdown.qml
36
+ SizedImage 1.0 SizedImage.qml
37
+ SpeedTestOverlay 1.0 SpeedTestOverlay.qml
38
+ TextField 1.0 TextField.qml
39
+ Toggle 1.0 Toggle.qml
40
+ ToggleSwitch 1.0 ToggleSwitch.qml
41
+ WidgetButton 1.0 WidgetButton.qml
@@ -0,0 +1,50 @@
1
+ import QtQml
2
+ import Quickshell
3
+ import Quickshell.Io
4
+
5
+ // Only a validated tab's matching lift acknowledgment closes its source.
6
+ QtObject {
7
+ id: root
8
+
9
+ property var tabBar: null
10
+ property var view: null
11
+ property var panes: []
12
+ property var tabs: null
13
+ // Stage trace, on only with FLEA_TRACE_TABDRAG=1; read once, silent otherwise.
14
+ readonly property bool tabTrace: Quickshell.env("FLEA_TRACE_TABDRAG") === "1"
15
+ function traceTab(stage, detail) { if (root.tabTrace) console.log("TABDRAG " + stage + " pid=" + Quickshell.processId + " " + detail) }
16
+
17
+ property IpcHandler ack: IpcHandler {
18
+ target: "fleatab"
19
+ function taken(token: string): bool { return root.take(token) }
20
+ }
21
+
22
+ function take(token) {
23
+ root.traceTab("taken-call", "token=" + String(token) + " outToken=" + String(root.tabBar ? root.tabBar.outToken : "") + " outActive=" + String(root.tabBar ? root.tabBar.outActive : ""))
24
+ if (!root.tabBar || !root.tabs) return false
25
+ var lift = root.tabs.liftFor(root.tabBar.outstandingLifts, token)
26
+ if (!lift || !root.tabs.ackCloses(lift.token, token, lift.liftedAt, Date.now())) return false
27
+ if (root.tabs.resolveMovedTab(lift.pane, lift.identity) < 0) return false
28
+ lift.taken = true
29
+ root.tabBar.drainLifts()
30
+ root.traceTab("taken-recv", "token=" + String(token) + " result=accepted")
31
+ return true
32
+ }
33
+
34
+ property string launchPid: Quickshell.env("FLEA_TAB_SOURCE_PID") || ""
35
+ property string launchToken: Quickshell.env("FLEA_TAB_TOKEN") || ""
36
+ property string launchPath: Quickshell.env("FLEA_PATH") || ""
37
+ function openedLaunch(path) {
38
+ if (path !== root.launchPath || !/^[0-9]+$/.test(root.launchPid) || !root.launchToken || !root.tabBar) return
39
+ root.tabBar.sendTaken(root.launchPid, root.launchToken)
40
+ root.launchToken = ""
41
+ }
42
+ property Connections primaryAck: Connections {
43
+ target: root.panes.length > 0 ? root.panes[0] : null
44
+ function onOpened(path) { root.openedLaunch(path) }
45
+ }
46
+ property Connections secondaryAck: Connections {
47
+ target: root.panes.length > 1 ? root.panes[1] : null
48
+ function onOpened(path) { root.openedLaunch(path) }
49
+ }
50
+ }
@@ -0,0 +1,39 @@
1
+ // Its own app id, so one Hyprland rule can give the chooser the floating treatment Omarchy already
2
+ // gives xdg-desktop-portal-gtk without touching the window; flea --picker writes that rule.
3
+ //@ pragma AppId com.thisisgm.flea.picker
4
+ //@ pragma ShellId fleapicker
5
+ //@ pragma NativeTextRendering
6
+ //@ pragma CacheDir $BASE/flea
7
+
8
+ import Quickshell
9
+ import QtQuick
10
+
11
+ // A file: URL away for the reason ui/boot/shell.qml gives, but its window stays whole: the chooser
12
+ // is not on the measured path and its size comes from the Theme. See AGENTS.md "The first window".
13
+ ShellRoot {
14
+ id: root
15
+
16
+ LazyLoader {
17
+ id: chooser
18
+ active: true
19
+ // This directory cannot import ui/js/Format.js through qs:, so the one call is written out.
20
+ source: "file://" + encodeURI(Quickshell.shellDir + "/../PickerWindow.qml").replace(/#/g, "%23").replace(/\?/g, "%3F")
21
+ }
22
+
23
+ // Well past the 1.7 to 3.0 s the first launch after an update spends writing Qt's cache.
24
+ readonly property int windowBackstopMs: 6000
25
+
26
+ // LazyLoader carries neither a status nor a usable loading edge, so no window by this point is
27
+ // a load that failed, and silence would leave tools/flea-portal's caller waiting out its 600 s.
28
+ Timer {
29
+ interval: root.windowBackstopMs
30
+ repeat: false
31
+ running: true
32
+ onTriggered: {
33
+ if (!chooser.item) {
34
+ console.warn("flea: the chooser window did not load, so there is nothing to show")
35
+ Quickshell.execDetached(["kill", String(Quickshell.processId)])
36
+ }
37
+ }
38
+ }
39
+ }
@@ -0,0 +1,131 @@
1
+ //@ pragma AppId com.thisisgm.flea
2
+ //@ pragma ShellId flea
3
+ //@ pragma NativeTextRendering
4
+ //@ pragma CacheDir $BASE/flea
5
+
6
+ import Quickshell
7
+ import QtQuick
8
+
9
+ // The entry is the window and imports Quickshell and QtQuick only, because a Quickshell config is
10
+ // served through qs: URLs, which Qt's disk cache refuses; see AGENTS.md "The first window".
11
+ ShellRoot {
12
+ FloatingWindow {
13
+ id: fleaWindow
14
+ title: "Flea"
15
+ implicitWidth: 900
16
+ implicitHeight: 600
17
+ // Never seen: the body covers it on the first frame. ui/Theme.qml's own fallback, for the record.
18
+ color: "#101315"
19
+ property bool rendererFallbackStarted: false
20
+ // True when a glass launch cleared the colour before the window was shown, which tests/glass-boot.sh reads.
21
+ property bool clearedEarly: false
22
+
23
+ // Every *Centre reader on the IPC seam is this: an item's painted box, reduced to the point a test clicks.
24
+ function centreOf(item) {
25
+ if (!item)
26
+ return ""
27
+ var rect = fleaWindow.itemRect(item)
28
+ return Math.round(rect.x + rect.width / 2) + " " + Math.round(rect.y + rect.height / 2)
29
+ }
30
+ // "x y width height" in window pixels, for a test that asserts a card stays inside the window.
31
+ function rectOf(item) {
32
+ if (!item)
33
+ return ""
34
+ var rect = fleaWindow.itemRect(item)
35
+ var left = Math.round(rect.x), top = Math.round(rect.y)
36
+ return left + " " + top + " " + (Math.round(rect.x + rect.width) - left) + " " + (Math.round(rect.y + rect.height) - top)
37
+ }
38
+ // centreOf's sibling, "x width centre": the edges round because a click needs a whole pixel, the centre keeps three decimals because the misalignment it reads is half of one.
39
+ function boxOf(item) {
40
+ if (!item)
41
+ return ""
42
+ var rect = fleaWindow.itemRect(item)
43
+ return Math.round(rect.x) + " " + Math.round(rect.width) + " " + (rect.x + rect.width / 2).toFixed(3)
44
+ }
45
+
46
+ // This directory cannot reach ui/js/Format.js through qs:, so its one call is written out.
47
+ function fileUrl(path) {
48
+ path = String(path)
49
+ // Only Windows paths use backslashes as separators; POSIX filenames may contain them.
50
+ var drive = /^[A-Za-z]:[\\/]/.test(path)
51
+ var unc = /^\\\\[^\\]/.test(path)
52
+ if (drive || unc) path = path.replace(/\\/g, "/")
53
+ var parts = path.split("/")
54
+ for (var i = 0; i < parts.length; i++) {
55
+ if (!(drive && i === 0)) parts[i] = encodeURIComponent(parts[i])
56
+ }
57
+ return (drive ? "file:///" : path.indexOf("//") === 0 ? "file:" : "file://") + parts.join("/")
58
+ }
59
+
60
+ // Before the first frame, so the window maps holding its chrome; see AGENTS.md "The first window".
61
+ function loadBody() {
62
+ if (bodyLoader.status !== Loader.Null)
63
+ return
64
+ bodyLoader.setSource(fleaWindow.fileUrl(Quickshell.shellDir + "/../WindowBody.qml"), { host: fleaWindow })
65
+ // Only before the window exists does Quickshell still take a clear surface; see ui/Glass.qml.
66
+ if (bodyLoader.item && bodyLoader.item.clearSurface) {
67
+ fleaWindow.clearedEarly = !(bodyLoader.Window.window && bodyLoader.Window.window.visible)
68
+ if (fleaWindow.clearedEarly) fleaWindow.color = "transparent"
69
+ }
70
+ }
71
+
72
+ // Quickshell 0.3.1 has no exit API, and it is signalled from here because a window closed
73
+ // before the body loads still has to take the process with it.
74
+ Connections { target: Quickshell; function onLastWindowClosed() { fleaWindow.quit() } }
75
+
76
+ // Nothing has been told to drain before the body exists, so an early exit kills directly.
77
+ function quit() {
78
+ if (bodyLoader.item)
79
+ bodyLoader.item.quitBackends()
80
+ else
81
+ Quickshell.execDetached(["kill", String(Quickshell.processId)])
82
+ }
83
+
84
+ // sceneGraphError arrives on the first frame, and the entry always exists, so the retry is here.
85
+ function handleSceneGraphError(error, message) {
86
+ var backendName = Quickshell.env("QSG_RHI_BACKEND")
87
+ console.warn("graphics backend " + backendName + " failed (" + error + "): " + message)
88
+ var retry = retryCommand(backendName)
89
+ if (retry && !rendererFallbackStarted) {
90
+ rendererFallbackStarted = true
91
+ Quickshell.execDetached(retry)
92
+ }
93
+ quit()
94
+ }
95
+
96
+ // Loaded only once the error has arrived, which keeps ui/js/Renderer.js off the startup path.
97
+ function retryCommand(backendName) {
98
+ var helper = Qt.createComponent(fleaWindow.fileUrl(Quickshell.shellDir + "/../RendererRetry.qml"))
99
+ if (helper.status !== Component.Ready) {
100
+ console.warn("flea: the renderer retry helper did not load, so there is no fallback: " + helper.errorString())
101
+ return null
102
+ }
103
+ var object = helper.createObject(fleaWindow)
104
+ var retry = object.fallbackCommand(backendName)
105
+ object.destroy()
106
+ return retry
107
+ }
108
+
109
+ Loader {
110
+ id: bodyLoader
111
+ anchors.fill: parent
112
+ // A Loader is a focus scope, so without this every key press lands nowhere.
113
+ focus: true
114
+ // An empty window forever is what this catches; the engine prints the reason above it.
115
+ onStatusChanged: {
116
+ if (status === Loader.Error) {
117
+ console.warn("flea: the window body did not load, so there is nothing to show")
118
+ fleaWindow.quit()
119
+ }
120
+ }
121
+ }
122
+
123
+ // Null while this file loads and the QQuickWindow once it exists, which is before the scene graph starts.
124
+ Connections {
125
+ target: bodyLoader.Window.window
126
+ function onSceneGraphError(error, message) { fleaWindow.handleSceneGraphError(error, message) }
127
+ }
128
+
129
+ Component.onCompleted: fleaWindow.loadBody()
130
+ }
131
+ }
@@ -0,0 +1,51 @@
1
+ import QtQuick
2
+ import Quickshell
3
+ import Quickshell.Wayland
4
+
5
+ // The tear-off catcher: one transparent Bottom-layer panel per screen, alive only while the source
6
+ // tab drag is out; the Loader that owns it unloads it on every end path.
7
+ Item {
8
+ id: root
9
+
10
+ // Loader assigns this after creation, so required can never hold here.
11
+ property var tabBar: null
12
+ // The boot directory cannot reach ui/js through qs:, so the strip hands the tab MIME in.
13
+ property string tabMime: ""
14
+
15
+ Variants {
16
+ model: Quickshell.screens
17
+ PanelWindow {
18
+ required property var modelData
19
+ screen: modelData
20
+ color: "transparent"
21
+ anchors {
22
+ top: true
23
+ bottom: true
24
+ left: true
25
+ right: true
26
+ }
27
+ WlrLayershell.namespace: "flea-tab-tearoff"
28
+ WlrLayershell.layer: WlrLayer.Bottom
29
+ // Ignore reserved bars so catcher-local origin is exactly the screen origin.
30
+ exclusionMode: ExclusionMode.Ignore
31
+ // Hyprland focuses an interactive layer on map and releases held buttons,
32
+ // stealing drag focus from the target window. Escape stays with Qt's source.
33
+ WlrLayershell.keyboardFocus: WlrKeyboardFocus.None
34
+ DropArea {
35
+ anchors.fill: parent
36
+ keys: [root.tabMime]
37
+ onEntered: function (drag) {
38
+ if (root.tabBar !== null)
39
+ root.tabBar.traceTab("catcher-enter", "global=" + (modelData.x + drag.x) + "," + (modelData.y + drag.y))
40
+ }
41
+ onDropped: function (drop) {
42
+ // The full-screen catcher starts at the screen's compositor position.
43
+ if (root.tabBar !== null && drop.getDataAsString(root.tabMime) !== "") {
44
+ drop.accept(Qt.MoveAction)
45
+ root.tabBar.catcherDrop(modelData.x + drop.x, modelData.y + drop.y)
46
+ }
47
+ }
48
+ }
49
+ }
50
+ }
51
+ }