"use client"; import React, { useState } from "react"; import Link from "next/link"; import { THEME_PRESETS, ThemePreset } from "@/lib/theme"; import { DEMO_RESTAURANT, DEMO_CATEGORIES } from "@/lib/demo-data"; import { PublicMenuClient } from "@/components/PublicMenuClient"; export function MenuTemplatesAdminClient() { const [themesMap, setThemesMap] = useState>(THEME_PRESETS); const [activeThemeKey, setActiveThemeKey] = useState("coastal"); const [activeTab, setActiveTab] = useState<"gallery" | "customize">("gallery"); const [toastMsg, setToastMsg] = useState(null); const [jsonModalOpen, setJsonModalOpen] = useState(false); const [importedJson, setImportedJson] = useState(""); const currentTheme = themesMap[activeThemeKey] || THEME_PRESETS.coastal!; const showToast = (msg: string) => { setToastMsg(msg); setTimeout(() => setToastMsg(null), 3000); }; const handleUpdateCurrentTheme = (updates: Partial | Partial) => { setThemesMap((prev) => { const existing = prev[activeThemeKey]; if (!existing) return prev; let updatedConfig = { ...existing.config }; let updatedTopLevel = { ...existing }; if ("primaryColor" in updates || "productLayout" in updates || "categoryLayout" in updates || "headerLayout" in updates) { updatedConfig = { ...updatedConfig, ...updates }; } else { updatedTopLevel = { ...updatedTopLevel, ...updates }; } return { ...prev, [activeThemeKey]: { ...updatedTopLevel, config: updatedConfig, }, }; }); }; const handleSaveAll = () => { showToast(`"${currentTheme.name}" şablon ayarları başarıyla kaydedildi!`); }; const handleImportJsonSubmit = () => { try { const parsed = JSON.parse(importedJson); if (!parsed.key || !parsed.name || !parsed.config) { throw new Error("Geçersiz şablon JSON formatı. 'key', 'name' ve 'config' alanları zorunludur."); } setThemesMap((prev) => ({ ...prev, [parsed.key]: parsed, })); setActiveThemeKey(parsed.key); setJsonModalOpen(false); setImportedJson(""); showToast(`Yeni şablon "${parsed.name}" başarıyla içe aktarıldı!`); } catch (err: any) { alert("Hata: " + (err?.message || "Geçersiz JSON formatı")); } }; return (
{/* Toast Bildirimi */} {toastMsg && (
{toastMsg}
)} {/* Üst Karşılama Barı */}
🎨 WEB DİNAMİK MENÜ TEMA STÜDYOSU

Web Menü Şablon Yöneticisi

Restoran web menülerinin renk paletlerini, düzen yapılarını ve tipografisini canlı cihaz simülatöründe anında test edip yönetin.

{/* Ana İçerik Çift Sütun Düzeni: Sol Kontrol / Sağ Canlı Simülatör */}
{/* SOL PANEL: Şablon Galerisi ve Özelleştirici */}
{/* Sekme Butonları */}
{/* TAB 1: ŞABLON GALERİSİ KARTLARI */} {activeTab === "gallery" && (
{Object.values(themesMap).map((theme) => { const isSelected = theme.key === activeThemeKey; return (
setActiveThemeKey(theme.key)} className={`p-5 rounded-2xl border transition-all cursor-pointer space-y-4 relative overflow-hidden group ${ isSelected ? "bg-[#16161A] border-[#D4AF37] ring-2 ring-[#D4AF37]/30 shadow-xl shadow-[#D4AF37]/10" : "bg-[#121215] border-white/10 hover:border-white/20 hover:bg-white/[0.02]" }`} > {/* Üst İkon & Seçim Rozeti */}
{isSelected ? ( AKTİF ) : ( {theme.key} )}
{/* Tema Adı & Açıklama */}

{theme.name}

{theme.fontFamily} {theme.config.productLayout} {theme.config.categoryLayout}
{/* Alt Butonlar */}
); })}
)} {/* TAB 2: SEÇİLİ TEMAYI ÖZELLEŞTİR */} {activeTab === "customize" && (

{currentTheme.name}

Ana renkleri, arka plan tonlarını ve düzen tiplerini anında özelleştirin.

{/* Renk Ayarları */}

1. Renk Paleti & Tonlar

{/* Primary Color */}
handleUpdateCurrentTheme({ primaryColor: e.target.value }) } className="w-10 h-10 rounded-lg cursor-pointer bg-transparent border-0" /> handleUpdateCurrentTheme({ primaryColor: e.target.value }) } className="flex-1 bg-black/40 border border-white/10 rounded-lg px-3 py-1.5 text-xs text-white font-mono uppercase" />
{/* Background Color */}
handleUpdateCurrentTheme({ background: e.target.value }) } className="w-10 h-10 rounded-lg cursor-pointer bg-transparent border-0" /> handleUpdateCurrentTheme({ background: e.target.value }) } className="flex-1 bg-black/40 border border-white/10 rounded-lg px-3 py-1.5 text-xs text-white font-mono uppercase" />
{/* Card Background */}
handleUpdateCurrentTheme({ cardBg: e.target.value })} className="w-10 h-10 rounded-lg cursor-pointer bg-transparent border-0" /> handleUpdateCurrentTheme({ cardBg: e.target.value })} className="flex-1 bg-black/40 border border-white/10 rounded-lg px-3 py-1.5 text-xs text-white font-mono uppercase" />
{/* Text Primary */}
handleUpdateCurrentTheme({ textPrimary: e.target.value })} className="w-10 h-10 rounded-lg cursor-pointer bg-transparent border-0" /> handleUpdateCurrentTheme({ textPrimary: e.target.value })} className="flex-1 bg-black/40 border border-white/10 rounded-lg px-3 py-1.5 text-xs text-white font-mono uppercase" />
{/* Düzen & Yerleşim Ayarları */}

2. Düzen & Yerleşim Mimarisi

{/* Product Layout */}
{/* Category Layout */}
{/* Header Layout */}
{/* Tipografi */}

3. Tipografi & Font Ailesi

{[ { id: "serif", label: "Zarif Serif", desc: "Playfair / Georgia" }, { id: "sans", label: "Modern Sans", desc: "Inter / System" }, { id: "heading", label: "Güçlü Display", desc: "Outfit / Montserrat" }, ].map((font) => ( ))}
)}
{/* SAĞ PANEL: Canlı İnceleme Telefon Simülatörü */}
Canlı Telefon Simülatörü
{currentTheme.name}
{/* Mock iPhone Frame */}
{/* iPhone Notch Header */}
{/* Dynamic Theme Render Component */}
{/* Home Bar Indicator */}
Sol taraftan yaptığınız renk ve düzen değişiklikleri anında burada simüle edilir.
{/* JSON İÇE / DIŞA AKTARMA MODAL */} {jsonModalOpen && (

Tema JSON Spesifikasyonu

Mevcut temanın JSON kodunu kopyalayabilir veya yeni bir tema JSON spesifikasyonunu buraya yapıştırıp içe aktarabilirsiniz: