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,68 @@
1
+ import QtQuick
2
+ import qs.Commons
3
+ import qs.Commons as Commons
4
+
5
+ Item {
6
+ id: root
7
+
8
+ property string text: ""
9
+ property string fontFamily: Style.font.family
10
+ property real fontSize: Style.font.body
11
+ property real paintedSize: 0
12
+ property color color: Commons.Color.foreground
13
+ property bool debugBounds: false
14
+
15
+ readonly property int renderedFontSize: Math.max(1, Math.round(fontSize))
16
+ readonly property real tightWidth: Math.max(1, glyphMetrics.tightBoundingRect.width)
17
+ readonly property real tightHeight: Math.max(1, glyphMetrics.tightBoundingRect.height)
18
+ readonly property real paintedScale: paintedSize > 0
19
+ ? Math.min(paintedSize, width, height) / Math.max(tightWidth, tightHeight)
20
+ : 1
21
+ readonly property real paintedWidth: tightWidth * paintedScale
22
+ readonly property real paintedHeight: tightHeight * paintedScale
23
+ readonly property real horizontalCorrection: glyph.implicitWidth / 2 - (glyphMetrics.tightBoundingRect.x + tightWidth / 2)
24
+ readonly property real paintedCenterX: glyph.x + (glyphMetrics.tightBoundingRect.x + tightWidth / 2) * paintedScale
25
+ readonly property real paintedCenterY: glyph.y + (glyph.baselineOffset + glyphMetrics.tightBoundingRect.y + tightHeight / 2) * paintedScale
26
+ readonly property real baselineY: glyph.y + glyph.baselineOffset * paintedScale
27
+
28
+ TextMetrics {
29
+ id: glyphMetrics
30
+ font.family: root.fontFamily
31
+ font.pixelSize: root.renderedFontSize
32
+ text: root.text
33
+ }
34
+
35
+ Text {
36
+ id: glyph
37
+ textFormat: Text.PlainText
38
+ // Bar icons fit their painted bounds. Text labels retain their line box.
39
+ x: root.width / 2 - (glyphMetrics.tightBoundingRect.x + root.tightWidth / 2) * root.paintedScale
40
+ y: root.paintedSize > 0
41
+ ? root.height / 2 - (baselineOffset + glyphMetrics.tightBoundingRect.y + root.tightHeight / 2) * root.paintedScale
42
+ : Math.round((root.height - height) / 2)
43
+ text: root.text
44
+ color: root.color
45
+ font.family: root.fontFamily
46
+ font.pixelSize: root.renderedFontSize
47
+ transformOrigin: Item.TopLeft
48
+ scale: root.paintedScale
49
+ renderType: root.paintedSize > 0 ? Text.CurveRendering : Text.NativeRendering
50
+ }
51
+
52
+ Rectangle {
53
+ visible: root.debugBounds
54
+ anchors.fill: parent
55
+ color: "transparent"
56
+ border.width: 1
57
+ border.color: "#4488ff"
58
+ }
59
+
60
+ Rectangle {
61
+ visible: root.debugBounds
62
+ x: 0
63
+ y: Math.round(root.baselineY)
64
+ width: parent.width
65
+ height: 1
66
+ color: "#44ff88"
67
+ }
68
+ }
@@ -0,0 +1,102 @@
1
+ import QtQuick
2
+ import Quickshell
3
+ import Quickshell.Hyprland
4
+ import Quickshell.Wayland
5
+ import qs.Commons as Commons
6
+
7
+ // Map a fresh fullscreen surface on each open. Keep its first frames
8
+ // transparent until Qt receives the output's scale, so it opens sharp without
9
+ // retaining a parked surface that can be closed when a monitor disconnects.
10
+ PanelWindow {
11
+ id: window
12
+
13
+ // Whether the overlay is showing. Drive this instead of visible.
14
+ property bool shown: false
15
+ property int shownLayer: WlrLayer.Overlay
16
+ property int shownKeyboardFocus: WlrKeyboardFocus.Exclusive
17
+
18
+ property var targetScreen: null
19
+ readonly property var targetMonitor: {
20
+ var monitors = Hyprland.monitors.values
21
+ for (var i = 0; i < monitors.length; i++) {
22
+ if (targetScreen && monitors[i].name === targetScreen.name) return monitors[i]
23
+ }
24
+ return null
25
+ }
26
+
27
+ // Wait for fullscreen geometry as well as scale so no smaller opening frame
28
+ // is stretched across the output. Fractional scale uses units of 1/120;
29
+ // compare in those units to tolerate floating point rounding.
30
+ readonly property bool contentReady: shown && backingWindowVisible && !!targetScreen
31
+ && width === targetScreen.width && height === targetScreen.height
32
+ && !!targetMonitor && Math.round(devicePixelRatio * 120) === Math.round(targetMonitor.scale * 120)
33
+ property bool contentRevealed: false
34
+
35
+ onContentReadyChanged: {
36
+ contentRevealed = false
37
+ // Resize and scale notifications arrive while Qt is still updating the
38
+ // window. Reveal on the next turn, once its content layout has caught up.
39
+ if (contentReady) Qt.callLater(function() {
40
+ if (window.contentReady) window.contentRevealed = true
41
+ })
42
+ }
43
+
44
+ function focusedScreen() {
45
+ var monitor = Hyprland.focusedMonitor
46
+ var name = monitor ? String(monitor.name || "") : ""
47
+ for (var i = 0; i < Quickshell.screens.length; i++) {
48
+ if (Quickshell.screens[i].name === name) return Quickshell.screens[i]
49
+ }
50
+ return Quickshell.screens.length > 0 ? Quickshell.screens[0] : null
51
+ }
52
+
53
+ // Live monitor scaling does not emit a Hyprland monitor event, so its cached
54
+ // scale can lag behind Qt. Refresh on opening and on scale changes while open.
55
+ onShownChanged: {
56
+ targetScreen = shown ? focusedScreen() : null
57
+ if (shown) Hyprland.refreshMonitors()
58
+ }
59
+ onDevicePixelRatioChanged: if (shown) Hyprland.refreshMonitors()
60
+
61
+ Connections {
62
+ target: Quickshell
63
+ function onScreensChanged() {
64
+ if (window.shown && Quickshell.screens.indexOf(window.targetScreen) < 0) {
65
+ window.targetScreen = null
66
+ // Let the removed output finish closing its old window before mapping
67
+ // a replacement, rather than recreating it during Qt's teardown.
68
+ Qt.callLater(function() {
69
+ if (window.shown && !window.targetScreen) window.targetScreen = window.focusedScreen()
70
+ })
71
+ }
72
+ }
73
+ }
74
+
75
+ visible: shown && !!targetScreen && !!targetMonitor
76
+ screen: targetScreen
77
+ anchors { top: true; left: true; bottom: true; right: true }
78
+ color: "transparent"
79
+ exclusionMode: ExclusionMode.Ignore
80
+ WlrLayershell.layer: shownLayer
81
+ WlrLayershell.keyboardFocus: shownKeyboardFocus
82
+
83
+ // Opacity preserves keyboard handling while the scale arrives, including
84
+ // search keystrokes and Escape pressed immediately after opening.
85
+ Binding {
86
+ target: window.contentItem
87
+ property: "opacity"
88
+ value: window.contentRevealed ? 1 : 0
89
+ }
90
+
91
+ // Right-to-left languages read the overlay mirrored.
92
+ Binding {
93
+ target: window.contentItem
94
+ property: "LayoutMirroring.enabled"
95
+ value: Commons.I18n.rightToLeft
96
+ }
97
+ Binding {
98
+ target: window.contentItem
99
+ property: "LayoutMirroring.childrenInherit"
100
+ value: true
101
+ }
102
+ }
@@ -0,0 +1,60 @@
1
+ import QtQuick
2
+ import Quickshell.Io
3
+ import qs.Commons
4
+ import qs.Commons as Commons
5
+
6
+ // Base item for plugin popup widgets. Many first-party plugins expose a bar
7
+ // button plus a popup from one QML entry point; this base owns the shared
8
+ // IPC-backed open/close lifecycle while implementations own button behavior,
9
+ // keyboard navigation, and content.
10
+ Item {
11
+ id: root
12
+
13
+ property QtObject bar: null
14
+ property string moduleName: ""
15
+ property var settings: ({})
16
+ property string ipcTarget: ""
17
+ property bool manageIpc: true
18
+ property alias controller: panelController
19
+ property bool popoutSwitching: false
20
+ property bool popoutSwitchClosing: false
21
+
22
+ readonly property bool opened: panelController.open
23
+ readonly property color barForeground: bar ? bar.barForeground : Commons.Color.foreground
24
+
25
+ function open() { panelController.show() }
26
+ function close() { panelController.hide() }
27
+ function closeForPopoutSwitch() {
28
+ popoutSwitchClosing = true
29
+ close()
30
+ Qt.callLater(function() { popoutSwitchClosing = false })
31
+ }
32
+ function toggle() { opened ? close() : open() }
33
+ function switchPanel(direction) {
34
+ if (bar && typeof bar.switchPanelFrom === "function") return bar.switchPanelFrom(root, direction)
35
+ return false
36
+ }
37
+
38
+ // Read a single value from this panel's inline shell.json entry, with a
39
+ // fallback for missing/null values. Matches BarWidget.setting().
40
+ function setting(name, fallback) {
41
+ var value = settings ? settings[name] : undefined
42
+ return value === undefined || value === null ? fallback : value
43
+ }
44
+
45
+ PanelController {
46
+ id: panelController
47
+ }
48
+
49
+ ShellIpc {
50
+ enabled: root.manageIpc && root.ipcTarget !== ""
51
+ target: root.ipcTarget
52
+
53
+ function open(): void { root.open() }
54
+ function close(): void { root.close() }
55
+ function show(): void { root.open() }
56
+ function hide(): void { root.close() }
57
+ function toggle(): void { root.toggle() }
58
+ }
59
+
60
+ }
@@ -0,0 +1,105 @@
1
+ import QtQuick
2
+ import qs.Commons
3
+ import qs.Commons as Commons
4
+
5
+ // Small (22×22 by default) icon button used at the right edge of panel rows
6
+ // for inline actions — forget network, confirm passphrase, unpair device,
7
+ // etc. Two visual modes are supported via `hoverColor`:
8
+ // - default: hoverColor === foreground → subtle foreground-tint hover
9
+ // - urgent: hoverColor === bar.urgent → red-tint hover for destructive
10
+ // actions like forget/unpair
11
+ //
12
+ // `enabled` gates clicks and dims the icon. The component owns its own
13
+ // hover state visuals; mouse hover does NOT update any panel cursor state
14
+ // here because action buttons are not cursor targets — the row they live
15
+ // in is.
16
+ //
17
+ // Set `focusable: true` to make the button keyboard-tabbable with the
18
+ // shared hover-cursor/focus tokens. Use this
19
+ // in form contexts where Tab walks a list
20
+ // of controls; leave it false for the right-edge actions on panel rows
21
+ // where the row's CursorSurface owns the keyboard cursor.
22
+ //
23
+ // Set `hasCursor: true` to have the button render the same hover state as
24
+ // mouse hover — so a panel's keyboard cursor lands on it identically.
25
+ // Use this when a PanelActionButton is itself the cursor target (rather
26
+ // than living inside a CursorSurface row). Emits `hovered(bool)` on
27
+ // pointer enter/leave so the panel can update its cursor state to match.
28
+ BorderSurface {
29
+ id: root
30
+
31
+ property string iconText: ""
32
+ property string tooltipText: ""
33
+ property color foreground: Commons.Color.foreground
34
+ property color hoverColor: foreground
35
+ property string fontFamily: Style.font.family
36
+ property real fontSize: Style.font.icon
37
+ // Whole and odd, so an icon glyph (usually an odd number of pixels wide)
38
+ // has the same space on both sides instead of one pixel more on one side.
39
+ property real size: Math.round(Math.max(Style.space(22), fontSize + Style.spacing.sm * 2)) | 1
40
+
41
+ property bool focusable: false
42
+ property bool hasCursor: false
43
+ property bool bordered: false
44
+
45
+ signal clicked()
46
+ signal hovered(bool isHovered)
47
+
48
+ activeFocusOnTab: focusable
49
+ Keys.onReturnPressed: if (focusable) root.clicked()
50
+ Keys.onEnterPressed: if (focusable) root.clicked()
51
+ Keys.onSpacePressed: if (focusable) root.clicked()
52
+
53
+ implicitWidth: size
54
+ implicitHeight: size
55
+ radius: Style.cornerRadius
56
+
57
+ readonly property bool _showFocusRing: focusable && activeFocus
58
+ readonly property bool _hot: (mouse.containsMouse || root.hasCursor) && root.enabled
59
+ readonly property var _borderSpec: _showFocusRing
60
+ ? Border.controlSpec("focus", hoverColor, hoverColor)
61
+ : (_hot && bordered
62
+ ? Border.controlSpec("hover-cursor", hoverColor, hoverColor)
63
+ : (bordered ? Border.controlSpec("normal", foreground, Commons.Color.accent) : Border.none()))
64
+
65
+ color: _showFocusRing
66
+ ? Style.focusFillFor(hoverColor, hoverColor)
67
+ : (_hot
68
+ ? Style.hoverFillFor(hoverColor, hoverColor)
69
+ : "transparent")
70
+ borderSpec: _borderSpec
71
+
72
+ Behavior on color { ColorAnimation { duration: Style.duration(60) } }
73
+
74
+ Text {
75
+ textFormat: Text.PlainText
76
+ // Snap to whole pixels so the glyph doesn't round away from the fill's center.
77
+ x: Math.round((root.width - width) / 2)
78
+ y: Math.round((root.height - height) / 2)
79
+ text: root.iconText
80
+ color: root.enabled
81
+ ? (root._hot ? root.hoverColor : root.foreground)
82
+ : Qt.darker(root.foreground, 2.0)
83
+ font.family: root.fontFamily
84
+ font.pixelSize: root.fontSize
85
+ }
86
+
87
+ MouseArea {
88
+ id: mouse
89
+ anchors.fill: parent
90
+ hoverEnabled: true
91
+ cursorShape: root.enabled ? Qt.PointingHandCursor : Qt.ArrowCursor
92
+ enabled: root.enabled
93
+ onContainsMouseChanged: root.hovered(containsMouse)
94
+ onClicked: {
95
+ if (root.focusable) root.forceActiveFocus()
96
+ root.clicked()
97
+ }
98
+ }
99
+
100
+ PanelToolTip {
101
+ visible: root.tooltipText !== "" && mouse.containsMouse
102
+ text: root.tooltipText
103
+ fontFamily: root.fontFamily
104
+ }
105
+ }
@@ -0,0 +1,16 @@
1
+ import QtQuick
2
+ // Stores the open state for a shell panel. Panel owns the public lifecycle
3
+ // methods and IPC wiring; this object only keeps state separate from the
4
+ // panel implementation's own properties.
5
+ //
6
+ // Usage:
7
+ // PanelController { id: panelController }
8
+ QtObject {
9
+ id: root
10
+
11
+ property bool open: false
12
+
13
+ function toggle() { open = !open }
14
+ function show() { if (!open) open = true }
15
+ function hide() { open = false }
16
+ }
@@ -0,0 +1,112 @@
1
+ import QtQuick
2
+ import qs.Commons
3
+ import qs.Commons as Commons
4
+
5
+ Item {
6
+ id: root
7
+
8
+ property Component iconComponent: null
9
+ property string title: ""
10
+ property string meta: ""
11
+ property string detail: ""
12
+ property color foreground: Commons.Color.foreground
13
+ property string fontFamily: Style.font.family
14
+ property real iconSize: Style.font.display
15
+ property real iconOpacity: 1.0
16
+ property alias metaOpacity: metaText.opacity
17
+
18
+ // Optional control pinned to the trailing edge of the hero — a ToggleSwitch,
19
+ // a small button. The hero centers it against the labels and reserves the
20
+ // space itself, so callers never do the geometry.
21
+ property Component trailingControl: null
22
+
23
+ readonly property color dim: Qt.darker(foreground, 1.4)
24
+ readonly property real trailingInset: trailingLoader.item && trailingLoader.item.visible ? trailingLoader.width + Style.space(12) : 0
25
+
26
+ width: parent ? parent.width : implicitWidth
27
+ implicitHeight: Math.max(iconLoader.implicitHeight, heroLabels.implicitHeight, trailingLoader.implicitHeight)
28
+
29
+ Loader {
30
+ id: iconLoader
31
+ sourceComponent: root.iconComponent
32
+ anchors.left: parent.left
33
+ anchors.verticalCenter: parent.verticalCenter
34
+ opacity: root.iconOpacity
35
+ }
36
+
37
+ Column {
38
+ id: heroLabels
39
+ anchors.left: iconLoader.right
40
+ anchors.leftMargin: Style.space(14)
41
+ anchors.right: parent.right
42
+ anchors.rightMargin: root.trailingInset
43
+ anchors.verticalCenter: parent.verticalCenter
44
+ spacing: Style.space(2)
45
+
46
+ Row {
47
+ id: titleRow
48
+ visible: root.title !== "" || detailPill.visible
49
+ width: parent.width
50
+
51
+ Text {
52
+ textFormat: Text.PlainText
53
+ visible: root.title !== ""
54
+ text: root.title
55
+ width: Math.min(implicitWidth, Math.max(0, parent.width - (detailPill.visible ? detailPill.implicitWidth + Style.space(8) : 0)))
56
+ color: root.foreground
57
+ font.family: root.fontFamily
58
+ font.pixelSize: Style.font.title
59
+ font.bold: true
60
+ elide: Text.ElideRight
61
+ }
62
+
63
+ Item {
64
+ width: Math.max(0, parent.width - parent.children[0].width - detailPill.implicitWidth)
65
+ height: 1
66
+ }
67
+
68
+ BorderSurface {
69
+ id: detailPill
70
+ visible: root.detail !== ""
71
+ implicitWidth: detailText.implicitWidth + Style.space(10)
72
+ implicitHeight: detailText.implicitHeight + Style.space(4)
73
+ anchors.verticalCenter: parent.verticalCenter
74
+ color: "transparent"
75
+ borderSpec: Border.controlSpec("normal", root.foreground, Commons.Color.accent)
76
+ radius: Style.cornerRadius
77
+
78
+ Text {
79
+ id: detailText
80
+ textFormat: Text.PlainText
81
+ anchors.centerIn: parent
82
+ text: root.detail
83
+ color: root.dim
84
+ font.family: root.fontFamily
85
+ font.pixelSize: Style.font.body
86
+ font.bold: true
87
+ }
88
+ }
89
+ }
90
+
91
+ Text {
92
+ id: metaText
93
+ textFormat: Text.PlainText
94
+ width: parent.width
95
+ text: root.meta.toUpperCase()
96
+ visible: text !== ""
97
+ color: root.dim
98
+ font.family: root.fontFamily
99
+ font.pixelSize: Style.font.caption
100
+ font.bold: true
101
+ font.letterSpacing: 1.2
102
+ elide: Text.ElideRight
103
+ }
104
+ }
105
+
106
+ Loader {
107
+ id: trailingLoader
108
+ sourceComponent: root.trailingControl
109
+ anchors.right: parent.right
110
+ anchors.verticalCenter: parent.verticalCenter
111
+ }
112
+ }
@@ -0,0 +1,100 @@
1
+ import QtQuick
2
+
3
+ // Drop-in key dispatcher for keyboard-driven panels. Wraps panel content
4
+ // and emits semantic signals so each panel keeps its own state machine
5
+ // (focusSection, selectedIndex, action rules) while the boilerplate
6
+ // key handling lives here.
7
+ //
8
+ // Usage:
9
+ // Common.KeyboardPanel {
10
+ // ...
11
+ // PanelKeyCatcher {
12
+ // anchors.fill: parent
13
+ // onMoveRequested: function(dx, dy) { root.moveCursor(dx, dy) }
14
+ // onActivateRequested: root.activateCursor()
15
+ // onCloseRequested: root.close()
16
+ // onDeleteRequested: root.deleteSelected()
17
+ // onTextKey: function(t, modifiers) { if (t === "r") root.refresh() }
18
+ //
19
+ // Column { ... panel content ... }
20
+ // }
21
+ // }
22
+ //
23
+ // Keys.priority: Keys.BeforeItem means this handler gets keys first,
24
+ // even when a descendant has activeFocus. That's what lets Up/Down
25
+ // arrows drive the cursor instead of being consumed by an inner
26
+ // Flickable's built-in scroll handling. When a panel has an inline
27
+ // editor (wifi passphrase, gallery TextField demo) the panel must
28
+ // set `blocked: editor.activeFocus` so this handler short-circuits
29
+ // and the editor receives keys normally.
30
+ //
31
+ // blocked: when true, ALL keys are forwarded to descendants without
32
+ // triggering signals.
33
+ Item {
34
+ id: root
35
+
36
+ property bool blocked: false
37
+ // Panels that let items be reordered set this, and Ctrl+Up/Down (or
38
+ // Ctrl+k/j) then asks to move the current item instead of the cursor.
39
+ property bool reorderable: false
40
+
41
+ signal moveRequested(int dx, int dy)
42
+ signal reorderRequested(int dy)
43
+ signal activateRequested()
44
+ signal returnRequested()
45
+ signal closeRequested()
46
+ signal deleteRequested()
47
+ signal tabRequested(int direction)
48
+ // The held modifiers ride along, so a panel can tell Alt+T from T.
49
+ signal textKey(string text, int modifiers)
50
+
51
+ focus: true
52
+ Keys.priority: Keys.BeforeItem
53
+ Keys.onPressed: function(event) {
54
+ if (blocked) return
55
+
56
+ if (event.key === Qt.Key_Escape) {
57
+ closeRequested(); event.accepted = true; return
58
+ }
59
+ if (event.key === Qt.Key_Tab || event.key === Qt.Key_Backtab) {
60
+ tabRequested((event.modifiers & Qt.ShiftModifier) || event.key === Qt.Key_Backtab ? -1 : 1)
61
+ event.accepted = true
62
+ return
63
+ }
64
+ if (reorderable && (event.modifiers & Qt.ControlModifier)) {
65
+ var up = event.key === Qt.Key_Up || event.key === Qt.Key_K
66
+ var down = event.key === Qt.Key_Down || event.key === Qt.Key_J
67
+ if (up || down) {
68
+ reorderRequested(down ? 1 : -1); event.accepted = true; return
69
+ }
70
+ }
71
+ if (event.key === Qt.Key_Down || event.text === "j") {
72
+ moveRequested(0, 1); event.accepted = true; return
73
+ }
74
+ if (event.key === Qt.Key_Up || event.text === "k") {
75
+ moveRequested(0, -1); event.accepted = true; return
76
+ }
77
+ // In a mirrored (right-to-left) panel, Left moves forward along a row.
78
+ var right = event.key === Qt.Key_Right || event.text === "l"
79
+ var left = event.key === Qt.Key_Left || event.text === "h"
80
+ if (LayoutMirroring.enabled ? left : right) {
81
+ moveRequested(1, 0); event.accepted = true; return
82
+ }
83
+ if (LayoutMirroring.enabled ? right : left) {
84
+ moveRequested(-1, 0); event.accepted = true; return
85
+ }
86
+ if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter) {
87
+ returnRequested()
88
+ activateRequested(); event.accepted = true; return
89
+ }
90
+ if (event.key === Qt.Key_Space) {
91
+ activateRequested(); event.accepted = true; return
92
+ }
93
+ if (event.key === Qt.Key_Delete || event.text === "x" || event.text === "X") {
94
+ deleteRequested(); event.accepted = true; return
95
+ }
96
+ if (event.text && event.text.length === 1) {
97
+ textKey(event.text, event.modifiers)
98
+ }
99
+ }
100
+ }
@@ -0,0 +1,31 @@
1
+ import QtQuick
2
+ import qs.Commons
3
+ import qs.Commons as Commons
4
+
5
+ // Small-caps-style label that introduces a panel section ("DNS provider",
6
+ // "Wi-Fi networks", "Output device", "Paired devices"). Sits between a
7
+ // PanelSeparator and the content rows.
8
+ Text {
9
+ id: root
10
+
11
+ property color foreground: Commons.Color.foreground
12
+ property string fontFamily: Style.font.family
13
+ property real fontSize: Style.font.caption
14
+
15
+ // Callers bind `text` from outside this file, so the default has to be set
16
+ // here. AutoText would let a section title that happens to carry a device or
17
+ // network name promote itself to rich text.
18
+ textFormat: Text.PlainText
19
+ color: Qt.darker(foreground, 1.4)
20
+ font.family: fontFamily
21
+ font.pixelSize: fontSize
22
+ font.bold: true
23
+
24
+ // Glyphs can paint above the box Text reserves for them: JetBrainsMono Nerd
25
+ // Font's outlines run 10% of the em past its own ascent, and a patched or
26
+ // user-chosen family can be worse. That sliver is invisible in normal flow,
27
+ // but a header sitting at the top of a clipping list — bluetooth's device
28
+ // list, network's station list — loses it to the clip and renders beheaded.
29
+ // Reserve the overshoot here so every panel is covered at once.
30
+ topPadding: Math.ceil(fontSize * 0.15)
31
+ }
@@ -0,0 +1,19 @@
1
+ import QtQuick
2
+ import qs.Commons
3
+ import qs.Commons as Commons
4
+
5
+ // 1px horizontal divider for panel sections. The alpha-on-foreground tint
6
+ // keeps the rule legible against the panel background without competing
7
+ // with text or borders.
8
+ Rectangle {
9
+ id: root
10
+
11
+ property color foreground: Commons.Color.foreground
12
+ property real strength: 0.12
13
+
14
+ width: parent ? parent.width : implicitWidth
15
+ implicitWidth: 100
16
+ implicitHeight: 1
17
+ height: 1
18
+ color: Qt.rgba(foreground.r, foreground.g, foreground.b, strength)
19
+ }