From b0645c0ac394b0e355fdddd287bd48675f3b62c2 Mon Sep 17 00:00:00 2001 From: AyrisAI Date: Fri, 21 Aug 2026 01:04:03 +0300 Subject: [PATCH] feat(mobile): replace blocking modal with inline live inspector for instantaneous visual editing feedback --- apps/mobile/src/app/menu/qr.tsx | 688 +++++++++++++---------------- apps/mobile/svgcomponentlist/7.tsx | 0 2 files changed, 298 insertions(+), 390 deletions(-) create mode 100644 apps/mobile/svgcomponentlist/7.tsx diff --git a/apps/mobile/src/app/menu/qr.tsx b/apps/mobile/src/app/menu/qr.tsx index 235aa40..09d9280 100644 --- a/apps/mobile/src/app/menu/qr.tsx +++ b/apps/mobile/src/app/menu/qr.tsx @@ -410,44 +410,78 @@ export default function QrScreen() { - {/* Hızlı Katman Seçici (Tıklayınca Modal Açar) */} - - - DÜZENLEMEK VE KONUMUNU DEĞİŞTİRMEK İÇİN TIKLAYIN: - + {/* Hızlı Katman Seçici (Canlı Seçim) */} + + + + CANLI DÜZENLENECEK ALANI SEÇİN: + + {selectedEditField && ( + setSelectedEditField(null)} + style={{ + backgroundColor: "rgba(255,255,255,0.08)", + paddingHorizontal: 8, + paddingVertical: 3, + borderRadius: 6, + }} + > + Kapat + + )} + + {FIELD_DEFINITIONS.map(({ key, label, icon }) => { const item = fields[key]; + const isSelected = selectedEditField === key; return ( setSelectedEditField(key)} + onPress={() => setSelectedEditField(isSelected ? null : key)} style={({ pressed }) => ({ - backgroundColor: item.visible ? "#242429" : "#1A1A1E", + backgroundColor: isSelected ? "#D4AF37" : item.visible ? "#242429" : "#1A1A1E", paddingHorizontal: 12, paddingVertical: 9, borderRadius: 12, borderWidth: 1.5, - borderColor: item.visible ? "rgba(212, 175, 55, 0.4)" : "#2B2B32", + borderColor: isSelected ? "#D4AF37" : item.visible ? "rgba(212, 175, 55, 0.3)" : "#2B2B32", flexDirection: "row", alignItems: "center", gap: 6, opacity: pressed ? 0.8 : 1, })} > - + {label} {item.offsetY ? ( - - + + {item.offsetY > 0 ? `+${item.offsetY}` : item.offsetY}px @@ -458,421 +492,295 @@ export default function QrScreen() { - {/* Metin & Font & Boyut Özelleştirme Kartı (Açılır/Kapanır Liste) */} - - setShowCustomizePanel(!showCustomizePanel)} - style={{ - flexDirection: "row", - alignItems: "center", - justifyContent: "space-between", - }} - > - - - - - - - Tüm Katmanları Listele - - - Tıkla & Düzenle, dikey konum kaydırma ve font ayarı - - - - - + {/* CANLI DÜZENLEYİCİ KARTI (Sayfa İçinde Anında Görsel Geri Bildirim) */} + {selectedEditField && (() => { + const def = FIELD_DEFINITIONS.find((d) => d.key === selectedEditField)!; + const item = fields[selectedEditField]; - {showCustomizePanel && ( - - {FIELD_DEFINITIONS.map(({ key, label, icon }) => { - const item = fields[key]; - return ( - setSelectedEditField(key)} - style={({ pressed }) => ({ - backgroundColor: "#141417", - borderRadius: 14, - padding: 12, - borderWidth: 1, - borderColor: "rgba(255,255,255,0.06)", - flexDirection: "row", + return ( + + {/* Başlık & Görünürlük */} + + + - - - - - {label} - - - {item.text || "Boş"} - - - - - - - {item.fontSize || 12}px - - - - - - ); - })} - - )} - + + + + {def.label} + + - {/* Modal: Tıklanan Metin Katmanını Detaylı Düzenleme */} - setSelectedEditField(null)} - > - - {selectedEditField && (() => { - const def = FIELD_DEFINITIONS.find((d) => d.key === selectedEditField)!; - const item = fields[selectedEditField]; + {/* Stantta Göster / Gizle */} + + + {item.visible ? "Görünür" : "Gizli"} + + + setFields((prev) => ({ + ...prev, + [selectedEditField]: { ...prev[selectedEditField], visible: v }, + })) + } + trackColor={{ false: "#27272A", true: "#D4AF37" }} + thumbColor="#FFFFFF" + ios_backgroundColor="#27272A" + /> + + - return ( - - {/* Modal Başlığı & Kapat Butonu */} - - - - - {def.label} - - - setSelectedEditField(null)} + {item.visible && ( + <> + {/* Metin Girişi (Enter ile alt satır destekli) */} + + + METİN İÇERİĞİ (ENTER İLE YENİ SATIRA GEÇEBİLİR): + + + setFields((prev) => ({ + ...prev, + [selectedEditField]: { ...prev[selectedEditField], text: t }, + })) + } + placeholder={def.placeholder} + placeholderTextColor="#71717A" + multiline style={{ - width: 32, - height: 32, - borderRadius: 16, - backgroundColor: "#242429", - alignItems: "center", - justifyContent: "center", + backgroundColor: "#121215", + borderWidth: 1, + borderColor: "rgba(255,255,255,0.12)", + borderRadius: 12, + paddingHorizontal: 12, + paddingVertical: 10, + color: "#FFFFFF", + fontSize: 14, + minHeight: 46, }} - > - - + /> - - {/* Görünürlük Anahtarı */} - - - Stantta Göster + {/* DİKEY KONUM / YUKARI - AŞAĞI TAŞIMA (offsetY) */} + + + + DİKEY KONUM (YUKARI / AŞAĞI TAŞIMA) + + + {item.offsetY ? `${item.offsetY > 0 ? "+" : ""}${item.offsetY} px` : "Orijinal (0px)"} - - setFields((prev) => ({ - ...prev, - [selectedEditField]: { ...prev[selectedEditField], visible: v }, - })) - } - trackColor={{ false: "#27272A", true: "#D4AF37" }} - thumbColor="#FFFFFF" - ios_backgroundColor="#27272A" - /> - - {/* Metin Girişi (Multiline / Enter Destekli) */} - - - METİN İÇERİĞİ (ENTER İLE YENİ SATIR) - - + + setFields((prev) => ({ ...prev, - [selectedEditField]: { ...prev[selectedEditField], text: t }, + [selectedEditField]: { + ...prev[selectedEditField], + offsetY: (prev[selectedEditField].offsetY || 0) - 3, + }, })) } - placeholder={def.placeholder} - placeholderTextColor="#71717A" - multiline style={{ - backgroundColor: "#121215", - borderWidth: 1, - borderColor: "rgba(255,255,255,0.12)", - borderRadius: 14, - paddingHorizontal: 14, - paddingVertical: 12, - color: "#FFFFFF", - fontSize: 14, - minHeight: 60, + flex: 1, + backgroundColor: "#242429", + paddingVertical: 8, + borderRadius: 8, + alignItems: "center", + flexDirection: "row", + justifyContent: "center", + gap: 4, }} - /> + > + + Yukarı (-3px) + + + + setFields((prev) => ({ + ...prev, + [selectedEditField]: { + ...prev[selectedEditField], + offsetY: (prev[selectedEditField].offsetY || 0) + 3, + }, + })) + } + style={{ + flex: 1, + backgroundColor: "#242429", + paddingVertical: 8, + borderRadius: 8, + alignItems: "center", + flexDirection: "row", + justifyContent: "center", + gap: 4, + }} + > + + Aşağı (+3px) + + + {item.offsetY ? ( + + setFields((prev) => ({ + ...prev, + [selectedEditField]: { + ...prev[selectedEditField], + offsetY: 0, + }, + })) + } + style={{ + backgroundColor: "#3A2A2A", + paddingHorizontal: 12, + paddingVertical: 8, + borderRadius: 8, + alignItems: "center", + justifyContent: "center", + }} + > + Sıfırla + + ) : null} + - {/* DİKEY KONUM / YUKARI - AŞAĞI TAŞIMA (offsetY) */} - - - - DİKEY KONUM (YUKARI / AŞAĞI) - - - {item.offsetY ? `${item.offsetY > 0 ? "+" : ""}${item.offsetY} px` : "Orijinal (0px)"} - - - - - setFields((prev) => ({ - ...prev, - [selectedEditField]: { - ...prev[selectedEditField], - offsetY: (prev[selectedEditField].offsetY || 0) - 3, - }, - })) - } - style={{ - flex: 1, - backgroundColor: "#242429", - paddingVertical: 10, - borderRadius: 10, - alignItems: "center", - flexDirection: "row", - justifyContent: "center", - gap: 4, - }} - > - - Yukarı (-3px) - - - - setFields((prev) => ({ - ...prev, - [selectedEditField]: { - ...prev[selectedEditField], - offsetY: (prev[selectedEditField].offsetY || 0) + 3, - }, - })) - } - style={{ - flex: 1, - backgroundColor: "#242429", - paddingVertical: 10, - borderRadius: 10, - alignItems: "center", - flexDirection: "row", - justifyContent: "center", - gap: 4, - }} - > - - Aşağı (+3px) - - - {item.offsetY ? ( + {/* YAZI TİPİ (FONT) & BOYUT YAN YANA */} + + + YAZI TİPİ (TÜRKÇE DESTEKLİ FONT) + + + {FONT_OPTIONS.map((f) => { + const isSelected = item.fontId === f.id; + return ( setFields((prev) => ({ ...prev, - [selectedEditField]: { - ...prev[selectedEditField], - offsetY: 0, - }, + [selectedEditField]: { ...prev[selectedEditField], fontId: f.id }, })) } style={{ - backgroundColor: "#3A2A2A", + backgroundColor: isSelected ? "#D4AF37" : "#242429", paddingHorizontal: 12, - paddingVertical: 10, + paddingVertical: 7, borderRadius: 10, - alignItems: "center", - justifyContent: "center", + borderWidth: 1.5, + borderColor: isSelected ? "#D4AF37" : "rgba(255,255,255,0.06)", }} > - Sıfırla - - ) : null} - - - - {/* YAZI TİPİ (FONT) SEÇİMİ */} - - - YAZI TİPİ (TÜRKÇE DESTEKLİ FONT) - - - {FONT_OPTIONS.map((f) => { - const isSelected = item.fontId === f.id; - return ( - - setFields((prev) => ({ - ...prev, - [selectedEditField]: { ...prev[selectedEditField], fontId: f.id }, - })) - } + - - {f.label} - - - ); - })} - - + {f.label} + + + ); + })} + + - {/* YAZI BOYUTU (FONT SIZE) */} - - - YAZI BOYUTU + {/* YAZI BOYUTU (FONT SIZE) */} + + + YAZI BOYUTU: + + + + setFields((prev) => ({ + ...prev, + [selectedEditField]: { + ...prev[selectedEditField], + fontSize: Math.max(def.min, (prev[selectedEditField].fontSize || 12) - 1), + }, + })) + } + style={{ + backgroundColor: "#242429", + paddingHorizontal: 14, + paddingVertical: 6, + borderRadius: 8, + }} + > + + + + + {item.fontSize || 12} px - - - setFields((prev) => ({ - ...prev, - [selectedEditField]: { - ...prev[selectedEditField], - fontSize: Math.max(def.min, (prev[selectedEditField].fontSize || 12) - 1), - }, - })) - } - style={{ - backgroundColor: "#242429", - paddingHorizontal: 16, - paddingVertical: 10, - borderRadius: 10, - }} - > - - - - {item.fontSize || 12} px - - - - setFields((prev) => ({ - ...prev, - [selectedEditField]: { - ...prev[selectedEditField], - fontSize: Math.min(def.max, (prev[selectedEditField].fontSize || 12) + 1), - }, - })) - } - style={{ - backgroundColor: "#242429", - paddingHorizontal: 16, - paddingVertical: 10, - borderRadius: 10, - }} - > - - - + + setFields((prev) => ({ + ...prev, + [selectedEditField]: { + ...prev[selectedEditField], + fontSize: Math.min(def.max, (prev[selectedEditField].fontSize || 12) + 1), + }, + })) + } + style={{ + backgroundColor: "#242429", + paddingHorizontal: 14, + paddingVertical: 6, + borderRadius: 8, + }} + > + + + + + )} + + ); + })()} - {/* Kaydet & Tamamla Butonu */} - setSelectedEditField(null)} - style={{ - backgroundColor: "#D4AF37", - borderRadius: 14, - paddingVertical: 14, - alignItems: "center", - marginTop: 6, - }} - > - - Tamamla & Uygula - - - - - ); - })()} - - diff --git a/apps/mobile/svgcomponentlist/7.tsx b/apps/mobile/svgcomponentlist/7.tsx new file mode 100644 index 0000000..e69de29