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