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 ? (
+

+ ) : (
+
✨
+ )}
+
+ Ö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.price.toFixed(0)}
-
-
-
- İncele →
-
-
-
-
- {/* Item Thumbnail Image */}
- {item.image_url && (
-
-

-
- )}
-
- ))}
+
+ );
+ })}
))
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",