{ label: "Vest xanh navy", prompt: "Doanh nhân mảnh mai, xinh đẹp, mặc vest xanh navy cao cấp, đứng trước tường đá cẩm thạch, ánh sáng dịu, thần thái tự tin. Phong cách: 8K, điện ảnh, đẳng cấp. Giữ nguyên khuôn mặt." }, ]; // ====== Service: gọi Nano Banana ====== async function nanoBananaGenerate({ endpoint, file, prompt, aspect, quality, faceConsistency, }: { endpoint: string; file: File; prompt: string; aspect: string; quality: string; faceConsistency: boolean; }): Promise
{ const form = new FormData(); form.append("image", file); form.append("prompt", prompt); form.append("aspect", aspect); form.append("quality", quality); form.append("faceConsistency", String(faceConsistency)); const res = await fetch(endpoint, { method: "POST", body: form }); if (!res.ok) throw new Error(`HTTP ${res.status}`); const contentType = res.headers.get("content-type") || ""; if (contentType.includes("application/json")) { const data = await res.json(); if (data.imageUrl) return data.imageUrl as string; if (data.url) return data.url as string; } const blob = await res.blob(); return URL.createObjectURL(blob); } // ====== Giao diện / Ứng dụng ====== function Chip({ active, label, onClick }: { active: boolean; label: string; onClick: () => void }) { return ( ); } function RadioRow({ value, onChange, options, name }: any) { return ( {options.map((opt: any) => (