diff --git a/mnemo_cards_admin/src/components/BulkCardEditor.tsx b/mnemo_cards_admin/src/components/BulkCardEditor.tsx
new file mode 100644
index 0000000..1378511
--- /dev/null
+++ b/mnemo_cards_admin/src/components/BulkCardEditor.tsx
@@ -0,0 +1,356 @@
+import { useState, useEffect } from 'react'
+import { useMutation, useQueryClient } from '@tanstack/react-query'
+import { toast } from 'sonner'
+import { cardsApi } from '@/api/cards'
+import type { GameCardDto } from '@/types/models'
+import type { AxiosError } from 'axios'
+import { Button } from './ui/button'
+import { Input } from './ui/input'
+import { Label } from './ui/label'
+import { Textarea } from './ui/textarea'
+import { Card, CardContent, CardDescription, CardHeader, CardTitle } from './ui/card'
+import { Badge } from './ui/badge'
+import { packsApi } from '@/api/packs'
+import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from './ui/select'
+import { ChevronLeft, ChevronRight, Save, X } from 'lucide-react'
+
+interface UploadedImage {
+ id: string
+ file: File
+ preview: string
+ base64: string
+}
+
+interface CardData {
+ imageId: string
+ packId: string
+ original: string
+ translation: string
+ mnemo: string
+ transcription: string
+ transcriptionMnemo: string
+ back: string
+ imageBack?: string
+ isSaved: boolean
+ cardId?: number
+}
+
+interface BulkCardEditorProps {
+ images: UploadedImage[]
+ onComplete: () => void
+ onCancel: () => void
+}
+
+export function BulkCardEditor({ images, onComplete, onCancel }: BulkCardEditorProps) {
+ const queryClient = useQueryClient()
+ const [currentIndex, setCurrentIndex] = useState(0)
+ const [cardsData, setCardsData] = useState
-
+
+
+
+
{/* Search */}
@@ -335,6 +363,26 @@ export default function CardsPage() {