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.
- package/LICENSE +22 -0
- package/README.md +511 -2
- package/THIRD-PARTY-NOTICES.md +29 -0
- package/demos/App.java +5 -0
- package/demos/Dockerfile +4 -0
- package/demos/Main.kt +3 -0
- package/demos/Program.cs +1 -0
- package/demos/README.md +12 -0
- package/demos/app.dart +3 -0
- package/demos/app.deb +0 -0
- package/demos/app.js +1 -0
- package/demos/backup.tar +0 -0
- package/demos/budget.xlsx +0 -0
- package/demos/build.sh +2 -0
- package/demos/bundle.zip +0 -0
- package/demos/clip.mp4 +0 -0
- package/demos/data.sqlite +0 -0
- package/demos/disk.iso +0 -0
- package/demos/engine.cpp +5 -0
- package/demos/firmware.bin +0 -0
- package/demos/flake.nix +4 -0
- package/demos/folder/inside.txt +1 -0
- package/demos/font.ttf +0 -0
- package/demos/index.html +5 -0
- package/demos/index.php +2 -0
- package/demos/init.lua +1 -0
- package/demos/letter.docx +0 -0
- package/demos/lib.rs +3 -0
- package/demos/main.c +6 -0
- package/demos/main.h +3 -0
- package/demos/math-and-diagrams.md +200 -0
- package/demos/notes.tar.gz +0 -0
- package/demos/notes.txt +3 -0
- package/demos/photo.png +0 -0
- package/demos/program +2 -0
- package/demos/report.pdf +32 -0
- package/demos/script.py +1 -0
- package/demos/server.go +7 -0
- package/demos/settings.json +4 -0
- package/demos/slides.pptx +0 -0
- package/demos/song.mp3 +0 -0
- package/demos/style.css +4 -0
- package/demos/tool.rb +1 -0
- package/demos/types.ts +2 -0
- package/docs/pele.md +23 -0
- package/docs/protocol.md +3420 -0
- package/docs/temml.md +63 -0
- package/index.js +107 -0
- package/package.json +34 -4
- package/src/archive.js +407 -0
- package/src/archiveops.js +728 -0
- package/src/backend.js +369 -0
- package/src/bulkrename.js +95 -0
- package/src/clip-host.js +76 -0
- package/src/clip.js +462 -0
- package/src/code.js +168 -0
- package/src/compare.js +74 -0
- package/src/create.js +128 -0
- package/src/dirsize.js +147 -0
- package/src/figure-svg.js +530 -0
- package/src/figure-thread.js +23 -0
- package/src/figure.js +132 -0
- package/src/find.js +55 -0
- package/src/flea.js +39 -0
- package/src/fsinfo.js +39 -0
- package/src/highlight.js +141 -0
- package/src/html.js +52 -0
- package/src/kinds.js +89 -0
- package/src/listing.js +130 -0
- package/src/markdown-html.js +317 -0
- package/src/mathml.js +186 -0
- package/src/menu.js +180 -0
- package/src/meta.js +135 -0
- package/src/office.js +810 -0
- package/src/order.js +100 -0
- package/src/peek.js +49 -0
- package/src/pele-wrapper.js +695 -0
- package/src/permissions.js +180 -0
- package/src/places.js +313 -0
- package/src/preview-language.js +10 -0
- package/src/terminal-server.js +95 -0
- package/src/terminal-shell.js +26 -0
- package/src/transfer.js +669 -0
- package/src/trash-record.js +41 -0
- package/src/trash.js +210 -0
- package/src/trashbrowse.js +327 -0
- package/src/uistate.js +393 -0
- package/src/uistore.js +168 -0
- package/src/vendor/LICENSES/Apache-2.0.txt +202 -0
- package/src/vendor/LICENSES/MIT-katex-2015.txt +27 -0
- package/src/vendor/LICENSES/MIT-katex.txt +21 -0
- package/src/vendor/LICENSES/MIT-mermaid.txt +21 -0
- package/src/vendor/LICENSES/MIT-pele.txt +40 -0
- package/src/vendor/LICENSES/MIT-perseus.txt +18 -0
- package/src/vendor/LICENSES/MIT-temml.txt +21 -0
- package/src/vendor/pele.js +145 -0
- package/src/vendor/temml.mjs +14708 -0
- package/src/watch.js +98 -0
- package/src/wayland/client.js +109 -0
- package/src/wayland/protocol.js +55 -0
- package/src/wayland/protocols/ext-data-control-v1.xml +276 -0
- package/src/wayland/protocols/wayland.xml +3248 -0
- package/src/wayland/protocols/wlr-data-control-unstable-v1.xml +278 -0
- package/src/wayland/resource-io.js +6 -0
- package/src/wayland/socket-discovery.js +26 -0
- package/src/wayland/transport-posix.js +120 -0
- package/src/wayland/transport-win32.js +11 -0
- package/src/wayland/transport.js +3 -0
- package/src/wayland/win32-resources.js +80 -0
- package/src/wayland/win32-wire.js +62 -0
- package/test/archive.test.js +80 -0
- package/test/bench-markdown-scroll.mjs +190 -0
- package/test/clip-host.test.js +113 -0
- package/test/code-preview.test.js +35 -0
- package/test/compare-ui-paths.test.js +24 -0
- package/test/compare.test.js +54 -0
- package/test/delete-trash.test.js +67 -0
- package/test/dirsize.test.js +138 -0
- package/test/file-ops.test.js +307 -0
- package/test/file-url.test.js +24 -0
- package/test/find-contents.test.js +161 -0
- package/test/find-input.test.js +66 -0
- package/test/fixtures/pele-parity.json +1006 -0
- package/test/highlight-launcher.test.js +35 -0
- package/test/html-preview.test.js +22 -0
- package/test/input.test.js +15 -0
- package/test/keymap.test.js +26 -0
- package/test/language-icons.test.js +36 -0
- package/test/launcher.test.js +51 -0
- package/test/manual-archive-here-ui.mjs +47 -0
- package/test/manual-code-scroll.mjs +28 -0
- package/test/manual-column-scroll.mjs +24 -0
- package/test/manual-compare-ui.mjs +20 -0
- package/test/manual-find-status.mjs +37 -0
- package/test/manual-folder-focus.mjs +63 -0
- package/test/manual-html-security.mjs +23 -0
- package/test/manual-html-ui.mjs +30 -0
- package/test/manual-syntax-preview.mjs +26 -0
- package/test/manual-terminal-lifecycle.mjs +42 -0
- package/test/manual-terminal-navigation.mjs +48 -0
- package/test/manual-terminal-ui.mjs +47 -0
- package/test/manual-trash-ui.mjs +86 -0
- package/test/markdown-diagrams.test.js +93 -0
- package/test/markdown-html.test.js +105 -0
- package/test/mathml.test.js +92 -0
- package/test/menu-transfer.test.js +57 -0
- package/test/office-preview.test.js +154 -0
- package/test/pele-parity.test.js +28 -0
- package/test/places.test.js +134 -0
- package/test/preview-keys.test.js +60 -0
- package/test/preview-language.test.js +22 -0
- package/test/status-filename.test.js +20 -0
- package/test/transfer-replace-merge.test.js +187 -0
- package/test/trash-address.test.js +23 -0
- package/test/trash-view.test.js +37 -0
- package/test/trashbrowse.test.js +135 -0
- package/ui/AboutFacts.qml +78 -0
- package/ui/ArchiveCards.qml +95 -0
- package/ui/ArchiveCompressDialog.qml +378 -0
- package/ui/ArchiveHereConfirm.qml +127 -0
- package/ui/ArchivePasswordDialog.qml +257 -0
- package/ui/Backend.qml +775 -0
- package/ui/BulkOldNames.qml +47 -0
- package/ui/BulkRenameDialog.qml +380 -0
- package/ui/CardFrame.qml +67 -0
- package/ui/CardScroll.qml +79 -0
- package/ui/CheckBox.qml +73 -0
- package/ui/ChromeBar.qml +360 -0
- package/ui/ChromeButton.qml +131 -0
- package/ui/ChromeModes.qml +43 -0
- package/ui/CodeLines.qml +256 -0
- package/ui/CodeRefusal.qml +52 -0
- package/ui/CollideConfirm.qml +147 -0
- package/ui/CollideHost.qml +167 -0
- package/ui/ColumnPane.qml +525 -0
- package/ui/ColumnRow.qml +380 -0
- package/ui/ColumnsArea.qml +594 -0
- package/ui/ColumnsLanding.qml +147 -0
- package/ui/CompareView.qml +321 -0
- package/ui/ContextMenu.qml +743 -0
- package/ui/ConvertDialog.qml +456 -0
- package/ui/CountedWorker.qml +7 -0
- package/ui/Crumb.qml +64 -0
- package/ui/CrumbDrop.qml +25 -0
- package/ui/CsvTable.qml +394 -0
- package/ui/CursorMark.qml +41 -0
- package/ui/DefaultClaim.qml +130 -0
- package/ui/DeviceLock.qml +47 -0
- package/ui/DeviceMounts.qml +540 -0
- package/ui/DialogButton.qml +150 -0
- package/ui/DialogField.qml +147 -0
- package/ui/DialogHeader.qml +31 -0
- package/ui/DialogScrim.qml +20 -0
- package/ui/DialogTitle.qml +37 -0
- package/ui/Divider.qml +9 -0
- package/ui/DropInto.qml +126 -0
- package/ui/DropTarget.qml +35 -0
- package/ui/DropboxMark.qml +60 -0
- package/ui/EmptyState.qml +150 -0
- package/ui/EscapeHint.qml +11 -0
- package/ui/FactsTable.qml +54 -0
- package/ui/FastScrollHandler.qml +476 -0
- package/ui/FatNamesConfirm.qml +157 -0
- package/ui/Favourites.qml +143 -0
- package/ui/FigureService.qml +120 -0
- package/ui/FileDrag.qml +267 -0
- package/ui/FilterStrip.qml +133 -0
- package/ui/FitMetrics.qml +22 -0
- package/ui/FlashDriveRows.qml +137 -0
- package/ui/FlashHost.qml +72 -0
- package/ui/FlashImageRow.qml +104 -0
- package/ui/FlashRunner.qml +119 -0
- package/ui/FlashStepRow.qml +172 -0
- package/ui/FlashStrip.qml +38 -0
- package/ui/FlashView.qml +397 -0
- package/ui/FleaMark.qml +88 -0
- package/ui/FlyoutFade.qml +23 -0
- package/ui/FontPane.qml +170 -0
- package/ui/Glass.qml +114 -0
- package/ui/GlassTagger.qml +59 -0
- package/ui/Glyph.qml +64 -0
- package/ui/GlyphSolid.qml +22 -0
- package/ui/GridArea.qml +664 -0
- package/ui/GridTile.qml +325 -0
- package/ui/GvfsBridge.qml +164 -0
- package/ui/Header.qml +433 -0
- package/ui/HoverTimers.qml +39 -0
- package/ui/HtmlClip.qml +30 -0
- package/ui/HtmlPane.qml +63 -0
- package/ui/HyprlandMark.qml +45 -0
- package/ui/Ipc.qml +1005 -0
- package/ui/IpcControls.qml +7 -0
- package/ui/IpcMenuState.qml +48 -0
- package/ui/IpcPreviewState.qml +185 -0
- package/ui/JumpPath.qml +51 -0
- package/ui/KeymapSheet.qml +561 -0
- package/ui/KeymapSheetResult.qml +89 -0
- package/ui/KindStack.qml +40 -0
- package/ui/LangMark.qml +51 -0
- package/ui/LangMarkLoader.qml +26 -0
- package/ui/List.qml +480 -0
- package/ui/LoadingState.qml +54 -0
- package/ui/LocalSend.qml +56 -0
- package/ui/LocalSendMark.qml +73 -0
- package/ui/MarkdownBlockView.qml +311 -0
- package/ui/MarkdownBlocks.qml +35 -0
- package/ui/MarkdownFigure.qml +254 -0
- package/ui/MarkdownImages.qml +72 -0
- package/ui/MarkdownList.qml +81 -0
- package/ui/MarkdownMathsText.qml +97 -0
- package/ui/MarkdownPane.qml +83 -0
- package/ui/MarkdownPictures.qml +41 -0
- package/ui/MarkdownQuote.qml +52 -0
- package/ui/MarkdownRemote.qml +82 -0
- package/ui/MarkdownSource.qml +155 -0
- package/ui/MarkdownTable.qml +222 -0
- package/ui/MarkdownTableScroll.qml +64 -0
- package/ui/MarkdownTableWheel.qml +126 -0
- package/ui/MarkdownText.qml +87 -0
- package/ui/MarkdownWorker.js +132 -0
- package/ui/MatchText.qml +99 -0
- package/ui/MediaSession.qml +38 -0
- package/ui/MediaSound.qml +26 -0
- package/ui/MediaStrip.qml +191 -0
- package/ui/MediaTrack.qml +36 -0
- package/ui/MediaVolume.qml +54 -0
- package/ui/MenuActionDialog.qml +396 -0
- package/ui/MenuEdgeFade.qml +24 -0
- package/ui/MenuHost.qml +227 -0
- package/ui/MenuRow.qml +351 -0
- package/ui/MountListing.qml +100 -0
- package/ui/NetworkDialog.qml +435 -0
- package/ui/NetworkForm.qml +426 -0
- package/ui/NetworkMounts.qml +913 -0
- package/ui/NetworkPlaces.qml +127 -0
- package/ui/OpenWithDialog.qml +613 -0
- package/ui/Opener.qml +95 -0
- package/ui/Pane.qml +1320 -0
- package/ui/PaneMenuActions.qml +527 -0
- package/ui/PanePath.qml +90 -0
- package/ui/PaneRail.qml +268 -0
- package/ui/PaneStates.qml +88 -0
- package/ui/PaneSwap.qml +339 -0
- package/ui/PaneWire.qml +601 -0
- package/ui/ParkedWait.qml +9 -0
- package/ui/PathEntry.qml +186 -0
- package/ui/PathJump.qml +400 -0
- package/ui/PdfViewer.qml +297 -0
- package/ui/PermissionsDialog.qml +658 -0
- package/ui/PermissionsHeadings.qml +31 -0
- package/ui/PhoneMounts.qml +67 -0
- package/ui/PickerAnswers.qml +75 -0
- package/ui/PickerBox.qml +26 -0
- package/ui/PickerChrome.qml +295 -0
- package/ui/PickerFilter.qml +97 -0
- package/ui/PickerGrid.qml +308 -0
- package/ui/PickerHeader.qml +28 -0
- package/ui/PickerLifecycle.qml +27 -0
- package/ui/PickerList.qml +218 -0
- package/ui/PickerListing.qml +149 -0
- package/ui/PickerPathBar.qml +127 -0
- package/ui/PickerPlaces.qml +189 -0
- package/ui/PickerRecent.qml +92 -0
- package/ui/PickerSave.qml +101 -0
- package/ui/PickerSelection.qml +155 -0
- package/ui/PickerWindow.qml +846 -0
- package/ui/PowerSectorsReader.qml +10 -0
- package/ui/PrebuildDriver.qml +146 -0
- package/ui/Preview.qml +1005 -0
- package/ui/PreviewAnimation.qml +24 -0
- package/ui/PreviewArchive.qml +91 -0
- package/ui/PreviewColumn.qml +553 -0
- package/ui/PreviewEdge.qml +63 -0
- package/ui/PreviewFacts.qml +30 -0
- package/ui/PreviewFactsLine.qml +34 -0
- package/ui/PreviewHtml.qml +233 -0
- package/ui/PreviewImage.qml +253 -0
- package/ui/PreviewImagePan.qml +13 -0
- package/ui/PreviewImageSharp.qml +32 -0
- package/ui/PreviewLines.qml +106 -0
- package/ui/PreviewMarkdown.qml +706 -0
- package/ui/PreviewMedia.qml +250 -0
- package/ui/PreviewPdf.qml +482 -0
- package/ui/PreviewScroll.qml +201 -0
- package/ui/PreviewSwap.qml +335 -0
- package/ui/PreviewText.qml +149 -0
- package/ui/ProtocolChip.qml +18 -0
- package/ui/QuickLookArchive.qml +41 -0
- package/ui/QuickLookBar.qml +103 -0
- package/ui/QuickLookPrepare.qml +355 -0
- package/ui/QuickLookSwap.qml +10 -0
- package/ui/QuickLookWarm.qml +65 -0
- package/ui/RailDrop.qml +155 -0
- package/ui/RailHeading.qml +19 -0
- package/ui/RailPlaces.qml +38 -0
- package/ui/RailTrashRow.qml +67 -0
- package/ui/RenameField.qml +353 -0
- package/ui/RendererRetry.qml +11 -0
- package/ui/ResizeHandle.qml +52 -0
- package/ui/Reveal.qml +54 -0
- package/ui/Row.qml +476 -0
- package/ui/RowDrag.qml +213 -0
- package/ui/RowDropTarget.qml +27 -0
- package/ui/RunCard.qml +286 -0
- package/ui/Scripts.qml +65 -0
- package/ui/SearchStrip.qml +232 -0
- package/ui/SelectionBand.qml +140 -0
- package/ui/SelectionPreview.qml +370 -0
- package/ui/SettingsFavourite.qml +122 -0
- package/ui/SettingsGroup.qml +96 -0
- package/ui/SettingsHint.qml +12 -0
- package/ui/SettingsMetrics.qml +29 -0
- package/ui/SettingsPane.qml +178 -0
- package/ui/SettingsPanel.qml +547 -0
- package/ui/SettingsRail.qml +128 -0
- package/ui/SettingsRow.qml +409 -0
- package/ui/SettingsRuler.qml +85 -0
- package/ui/SettingsSegment.qml +85 -0
- package/ui/ShareBrowser.qml +113 -0
- package/ui/ShareLink.qml +67 -0
- package/ui/ShelfPins.qml +101 -0
- package/ui/Sidebar.qml +728 -0
- package/ui/SidebarRow.qml +358 -0
- package/ui/Spinner.qml +60 -0
- package/ui/StableModel.qml +89 -0
- package/ui/StateMessage.qml +84 -0
- package/ui/StatusBar.qml +512 -0
- package/ui/StatusFileName.qml +27 -0
- package/ui/TabBar.qml +673 -0
- package/ui/TabDragGeometry.qml +60 -0
- package/ui/TagMenuMark.qml +52 -0
- package/ui/TagRailSection.qml +53 -0
- package/ui/TagSlot.qml +40 -0
- package/ui/TagState.qml +150 -0
- package/ui/TagSwatch.qml +28 -0
- package/ui/Taildrop.qml +86 -0
- package/ui/TailscaleMark.qml +50 -0
- package/ui/TerminalService.qml +69 -0
- package/ui/TerminalTab.qml +48 -0
- package/ui/TerminalTabs.qml +27 -0
- package/ui/Theme.qml +460 -0
- package/ui/ThemeColors.qml +43 -0
- package/ui/TransferCard.qml +239 -0
- package/ui/TrashConfirm.qml +129 -0
- package/ui/TrashDropHandler.qml +11 -0
- package/ui/TrashHost.qml +202 -0
- package/ui/TrashMonitor.qml +30 -0
- package/ui/TrashToolbar.qml +19 -0
- package/ui/TrashView.qml +492 -0
- package/ui/UnlockDialog.qml +450 -0
- package/ui/UnlockHost.qml +206 -0
- package/ui/UpdateCheck.qml +97 -0
- package/ui/UserDirs.qml +25 -0
- package/ui/ViewState.qml +565 -0
- package/ui/ViewportScrollBar.qml +195 -0
- package/ui/ViewportScrollBars.qml +25 -0
- package/ui/WebPreview.qml +33 -0
- package/ui/WebPreviewView.qml +26 -0
- package/ui/WindowBody.qml +829 -0
- package/ui/WindowDrag.qml +35 -0
- package/ui/boot/Commons/AudioNodes.qml +50 -0
- package/ui/boot/Commons/AudioNodesModel.js +96 -0
- package/ui/boot/Commons/Border.qml +243 -0
- package/ui/boot/Commons/BorderGeometry.js +373 -0
- package/ui/boot/Commons/Color.qml +258 -0
- package/ui/boot/Commons/I18n.qml +118 -0
- package/ui/boot/Commons/InputDevices.qml +112 -0
- package/ui/boot/Commons/InputMethodState.qml +38 -0
- package/ui/boot/Commons/IpcRegistry.qml +77 -0
- package/ui/boot/Commons/Numbers.js +19 -0
- package/ui/boot/Commons/Plural.js +91 -0
- package/ui/boot/Commons/ShellIpc.qml +12 -0
- package/ui/boot/Commons/Style.qml +561 -0
- package/ui/boot/Commons/Translations.qml +100 -0
- package/ui/boot/Commons/UntypedInput.qml +152 -0
- package/ui/boot/Commons/Util.qml +188 -0
- package/ui/boot/Commons/qmldir +13 -0
- package/ui/boot/LICENSE-omarchy +20 -0
- package/ui/boot/Ui/BackgroundMedia.qml +49 -0
- package/ui/boot/Ui/BarIconButton.qml +106 -0
- package/ui/boot/Ui/BarIconContent.qml +38 -0
- package/ui/boot/Ui/BarIndicator.qml +53 -0
- package/ui/boot/Ui/BarWidget.qml +50 -0
- package/ui/boot/Ui/BorderOverlay.qml +54 -0
- package/ui/boot/Ui/BorderSurface.qml +40 -0
- package/ui/boot/Ui/Button.qml +224 -0
- package/ui/boot/Ui/ButtonGroup.qml +131 -0
- package/ui/boot/Ui/ConfirmDialog.qml +134 -0
- package/ui/boot/Ui/CursorSurface.qml +42 -0
- package/ui/boot/Ui/Dropdown.qml +245 -0
- package/ui/boot/Ui/FilterInput.qml +26 -0
- package/ui/boot/Ui/IconContentBounds.qml +141 -0
- package/ui/boot/Ui/KeyboardPanel.qml +453 -0
- package/ui/boot/Ui/MultiSelect.qml +624 -0
- package/ui/boot/Ui/NumberField.qml +86 -0
- package/ui/boot/Ui/OpticalGlyph.qml +68 -0
- package/ui/boot/Ui/OverlayWindow.qml +102 -0
- package/ui/boot/Ui/Panel.qml +60 -0
- package/ui/boot/Ui/PanelActionButton.qml +105 -0
- package/ui/boot/Ui/PanelController.qml +16 -0
- package/ui/boot/Ui/PanelHero.qml +112 -0
- package/ui/boot/Ui/PanelKeyCatcher.qml +100 -0
- package/ui/boot/Ui/PanelSectionHeader.qml +31 -0
- package/ui/boot/Ui/PanelSeparator.qml +19 -0
- package/ui/boot/Ui/PanelSlider.qml +156 -0
- package/ui/boot/Ui/PanelToolTip.qml +50 -0
- package/ui/boot/Ui/PluginBarApi.qml +89 -0
- package/ui/boot/Ui/PointerMoveGate.qml +54 -0
- package/ui/boot/Ui/PopupCard.qml +181 -0
- package/ui/boot/Ui/ScreenMoveRemap.qml +43 -0
- package/ui/boot/Ui/SearchableDropdown.qml +354 -0
- package/ui/boot/Ui/SizedImage.qml +125 -0
- package/ui/boot/Ui/SpeedTestOverlay.qml +412 -0
- package/ui/boot/Ui/TextField.qml +58 -0
- package/ui/boot/Ui/Toggle.qml +118 -0
- package/ui/boot/Ui/ToggleSwitch.qml +115 -0
- package/ui/boot/Ui/WidgetButton.qml +172 -0
- package/ui/boot/Ui/qmldir +41 -0
- package/ui/boot/fleatab.qml +50 -0
- package/ui/boot/picker.qml +39 -0
- package/ui/boot/shell.qml +131 -0
- package/ui/boot/tabtearoff.qml +51 -0
- package/ui/js/Anchor.js +379 -0
- package/ui/js/AnchorHold.js +162 -0
- package/ui/js/Archive.js +157 -0
- package/ui/js/ArchiveCard.js +44 -0
- package/ui/js/ArchiveOps.js +44 -0
- package/ui/js/BackReturn.js +118 -0
- package/ui/js/BulkRename.js +100 -0
- package/ui/js/Buttons.js +54 -0
- package/ui/js/ChromeKeys.js +116 -0
- package/ui/js/ClipMarks.js +73 -0
- package/ui/js/ClipSelection.js +67 -0
- package/ui/js/Clipboard.js +179 -0
- package/ui/js/Cloud.js +97 -0
- package/ui/js/CodeRuns.js +72 -0
- package/ui/js/Collide.js +212 -0
- package/ui/js/ColumnFit.js +28 -0
- package/ui/js/ColumnMenu.js +111 -0
- package/ui/js/Columns.js +298 -0
- package/ui/js/ColumnsCarry.js +103 -0
- package/ui/js/Compare.js +74 -0
- package/ui/js/Contrast.js +157 -0
- package/ui/js/ControlReader.js +42 -0
- package/ui/js/Convert.js +52 -0
- package/ui/js/CopyAs.js +52 -0
- package/ui/js/Crumbs.js +178 -0
- package/ui/js/Csv.js +231 -0
- package/ui/js/Density.js +44 -0
- package/ui/js/Devices.js +440 -0
- package/ui/js/DirSizes.js +180 -0
- package/ui/js/Drag.js +360 -0
- package/ui/js/DragOut.js +166 -0
- package/ui/js/DropDev.js +52 -0
- package/ui/js/Dropbox.js +41 -0
- package/ui/js/Eject.js +217 -0
- package/ui/js/Errors.js +188 -0
- package/ui/js/ExtThumbs.js +115 -0
- package/ui/js/Facts.js +402 -0
- package/ui/js/FigureDate.js +14 -0
- package/ui/js/Filter.js +285 -0
- package/ui/js/Find.js +46 -0
- package/ui/js/Flash.js +184 -0
- package/ui/js/FlashCard.js +79 -0
- package/ui/js/FlashEndings.js +125 -0
- package/ui/js/FlashPane.js +116 -0
- package/ui/js/FleaBin.js +12 -0
- package/ui/js/Focus.js +504 -0
- package/ui/js/FolderSorts.js +108 -0
- package/ui/js/FolderViews.js +44 -0
- package/ui/js/Format.js +314 -0
- package/ui/js/Fuzzy.js +141 -0
- package/ui/js/GlassTag.js +72 -0
- package/ui/js/Grid.js +33 -0
- package/ui/js/GridGeometry.js +90 -0
- package/ui/js/GridNames.js +153 -0
- package/ui/js/GvfsBridge.js +200 -0
- package/ui/js/HostClipboard.js +29 -0
- package/ui/js/Icons.js +218 -0
- package/ui/js/Input.js +50 -0
- package/ui/js/Jump.js +200 -0
- package/ui/js/KeyName.js +64 -0
- package/ui/js/Keymap.js +401 -0
- package/ui/js/Kinds.js +164 -0
- package/ui/js/LICENSES/ISC-lucide.txt +43 -0
- package/ui/js/LangMarkPaths.js +47 -0
- package/ui/js/LangMarks.js +120 -0
- package/ui/js/Lists.js +11 -0
- package/ui/js/LocalSend.js +39 -0
- package/ui/js/LockedMenu.js +63 -0
- package/ui/js/MakeDefault.js +186 -0
- package/ui/js/MarkBox.js +7 -0
- package/ui/js/Markdown.js +119 -0
- package/ui/js/MarkdownLists.js +86 -0
- package/ui/js/MarkdownMaths.js +58 -0
- package/ui/js/MarkdownPictures.js +32 -0
- package/ui/js/MarkdownPrepared.js +139 -0
- package/ui/js/MarkdownTableFit.js +34 -0
- package/ui/js/Marks.js +148 -0
- package/ui/js/Marquee.js +96 -0
- package/ui/js/Match.js +93 -0
- package/ui/js/Material.js +109 -0
- package/ui/js/MdBlocks.js +437 -0
- package/ui/js/MdBreak.js +71 -0
- package/ui/js/MdChunks.js +70 -0
- package/ui/js/MdContainer.js +137 -0
- package/ui/js/MdDocument.js +337 -0
- package/ui/js/MdEmph.js +97 -0
- package/ui/js/MdEntity.js +108 -0
- package/ui/js/MdEntityTable.js +223 -0
- package/ui/js/MdEscape.js +59 -0
- package/ui/js/MdFront.js +37 -0
- package/ui/js/MdHold.js +32 -0
- package/ui/js/MdHtml.js +307 -0
- package/ui/js/MdHtmlBlock.js +290 -0
- package/ui/js/MdHtmlHeading.js +53 -0
- package/ui/js/MdHtmlImage.js +179 -0
- package/ui/js/MdInline.js +154 -0
- package/ui/js/MdItems.js +212 -0
- package/ui/js/MdLeaf.js +309 -0
- package/ui/js/MdLink.js +196 -0
- package/ui/js/MdMath.js +67 -0
- package/ui/js/MdParagraphs.js +138 -0
- package/ui/js/MdRefs.js +232 -0
- package/ui/js/MdResolve.js +226 -0
- package/ui/js/MdRun.js +300 -0
- package/ui/js/MdUrl.js +226 -0
- package/ui/js/Menu.js +514 -0
- package/ui/js/MenuContext.js +85 -0
- package/ui/js/MenuFit.js +13 -0
- package/ui/js/MenuRefresh.js +74 -0
- package/ui/js/MenuWheel.js +35 -0
- package/ui/js/Messages.js +186 -0
- package/ui/js/Motion.js +16 -0
- package/ui/js/Mounts.js +320 -0
- package/ui/js/MouseNav.js +13 -0
- package/ui/js/Nav.js +329 -0
- package/ui/js/NetFs.js +26 -0
- package/ui/js/OpenWith.js +83 -0
- package/ui/js/Ops.js +585 -0
- package/ui/js/Palette.js +33 -0
- package/ui/js/PathBar.js +260 -0
- package/ui/js/Permissions.js +179 -0
- package/ui/js/Phones.js +112 -0
- package/ui/js/Picker.js +353 -0
- package/ui/js/PlaceMenu.js +96 -0
- package/ui/js/Places.js +265 -0
- package/ui/js/PreviewAsk.js +21 -0
- package/ui/js/PreviewKeys.js +155 -0
- package/ui/js/PreviewSettle.js +29 -0
- package/ui/js/PreviewSwap.js +101 -0
- package/ui/js/PropertyFacts.js +144 -0
- package/ui/js/Protocols.js +296 -0
- package/ui/js/QuickLookKinds.js +27 -0
- package/ui/js/QuickLookRect.js +24 -0
- package/ui/js/RailDrop.js +51 -0
- package/ui/js/RailKeys.js +87 -0
- package/ui/js/RailMenu.js +133 -0
- package/ui/js/Recent.js +135 -0
- package/ui/js/RecentMode.js +156 -0
- package/ui/js/Reload.js +60 -0
- package/ui/js/Renderer.js +9 -0
- package/ui/js/RunFile.js +143 -0
- package/ui/js/Scripts.js +28 -0
- package/ui/js/Scroll.js +304 -0
- package/ui/js/ScrollOff.js +69 -0
- package/ui/js/Search.js +478 -0
- package/ui/js/Selection.js +97 -0
- package/ui/js/Settings.js +476 -0
- package/ui/js/SettingsAbout.js +97 -0
- package/ui/js/SettingsShelf.js +52 -0
- package/ui/js/SheetKeys.js +42 -0
- package/ui/js/SheetQuery.js +281 -0
- package/ui/js/ShelfPile.js +27 -0
- package/ui/js/SlowClick.js +53 -0
- package/ui/js/SlowOp.js +6 -0
- package/ui/js/Sort.js +134 -0
- package/ui/js/Startup.js +63 -0
- package/ui/js/StateWords.js +17 -0
- package/ui/js/Status.js +238 -0
- package/ui/js/Swap.js +166 -0
- package/ui/js/TabMove.js +39 -0
- package/ui/js/Tabs.js +751 -0
- package/ui/js/Tags.js +134 -0
- package/ui/js/Taildrop.js +128 -0
- package/ui/js/Tap.js +180 -0
- package/ui/js/TextSize.js +107 -0
- package/ui/js/Thumbs.js +158 -0
- package/ui/js/Transfer.js +172 -0
- package/ui/js/Trash.js +84 -0
- package/ui/js/TrashDates.js +47 -0
- package/ui/js/TrashDrop.js +64 -0
- package/ui/js/UiState.js +438 -0
- package/ui/js/Unlock.js +152 -0
- package/ui/js/Update.js +130 -0
- package/ui/js/UserDirs.js +56 -0
- package/ui/qmldir +230 -0
package/ui/js/Scroll.js
ADDED
|
@@ -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
|
+
}
|