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,150 @@
1
+ import QtQuick
2
+ import qs.Commons
3
+ import "js/Buttons.js" as Buttons
4
+
5
+ // The one control every dialog, card, picker button and strip action draws.
6
+ Item {
7
+ id: root
8
+
9
+ property string label: ""
10
+ property bool primary: false
11
+ // A destructive action rests as the error label in a muted frame, never primary.
12
+ property bool destructive: false
13
+ property real horizontalPadding: Theme.spacing.gap
14
+ // An unavailable action shows muted ink and its press does nothing.
15
+ property bool available: true
16
+ // The keyboard's own signal. Callers whose focus sits on a wrapper pass it down.
17
+ property bool focused: root.activeFocus
18
+ // True where the form owns the Tab order and the button only reports through tabbed.
19
+ property bool tabHandle: false
20
+ // A stop in its dialog's own Tab walk; while unavailable it is disabled, so it leaves the walk and keeps its look.
21
+ property bool tabStop: false
22
+ // A member of a set (the protocols): its frame and label are foreground while it is the current one and muted otherwise.
23
+ property bool setMember: false
24
+ property bool current: false
25
+ // Hosted in the chrome strip: a Theme.chromeHeight press area around a Theme.chromeControlHeight frame at caption size, and Tab reaches it.
26
+ property bool inStrip: false
27
+
28
+ // The pointer's own state, read by the native capture harness before it shoots a hover or a press.
29
+ readonly property bool hovered: hover.hovered
30
+ readonly property bool pressed: tap.pressed
31
+ // A release activates only inside the press area, so a held point outside draws the resting control.
32
+ readonly property bool pressShown: root.pressed && root.available && tap.point.position.x >= 0 && tap.point.position.x < root.width
33
+ && tap.point.position.y >= 0 && tap.point.position.y < root.height
34
+
35
+ signal activated()
36
+ // The form owns the order; a button only reports that Tab happened inside it.
37
+ signal tabbed(var from, bool back)
38
+
39
+ // Focus is the control's own frame: foreground, or accent for a set member where it has hue. Where a hairline would match the rest (a primary whose rest frame is the foreground, a set member without hue) the frame draws RING wide.
40
+ readonly property string focusFrame: Buttons.focusFrame(Theme.color.accentHasHue, root.setMember, root.primary && Qt.colorEqual(Theme.color.accentFrame, Theme.color.foreground))
41
+ readonly property bool focusShown: root.focused && root.available
42
+ // A secondary frame takes mutedFrame, ThemeRoles' border role, under a live label; a set member takes foreground while current and mutedFrame otherwise.
43
+ readonly property color frame: root.focusShown && root.focusFrame === "accent" ? Theme.color.accent
44
+ : root.focusShown ? Theme.color.foreground
45
+ : root.setMember ? (root.current ? Theme.color.foreground : Theme.color.mutedFrame)
46
+ : root.primary && root.available ? Theme.color.accentFrame : Theme.color.mutedFrame
47
+ readonly property color ink: !root.available || root.setMember && !root.current ? Theme.color.muted
48
+ : root.destructive ? Theme.color.error : Theme.color.foreground
49
+ // The frame and this wash say which action is being asked for; the label stays foreground.
50
+ readonly property color wash: root.primary && root.available ? Qt.alpha(Theme.color.accent, Buttons.WASH_PRIMARY) : "transparent"
51
+ // A border draws inside its rectangle, so the thick frame grows inward and nothing moves.
52
+ readonly property int frameWidth: root.focusShown && root.focusFrame === "thick" ? Buttons.RING : Theme.spacing.hairline
53
+
54
+ // A chrome strip's press area fills the strip and centres the control height above its rule.
55
+ readonly property real frameHeight: root.inStrip ? Theme.chromeControlHeight : root.height
56
+ readonly property real frameY: root.inStrip ? Math.round((root.height - Theme.spacing.hairline - root.frameHeight) / 2) : 0
57
+
58
+ implicitWidth: Math.max(Theme.hitMin, text.implicitWidth + 2 * root.horizontalPadding + 2 * Theme.spacing.hairline)
59
+ implicitHeight: root.inStrip ? Theme.chromeHeight : Theme.rowHeight - Theme.spacing.rowPaddingY
60
+ // A strip control or a tab stop stays in the Tab chain and drops out as a disabled item; flipping activeFocusOnTab under a focused control only warns.
61
+ activeFocusOnTab: root.inStrip || root.tabStop
62
+ enabled: root.available || !root.inStrip && !root.tabStop
63
+ opacity: root.available ? 1 : Buttons.DISABLED_OPACITY
64
+
65
+ Accessible.role: Accessible.Button
66
+ Accessible.name: root.label
67
+ Accessible.onPressAction: if (root.available) root.activated()
68
+
69
+ Item {
70
+ id: box
71
+ y: root.frameY
72
+ width: parent.width
73
+ height: root.frameHeight
74
+
75
+ // Only the frame and wash shrink: native text loses thin stems under a non-integer scale.
76
+ Item {
77
+ id: chrome
78
+ property int insetX: root.pressShown && !Theme.reducedMotion ? Math.round(box.width * (1 - Buttons.PRESS_SCALE) / 2) : 0
79
+ property int insetY: root.pressShown && !Theme.reducedMotion ? Math.round(box.height * (1 - Buttons.PRESS_SCALE) / 2) : 0
80
+ x: chrome.insetX
81
+ y: chrome.insetY
82
+ width: Math.round(box.width) - 2 * chrome.insetX
83
+ height: Math.round(box.height) - 2 * chrome.insetY
84
+ Behavior on insetX {
85
+ enabled: !Theme.reducedMotion
86
+ NumberAnimation { duration: Buttons.PRESS_MS; easing.type: Easing.OutCubic }
87
+ }
88
+ Behavior on insetY {
89
+ enabled: !Theme.reducedMotion
90
+ NumberAnimation { duration: Buttons.PRESS_MS; easing.type: Easing.OutCubic }
91
+ }
92
+ Rectangle {
93
+ objectName: "buttonFrame"
94
+ anchors.fill: parent
95
+ color: root.wash
96
+ border.width: root.frameWidth
97
+ border.color: root.frame
98
+ }
99
+ // Hover and press lay the control's own ink inside the frame at its width.
100
+ Rectangle {
101
+ objectName: "buttonWash"
102
+ anchors.fill: parent
103
+ anchors.margins: root.frameWidth
104
+ color: root.pressShown ? Qt.alpha(root.ink, Buttons.WASH_PRESS)
105
+ : !root.pressed && hover.hovered && root.available ? Qt.alpha(root.ink, Buttons.WASH_HOVER) : "transparent"
106
+ }
107
+ }
108
+
109
+ Text {
110
+ id: text
111
+ objectName: "buttonLabel"
112
+ anchors.centerIn: parent
113
+ text: root.label
114
+ color: root.ink
115
+ font.family: Theme.font.family
116
+ font.pixelSize: root.inStrip ? Theme.font.caption : Theme.font.body
117
+ textFormat: Text.PlainText
118
+ }
119
+ }
120
+
121
+ HoverHandler {
122
+ id: hover
123
+ cursorShape: root.available ? Qt.PointingHandCursor : Qt.ArrowCursor
124
+ }
125
+
126
+ // A held key's repeats never activate again, so a key held past a focus move cannot press the next button.
127
+ function keyActivate(event) { if (!root.available) event.accepted = false; else if (!event.isAutoRepeat) root.activated() }
128
+
129
+ // A focused button answers Enter exactly as a press does; a handled Tab is accepted here so Qt never moves focus past the form's own stepFocus order.
130
+ Keys.onReturnPressed: function(event) { root.keyActivate(event) }
131
+ Keys.onEnterPressed: function(event) { root.keyActivate(event) }
132
+ Keys.onSpacePressed: function(event) { root.keyActivate(event) }
133
+ Keys.onTabPressed: function(event) {
134
+ if (!root.tabHandle) { event.accepted = false; return }
135
+ root.tabbed(root, (event.modifiers & Qt.ShiftModifier) !== 0)
136
+ event.accepted = true
137
+ }
138
+ Keys.onBacktabPressed: function(event) {
139
+ if (!root.tabHandle) { event.accepted = false; return }
140
+ root.tabbed(root, true)
141
+ event.accepted = true
142
+ }
143
+
144
+ TapHandler {
145
+ id: tap
146
+ acceptedButtons: Qt.LeftButton
147
+ gesturePolicy: TapHandler.ReleaseWithinBounds
148
+ onTapped: if (root.available) root.activated()
149
+ }
150
+ }
@@ -0,0 +1,147 @@
1
+ import QtQuick
2
+ import qs.Commons
3
+ import "." as Flea
4
+
5
+ // One labelled field, as the canvas's Network board draws it: a small uppercase label above a
6
+ // bordered box that takes the accent while it has the caret.
7
+ Item {
8
+ id: root
9
+
10
+ property string label: ""
11
+ // An alias, not a plain property assigned from onTextChanged: writing to a property that carries
12
+ // a binding destroys that binding, so a later programmatic set (switching protocol resets the
13
+ // port) would silently never reach the field.
14
+ property alias text: field.text
15
+ property string placeholder: ""
16
+ // A password box hides what it holds, and the eye beside it reveals while held.
17
+ property bool secret: false
18
+ // The field that holds a refused answer frames itself in the error role; off everywhere else.
19
+ property bool error: false
20
+ // Bullets that stand for a refused answer the field no longer holds; the first key replaces them.
21
+ property int heldMask: 0
22
+
23
+ signal accepted()
24
+ // Keys changed the text, so a card can drop the sentence the error frame stands for.
25
+ signal edited()
26
+ // The form owns the order; a field only reports that Tab happened inside it.
27
+ signal tabbed(var from, bool back)
28
+
29
+ readonly property alias input: field
30
+ readonly property bool focused: field.activeFocus
31
+ // Read by the capture harness: whether the eye is held, and its centre in window coordinates.
32
+ readonly property bool revealed: reveal.pressed
33
+ function eyeCentre() {
34
+ var at = eye.mapToItem(null, eye.width / 2, eye.height / 2)
35
+ return Math.round(at.x) + " " + Math.round(at.y)
36
+ }
37
+
38
+ function takeFocus() {
39
+ field.forceActiveFocus()
40
+ }
41
+ readonly property real labelSpacing: 0.1
42
+
43
+ implicitHeight: caption.implicitHeight + Theme.spacing.hairline * 4 + box.height
44
+
45
+ Text {
46
+ id: caption
47
+ anchors.top: parent.top
48
+ anchors.left: parent.left
49
+ text: root.label.toUpperCase()
50
+ color: Theme.color.muted
51
+ font.family: Theme.font.family
52
+ font.pixelSize: Theme.font.caption
53
+ font.letterSpacing: Theme.font.caption * root.labelSpacing
54
+ textFormat: Text.PlainText
55
+ }
56
+
57
+ Rectangle {
58
+ id: box
59
+ anchors.top: caption.bottom
60
+ anchors.topMargin: Theme.spacing.hairline * 4
61
+ anchors.left: parent.left
62
+ anchors.right: parent.right
63
+ height: Theme.rowHeight - Theme.spacing.rowPaddingY
64
+ color: Theme.color.background
65
+ border.width: Theme.spacing.hairline
66
+ border.color: root.error ? Theme.color.error : (field.activeFocus ? Theme.color.accent : Theme.color.mutedFrame)
67
+
68
+ TextInput {
69
+ id: field
70
+ anchors.left: parent.left
71
+ anchors.right: eye.left
72
+ anchors.verticalCenter: parent.verticalCenter
73
+ anchors.leftMargin: Theme.spacing.gap
74
+ anchors.rightMargin: Theme.spacing.gap
75
+ color: Theme.color.foreground
76
+ selectionColor: Theme.color.accent
77
+ selectedTextColor: Theme.color.background
78
+ font.family: Theme.font.family
79
+ font.pixelSize: Theme.font.body
80
+ clip: true
81
+ leftPadding: heldMarks.visible ? heldMarks.width : 0
82
+ // Revealed only while the eye is held, so a shoulder never reads it from a stuck toggle.
83
+ echoMode: root.secret && !reveal.pressed ? TextInput.Password : TextInput.Normal
84
+ // The boards draw a masked value as U+2022 bullets, never Qt's larger default circle.
85
+ passwordCharacter: "\u2022"
86
+ onAccepted: root.accepted()
87
+ onTextEdited: { root.heldMask = 0; root.edited() }
88
+ Keys.onPressed: function(event) {
89
+ if ((event.key === Qt.Key_Backspace || event.key === Qt.Key_Delete) && field.text.length === 0 && root.heldMask > 0) { root.heldMask = 0; root.edited() }
90
+ }
91
+ Keys.onTabPressed: function(event) { root.tabbed(root, (event.modifiers & Qt.ShiftModifier) !== 0) }
92
+ Keys.onBacktabPressed: root.tabbed(root, true)
93
+ }
94
+
95
+ Text {
96
+ id: heldMarks
97
+ anchors.left: field.left
98
+ anchors.verticalCenter: field.verticalCenter
99
+ visible: root.heldMask > 0 && field.text.length === 0 && !reveal.pressed
100
+ text: field.passwordCharacter.repeat(Math.max(0, root.heldMask))
101
+ color: Theme.color.foreground
102
+ font: field.font
103
+ textFormat: Text.PlainText
104
+ }
105
+
106
+ Text {
107
+ anchors.left: field.left
108
+ anchors.verticalCenter: parent.verticalCenter
109
+ visible: field.text.length === 0 && !field.activeFocus && !heldMarks.visible
110
+ text: root.placeholder
111
+ color: Theme.color.muted
112
+ font.family: Theme.font.family
113
+ font.pixelSize: Theme.font.body
114
+ textFormat: Text.PlainText
115
+ elide: Text.ElideRight
116
+ }
117
+
118
+ Item {
119
+ id: eye
120
+ anchors.right: parent.right
121
+ anchors.rightMargin: Theme.spacing.gap
122
+ anchors.verticalCenter: parent.verticalCenter
123
+ width: root.secret ? Math.max(Theme.hitMin, Theme.font.bodySmall) : 0
124
+ height: root.secret ? Math.max(Theme.hitMin, Theme.font.bodySmall) : 0
125
+
126
+ Accessible.role: Accessible.Button
127
+ Accessible.name: "Show password"
128
+ Accessible.ignored: !root.secret
129
+
130
+ Flea.Glyph {
131
+ anchors.centerIn: parent
132
+ width: Theme.font.bodySmall
133
+ height: Theme.font.bodySmall
134
+ visible: root.secret
135
+ name: "eye"
136
+ color: reveal.pressed ? Theme.color.accent : Theme.color.mutedFrame
137
+ }
138
+
139
+ MouseArea {
140
+ id: reveal
141
+ anchors.fill: parent
142
+ enabled: root.secret
143
+ cursorShape: Qt.PointingHandCursor
144
+ }
145
+ }
146
+ }
147
+ }
@@ -0,0 +1,31 @@
1
+ import QtQuick
2
+ import "." as Flea
3
+
4
+ // A 0.4.0 dialog card's header (MergeFolders, RunFile, Unlock): DialogTitle, the boards' air, then a hairline rule.
5
+ Item {
6
+ id: root
7
+
8
+ property alias text: title.text
9
+ property alias elide: title.elide
10
+ readonly property bool truncated: title.truncated
11
+ readonly property alias ruleItem: rule
12
+
13
+ // The boards draw 8 px of air under the title at their 13 px reference body.
14
+ readonly property real boardAir: 8
15
+ readonly property real referenceBody: 13
16
+ implicitHeight: title.implicitHeight + Math.round(root.boardAir * Theme.font.bodySmall / root.referenceBody) + Theme.spacing.hairline
17
+
18
+ Flea.DialogTitle {
19
+ id: title
20
+ width: parent.width
21
+ }
22
+
23
+ Rectangle {
24
+ id: rule
25
+ anchors.bottom: parent.bottom
26
+ width: parent.width
27
+ height: Theme.spacing.hairline
28
+ color: Theme.color.mutedFrame
29
+ opacity: 0.4
30
+ }
31
+ }
@@ -0,0 +1,20 @@
1
+ import QtQuick
2
+
3
+ // The dimmed ground under a dialog card: it takes hover, both buttons and the wheel, and a click on it dismisses the dialog.
4
+ Rectangle {
5
+ id: root
6
+
7
+ signal dismissed()
8
+
9
+ anchors.fill: parent
10
+ color: Theme.color.background
11
+ opacity: 0.5
12
+
13
+ MouseArea {
14
+ anchors.fill: parent
15
+ hoverEnabled: true
16
+ acceptedButtons: Qt.LeftButton | Qt.RightButton
17
+ onClicked: root.dismissed()
18
+ onWheel: function(wheel) { wheel.accepted = true }
19
+ }
20
+ }
@@ -0,0 +1,37 @@
1
+ import QtQuick
2
+ import "." as Flea
3
+
4
+ // A dialog's header line: what the dialog is doing on the left, and the word that closes it on the
5
+ // right. Dialogs rule 7 puts that word in the same corner on every dialog, which is the corner
6
+ // ui/SettingsPanel.qml already keeps it in, so one surface cannot spell the way out differently.
7
+ Item {
8
+ id: root
9
+
10
+ property string text: ""
11
+ property int elide: Text.ElideRight
12
+ property bool showsEscape: true
13
+
14
+ readonly property bool truncated: label.truncated
15
+ implicitHeight: label.implicitHeight
16
+
17
+ Text {
18
+ id: label
19
+ anchors.left: parent.left
20
+ anchors.right: escHint.left
21
+ anchors.rightMargin: Theme.spacing.gap
22
+ text: root.text
23
+ color: Theme.color.foreground
24
+ font.family: Theme.font.family
25
+ font.pixelSize: Theme.font.body
26
+ font.bold: true
27
+ textFormat: Text.PlainText
28
+ elide: root.elide
29
+ }
30
+
31
+ Flea.EscapeHint {
32
+ id: escHint
33
+ anchors.right: parent.right
34
+ anchors.baseline: label.baseline
35
+ visible: root.showsEscape
36
+ }
37
+ }
package/ui/Divider.qml ADDED
@@ -0,0 +1,9 @@
1
+ import QtQuick
2
+
3
+ // One hairline both the rail edge and the column edges draw, so width and ink match by construction.
4
+ Rectangle {
5
+ property bool isDivider: true
6
+ width: Theme.spacing.hairline
7
+ color: Theme.color.foreground
8
+ opacity: 0.12
9
+ }
@@ -0,0 +1,126 @@
1
+ import QtQuick
2
+ import "." as Flea
3
+ import "js/Drag.js" as DragOps
4
+ import "js/DragOut.js" as DragOut
5
+ import "js/Swap.js" as Swap
6
+ import "js/Tabs.js" as Tabs
7
+
8
+ // A directory as a drop target, named by path: the listing's floor in ui/PaneWire.qml and each tab in
9
+ // ui/TabBar.qml. The rows keep their own DropAreas above the floor, so only what a row refuses lands
10
+ // here; ui/js/Drag.js dropInto decides the verb and sends the one transfer.
11
+ DropArea {
12
+ id: root
13
+
14
+ property var pane: null
15
+ property string dest: ""
16
+ // What the status line calls the destination; the path itself when empty.
17
+ property string label: ""
18
+ // The destination's filesystem when it is known, 0 when it is not, which makes the drop a copy.
19
+ property int destDev: 0
20
+ // A tab takes every drag that carries paths, because resting on it is navigation: a drop the
21
+ // directory would refuse, its own rows lifted back onto it, is still refused by dropInto below.
22
+ property bool switchesOnHover: false
23
+ // The floor and the tab being opened set this while a listing is out. The area stays able to receive the drop.
24
+ property bool refuseLoading: false
25
+ property string enteredMarker: ""
26
+ property var enteredUrls: []
27
+ // The floor is the listing's own extent, so its pointer rows are the autoscroll band's rows.
28
+ property bool scrolls: false
29
+
30
+ keys: [DragOps.ROWS_MIME, DragOps.SHELF_MIME, "text/uri-list", "text/plain"]
31
+
32
+ Flea.FileDrag {
33
+ id: feedback
34
+ pane: root.pane
35
+ }
36
+
37
+ function updateFeedback() {
38
+ if (!root.containsDrag || !feedback.feedback) return
39
+ if (DragOps.canDropInto(root.enteredMarker, root.enteredUrls, root.dest))
40
+ feedback.showTarget(root.label || root.dest, root.destDev)
41
+ else feedback.leaveTarget()
42
+ }
43
+
44
+ function scrollBand(drag) {
45
+ if (root.scrolls) feedback.hoverMoved(drag.y, root.height)
46
+ }
47
+
48
+ function leaveFeedback() {
49
+ feedback.leaveTarget()
50
+ root.enteredMarker = ""
51
+ root.enteredUrls = []
52
+ }
53
+
54
+ onDestChanged: root.updateFeedback()
55
+ onDestDevChanged: root.updateFeedback()
56
+
57
+ // One read of a drag for both handlers: the marker, the shelf paths, the plain text and the refusal they share.
58
+ function readDrag(d) {
59
+ var marker = d.getDataAsString(DragOps.ROWS_MIME)
60
+ var shelf = d.getDataAsString(DragOps.SHELF_MIME)
61
+ var plain = d.getDataAsString("text/plain")
62
+ return { marker: marker, shelf: shelf, plain: plain,
63
+ refusal: DragOut.refusal(DragOut.sources(d.urls, plain, marker, shelf), root.dest, marker, shelf) }
64
+ }
65
+
66
+ onEntered: function (drag) {
67
+ // xw6: a tab drag carries only the private tab type and is never a file drop:
68
+ // the strip catcher owns it, and the hover switch must not fire for it either.
69
+ if (drag.getDataAsString(Tabs.TAB_MIME) !== "") {
70
+ drag.accepted = false
71
+ return
72
+ }
73
+ var read = root.readDrag(drag)
74
+ var carrying = DragOps.hasPaths(drag.urls) || (read.plain && DragOut.usePlain(read.marker, read.shelf))
75
+ var allowed = DragOps.canDropInto(read.marker, drag.urls, root.dest, read.plain)
76
+ if (!(root.switchesOnHover && carrying) && !allowed && read.refusal === "") {
77
+ drag.accepted = false
78
+ return
79
+ }
80
+ root.scrollBand(drag)
81
+ root.enteredMarker = read.marker
82
+ DragOut.keys.enter(read.marker, drag.getDataAsString(DragOut.keys.liftMime))
83
+ var urls = []
84
+ for (var i = 0; i < drag.urls.length; i++) urls.push(String(drag.urls[i]))
85
+ root.enteredUrls = urls
86
+ // A tab may accept navigation without accepting a drop; only an eligible destination is named.
87
+ feedback.enterTarget(read.marker, drag.urls, allowed ? (root.label || root.dest) : "",
88
+ allowed ? root.destDev : DragOps.markerDev(read.marker), read.shelf,
89
+ drag.proposedAction)
90
+ }
91
+ onPositionChanged: function (drag) {
92
+ root.scrollBand(drag)
93
+ root.updateFeedback()
94
+ }
95
+ onExited: {
96
+ if (root.scrolls) feedback.hoverEnded()
97
+ DragOut.keys.leave()
98
+ root.leaveFeedback()
99
+ }
100
+ onDropped: function (drop) {
101
+ if (root.scrolls) feedback.hoverEnded()
102
+ // Every way out of a drop, refusals included, ends the drag's keys.
103
+ var ctrl = DragOut.keys.ctrl, shift = DragOut.keys.shift
104
+ DragOut.keys.clear()
105
+ if (drop.getDataAsString(Tabs.TAB_MIME) !== "") {
106
+ root.leaveFeedback()
107
+ return
108
+ }
109
+ if (root.refuseLoading) {
110
+ if (root.pane) root.pane.message(Swap.LOADING, false)
111
+ root.leaveFeedback()
112
+ return
113
+ }
114
+ var read = root.readDrag(drop)
115
+ if (read.refusal !== "" && root.pane) {
116
+ root.pane.message(read.refusal, false)
117
+ root.leaveFeedback()
118
+ return
119
+ }
120
+ if (DragOps.dropInto(root.pane, read.marker, drop.urls, root.dest, root.destDev, read.shelf, read.plain, drop.proposedAction, ctrl, shift)) {
121
+ // CopyAction: this transfer already moved or copied. MoveAction would make the source delete too.
122
+ drop.accept(Qt.CopyAction)
123
+ }
124
+ root.leaveFeedback()
125
+ }
126
+ }
@@ -0,0 +1,35 @@
1
+ import QtQuick
2
+ import qs.Commons
3
+
4
+ // States.dc.html's drop cue, shared by the file row and the rail's Trash row.
5
+ Item {
6
+ id: root
7
+
8
+ property bool shown: true
9
+ property real paintWidth: 0
10
+ property alias text: dropLabel.text
11
+ property alias label: dropLabel
12
+
13
+ // The board's accent hairline over a faint wash at the hover rung's alpha.
14
+ Rectangle {
15
+ visible: root.shown
16
+ width: root.paintWidth > 0 ? root.paintWidth : parent.width
17
+ height: parent.height
18
+ color: Util.alpha(Theme.color.accent, Style.hoverFillAlpha)
19
+ border.width: Theme.spacing.hairline
20
+ border.color: Theme.color.accent
21
+ }
22
+
23
+ // Caption type in the accent, against the row padding, in place of trailing columns.
24
+ Text {
25
+ id: dropLabel
26
+ visible: root.shown
27
+ anchors.right: parent.right
28
+ anchors.rightMargin: Theme.spacing.rowPaddingX
29
+ anchors.verticalCenter: parent.verticalCenter
30
+ color: Theme.color.accent
31
+ font.family: Theme.font.family
32
+ font.pixelSize: Theme.font.caption
33
+ textFormat: Text.PlainText
34
+ }
35
+ }
@@ -0,0 +1,60 @@
1
+ import QtQuick
2
+ import QtQuick.Shapes
3
+ import qs.Commons
4
+
5
+ // The Dropbox mark, reproduced from the official artwork rather than recut, the same ruling that
6
+ // brought TailscaleMark back. Five diamond tiles, monochrome and palette-tinted, no brand colour.
7
+ // Outside the cut and outside Glyph.qml, where FleaMark sits.
8
+ Item {
9
+ id: root
10
+
11
+ // The type scale, not the slot, and clamped so a reproduction can never out-size the cut glyph
12
+ // beside it. A smaller caller slot still wins, the way Glyph's own min() lets it.
13
+ property real iconSize: Theme.markSize
14
+ property color color: "transparent"
15
+
16
+ // The mark is wider than it is tall, so the box is too: scaling a wide mark into a square slot is
17
+ // the AdGuard lesson, it renders smaller than its neighbours.
18
+ readonly property real boxRatio: 1.18
19
+ // Tile centres and size as fractions of the box, taken off the official artwork.
20
+ readonly property var tileX: [0.25, 0.75, 0.25, 0.75, 0.50]
21
+ readonly property var tileY: [0.188, 0.188, 0.564, 0.564, 0.812]
22
+ readonly property real tileW: 0.50
23
+ readonly property real tileH: 0.376
24
+
25
+ readonly property real drawn: Math.min(Theme.markSize, root.iconSize)
26
+
27
+ implicitWidth: root.drawn * root.boxRatio
28
+ implicitHeight: root.drawn
29
+ width: root.drawn * root.boxRatio
30
+ height: root.drawn
31
+
32
+ // All five tiles in one path string: a ShapePath is not an Item, so a Repeater cannot make them.
33
+ readonly property string tiles: {
34
+ var hw = root.tileW * root.width / 2
35
+ var hh = root.tileH * root.height / 2
36
+ var out = ""
37
+ for (var i = 0; i < root.tileX.length; i++) {
38
+ var cx = root.tileX[i] * root.width
39
+ var cy = root.tileY[i] * root.height
40
+ out += "M " + cx + " " + (cy - hh)
41
+ + " L " + (cx + hw) + " " + cy
42
+ + " L " + cx + " " + (cy + hh)
43
+ + " L " + (cx - hw) + " " + cy + " Z "
44
+ }
45
+ return out
46
+ }
47
+
48
+ Shape {
49
+ anchors.fill: parent
50
+ preferredRendererType: Shape.CurveRenderer
51
+
52
+ ShapePath {
53
+ fillColor: root.color
54
+ strokeColor: "transparent"
55
+ strokeWidth: 0
56
+
57
+ PathSvg { path: root.tiles }
58
+ }
59
+ }
60
+ }