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/js/Facts.js
ADDED
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
.pragma library
|
|
2
|
+
|
|
3
|
+
.import "Format.js" as Format
|
|
4
|
+
.import "Icons.js" as Icons
|
|
5
|
+
.import "Kinds.js" as Kinds
|
|
6
|
+
|
|
7
|
+
// The preview column's twelve states and the facts each one states, taken row by row from the
|
|
8
|
+
// canvas's Preview column board. One anatomy for all twelve: a frame, an optional transport, the
|
|
9
|
+
// name, and this caption-type table under it.
|
|
10
|
+
|
|
11
|
+
// The state names live with the classification that produces them; these aliases keep every
|
|
12
|
+
// Facts.STATE call site working with one definition behind them.
|
|
13
|
+
var IMAGE = Kinds.IMAGE
|
|
14
|
+
var VIDEO = Kinds.VIDEO
|
|
15
|
+
var AUDIO = Kinds.AUDIO
|
|
16
|
+
var PDF = Kinds.PDF
|
|
17
|
+
var TEXT = Kinds.TEXT
|
|
18
|
+
var CODE = Kinds.CODE
|
|
19
|
+
var ARCHIVE = Kinds.ARCHIVE
|
|
20
|
+
var SYMLINK = Kinds.SYMLINK
|
|
21
|
+
var MULTI = Kinds.MULTI
|
|
22
|
+
var LOADING = Kinds.LOADING
|
|
23
|
+
var ERROR = Kinds.ERROR
|
|
24
|
+
var UNSUPPORTED = Kinds.UNSUPPORTED
|
|
25
|
+
var UNKNOWN_KIND = Kinds.UNKNOWN_KIND
|
|
26
|
+
|
|
27
|
+
// The three that outrank what the row is: a multi-selection has no single row to describe, an error
|
|
28
|
+
// has nothing to read, and a preview still arriving has nothing yet.
|
|
29
|
+
function state(row, selectionCount, loading, errorText, kindName) {
|
|
30
|
+
if (selectionCount > 1) {
|
|
31
|
+
return MULTI
|
|
32
|
+
}
|
|
33
|
+
// A row cleared by a move is still loading, which the column draws rather than a file with no preview.
|
|
34
|
+
if (!row) {
|
|
35
|
+
return loading ? LOADING : UNSUPPORTED
|
|
36
|
+
}
|
|
37
|
+
if (errorText && errorText.length > 0) {
|
|
38
|
+
return ERROR
|
|
39
|
+
}
|
|
40
|
+
if (loading) {
|
|
41
|
+
return LOADING
|
|
42
|
+
}
|
|
43
|
+
if (Format.isSymlink(row.p)) {
|
|
44
|
+
return SYMLINK
|
|
45
|
+
}
|
|
46
|
+
// The backend's icon ladder falls a name it cannot identify all the way to text-x-generic, but
|
|
47
|
+
// its Kind says the truth: UNKNOWN_KIND, which is "Data". Such a row is not text, it is a type
|
|
48
|
+
// nothing recognised, and that is the canvas's Unsupported tile (its own example is core.dump).
|
|
49
|
+
if (kindName === UNKNOWN_KIND) {
|
|
50
|
+
return UNSUPPORTED
|
|
51
|
+
}
|
|
52
|
+
// A name the icon cannot route is told apart by its own extension, the way an archive is.
|
|
53
|
+
var ext = Kinds.stateByExtension(row.n)
|
|
54
|
+
if (ext) return ext
|
|
55
|
+
// A markdown file shares the office icon with a PDF and a .doc, and the canvas's Text tile is a
|
|
56
|
+
// .md, so the suffix is the only thing that can route it to the text frame.
|
|
57
|
+
if (Kinds.isMarkdown(row.n)) {
|
|
58
|
+
return TEXT
|
|
59
|
+
}
|
|
60
|
+
var byIcon = Kinds.kindState(row.i)
|
|
61
|
+
// Only a row the icon already called text can be promoted to code; an image named .css is not code.
|
|
62
|
+
if (byIcon === TEXT && Kinds.isCode(row.n)) {
|
|
63
|
+
return CODE
|
|
64
|
+
}
|
|
65
|
+
return byIcon
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// The backend's icon for a source file is inconsistent (text-x-script for .js and .sh, plain
|
|
69
|
+
// text-x-generic for .rs, .py, .c and .go), so code is told apart by its own extension, the same way
|
|
70
|
+
// an archive and a PDF are. Anything not listed reads as text, which draws no gutter and is the safe
|
|
71
|
+
// default: a wrong gutter is worse than a missing one.
|
|
72
|
+
|
|
73
|
+
function pair(label, value) {
|
|
74
|
+
return { label: label, value: value }
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// HANDOFF rule 19: a label with no value is not drawn. Every surface here already refuses to invent
|
|
78
|
+
// a value, so the row goes rather than printing a label with nothing after it.
|
|
79
|
+
function filled(rows) {
|
|
80
|
+
var out = []
|
|
81
|
+
for (var i = 0; i < rows.length; i++) {
|
|
82
|
+
if (rows[i].value !== undefined && rows[i].value !== null && String(rows[i].value).length > 0) {
|
|
83
|
+
out.push(rows[i])
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return out
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// A count the backend had to stop early is a floor, marked the way a partial directory size is.
|
|
90
|
+
function lineCount(meta) {
|
|
91
|
+
// A file the backend could not open has no count at all, and its zero would print as "Lines: 0".
|
|
92
|
+
if (!meta || meta.linesFailed || meta.lines === undefined || meta.lines === null) {
|
|
93
|
+
return ""
|
|
94
|
+
}
|
|
95
|
+
return (meta.partial ? "> " : "") + Format.count(meta.lines)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// A frame header's size wins; a camera RAW has none, so the sensor size in its photo facts stands in.
|
|
99
|
+
function pixels(meta) {
|
|
100
|
+
var size = meta && meta.w && meta.h ? meta : (meta && meta.photo ? meta.photo : null)
|
|
101
|
+
return size && size.w && size.h ? "%1 × %2".arg(size.w).arg(size.h) : ""
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function tenths(value) {
|
|
105
|
+
return String(Math.round(value * 10) / 10)
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Sample input: a numerator and denominator as [1, 250]; zero on either side is no value.
|
|
109
|
+
function ratio(pair) {
|
|
110
|
+
return pair && pair[0] > 0 && pair[1] > 0 ? pair[0] / pair[1] : 0
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Sample input, the backend's photo object: {make, model, lens, exp: [1, 250], fnum: [28, 10], iso: 400, focal: [35, 1], taken: "2026:09:12 18:31:00"}.
|
|
114
|
+
// Answers the five worded facts; an absent one is an empty string, which draws no row.
|
|
115
|
+
function photoFacts(photo) {
|
|
116
|
+
var p = photo || {}
|
|
117
|
+
var seconds = ratio(p.exp)
|
|
118
|
+
var parts = []
|
|
119
|
+
if (seconds > 0) {
|
|
120
|
+
// The way a camera shows it: 1/N under 0.3 s, one-place seconds from there on.
|
|
121
|
+
parts.push(seconds < 0.3 ? "1/%1 s".arg(Math.round(p.exp[1] / p.exp[0])) : "%1 s".arg(tenths(seconds)))
|
|
122
|
+
}
|
|
123
|
+
if (ratio(p.fnum) > 0) {
|
|
124
|
+
parts.push("f/%1".arg(tenths(ratio(p.fnum))))
|
|
125
|
+
}
|
|
126
|
+
if (p.iso > 0) {
|
|
127
|
+
parts.push("ISO %1".arg(p.iso))
|
|
128
|
+
}
|
|
129
|
+
var make = p.make || ""
|
|
130
|
+
var model = p.model || ""
|
|
131
|
+
var owned = make.length > 0 && model.toLowerCase().indexOf(make.split(" ")[0].toLowerCase()) === 0
|
|
132
|
+
var stamp = /^(\d{4}):(\d\d):(\d\d) (\d\d):(\d\d)/.exec(p.taken || "")
|
|
133
|
+
return {
|
|
134
|
+
camera: owned || !make ? model : (model ? "%1 %2".arg(make).arg(model) : make),
|
|
135
|
+
lens: p.lens || "",
|
|
136
|
+
exposure: parts.join(FACT_SEP),
|
|
137
|
+
focal: ratio(p.focal) > 0 ? "%1 mm".arg(Math.round(ratio(p.focal))) : "",
|
|
138
|
+
taken: stamp && stamp[1] !== "0000" ? "%1-%2-%3 %4:%5".arg(stamp[1]).arg(stamp[2]).arg(stamp[3]).arg(stamp[4]).arg(stamp[5]) : ""
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// An animated GIF's frame count; a still picture, or a GIF whose walk found no count, states none.
|
|
143
|
+
function frames(meta) {
|
|
144
|
+
return meta && meta.frames > 1 ? String(meta.frames) : ""
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Duration and rate come off the same meta answer as pixels do, so no caller assembles them by hand.
|
|
148
|
+
function mediaExtra(meta) {
|
|
149
|
+
if (!meta) {
|
|
150
|
+
return {}
|
|
151
|
+
}
|
|
152
|
+
return {
|
|
153
|
+
duration: meta.durationMs > 0 ? Format.duration(meta.durationMs) : "",
|
|
154
|
+
rate: Format.sampleRate(meta.sampleRate)
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// Entries and the unpacked total come off the same meta answer, read from the archive's own index.
|
|
159
|
+
// Both are exact whenever they are non-zero: a read that failed or ran out of time sends zero and
|
|
160
|
+
// sets afailed, so a partial count never reaches this table.
|
|
161
|
+
function archiveExtra(meta) {
|
|
162
|
+
if (!meta || !meta.entries) {
|
|
163
|
+
return {}
|
|
164
|
+
}
|
|
165
|
+
return {
|
|
166
|
+
entries: Format.count(meta.entries),
|
|
167
|
+
unpacked: meta.unpacked > 0 ? Format.size(meta.unpacked) : ""
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
var FACT_SEP = " \u00b7 "
|
|
172
|
+
|
|
173
|
+
// "214 entries · 3.4 GB unpacked", the Quick Look's one line under an archive's name; the column
|
|
174
|
+
// states the same two facts as table rows, and an index that failed or is still arriving states nothing.
|
|
175
|
+
function archiveLine(meta) {
|
|
176
|
+
var a = archiveExtra(meta)
|
|
177
|
+
if (!a.entries) {
|
|
178
|
+
// An index that read cleanly and holds nothing is still a fact; a failed or absent one is not.
|
|
179
|
+
return meta && meta.archiveFailed !== true && meta.entries === 0 ? "0 entries" : ""
|
|
180
|
+
}
|
|
181
|
+
var noun = a.entries === "1" ? " entry" : " entries"
|
|
182
|
+
return a.unpacked ? a.entries + noun + FACT_SEP + a.unpacked + " unpacked" : a.entries + noun
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// The rows the Archive tile lists above its "+ N more" line, which is the only place a name from
|
|
186
|
+
// inside an archive is ever drawn. shown is how many the frame has room for, so the list is bounded
|
|
187
|
+
// twice: by what the wire carried and by what the frame can draw.
|
|
188
|
+
function archiveEntries(meta, shown) {
|
|
189
|
+
if (!meta || !meta.names) {
|
|
190
|
+
return []
|
|
191
|
+
}
|
|
192
|
+
return shown === undefined ? meta.names : meta.names.slice(0, Math.max(0, shown))
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// What the canvas puts under the listed rows: every entry the frame did not name, whether the wire
|
|
196
|
+
// left it out or the frame had no room for it.
|
|
197
|
+
function archiveMore(meta, shown) {
|
|
198
|
+
if (!meta || !meta.entries || !meta.names) {
|
|
199
|
+
return 0
|
|
200
|
+
}
|
|
201
|
+
return Math.max(0, meta.entries - archiveEntries(meta, shown).length)
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// TallPreviews: the kinds whose frame fills the column down to the name, by the row's kind and never its load state.
|
|
205
|
+
var TALL_STATES = [TEXT, CODE, ARCHIVE, PDF]
|
|
206
|
+
|
|
207
|
+
function tall(st) {
|
|
208
|
+
return TALL_STATES.indexOf(st) >= 0
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// The tall frame is the column less its margins, the name, the facts and the two gaps between them.
|
|
212
|
+
function tallHeight(columnHeight, margin, nameHeight, factsHeight, gap) {
|
|
213
|
+
return Math.max(0, columnHeight - 2 * margin - nameHeight - factsHeight - 2 * gap)
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
var COMPACT_LINE = "%1 \u00b7 %2 \u00b7 %3"
|
|
217
|
+
var COMPACT_BARE = "%1 \u00b7 %2"
|
|
218
|
+
var LEADING_SEPARATOR = /^ \u00b7 /
|
|
219
|
+
var LINES_ONE = "1 line"
|
|
220
|
+
var LINES_MANY = "%1 lines"
|
|
221
|
+
var ENTRIES_ONE = "1 entry"
|
|
222
|
+
var ENTRIES_MANY = "%1 entries"
|
|
223
|
+
var PAGES_ONE = "1 page"
|
|
224
|
+
var PAGES_MANY = "%1 pages"
|
|
225
|
+
|
|
226
|
+
// One pass, so a value that looks like a placeholder is kept whole.
|
|
227
|
+
function fill(template, values) {
|
|
228
|
+
return template.replace(/%(\d)/g, function (whole, place) { return values[place - 1] })
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// "132 lines", "214 entries" or "12 pages"; nothing while the count is not known, and a floor keeps its mark.
|
|
232
|
+
function compactCount(st, meta, extra) {
|
|
233
|
+
if (st === PDF) {
|
|
234
|
+
var pages = Number(extra && extra.pages)
|
|
235
|
+
return pages === 1 ? PAGES_ONE : pages > 1 ? fill(PAGES_MANY, [Format.count(pages)]) : ""
|
|
236
|
+
}
|
|
237
|
+
if (st === ARCHIVE) {
|
|
238
|
+
if (!meta || meta.archiveFailed === true || meta.entries === undefined) {
|
|
239
|
+
return ""
|
|
240
|
+
}
|
|
241
|
+
return meta.entries === 1 ? ENTRIES_ONE : fill(ENTRIES_MANY, [Format.count(meta.entries)])
|
|
242
|
+
}
|
|
243
|
+
var shown = lineCount(meta)
|
|
244
|
+
if (shown.length === 0) {
|
|
245
|
+
return ""
|
|
246
|
+
}
|
|
247
|
+
return meta.lines === 1 && !meta.partial ? LINES_ONE : fill(LINES_MANY, [shown])
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// The tall kinds' one facts line, the Kind then the size then the count; the Kind comes apart from the tail so the Kind alone can elide.
|
|
251
|
+
function compactLine(st, row, meta, kindName, extra) {
|
|
252
|
+
if (!row) {
|
|
253
|
+
return { kind: "", tail: "" }
|
|
254
|
+
}
|
|
255
|
+
var count = compactCount(st, meta, extra)
|
|
256
|
+
var line = fill(count ? COMPACT_LINE : COMPACT_BARE, [kindName, Format.size(row.s), count])
|
|
257
|
+
var tail = line.substring(kindName.length)
|
|
258
|
+
return { kind: kindName, tail: kindName ? tail : tail.replace(LEADING_SEPARATOR, "") }
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// The rows the canvas draws for each state, in its own order, with the labels it uses verbatim.
|
|
262
|
+
function facts(st, row, meta, kindName, extra) {
|
|
263
|
+
return filled(stateRows(st, row, meta, kindName, extra))
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
function stateRows(st, row, meta, kindName, extra) {
|
|
267
|
+
// A caller's own value wins; the probe fills only the two fields it did not supply.
|
|
268
|
+
var e = extra || {}
|
|
269
|
+
if (st === VIDEO || st === AUDIO) {
|
|
270
|
+
var m = mediaExtra(meta)
|
|
271
|
+
e = Object.assign({}, e, { duration: e.duration || m.duration, rate: e.rate || m.rate })
|
|
272
|
+
} else if (st === ARCHIVE) {
|
|
273
|
+
var a = archiveExtra(meta)
|
|
274
|
+
e = Object.assign({}, e, { entries: e.entries || a.entries, unpacked: e.unpacked || a.unpacked })
|
|
275
|
+
}
|
|
276
|
+
// The three rows every ordinary settled kind opens with, so a second selection lands each answer on the line the first one used; Preview board rule 1.
|
|
277
|
+
var head = [pair("Kind", kindName), pair("Size", Format.size(row.s)),
|
|
278
|
+
pair("Modified", Format.date(row.m))]
|
|
279
|
+
switch (st) {
|
|
280
|
+
case IMAGE:
|
|
281
|
+
// Raw.html: a camera file's EXIF facts sit between Modified and Pixels, and Taken closes the table.
|
|
282
|
+
var photo = photoFacts(meta && meta.photo)
|
|
283
|
+
return head.concat([pair("Camera", photo.camera), pair("Lens", photo.lens), pair("Exposure", photo.exposure),
|
|
284
|
+
pair("Focal", photo.focal), pair("Pixels", pixels(meta)), pair("Frames", frames(meta)), pair("Taken", photo.taken)])
|
|
285
|
+
case VIDEO:
|
|
286
|
+
return head.concat([pair("Duration", e.duration || ""), pair("Pixels", pixels(meta))])
|
|
287
|
+
case AUDIO:
|
|
288
|
+
return head.concat([pair("Duration", e.duration || ""), pair("Rate", e.rate || "")])
|
|
289
|
+
case PDF:
|
|
290
|
+
return head.concat([pair("Pages", e.pages || "")])
|
|
291
|
+
case TEXT:
|
|
292
|
+
return head.concat([pair("Lines", lineCount(meta))])
|
|
293
|
+
// Mode stays: columns view has no permission column, so dropping it here would remove it.
|
|
294
|
+
case CODE:
|
|
295
|
+
return head.concat([pair("Lines", lineCount(meta)), pair("Mode", Format.permissions(row.p))])
|
|
296
|
+
case ARCHIVE:
|
|
297
|
+
return head.concat([pair("Entries", archiveFact(e))])
|
|
298
|
+
case SYMLINK:
|
|
299
|
+
return [pair("Kind", "Symbolic link"), pair("Target", meta ? meta.target : ""),
|
|
300
|
+
pair("Points at", meta && meta.targetDir ? "Folder" : "File"),
|
|
301
|
+
pair("Mode", Format.permissions(row.p))]
|
|
302
|
+
case LOADING:
|
|
303
|
+
return [pair("Kind", kindName), pair("Size", Format.size(row.s)), pair("State", "loading")]
|
|
304
|
+
case ERROR:
|
|
305
|
+
return [pair("Kind", kindName), pair("Size", Format.size(row.s)),
|
|
306
|
+
pair("Mode", Format.permissions(row.p)), pair("Owner", e.owner || "")]
|
|
307
|
+
}
|
|
308
|
+
// Unsupported, which is also where a kind whose facts are a later plan lands until it arrives.
|
|
309
|
+
return head.concat([pair("Mode", Format.permissions(row.p))])
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
// The archive's one kind fact, the board's "3, 240.8 kB out": Size already says what it weighs packed.
|
|
313
|
+
function archiveFact(e) {
|
|
314
|
+
if (!e.entries) return ""
|
|
315
|
+
return e.unpacked ? e.entries + ", " + e.unpacked + " out" : String(e.entries)
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
// The multi-selection summary, which is a summary and never a collage: counts and a combined size.
|
|
319
|
+
// selectionCount is the true size of the selection; rows is only what the held window actually
|
|
320
|
+
// carries. A selection wider than that window cannot be summed without a metadata sweep, which this
|
|
321
|
+
// codebase refuses everywhere, so the numbers become floors and say so rather than undercounting.
|
|
322
|
+
function multiFacts(rows, selectionCount) {
|
|
323
|
+
var groups = kindGroups(rows)
|
|
324
|
+
var bytes = 0
|
|
325
|
+
var newest = 0
|
|
326
|
+
var oldest = 0
|
|
327
|
+
var counted = 0
|
|
328
|
+
for (var i = 0; i < rows.length; i++) {
|
|
329
|
+
var r = rows[i]
|
|
330
|
+
if (!r) {
|
|
331
|
+
continue
|
|
332
|
+
}
|
|
333
|
+
counted++
|
|
334
|
+
bytes += r.s
|
|
335
|
+
if (newest === 0 || r.m > newest) { newest = r.m }
|
|
336
|
+
if (oldest === 0 || r.m < oldest) { oldest = r.m }
|
|
337
|
+
}
|
|
338
|
+
var floor = (selectionCount !== undefined && selectionCount > counted) ? "> " : ""
|
|
339
|
+
return filled([pair("Kinds", kindSummary(groups, floor)), pair("Combined", floor + Format.size(bytes)),
|
|
340
|
+
pair("Newest", newest > 0 ? floor + Format.date(newest) : ""),
|
|
341
|
+
pair("Oldest", oldest > 0 ? floor + Format.date(oldest) : "")])
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
// The distinct kinds in a selection, in the order they were met, each carrying the mark its own
|
|
345
|
+
// first member draws. The frame's stack and the Kinds row under it read this one pass, so the two
|
|
346
|
+
// can never group the same selection differently.
|
|
347
|
+
function kindGroups(rows) {
|
|
348
|
+
var order = []
|
|
349
|
+
var byWord = {}
|
|
350
|
+
for (var i = 0; i < rows.length; i++) {
|
|
351
|
+
var r = rows[i]
|
|
352
|
+
if (!r) {
|
|
353
|
+
continue
|
|
354
|
+
}
|
|
355
|
+
var word = kindWord(r.i)
|
|
356
|
+
if (byWord[word] === undefined) {
|
|
357
|
+
byWord[word] = { word: word, glyph: Icons.glyphFor(r.i), count: 0 }
|
|
358
|
+
order.push(byWord[word])
|
|
359
|
+
}
|
|
360
|
+
byWord[word].count++
|
|
361
|
+
}
|
|
362
|
+
return order
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
// The canvas stacks three marks over a multi-selection, one per kind, front-most the kind the Kinds
|
|
366
|
+
// row names first. Three is the canvas's own count and the most a 16 by 10 frame reads at a glance.
|
|
367
|
+
var MULTI_MARK_CAP = 3
|
|
368
|
+
|
|
369
|
+
function multiMarks(rows) {
|
|
370
|
+
var groups = kindGroups(rows || [])
|
|
371
|
+
var marks = []
|
|
372
|
+
for (var i = 0; i < groups.length && i < MULTI_MARK_CAP; i++) {
|
|
373
|
+
marks.push(groups[i].glyph)
|
|
374
|
+
}
|
|
375
|
+
return marks
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
// "2 images, 1 video, 1 text", the canvas's own phrasing for the Kinds row.
|
|
379
|
+
function kindSummary(groups, floor) {
|
|
380
|
+
var parts = []
|
|
381
|
+
for (var i = 0; i < groups.length; i++) {
|
|
382
|
+
var g = groups[i]
|
|
383
|
+
parts.push((floor || "") + Format.count(g.count) + " " + (g.count === 1 ? g.word : plural(g.word)))
|
|
384
|
+
}
|
|
385
|
+
return parts.join(", ")
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
function plural(word) {
|
|
389
|
+
return word === "text" ? word : word + "s"
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
function kindWord(icon) {
|
|
393
|
+
switch (Kinds.kindState(icon)) {
|
|
394
|
+
case IMAGE: return "image"
|
|
395
|
+
case VIDEO: return "video"
|
|
396
|
+
case AUDIO: return "audio"
|
|
397
|
+
case CODE: return "code file"
|
|
398
|
+
case TEXT: return "text"
|
|
399
|
+
case ARCHIVE: return "archive"
|
|
400
|
+
}
|
|
401
|
+
return "file"
|
|
402
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
.pragma library
|
|
2
|
+
|
|
3
|
+
// A dated figure is asked for its day at this hour UTC, so the helper, which formats in UTC, draws the asked date in every GUI zone.
|
|
4
|
+
var MIDDAY_HOUR = 12;
|
|
5
|
+
|
|
6
|
+
// Sample input: ("mermaid", "gantt\n title Plan", theme) answers a copy of theme whose today is this day's noon UTC in ms, since a Gantt chart draws today's date; any other figure answers theme itself.
|
|
7
|
+
function datedTheme(kind, source, theme) {
|
|
8
|
+
if (kind !== "mermaid" || !theme || !/(?:^|%%)\s*gantt\b/im.test(source))
|
|
9
|
+
return theme;
|
|
10
|
+
var now = new Date();
|
|
11
|
+
var dated = Object.assign({}, theme);
|
|
12
|
+
dated.today = Date.UTC(now.getFullYear(), now.getMonth(), now.getDate(), MIDDAY_HOUR);
|
|
13
|
+
return dated;
|
|
14
|
+
}
|