diff options
| author | soryu <soryu@soryu.co> | 2025-12-23 19:11:57 +0000 |
|---|---|---|
| committer | soryu <soryu@soryu.co> | 2025-12-23 19:11:57 +0000 |
| commit | f5222a7ae5ade5589436778cb01fc0abe625b3c3 (patch) | |
| tree | 6e9739517d371179e6018412cba011b3f38868ef /makima/frontend/src/components/files/FileDetail.tsx | |
| parent | 3c0adec8e3a9dd3bc34251e87e0fb5314793426d (diff) | |
| download | soryu-f5222a7ae5ade5589436778cb01fc0abe625b3c3.tar.gz soryu-f5222a7ae5ade5589436778cb01fc0abe625b3c3.zip | |
Add editable file sections and a drag&drop feature
Diffstat (limited to 'makima/frontend/src/components/files/FileDetail.tsx')
| -rw-r--r-- | makima/frontend/src/components/files/FileDetail.tsx | 61 |
1 files changed, 33 insertions, 28 deletions
diff --git a/makima/frontend/src/components/files/FileDetail.tsx b/makima/frontend/src/components/files/FileDetail.tsx index ffc67dd..2bf4c03 100644 --- a/makima/frontend/src/components/files/FileDetail.tsx +++ b/makima/frontend/src/components/files/FileDetail.tsx @@ -8,6 +8,8 @@ interface FileDetailProps { onBack: () => void; onSave: (id: string, name: string, description: string) => void; onDelete: (id: string) => void; + onBodyElementUpdate?: (index: number, element: import("../../lib/api").BodyElement) => void; + onBodyReorder?: (fromIndex: number, toIndex: number) => void; } export function FileDetail({ @@ -16,6 +18,8 @@ export function FileDetail({ onBack, onSave, onDelete, + onBodyElementUpdate, + onBodyReorder, }: FileDetailProps) { const [isEditing, setIsEditing] = useState(false); const [name, setName] = useState(file.name); @@ -143,33 +147,34 @@ export function FileDetail({ <h3 className="font-mono text-xs text-[#75aafc] uppercase mb-3"> Content </h3> - <BodyRenderer elements={file.body} /> + <BodyRenderer + elements={file.body} + isEditing={isEditing} + onUpdate={onBodyElementUpdate} + onReorder={onBodyReorder} + /> </div> - {/* Collapsible Transcript Section */} - <div className="border-t border-dashed border-[rgba(117,170,252,0.35)] pt-4"> - <button - onClick={() => setTranscriptExpanded(!transcriptExpanded)} - className="flex items-center gap-2 font-mono text-xs text-[#75aafc] hover:text-[#9bc3ff] transition-colors uppercase w-full text-left" - > - <span - className={`transition-transform ${ - transcriptExpanded ? "rotate-90" : "" - }`} + {/* Collapsible Transcript Section - only show if there are entries */} + {file.transcript.length > 0 && ( + <div className="border-t border-dashed border-[rgba(117,170,252,0.35)] pt-4"> + <button + onClick={() => setTranscriptExpanded(!transcriptExpanded)} + className="flex items-center gap-2 font-mono text-xs text-[#75aafc] hover:text-[#9bc3ff] transition-colors uppercase w-full text-left" > - > - </span> - Transcript ({file.transcript.length} entries) - </button> + <span + className={`transition-transform ${ + transcriptExpanded ? "rotate-90" : "" + }`} + > + > + </span> + Transcript ({file.transcript.length} entries) + </button> - {transcriptExpanded && ( - <div className="mt-4 space-y-3 pl-4"> - {file.transcript.length === 0 ? ( - <div className="text-[#9bc3ff] text-sm font-mono opacity-60"> - No transcript entries. - </div> - ) : ( - file.transcript.map((entry) => ( + {transcriptExpanded && ( + <div className="mt-4 space-y-3 pl-4"> + {file.transcript.map((entry) => ( <div key={entry.id} className="font-mono text-sm"> <div className="flex items-baseline gap-2 mb-1"> <span className="text-[#75aafc] text-xs"> @@ -183,11 +188,11 @@ export function FileDetail({ {entry.text} </p> </div> - )) - )} - </div> - )} - </div> + ))} + </div> + )} + </div> + )} </div> </div> ); |
