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,304 @@
1
+ .pragma library
2
+
3
+ // The wheel's arithmetic, kept pure so tests/js/scroll.js can drive it without a Flickable.
4
+
5
+ // One discrete notch is 120 units of angleDelta, Qt's own convention for a wheel click.
6
+ var NOTCH_UNITS = 120
7
+ // Qt's own lines per notch when the platform reports none: the one fallback, so the handler passes the raw hint.
8
+ var DEFAULT_LINES = 3
9
+ // A scrollbar sits above a view's delegates and its FastScrollHandler (z 1000), so it takes its own presses.
10
+ var BAR_Z = 2000
11
+ // A dragged handle's MouseArea moves onto the window's content item, above everything that window draws.
12
+ var GRAB_Z = 1000000
13
+ // Less than half a pixel of range is rounding in the layout, not content worth a bar.
14
+ var OVERFLOW_PX = 0.5
15
+
16
+ // Notch pixels are the platform's lines times notchPx times the multiplier; a touchpad never reaches here.
17
+ // Sample input: pixelDeltaY 0, angleDeltaY -120, lines 3, notchPx 24, multiplier 4 gives -288; so does pixelDeltaY -15.
18
+ function distance(pixelDeltaY, angleDeltaY, lines, notchPx, multiplier) {
19
+ if (movesByPixels(0, pixelDeltaY, angleDeltaY))
20
+ return Number(pixelDeltaY)
21
+ var perNotch = Number(lines) > 0 ? Number(lines) : DEFAULT_LINES
22
+ return (Number(angleDeltaY) || 0) / NOTCH_UNITS * perNotch * notchPx * multiplier
23
+ }
24
+
25
+ // Touchpad answers Finder's feel at GTK4's 2.5 gain; a wheel notch is unchanged.
26
+ var TOUCH_GAIN = 2.5
27
+ // Apple's curve: velocity decays by 0.998 per millisecond, so the tail is about 0.5 s of lift velocity.
28
+ var MOMENTUM_DECAY = 0.998
29
+ // The lift velocity is measured over the stroke's last 100 ms by arrival time, QML has no timestamp.
30
+ var VELOCITY_WINDOW_MS = 100
31
+ // Two events in one millisecond take the floor, so they cannot fling.
32
+ var MIN_SPAN_MS = 16
33
+ // Kept past the window so the lift still spans from the event before the first in-window sample.
34
+ var SPAN_ANCHOR_MS = 50
35
+ // 6 px/ms coasts about 3000 px, two screens, so a 1 ms double event cannot fling further.
36
+ var MAX_V_PX_PER_MS = 6
37
+ // Below half a pixel a 60 Hz frame, where the crawl is no longer visible.
38
+ var STOP_V_PX_PER_MS = 0.03
39
+ // Injected for the headless probe; production reads the wall clock.
40
+ var testNowMs = -1
41
+ function now() {
42
+ return testNowMs >= 0 ? testNowMs : Date.now()
43
+ }
44
+
45
+ // A touchpad event is any event whose phase is not Qt.NoScrollPhase (0); a wheel carries none.
46
+ function isTouchpad(phase) {
47
+ return Number(phase) !== 0
48
+ }
49
+
50
+ // Qt 6.12 fills pixelDelta beside angleDelta on a phaseless wheel notch, so pixels count only for a touchpad stroke
51
+ // or an event that carries no angle. Sample input: phase 0, pixel -15, angle -120 is a notch; phase 0, pixel -10, angle 0 is pixels.
52
+ function movesByPixels(phase, pixelDelta, angleDelta) {
53
+ return (Number(pixelDelta) || 0) !== 0 && (isTouchpad(phase) || (Number(angleDelta) || 0) === 0)
54
+ }
55
+
56
+ // Zoom travel in steps: touchpad pixels per touchpadStep, or wheel units per notch. Sample input: 0, -15, -120, 48, 120 gives -1.
57
+ function zoomTravel(phase, pixelDelta, angleDelta, touchpadStep, notchUnits) {
58
+ if (movesByPixels(phase, pixelDelta, angleDelta))
59
+ return Number(pixelDelta) / touchpadStep
60
+ return (Number(angleDelta) || 0) / notchUnits
61
+ }
62
+
63
+ // A touchpad stroke moves by gained pixels only; a sub-pixel frame moves nothing.
64
+ function touchDistance(pixelDelta) {
65
+ var pixels = Number(pixelDelta) || 0
66
+ if (pixels === 0)
67
+ return 0
68
+ return pixels * TOUCH_GAIN
69
+ }
70
+
71
+ // One tail state per Flickable, shared by its body handler and its scrollbar lane handler.
72
+ var _tails = []
73
+ function tailState(view, create) {
74
+ for (var i = 0; i < _tails.length; i++)
75
+ if (_tails[i].view === view)
76
+ return _tails[i].state
77
+ if (!create)
78
+ return null
79
+ var made = { samples: [], vx: 0, vy: 0, active: false, lastY: null, lastX: null, overY: 0, overX: 0, retActive: false, retElapsed: 0, retDur: 0, retFromY: 0, retToY: 0, retFromX: 0, retToX: 0 }
80
+ _tails.push({ view: view, state: made })
81
+ return made
82
+ }
83
+
84
+ function stopTail(view) {
85
+ var found = tailState(view, false)
86
+ if (found !== null) {
87
+ found.active = false
88
+ found.vx = 0
89
+ found.vy = 0
90
+ found.samples = []
91
+ }
92
+ }
93
+
94
+ function forgetTail(view) {
95
+ for (var i = 0; i < _tails.length; i++)
96
+ if (_tails[i].view === view) {
97
+ _tails.splice(i, 1)
98
+ return
99
+ }
100
+ }
101
+
102
+ function pushSample(view, t, dx, dy) {
103
+ // dx is across (horizontal), dy is down (vertical), both gained pixels.
104
+ var found = tailState(view, true)
105
+ found.samples.push({ t: Number(t) || 0, x: Number(dx) || 0, y: Number(dy) || 0 })
106
+ while (found.samples.length > 0 && found.samples[0].t <= Number(t) - VELOCITY_WINDOW_MS - SPAN_ANCHOR_MS)
107
+ found.samples.shift()
108
+ }
109
+
110
+ // Velocity over the last 100 ms of deltas; the span starts at the event before the first in-window sample.
111
+ function liftVelocity(samples, endTime) {
112
+ var end = Number(endTime) || 0
113
+ var xs = 0, ys = 0, anchor = -1, first = -1, last = -1, n = 0
114
+ for (var i = 0; i < samples.length; i++) {
115
+ var s = samples[i]
116
+ if (s.t <= end - VELOCITY_WINDOW_MS)
117
+ anchor = s.t
118
+ else if (s.t <= end) {
119
+ xs += s.x
120
+ ys += s.y
121
+ if (first < 0)
122
+ first = s.t
123
+ last = s.t
124
+ n += 1
125
+ }
126
+ }
127
+ if (n === 0)
128
+ return { vx: 0, vy: 0 }
129
+ if (anchor < 0)
130
+ anchor = first
131
+ var span = Math.max(MIN_SPAN_MS, last - anchor)
132
+ var vx = xs / span, vy = ys / span
133
+ var speed = Math.sqrt(vx * vx + vy * vy)
134
+ if (speed > MAX_V_PX_PER_MS) {
135
+ vx *= MAX_V_PX_PER_MS / speed
136
+ vy *= MAX_V_PX_PER_MS / speed
137
+ speed = MAX_V_PX_PER_MS
138
+ }
139
+ if (speed <= STOP_V_PX_PER_MS)
140
+ return { vx: 0, vy: 0 }
141
+ return { vx: vx, vy: vy }
142
+ }
143
+
144
+ // Wheel-space pixels travelled in ms at v0, the closed form of the decay.
145
+ function tailTravel(v0, ms) {
146
+ var v = Number(v0) || 0
147
+ var t = Math.max(0, Number(ms) || 0)
148
+ if (v === 0 || t === 0)
149
+ return 0
150
+ return v * (Math.pow(MOMENTUM_DECAY, t) - 1) / Math.log(MOMENTUM_DECAY)
151
+ }
152
+
153
+ // The whole tail of v0 until it falls below the stop speed, as a positive distance.
154
+ function tailTotal(v0) {
155
+ var v = Math.abs(Number(v0) || 0)
156
+ if (v <= STOP_V_PX_PER_MS)
157
+ return 0
158
+ return (v - STOP_V_PX_PER_MS) / -Math.log(MOMENTUM_DECAY)
159
+ }
160
+
161
+ // One frame's exact integral at v over dtMs, so summed frames equal the closed form.
162
+ function tailStep(v, dtMs) {
163
+ var vel = Number(v) || 0
164
+ var dt = Math.max(0, Number(dtMs) || 0)
165
+ if (vel === 0 || dt === 0)
166
+ return { dx: 0, v: 0 }
167
+ var grown = Math.pow(MOMENTUM_DECAY, dt)
168
+ return { dx: vel * (grown - 1) / Math.log(MOMENTUM_DECAY), v: vel * grown }
169
+ }
170
+
171
+ function tailSpeed(vx, vy) {
172
+ return Math.sqrt(Math.pow(Number(vx) || 0, 2) + Math.pow(Number(vy) || 0, 2))
173
+ }
174
+
175
+ function tailLive(vx, vy) {
176
+ return tailSpeed(vx, vy) > STOP_V_PX_PER_MS
177
+ }
178
+
179
+ // A content kept inside its bounds; a gap-margined grid rests at -gap.
180
+ function bounded(value, originY, contentHeight, viewHeight, startMargin, endMargin) {
181
+ var lim = limits(originY, contentHeight, viewHeight, startMargin, endMargin)
182
+ return Math.max(lim.min, Math.min(lim.max, value))
183
+ }
184
+
185
+ // Apple's rubber-band: UIKit/AppKit use 0.55, so shown travel stays under the viewport length.
186
+ var RESIST_K = 0.55
187
+ // Shown overscroll for raw travel x past the bound over viewport d: 0 at 0, monotone, under d.
188
+ function overResist(x, d) {
189
+ var raw = Math.max(0, Number(x) || 0)
190
+ var len = Math.max(0, Number(d) || 0)
191
+ if (raw === 0 || len === 0)
192
+ return 0
193
+ return (1 - 1 / (raw * RESIST_K / len + 1)) * len
194
+ }
195
+ // Bounds from origin, length and viewport; short content pins to min, margins default 0.
196
+ function limits(origin, contentLength, viewportLength, startMargin, endMargin) {
197
+ var lead = Number(startMargin) || 0
198
+ var min = (Number(origin) || 0) - lead
199
+ var max = Math.max(min, min + lead + Math.max(0, Number(contentLength) || 0) - Math.max(0, Number(viewportLength) || 0) + (Number(endMargin) || 0))
200
+ return { min: min, max: max }
201
+ }
202
+ // Margin-aware bounds off a Flickable itself, so grid and list call sites cannot drift apart.
203
+ function limitsY(f) { return limits(f.originY, f.contentHeight, f.height, f.topMargin, f.bottomMargin) }
204
+ function limitsX(f) { return limits(f.originX, f.contentWidth, f.width, f.leftMargin, f.rightMargin) }
205
+ // No range, no delta: a vertical list reports contentWidth -1, so any x would steal the lift's tail.
206
+ function rangesX(f) { return (Number(f.contentWidth) || 0) + (Number(f.leftMargin) || 0) + (Number(f.rightMargin) || 0) - Math.max(0, Number(f.width) || 0) > 0 }
207
+ function rangesY(f) { return (Number(f.contentHeight) || 0) + (Number(f.topMargin) || 0) + (Number(f.bottomMargin) || 0) - Math.max(0, Number(f.height) || 0) > 0 }
208
+ // Past the bound the tail brakes hard, so the overshoot peaks in a few frames like Finder.
209
+ var OVER_DECAY = 0.98
210
+ function overDecel(v, dtMs) { return (Number(v) || 0) * Math.pow(OVER_DECAY, Math.max(0, Number(dtMs) || 0)) }
211
+ // OutCubic return step: at elapsed past dur lands on to, so the overscroll reaches its bound.
212
+ function returnAt(from, to, elapsed, dur) {
213
+ var t = Math.max(0, Math.min(1, Number(elapsed) / Math.max(1, Number(dur) || 1)))
214
+ var k = 1 - Math.pow(1 - t, 3)
215
+ return Number(from) + (Number(to) - Number(from)) * k
216
+ }
217
+
218
+ // The lane every listing reserves at its right edge so rows never reflow under the bar.
219
+ // Sample input: lane(14) is 14, the board's own lane at base size 14.
220
+ function lane(rowPaddingX) {
221
+ return Math.max(0, Number(rowPaddingX) || 0)
222
+ }
223
+
224
+ // The width a scrolling listing's content may use: the view less the lane it always keeps clear.
225
+ // Sample input: contentWidth(700, 14) is 686, a 700 px listing holding 686 px of rows.
226
+ function contentWidth(viewWidth, rowPaddingX) {
227
+ return Math.max(0, (Number(viewWidth) || 0) - lane(rowPaddingX))
228
+ }
229
+
230
+ // Whether a wheel event is consumed: only when it actually moved the content, so an event at the
231
+ // edge keeps propagating to whatever holds this Flickable.
232
+ function moved(previous, current) {
233
+ return Math.abs(current - previous) > 0.01
234
+ }
235
+
236
+ // Geometry over the Flickable's own range, never its delegates, so a 100,000-row model costs what a short one does.
237
+ function range(contentLength, viewportLength) {
238
+ return Math.max(0, (Number(contentLength) || 0) - Math.max(0, Number(viewportLength) || 0))
239
+ }
240
+
241
+ function handleLength(trackLength, contentLength, viewportLength, minimumLength) {
242
+ var track = Math.max(0, Number(trackLength) || 0)
243
+ var content = Math.max(0, Number(contentLength) || 0)
244
+ var viewport = Math.max(0, Number(viewportLength) || 0)
245
+ if (track === 0 || content <= viewport || content === 0)
246
+ return track
247
+ return Math.min(track, Math.max(Math.max(0, Number(minimumLength) || 0), track * viewport / content))
248
+ }
249
+
250
+ // Finder's overlay scroller at base size 14 (the 0.3.3 design canvas): knob widths, its inset from the edge, in px.
251
+ var KNOB_REST_PX = 6
252
+ var KNOB_WIDE_PX = 10
253
+ var KNOB_INSET_PX = 2
254
+ // Alphas of the theme's foreground: the knob at rest, with the pointer in the lane, pressed; the track fill.
255
+ var KNOB_ALPHA = 0.5
256
+ var KNOB_HOVER_ALPHA = 0.6
257
+ var KNOB_PRESSED_ALPHA = 0.7
258
+ var TRACK_ALPHA = 0.05
259
+
260
+ // The thumb follows Hyprland rounding: square at 0, clamped at half the thinner side.
261
+ function knobRadius(cornerRadius, width, height) {
262
+ var rounding = Number(cornerRadius) || 0
263
+ if (rounding <= 0)
264
+ return 0
265
+ var half = Math.min(Math.max(0, Number(width) || 0), Math.max(0, Number(height) || 0)) / 2
266
+ return Math.min(rounding, half)
267
+ }
268
+ // Finder's timing: shown this long after the view stops, then faded out over FADE_MS.
269
+ var HOLD_MS = 1000
270
+ var FADE_MS = 300
271
+
272
+ // Shown while the view moves, the pointer is in the lane or a press is down, and never over content that fits.
273
+ function revealed(overflow, moving, inLane, pressed) {
274
+ return !!overflow && (!!moving || !!inLane || !!pressed)
275
+ }
276
+
277
+ // A track press puts the knob's centre under the pointer, Finder's jump to the spot clicked, clamped to the travel.
278
+ function jumpOffset(at, handleLengthValue, travelLength) {
279
+ var room = Math.max(0, Number(travelLength) || 0)
280
+ return Math.max(0, Math.min(room, (Number(at) || 0) - (Number(handleLengthValue) || 0) / 2))
281
+ }
282
+
283
+ // How far the handle can move; none on a track no longer than the minimum handle, where a drag moves nothing.
284
+ function travel(trackLength, contentLength, viewportLength, minimumLength) {
285
+ return Math.max(0, (Number(trackLength) || 0) - handleLength(trackLength, contentLength, viewportLength, minimumLength))
286
+ }
287
+
288
+ function handleOffset(contentPosition, origin, contentLength, viewportLength, trackLength, minimumLength) {
289
+ var room = travel(trackLength, contentLength, viewportLength, minimumLength)
290
+ var span = range(contentLength, viewportLength)
291
+ if (room === 0 || span === 0)
292
+ return 0
293
+ var at = Math.max(0, Math.min(span, (Number(contentPosition) || 0) - (Number(origin) || 0)))
294
+ return room * at / span
295
+ }
296
+
297
+ function positionForHandle(handleOffsetValue, origin, contentLength, viewportLength, trackLength, minimumLength) {
298
+ var room = travel(trackLength, contentLength, viewportLength, minimumLength)
299
+ var span = range(contentLength, viewportLength)
300
+ if (room === 0 || span === 0)
301
+ return Number(origin) || 0
302
+ var at = Math.max(0, Math.min(room, Number(handleOffsetValue) || 0))
303
+ return (Number(origin) || 0) + span * at / room
304
+ }
@@ -0,0 +1,69 @@
1
+ .pragma library
2
+
3
+ // The cursor keeps three rows of context while scrolling and still reaches both ends.
4
+ var CONTEXT = 3
5
+
6
+ // A partly drawn bottom row is not visible, so the count floors.
7
+ function fullyVisible(height, rowHeight) {
8
+ return Math.max(1, Math.floor(height / rowHeight))
9
+ }
10
+
11
+ // The first visible row keeping the cursor's context; the margin never exceeds half the viewport.
12
+ function firstFor(first, visible, cursor, total, context) {
13
+ var asked = context === undefined ? CONTEXT : context
14
+ // The margin never exceeds half the viewport, so the cursor fits on a short list.
15
+ var margin = Math.min(asked, Math.max(0, Math.floor((visible - 1) / 2)))
16
+ var maxFirst = Math.max(0, total - visible)
17
+ var want = first
18
+ if (cursor - margin < first)
19
+ want = cursor - margin
20
+ else if (cursor + margin > first + visible - 1)
21
+ want = cursor + margin - (visible - 1)
22
+ if (want < 0)
23
+ want = 0
24
+ if (want > maxFirst)
25
+ want = maxFirst
26
+ return want
27
+ }
28
+
29
+ // True when a pixel-cut edge row needs aligning though its index sits at the window edge.
30
+ function needsAlign(cursor, want, visible, contentY, height, rowH) {
31
+ if (cursor !== want && cursor !== want + visible - 1)
32
+ return false
33
+ var top = cursor * rowH
34
+ return top < contentY || top + rowH > contentY + height
35
+ }
36
+
37
+ // The pointer case in pixels: a cut row moves just enough to show it whole.
38
+ function containY(top, rowH, contentY, height) {
39
+ if (top < contentY)
40
+ return top
41
+ if (top + rowH > contentY + height)
42
+ return top + rowH - height
43
+ return contentY
44
+ }
45
+
46
+ // The keyboard move in pixels: row aligned, but a window that wants the last first row parks the last row flush on the bottom edge.
47
+ function keyY(visible, cursor, total, context, rowH, rel, height, contentHeight) {
48
+ var first = Math.floor(rel / rowH)
49
+ var want = firstFor(first, visible, cursor, total, context)
50
+ var span = Math.max(0, contentHeight - height)
51
+ // The row-aligned stop leaves up to a row of bare ground under the last row; a wheel parked in the footer stays.
52
+ if (total > visible && want === total - visible)
53
+ return Math.max(rel, Math.min(span, Math.max(0, total * rowH - height)))
54
+ if (want === first && !needsAlign(cursor, want, visible, rel, height, rowH))
55
+ return rel
56
+ return Math.min(span, want * rowH)
57
+ }
58
+
59
+ // The contentY a row view writes to reveal its cursor: always for the pointer (a same-value write still stops a flick), null when a key does not move it.
60
+ function cursorY(f, index, total, rowH, context) {
61
+ if (context === 0) {
62
+ var top = index * rowH
63
+ var rel = containY(top, rowH, f.contentY - f.originY, f.height)
64
+ return Math.max(f.originY, Math.min(f.contentHeight - f.height + f.originY, rel + f.originY))
65
+ }
66
+ var from = f.contentY - f.originY
67
+ var to = keyY(fullyVisible(f.height, rowH), index, total, context, rowH, from, f.height, f.contentHeight)
68
+ return to !== from ? f.originY + to : null
69
+ }