open(app)} {...menu(() => appMenu(app, d, nav, { showIgnored }))}>
@@ -435,7 +441,7 @@ export function Portfolio() {
{showIgnored && ignoredApps.map(a => (
-
+
))}
diff --git a/apps/desktop/src/screens/tabs/Art.tsx b/apps/desktop/src/screens/tabs/Art.tsx
index 43517fc..412dbac 100644
--- a/apps/desktop/src/screens/tabs/Art.tsx
+++ b/apps/desktop/src/screens/tabs/Art.tsx
@@ -2,6 +2,8 @@
// size (`shots gallery --json`, offline), store check issues outlined. Images load one by one as they scroll into view
// (`project.render`, a data: URL each: the window loads no files itself). Re-render (dry run, dialog, real run), write
// the review page, open it or the folder.
+import { type MenuInput, useContextMenu } from '../../ui/ContextMenu';
+import { copyToast } from '../../ui/app-menu';
import '../../styles/art.css';
import { type KeyboardEvent, useCallback, useEffect, useMemo, useRef, useState } from 'react';
import { api, errorText, type Project, type RenderImage, type RendersResult, type RenderTile, type ToolResult } from '../../api';
@@ -41,7 +43,8 @@ function loadRender(projectId: string, file: string, stamp: string): Promise void }) {
+function Thumb({ projectId, tile, stamp, onOpen, menu }: { projectId: string; tile: RenderTile; stamp: string; onOpen: () => void; menu: () => MenuInput }) {
+ const cm = useContextMenu();
const ref = useRef(null);
const file = tile.kind === 'video' ? tile.poster : tile.src;
const [src, setSrc] = useState(file ? cache.get(`${projectId}|${file}|${stamp}`) : null);
@@ -61,7 +64,7 @@ function Thumb({ projectId, tile, stamp, onOpen }: { projectId: string; tile: Re
const lvl = tile.issues.some(i => i.level === 'error') ? 'err' : tile.issues.length ? 'warn' : '';
const shape = tile.h > tile.w ? 'portrait' : 'landscape';
return (
-
+
|