diff --git a/apps/api/src/routes/restaurants.ts b/apps/api/src/routes/restaurants.ts index 8ce3be2..6f7dde9 100644 --- a/apps/api/src/routes/restaurants.ts +++ b/apps/api/src/routes/restaurants.ts @@ -155,20 +155,31 @@ export const restaurantsRoutes: FastifyPluginAsync = async (app) => { return reply.code(400).send({ message: "themeKey is required" }); } - const { data: themeData } = await supabase - .from("themes") - .select("id") - .eq("key", themeKey) - .maybeSingle(); + let themeId = themeData?.id; + if (!themeId) { + const { data: newTheme } = await supabase + .from("themes") + .insert({ + key: themeKey, + name: themeKey === "artisan" ? "Amber Artisan" : themeKey, + config: { primaryColor: "#E5A855", background: "#121316", productLayout: "card", categoryLayout: "tabs" }, + }) + .select("id") + .maybeSingle(); - if (!themeData) { + if (newTheme?.id) { + themeId = newTheme.id; + } + } + + if (!themeId) { return reply.code(404).send({ message: "Theme not found" }); } const { error } = await supabase.from("restaurant_themes").upsert( { restaurant_id: id, - theme_id: themeData.id, + theme_id: themeId, }, { onConflict: "restaurant_id" }, ); diff --git a/apps/mobile/build-1787181989785.ipa b/apps/mobile/build-1787183277274.ipa similarity index 70% rename from apps/mobile/build-1787181989785.ipa rename to apps/mobile/build-1787183277274.ipa index 41b0add..67b3db5 100644 Binary files a/apps/mobile/build-1787181989785.ipa and b/apps/mobile/build-1787183277274.ipa differ diff --git a/apps/mobile/src/components/menu/ThemeSelectorSheet.tsx b/apps/mobile/src/components/menu/ThemeSelectorSheet.tsx index 0567a12..e4b8969 100644 --- a/apps/mobile/src/components/menu/ThemeSelectorSheet.tsx +++ b/apps/mobile/src/components/menu/ThemeSelectorSheet.tsx @@ -31,6 +31,18 @@ export interface ThemeOption { } export const THEME_OPTIONS: ThemeOption[] = [ + { + key: "artisan", + name: "Amber Artisan", + category: "Gurme & Organik / Koyu", + color: "#E5A855", + badgeBg: "#282B34", + badgeText: "#E5A855", + bgPreview: "#121316", + accent: "Amber Bal & Mat Oniks", + desc: "Koyu antrasit mat zemin, kehribar vurgular, modern bento ızgarası ve yuvarlak ürün kartları.", + suitableFor: "Gurme şarküteri, kuruyemiş & organik market, fıçı bira evleri, artisan kahveciler", + }, { key: "elegant", name: "Elegant Gold", diff --git a/apps/web/src/components/PublicMenuClient.tsx b/apps/web/src/components/PublicMenuClient.tsx index 60a0cb1..dc3ff63 100644 --- a/apps/web/src/components/PublicMenuClient.tsx +++ b/apps/web/src/components/PublicMenuClient.tsx @@ -315,7 +315,7 @@ export function PublicMenuClient({

- Canlı Tema Önizleme (5 Şablon) + Canlı Tema Önizleme (6 Şablon)

-
+
{Object.values(THEME_PRESETS).map((preset) => { const isSelected = selectedThemeKey === preset.key; return ( @@ -451,70 +451,138 @@ export function PublicMenuClient({
+ {/* Items Container: Grid / Card / List Layout based on Theme */} {/* Items Container: Grid / Card / List Layout based on Theme */}
- {category.menu_items.map((item) => ( -
setSelectedItem(item)} - className={`group relative rounded-2xl p-4 transition-all duration-200 cursor-pointer border hover:shadow-lg active:scale-[0.99] flex gap-3.5 items-center ${ - theme.config.productLayout === "list" ? "justify-between" : "" - }`} - style={{ - backgroundColor: theme.cardBg, - borderColor: theme.cardBorder, - }} - > - {/* Item Details */} -
-
-

- {item.name} -

+ {category.menu_items.map((item) => { + if (theme.key === "artisan") { + return ( +
setSelectedItem(item)} + className="group relative rounded-3xl p-3.5 transition-all duration-300 cursor-pointer border flex flex-col justify-between hover:scale-[1.02] active:scale-[0.98] shadow-md" + style={{ + backgroundColor: theme.cardBg, + borderColor: theme.cardBorder, + }} + > + {/* Image Container with 3D Dish presentation */} +
+ {item.image_url ? ( + {item.name} + ) : ( +
+ )} + + ÖZEL + +
+ + {/* Info */} +
+
+

+ {item.name} +

+ {item.description ? ( +

+ {item.description} +

+ ) : null} +
+ +
+ + ₺{item.price.toFixed(0)} + + + + + +
+
+
+ ); + } + + return ( +
setSelectedItem(item)} + className={`group relative rounded-2xl p-4 transition-all duration-200 cursor-pointer border hover:shadow-lg active:scale-[0.99] flex gap-3.5 items-center ${ + theme.config.productLayout === "list" ? "justify-between" : "" + }`} + style={{ + backgroundColor: theme.cardBg, + borderColor: theme.cardBorder, + }} + > + {/* Item Details */} +
+
+

+ {item.name} +

+
+ + {item.description && ( +

+ {item.description} +

+ )} + +
+ + ₺{item.price.toFixed(0)} + + + + İncele → + +
- {item.description && ( -

- {item.description} -

+ {/* Item Thumbnail Image */} + {item.image_url && ( +
+ {item.name} +
)} - -
- - ₺{item.price.toFixed(0)} - - - - İncele → - -
-
- - {/* Item Thumbnail Image */} - {item.image_url && ( -
- {item.name} -
- )} -
- ))} + + ); + })}
)) diff --git a/apps/web/src/lib/theme.ts b/apps/web/src/lib/theme.ts index d6f138e..a8481cf 100644 --- a/apps/web/src/lib/theme.ts +++ b/apps/web/src/lib/theme.ts @@ -16,6 +16,25 @@ export interface ThemePreset { } export const THEME_PRESETS: Record = { + artisan: { + key: "artisan", + name: "Amber Artisan", + fontFamily: "heading", + config: { + primaryColor: "#E5A855", + background: "#121316", + productLayout: "card", + categoryLayout: "tabs", + }, + cardBg: "#1C1E24", + cardBorder: "rgba(255, 255, 255, 0.08)", + textPrimary: "#FFFFFF", + textSecondary: "#9DA3AF", + accentBg: "rgba(229, 168, 85, 0.14)", + headerGradient: "linear-gradient(180deg, #1A1C22 0%, #121316 100%)", + badgeBg: "#282B34", + badgeText: "#E5A855", + }, elegant: { key: "elegant", name: "Elegant Gold",