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,56 @@
1
+ import QtQuick
2
+
3
+ // Directive 71: the menu's LocalSend row is the Taildrop row's twin, so this is ui/Taildrop.qml's
4
+ // shape for the other one: the only thing here that knows about LocalSend, with ui/ContextMenu.qml
5
+ // reading "peers" and rendering it. The work itself is the backend's, which drives localsend-cli on
6
+ // a pty of its own; nothing here ever opens the LocalSend app.
7
+ Item {
8
+ id: root
9
+
10
+ property var backend: null
11
+ // [{id, label}], the devices the CLI discovered, named the way their own owners named them.
12
+ property var peers: []
13
+ property string reason: "checking"
14
+ property bool checking: false
15
+ // Whether this install has answered once: until then a look in flight dims the row, afterwards the last answer stands.
16
+ property bool answeredOnce: false
17
+ signal refreshed()
18
+ signal completed(bool ok, string reason)
19
+
20
+ // The list is asked for when a menu opens, and kept while it is warm: discovery costs a CLI run
21
+ // of over a second, and a right click is not a reason to announce this box on the LAN again.
22
+ readonly property int warmMs: 15000
23
+ property double _askedAt: 0
24
+
25
+ function refresh(installed) {
26
+ if (!installed) {
27
+ root.peers = []
28
+ root.answeredOnce = false
29
+ root.reason = "localsend-cli is not installed"
30
+ return true
31
+ }
32
+ if (root.checking) return false
33
+ if (root._askedAt > 0 && Date.now() - root._askedAt < root.warmMs) return true
34
+ root.checking = true
35
+ root.backend.localSend("peers", "", [])
36
+ return true
37
+ }
38
+
39
+ function send(peer, paths) {
40
+ if (!peer || paths.length === 0) return false
41
+ root.backend.localSend("send", peer, paths)
42
+ return true
43
+ }
44
+
45
+ function answered(list, why) {
46
+ root._askedAt = Date.now()
47
+ root.checking = false
48
+ root.answeredOnce = true
49
+ var rows = []
50
+ for (var i = 0; i < list.length; i++)
51
+ rows.push({ id: String(list[i].name), label: String(list[i].name) })
52
+ root.peers = rows
53
+ root.reason = why
54
+ root.refreshed()
55
+ }
56
+ }
@@ -0,0 +1,73 @@
1
+ import QtQuick
2
+ import QtQuick.Shapes
3
+ import qs.Commons
4
+
5
+ // The LocalSend mark, reproduced from the official artwork rather than recut, the same ruling that
6
+ // brought TailscaleMark and DropboxMark back: a solid disc inside a ring of eight dashes, monochrome
7
+ // and palette-tinted, no brand teal. 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
+ // Measured off docs/design/flea-shelf/export/localsend-96.png at alpha 128: the disc ends at
17
+ // 20 px, the dash band runs 31.25 to 36.25 px, and the ink is eight runs of 31 degrees whose
18
+ // centres are 45 degrees apart. The logo's own ink box is 72.5 px of that 96 px file, and this
19
+ // mark fills its slot rather than keeping the file's padding, which is the AdGuard lesson, so
20
+ // every fraction below is of that ink box.
21
+ readonly property real discRadius: 0.276
22
+ readonly property real ringRadius: 0.466
23
+ readonly property real dashStroke: 0.069
24
+ // Round ends add half the stroke beyond each arc, which is what turns the 22.5 degrees drawn
25
+ // here into the 31 degrees of ink the artwork shows.
26
+ readonly property real dashArc: 22.5
27
+ readonly property int dashes: 8
28
+
29
+ readonly property real drawn: Math.min(Theme.markSize, root.iconSize)
30
+
31
+ implicitWidth: root.drawn
32
+ implicitHeight: root.drawn
33
+ width: root.drawn
34
+ height: root.drawn
35
+
36
+ // All eight arcs in one path string: a ShapePath is not an Item, so a Repeater cannot make them.
37
+ readonly property string ring: {
38
+ var centre = root.drawn / 2
39
+ var radius = root.ringRadius * root.drawn
40
+ var half = root.dashArc / 2
41
+ var out = ""
42
+ for (var i = 0; i < root.dashes; i++) {
43
+ var from = (i * 360 / root.dashes - half) * Math.PI / 180
44
+ var to = (i * 360 / root.dashes + half) * Math.PI / 180
45
+ out += "M " + (centre + radius * Math.cos(from)) + " " + (centre + radius * Math.sin(from))
46
+ + " A " + radius + " " + radius + " 0 0 1 "
47
+ + (centre + radius * Math.cos(to)) + " " + (centre + radius * Math.sin(to)) + " "
48
+ }
49
+ return out
50
+ }
51
+
52
+ Rectangle {
53
+ anchors.centerIn: parent
54
+ width: 2 * root.discRadius * root.drawn
55
+ height: width
56
+ radius: width / 2
57
+ color: root.color
58
+ }
59
+
60
+ Shape {
61
+ anchors.fill: parent
62
+ preferredRendererType: Shape.CurveRenderer
63
+
64
+ ShapePath {
65
+ fillColor: "transparent"
66
+ strokeColor: root.color
67
+ strokeWidth: root.dashStroke * root.drawn
68
+ capStyle: ShapePath.RoundCap
69
+
70
+ PathSvg { path: root.ring }
71
+ }
72
+ }
73
+ }
@@ -0,0 +1,311 @@
1
+ import QtQuick
2
+ import "." as Flea
3
+ import "js/CodeRuns.js" as CodeRuns
4
+ import "js/Markdown.js" as Markdown
5
+ import "js/MdHtmlImage.js" as HtmlImage
6
+
7
+ // One Markdown block, built as the one kind it is, at the top of the document or inside an item or a quote.
8
+ Item {
9
+ id: view
10
+
11
+ property var block: ({})
12
+ property int blockIndex: -1
13
+ // How many blocks the list holding this one has, so the last one knows nothing follows it.
14
+ property int blockCount: 0
15
+ // The preview that sets the document's sizes and colours.
16
+ property Item preview: null
17
+ // Only a figure intersecting the viewport may send a render request.
18
+ property bool inView: true
19
+
20
+ // The drawn run text this view built, else null for any other kind or a maths run.
21
+ readonly property Item runText: view.block.type === "run" && view.block.maths === undefined ? (kind.item as Item) : null
22
+ // A picture followed by a picture block sits at the list spacing; a picture followed by text keeps the block gap, so what follows never touches it.
23
+ readonly property bool nextIsPicture: view.nextBlock !== null && view.nextBlock !== undefined && (view.nextBlock.type === "image" || view.nextBlock.type === "images" || view.nextBlock.type === "remote" || view.nextBlock.type === "figure")
24
+ readonly property int pictureGap: (view.block.type === "images" || view.block.type === "image") && view.blockIndex < view.blockCount - 1 && !view.nextIsPicture ? view.preview.blockGap : 0
25
+ // The blocks beside this one in the list that holds it: the document's list at the top, the item's or quote's parts inside one.
26
+ property var siblings: null
27
+ // The block after this one in the same list, which decides whether a picture keeps the block gap.
28
+ readonly property var neighbourList: view.siblings !== null ? view.siblings : (view.preview !== null ? view.preview.blockList : null)
29
+ readonly property var nextBlock: neighbourList === null || neighbourList === undefined || view.blockIndex + 1 >= neighbourList.length
30
+ ? null : neighbourList[view.blockIndex + 1]
31
+ // Only the drawn block lends its height, and a list or table chunk lies flush by its own negative y.
32
+ height: kind.item ? kind.item.height + kind.item.y + view.pictureGap : 0
33
+
34
+ // A block builds only the parts its own kind draws, on the view; an empty heading or quote builds none, so it has no height.
35
+ Loader {
36
+ id: kind
37
+ sourceComponent: view.block.text === "" && view.block.parts === undefined && (view.block.type === "heading" || view.block.type === "quote") ? null : view.block.type === "run" && view.block.maths !== undefined ? mathsBlock
38
+ : view.block.type === "run" || view.block.type === "heading" ? textBlock
39
+ : view.block.type === "fence" ? fenceBlock
40
+ : view.block.type === "figure" ? figureBlock
41
+ : view.block.type === "quote" ? quoteBlock
42
+ : view.block.type === "remote" ? remoteBlock
43
+ : view.block.type === "list" ? listBlock
44
+ : view.block.type === "table" ? tableBlock
45
+ : view.block.type === "images" ? imagesBlock : imageBlock
46
+ onLoaded: kind.item.parent = view
47
+ }
48
+
49
+ // Headings use the prescribed bold text size and line box.
50
+ Component {
51
+ id: textBlock
52
+ Flea.MarkdownText {
53
+ linkGate: Markdown.isExternalLink
54
+ width: view.width
55
+ bodyPx: view.preview.bodyPx
56
+ markdown: view.block.text
57
+ font.pixelSize: view.block.type === "heading" ? view.preview.headingPx(view.block.level) : view.preview.bodyPx
58
+ font.bold: view.block.type === "heading"
59
+ // h1 and h2 take the bright foreground; deeper levels and body stay the foreground.
60
+ color: view.block.type === "heading" && view.block.level <= view.preview.boardHeadings.length ? Theme.color.foregroundBright : Theme.color.foreground
61
+ // An HTML heading keeps its align attribute; Markdown headings stay left.
62
+ horizontalAlignment: view.block.align === "center" ? Text.AlignHCenter : view.block.align === "right" ? Text.AlignRight : Text.AlignLeft
63
+ }
64
+ }
65
+
66
+ // A run with inline formulas draws each in its line once the helper answers; the other runs build none of its parts.
67
+ Component {
68
+ id: mathsBlock
69
+ Flea.MarkdownMathsText {
70
+ objectName: "mathsText"
71
+ linkGate: Markdown.isExternalLink
72
+ width: view.width
73
+ bodyPx: view.preview.bodyPx
74
+ source: view.block.text
75
+ maths: view.block.maths
76
+ askArmed: view.preview.figuresArmed
77
+ inView: view.inView
78
+ bgHex: view.preview.hexOf(Theme.color.background)
79
+ fgHex: view.preview.inkHex
80
+ accentHex: view.preview.accentHex
81
+ mutedHex: view.preview.mutedHex
82
+ surfaceHex: view.preview.surfaceHex
83
+ fencePadX: view.preview.fencePadX
84
+ fencePadY: view.preview.fencePadY
85
+ font.pixelSize: view.preview.bodyPx
86
+ }
87
+ }
88
+
89
+ Component {
90
+ id: tableBlock
91
+ Flea.MarkdownTable {
92
+ block: view.block
93
+ preview: view.preview
94
+ availableWidth: view.width
95
+ }
96
+ }
97
+
98
+ // A named fence takes engine colours after its reply; the escaped foreground text before it preserves its height.
99
+ Component {
100
+ id: fenceBlock
101
+ Rectangle {
102
+ id: fenceBox
103
+ objectName: "fenceBox"
104
+ width: view.width
105
+ height: fenceText.implicitHeight + 2 * view.preview.fencePadY
106
+ color: view.preview.codeSurface
107
+ readonly property string info: String(view.block.info || "").trim()
108
+ readonly property var backend: view.preview.backend
109
+ readonly property bool coloured: fenceBox.info !== "" && view.preview.shownView !== Markdown.SOURCE
110
+ && fenceBox.backend !== null && typeof fenceBox.backend.askCode === "function"
111
+ // The one slot this fence asks on, handed out by the preview so no two fences share one.
112
+ property string slot: ""
113
+ property int token: 0
114
+ // The first 1-based line not yet answered, and the runs of each answered line.
115
+ property int next: 1
116
+ property var held: ({})
117
+ property int stamp: 0
118
+ // The engine refused this fence (binary, large or failed), so it stays in the foreground.
119
+ property bool refused: false
120
+ readonly property var fenceLines: view.block.text.split("\n")
121
+ readonly property int lineCap: 400
122
+ readonly property bool awaiting: fenceBox.coloured && !fenceBox.refused && fenceBox.next <= fenceBox.fenceLines.length
123
+ readonly property bool holdsScreen: fenceBox.awaiting && view.inView
124
+ readonly property string markup: {
125
+ if (fenceBox.stamp < 0)
126
+ return ""
127
+ var out = []
128
+ for (var i = 0; i < fenceBox.fenceLines.length; i++) {
129
+ var runs = fenceBox.held[i + 1]
130
+ out.push(CodeRuns.styled(runs !== undefined ? runs : [0, fenceBox.fenceLines[i]], view.preview.inks))
131
+ }
132
+ return out.join("<br>")
133
+ }
134
+
135
+ function ask() {
136
+ if (fenceBox.slot === "" || !fenceBox.awaiting || fenceBox.token !== 0)
137
+ return
138
+ var count = Math.min(fenceBox.lineCap, fenceBox.fenceLines.length - fenceBox.next + 1)
139
+ fenceBox.token = fenceBox.backend.askCode(fenceBox.slot, { text: view.block.text, name: "", lang: fenceBox.info }, fenceBox.next, count)
140
+ }
141
+ function rebind() {
142
+ fenceBox.token = 0
143
+ fenceBox.held = {}
144
+ fenceBox.stamp += 1
145
+ fenceBox.next = 1
146
+ fenceBox.refused = false
147
+ Qt.callLater(fenceBox.ask)
148
+ }
149
+ onBackendChanged: fenceBox.rebind()
150
+ function answered(message) {
151
+ if (fenceBox.token === 0 || message.token !== fenceBox.token)
152
+ return
153
+ fenceBox.token = 0
154
+ var rows = message.lines || []
155
+ if ((message.state !== "styled" && message.state !== "plain") || rows.length === 0) {
156
+ fenceBox.refused = true
157
+ return
158
+ }
159
+ for (var i = 0; i < rows.length; i++)
160
+ fenceBox.held[fenceBox.next + i] = rows[i]
161
+ fenceBox.next += rows.length
162
+ fenceBox.stamp += 1
163
+ fenceBox.ask()
164
+ }
165
+
166
+ // Only a viewport fence holds the first screen; tearing its block down releases that hold too.
167
+ property bool waiting: false
168
+ function setWaiting(on) {
169
+ if (on === fenceBox.waiting)
170
+ return
171
+ fenceBox.waiting = on
172
+ view.preview.fenceWaiting(on ? 1 : -1)
173
+ }
174
+ onHoldsScreenChanged: fenceBox.setWaiting(fenceBox.holdsScreen)
175
+ onAwaitingChanged: fenceBox.ask()
176
+ Component.onCompleted: {
177
+ fenceBox.slot = view.preview.fenceSlot(fenceBox)
178
+ fenceBox.setWaiting(fenceBox.holdsScreen)
179
+ if (fenceBox.awaiting)
180
+ fenceBox.ask()
181
+ }
182
+ Component.onDestruction: {
183
+ if (fenceBox.waiting) view.preview.fenceWaiting(-1)
184
+ delete view.preview.fenceReplies[fenceBox.slot]
185
+ }
186
+
187
+ Text {
188
+ id: fenceText
189
+ anchors.fill: parent
190
+ anchors.leftMargin: view.preview.fencePadX
191
+ anchors.rightMargin: view.preview.fencePadX
192
+ anchors.topMargin: view.preview.fencePadY
193
+ anchors.bottomMargin: view.preview.fencePadY
194
+ text: fenceBox.coloured ? fenceBox.markup : view.block.text
195
+ textFormat: fenceBox.coloured ? Text.StyledText : Text.PlainText
196
+ wrapMode: Text.Wrap
197
+ color: Theme.color.foreground
198
+ font.family: Theme.font.family
199
+ font.pixelSize: view.preview.bodyPx
200
+ }
201
+ }
202
+ }
203
+
204
+ // Display maths use the figure fallback's vertical inset; the list owns the block gap.
205
+ Component {
206
+ id: figureBlock
207
+ Item {
208
+ id: figureBox
209
+ objectName: "figureBox"
210
+ width: view.width
211
+ readonly property int figureInset: figureItem.ready && figureItem.kind === "math" && figureItem.fitHeight > 0 ? Theme.spacing.gap : 0
212
+ height: figureItem.implicitHeight + 2 * figureInset
213
+
214
+ Flea.MarkdownFigure {
215
+ id: figureItem
216
+ objectName: "figureItem"
217
+ y: parent.figureInset
218
+ width: parent.width
219
+ kind: view.block.kind
220
+ source: view.block.source
221
+ display: true
222
+ askArmed: view.preview.figuresArmed
223
+ inView: view.inView
224
+ bgHex: view.preview.hexOf(Theme.color.background)
225
+ fgHex: view.preview.inkHex
226
+ accentHex: view.preview.accentHex
227
+ mutedHex: view.preview.mutedHex
228
+ surfaceHex: view.preview.surfaceHex
229
+ fallbackColor: view.preview.codeSurface
230
+ fencePadX: view.preview.fencePadX
231
+ fencePadY: view.preview.fencePadY
232
+ fontFamily: Theme.font.family
233
+ bodyPx: view.preview.bodyPx
234
+ }
235
+ }
236
+ }
237
+
238
+ // A quote draws one bar per level, and a joined block sits flush under the one above so the outer bars run on.
239
+ Component {
240
+ id: quoteBlock
241
+ Flea.MarkdownQuote {
242
+ objectName: "quoteRow"
243
+ y: view.block.joined === true ? -view.preview.blockGap : 0
244
+ width: view.width
245
+ levels: view.block.depth !== undefined ? view.block.depth : 1
246
+ linkGate: Markdown.isExternalLink
247
+ bodyPx: view.preview.bodyPx
248
+ text: view.block.text
249
+ parts: view.block.parts !== undefined ? view.block.parts : []
250
+ preview: view.preview
251
+ inView: view.inView
252
+ }
253
+ }
254
+
255
+ // A chunk after the first sits flush under its predecessor, across the gap the list puts between blocks.
256
+ Component {
257
+ id: listBlock
258
+ Flea.MarkdownList {
259
+ objectName: "listColumn"
260
+ y: view.block.joined === true ? -view.preview.blockGap : 0
261
+ width: view.width
262
+ list: view.block
263
+ gap: view.preview.blockGap
264
+ linkGate: Markdown.isExternalLink
265
+ bodyPx: view.preview.bodyPx
266
+ preview: view.preview
267
+ inView: view.inView
268
+ }
269
+ }
270
+
271
+ Component {
272
+ id: remoteBlock
273
+ Flea.MarkdownRemote {
274
+ width: view.width
275
+ host: view.block.host
276
+ }
277
+ }
278
+
279
+ // A badge row builds only its own pictures, wrapped and aligned by the row itself.
280
+ Component {
281
+ id: imagesBlock
282
+ Flea.MarkdownImages {
283
+ width: view.width
284
+ images: view.block.type === "images" ? view.block.items : []
285
+ centred: view.block.type === "images" && view.block.align === "center"
286
+ gap: view.preview.blockGap
287
+ linkGate: Markdown.isExternalLink
288
+ }
289
+ }
290
+
291
+ Component {
292
+ id: imageBlock
293
+ Image {
294
+ id: localImage
295
+ // The size rule of the badge row (HtmlImage.pictureSize); its paragraph's align="center" centres it.
296
+ readonly property var fit: HtmlImage.pictureSize(view.block.type === "image" ? view.block : ({}), localImage.implicitWidth, localImage.implicitHeight, view.width)
297
+ width: localImage.fit.w
298
+ height: localImage.fit.h
299
+ x: view.block.type === "image" && view.block.align === "center" ? Math.round((view.width - localImage.width) / 2) : 0
300
+ fillMode: localImage.fit.stretch ? Image.Stretch : Image.PreserveAspectFit
301
+ visible: view.block.type === "image"
302
+ asynchronous: true
303
+ autoTransform: true
304
+ source: view.block.type === "image" ? view.block.url : ""
305
+
306
+ // A logo wrapped in a link opens it through the pane's link gate.
307
+ TapHandler { enabled: view.block.link !== undefined; gesturePolicy: TapHandler.ReleaseWithinBounds; onTapped: if (Markdown.isExternalLink(view.block.link)) Qt.openUrlExternally(view.block.link) }
308
+ HoverHandler { enabled: view.block.link !== undefined; cursorShape: Qt.PointingHandCursor }
309
+ }
310
+ }
311
+ }
@@ -0,0 +1,35 @@
1
+ import QtQuick
2
+
3
+ // The blocks an item or a quote holds, in order, each drawn as its kind draws at the top of the document.
4
+ Column {
5
+ id: root
6
+
7
+ property var blocks: []
8
+ // The preview that sets the document's sizes and colours, and whether this part of it is in view for figures.
9
+ property Item preview: null
10
+ property bool inView: true
11
+
12
+ spacing: root.preview !== null ? root.preview.blockGap : 0
13
+
14
+ // The first block's view, tracked without one object per item.
15
+ property Item firstView: null
16
+ // The first block's run text, null unless that block is a plain run.
17
+ readonly property Item firstRunText: root.firstView !== null ? root.firstView.runText : null
18
+
19
+ Repeater {
20
+ onItemAdded: function (index, item) { if (index === 0) root.firstView = item }
21
+ onItemRemoved: function (index, item) { if (item === root.firstView) root.firstView = null }
22
+ model: root.blocks
23
+ delegate: MarkdownBlockView {
24
+ required property var modelData
25
+ required property int index
26
+ block: modelData
27
+ blockIndex: index
28
+ blockCount: root.blocks.length
29
+ siblings: root.blocks
30
+ preview: root.preview
31
+ inView: root.inView
32
+ width: root.width
33
+ }
34
+ }
35
+ }