flea-qml 0.0.0-stage → 0.1.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 +478 -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 +402 -0
- package/src/archiveops.js +697 -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 +129 -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/transfer.js +669 -0
- package/src/trash-record.js +41 -0
- package/src/trash.js +210 -0
- package/src/trashbrowse.js +326 -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 +241 -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-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-html-security.mjs +23 -0
- package/test/manual-html-ui.mjs +30 -0
- package/test/manual-syntax-preview.mjs +26 -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 +68 -0
- package/ui/ArchiveCompressDialog.qml +378 -0
- package/ui/ArchivePasswordDialog.qml +257 -0
- package/ui/Backend.qml +771 -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 +523 -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 +115 -0
- package/ui/Pane.qml +1296 -0
- package/ui/PaneMenuActions.qml +527 -0
- package/ui/PanePath.qml +90 -0
- package/ui/PaneRail.qml +239 -0
- package/ui/PaneStates.qml +88 -0
- package/ui/PaneSwap.qml +339 -0
- package/ui/PaneWire.qml +605 -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 +1004 -0
- package/ui/PreviewAnimation.qml +24 -0
- package/ui/PreviewArchive.qml +66 -0
- package/ui/PreviewColumn.qml +551 -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 +38 -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 +732 -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/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 +827 -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 +122 -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 +364 -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 +502 -0
- package/ui/js/FolderSorts.js +108 -0
- package/ui/js/FolderViews.js +44 -0
- package/ui/js/Format.js +305 -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 +736 -0
- package/ui/js/Tags.js +134 -0
- package/ui/js/Taildrop.js +128 -0
- package/ui/js/Tap.js +174 -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 +81 -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 +228 -0
package/ui/LocalSend.qml
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
|
|
3
|
+
// Directive 71: the menu's LocalSend row is the Taildrop row's twin, so this is ui/Taildrop.qml's
|
|
4
|
+
// shape for the other one: the only thing here that knows about LocalSend, with ui/ContextMenu.qml
|
|
5
|
+
// reading "peers" and rendering it. The work itself is the backend's, which drives localsend-cli on
|
|
6
|
+
// a pty of its own; nothing here ever opens the LocalSend app.
|
|
7
|
+
Item {
|
|
8
|
+
id: root
|
|
9
|
+
|
|
10
|
+
property var backend: null
|
|
11
|
+
// [{id, label}], the devices the CLI discovered, named the way their own owners named them.
|
|
12
|
+
property var peers: []
|
|
13
|
+
property string reason: "checking"
|
|
14
|
+
property bool checking: false
|
|
15
|
+
// Whether this install has answered once: until then a look in flight dims the row, afterwards the last answer stands.
|
|
16
|
+
property bool answeredOnce: false
|
|
17
|
+
signal refreshed()
|
|
18
|
+
signal completed(bool ok, string reason)
|
|
19
|
+
|
|
20
|
+
// The list is asked for when a menu opens, and kept while it is warm: discovery costs a CLI run
|
|
21
|
+
// of over a second, and a right click is not a reason to announce this box on the LAN again.
|
|
22
|
+
readonly property int warmMs: 15000
|
|
23
|
+
property double _askedAt: 0
|
|
24
|
+
|
|
25
|
+
function refresh(installed) {
|
|
26
|
+
if (!installed) {
|
|
27
|
+
root.peers = []
|
|
28
|
+
root.answeredOnce = false
|
|
29
|
+
root.reason = "localsend-cli is not installed"
|
|
30
|
+
return true
|
|
31
|
+
}
|
|
32
|
+
if (root.checking) return false
|
|
33
|
+
if (root._askedAt > 0 && Date.now() - root._askedAt < root.warmMs) return true
|
|
34
|
+
root.checking = true
|
|
35
|
+
root.backend.localSend("peers", "", [])
|
|
36
|
+
return true
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function send(peer, paths) {
|
|
40
|
+
if (!peer || paths.length === 0) return false
|
|
41
|
+
root.backend.localSend("send", peer, paths)
|
|
42
|
+
return true
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function answered(list, why) {
|
|
46
|
+
root._askedAt = Date.now()
|
|
47
|
+
root.checking = false
|
|
48
|
+
root.answeredOnce = true
|
|
49
|
+
var rows = []
|
|
50
|
+
for (var i = 0; i < list.length; i++)
|
|
51
|
+
rows.push({ id: String(list[i].name), label: String(list[i].name) })
|
|
52
|
+
root.peers = rows
|
|
53
|
+
root.reason = why
|
|
54
|
+
root.refreshed()
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
import QtQuick.Shapes
|
|
3
|
+
import qs.Commons
|
|
4
|
+
|
|
5
|
+
// The LocalSend mark, reproduced from the official artwork rather than recut, the same ruling that
|
|
6
|
+
// brought TailscaleMark and DropboxMark back: a solid disc inside a ring of eight dashes, monochrome
|
|
7
|
+
// and palette-tinted, no brand teal. Outside the cut and outside Glyph.qml, where FleaMark sits.
|
|
8
|
+
Item {
|
|
9
|
+
id: root
|
|
10
|
+
|
|
11
|
+
// The type scale, not the slot, and clamped so a reproduction can never out-size the cut glyph
|
|
12
|
+
// beside it. A smaller caller slot still wins, the way Glyph's own min() lets it.
|
|
13
|
+
property real iconSize: Theme.markSize
|
|
14
|
+
property color color: "transparent"
|
|
15
|
+
|
|
16
|
+
// Measured off docs/design/flea-shelf/export/localsend-96.png at alpha 128: the disc ends at
|
|
17
|
+
// 20 px, the dash band runs 31.25 to 36.25 px, and the ink is eight runs of 31 degrees whose
|
|
18
|
+
// centres are 45 degrees apart. The logo's own ink box is 72.5 px of that 96 px file, and this
|
|
19
|
+
// mark fills its slot rather than keeping the file's padding, which is the AdGuard lesson, so
|
|
20
|
+
// every fraction below is of that ink box.
|
|
21
|
+
readonly property real discRadius: 0.276
|
|
22
|
+
readonly property real ringRadius: 0.466
|
|
23
|
+
readonly property real dashStroke: 0.069
|
|
24
|
+
// Round ends add half the stroke beyond each arc, which is what turns the 22.5 degrees drawn
|
|
25
|
+
// here into the 31 degrees of ink the artwork shows.
|
|
26
|
+
readonly property real dashArc: 22.5
|
|
27
|
+
readonly property int dashes: 8
|
|
28
|
+
|
|
29
|
+
readonly property real drawn: Math.min(Theme.markSize, root.iconSize)
|
|
30
|
+
|
|
31
|
+
implicitWidth: root.drawn
|
|
32
|
+
implicitHeight: root.drawn
|
|
33
|
+
width: root.drawn
|
|
34
|
+
height: root.drawn
|
|
35
|
+
|
|
36
|
+
// All eight arcs in one path string: a ShapePath is not an Item, so a Repeater cannot make them.
|
|
37
|
+
readonly property string ring: {
|
|
38
|
+
var centre = root.drawn / 2
|
|
39
|
+
var radius = root.ringRadius * root.drawn
|
|
40
|
+
var half = root.dashArc / 2
|
|
41
|
+
var out = ""
|
|
42
|
+
for (var i = 0; i < root.dashes; i++) {
|
|
43
|
+
var from = (i * 360 / root.dashes - half) * Math.PI / 180
|
|
44
|
+
var to = (i * 360 / root.dashes + half) * Math.PI / 180
|
|
45
|
+
out += "M " + (centre + radius * Math.cos(from)) + " " + (centre + radius * Math.sin(from))
|
|
46
|
+
+ " A " + radius + " " + radius + " 0 0 1 "
|
|
47
|
+
+ (centre + radius * Math.cos(to)) + " " + (centre + radius * Math.sin(to)) + " "
|
|
48
|
+
}
|
|
49
|
+
return out
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
Rectangle {
|
|
53
|
+
anchors.centerIn: parent
|
|
54
|
+
width: 2 * root.discRadius * root.drawn
|
|
55
|
+
height: width
|
|
56
|
+
radius: width / 2
|
|
57
|
+
color: root.color
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
Shape {
|
|
61
|
+
anchors.fill: parent
|
|
62
|
+
preferredRendererType: Shape.CurveRenderer
|
|
63
|
+
|
|
64
|
+
ShapePath {
|
|
65
|
+
fillColor: "transparent"
|
|
66
|
+
strokeColor: root.color
|
|
67
|
+
strokeWidth: root.dashStroke * root.drawn
|
|
68
|
+
capStyle: ShapePath.RoundCap
|
|
69
|
+
|
|
70
|
+
PathSvg { path: root.ring }
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
import "." as Flea
|
|
3
|
+
import "js/CodeRuns.js" as CodeRuns
|
|
4
|
+
import "js/Markdown.js" as Markdown
|
|
5
|
+
import "js/MdHtmlImage.js" as HtmlImage
|
|
6
|
+
|
|
7
|
+
// One Markdown block, built as the one kind it is, at the top of the document or inside an item or a quote.
|
|
8
|
+
Item {
|
|
9
|
+
id: view
|
|
10
|
+
|
|
11
|
+
property var block: ({})
|
|
12
|
+
property int blockIndex: -1
|
|
13
|
+
// How many blocks the list holding this one has, so the last one knows nothing follows it.
|
|
14
|
+
property int blockCount: 0
|
|
15
|
+
// The preview that sets the document's sizes and colours.
|
|
16
|
+
property Item preview: null
|
|
17
|
+
// Only a figure intersecting the viewport may send a render request.
|
|
18
|
+
property bool inView: true
|
|
19
|
+
|
|
20
|
+
// The drawn run text this view built, else null for any other kind or a maths run.
|
|
21
|
+
readonly property Item runText: view.block.type === "run" && view.block.maths === undefined ? (kind.item as Item) : null
|
|
22
|
+
// A picture followed by a picture block sits at the list spacing; a picture followed by text keeps the block gap, so what follows never touches it.
|
|
23
|
+
readonly property bool nextIsPicture: view.nextBlock !== null && view.nextBlock !== undefined && (view.nextBlock.type === "image" || view.nextBlock.type === "images" || view.nextBlock.type === "remote" || view.nextBlock.type === "figure")
|
|
24
|
+
readonly property int pictureGap: (view.block.type === "images" || view.block.type === "image") && view.blockIndex < view.blockCount - 1 && !view.nextIsPicture ? view.preview.blockGap : 0
|
|
25
|
+
// The blocks beside this one in the list that holds it: the document's list at the top, the item's or quote's parts inside one.
|
|
26
|
+
property var siblings: null
|
|
27
|
+
// The block after this one in the same list, which decides whether a picture keeps the block gap.
|
|
28
|
+
readonly property var neighbourList: view.siblings !== null ? view.siblings : (view.preview !== null ? view.preview.blockList : null)
|
|
29
|
+
readonly property var nextBlock: neighbourList === null || neighbourList === undefined || view.blockIndex + 1 >= neighbourList.length
|
|
30
|
+
? null : neighbourList[view.blockIndex + 1]
|
|
31
|
+
// Only the drawn block lends its height, and a list or table chunk lies flush by its own negative y.
|
|
32
|
+
height: kind.item ? kind.item.height + kind.item.y + view.pictureGap : 0
|
|
33
|
+
|
|
34
|
+
// A block builds only the parts its own kind draws, on the view; an empty heading or quote builds none, so it has no height.
|
|
35
|
+
Loader {
|
|
36
|
+
id: kind
|
|
37
|
+
sourceComponent: view.block.text === "" && view.block.parts === undefined && (view.block.type === "heading" || view.block.type === "quote") ? null : view.block.type === "run" && view.block.maths !== undefined ? mathsBlock
|
|
38
|
+
: view.block.type === "run" || view.block.type === "heading" ? textBlock
|
|
39
|
+
: view.block.type === "fence" ? fenceBlock
|
|
40
|
+
: view.block.type === "figure" ? figureBlock
|
|
41
|
+
: view.block.type === "quote" ? quoteBlock
|
|
42
|
+
: view.block.type === "remote" ? remoteBlock
|
|
43
|
+
: view.block.type === "list" ? listBlock
|
|
44
|
+
: view.block.type === "table" ? tableBlock
|
|
45
|
+
: view.block.type === "images" ? imagesBlock : imageBlock
|
|
46
|
+
onLoaded: kind.item.parent = view
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Headings use the prescribed bold text size and line box.
|
|
50
|
+
Component {
|
|
51
|
+
id: textBlock
|
|
52
|
+
Flea.MarkdownText {
|
|
53
|
+
linkGate: Markdown.isExternalLink
|
|
54
|
+
width: view.width
|
|
55
|
+
bodyPx: view.preview.bodyPx
|
|
56
|
+
markdown: view.block.text
|
|
57
|
+
font.pixelSize: view.block.type === "heading" ? view.preview.headingPx(view.block.level) : view.preview.bodyPx
|
|
58
|
+
font.bold: view.block.type === "heading"
|
|
59
|
+
// h1 and h2 take the bright foreground; deeper levels and body stay the foreground.
|
|
60
|
+
color: view.block.type === "heading" && view.block.level <= view.preview.boardHeadings.length ? Theme.color.foregroundBright : Theme.color.foreground
|
|
61
|
+
// An HTML heading keeps its align attribute; Markdown headings stay left.
|
|
62
|
+
horizontalAlignment: view.block.align === "center" ? Text.AlignHCenter : view.block.align === "right" ? Text.AlignRight : Text.AlignLeft
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// A run with inline formulas draws each in its line once the helper answers; the other runs build none of its parts.
|
|
67
|
+
Component {
|
|
68
|
+
id: mathsBlock
|
|
69
|
+
Flea.MarkdownMathsText {
|
|
70
|
+
objectName: "mathsText"
|
|
71
|
+
linkGate: Markdown.isExternalLink
|
|
72
|
+
width: view.width
|
|
73
|
+
bodyPx: view.preview.bodyPx
|
|
74
|
+
source: view.block.text
|
|
75
|
+
maths: view.block.maths
|
|
76
|
+
askArmed: view.preview.figuresArmed
|
|
77
|
+
inView: view.inView
|
|
78
|
+
bgHex: view.preview.hexOf(Theme.color.background)
|
|
79
|
+
fgHex: view.preview.inkHex
|
|
80
|
+
accentHex: view.preview.accentHex
|
|
81
|
+
mutedHex: view.preview.mutedHex
|
|
82
|
+
surfaceHex: view.preview.surfaceHex
|
|
83
|
+
fencePadX: view.preview.fencePadX
|
|
84
|
+
fencePadY: view.preview.fencePadY
|
|
85
|
+
font.pixelSize: view.preview.bodyPx
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
Component {
|
|
90
|
+
id: tableBlock
|
|
91
|
+
Flea.MarkdownTable {
|
|
92
|
+
block: view.block
|
|
93
|
+
preview: view.preview
|
|
94
|
+
availableWidth: view.width
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// A named fence takes engine colours after its reply; the escaped foreground text before it preserves its height.
|
|
99
|
+
Component {
|
|
100
|
+
id: fenceBlock
|
|
101
|
+
Rectangle {
|
|
102
|
+
id: fenceBox
|
|
103
|
+
objectName: "fenceBox"
|
|
104
|
+
width: view.width
|
|
105
|
+
height: fenceText.implicitHeight + 2 * view.preview.fencePadY
|
|
106
|
+
color: view.preview.codeSurface
|
|
107
|
+
readonly property string info: String(view.block.info || "").trim()
|
|
108
|
+
readonly property var backend: view.preview.backend
|
|
109
|
+
readonly property bool coloured: fenceBox.info !== "" && view.preview.shownView !== Markdown.SOURCE
|
|
110
|
+
&& fenceBox.backend !== null && typeof fenceBox.backend.askCode === "function"
|
|
111
|
+
// The one slot this fence asks on, handed out by the preview so no two fences share one.
|
|
112
|
+
property string slot: ""
|
|
113
|
+
property int token: 0
|
|
114
|
+
// The first 1-based line not yet answered, and the runs of each answered line.
|
|
115
|
+
property int next: 1
|
|
116
|
+
property var held: ({})
|
|
117
|
+
property int stamp: 0
|
|
118
|
+
// The engine refused this fence (binary, large or failed), so it stays in the foreground.
|
|
119
|
+
property bool refused: false
|
|
120
|
+
readonly property var fenceLines: view.block.text.split("\n")
|
|
121
|
+
readonly property int lineCap: 400
|
|
122
|
+
readonly property bool awaiting: fenceBox.coloured && !fenceBox.refused && fenceBox.next <= fenceBox.fenceLines.length
|
|
123
|
+
readonly property bool holdsScreen: fenceBox.awaiting && view.inView
|
|
124
|
+
readonly property string markup: {
|
|
125
|
+
if (fenceBox.stamp < 0)
|
|
126
|
+
return ""
|
|
127
|
+
var out = []
|
|
128
|
+
for (var i = 0; i < fenceBox.fenceLines.length; i++) {
|
|
129
|
+
var runs = fenceBox.held[i + 1]
|
|
130
|
+
out.push(CodeRuns.styled(runs !== undefined ? runs : [0, fenceBox.fenceLines[i]], view.preview.inks))
|
|
131
|
+
}
|
|
132
|
+
return out.join("<br>")
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function ask() {
|
|
136
|
+
if (fenceBox.slot === "" || !fenceBox.awaiting || fenceBox.token !== 0)
|
|
137
|
+
return
|
|
138
|
+
var count = Math.min(fenceBox.lineCap, fenceBox.fenceLines.length - fenceBox.next + 1)
|
|
139
|
+
fenceBox.token = fenceBox.backend.askCode(fenceBox.slot, { text: view.block.text, name: "", lang: fenceBox.info }, fenceBox.next, count)
|
|
140
|
+
}
|
|
141
|
+
function rebind() {
|
|
142
|
+
fenceBox.token = 0
|
|
143
|
+
fenceBox.held = {}
|
|
144
|
+
fenceBox.stamp += 1
|
|
145
|
+
fenceBox.next = 1
|
|
146
|
+
fenceBox.refused = false
|
|
147
|
+
Qt.callLater(fenceBox.ask)
|
|
148
|
+
}
|
|
149
|
+
onBackendChanged: fenceBox.rebind()
|
|
150
|
+
function answered(message) {
|
|
151
|
+
if (fenceBox.token === 0 || message.token !== fenceBox.token)
|
|
152
|
+
return
|
|
153
|
+
fenceBox.token = 0
|
|
154
|
+
var rows = message.lines || []
|
|
155
|
+
if ((message.state !== "styled" && message.state !== "plain") || rows.length === 0) {
|
|
156
|
+
fenceBox.refused = true
|
|
157
|
+
return
|
|
158
|
+
}
|
|
159
|
+
for (var i = 0; i < rows.length; i++)
|
|
160
|
+
fenceBox.held[fenceBox.next + i] = rows[i]
|
|
161
|
+
fenceBox.next += rows.length
|
|
162
|
+
fenceBox.stamp += 1
|
|
163
|
+
fenceBox.ask()
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// Only a viewport fence holds the first screen; tearing its block down releases that hold too.
|
|
167
|
+
property bool waiting: false
|
|
168
|
+
function setWaiting(on) {
|
|
169
|
+
if (on === fenceBox.waiting)
|
|
170
|
+
return
|
|
171
|
+
fenceBox.waiting = on
|
|
172
|
+
view.preview.fenceWaiting(on ? 1 : -1)
|
|
173
|
+
}
|
|
174
|
+
onHoldsScreenChanged: fenceBox.setWaiting(fenceBox.holdsScreen)
|
|
175
|
+
onAwaitingChanged: fenceBox.ask()
|
|
176
|
+
Component.onCompleted: {
|
|
177
|
+
fenceBox.slot = view.preview.fenceSlot(fenceBox)
|
|
178
|
+
fenceBox.setWaiting(fenceBox.holdsScreen)
|
|
179
|
+
if (fenceBox.awaiting)
|
|
180
|
+
fenceBox.ask()
|
|
181
|
+
}
|
|
182
|
+
Component.onDestruction: {
|
|
183
|
+
if (fenceBox.waiting) view.preview.fenceWaiting(-1)
|
|
184
|
+
delete view.preview.fenceReplies[fenceBox.slot]
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
Text {
|
|
188
|
+
id: fenceText
|
|
189
|
+
anchors.fill: parent
|
|
190
|
+
anchors.leftMargin: view.preview.fencePadX
|
|
191
|
+
anchors.rightMargin: view.preview.fencePadX
|
|
192
|
+
anchors.topMargin: view.preview.fencePadY
|
|
193
|
+
anchors.bottomMargin: view.preview.fencePadY
|
|
194
|
+
text: fenceBox.coloured ? fenceBox.markup : view.block.text
|
|
195
|
+
textFormat: fenceBox.coloured ? Text.StyledText : Text.PlainText
|
|
196
|
+
wrapMode: Text.Wrap
|
|
197
|
+
color: Theme.color.foreground
|
|
198
|
+
font.family: Theme.font.family
|
|
199
|
+
font.pixelSize: view.preview.bodyPx
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// Display maths use the figure fallback's vertical inset; the list owns the block gap.
|
|
205
|
+
Component {
|
|
206
|
+
id: figureBlock
|
|
207
|
+
Item {
|
|
208
|
+
id: figureBox
|
|
209
|
+
objectName: "figureBox"
|
|
210
|
+
width: view.width
|
|
211
|
+
readonly property int figureInset: figureItem.ready && figureItem.kind === "math" && figureItem.fitHeight > 0 ? Theme.spacing.gap : 0
|
|
212
|
+
height: figureItem.implicitHeight + 2 * figureInset
|
|
213
|
+
|
|
214
|
+
Flea.MarkdownFigure {
|
|
215
|
+
id: figureItem
|
|
216
|
+
objectName: "figureItem"
|
|
217
|
+
y: parent.figureInset
|
|
218
|
+
width: parent.width
|
|
219
|
+
kind: view.block.kind
|
|
220
|
+
source: view.block.source
|
|
221
|
+
display: true
|
|
222
|
+
askArmed: view.preview.figuresArmed
|
|
223
|
+
inView: view.inView
|
|
224
|
+
bgHex: view.preview.hexOf(Theme.color.background)
|
|
225
|
+
fgHex: view.preview.inkHex
|
|
226
|
+
accentHex: view.preview.accentHex
|
|
227
|
+
mutedHex: view.preview.mutedHex
|
|
228
|
+
surfaceHex: view.preview.surfaceHex
|
|
229
|
+
fallbackColor: view.preview.codeSurface
|
|
230
|
+
fencePadX: view.preview.fencePadX
|
|
231
|
+
fencePadY: view.preview.fencePadY
|
|
232
|
+
fontFamily: Theme.font.family
|
|
233
|
+
bodyPx: view.preview.bodyPx
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// A quote draws one bar per level, and a joined block sits flush under the one above so the outer bars run on.
|
|
239
|
+
Component {
|
|
240
|
+
id: quoteBlock
|
|
241
|
+
Flea.MarkdownQuote {
|
|
242
|
+
objectName: "quoteRow"
|
|
243
|
+
y: view.block.joined === true ? -view.preview.blockGap : 0
|
|
244
|
+
width: view.width
|
|
245
|
+
levels: view.block.depth !== undefined ? view.block.depth : 1
|
|
246
|
+
linkGate: Markdown.isExternalLink
|
|
247
|
+
bodyPx: view.preview.bodyPx
|
|
248
|
+
text: view.block.text
|
|
249
|
+
parts: view.block.parts !== undefined ? view.block.parts : []
|
|
250
|
+
preview: view.preview
|
|
251
|
+
inView: view.inView
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// A chunk after the first sits flush under its predecessor, across the gap the list puts between blocks.
|
|
256
|
+
Component {
|
|
257
|
+
id: listBlock
|
|
258
|
+
Flea.MarkdownList {
|
|
259
|
+
objectName: "listColumn"
|
|
260
|
+
y: view.block.joined === true ? -view.preview.blockGap : 0
|
|
261
|
+
width: view.width
|
|
262
|
+
list: view.block
|
|
263
|
+
gap: view.preview.blockGap
|
|
264
|
+
linkGate: Markdown.isExternalLink
|
|
265
|
+
bodyPx: view.preview.bodyPx
|
|
266
|
+
preview: view.preview
|
|
267
|
+
inView: view.inView
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
Component {
|
|
272
|
+
id: remoteBlock
|
|
273
|
+
Flea.MarkdownRemote {
|
|
274
|
+
width: view.width
|
|
275
|
+
host: view.block.host
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// A badge row builds only its own pictures, wrapped and aligned by the row itself.
|
|
280
|
+
Component {
|
|
281
|
+
id: imagesBlock
|
|
282
|
+
Flea.MarkdownImages {
|
|
283
|
+
width: view.width
|
|
284
|
+
images: view.block.type === "images" ? view.block.items : []
|
|
285
|
+
centred: view.block.type === "images" && view.block.align === "center"
|
|
286
|
+
gap: view.preview.blockGap
|
|
287
|
+
linkGate: Markdown.isExternalLink
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
Component {
|
|
292
|
+
id: imageBlock
|
|
293
|
+
Image {
|
|
294
|
+
id: localImage
|
|
295
|
+
// The size rule of the badge row (HtmlImage.pictureSize); its paragraph's align="center" centres it.
|
|
296
|
+
readonly property var fit: HtmlImage.pictureSize(view.block.type === "image" ? view.block : ({}), localImage.implicitWidth, localImage.implicitHeight, view.width)
|
|
297
|
+
width: localImage.fit.w
|
|
298
|
+
height: localImage.fit.h
|
|
299
|
+
x: view.block.type === "image" && view.block.align === "center" ? Math.round((view.width - localImage.width) / 2) : 0
|
|
300
|
+
fillMode: localImage.fit.stretch ? Image.Stretch : Image.PreserveAspectFit
|
|
301
|
+
visible: view.block.type === "image"
|
|
302
|
+
asynchronous: true
|
|
303
|
+
autoTransform: true
|
|
304
|
+
source: view.block.type === "image" ? view.block.url : ""
|
|
305
|
+
|
|
306
|
+
// A logo wrapped in a link opens it through the pane's link gate.
|
|
307
|
+
TapHandler { enabled: view.block.link !== undefined; gesturePolicy: TapHandler.ReleaseWithinBounds; onTapped: if (Markdown.isExternalLink(view.block.link)) Qt.openUrlExternally(view.block.link) }
|
|
308
|
+
HoverHandler { enabled: view.block.link !== undefined; cursorShape: Qt.PointingHandCursor }
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
|
|
3
|
+
// The blocks an item or a quote holds, in order, each drawn as its kind draws at the top of the document.
|
|
4
|
+
Column {
|
|
5
|
+
id: root
|
|
6
|
+
|
|
7
|
+
property var blocks: []
|
|
8
|
+
// The preview that sets the document's sizes and colours, and whether this part of it is in view for figures.
|
|
9
|
+
property Item preview: null
|
|
10
|
+
property bool inView: true
|
|
11
|
+
|
|
12
|
+
spacing: root.preview !== null ? root.preview.blockGap : 0
|
|
13
|
+
|
|
14
|
+
// The first block's view, tracked without one object per item.
|
|
15
|
+
property Item firstView: null
|
|
16
|
+
// The first block's run text, null unless that block is a plain run.
|
|
17
|
+
readonly property Item firstRunText: root.firstView !== null ? root.firstView.runText : null
|
|
18
|
+
|
|
19
|
+
Repeater {
|
|
20
|
+
onItemAdded: function (index, item) { if (index === 0) root.firstView = item }
|
|
21
|
+
onItemRemoved: function (index, item) { if (item === root.firstView) root.firstView = null }
|
|
22
|
+
model: root.blocks
|
|
23
|
+
delegate: MarkdownBlockView {
|
|
24
|
+
required property var modelData
|
|
25
|
+
required property int index
|
|
26
|
+
block: modelData
|
|
27
|
+
blockIndex: index
|
|
28
|
+
blockCount: root.blocks.length
|
|
29
|
+
siblings: root.blocks
|
|
30
|
+
preview: root.preview
|
|
31
|
+
inView: root.inView
|
|
32
|
+
width: root.width
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|