feat: redesign web menu layout, add header cover banner & dynamic header layout, refine mobile inputs and theme selector

This commit is contained in:
AyrisAI
2026-08-20 15:07:13 +03:00
parent 6fb91c94ff
commit 0836fc8539
17 changed files with 311 additions and 553 deletions
@@ -101,12 +101,12 @@ export function AddCategoryModal({
value={name}
onChangeText={setName}
placeholder="Örn: Tatlılar, Başlangıçlar, Sıcak İçecekler"
placeholderTextColor="#A8A29E"
placeholderTextColor="#57534E"
autoFocus
style={{
backgroundColor: "#FAFAFA",
borderWidth: 1,
borderColor: "#E7E5E4",
borderWidth: 1.5,
borderColor: "#D6D3D1",
borderRadius: 12,
padding: 14,
fontSize: 15,
@@ -218,11 +218,11 @@ export function AddItemModal({
value={name}
onChangeText={setName}
placeholder="Örn: Mercimek Çorbası"
placeholderTextColor="#A8A29E"
placeholderTextColor="#57534E"
style={{
backgroundColor: "#FAFAFA",
borderWidth: 1,
borderColor: "#E7E5E4",
borderWidth: 1.5,
borderColor: "#D6D3D1",
borderRadius: 12,
padding: 14,
fontSize: 15,
@@ -241,8 +241,8 @@ export function AddItemModal({
flexDirection: "row",
alignItems: "center",
backgroundColor: "#FAFAFA",
borderWidth: 1,
borderColor: "#E7E5E4",
borderWidth: 1.5,
borderColor: "#D6D3D1",
borderRadius: 12,
paddingHorizontal: 14,
}}
@@ -251,7 +251,7 @@ export function AddItemModal({
value={price}
onChangeText={setPrice}
placeholder="120"
placeholderTextColor="#A8A29E"
placeholderTextColor="#57534E"
keyboardType="decimal-pad"
style={{
flex: 1,
@@ -273,13 +273,13 @@ export function AddItemModal({
value={description}
onChangeText={setDescription}
placeholder="Kısa içerik veya porsiyon açıklaması..."
placeholderTextColor="#A8A29E"
placeholderTextColor="#57534E"
multiline
numberOfLines={3}
style={{
backgroundColor: "#FAFAFA",
borderWidth: 1,
borderColor: "#E7E5E4",
borderWidth: 1.5,
borderColor: "#D6D3D1",
borderRadius: 12,
padding: 14,
fontSize: 14,
@@ -311,11 +311,11 @@ export function ItemDetailSheet({
value={name}
onChangeText={setName}
placeholder="Örn: Izgara Levrek"
placeholderTextColor="#A8A29E"
placeholderTextColor="#57534E"
style={{
backgroundColor: "#FAFAFA",
borderWidth: 1,
borderColor: "#E7E5E4",
borderWidth: 1.5,
borderColor: "#D6D3D1",
borderRadius: 12,
padding: 14,
fontSize: 15,
@@ -335,8 +335,8 @@ export function ItemDetailSheet({
flexDirection: "row",
alignItems: "center",
backgroundColor: "#FAFAFA",
borderWidth: 1,
borderColor: "#E7E5E4",
borderWidth: 1.5,
borderColor: "#D6D3D1",
borderRadius: 12,
paddingHorizontal: 14,
}}
@@ -345,7 +345,7 @@ export function ItemDetailSheet({
value={price}
onChangeText={setPrice}
placeholder="0.00"
placeholderTextColor="#A8A29E"
placeholderTextColor="#57534E"
keyboardType="decimal-pad"
style={{
flex: 1,
@@ -368,13 +368,13 @@ export function ItemDetailSheet({
value={description}
onChangeText={setDescription}
placeholder="İçindekiler, porsiyon bilgisi, pişirme tarzı..."
placeholderTextColor="#A8A29E"
placeholderTextColor="#57534E"
multiline
numberOfLines={3}
style={{
backgroundColor: "#FAFAFA",
borderWidth: 1,
borderColor: "#E7E5E4",
borderWidth: 1.5,
borderColor: "#D6D3D1",
borderRadius: 12,
padding: 14,
fontSize: 14,
@@ -285,7 +285,7 @@ export function ThemeSelectorSheet({
Menü Şablonları & Canlı Önizleme
</Text>
<Text style={{ fontSize: 12, color: "#78716C", marginTop: 2 }}>
5 lüks şablonu inceleyin, demolarını paylaşın veya menünüze uygulayın
Şablonları inceleyin, demolarını görün veya menünüze uygulayın
</Text>
</View>
@@ -323,61 +323,21 @@ export function ThemeSelectorSheet({
elevation: isSelected ? 3 : 1,
}}
>
{/* Top Row: Color Pip, Name, Category Badge & Active Check */}
<View style={{ flexDirection: "row", justifyContent: "space-between", alignItems: "center", marginBottom: 8 }}>
<View style={{ flexDirection: "row", alignItems: "center", gap: 10 }}>
<View
style={{
width: 18,
height: 18,
borderRadius: 9,
backgroundColor: theme.color,
borderWidth: 2,
borderColor: "#FFFFFF",
shadowColor: "#000",
shadowOffset: { width: 0, height: 1 },
shadowOpacity: 0.2,
shadowRadius: 2,
elevation: 2,
}}
/>
<View>
<Text style={{ fontSize: 16, fontWeight: "800", color: "#1C1917" }}>
{theme.name}
</Text>
</View>
</View>
<View
style={{
backgroundColor: theme.badgeBg,
paddingHorizontal: 8,
paddingVertical: 3,
borderRadius: 6,
}}
>
<Text style={{ fontSize: 11, fontWeight: "700", color: theme.badgeText }}>
{theme.category}
</Text>
</View>
</View>
{/* Description */}
<Text style={{ fontSize: 13, color: "#57534E", lineHeight: 18, marginBottom: 8 }}>
{theme.desc}
</Text>
{/* Meta details */}
<View style={{ flexDirection: "row", alignItems: "center", gap: 6, marginBottom: 14 }}>
<Ionicons name="sparkles" size={13} color={theme.color} />
<Text style={{ fontSize: 11, color: "#78716C", fontWeight: "600" }}>
Renk: <Text style={{ color: "#1C1917", fontWeight: "700" }}>{theme.accent}</Text> {theme.suitableFor}
{/* Top Row: Theme Name */}
<View style={{ marginBottom: 6 }}>
<Text style={{ fontSize: 17, fontWeight: "800", color: "#1C1917" }}>
{theme.name}
</Text>
</View>
{/* Action Bar: Canlı Demo, Paylaş, Uygula */}
<View style={{ flexDirection: "row", gap: 8, borderTopWidth: 1, borderTopColor: "#F5F5F4", paddingTop: 12 }}>
{/* Canlı Demo Aç */}
{/* Description */}
<Text style={{ fontSize: 13, color: "#57534E", lineHeight: 18, marginBottom: 12 }}>
{theme.desc}
</Text>
{/* Action Bar: Canlı Demo & Şablon Seç */}
<View style={{ flexDirection: "row", gap: 10, borderTopWidth: 1, borderTopColor: "#F5F5F4", paddingTop: 12 }}>
{/* Canlı Demo Önizle */}
<Pressable
onPress={() => handleOpenDemo(theme.key)}
style={({ pressed }) => ({
@@ -385,43 +345,25 @@ export function ThemeSelectorSheet({
flexDirection: "row",
alignItems: "center",
justifyContent: "center",
gap: 4,
gap: 6,
backgroundColor: "#F5F5F4",
paddingVertical: 10,
borderRadius: 10,
paddingVertical: 12,
borderRadius: 12,
opacity: pressed ? 0.8 : 1,
})}
>
<Ionicons name="eye-outline" size={15} color="#1C1917" />
<Text style={{ fontSize: 12, fontWeight: "700", color: "#1C1917" }}>
Demo Menü
<Ionicons name="eye-outline" size={17} color="#1C1917" />
<Text style={{ fontSize: 13, fontWeight: "700", color: "#1C1917" }}>
Demo Önizle
</Text>
</Pressable>
{/* Demo Linkini Gönder / Paylaş */}
<Pressable
onPress={() => handleShareDemo(theme)}
style={({ pressed }) => ({
width: 40,
alignItems: "center",
justifyContent: "center",
backgroundColor: "#FAF8F5",
borderWidth: 1,
borderColor: "#E7E5E4",
paddingVertical: 10,
borderRadius: 10,
opacity: pressed ? 0.8 : 1,
})}
>
<Ionicons name="share-outline" size={16} color="#78716C" />
</Pressable>
{/* Bu Şablonu Uygula / Aktif Rozeti */}
<Pressable
onPress={() => handleApplyTheme(theme.key)}
disabled={isSelected || isApplying}
style={({ pressed }) => ({
flex: 1.3,
flex: 1,
flexDirection: "row",
alignItems: "center",
justifyContent: "center",
@@ -429,8 +371,8 @@ export function ThemeSelectorSheet({
backgroundColor: isSelected ? "#ECFDF5" : theme.color,
borderWidth: isSelected ? 1 : 0,
borderColor: "#A7F3D0",
paddingVertical: 10,
borderRadius: 10,
paddingVertical: 12,
borderRadius: 12,
opacity: pressed ? 0.85 : 1,
})}
>
@@ -438,15 +380,15 @@ export function ThemeSelectorSheet({
<ActivityIndicator size="small" color="#FFFFFF" />
) : isSelected ? (
<>
<Ionicons name="checkmark-circle" size={16} color="#059669" />
<Text style={{ fontSize: 12, fontWeight: "800", color: "#059669" }}>
<Ionicons name="checkmark-circle" size={17} color="#059669" />
<Text style={{ fontSize: 13, fontWeight: "800", color: "#059669" }}>
Aktif Şablon
</Text>
</>
) : (
<>
<Ionicons name="checkmark" size={15} color="#FFFFFF" />
<Text style={{ fontSize: 12, fontWeight: "800", color: "#FFFFFF" }}>
<Ionicons name="checkmark" size={16} color="#FFFFFF" />
<Text style={{ fontSize: 13, fontWeight: "800", color: "#FFFFFF" }}>
Şablonu Seç
</Text>
</>