diff --git a/client/src/components/pipeline/CanonCard.jsx b/client/src/components/pipeline/CanonCard.jsx index 751a1c614e..011808f238 100644 --- a/client/src/components/pipeline/CanonCard.jsx +++ b/client/src/components/pipeline/CanonCard.jsx @@ -11,7 +11,7 @@ */ import { useEffect, useRef, useState } from 'react'; -import { Loader2, ImagePlus, ImageUp, WandSparkles, Lock, Unlock, Shirt, Plus, Trash2, X, Star, Square, BookOpen, ScanText } from 'lucide-react'; +import { Loader2, ImagePlus, ImageUp, WandSparkles, Lock, Unlock, Shirt, Plus, Trash2, X, Star, Square, ScanText } from 'lucide-react'; import useMediaJobProgress from '../../hooks/useMediaJobProgress'; import useRowDraft from '../../hooks/useRowDraft'; import useFieldDraft from '../../hooks/useFieldDraft'; @@ -209,23 +209,6 @@ function RevealTimingField({ entry, editable, onPatch }) { ); } -// Collapsible wrapper for the universe-only character details panel -// (CharacterDetailEditor + CharacterReferenceSheetPanel). Single toggle so the -// card stays terse by default — the user opens it only when filling in -// novelist / graphic-novelist fields or generating a reference sheet. -function CharacterDetailsToggle({ children }) { - return ( - - {children} - - ); -} - function SourceSeriesChip({ sourceSeriesId, seriesName }) { return ( ); + // Three-state thumbnail slot (pending / empty / completed). Empty state + // shows a placeholder box with a Render button that fires the same handler + // as the actions-column Image button — surfaces a one-click affordance for + // canon entries that haven't been visualized yet. Pending shows the live + // diffusion spinner from MediaJobThumb (also mirrored in the footer's + // ref-grid for live-progress detail). + // Lock no longer gates rendering — see the `blockedByLock` comment above. + // Render still requires a description (the prompt source) + an actual + // handler from the parent. Pending state is checked inside EntryThumbSlot. + + const showCharacterSheet = kind.key === 'characters' && !!characterExtensions && !!onPatchEntry; + const canRender = !!onRender && !!description.trim(); + const thumbnail = ( + onPreview(visibleFilename || thumbnailRef) : null} + onRender={onRender} + canRender={canRender} + /> + ); + const body = ( <> {tags.length > 0 ? ( @@ -514,7 +522,7 @@ export default function CanonCard({ editable={!!onPatchEntry && !locked} onPatch={(patch) => onPatchEntry?.(entry.id, patch)} /> - {kind.key === 'characters' ? ( + {kind.key === 'characters' && !showCharacterSheet ? (