diff --git a/apps/wallet/README.md b/apps/wallet/README.md index 790db81..b8ff674 100644 --- a/apps/wallet/README.md +++ b/apps/wallet/README.md @@ -286,6 +286,26 @@ Studio, and `i` for the iOS simulator, which requires Xcode on macOS. `@euvena/qr` has to be built before the app can resolve it, which the second command does. +## Publishing + +Store builds are made with EAS from `eas.json`: + +| Profile | Builds | +| --- | --- | +| `simulator` | An iOS simulator build and an Android APK, to try the native build (splash screen, localised camera prompt) without a store | +| `preview` | Internal distribution builds for test devices | +| `production` | Store builds: an Android app bundle for Play App Signing, build numbers kept by EAS and raised on each build | + +`app.json` carries the store-facing settings: version 1.0.0, iPhone only, no non-exempt +encryption, a privacy manifest that declares no tracking and no collected data plus the +required-reason APIs the dependencies use, and the camera prompt in the seven wallet languages +(`locales/`). `expo-system-ui` lets the Android build follow the light or dark appearance. Android +targets API 36, the React Native 0.86 default. Listings, review notes, the privacy policy text and +the questionnaire answers are in [`store/`](store/). + +Linking the project to an EAS account (`eas init`) and the store credentials are left to the +publisher and are not part of the repository. + ## Checks ```sh @@ -300,6 +320,9 @@ pnpm --filter @euvena/wallet build # bundles the JS, no native toolchain requi | Path | Purpose | | --- | --- | | `App.tsx` | Root component, loads the payee settings, opens incoming links, holds the tab bar and switches between the screens | +| `eas.json` | EAS build profiles: simulator, preview and production | +| `locales/` | The camera prompt in each wallet language, for the iOS Info.plist | +| `store/` | Store listings, review notes, privacy policy text and questionnaire answers | | `plugins/` | Config plugin that keeps a restored Android activity from reopening its launch link | | `src/epc/` | Form state to an EPC069-12 payload or an EN 18184 URL (`poi.ts`), the link form of a request, plus the display formatting | | `src/i18n/` | The typed dictionary shape, one file per language, language resolution and number and date formatting | diff --git a/apps/wallet/app.json b/apps/wallet/app.json index e3a8d2f..28b2839 100644 --- a/apps/wallet/app.json +++ b/apps/wallet/app.json @@ -2,14 +2,51 @@ "expo": { "name": "Euvena", "slug": "euvena", - "version": "0.0.0", + "version": "1.0.0", "scheme": "euvena", "orientation": "portrait", "icon": "./assets/icon.png", "userInterfaceStyle": "automatic", "ios": { - "supportsTablet": true, - "bundleIdentifier": "com.ledgerinnovation.euvena" + "supportsTablet": false, + "bundleIdentifier": "com.ledgerinnovation.euvena", + "config": { + "usesNonExemptEncryption": false + }, + "privacyManifests": { + "NSPrivacyTracking": false, + "NSPrivacyTrackingDomains": [], + "NSPrivacyCollectedDataTypes": [], + "NSPrivacyAccessedAPITypes": [ + { + "NSPrivacyAccessedAPIType": "NSPrivacyAccessedAPICategoryUserDefaults", + "NSPrivacyAccessedAPITypeReasons": [ + "CA92.1" + ] + }, + { + "NSPrivacyAccessedAPIType": "NSPrivacyAccessedAPICategoryFileTimestamp", + "NSPrivacyAccessedAPITypeReasons": [ + "0A2A.1", + "3B52.1", + "C617.1" + ] + }, + { + "NSPrivacyAccessedAPIType": "NSPrivacyAccessedAPICategoryDiskSpace", + "NSPrivacyAccessedAPITypeReasons": [ + "85F4.1", + "E174.1" + ] + }, + { + "NSPrivacyAccessedAPIType": "NSPrivacyAccessedAPICategorySystemBootTime", + "NSPrivacyAccessedAPITypeReasons": [ + "35F9.1" + ] + } + ] + } }, "android": { "package": "com.ledgerinnovation.euvena", @@ -28,7 +65,7 @@ [ "expo-camera", { - "cameraPermission": "The camera is used to read payment QR codes.", + "cameraPermission": "Euvena uses the camera only to read payment QR codes on the Pay tab. Nothing is recorded or sent.", "microphonePermission": false, "recordAudioAndroid": false } @@ -51,9 +88,27 @@ [ "expo-localization", { - "supportedLocales": ["en", "de", "fr", "es", "it", "nl", "pl"] + "supportedLocales": [ + "en", + "de", + "fr", + "es", + "it", + "nl", + "pl" + ] } - ] - ] + ], + "expo-system-ui" + ], + "locales": { + "en": "./locales/en.json", + "de": "./locales/de.json", + "fr": "./locales/fr.json", + "es": "./locales/es.json", + "it": "./locales/it.json", + "nl": "./locales/nl.json", + "pl": "./locales/pl.json" + } } } diff --git a/apps/wallet/eas.json b/apps/wallet/eas.json new file mode 100644 index 0000000..a5553e0 --- /dev/null +++ b/apps/wallet/eas.json @@ -0,0 +1,32 @@ +{ + "cli": { + "version": ">= 16.0.0", + "appVersionSource": "remote" + }, + "build": { + "simulator": { + "distribution": "internal", + "ios": { + "simulator": true + }, + "android": { + "buildType": "apk" + } + }, + "preview": { + "distribution": "internal", + "android": { + "buildType": "apk" + } + }, + "production": { + "autoIncrement": true, + "android": { + "buildType": "app-bundle" + } + } + }, + "submit": { + "production": {} + } +} diff --git a/apps/wallet/locales/de.json b/apps/wallet/locales/de.json new file mode 100644 index 0000000..65724c7 --- /dev/null +++ b/apps/wallet/locales/de.json @@ -0,0 +1,5 @@ +{ + "ios": { + "NSCameraUsageDescription": "Euvena nutzt die Kamera nur, um im Tab „Zahlen“ Zahlungs-QR-Codes zu lesen. Es wird nichts aufgezeichnet oder gesendet." + } +} diff --git a/apps/wallet/locales/en.json b/apps/wallet/locales/en.json new file mode 100644 index 0000000..5cbc676 --- /dev/null +++ b/apps/wallet/locales/en.json @@ -0,0 +1,5 @@ +{ + "ios": { + "NSCameraUsageDescription": "Euvena uses the camera only to read payment QR codes on the Pay tab. Nothing is recorded or sent." + } +} diff --git a/apps/wallet/locales/es.json b/apps/wallet/locales/es.json new file mode 100644 index 0000000..96db934 --- /dev/null +++ b/apps/wallet/locales/es.json @@ -0,0 +1,5 @@ +{ + "ios": { + "NSCameraUsageDescription": "Euvena usa la cámara solo para leer códigos QR de pago en la pestaña «Pagar». No se graba ni se envía nada." + } +} diff --git a/apps/wallet/locales/fr.json b/apps/wallet/locales/fr.json new file mode 100644 index 0000000..38d1dde --- /dev/null +++ b/apps/wallet/locales/fr.json @@ -0,0 +1,5 @@ +{ + "ios": { + "NSCameraUsageDescription": "Euvena utilise l'appareil photo uniquement pour lire les codes QR de paiement dans l'onglet « Payer ». Rien n'est enregistré ni envoyé." + } +} diff --git a/apps/wallet/locales/it.json b/apps/wallet/locales/it.json new file mode 100644 index 0000000..fe63433 --- /dev/null +++ b/apps/wallet/locales/it.json @@ -0,0 +1,5 @@ +{ + "ios": { + "NSCameraUsageDescription": "Euvena usa la fotocamera solo per leggere i codici QR di pagamento nella scheda «Paga». Non viene registrato né inviato nulla." + } +} diff --git a/apps/wallet/locales/nl.json b/apps/wallet/locales/nl.json new file mode 100644 index 0000000..a670d00 --- /dev/null +++ b/apps/wallet/locales/nl.json @@ -0,0 +1,5 @@ +{ + "ios": { + "NSCameraUsageDescription": "Euvena gebruikt de camera alleen om betaal-QR-codes te lezen op het tabblad ‘Betalen’. Er wordt niets opgenomen of verstuurd." + } +} diff --git a/apps/wallet/locales/pl.json b/apps/wallet/locales/pl.json new file mode 100644 index 0000000..67c5013 --- /dev/null +++ b/apps/wallet/locales/pl.json @@ -0,0 +1,5 @@ +{ + "ios": { + "NSCameraUsageDescription": "Euvena używa aparatu tylko do odczytywania kodów QR płatności na karcie „Zapłać”. Nic nie jest nagrywane ani wysyłane." + } +} diff --git a/apps/wallet/package.json b/apps/wallet/package.json index fe67c12..7be1fa4 100644 --- a/apps/wallet/package.json +++ b/apps/wallet/package.json @@ -32,6 +32,7 @@ "expo-sharing": "~57.0.22", "expo-splash-screen": "~57.0.9", "expo-status-bar": "~57.0.1", + "expo-system-ui": "~57.0.4", "qrcode": "^1.5.4", "react": "19.2.3", "react-native": "0.86.2", diff --git a/apps/wallet/store/README.md b/apps/wallet/store/README.md new file mode 100644 index 0000000..29828d4 --- /dev/null +++ b/apps/wallet/store/README.md @@ -0,0 +1,12 @@ +# Store material + +What the App Store and Google Play ask for beyond the build, kept beside the code it describes. + +| File | Use | +| --- | --- | +| `listing.en.md`, `listing.de.md` | Name, subtitle, short and full description, keywords, category | +| `review-notes.md` | Notes for App Review; `review-code.png` is the sample request as a QR code to attach | +| `privacy-policy.md` | The privacy policy text, to publish at a public address | +| `declarations.md` | Answers for App Privacy, Data safety, the financial features declaration, content rating, export compliance and trader status | + +Screenshots are taken from a build on a device or simulator and are not kept here. diff --git a/apps/wallet/store/declarations.md b/apps/wallet/store/declarations.md new file mode 100644 index 0000000..5593f48 --- /dev/null +++ b/apps/wallet/store/declarations.md @@ -0,0 +1,76 @@ +# Store declarations + +The answers for the questionnaires in App Store Connect and the Play Console, with the reason for +each. They follow from what the app does: it has no server, sends nothing by itself and keeps +everything on the device. + +## App Store Connect + +**App Privacy: Data Not Collected.** Apple counts data as collected when it is transmitted off the +device in a way that lets the developer or a partner access it. Nothing is: payees, kept requests +and settings are stored on the device (and in the user's own device backups, which the developer +cannot access), and sharing or exporting hands data to the system share sheet at the user's +request, to a destination the user picks. The privacy manifest in +`app.json` says the same: no tracking, no tracking domains, no collected data types. + +**Required reason APIs.** The privacy manifest declares the reasons the dependencies give in their +own manifests, since App Store processing does not read those from static CocoaPods: + +| API | Reasons | Declared by | +| --- | --- | --- | +| UserDefaults | CA92.1 | React Native, expo-constants, expo-localization, expo-system-ui | +| File timestamp | 0A2A.1, 3B52.1, C617.1 | React Native and its pods, AsyncStorage, expo-file-system | +| Disk space | 85F4.1, E174.1 | expo-file-system | +| System boot time | 35F9.1 | React Native | + +When a dependency is added or updated, compare its `ios/PrivacyInfo.xcprivacy` with this list. + +**Export compliance.** `usesNonExemptEncryption: false`. The app makes no network requests and +contains no encryption of its own, so the question does not come up at each upload. + +**Age rating: 4+.** No objectionable content, no web browsing inside the app, no user-generated +content shared through the app, no purchases. + +**Devices.** iPhone only (`supportsTablet: false`). Screenshots are needed for the 6.9-inch +iPhone size. + +## Play Console + +**Data safety: no data collected, no data shared.** Google counts data as collected when it is +transmitted off the device; data processed only on the device is not collected, and a transfer +the user starts through the share sheet or an intent to another app is not sharing by the +developer. The camera image is processed on the device and never stored. + +**Financial features declaration.** A choice for the publisher. The app creates and reads +payment request QR codes and hands the payment to the user's banking app; it holds no funds, +moves no money and is not a payment service. Two answers fit: + +- *Support services, Other*, described as "Creates and reads SEPA payment request QR codes. No + funds are held or moved; the payment is made in the user's own banking app." This matches the + Finance category the listing uses and explains the app to the reviewer. +- *My app doesn't provide any financial features*, since none of the listed features (banking, + loans, wallets, transfers, trading) is offered. + +"Mobile payments and digital wallets" and "Money transfer and wire services" do not fit: the app +neither stores payment credentials nor transmits money. + +**Content rating (IARC).** Category: utility, productivity, communication or other. No violence, +sexual content, profanity, controlled substances, gambling or horror. Users cannot interact or +exchange content with each other inside the app, no location is shared and nothing is sold. The +expected result is the lowest rating in every region (PEGI 3, USK 0, Everyone). + +**Target API.** 36, the default of React Native 0.86. The production profile in `eas.json` builds +an app bundle for Play App Signing. + +**Ads.** The app contains no ads. + +## Both stores + +**Privacy policy.** The text is in `privacy-policy.md`. Both stores need it at a public address, +filled in with the publisher's name, address and contact. + +**EU trader status (Digital Services Act).** A choice for the publisher: an app published by a +company is normally published as a trader, and both stores then show the trader's address, phone +number and email on the listing. + +**Support URL.** The repository's issue tracker. diff --git a/apps/wallet/store/listing.de.md b/apps/wallet/store/listing.de.md new file mode 100644 index 0000000..ba7f2ff --- /dev/null +++ b/apps/wallet/store/listing.de.md @@ -0,0 +1,53 @@ +# Store-Eintrag, Deutsch + +Grenzen der Stores: App-Store-Name und Untertitel 30 Zeichen, Schlüsselwörter 100, Werbetext 170, +Beschreibung 4000; Google Play Titel 30, Kurzbeschreibung 80, vollständige Beschreibung 4000. + +## Name (beide Stores) + +Euvena + +## Untertitel (App Store) + +Zahlungs-QR-Codes für SEPA + +## Kurzbeschreibung (Google Play) + +SEPA-Überweisungen per QR-Code anfordern und bezahlen. Ohne Konto, ohne Server. + +## Werbetext (App Store) + +Fordere eine SEPA-Überweisung per QR-Code an, den europäische Banking-Apps lesen, oder lies einen und gib ihn an deine Banking-App weiter. Ohne Konto, ohne Server. + +## Schlüsselwörter (App Store) + +sepa,epc,qr,qr-code,iban,überweisung,zahlungsanforderung,rechnung,bank,en 18184,echtzeit + +## Beschreibung (beide Stores) + +Euvena macht aus einer SEPA-Überweisung einen QR-Code und wieder zurück. + +GELD ANFORDERN +Gib einen Betrag ein, auf Wunsch auch den Verwendungszweck, und Euvena zeigt einen EPC-QR-Code (GiroCode), das Format, mit dem viele europäische Banking-Apps eine Überweisung ausfüllen. Teile die Anforderung als Link oder behalte sie im Verlauf auf deinem Handy. Mehrere Empfänger lassen sich speichern, für einen Haushalt, einen Verein oder ein kleines Geschäft. + +ANFORDERUNG BEZAHLEN +Scanne einen Zahlungscode oder füge eine geteilte Anforderung ein. Euvena zeigt genau, was der Code enthält: Name, IBAN, Betrag und Referenz. Dann übergibt Euvena die Angaben als payto-Link an eine App, die ihn annimmt, oder lässt dich sie Feld für Feld in deine Banking-App kopieren. Ein Code, der eine Prüfung nicht besteht, wird ganz abgelehnt und nie nur teilweise angezeigt. + +EN-18184-CODES +Euvena liest auch EN-18184-Codes (EPC024-22) für den Point of Interaction, die die Empfängerdaten enthalten, und erstellt sie, sobald du die Angaben eingibst, die dir dein Zahlungsrahmenwerk zugewiesen hat. + +KEIN KONTO, KEIN SERVER, KEINE DATEN +Euvena hat keine Konten und kein Backend. Die App hält und bewegt nie Geld und kontaktiert keine Bank: Jede Zahlung wird in deiner eigenen Banking-App ausgeführt und freigegeben. Empfänger und gespeicherte Anforderungen liegen auf deinem Handy, nie auf einem Server von uns, und eine Exportdatei überträgt sie auf ein anderes Handy, wenn du das möchtest. Es wird nichts erhoben, verfolgt oder weitergegeben. + +SIEBEN SPRACHEN +Deutsch, Englisch, Französisch, Spanisch, Italienisch, Niederländisch und Polnisch, in heller oder dunkler Darstellung. + +Euvena ist Open Source. Der Code und die Bibliothek für Zahlungscodes dahinter liegen auf GitHub. + +## Kategorie + +Finanzen (beide Stores) + +## Support-URL + +https://github.com/LedgerInnovation/euvena/issues diff --git a/apps/wallet/store/listing.en.md b/apps/wallet/store/listing.en.md new file mode 100644 index 0000000..7b39034 --- /dev/null +++ b/apps/wallet/store/listing.en.md @@ -0,0 +1,53 @@ +# Store listing, English + +Limits are the stores' own: App Store name and subtitle 30 characters, keywords 100, promotional +text 170, description 4000; Google Play title 30, short description 80, full description 4000. + +## Name (both stores) + +Euvena + +## Subtitle (App Store) + +EPC QR payment requests + +## Short description (Google Play) + +Request and pay SEPA transfers by QR code. No account, no server. + +## Promotional text (App Store) + +Ask for a SEPA transfer with a QR code European banking apps can scan, or read one and pass it on to your banking app. No account, no server. + +## Keywords (App Store) + +sepa,epc,qr,qr code,iban,transfer,payment request,invoice,bank,en 18184,instant,pay me + +## Description (both stores) + +Euvena turns a SEPA credit transfer into a QR code and back. + +REQUEST MONEY +Enter an amount, and what it is for if you like, and Euvena shows an EPC QR code, the format many European banking apps scan to fill in a transfer. Share the request as a link, or keep it in the history on your phone. Several payees can be kept, for a household, a club or a small business. + +PAY A REQUEST +Scan a payment code or paste a shared request. Euvena shows exactly what the code says: the name, the IBAN, the amount and the reference. Then it hands the details on as a payto link to an app that accepts one, or lets you copy them field by field into your banking app. A code that fails any check is refused as a whole, never shown in part. + +EN 18184 CODES +Euvena also reads EN 18184 (EPC024-22) point-of-interaction codes that carry the payee's details, and builds them once you enter the details your payment framework assigned to you. + +NO ACCOUNT, NO SERVER, NO DATA +Euvena has no accounts and no backend. It never holds or moves money and never contacts a bank: every payment is made and authorised in your own banking app. Payees and kept requests are stored on your phone, never on a server of ours, and an export file moves them to another phone when you choose to. Nothing is collected, tracked or shared. + +SEVEN LANGUAGES +English, German, French, Spanish, Italian, Dutch and Polish, in light or dark appearance. + +Euvena is open source. The code and the payment code library behind it are on GitHub. + +## Category + +Finance (both stores) + +## Support URL + +https://github.com/LedgerInnovation/euvena/issues diff --git a/apps/wallet/store/privacy-policy.md b/apps/wallet/store/privacy-policy.md new file mode 100644 index 0000000..04cce52 --- /dev/null +++ b/apps/wallet/store/privacy-policy.md @@ -0,0 +1,66 @@ +# Euvena privacy policy + +Both stores require a privacy policy at a public address, even for an app that collects nothing. +This is its text. The operator's legal name, address and contact are filled in where it is +published. + +--- + +# Privacy policy for Euvena + +Last updated: [date of publication] + +Euvena is a mobile app for requesting and paying SEPA credit transfers with payment QR codes. It +is published by [legal name and address of the publisher] ("we"). + +## What we collect + +Nothing. Euvena has no accounts and no server of its own. We do not collect, receive, store or +share any personal data or usage data, and the app contains no analytics, advertising or +tracking code. + +## What stays on your device + +What you enter is stored on your device, by the app: + +- the payees you add: name, IBAN and optional BIC +- the payment requests you keep in the history +- your settings: appearance, language and, if you set them up, the EN 18184 framework details + +We cannot see this data. If you use device backups, such as iCloud Backup or Android backup to +your Google account, it is included in your own backup like other app data, which we cannot +access either. It is removed from the device when you remove it in the app or uninstall the app. + +## Camera + +The camera is used only to read payment QR codes on the Pay tab, and only after you allow it. +Images are processed on the device, never recorded and never sent anywhere. + +## When data leaves your device + +Only when you act: + +- **Sharing a request** hands a message with the request to the share sheet of your operating + system. You choose where it goes. +- **Handing a payment to your banking app** opens that app, or another app you have installed, + with the payment details. Copying a field places it on your clipboard. +- **Exporting your data** writes a file with your payees and kept requests and hands it to the + share sheet. You choose where it is saved or sent. + +In each case the receiving app or service handles the data under its own terms. Euvena does not +send anything to us or to anyone else by itself. + +Scanning or pasting an EN 18184 code, which is a web address, does not open that address: the +app reads it on the device. + +## Children + +Euvena is not directed at children and collects no data from anyone. + +## Changes + +If this policy changes, the new version is published at this address with a new date. + +## Contact + +[contact address for privacy questions] diff --git a/apps/wallet/store/review-code.png b/apps/wallet/store/review-code.png new file mode 100644 index 0000000..64bb0bb Binary files /dev/null and b/apps/wallet/store/review-code.png differ diff --git a/apps/wallet/store/review-notes.md b/apps/wallet/store/review-notes.md new file mode 100644 index 0000000..edb8c64 --- /dev/null +++ b/apps/wallet/store/review-notes.md @@ -0,0 +1,48 @@ +# App review notes + +Paste into App Store Connect (App Review Information, Notes) and, shortened, into the Play +Console where a reviewer note is asked for. No sign-in is needed, so no demo account is given. + +--- + +Euvena composes and reads payment requests for SEPA credit transfers. It holds no funds, executes +no payments, has no accounts and no backend, and contacts no bank or payment service. + +How to try it: + +1. On first launch the app asks for a payee. Enter any name and a test IBAN such as + DE89 3704 0044 0532 0130 00, then Save. +2. The Request tab now shows an EPC069-12 QR code ("EPC QR code" or "GiroCode"), the format + European banking apps scan to fill in a transfer. Type an amount and the code updates. "Share + this request" opens the system share sheet with the request as text and a link. +3. The Pay tab reads a payment code with the camera, or pasted text. Copy one of the two samples + below to the test device, paste it and tap "Read what was pasted". The review shows the decoded + values. "Open your banking app" hands them on as a payto link to an installed app that accepts + one; the rows below it copy each value for a transfer form. The payment itself is always made + and authorised in the user's own banking app. +4. The History tab lists requests that were shared or kept. Settings holds the payees, the + appearance, the language, an export and import of the on-device data, and the optional + EN 18184 code settings. + +Sample request on one line, a payto link: + +payto://iban/DE33100205000001194700?amount=EUR:13.05&receiver-name=Wikimedia%20Foerdergesellschaft&message=Spende%20fuer%20Wikipedia + +The same request as an EPC069-12 payload, eleven lines copied exactly, with nothing before each +line. Lines 5, 9 and 10 are empty: no BIC, no purpose code, no structured reference. + +BCD +002 +1 +SCT + +Wikimedia Foerdergesellschaft +DE33100205000001194700 +EUR13.05 + + +Spende fuer Wikipedia + +The same request is attached as review-code.png, for scanning from a second device. + +The camera is used only on the Pay tab, to read QR codes. All data stays on the device. diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dc21705..35b2aee 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -49,6 +49,9 @@ importers: expo-status-bar: specifier: ~57.0.1 version: 57.0.1(expo@57.0.12)(react-native@0.86.2(@babel/core@7.29.7)(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) + expo-system-ui: + specifier: ~57.0.4 + version: 57.0.4(expo@57.0.12)(react-native@0.86.2(@babel/core@7.29.7)(@types/react@19.2.18)(react@19.2.3)) qrcode: specifier: ^1.5.4 version: 1.5.4 @@ -959,6 +962,9 @@ packages: '@react-native/normalize-colors@0.86.2': resolution: {integrity: sha512-EzPFc9Y6lzYOWeso2almwXI7f8+qReHxWvT+algsOczb2UhWXIWXDoSvkdwoSfiwwmGt/ijJgKJoeHlzPkLwRg==} + '@react-native/normalize-colors@0.86.3': + resolution: {integrity: sha512-Cv3CDkprb67GrzuaS9BGbBJC/6G4lIw3nyKOHRKTqTTum4bn37y5+R0Z04L8mcbQN85eEohNrRwb7IOM4j6uvg==} + '@react-native/virtualized-lists@0.86.2': resolution: {integrity: sha512-uO0J72gh3EvE+1/GHRk18QRyBDTRHRB0AraAfojsRjbT7VMuJwKrZYaKGshavoaEud6aw00ZB9/8mTMIKjjcAw==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} @@ -2168,6 +2174,16 @@ packages: react: '*' react-native: '*' + expo-system-ui@57.0.4: + resolution: {integrity: sha512-z//rxQJzhTNA1PcKrUtWmrd21jAS3nEDu1b0n8B/7LTTR933OcsZYP1HnbaZifuo2ZH/h7nce2Ow61WZ1Ig2bg==} + peerDependencies: + expo: '*' + react-native: '*' + react-native-web: '*' + peerDependenciesMeta: + react-native-web: + optional: true + expo@57.0.12: resolution: {integrity: sha512-sVgXaMjh5uapBvBkik3QibxbKI2g1zNtNeHntjRfixWAI3tlQZbaK4ACdInY4+jUBVymkf8u9BXJUaSes9jdtA==} hasBin: true @@ -5076,6 +5092,8 @@ snapshots: '@react-native/normalize-colors@0.86.2': {} + '@react-native/normalize-colors@0.86.3': {} + '@react-native/virtualized-lists@0.86.2(@types/react@19.2.18)(react-native@0.86.2(@babel/core@7.29.7)(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)': dependencies: invariant: 2.2.4 @@ -6460,6 +6478,15 @@ snapshots: react: 19.2.3 react-native: 0.86.2(@babel/core@7.29.7)(@types/react@19.2.18)(react@19.2.3) + expo-system-ui@57.0.4(expo@57.0.12)(react-native@0.86.2(@babel/core@7.29.7)(@types/react@19.2.18)(react@19.2.3)): + dependencies: + '@react-native/normalize-colors': 0.86.3 + debug: 4.4.3 + expo: 57.0.12(@babel/core@7.29.7)(@expo/dom-webview@57.0.1)(react-native@0.86.2(@babel/core@7.29.7)(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + react-native: 0.86.2(@babel/core@7.29.7)(@types/react@19.2.18)(react@19.2.3) + transitivePeerDependencies: + - supports-color + expo@57.0.12(@babel/core@7.29.7)(@expo/dom-webview@57.0.1)(react-native@0.86.2(@babel/core@7.29.7)(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3): dependencies: '@babel/runtime': 7.29.7