diff --git a/frontend/app/view/preview/preview.scss b/frontend/app/view/preview/preview.scss index d6e8bec129..c19413d769 100644 --- a/frontend/app/view/preview/preview.scss +++ b/frontend/app/view/preview/preview.scss @@ -29,18 +29,40 @@ } } - &.view-preview-image, &.view-preview-video, &.view-preview-audio { video, - audio, - img { + audio { width: 100%; height: 100%; padding: 10px; object-fit: contain; } } + + &.view-preview-image { + position: relative; + .tools { + position: absolute; + display: flex; + flex-direction: row; + z-index: 2; + top: 0; + right: 0; + padding: 5px; + gap: 4px; + button { + padding: 4px 5px; + } + } + img { + z-index: 1; + } + .react-transform-wrapper { + height: 100%; + width: 100%; + } + } &.view-preview-pdf { padding: 5px; } diff --git a/frontend/app/view/preview/preview.tsx b/frontend/app/view/preview/preview.tsx index f51c707aaf..579612f4a9 100644 --- a/frontend/app/view/preview/preview.tsx +++ b/frontend/app/view/preview/preview.tsx @@ -2,6 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import { BlockNodeModel } from "@/app/block/blocktypes"; +import { Button } from "@/app/element/button"; import { CenteredDiv } from "@/app/element/quickelems"; import { TypeAheadModal } from "@/app/modals/typeaheadmodal"; import { ContextMenuModel } from "@/app/store/contextmenu"; @@ -41,6 +42,7 @@ import { Atom, atom, Getter, PrimitiveAtom, useAtomValue, useSetAtom, WritableAt import { loadable } from "jotai/utils"; import type * as MonacoTypes from "monaco-editor/esm/vs/editor/editor.api"; import { createRef, memo, useCallback, useEffect, useMemo, useState } from "react"; +import { TransformComponent, TransformWrapper, useControls } from "react-zoom-pan-pinch"; import { CSVView } from "./csvview"; import { DirectoryPreview } from "./directorypreview"; import "./preview.scss"; @@ -852,6 +854,41 @@ function MarkdownPreview({ model }: SpecializedViewProps) { ); } +function ImageZooomControls() { + const { zoomIn, zoomOut, resetTransform } = useControls(); + + return ( +