flea-qml 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (625) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +478 -2
  3. package/THIRD-PARTY-NOTICES.md +29 -0
  4. package/demos/App.java +5 -0
  5. package/demos/Dockerfile +4 -0
  6. package/demos/Main.kt +3 -0
  7. package/demos/Program.cs +1 -0
  8. package/demos/README.md +12 -0
  9. package/demos/app.dart +3 -0
  10. package/demos/app.deb +0 -0
  11. package/demos/app.js +1 -0
  12. package/demos/backup.tar +0 -0
  13. package/demos/budget.xlsx +0 -0
  14. package/demos/build.sh +2 -0
  15. package/demos/bundle.zip +0 -0
  16. package/demos/clip.mp4 +0 -0
  17. package/demos/data.sqlite +0 -0
  18. package/demos/disk.iso +0 -0
  19. package/demos/engine.cpp +5 -0
  20. package/demos/firmware.bin +0 -0
  21. package/demos/flake.nix +4 -0
  22. package/demos/folder/inside.txt +1 -0
  23. package/demos/font.ttf +0 -0
  24. package/demos/index.html +5 -0
  25. package/demos/index.php +2 -0
  26. package/demos/init.lua +1 -0
  27. package/demos/letter.docx +0 -0
  28. package/demos/lib.rs +3 -0
  29. package/demos/main.c +6 -0
  30. package/demos/main.h +3 -0
  31. package/demos/math-and-diagrams.md +200 -0
  32. package/demos/notes.tar.gz +0 -0
  33. package/demos/notes.txt +3 -0
  34. package/demos/photo.png +0 -0
  35. package/demos/program +2 -0
  36. package/demos/report.pdf +32 -0
  37. package/demos/script.py +1 -0
  38. package/demos/server.go +7 -0
  39. package/demos/settings.json +4 -0
  40. package/demos/slides.pptx +0 -0
  41. package/demos/song.mp3 +0 -0
  42. package/demos/style.css +4 -0
  43. package/demos/tool.rb +1 -0
  44. package/demos/types.ts +2 -0
  45. package/docs/pele.md +23 -0
  46. package/docs/protocol.md +3420 -0
  47. package/docs/temml.md +63 -0
  48. package/index.js +107 -0
  49. package/package.json +34 -4
  50. package/src/archive.js +402 -0
  51. package/src/archiveops.js +697 -0
  52. package/src/backend.js +369 -0
  53. package/src/bulkrename.js +95 -0
  54. package/src/clip-host.js +76 -0
  55. package/src/clip.js +462 -0
  56. package/src/code.js +168 -0
  57. package/src/compare.js +74 -0
  58. package/src/create.js +128 -0
  59. package/src/dirsize.js +147 -0
  60. package/src/figure-svg.js +530 -0
  61. package/src/figure-thread.js +23 -0
  62. package/src/figure.js +132 -0
  63. package/src/find.js +55 -0
  64. package/src/flea.js +39 -0
  65. package/src/fsinfo.js +39 -0
  66. package/src/highlight.js +141 -0
  67. package/src/html.js +52 -0
  68. package/src/kinds.js +89 -0
  69. package/src/listing.js +130 -0
  70. package/src/markdown-html.js +317 -0
  71. package/src/mathml.js +186 -0
  72. package/src/menu.js +180 -0
  73. package/src/meta.js +129 -0
  74. package/src/office.js +810 -0
  75. package/src/order.js +100 -0
  76. package/src/peek.js +49 -0
  77. package/src/pele-wrapper.js +695 -0
  78. package/src/permissions.js +180 -0
  79. package/src/places.js +313 -0
  80. package/src/preview-language.js +10 -0
  81. package/src/transfer.js +669 -0
  82. package/src/trash-record.js +41 -0
  83. package/src/trash.js +210 -0
  84. package/src/trashbrowse.js +326 -0
  85. package/src/uistate.js +393 -0
  86. package/src/uistore.js +168 -0
  87. package/src/vendor/LICENSES/Apache-2.0.txt +202 -0
  88. package/src/vendor/LICENSES/MIT-katex-2015.txt +27 -0
  89. package/src/vendor/LICENSES/MIT-katex.txt +21 -0
  90. package/src/vendor/LICENSES/MIT-mermaid.txt +21 -0
  91. package/src/vendor/LICENSES/MIT-pele.txt +40 -0
  92. package/src/vendor/LICENSES/MIT-perseus.txt +18 -0
  93. package/src/vendor/LICENSES/MIT-temml.txt +21 -0
  94. package/src/vendor/pele.js +145 -0
  95. package/src/vendor/temml.mjs +14708 -0
  96. package/src/watch.js +98 -0
  97. package/src/wayland/client.js +109 -0
  98. package/src/wayland/protocol.js +55 -0
  99. package/src/wayland/protocols/ext-data-control-v1.xml +276 -0
  100. package/src/wayland/protocols/wayland.xml +3248 -0
  101. package/src/wayland/protocols/wlr-data-control-unstable-v1.xml +278 -0
  102. package/src/wayland/resource-io.js +6 -0
  103. package/src/wayland/socket-discovery.js +26 -0
  104. package/src/wayland/transport-posix.js +120 -0
  105. package/src/wayland/transport-win32.js +11 -0
  106. package/src/wayland/transport.js +3 -0
  107. package/src/wayland/win32-resources.js +80 -0
  108. package/src/wayland/win32-wire.js +62 -0
  109. package/test/archive.test.js +80 -0
  110. package/test/bench-markdown-scroll.mjs +190 -0
  111. package/test/clip-host.test.js +113 -0
  112. package/test/code-preview.test.js +35 -0
  113. package/test/compare-ui-paths.test.js +24 -0
  114. package/test/compare.test.js +54 -0
  115. package/test/delete-trash.test.js +67 -0
  116. package/test/dirsize.test.js +138 -0
  117. package/test/file-ops.test.js +241 -0
  118. package/test/find-contents.test.js +161 -0
  119. package/test/find-input.test.js +66 -0
  120. package/test/fixtures/pele-parity.json +1006 -0
  121. package/test/highlight-launcher.test.js +35 -0
  122. package/test/html-preview.test.js +22 -0
  123. package/test/input.test.js +15 -0
  124. package/test/keymap.test.js +26 -0
  125. package/test/language-icons.test.js +36 -0
  126. package/test/launcher.test.js +51 -0
  127. package/test/manual-code-scroll.mjs +28 -0
  128. package/test/manual-column-scroll.mjs +24 -0
  129. package/test/manual-compare-ui.mjs +20 -0
  130. package/test/manual-find-status.mjs +37 -0
  131. package/test/manual-html-security.mjs +23 -0
  132. package/test/manual-html-ui.mjs +30 -0
  133. package/test/manual-syntax-preview.mjs +26 -0
  134. package/test/manual-trash-ui.mjs +86 -0
  135. package/test/markdown-diagrams.test.js +93 -0
  136. package/test/markdown-html.test.js +105 -0
  137. package/test/mathml.test.js +92 -0
  138. package/test/menu-transfer.test.js +57 -0
  139. package/test/office-preview.test.js +154 -0
  140. package/test/pele-parity.test.js +28 -0
  141. package/test/places.test.js +134 -0
  142. package/test/preview-keys.test.js +60 -0
  143. package/test/preview-language.test.js +22 -0
  144. package/test/status-filename.test.js +20 -0
  145. package/test/transfer-replace-merge.test.js +187 -0
  146. package/test/trash-address.test.js +23 -0
  147. package/test/trash-view.test.js +37 -0
  148. package/test/trashbrowse.test.js +135 -0
  149. package/ui/AboutFacts.qml +78 -0
  150. package/ui/ArchiveCards.qml +68 -0
  151. package/ui/ArchiveCompressDialog.qml +378 -0
  152. package/ui/ArchivePasswordDialog.qml +257 -0
  153. package/ui/Backend.qml +771 -0
  154. package/ui/BulkOldNames.qml +47 -0
  155. package/ui/BulkRenameDialog.qml +380 -0
  156. package/ui/CardFrame.qml +67 -0
  157. package/ui/CardScroll.qml +79 -0
  158. package/ui/CheckBox.qml +73 -0
  159. package/ui/ChromeBar.qml +360 -0
  160. package/ui/ChromeButton.qml +131 -0
  161. package/ui/ChromeModes.qml +43 -0
  162. package/ui/CodeLines.qml +256 -0
  163. package/ui/CodeRefusal.qml +52 -0
  164. package/ui/CollideConfirm.qml +147 -0
  165. package/ui/CollideHost.qml +167 -0
  166. package/ui/ColumnPane.qml +523 -0
  167. package/ui/ColumnRow.qml +380 -0
  168. package/ui/ColumnsArea.qml +594 -0
  169. package/ui/ColumnsLanding.qml +147 -0
  170. package/ui/CompareView.qml +321 -0
  171. package/ui/ContextMenu.qml +743 -0
  172. package/ui/ConvertDialog.qml +456 -0
  173. package/ui/CountedWorker.qml +7 -0
  174. package/ui/Crumb.qml +64 -0
  175. package/ui/CrumbDrop.qml +25 -0
  176. package/ui/CsvTable.qml +394 -0
  177. package/ui/CursorMark.qml +41 -0
  178. package/ui/DefaultClaim.qml +130 -0
  179. package/ui/DeviceLock.qml +47 -0
  180. package/ui/DeviceMounts.qml +540 -0
  181. package/ui/DialogButton.qml +150 -0
  182. package/ui/DialogField.qml +147 -0
  183. package/ui/DialogHeader.qml +31 -0
  184. package/ui/DialogScrim.qml +20 -0
  185. package/ui/DialogTitle.qml +37 -0
  186. package/ui/Divider.qml +9 -0
  187. package/ui/DropInto.qml +126 -0
  188. package/ui/DropTarget.qml +35 -0
  189. package/ui/DropboxMark.qml +60 -0
  190. package/ui/EmptyState.qml +150 -0
  191. package/ui/EscapeHint.qml +11 -0
  192. package/ui/FactsTable.qml +54 -0
  193. package/ui/FastScrollHandler.qml +476 -0
  194. package/ui/FatNamesConfirm.qml +157 -0
  195. package/ui/Favourites.qml +143 -0
  196. package/ui/FigureService.qml +120 -0
  197. package/ui/FileDrag.qml +267 -0
  198. package/ui/FilterStrip.qml +133 -0
  199. package/ui/FitMetrics.qml +22 -0
  200. package/ui/FlashDriveRows.qml +137 -0
  201. package/ui/FlashHost.qml +72 -0
  202. package/ui/FlashImageRow.qml +104 -0
  203. package/ui/FlashRunner.qml +119 -0
  204. package/ui/FlashStepRow.qml +172 -0
  205. package/ui/FlashStrip.qml +38 -0
  206. package/ui/FlashView.qml +397 -0
  207. package/ui/FleaMark.qml +88 -0
  208. package/ui/FlyoutFade.qml +23 -0
  209. package/ui/FontPane.qml +170 -0
  210. package/ui/Glass.qml +114 -0
  211. package/ui/GlassTagger.qml +59 -0
  212. package/ui/Glyph.qml +64 -0
  213. package/ui/GlyphSolid.qml +22 -0
  214. package/ui/GridArea.qml +664 -0
  215. package/ui/GridTile.qml +325 -0
  216. package/ui/GvfsBridge.qml +164 -0
  217. package/ui/Header.qml +433 -0
  218. package/ui/HoverTimers.qml +39 -0
  219. package/ui/HtmlClip.qml +30 -0
  220. package/ui/HtmlPane.qml +63 -0
  221. package/ui/HyprlandMark.qml +45 -0
  222. package/ui/Ipc.qml +1005 -0
  223. package/ui/IpcControls.qml +7 -0
  224. package/ui/IpcMenuState.qml +48 -0
  225. package/ui/IpcPreviewState.qml +185 -0
  226. package/ui/JumpPath.qml +51 -0
  227. package/ui/KeymapSheet.qml +561 -0
  228. package/ui/KeymapSheetResult.qml +89 -0
  229. package/ui/KindStack.qml +40 -0
  230. package/ui/LangMark.qml +51 -0
  231. package/ui/LangMarkLoader.qml +26 -0
  232. package/ui/List.qml +480 -0
  233. package/ui/LoadingState.qml +54 -0
  234. package/ui/LocalSend.qml +56 -0
  235. package/ui/LocalSendMark.qml +73 -0
  236. package/ui/MarkdownBlockView.qml +311 -0
  237. package/ui/MarkdownBlocks.qml +35 -0
  238. package/ui/MarkdownFigure.qml +254 -0
  239. package/ui/MarkdownImages.qml +72 -0
  240. package/ui/MarkdownList.qml +81 -0
  241. package/ui/MarkdownMathsText.qml +97 -0
  242. package/ui/MarkdownPane.qml +83 -0
  243. package/ui/MarkdownPictures.qml +41 -0
  244. package/ui/MarkdownQuote.qml +52 -0
  245. package/ui/MarkdownRemote.qml +82 -0
  246. package/ui/MarkdownSource.qml +155 -0
  247. package/ui/MarkdownTable.qml +222 -0
  248. package/ui/MarkdownTableScroll.qml +64 -0
  249. package/ui/MarkdownTableWheel.qml +126 -0
  250. package/ui/MarkdownText.qml +87 -0
  251. package/ui/MarkdownWorker.js +132 -0
  252. package/ui/MatchText.qml +99 -0
  253. package/ui/MediaSession.qml +38 -0
  254. package/ui/MediaSound.qml +26 -0
  255. package/ui/MediaStrip.qml +191 -0
  256. package/ui/MediaTrack.qml +36 -0
  257. package/ui/MediaVolume.qml +54 -0
  258. package/ui/MenuActionDialog.qml +396 -0
  259. package/ui/MenuEdgeFade.qml +24 -0
  260. package/ui/MenuHost.qml +227 -0
  261. package/ui/MenuRow.qml +351 -0
  262. package/ui/MountListing.qml +100 -0
  263. package/ui/NetworkDialog.qml +435 -0
  264. package/ui/NetworkForm.qml +426 -0
  265. package/ui/NetworkMounts.qml +913 -0
  266. package/ui/NetworkPlaces.qml +127 -0
  267. package/ui/OpenWithDialog.qml +613 -0
  268. package/ui/Opener.qml +115 -0
  269. package/ui/Pane.qml +1296 -0
  270. package/ui/PaneMenuActions.qml +527 -0
  271. package/ui/PanePath.qml +90 -0
  272. package/ui/PaneRail.qml +239 -0
  273. package/ui/PaneStates.qml +88 -0
  274. package/ui/PaneSwap.qml +339 -0
  275. package/ui/PaneWire.qml +605 -0
  276. package/ui/ParkedWait.qml +9 -0
  277. package/ui/PathEntry.qml +186 -0
  278. package/ui/PathJump.qml +400 -0
  279. package/ui/PdfViewer.qml +297 -0
  280. package/ui/PermissionsDialog.qml +658 -0
  281. package/ui/PermissionsHeadings.qml +31 -0
  282. package/ui/PhoneMounts.qml +67 -0
  283. package/ui/PickerAnswers.qml +75 -0
  284. package/ui/PickerBox.qml +26 -0
  285. package/ui/PickerChrome.qml +295 -0
  286. package/ui/PickerFilter.qml +97 -0
  287. package/ui/PickerGrid.qml +308 -0
  288. package/ui/PickerHeader.qml +28 -0
  289. package/ui/PickerLifecycle.qml +27 -0
  290. package/ui/PickerList.qml +218 -0
  291. package/ui/PickerListing.qml +149 -0
  292. package/ui/PickerPathBar.qml +127 -0
  293. package/ui/PickerPlaces.qml +189 -0
  294. package/ui/PickerRecent.qml +92 -0
  295. package/ui/PickerSave.qml +101 -0
  296. package/ui/PickerSelection.qml +155 -0
  297. package/ui/PickerWindow.qml +846 -0
  298. package/ui/PowerSectorsReader.qml +10 -0
  299. package/ui/PrebuildDriver.qml +146 -0
  300. package/ui/Preview.qml +1004 -0
  301. package/ui/PreviewAnimation.qml +24 -0
  302. package/ui/PreviewArchive.qml +66 -0
  303. package/ui/PreviewColumn.qml +551 -0
  304. package/ui/PreviewEdge.qml +63 -0
  305. package/ui/PreviewFacts.qml +30 -0
  306. package/ui/PreviewFactsLine.qml +34 -0
  307. package/ui/PreviewHtml.qml +233 -0
  308. package/ui/PreviewImage.qml +253 -0
  309. package/ui/PreviewImagePan.qml +13 -0
  310. package/ui/PreviewImageSharp.qml +32 -0
  311. package/ui/PreviewLines.qml +106 -0
  312. package/ui/PreviewMarkdown.qml +706 -0
  313. package/ui/PreviewMedia.qml +250 -0
  314. package/ui/PreviewPdf.qml +482 -0
  315. package/ui/PreviewScroll.qml +201 -0
  316. package/ui/PreviewSwap.qml +335 -0
  317. package/ui/PreviewText.qml +149 -0
  318. package/ui/ProtocolChip.qml +18 -0
  319. package/ui/QuickLookArchive.qml +38 -0
  320. package/ui/QuickLookBar.qml +103 -0
  321. package/ui/QuickLookPrepare.qml +355 -0
  322. package/ui/QuickLookSwap.qml +10 -0
  323. package/ui/QuickLookWarm.qml +65 -0
  324. package/ui/RailDrop.qml +155 -0
  325. package/ui/RailHeading.qml +19 -0
  326. package/ui/RailPlaces.qml +38 -0
  327. package/ui/RailTrashRow.qml +67 -0
  328. package/ui/RenameField.qml +353 -0
  329. package/ui/RendererRetry.qml +11 -0
  330. package/ui/ResizeHandle.qml +52 -0
  331. package/ui/Reveal.qml +54 -0
  332. package/ui/Row.qml +476 -0
  333. package/ui/RowDrag.qml +213 -0
  334. package/ui/RowDropTarget.qml +27 -0
  335. package/ui/RunCard.qml +286 -0
  336. package/ui/Scripts.qml +65 -0
  337. package/ui/SearchStrip.qml +232 -0
  338. package/ui/SelectionBand.qml +140 -0
  339. package/ui/SelectionPreview.qml +370 -0
  340. package/ui/SettingsFavourite.qml +122 -0
  341. package/ui/SettingsGroup.qml +96 -0
  342. package/ui/SettingsHint.qml +12 -0
  343. package/ui/SettingsMetrics.qml +29 -0
  344. package/ui/SettingsPane.qml +178 -0
  345. package/ui/SettingsPanel.qml +547 -0
  346. package/ui/SettingsRail.qml +128 -0
  347. package/ui/SettingsRow.qml +409 -0
  348. package/ui/SettingsRuler.qml +85 -0
  349. package/ui/SettingsSegment.qml +85 -0
  350. package/ui/ShareBrowser.qml +113 -0
  351. package/ui/ShareLink.qml +67 -0
  352. package/ui/ShelfPins.qml +101 -0
  353. package/ui/Sidebar.qml +732 -0
  354. package/ui/SidebarRow.qml +358 -0
  355. package/ui/Spinner.qml +60 -0
  356. package/ui/StableModel.qml +89 -0
  357. package/ui/StateMessage.qml +84 -0
  358. package/ui/StatusBar.qml +512 -0
  359. package/ui/StatusFileName.qml +27 -0
  360. package/ui/TabBar.qml +673 -0
  361. package/ui/TabDragGeometry.qml +60 -0
  362. package/ui/TagMenuMark.qml +52 -0
  363. package/ui/TagRailSection.qml +53 -0
  364. package/ui/TagSlot.qml +40 -0
  365. package/ui/TagState.qml +150 -0
  366. package/ui/TagSwatch.qml +28 -0
  367. package/ui/Taildrop.qml +86 -0
  368. package/ui/TailscaleMark.qml +50 -0
  369. package/ui/Theme.qml +460 -0
  370. package/ui/ThemeColors.qml +43 -0
  371. package/ui/TransferCard.qml +239 -0
  372. package/ui/TrashConfirm.qml +129 -0
  373. package/ui/TrashDropHandler.qml +11 -0
  374. package/ui/TrashHost.qml +202 -0
  375. package/ui/TrashMonitor.qml +30 -0
  376. package/ui/TrashToolbar.qml +19 -0
  377. package/ui/TrashView.qml +492 -0
  378. package/ui/UnlockDialog.qml +450 -0
  379. package/ui/UnlockHost.qml +206 -0
  380. package/ui/UpdateCheck.qml +97 -0
  381. package/ui/UserDirs.qml +25 -0
  382. package/ui/ViewState.qml +565 -0
  383. package/ui/ViewportScrollBar.qml +195 -0
  384. package/ui/ViewportScrollBars.qml +25 -0
  385. package/ui/WebPreview.qml +33 -0
  386. package/ui/WebPreviewView.qml +26 -0
  387. package/ui/WindowBody.qml +827 -0
  388. package/ui/WindowDrag.qml +35 -0
  389. package/ui/boot/Commons/AudioNodes.qml +50 -0
  390. package/ui/boot/Commons/AudioNodesModel.js +96 -0
  391. package/ui/boot/Commons/Border.qml +243 -0
  392. package/ui/boot/Commons/BorderGeometry.js +373 -0
  393. package/ui/boot/Commons/Color.qml +258 -0
  394. package/ui/boot/Commons/I18n.qml +118 -0
  395. package/ui/boot/Commons/InputDevices.qml +112 -0
  396. package/ui/boot/Commons/InputMethodState.qml +38 -0
  397. package/ui/boot/Commons/IpcRegistry.qml +77 -0
  398. package/ui/boot/Commons/Numbers.js +19 -0
  399. package/ui/boot/Commons/Plural.js +91 -0
  400. package/ui/boot/Commons/ShellIpc.qml +12 -0
  401. package/ui/boot/Commons/Style.qml +561 -0
  402. package/ui/boot/Commons/Translations.qml +100 -0
  403. package/ui/boot/Commons/UntypedInput.qml +152 -0
  404. package/ui/boot/Commons/Util.qml +188 -0
  405. package/ui/boot/Commons/qmldir +13 -0
  406. package/ui/boot/LICENSE-omarchy +20 -0
  407. package/ui/boot/Ui/BackgroundMedia.qml +49 -0
  408. package/ui/boot/Ui/BarIconButton.qml +106 -0
  409. package/ui/boot/Ui/BarIconContent.qml +38 -0
  410. package/ui/boot/Ui/BarIndicator.qml +53 -0
  411. package/ui/boot/Ui/BarWidget.qml +50 -0
  412. package/ui/boot/Ui/BorderOverlay.qml +54 -0
  413. package/ui/boot/Ui/BorderSurface.qml +40 -0
  414. package/ui/boot/Ui/Button.qml +224 -0
  415. package/ui/boot/Ui/ButtonGroup.qml +131 -0
  416. package/ui/boot/Ui/ConfirmDialog.qml +134 -0
  417. package/ui/boot/Ui/CursorSurface.qml +42 -0
  418. package/ui/boot/Ui/Dropdown.qml +245 -0
  419. package/ui/boot/Ui/FilterInput.qml +26 -0
  420. package/ui/boot/Ui/IconContentBounds.qml +141 -0
  421. package/ui/boot/Ui/KeyboardPanel.qml +453 -0
  422. package/ui/boot/Ui/MultiSelect.qml +624 -0
  423. package/ui/boot/Ui/NumberField.qml +86 -0
  424. package/ui/boot/Ui/OpticalGlyph.qml +68 -0
  425. package/ui/boot/Ui/OverlayWindow.qml +102 -0
  426. package/ui/boot/Ui/Panel.qml +60 -0
  427. package/ui/boot/Ui/PanelActionButton.qml +105 -0
  428. package/ui/boot/Ui/PanelController.qml +16 -0
  429. package/ui/boot/Ui/PanelHero.qml +112 -0
  430. package/ui/boot/Ui/PanelKeyCatcher.qml +100 -0
  431. package/ui/boot/Ui/PanelSectionHeader.qml +31 -0
  432. package/ui/boot/Ui/PanelSeparator.qml +19 -0
  433. package/ui/boot/Ui/PanelSlider.qml +156 -0
  434. package/ui/boot/Ui/PanelToolTip.qml +50 -0
  435. package/ui/boot/Ui/PluginBarApi.qml +89 -0
  436. package/ui/boot/Ui/PointerMoveGate.qml +54 -0
  437. package/ui/boot/Ui/PopupCard.qml +181 -0
  438. package/ui/boot/Ui/ScreenMoveRemap.qml +43 -0
  439. package/ui/boot/Ui/SearchableDropdown.qml +354 -0
  440. package/ui/boot/Ui/SizedImage.qml +125 -0
  441. package/ui/boot/Ui/SpeedTestOverlay.qml +412 -0
  442. package/ui/boot/Ui/TextField.qml +58 -0
  443. package/ui/boot/Ui/Toggle.qml +118 -0
  444. package/ui/boot/Ui/ToggleSwitch.qml +115 -0
  445. package/ui/boot/Ui/WidgetButton.qml +172 -0
  446. package/ui/boot/Ui/qmldir +41 -0
  447. package/ui/boot/fleatab.qml +50 -0
  448. package/ui/boot/picker.qml +39 -0
  449. package/ui/boot/shell.qml +122 -0
  450. package/ui/boot/tabtearoff.qml +51 -0
  451. package/ui/js/Anchor.js +379 -0
  452. package/ui/js/AnchorHold.js +162 -0
  453. package/ui/js/Archive.js +157 -0
  454. package/ui/js/ArchiveCard.js +44 -0
  455. package/ui/js/ArchiveOps.js +44 -0
  456. package/ui/js/BackReturn.js +118 -0
  457. package/ui/js/BulkRename.js +100 -0
  458. package/ui/js/Buttons.js +54 -0
  459. package/ui/js/ChromeKeys.js +116 -0
  460. package/ui/js/ClipMarks.js +73 -0
  461. package/ui/js/ClipSelection.js +67 -0
  462. package/ui/js/Clipboard.js +179 -0
  463. package/ui/js/Cloud.js +97 -0
  464. package/ui/js/CodeRuns.js +72 -0
  465. package/ui/js/Collide.js +212 -0
  466. package/ui/js/ColumnFit.js +28 -0
  467. package/ui/js/ColumnMenu.js +111 -0
  468. package/ui/js/Columns.js +298 -0
  469. package/ui/js/ColumnsCarry.js +103 -0
  470. package/ui/js/Compare.js +74 -0
  471. package/ui/js/Contrast.js +157 -0
  472. package/ui/js/ControlReader.js +42 -0
  473. package/ui/js/Convert.js +52 -0
  474. package/ui/js/CopyAs.js +52 -0
  475. package/ui/js/Crumbs.js +178 -0
  476. package/ui/js/Csv.js +231 -0
  477. package/ui/js/Density.js +44 -0
  478. package/ui/js/Devices.js +440 -0
  479. package/ui/js/DirSizes.js +180 -0
  480. package/ui/js/Drag.js +364 -0
  481. package/ui/js/DragOut.js +166 -0
  482. package/ui/js/DropDev.js +52 -0
  483. package/ui/js/Dropbox.js +41 -0
  484. package/ui/js/Eject.js +217 -0
  485. package/ui/js/Errors.js +188 -0
  486. package/ui/js/ExtThumbs.js +115 -0
  487. package/ui/js/Facts.js +402 -0
  488. package/ui/js/FigureDate.js +14 -0
  489. package/ui/js/Filter.js +285 -0
  490. package/ui/js/Find.js +46 -0
  491. package/ui/js/Flash.js +184 -0
  492. package/ui/js/FlashCard.js +79 -0
  493. package/ui/js/FlashEndings.js +125 -0
  494. package/ui/js/FlashPane.js +116 -0
  495. package/ui/js/FleaBin.js +12 -0
  496. package/ui/js/Focus.js +502 -0
  497. package/ui/js/FolderSorts.js +108 -0
  498. package/ui/js/FolderViews.js +44 -0
  499. package/ui/js/Format.js +305 -0
  500. package/ui/js/Fuzzy.js +141 -0
  501. package/ui/js/GlassTag.js +72 -0
  502. package/ui/js/Grid.js +33 -0
  503. package/ui/js/GridGeometry.js +90 -0
  504. package/ui/js/GridNames.js +153 -0
  505. package/ui/js/GvfsBridge.js +200 -0
  506. package/ui/js/HostClipboard.js +29 -0
  507. package/ui/js/Icons.js +218 -0
  508. package/ui/js/Input.js +50 -0
  509. package/ui/js/Jump.js +200 -0
  510. package/ui/js/KeyName.js +64 -0
  511. package/ui/js/Keymap.js +401 -0
  512. package/ui/js/Kinds.js +164 -0
  513. package/ui/js/LICENSES/ISC-lucide.txt +43 -0
  514. package/ui/js/LangMarkPaths.js +47 -0
  515. package/ui/js/LangMarks.js +120 -0
  516. package/ui/js/Lists.js +11 -0
  517. package/ui/js/LocalSend.js +39 -0
  518. package/ui/js/LockedMenu.js +63 -0
  519. package/ui/js/MakeDefault.js +186 -0
  520. package/ui/js/MarkBox.js +7 -0
  521. package/ui/js/Markdown.js +119 -0
  522. package/ui/js/MarkdownLists.js +86 -0
  523. package/ui/js/MarkdownMaths.js +58 -0
  524. package/ui/js/MarkdownPictures.js +32 -0
  525. package/ui/js/MarkdownPrepared.js +139 -0
  526. package/ui/js/MarkdownTableFit.js +34 -0
  527. package/ui/js/Marks.js +148 -0
  528. package/ui/js/Marquee.js +96 -0
  529. package/ui/js/Match.js +93 -0
  530. package/ui/js/Material.js +109 -0
  531. package/ui/js/MdBlocks.js +437 -0
  532. package/ui/js/MdBreak.js +71 -0
  533. package/ui/js/MdChunks.js +70 -0
  534. package/ui/js/MdContainer.js +137 -0
  535. package/ui/js/MdDocument.js +337 -0
  536. package/ui/js/MdEmph.js +97 -0
  537. package/ui/js/MdEntity.js +108 -0
  538. package/ui/js/MdEntityTable.js +223 -0
  539. package/ui/js/MdEscape.js +59 -0
  540. package/ui/js/MdFront.js +37 -0
  541. package/ui/js/MdHold.js +32 -0
  542. package/ui/js/MdHtml.js +307 -0
  543. package/ui/js/MdHtmlBlock.js +290 -0
  544. package/ui/js/MdHtmlHeading.js +53 -0
  545. package/ui/js/MdHtmlImage.js +179 -0
  546. package/ui/js/MdInline.js +154 -0
  547. package/ui/js/MdItems.js +212 -0
  548. package/ui/js/MdLeaf.js +309 -0
  549. package/ui/js/MdLink.js +196 -0
  550. package/ui/js/MdMath.js +67 -0
  551. package/ui/js/MdParagraphs.js +138 -0
  552. package/ui/js/MdRefs.js +232 -0
  553. package/ui/js/MdResolve.js +226 -0
  554. package/ui/js/MdRun.js +300 -0
  555. package/ui/js/MdUrl.js +226 -0
  556. package/ui/js/Menu.js +514 -0
  557. package/ui/js/MenuContext.js +85 -0
  558. package/ui/js/MenuFit.js +13 -0
  559. package/ui/js/MenuRefresh.js +74 -0
  560. package/ui/js/MenuWheel.js +35 -0
  561. package/ui/js/Messages.js +186 -0
  562. package/ui/js/Motion.js +16 -0
  563. package/ui/js/Mounts.js +320 -0
  564. package/ui/js/MouseNav.js +13 -0
  565. package/ui/js/Nav.js +329 -0
  566. package/ui/js/NetFs.js +26 -0
  567. package/ui/js/OpenWith.js +83 -0
  568. package/ui/js/Ops.js +585 -0
  569. package/ui/js/Palette.js +33 -0
  570. package/ui/js/PathBar.js +260 -0
  571. package/ui/js/Permissions.js +179 -0
  572. package/ui/js/Phones.js +112 -0
  573. package/ui/js/Picker.js +353 -0
  574. package/ui/js/PlaceMenu.js +96 -0
  575. package/ui/js/Places.js +265 -0
  576. package/ui/js/PreviewAsk.js +21 -0
  577. package/ui/js/PreviewKeys.js +155 -0
  578. package/ui/js/PreviewSettle.js +29 -0
  579. package/ui/js/PreviewSwap.js +101 -0
  580. package/ui/js/PropertyFacts.js +144 -0
  581. package/ui/js/Protocols.js +296 -0
  582. package/ui/js/QuickLookKinds.js +27 -0
  583. package/ui/js/QuickLookRect.js +24 -0
  584. package/ui/js/RailDrop.js +51 -0
  585. package/ui/js/RailKeys.js +87 -0
  586. package/ui/js/RailMenu.js +133 -0
  587. package/ui/js/Recent.js +135 -0
  588. package/ui/js/RecentMode.js +156 -0
  589. package/ui/js/Reload.js +60 -0
  590. package/ui/js/Renderer.js +9 -0
  591. package/ui/js/RunFile.js +143 -0
  592. package/ui/js/Scripts.js +28 -0
  593. package/ui/js/Scroll.js +304 -0
  594. package/ui/js/ScrollOff.js +69 -0
  595. package/ui/js/Search.js +478 -0
  596. package/ui/js/Selection.js +97 -0
  597. package/ui/js/Settings.js +476 -0
  598. package/ui/js/SettingsAbout.js +97 -0
  599. package/ui/js/SettingsShelf.js +52 -0
  600. package/ui/js/SheetKeys.js +42 -0
  601. package/ui/js/SheetQuery.js +281 -0
  602. package/ui/js/ShelfPile.js +27 -0
  603. package/ui/js/SlowClick.js +53 -0
  604. package/ui/js/SlowOp.js +6 -0
  605. package/ui/js/Sort.js +134 -0
  606. package/ui/js/Startup.js +63 -0
  607. package/ui/js/StateWords.js +17 -0
  608. package/ui/js/Status.js +238 -0
  609. package/ui/js/Swap.js +166 -0
  610. package/ui/js/TabMove.js +39 -0
  611. package/ui/js/Tabs.js +736 -0
  612. package/ui/js/Tags.js +134 -0
  613. package/ui/js/Taildrop.js +128 -0
  614. package/ui/js/Tap.js +174 -0
  615. package/ui/js/TextSize.js +107 -0
  616. package/ui/js/Thumbs.js +158 -0
  617. package/ui/js/Transfer.js +172 -0
  618. package/ui/js/Trash.js +81 -0
  619. package/ui/js/TrashDates.js +47 -0
  620. package/ui/js/TrashDrop.js +64 -0
  621. package/ui/js/UiState.js +438 -0
  622. package/ui/js/Unlock.js +152 -0
  623. package/ui/js/Update.js +130 -0
  624. package/ui/js/UserDirs.js +56 -0
  625. package/ui/qmldir +228 -0
@@ -0,0 +1,426 @@
1
+ import QtQuick
2
+ import qs.Commons
3
+ import "." as Flea
4
+ import "js/Buttons.js" as Buttons
5
+ import "js/Protocols.js" as Protocols
6
+
7
+ // The Add-network-place form: a protocol picks the scheme, prefills the port and swaps the field set,
8
+ // and the Mounts-as line always shows the exact URI this will hand to gio mount. A form over a URI,
9
+ // never a second mount system.
10
+ Column {
11
+ id: root
12
+
13
+ property string protocol: "SMB"
14
+ // Every value is read out of the field that holds it, so nothing here can go stale against what
15
+ // is on screen and a programmatic set reaches the field rather than a shadow copy.
16
+ readonly property string label: labelField.text
17
+ readonly property string host: hostField.text
18
+ readonly property string port: portField.text
19
+ readonly property string path: pathField.text
20
+ readonly property string domain: domainField.text
21
+ readonly property string user: userField.text
22
+ readonly property string password: passwordField.text
23
+ // The TLS box flips dav/davs and ftp/ftps, and the canvas draws it ticked.
24
+ property bool tls: true
25
+
26
+ signal submitted()
27
+
28
+ readonly property var spec: Protocols.fieldsFor(root.protocol)
29
+ readonly property string uri: Protocols.uri({
30
+ protocol: root.protocol, host: root.host, port: root.port, path: root.path,
31
+ domain: root.domain, user: root.user, tls: root.tls
32
+ })
33
+ readonly property string passwordHintText: passwordHint.visible ? passwordHint.text : ""
34
+ readonly property bool complete: Protocols.complete({ host: root.host, port: root.port })
35
+
36
+ spacing: Style.space(12)
37
+ // Every row's natural height whether or not the protocol shows it: the form keeps this height
38
+ // through every chip, so the chips above and the buttons below never move under the pointer,
39
+ // and a shorter protocol leaves its air under Mounts as rather than a hole between fields.
40
+ // The three protocol-bound rows count once, as the tallest of them: they never show together.
41
+ readonly property real tallest: {
42
+ var swapped = [domainField, nfsNote, tlsRow]
43
+ var sum = 0
44
+ var shown = 0
45
+ for (var i = 0; i < root.children.length; i++) {
46
+ if (swapped.indexOf(root.children[i]) >= 0)
47
+ continue
48
+ sum += root.children[i].implicitHeight
49
+ shown++
50
+ }
51
+ var tallestSwapped = 0
52
+ for (var j = 0; j < swapped.length; j++)
53
+ tallestSwapped = Math.max(tallestSwapped, swapped[j].implicitHeight)
54
+ return sum + tallestSwapped + root.spacing * shown
55
+ }
56
+ height: root.tallest
57
+
58
+ function pick(name) {
59
+ root.protocol = name
60
+ // The port follows the scheme, because it is that scheme's own default and not a memory.
61
+ portField.text = String(Protocols.defaultPort(name, root.tls))
62
+ root.rehome()
63
+ }
64
+
65
+ // The box picks half of the scheme, so it picks half of the port: dav is 80 where davs is 443,
66
+ // and a number left behind by the tick offers a port the scheme the form built does not use.
67
+ onTlsChanged: portField.text = String(Protocols.defaultPort(root.protocol, root.tls))
68
+
69
+ // Qt keeps active focus on an item that has just gone invisible, so a chip click that hides the
70
+ // focused field would leave the caret where nobody can see it and Enter still submits from.
71
+ // The caret steps on to the next visible ring member instead; step already skips hidden ones.
72
+ function rehome() {
73
+ var ring = root.focusRing()
74
+ for (var i = 0; i < ring.length; i++) {
75
+ if (ring[i].focused && !ring[i].visible) {
76
+ root.step(ring[i], 1)
77
+ return
78
+ }
79
+ }
80
+ }
81
+
82
+ function focusHost() {
83
+ hostField.input.forceActiveFocus()
84
+ }
85
+
86
+ // The dialog's buttons below the form, which the walk takes after the TLS box, in reading order.
87
+ property var trailing: []
88
+
89
+ // Visual order: the protocol chips, then the fields down the form, then the TLS box. Three of
90
+ // these are visibility-bound and come and go with the protocol, so the walk skips what is not on
91
+ // screen rather than parking the caret where nobody can see it.
92
+ function focusRing() {
93
+ var ring = []
94
+ var kids = chips.children
95
+ for (var i = 0; i < kids.length; i++) {
96
+ // A Repeater is itself a child of the Row it fills, alongside its delegates, so the ring
97
+ // takes only what can hold a caret; chipFor below dodges the same object by testing a label.
98
+ if (typeof kids[i].takeFocus === "function") {
99
+ ring.push(kids[i])
100
+ }
101
+ }
102
+ ring.push(labelField, hostField, portField, pathField, domainField, userField, passwordField, tlsRow)
103
+ return ring.concat(root.trailing)
104
+ }
105
+
106
+ function step(from, delta) {
107
+ var ring = root.focusRing()
108
+ var len = ring.length
109
+ var at = ring.indexOf(from)
110
+ if (at < 0) {
111
+ return
112
+ }
113
+ for (var n = 1; n <= len; n++) {
114
+ var next = ring[((at + delta * n) % len + len) % len]
115
+ // A button that cannot act is passed over, the way a hidden field is; a button takes plain focus.
116
+ if (next.visible && next.available !== false) {
117
+ if (typeof next.takeFocus === "function") next.takeFocus(); else next.forceActiveFocus()
118
+ return
119
+ }
120
+ }
121
+ }
122
+
123
+ // A test reaches a chip by its label.
124
+ function chipFor(name) {
125
+ var kids = chips.children
126
+ for (var i = 0; i < kids.length; i++) {
127
+ if (kids[i].label === name)
128
+ return kids[i]
129
+ }
130
+ return null
131
+ }
132
+
133
+ function reset() {
134
+ labelField.text = ""
135
+ hostField.text = ""
136
+ pathField.text = ""
137
+ domainField.text = ""
138
+ userField.text = ""
139
+ passwordField.text = ""
140
+ root.tls = true
141
+ root.pick("SMB")
142
+ }
143
+
144
+ function load(values) {
145
+ root.reset()
146
+ root.pick(values.protocol || "SMB")
147
+ // The box before the port: onTlsChanged above prefills the scheme's own default, and after
148
+ // the port it would overwrite the one this saved location actually carries.
149
+ root.tls = values.tls !== false
150
+ labelField.text = values.label || ""
151
+ hostField.text = values.host || ""
152
+ portField.text = values.port || String(Protocols.defaultPort(root.protocol, root.tls))
153
+ pathField.text = values.path || ""
154
+ domainField.text = values.domain || ""
155
+ userField.text = values.user || ""
156
+ passwordField.text = values.password || ""
157
+ }
158
+
159
+ function takePassword() {
160
+ var value = passwordField.text
161
+ passwordField.text = ""
162
+ return value
163
+ }
164
+
165
+ // Non-secret form observables: tests may see shape, focus and masking, never field contents.
166
+ function visibleFields() {
167
+ var out = ["Label", "Host", "Port", root.spec.pathLabel]
168
+ if (root.spec.domain) out.push("Domain")
169
+ if (root.spec.credentials) out.push("Username", "Password")
170
+ if (root.spec.tls) out.push("TLS")
171
+ return out.join("|")
172
+ }
173
+
174
+ function focusName() {
175
+ var fields = [labelField, hostField, portField, pathField, domainField, userField, passwordField]
176
+ for (var i = 0; i < fields.length; i++) {
177
+ if (fields[i].focused) return fields[i].label
178
+ }
179
+ for (var j = 0; j < root.trailing.length; j++) {
180
+ if (root.trailing[j].activeFocus) return root.trailing[j].label
181
+ }
182
+ return tlsRow.focused ? "TLS" : ""
183
+ }
184
+
185
+ function hostPortWidths() { return Math.round(hostField.width) + "|" + Math.round(portField.width) }
186
+ function passwordState() {
187
+ return (passwordField.input.echoMode === TextInput.Password ? "masked" : "visible")
188
+ + "|" + (passwordField.text.length > 0 ? "set" : "empty")
189
+ }
190
+ function passwordEyeCentre() {
191
+ var input = passwordField.input
192
+ var hit = Math.max(Theme.hitMin, Theme.font.bodySmall)
193
+ var point = input.mapToItem(null, input.width + Theme.spacing.gap + hit / 2, input.height / 2)
194
+ return Math.round(point.x) + " " + Math.round(point.y)
195
+ }
196
+
197
+ Row {
198
+ id: chips
199
+ spacing: Theme.spacing.hairline * Buttons.SET_GAP
200
+
201
+ Repeater {
202
+ model: Protocols.PROTOCOLS
203
+ delegate: Flea.ProtocolChip {
204
+ required property string modelData
205
+ label: modelData
206
+ picked: root.protocol === modelData
207
+ onActivated: root.pick(modelData)
208
+ onTabbed: function (from, back) { root.step(from, back ? -1 : 1) }
209
+ }
210
+ }
211
+ }
212
+
213
+ Flea.DialogField {
214
+ id: labelField
215
+ width: parent.width
216
+ label: "Label"
217
+ placeholder: Protocols.label({ label: "", host: root.host, path: root.path })
218
+ onAccepted: root.submitted()
219
+ onTabbed: function (from, back) { root.step(from, back ? -1 : 1) }
220
+ }
221
+
222
+ Row {
223
+ width: parent.width
224
+ spacing: Style.space(10)
225
+
226
+ Flea.DialogField {
227
+ id: hostField
228
+ width: (parent.width - parent.spacing) / 2
229
+ label: "Host"
230
+ onAccepted: root.submitted()
231
+ onTabbed: function (from, back) { root.step(from, back ? -1 : 1) }
232
+ }
233
+
234
+ Flea.DialogField {
235
+ width: hostField.width
236
+ id: portField
237
+ label: "Port"
238
+ onAccepted: root.submitted()
239
+ onTabbed: function (from, back) { root.step(from, back ? -1 : 1) }
240
+ }
241
+ }
242
+
243
+ // Share, Path or Export: the row is the same, the thing it names is not.
244
+ Flea.DialogField {
245
+ id: pathField
246
+ width: parent.width
247
+ label: root.spec.pathLabel
248
+ onAccepted: root.submitted()
249
+ onTabbed: function (from, back) { root.step(from, back ? -1 : 1) }
250
+ }
251
+
252
+ Flea.DialogField {
253
+ id: domainField
254
+ width: parent.width
255
+ visible: root.spec.domain
256
+ height: visible ? implicitHeight : 0
257
+ label: "Domain"
258
+ onAccepted: root.submitted()
259
+ onTabbed: function (from, back) { root.step(from, back ? -1 : 1) }
260
+ }
261
+
262
+ Flea.DialogField {
263
+ id: userField
264
+ width: parent.width
265
+ visible: root.spec.credentials
266
+ height: visible ? implicitHeight : 0
267
+ label: "Username"
268
+ onAccepted: root.submitted()
269
+ onTabbed: function (from, back) { root.step(from, back ? -1 : 1) }
270
+ }
271
+
272
+ Flea.DialogField {
273
+ id: passwordField
274
+ width: parent.width
275
+ visible: root.spec.credentials
276
+ height: visible ? implicitHeight : 0
277
+ label: "Password"
278
+ secret: true
279
+ onAccepted: root.submitted()
280
+ onTabbed: function (from, back) { root.step(from, back ? -1 : 1) }
281
+ }
282
+
283
+ Text {
284
+ id: passwordHint
285
+ visible: root.spec.credentials
286
+ width: parent.width
287
+ height: visible ? implicitHeight : 0
288
+ text: "The password is not saved."
289
+ color: Theme.color.muted
290
+ font.family: Theme.font.family
291
+ font.pixelSize: Theme.font.caption
292
+ textFormat: Text.PlainText
293
+ }
294
+
295
+ Text {
296
+ id: nfsNote
297
+ visible: root.protocol === "NFS"
298
+ width: parent.width
299
+ height: visible ? implicitHeight : 0
300
+ text: "No password needed. The NFS server trusts this computer."
301
+ color: Theme.color.muted
302
+ font.family: Theme.font.family
303
+ font.pixelSize: Theme.font.caption
304
+ textFormat: Text.PlainText
305
+ }
306
+
307
+ Item {
308
+ id: tlsRow
309
+ width: parent.width
310
+ visible: root.spec.tls
311
+ implicitHeight: Theme.rowHeight - Theme.spacing.rowPaddingY
312
+ height: visible ? implicitHeight : 0
313
+
314
+ readonly property bool focused: tlsRow.activeFocus
315
+ signal tabbed(var from, bool back)
316
+ function takeFocus() { tlsRow.forceActiveFocus() }
317
+ onTabbed: function (from, back) { root.step(from, back ? -1 : 1) }
318
+ Keys.onTabPressed: function(event) { tlsRow.tabbed(tlsRow, (event.modifiers & Qt.ShiftModifier) !== 0) }
319
+ Keys.onBacktabPressed: tlsRow.tabbed(tlsRow, true)
320
+ Keys.onReturnPressed: root.tls = !root.tls
321
+ Keys.onEnterPressed: root.tls = !root.tls
322
+ Keys.onSpacePressed: root.tls = !root.tls
323
+
324
+ Rectangle {
325
+ id: tlsBox
326
+ anchors.left: parent.left
327
+ anchors.verticalCenter: parent.verticalCenter
328
+ width: Theme.font.caption
329
+ height: Theme.font.caption
330
+ color: "transparent"
331
+ border.width: Theme.spacing.hairline * 2
332
+ border.color: root.tls ? Theme.color.accent
333
+ : (tlsRow.focused ? Theme.color.foreground : Theme.color.mutedFrame)
334
+
335
+ Flea.Glyph {
336
+ anchors.fill: parent
337
+ visible: root.tls
338
+ name: "check"
339
+ color: Theme.color.accent
340
+ }
341
+ }
342
+
343
+ Text {
344
+ anchors.left: tlsBox.right
345
+ anchors.leftMargin: Theme.spacing.gap
346
+ anchors.verticalCenter: parent.verticalCenter
347
+ text: "Encrypted (TLS)"
348
+ color: Theme.color.foreground
349
+ font.family: Theme.font.family
350
+ font.pixelSize: Theme.font.body
351
+ textFormat: Text.PlainText
352
+ }
353
+
354
+ TapHandler {
355
+ acceptedButtons: Qt.LeftButton
356
+ gesturePolicy: TapHandler.ReleaseWithinBounds
357
+ onTapped: root.tls = !root.tls
358
+ }
359
+ }
360
+
361
+ // The exact URI, on one line that never wraps and never clips: it pans, and the edge fade says
362
+ // there is more. A Flickable is what makes that a pan rather than an elide.
363
+ Column {
364
+ width: parent.width
365
+ spacing: Theme.spacing.hairline * 2
366
+ // HANDOFF rule 19: an unfilled form has no URI to show, so the sentence goes with it.
367
+ visible: root.uri.length > 0
368
+
369
+ Item {
370
+ width: parent.width
371
+ height: uriText.implicitHeight
372
+ clip: true
373
+
374
+ Flickable {
375
+ id: sentenceFlick
376
+ anchors.fill: parent
377
+ contentWidth: sentence.implicitWidth
378
+ contentHeight: sentence.implicitHeight
379
+ flickableDirection: Flickable.HorizontalFlick
380
+ boundsBehavior: Flickable.StopAtBounds
381
+ Flea.FastScrollHandler {
382
+ parent: sentenceFlick
383
+ flickable: sentenceFlick
384
+ }
385
+
386
+ // Dialogs rule 3: one sentence rather than an eyebrow over a value, and it says the
387
+ // whole answer, because Protocols.uri() has one as soon as the host and port validate:
388
+ // an empty Share is the server root, which is a real and mountable place.
389
+ Row {
390
+ id: sentence
391
+ spacing: Theme.spacing.gap / 2
392
+
393
+ Text {
394
+ text: "Mounts as"
395
+ color: Theme.color.muted
396
+ font.family: Theme.font.family
397
+ font.pixelSize: Theme.font.caption
398
+ textFormat: Text.PlainText
399
+ }
400
+
401
+ Text {
402
+ id: uriText
403
+ text: root.uri
404
+ color: Theme.color.foreground
405
+ font.family: Theme.font.family
406
+ font.pixelSize: Theme.font.caption
407
+ textFormat: Text.PlainText
408
+ }
409
+ }
410
+ }
411
+
412
+ Rectangle {
413
+ anchors.right: parent.right
414
+ anchors.top: parent.top
415
+ anchors.bottom: parent.bottom
416
+ visible: sentence.implicitWidth > parent.width
417
+ width: Theme.space(36)
418
+ gradient: Gradient {
419
+ orientation: Gradient.Horizontal
420
+ GradientStop { position: 0; color: "transparent" }
421
+ GradientStop { position: 1; color: Theme.color.surface }
422
+ }
423
+ }
424
+ }
425
+ }
426
+ }