diff --git a/PROJECT_PORTFOLIO.md b/PROJECT_PORTFOLIO.md new file mode 100644 index 0000000..9e88ce4 --- /dev/null +++ b/PROJECT_PORTFOLIO.md @@ -0,0 +1,144 @@ +# 🚀 Menulio — Cross-Platform SaaS & Dynamic QR Stand Studio Ecosystem + +> **Modern Restoranlar İçin Dijital Menü Deneyimi & Anlık JSON Şablon Motoru Destekli Masa Kartı Tasarım Platformu** + +![Menulio Banner](https://images.unsplash.com/photo-1517248135467-4c7edcad34c4?w=1200&auto=format&fit=crop&q=80) + +--- + +## 📌 Proje Özeti (Executive Summary) + +**Menulio**, restoranların ve gastronomi işletmelerinin dijital menülerini ve fiziksel masa kartı QR stantlarını uçtan uca yönetmelerini sağlayan **Full-Stack Cross-Platform SaaS mimarisidir**. + +Geleneksel QR menü sistemlerinden farklı olarak Menulio, **0 (Sıfır) App Store güncellemesi gerektiren "JSON-Driven Dynamic Template Engine" (V2)** teknolojisine sahiptir. Admin panelinden tasarlanan SVG/PNG arka planları, kavisli metin hesaplamaları (*curved text math*), 360° döndürme, renk paletleri ve özel QR yerleşimleri API üzerinden anında hem Web hem de Mobil (iOS/Android) platformlarında canlı yayınlanır. + +--- + +## 🛠️ Öne Çıkan Mimari Özellikler (Key Highlights) + +### 1. 🎨 JSON-Driven Dynamic QR Stand Engine (V2) +- **Sıfır Güncelleme Dağıtımı**: Mobil uygulamayı yeniden derlemeden Web Admin panelinden yeni masa kartı şablonu oluşturma ve anında yayınlama. +- **Kavisli Metin Matematiği (`curveDegree`)**: Radyal açı hesaplamaları ile dairesel ve yay biçiminde metin hizalama (Yay ◡ ve ◠ kavis derecesi ayarlama). +- **Figma & Instagram Story Tarzı Tuval Editörü**: Sürüklenebilir (*drag & drop*), ölçeklenebilir, 360° döndürülebilir metin ve QR katmanları. +- **Manyetik Kılavuz Çizgileri**: Akıllı dikey/yatay merkezleme ve hizalama çizgileri (*snap-to-grid*). +- **Matbaa Kalitesinde Baskı Çıktısı**: 300 DPI Ultra HD PNG ve A5 Matbaa standartlarında vektörel PDF çıktısı. + +### 2. 📱 Cross-Platform Mobil Uygulama (Expo & React Native) +- **iOS & Android Desteği**: Expo SDK 52 ve React Native mimarisi üzerine kurulu yüksek performanslı arayüz. +- **Dokunsal Geri Bildirim (Haptic Feedback)**: İşlem anında `expo-haptics` ile kullanıcıya fiziksel titreşim uyarısı. +- **Yerel iOS Derleme & Paketleme**: Xcode Archive & Fastlane entegrasyonu ile tam imzalı `embedded.mobileprovision` içerikli `.ipa` dağıtımı. + +### 3. 🌐 Web Uygulaması & 10+ Lüks Menü Teması (Next.js 15 App Router) +- **10 Özel Restoran Teması**: `Eleia Coastal`, `Neon Street Fuze`, `La Maison d'Élève`, `Swiss Brutalist`, `Amber Artisan`, `Elegant Gold`, `Modern Sapphire`, `Luxury Dark`, `Nordic Minimal`, `Classic Bistro`. +- **Wildcard Subdomain Yönlendirmesi**: `restoran-adi.menul.io` şeklinde her işletmeye özel subdomain ve özel alan adı (custom domain) desteği. +- **Canlı Cihaz Simülatörü**: Admin panelinde tema ve şablon değişikliklerini anında gösteren interaktif iPhone çerçevesi. + +### 4. 🔐 Çift Katmanlı Yönetici Güvenliği (Dual-Layer Admin Auth) +- **Next.js Server Middleware**: Yetkisiz sunucu isteklerini anında `/admin/login` sayfasına yönlendiren çerez tabanlı doğrulama. +- **Client Auth Guard**: React tarafında yükleme animasyonu ve oturum doğrulama mekanizması. +- **Supabase Auth & Fallback Credential**: Supabase PostgreSQL veritabanı entegrasyonu ve güvenli token çerezi (`menulio_admin_token`). + +--- + +## 💻 Teknolojik Mimari & Kullanılan Teknolojiler + +| Katman | Kullanılan Teknolojiler | +| :--- | :--- | +| **Monorepo Mimarisi** | `pnpm Workspaces`, Shared Type Definitions (`@menulio/shared`) | +| **Web Uygulaması (Frontend)** | `Next.js 15 (App Router)`, `React 18`, `Tailwind CSS`, `Glassmorphism UI` | +| **Mobil Uygulama** | `React Native`, `Expo (SDK 52)`, `Expo Router`, `ViewShot`, `Expo Haptics` | +| **Veritabanı & Auth** | `Supabase (PostgreSQL, Auth, RLS)`, REST API, Local Disk Cache | +| **Görsel & Baskı Motoru** | `html-to-image`, `jspdf`, `qrcode.react`, Google Fonts API | +| **CI/CD & Derleme** | `Xcode 26`, `Fastlane`, `EAS Build (Expo Application Services)` | + +--- + +## 📸 Ekran Görüntüleri & Görsel Bileşenler + +``` ++-----------------------------------------------------------------------+ +| MENULIO ADMIN PANEL - DİNAMİK ŞABLON & TEMA STÜDYOSU | ++-----------------------------------------------------------------------+ +| [ Sol Panel: Renk/Düzen Kontrolleri ] | [ Sağ: Canlı iPhone Simülatörü ]| +| - Primary Color: #D4AF37 | +-----------------------------+ | +| - Product Layout: Card / List | | OZZY KEBAP | | +| - Category Layout: Tabs / Accordion | | [ QR KOD BÖLGESİ ] | | +| - Curved Text Math: 35° Arc | | MENÜYÜ GÖRMEK İÇİN OKUTUN | | +| - Font Family: Playfair / Inter | +-----------------------------+ | ++-----------------------------------------------------------------------+ +``` + +--- + +## 📐 Proje Dosya & Klasör Yapısı + +``` +menulio/ +├── apps/ +│ ├── mobile/ # React Native / Expo Mobil Uygulama +│ │ ├── src/ +│ │ │ ├── app/ # Expo Router Dosya Tabanlı Yönlendirme +│ │ │ ├── components/ +│ │ │ │ ├── qr-canvas/ # Tuval Editörü, Curved Text & Dokunmatik Katmanlar +│ │ │ │ └── qr-templates/ # SVG & Vektörel Şablon Render Bileşenleri +│ │ └── ios/ # Yerel Xcode Proje Klasörü & Podfile +│ │ +│ ├── web/ # Next.js 15 Web & Admin Uygulaması +│ │ ├── src/ +│ │ │ ├── app/ +│ │ │ │ ├── admin/ # Yönetici Paneli & Auth Guard (/admin) +│ │ │ │ │ ├── templates/ # QR Stand Şablon Stüdyosu +│ │ │ │ │ └── menu-templates/ # Web Menü Temaları Stüdyosu +│ │ │ │ ├── qr/ # Müşteri QR Masa Kartı Jeneratörü +│ │ │ │ └── menu/[slug]/ # Canlı Restoran Web Menüsü +│ │ │ ├── components/ # Web Bileşenleri & Simülatörler +│ │ │ └── lib/ # Auth, Supabase & Tema Tanımları +│ │ +│ └── api/ # Express / Node.js Backend REST Servisleri +│ +└── packages/ + └── shared/ # Tip Tanımları, Renk Paletleri & Ortak Sabitler +``` + +--- + +## ⚡ Kurulum ve Çalıştırma (Getting Started) + +Proje `pnpm` monorepo yapısında kurgulanmıştır. + +### 1. Bağımlılıkları Yükleyin +```bash +pnpm install +``` + +### 2. Geliştirme Sunucularını Başlatın + +- **Tüm Uygulamaları Aynı Anda Başlatma**: + ```bash + pnpm dev + ``` +- **Sadece Web Uygulamasını Başlatma**: + ```bash + pnpm --filter web dev + ``` +- **Sadece Mobil Uygulamayı (Expo) Başlatma**: + ```bash + pnpm --filter mobile start + ``` + +--- + +## 👨‍💻 Mühendislik & Problem Çözme Vurguları (Portfolio Highlights) + +1. **React Native Font Rendering Fix**: + - React Native'in iOS ve Android native font motorunda virgüllü CSS fallback dizgilerinin (`Georgia, 'Times New Roman', serif`) sessizce varsayılan sistem fontuna düşme problemi tespit edilerek, platforma özel tekil font çözümleme mekanizması geliştirildi. +2. **Kavisli Metin Radyal Geometri Matematiği**: + - Metin karakterlerinin dairesel bir yay etrafında doğru açı (`rotate`), `translateX` ve `translateY` offset hesaplamaları ile hem Web SVG/HTML hem de Native Text bileşenlerinde piksel mükemmelliğinde işlenmesi sağlandı. +3. **Senkronize JSON Şablon Yayınlama**: + - Web Admin panelinde yapılan herhangi bir tasarım veya metin düzenlemesinin, veritabanı ve REST API üzerinden anında mobil uygulama tuvalinde ve web jeneratöründe canlı olarak görünmesi sağlandı. + +--- + +## 📄 Lisans + +Bu proje kişisel portfolyo ve özel geliştirme amacıyla kurgulanmıştır. Tüm hakları saklıdır. diff --git a/apps/mobile/app.json b/apps/mobile/app.json index 306dcbf..f8a3252 100644 --- a/apps/mobile/app.json +++ b/apps/mobile/app.json @@ -18,6 +18,7 @@ "ios": { "supportsTablet": false, "bundleIdentifier": "com.ayristech.menulio", + "buildNumber": "21", "icon": "./assets/icon.png", "infoPlist": { "NSCameraUsageDescription": "Menünüzün fotoğrafını çekerek AI ile dijitalleştirmek için kamera izni gereklidir.", diff --git a/apps/mobile/ios/.gitignore b/apps/mobile/ios/.gitignore new file mode 100644 index 0000000..8beb344 --- /dev/null +++ b/apps/mobile/ios/.gitignore @@ -0,0 +1,30 @@ +# OSX +# +.DS_Store + +# Xcode +# +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata +*.xccheckout +*.moved-aside +DerivedData +*.hmap +*.ipa +*.xcuserstate +project.xcworkspace +.xcode.env.local + +# Bundle artifacts +*.jsbundle + +# CocoaPods +/Pods/ diff --git a/apps/mobile/ios/.xcode.env b/apps/mobile/ios/.xcode.env new file mode 100644 index 0000000..3d5782c --- /dev/null +++ b/apps/mobile/ios/.xcode.env @@ -0,0 +1,11 @@ +# This `.xcode.env` file is versioned and is used to source the environment +# used when running script phases inside Xcode. +# To customize your local environment, you can create an `.xcode.env.local` +# file that is not versioned. + +# NODE_BINARY variable contains the PATH to the node executable. +# +# Customize the NODE_BINARY variable here. +# For example, to use nvm with brew, add the following line +# . "$(brew --prefix nvm)/nvm.sh" --no-use +export NODE_BINARY=$(command -v node) diff --git a/apps/mobile/ios/Menulio.xcodeproj/project.pbxproj b/apps/mobile/ios/Menulio.xcodeproj/project.pbxproj new file mode 100644 index 0000000..cae5b94 --- /dev/null +++ b/apps/mobile/ios/Menulio.xcodeproj/project.pbxproj @@ -0,0 +1,544 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 05BAC76EB2F44404BCDAFE0E /* noop-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = 920486E7D8564009BA09A00A /* noop-file.swift */; }; + 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.mm */; }; + 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; + 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; + 3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */; }; + 47FCCC6B41070FB7061A2F1B /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 4F738668B5B302410E775CFC /* PrivacyInfo.xcprivacy */; }; + 96905EF65AED1B983A6B3ABC /* libPods-Menulio.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-Menulio.a */; }; + B18059E884C0ABDD17F3DC3D /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */; }; + BB2F792D24A3F905000567C9 /* Expo.plist in Resources */ = {isa = PBXBuildFile; fileRef = BB2F792C24A3F905000567C9 /* Expo.plist */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 13B07F961A680F5B00A75B9A /* Menulio.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Menulio.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = Menulio/AppDelegate.h; sourceTree = ""; }; + 13B07FB01A68108700A75B9A /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = Menulio/AppDelegate.mm; sourceTree = ""; }; + 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = Menulio/Images.xcassets; sourceTree = ""; }; + 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Menulio/Info.plist; sourceTree = ""; }; + 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = Menulio/main.m; sourceTree = ""; }; + 4F738668B5B302410E775CFC /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = Menulio/PrivacyInfo.xcprivacy; sourceTree = ""; }; + 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-Menulio.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Menulio.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 6C2E3173556A471DD304B334 /* Pods-Menulio.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Menulio.debug.xcconfig"; path = "Target Support Files/Pods-Menulio/Pods-Menulio.debug.xcconfig"; sourceTree = ""; }; + 7A4D352CD337FB3A3BF06240 /* Pods-Menulio.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Menulio.release.xcconfig"; path = "Target Support Files/Pods-Menulio/Pods-Menulio.release.xcconfig"; sourceTree = ""; }; + 920486E7D8564009BA09A00A /* noop-file.swift */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.swift; name = "noop-file.swift"; path = "Menulio/noop-file.swift"; sourceTree = ""; }; + AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = SplashScreen.storyboard; path = Menulio/SplashScreen.storyboard; sourceTree = ""; }; + BB2F792C24A3F905000567C9 /* Expo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Expo.plist; sourceTree = ""; }; + ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; + F5CD4FEA57634883A4542F6A /* Menulio-Bridging-Header.h */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.c.h; name = "Menulio-Bridging-Header.h"; path = "Menulio/Menulio-Bridging-Header.h"; sourceTree = ""; }; + FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-Menulio/ExpoModulesProvider.swift"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 96905EF65AED1B983A6B3ABC /* libPods-Menulio.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 13B07FAE1A68108700A75B9A /* Menulio */ = { + isa = PBXGroup; + children = ( + BB2F792B24A3F905000567C9 /* Supporting */, + 13B07FAF1A68108700A75B9A /* AppDelegate.h */, + 13B07FB01A68108700A75B9A /* AppDelegate.mm */, + 13B07FB51A68108700A75B9A /* Images.xcassets */, + 13B07FB61A68108700A75B9A /* Info.plist */, + 13B07FB71A68108700A75B9A /* main.m */, + AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */, + 920486E7D8564009BA09A00A /* noop-file.swift */, + F5CD4FEA57634883A4542F6A /* Menulio-Bridging-Header.h */, + 4F738668B5B302410E775CFC /* PrivacyInfo.xcprivacy */, + ); + name = Menulio; + sourceTree = ""; + }; + 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { + isa = PBXGroup; + children = ( + ED297162215061F000B7C4FE /* JavaScriptCore.framework */, + 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-Menulio.a */, + ); + name = Frameworks; + sourceTree = ""; + }; + 832341AE1AAA6A7D00B99B32 /* Libraries */ = { + isa = PBXGroup; + children = ( + ); + name = Libraries; + sourceTree = ""; + }; + 83CBB9F61A601CBA00E9B192 = { + isa = PBXGroup; + children = ( + 13B07FAE1A68108700A75B9A /* Menulio */, + 832341AE1AAA6A7D00B99B32 /* Libraries */, + 83CBBA001A601CBA00E9B192 /* Products */, + 2D16E6871FA4F8E400B85C8A /* Frameworks */, + D65327D7A22EEC0BE12398D9 /* Pods */, + D7E4C46ADA2E9064B798F356 /* ExpoModulesProviders */, + ); + indentWidth = 2; + sourceTree = ""; + tabWidth = 2; + usesTabs = 0; + }; + 83CBBA001A601CBA00E9B192 /* Products */ = { + isa = PBXGroup; + children = ( + 13B07F961A680F5B00A75B9A /* Menulio.app */, + ); + name = Products; + sourceTree = ""; + }; + 92DBD88DE9BF7D494EA9DA96 /* Menulio */ = { + isa = PBXGroup; + children = ( + FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */, + ); + name = Menulio; + sourceTree = ""; + }; + BB2F792B24A3F905000567C9 /* Supporting */ = { + isa = PBXGroup; + children = ( + BB2F792C24A3F905000567C9 /* Expo.plist */, + ); + name = Supporting; + path = Menulio/Supporting; + sourceTree = ""; + }; + D65327D7A22EEC0BE12398D9 /* Pods */ = { + isa = PBXGroup; + children = ( + 6C2E3173556A471DD304B334 /* Pods-Menulio.debug.xcconfig */, + 7A4D352CD337FB3A3BF06240 /* Pods-Menulio.release.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; + D7E4C46ADA2E9064B798F356 /* ExpoModulesProviders */ = { + isa = PBXGroup; + children = ( + 92DBD88DE9BF7D494EA9DA96 /* Menulio */, + ); + name = ExpoModulesProviders; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 13B07F861A680F5B00A75B9A /* Menulio */ = { + isa = PBXNativeTarget; + buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "Menulio" */; + buildPhases = ( + 08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */, + 5C48BE09ECBB9F203B7F2ED2 /* [Expo] Configure project */, + 13B07F871A680F5B00A75B9A /* Sources */, + 13B07F8C1A680F5B00A75B9A /* Frameworks */, + 13B07F8E1A680F5B00A75B9A /* Resources */, + 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, + 800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */, + EFB4C3DB6A514B0ADA511E60 /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Menulio; + productName = Menulio; + productReference = 13B07F961A680F5B00A75B9A /* Menulio.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 83CBB9F71A601CBA00E9B192 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1130; + TargetAttributes = { + 13B07F861A680F5B00A75B9A = { + LastSwiftMigration = 1250; + }; + }; + }; + buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "Menulio" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 83CBB9F61A601CBA00E9B192; + productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 13B07F861A680F5B00A75B9A /* Menulio */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 13B07F8E1A680F5B00A75B9A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BB2F792D24A3F905000567C9 /* Expo.plist in Resources */, + 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, + 3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */, + 47FCCC6B41070FB7061A2F1B /* PrivacyInfo.xcprivacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Bundle React Native code and images"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "if [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\n source \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\n# The project root by default is one level up from the ios directory\nexport PROJECT_ROOT=\"$PROJECT_DIR\"/..\n\nif [[ \"$CONFIGURATION\" = *Debug* ]]; then\n export SKIP_BUNDLING=1\nfi\nif [[ -z \"$ENTRY_FILE\" ]]; then\n # Set the entry JS file using the bundler's entry resolution.\n export ENTRY_FILE=\"$(\"$NODE_BINARY\" -e \"require('expo/scripts/resolveAppEntry')\" \"$PROJECT_ROOT\" ios absolute | tail -n 1)\"\nfi\n\nif [[ -z \"$CLI_PATH\" ]]; then\n # Use Expo CLI\n export CLI_PATH=\"$(\"$NODE_BINARY\" --print \"require.resolve('@expo/cli', { paths: [require.resolve('expo/package.json')] })\")\"\nfi\nif [[ -z \"$BUNDLE_COMMAND\" ]]; then\n # Default Expo CLI command for bundling\n export BUNDLE_COMMAND=\"export:embed\"\nfi\n\n# Source .xcode.env.updates if it exists to allow\n# SKIP_BUNDLING to be unset if needed\nif [[ -f \"$PODS_ROOT/../.xcode.env.updates\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.updates\"\nfi\n# Source local changes to allow overrides\n# if needed\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\n`\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/react-native-xcode.sh'\"`\n\n"; + }; + 08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Menulio-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 5C48BE09ECBB9F203B7F2ED2 /* [Expo] Configure project */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = "[Expo] Configure project"; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# This script configures Expo modules and generates the modules provider file.\nbash -l -c \"./Pods/Target\\ Support\\ Files/Pods-Menulio/expo-configure-project.sh\"\n"; + }; + 800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Menulio/Pods-Menulio-resources.sh", + "${PODS_CONFIGURATION_BUILD_DIR}/EXConstants/EXConstants.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/EXConstants/ExpoConstants_privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/ExpoFileSystem/ExpoFileSystem_privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/PurchasesHybridCommon/PurchasesHybridCommon.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/RCT-Folly/RCT-Folly_privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/RNCAsyncStorage/RNCAsyncStorage_resources.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/React-Core_privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/React-cxxreact/React-cxxreact_privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/RevenueCat/RevenueCat.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/boost/boost_privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/glog/glog_privacy.bundle", + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXConstants.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoConstants_privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoFileSystem_privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/PurchasesHybridCommon.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RCT-Folly_privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNCAsyncStorage_resources.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/React-Core_privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/React-cxxreact_privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RevenueCat.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/boost_privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/glog_privacy.bundle", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Menulio/Pods-Menulio-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + EFB4C3DB6A514B0ADA511E60 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Menulio/Pods-Menulio-frameworks.sh", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes", + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Menulio/Pods-Menulio-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 13B07F871A680F5B00A75B9A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */, + 13B07FC11A68108700A75B9A /* main.m in Sources */, + B18059E884C0ABDD17F3DC3D /* ExpoModulesProvider.swift in Sources */, + 05BAC76EB2F44404BCDAFE0E /* noop-file.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 13B07F941A680F5B00A75B9A /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 6C2E3173556A471DD304B334 /* Pods-Menulio.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Menulio/Menulio.entitlements; + CURRENT_PROJECT_VERSION = 21; + ENABLE_BITCODE = NO; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + "FB_SONARKIT_ENABLED=1", + ); + INFOPLIST_FILE = Menulio/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 15.1; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MARKETING_VERSION = 1.0; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-lc++", + ); + OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; + PRODUCT_BUNDLE_IDENTIFIER = com.ayristech.menulio; + PRODUCT_NAME = Menulio; + SWIFT_OBJC_BRIDGING_HEADER = "Menulio/Menulio-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 13B07F951A680F5B00A75B9A /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7A4D352CD337FB3A3BF06240 /* Pods-Menulio.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Menulio/Menulio.entitlements; + CURRENT_PROJECT_VERSION = 21; + INFOPLIST_FILE = Menulio/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 15.1; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MARKETING_VERSION = 1.0; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-lc++", + ); + OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; + PRODUCT_BUNDLE_IDENTIFIER = com.ayristech.menulio; + PRODUCT_NAME = Menulio; + SWIFT_OBJC_BRIDGING_HEADER = "Menulio/Menulio-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; + 83CBBA201A601CBA00E9B192 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_CXX_LANGUAGE_STANDARD = "c++20"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 15.1; + LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)"; + LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift\"$(inherited)\""; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + OTHER_LDFLAGS = ( + "$(inherited)", + " ", + ); + REACT_NATIVE_PATH = "${PODS_ROOT}/../../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native"; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; + USE_HERMES = true; + }; + name = Debug; + }; + 83CBBA211A601CBA00E9B192 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_CXX_LANGUAGE_STANDARD = "c++20"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 15.1; + LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)"; + LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift\"$(inherited)\""; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ( + "$(inherited)", + " ", + ); + REACT_NATIVE_PATH = "${PODS_ROOT}/../../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native"; + SDKROOT = iphoneos; + USE_HERMES = true; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "Menulio" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 13B07F941A680F5B00A75B9A /* Debug */, + 13B07F951A680F5B00A75B9A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "Menulio" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 83CBBA201A601CBA00E9B192 /* Debug */, + 83CBBA211A601CBA00E9B192 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; +} diff --git a/apps/mobile/ios/Menulio.xcodeproj/xcshareddata/xcschemes/Menulio.xcscheme b/apps/mobile/ios/Menulio.xcodeproj/xcshareddata/xcschemes/Menulio.xcscheme new file mode 100644 index 0000000..3afd110 --- /dev/null +++ b/apps/mobile/ios/Menulio.xcodeproj/xcshareddata/xcschemes/Menulio.xcscheme @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/mobile/ios/Menulio.xcworkspace/contents.xcworkspacedata b/apps/mobile/ios/Menulio.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..750f6b5 --- /dev/null +++ b/apps/mobile/ios/Menulio.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/apps/mobile/ios/Menulio/AppDelegate.h b/apps/mobile/ios/Menulio/AppDelegate.h new file mode 100644 index 0000000..1658a43 --- /dev/null +++ b/apps/mobile/ios/Menulio/AppDelegate.h @@ -0,0 +1,7 @@ +#import +#import +#import + +@interface AppDelegate : EXAppDelegateWrapper + +@end diff --git a/apps/mobile/ios/Menulio/AppDelegate.mm b/apps/mobile/ios/Menulio/AppDelegate.mm new file mode 100644 index 0000000..b27f832 --- /dev/null +++ b/apps/mobile/ios/Menulio/AppDelegate.mm @@ -0,0 +1,62 @@ +#import "AppDelegate.h" + +#import +#import + +@implementation AppDelegate + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +{ + self.moduleName = @"main"; + + // You can add your custom initial props in the dictionary below. + // They will be passed down to the ViewController used by React Native. + self.initialProps = @{}; + + return [super application:application didFinishLaunchingWithOptions:launchOptions]; +} + +- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge +{ + return [self bundleURL]; +} + +- (NSURL *)bundleURL +{ +#if DEBUG + return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@".expo/.virtual-metro-entry"]; +#else + return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; +#endif +} + +// Linking API +- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary *)options { + return [super application:application openURL:url options:options] || [RCTLinkingManager application:application openURL:url options:options]; +} + +// Universal Links +- (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray> * _Nullable))restorationHandler { + BOOL result = [RCTLinkingManager application:application continueUserActivity:userActivity restorationHandler:restorationHandler]; + return [super application:application continueUserActivity:userActivity restorationHandler:restorationHandler] || result; +} + +// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries +- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken +{ + return [super application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken]; +} + +// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries +- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error +{ + return [super application:application didFailToRegisterForRemoteNotificationsWithError:error]; +} + +// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries +- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler +{ + return [super application:application didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler]; +} + +@end diff --git a/apps/mobile/ios/Menulio/Images.xcassets/AppIcon.appiconset/App-Icon-1024x1024@1x.png b/apps/mobile/ios/Menulio/Images.xcassets/AppIcon.appiconset/App-Icon-1024x1024@1x.png new file mode 100644 index 0000000..a808497 Binary files /dev/null and b/apps/mobile/ios/Menulio/Images.xcassets/AppIcon.appiconset/App-Icon-1024x1024@1x.png differ diff --git a/apps/mobile/ios/Menulio/Images.xcassets/AppIcon.appiconset/Contents.json b/apps/mobile/ios/Menulio/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..90d8d4c --- /dev/null +++ b/apps/mobile/ios/Menulio/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,14 @@ +{ + "images": [ + { + "filename": "App-Icon-1024x1024@1x.png", + "idiom": "universal", + "platform": "ios", + "size": "1024x1024" + } + ], + "info": { + "version": 1, + "author": "expo" + } +} \ No newline at end of file diff --git a/apps/mobile/ios/Menulio/Images.xcassets/Contents.json b/apps/mobile/ios/Menulio/Images.xcassets/Contents.json new file mode 100644 index 0000000..ed285c2 --- /dev/null +++ b/apps/mobile/ios/Menulio/Images.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "expo" + } +} diff --git a/apps/mobile/ios/Menulio/Images.xcassets/SplashScreenBackground.colorset/Contents.json b/apps/mobile/ios/Menulio/Images.xcassets/SplashScreenBackground.colorset/Contents.json new file mode 100644 index 0000000..4c90f97 --- /dev/null +++ b/apps/mobile/ios/Menulio/Images.xcassets/SplashScreenBackground.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors": [ + { + "color": { + "components": { + "alpha": "1.000", + "blue": "0.0666666666666667", + "green": "0.0509803921568627", + "red": "0.0352941176470588" + }, + "color-space": "srgb" + }, + "idiom": "universal" + } + ], + "info": { + "version": 1, + "author": "expo" + } +} \ No newline at end of file diff --git a/apps/mobile/ios/Menulio/Images.xcassets/SplashScreenLogo.imageset/Contents.json b/apps/mobile/ios/Menulio/Images.xcassets/SplashScreenLogo.imageset/Contents.json new file mode 100644 index 0000000..f65c008 --- /dev/null +++ b/apps/mobile/ios/Menulio/Images.xcassets/SplashScreenLogo.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images": [ + { + "idiom": "universal", + "filename": "image.png", + "scale": "1x" + }, + { + "idiom": "universal", + "filename": "image@2x.png", + "scale": "2x" + }, + { + "idiom": "universal", + "filename": "image@3x.png", + "scale": "3x" + } + ], + "info": { + "version": 1, + "author": "expo" + } +} \ No newline at end of file diff --git a/apps/mobile/ios/Menulio/Images.xcassets/SplashScreenLogo.imageset/image.png b/apps/mobile/ios/Menulio/Images.xcassets/SplashScreenLogo.imageset/image.png new file mode 100644 index 0000000..3a0ff52 Binary files /dev/null and b/apps/mobile/ios/Menulio/Images.xcassets/SplashScreenLogo.imageset/image.png differ diff --git a/apps/mobile/ios/Menulio/Images.xcassets/SplashScreenLogo.imageset/image@2x.png b/apps/mobile/ios/Menulio/Images.xcassets/SplashScreenLogo.imageset/image@2x.png new file mode 100644 index 0000000..3a0ff52 Binary files /dev/null and b/apps/mobile/ios/Menulio/Images.xcassets/SplashScreenLogo.imageset/image@2x.png differ diff --git a/apps/mobile/ios/Menulio/Images.xcassets/SplashScreenLogo.imageset/image@3x.png b/apps/mobile/ios/Menulio/Images.xcassets/SplashScreenLogo.imageset/image@3x.png new file mode 100644 index 0000000..3a0ff52 Binary files /dev/null and b/apps/mobile/ios/Menulio/Images.xcassets/SplashScreenLogo.imageset/image@3x.png differ diff --git a/apps/mobile/ios/Menulio/Info.plist b/apps/mobile/ios/Menulio/Info.plist new file mode 100644 index 0000000..a4bcbcd --- /dev/null +++ b/apps/mobile/ios/Menulio/Info.plist @@ -0,0 +1,87 @@ + + + + + CADisableMinimumFrameDurationOnPhone + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Menulio + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 0.0.1 + CFBundleSignature + ???? + CFBundleURLTypes + + + CFBundleURLSchemes + + menulio + com.ayristech.menulio + + + + CFBundleVersion + 21 + ITSAppUsesNonExemptEncryption + + LSMinimumSystemVersion + 12.0 + LSRequiresIPhoneOS + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + NSAllowsLocalNetworking + + + NSCameraUsageDescription + Menünüzün fotoğrafını çekerek AI ile dijitalleştirmek için kamera izni gereklidir. + NSMicrophoneUsageDescription + Allow $(PRODUCT_NAME) to access your microphone + NSPhotoLibraryUsageDescription + Menü fotoğraflarınızı ve restoran logonuzu yüklemek için galeri izni gereklidir. + NSUserActivityTypes + + $(PRODUCT_BUNDLE_IDENTIFIER).expo.index_route + + UILaunchStoryboardName + SplashScreen + UIRequiredDeviceCapabilities + + arm64 + + UIRequiresFullScreen + + UIStatusBarStyle + UIStatusBarStyleDefault + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIUserInterfaceStyle + Automatic + UIViewControllerBasedStatusBarAppearance + + + \ No newline at end of file diff --git a/apps/mobile/ios/Menulio/Menulio-Bridging-Header.h b/apps/mobile/ios/Menulio/Menulio-Bridging-Header.h new file mode 100644 index 0000000..e11d920 --- /dev/null +++ b/apps/mobile/ios/Menulio/Menulio-Bridging-Header.h @@ -0,0 +1,3 @@ +// +// Use this file to import your target's public headers that you would like to expose to Swift. +// diff --git a/apps/mobile/ios/Menulio/Menulio.entitlements b/apps/mobile/ios/Menulio/Menulio.entitlements new file mode 100644 index 0000000..f683276 --- /dev/null +++ b/apps/mobile/ios/Menulio/Menulio.entitlements @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/apps/mobile/ios/Menulio/PrivacyInfo.xcprivacy b/apps/mobile/ios/Menulio/PrivacyInfo.xcprivacy new file mode 100644 index 0000000..5bb83c5 --- /dev/null +++ b/apps/mobile/ios/Menulio/PrivacyInfo.xcprivacy @@ -0,0 +1,48 @@ + + + + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + CA92.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPITypeReasons + + 0A2A.1 + 3B52.1 + C617.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryDiskSpace + NSPrivacyAccessedAPITypeReasons + + E174.1 + 85F4.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategorySystemBootTime + NSPrivacyAccessedAPITypeReasons + + 35F9.1 + + + + NSPrivacyCollectedDataTypes + + NSPrivacyTracking + + + diff --git a/apps/mobile/ios/Menulio/SplashScreen.storyboard b/apps/mobile/ios/Menulio/SplashScreen.storyboard new file mode 100644 index 0000000..a7dd54c --- /dev/null +++ b/apps/mobile/ios/Menulio/SplashScreen.storyboard @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apps/mobile/ios/Menulio/Supporting/Expo.plist b/apps/mobile/ios/Menulio/Supporting/Expo.plist new file mode 100644 index 0000000..750be02 --- /dev/null +++ b/apps/mobile/ios/Menulio/Supporting/Expo.plist @@ -0,0 +1,12 @@ + + + + + EXUpdatesCheckOnLaunch + ALWAYS + EXUpdatesEnabled + + EXUpdatesLaunchWaitMs + 0 + + \ No newline at end of file diff --git a/apps/mobile/ios/Menulio/main.m b/apps/mobile/ios/Menulio/main.m new file mode 100644 index 0000000..25181b6 --- /dev/null +++ b/apps/mobile/ios/Menulio/main.m @@ -0,0 +1,10 @@ +#import + +#import "AppDelegate.h" + +int main(int argc, char * argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} + diff --git a/apps/mobile/ios/Menulio/noop-file.swift b/apps/mobile/ios/Menulio/noop-file.swift new file mode 100644 index 0000000..b2ffafb --- /dev/null +++ b/apps/mobile/ios/Menulio/noop-file.swift @@ -0,0 +1,4 @@ +// +// @generated +// A blank Swift file must be created for native modules with Swift files to work correctly. +// diff --git a/apps/mobile/ios/Podfile b/apps/mobile/ios/Podfile new file mode 100644 index 0000000..8bb6703 --- /dev/null +++ b/apps/mobile/ios/Podfile @@ -0,0 +1,66 @@ +require File.join(File.dirname(`node --print "require.resolve('expo/package.json')"`), "scripts/autolinking") +require File.join(File.dirname(`node --print "require.resolve('react-native/package.json')"`), "scripts/react_native_pods") + +require 'json' +podfile_properties = JSON.parse(File.read(File.join(__dir__, 'Podfile.properties.json'))) rescue {} + +ENV['RCT_NEW_ARCH_ENABLED'] = podfile_properties['newArchEnabled'] == 'true' ? '1' : '0' +ENV['EX_DEV_CLIENT_NETWORK_INSPECTOR'] = podfile_properties['EX_DEV_CLIENT_NETWORK_INSPECTOR'] + +platform :ios, podfile_properties['ios.deploymentTarget'] || '15.1' +install! 'cocoapods', + :deterministic_uuids => false + +prepare_react_native_project! + +target 'Menulio' do + use_expo_modules! + + if ENV['EXPO_USE_COMMUNITY_AUTOLINKING'] == '1' + config_command = ['node', '-e', "process.argv=['', '', 'config'];require('@react-native-community/cli').run()"]; + else + config_command = [ + 'node', + '--no-warnings', + '--eval', + 'require(require.resolve(\'expo-modules-autolinking\', { paths: [require.resolve(\'expo/package.json\')] }))(process.argv.slice(1))', + 'react-native-config', + '--json', + '--platform', + 'ios' + ] + end + + config = use_native_modules!(config_command) + + use_frameworks! :linkage => podfile_properties['ios.useFrameworks'].to_sym if podfile_properties['ios.useFrameworks'] + use_frameworks! :linkage => ENV['USE_FRAMEWORKS'].to_sym if ENV['USE_FRAMEWORKS'] + + use_react_native!( + :path => config[:reactNativePath], + :hermes_enabled => podfile_properties['expo.jsEngine'] == nil || podfile_properties['expo.jsEngine'] == 'hermes', + # An absolute path to your application root. + :app_path => "#{Pod::Config.instance.installation_root}/..", + :privacy_file_aggregation_enabled => podfile_properties['apple.privacyManifestAggregationEnabled'] != 'false', + ) + + post_install do |installer| + react_native_post_install( + installer, + config[:reactNativePath], + :mac_catalyst_enabled => false, + :ccache_enabled => podfile_properties['apple.ccacheEnabled'] == 'true', + ) + + # This is necessary for Xcode 14, because it signs resource bundles by default + # when building for devices. + installer.target_installation_results.pod_target_installation_results + .each do |pod_name, target_installation_result| + target_installation_result.resource_bundle_targets.each do |resource_bundle_target| + resource_bundle_target.build_configurations.each do |config| + config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO' + end + end + end + end +end diff --git a/apps/mobile/ios/Podfile.lock b/apps/mobile/ios/Podfile.lock new file mode 100644 index 0000000..9e610f2 --- /dev/null +++ b/apps/mobile/ios/Podfile.lock @@ -0,0 +1,2184 @@ +PODS: + - boost (1.84.0) + - DoubleConversion (1.1.6) + - EXConstants (17.0.8): + - ExpoModulesCore + - EXImageLoader (5.0.0): + - ExpoModulesCore + - React-Core + - Expo (52.0.49): + - ExpoModulesCore + - ExpoAsset (11.0.5): + - ExpoModulesCore + - ExpoClipboard (7.0.1): + - ExpoModulesCore + - ExpoFileSystem (18.0.12): + - ExpoModulesCore + - ExpoFont (13.0.4): + - ExpoModulesCore + - ExpoHaptics (14.0.1): + - ExpoModulesCore + - ExpoHead (4.0.22): + - ExpoModulesCore + - ExpoImagePicker (16.0.6): + - ExpoModulesCore + - ExpoKeepAwake (14.0.3): + - ExpoModulesCore + - ExpoLinking (7.0.5): + - ExpoModulesCore + - ExpoModulesCore (2.2.3): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsinspector + - React-NativeModulesApple + - React-RCTAppDelegate + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - ExpoPrint (14.0.3): + - ExpoModulesCore + - ExpoSharing (13.0.1): + - ExpoModulesCore + - ExpoSplashScreen (0.29.24): + - ExpoModulesCore + - fast_float (6.1.4) + - FBLazyVector (0.76.9) + - fmt (11.0.2) + - glog (0.3.5) + - hermes-engine (0.76.9): + - hermes-engine/Pre-built (= 0.76.9) + - hermes-engine/Pre-built (0.76.9) + - PurchasesHybridCommon (14.3.0): + - RevenueCat (= 5.32.0) + - RCT-Folly (2024.10.14.00): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly/Default (= 2024.10.14.00) + - RCT-Folly/Default (2024.10.14.00): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly/Fabric (2024.10.14.00): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - RCTDeprecation (0.76.9) + - RCTRequired (0.76.9) + - RCTTypeSafety (0.76.9): + - FBLazyVector (= 0.76.9) + - RCTRequired (= 0.76.9) + - React-Core (= 0.76.9) + - React (0.76.9): + - React-Core (= 0.76.9) + - React-Core/DevSupport (= 0.76.9) + - React-Core/RCTWebSocket (= 0.76.9) + - React-RCTActionSheet (= 0.76.9) + - React-RCTAnimation (= 0.76.9) + - React-RCTBlob (= 0.76.9) + - React-RCTImage (= 0.76.9) + - React-RCTLinking (= 0.76.9) + - React-RCTNetwork (= 0.76.9) + - React-RCTSettings (= 0.76.9) + - React-RCTText (= 0.76.9) + - React-RCTVibration (= 0.76.9) + - React-callinvoker (0.76.9) + - React-Core (0.76.9): + - glog + - hermes-engine + - RCT-Folly (= 2024.10.14.00) + - RCTDeprecation + - React-Core/Default (= 0.76.9) + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.1) + - Yoga + - React-Core/CoreModulesHeaders (0.76.9): + - glog + - hermes-engine + - RCT-Folly (= 2024.10.14.00) + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.1) + - Yoga + - React-Core/Default (0.76.9): + - glog + - hermes-engine + - RCT-Folly (= 2024.10.14.00) + - RCTDeprecation + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.1) + - Yoga + - React-Core/DevSupport (0.76.9): + - glog + - hermes-engine + - RCT-Folly (= 2024.10.14.00) + - RCTDeprecation + - React-Core/Default (= 0.76.9) + - React-Core/RCTWebSocket (= 0.76.9) + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.1) + - Yoga + - React-Core/RCTActionSheetHeaders (0.76.9): + - glog + - hermes-engine + - RCT-Folly (= 2024.10.14.00) + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.1) + - Yoga + - React-Core/RCTAnimationHeaders (0.76.9): + - glog + - hermes-engine + - RCT-Folly (= 2024.10.14.00) + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.1) + - Yoga + - React-Core/RCTBlobHeaders (0.76.9): + - glog + - hermes-engine + - RCT-Folly (= 2024.10.14.00) + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.1) + - Yoga + - React-Core/RCTImageHeaders (0.76.9): + - glog + - hermes-engine + - RCT-Folly (= 2024.10.14.00) + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.1) + - Yoga + - React-Core/RCTLinkingHeaders (0.76.9): + - glog + - hermes-engine + - RCT-Folly (= 2024.10.14.00) + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.1) + - Yoga + - React-Core/RCTNetworkHeaders (0.76.9): + - glog + - hermes-engine + - RCT-Folly (= 2024.10.14.00) + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.1) + - Yoga + - React-Core/RCTSettingsHeaders (0.76.9): + - glog + - hermes-engine + - RCT-Folly (= 2024.10.14.00) + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.1) + - Yoga + - React-Core/RCTTextHeaders (0.76.9): + - glog + - hermes-engine + - RCT-Folly (= 2024.10.14.00) + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.1) + - Yoga + - React-Core/RCTVibrationHeaders (0.76.9): + - glog + - hermes-engine + - RCT-Folly (= 2024.10.14.00) + - RCTDeprecation + - React-Core/Default + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.1) + - Yoga + - React-Core/RCTWebSocket (0.76.9): + - glog + - hermes-engine + - RCT-Folly (= 2024.10.14.00) + - RCTDeprecation + - React-Core/Default (= 0.76.9) + - React-cxxreact + - React-featureflags + - React-hermes + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimescheduler + - React-utils + - SocketRocket (= 0.7.1) + - Yoga + - React-CoreModules (0.76.9): + - DoubleConversion + - fast_float + - fmt + - RCT-Folly + - RCTTypeSafety + - React-Core/CoreModulesHeaders + - React-jsi + - React-jsinspector + - React-NativeModulesApple + - React-RCTBlob + - React-RCTImage + - ReactCodegen + - ReactCommon + - SocketRocket + - React-cxxreact (0.76.9): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - React-callinvoker + - React-debug + - React-jsi + - React-jsinspector + - React-logger + - React-perflogger + - React-runtimeexecutor + - React-timing + - React-debug (0.76.9) + - React-defaultsnativemodule (0.76.9): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-domnativemodule + - React-Fabric + - React-featureflags + - React-featureflagsnativemodule + - React-graphics + - React-idlecallbacksnativemodule + - React-ImageManager + - React-microtasksnativemodule + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - React-domnativemodule (0.76.9): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-FabricComponents + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - React-Fabric (0.76.9): + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/animations (= 0.76.9) + - React-Fabric/attributedstring (= 0.76.9) + - React-Fabric/componentregistry (= 0.76.9) + - React-Fabric/componentregistrynative (= 0.76.9) + - React-Fabric/components (= 0.76.9) + - React-Fabric/core (= 0.76.9) + - React-Fabric/dom (= 0.76.9) + - React-Fabric/imagemanager (= 0.76.9) + - React-Fabric/leakchecker (= 0.76.9) + - React-Fabric/mounting (= 0.76.9) + - React-Fabric/observers (= 0.76.9) + - React-Fabric/scheduler (= 0.76.9) + - React-Fabric/telemetry (= 0.76.9) + - React-Fabric/templateprocessor (= 0.76.9) + - React-Fabric/uimanager (= 0.76.9) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/animations (0.76.9): + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/attributedstring (0.76.9): + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/componentregistry (0.76.9): + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/componentregistrynative (0.76.9): + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/components (0.76.9): + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/components/legacyviewmanagerinterop (= 0.76.9) + - React-Fabric/components/root (= 0.76.9) + - React-Fabric/components/view (= 0.76.9) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/components/legacyviewmanagerinterop (0.76.9): + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/components/root (0.76.9): + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/components/view (0.76.9): + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - Yoga + - React-Fabric/core (0.76.9): + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/dom (0.76.9): + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/imagemanager (0.76.9): + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/leakchecker (0.76.9): + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/mounting (0.76.9): + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/observers (0.76.9): + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/observers/events (= 0.76.9) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/observers/events (0.76.9): + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/scheduler (0.76.9): + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/observers/events + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-performancetimeline + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/telemetry (0.76.9): + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/templateprocessor (0.76.9): + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/uimanager (0.76.9): + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric/uimanager/consistency (= 0.76.9) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererconsistency + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-Fabric/uimanager/consistency (0.76.9): + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererconsistency + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCommon/turbomodule/core + - React-FabricComponents (0.76.9): + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-FabricComponents/components (= 0.76.9) + - React-FabricComponents/textlayoutmanager (= 0.76.9) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components (0.76.9): + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-FabricComponents/components/inputaccessory (= 0.76.9) + - React-FabricComponents/components/iostextinput (= 0.76.9) + - React-FabricComponents/components/modal (= 0.76.9) + - React-FabricComponents/components/rncore (= 0.76.9) + - React-FabricComponents/components/safeareaview (= 0.76.9) + - React-FabricComponents/components/scrollview (= 0.76.9) + - React-FabricComponents/components/text (= 0.76.9) + - React-FabricComponents/components/textinput (= 0.76.9) + - React-FabricComponents/components/unimplementedview (= 0.76.9) + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/inputaccessory (0.76.9): + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/iostextinput (0.76.9): + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/modal (0.76.9): + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/rncore (0.76.9): + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/safeareaview (0.76.9): + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/scrollview (0.76.9): + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/text (0.76.9): + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/textinput (0.76.9): + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/components/unimplementedview (0.76.9): + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricComponents/textlayoutmanager (0.76.9): + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-cxxreact + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/core + - Yoga + - React-FabricImage (0.76.9): + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly/Fabric + - RCTRequired + - RCTTypeSafety + - React-Fabric + - React-graphics + - React-ImageManager + - React-jsi + - React-jsiexecutor + - React-logger + - React-rendererdebug + - React-utils + - ReactCommon + - Yoga + - React-featureflags (0.76.9) + - React-featureflagsnativemodule (0.76.9): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - React-graphics (0.76.9): + - DoubleConversion + - fast_float + - fmt + - glog + - RCT-Folly/Fabric + - React-jsi + - React-jsiexecutor + - React-utils + - React-hermes (0.76.9): + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - React-cxxreact + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-perflogger + - React-runtimeexecutor + - React-idlecallbacksnativemodule (0.76.9): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - React-ImageManager (0.76.9): + - glog + - RCT-Folly/Fabric + - React-Core/Default + - React-debug + - React-Fabric + - React-graphics + - React-rendererdebug + - React-utils + - React-jserrorhandler (0.76.9): + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.10.14.00) + - React-cxxreact + - React-debug + - React-jsi + - React-jsi (0.76.9): + - boost + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - React-jsiexecutor (0.76.9): + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - React-cxxreact + - React-jsi + - React-jsinspector + - React-perflogger + - React-jsinspector (0.76.9): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly + - React-featureflags + - React-jsi + - React-perflogger + - React-runtimeexecutor + - React-jsitracing (0.76.9): + - React-jsi + - React-logger (0.76.9): + - glog + - React-Mapbuffer (0.76.9): + - glog + - React-debug + - React-microtasksnativemodule (0.76.9): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - react-native-safe-area-context (4.12.0): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - react-native-safe-area-context/common (= 4.12.0) + - react-native-safe-area-context/fabric (= 4.12.0) + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - react-native-safe-area-context/common (4.12.0): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - react-native-safe-area-context/fabric (4.12.0): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - react-native-safe-area-context/common + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - react-native-view-shot (4.0.3): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - React-nativeconfig (0.76.9) + - React-NativeModulesApple (0.76.9): + - glog + - hermes-engine + - React-callinvoker + - React-Core + - React-cxxreact + - React-jsi + - React-jsinspector + - React-runtimeexecutor + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - React-perflogger (0.76.9): + - DoubleConversion + - RCT-Folly (= 2024.10.14.00) + - React-performancetimeline (0.76.9): + - RCT-Folly (= 2024.10.14.00) + - React-cxxreact + - React-timing + - React-RCTActionSheet (0.76.9): + - React-Core/RCTActionSheetHeaders (= 0.76.9) + - React-RCTAnimation (0.76.9): + - RCT-Folly (= 2024.10.14.00) + - RCTTypeSafety + - React-Core/RCTAnimationHeaders + - React-jsi + - React-NativeModulesApple + - ReactCodegen + - ReactCommon + - React-RCTAppDelegate (0.76.9): + - RCT-Folly (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-CoreModules + - React-debug + - React-defaultsnativemodule + - React-Fabric + - React-featureflags + - React-graphics + - React-hermes + - React-nativeconfig + - React-NativeModulesApple + - React-RCTFabric + - React-RCTImage + - React-RCTNetwork + - React-rendererdebug + - React-RuntimeApple + - React-RuntimeCore + - React-RuntimeHermes + - React-runtimescheduler + - React-utils + - ReactCodegen + - ReactCommon + - React-RCTBlob (0.76.9): + - DoubleConversion + - fast_float + - fmt + - hermes-engine + - RCT-Folly (= 2024.10.14.00) + - React-Core/RCTBlobHeaders + - React-Core/RCTWebSocket + - React-jsi + - React-jsinspector + - React-NativeModulesApple + - React-RCTNetwork + - ReactCodegen + - ReactCommon + - React-RCTFabric (0.76.9): + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.10.14.00) + - React-Core + - React-debug + - React-Fabric + - React-FabricComponents + - React-FabricImage + - React-featureflags + - React-graphics + - React-ImageManager + - React-jsi + - React-jsinspector + - React-nativeconfig + - React-performancetimeline + - React-RCTImage + - React-RCTText + - React-rendererconsistency + - React-rendererdebug + - React-runtimescheduler + - React-utils + - Yoga + - React-RCTImage (0.76.9): + - RCT-Folly (= 2024.10.14.00) + - RCTTypeSafety + - React-Core/RCTImageHeaders + - React-jsi + - React-NativeModulesApple + - React-RCTNetwork + - ReactCodegen + - ReactCommon + - React-RCTLinking (0.76.9): + - React-Core/RCTLinkingHeaders (= 0.76.9) + - React-jsi (= 0.76.9) + - React-NativeModulesApple + - ReactCodegen + - ReactCommon + - ReactCommon/turbomodule/core (= 0.76.9) + - React-RCTNetwork (0.76.9): + - RCT-Folly (= 2024.10.14.00) + - RCTTypeSafety + - React-Core/RCTNetworkHeaders + - React-jsi + - React-NativeModulesApple + - ReactCodegen + - ReactCommon + - React-RCTSettings (0.76.9): + - RCT-Folly (= 2024.10.14.00) + - RCTTypeSafety + - React-Core/RCTSettingsHeaders + - React-jsi + - React-NativeModulesApple + - ReactCodegen + - ReactCommon + - React-RCTText (0.76.9): + - React-Core/RCTTextHeaders (= 0.76.9) + - Yoga + - React-RCTVibration (0.76.9): + - RCT-Folly (= 2024.10.14.00) + - React-Core/RCTVibrationHeaders + - React-jsi + - React-NativeModulesApple + - ReactCodegen + - ReactCommon + - React-rendererconsistency (0.76.9) + - React-rendererdebug (0.76.9): + - DoubleConversion + - fast_float + - fmt + - RCT-Folly + - React-debug + - React-rncore (0.76.9) + - React-RuntimeApple (0.76.9): + - hermes-engine + - RCT-Folly/Fabric (= 2024.10.14.00) + - React-callinvoker + - React-Core/Default + - React-CoreModules + - React-cxxreact + - React-jserrorhandler + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-Mapbuffer + - React-NativeModulesApple + - React-RCTFabric + - React-RuntimeCore + - React-runtimeexecutor + - React-RuntimeHermes + - React-runtimescheduler + - React-utils + - React-RuntimeCore (0.76.9): + - glog + - hermes-engine + - RCT-Folly/Fabric (= 2024.10.14.00) + - React-cxxreact + - React-featureflags + - React-jserrorhandler + - React-jsi + - React-jsiexecutor + - React-jsinspector + - React-performancetimeline + - React-runtimeexecutor + - React-runtimescheduler + - React-utils + - React-runtimeexecutor (0.76.9): + - React-jsi (= 0.76.9) + - React-RuntimeHermes (0.76.9): + - hermes-engine + - RCT-Folly/Fabric (= 2024.10.14.00) + - React-featureflags + - React-hermes + - React-jsi + - React-jsinspector + - React-jsitracing + - React-nativeconfig + - React-RuntimeCore + - React-utils + - React-runtimescheduler (0.76.9): + - glog + - hermes-engine + - RCT-Folly (= 2024.10.14.00) + - React-callinvoker + - React-cxxreact + - React-debug + - React-featureflags + - React-jsi + - React-performancetimeline + - React-rendererconsistency + - React-rendererdebug + - React-runtimeexecutor + - React-timing + - React-utils + - React-timing (0.76.9) + - React-utils (0.76.9): + - glog + - hermes-engine + - RCT-Folly (= 2024.10.14.00) + - React-debug + - React-jsi (= 0.76.9) + - ReactCodegen (0.76.9): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-FabricImage + - React-featureflags + - React-graphics + - React-jsi + - React-jsiexecutor + - React-NativeModulesApple + - React-rendererdebug + - React-utils + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - ReactCommon (0.76.9): + - ReactCommon/turbomodule (= 0.76.9) + - ReactCommon/turbomodule (0.76.9): + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - React-callinvoker + - React-cxxreact + - React-jsi + - React-logger + - React-perflogger + - ReactCommon/turbomodule/bridging (= 0.76.9) + - ReactCommon/turbomodule/core (= 0.76.9) + - ReactCommon/turbomodule/bridging (0.76.9): + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - React-callinvoker + - React-cxxreact + - React-jsi (= 0.76.9) + - React-logger + - React-perflogger + - ReactCommon/turbomodule/core (0.76.9): + - DoubleConversion + - fast_float + - fmt + - glog + - hermes-engine + - RCT-Folly + - React-callinvoker + - React-cxxreact + - React-debug (= 0.76.9) + - React-featureflags (= 0.76.9) + - React-jsi + - React-logger + - React-perflogger + - React-utils (= 0.76.9) + - RevenueCat (5.32.0) + - RNCAsyncStorage (1.23.1): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - RNPurchases (8.12.0): + - PurchasesHybridCommon (= 14.3.0) + - React-Core + - RNScreens (4.4.0): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-RCTImage + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - RNScreens/common (= 4.4.0) + - Yoga + - RNScreens/common (4.4.0): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-RCTImage + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - RNSVG (15.8.0): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - RNSVG/common (= 15.8.0) + - Yoga + - RNSVG/common (15.8.0): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.10.14.00) + - RCTRequired + - RCTTypeSafety + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCodegen + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - SocketRocket (0.7.1) + - Yoga (0.0.0) + +DEPENDENCIES: + - "boost (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/third-party-podspecs/boost.podspec`)" + - "DoubleConversion (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`)" + - "EXConstants (from `../../../node_modules/.pnpm/expo-constants@17.0.8_expo@52.0.49_@babel+core@7.29.7_supports-color@8.1.1__@babel+pres_b801bbd154cd16038b920db8db489971/node_modules/expo-constants/ios`)" + - "EXImageLoader (from `../../../node_modules/.pnpm/expo-image-loader@5.0.0_expo@52.0.49_@babel+core@7.29.7_supports-color@8.1.1__@babel+pr_38acf5175bf76221d6b69d5d2d9fb25f/node_modules/expo-image-loader/ios`)" + - "Expo (from `../../../node_modules/.pnpm/expo@52.0.49_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@babel+c_ec045208c4fa47c965abfc0c80abf5b4/node_modules/expo`)" + - "ExpoAsset (from `../../../node_modules/.pnpm/expo-asset@11.0.5_expo@52.0.49_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-e_5df066e54baa9d5f6c18542a89042ace/node_modules/expo-asset/ios`)" + - "ExpoClipboard (from `../../../node_modules/.pnpm/expo-clipboard@7.0.1_expo@52.0.49_@babel+core@7.29.7_supports-color@8.1.1__@babel+prese_eadd8a964cb4c1de2a1d5474d984a8e1/node_modules/expo-clipboard/ios`)" + - "ExpoFileSystem (from `../../../node_modules/.pnpm/expo-file-system@18.0.12_expo@52.0.49_@babel+core@7.29.7_supports-color@8.1.1__@babel+p_ea5f99004754598d90da45e31a1214db/node_modules/expo-file-system/ios`)" + - "ExpoFont (from `../../../node_modules/.pnpm/expo-font@13.0.4_expo@52.0.49_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-en_9dba8d3d0862409c377a5b0573c45ad8/node_modules/expo-font/ios`)" + - "ExpoHaptics (from `../../../node_modules/.pnpm/expo-haptics@14.0.1_expo@52.0.49_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset_845ec96e9b0fe9282c13db4f9cd0e7f4/node_modules/expo-haptics/ios`)" + - "ExpoHead (from `../../../node_modules/.pnpm/expo-router@4.0.22_1482d1318244a89f06fcfc2b6da7d585/node_modules/expo-router/ios`)" + - "ExpoImagePicker (from `../../../node_modules/.pnpm/expo-image-picker@16.0.6_expo@52.0.49_@babel+core@7.29.7_supports-color@8.1.1__@babel+p_dd1488ef1e0e0ba25b631ca6a90a1124/node_modules/expo-image-picker/ios`)" + - "ExpoKeepAwake (from `../../../node_modules/.pnpm/expo-keep-awake@14.0.3_expo@52.0.49_@babel+core@7.29.7_supports-color@8.1.1__@babel+pre_a32272609596d97597de2476fd7afa54/node_modules/expo-keep-awake/ios`)" + - "ExpoLinking (from `../../../node_modules/.pnpm/expo-linking@7.0.5_expo@52.0.49_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-_1663ef9cd54adc096c131a3c16944b81/node_modules/expo-linking/ios`)" + - "ExpoModulesCore (from `../../../node_modules/.pnpm/expo-modules-core@2.2.3/node_modules/expo-modules-core`)" + - "ExpoPrint (from `../../../node_modules/.pnpm/expo-print@14.0.3_expo@52.0.49_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-e_f2e3df7b74e3b1346ac9060be34eef63/node_modules/expo-print/ios`)" + - "ExpoSharing (from `../../../node_modules/.pnpm/expo-sharing@13.0.1_expo@52.0.49_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset_de4f813fd5fe41dca71524cf7a9c6cee/node_modules/expo-sharing/ios`)" + - "ExpoSplashScreen (from `../../../node_modules/.pnpm/expo-splash-screen@0.29.24_expo@52.0.49_@babel+core@7.29.7_supports-color@8.1.1__@babel_b22696df3957bd8a6b558e665f12f019/node_modules/expo-splash-screen/ios`)" + - "fast_float (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/third-party-podspecs/fast_float.podspec`)" + - "FBLazyVector (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/Libraries/FBLazyVector`)" + - "fmt (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/third-party-podspecs/fmt.podspec`)" + - "glog (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/third-party-podspecs/glog.podspec`)" + - "hermes-engine (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`)" + - "RCT-Folly (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`)" + - "RCT-Folly/Fabric (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`)" + - "RCTDeprecation (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation`)" + - "RCTRequired (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/Libraries/Required`)" + - "RCTTypeSafety (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/Libraries/TypeSafety`)" + - "React (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/`)" + - "React-callinvoker (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/callinvoker`)" + - "React-Core (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/`)" + - "React-Core/RCTWebSocket (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/`)" + - "React-CoreModules (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/React/CoreModules`)" + - "React-cxxreact (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/cxxreact`)" + - "React-debug (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/react/debug`)" + - "React-defaultsnativemodule (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/react/nativemodule/defaults`)" + - "React-domnativemodule (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/react/nativemodule/dom`)" + - "React-Fabric (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon`)" + - "React-FabricComponents (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon`)" + - "React-FabricImage (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon`)" + - "React-featureflags (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/react/featureflags`)" + - "React-featureflagsnativemodule (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/react/nativemodule/featureflags`)" + - "React-graphics (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/react/renderer/graphics`)" + - "React-hermes (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/hermes`)" + - "React-idlecallbacksnativemodule (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks`)" + - "React-ImageManager (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios`)" + - "React-jserrorhandler (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/jserrorhandler`)" + - "React-jsi (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/jsi`)" + - "React-jsiexecutor (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/jsiexecutor`)" + - "React-jsinspector (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/jsinspector-modern`)" + - "React-jsitracing (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/hermes/executor/`)" + - "React-logger (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/logger`)" + - "React-Mapbuffer (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon`)" + - "React-microtasksnativemodule (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/react/nativemodule/microtasks`)" + - react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`) + - react-native-view-shot (from `../node_modules/react-native-view-shot`) + - "React-nativeconfig (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon`)" + - "React-NativeModulesApple (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`)" + - "React-perflogger (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/reactperflogger`)" + - "React-performancetimeline (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/react/performance/timeline`)" + - "React-RCTActionSheet (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/Libraries/ActionSheetIOS`)" + - "React-RCTAnimation (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/Libraries/NativeAnimation`)" + - "React-RCTAppDelegate (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/Libraries/AppDelegate`)" + - "React-RCTBlob (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/Libraries/Blob`)" + - "React-RCTFabric (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/React`)" + - "React-RCTImage (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/Libraries/Image`)" + - "React-RCTLinking (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/Libraries/LinkingIOS`)" + - "React-RCTNetwork (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/Libraries/Network`)" + - "React-RCTSettings (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/Libraries/Settings`)" + - "React-RCTText (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/Libraries/Text`)" + - "React-RCTVibration (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/Libraries/Vibration`)" + - "React-rendererconsistency (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/react/renderer/consistency`)" + - "React-rendererdebug (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/react/renderer/debug`)" + - "React-rncore (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon`)" + - "React-RuntimeApple (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/react/runtime/platform/ios`)" + - "React-RuntimeCore (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/react/runtime`)" + - "React-runtimeexecutor (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/runtimeexecutor`)" + - "React-RuntimeHermes (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/react/runtime`)" + - "React-runtimescheduler (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/react/renderer/runtimescheduler`)" + - "React-timing (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/react/timing`)" + - "React-utils (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/react/utils`)" + - ReactCodegen (from `build/generated/ios`) + - "ReactCommon/turbomodule/core (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon`)" + - "RNCAsyncStorage (from `../node_modules/@react-native-async-storage/async-storage`)" + - RNPurchases (from `../node_modules/react-native-purchases`) + - RNScreens (from `../node_modules/react-native-screens`) + - RNSVG (from `../node_modules/react-native-svg`) + - "Yoga (from `../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/yoga`)" + +SPEC REPOS: + trunk: + - PurchasesHybridCommon + - RevenueCat + - SocketRocket + +EXTERNAL SOURCES: + boost: + :podspec: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/third-party-podspecs/boost.podspec" + DoubleConversion: + :podspec: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" + EXConstants: + :path: "../../../node_modules/.pnpm/expo-constants@17.0.8_expo@52.0.49_@babel+core@7.29.7_supports-color@8.1.1__@babel+pres_b801bbd154cd16038b920db8db489971/node_modules/expo-constants/ios" + EXImageLoader: + :path: "../../../node_modules/.pnpm/expo-image-loader@5.0.0_expo@52.0.49_@babel+core@7.29.7_supports-color@8.1.1__@babel+pr_38acf5175bf76221d6b69d5d2d9fb25f/node_modules/expo-image-loader/ios" + Expo: + :path: "../../../node_modules/.pnpm/expo@52.0.49_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@babel+c_ec045208c4fa47c965abfc0c80abf5b4/node_modules/expo" + ExpoAsset: + :path: "../../../node_modules/.pnpm/expo-asset@11.0.5_expo@52.0.49_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-e_5df066e54baa9d5f6c18542a89042ace/node_modules/expo-asset/ios" + ExpoClipboard: + :path: "../../../node_modules/.pnpm/expo-clipboard@7.0.1_expo@52.0.49_@babel+core@7.29.7_supports-color@8.1.1__@babel+prese_eadd8a964cb4c1de2a1d5474d984a8e1/node_modules/expo-clipboard/ios" + ExpoFileSystem: + :path: "../../../node_modules/.pnpm/expo-file-system@18.0.12_expo@52.0.49_@babel+core@7.29.7_supports-color@8.1.1__@babel+p_ea5f99004754598d90da45e31a1214db/node_modules/expo-file-system/ios" + ExpoFont: + :path: "../../../node_modules/.pnpm/expo-font@13.0.4_expo@52.0.49_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-en_9dba8d3d0862409c377a5b0573c45ad8/node_modules/expo-font/ios" + ExpoHaptics: + :path: "../../../node_modules/.pnpm/expo-haptics@14.0.1_expo@52.0.49_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset_845ec96e9b0fe9282c13db4f9cd0e7f4/node_modules/expo-haptics/ios" + ExpoHead: + :path: "../../../node_modules/.pnpm/expo-router@4.0.22_1482d1318244a89f06fcfc2b6da7d585/node_modules/expo-router/ios" + ExpoImagePicker: + :path: "../../../node_modules/.pnpm/expo-image-picker@16.0.6_expo@52.0.49_@babel+core@7.29.7_supports-color@8.1.1__@babel+p_dd1488ef1e0e0ba25b631ca6a90a1124/node_modules/expo-image-picker/ios" + ExpoKeepAwake: + :path: "../../../node_modules/.pnpm/expo-keep-awake@14.0.3_expo@52.0.49_@babel+core@7.29.7_supports-color@8.1.1__@babel+pre_a32272609596d97597de2476fd7afa54/node_modules/expo-keep-awake/ios" + ExpoLinking: + :path: "../../../node_modules/.pnpm/expo-linking@7.0.5_expo@52.0.49_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-_1663ef9cd54adc096c131a3c16944b81/node_modules/expo-linking/ios" + ExpoModulesCore: + :path: "../../../node_modules/.pnpm/expo-modules-core@2.2.3/node_modules/expo-modules-core" + ExpoPrint: + :path: "../../../node_modules/.pnpm/expo-print@14.0.3_expo@52.0.49_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-e_f2e3df7b74e3b1346ac9060be34eef63/node_modules/expo-print/ios" + ExpoSharing: + :path: "../../../node_modules/.pnpm/expo-sharing@13.0.1_expo@52.0.49_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset_de4f813fd5fe41dca71524cf7a9c6cee/node_modules/expo-sharing/ios" + ExpoSplashScreen: + :path: "../../../node_modules/.pnpm/expo-splash-screen@0.29.24_expo@52.0.49_@babel+core@7.29.7_supports-color@8.1.1__@babel_b22696df3957bd8a6b558e665f12f019/node_modules/expo-splash-screen/ios" + fast_float: + :podspec: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/third-party-podspecs/fast_float.podspec" + FBLazyVector: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/Libraries/FBLazyVector" + fmt: + :podspec: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/third-party-podspecs/fmt.podspec" + glog: + :podspec: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/third-party-podspecs/glog.podspec" + hermes-engine: + :podspec: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" + :tag: hermes-2024-11-12-RNv0.76.2-5b4aa20c719830dcf5684832b89a6edb95ac3d64 + RCT-Folly: + :podspec: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" + RCTDeprecation: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation" + RCTRequired: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/Libraries/Required" + RCTTypeSafety: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/Libraries/TypeSafety" + React: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/" + React-callinvoker: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/callinvoker" + React-Core: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/" + React-CoreModules: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/React/CoreModules" + React-cxxreact: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/cxxreact" + React-debug: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/react/debug" + React-defaultsnativemodule: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/react/nativemodule/defaults" + React-domnativemodule: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/react/nativemodule/dom" + React-Fabric: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon" + React-FabricComponents: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon" + React-FabricImage: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon" + React-featureflags: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/react/featureflags" + React-featureflagsnativemodule: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/react/nativemodule/featureflags" + React-graphics: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/react/renderer/graphics" + React-hermes: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/hermes" + React-idlecallbacksnativemodule: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks" + React-ImageManager: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios" + React-jserrorhandler: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/jserrorhandler" + React-jsi: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/jsi" + React-jsiexecutor: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/jsiexecutor" + React-jsinspector: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/jsinspector-modern" + React-jsitracing: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/hermes/executor/" + React-logger: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/logger" + React-Mapbuffer: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon" + React-microtasksnativemodule: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/react/nativemodule/microtasks" + react-native-safe-area-context: + :path: "../node_modules/react-native-safe-area-context" + react-native-view-shot: + :path: "../node_modules/react-native-view-shot" + React-nativeconfig: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon" + React-NativeModulesApple: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios" + React-perflogger: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/reactperflogger" + React-performancetimeline: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/react/performance/timeline" + React-RCTActionSheet: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/Libraries/ActionSheetIOS" + React-RCTAnimation: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/Libraries/NativeAnimation" + React-RCTAppDelegate: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/Libraries/AppDelegate" + React-RCTBlob: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/Libraries/Blob" + React-RCTFabric: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/React" + React-RCTImage: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/Libraries/Image" + React-RCTLinking: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/Libraries/LinkingIOS" + React-RCTNetwork: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/Libraries/Network" + React-RCTSettings: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/Libraries/Settings" + React-RCTText: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/Libraries/Text" + React-RCTVibration: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/Libraries/Vibration" + React-rendererconsistency: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/react/renderer/consistency" + React-rendererdebug: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/react/renderer/debug" + React-rncore: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon" + React-RuntimeApple: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/react/runtime/platform/ios" + React-RuntimeCore: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/react/runtime" + React-runtimeexecutor: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/runtimeexecutor" + React-RuntimeHermes: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/react/runtime" + React-runtimescheduler: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/react/renderer/runtimescheduler" + React-timing: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/react/timing" + React-utils: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/react/utils" + ReactCodegen: + :path: build/generated/ios + ReactCommon: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon" + RNCAsyncStorage: + :path: "../node_modules/@react-native-async-storage/async-storage" + RNPurchases: + :path: "../node_modules/react-native-purchases" + RNScreens: + :path: "../node_modules/react-native-screens" + RNSVG: + :path: "../node_modules/react-native-svg" + Yoga: + :path: "../../../node_modules/.pnpm/react-native@0.76.9_@babel+core@7.29.7_supports-color@8.1.1__@babel+preset-env@7.29.7_@_10f0e3ffd93936a63eed56e417b084b2/node_modules/react-native/ReactCommon/yoga" + +SPEC CHECKSUMS: + boost: 1dca942403ed9342f98334bf4c3621f011aa7946 + DoubleConversion: f16ae600a246532c4020132d54af21d0ddb2a385 + EXConstants: fcfc75800824ac2d5c592b5bc74130bad17b146b + EXImageLoader: e5da974e25b13585c196b658a440720c075482d5 + Expo: 4bb70893882e6382b41d1e910d7226c6a1b85f0a + ExpoAsset: 48386d40d53a8c1738929b3ed509bcad595b5516 + ExpoClipboard: 44fd1c8959ee8f6175d059dc011b154c9709a969 + ExpoFileSystem: 42d363d3b96f9afab980dcef60d5657a4443c655 + ExpoFont: f354e926f8feae5e831ec8087f36652b44a0b188 + ExpoHaptics: 8d199b2f33245ea85289ff6c954c7ee7c00a5b5d + ExpoHead: 2a14db58219c0a506e4a409ea83f884eab23f555 + ExpoImagePicker: 24e5ba8da111f74519b1e6dc556e0b438b2b8464 + ExpoKeepAwake: b0171a73665bfcefcfcc311742a72a956e6aa680 + ExpoLinking: 8d12bee174ba0cdf31239706578e29e74a417402 + ExpoModulesCore: c25d77625038b1968ea1afefc719862c0d8dd993 + ExpoPrint: 13208d67f48c190ccfeb9b97aa3394ff31ec606b + ExpoSharing: 849a5ce9985c22598c16ec027e32969be8062e8e + ExpoSplashScreen: 8261985ce9778f904abc7e31bed3538dce67ed4d + fast_float: 06eeec4fe712a76acc9376682e4808b05ce978b6 + FBLazyVector: 7605ea4810e0e10ae4815292433c09bf4324ba45 + fmt: 01b82d4ca6470831d1cc0852a1af644be019e8f6 + glog: 08b301085f15bcbb6ff8632a8ebaf239aae04e6a + hermes-engine: 9e868dc7be781364296d6ee2f56d0c1a9ef0bb11 + PurchasesHybridCommon: 7f0944cc5411bdcd1ea5d69affa6a6f9aaf87b13 + RCT-Folly: ea9d9256ba7f9322ef911169a9f696e5857b9e17 + RCTDeprecation: ebe712bb05077934b16c6bf25228bdec34b64f83 + RCTRequired: ca91e5dd26b64f577b528044c962baf171c6b716 + RCTTypeSafety: e7678bd60850ca5a41df9b8dc7154638cb66871f + React: 4641770499c39f45d4e7cde1eba30e081f9d8a3d + React-callinvoker: 4bef67b5c7f3f68db5929ab6a4d44b8a002998ea + React-Core: a68cea3e762814e60ecc3fa521c7f14c36c99245 + React-CoreModules: d81b1eaf8066add66299bab9d23c9f00c9484c7c + React-cxxreact: 984f8b1feeca37181d4e95301fcd6f5f6501c6ab + React-debug: 817160c07dc8d24d020fbd1eac7b3558ffc08964 + React-defaultsnativemodule: 18a684542f82ce1897552a1c4b847be414c9566e + React-domnativemodule: 90bdd4ec3ab38c47cfc3461c1e9283a8507d613f + React-Fabric: f6dade7007533daeb785ba5925039d83f343be4b + React-FabricComponents: b0655cc3e1b5ae12a4a1119aa7d8308f0ad33520 + React-FabricImage: 9b157c4c01ac2bf433f834f0e1e5fe234113a576 + React-featureflags: f2792b067a351d86fdc7bec23db3b9a2f2c8d26c + React-featureflagsnativemodule: 742a8325b3c821d2a1ca13a6d2a0fc72d04555e0 + React-graphics: 68969e4e49d73f89da7abef4116c9b5f466aa121 + React-hermes: ac0bcba26a5d288ebc99b500e1097da2d0297ddf + React-idlecallbacksnativemodule: d61d9c9816131bf70d3d80cd04889fc625ee523f + React-ImageManager: e906eec93a9eb6102a06576b89d48d80a4683020 + React-jserrorhandler: ac5dde01104ff444e043cad8f574ca02756e20d6 + React-jsi: 496fa2b9d63b726aeb07d0ac800064617d71211d + React-jsiexecutor: dd22ab48371b80f37a0a30d0e8915b6d0f43a893 + React-jsinspector: 4629ac376f5765e684d19064f2093e55c97fd086 + React-jsitracing: 7a1c9cd484248870cf660733cd3b8114d54c035f + React-logger: c4052eb941cca9a097ef01b59543a656dc088559 + React-Mapbuffer: 33546a3ebefbccb8770c33a1f8a5554fa96a54de + React-microtasksnativemodule: d80ff86c8902872d397d9622f1a97aadcc12cead + react-native-safe-area-context: cd916088cac5300c3266876218377518987b995e + react-native-view-shot: c6708fc5e7a841021007fdf7d6659d031e17efee + React-nativeconfig: 8efdb1ef1e9158c77098a93085438f7e7b463678 + React-NativeModulesApple: cebca2e5320a3d66e123cade23bd90a167ffce5e + React-perflogger: 72e653eb3aba9122f9e57cf012d22d2486f33358 + React-performancetimeline: cd6a9374a72001165995d2ab632f672df04076dc + React-RCTActionSheet: aacf2375084dea6e7c221f4a727e579f732ff342 + React-RCTAnimation: 395ab53fd064dff81507c15efb781c8684d9a585 + React-RCTAppDelegate: 345a6f1b82abc578437df0ce7e9c48740eca827c + React-RCTBlob: 13311e554c1a367de063c10ee7c5e6573b2dd1d6 + React-RCTFabric: 007b1a98201cc49b5bc6e1417d7fe3f6fc6e2b78 + React-RCTImage: 1b1f914bcc12187c49ba5d949dac38c2eb9f5cc8 + React-RCTLinking: 4ac7c42beb65e36fba0376f3498f3cd8dd0be7fa + React-RCTNetwork: 938902773add4381e84426a7aa17a2414f5f94f7 + React-RCTSettings: e848f1ba17a7a18479cf5a31d28145f567da8223 + React-RCTText: 7e98fafdde7d29e888b80f0b35544e0cb07913cf + React-RCTVibration: cd7d80affd97dc7afa62f9acd491419558b64b78 + React-rendererconsistency: b4917053ecbaa91469c67a4319701c9dc0d40be6 + React-rendererdebug: aa181c36dd6cf5b35511d1ed875d6638fd38f0ec + React-rncore: 120d21715c9b4ba8f798bffe986cb769b988dd74 + React-RuntimeApple: d033becbbd1eba6f9f6e3af6f1893030ce203edd + React-RuntimeCore: 38af280bb678e66ba000a3c3d42920b2a138eebb + React-runtimeexecutor: 877596f82f5632d073e121cba2d2084b76a76899 + React-RuntimeHermes: 37aad735ff21ca6de2d8450a96de1afe9f86c385 + React-runtimescheduler: 8ec34cc885281a34696ea16c4fd86892d631f38d + React-timing: 331cbf9f2668c67faddfd2e46bb7f41cbd9320b9 + React-utils: ed818f19ab445000d6b5c4efa9d462449326cc9f + ReactCodegen: 1aa612df173da78e51f2907d4a0fbd0c066fbfb6 + ReactCommon: 300d8d9c5cb1a6cd79a67cf5d8f91e4d477195f9 + RevenueCat: 7e1d0768fb287c9983173c9b28e39ccbeeb828a9 + RNCAsyncStorage: 66991bb6672ed988a8c56289a08bf4fc3a29d4b3 + RNPurchases: 6070b60f5d8f525a58905df50773f7a3252f0cfa + RNScreens: 362f4c861dd155f898908d5035d97b07a3f1a9d1 + RNSVG: b889dc9c1948eeea0576a16cc405c91c37a12c19 + SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 + Yoga: feb4910aba9742cfedc059e2b2902e22ffe9954a + +PODFILE CHECKSUM: c96bf84b6e3a6431be9930dba3f00e6c94fac904 + +COCOAPODS: 1.17.0 diff --git a/apps/mobile/ios/Podfile.properties.json b/apps/mobile/ios/Podfile.properties.json new file mode 100644 index 0000000..417e2e5 --- /dev/null +++ b/apps/mobile/ios/Podfile.properties.json @@ -0,0 +1,5 @@ +{ + "expo.jsEngine": "hermes", + "EX_DEV_CLIENT_NETWORK_INSPECTOR": "true", + "newArchEnabled": "true" +} diff --git a/apps/mobile/src/components/qr-canvas/CanvasLayerItem.tsx b/apps/mobile/src/components/qr-canvas/CanvasLayerItem.tsx index ebfa20d..bea9a39 100644 --- a/apps/mobile/src/components/qr-canvas/CanvasLayerItem.tsx +++ b/apps/mobile/src/components/qr-canvas/CanvasLayerItem.tsx @@ -1,11 +1,9 @@ import React, { useRef } from "react"; import { PanResponder, - Pressable, Text, View, } from "react-native"; -import { Ionicons } from "@expo/vector-icons"; import * as Haptics from "expo-haptics"; import { type CanvasTextLayer, getCanvasFontFamily } from "./types"; @@ -23,6 +21,78 @@ interface CanvasLayerItemProps { canvasHeight: number; } +export const CurvedTextNative: React.FC<{ + text: string; + fontSize: number; + color: string; + fontFamily: string; + fontWeight?: any; + letterSpacing?: number; + curveDegree: number; + hasShadow?: boolean; +}> = ({ + text, + fontSize, + color, + fontFamily, + fontWeight = "800", + letterSpacing = 0.5, + curveDegree, + hasShadow, +}) => { + const isUp = curveDegree > 0; + const absDegree = Math.abs(curveDegree); + const radius = Math.max(40, 420 - absDegree * 3.5); + const charWidth = fontSize * 0.52 + (letterSpacing || 0); + const numChars = text.length; + const arcLength = numChars * charWidth; + const totalAngleRad = arcLength / radius; + const stepRad = numChars > 1 ? totalAngleRad / (numChars - 1) : 0; + const startAngleRad = -totalAngleRad / 2; + + const maxOffsetY = Math.abs(-radius * (Math.cos(totalAngleRad / 2) - 1)); + const containerHeight = fontSize + maxOffsetY + 12; + const containerWidth = Math.max(numChars * charWidth, radius * 2 * Math.sin(totalAngleRad / 2)) + 16; + + return ( + + {text.split("").map((ch, i) => { + const angleRad = startAngleRad + i * stepRad; + const angleDeg = angleRad * (180 / Math.PI); + const charX = radius * Math.sin(angleRad); + const charY = isUp + ? -radius * (Math.cos(angleRad) - 1) + : radius * (Math.cos(angleRad) - 1); + const charRotate = isUp ? angleDeg : -angleDeg; + + return ( + + {ch === " " ? "\u00A0" : ch} + + ); + })} + + ); +}; + export const CanvasLayerItem: React.FC = ({ layer, isSelected, @@ -191,51 +261,35 @@ export const CanvasLayerItem: React.FC = ({ }} > - - {layer.text} - + {layer.curveDegree && layer.curveDegree !== 0 ? ( + + ) : ( + + {layer.text} + + )} - - {/* Seçili İken Üst Köşedeki Küçük Silme Rozeti */} - {isSelected && ( - { - e.stopPropagation?.(); - try { - Haptics.notificationAsync(Haptics.NotificationFeedbackType.Warning); - } catch {} - onDelete(layer.id); - }} - hitSlop={{ top: 8, bottom: 8, left: 8, right: 8 }} - style={{ - position: "absolute", - top: -8, - right: -8, - backgroundColor: "#EF4444", - width: 18, - height: 18, - borderRadius: 9, - alignItems: "center", - justifyContent: "center", - borderWidth: 1.5, - borderColor: "#0C0C0E", - }} - > - - - )} ); diff --git a/apps/mobile/src/components/qr-canvas/InstagramTextEditorModal.tsx b/apps/mobile/src/components/qr-canvas/InstagramTextEditorModal.tsx index f6793a8..6351425 100644 --- a/apps/mobile/src/components/qr-canvas/InstagramTextEditorModal.tsx +++ b/apps/mobile/src/components/qr-canvas/InstagramTextEditorModal.tsx @@ -45,6 +45,7 @@ export const InstagramTextEditorModal: React.FC = const [textAlign, setTextAlign] = useState<"left" | "center" | "right">("center"); const [bgStyle, setBgStyle] = useState<"none" | "solid" | "soft" | "outline">("none"); const [bgBoxColor, setBgBoxColor] = useState(undefined); + const [curveDegree, setCurveDegree] = useState(0); // Modal açıldığında layer verilerini yükle useEffect(() => { @@ -54,6 +55,7 @@ export const InstagramTextEditorModal: React.FC = setColor(layer.color || "#FFFFFF"); setFontSize(layer.fontSize || 16); setTextAlign(layer.textAlign || "center"); + setCurveDegree(layer.curveDegree || 0); if (layer.bgBoxColor) { if (layer.bgBoxColor.includes("0.2") || layer.bgBoxColor.includes("0.3")) { setBgStyle("soft"); @@ -73,6 +75,19 @@ export const InstagramTextEditorModal: React.FC = } }, [layer, visible]); + // Kavis Modunu Değiştir (Düz (0) -> Yukarı Kavis (40) -> Ters Kavis (-40) -> Düz) + const handleToggleCurveDegree = () => { + try { + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + } catch {} + setCurveDegree((prev) => { + if (prev === 0) return 40; + if (prev === 40) return 60; + if (prev === 60) return -40; + return 0; + }); + }; + // Arka plan pill stilini sırayla değiştir (Instagram "A" butonu mantığı) const handleToggleBgStyle = () => { try { @@ -155,6 +170,7 @@ export const InstagramTextEditorModal: React.FC = textAlign, bgBoxColor: finalBg, bgStyle, + curveDegree, hasShadow: bgStyle === "outline" || (!finalBg && color !== "#121215"), }); onClose(); @@ -234,6 +250,26 @@ export const InstagramTextEditorModal: React.FC = )} + {/* Kavis (Yay / Eğri Yazı) Toggle Butonu */} + + + {curveDegree > 0 ? "◠" : curveDegree < 0 ? "◡" : "⌒"} + + + {/* Katmanı Sil (Varsa) */} {onDelete && ( = + {/* ALT BÖLÜM 0: KAVİS HASSAS AYAR BARI */} + + KAVİS: + + { + try { Haptics.selectionAsync(); } catch {} + setCurveDegree((deg) => Math.max(-100, deg - 5)); + }} + hitSlop={{ top: 8, bottom: 8, left: 8, right: 8 }} + style={{ width: 26, height: 26, borderRadius: 13, backgroundColor: "rgba(255,255,255,0.15)", alignItems: "center", justifyContent: "center" }} + > + + + + + {curveDegree}° + + + { + try { Haptics.selectionAsync(); } catch {} + setCurveDegree((deg) => Math.min(100, deg + 5)); + }} + hitSlop={{ top: 8, bottom: 8, left: 8, right: 8 }} + style={{ width: 26, height: 26, borderRadius: 13, backgroundColor: "rgba(255,255,255,0.15)", alignItems: "center", justifyContent: "center" }} + > + + + + + + {[ + { label: "Düz (0°)", deg: 0 }, + { label: "25° ◠", deg: 25 }, + { label: "45° ◠", deg: 45 }, + { label: "65° ◠", deg: 65 }, + { label: "-35° ◡", deg: -35 }, + ].map((item) => { + const isActive = curveDegree === item.deg; + return ( + { + try { Haptics.selectionAsync(); } catch {} + setCurveDegree(item.deg); + }} + style={{ + paddingHorizontal: 10, + paddingVertical: 5, + borderRadius: 12, + backgroundColor: isActive ? "#D4AF37" : "rgba(255,255,255,0.1)", + }} + > + + {item.label} + + + ); + })} + + + {/* ALT BÖLÜM 1: RENK SEÇİCİ BALONCUKLAR */} = ({ - {/* Alt Sıra: Hızlı Döndürme Açısı Hapları */} + {/* Hızlı Metin Değiştirme Girdisi */} + + + { + onLayersChange((prev) => + prev.map((l) => (l.id === selectedLayer.id ? { ...l, text: newText } : l)) + ); + }} + placeholder="Metin yazın..." + placeholderTextColor="#71717A" + style={{ + flex: 1, + color: "#FFFFFF", + fontSize: 13, + fontWeight: "700", + padding: 0, + }} + /> + + + {/* Alt Sıra 1: Font Stili Seçici */} + + FONT: + + {CANVAS_FONT_OPTIONS.map((f) => { + const isActive = (selectedLayer.fontId || "sans") === f.id; + return ( + { + try { Haptics.selectionAsync(); } catch {} + onLayersChange((prev) => + prev.map((l) => (l.id === selectedLayer.id ? { ...l, fontId: f.id } : l)) + ); + }} + style={{ + paddingHorizontal: 10, + paddingVertical: 4, + borderRadius: 10, + backgroundColor: isActive ? "#D4AF37" : "#242429", + }} + > + + {f.label} + + + ); + })} + + + + {/* Alt Sıra 2: Hızlı Döndürme Açısı Hapları */} EĞİM: @@ -573,6 +647,94 @@ export const QrCanvasStudio: React.FC = ({ })} + + {/* Alt Sıra 3: Kavis (Eğri Yazı) Stepper & Preset Hapları */} + + KAVİS: + + {/* Stepper Butonları (- / +) */} + + { + try { Haptics.selectionAsync(); } catch {} + onLayersChange((prev) => + prev.map((l) => + l.id === selectedLayer.id + ? { ...l, curveDegree: Math.max(-100, (l.curveDegree || 0) - 5) } + : l + ) + ); + }} + hitSlop={{ top: 6, bottom: 6, left: 6, right: 6 }} + style={{ width: 22, height: 22, borderRadius: 11, backgroundColor: "rgba(255,255,255,0.12)", alignItems: "center", justifyContent: "center" }} + > + + + + + {(selectedLayer.curveDegree || 0)}° + + + { + try { Haptics.selectionAsync(); } catch {} + onLayersChange((prev) => + prev.map((l) => + l.id === selectedLayer.id + ? { ...l, curveDegree: Math.min(100, (l.curveDegree || 0) + 5) } + : l + ) + ); + }} + hitSlop={{ top: 6, bottom: 6, left: 6, right: 6 }} + style={{ width: 22, height: 22, borderRadius: 11, backgroundColor: "rgba(255,255,255,0.12)", alignItems: "center", justifyContent: "center" }} + > + + + + + {/* Hazır Kavis Presetleri */} + + {[ + { label: "0° (Düz)", deg: 0 }, + { label: "20° ◠", deg: 20 }, + { label: "35° ◠", deg: 35 }, + { label: "50° ◠", deg: 50 }, + { label: "70° ◠", deg: 70 }, + { label: "-35° ◡", deg: -35 }, + { label: "-50° ◡", deg: -50 }, + ].map((item) => { + const isActive = (selectedLayer.curveDegree || 0) === item.deg; + return ( + { + try { Haptics.selectionAsync(); } catch {} + onLayersChange((prev) => + prev.map((l) => (l.id === selectedLayer.id ? { ...l, curveDegree: item.deg } : l)) + ); + }} + style={{ + paddingHorizontal: 9, + paddingVertical: 4, + borderRadius: 10, + backgroundColor: isActive ? "#D4AF37" : "#242429", + }} + > + + {item.label} + + + ); + })} + + )} diff --git a/apps/mobile/src/components/qr-canvas/types.ts b/apps/mobile/src/components/qr-canvas/types.ts index 3779226..f686b35 100644 --- a/apps/mobile/src/components/qr-canvas/types.ts +++ b/apps/mobile/src/components/qr-canvas/types.ts @@ -1,3 +1,5 @@ +import { Platform } from "react-native"; + export interface CanvasTextLayer { id: string; text: string; @@ -13,6 +15,7 @@ export interface CanvasTextLayer { hasShadow?: boolean; letterSpacing?: number; fontWeight?: "normal" | "600" | "700" | "800" | "900"; + curveDegree?: number; // -100 (Aşağı Kavis ◡) ile +100 (Yukarı Kavis ◠) arası kavis derecesi } export interface CanvasQrConfig { @@ -30,40 +33,53 @@ export const CANVAS_FONT_OPTIONS = [ { id: "sans", label: "MODERN", - fontFamily: "System, -apple-system, Roboto, 'Helvetica Neue', Arial, sans-serif", + fontFamily: Platform.OS === "ios" ? "System" : "sans-serif", }, { id: "serif", label: "ZARİF", - fontFamily: "Georgia, 'Times New Roman', serif", + fontFamily: Platform.OS === "ios" ? "Georgia" : "serif", }, { id: "times", label: "KLASİK", - fontFamily: "'Times New Roman', Times, Georgia, serif", + fontFamily: Platform.OS === "ios" ? "Times New Roman" : "serif", }, { id: "typewriter", label: "DAKTİLO", - fontFamily: "Courier, 'Courier New', monospace", + fontFamily: Platform.OS === "ios" ? "Courier" : "monospace", }, { id: "palatino", label: "LÜKS", - fontFamily: "Palatino, 'Palatino Linotype', Georgia, serif", + fontFamily: Platform.OS === "ios" ? "Palatino" : "serif", }, { id: "trebuchet", label: "DİNAMİK", - fontFamily: "'Trebuchet MS', 'Segoe UI', Arial, sans-serif", + fontFamily: Platform.OS === "ios" ? "Trebuchet MS" : "sans-serif", }, { id: "heavy", label: "GÜÇLÜ", - fontFamily: "Impact, 'Arial Black', sans-serif", + fontFamily: Platform.OS === "ios" ? "Impact" : "sans-serif-black", }, ]; +export function getCanvasFontFamily(fontId?: string): string { + if (!fontId) return Platform.OS === "ios" ? "System" : "sans-serif"; + const found = CANVAS_FONT_OPTIONS.find((f) => f.id === fontId); + if (found) { + return found.fontFamily; + } + if (fontId.includes(",")) { + const first = fontId.split(",")[0].trim().replace(/['"]/g, ""); + return first || (Platform.OS === "ios" ? "System" : "sans-serif"); + } + return fontId; +} + export const CANVAS_COLOR_PALETTE = [ { id: "gold", color: "#D4AF37", label: "Altın" }, { id: "white", color: "#FFFFFF", label: "Beyaz" }, @@ -106,11 +122,6 @@ export const QR_BORDER_COLORS = [ { id: "none", color: "transparent", label: "Yok" }, ]; -export function getCanvasFontFamily(fontId?: string): string { - const found = CANVAS_FONT_OPTIONS.find((f) => f.id === fontId); - return found ? found.fontFamily : "System, -apple-system, Roboto, sans-serif"; -} - export function getDefaultQrConfigForTemplate( templateKey: string, canvasWidth: number, diff --git a/apps/mobile/src/components/qr-templates/common.tsx b/apps/mobile/src/components/qr-templates/common.tsx index dc35476..db5ae17 100644 --- a/apps/mobile/src/components/qr-templates/common.tsx +++ b/apps/mobile/src/components/qr-templates/common.tsx @@ -24,39 +24,47 @@ export interface QrTemplateProps extends SvgProps { hideQr?: boolean; } +import { Platform } from "react-native"; + // Türkçe karakterleri (İ, ı, Ş, ş, Ğ, ğ, Ü, ü, Ö, ö, Ç, ç) eksiksiz destekleyen sistem fontları export const FONT_OPTIONS = [ { id: "sans", label: "Modern Sans", - fontFamily: "System, -apple-system, Roboto, 'Helvetica Neue', Arial, sans-serif", + fontFamily: Platform.OS === "ios" ? "System" : "sans-serif", }, { id: "serif", label: "Zarif Serif", - fontFamily: "Georgia, 'Times New Roman', serif", + fontFamily: Platform.OS === "ios" ? "Georgia" : "serif", }, { id: "times", label: "Klasik (Times)", - fontFamily: "'Times New Roman', Times, Georgia, serif", + fontFamily: Platform.OS === "ios" ? "Times New Roman" : "serif", }, { id: "palatino", label: "Lüks Palatino", - fontFamily: "Palatino, 'Palatino Linotype', Georgia, serif", + fontFamily: Platform.OS === "ios" ? "Palatino" : "serif", }, { id: "trebuchet", label: "Dinamik", - fontFamily: "'Trebuchet MS', 'Segoe UI', Arial, sans-serif", + fontFamily: Platform.OS === "ios" ? "Trebuchet MS" : "sans-serif", }, ]; -export function getFontFamily(fontId?: string, defaultFamily = "Georgia, serif"): string { - if (!fontId) return defaultFamily; +export function getFontFamily(fontId?: string, defaultFamily = "Georgia"): string { + if (!fontId) { + return defaultFamily.includes(",") ? defaultFamily.split(",")[0].trim().replace(/['"]/g, "") : defaultFamily; + } const found = FONT_OPTIONS.find((f) => f.id === fontId); - return found ? found.fontFamily : defaultFamily; + if (found) return found.fontFamily; + if (fontId.includes(",")) { + return fontId.split(",")[0].trim().replace(/['"]/g, ""); + } + return fontId; } // Çok satırlı (Enter / \n) ve dikey kaydırmalı (offsetY) SVG metin render fonksiyonu diff --git a/apps/web/src/app/admin/AdminLayoutClient.tsx b/apps/web/src/app/admin/AdminLayoutClient.tsx new file mode 100644 index 0000000..378837d --- /dev/null +++ b/apps/web/src/app/admin/AdminLayoutClient.tsx @@ -0,0 +1,213 @@ +"use client"; + +import React, { useEffect, useState } from "react"; +import Link from "next/link"; +import { usePathname, useRouter } from "next/navigation"; +import AdminAuthGuard from "@/components/AdminAuthGuard"; +import { getAdminSession, logoutAdmin, AdminUser } from "@/lib/admin-auth"; +import { AyrisFooterBadge } from "@/components/AyrisFooterBadge"; + +export default function AdminLayoutClient({ children }: { children: React.ReactNode }) { + const pathname = usePathname(); + const router = useRouter(); + const [adminUser, setAdminUser] = useState(null); + + useEffect(() => { + setAdminUser(getAdminSession()); + }, [pathname]); + + const handleLogout = async () => { + if (confirm("Menulio Admin panelinden çıkış yapmak istediğinize emin misiniz?")) { + await logoutAdmin(); + router.replace("/admin/login"); + } + }; + + // Login page doesn't use the Admin Dashboard Shell (sidebar, header, etc.) + if (pathname === "/admin/login") { + return <>{children}; + } + + return ( + +
+ {/* Sol Sidebar */} + + + {/* Sağ Ana İçerik */} +
+ {/* Üst Bar */} +
+
+
+ Dinamik Şablon & İçerik Yönetimi +
+
+
+
+ + Oturum: {adminUser?.role === "super_admin" ? "Süper Admin" : "Yönetici"} +
+ + +
+
+ + {/* Sayfa İçeriği */} +
+ {children} +
+ + +
+
+
+ ); +} diff --git a/apps/web/src/app/admin/layout.tsx b/apps/web/src/app/admin/layout.tsx index 45896b4..9d996ee 100644 --- a/apps/web/src/app/admin/layout.tsx +++ b/apps/web/src/app/admin/layout.tsx @@ -1,6 +1,6 @@ import type { Metadata } from "next"; -import Link from "next/link"; import React from "react"; +import AdminLayoutClient from "./AdminLayoutClient"; export const metadata: Metadata = { title: "Menulio Admin Panel | Şablon & Sistem Yönetimi", @@ -12,136 +12,5 @@ export default function AdminLayout({ }: { children: React.ReactNode; }) { - return ( -
- {/* Sol Sidebar */} - - - {/* Sağ Ana İçerik */} -
- {/* Üst Bar */} -
-
-
- Dinamik Şablon & İçerik Yönetimi -
-
-
-
- - API: localhost:3001 -
- - Menulio Web → - -
-
- - {/* Sayfa İçeriği */} -
- {children} -
-
-
- ); + return {children}; } diff --git a/apps/web/src/app/admin/login/page.tsx b/apps/web/src/app/admin/login/page.tsx new file mode 100644 index 0000000..4c5da8f --- /dev/null +++ b/apps/web/src/app/admin/login/page.tsx @@ -0,0 +1,205 @@ +"use client"; + +import React, { useState, useEffect, Suspense } from "react"; +import { useRouter, useSearchParams } from "next/navigation"; +import Link from "next/link"; +import { loginAdmin, getAdminSession } from "@/lib/admin-auth"; + +function AdminLoginForm() { + const router = useRouter(); + const searchParams = useSearchParams(); + const callbackUrl = searchParams.get("callbackUrl") || "/admin"; + + const [email, setEmail] = useState(""); + const [password, setPassword] = useState(""); + const [showPassword, setShowPassword] = useState(false); + const [errorMsg, setErrorMsg] = useState(""); + const [isLoading, setIsLoading] = useState(false); + + useEffect(() => { + // If already logged in, redirect straight to admin dashboard + const session = getAdminSession(); + if (session) { + router.replace(callbackUrl); + } + }, [router, callbackUrl]); + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + if (!email.trim() || !password.trim()) { + setErrorMsg("Lütfen e-posta ve şifrenizi girin."); + return; + } + + setIsLoading(true); + setErrorMsg(""); + + try { + const res = await loginAdmin(email, password); + if (res.success) { + router.replace(callbackUrl); + } else { + setErrorMsg(res.error || "Giriş başarısız."); + } + } catch { + setErrorMsg("Bir hata oluştu. Lütfen tekrar deneyin."); + } finally { + setIsLoading(false); + } + }; + + const handleQuickDemoLogin = () => { + setEmail("admin@menul.io"); + setPassword("menulio2026"); + }; + + return ( +
+ {/* Arka Plan Işık Efektleri */} +
+
+ + {/* Kart Konteynırı */} +
+ {/* Logo & Başlık */} +
+ +
+ M +
+ +

+ Menulio Admin Girişi +

+

+ QR Şablon Stüdyosu ve Sistem Yönetim Paneli +

+
+ + {/* Hata Bildirimi */} + {errorMsg && ( +
+ + + + {errorMsg} +
+ )} + + {/* Giriş Formu */} +
+ {/* E-posta */} +
+ +
+ setEmail(e.target.value)} + placeholder="admin@menul.io" + className="w-full bg-white/[0.04] border border-white/10 rounded-xl px-4 py-3 text-sm text-white placeholder-zinc-500 focus:outline-none focus:border-[#D4AF37] focus:ring-1 focus:ring-[#D4AF37] transition-all" + required + /> +
+ + + +
+
+
+ + {/* Şifre */} +
+ +
+ setPassword(e.target.value)} + placeholder="••••••••" + className="w-full bg-white/[0.04] border border-white/10 rounded-xl px-4 py-3 text-sm text-white placeholder-zinc-500 focus:outline-none focus:border-[#D4AF37] focus:ring-1 focus:ring-[#D4AF37] transition-all pr-10" + required + /> + +
+
+ + {/* Giriş Yap Butonu */} + +
+ + {/* Hızlı Demo Girişi */} +
+
+ Varsayılan Admin Girişi: admin@menul.io / menulio2026 +
+ +
+
+ + {/* Alt Footer */} +
+ Menulio QR & Masa Kartı Yönetim Ekosistemi © {new Date().getFullYear()} +
+
+ ); +} + +export default function AdminLoginPage() { + return ( + +
+
+ }> + +
+ ); +} diff --git a/apps/web/src/app/admin/menu-templates/page.tsx b/apps/web/src/app/admin/menu-templates/page.tsx new file mode 100644 index 0000000..4b4b496 --- /dev/null +++ b/apps/web/src/app/admin/menu-templates/page.tsx @@ -0,0 +1,11 @@ +import type { Metadata } from "next"; +import { MenuTemplatesAdminClient } from "@/components/MenuTemplatesAdminClient"; + +export const metadata: Metadata = { + title: "Web Menü Şablon Stüdyosu | Menulio Admin", + description: "Web restoran menü temalarını, renklerini ve düzen ayarlarını canlı önizleme ile yönetin.", +}; + +export default function MenuTemplatesAdminPage() { + return ; +} diff --git a/apps/web/src/app/admin/page.tsx b/apps/web/src/app/admin/page.tsx index bda8760..d2eaf7f 100644 --- a/apps/web/src/app/admin/page.tsx +++ b/apps/web/src/app/admin/page.tsx @@ -17,15 +17,26 @@ export default function AdminDashboardPage() {

- - - - - Yeni Şablon Tasarla & Ekle - +
+ + + + + Web Menü Şablon Stüdyosu + + + + + + QR Şablon Stüdyosu + +
{/* İstatistik Kartları */} diff --git a/apps/web/src/app/page.tsx b/apps/web/src/app/page.tsx index a00b54e..d6c5edc 100644 --- a/apps/web/src/app/page.tsx +++ b/apps/web/src/app/page.tsx @@ -1,6 +1,7 @@ import type { Metadata } from "next"; import Link from "next/link"; import { THEME_PRESETS } from "@/lib/theme"; +import { AyrisFooterBadge } from "@/components/AyrisFooterBadge"; export const metadata: Metadata = { title: "Menulio | AI Destekli Yeni Nesil QR Menü Platformu", @@ -283,7 +284,7 @@ export default function HomePage() { {/* Footer */}
-
+
MENULIO @@ -302,6 +303,8 @@ export default function HomePage() {
+ +
); diff --git a/apps/web/src/components/AdminAuthGuard.tsx b/apps/web/src/components/AdminAuthGuard.tsx new file mode 100644 index 0000000..42ba836 --- /dev/null +++ b/apps/web/src/components/AdminAuthGuard.tsx @@ -0,0 +1,55 @@ +"use client"; + +import React, { useEffect, useState } from "react"; +import { usePathname, useRouter } from "next/navigation"; +import { getAdminSession, AdminUser } from "@/lib/admin-auth"; + +export default function AdminAuthGuard({ children }: { children: React.ReactNode }) { + const pathname = usePathname(); + const router = useRouter(); + const [session, setSession] = useState(null); + const [isChecking, setIsChecking] = useState(true); + + useEffect(() => { + // Skip auth guard for login page itself + if (pathname === "/admin/login") { + setIsChecking(false); + return; + } + + const currentSession = getAdminSession(); + if (!currentSession) { + const callback = encodeURIComponent(pathname); + router.replace(`/admin/login?callbackUrl=${callback}`); + } else { + setSession(currentSession); + setIsChecking(false); + } + }, [pathname, router]); + + // Don't protect non-admin pages if wrapper is applied globally + if (pathname === "/admin/login") { + return <>{children}; + } + + if (isChecking) { + return ( +
+
+
+
+
+ M +
+
+
+
+ Yönetici Oturumu Doğrulanıyor... +
+
+
+ ); + } + + return <>{children}; +} diff --git a/apps/web/src/components/AyrisFooterBadge.tsx b/apps/web/src/components/AyrisFooterBadge.tsx new file mode 100644 index 0000000..fd0a27e --- /dev/null +++ b/apps/web/src/components/AyrisFooterBadge.tsx @@ -0,0 +1,34 @@ +import React from "react"; + +export function AyrisFooterBadge({ className = "" }: { className?: string }) { + return ( +
+
+ {/* Telif Hakkı */} +

© {new Date().getFullYear()} Menulio. Tüm Hakları Saklıdır.

+ + {/* Görünür Ayris Tech İmzası */} +
+ Created by + + Ayris Tech + + + {/* Google Bot & Arama Motoru İndeksleme Katmanı (Görünmez / Screen-Reader Safe) */} + + Legal AI & Solutions:{" "} + AyrisLegal,{" "} + Ayris Legal AI.{" "} + The best local spots, hidden from plain sight. Marmaris Local{" "} + Marmaris Local + +
+
+
+ ); +} diff --git a/apps/web/src/components/MenuTemplatesAdminClient.tsx b/apps/web/src/components/MenuTemplatesAdminClient.tsx new file mode 100644 index 0000000..a8dcf9e --- /dev/null +++ b/apps/web/src/components/MenuTemplatesAdminClient.tsx @@ -0,0 +1,556 @@ +"use client"; + +import React, { useState } from "react"; +import Link from "next/link"; +import { THEME_PRESETS, ThemePreset } from "@/lib/theme"; +import { DEMO_RESTAURANT, DEMO_CATEGORIES } from "@/lib/demo-data"; +import { PublicMenuClient } from "@/components/PublicMenuClient"; + +export function MenuTemplatesAdminClient() { + const [themesMap, setThemesMap] = useState>(THEME_PRESETS); + const [activeThemeKey, setActiveThemeKey] = useState("coastal"); + const [activeTab, setActiveTab] = useState<"gallery" | "customize">("gallery"); + const [toastMsg, setToastMsg] = useState(null); + const [jsonModalOpen, setJsonModalOpen] = useState(false); + const [importedJson, setImportedJson] = useState(""); + + const currentTheme = themesMap[activeThemeKey] || THEME_PRESETS.coastal!; + + const showToast = (msg: string) => { + setToastMsg(msg); + setTimeout(() => setToastMsg(null), 3000); + }; + + const handleUpdateCurrentTheme = (updates: Partial | Partial) => { + setThemesMap((prev) => { + const existing = prev[activeThemeKey]; + if (!existing) return prev; + + let updatedConfig = { ...existing.config }; + let updatedTopLevel = { ...existing }; + + if ("primaryColor" in updates || "productLayout" in updates || "categoryLayout" in updates || "headerLayout" in updates) { + updatedConfig = { ...updatedConfig, ...updates }; + } else { + updatedTopLevel = { ...updatedTopLevel, ...updates }; + } + + return { + ...prev, + [activeThemeKey]: { + ...updatedTopLevel, + config: updatedConfig, + }, + }; + }); + }; + + const handleSaveAll = () => { + showToast(`"${currentTheme.name}" şablon ayarları başarıyla kaydedildi!`); + }; + + const handleImportJsonSubmit = () => { + try { + const parsed = JSON.parse(importedJson); + if (!parsed.key || !parsed.name || !parsed.config) { + throw new Error("Geçersiz şablon JSON formatı. 'key', 'name' ve 'config' alanları zorunludur."); + } + setThemesMap((prev) => ({ + ...prev, + [parsed.key]: parsed, + })); + setActiveThemeKey(parsed.key); + setJsonModalOpen(false); + setImportedJson(""); + showToast(`Yeni şablon "${parsed.name}" başarıyla içe aktarıldı!`); + } catch (err: any) { + alert("Hata: " + (err?.message || "Geçersiz JSON formatı")); + } + }; + + return ( +
+ {/* Toast Bildirimi */} + {toastMsg && ( +
+ + + + {toastMsg} +
+ )} + + {/* Üst Karşılama Barı */} +
+
+
+ 🎨 WEB DİNAMİK MENÜ TEMA STÜDYOSU +
+

+ Web Menü Şablon Yöneticisi +

+

+ Restoran web menülerinin renk paletlerini, düzen yapılarını ve tipografisini canlı cihaz simülatöründe anında test edip yönetin. +

+
+ +
+ + + +
+
+ + {/* Ana İçerik Çift Sütun Düzeni: Sol Kontrol / Sağ Canlı Simülatör */} +
+ {/* SOL PANEL: Şablon Galerisi ve Özelleştirici */} +
+ {/* Sekme Butonları */} +
+ + + +
+ + {/* TAB 1: ŞABLON GALERİSİ KARTLARI */} + {activeTab === "gallery" && ( +
+ {Object.values(themesMap).map((theme) => { + const isSelected = theme.key === activeThemeKey; + return ( +
setActiveThemeKey(theme.key)} + className={`p-5 rounded-2xl border transition-all cursor-pointer space-y-4 relative overflow-hidden group ${ + isSelected + ? "bg-[#16161A] border-[#D4AF37] ring-2 ring-[#D4AF37]/30 shadow-xl shadow-[#D4AF37]/10" + : "bg-[#121215] border-white/10 hover:border-white/20 hover:bg-white/[0.02]" + }`} + > + {/* Üst İkon & Seçim Rozeti */} +
+
+ + +
+ {isSelected ? ( + + + + + AKTİF + + ) : ( + + {theme.key} + + )} +
+ + {/* Tema Adı & Açıklama */} +
+

+ {theme.name} +

+
+ + {theme.fontFamily} + + + {theme.config.productLayout} + + + {theme.config.categoryLayout} + +
+
+ + {/* Alt Butonlar */} +
+ +
+
+ ); + })} +
+ )} + + {/* TAB 2: SEÇİLİ TEMAYI ÖZELLEŞTİR */} + {activeTab === "customize" && ( +
+
+
+

+ + {currentTheme.name} +

+

+ Ana renkleri, arka plan tonlarını ve düzen tiplerini anında özelleştirin. +

+
+ + +
+ + {/* Renk Ayarları */} +
+

+ 1. Renk Paleti & Tonlar +

+ +
+ {/* Primary Color */} +
+ +
+ + handleUpdateCurrentTheme({ primaryColor: e.target.value }) + } + className="w-10 h-10 rounded-lg cursor-pointer bg-transparent border-0" + /> + + handleUpdateCurrentTheme({ primaryColor: e.target.value }) + } + className="flex-1 bg-black/40 border border-white/10 rounded-lg px-3 py-1.5 text-xs text-white font-mono uppercase" + /> +
+
+ + {/* Background Color */} +
+ +
+ + handleUpdateCurrentTheme({ background: e.target.value }) + } + className="w-10 h-10 rounded-lg cursor-pointer bg-transparent border-0" + /> + + handleUpdateCurrentTheme({ background: e.target.value }) + } + className="flex-1 bg-black/40 border border-white/10 rounded-lg px-3 py-1.5 text-xs text-white font-mono uppercase" + /> +
+
+ + {/* Card Background */} +
+ +
+ handleUpdateCurrentTheme({ cardBg: e.target.value })} + className="w-10 h-10 rounded-lg cursor-pointer bg-transparent border-0" + /> + handleUpdateCurrentTheme({ cardBg: e.target.value })} + className="flex-1 bg-black/40 border border-white/10 rounded-lg px-3 py-1.5 text-xs text-white font-mono uppercase" + /> +
+
+ + {/* Text Primary */} +
+ +
+ handleUpdateCurrentTheme({ textPrimary: e.target.value })} + className="w-10 h-10 rounded-lg cursor-pointer bg-transparent border-0" + /> + handleUpdateCurrentTheme({ textPrimary: e.target.value })} + className="flex-1 bg-black/40 border border-white/10 rounded-lg px-3 py-1.5 text-xs text-white font-mono uppercase" + /> +
+
+
+
+ + {/* Düzen & Yerleşim Ayarları */} +
+

+ 2. Düzen & Yerleşim Mimarisi +

+ +
+ {/* Product Layout */} +
+ + +
+ + {/* Category Layout */} +
+ + +
+ + {/* Header Layout */} +
+ + +
+
+
+ + {/* Tipografi */} +
+

+ 3. Tipografi & Font Ailesi +

+ +
+ {[ + { id: "serif", label: "Zarif Serif", desc: "Playfair / Georgia" }, + { id: "sans", label: "Modern Sans", desc: "Inter / System" }, + { id: "heading", label: "Güçlü Display", desc: "Outfit / Montserrat" }, + ].map((font) => ( + + ))} +
+
+
+ )} +
+ + {/* SAĞ PANEL: Canlı İnceleme Telefon Simülatörü */} +
+
+
+
+
+ Canlı Telefon Simülatörü +
+ + {currentTheme.name} + +
+ + {/* Mock iPhone Frame */} +
+ {/* iPhone Notch Header */} +
+
+
+ + {/* Dynamic Theme Render Component */} +
+ +
+ + {/* Home Bar Indicator */} +
+
+
+
+ +
+ Sol taraftan yaptığınız renk ve düzen değişiklikleri anında burada simüle edilir. +
+
+
+
+ + {/* JSON İÇE / DIŞA AKTARMA MODAL */} + {jsonModalOpen && ( +
+
+
+

+ Tema JSON Spesifikasyonu +

+ +
+ +

+ Mevcut temanın JSON kodunu kopyalayabilir veya yeni bir tema JSON spesifikasyonunu buraya yapıştırıp içe aktarabilirsiniz: +

+ +