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,54 @@
1
+ import QtQuick
2
+ import QtQuick.Shapes
3
+ import qs.Commons
4
+ import "../Commons/BorderGeometry.js" as Geometry
5
+
6
+ // Visual-only border renderer. It draws closed side-run contours, or a
7
+ // compound winding path for all four sides, so asymmetric/gradient borders
8
+ // do not require touching odd-even paths. Flat uniform borders use Rectangle.border.
9
+ Item {
10
+ id: root
11
+
12
+ property var borderSpec: Border.none()
13
+ property real radius: 0
14
+
15
+ readonly property var _widths: borderSpec && borderSpec.widths ? borderSpec.widths : Geometry.parseWidthSpec(0, 0)
16
+ readonly property bool hasBorder: Geometry.maxWidth(_widths) > 0
17
+ readonly property var _gradient: borderSpec && borderSpec.gradient ? borderSpec.gradient : ({ colors: [], angle: 0, enabled: false })
18
+ readonly property var _colors: _gradient.enabled ? _gradient.colors : [Border.color(borderSpec), Border.color(borderSpec)]
19
+ readonly property var _endpoints: Geometry.gradientEndpoints(width, height, _gradient.angle || 0)
20
+ readonly property string _path: Geometry.ringPath(width, height, radius, _widths)
21
+
22
+ visible: hasBorder && width > 0 && height > 0
23
+ anchors.fill: parent
24
+ z: 100000
25
+
26
+ Shape {
27
+ anchors.fill: parent
28
+ preferredRendererType: Shape.CurveRenderer
29
+
30
+ ShapePath {
31
+ fillRule: ShapePath.WindingFill
32
+ strokeWidth: 0
33
+ fillGradient: LinearGradient {
34
+ x1: root._endpoints.x1
35
+ y1: root._endpoints.y1
36
+ x2: root._endpoints.x2
37
+ y2: root._endpoints.y2
38
+
39
+ GradientStop { position: Geometry.stopPosition(root._colors, 0); color: Geometry.stopColor(root._colors, 0) }
40
+ GradientStop { position: Geometry.stopPosition(root._colors, 1); color: Geometry.stopColor(root._colors, 1) }
41
+ GradientStop { position: Geometry.stopPosition(root._colors, 2); color: Geometry.stopColor(root._colors, 2) }
42
+ GradientStop { position: Geometry.stopPosition(root._colors, 3); color: Geometry.stopColor(root._colors, 3) }
43
+ GradientStop { position: Geometry.stopPosition(root._colors, 4); color: Geometry.stopColor(root._colors, 4) }
44
+ GradientStop { position: Geometry.stopPosition(root._colors, 5); color: Geometry.stopColor(root._colors, 5) }
45
+ GradientStop { position: Geometry.stopPosition(root._colors, 6); color: Geometry.stopColor(root._colors, 6) }
46
+ GradientStop { position: Geometry.stopPosition(root._colors, 7); color: Geometry.stopColor(root._colors, 7) }
47
+ GradientStop { position: Geometry.stopPosition(root._colors, 8); color: Geometry.stopColor(root._colors, 8) }
48
+ GradientStop { position: Geometry.stopPosition(root._colors, 9); color: Geometry.stopColor(root._colors, 9) }
49
+ }
50
+
51
+ PathSvg { path: root._path }
52
+ }
53
+ }
54
+ }
@@ -0,0 +1,40 @@
1
+ import QtQuick
2
+ import qs.Commons
3
+
4
+ // Rectangle-compatible surface with Omarchy border specs. Uses native
5
+ // Rectangle.border for cheap flat/uniform borders and BorderOverlay for
6
+ // gradients or per-side widths.
7
+ Rectangle {
8
+ id: root
9
+
10
+ property var borderSpec: Border.none()
11
+ property real padding: 0
12
+ property real topPadding: padding
13
+ property real rightPadding: padding
14
+ property real bottomPadding: padding
15
+ property real leftPadding: padding
16
+
17
+ readonly property real borderTop: Border.top(borderSpec)
18
+ readonly property real borderRight: Border.right(borderSpec)
19
+ readonly property real borderBottom: Border.bottom(borderSpec)
20
+ readonly property real borderLeft: Border.left(borderSpec)
21
+ readonly property real contentTopInset: borderTop + topPadding
22
+ readonly property real contentRightInset: borderRight + rightPadding
23
+ readonly property real contentBottomInset: borderBottom + bottomPadding
24
+ readonly property real contentLeftInset: borderLeft + leftPadding
25
+ readonly property bool usesOverlayBorder: Border.needsOverlay(borderSpec)
26
+
27
+ border.color: Border.canUseNative(borderSpec) ? Border.color(borderSpec) : "transparent"
28
+ border.width: Border.canUseNative(borderSpec) ? Border.uniformWidth(borderSpec) : 0
29
+
30
+ Loader {
31
+ anchors.fill: parent
32
+ active: root.usesOverlayBorder
33
+
34
+ sourceComponent: BorderOverlay {
35
+ anchors.fill: parent
36
+ radius: root.radius
37
+ borderSpec: root.borderSpec
38
+ }
39
+ }
40
+ }
@@ -0,0 +1,224 @@
1
+ import QtQuick
2
+ import QtQuick.Controls
3
+ import qs.Commons
4
+ import qs.Commons as Commons
5
+
6
+ // The button. One component for every clickable thing in the kit.
7
+ // States compose independently and are applied in priority order:
8
+ //
9
+ // pressed (mouse down) pressed fill
10
+ // activeFocus (Tab focus) focus fill + focus border token
11
+ // hasCursor || hover hover-cursor fill (+ border if `bordered`)
12
+ // selected selected fill + optional selected border
13
+ // active selected fill
14
+ // idle transparent or normal border if `bordered`
15
+ //
16
+ // All fills/borders come from `qs.Commons.Style` tokens, so themes
17
+ // control the look via [controls] in shell.toml.
18
+ //
19
+ // Emits `hovered(bool)` so panels with their own keyboard cursor model
20
+ // can update state on mouse enter/leave.
21
+ BorderSurface {
22
+ id: root
23
+
24
+ property string text: ""
25
+ property string iconText: ""
26
+ property string tooltipText: ""
27
+
28
+ // State flags (see comment above for paint priority).
29
+ property bool selected: false
30
+ property bool active: false
31
+ property bool hasCursor: false
32
+ property bool focusable: false
33
+ property bool bordered: false
34
+
35
+ // Colors. Defaults track the theme; per-instance overrides are honored.
36
+ property color foreground: Commons.Color.foreground
37
+ property color background: "transparent"
38
+ property color accent: Commons.Color.accent
39
+
40
+ // Sizing.
41
+ property string fontFamily: Style.font.family
42
+ property real fontSize: Style.font.body
43
+ property real iconSize: Style.font.icon
44
+ property real iconRotation: 0
45
+ property bool iconSpinning: false
46
+ property real horizontalPadding: Style.spacing.controlPaddingX
47
+ property real verticalPadding: Style.spacing.controlPaddingY
48
+ property bool leftAlign: false
49
+
50
+ leftPadding: horizontalPadding
51
+ rightPadding: horizontalPadding
52
+ topPadding: verticalPadding
53
+ bottomPadding: verticalPadding
54
+
55
+ // Tooltip palette. Auto-rendered if tooltipText is set. Defaults pull
56
+ // from [tooltip] in shell.toml; override per-instance only when a button
57
+ // intentionally wants a tooltip that diverges from the theme.
58
+ property color tooltipBackground: Commons.Color.tooltip.background
59
+ property color tooltipForeground: Commons.Color.tooltip.text
60
+ property color tooltipBorder: Commons.Color.tooltip.border
61
+
62
+ signal clicked()
63
+ signal rightClicked()
64
+ signal hovered(bool isHovered)
65
+
66
+ activeFocusOnTab: focusable
67
+ Keys.onReturnPressed: if (focusable) root.clicked()
68
+ Keys.onEnterPressed: if (focusable) root.clicked()
69
+ Keys.onSpacePressed: if (focusable) root.clicked()
70
+
71
+ // Reserve the largest border any visual state can paint. Otherwise a
72
+ // borderless idle button grows by a pixel per side on hover/focus and
73
+ // relayouts neighboring controls.
74
+ // Measured from the label's natural width rather than the row, which
75
+ // narrows the label when the button is held narrower than that.
76
+ implicitWidth: _contentNaturalWidth + horizontalPadding * 2 + _reservedBorderLeft + _reservedBorderRight
77
+ implicitHeight: row.implicitHeight + verticalPadding * 2 + _reservedBorderTop + _reservedBorderBottom
78
+ radius: Style.cornerRadius
79
+
80
+ readonly property bool hot: mouseArea.containsMouse || hasCursor
81
+ readonly property bool _showFocusRing: focusable && activeFocus
82
+ readonly property color _selectedColor: Style.selectedStateColor(root.foreground, root.accent)
83
+ readonly property var _tooltipBorderSpec: Border.localOrSurfaceSpec("tooltip", "border", root.tooltipBorder, Commons.Color.tooltip.border, Math.max(1, Style.normalBorderWidth))
84
+ readonly property var _focusBorderSpec: Border.controlSpec("focus", root.foreground, root.accent)
85
+ readonly property var _hoverBorderSpec: Border.controlSpec("hover-cursor", root.foreground, root.accent)
86
+ readonly property var _selectedBorderSpec: Border.controlSpec("selected", root.foreground, root.accent)
87
+ readonly property var _normalBorderSpec: Border.controlSpec("normal", root.foreground, root.accent)
88
+ readonly property real _reservedBorderTop: Math.max(
89
+ focusable ? Border.top(_focusBorderSpec) : 0,
90
+ Border.top(_hoverBorderSpec),
91
+ Border.top(_selectedBorderSpec),
92
+ bordered ? Border.top(_normalBorderSpec) : 0)
93
+ readonly property real _reservedBorderRight: Math.max(
94
+ focusable ? Border.right(_focusBorderSpec) : 0,
95
+ Border.right(_hoverBorderSpec),
96
+ Border.right(_selectedBorderSpec),
97
+ bordered ? Border.right(_normalBorderSpec) : 0)
98
+ readonly property real _reservedBorderBottom: Math.max(
99
+ focusable ? Border.bottom(_focusBorderSpec) : 0,
100
+ Border.bottom(_hoverBorderSpec),
101
+ Border.bottom(_selectedBorderSpec),
102
+ bordered ? Border.bottom(_normalBorderSpec) : 0)
103
+ readonly property real _reservedBorderLeft: Math.max(
104
+ focusable ? Border.left(_focusBorderSpec) : 0,
105
+ Border.left(_hoverBorderSpec),
106
+ Border.left(_selectedBorderSpec),
107
+ bordered ? Border.left(_normalBorderSpec) : 0)
108
+ readonly property real _reservedContentLeftInset: _reservedBorderLeft + leftPadding
109
+ readonly property real _iconRoom: iconGlyph.visible ? iconGlyph.implicitWidth + (label.visible ? row.spacing : 0) : 0
110
+ readonly property real _contentNaturalWidth: _iconRoom + (label.visible ? label.implicitWidth : 0)
111
+ // A translated label can outgrow a button laid out at a fixed width (a
112
+ // grid of equal pills): it first spends half the padding, then shrinks to
113
+ // fit, and elides only when even the smallest size does not.
114
+ readonly property real _labelRoom: width - horizontalPadding - _reservedBorderLeft - _reservedBorderRight - _iconRoom
115
+ readonly property var _borderSpec: _showFocusRing ? _focusBorderSpec
116
+ : hot ? _hoverBorderSpec
117
+ : selected ? (Border.controlHasWidth("selected") ? _selectedBorderSpec : (bordered ? _normalBorderSpec : Border.none()))
118
+ : bordered ? _normalBorderSpec
119
+ : Border.none()
120
+
121
+ color: mouseArea.pressed ? Style.pressedFillFor(root.foreground, root.accent)
122
+ : _showFocusRing ? Style.focusFillFor(root.foreground, root.accent)
123
+ : hot ? Style.hoverFillFor(root.foreground, root.accent)
124
+ : selected ? Style.selectedFillFor(root.foreground, root.accent)
125
+ : active ? Style.selectedFillFor(root.foreground, root.accent)
126
+ : background
127
+
128
+ // Border follows the same state precedence as fill. Buttons stay
129
+ // borderless at rest unless `bordered` is set, but hover-cursor/focus
130
+ // always use the shared cursor border so the keyboard target is visible
131
+ // and consistent with the rest of the kit. Selected borders are off by
132
+ // default for plain buttons; explicitly bordered buttons keep their
133
+ // normal border when selected unless selected-border-width opts in to a
134
+ // dedicated selected border.
135
+ borderSpec: _borderSpec
136
+
137
+ Behavior on color { ColorAnimation { duration: Style.duration(120) } }
138
+
139
+ ToolTip {
140
+ visible: root.tooltipText !== "" && mouseArea.containsMouse
141
+ text: root.tooltipText
142
+ delay: 400
143
+ padding: 0
144
+ background: BorderSurface {
145
+ color: root.tooltipBackground
146
+ borderSpec: root._tooltipBorderSpec
147
+ radius: 0
148
+ }
149
+ contentItem: Text {
150
+ textFormat: Text.PlainText
151
+ text: root.tooltipText
152
+ color: root.tooltipForeground
153
+ font.family: root.fontFamily
154
+ font.pixelSize: Style.font.bodySmall
155
+ leftPadding: Border.left(root._tooltipBorderSpec) + Style.spacing.controlPaddingX
156
+ rightPadding: Border.right(root._tooltipBorderSpec) + Style.spacing.controlPaddingX
157
+ topPadding: Border.top(root._tooltipBorderSpec) + Style.spacing.controlPaddingY
158
+ bottomPadding: Border.bottom(root._tooltipBorderSpec) + Style.spacing.controlPaddingY
159
+ }
160
+ }
161
+
162
+ Row {
163
+ id: row
164
+ anchors.verticalCenter: parent.verticalCenter
165
+ anchors.left: root.leftAlign ? parent.left : undefined
166
+ anchors.leftMargin: root.leftAlign ? root._reservedContentLeftInset : 0
167
+ anchors.horizontalCenter: root.leftAlign ? undefined : parent.horizontalCenter
168
+ spacing: Style.spacing.controlGap
169
+
170
+ Text {
171
+ id: iconGlyph
172
+ textFormat: Text.PlainText
173
+ visible: root.iconText !== ""
174
+ text: root.iconText
175
+ color: root.selected ? root._selectedColor : root.foreground
176
+ font.family: root.fontFamily
177
+ font.pixelSize: root.iconSize
178
+ rotation: root.iconSpinning ? 0 : root.iconRotation
179
+ transformOrigin: Item.Center
180
+ anchors.verticalCenter: parent.verticalCenter
181
+
182
+ RotationAnimation on rotation {
183
+ from: 0
184
+ to: 360
185
+ duration: 900
186
+ loops: Animation.Infinite
187
+ running: root.iconSpinning && !Style.reduceMotion
188
+ }
189
+ }
190
+
191
+ Text {
192
+ id: label
193
+ textFormat: Text.PlainText
194
+ visible: root.text !== ""
195
+ text: root.text
196
+ color: root.selected ? root._selectedColor : root.foreground
197
+ font.family: root.fontFamily
198
+ font.pixelSize: root.fontSize
199
+ font.bold: root.selected
200
+ width: Math.max(0, Math.min(implicitWidth, root._labelRoom))
201
+ fontSizeMode: Text.HorizontalFit
202
+ minimumPixelSize: Math.round(root.fontSize * 0.75)
203
+ elide: Text.ElideRight
204
+ anchors.verticalCenter: parent.verticalCenter
205
+ }
206
+ }
207
+
208
+ MouseArea {
209
+ id: mouseArea
210
+ anchors.fill: parent
211
+ hoverEnabled: true
212
+ cursorShape: Qt.PointingHandCursor
213
+ acceptedButtons: Qt.LeftButton | Qt.RightButton
214
+ onClicked: function(mouse) {
215
+ if (root.focusable) root.forceActiveFocus()
216
+ if (mouse.button === Qt.RightButton) root.rightClicked()
217
+ else root.clicked()
218
+ }
219
+ }
220
+
221
+ HoverHandler {
222
+ onHoveredChanged: root.hovered(hovered)
223
+ }
224
+ }
@@ -0,0 +1,131 @@
1
+ import QtQuick
2
+ import qs.Commons
3
+ import qs.Commons as Commons
4
+
5
+ // Mutually-exclusive row of Buttons — the form-style "pick one of N"
6
+ // pattern (bar position top/right/bottom/left, theme preset chips, etc.).
7
+ // Emits `changed(value)` when the user activates a different option.
8
+ //
9
+ // `options` is either a plain string[] (label == value) or an array of
10
+ // { value, label, icon?, tooltip? } objects. Mixing is fine.
11
+ //
12
+ // Keyboard navigation. The group itself is a single Tab stop, not one
13
+ // stop per chip — so in a form that walks `activeFocusOnTab` items with
14
+ // Tab / j / k, the cursor enters the group as a unit. Once focused,
15
+ // h / l / Left / Right walks between chips and Enter / Space activates
16
+ // the current one. The selected chip is the default landing point so
17
+ // users see their existing choice on arrival.
18
+ //
19
+ // Panel-cursor consumers (the bar widget panels) drive `cursorIndex`
20
+ // directly and listen on `hovered` to sync the mouse — Tab focus and
21
+ // `cursorIndex` are independent; either one paints the chip's hot
22
+ // state, and the bar widget panels never give Tab focus to a
23
+ // ButtonGroup so they only see the cursorIndex path.
24
+ Row {
25
+ id: root
26
+
27
+ property var options: []
28
+ property string value: ""
29
+ property color foreground: Commons.Color.foreground
30
+ property color background: Commons.Color.background
31
+ property color accent: Commons.Color.accent
32
+ property string fontFamily: Style.font.family
33
+ property real fontSize: Style.font.body
34
+ property bool focusable: true
35
+
36
+ // -1 disables the external cursor highlight (the panel-cursor case).
37
+ // Driven by a containing panel; the group's own Tab-focus h/l
38
+ // tracking is internal and lives in _focusedIndex.
39
+ property int cursorIndex: -1
40
+
41
+ // Internal: which chip h / l / Left / Right is currently sitting on
42
+ // when the group itself has Tab focus. Reset to the selected option
43
+ // each time focus arrives so the user sees their existing choice.
44
+ property int _focusedIndex: -1
45
+
46
+ signal changed(string value)
47
+ signal hovered(int index, bool isHovered)
48
+
49
+ spacing: Style.spacing.md
50
+
51
+ activeFocusOnTab: focusable
52
+
53
+ function optionValue(o) {
54
+ return (o && typeof o === "object") ? String(o.value) : String(o)
55
+ }
56
+ function optionLabel(o) {
57
+ return (o && typeof o === "object" && o.label !== undefined) ? String(o.label) : String(o)
58
+ }
59
+ function optionIcon(o) {
60
+ return (o && typeof o === "object" && o.icon) ? String(o.icon) : ""
61
+ }
62
+ function optionTooltip(o) {
63
+ return (o && typeof o === "object" && o.tooltip) ? String(o.tooltip) : ""
64
+ }
65
+
66
+ function selectedOptionIndex() {
67
+ for (var i = 0; i < options.length; i++)
68
+ if (optionValue(options[i]) === value) return i
69
+ return -1
70
+ }
71
+
72
+ function activateFocused() {
73
+ if (_focusedIndex < 0 || _focusedIndex >= options.length) return
74
+ var v = optionValue(options[_focusedIndex])
75
+ root.changed(v)
76
+ }
77
+
78
+ onActiveFocusChanged: {
79
+ if (activeFocus) {
80
+ var idx = selectedOptionIndex()
81
+ _focusedIndex = idx < 0 ? 0 : idx
82
+ } else {
83
+ _focusedIndex = -1
84
+ }
85
+ }
86
+
87
+ Keys.priority: Keys.BeforeItem
88
+ Keys.onPressed: function(event) {
89
+ if (Util.readingKey(event, true) === Qt.Key_Left) {
90
+ _focusedIndex = Math.max(0, (_focusedIndex < 0 ? 0 : _focusedIndex) - 1)
91
+ event.accepted = true
92
+ } else if (Util.readingKey(event, true) === Qt.Key_Right) {
93
+ var max = options.length - 1
94
+ var next = (_focusedIndex < 0 ? 0 : _focusedIndex) + 1
95
+ _focusedIndex = Math.min(max, next)
96
+ event.accepted = true
97
+ } else if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter
98
+ || event.key === Qt.Key_Space) {
99
+ activateFocused()
100
+ event.accepted = true
101
+ }
102
+ }
103
+
104
+ Repeater {
105
+ model: root.options
106
+
107
+ delegate: Button {
108
+ required property var modelData
109
+ required property int index
110
+ text: root.optionLabel(modelData)
111
+ iconText: root.optionIcon(modelData)
112
+ tooltipText: root.optionTooltip(modelData)
113
+ selected: root.optionValue(modelData) === root.value
114
+ // Chip lights up when either the external panel cursor lands here
115
+ // or the group has Tab focus and h/l has walked to this index.
116
+ hasCursor: root.cursorIndex === index
117
+ || (root.activeFocus && root._focusedIndex === index)
118
+ // Every chip carries the standard bordered-button chrome so the
119
+ // group reads as a row of distinct options. selected / hover-cursor /
120
+ // focus are all painted by Button from Style's shared state tokens.
121
+ bordered: true
122
+ foreground: root.foreground
123
+ background: root.background
124
+ accent: root.accent
125
+ fontFamily: root.fontFamily
126
+ fontSize: root.fontSize
127
+ onClicked: root.changed(root.optionValue(modelData))
128
+ onHovered: function(h) { root.hovered(index, h) }
129
+ }
130
+ }
131
+ }
@@ -0,0 +1,134 @@
1
+ import QtQuick
2
+ import qs.Commons
3
+ import qs.Commons as Commons
4
+
5
+ Item {
6
+ id: root
7
+
8
+ property bool opened: false
9
+ property string message: ""
10
+ property string cancelText: Commons.I18n.t("common.cancel")
11
+ property string confirmText: Commons.I18n.t("common.confirm")
12
+ property int selectedIndex: 1
13
+ property color background: Commons.Color.background
14
+ property color foreground: Commons.Color.foreground
15
+ property color scrim: Util.alpha(Commons.Color.background, 0.7)
16
+ property color selectedBackground: Util.alpha(Commons.Color.foreground, 0.08)
17
+ property color selectedText: Commons.Color.accent
18
+ property string fontFamily: Style.font.family
19
+ property int cornerRadius: Style.cornerRadius
20
+
21
+ signal canceled()
22
+ signal confirmed()
23
+
24
+ function handleKey(event) {
25
+ if (!root.opened) return false
26
+
27
+ if (event.key === Qt.Key_Escape) {
28
+ root.canceled()
29
+ return true
30
+ } else if (event.key === Qt.Key_Left || event.key === Qt.Key_Right || event.key === Qt.Key_Tab || event.key === Qt.Key_Backtab) {
31
+ root.selectedIndex = root.selectedIndex === 0 ? 1 : 0
32
+ return true
33
+ } else if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter) {
34
+ if (root.selectedIndex === 0) root.canceled()
35
+ else root.confirmed()
36
+ return true
37
+ }
38
+
39
+ return false
40
+ }
41
+
42
+ visible: opened
43
+
44
+ Rectangle {
45
+ anchors.fill: parent
46
+ color: root.scrim
47
+
48
+ MouseArea { anchors.fill: parent; onClicked: root.canceled() }
49
+
50
+ BorderSurface {
51
+ id: card
52
+ width: Math.min(parent.width - Style.space(32), Style.space(370))
53
+ // Grows with the wrapped message so narrow hosts (like the menu card)
54
+ // don't squeeze the text into the buttons.
55
+ height: card.contentTopInset + card.contentBottomInset + messageText.implicitHeight + Style.space(20) + Style.space(34)
56
+ anchors.centerIn: parent
57
+ color: root.background
58
+ borderSpec: Border.flat(root.selectedText, Style.normalBorderWidth)
59
+ padding: Style.space(18)
60
+ radius: root.cornerRadius
61
+
62
+ MouseArea { anchors.fill: parent; onClicked: {} }
63
+
64
+ Item {
65
+ anchors.fill: parent
66
+ anchors.topMargin: card.contentTopInset
67
+ anchors.rightMargin: card.contentRightInset
68
+ anchors.bottomMargin: card.contentBottomInset
69
+ anchors.leftMargin: card.contentLeftInset
70
+
71
+ Text {
72
+ id: messageText
73
+ textFormat: Text.PlainText
74
+ anchors.left: parent.left
75
+ anchors.right: parent.right
76
+ anchors.top: parent.top
77
+ text: root.message
78
+ color: root.foreground
79
+ font.family: root.fontFamily
80
+ font.pixelSize: Style.font.title
81
+ wrapMode: Text.WordWrap
82
+ }
83
+
84
+ Row {
85
+ anchors.right: parent.right
86
+ anchors.bottom: parent.bottom
87
+ spacing: Style.space(10)
88
+
89
+ Repeater {
90
+ model: [root.cancelText, root.confirmText]
91
+
92
+ BorderSurface {
93
+ required property int index
94
+ required property string modelData
95
+
96
+ readonly property bool selected: root.selectedIndex === index
97
+ readonly property bool destructive: index === 1
98
+
99
+ width: Style.space(88)
100
+ height: Style.space(34)
101
+ color: selected
102
+ ? (destructive ? Util.alpha(Commons.Color.urgent, 0.22) : root.selectedBackground)
103
+ : "transparent"
104
+ borderSpec: Border.flat(destructive
105
+ ? (selected ? Commons.Color.urgent : Util.alpha(Commons.Color.urgent, 0.56))
106
+ : (selected ? root.selectedText : Util.alpha(root.foreground, 0.38)), Style.normalBorderWidth)
107
+ radius: 0
108
+
109
+ Text {
110
+ textFormat: Text.PlainText
111
+ anchors.centerIn: parent
112
+ text: modelData
113
+ color: destructive ? (selected ? Commons.Color.urgent : root.foreground) : (selected ? root.selectedText : root.foreground)
114
+ font.family: root.fontFamily
115
+ font.pixelSize: Style.font.caption
116
+ }
117
+
118
+ MouseArea {
119
+ anchors.fill: parent
120
+ hoverEnabled: true
121
+ cursorShape: Qt.PointingHandCursor
122
+ onEntered: root.selectedIndex = index
123
+ onClicked: {
124
+ if (index === 0) root.canceled()
125
+ else root.confirmed()
126
+ }
127
+ }
128
+ }
129
+ }
130
+ }
131
+ }
132
+ }
133
+ }
134
+ }
@@ -0,0 +1,42 @@
1
+ import QtQuick
2
+ import qs.Commons
3
+ import qs.Commons as Commons
4
+
5
+ // Shared visual chrome for keyboard-and-mouse-navigable items inside a panel.
6
+ // Contract: items must NOT read `containsMouse` for color/border. Mouse
7
+ // hover updates the panel's cursor state at the root; visuals derive from
8
+ // `hasCursor` / `current`. That's what guarantees a single highlight on
9
+ // screen at any time across both keyboard and mouse interaction.
10
+ //
11
+ // Cursor paint is always the shared hover-cursor fill plus optional
12
+ // hover-cursor border. `outline` remains as a compatibility flag for
13
+ // callers that used to request border-only rows, but slider rows still
14
+ // receive the same hover-cursor background as every other row.
15
+ BorderSurface {
16
+ id: root
17
+
18
+ property bool hasCursor: false
19
+ property bool current: false
20
+ property bool outline: false
21
+ property bool bordered: false
22
+
23
+ property color foreground: Commons.Color.foreground
24
+ property color accent: Commons.Color.accent
25
+ property color fill: Style.hoverFillFor(foreground, accent)
26
+ property color currentFill: Style.selectedFillFor(foreground, accent)
27
+
28
+ radius: Style.cornerRadius
29
+
30
+ color: hasCursor ? fill : (current ? currentFill : "transparent")
31
+ borderSpec: root.hasCursor
32
+ ? Border.controlSpec("hover-cursor", root.foreground, root.accent)
33
+ : (root.current
34
+ ? Border.controlSpec("selected", root.foreground, root.accent)
35
+ : (root.bordered
36
+ ? Border.controlSpec("normal", root.foreground, root.accent)
37
+ : Border.none()))
38
+
39
+ Behavior on color {
40
+ ColorAnimation { duration: Style.duration(60) }
41
+ }
42
+ }