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,409 @@
1
+ import QtQuick
2
+ import qs.Commons
3
+ import "." as Flea
4
+
5
+ // One row of the settings panel's pane, drawn from the object ui/js/Settings.js rows() built. Every
6
+ // kind is one row height, the window's own, except a hint, which wraps and takes the height its
7
+ // wording needs; the Settings board's anatomy note is where the "no metric of its own" rule comes from.
8
+ Item {
9
+ id: root
10
+
11
+ // {kind, label, value?, on?, state?} from ui/js/Settings.js; kind decides what is drawn.
12
+ property var row: ({})
13
+ property bool current: false
14
+ property bool firstRow: false
15
+
16
+ signal activated()
17
+ signal pointerMoved()
18
+ signal favouriteMoved(int to)
19
+ signal favouriteRemoved()
20
+ // Every steppable row steps the same way, so h/l and the two chevrons fire one signal, never two.
21
+ signal stepped(int direction)
22
+ // The ruler's own way in: the same writer a step reaches, addressed by stop instead of direction.
23
+ signal stopPicked(int stop)
24
+
25
+ readonly property string kind: root.row.kind || "fact"
26
+ readonly property bool isGroup: root.kind === "group"
27
+ readonly property bool firstGroup: root.isGroup && root.firstRow
28
+ readonly property bool isHint: root.kind === "hint"
29
+ readonly property bool isFooter: root.isHint && root.row.footer === true
30
+ readonly property bool isFavourite: root.kind === "favourite"
31
+ readonly property Item favouriteItem: favourite
32
+ readonly property bool isHero: root.kind === "hero"
33
+ readonly property bool isKeyPreview: root.kind === "keyPreview"
34
+ readonly property bool isLock: root.kind === "lock"
35
+ readonly property bool isRuler: root.kind === "ruler"
36
+ readonly property bool hasBox: root.kind === "check"
37
+ // SettingsMenus rule 3 and SettingsRest rule 3: a heading carrying its group's master or its one action is operated like any other control.
38
+ readonly property bool isGroupControl: root.isGroup && (root.row.master === true || (root.row.action || "") !== "")
39
+ // Length and not Array.isArray: a Repeater hands the delegate a QVariantList wrapper, on which
40
+ // isArray reads false while typeof is "object" and length is right, so the segment never drew.
41
+ // Which control a choice gets, SettingsGrammar rule 1: a segment when every option fits on the row beside the label, the chevron walk when they do not, and nothing else decides it. A Row reports its own implicitWidth whether or not it is itself visible, so measuring the segment and hiding it on the answer is no loop.
42
+ readonly property real segmentChrome: 2 * Theme.spacing.rowPaddingX + Theme.markSize + 3 * Theme.spacing.gap
43
+ readonly property bool hasSegment: root.kind === "choice" && root.row.labels !== undefined && root.row.labels.length > 1
44
+ && segment.implicitWidth + rowLabel.implicitWidth + root.segmentChrome <= root.width
45
+ readonly property bool hasSteps: root.kind === "choice" && !root.hasSegment
46
+ // The hover lift ui/MenuRow.qml uses, so a settings row and a menu row read alike.
47
+ readonly property real hoverOpacity: Theme.washHover
48
+ // SettingsGrammar rule 7: a dependent greys in place while its parent is off, and an inert check the same way; the grey takes the row's handlers with it, because a control that cannot act must not answer a tap.
49
+ readonly property bool greyed: root.row.available === false || root.hasBox && root.row.inert === true
50
+ readonly property string boxValue: root.row.on === true ? "on" : "off"
51
+ // SettingsMenus rule 5: the one row that can destroy a file carries the urgent role the model already gives it.
52
+ readonly property bool isUrgent: root.row.role === "error" && !root.isHint
53
+
54
+ enabled: !root.greyed
55
+ opacity: root.greyed ? Theme.disabledOpacity : 1
56
+ height: root.isGroup ? groupHead.implicitHeight
57
+ : root.isFavourite ? favourite.implicitHeight : root.isHero ? hero.implicitHeight + 4 * Theme.spacing.rowPaddingY
58
+ : root.isKeyPreview ? keyPreview.implicitHeight + 2 * Theme.spacing.rowPaddingY
59
+ : root.isRuler ? ruler.implicitHeight + 2 * Theme.spacing.rowPaddingY
60
+ : root.isHint ? hint.y + hint.implicitHeight + (root.isFooter
61
+ ? Theme.settings.railPaddingY + 2 * Theme.spacing.hairline : SettingsMetrics.hintBottom - SettingsMetrics.hintLead) : Theme.rowHeight
62
+
63
+ Grid {
64
+ id: keyPreview
65
+ visible: root.isKeyPreview
66
+ x: Theme.spacing.rowPaddingX
67
+ y: Theme.spacing.rowPaddingY
68
+ width: parent.width - 2 * Theme.spacing.rowPaddingX
69
+ columns: 2
70
+ spacing: Theme.spacing.gap
71
+ Repeater {
72
+ model: root.isKeyPreview ? root.row.items : []
73
+ delegate: Item {
74
+ id: binding
75
+ required property var modelData
76
+ width: (keyPreview.width - keyPreview.spacing) / 2
77
+ height: Theme.hitMin
78
+ Rectangle {
79
+ id: cap
80
+ width: Math.min(capText.implicitWidth + Theme.spacing.gap, parent.width)
81
+ height: parent.height
82
+ color: "transparent"
83
+ border.width: Theme.spacing.hairline
84
+ border.color: Theme.color.mutedFrame
85
+ Text {
86
+ id: capText
87
+ anchors.fill: parent
88
+ anchors.margins: Theme.spacing.hairline
89
+ horizontalAlignment: Text.AlignHCenter
90
+ verticalAlignment: Text.AlignVCenter
91
+ text: binding.modelData.keys
92
+ font.family: Theme.font.family
93
+ font.pixelSize: Theme.font.caption
94
+ color: Theme.color.foreground
95
+ textFormat: Text.PlainText
96
+ elide: Text.ElideRight
97
+ }
98
+ }
99
+ Flea.Glyph {
100
+ id: bindingMark
101
+ x: cap.width + Theme.spacing.gap
102
+ anchors.verticalCenter: parent.verticalCenter
103
+ visible: !!binding.modelData.glyph
104
+ width: visible ? Theme.chromeMarkSize : 0
105
+ height: width
106
+ name: binding.modelData.glyph || "file"
107
+ color: Theme.color.mutedFrame
108
+ }
109
+ Text {
110
+ x: bindingMark.x + bindingMark.width + (bindingMark.visible ? Theme.spacing.gap : 0)
111
+ width: Math.max(0, parent.width - x)
112
+ height: parent.height
113
+ verticalAlignment: Text.AlignVCenter
114
+ text: binding.modelData.label
115
+ font.family: Theme.font.family
116
+ font.pixelSize: Theme.font.caption
117
+ color: Theme.color.foreground
118
+ textFormat: Text.PlainText
119
+ elide: Text.ElideRight
120
+ }
121
+ }
122
+ }
123
+ }
124
+
125
+ Flea.SettingsFavourite {
126
+ id: favourite
127
+ anchors.fill: parent
128
+ visible: root.isFavourite
129
+ row: root.row
130
+ onActivated: root.activated()
131
+ onMoved: function (to) { root.favouriteMoved(to) }
132
+ onRemoved: root.favouriteRemoved()
133
+ }
134
+
135
+ Column {
136
+ id: hero
137
+ visible: root.isHero
138
+ anchors.centerIn: parent
139
+ spacing: Theme.spacing.gap
140
+ Flea.FleaMark {
141
+ anchors.horizontalCenter: parent.horizontalCenter
142
+ width: Theme.markSize * 2
143
+ height: width
144
+ color: Theme.color.accent
145
+ }
146
+ Text {
147
+ anchors.horizontalCenter: parent.horizontalCenter
148
+ text: root.row.label || ""
149
+ font.family: Theme.font.family
150
+ font.pixelSize: Theme.font.body
151
+ font.bold: true
152
+ color: Theme.color.foreground
153
+ textFormat: Text.PlainText
154
+ }
155
+ Text {
156
+ anchors.horizontalCenter: parent.horizontalCenter
157
+ text: root.row.value || ""
158
+ font.family: Theme.font.family
159
+ font.pixelSize: Theme.font.caption
160
+ color: Theme.color.foreground
161
+ textFormat: Text.PlainText
162
+ }
163
+ }
164
+
165
+ Rectangle {
166
+ anchors.fill: parent
167
+ visible: root.current
168
+ color: Theme.color.foreground
169
+ opacity: root.hoverOpacity
170
+ }
171
+
172
+ Rectangle {
173
+ anchors.top: parent.top
174
+ anchors.topMargin: root.isFooter ? Theme.settings.railPaddingY : groupHead.gap
175
+ width: parent.width
176
+ height: Theme.spacing.hairline
177
+ visible: root.isFooter || root.isGroup && !root.firstGroup
178
+ color: Theme.color.mutedFrame
179
+ opacity: 0.4
180
+ }
181
+
182
+ // A heading and a hint are the only two rows that are not a label and a control on one line, so
183
+ // they draw instead of the pair below rather than beside it.
184
+ Flea.SettingsGroup {
185
+ id: groupHead
186
+ visible: root.isGroup
187
+ width: parent.width
188
+ row: root.row
189
+ first: root.firstGroup
190
+ }
191
+
192
+ Flea.SettingsHint {
193
+ id: hint
194
+ visible: root.isHint
195
+ footer: root.isFooter
196
+ x: root.isFooter ? Theme.spacing.rowPaddingX : markSlot.x + markSlot.width + Theme.spacing.gap
197
+ y: root.isFooter ? 2 * Theme.settings.railPaddingY + Theme.spacing.hairline : SettingsMetrics.hintTop + SettingsMetrics.hintLead
198
+ width: parent.width - x - Theme.spacing.rowPaddingX
199
+ text: root.row.label || ""
200
+ color: root.row.role === "error" ? Theme.color.error
201
+ : root.row.role === "accent" ? Theme.color.accent
202
+ : root.row.role === "foreground" ? Theme.color.foreground : Theme.color.muted
203
+ wrapMode: root.row.elide === "right" ? Text.NoWrap : Text.WordWrap
204
+ elide: root.row.elide === "right" ? Text.ElideRight : Text.ElideNone
205
+ }
206
+
207
+ // Every board row carries a mark in one column, so a section reads as a column and not a ragged
208
+ // list; a row the boards give no mark keeps the slot open rather than closing it up. ui/MenuRow.qml
209
+ // is the pattern, brand marks included, and the slot sets the label's indent the same way.
210
+ Item {
211
+ id: markSlot
212
+ visible: !root.isGroup && !root.isHint && !root.isHero && !root.isFavourite && !root.isKeyPreview
213
+ anchors.left: parent.left
214
+ anchors.leftMargin: Theme.spacing.rowPaddingX
215
+ anchors.verticalCenter: parent.verticalCenter
216
+ width: Theme.markSize
217
+ height: Theme.markSize
218
+
219
+ Flea.Glyph {
220
+ anchors.fill: parent
221
+ visible: root.row.glyph !== undefined && root.row.mark === undefined
222
+ name: root.row.glyph !== undefined ? root.row.glyph : "file"
223
+ color: root.isUrgent ? Theme.color.error : Theme.color.mutedFrame
224
+ }
225
+
226
+ Flea.TailscaleMark {
227
+ anchors.centerIn: parent
228
+ visible: root.row.mark === "tailscale"
229
+ iconSize: Theme.markSize
230
+ color: Theme.color.mutedFrame
231
+ }
232
+
233
+ Flea.DropboxMark {
234
+ anchors.centerIn: parent
235
+ visible: root.row.mark === "dropbox"
236
+ iconSize: Theme.markSize
237
+ color: Theme.color.mutedFrame
238
+ }
239
+
240
+ Flea.LocalSendMark {
241
+ anchors.centerIn: parent
242
+ visible: root.row.mark === "localsend"
243
+ iconSize: Theme.markSize
244
+ color: Theme.color.mutedFrame
245
+ }
246
+
247
+ Flea.HyprlandMark {
248
+ anchors.centerIn: parent
249
+ visible: root.row.mark === "hyprland"
250
+ iconSize: Theme.markSize
251
+ color: Theme.color.mutedFrame
252
+ }
253
+
254
+ // The shelf is Flea's own destination, so its switch carries Flea's own mark, the way ui/MenuRow.qml draws the row it governs.
255
+ Flea.FleaMark {
256
+ anchors.centerIn: parent
257
+ visible: root.row.mark === "flea"
258
+ width: Theme.markSize
259
+ height: Theme.markSize
260
+ color: Theme.color.mutedFrame
261
+ }
262
+ }
263
+
264
+ // A ruler is the row above it continued, so it starts at that row's label column, as a hint
265
+ // does: HANDOFF rules 3 and 8, nothing is indented and a hint sits under its control's label.
266
+ Flea.SettingsRuler {
267
+ id: ruler
268
+ visible: root.isRuler
269
+ anchors.left: markSlot.right
270
+ anchors.leftMargin: Theme.spacing.gap
271
+ anchors.right: parent.right
272
+ anchors.rightMargin: Theme.spacing.rowPaddingX
273
+ anchors.verticalCenter: parent.verticalCenter
274
+ height: ruler.implicitHeight
275
+ stops: root.row.stops !== undefined ? root.row.stops : []
276
+ index: root.row.index !== undefined ? root.row.index : -1
277
+ active: root.row.on === true
278
+ onPicked: function (stop) { root.stopPicked(stop) }
279
+ }
280
+
281
+ Text {
282
+ id: rowLabel
283
+ visible: !root.isGroup && !root.isHint && !root.isHero && !root.isFavourite && !root.isRuler && !root.isKeyPreview
284
+ anchors.left: markSlot.right
285
+ anchors.leftMargin: Theme.spacing.gap
286
+ anchors.right: trailing.left
287
+ anchors.rightMargin: Theme.spacing.gap
288
+ anchors.verticalCenter: parent.verticalCenter
289
+ text: root.row.label || ""
290
+ color: root.isUrgent ? Theme.color.error
291
+ : root.isLock || root.kind === "fact" ? Theme.color.muted : Theme.color.foreground
292
+ font.family: Theme.font.family
293
+ font.pixelSize: Theme.font.body
294
+ textFormat: Text.PlainText
295
+ elide: Text.ElideRight
296
+ }
297
+
298
+ // Row lays its children out itself, so none of them anchors vertically: each takes the mark
299
+ // height and centres its own content inside that, which keeps one baseline across four kinds.
300
+ Row {
301
+ id: trailing
302
+ anchors.right: parent.right
303
+ anchors.rightMargin: Theme.spacing.rowPaddingX
304
+ anchors.verticalCenter: parent.verticalCenter
305
+ spacing: Theme.spacing.gap
306
+
307
+ // A choice's name, a fact's value and the caption a check row carries are all one thing: the value the row currently holds, drawn on the right the way the boards draw it. SettingsRest rule 6 mutes a fact whole, and the one fact reporting a live number keeps the foreground for it; rule 5 takes the head off a value whose identity is in its tail.
308
+ Text {
309
+ visible: root.kind === "fact" || root.kind === "action" || root.hasSteps
310
+ || (root.hasBox && (root.row.value || "") !== "")
311
+ height: Theme.markSize
312
+ verticalAlignment: Text.AlignVCenter
313
+ text: root.row.value || ""
314
+ color: root.row.role === "accent" ? Theme.color.accent
315
+ : root.hasSteps || root.row.role === "live" ? Theme.color.foreground : Theme.color.muted
316
+ font.family: Theme.font.family
317
+ font.pixelSize: Theme.font.body
318
+ textFormat: Text.PlainText
319
+ width: Math.min(implicitWidth, root.width * 0.56)
320
+ elide: root.row.elide === "head" ? Text.ElideLeft : Text.ElideRight
321
+ }
322
+
323
+ // SettingsRest draws the sentence after the value it explains, so the row reads label, value, sentence; half the row at most, or the label would elide to make space for prose.
324
+ Text {
325
+ id: caption
326
+ visible: !!root.row.caption && width > 0
327
+ height: Theme.markSize
328
+ // The boards centre each line box on the row, so the baseline sits a fixed shift from the label's, on a whole pixel; a Row sets x only, so y is ours.
329
+ y: Math.round(rowLabel.y + rowLabel.baselineOffset) + SettingsMetrics.captionShift - Math.round(caption.baselineOffset) - trailing.y
330
+ text: root.row.caption || ""
331
+ color: Theme.color.muted
332
+ font.family: Theme.font.family
333
+ font.pixelSize: Theme.font.caption
334
+ textFormat: Text.PlainText
335
+ width: Math.min(implicitWidth, Math.round(root.width * 0.5))
336
+ elide: Text.ElideRight
337
+ }
338
+
339
+ Flea.SettingsSegment {
340
+ id: segment
341
+ visible: root.hasSegment
342
+ options: root.row.labels !== undefined ? root.row.labels : []
343
+ value: root.row.value || ""
344
+ glyphs: root.row.id === "view" ? root.row.values : []
345
+ onPicked: function (i) { root.stopPicked(i) }
346
+ }
347
+
348
+ Flea.Glyph {
349
+ visible: root.hasSteps || root.kind === "action" && root.row.inert !== true
350
+ width: visible ? Theme.markSize : 0
351
+ height: Theme.markSize
352
+ name: "chevron-right"
353
+ color: Theme.color.mutedFrame
354
+
355
+ TapHandler {
356
+ enabled: root.hasSteps
357
+ gesturePolicy: TapHandler.ReleaseWithinBounds
358
+ onTapped: root.stepped(1)
359
+ }
360
+ }
361
+
362
+ // A locked row draws the lock mark where the box would be, so the section stays a complete
363
+ // list of what the menu can contain rather than hiding the two rows nobody can switch off.
364
+ Flea.Glyph {
365
+ visible: root.isLock
366
+ width: root.isLock ? Theme.markSize : 0
367
+ height: Theme.markSize
368
+ name: "lock"
369
+ color: Theme.color.mutedFrame
370
+ }
371
+
372
+ Flea.CheckBox {
373
+ visible: root.hasBox
374
+ width: root.hasBox ? implicitWidth : 0
375
+ value: root.boxValue
376
+ }
377
+ }
378
+
379
+ HoverHandler {
380
+ id: pointer
381
+ enabled: root.hasBox || root.isGroupControl || root.kind === "choice" || root.kind === "action" || root.isFavourite
382
+ property bool armed: false
383
+ property point restingAt
384
+ onHoveredChanged: pointer.armed = false
385
+ onPointChanged: {
386
+ if (!pointer.hovered) return
387
+ if (!pointer.armed) {
388
+ pointer.armed = true
389
+ pointer.restingAt = pointer.point.scenePosition
390
+ return
391
+ }
392
+ // Scrolling moves the row beneath a resting pointer; only scene-space motion selects it.
393
+ if (pointer.point.scenePosition.x !== pointer.restingAt.x || pointer.point.scenePosition.y !== pointer.restingAt.y)
394
+ root.pointerMoved()
395
+ pointer.restingAt = pointer.point.scenePosition
396
+ }
397
+ cursorShape: Qt.PointingHandCursor
398
+ }
399
+
400
+ // A segment and a ruler each own their own targets, so the row behind them must not also fire:
401
+ // a tap on the option already showing would otherwise toggle the very setting it names.
402
+ TapHandler {
403
+ enabled: (root.hasBox || root.isGroupControl || root.kind === "action") && !root.isLock && !root.hasSteps
404
+ && !root.hasSegment && !root.isRuler
405
+ acceptedButtons: Qt.LeftButton
406
+ gesturePolicy: TapHandler.ReleaseWithinBounds
407
+ onTapped: root.activated()
408
+ }
409
+ }
@@ -0,0 +1,85 @@
1
+ import QtQuick
2
+
3
+ // The Display board's seven-stop ruler: one tick per size Omarchy offers, each carrying its own
4
+ // number, with the stop in force marked by a taller tick under a foreground number rather than by a
5
+ // fill nobody could read (SettingsRest rule 2). The marked tick takes the accent once an override
6
+ // makes the ruler the control, which is the Blueprint's own rule for an active control against a
7
+ // quiet one, and stays muted while Omarchy owns the size and the ruler is only reporting it.
8
+ Item {
9
+ id: root
10
+
11
+ property var stops: []
12
+ // The last filled tick. Omarchy can be on a size that is not a stop, so the caller fills to the
13
+ // nearest one rather than leaving the ruler blank.
14
+ property int index: -1
15
+ property bool active: false
16
+
17
+ signal picked(int stop)
18
+
19
+ readonly property int tickGap: Theme.spacing.hairline * 2
20
+ readonly property int tickHeight: Theme.spacing.hairline * 3
21
+ // The board's own 7 against 11: the stop in force stands taller, so the mark is never a colour alone.
22
+ readonly property int markedHeight: Theme.spacing.hairline * 5
23
+ // And the board's own 2 against 3 across; the tap target is the slot behind the ink, so a mark this narrow still answers a click anywhere on its stop.
24
+ readonly property int tickInk: Theme.spacing.hairline * 2
25
+ readonly property int markedInk: Theme.spacing.hairline * 3
26
+ // The hairline treatment the panel already uses for a quiet edge, so an unmarked stop reads as one.
27
+ readonly property real restOpacity: 0.4
28
+ readonly property real tickWidth: root.stops.length > 0
29
+ ? (root.width - root.tickGap * (root.stops.length - 1)) / root.stops.length : 0
30
+ readonly property real numberHeight: Theme.font.caption * 1.5
31
+ // WCAG 2.5.8's floor under the tap target, whatever height the numbers and ticks come to.
32
+ readonly property int hitHeight: Math.max(Theme.hitMin, Math.round(root.numberHeight + root.markedHeight))
33
+
34
+ implicitHeight: root.hitHeight
35
+
36
+ Repeater {
37
+ model: root.stops
38
+
39
+ delegate: Item {
40
+ id: tick
41
+ required property var modelData
42
+ required property int index
43
+ readonly property bool marked: tick.index === root.index
44
+
45
+ // The hit box is taller than the drawn tick and centred on the ruler, so it moves nothing.
46
+ x: tick.index * (root.tickWidth + root.tickGap)
47
+ y: Math.round((root.height - tick.height) / 2)
48
+ width: root.tickWidth
49
+ height: root.hitHeight
50
+
51
+ Text {
52
+ id: number
53
+ anchors.horizontalCenter: parent.horizontalCenter
54
+ y: Math.round((root.numberHeight - implicitHeight) / 2)
55
+ text: tick.modelData
56
+ color: tick.marked ? Theme.color.foreground : Theme.color.muted
57
+ opacity: tick.marked ? 1 : root.restOpacity
58
+ font.family: Theme.font.family
59
+ font.pixelSize: Theme.font.caption
60
+ textFormat: Text.PlainText
61
+ }
62
+
63
+ Rectangle {
64
+ anchors.horizontalCenter: parent.horizontalCenter
65
+ y: Math.round(root.numberHeight)
66
+ width: tick.marked ? root.markedInk : root.tickInk
67
+ height: tick.marked ? root.markedHeight : root.tickHeight
68
+ color: root.active && tick.marked ? Theme.color.accent : Theme.color.mutedFrame
69
+ opacity: tick.marked ? 1 : root.restOpacity
70
+ }
71
+
72
+ HoverHandler {
73
+ enabled: root.active
74
+ cursorShape: Qt.PointingHandCursor
75
+ }
76
+
77
+ TapHandler {
78
+ enabled: root.active
79
+ acceptedButtons: Qt.LeftButton
80
+ gesturePolicy: TapHandler.ReleaseWithinBounds
81
+ onTapped: root.picked(tick.modelData)
82
+ }
83
+ }
84
+ }
85
+ }
@@ -0,0 +1,85 @@
1
+ import QtQuick
2
+ import "." as Flea
3
+ import "js/Buttons.js" as Buttons
4
+
5
+ // The Display board's two-value control: both names side by side, the current one bright, rather than
6
+ // the chevron walk a longer list needs. ui/SettingsRow.qml draws it for any row whose model names its
7
+ // options, and the row above owns the writer, so nothing here holds state.
8
+ Row {
9
+ id: root
10
+
11
+ property var options: []
12
+ property string value: ""
13
+ property var glyphs: []
14
+ // A host that puts the row in its Tab order (a dialog's Format) sets this; Settings never focuses it.
15
+ property bool tabStop: false
16
+ // The hit minimum in Settings; a chrome strip hosts the same cells at its control height.
17
+ property int cellHeight: Theme.hitMin
18
+
19
+ // The option a pointer chose, which is never the one already showing.
20
+ signal picked(int index)
21
+
22
+ spacing: Theme.spacing.hairline * Buttons.SEGMENT_GAP
23
+
24
+ Repeater {
25
+ model: root.options
26
+
27
+ delegate: Rectangle {
28
+ id: segment
29
+ required property var modelData
30
+ required property int index
31
+
32
+ readonly property bool current: segment.modelData === root.value
33
+ readonly property string glyph: root.glyphs[segment.index] || ""
34
+ // A segment that takes the keyboard (a dialog's Tab stop) marks its current cell as DialogButton marks a focused set member.
35
+ readonly property bool focusedHere: root.tabStop && segment.current && root.activeFocus && segment.glyph.length === 0
36
+ // Accent where it has hue, else RING wide in the foreground, both inside the cell like DialogButton's set member.
37
+ readonly property string focusFrame: Buttons.focusFrame(Theme.color.accentHasHue, true, false)
38
+
39
+ // The WCAG floor the Blueprint sets for a compact control, which this row has room for.
40
+ width: segment.glyph ? Math.max(Theme.hitMin, Theme.railIconSize + 2 * (Theme.spacing.gap - Theme.spacing.hairline))
41
+ : name.implicitWidth + 2 * Theme.spacing.gap
42
+ height: root.cellHeight
43
+ // Containers rule 4: a segmented cell is never filled, so the choice reads as brightness.
44
+ color: "transparent"
45
+ // Rule 3: words in a set are Tier B and every member wears the box; glyphs in a strip are
46
+ // Tier A, where a box around four marks would be furniture.
47
+ border.width: segment.glyph ? 0 : segment.focusedHere && segment.focusFrame === "thick" ? Buttons.RING : Theme.spacing.hairline
48
+ border.color: segment.focusedHere && segment.focusFrame === "accent" ? Theme.color.accent
49
+ : segment.current ? Theme.color.foreground : Theme.color.mutedFrame
50
+ Accessible.role: Accessible.Button
51
+ Accessible.name: String(segment.modelData)
52
+ Accessible.onPressAction: root.picked(segment.index)
53
+
54
+ Flea.Glyph {
55
+ anchors.centerIn: parent
56
+ visible: segment.glyph.length > 0
57
+ width: Theme.railIconSize
58
+ height: width
59
+ name: segment.glyph || "file"
60
+ color: segment.current ? Theme.color.foreground : Theme.color.mutedFrame
61
+ }
62
+
63
+ Text {
64
+ id: name
65
+ visible: segment.glyph.length === 0
66
+ anchors.centerIn: parent
67
+ text: segment.modelData
68
+ color: segment.current ? Theme.color.foreground : Theme.color.muted
69
+ font.family: Theme.font.family
70
+ font.pixelSize: Theme.font.caption
71
+ textFormat: Text.PlainText
72
+ }
73
+
74
+ HoverHandler {
75
+ cursorShape: Qt.PointingHandCursor
76
+ }
77
+
78
+ TapHandler {
79
+ acceptedButtons: Qt.LeftButton
80
+ gesturePolicy: TapHandler.ReleaseWithinBounds
81
+ onTapped: if (!segment.current) root.picked(segment.index)
82
+ }
83
+ }
84
+ }
85
+ }