From 809200550ea39523e6053dc1b81b9052e41fa797 Mon Sep 17 00:00:00 2001 From: AyrisAI Date: Thu, 20 Aug 2026 03:41:07 +0300 Subject: [PATCH] =?UTF-8?q?feat(themes):=20add=20La=20Maison=20d'=C3=89l?= =?UTF-8?q?=C3=A8ve=20French=20luxury=20editorial=20restaurant=20design=20?= =?UTF-8?q?system?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/api/src/routes/restaurants.ts | 1 + .../components/menu/ThemeSelectorSheet.tsx | 12 +++ apps/web/src/components/PublicMenuClient.tsx | 82 ++++++++++++++++++- apps/web/src/lib/theme.ts | 19 +++++ 4 files changed, 111 insertions(+), 3 deletions(-) diff --git a/apps/api/src/routes/restaurants.ts b/apps/api/src/routes/restaurants.ts index b6ce2d2..84fc4cd 100644 --- a/apps/api/src/routes/restaurants.ts +++ b/apps/api/src/routes/restaurants.ts @@ -156,6 +156,7 @@ export const restaurantsRoutes: FastifyPluginAsync = async (app) => { } const THEME_NAMES: Record = { + maison: "La Maison d'Élève", swiss: "Swiss Brutalist", artisan: "Amber Artisan", elegant: "Elegant Gold", diff --git a/apps/mobile/src/components/menu/ThemeSelectorSheet.tsx b/apps/mobile/src/components/menu/ThemeSelectorSheet.tsx index 89b59f5..0eb359a 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: "maison", + name: "La Maison d'Élève", + category: "Fransız Haute Cuisine & Lüks", + color: "#24463A", + badgeBg: "#E3DDD4", + badgeText: "#24463A", + bgPreview: "#EEEAE4", + accent: "Orman Yeşili & Fransız Krem", + desc: "Zarif serif tipografi, Fransız editoryal mizanpaj, pin çizgileri ve | ₺180 | özel fiyatlandırma stili.", + suitableFor: "Lüks otel restoranları, Fransız mutfağı, degustasyon menüleri, şarap salonları", + }, { key: "swiss", name: "Swiss Brutalist", diff --git a/apps/web/src/components/PublicMenuClient.tsx b/apps/web/src/components/PublicMenuClient.tsx index 8bc55f4..fec0018 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 (7 Şablon) + Canlı Tema Önizleme (8 Şablon)

-
+
{Object.values(THEME_PRESETS).map((preset) => { const isSelected = selectedThemeKey === preset.key; return ( @@ -425,12 +425,13 @@ export function PublicMenuClient({ filteredCategories.map((category, catIndex) => { const chapterNum = String(catIndex + 1).padStart(2, "0"); const isSwiss = theme.key === "swiss"; + const isMaison = theme.key === "maison"; return (
{/* Category Heading Banner */} {isSwiss ? ( @@ -452,6 +453,25 @@ export function PublicMenuClient({ Ø{catIndex + 1}
+ ) : isMaison ? ( +
+
+ + {chapterNum} + +
+

+ {category.name} +

+

+ {category.description || "Sélection Culinaire"} +

+
+
+
+
+
+
) : (
{category.menu_items.map((item, itemIndex) => { + if (isMaison) { + return ( +
setSelectedItem(item)} + className="group bg-[#F7F4EF] rounded-2xl p-4 sm:p-5 border border-[#24463A]/15 hover:border-[#24463A]/40 transition-all duration-300 cursor-pointer shadow-sm flex flex-col sm:flex-row gap-4 items-center justify-between" + > + {/* Image with subtle clay circle and forest green accent */} + {item.image_url && ( +
+
+
+ {item.name} +
+
+
+ )} + + {/* Details */} +
+
+
+

+ {item.name} +

+ {item.description && ( +

+ {item.description} +

+ )} +
+ +
+ + Maison + +
+
+
+ +
+ + | ₺{item.price.toFixed(0)} | + +
+
+
+ ); + } if (isSwiss) { const itemCode = `${String.fromCharCode(65 + catIndex)}${String(itemIndex + 1).padStart(2, "0")}`; return ( diff --git a/apps/web/src/lib/theme.ts b/apps/web/src/lib/theme.ts index e8d315e..227b1c1 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 = { + maison: { + key: "maison", + name: "La Maison d'Élève", + fontFamily: "serif", + config: { + primaryColor: "#24463A", + background: "#EEEAE4", + productLayout: "card", + categoryLayout: "tabs", + }, + cardBg: "#F7F4EF", + cardBorder: "rgba(36, 70, 58, 0.2)", + textPrimary: "#1A1A1A", + textSecondary: "#5C5852", + accentBg: "rgba(36, 70, 58, 0.08)", + headerGradient: "linear-gradient(180deg, #182C24 0%, #11201A 100%)", + badgeBg: "#E3DDD4", + badgeText: "#24463A", + }, swiss: { key: "swiss", name: "Swiss Brutalist",