diff --git a/.github/workflows/build-aab-android.yml b/.github/workflows/build-android.yml
similarity index 69%
rename from .github/workflows/build-aab-android.yml
rename to .github/workflows/build-android.yml
index 72b3e220..e3f76056 100644
--- a/.github/workflows/build-aab-android.yml
+++ b/.github/workflows/build-android.yml
@@ -1,10 +1,14 @@
-name: Build AAB for Play Store
+name: Build Android
on:
- workflow_dispatch:
+ push:
+ branches:
+ - main
jobs:
build:
+ name: Build & Upload to Play Store
+ if: github.repository == 'PapillonApp/Papillon'
runs-on: ubuntu-latest
steps:
@@ -15,23 +19,44 @@ jobs:
uses: actions/setup-node@v4
with:
node-version: 20
+ cache: npm
- name: Setup Java
uses: actions/setup-java@v4
with:
- distribution: 'temurin'
- java-version: '17'
+ distribution: temurin
+ java-version: 17
- - name: Install deps
- run: npm install --legacy-peer-deps || true
+ - name: Setup Gradle
+ uses: gradle/actions/setup-gradle@v4
+
+ - name: Install dependencies
+ run: npm install --legacy-peer-deps
+
+ - name: Cache Expo prebuild
+ id: prebuild-cache
+ uses: actions/cache@v4
+ with:
+ path: android/
+ key: ${{ runner.os }}-expo-prebuild-${{ hashFiles('app.json', 'package-lock.json') }}
+ restore-keys: ${{ runner.os }}-expo-prebuild-
+
+ - name: Create secrets.json
+ run: |
+ echo '{
+ "APP_KEY": "${{ secrets.COUNTLY_APP_KEY }}",
+ "SALT": "${{ secrets.COUNTLY_SALT }}",
+ "SERVER_URL": "${{ secrets.COUNTLY_SERVER_URL }}"
+ }' > secrets.json
- name: Prebuild Android
+ if: steps.prebuild-cache.outputs.cache-hit != 'true'
run: npx expo prebuild --platform android --clean
- name: Decode keystore
run: echo "${{ secrets.KEYSTORE }}" | base64 --decode > android/app/release.keystore
- - name: Calculate Android Version Code
+ - name: Calculate version code
run: |
VERSION_CODE=$(node -e "
const version = require('./package.json').version;
@@ -40,42 +65,32 @@ jobs:
console.log(cleanVersion * 100000 + runNumber);
")
echo "VERSION_CODE=$VERSION_CODE" >> $GITHUB_ENV
- echo "Computed VERSION_CODE: $VERSION_CODE"
- name: Configure signing
run: |
sed -i '/signingConfigs {/a\ release {\n storeFile file('\''release.keystore'\'')\n storePassword '\''${{ secrets.KEYSTORE_PASSWORD }}'\''\n keyAlias '\''${{ secrets.KEY_ALIAS }}'\''\n keyPassword '\''${{ secrets.KEY_PASSWORD }}'\''\n }' android/app/build.gradle
sed -i 's/signingConfig signingConfigs.debug/signingConfig signingConfigs.release/' android/app/build.gradle
sed -i "s/versionCode .*/versionCode ${{ env.VERSION_CODE }}/" android/app/build.gradle
- echo "Signing config and version code configured in build.gradle"
- name: Configure Gradle
run: |
chmod +x android/gradlew
echo "org.gradle.jvmargs=-Xmx6144m -XX:MaxMetaspaceSize=1024m -XX:+HeapDumpOnOutOfMemoryError" >> android/gradle.properties
+ echo "org.gradle.parallel=true" >> android/gradle.properties
+ echo "org.gradle.caching=true" >> android/gradle.properties
+ echo "org.gradle.configuration-cache=true" >> android/gradle.properties
echo "android.enable16KbPageSizes=true" >> android/gradle.properties
- - name: Create secrets.json
- run: |
- echo '{
- "APP_KEY": "${{ secrets.COUNTLY_APP_KEY }}",
- "SALT": "${{ secrets.COUNTLY_SALT }}",
- "SERVER_URL": "${{ secrets.COUNTLY_SERVER_URL }}"
- }' > secrets.json
-
- name: Build AAB
- run: |
- cd android
- ./gradlew bundleRelease --no-daemon
+ run: cd android && ./gradlew bundleRelease --no-daemon
- - name: Upload AAB
+ - name: Upload AAB artifact
uses: actions/upload-artifact@v4
with:
name: app-release.aab
path: android/app/build/outputs/bundle/release/*.aab
- - name: Upload on Play Store on beta track
- if: success()
+ - name: Upload to Play Store
uses: r0adkll/upload-google-play@v1
with:
serviceAccountJsonPlainText: ${{ secrets.PLAY_STORE_KEY }}
diff --git a/.github/workflows/build-beta.yml b/.github/workflows/build-beta.yml
deleted file mode 100644
index 0ebe35fb..00000000
--- a/.github/workflows/build-beta.yml
+++ /dev/null
@@ -1,186 +0,0 @@
-name: Build a beta
-
-on:
- workflow_dispatch:
-
-permissions:
- contents: write
-
-jobs:
- build:
- runs-on: ubuntu-latest
-
- steps:
- - name: Checkout code
- uses: actions/checkout@v4
-
- - name: Notify start on Telegram
- run: |
- MESSAGE="🦋 *Starting a build for a beta version*
-
- 📦 ${{ github.repository }} (${{ github.ref_name }})
- 👤 ${{ github.actor }} | Run #${{ github.run_number }}
- 📅 $(date -u +'%Y-%m-%d %H:%M UTC')
- 🔗 [Workflow](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})"
-
- curl -s -X POST https://api.telegram.org/bot${{ secrets.TELEGRAM_BOT_TOKEN }}/sendMessage \
- -d chat_id=${{ secrets.TELEGRAM_CHAT_ID }} \
- -d parse_mode=Markdown \
- -d text="$MESSAGE"
-
- - name: Setup Node
- uses: actions/setup-node@v4
- with:
- node-version: 20
-
- - name: Setup Java
- uses: actions/setup-java@v4
- with:
- distribution: 'temurin'
- java-version: '17'
-
- - name: Create and Push Tag
- run: |
- VERSION=$(node -p "require('./package.json').version")
- DATE=$(date +'%Y%m%d-%H%M')
- TAG="v$VERSION-$DATE"
-
- git config user.name "github-actions[bot]"
- git config user.email "github-actions[bot]@users.noreply.github.com"
-
- git tag $TAG
- git push origin $TAG
-
- - name: Install deps
- run: npm install --legacy-peer-deps || true
-
- - name: Prebuild Android
- run: npx expo prebuild --platform android --clean
-
- - name: Decode keystore
- run: echo "${{ secrets.KEYSTORE }}" | base64 --decode > android/app/release.keystore
-
- - name: Calculate Android Version Code
- run: |
- VERSION_CODE=$(node -e "
- const version = require('./package.json').version;
- const cleanVersion = parseInt(version.replace(/\./g, ''));
- const runNumber = parseInt(process.env.GITHUB_RUN_NUMBER || '0');
- console.log(cleanVersion * 100000 + runNumber);
- ")
- echo "VERSION_CODE=$VERSION_CODE" >> $GITHUB_ENV
- echo "Computed VERSION_CODE: $VERSION_CODE"
-
- - name: Configure signing
- run: |
- sed -i '/signingConfigs {/a\ release {\n storeFile file('\''release.keystore'\'')\n storePassword '\''${{ secrets.KEYSTORE_PASSWORD }}'\''\n keyAlias '\''${{ secrets.KEY_ALIAS }}'\''\n keyPassword '\''${{ secrets.KEY_PASSWORD }}'\''\n }' android/app/build.gradle
- sed -i 's/signingConfig signingConfigs.debug/signingConfig signingConfigs.release/' android/app/build.gradle
- sed -i "s/versionCode .*/versionCode ${{ env.VERSION_CODE }}/" android/app/build.gradle
- echo "Signing config and version code configured in build.gradle"
-
- - name: Configure Gradle
- run: |
- chmod +x android/gradlew
- echo "org.gradle.jvmargs=-Xmx6144m -XX:MaxMetaspaceSize=1024m -XX:+HeapDumpOnOutOfMemoryError" >> android/gradle.properties
- echo "android.enable16KbPageSizes=true" >> android/gradle.properties
-
- - name: Create secrets.json
- run: |
- echo '{
- "APP_KEY": "${{ secrets.COUNTLY_APP_KEY }}",
- "SALT": "${{ secrets.COUNTLY_SALT }}",
- "SERVER_URL": "${{ secrets.COUNTLY_SERVER_URL }}"
- }' > secrets.json
-
- - name: Build APK
- run: |
- cd android
- ./gradlew assembleRelease --no-daemon
-
- - name: Build AAB
- run: |
- cd android
- ./gradlew bundleRelease --no-daemon
-
- - name: Sign APK
- run: |
- echo "Aligning and signing APK..."
- ZIPALIGN=$(find $ANDROID_HOME/build-tools -name zipalign | sort -V | tail -n 1)
- APKSIGNER=$(find $ANDROID_HOME/build-tools -name apksigner | sort -V | tail -n 1)
- UNALIGNED_APK=android/app/build/outputs/apk/release/app-release.apk
- ALIGNED_APK=android/app/build/outputs/apk/release/app-release-aligned.apk
- FINAL_APK=android/app/build/outputs/apk/release/app-release-final.apk
-
- echo "Using zipalign at: $ZIPALIGN"
- echo "Using apksigner at: $APKSIGNER"
-
- # Align APK
- $ZIPALIGN -v -p 4 $UNALIGNED_APK $ALIGNED_APK
-
- # Sign aligned APK
- $APKSIGNER sign --ks android/app/release.keystore \
- --ks-pass pass:${{ secrets.KEYSTORE_PASSWORD }} \
- --key-pass pass:${{ secrets.KEY_PASSWORD }} \
- --out $FINAL_APK \
- $ALIGNED_APK
-
- # Verify signature
- $APKSIGNER verify --verbose --print-certs $FINAL_APK
-
- # Replace unaligned APK by final signed & aligned APK
- mv $FINAL_APK $UNALIGNED_APK
-
- # Clean intermediate aligned APK
- rm -f $ALIGNED_APK
-
- - name: Upload APK
- uses: actions/upload-artifact@v4
- with:
- name: app-release.apk
- path: android/app/build/outputs/apk/release/*.apk
-
- - name: Upload AAB
- uses: actions/upload-artifact@v4
- with:
- name: app-release.aab
- path: android/app/build/outputs/bundle/release/*.aab
-
- - name: Upload on Play Store on beta track
- if: success()
- uses: r0adkll/upload-google-play@v1
- with:
- serviceAccountJsonPlainText: ${{ secrets.PLAY_STORE_KEY }}
- packageName: xyz.getpapillon.app
- releaseFiles: android/app/build/outputs/bundle/release/*.aab
- track: beta
- inAppUpdatePriority: 3
- status: completed
-
- - name: Notify success on Telegram
- if: success()
- run: |
- DURATION=$((SECONDS - 0))
- MESSAGE="✅ *The build for the beta version was successful*
-
- 📦 ${{ github.repository }} (${{ github.ref_name }})
- 👤 ${{ github.actor }} | Run #${{ github.run_number }}
- 🔗 [Workflow](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})"
-
- curl -s -X POST https://api.telegram.org/bot${{ secrets.TELEGRAM_BOT_TOKEN }}/sendMessage \
- -d chat_id=${{ secrets.TELEGRAM_CHAT_ID }} \
- -d parse_mode=Markdown \
- -d text="$MESSAGE"
-
- - name: Notify failure on Telegram
- if: failure()
- run: |
- MESSAGE="❌ *The build for the beta version failed*
-
- 📦 ${{ github.repository }} (${{ github.ref_name }})
- 👤 ${{ github.actor }} | Run #${{ github.run_number }}
- 🔗 [Workflow](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})"
-
- curl -s -X POST https://api.telegram.org/bot${{ secrets.TELEGRAM_BOT_TOKEN }}/sendMessage \
- -d chat_id=${{ secrets.TELEGRAM_CHAT_ID }} \
- -d parse_mode=Markdown \
- -d text="$MESSAGE"
diff --git a/.github/workflows/issue-check.yml b/.github/workflows/issue-check.yml
deleted file mode 100644
index 6a18538c..00000000
--- a/.github/workflows/issue-check.yml
+++ /dev/null
@@ -1,34 +0,0 @@
-name: Issue Check
-
-on:
- issues:
- types: [opened]
-
-jobs:
- check-issue:
- runs-on: ubuntu-latest
- permissions:
- issues: write
- contents: read
- steps:
- - name: Checkout repository
- uses: actions/checkout@v4
-
- - name: Setup Node.js
- uses: actions/setup-node@v4
- with:
- node-version: 20
-
- - name: Install Dependencies
- working-directory: .github/bot
- run: npm ci
-
- - name: Build Bot
- working-directory: .github/bot
- run: npm run build
-
- - name: Run Issue Check
- working-directory: .github/bot
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- run: node dist/issue/index.js
diff --git a/.github/workflows/merge.yml b/.github/workflows/merge.yml
new file mode 100644
index 00000000..e455973c
--- /dev/null
+++ b/.github/workflows/merge.yml
@@ -0,0 +1,35 @@
+name: Merge dev into main
+
+on:
+ workflow_dispatch:
+
+jobs:
+ merge:
+ name: Merge
+ if: github.repository == 'PapillonApp/Papillon'
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Generate app token
+ id: app-token
+ uses: actions/create-github-app-token@v3
+ with:
+ app-id: ${{ vars.APP_ID }}
+ private-key: ${{ secrets.APP_PRIVATE_KEY }}
+
+ - name: Checkout repository
+ uses: actions/checkout@v4
+ with:
+ token: ${{ steps.app-token.outputs.token }}
+ fetch-depth: 0
+
+ - name: Configure git
+ run: |
+ git config user.name "papillon-release[bot]"
+ git config user.email "papillon-release[bot]@users.noreply.github.com"
+
+ - name: Merge dev into main
+ run: |
+ git checkout main
+ git merge origin/dev --no-edit
+ git push origin main
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 00000000..ba272363
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,60 @@
+name: Release
+
+on:
+ workflow_dispatch:
+ inputs:
+ version:
+ description: "Numéro de version (x.x.x)"
+ required: true
+ type: string
+
+jobs:
+ release:
+ name: Merge & Release
+ if: github.repository == 'PapillonApp/Papillon'
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Validate version format
+ run: |
+ if ! echo "${{ inputs.version }}" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+$'; then
+ echo "::error::Version invalide '${{ inputs.version }}'. Format attendu : x.x.x (ex: 7.2.0)"
+ exit 1
+ fi
+
+ - name: Generate app token
+ id: app-token
+ uses: actions/create-github-app-token@v3
+ with:
+ app-id: ${{ vars.APP_ID }}
+ private-key: ${{ secrets.APP_PRIVATE_KEY }}
+
+ - name: Checkout repository
+ uses: actions/checkout@v4
+ with:
+ token: ${{ steps.app-token.outputs.token }}
+ fetch-depth: 0
+
+ - name: Configure git
+ run: |
+ git config user.name "papillon-release[bot]"
+ git config user.email "papillon-release[bot]@users.noreply.github.com"
+
+ - name: Merge dev into main
+ run: |
+ git checkout main
+ git merge origin/dev --no-edit
+ git push origin main
+
+ - name: Create release
+ uses: softprops/action-gh-release@v2
+ with:
+ token: ${{ steps.app-token.outputs.token }}
+ tag_name: v${{ inputs.version }}
+ name: v${{ inputs.version }}
+ target_commitish: main
+ make_latest: true
+ body: |
+
+
+ **Notes de mise à jour :** https://papillon.bzh/release-notes/${{ inputs.version }}
diff --git a/.gitignore b/.gitignore
index c7a6c9da..f4e4fba5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -51,4 +51,6 @@ android/*
bun.lock
yarn.lock
-secrets.json
\ No newline at end of file
+secrets.json
+.vscode/
+.idea/
\ No newline at end of file
diff --git a/.vscode/launch.json b/.vscode/launch.json
deleted file mode 100644
index 813312b4..00000000
--- a/.vscode/launch.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- // Utilisez IntelliSense pour en savoir plus sur les attributs possibles.
- // Pointez pour afficher la description des attributs existants.
- // Pour plus d'informations, visitez : https://go.microsoft.com/fwlink/?linkid=830387
- "version": "0.2.0",
- "configurations": [
- {
- "type": "expo",
- "request": "attach",
- "name": "Debug Expo app",
- "projectRoot": "${workspaceFolder}",
- "bundlerPort": "8081",
- "bundlerHost": "127.0.0.1"
- }
- ]
-}
diff --git a/.vscode/settings.json b/.vscode/settings.json
deleted file mode 100644
index 44a34c50..00000000
--- a/.vscode/settings.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "editor.formatOnSave": false,
- "editor.defaultFormatter": "esbenp.prettier-vscode",
- "editor.codeActionsOnSave": [
- "source.fixAll.eslint"
- ],
- "[typescriptreact]": {
- "editor.defaultFormatter": "vscode.typescript-language-features"
- }
-}
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 6cfe508d..b73f19ce 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -2,15 +2,15 @@
+
+
-
-
-
+
-
+
@@ -18,11 +18,16 @@
-
+
-
+
+
+
+
+
+
diff --git a/app.config.ts b/app.config.ts
index cb299768..5a90bd5c 100644
--- a/app.config.ts
+++ b/app.config.ts
@@ -96,6 +96,7 @@ export default {
backgroundColor: "#003A21",
},
supportsTablet: true,
+ predictiveBackGestureEnabled: true
},
web: {
bundler: "metro",
@@ -108,6 +109,8 @@ export default {
"expo-video",
"expo-audio",
"expo-localization",
+ "expo-asset",
+ "@react-native-community/datetimepicker",
[
"expo-image-picker",
{
diff --git a/app/(features)/(cards)/cards.tsx b/app/(features)/(cards)/cards.tsx
index 89fb45b7..893ce339 100644
--- a/app/(features)/(cards)/cards.tsx
+++ b/app/(features)/(cards)/cards.tsx
@@ -2,7 +2,7 @@ import { getManager } from "@/services/shared";
import { Balance } from "@/services/shared/balance";
import { useAccountStore } from "@/stores/account";
import { Services } from "@/stores/account/types";
-import Button from "@/ui/components/Button";
+import Button from "@/ui/new/Button";
import ChipButton from "@/ui/components/ChipButton";
import { Dynamic } from "@/ui/components/Dynamic";
import { EmptyItem } from "@/ui/components/EmptyItem";
@@ -19,7 +19,7 @@ import { LinearGradient } from "expo-linear-gradient";
import { router, useFocusEffect } from "expo-router";
import { useCallback, useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
-import { Image, Pressable, View } from "react-native";
+import { Image, Platform, Pressable, View } from "react-native";
import { ScrollView } from "react-native-gesture-handler";
export default function QRCodeAndCardsPage() {
@@ -51,6 +51,7 @@ export default function QRCodeAndCardsPage() {
return (
<>
}
- trailing={
+ trailing={Platform.OS === "ios" && (
{
router.dismiss();
}}
/>
- }
+ )}
/>
}
+ fullWidth
+ label="Ajouter"
+ leading={}
onPress={() => {
router.navigate({
pathname: "/(onboarding)/restaurants/method"
diff --git a/app/(features)/(cards)/specific.tsx b/app/(features)/(cards)/specific.tsx
index d13d5de6..7392e57c 100644
--- a/app/(features)/(cards)/specific.tsx
+++ b/app/(features)/(cards)/specific.tsx
@@ -36,6 +36,7 @@ import TabHeader from "@/ui/components/TabHeader";
import TabHeaderTitle from "@/ui/components/TabHeaderTitle";
import ChipButton from "@/ui/components/ChipButton";
import ActivityIndicator from "@/ui/components/ActivityIndicator";
+import NativeSwitch from "@/ui/native/NativeSwitch";
export default function QRCodeAndCardsPage() {
const alert = useAlert();
@@ -134,7 +135,7 @@ export default function QRCodeAndCardsPage() {
alert.showAlert({
title: "Erreur lors de la réservation",
description: "Une erreur est survenue lors de la réservation de ton repas, il n'a donc pas été réservé.",
- icon: "TriangleAlert",
+ icon: "AlertTriangle",
color: "#D60046",
technical: String(error),
withoutNavbar: false
@@ -180,7 +181,7 @@ export default function QRCodeAndCardsPage() {
}
trailing={
{
router.dismiss();
@@ -259,7 +260,7 @@ export default function QRCodeAndCardsPage() {
Borne {item.label}
- handleToggle(index)}
diff --git a/app/(features)/(news)/specific.tsx b/app/(features)/(news)/specific.tsx
index 66211304..8fed9156 100644
--- a/app/(features)/(news)/specific.tsx
+++ b/app/(features)/(news)/specific.tsx
@@ -3,7 +3,7 @@ import { News } from "@/services/shared/news";
import { useAccountStore } from "@/stores/account";
import { Services } from "@/stores/account/types";
import Stack from "@/ui/components/Stack";
-import Typography from "@/ui/components/Typography";
+import TypographyLegacy from "@/ui/components/Typography";
import { useLocalSearchParams, useNavigation } from "expo-router"
import { useEffect, useState } from "react";
import { Linking, Platform, ScrollView, StyleSheet, View } from "react-native";
@@ -19,8 +19,11 @@ import { NativeHeaderPressable, NativeHeaderSide } from "@/ui/components/NativeH
import { MenuView } from "@react-native-menu/menu";
import Icon from "@/ui/components/Icon";
import { t } from "i18next";
-import List from "@/ui/components/List";
+import ListLegacy from "@/ui/components/List";
import Item from "@/ui/components/Item";
+import ActionMenu from "@/ui/components/ActionMenu";
+import Typography from "@/ui/new/Typography";
+import List from "@/ui/new/List";
export default function NewsPage() {
const search = useLocalSearchParams();
@@ -141,7 +144,7 @@ export default function NewsPage() {
>
{news.attachments.length > 0 && (
-
+
{news.attachments.map((attachment, i) => (
- {
@@ -161,14 +164,22 @@ export default function NewsPage() {
)}
- {attachment.name}
- {attachment.url}
+ {attachment.name}
+ {attachment.url}
))}
-
+
)}
+
+
+
+ Cette news contient un sondage
+
+
+
+
- ({
id: theme.value,
@@ -201,7 +212,7 @@ export default function NewsPage() {
-
+
>
)
diff --git a/app/(features)/attendance.tsx b/app/(features)/attendance.tsx
index 406ea847..8dfa63b5 100644
--- a/app/(features)/attendance.tsx
+++ b/app/(features)/attendance.tsx
@@ -1,6 +1,5 @@
import Icon from "@/ui/components/Icon";
import { NativeHeaderHighlight, NativeHeaderPressable, NativeHeaderSide, NativeHeaderTitle } from "@/ui/components/NativeHeader";
-import Typography from "@/ui/components/Typography";
import { router, useLocalSearchParams } from "expo-router";
import { Platform, ScrollView, View } from "react-native";
import { Papicons } from "@getpapillon/papicons"
@@ -15,12 +14,31 @@ import Stack from "@/ui/components/Stack";
import { useHeaderHeight } from "@react-navigation/elements";
import AnimatedNumber from "@/ui/components/AnimatedNumber";
import adjust from "@/utils/adjustColor";
-import List from "@/ui/components/List";
-import Item, { Trailing } from "@/ui/components/Item";
import { error } from "@/utils/logger/logger";
import { getManager } from "@/services/shared";
import { t } from "i18next";
import i18n from "@/utils/i18n";
+import ActionMenu from "@/ui/components/ActionMenu";
+import AndroidBackButton from "@/utils/theme/AndroidBackButton";
+import TabHeader from "@/ui/components/TabHeader";
+import TabHeaderTitle from "@/ui/components/TabHeaderTitle";
+import List from "@/ui/new/List";
+import { useSafeAreaInsets } from "react-native-safe-area-context";
+import Typography from "@/ui/new/Typography";
+import { formatDate, formatDistanceToNow, formatDistanceToNowStrict } from "date-fns";
+import * as DateLocale from 'date-fns/locale';
+
+const formatEventTime = (durationData: number, detailed: boolean) => {
+ if(detailed) {
+ return durationData >= 60
+ ? t("Attendance_Duration_HoursMinutes_Detailed", { hours: Math.floor(durationData / 60), minutes: lz(durationData % 60) })
+ : t("Attendance_Duration_Minutes", { value: durationData })
+ }
+
+ return durationData >= 60
+ ? t("Attendance_Duration_HoursMinutes_Compact", { hours: Math.floor(durationData / 60), minutes: lz(durationData % 60) })
+ : t("Attendance_Duration_Minutes", { value: durationData })
+}
export default function AttendanceView() {
try {
@@ -64,213 +82,23 @@ export default function AttendanceView() {
return { missedTime: missed, missedTimeUnjustified: unjustified, unjustifiedAbsenceCount: unjustifiedAbs, unjustifiedDelayCount: unjustifiedDelays, absenceCount: Abs, delayCount: Delays };
}, [period, attendances]);
- const dangerColor = useMemo(() => adjust("#C50000", -0.15), []);
- const dangerBg = "#C5000030";
- const dangerBorder = "#0000000D";
+ const [headerHeight, setHeaderHeight] = useState(0);
+ const insets = useSafeAreaInsets();
- return (
- <>
- {period && (
- <>
-
-
-
-
-
-
-
-
- {t("Attendance_Hours_Missed")}
-
-
-
- {String(Math.floor((missedTime % 3600) / 60)).padStart(2, '0')}
-
-
- h
-
-
- {String(missedTime % 60).padStart(2, '0')}
-
-
-
-
-
-
-
-
- {t("Attendance_Hours_Unjustified")}
-
-
-
- {String(Math.floor((missedTimeUnjustified % 3600) / 60)).padStart(2, '0')}
-
-
- h
-
-
- {String(missedTimeUnjustified % 60).padStart(2, '0')}
-
-
-
-
+ const dangerColor = adjust("#C50000", theme.dark ? 0.4 : -0.1);
+ const dangerBg = adjust("#C50000", theme.dark ? -0.65 : 0.85);
- {attendances.some(attendance => attendance.absences.length == 0) && attendances.some(attendance => attendance.delays.length == 0) && (
-
-
-
-
-
- {t("Attendance_NoEvent_Title")}
-
-
- {t("Attendance_NoEvent_Description")}
-
-
- )}
+ const successColor = adjust("#00C851", theme.dark ? 0.3 : -0.1);
+ const successBg = adjust("#00C851", theme.dark ? -0.75 : 0.85);
- {attendances.some(attendance => attendance.absences.length > 0) && (
- <>
-
-
-
-
-
- {t("Attendance_Missing")}
-
- x{absenceCount}
-
-
-
- {attendances.map((attendance, index) =>
- attendance.absences.map((absence, absenceIndex) => {
- const fromDate = new Date(absence.from);
- const day = fromDate.getDate().toString().padStart(2, '0');
- const month = (fromDate.getMonth() + 1).toString().padStart(2, '0');
- return (
- -
-
-
- {!absence.justified && (
-
-
-
- )}
-
- {String(Math.floor(absence.timeMissed / 60)).padStart(2, '0')}h{String(absence.timeMissed % 60).padStart(2, '0')}
-
-
-
-
- {absence.reason || t("Attendance_NoReason")}
-
-
- {day}/{month}
-
-
- );
- })
- )}
-
-
- >
- )}
-
- {attendances.some(attendance => attendance.delays.length > 0) && (
- <>
-
-
-
-
-
- {t("Attendance_Delays")}
-
- x{delayCount}
-
-
-
- {attendances.map((attendance, index) =>
- attendance.delays.map((delay, absenceIndex) => {
- const fromDate = new Date(delay.givenAt);
- const day = fromDate.getDate().toString().padStart(2, '0');
- const month = (fromDate.getMonth() + 1).toString().padStart(2, '0');
- return (
- -
-
-
- {!delay.justified && (
-
-
-
- )}
-
- {delay.duration}m
-
-
-
-
- {delay.reason || t("Attendance_NoReason")}
-
-
- {day}/{month}
-
-
- );
- })
- )}
-
-
- >
- )}
-
-
-
-
- { router.back() }}>
-
-
-
-
-
-
-
-
+ {
const actionId = nativeEvent.event;
@@ -280,7 +108,7 @@ export default function AttendanceView() {
const selectedPeriod: Period | undefined = periods.find(item => item.id === selectedPeriodId)
if (!selectedPeriod) {
- error("Invalid Period")
+ error(t("Attendance_InvalidPeriod"))
}
const manager = getManager()
@@ -306,36 +134,213 @@ export default function AttendanceView() {
ios: (getPeriodNumber(item.name || "0")) + ".calendar"
}),
imageColor: colors.text,
- }))}>
-
+
+
+ }
+ />
+
+
+ {attendances.some(attendance => attendance.absences.length == 0) && attendances.some(attendance => attendance.delays.length == 0) ? (
+
+
+
+
+
+
+
+
+ {t("Attendance_NoEvent_Title")}
+
+
+ {t("Attendance_NoEvent_Description")}
+
+
+ ) : (
+
+ {missedTimeUnjustified > 0 ? (
+
+
+
+
+
+
+
+
+ {t("Attendance_Hours_Unjustified_Value", { duration: formatEventTime(missedTimeUnjustified, true) })}
+
+
+ {t("Attendance_Unjustified_Description")}
+
+
+ ) : (
+
-
- {getPeriodName(period?.name ?? "")}
-
-
- {getPeriodNumber(period?.name ?? "")}
-
-
-
-
-
-
-
- >
- )}
+
+
+
+
+
+
+
+ {t("Attendance_NoUnjustified_Title")}
+
+
+ {t("Attendance_NoUnjustified_Description")}
+
+
+ )}
+
+
+
+ {t("Attendance_Hours_Missed")}
+
+
+ 0 ? dangerColor : "textSecondary"}>
+ {formatEventTime(missedTime, true)}
+
+
+
+
+ )}
+
+ {attendances.some(attendance => attendance.absences.length > 0) && (
+
+
+
+
+
+
+ {t("Attendance_Missing")}
+
+
+ {absenceCount}
+
+
+
+ {attendances.map((attendance, index) =>
+ attendance.absences.map((absence, absenceIndex) => {
+ const fromDate = new Date(absence.from);
+ const dateString = formatDistanceToNowStrict(fromDate, {
+ locale: DateLocale[i18n.language as keyof typeof DateLocale] || DateLocale.enUS,
+ addSuffix: true
+ })
+ const dayString = formatDate(fromDate, "eeee d MMMM", {
+ locale: DateLocale[i18n.language as keyof typeof DateLocale] || DateLocale.enUS,
+ })
+
+ return (
+
+
+ {absence.reason || t("Attendance_NoReason")}
+
+
+ {dateString} · {dayString}
+
+
+
+
+
+ )
+ })
+ )}
+
+ )}
+
+ {attendances.some(attendance => attendance.delays.length > 0) && (
+
+
+
+
+
+
+ {t("Attendance_Delays")}
+
+
+ {delayCount}
+
+
+
+ {attendances.map((attendance, index) =>
+ attendance.delays.map((delay, absenceIndex) => {
+ const fromDate = new Date(delay.givenAt);
+ const date = fromDate.getTime();
+ const dateString = formatDistanceToNowStrict(date, {
+ locale: DateLocale[i18n.language as keyof typeof DateLocale] || DateLocale.enUS,
+ addSuffix: true
+ })
+ const dayFormatted = formatDate(date, "eeee d MMMM", {
+ locale: DateLocale[i18n.language as keyof typeof DateLocale] || DateLocale.enUS,
+ })
+
+ return (
+
+
+ {delay.reason || t("Attendance_NoReason")}
+
+
+ {dateString} · {dayFormatted}
+
+
+
+
+
+ )
+ })
+ )}
+
+ )}
+
+
>
)
} catch (err) {
error(err.toString());
return null;
}
-}
\ No newline at end of file
+}
+
+const lz = (num: number) => num.toString().padStart(2, "0");
+
+const AttendanceTimer = ({ evt }: { evt: any }) => {
+ const theme = useTheme();
+ const { colors } = theme;
+
+ const dangerColor = adjust("#C50000", theme.dark ? 0.4 : -0.1);
+ const dangerBg = dangerColor + "30";
+
+ const durationData = evt.timeMissed || evt.duration || 0;
+
+ const durationText = formatEventTime(durationData);
+
+ return (
+
+ {!evt.justified && (
+
+
+
+ )}
+
+ {durationText}
+
+
+ )
+}
diff --git a/app/(modals)/address.tsx b/app/(modals)/address.tsx
index c3636282..62edd74b 100644
--- a/app/(modals)/address.tsx
+++ b/app/(modals)/address.tsx
@@ -7,8 +7,11 @@ import { useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
import {
ActivityIndicator,
+ Dimensions,
KeyboardAvoidingView,
+ Platform,
ScrollView,
+ TouchableNativeFeedback,
View,
} from "react-native";
import { useSafeAreaInsets } from "react-native-safe-area-context";
@@ -22,6 +25,9 @@ import Item, { Leading, Trailing } from "@/ui/components/Item";
import List from "@/ui/components/List";
import Search from "@/ui/components/Search";
import Typography from "@/ui/components/Typography";
+import { useHeaderHeight } from "@react-navigation/elements";
+import AndroidBackButton, { AndroidBackButtonStyles } from "@/utils/theme/AndroidBackButton";
+import Icon from "@/ui/components/Icon";
export interface AddressModalProps {
canUseCurrentLocation: boolean;
@@ -161,25 +167,52 @@ export const AddressModal = ({
timeout = setTimeout(() => search(), 200);
}, [searchTerm]);
+ const finalHeaderHeight = Platform.select({
+ android: insets.top,
+ default: 0
+ });
+
return (
-
+ >
+ {Platform.OS === "android" && (
+
+
+
+
+
+
+
+ )}
+
+
{status === null || status?.granted ? (
-
-
- ,
- }
- ]
- } : null,
- {
- title: t("Modal_Course_Time"),
- papicon: ,
- items: [
- {
- title: t("Modal_Course_Start"),
- description: formatDistanceToNow(startTime * 1000, { locale: DateLocale[i18n.language as keyof typeof DateLocale] || DateLocale.enUS, addSuffix: true }),
- icon: ,
- trailing: {new Date(startTime * 1000).toLocaleString(undefined, {
- hour: "numeric",
- minute: "numeric"
- })}
- },
- {
- title: t("Modal_Course_End"),
- icon: ,
- trailing: {new Date(endTime * 1000).toLocaleString(undefined, {
- hour: "numeric",
- minute: "numeric"
- })}
- }
- ]
- },
- {
- title: t("Modal_Course_Details"),
- papicon: ,
- items: [
- {
- papicon: ,
- title: t("Modal_Course_Teacher"),
- description: item.teacher
- },
- {
- papicon: ,
- title: t("Modal_Course_Room"),
- description: item.room || t("No_Course_Room")
- },
- {
- papicon: ,
- title: t("Modal_Course_Duration"),
- description: formatDistanceStrict(startTime * 1000, endTime * 1000, { locale: DateLocale[i18n.language as keyof typeof DateLocale] || DateLocale.enUS })
- }
- ]
- }
- ]}
+ {Platform.OS !== 'android' && (
+
+ )}
+
+
}
style={{ backgroundColor: "transparent" }}
- />
+ contentContainerStyle={{ padding: 16 }}
+ >
+ {getStatusText(course.status) ? (
+
+
+
+
+
+
+
+
+ {getStatusText(course.status)}
+
+
+
+ ) : null}
+
+
+
+ {t("Modal_Course_Time")}
+
+
+
+
+
+
+
+
+
+ {t("Modal_Course_Start")}
+
+
+ {formatDistanceToNow(startTime * 1000, {
+ locale: DateLocale[i18n.language as keyof typeof DateLocale] || DateLocale.enUS,
+ addSuffix: true
+ })}
+
+
+
+ {new Date(startTime * 1000).toLocaleString(undefined, {
+ hour: "numeric",
+ minute: "numeric"
+ })}
+
+
+
+
+
+
+
+
+
+
+
+ {t("Modal_Course_End")}
+
+
+
+ {new Date(endTime * 1000).toLocaleString(undefined, {
+ hour: "numeric",
+ minute: "numeric"
+ })}
+
+
+
+
+
+
+
+ {t("Modal_Course_Details")}
+
+
+
+
+
+
+
+
+
+ {t("Modal_Course_Teacher")}
+
+
+ {item.teacher}
+
+
+
+
+
+
+
+
+
+
+ {t("Modal_Course_Room")}
+
+
+ {item.room || t("No_Course_Room")}
+
+
+
+
+
+
+
+
+
+
+ {t("Modal_Course_Duration")}
+
+
+ {formatDistanceStrict(startTime * 1000, endTime * 1000, {
+ locale: DateLocale[i18n.language as keyof typeof DateLocale] || DateLocale.enUS
+ })}
+
+
+
+
>
)
-}
\ No newline at end of file
+}
diff --git a/app/(modals)/grade.tsx b/app/(modals)/grade.tsx
index ff0ae461..348d03a2 100644
--- a/app/(modals)/grade.tsx
+++ b/app/(modals)/grade.tsx
@@ -2,7 +2,7 @@ import { Papicons } from '@getpapillon/papicons';
import { useRoute, useTheme } from "@react-navigation/native";
import { t } from "i18next";
import React from "react";
-import { View } from "react-native";
+import { Platform, View } from "react-native";
import LinearGradient from "react-native-linear-gradient";
import ModalOverhead, { ModalOverHeadScore } from '@/components/ModalOverhead';
@@ -11,9 +11,14 @@ import ContainedNumber from "@/ui/components/ContainedNumber";
import Icon from "@/ui/components/Icon";
import Stack from "@/ui/components/Stack";
import TableFlatList from "@/ui/components/TableFlatList";
-import Typography from "@/ui/components/Typography";
+import TypographyLegacy from "@/ui/components/Typography";
import adjust from '@/utils/adjustColor';
import { colorCheck } from '@/utils/colorCheck';
+import { useSafeAreaInsets } from 'react-native-safe-area-context';
+import List from '@/ui/new/List';
+import Typography from '@/ui/new/Typography';
+import { useSettingsStore } from '@/stores/settings';
+import { formatAssumed20ForDisplay, getGradeDisplayScale, getDisplayScaleMax } from '@/utils/grades/scale';
interface SubjectInfo {
name: string;
@@ -45,9 +50,9 @@ const GradeBadge = ({ icon, label, color, theme, is_outlined = false }: GradeBad
return (
-
+
{label}
-
+
);
};
@@ -61,102 +66,34 @@ export default function GradesModal() {
return null;
}
const { grade, subjectInfo, avgInfluence = 0, avgClass = 0 } = params as GradesModalProps;
+ const displayScale = getGradeDisplayScale(useSettingsStore(state => state.personalization.gradesDisplayScale));
+ const displayScaleMax = getDisplayScaleMax(displayScale);
+
+ const insets = useSafeAreaInsets();
+ const finalHeaderHeight = Platform.select({
+ android: insets.top + 32,
+ default: 0
+ });
return (
<>
-
+ {Platform.OS !== 'android' && (
+
+ )}
- ,
- items: [
- ...(grade.studentScore && grade.outOf && grade.outOf.value !== 20 ? [{
- icon: ,
- title: t("Grades_NormalizedGrade_Title"),
- description: t("Grades_NormalizedGrade_Description"),
- trailing: (
-
- {((grade.studentScore.value / grade.outOf.value) * 20).toFixed(2)}
-
- )
- }] : []),
- {
- icon: ,
- title: t("Grades_HighestGrade_Title"),
- description: t("Grades_HighestGrade_Description"),
- trailing: (
-
- {grade.maxScore?.value.toFixed(2)}
-
- )
- },
- {
- icon: ,
- title: t("Grades_LowestGrade_Title"),
- description: t("Grades_LowestGrade_Description"),
- trailing: (
-
- {grade.minScore?.value.toFixed(2)}
-
- )
- }
- ]
- },
- {
- title: t("Grades_Influence_Title"),
- icon: ,
- items: [
- {
- icon: ,
- title: t("Grades_Avg_All_Title"),
- trailing: (
- = 0 ? "#42C500" : "#C50000"}
- denominator="pts"
- >
- {avgInfluence >= 0 ? `+${avgInfluence.toFixed(2)}` : avgInfluence.toFixed(2)}
-
- )
- },
- {
- icon: ,
- title: t("Grades_Avg_Group_Title"),
- trailing: (
- = 0 ? "#42C500" : "#C50000"}
- denominator="pts"
- >
- {avgClass >= 0 ? `+${avgClass.toFixed(2)}` : avgClass.toFixed(2)}
-
- )
- }
- ]
- }
- ]}
+
@@ -225,10 +163,10 @@ export default function GradesModal() {
-
+
{t("Grades_Coefficient")}
-
-
+
+
x{(grade.coefficient ?? 1).toFixed(2)}
@@ -241,10 +179,10 @@ export default function GradesModal() {
-
+
{t("Grades_Avg_Group_Short")}
-
-
+
+
{grade.averageScore?.value.toFixed(2)}
@@ -252,7 +190,127 @@ export default function GradesModal() {
}
style={{ backgroundColor: "transparent" }}
- />
+ contentContainerStyle={{ padding: 16,
+ paddingBottom: 16 + insets.bottom }}
+ >
+
+
+ {t("Grades_Details_Title")}
+
+
+ {grade.studentScore && grade.outOf && grade.outOf.value !== displayScaleMax ? (
+
+
+
+
+
+
+
+ {t("Grades_NormalizedGrade_Title")}
+
+
+ {t("Grades_NormalizedGrade_Description")}
+
+
+
+ {formatAssumed20ForDisplay((grade.studentScore.value / grade.outOf.value) * 20, displayScale).value.toFixed(2)}
+
+
+
+ ) : null}
+
+
+
+
+
+
+
+
+ {t("Grades_HighestGrade_Title")}
+
+
+ {t("Grades_HighestGrade_Description")}
+
+
+
+ {grade.maxScore?.value.toFixed(2)}
+
+
+
+
+
+
+
+
+
+
+
+ {t("Grades_LowestGrade_Title")}
+
+
+ {t("Grades_LowestGrade_Description")}
+
+
+
+ {grade.minScore?.value.toFixed(2)}
+
+
+
+
+
+
+
+ {t("Grades_Influence_Title")}
+
+
+
+
+
+
+
+
+
+ {t("Grades_Avg_All_Title")}
+
+
+ = 0 ? "#2e8900" : "#990000"}
+ denominator="pts"
+ >
+ {avgInfluence >= 0 ? `+${avgInfluence.toFixed(2)}` : avgInfluence.toFixed(2)}
+
+
+
+
+
+
+
+
+
+
+
+ {t("Grades_Avg_Group_Title")}
+
+
+ = 0 ? "#2e8900" : "#990000"}
+ denominator="pts"
+ >
+ {avgClass >= 0 ? `+${avgClass.toFixed(2)}` : avgClass.toFixed(2)}
+
+
+
+
+
>
)
}
diff --git a/app/(modals)/news.tsx b/app/(modals)/news.tsx
index af66fe3a..aa6433b5 100644
--- a/app/(modals)/news.tsx
+++ b/app/(modals)/news.tsx
@@ -3,7 +3,7 @@ import { News } from "@/services/shared/news";
import { useAccountStore } from "@/stores/account";
import { Services } from "@/stores/account/types";
import Stack from "@/ui/components/Stack";
-import Typography from "@/ui/components/Typography";
+import TypographyLegacy from "@/ui/components/Typography";
import { useLocalSearchParams, useNavigation, useRouter } from "expo-router"
import { useEffect, useState } from "react";
import { Linking, Platform, ScrollView, StyleSheet, View } from "react-native";
@@ -18,7 +18,7 @@ import { NativeHeaderPressable, NativeHeaderSide } from "@/ui/components/NativeH
import { MenuView } from "@react-native-menu/menu";
import Icon from "@/ui/components/Icon";
import { t } from "i18next";
-import List from "@/ui/components/List";
+import ListLegacy from "@/ui/components/List";
import Item, { Leading } from "@/ui/components/Item";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import { cleanHtmlForArticle } from "@/utils/news/cleanUpHTMLNews";
@@ -27,8 +27,10 @@ import Avatar from "@/ui/components/Avatar";
import { getInitials } from "@/utils/chats/initials";
import { HeaderBackButton } from "@react-navigation/elements";
import { runsIOS26 } from "@/ui/utils/IsLiquidGlass";
-import { Papicons } from "@getpapillon/papicons";
+import { IconNames, Papicons } from "@getpapillon/papicons";
import { getAttachmentIcon } from "@/utils/news/getAttachmentIcon";
+import List from "@/ui/new/List";
+import Typography from "@/ui/new/Typography";
const NewsModal = () => {
const search = useLocalSearchParams();
@@ -115,33 +117,51 @@ const NewsModal = () => {
-
+
{news.category}
-
+
-
+
{news.title}
-
+
-
+
{news.author}
-
+
-
+
{new Date(news.createdAt).toLocaleDateString(undefined, {
day: '2-digit',
month: 'short',
year: 'numeric'
})}
-
+
+ {news.question && (
+
+
+
+
+
+
+
+
+ Cette actualité contient un sondage
+
+
+ PRONOTE ne nous permet pas d'afficher les sondages pour le moment.
+
+
+
+ )}
+
{
/>
{news.attachments.length > 0 && (
-
+
{news.attachments.map((attachment, index) => (
- Linking.openURL(attachment.url)}>
@@ -161,26 +181,26 @@ const NewsModal = () => {
-
+
{attachment.name}
-
-
+
+
{attachment.url}
-
+
))}
-
+
)}
-
+
Si cette actualité ne s'affiche pas correctement,
-
-
+ setHTMLCleanupEnabled(!HTMLCleanupEnabled)}>
{HTMLCleanupEnabled ? "désactiver" : "activer"} le formattage automatique
-
+
);
diff --git a/app/(modals)/profile.tsx b/app/(modals)/profile.tsx
index 67d73520..9ac8163c 100644
--- a/app/(modals)/profile.tsx
+++ b/app/(modals)/profile.tsx
@@ -23,6 +23,7 @@ import Icon from "@/ui/components/Icon";
import { NativeHeaderPressable, NativeHeaderSide } from "@/ui/components/NativeHeader";
import Typography from "@/ui/components/Typography";
import { getInitials } from "@/utils/chats/initials";
+import ActionMenu from "@/ui/components/ActionMenu";
export default function CustomProfileScreen() {
const { t } = useTranslation();
@@ -82,18 +83,19 @@ export default function CustomProfileScreen() {
contentInsetAdjustmentBehavior="automatic"
style={{ height: "100%" }}
>
-
+
- }
title={t("Button_Change_ProfilePicture")}
/>
-
+
diff --git a/app/(modals)/task.tsx b/app/(modals)/task.tsx
deleted file mode 100644
index f04742e7..00000000
--- a/app/(modals)/task.tsx
+++ /dev/null
@@ -1,148 +0,0 @@
-import { Papicons } from "@getpapillon/papicons";
-import { useRoute, useTheme } from "@react-navigation/native";
-import { LinearGradient } from "expo-linear-gradient";
-import * as WebBrowser from "expo-web-browser";
-import { t } from "i18next";
-import React, { useState } from "react";
-
-import ModalOverhead from "@/components/ModalOverhead";
-import Homework from "@/database/models/Homework";
-import { updateHomeworkIsDone } from "@/database/useHomework";
-import { getManager } from "@/services/shared";
-import AnimatedPressable from "@/ui/components/AnimatedPressable";
-import Icon from "@/ui/components/Icon";
-import Stack from "@/ui/components/Stack";
-import TableFlatList from "@/ui/components/TableFlatList";
-import { formatHTML } from "@/utils/format/html";
-import { generateId } from "@/utils/generateId";
-import { getAttachmentIcon } from "@/utils/news/getAttachmentIcon";
-import { getSubjectColor } from "@/utils/subjects/colors";
-import { getSubjectEmoji } from "@/utils/subjects/emoji";
-import { getSubjectName } from "@/utils/subjects/name";
-
-const Task = () => {
- const { params } = useRoute();
- const theme = useTheme();
- const colors = theme.colors;
-
- const { task } = params as { task: Homework };
-
- const subjectInfo = {
- color: getSubjectColor(task.subject),
- emoji: getSubjectEmoji(task.subject),
- name: getSubjectName(task.subject)
- }
-
- const [isDone, setIsDone] = useState(task.isDone);
-
- const setAsDone = async (done: boolean) => {
- const manager = getManager();
- await manager.setHomeworkCompletion(task, done);
-
- const id = generateId(
- task.subject +
- task.content +
- task.createdByAccount +
- new Date(task.dueDate).toDateString()
- );
-
- updateHomeworkIsDone(id, done);
- setIsDone(done);
- }
-
- return (
- <>
-
-
-
- }
- sections={[
- {
- title: t("Modal_Task_Status"),
- icon: ,
- items: [
- {
- title: isDone ? t("Task_Done") : t("Task_Undone"),
- leading:
- setAsDone(!isDone)}>
-
- {isDone &&
-
- }
-
-
- }
- ]
- },
- {
- title: t("Modal_Task_Description"),
- icon: ,
- items: [
- {
- title: formatHTML(task.content),
- titleProps: {
- variant: "title",
- weight: "medium"
- }
- }
- ]
- },
- task.attachments.length > 0 ? {
- title: t("Modal_Task_Attachments"),
- icon: ,
- items: task.attachments.map((attachment) => ({
- title: attachment.name || attachment.url,
- titleProps: {
- nowrap: true
- },
- description: attachment.url,
- descriptionProps: {
- nowrap: true
- },
- leading: ,
- onPress: () => WebBrowser.openBrowserAsync(attachment.url, {
- presentationStyle: "formSheet"
- })
- }))
- } : null
- ]}
- style={{
- backgroundColor: "transparent"
- }}
- />
- >
- );
-};
-
-export default Task;
diff --git a/app/(modals)/tasks/custom.tsx b/app/(modals)/tasks/custom.tsx
new file mode 100644
index 00000000..b6aa616d
--- /dev/null
+++ b/app/(modals)/tasks/custom.tsx
@@ -0,0 +1,447 @@
+import AnimatedPressable from "@/ui/components/AnimatedPressable";
+import { router, useLocalSearchParams } from "expo-router";
+import { Papicons } from "@getpapillon/papicons";
+import Typography from "@/ui/components/Typography";
+import Stack from "@/ui/components/Stack";
+import { useTheme } from "@react-navigation/native";
+import { useTranslation } from "react-i18next";
+import React, { useEffect, useMemo, useState } from "react";
+import {
+ KeyboardAvoidingView,
+ Platform,
+ ScrollView,
+ Text,
+ TextInput,
+ View,
+} from "react-native";
+import { MenuView } from "@react-native-menu/menu";
+import Reanimated, { useSharedValue, withSpring, withTiming } from "react-native-reanimated";
+import DateTimePicker from "@react-native-community/datetimepicker";
+import { LinearGradient } from "expo-linear-gradient";
+import adjust from "@/utils/adjustColor";
+import { useSafeAreaInsets } from "react-native-safe-area-context";
+import { useAccountStore } from "@/stores/account";
+import { formatRelative } from "date-fns/formatRelative";
+import { FormatRelativeFn, fr } from "date-fns/locale";
+import Task, { formatDistanceDay } from "@/ui/components/Task";
+import { CustomisableSubject } from "@/stores/account/types";
+import { Homework } from "@/services/shared/homework";
+import { useHomeworkActionsStore } from "@/app/(tabs)/tasks/hooks/useHomeworkData";
+import { deleteHomeworkFromDatabase } from "@/database/useHomework";
+import { ListTouchable } from "@/ui/new/List";
+
+const SubjectSelector = ({ subjects, selectedSubject, setSelectedSubject }: {
+ subjects: CustomisableSubject[];
+ selectedSubject: CustomisableSubject;
+ setSelectedSubject: (s: CustomisableSubject) => void;
+}) => {
+ const { colors } = useTheme();
+
+ return (
+ {
+ const selected = subjects.find(s => s.id === nativeEvent.event);
+ if (selected) {
+ setSelectedSubject(selected);
+ }
+ }}
+ actions={subjects.map(subject => ({ id: subject.id, title: [subject.emoji, subject.name].join(" ") }))}
+ style={{
+ width: "100%",
+ backgroundColor: colors.card,
+ flexDirection: "row",
+ gap: 10,
+ padding: 10,
+ alignItems: "center",
+ borderRadius: 30,
+ borderWidth: 1,
+ borderColor: colors.border,
+ shadowRadius: 3,
+ shadowColor: "#000",
+ shadowOpacity: 0.05,
+ shadowOffset: { width: 0, height: 0 },
+ }}
+ >
+
+ {selectedSubject.emoji}
+
+
+ {selectedSubject.name}
+
+
+
+ );
+};
+
+
+const customFormatRelative: FormatRelativeFn = (token) => {
+ const formatMap = {
+ lastWeek: "eeee 'dernier'",
+ yesterday: "'hier'",
+ today: "'aujourd’hui'",
+ tomorrow: "'demain'",
+ nextWeek: "eeee",
+ other: "P",
+ }
+
+ return formatMap[token]
+}
+
+export const customFr = {
+ ...fr,
+ formatRelative: customFormatRelative
+}
+
+const DateSelector = ({ selectedDate, setDate }: {
+ selectedDate: Date;
+ setDate: (s: Date) => void;
+}) => {
+ const { colors } = useTheme();
+ const { t } = useTranslation();
+
+ const pickerHeight = useSharedValue(50);
+ const calendarScale = useSharedValue(0.8);
+ const calendarOpacity = useSharedValue(0);
+ const editButtonScale = useSharedValue(1);
+ const editButtonOpacity = useSharedValue(1);
+
+ const showPicker = () => {
+ pickerHeight.value = withSpring(370);
+ calendarScale.value = withSpring(1);
+ calendarOpacity.value = withTiming(1);
+ editButtonScale.value = withTiming(0.8);
+ editButtonOpacity.value = withTiming(0);
+ };
+
+ const hidePicker = () => {
+ pickerHeight.value = withSpring(50);
+ calendarScale.value = withTiming(0.8);
+ calendarOpacity.value = withTiming(0);
+ editButtonScale.value = withTiming(1);
+ editButtonOpacity.value = withTiming(1);
+ };
+
+ const togglePicker = () => {
+ if (pickerHeight.value > 50) {
+ hidePicker();
+ } else {
+ showPicker();
+ }
+ };
+
+ return (
+
+
+
+ {formatDistanceDay(selectedDate)}
+
+
+ {t("Task_New_DueDate_Edit")}
+
+
+
+
+ {
+ setDate(date ?? new Date())
+ hidePicker();
+ }}
+ />
+
+
+ );
+};
+
+const NewTaskModal = () => {
+ const { colors, dark } = useTheme();
+ const { t } = useTranslation();
+ const insets = useSafeAreaInsets();
+
+ const accounts = useAccountStore((state) => state.accounts);
+ const lastUsedAccount = useAccountStore((state) => state.lastUsedAccount);
+ const account = accounts.find((a) => a.id === lastUsedAccount);
+ const subjects = useMemo(() =>
+ Object.entries(account?.customisation?.subjects ?? {})
+ .map(([key, value]) => ({ ...value, id: key }))
+ .filter(item => item.name && item.emoji && item.color),
+ [account?.customisation?.subjects]
+ );
+
+ const local: { action?: string, id?: string, subject?: string, date?: string, description?: string, done?: string } = useLocalSearchParams();
+ const [selectedSubject, setSelectedSubject] = useState(local.subject ? subjects.find(s => s.name === local?.subject) : subjects[0]);
+ const [selectedDate, setDate] = useState(local?.date ? new Date(parseInt(local?.date)) : new Date());
+ const [taskDescription, setDescription] = useState(local?.description);
+ const [taskDone, setTaskDone] = useState(local?.done ? Boolean(parseInt(local?.done)) : false);
+ const addHomework = useHomeworkActionsStore(s => s.onAdd);
+
+ const disabled = taskDescription?.trim() === "" || !taskDescription
+
+ return (
+ <>
+ {/* Header */}
+
+ {
+ router.back();
+ }}
+ >
+
+
+ {local.action ? t("Task_Edit_Title") : t("Task_New_Title")}
+ {
+ if (selectedSubject && taskDescription && account?.id) {
+ const homework: Homework = {
+ id: "homework-custom",
+ subject: selectedSubject?.name,
+ content: taskDescription,
+ dueDate: selectedDate,
+ isDone: taskDone,
+ attachments: [],
+ evaluation: false,
+ custom: true,
+ createdByAccount: account.id
+ }
+ if (local?.action === "edit" && local?.id) {
+ deleteHomeworkFromDatabase(local?.id);
+ router.back();
+ }
+ addHomework!(homework)
+ }
+ router.back();
+ }}
+ >
+
+
+
+
+ {/* Gradient */}
+
+
+ {/* Content */}
+
+
+
+ {}}
+ onToggle={() => { setTaskDone(!taskDone)}}
+ />
+
+
+
+
+ {t("Task_New_Subject")}
+
+ { selectedSubject && (
+
+ )}
+
+
+
+
+ {t("Task_New_DueDate")}
+
+
+
+
+
+
+ {t("Task_New_TaskDescription")}
+
+
+
+
+
+ >
+ );
+};
+
+export default NewTaskModal;
\ No newline at end of file
diff --git a/app/(modals)/tasks/task.tsx b/app/(modals)/tasks/task.tsx
new file mode 100644
index 00000000..81b3ff7f
--- /dev/null
+++ b/app/(modals)/tasks/task.tsx
@@ -0,0 +1,260 @@
+import { Papicons } from "@getpapillon/papicons";
+import { useRoute, useTheme } from "@react-navigation/native";
+import { LinearGradient } from "expo-linear-gradient";
+import * as WebBrowser from "expo-web-browser";
+import { t } from "i18next";
+import React, { useState } from "react";
+
+import ModalOverhead from "@/components/ModalOverhead";
+import { Homework, Homework as SharedHomework } from "@/services/shared/homework";
+import { getManager } from "@/services/shared";
+import AnimatedPressable from "@/ui/components/AnimatedPressable";
+import Icon from "@/ui/components/Icon";
+import Stack from "@/ui/components/Stack";
+import { formatHTML } from "@/utils/format/html";
+import { generateId } from "@/utils/generateId";
+import { getAttachmentIcon } from "@/utils/news/getAttachmentIcon";
+import { getSubjectColor } from "@/utils/subjects/colors";
+import { getSubjectEmoji } from "@/utils/subjects/emoji";
+import { getSubjectName } from "@/utils/subjects/name";
+import { useSafeAreaInsets } from "react-native-safe-area-context";
+import List from "@/ui/new/List";
+import Typography from "@/ui/new/Typography";
+import { Platform, View } from "react-native";
+import adjust from "@/utils/adjustColor";
+import { router } from "expo-router";
+import { MenuView } from "@react-native-menu/menu";
+import { useHomeworkActionsStore } from "@/app/(tabs)/tasks/hooks/useHomeworkData";
+import { NativeHeaderPressable, NativeHeaderSide } from "@/ui/components/NativeHeader";
+import ChipButton from "@/ui/components/ChipButton";
+import { updateHomeworkIsDone } from "@/database/useHomework";
+import { Dynamic } from "@/ui/components/Dynamic";
+import { PapillonAppearIn, PapillonAppearOut } from "@/ui/utils/Transition";
+
+const Task = () => {
+ const { params } = useRoute();
+ const theme = useTheme();
+ const colors = theme.colors;
+
+ const { task } = params as { task: Homework };
+
+ const subjectInfo = {
+ color: getSubjectColor(task.subject),
+ emoji: getSubjectEmoji(task.subject),
+ name: getSubjectName(task.subject)
+ };
+
+ const [isDone, setIsDone] = useState(task.isDone);
+ const deleteHomework = useHomeworkActionsStore(s => s.onDelete);
+
+ const setAsDone = async (done: boolean) => {
+ const manager = getManager();
+
+ if (!task.custom) {
+ await manager.setHomeworkCompletion(
+ task as unknown as SharedHomework,
+ done
+ );
+ }
+
+ const id = generateId(
+ task.subject +
+ task.content +
+ task.createdByAccount +
+ new Date(task.dueDate).toDateString()
+ );
+
+ updateHomeworkIsDone(id, done);
+ setIsDone(done);
+ };
+
+ const insets = useSafeAreaInsets();
+ const finalHeaderHeight = Platform.select({
+ android: insets.top + 32,
+ default: 0
+ });
+
+ return (
+ <>
+ {Platform.OS !== "android" && (
+
+ )}
+
+ }
+ style={{
+ backgroundColor: "transparent"
+ }}
+ contentContainerStyle={{
+ padding: 16
+ }}
+ >
+
+
+
+ {t("Modal_Task_Status")}
+
+
+
+
+ setAsDone(!isDone)}>
+
+ {isDone && (
+
+ )}
+
+
+
+
+
+
+ {isDone ? t("Task_Done") : t("Task_Undone")}
+
+
+
+
+
+
+
+ {t("Modal_Task_Description")}
+
+
+
+
+ {formatHTML(task.content)}
+
+
+
+
+
+
+ {t("Modal_Task_Attachments")}
+
+
+ {task.attachments.map((attachment, index) => (
+
+ WebBrowser.openBrowserAsync(attachment.url, {
+ presentationStyle: "formSheet"
+ })
+ }
+ >
+
+
+
+
+
+
+
+ {attachment.name || attachment.url}
+
+
+
+ {attachment.url}
+
+
+ ))}
+
+
+ {task.custom && (
+
+ {
+ const actionId = nativeEvent.event;
+
+ if (actionId === "homework-delete") {
+ deleteHomework!(task);
+ router.back();
+ } else if (actionId === "homework-edit") {
+ router.push({
+ pathname: "/(modals)/tasks/custom",
+ params: {
+ action: "edit",
+ id: generateId(
+ task.subject +
+ task.content +
+ task.createdByAccount +
+ task.dueDate.toDateString()
+ ),
+ subject: task.subject,
+ done: task.isDone ? 1 : 0,
+ description: task.content,
+ date: task.dueDate.getTime()
+ }
+ });
+ }
+ }}
+ actions={[
+ {
+ id: "homework-edit",
+ title: "Modifier ce devoir",
+ image: Platform.select({
+ ios: "pencil"
+ }),
+ },
+ {
+ id: "homework-delete",
+ title: "Supprimer ce devoir",
+ imageColor: "#FF0000",
+ image: Platform.select({
+ ios: "trash.fill"
+ }),
+ attributes: { destructive: true }
+ }
+ ]}
+ />
+
+ )}
+ >
+ );
+};
+
+export default Task;
\ No newline at end of file
diff --git a/app/(modals)/wallpaper.tsx b/app/(modals)/wallpaper.tsx
index 09ce819e..5a642251 100644
--- a/app/(modals)/wallpaper.tsx
+++ b/app/(modals)/wallpaper.tsx
@@ -13,9 +13,10 @@ import { NativeHeaderPressable, NativeHeaderSide } from "@/ui/components/NativeH
import Icon from "@/ui/components/Icon"
import { router } from "expo-router";
import { Papicons } from "@getpapillon/papicons"
-import { MenuView } from "@react-native-menu/menu"
+import { t } from "i18next";
import * as ImagePicker from 'expo-image-picker';
+import ActionMenu from "@/ui/components/ActionMenu"
const COLLECTIONS_SOURCE = "https://raw.githubusercontent.com/PapillonApp/datasets/refs/heads/main/wallpapers/index.json";
@@ -235,11 +236,11 @@ const WallpaperModal = () => {
)}
- {
},
{
id: "background:downloads",
- title: "Téléchargements",
+ title: t("Modal_Wallpaper_Downloads"),
imageColor: colors.text,
image: Platform.select({
ios: "square.and.arrow.down"
@@ -256,12 +257,12 @@ const WallpaperModal = () => {
displayInline: false,
subactions: [
{
- title: "Taille des téléchargements",
+ title: t("Modal_Wallpaper_Downloads_Size"),
subtitle: (wallpaperDirectory.info().size / (1024 * 1024)).toFixed(2) + " MB"
},
{
id: "downloads:clear",
- title: "Vider les téléchargements",
+ title: t("Modal_Wallpaper_ClearDownloads"),
imageColor: "#FF0000",
image: Platform.select({
ios: "trash.fill"
@@ -271,6 +272,7 @@ const WallpaperModal = () => {
]
},
]}
+ placement="below"
onPressAction={({ nativeEvent }) => {
const action = nativeEvent.event;
if (action === "downloads:clear") {
@@ -291,7 +293,7 @@ const WallpaperModal = () => {
-
+
>
)
diff --git a/app/(modals)/wrapped/stories/consent.tsx b/app/(modals)/wrapped/stories/consent.tsx
index 2fbffb89..c3ce5d6c 100644
--- a/app/(modals)/wrapped/stories/consent.tsx
+++ b/app/(modals)/wrapped/stories/consent.tsx
@@ -8,6 +8,7 @@ import Reanimated, { FadeInDown, FadeOut, FadeOutUp } from 'react-native-reanima
import Stack from '@/ui/components/Stack';
import Typography from "@/ui/components/Typography";
import adjust from '@/utils/adjustColor';
+import NativeSwitch from '@/ui/native/NativeSwitch';
type ConsentItem = {
title: string;
@@ -51,7 +52,7 @@ const ConsentButton = memo(({
{item.title}
- onToggle(index)} trackColor={TRACK_COLOR} />
+ onToggle(index)} trackColor={TRACK_COLOR} />
diff --git a/app/(onboarding)/_layout.tsx b/app/(onboarding)/_layout.tsx
index 52738b5f..81f53161 100644
--- a/app/(onboarding)/_layout.tsx
+++ b/app/(onboarding)/_layout.tsx
@@ -1,27 +1,27 @@
import React from 'react';
-import { View } from 'react-native';
-import { useTranslation } from "react-i18next";
+import { Platform, StatusBar, View } from 'react-native';
+import { Stack } from "expo-router";
-import { Stack } from '@/utils/native/AnimatedNavigator';
import { screenOptions } from "@/utils/theme/ScreenOptions";
+import AndroidHeaderBackground, { AndroidHeaderProps } from '@/components/AndroidHeaderBackground';
+import { t } from 'i18next';
export default function OnboardingLayout() {
- const { t } = useTranslation();
const newScreenOptions = React.useMemo(() => ({
...screenOptions,
headerShown: true,
- headerBackVisible: true,
+ ...AndroidHeaderProps,
headerTransparent: true,
headerBackButtonDisplayMode: "minimal",
headerLargeTitle: false,
}), []);
return (
-
+
null, headerShown: false, headerBackground: null }}
/>
+
+
(
diff --git a/app/(onboarding)/components/OnboardingSelector.tsx b/app/(onboarding)/components/OnboardingSelector.tsx
index 199a37b3..0c8ea4f8 100644
--- a/app/(onboarding)/components/OnboardingSelector.tsx
+++ b/app/(onboarding)/components/OnboardingSelector.tsx
@@ -12,6 +12,7 @@ import Ripple from "@/ui/new/RippleEffect";
import Typography from "@/ui/new/Typography";
import { PapillonZoomIn, PapillonZoomOut } from "@/ui/utils/Transition";
import adjust from "@/utils/adjustColor";
+import { LayoutAnimationConfig } from "react-native-reanimated";
@@ -27,46 +28,48 @@ export default function OnboardingSelector({ item, selected, setSelected }) {
const dark = adjust(item.color, theme.dark ? 0.4 : -0.4);
return (
-
+ { selected == item.key ? setSelected(null) : setSelected(item.key) }}
- >
- {selected == item.key && (
-
- )}
-
-
+ onTap={() => { selected == item.key ? setSelected(null) : setSelected(item.key) }}
+ >
{selected == item.key && (
-
-
-
-
-
+
)}
-
- {item.label}
-
-
-
-
-
-
+
+ {selected == item.key && (
+
+
+
+
+
+ )}
+
+ {item.label}
+
+
+
+
+
+
+
+
)
};
\ No newline at end of file
diff --git a/app/(onboarding)/components/OnboardingWebView.tsx b/app/(onboarding)/components/OnboardingWebView.tsx
index 5e6ad071..a67a320e 100644
--- a/app/(onboarding)/components/OnboardingWebView.tsx
+++ b/app/(onboarding)/components/OnboardingWebView.tsx
@@ -1,14 +1,16 @@
import { Papicons } from "@getpapillon/papicons";
import { useTheme } from "@react-navigation/native";
import React from "react";
-import { View } from "react-native";
+import { Platform, View } from "react-native";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import WebView from "react-native-webview";
import { Dynamic } from "@/ui/components/Dynamic";
import Typography from "@/ui/new/Typography";
+import { useHeaderHeight } from "@react-navigation/elements";
+import AndroidBackButton from "@/utils/theme/AndroidBackButton";
-export default function OnboardingWebView({webViewRef, ...props}: React.ComponentProps) {
+export default function OnboardingWebView({ webViewRef, ...props }: React.ComponentProps) {
const insets = useSafeAreaInsets();
const { colors } = useTheme();
@@ -18,7 +20,7 @@ export default function OnboardingWebView({webViewRef, ...props}: React.Componen
const extractDomain = (url: string) => {
try {
- if(url.trim().length === 0) {return "about:blank";}
+ if (url.trim().length === 0) { return "about:blank"; }
const { hostname } = new URL(url);
return hostname.replace("www.", "");
@@ -27,15 +29,29 @@ export default function OnboardingWebView({webViewRef, ...props}: React.Componen
}
}
+ const finalHeaderHeight = Platform.select({
+ android: insets.top,
+ default: 0
+ });
+
return (
+ {Platform.OS === 'android' && (
+
+ )}
+
{currentUrl.startsWith("https://") && (
-
-
-
+
+
+
)}
diff --git a/app/(onboarding)/restaurants/_layout.tsx b/app/(onboarding)/restaurants/_layout.tsx
index a3eb180f..1953a352 100644
--- a/app/(onboarding)/restaurants/_layout.tsx
+++ b/app/(onboarding)/restaurants/_layout.tsx
@@ -1,15 +1,16 @@
import React from 'react';
import { useTranslation } from "react-i18next";
-import { Stack } from '@/utils/native/AnimatedNavigator';
+import { Stack } from 'expo-router';
import { screenOptions } from "@/utils/theme/ScreenOptions";
+import { Platform } from 'react-native';
export default function OnboardingLayout() {
const { t } = useTranslation();
const newScreenOptions = React.useMemo(() => ({
...screenOptions,
headerShown: true,
- headerBackVisible: true,
+ headerBackVisible: Platform.select({ android: false, default: true }),
headerTransparent: true,
headerBackButtonDisplayMode: "minimal",
headerLargeTitle: false,
diff --git a/app/(onboarding)/restaurants/alise.tsx b/app/(onboarding)/restaurants/alise.tsx
index d21b6830..0aa306cd 100644
--- a/app/(onboarding)/restaurants/alise.tsx
+++ b/app/(onboarding)/restaurants/alise.tsx
@@ -108,7 +108,7 @@ export default function AliseLoginWithCredentials() {
alert.showAlert({
title: t("Alert_Auth_Error"),
description: t("ONBOARDING_ALERT_ALISE_LOGIN_ABORTED"),
- icon: "TriangleAlert",
+ icon: "AlertTriangle",
color: "#D60046",
technical: String(error),
withoutNavbar: true,
diff --git a/app/(onboarding)/restaurants/ard.tsx b/app/(onboarding)/restaurants/ard.tsx
index 171555dc..74e56db6 100644
--- a/app/(onboarding)/restaurants/ard.tsx
+++ b/app/(onboarding)/restaurants/ard.tsx
@@ -67,13 +67,13 @@ export default function TurboSelfLoginWithCredentials() {
};
}, [keyboardListeners]);
- const loginARD = async () => {
+ const loginARD = async (submittedSiteId = siteId, submittedUsername = username, submittedPassword = password) => {
try {
throw new Error("ARD service is currently unavailable");
setIsLoggingIn(true);
const authenticator = new Authenticator();
// ARD require 2 connections, WHY ?
- const authentification = await authenticator.fromCredentials(siteId, username, password);
+ const authentification = await authenticator.fromCredentials(submittedSiteId, submittedUsername, submittedPassword);
const accountId = uuid();
const store = useAccountStore.getState();
@@ -84,9 +84,9 @@ export default function TurboSelfLoginWithCredentials() {
id: accountId,
auth: {
additionals: {
- schoolId: siteId,
- password,
- username,
+ schoolId: submittedSiteId,
+ password: submittedPassword,
+ username: submittedUsername,
mealPrice: String(mealPrice)
},
},
@@ -145,7 +145,10 @@ export default function TurboSelfLoginWithCredentials() {
return (
-
+
{
- if (!isLoggingIn && values.username && values.password) {
+ if (!isLoggingIn && values.siteId && values.username && values.password) {
setPassword(values.password);
setUsername(values.username);
setSiteId(values.siteId);
- loginARD();
+ loginARD(values.siteId, values.username, values.password);
}
}}
/>
diff --git a/app/(onboarding)/restaurants/izly.tsx b/app/(onboarding)/restaurants/izly.tsx
index de079aba..b4103bd7 100644
--- a/app/(onboarding)/restaurants/izly.tsx
+++ b/app/(onboarding)/restaurants/izly.tsx
@@ -177,7 +177,10 @@ export default function TurboSelfLoginWithCredentials() {
return (
-
+
("")
- const [password, setPassword] = useState("");
const [isLoggingIn, setIsLoggingIn] = useState(false);
const params = useLocalSearchParams();
const action = String(params.action);
@@ -65,10 +63,10 @@ export default function TurboSelfLoginWithCredentials() {
};
}, [keyboardListeners]);
- const loginTurboself = async () => {
+ const loginTurboself = async (submittedUsername: string, submittedPassword: string) => {
try {
setIsLoggingIn(true);
- const authentification = await authenticateWithCredentials(username, password, true, false)
+ const authentification = await authenticateWithCredentials(submittedUsername, submittedPassword, true, false)
const siblings = await authentification.getSiblings();
if (siblings.length === 0) {
const accountId = uuid()
@@ -77,8 +75,8 @@ export default function TurboSelfLoginWithCredentials() {
id: accountId,
auth: {
additionals: {
- username,
- password,
+ username: submittedUsername,
+ password: submittedPassword,
"hoteId": authentification.host?.id ?? "N/A"
}
},
@@ -128,8 +126,8 @@ export default function TurboSelfLoginWithCredentials() {
pathname: "/(onboarding)/restaurants/turboselfHost",
params: {
siblings: JSON.stringify(global),
- username,
- password
+ username: submittedUsername,
+ password: submittedPassword
}
});
} catch (error) {
@@ -140,7 +138,10 @@ export default function TurboSelfLoginWithCredentials() {
return (
-
+
{
if (!isLoggingIn && values.username && values.password) {
- setPassword(values.password);
- setUsername(values.username);
- loginTurboself();
+ loginTurboself(values.username, values.password);
}
}}
/>
diff --git a/app/(onboarding)/serviceSelection.tsx b/app/(onboarding)/serviceSelection.tsx
index c5b4764e..f51eb024 100644
--- a/app/(onboarding)/serviceSelection.tsx
+++ b/app/(onboarding)/serviceSelection.tsx
@@ -122,7 +122,7 @@ export default function ServiceSelection() {
>
{filteredServices.map((app) => (
setSelectedService(app.name)} style={{
- backgroundColor: selectedService === app.name ? adjust(colors.primary, theme.dark ? -0.8 : 0.9) : colors.card,
+ backgroundColor: selectedService === app.name ? adjust(colors.tint, theme.dark ? -0.8 : 0.9) : colors.item,
minHeight: 62
}}>
diff --git a/app/(onboarding)/services/appscho/_layout.tsx b/app/(onboarding)/services/appscho/_layout.tsx
index 81133a8d..369591a5 100644
--- a/app/(onboarding)/services/appscho/_layout.tsx
+++ b/app/(onboarding)/services/appscho/_layout.tsx
@@ -1,13 +1,15 @@
import React from 'react';
-import { Stack } from '@/utils/native/AnimatedNavigator';
+import { Stack } from 'expo-router';
import { screenOptions } from "@/utils/theme/ScreenOptions";
+import { Platform } from 'react-native';
+import { AndroidHeaderProps } from '@/components/AndroidHeaderBackground';
export default function OnboardingLayout() {
const newScreenOptions = React.useMemo(() => ({
...screenOptions,
headerShown: false,
- headerBackVisible: true,
+ ...AndroidHeaderProps,
headerTransparent: true,
headerBackButtonDisplayMode: "minimal",
headerLargeTitle: false,
diff --git a/app/(onboarding)/services/appscho/credentials.tsx b/app/(onboarding)/services/appscho/credentials.tsx
index 3ab92b1d..473dde89 100644
--- a/app/(onboarding)/services/appscho/credentials.tsx
+++ b/app/(onboarding)/services/appscho/credentials.tsx
@@ -73,7 +73,7 @@ export default function AppSchoCredentials() {
alert.showAlert({
title: t("ONBOARDING_ERROR"),
description: t("ONBOARDING_APPSCHO_INSTANCE_NOT_FOUND"),
- icon: "TriangleAlert",
+ icon: "AlertTriangle",
color: "#D60046",
withoutNavbar: true,
});
@@ -84,7 +84,7 @@ export default function AppSchoCredentials() {
alert.showAlert({
title: t("ONBOARDING_REQUIRED_FIELDS"),
description: t("ONBOARDING_FILL_ALL_FIELDS"),
- icon: "TriangleAlert",
+ icon: "AlertTriangle",
color: "#D60046",
withoutNavbar: true,
});
@@ -136,7 +136,7 @@ export default function AppSchoCredentials() {
alert.showAlert({
title: t("Alert_Auth_Error"),
description: t("ONBOARDING_ALERT_LOGIN_ABORTED"),
- icon: "TriangleAlert",
+ icon: "AlertTriangle",
color: "#D60046",
technical: String(error),
withoutNavbar: true,
diff --git a/app/(onboarding)/services/appscho/webview.tsx b/app/(onboarding)/services/appscho/webview.tsx
index a6fc56dc..b2b76988 100644
--- a/app/(onboarding)/services/appscho/webview.tsx
+++ b/app/(onboarding)/services/appscho/webview.tsx
@@ -69,7 +69,7 @@ export default function AppschoWebView() {
alert.showAlert({
title: t("Alert_Auth_Error"),
description: t("ONBOARDING_ALERT_OAUTH_LOGIN_ABORTED"),
- icon: "TriangleAlert",
+ icon: "AlertTriangle",
color: "#D60046",
technical: String(error),
withoutNavbar: true,
diff --git a/app/(onboarding)/services/ed/_layout.tsx b/app/(onboarding)/services/ed/_layout.tsx
index f2ff1a29..a2e647f6 100644
--- a/app/(onboarding)/services/ed/_layout.tsx
+++ b/app/(onboarding)/services/ed/_layout.tsx
@@ -1,15 +1,17 @@
import React from 'react';
import { useTranslation } from "react-i18next";
-import { Stack } from '@/utils/native/AnimatedNavigator';
+import { Stack } from 'expo-router';
import { screenOptions } from "@/utils/theme/ScreenOptions";
+import { Platform } from 'react-native';
+import { AndroidHeaderProps } from '@/components/AndroidHeaderBackground';
export default function OnboardingLayout() {
const { t } = useTranslation();
const newScreenOptions = React.useMemo(() => ({
...screenOptions,
headerShown: true,
- headerBackVisible: true,
+ ...AndroidHeaderProps,
headerTransparent: true,
headerBackButtonDisplayMode: "minimal",
headerLargeTitle: false,
diff --git a/app/(onboarding)/services/ed/credentials.tsx b/app/(onboarding)/services/ed/credentials.tsx
index 92809ca1..cbac69bc 100644
--- a/app/(onboarding)/services/ed/credentials.tsx
+++ b/app/(onboarding)/services/ed/credentials.tsx
@@ -34,6 +34,7 @@ import Typography from "@/ui/components/Typography";
import uuid from "@/utils/uuid/uuid";
import { ScrollView } from "react-native-gesture-handler";
import LoginView from "../../components/LoginView";
+import { useHeaderHeight } from "@react-navigation/elements";
const ANIMATION_DURATION = 170;
export const PlatformPressable = Platform.OS === 'android' ? Pressable : AnimatedPressable;
@@ -143,11 +144,11 @@ export default function EDLoginWithCredentials() {
}
}
- const loginED = async () => {
- if (!username.trim() || !password.trim()) { return; }
+ const loginED = async (submittedUsername = username, submittedPassword = password) => {
+ if (!submittedUsername.trim() || !submittedPassword.trim()) { return; }
setIsLoggingIn(true);
Keyboard.dismiss();
- await handleLogin(username, password);
+ await handleLogin(submittedUsername, submittedPassword);
setIsLoggingIn(false);
};
@@ -207,23 +208,32 @@ export default function EDLoginWithCredentials() {
);
}
+ const headerHeight = useHeaderHeight();
+ const finalHeaderHeight = Platform.select({
+ android: headerHeight,
+ default: insets.top
+ });
+
return (
-
- {
- if (!isLoggingIn && values.username && values.password) {
- setUsername(values.username);
- setPassword(values.password);
- loginED();
- }
- }}
- />
-
+
+ {
+ if (!isLoggingIn && values.username && values.password) {
+ setUsername(values.username);
+ setPassword(values.password);
+ loginED(values.username, values.password);
+ }
+ }}
+ />
+
({
...screenOptions,
headerShown: true,
- headerBackVisible: true,
+ ...AndroidHeaderProps,
headerTransparent: true,
headerBackButtonDisplayMode: "minimal",
headerLargeTitle: false,
diff --git a/app/(onboarding)/services/lannion/credentials.tsx b/app/(onboarding)/services/lannion/credentials.tsx
index f5d1cabb..3f4998e1 100644
--- a/app/(onboarding)/services/lannion/credentials.tsx
+++ b/app/(onboarding)/services/lannion/credentials.tsx
@@ -27,6 +27,7 @@ import Typography from "@/ui/components/Typography";
import uuid from "@/utils/uuid/uuid";
import LoginView from "../../components/LoginView";
+import { useHeaderHeight } from "@react-navigation/elements";
const ANIMATION_DURATION = 170;
@@ -154,9 +155,16 @@ export default function LannionCredentials() {
}
}
+ const headerHeight = useHeaderHeight();
+ const finalHeaderHeight = Platform.select({
+ android: headerHeight,
+ default: insets.top
+ });
+
+
if (Platform.OS === 'android') {
return (
-
+
{t("ONBOARDING_LANNION_ANDROID_TITLE")}
@@ -174,7 +182,10 @@ export default function LannionCredentials() {
return (
-
+
({
...screenOptions,
headerShown: true,
- headerBackVisible: true,
+ ...AndroidHeaderProps,
headerTransparent: true,
headerBackButtonDisplayMode: "minimal",
headerLargeTitle: false,
diff --git a/app/(onboarding)/services/multi/credentials.tsx b/app/(onboarding)/services/multi/credentials.tsx
index 53449b75..6c97e9ce 100644
--- a/app/(onboarding)/services/multi/credentials.tsx
+++ b/app/(onboarding)/services/multi/credentials.tsx
@@ -7,6 +7,7 @@ import { useTranslation } from "react-i18next";
import {
Keyboard,
KeyboardAvoidingView,
+ Platform,
ScrollView,
View,
} from "react-native";
@@ -26,6 +27,7 @@ import Stack from "@/ui/components/Stack";
import Typography from "@/ui/components/Typography";
import uuid from "@/utils/uuid/uuid";
import LoginView from "../../components/LoginView";
+import { useHeaderHeight } from "@react-navigation/elements";
const ANIMATION_DURATION = 170;
@@ -125,7 +127,7 @@ export default function MultiLoginWithCredentials() {
alert.showAlert({
title: t("Alert_Auth_Error"),
description: t("Alert_Auth_Bad_Creds"),
- icon: "TriangleAlert",
+ icon: "AlertTriangle",
color: "#D60046",
withoutNavbar: true
});
@@ -134,9 +136,18 @@ export default function MultiLoginWithCredentials() {
}
}
+ const headerHeight = useHeaderHeight();
+ const finalHeaderHeight = Platform.select({
+ android: headerHeight,
+ default: insets.top
+ });
+
return (
-
+
({
...screenOptions,
headerShown: true,
- headerBackVisible: true,
+ ...AndroidHeaderProps,
headerTransparent: true,
headerBackButtonDisplayMode: "minimal",
headerLargeTitle: false,
@@ -33,7 +34,7 @@ export default function OnboardingLayout() {
/>
{
navigation.setOptions({ headerShown: false });
}, []);
+ useEffect(() => {
+ if (browserVisible) {
+ setHasLoadingBeenTooLong(false);
+ return;
+ }
+
+ const timeout = setTimeout(() => {
+ setHasLoadingBeenTooLong(true);
+ }, 15000);
+
+ return () => clearTimeout(timeout);
+ }, [browserVisible]);
+
const webViewRef: RefObject | null> = createRef();
// Login logic
@@ -50,6 +67,7 @@ export default function PronoteENTLogin() {
const [doubleAuthError, setDoubleAuthError] = useState(null);
const [doubleAuthSession, setDoubleAuthSession] = useState(null);
const [deviceId, setDeviceId] = useState("");
+ const [hasShownConnectionErrorAlert, setHasShownConnectionErrorAlert] = useState(false);
const PRONOTE_COOKIE_EXPIRED = new Date(0).toUTCString();
const PRONOTE_COOKIE_VALIDATION_EXPIRES = new Date(
@@ -106,12 +124,68 @@ export default function PronoteENTLogin() {
})();
`.trim();
- const onWebviewMessage = async ({ nativeEvent }: { nativeEvent: WebViewMessage }) => {
- if (received) { return; }
+ const INJECT_PRONOTE_CONNECTION_ERROR_WATCHER = `
+ (function () {
+ if (window.__pronoteConnImpossibleWatcherInstalled) return;
+ window.__pronoteConnImpossibleWatcherInstalled = true;
+
+ function hasConnectionError() {
+ const nodes = document.querySelectorAll('div');
+ for (let i = 0; i < nodes.length; i += 1) {
+ const node = nodes[i];
+ const raw = node && node.textContent ? node.textContent : "";
+ const text = raw
+ .normalize("NFD")
+ .replace(/[\\u0300-\\u036f]/g, "")
+ .toLowerCase()
+ .trim();
+
+ if (!text) continue;
+ if (text.includes("connexion impossible") || text.includes("erreur")) {
+ return true;
+ }
+ }
+
+ return false;
+ }
- const message = JSON.parse(nativeEvent.data);
+ function notifyIfNeeded() {
+ if (window.__pronoteConnImpossibleSent) return;
+ if (!hasConnectionError()) return;
+ window.__pronoteConnImpossibleSent = true;
+ window.ReactNativeWebView.postMessage(JSON.stringify({
+ type: 'pronote.connectionError'
+ }));
+ }
+
+ notifyIfNeeded();
+ setInterval(notifyIfNeeded, 1000);
+
+ const observer = new MutationObserver(notifyIfNeeded);
+ observer.observe(document.documentElement || document.body, { childList: true, subtree: true, characterData: true });
+ })();
+ `.trim();
+
+ const onWebviewMessage = async ({ nativeEvent }: { nativeEvent: WebViewMessage }) => {
+ let message: { type?: string; data?: any };
+ try {
+ message = JSON.parse(nativeEvent.data);
+ } catch {
+ return;
+ }
console.log("Message received from WebView:", message);
+ if (message.type === "pronote.connectionError") {
+ setBrowserVisible(true);
+ if (!hasShownConnectionErrorAlert) {
+ setHasShownConnectionErrorAlert(true);
+ Alert.alert("Connexion impossible", "La connexion à Pronote est impossible. Cele vient probablement de votre établissement ou d'une erreur de configuration.");
+ }
+ return;
+ }
+
+ if (received) { return; }
+
if (message.type === "pronote.loginState") {
console.log("Login state message received:", message.data);
@@ -206,6 +280,7 @@ export default function PronoteENTLogin() {
setChallengeModalVisible(true)
} else {
console.error("Error during login:", error);
+ Alert.alert("Erreur", "Une erreur est survenue lors de la connexion à Pronote. Veuillez réessayer.");
throw error;
}
}
@@ -216,9 +291,7 @@ export default function PronoteENTLogin() {
const { url } = e.nativeEvent;
console.log("WebView finished loading URL:", url);
- if(url.includes("/pronote/mobile.eleve.html")) {
- setBrowserVisible(false);
- } else if (url === infoMobileURL) {
+ if (url === infoMobileURL) {
setBrowserVisible(false);
} else {
setBrowserVisible(true);
@@ -228,6 +301,12 @@ export default function PronoteENTLogin() {
INJECT_PRONOTE_INITIAL_LOGIN_HOOK,
);
+ if (url.startsWith(baseURL)) {
+ webViewRef.current?.injectJavaScript(
+ INJECT_PRONOTE_CONNECTION_ERROR_WATCHER,
+ );
+ }
+
if (url === infoMobileURL) {
console.log("Injecting JSON script for InfoMobileURL");
webViewRef.current?.injectJavaScript(INJECT_PRONOTE_JSON);
@@ -244,7 +323,7 @@ export default function PronoteENTLogin() {
return (
- {!browserVisible &&
+ {!browserVisible && !loadingHidden &&
{t("ONBOARDING_LOGIN_TO")} {school && school.name ? school.name : t("ONBOARDING_YOUR_SCHOOL")}
{t("ONBOARDING_SCHOOLS_SEARCHING_HINT")}
+
+ {hasLoadingBeenTooLong && (
+
}
diff --git a/app/(onboarding)/services/pronote/locate.tsx b/app/(onboarding)/services/pronote/locate.tsx
index 84e5e36c..8e3a178b 100644
--- a/app/(onboarding)/services/pronote/locate.tsx
+++ b/app/(onboarding)/services/pronote/locate.tsx
@@ -3,7 +3,7 @@ import { useHeaderHeight } from "@react-navigation/elements";
import { useNavigation } from "expo-router";
import React, { memo, useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
-import { KeyboardAvoidingView } from "react-native";
+import { KeyboardAvoidingView, Platform } from "react-native";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import ActivityIndicator from "@/ui/components/ActivityIndicator";
@@ -16,6 +16,13 @@ import List from "@/ui/new/List";
import Typography from "@/ui/new/Typography";
import { GeographicSearchCities } from "@/utils/native/georeverse";
+const convertPostalCode
+= (postalCode: string) => {
+ if (postalCode.length < 5) {
+ return "0" + postalCode;
+ }
+ return postalCode;
+}
export interface School {
name: string,
@@ -112,7 +119,7 @@ export default function PronoteLoginMethod() {
}
return (
-
+
}
contentContainerStyle={{
@@ -157,7 +164,7 @@ export default function PronoteLoginMethod() {
- {city.postalCode}
+ {convertPostalCode(city.postalCode.toString())}
diff --git a/app/(onboarding)/services/pronote/select.tsx b/app/(onboarding)/services/pronote/select.tsx
index 1733fd63..9d9bbe29 100644
--- a/app/(onboarding)/services/pronote/select.tsx
+++ b/app/(onboarding)/services/pronote/select.tsx
@@ -4,7 +4,7 @@ import { useNavigation } from "expo-router";
import { geolocation } from "pawnote";
import React, { memo, useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
-import { Image, KeyboardAvoidingView } from "react-native";
+import { Image, KeyboardAvoidingView, Platform } from "react-native";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import ActivityIndicator from "@/ui/components/ActivityIndicator";
@@ -85,7 +85,7 @@ export default function PronoteLoginSelectEtab() {
}
return (
-
+
}
diff --git a/app/(onboarding)/services/skolengo/_layout.tsx b/app/(onboarding)/services/skolengo/_layout.tsx
index 7ebdc27b..38d599ac 100644
--- a/app/(onboarding)/services/skolengo/_layout.tsx
+++ b/app/(onboarding)/services/skolengo/_layout.tsx
@@ -1,15 +1,17 @@
import React from 'react';
import { useTranslation } from "react-i18next";
-import { Stack } from '@/utils/native/AnimatedNavigator';
+import { Stack } from 'expo-router';
import { screenOptions } from "@/utils/theme/ScreenOptions";
+import { Platform } from 'react-native';
+import { AndroidHeaderProps } from '@/components/AndroidHeaderBackground';
export default function OnboardingLayout() {
const { t } = useTranslation();
const newScreenOptions = React.useMemo(() => ({
...screenOptions,
headerShown: true,
- headerBackVisible: true,
+ ...AndroidHeaderProps,
headerTransparent: true,
headerBackButtonDisplayMode: "minimal",
headerLargeTitle: false,
diff --git a/app/(onboarding)/services/skolengo/locate.tsx b/app/(onboarding)/services/skolengo/locate.tsx
index b88c53e6..ba60315e 100644
--- a/app/(onboarding)/services/skolengo/locate.tsx
+++ b/app/(onboarding)/services/skolengo/locate.tsx
@@ -3,7 +3,7 @@ import { useHeaderHeight } from "@react-navigation/elements";
import { router, useNavigation } from "expo-router";
import React, { memo, useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
-import { KeyboardAvoidingView } from "react-native";
+import { KeyboardAvoidingView, Platform } from "react-native";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import { SearchSchools } from "skolengojs";
@@ -113,7 +113,7 @@ export default function PronoteLoginMethod() {
}
return (
-
+
}
contentContainerStyle={{
diff --git a/app/(onboarding)/utils/fetchSchools.ts b/app/(onboarding)/utils/fetchSchools.ts
index a6ef09c3..0db29d40 100644
--- a/app/(onboarding)/utils/fetchSchools.ts
+++ b/app/(onboarding)/utils/fetchSchools.ts
@@ -23,7 +23,7 @@ export async function fetchSchools(service: Services, alert: ReturnType {
+ WebBrowser.openBrowserAsync("https://docs.papillon.bzh/terms", {
+ presentationStyle: WebBrowser.WebBrowserPresentationStyle.PAGE_SHEET
+ });
+ }
+
+ const openDevMenu = () => {
+ router.push("/devmode");
+ }
+
const player = useVideoPlayer({
assetId: require('@/assets/video/welcome.mp4'),
}, player => {
@@ -56,6 +66,9 @@ export default function Welcome() {
backgroundColor: "black"
}}
>
+ {isFocused &&
+
+ }
{isFocused &&
-
+ { openLegalWebPage() }} onLongPress={() => { openDevMenu() }}>
{t("ONBOARDING_WELCOME_LEGAL")}
diff --git a/app/(settings)/_layout.tsx b/app/(settings)/_layout.tsx
index cd0011e6..fdc4a122 100644
--- a/app/(settings)/_layout.tsx
+++ b/app/(settings)/_layout.tsx
@@ -5,6 +5,7 @@ import { Platform, StatusBar } from "react-native";
import { runsIOS26 } from "@/ui/utils/IsLiquidGlass";
import { screenOptions } from "@/utils/theme/ScreenOptions";
import { t } from "i18next";
+import AndroidHeaderBackground from "@/components/AndroidHeaderBackground";
export default function Layout() {
@@ -14,16 +15,19 @@ export default function Layout() {
headerLargeTitle: false,
headerTransparent: runsIOS26,
headerShadowVisible: false,
+ headerBackground: AndroidHeaderBackground
}), []);
return (
<>
-
+ {Platform.OS === "ios" && }
@@ -48,6 +52,7 @@ export default function Layout() {
headerBackButtonDisplayMode: "minimal",
headerTransparent: true,
headerLargeTitle: false,
+ headerBackground: null
}}
/>
@@ -133,6 +138,15 @@ export default function Layout() {
headerTitle: t("Settings_Transport_Title"),
}}
/>
+
>
);
diff --git a/app/(settings)/about.tsx b/app/(settings)/about.tsx
index 5fe5dfcb..35d8af9f 100644
--- a/app/(settings)/about.tsx
+++ b/app/(settings)/about.tsx
@@ -4,65 +4,107 @@ import { useRouter } from "expo-router";
import { Github, Languages, Users } from "lucide-react-native";
import React, { useState } from "react";
import { useTranslation } from "react-i18next";
-import { Alert, Linking, ScrollView } from "react-native";
+import { Alert, Linking } from "react-native";
import SettingsHeader from "@/components/SettingsHeader";
-import packageJson from "@/package.json"
+import packageJson from "@/package.json";
import { useSettingsStore } from "@/stores/settings";
import Avatar from "@/ui/components/Avatar";
import Icon from "@/ui/components/Icon";
-import Item, { Leading, Trailing } from "@/ui/components/Item";
-import List from "@/ui/components/List";
-import Typography from "@/ui/components/Typography";
+import List from "@/ui/new/List";
+import Typography from "@/ui/new/Typography";
import { getInitials } from "@/utils/chats/initials";
+import { useSafeAreaInsets } from "react-native-safe-area-context";
export const Team = [
{
title: "Vince Linise",
description: "Président",
login: "ecnivtwelve",
- leading: ,
- onPress: () => Linking.openURL("https://www.linkedin.com/in/vincelinise/")
+ leading: (
+
+ ),
+ onPress: () => Linking.openURL("https://www.linkedin.com/in/vincelinise/"),
},
{
title: "Lucas Lavajo",
description: "Vice-Président",
login: "tryon-dev",
- leading: ,
- onPress: () => Linking.openURL("https://www.linkedin.com/in/lucas-lavajo/")
+ leading: (
+
+ ),
+ onPress: () => Linking.openURL("https://www.linkedin.com/in/lucas-lavajo/"),
},
{
title: "Raphaël Schröder",
description: "Développeur back-end",
login: "raphckrman",
- leading: ,
- onPress: () => Linking.openURL("https://www.linkedin.com/in/raphckrman/")
+ leading: (
+
+ ),
+ onPress: () => Linking.openURL("https://www.linkedin.com/in/raphckrman/"),
},
{
title: "Tom Hélière",
login: "tom-things",
description: "Designer UI/UX",
- leading: ,
- onPress: () => Linking.openURL("https://www.linkedin.com/in/tom-heliere/")
+ leading: (
+
+ ),
+ onPress: () => Linking.openURL("https://www.linkedin.com/in/tom-heliere/"),
},
{
title: "Rémy Godet",
description: "Développeur",
login: "godetremy",
- leading: ,
- onPress: () => Linking.openURL("https://www.linkedin.com/in/godetremy/")
+ leading: (
+
+ ),
+ onPress: () => Linking.openURL("https://www.linkedin.com/in/godetremy/"),
},
{
title: "Mael Duret",
description: "Développeur",
login: "ryzenixx",
- leading: ,
- onPress: () => Linking.openURL("https://www.linkedin.com/in/mael-duret/")
- }
-]
+ leading: (
+
+ ),
+ onPress: () => Linking.openURL("https://www.linkedin.com/in/mael-duret/"),
+ },
+];
export default function SettingsAbout() {
- const theme = useTheme()
+ const theme = useTheme();
const router = useRouter();
const { t } = useTranslation();
@@ -74,19 +116,21 @@ export default function SettingsAbout() {
title: t("Settings_Donator"),
description: t("Settings_Donator_Description"),
leading: ,
- onPress: () => Linking.openURL('https://ko-fi.com/thepapillonapp/leaderboard'),
+ onPress: () =>
+ Linking.openURL("https://ko-fi.com/thepapillonapp/leaderboard"),
},
{
title: t("Settings_About_Discord"),
description: t("Settings_About_Discord_Description"),
leading: ,
- onPress: () => Linking.openURL('https://go.papillon.bzh/discord'),
+ onPress: () => Linking.openURL("https://go.papillon.bzh/discord"),
},
{
title: t("Settings_About_Issue"),
description: t("Settings_About_Issue_Description"),
leading: ,
- onPress: () => Linking.openURL('https://github.com/PapillonApp/Papillon/issues'),
+ onPress: () =>
+ Linking.openURL("https://github.com/PapillonApp/Papillon/issues"),
},
];
@@ -95,13 +139,13 @@ export default function SettingsAbout() {
title: t("Settings_About_Crowdin"),
description: t("Settings_About_Crowdin_Description"),
leading: ,
- onPress: () => Linking.openURL('https://crowdin.com/project/papillonapp'),
+ onPress: () => Linking.openURL("https://crowdin.com/project/papillonapp"),
},
{
title: t("Settings_About_Github"),
description: t("Settings_About_Github_Description"),
leading: ,
- onPress: () => Linking.openURL('https://github.com/PapillonApp/Papillon'),
+ onPress: () => Linking.openURL("https://github.com/PapillonApp/Papillon"),
},
{
title: t("Settings_About_Contributors"),
@@ -140,134 +184,110 @@ export default function SettingsAbout() {
title: t("Settings_About_Dependency_Version"),
description: `Expo: ${packageJson.dependencies?.expo || "N/A"} | RN: ${packageJson.dependencies?.["react-native"] || "N/A"}`,
leading: ,
- }
+ },
];
+ const insets = useSafeAreaInsets();
+
return (
-
-
+
+
+
-
+
{Team.map((item, index) => (
- -
-
-
- {item.leading}
-
-
+
+
+ {item.leading}
+
-
- {item.title}
-
+ {item.title}
-
+
{item.description}
-
+
-
-
+
+
))}
-
+
-
+
{CommunityLinks.map((item, index) => (
- -
-
-
- {item.leading}
-
-
+
+
+ {item.leading}
+
-
- {item.title}
-
+ {item.title}
-
+
{item.description}
-
+
-
-
+
+
))}
-
+
-
+
{DeveloperLinks.map((item, index) => (
- -
-
-
- {item.leading}
-
-
+
+
+ {item.leading}
+
-
- {item.title}
-
+ {item.title}
-
+
{item.description}
-
+
-
-
+
+
))}
-
+
-
+
{Infos.map((item, index) => (
- -
-
-
- {item.leading}
-
-
+
+
+ {item.leading}
+
-
- {item.title}
-
+ {item.title}
-
+
{item.description}
-
+
))}
-
-
-
+
+
);
}
diff --git a/app/(settings)/accounts.tsx b/app/(settings)/accounts.tsx
index 15ae7ad5..7ac80754 100644
--- a/app/(settings)/accounts.tsx
+++ b/app/(settings)/accounts.tsx
@@ -1,29 +1,71 @@
import { Papicons } from "@getpapillon/papicons";
-import { useTheme } from "@react-navigation/native";
+import { MenuView, NativeActionEvent } from "@react-native-menu/menu";
import { router } from "expo-router";
import React from "react";
-import { Image, ScrollView, TouchableOpacity } from "react-native";
-import ReanimatedSwipeable from 'react-native-gesture-handler/ReanimatedSwipeable';
+import { Alert, Image, ScrollView } from "react-native";
+import { removeBalanceFromDatabase } from "@/database/useBalance";
+import { getManager } from "@/services/shared";
import { useAccountStore } from "@/stores/account";
import Avatar from "@/ui/components/Avatar";
import Icon from "@/ui/components/Icon";
-import Item, { Leading } from "@/ui/components/Item";
-import List from "@/ui/components/List";
import Stack from "@/ui/components/Stack";
-import Typography from "@/ui/components/Typography";
+import List from "@/ui/new/List";
+import Typography from "@/ui/new/Typography";
import { getInitials } from "@/utils/chats/initials";
-import { getServiceLogo, getServiceName } from "@/utils/services/helper";
import { formatSchoolName } from "@/utils/format/formatSchoolName";
+import { getServiceLogo, getServiceName } from "@/utils/services/helper";
+import ActionMenu from "@/ui/components/ActionMenu";
export default function AccountsView() {
- const accounts = useAccountStore((state) => state.accounts);
- const lastUsedAccount = useAccountStore((state) => state.lastUsedAccount);
- const account = accounts.find((a) => a.id === lastUsedAccount);
- const theme = useTheme();
+ const accounts = useAccountStore(state => state.accounts);
+ const lastUsedAccount = useAccountStore(state => state.lastUsedAccount);
+ const account = accounts.find(a => a.id === lastUsedAccount);
+ const store = useAccountStore.getState();
const services = account?.services;
+ const askDeleteAccount = (targetAccount: (typeof accounts)[number]) => {
+ Alert.alert(
+ "Supprimer le compte",
+ `${targetAccount.firstName} ${targetAccount.lastName}`,
+ [
+ {
+ text: "Annuler",
+ style: "cancel",
+ },
+ {
+ text: "Supprimer",
+ style: "destructive",
+ onPress: () => {
+ store.removeAccount(targetAccount);
+ },
+ },
+ ]
+ );
+ };
+
+ const askDeleteService = (serviceId: string, serviceName: string) => {
+ Alert.alert(serviceName, "Supprimer ce service ?", [
+ {
+ text: "Annuler",
+ style: "cancel",
+ },
+ {
+ text: "Supprimer",
+ style: "destructive",
+ onPress: () => {
+ store.removeServiceFromAccount(serviceId);
+ removeBalanceFromDatabase(serviceId);
+ const manager = getManager();
+ if (manager) {
+ manager.removeService(serviceId);
+ }
+ },
+ },
+ ]);
+ };
+
return (
-
+
- Profils utilisateur
+
+ Profils utilisateur
+
-
- {accounts.map((account, index) => (
- (
-
-
-
-
-
-
-
- )}
- >
- -
-
-
-
- {account.firstName} {account.lastName}
- {account.className ? account.className + " " : ""}{formatSchoolName(account.schoolName ?? "")}
-
-
+
+ {accounts.map(account => (
+
+
+
+
+
+ {account.firstName} {account.lastName}
+
+
+ {account.className ? account.className + " " : ""}
+ {formatSchoolName(account.schoolName ?? "")}
+
+
+ {
+ if (event.nativeEvent.event === "delete") {
+ askDeleteAccount(account);
+ }
+ }}
+ >
+
+
+
+
+
+
))}
- - router.replace({
- pathname: "/(onboarding)/ageSelection",
- params: { action: "addService" }
- })}
+
+ router.push({
+ pathname: "/(onboarding)/ageSelection",
+ params: { action: "addService" },
+ })
+ }
>
-
-
-
-
+
+
+
+
+
+
Nouveau compte
-
+
-
+
- Services et cartes
+
+ Services et cartes
+
-
- {services?.map((service, index) => (
- (
-
-
-
-
-
-
-
- )}
- >
- -
-
-
-
- {getServiceName(service.serviceId)}
- Connecté le {new Date(service.createdAt).toLocaleDateString(undefined, {
+
+ {services?.map(service => (
+
+
+
+
+
+ {getServiceName(service.serviceId)}
+
+
+ Connecté le{" "}
+ {new Date(service.createdAt).toLocaleDateString(undefined, {
day: "2-digit",
month: "short",
year: "numeric",
- })}
-
-
+ })}
+
+
+ {
+ if (event.nativeEvent.event === "delete") {
+ askDeleteService(
+ service.id,
+ getServiceName(service.serviceId)
+ );
+ }
+ }}
+ >
+
+
+
+
+
+
))}
- - router.navigate({
- pathname: "/(onboarding)/restaurants/method",
- })}
+
+ router.navigate({
+ pathname: "/(onboarding)/restaurants/method",
+ })
+ }
>
-
-
-
-
+
+
+
+
+
+
Ajouter un nouveau service
-
+
-
+
);
-}
\ No newline at end of file
+}
diff --git a/app/(settings)/contributors.tsx b/app/(settings)/contributors.tsx
index f5d1964b..fb95d8b3 100644
--- a/app/(settings)/contributors.tsx
+++ b/app/(settings)/contributors.tsx
@@ -2,6 +2,7 @@ import { Papicons } from "@getpapillon/papicons";
import React, { useEffect, useMemo, useState } from "react";
import { Linking } from "react-native";
+import ActivityIndicator from "@/ui/components/ActivityIndicator";
import Avatar from "@/ui/components/Avatar";
import Icon from "@/ui/components/Icon";
import List from "@/ui/new/List";
@@ -20,29 +21,52 @@ const TEAM_LOGINS = [
export default function SettingsContributors() {
const [contributors, setContributors] = useState([]);
+ const [isLoading, setIsLoading] = useState(true);
useEffect(() => {
- getContributors().then((allContributors) => {
- setContributors(allContributors.filter((contributor) => !TEAM_LOGINS.includes(contributor.login)));
- });
+ getContributors()
+ .then(allContributors => {
+ setContributors(
+ allContributors.filter(
+ contributor => !TEAM_LOGINS.includes(contributor.login)
+ )
+ );
+ })
+ .finally(() => {
+ setIsLoading(false);
+ });
}, []);
- const contributorItems = useMemo(() => contributors.map((item) => (
- Linking.openURL(item.html_url)}>
-
-
-
- {item.login}
-
- {item.contributions} {item.contributions > 1 ? "contributions" : "contribution"}
-
-
-
-
-
-
-
- )), [contributors]);
+ const contributorItems = useMemo(
+ () =>
+ contributors.map(item => (
+ Linking.openURL(item.html_url)}
+ >
+
+
+
+ {item.login}
+
+ {item.contributions}{" "}
+ {item.contributions > 1 ? "contributions" : "contribution"}
+
+
+
+
+
+
+
+ )),
+ [contributors]
+ );
return (
- {contributorItems}
+ {isLoading && (
+
+
+
+ Chargement des contributeurs...
+
+
+ )}
+ {!isLoading && contributorItems}
);
}
diff --git a/app/(settings)/edit_subject.tsx b/app/(settings)/edit_subject.tsx
index cb3d41ea..a907581d 100644
--- a/app/(settings)/edit_subject.tsx
+++ b/app/(settings)/edit_subject.tsx
@@ -4,13 +4,263 @@ import { Papicons } from "@getpapillon/papicons";
import { useTheme } from "@react-navigation/native";
import Typography from "@/ui/components/Typography";
import { CompactGrade } from "@/ui/components/CompactGrade";
-import { Alert, Dimensions, ScrollView, View, Platform } from "react-native";
+import {
+ Dimensions,
+ ScrollView,
+ View,
+ Platform,
+ Modal,
+} from "react-native";
import OnboardingInput from "@/components/onboarding/OnboardingInput";
import { Colors } from "@/utils/subjects/colors";
-import { useState } from "react";
+import { memo, ReactNode, useCallback, useMemo, useRef, useState } from "react";
import { router, useLocalSearchParams } from "expo-router";
import { useAccountStore } from "@/stores/account";
import { useSafeAreaInsets } from "react-native-safe-area-context";
+import TabHeaderTitle from "@/ui/components/TabHeaderTitle";
+import ChipButton from "@/ui/components/ChipButton";
+import TabHeader from "@/ui/components/TabHeader";
+import { useTranslation } from "react-i18next";
+import Button from "@/ui/new/Button";
+import { UnicodeEmojis } from "@/constants/UnicodeEmojis";
+import Animated, { useAnimatedStyle, useSharedValue, withSpring } from "react-native-reanimated";
+import { LinearGradient } from "expo-linear-gradient";
+import { PapillonZoomIn, PapillonZoomOut } from "@/ui/utils/Transition";
+import { ListTouchable } from "@/ui/new/List";
+import { LegendList, LegendListRef } from "@legendapp/list";
+import { FlashList } from "@shopify/flash-list";
+
+const EmojiItem = memo(({ item, onPress, isSelected }: {item: string, onPress: (emoji: string) => void, isSelected: boolean}) => {
+ const theme = useTheme();
+ return (
+ onPress(item)}
+ style={{
+ flex: 1,
+ alignItems: "center",
+ justifyContent: "center",
+ }}
+ >
+
+
+ {item}
+
+
+
+ );
+});
+
+function EmojiPicker({
+ onCancel,
+ onSelect,
+}: {
+ onCancel: () => void;
+ onSelect: (emoji: string) => void;
+}): ReactNode {
+ const theme = useTheme();
+ const { t } = useTranslation();
+ const insets = useSafeAreaInsets();
+
+ const flatListRef = useRef(null);
+ const scale = useSharedValue(1);
+
+ const emojis = useMemo(() => {
+ return Object.keys(UnicodeEmojis)
+ .map(key => {
+ const value = UnicodeEmojis[key];
+ const uniqueCodes = [...new Set(value.emojis)];
+
+ return uniqueCodes.length > 0
+ ? {
+ title: value.icon,
+ data: uniqueCodes,
+ }
+ : null;
+ })
+ .filter(v => v !== null);
+ }, []);
+
+ const flatEmojis = useMemo(() => {
+ return emojis.flatMap(section =>
+ section.data.map(item => String.fromCodePoint(item))
+ );
+ }, [emojis]);
+
+ const handleSelect = useCallback(item => {
+ setSelectedEmoji(item);
+ }, []);
+
+ const [headerHeight, setHeaderHeight] = useState(0);
+ const [selectedEmoji, setSelectedEmoji] = useState("😀");
+
+ const emojiContainerStyle = {
+ height: 180,
+ alignItems: "center",
+ justifyContent: "center",
+ };
+
+ const [selectedTab, setSelectedTab] = useState(emojis[0].title);
+
+ const selectTab = (tab) => {
+ setSelectedTab(tab);
+ const section = emojis.find(s => s.title === tab);
+ if (section) {
+ const index = emojis
+ .slice(0, emojis.indexOf(section))
+ .reduce((acc, curr) => acc + curr.data.length, 0);
+ flatListRef.current?.scrollToOffset({ offset: index * 56, animated: false });
+ }
+ }
+
+ return (
+
+
+ }
+ trailing={}
+ />
+
+
+ {selectedEmoji}
+
+
+
+ {emojis.map((value, index) => (
+ selectTab(value.title)}
+ >
+ {
+ selectTab(value.title);
+ }}
+ >
+
+
+
+ ))}
+
+ item + index}
+ showsVerticalScrollIndicator={false}
+ contentContainerStyle={{
+ padding: 5,
+ paddingBottom: 80,
+ }}
+ renderItem={({ item }) => (
+
+ )}
+ />
+
+
+
+
+ );
+}
export default function EditSubject() {
const { colors } = useTheme();
@@ -21,6 +271,7 @@ export default function EditSubject() {
const [selectedName, setSelectedName] = useState(String(params.name));
const [selectedColor, setSelectedColor] = useState(Colors.find(c => c === String(params.color)) || Colors[0]);
const [selectedEmoji, setSelectedEmoji] = useState(String(params.emoji));
+ const [showEmojiPicker, setShowEmojiPicker] = useState(false);
const AvailableEmojis = [
"📖",
@@ -38,8 +289,8 @@ export default function EditSubject() {
-
+
Modifier la matière
{
- const store = useAccountStore.getState()
+ const store = useAccountStore.getState();
- store.setSubjectName(String(params.id), selectedName)
- store.setSubjectEmoji(String(params.id), selectedEmoji)
- store.setSubjectColor(String(params.id), selectedColor)
+ store.setSubjectName(String(params.id), selectedName);
+ store.setSubjectEmoji(String(params.id), selectedEmoji);
+ store.setSubjectColor(String(params.id), selectedColor);
router.back();
}}
>
-
+
-
+
-
-
+
-
+
Nom de la matière
@@ -122,23 +360,26 @@ export default function EditSubject() {
inputProps={{}}
/>
-
-
+
Couleur
- {Colors.map((color) => (
+ {Colors.map(color => (
setSelectedColor(color)}
>
{selectedColor === color && (
-
+
)}
))}
-
-
+
Emoji
{!AvailableEmojis.includes(selectedEmoji) && (
@@ -207,14 +449,15 @@ export default function EditSubject() {
)}
- {AvailableEmojis.map((emoji) => (
+ {AvailableEmojis.map(emoji => (
{
if (emoji === "custom") {
- Alert.prompt("Emoji personnalisé", "Entre un emoji personnalisé pour cette matière (ex: 🧪)", (text) => {
- var regexp = /((\ud83c[\udde6-\uddff]){2}|([#*0-9]\u20e3)|(\u00a9|\u00ae|[\u2000-\u3300]|[\ud83c-\ud83e][\ud000-\udfff])((\ud83c[\udffb-\udfff])?(\ud83e[\uddb0-\uddb3])?(\ufe0f?\u200d([\u2000-\u3300]|[\ud83c-\ud83e][\ud000-\udfff])\ufe0f?)?)*)/g;
- const emojiMatch = text.match(regexp);
- if (emojiMatch) {
- emoji = emojiMatch[emojiMatch.length - 1];
- setSelectedEmoji(emoji)
- }
- });
- }
- else {
- setSelectedEmoji(emoji)
+ setShowEmojiPicker(true);
+ } else {
+ setSelectedEmoji(emoji);
}
}}
>
{emoji === "custom" ? (
-
- ) : (
-
- {emoji}
-
- )}
+
+ ) : (
+
+ {emoji}
+
+ )}
))}
+ setShowEmojiPicker(false)}
+ >
+ setShowEmojiPicker(false)}
+ onSelect={emoji => {
+ setSelectedEmoji(emoji);
+ setShowEmojiPicker(false);
+ }}
+ />
+
);
-};
\ No newline at end of file
+};
diff --git a/app/(settings)/features.tsx b/app/(settings)/features.tsx
new file mode 100644
index 00000000..c3770e32
--- /dev/null
+++ b/app/(settings)/features.tsx
@@ -0,0 +1,141 @@
+import { Papicons } from "@getpapillon/papicons";
+import { Platform, View } from "react-native";
+
+import { useSettingsStore } from "@/stores/settings";
+import List from "@/ui/new/List";
+import Typography from "@/ui/new/Typography";
+import NativeSwitch from "@/ui/native/NativeSwitch";
+import { useTranslation } from "react-i18next";
+import Icon from "@/ui/components/Icon";
+import NativePicker from "@/ui/native/NativePicker";
+import { useMemo } from "react";
+import { getGradeDisplayScale } from "@/utils/grades/scale";
+import Picker from "@/ui/components/Picker";
+
+export default function SettingsFeatures() {
+ const { t } = useTranslation();
+
+ const settingsStore = useSettingsStore(state => state.personalization);
+ const mutateProperty = useSettingsStore(state => state.mutateProperty);
+
+ const iOSBottomAccessoryEnabled = settingsStore.iOSBottomAccessoryEnabled ?? true;
+ const showTabBarLabels = settingsStore.showTabBarLabels ?? true;
+ const selectedGradeScale = getGradeDisplayScale(settingsStore.gradesDisplayScale);
+
+ const gradeScaleOptions = [
+ {
+ label: "Note sur 20",
+ value: "20",
+ },
+ {
+ label: "Note sur 10",
+ value: "10",
+ },
+ {
+ label: "Note sur 5",
+ value: "5",
+ },
+ {
+ label: "Pourcentage",
+ value: "percentage",
+ },
+ ];
+
+ const selectedGradeScaleIndex = useMemo(() => {
+ return Math.max(0, gradeScaleOptions.findIndex(option => option.value === selectedGradeScale));
+ }, [selectedGradeScale]);
+
+ return (
+
+
+
+ {t("Settings_Features_TabBar")}
+
+
+ {Platform.OS === "ios" && (
+
+
+
+
+
+
+ {t("Settings_Features_BottomAccessory")}
+
+ {t("Settings_Features_BottomAccessory_Description")}
+
+
+
+ mutateProperty("personalization", {
+ ...settingsStore,
+ iOSBottomAccessoryEnabled: value,
+ })
+ }
+ />
+
+
+ )}
+
+
+
+
+
+
+ {t("Settings_Features_ShowTabBarLabels")}
+
+ {t("Settings_Features_ShowTabBarLabels_Description")}
+
+
+
+ mutateProperty("personalization", {
+ ...settingsStore,
+ showTabBarLabels: value,
+ })
+ }
+ />
+
+
+
+
+
+
+ {t("Settings_Features_Grades")}
+
+
+
+
+
+
+
+
+ {t("Global_Experimental")}
+ {t("Settings_Features_GradeScale")}
+
+ {t("Settings_Features_GradeScale_Description")}
+
+
+
+ option.label)}
+ selectedIndex={selectedGradeScaleIndex}
+ onValueChange={(index) =>
+ mutateProperty("personalization", {
+ gradesDisplayScale: gradeScaleOptions[index].value as "20" | "10" | "5" | "percentage",
+ })
+ }
+ />
+
+
+
+
+
+ );
+}
diff --git a/app/(settings)/language.tsx b/app/(settings)/language.tsx
index a2c953c6..e6278f97 100644
--- a/app/(settings)/language.tsx
+++ b/app/(settings)/language.tsx
@@ -2,13 +2,12 @@ import { Papicons } from "@getpapillon/papicons";
import { useTheme } from "@react-navigation/native";
import React from "react";
import { useTranslation } from "react-i18next";
-import { Alert, ScrollView } from "react-native";
+import { Alert, Platform } from "react-native";
import { useSettingsStore } from "@/stores/settings";
import Icon from "@/ui/components/Icon";
-import Item, { Leading, Trailing } from "@/ui/components/Item";
-import List from "@/ui/components/List";
-import Typography from "@/ui/components/Typography";
+import List from "@/ui/new/List";
+import Typography from "@/ui/new/Typography";
import { resources } from "@/utils/i18n";
const LanguagePersonalization = () => {
@@ -18,10 +17,10 @@ const LanguagePersonalization = () => {
const settingStore = useSettingsStore(state => state.personalization);
const mutateProperty = useSettingsStore(state => state.mutateProperty);
- const languages = Object.keys(resources).map((key) => ({
+ const languages = Object.keys(resources).map(key => ({
id: key,
name: resources[key].label,
- emoji: resources[key].emoji
+ emoji: resources[key].emoji,
}));
const rtlLanguages = ["ar", "he", "fa", "ur"];
@@ -29,7 +28,10 @@ const LanguagePersonalization = () => {
const setLanguage = (lang: string) => {
requestAnimationFrame(() => {
if (rtlLanguages.includes(lang)) {
- Alert.alert("Inverted layout is not supported yet", "The selected language may not be displayed correctly.");
+ Alert.alert(
+ "Inverted layout is not supported yet",
+ "The selected language may not be displayed correctly."
+ );
}
setTimeout(() => {
@@ -40,53 +42,47 @@ const LanguagePersonalization = () => {
};
return (
-
-
- {languages.map((lang) => {
- const isSelected = i18n.language === lang.id;
+ {languages.map(lang => {
+ const isSelected = i18n.language === lang.id;
+
+ return (
+ {
+ setLanguage(lang.id);
+ }}
+ >
+
+ {lang.emoji}
+
- return (
- - {
- setLanguage(lang.id);
+
-
-
- {lang.emoji}
-
-
-
-
-
- {lang.name}
-
-
- {isSelected && (
-
-
-
-
-
+ {lang.name}
+
- )}
-
- );
- })}
-
-
+ {isSelected && (
+
+
+
+
+
+ )}
+
+ );
+ })}
+
);
};
-export default LanguagePersonalization;
\ No newline at end of file
+export default LanguagePersonalization;
diff --git a/app/(settings)/magic.tsx b/app/(settings)/magic.tsx
index 23e44cc3..b71a00bd 100644
--- a/app/(settings)/magic.tsx
+++ b/app/(settings)/magic.tsx
@@ -2,15 +2,14 @@ import { Papicons } from "@getpapillon/papicons";
import { useTheme } from "@react-navigation/native";
import { t } from "i18next";
import React, { useEffect, useState } from "react";
-import { Alert, ScrollView, Text } from "react-native";
+import { Alert } from "react-native";
import SettingsHeader from "@/components/SettingsHeader";
import packageJson from "@/package.json";
import { useSettingsStore } from "@/stores/settings";
import Icon from "@/ui/components/Icon";
-import Item, { Leading, Trailing } from "@/ui/components/Item";
-import List from "@/ui/components/List";
-import Typography from "@/ui/components/Typography";
+import List from "@/ui/new/List";
+import Typography from "@/ui/new/Typography";
import { MAGIC_URL } from "@/utils/endpoints";
import { log } from "@/utils/logger/logger";
import ModelManager from "@/utils/magic/ModelManager";
@@ -21,11 +20,11 @@ function getMagicURL(): string {
}
export default function SettingsMagic() {
- const theme = useTheme()
- const { colors } = theme
+ const theme = useTheme();
+ const { colors } = theme;
- const settingsStore = useSettingsStore(state => state.personalization)
- const mutateProperty = useSettingsStore(state => state.mutateProperty)
+ const settingsStore = useSettingsStore(state => state.personalization);
+ const mutateProperty = useSettingsStore(state => state.mutateProperty);
const [modelStatus, setModelStatus] = useState(null);
const [currentPtr, setCurrentPtr] = useState(null);
@@ -61,30 +60,40 @@ export default function SettingsMagic() {
};
const showDetailedStatus = () => {
- if (!modelStatus) { return; }
-
- log("Statut détaillé du modèle:" + JSON.stringify({
- hasModel: modelStatus.hasModel,
- modelType: modelStatus.modelType,
- hasInitialized: modelStatus.hasInitialized,
- isInitializing: modelStatus.isInitializing,
- maxLen: modelStatus.maxLen,
- batchSize: modelStatus.batchSize,
- labelsCount: modelStatus.labelsCount,
- wordIndexSize: modelStatus.wordIndexSize,
- oovIndex: modelStatus.oovIndex,
- tokenizerInfo: modelStatus.tokenizerInfo
- }));
+ if (!modelStatus) {
+ return;
+ }
+
+ log(
+ "Statut détaillé du modèle:" +
+ JSON.stringify({
+ hasModel: modelStatus.hasModel,
+ modelType: modelStatus.modelType,
+ hasInitialized: modelStatus.hasInitialized,
+ isInitializing: modelStatus.isInitializing,
+ maxLen: modelStatus.maxLen,
+ batchSize: modelStatus.batchSize,
+ labelsCount: modelStatus.labelsCount,
+ wordIndexSize: modelStatus.wordIndexSize,
+ oovIndex: modelStatus.oovIndex,
+ tokenizerInfo: modelStatus.tokenizerInfo,
+ })
+ );
};
const checkForUpdates = async () => {
- if (isUpdating) { return; }
+ if (isUpdating) {
+ return;
+ }
setIsUpdating(true);
setLastUpdateCheck(new Date());
try {
- const result = await checkAndUpdateModel(packageJson.version, getMagicURL());
+ const result = await checkAndUpdateModel(
+ packageJson.version,
+ getMagicURL()
+ );
if (result.updated) {
await ModelManager.safeInit();
@@ -109,106 +118,121 @@ export default function SettingsMagic() {
};
return (
-
- {
- if (settingsStore.magicEnabled && !isSwitchOn) {
- Alert.alert(
- "Désactivation de Magic+",
- "Papillon Magic+ sera désactivé au prochain redémarrage",
- [{ text: "OK", style: "default" }]
- );
- }
-
- mutateProperty("personalization", { magicEnabled: !settingsStore.magicEnabled });
- setTimeout(refreshStatus, 100);
- }}
- switchValue={settingsStore.magicEnabled}
- showSwitch={true}
- switchColor={"#DD007D"}
- />
+
+ {
+ if (settingsStore.magicEnabled && !isSwitchOn) {
+ Alert.alert(
+ "Désactivation de Magic+",
+ "Papillon Magic+ sera désactivé au prochain redémarrage",
+ [{ text: "OK", style: "default" }]
+ );
+ }
+
+ mutateProperty("personalization", {
+ magicEnabled: !settingsStore.magicEnabled,
+ });
+ setTimeout(refreshStatus, 100);
+ }}
+ switchValue={settingsStore.magicEnabled}
+ showSwitch={true}
+ switchColor={"#DD007D"}
+ />
+
{settingsStore.magicEnabled && (
- <>
-
- -
-
-
-
-
-
-
- Statut du modèle
-
-
-
- {modelStatus?.hasModel ? "Chargé" : "Non chargé"}
-
-
-
-
- -
-
-
-
-
-
-
- Modèle actuel
+
+
+
+
+
+
+
+ Statut du modèle
+
+
+ {modelStatus?.hasModel ? "Chargé" : "Non chargé"}
-
-
- {currentPtr ? `${currentPtr.name} v${currentPtr.version}` : "Aucun"}
-
-
-
-
-
-
- -
-
-
-
-
-
-
- Vérifier les mises à jour
+
+
+
+
+
+
+
+
+
+ Modèle actuel
+
+
+ {currentPtr
+ ? `${currentPtr.name} v${currentPtr.version}`
+ : "Aucun"}
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
- Réinitialiser le modèle
-
-
-
-
-
-
-
-
- >
+
+
+
+ )}
+
+ {settingsStore.magicEnabled && (
+
+
+
+
+
+
+
+ Vérifier les mises à jour
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Réinitialiser le modèle
+
+
+
+
+
+
+
)}
- {t("Settings_MagicPlus_ExplanationLocal")}
-
+
+
+ {t("Settings_MagicPlus_ExplanationLocal")}
+
+
+
);
}
diff --git a/app/(settings)/personalization.tsx b/app/(settings)/personalization.tsx
index 7d332b8a..01341859 100644
--- a/app/(settings)/personalization.tsx
+++ b/app/(settings)/personalization.tsx
@@ -1,10 +1,8 @@
-import { Alert, Platform, ScrollView } from "react-native";
+import { Alert, Platform, ScrollView, Switch } from "react-native";
import Stack from "@/ui/components/Stack";
import { EarthIcon } from "lucide-react-native";
import React, { useEffect } from "react";
-import List from "@/ui/components/List";
-import Item, { Trailing } from "@/ui/components/Item";
-import Typography from "@/ui/components/Typography";
+import Typography from "@/ui/new/Typography";
import Icon from "@/ui/components/Icon";
import { Papicons, PapillonApp } from "@getpapillon/papicons";
import AnimatedPressable from "@/ui/components/AnimatedPressable";
@@ -14,12 +12,14 @@ import { AppColors } from "@/utils/colors";
import LinearGradient from "react-native-linear-gradient";
import adjust from "@/utils/adjustColor";
import { useAccountStore } from "@/stores/account";
-import { useSettingsStore } from "@/stores/settings";
+import { DEFAULT_MATERIAL_YOU_ENABLED, useSettingsStore } from "@/stores/settings";
import { useTranslation } from "react-i18next";
import { router } from "expo-router";
import { useHeaderHeight } from "@react-navigation/elements";
import { Dynamic } from "@/ui/components/Dynamic";
import { FadeIn, FadeOut } from "react-native-reanimated";
+import List from "@/ui/new/List";
+import NativeSwitch from "@/ui/native/NativeSwitch";
const PersonalizationSettings = () => {
@@ -29,6 +29,7 @@ const PersonalizationSettings = () => {
const store = useAccountStore.getState();
const settingsStore = useSettingsStore(state => state.personalization);
const mutateProperty = useSettingsStore(state => state.mutateProperty);
+ const useMaterialYou = settingsStore.useMaterialYou ?? DEFAULT_MATERIAL_YOU_ENABLED;
const defaultColorData = AppColors.find(color => color.colorEnum === settingsStore.colorSelected) || AppColors[0];
const [selectedColor, setSelectedColor] = React.useState(defaultColorData.mainColor);
@@ -48,76 +49,83 @@ const PersonalizationSettings = () => {
return (
<>
-
+
-
-
-
-
-
-
-
- {t("Settings_Personalization_Accent")}
-
-
- {
- setSelectedColor(color);
- setTimeout(() => {
- const colorData = AppColors.find(appColor => appColor.mainColor === color);
- if (colorData) {
- mutateProperty('personalization', {
- colorSelected: colorData.colorEnum
- });
- }
- }, 50);
- }}
- accountId={store.lastUsedAccount}
- />
-
- {t("Settings_Personalization_Accent_Description")}
-
-
- -
-
-
+
+ Choix de la couleur
+
+
+ {
+ setSelectedColor(color);
+ setTimeout(() => {
+ const colorData = AppColors.find(appColor => appColor.mainColor === color);
+ if (colorData) {
+ mutateProperty('personalization', {
+ colorSelected: colorData.colorEnum
+ });
+ }
+ }, 50);
+ }}
+ accountId={store.lastUsedAccount}
/>
-
- {t("Settings_Personalization_Theme")}
-
+
+
+ }
+
+
+
+ Options du thème
+
+ {Platform.OS === "android" && Platform.Version >= 31 && (
+
+
+
+
+
+
+ {t("Global_Recommended")}
+ {t("Settings_Personalization_MaterialYou_Title")}
+
+ {t("Settings_Personalization_MaterialYou_Description")}
+
+
+ {
+ mutateProperty("personalization", { useMaterialYou: value });
+ }}
+ disabled={typeof Platform.Version !== "number" || Platform.Version < 31}
+ />
+
+
+ )}
+
+
+
+
+
+
+ {t("Settings_Personalization_Theme")}
+
{
{
{
Auto
-
-
- {/*
- - {
- Alert.alert("Ça arrive... ✨", "Cette fonctionnalité n'est pas encore disponible.")
- }}
- >
-
-
-
- {t("Settings_Personalization_Icon_Title")}
- {t("Settings_Personalization_Icon_Description")}
-
- */}
- -
+
+
+
+
+
+ Options des matières
+
+ {
router.push("/(settings)/subject_personalization");
}}
>
-
-
-
- {t("Settings_Personalization_Subject_Title")}
- {t("Settings_Personalization_Subject_Description")}
-
-
-
- -
+
+
+
+
+ {t("Settings_Personalization_Subject_Title")}
+
+ {t("Settings_Personalization_Subject_Description")}
+
+
+
+
+
+
+
+
+
+
+
+ Options de l'application
+
+ {
router.push("/(settings)/tabs");
}}
>
-
-
-
+
+
+
+
+
{t("Settings_Tabs_Title")}
- {t("Settings_Tabs_Description")}
-
+
-
+
-
-
- -
+
+ {
router.push("/(settings)/language");
}}
>
-
-
-
+
+
+
+
+
{t("Settings_Language_Title")}
- {t("Settings_Language_Description")}
-
+
-
+
-
-
-
-
+
+
+
+
>
- );
+ )
};
-export default PersonalizationSettings;
\ No newline at end of file
+export default PersonalizationSettings;
diff --git a/app/(settings)/settings.tsx b/app/(settings)/settings.tsx
index 5442f4c0..fde70f6a 100644
--- a/app/(settings)/settings.tsx
+++ b/app/(settings)/settings.tsx
@@ -17,13 +17,17 @@ import Icon from "@/ui/components/Icon";
import { NativeHeaderSide } from "@/ui/components/NativeHeader";
import Stack from "@/ui/components/Stack";
import TableFlatList from "@/ui/components/TableFlatList";
-import Typography from "@/ui/components/Typography";
+import TypographyLegacy from "@/ui/components/Typography";
import adjust from "@/utils/adjustColor";
import { getInitials } from "@/utils/chats/initials";
import { error } from "@/utils/logger/logger";
import packagejson from "../../package.json"
import { formatSchoolName } from '@/utils/format/formatSchoolName';
+import List, { ListTouchable } from '@/ui/new/List';
+import Typography from '@/ui/new/Typography';
+import { useSafeAreaInsets } from 'react-native-safe-area-context';
+import { useHeaderHeight } from '@react-navigation/elements';
export default function SettingsIndex() {
const router = useRouter();
@@ -82,6 +86,13 @@ export default function SettingsIndex() {
color: "#000",
onPress: () => router.navigate("/(settings)/transport"),
},
+ {
+ title: t("Settings_Features_Title"),
+ description: t("Settings_Features_Description"),
+ papicon: ,
+ color: "#0059DD",
+ onPress: () => router.navigate("/(settings)/features"),
+ },
],
},
{
@@ -237,10 +248,12 @@ export default function SettingsIndex() {
const newButtonColor = adjust(button.color, theme.dark ? 0.2 : -0.2);
return (
-
+
-
+ {Platform.OS === 'ios' && (
+
+ )}
{button.icon}
- {button.title}
- {button.description}
+ {button.title}
+ {button.description}
-
+
+
)
})}
@@ -271,14 +289,23 @@ export default function SettingsIndex() {
);
}, [theme.dark]);
+
+ const insets = useSafeAreaInsets();
+
+ const headerHeight = useHeaderHeight();
+ const finalHeaderHeight = Platform.select({
+ android: headerHeight -16,
+ default: 0
+ });
return (
<>
-
-
+
{firstName || lastName ? `${firstName || ''} ${lastName || ''}`.trim() : t('Settings_NoAccount')}
-
+
{establishment &&
-
+
{level} {(level && establishment) && " — "} {formatSchoolName(establishment)}
-
+
}
)}
- sections={MoreSettingsList.map(section => ({
- title: section.title,
- hideTitle: true,
- items: section.content.map(item => ({
- title: item.title,
- description: item.description,
- icon: ('icon' in item ? item.icon : undefined) as React.ReactNode,
- leading: 'avatar' in item && item.avatar ? (
-
- ) : null,
- papicon: ('papicon' in item ? item.papicon : undefined) as React.ReactNode,
- onPress: 'onPress' in item ? item.onPress as (() => void) | undefined : undefined,
- tags: 'tags' in item ? item.tags as string[] | undefined : undefined,
- })),
- }))}
- />
- {
- Platform.OS === 'ios' && (
-
- router.back()} hitSlop={32}>
-
-
-
-
-
- )
- }
+ contentContainerStyle={{ padding: 16, paddingBottom: insets.bottom + 16, paddingTop: finalHeaderHeight + 16 }}
+ >
+ {MoreSettingsList.map(section => (
+
+ {Platform.OS === 'android' && (
+
+ {section.title}
+
+ )}
+ {section.content.map(item => (
+
+
+
+ {item.papicon}
+
+
+ {item.title}
+
+ {item.description}
+
+
+ ))}
+
+ ))}
+
>
);
};
diff --git a/app/(settings)/subject_personalization.tsx b/app/(settings)/subject_personalization.tsx
index c96dc31a..3c006f4e 100644
--- a/app/(settings)/subject_personalization.tsx
+++ b/app/(settings)/subject_personalization.tsx
@@ -3,29 +3,33 @@ import { useTheme } from "@react-navigation/native";
import { router } from "expo-router";
import React from "react";
import { useTranslation } from "react-i18next";
-import { Alert, ScrollView, View } from "react-native";
+import { Alert, View } from "react-native";
import { useAccountStore } from "@/stores/account";
import AnimatedPressable from "@/ui/components/AnimatedPressable";
import Icon from "@/ui/components/Icon";
-import Item, { Leading, Trailing } from "@/ui/components/Item";
-import List from "@/ui/components/List";
-import { NativeHeaderPressable, NativeHeaderSide } from "@/ui/components/NativeHeader";
+import {
+ NativeHeaderPressable,
+ NativeHeaderSide,
+} from "@/ui/components/NativeHeader";
import Stack from "@/ui/components/Stack";
-import Typography from "@/ui/components/Typography";
+import List from "@/ui/new/List";
+import Typography from "@/ui/new/Typography";
export default function SubjectPersonalization() {
const { colors } = useTheme();
- const accounts = useAccountStore((state) => state.accounts);
- const lastUsedAccount = useAccountStore((state) => state.lastUsedAccount);
- const store = useAccountStore.getState()
+ const accounts = useAccountStore(state => state.accounts);
+ const lastUsedAccount = useAccountStore(state => state.lastUsedAccount);
+ const store = useAccountStore.getState();
- const account = accounts.find((a) => a.id === lastUsedAccount);
- const subjects = Object.entries(account?.customisation?.subjects ?? {}).map(([key, value]) => ({
- id: key,
- ...value,
- })).filter(item => item.name && item.emoji && item.color);
+ const account = accounts.find(a => a.id === lastUsedAccount);
+ const subjects = Object.entries(account?.customisation?.subjects ?? {})
+ .map(([key, value]) => ({
+ id: key,
+ ...value,
+ }))
+ .filter(item => item.name && item.emoji && item.color);
const resetAllSubjects = () => {
Alert.alert(
@@ -49,8 +53,20 @@ export default function SubjectPersonalization() {
function renderItem(emoji: string, name: string, id: string, color: string) {
return (
- -
-
+ {
+ router.push({
+ pathname: "/(settings)/edit_subject",
+ params: {
+ id,
+ emoji,
+ color,
+ name,
+ },
+ });
+ }}
+ >
+
-
-
- {name}
-
-
- {
- router.push({
- pathname: "/(settings)/edit_subject",
- params: {
- id,
- emoji,
- color,
- name
- }
- })
- }}
- style={{
- borderRadius: 20,
- overflow: "hidden",
- borderWidth: 1,
- borderColor: colors.border,
- paddingHorizontal: 8,
- paddingRight: 10,
- height: 35,
- alignItems: "center",
- justifyContent: "center",
- flexDirection: "row",
- gap: 5,
- }}
- >
-
-
- Modifier
-
-
-
-
- )
+
+ {name}
+
+
+
+
+
+
+ );
}
const { t } = useTranslation();
@@ -125,40 +109,46 @@ export default function SubjectPersonalization() {
-
{subjects.length > 0 ? (
-
- {subjects.map(item => renderItem(item.emoji, item.name, item.id, item.color))}
-
+ subjects.map(item =>
+ renderItem(item.emoji, item.name, item.id, item.color)
+ )
) : (
-
-
-
-
-
-
- {t("Settings_Subjects_None_Title")}
-
-
- {t("Settings_Subjects_None_Description")}
-
-
-
+
+
+
+
+
+
+
+ {t("Settings_Subjects_None_Title")}
+
+
+ {t("Settings_Subjects_None_Description")}
+
+
+
+
)}
-
+
>
);
-};
\ No newline at end of file
+}
diff --git a/app/(settings)/tabs.tsx b/app/(settings)/tabs.tsx
index 8fd198b5..df58f98c 100644
--- a/app/(settings)/tabs.tsx
+++ b/app/(settings)/tabs.tsx
@@ -1,13 +1,13 @@
import { Papicons } from "@getpapillon/papicons";
import React from "react";
import { useTranslation } from "react-i18next";
-import { ScrollView, Switch } from "react-native";
+import { Switch } from "react-native";
import { useSettingsStore } from "@/stores/settings";
import Icon from "@/ui/components/Icon";
-import Item, { Trailing } from "@/ui/components/Item";
-import List from "@/ui/components/List";
-import Typography from "@/ui/components/Typography";
+import List from "@/ui/new/List";
+import Typography from "@/ui/new/Typography";
+import NativeSwitch from "@/ui/native/NativeSwitch";
const SettingsTabs = () => {
const { t } = useTranslation();
@@ -41,34 +41,47 @@ const SettingsTabs = () => {
name: t("Tab_News"),
icon: "newspaper",
enabled: !disabledTabs.includes("news"),
- }
- ]
+ },
+ ];
const toggleTab = (tabId: string) => {
if (disabledTabs.includes(tabId)) {
- mutateProperty("personalization", { ...settingsStore, disabledTabs: disabledTabs.filter(id => id !== tabId) });
+ mutateProperty("personalization", {
+ ...settingsStore,
+ disabledTabs: disabledTabs.filter(id => id !== tabId),
+ });
} else {
- mutateProperty("personalization", { ...settingsStore, disabledTabs: [...disabledTabs, tabId] });
+ mutateProperty("personalization", {
+ ...settingsStore,
+ disabledTabs: [...disabledTabs, tabId],
+ });
}
- }
+ };
return (
-
-
- {tabs.map((tab) => (
- -
+
+ {tabs.map(tab => (
+
+
- {tab.name}
-
- toggleTab(tab.id)} />
-
-
- ))}
-
-
- )
-}
+
+ {tab.name}
+
+ toggleTab(tab.id)}
+ />
+
+
+ ))}
+
+ );
+};
-export default SettingsTabs
+export default SettingsTabs;
diff --git a/app/(settings)/transport.tsx b/app/(settings)/transport.tsx
index 4dee80a5..08ce5d96 100644
--- a/app/(settings)/transport.tsx
+++ b/app/(settings)/transport.tsx
@@ -1,41 +1,43 @@
import { Papicons } from "@getpapillon/papicons";
import { useTheme } from "@react-navigation/native";
-import * as React from 'react';
+import * as React from "react";
import { useEffect } from "react";
import { useTranslation } from "react-i18next";
-import {
- Image,
- Modal,
- ScrollView,
-} from "react-native";
+import { Image, Modal } from "react-native";
import SettingsHeader from "@/components/SettingsHeader";
import { AvailableTransportServices } from "@/constants/AvailableTransportServices";
import { useAccountStore } from "@/stores/account";
-import Item, { Leading, Trailing } from "@/ui/components/Item";
-import List from "@/ui/components/List";
-import Typography from "@/ui/components/Typography";
+import List from "@/ui/new/List";
+import Typography from "@/ui/new/Typography";
import { AddressModal } from "@/app/(modals)/address";
import { TransportAddress } from "@/stores/account/types";
+import { useSafeAreaInsets } from "react-native-safe-area-context";
+import { runsIOS26 } from "@/ui/utils/IsLiquidGlass";
export default function TransportView() {
const accountStore = useAccountStore();
- const accounts = useAccountStore((state) => state.accounts);
- const lastUsedAccount = useAccountStore((state) => state.lastUsedAccount);
+ const accounts = useAccountStore(state => state.accounts);
+ const lastUsedAccount = useAccountStore(state => state.lastUsedAccount);
const { transport } = accounts.find(a => a.id === lastUsedAccount)!;
const theme = useTheme();
const { t } = useTranslation();
- const [transportEnabled, setTransportEnabled] = React.useState(transport?.enabled ?? false);
+ const [transportEnabled, setTransportEnabled] = React.useState(
+ transport?.enabled ?? false
+ );
const [showAddressSelect, setShowAddressSelect] = React.useState(false);
- const [addressSelectCanBeCurrentLocation, setAddressSelectCanBeCurrentLocation] = React.useState(false);
+ const [
+ addressSelectCanBeCurrentLocation,
+ setAddressSelectCanBeCurrentLocation,
+ ] = React.useState(false);
const openAddressSelect = (currentLocationEnabled: boolean) => {
setAddressSelectCanBeCurrentLocation(currentLocationEnabled);
setShowAddressSelect(true);
- }
+ };
const formatAddress = (address: TransportAddress | undefined): string => {
if (address === undefined) {
@@ -52,85 +54,109 @@ export default function TransportView() {
[transportEnabled]
);
+ const insets = useSafeAreaInsets();
+
return (
-
-
-
- {t("Settings_Transport_Address_Title")}
-
-
- - openAddressSelect(true)}>
-
+
+
+
+
+
+ {t("Settings_Transport_Address_Title")}
+
+
+ {
+ if (transportEnabled) {
+ openAddressSelect(true);
+ }
+ }}
+ style={{ opacity: transportEnabled ? 1 : 0.5 }}
+ >
+
-
-
-
-
+
{t("Settings_Transport_Address_Home_Title")}
-
+
{formatAddress(transport?.homeAddress)}
-
- - openAddressSelect(false)}>
-
-
-
-
+
-
+
+
+ {
+ if (transportEnabled) {
+ openAddressSelect(false);
+ }
+ }}
+ style={{ opacity: transportEnabled ? 1 : 0.5 }}
+ >
+
+
+
{t("Settings_Transport_Address_School_Title")}
-
+
{formatAddress(transport?.schoolAddress)}
-
-
-
- {t("Settings_Transport_Address_Description")}
-
-
- {t("Settings_Transport_Default_Application_Title")}
-
-
+
+
+
+
+
+
+
+ {t("Settings_Transport_Address_Description")}
+
+
+
+
+
+ {t("Settings_Transport_Default_Application_Title")}
+
+
+
{AvailableTransportServices.map(service => (
- - accountStore.setTransportService(service.id)}
+ {
+ if (transportEnabled) {
+ accountStore.setTransportService(service.id);
+ }
+ }}
key={service.id}
+ style={{ opacity: transportEnabled ? 1 : 0.5 }}
>
-
+
-
- {(transport?.defaultApp ?? 'transit') === service.id && (
-
+
+ {(transport?.defaultApp ?? "transit") === service.id && (
+
-
+
)}
{service.name}
-
+
))}
-
- setShowAddressSelect(false)}
- animationType={"slide"}
- >
- setShowAddressSelect(false)}
- onConfirm={(item: TransportAddress) => {
- if (addressSelectCanBeCurrentLocation) {
- // Home
- accountStore.setTransportHomeAddress(item);
- } else {
- // School
- accountStore.setTransportSchoolAddress(item);
- }
- setShowAddressSelect(false);
- }}
- />
-
-
+
+
+ setShowAddressSelect(false)}
+ animationType={"slide"}
+ >
+ setShowAddressSelect(false)}
+ onConfirm={(item: TransportAddress) => {
+ if (addressSelectCanBeCurrentLocation) {
+ // Home
+ accountStore.setTransportHomeAddress(item);
+ } else {
+ // School
+ accountStore.setTransportSchoolAddress(item);
+ }
+ setShowAddressSelect(false);
+ }}
+ />
+
+
+
);
-}
\ No newline at end of file
+}
diff --git a/app/(tabs)/_layout.tsx b/app/(tabs)/_layout.tsx
index 7ff41cb6..9a9eaeaa 100644
--- a/app/(tabs)/_layout.tsx
+++ b/app/(tabs)/_layout.tsx
@@ -1,131 +1,73 @@
-import {
- createNativeBottomTabNavigator,
- NativeBottomTabNavigationEventMap,
- NativeBottomTabNavigationOptions,
-} from "@bottom-tabs/react-navigation";
-import { ParamListBase, TabNavigationState, useTheme } from "@react-navigation/native";
-import { withLayoutContext } from "expo-router";
-import React, { useMemo } from 'react';
-import { useTranslation } from "react-i18next";
+import BottomAccessory from '@/components/BottomAccessory';
+import { useSettingsStore } from '@/stores/settings';
+import { runsIOS26 } from '@/ui/utils/IsLiquidGlass';
+import { useTheme } from '@react-navigation/native';
+import { NativeTabs } from 'expo-router/unstable-native-tabs';
+import { useTranslation } from 'react-i18next';
import { Platform } from 'react-native';
-import { useSettingsStore } from "@/stores/settings";
-import { runsIOS26 } from "@/ui/utils/IsLiquidGlass";
-
-const BottomTabNavigator = createNativeBottomTabNavigator().Navigator;
-
-const Tabs = withLayoutContext<
- NativeBottomTabNavigationOptions,
- typeof BottomTabNavigator,
- TabNavigationState,
- NativeBottomTabNavigationEventMap
->(BottomTabNavigator);
-
// Static platform detection - computed once at module load
-const IS_IOS_WITH_PADDING = runsIOS26;
+const IS_IOS_WITH_PADDING = false;
const IS_ANDROID = Platform.OS === 'android';
-// Pre-load all icons to avoid runtime require() calls
-const ICONS = {
- home: IS_IOS_WITH_PADDING ?
- require('@/assets/icons/home_padding.svg')
- : require('@/assets/icons/home.svg'),
- calendar: IS_IOS_WITH_PADDING ? require('@/assets/icons/calendar_padding.svg') : require('@/assets/icons/calendar.svg'),
- tasks: IS_IOS_WITH_PADDING ? require('@/assets/icons/tasks_padding.svg') : require('@/assets/icons/tasks.svg'),
- grades: IS_IOS_WITH_PADDING ? require('@/assets/icons/results_padding.svg') : require('@/assets/icons/results.svg'),
- news: IS_IOS_WITH_PADDING ? require('@/assets/icons/news_padding.svg') : require('@/assets/icons/news.svg'),
-} as const;
-
-// Static style object to prevent recreation on every render
const TAB_LABEL_STYLE = {
fontFamily: 'medium',
- fontSize: Platform.OS === 'ios' ? 13 : 13,
+ fontSize: Platform.OS === 'ios' ? 12 : 13,
} as const;
-// Static icon functions to prevent recreation
-const getHomeIcon = () => ICONS.home;
-const getCalendarIcon = () => ICONS.calendar;
-const getTasksIcon = () => ICONS.tasks;
-const getGradesIcon = () => ICONS.grades;
-const getNewsIcon = () => ICONS.news;
-
-// Custom hook for optimized tab translations
-const useTabTranslations = () => {
- const { t } = useTranslation();
-
- return useMemo(() => ({
- home: t("Tab_Home"),
- calendar: t("Tab_Calendar"),
- tasks: t("Tab_Tasks"),
- grades: t("Tab_Grades"),
- news: t("Tab_News"),
- }), [t]);
-};
-
export default function TabLayout() {
- // Use optimized translation hook
- const translations = useTabTranslations();
- const { colors } = useTheme();
+ const theme = useTheme();
+ const { t } = useTranslation();
- // Memoize screen options to prevent object recreation
- const screenOptions = useMemo(() => ({
- index: {
- title: translations.home,
- tabBarIcon: getHomeIcon,
- },
- calendar: {
- title: translations.calendar,
- tabBarIcon: getCalendarIcon,
- },
- tasks: {
- title: translations.tasks,
- tabBarIcon: getTasksIcon,
- },
- grades: {
- title: translations.grades,
- tabBarIcon: getGradesIcon,
- },
- news: {
- title: translations.news,
- tabBarIcon: getNewsIcon,
- },
- }), [translations]);
const settingsStore = useSettingsStore(state => state.personalization);
const disabledTabs = settingsStore?.disabledTabs || [];
+ const iOSBottomAccessoryEnabled = settingsStore?.iOSBottomAccessoryEnabled ?? true;
+ const showTabBarLabels = settingsStore?.showTabBarLabels ?? true;
+ const labelsHidden = Platform.OS === 'ios' ? !showTabBarLabels : false;
+
+ const shouldRenderBottomAccessory =
+ Platform.OS !== 'ios' || iOSBottomAccessoryEnabled;
+
return (
-
-
-
-
-
-
-
+ {shouldRenderBottomAccessory && (
+
+
+
+ )}
+
+
+ {t("Tab_Home")}
+
+
+
+ {t("Tab_Calendar")}
+
+
+
+ {t("Tab_Tasks")}
+
+
+
+ {t("Tab_Grades")}
+
+
+
+ {t("Tab_News")}
+
+
+
);
-}
\ No newline at end of file
+}
diff --git a/app/(tabs)/calendar/_layout.tsx b/app/(tabs)/calendar/_layout.tsx
index 88c90b23..f2627790 100644
--- a/app/(tabs)/calendar/_layout.tsx
+++ b/app/(tabs)/calendar/_layout.tsx
@@ -3,6 +3,7 @@ import React from "react";
import { useTranslation } from "react-i18next";
import { screenOptions } from "@/utils/theme/ScreenOptions";
+import AndroidHeaderBackground from "@/components/AndroidHeaderBackground";
export default function Layout() {
const { t } = useTranslation();
@@ -29,6 +30,7 @@ export default function Layout() {
presentation: "modal",
headerLargeTitle: false,
headerTitle: t("Tab_Calendar_Icals"),
+ headerBackground: AndroidHeaderBackground
}}
/>
diff --git a/app/(tabs)/calendar/components/CalendarDay.tsx b/app/(tabs)/calendar/components/CalendarDay.tsx
index ae25ea53..97a86f86 100644
--- a/app/(tabs)/calendar/components/CalendarDay.tsx
+++ b/app/(tabs)/calendar/components/CalendarDay.tsx
@@ -1,7 +1,7 @@
import { useNavigation } from "expo-router";
import { t } from "i18next";
import React, { useMemo, useRef } from "react";
-import { Dimensions,FlatList, RefreshControl, StyleSheet, View } from 'react-native';
+import { Dimensions,FlatList, Platform, RefreshControl, StyleSheet, View } from 'react-native';
import { Transit } from "@/components/Transit";
import { Course as SharedCourse, CourseStatus } from "@/services/shared/timetable";
@@ -107,6 +107,8 @@ export const CalendarDay = React.memo(({ dayDate, courses, isRefreshing, onRefre
return result;
}, [dayEvents]);
+ const isEmpty = enrichedEvents.length === 0;
+
return (
}
- keyExtractor={item => item.id}
+ keyExtractor={item => item.id || `${item.type}-${item.from || item.targetTime}`}
ListEmptyComponent={}
renderItem={({ item }: { item: SharedCourse }) => {
if ((item as any).type === "transit") {
diff --git a/app/(tabs)/calendar/components/CalendarHeader.tsx b/app/(tabs)/calendar/components/CalendarHeader.tsx
index 43cf6f32..a00596d8 100644
--- a/app/(tabs)/calendar/components/CalendarHeader.tsx
+++ b/app/(tabs)/calendar/components/CalendarHeader.tsx
@@ -63,6 +63,7 @@ export const CalendarHeader = React.memo(({ date, onDateChange, onHeaderHeightCh
{
id: 'manage_icals',
title: t("Tab_Calendar_Icals"),
+ papicon: "calendar",
subtitle: t("Tab_Calendar_Icals_Description"),
imageColor: colors.text,
image: Platform.select({
diff --git a/app/(tabs)/calendar/event/[id].tsx b/app/(tabs)/calendar/event/[id].tsx
index b34b2bf7..10d2c640 100644
--- a/app/(tabs)/calendar/event/[id].tsx
+++ b/app/(tabs)/calendar/event/[id].tsx
@@ -10,6 +10,7 @@ import UnderConstructionNotice from "@/components/UnderConstructionNotice";
import { useDatabase } from '@/database/DatabaseProvider';
import { useEventById } from '@/database/useEventsById';
import { NativeHeaderPressable, NativeHeaderSide } from '@/ui/components/NativeHeader';
+import ActionMenu from '@/ui/components/ActionMenu';
export default function TabOneScreen() {
const { id, title } = useLocalSearchParams();
@@ -39,7 +40,7 @@ export default function TabOneScreen() {
return (
<>
-
-
+
Parsing intelligent (Beta)
- {
await updateIcalParsing(ical.id, value);
diff --git a/app/(tabs)/calendar/index.tsx b/app/(tabs)/calendar/index.tsx
index ca1c312a..4795d7bf 100644
--- a/app/(tabs)/calendar/index.tsx
+++ b/app/(tabs)/calendar/index.tsx
@@ -1,8 +1,7 @@
import { useTheme } from "@react-navigation/native";
import { t } from "i18next";
import React, { useCallback, useRef, useState } from "react";
-import { FlatList, StyleSheet,View } from "react-native";
-import { useBottomTabBarHeight } from "react-native-bottom-tabs";
+import { FlatList, Platform, StyleSheet,View } from "react-native";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import { CourseStatus } from "@/services/shared/timetable";
@@ -18,7 +17,7 @@ export default function TabOneScreen() {
const calendarRef = useRef(null);
const [headerHeight, setHeaderHeight] = useState(0);
const insets = useSafeAreaInsets();
- const tabBarHeight = useBottomTabBarHeight();
+ const tabBarHeight = insets.bottom;
const accounts = useAccountStore(state => state.accounts);
const lastUsedAccount = useAccountStore(state => state.lastUsedAccount);
@@ -64,7 +63,7 @@ export default function TabOneScreen() {
headerHeight={headerHeight}
insets={insets}
tabBarHeight={tabBarHeight}
- transportInfo={account.transport ?? undefined}
+ transportInfo={account?.transport ?? undefined}
/>
);
}, [getDateFromIndex, timetable, manualRefreshing, handleRefresh, colors, headerHeight]);
@@ -91,7 +90,7 @@ export default function TabOneScreen() {
renderItem={renderDay}
keyExtractor={(_, index) => "renderDay:" + String(index)}
onScroll={onScroll}
- decelerationRate={0.98}
+ decelerationRate={Platform.OS === 'ios' ? 0.98 : undefined}
disableIntervalMomentum={true}
scrollEventThrottle={16}
onMomentumScrollEnd={onMomentumScrollEnd}
diff --git a/app/(tabs)/grades/_layout.tsx b/app/(tabs)/grades/_layout.tsx
index 074a7b83..dfaa5a4b 100644
--- a/app/(tabs)/grades/_layout.tsx
+++ b/app/(tabs)/grades/_layout.tsx
@@ -4,6 +4,7 @@ import { useTranslation } from "react-i18next";
import { screenOptions } from "@/utils/theme/ScreenOptions";
import { runsIOS26 } from "@/ui/utils/IsLiquidGlass";
+import AndroidHeaderBackground from "@/components/AndroidHeaderBackground";
export default function Layout() {
const { t } = useTranslation();
@@ -24,6 +25,7 @@ export default function Layout() {
headerLargeTitle: false,
headerTitle: t("Grades_SubjectInfo"),
presentation: "modal",
+ headerBackground: AndroidHeaderBackground
}}
/>
{
+const Averages = ({
+ grades,
+ realAverage,
+ color,
+ displayScale = "20",
+ inline = false,
+}: {
+ grades: Grade[],
+ realAverage?: number,
+ color?: string,
+ displayScale?: GradeDisplayScale,
+ inline?: boolean
+}) => {
try {
const theme = useTheme();
const accent = color || theme.colors.primary;
@@ -65,12 +92,15 @@ const Averages = ({ grades, realAverage, color, scale = 20 }: { grades: Grade[],
date: new Date(),
});
}
- return history;
+ return history.map(entry => ({
+ ...entry,
+ average: toDisplayScaleFrom20(entry.average, displayScale),
+ }));
} catch (e) {
console.error("Error calculating average history:", e);
return [];
}
- }, [grades, algorithm, realAverage]);
+ }, [grades, algorithm, realAverage, displayScale]);
const initialAverage = useMemo(() => {
if (currentAverageHistory.length === 0) {
@@ -82,14 +112,14 @@ const Averages = ({ grades, realAverage, color, scale = 20 }: { grades: Grade[],
if (algorithm.canInjectRealAverage && realAverage) {
return {
- average: realAverage,
+ average: toDisplayScaleFrom20(realAverage, displayScale),
date: new Date(),
};
}
if (!currentAverageHistory || currentAverageHistory.length === 0) { return null; }
return currentAverageHistory[currentAverageHistory.length - 1];
- }, [currentAverageHistory, algorithm, realAverage]);
+ }, [currentAverageHistory, algorithm, realAverage, displayScale]);
const [shownAverage, setShownAverage] = useState(initialAverage ? initialAverage.average : 0);
const [shownDate, setShownDate] = useState(initialAverage ? initialAverage.date : new Date());
@@ -124,12 +154,20 @@ const Averages = ({ grades, realAverage, color, scale = 20 }: { grades: Grade[],
}, [active]);
const graphAxis = useMemo(() => {
- return calculateAmplifiedGraphPoints(currentAverageHistory, scale);
- }, [currentAverageHistory, scale]);
+ return calculateAmplifiedGraphPoints(currentAverageHistory, getDisplayScaleMax(displayScale));
+ }, [currentAverageHistory, displayScale]);
+
+ const displayedRealAverage = useMemo(() => {
+ if (realAverage === undefined) {
+ return undefined;
+ }
+
+ return toDisplayScaleFrom20(realAverage, displayScale);
+ }, [realAverage, displayScale]);
const isRealAverage = useMemo(() => {
- return shownAverage === realAverage;
- }, [shownAverage, realAverage]);
+ return shownAverage === displayedRealAverage;
+ }, [shownAverage, displayedRealAverage]);
const backgroundColor = useMemo(() => {
return adjust(accent, theme.dark ? -0.89 : 0.8);
@@ -151,31 +189,52 @@ const Averages = ({ grades, realAverage, color, scale = 20 }: { grades: Grade[],
style={{
width: "100%"
}}
- entering={PapillonAppearIn}
- exiting={PapillonAppearOut}
+ entering={!inline ? PapillonAppearIn : undefined}
+ exiting={!inline ? PapillonAppearOut : undefined}
>
-
+ {Platform.OS === 'ios' && (
+
+ )}
-
-
- {shownAverage ? shownAverage.toFixed(2) : "0.00"}
-
-
-
- /{scale}
-
-
-
+
+
+
+ {shownAverage ? shownAverage.toFixed(2) : "0.00"}
+
+
+
+ {getDisplayDenominator(displayScale)}
+
+
+
- ({
- id: "setAlg:" + algo.key,
- title: algo.label,
- subtitle: algo.description,
- state: algorithm.key === algo.key ? "on" : "off",
+ ({
+ id: "setAlg:" + algo.key,
+ title: algo.label,
+ subtitle: algo.description,
+ state: algorithm.key === algo.key ? "on" : "off",
+ image: Platform.select({
+ ios: algo.sfsymbol
+ }),
+ imageColor: theme.colors.text
+ })),
+ displayInline: true
+ },
+ {
+ id: 'open:more',
+ papicon: "info",
+ title: t('Grades_Avg_KnowMore'),
+ subtitle: t('Grades_Avg_KnowMore_Description'),
image: Platform.select({
- ios: algo.sfsymbol
+ ios: "info.circle"
}),
imageColor: theme.colors.text
- })),
- displayInline: true
- },
- {
- id: 'open:more',
- title: t('Grades_Avg_KnowMore'),
- subtitle: t('Grades_Avg_KnowMore_Description'),
- image: Platform.select({
- ios: "info.circle"
- }),
- imageColor: theme.colors.text
- }
- ]}
- onPressAction={({ nativeEvent }) => {
- const actionId = nativeEvent.event;
-
- if (actionId.startsWith("open:")) {
- if (actionId === "open:more") {
- WebBrowser.openBrowserAsync("https://docs.papillon.bzh/support/kb/averages", {
- presentationStyle: "pageSheet"
- });
}
- }
+ ]}
+ onPressAction={({ nativeEvent }) => {
+ const actionId = nativeEvent.event;
+
+ if (actionId.startsWith("open:")) {
+ if (actionId === "open:more") {
+ WebBrowser.openBrowserAsync("https://docs.papillon.bzh/support/kb/averages", {
+ presentationStyle: "pageSheet"
+ });
+ }
+ }
+
+ if (actionId.startsWith("setAlg:")) {
+ setAlgorithm(algorithms.find((algo) => algo.key === actionId.slice(7))!);
+ }
+ }}
+ >
+
+
+
+ {algorithm.label}
+
+
+
+
+
+
+
+
+
+
+ {isRealAverage ? "par l'établissement" :
+ "estimée au " + (shownDate instanceof Date && !isNaN(shownDate.getTime()) ? shownDate.toLocaleDateString(undefined, {
+ day: "numeric",
+ month: "short",
+ year: "numeric"
+ }) : "Unknown Date")}
+
+
+ {!inline && }
+
- if (actionId.startsWith("setAlg:")) {
- setAlgorithm(algorithms.find((algo) => algo.key === actionId.slice(7))!);
- }
- }}
- >
-
-
-
- {algorithm.label}
-
-
-
-
-
-
-
-
-
-
- {isRealAverage ? "par l'établissement" :
- "estimée au " + (shownDate instanceof Date && !isNaN(shownDate.getTime()) ? shownDate.toLocaleDateString(undefined, {
- day: "numeric",
- month: "short",
- year: "numeric"
- }) : "Unknown Date")}
-
-
-
diff --git a/app/(tabs)/grades/atoms/FeaturesMap.tsx b/app/(tabs)/grades/atoms/FeaturesMap.tsx
index 998fa49e..2f7c1e8a 100644
--- a/app/(tabs)/grades/atoms/FeaturesMap.tsx
+++ b/app/(tabs)/grades/atoms/FeaturesMap.tsx
@@ -2,13 +2,14 @@ import React from 'react';
import { View } from 'react-native';
import ScodocUES from '../features/ScodocUES';
+import { GradeDisplayScale } from '@/utils/grades/scale';
const featureComponent = {
"scodoc-ues": ScodocUES,
}
-const FeaturesMap: React.FC<{ features: Record }> = ({ features }) => {
+const FeaturesMap: React.FC<{ features: Record, displayScale: GradeDisplayScale }> = ({ features, displayScale }) => {
if (!features) { return null; }
return (
@@ -16,10 +17,10 @@ const FeaturesMap: React.FC<{ features: Record }> = ({ features })
{Object.entries(features).map(([key, value]) => {
const Component = featureComponent[key as keyof typeof featureComponent];
if (!Component) { return null; }
- return ;
+ return ;
})}
);
};
-export default FeaturesMap;
\ No newline at end of file
+export default FeaturesMap;
diff --git a/app/(tabs)/grades/atoms/Subject.tsx b/app/(tabs)/grades/atoms/Subject.tsx
index 5483dc9b..51ab2135 100644
--- a/app/(tabs)/grades/atoms/Subject.tsx
+++ b/app/(tabs)/grades/atoms/Subject.tsx
@@ -8,13 +8,16 @@ import { Text, TouchableOpacity } from 'react-native';
import { Grade } from '@/database/models/Grades';
import Subject from '@/database/models/Subject';
import Item, { Trailing } from '@/ui/components/Item';
-import List from '@/ui/components/List';
+import LegacyList from '@/ui/components/List';
import Stack from '@/ui/components/Stack';
-import Typography from '@/ui/components/Typography';
+import LegacyTypography from '@/ui/components/Typography';
import adjust from '@/utils/adjustColor';
import { getSubjectColor } from '@/utils/subjects/colors';
import { getSubjectEmoji } from '@/utils/subjects/emoji';
import { getSubjectName } from '@/utils/subjects/name';
+import List from '@/ui/new/List';
+import Typography from '@/ui/new/Typography';
+import { GradeDisplayScale, formatScoreForDisplay } from '@/utils/grades/scale';
const GradeItem = React.memo(({ grade, subjectName, subjectColor, onPress, getAvgInfluence, getAvgClassInfluence }: { grade: Grade, subjectName: string, subjectColor: string, onPress: (grade: Grade) => void, getAvgInfluence: (grade: Grade) => number, getAvgClassInfluence: (grade: Grade) => number }) => {
const dateString = useMemo(() => {
@@ -33,43 +36,43 @@ const GradeItem = React.memo(({ grade, subjectName, subjectColor, onPress, getAv
const trailingForeground = hasMaxScore ? "#FFFFFF" : subjectColor;
return (
- -
+
{grade.description ? grade.description : t('Grade_NoDescription', { subject: subjectName })}
-
+
{dateString}
-
+
{grade.studentScore.disabled ? (
<>
-
+
{grade.studentScore.status}
-
+
>
) : (
<>
-
+
{grade.studentScore.value.toFixed(2)}
-
+
>
)}
-
+
/{grade.outOf.value}
-
+
{hasMaxScore && (
)}
-
-
+
+
);
});
-export const SubjectItem: React.FC<{ subject: Subject, grades: Grade[], getAvgInfluence: (grade: Grade) => number, getAvgClassInfluence: (grade: Grade) => number }> = React.memo(({ subject, grades, getAvgInfluence, getAvgClassInfluence }) => {
+export const SubjectItem: React.FC<{ subject: Subject, grades: Grade[], getAvgInfluence: (grade: Grade) => number, getAvgClassInfluence: (grade: Grade) => number, displayScale: GradeDisplayScale }> = React.memo(({ subject, grades, getAvgInfluence, getAvgClassInfluence, displayScale }) => {
const theme = useTheme();
const navigation = useNavigation()
@@ -81,6 +84,9 @@ export const SubjectItem: React.FC<{ subject: Subject, grades: Grade[], getAvgIn
const subjectName = useMemo(() => getSubjectName(subject.name), [subject.name]);
const subjectEmoji = useMemo(() => getSubjectEmoji(subject.name), [subject.name]);
+ const displayedSubjectAverage = useMemo(() => {
+ return formatScoreForDisplay(subject.studentAverage.value, subject.outOf.value, displayScale);
+ }, [subject.studentAverage.value, subject.outOf.value, displayScale]);
const handlePressSubject = useCallback(() => {
// @ts-expect-error navigation types
@@ -108,66 +114,66 @@ export const SubjectItem: React.FC<{ subject: Subject, grades: Grade[], getAvgIn
);
return (
-
-
-
-
-
- {subjectEmoji}
-
-
-
-
-
- {subjectName}
-
-
-
-
- {subject.studentAverage.disabled ? (
-
- {subject.studentAverage.status}
+
+
+
+
+
+
+ {subjectEmoji}
+
+
+
+
+
+ {subjectName}
- ) : (
-
- {subject.studentAverage.value.toFixed(2)}
-
- )}
-
- /{subject.outOf.value}
-
- {subject.studentAverage.value === subject.maximum.value && !subject.studentAverage.disabled && (
-
- )}
+
+
+
+ {subject.studentAverage.disabled ? (
+
+ {subject.studentAverage.status}
+
+ ) : (
+
+ {displayedSubjectAverage.value.toFixed(2)}
+
+ )}
+
+ {displayedSubjectAverage.denominator}
+
+ {subject.studentAverage.value === subject.maximum.value && !subject.studentAverage.disabled && (
+
+ )}
+
-
-
-
-
- {subject.grades.map((grade) => (
-
- ))}
-
-
+
+
+
+ {subject.grades.map((grade) => (
+
+ ))}
+
);
});
GradeItem.displayName = "GradeItem"
-SubjectItem.displayName = "SubjectItem"
\ No newline at end of file
+SubjectItem.displayName = "SubjectItem"
diff --git a/app/(tabs)/grades/features/ScodocUES.tsx b/app/(tabs)/grades/features/ScodocUES.tsx
index 8daec79b..eefaa1b3 100644
--- a/app/(tabs)/grades/features/ScodocUES.tsx
+++ b/app/(tabs)/grades/features/ScodocUES.tsx
@@ -13,6 +13,7 @@ import { useTheme } from '@react-navigation/native';
import AnimatedPressable from '@/ui/components/AnimatedPressable';
import { Dynamic } from '@/ui/components/Dynamic';
import { PapillonAppearIn, PapillonAppearOut } from '@/ui/utils/Transition';
+import { GradeDisplayScale, formatAssumed20ForDisplay } from '@/utils/grades/scale';
export interface AveragedElement {
id: number;
@@ -53,11 +54,19 @@ export interface UE {
export type UEMap = Record;
-const ScodocUES: React.FC<{ data: UEMap }> = ({ data }) => {
+const ScodocUES: React.FC<{ data: UEMap, displayScale: GradeDisplayScale }> = ({ data, displayScale }) => {
try {
const { colors } = useTheme();
const [openedUE, setOpenedUE] = React.useState(null);
const [displayUEs, setDisplayUEs] = React.useState(false);
+ const scaleDenominator = formatAssumed20ForDisplay(0, displayScale).denominator;
+ const toDisplay = (value: string) => {
+ const parsed = Number.parseFloat(value.replace(",", "."));
+ if (Number.isNaN(parsed)) {
+ return value;
+ }
+ return formatAssumed20ForDisplay(parsed, displayScale).value.toFixed(2);
+ };
return (
<>
@@ -98,10 +107,10 @@ const ScodocUES: React.FC<{ data: UEMap }> = ({ data }) => {
- {value.moyenne.value}
+ {toDisplay(value.moyenne.value)}
- /20
+ {scaleDenominator}
@@ -171,10 +180,10 @@ const ScodocUES: React.FC<{ data: UEMap }> = ({ data }) => {
- {data[openedUE].moyenne.value}
+ {toDisplay(data[openedUE].moyenne.value)}
- /20
+ {scaleDenominator}
@@ -211,10 +220,10 @@ const ScodocUES: React.FC<{ data: UEMap }> = ({ data }) => {
- {data[openedUE].moyenne.moy}
+ {toDisplay(data[openedUE].moyenne.moy)}
- /20
+ {scaleDenominator}
@@ -229,10 +238,10 @@ const ScodocUES: React.FC<{ data: UEMap }> = ({ data }) => {
- {data[openedUE].moyenne.min}
+ {toDisplay(data[openedUE].moyenne.min)}
- /20
+ {scaleDenominator}
@@ -247,10 +256,10 @@ const ScodocUES: React.FC<{ data: UEMap }> = ({ data }) => {
- {data[openedUE].moyenne.max}
+ {toDisplay(data[openedUE].moyenne.max)}
- /20
+ {scaleDenominator}
@@ -267,10 +276,10 @@ const ScodocUES: React.FC<{ data: UEMap }> = ({ data }) => {
- {value.moyenne}
+ {toDisplay(value.moyenne)}
- /20
+ {scaleDenominator}
@@ -295,10 +304,10 @@ const ScodocUES: React.FC<{ data: UEMap }> = ({ data }) => {
- {value.moyenne}
+ {toDisplay(value.moyenne)}
- /20
+ {scaleDenominator}
@@ -326,4 +335,4 @@ const ScodocUES: React.FC<{ data: UEMap }> = ({ data }) => {
}
};
-export default ScodocUES;
\ No newline at end of file
+export default ScodocUES;
diff --git a/app/(tabs)/grades/index.tsx b/app/(tabs)/grades/index.tsx
index 201def29..1d5fa85b 100644
--- a/app/(tabs)/grades/index.tsx
+++ b/app/(tabs)/grades/index.tsx
@@ -6,7 +6,6 @@ import { useNavigation } from 'expo-router';
import { t } from 'i18next';
import React, { useCallback, useEffect, useMemo, useState } from 'react';
import { Dimensions, Platform, RefreshControl, View } from 'react-native';
-import { useBottomTabBarHeight } from 'react-native-bottom-tabs';
import Reanimated, { LinearTransition, useAnimatedStyle } from 'react-native-reanimated';
import { useSafeAreaInsets } from 'react-native-safe-area-context';
@@ -19,12 +18,12 @@ import { Dynamic } from '@/ui/components/Dynamic';
import { ErrorBoundary } from '@/ui/components/ErrorBoundary';
import Icon from '@/ui/components/Icon';
import Item, { Trailing } from '@/ui/components/Item';
-import List from '@/ui/components/List';
+import LegacyList from '@/ui/components/List';
import Search from '@/ui/components/Search';
import Stack from '@/ui/components/Stack';
import TabHeader from '@/ui/components/TabHeader';
import TabHeaderTitle from '@/ui/components/TabHeaderTitle';
-import Typography from '@/ui/components/Typography';
+import LegacyTypography from '@/ui/components/Typography';
import { useKeyboardHeight } from '@/ui/hooks/useKeyboardHeight';
import { PapillonAppearIn, PapillonAppearOut } from '@/ui/utils/Transition';
import { getCurrentPeriod } from '@/utils/grades/helper/period';
@@ -33,22 +32,26 @@ import { getPeriodName, getPeriodNumber, isPeriodWithNumber } from "@/utils/serv
import { getSubjectColor } from "@/utils/subjects/colors";
import { getSubjectEmoji } from "@/utils/subjects/emoji";
import { getSubjectName } from "@/utils/subjects/name";
+import { getGradeDisplayScale } from "@/utils/grades/scale";
import Averages from './atoms/Averages';
import FeaturesMap from './atoms/FeaturesMap';
import { SubjectItem } from './atoms/Subject';
import { useGradeInfluence } from './hooks/useGradeInfluence';
+import List from '@/ui/new/List';
+import Typography from '@/ui/new/Typography';
+import ActionMenu from '@/ui/components/ActionMenu';
const MemoizedSubjectItem = React.memo(SubjectItem);
const GradesView: React.FC = () => {
// Layout du header
const [headerHeight, setHeaderHeight] = useState(0);
- const bottomTabBarHeight = useBottomTabBarHeight();
// Thème
const { colors } = useTheme();
const insets = useSafeAreaInsets();
+ const bottomTabBarHeight = 0;
const navigation = useNavigation();
// Chargement
@@ -61,6 +64,7 @@ const GradesView: React.FC = () => {
// Sortings
const settings = useSettingsStore(state => state.personalization);
const mutateSettings = useSettingsStore(state => state.mutateProperty);
+ const displayScale = getGradeDisplayScale(settings.gradesDisplayScale);
const [sortMethod, setSortMethod] = useState(settings.gradesSortMethod || "date");
@@ -78,6 +82,7 @@ const GradesView: React.FC = () => {
{
label: t("Grades_Sorting_Alphabetical"),
value: "alphabetical",
+ papicon: "letter",
icon: {
ios: "character",
android: "ic_alphabetical",
@@ -87,6 +92,7 @@ const GradesView: React.FC = () => {
{
label: t("Grades_Sorting_Date"),
value: "date",
+ papicon: "calendar",
icon: {
ios: "calendar",
android: "ic_date",
@@ -96,6 +102,7 @@ const GradesView: React.FC = () => {
{
label: t("Grades_Sorting_Averages"),
value: "averages",
+ papicon: "grades",
icon: {
ios: "chart.xyaxis.line",
android: "ic_averages",
@@ -295,10 +302,16 @@ const GradesView: React.FC = () => {
return (
{/* @ts-expect-error navigation types */}
-
+
)
- }, [grades]);
+ }, [grades, displayScale]);
const keyboardHeight = useKeyboardHeight();
@@ -317,22 +330,23 @@ const GradesView: React.FC = () => {
grades={grades}
color={colors.primary}
realAverage={serviceAverage || undefined}
+ displayScale={displayScale}
/>
{serviceRank && (
-
+
-
-
+
{t('Grades_Tab_Rank')}
-
-
+
+
{t('Grades_Tab_Rank_Description')}
-
+
{
vAlign='end'
hAlign='end'
>
-
+
{serviceRank.value}
-
-
+
+
/{serviceRank.outOf}
-
+
-
+
)}
@@ -365,9 +379,9 @@ const GradesView: React.FC = () => {
-
+
{t('Grades_Tab_Latest')}
-
+
{
-
+
@@ -423,13 +437,26 @@ const GradesView: React.FC = () => {
-
+
{t('Grades_Tab_Subjects')}
-
+
- ) : null), [sortedGrades, searchText]);
+ ) : null), [
+ sortedGrades,
+ searchText,
+ grades,
+ colors.primary,
+ serviceAverage,
+ serviceRank,
+ navigation,
+ getSubjectById,
+ getAvgInfluence,
+ getAvgClassInfluence,
+ features,
+ displayScale,
+ ]);
return (
{
onHeightChanged={setHeaderHeight}
/* Nom de la période */
title={
- {
const actionId = nativeEvent.event;
@@ -485,7 +512,7 @@ const GradesView: React.FC = () => {
loading={loading}
chevron={periods.length > 1}
/>
-
+
}
/* Filtres */
trailing={
@@ -502,6 +529,7 @@ const GradesView: React.FC = () => {
id: "sort:" + s.value,
title: s.label,
state: sortMethod === s.value ? "on" : "off",
+ papicon: s.icon.papicon,
image: Platform.select({
ios: s.icon.ios,
android: s.icon.android,
@@ -520,11 +548,9 @@ const GradesView: React.FC = () => {
/>
- }
+ {
-
+
{t('Grades_Empty_Title')}
-
-
+
+
{t('Grades_Empty_Description')}
-
+
}
- />
+ >
+ {filteredSubjects.map((subject) => (
+
+ ))}
+
)
};
-export default GradesView;
\ No newline at end of file
+export default GradesView;
diff --git a/app/(tabs)/grades/modals/SubjectInfo.tsx b/app/(tabs)/grades/modals/SubjectInfo.tsx
index 1117c249..eda61bcb 100644
--- a/app/(tabs)/grades/modals/SubjectInfo.tsx
+++ b/app/(tabs)/grades/modals/SubjectInfo.tsx
@@ -2,18 +2,23 @@ import ModalOverhead, { ModalOverHeadScore } from "@/components/ModalOverhead";
import Subject from "@/database/models/Subject";
import Stack from "@/ui/components/Stack";
import TableFlatList from "@/ui/components/TableFlatList";
-import Typography from "@/ui/components/Typography";
+import TypographyLegacy from "@/ui/components/Typography";
import { getSubjectColor } from "@/utils/subjects/colors";
import { getSubjectEmoji } from "@/utils/subjects/emoji";
import { getSubjectName } from "@/utils/subjects/name";
import { Papicons } from "@getpapillon/papicons";
import { useRoute, useTheme } from "@react-navigation/native";
import React from "react";
-import { View } from "react-native";
+import { Platform, View } from "react-native";
import LinearGradient from "react-native-linear-gradient";
import { colorCheck } from '@/utils/colorCheck';
import adjust from "@/utils/adjustColor";
import i18n from "@/utils/i18n";
+import List from "@/ui/new/List";
+import Typography from "@/ui/new/Typography";
+import Icon from "@/ui/components/Icon";
+import { useSettingsStore } from "@/stores/settings";
+import { formatScoreForDisplay, getGradeDisplayScale } from "@/utils/grades/scale";
const SubjectInfo = () => {
const { params } = useRoute();
@@ -21,18 +26,20 @@ const SubjectInfo = () => {
const colors = theme.colors;
const subject: Subject = params?.subject;
+ const displayScale = getGradeDisplayScale(useSettingsStore(state => state.personalization.gradesDisplayScale));
const subjectColor = getSubjectColor(subject?.name);
const subjectName = getSubjectName(subject?.name);
const subjectEmoji = getSubjectEmoji(subject?.name);
- const outOf = subject.outOf.value;
+ const displayedSubjectAverage = formatScoreForDisplay(subject.studentAverage.value, subject.outOf.value, displayScale);
+ const displayedDenominator = formatScoreForDisplay(0, subject.outOf.value, displayScale).denominator;
const averagesData = [
{
title: i18n.t("SubjectInfo_ClassAverage_Label"),
subtitle: i18n.t("SubjectInfo_ClassAverage_Description"),
disabled: subject.classAverage.disabled,
- value: subject.classAverage.value.toFixed(2),
+ value: formatScoreForDisplay(subject.classAverage.value, subject.outOf.value, displayScale).value,
status: subject.classAverage.status,
icon: "GraduationHat",
},
@@ -40,7 +47,7 @@ const SubjectInfo = () => {
title: i18n.t("SubjectInfo_MaxAverage_Label"),
subtitle: i18n.t("SubjectInfo_MaxAverage_Description"),
disabled: subject.maximum.disabled,
- value: subject.maximum.value.toFixed(2),
+ value: formatScoreForDisplay(subject.maximum.value, subject.outOf.value, displayScale).value,
status: subject.maximum.status,
icon: "ArrowRightUp",
},
@@ -48,7 +55,7 @@ const SubjectInfo = () => {
title: i18n.t("SubjectInfo_MinAverage_Label"),
subtitle: i18n.t("SubjectInfo_MinAverage_Description"),
disabled: subject.minimum.disabled,
- value: subject.minimum.value.toFixed(2),
+ value: formatScoreForDisplay(subject.minimum.value, subject.outOf.value, displayScale).value,
status: subject.minimum.status,
icon: "Minus",
}
@@ -56,21 +63,23 @@ const SubjectInfo = () => {
return (
<>
-
+ {Platform.OS !== 'android' && (
+
+ )}
- {
}
style={{
@@ -104,36 +113,54 @@ const SubjectInfo = () => {
vAlign="center"
>
-
+
{i18n.t("SubjectInfo_MaxAverage_Description")}
-
+
)}
}
- sections={[
- {
- title: i18n.t("SubjectInfo_Stats_Header"),
- icon: ,
- items: averagesData.map((average) => ({
- icon: ,
- title: average.title,
- description: average.subtitle,
- trailing: (
+ contentContainerStyle={{
+ padding: 16,
+ }}
+ >
+
+
+
+ {i18n.t("SubjectInfo_Stats_Header")}
+
+
+
+ {averagesData.map((average, index) => (
+
+
+
+
+
+
+
+
+ {average.title}
+
+
+ {average.subtitle}
+
+
+
-
- {average.disabled ? average.status : average.value}
-
-
- /{outOf}
-
+
+ {average.disabled ? average.status : average.value.toFixed(2)}
+
+
+ {displayedDenominator}
+
- )
- }))
- }
- ]}
- />
+
+
+ ))}
+
+
>
);
};
diff --git a/app/(tabs)/index/atoms/HomeHeader.tsx b/app/(tabs)/index/atoms/HomeHeader.tsx
index 0a2d6a7a..f8897014 100644
--- a/app/(tabs)/index/atoms/HomeHeader.tsx
+++ b/app/(tabs)/index/atoms/HomeHeader.tsx
@@ -3,7 +3,7 @@ import { router } from 'expo-router';
import * as WebBrowser from "expo-web-browser";
import React, { useEffect, useMemo } from 'react';
import { useTranslation } from 'react-i18next';
-import { Pressable, View } from 'react-native';
+import { Platform, Pressable, View } from 'react-native';
import { useSafeAreaInsets } from 'react-native-safe-area-context';
import packageJson from '@/package.json';
@@ -20,11 +20,13 @@ import WrappedBanner from './WrappedBanner';
import { useTheme } from '@react-navigation/native';
import AnimatedPressable from '@/ui/components/AnimatedPressable';
import { PapillonAppearIn, PapillonAppearOut } from '@/ui/utils/Transition';
+import { ListTouchable } from '@/ui/new/List';
const HomeHeader = () => {
const { t } = useTranslation();
const insets = useSafeAreaInsets();
- const { colors } = useTheme();
+ const theme = useTheme();
+ const { colors } = theme;
const { availableCanteenCards, attendancesPeriods, attendances, absencesCount, chats } = useHomeHeaderData();
const settingsStore = useSettingsStore(state => state.personalization);
const mutateProperty = useSettingsStore(state => state.mutateProperty);
@@ -100,7 +102,7 @@ const HomeHeader = () => {
], [availableCanteenCards, absencesCount, chats, attendancesPeriods, attendances, t]);
return (
-
+
@@ -119,37 +121,43 @@ const HomeHeader = () => {
{showReleaseNotesBanner && (
-
- WebBrowser.openBrowserAsync(releaseNotesUrl, {
- presentationStyle: WebBrowser.WebBrowserPresentationStyle.PAGE_SHEET,
- })
- }
- >
-
-
-
-
- {t("Home_Release_Notes_Banner", { version: currentVersion })}
-
-
- {t("Home_Release_Notes_Banner_Description")}
-
-
+
+
+ WebBrowser.openBrowserAsync(releaseNotesUrl, {
+ presentationStyle: WebBrowser.WebBrowserPresentationStyle.PAGE_SHEET,
+ })
+ }>
+
+
+
+
+
+ {t("Home_Release_Notes_Banner", { version: currentVersion })}
+
+
+ {t("Home_Release_Notes_Banner_Description")}
+
+
- {
- event.stopPropagation();
- mutateProperty("personalization", { releaseNotesSeenForVersion: currentVersion });
- }}
- style={{ width: 24, height: 24, borderRadius: 12, alignItems: "center", justifyContent: "center", backgroundColor: colors.text + '11', position: "absolute", top: 10, right: 12 }}
- >
-
-
-
-
+ {
+ event.stopPropagation();
+ mutateProperty("personalization", { releaseNotesSeenForVersion: currentVersion });
+ }}
+ >
+
+
+
+
+
+
+
+
+
)}
{__DEV__ && 1 === 2 && (
diff --git a/app/(tabs)/index/atoms/UserProfile.tsx b/app/(tabs)/index/atoms/UserProfile.tsx
index 113cf138..76112814 100644
--- a/app/(tabs)/index/atoms/UserProfile.tsx
+++ b/app/(tabs)/index/atoms/UserProfile.tsx
@@ -4,7 +4,7 @@ import { useTheme } from '@react-navigation/native';
import { LiquidGlassView } from '@sbaiahmed1/react-native-blur';
import { useRouter } from 'expo-router';
import React from 'react';
-import { Dimensions, StyleSheet } from 'react-native';
+import { Dimensions, Platform, StyleSheet } from 'react-native';
import { Pressable } from 'react-native';
import { initializeAccountManager } from '@/services/shared';
@@ -17,6 +17,7 @@ import { runsIOS26 } from '@/ui/utils/IsLiquidGlass';
import { useUserProfileData } from '../hooks/useUserProfileData';
import { t } from 'i18next';
import { formatSchoolName } from '@/utils/format/formatSchoolName';
+import ActionMenu from '@/ui/components/ActionMenu';
const UserProfile = ({ subtitle, onPress }: { subtitle?: string, onPress?: () => void }) => {
const router = useRouter();
@@ -25,6 +26,13 @@ const UserProfile = ({ subtitle, onPress }: { subtitle?: string, onPress?: () =>
const lastUsedAccount = useAccountStore((state) => state.lastUsedAccount);
const theme = useTheme();
+ const AccountsMenuItems = (accounts && accounts.length > 0) && accounts.map((account) => ({
+ id: account.id,
+ title: account.firstName + ' ' + account.lastName,
+ subtitle: formatSchoolName(account.schoolName ?? ""),
+ state: account.id === lastUsedAccount ? 'on' : 'off',
+ })) || [];
+
return (
- {
- if(nativeEvent.event === "edit") {
+ if (nativeEvent.event === "edit") {
router.push('/(modals)/profile');
return;
}
- if(nativeEvent.event === "add") {
+ if (nativeEvent.event === "add") {
router.push("/(onboarding)/ageSelection?action=addService");
return;
}
@@ -69,27 +77,24 @@ const UserProfile = ({ subtitle, onPress }: { subtitle?: string, onPress?: () =>
await initializeAccountManager();
}}
actions={[
- {
+ ...Platform.OS === "ios" ? [{
id: 'workspaces',
title: '',
displayInline: true,
- subactions: accounts.map((account) => ({
- id: account.id,
- title: account.firstName + ' ' + account.lastName,
- subtitle: formatSchoolName(account.schoolName ?? ""),
- state: account.id === lastUsedAccount ? 'on' : 'off',
- })),
- },
+ subactions: AccountsMenuItems,
+ }] : AccountsMenuItems,
{
id: 'edit',
title: t('Home_Edit_Profile'),
image: 'person.crop.circle',
+ papicon: 'user',
imageColor: theme.colors.text,
},
{
id: 'add',
title: t('Home_Add_Profile'),
image: 'plus',
+ papicon: 'add',
imageColor: theme.colors.text,
},
]}
@@ -107,7 +112,7 @@ const UserProfile = ({ subtitle, onPress }: { subtitle?: string, onPress?: () =>
}
-
+
@@ -134,7 +139,7 @@ const UserProfileItemContainer = ({ children }: { children: React.ReactNode }) =
return (
-
+
{children}
)
diff --git a/app/(tabs)/index/components/HomeHeaderButton.tsx b/app/(tabs)/index/components/HomeHeaderButton.tsx
index 9b3641e7..e05871ad 100644
--- a/app/(tabs)/index/components/HomeHeaderButton.tsx
+++ b/app/(tabs)/index/components/HomeHeaderButton.tsx
@@ -2,10 +2,11 @@ import React from 'react';
import { Pressable, StyleSheet, View } from 'react-native';
import { LiquidGlassView } from '@sbaiahmed1/react-native-blur';
import { Papicons } from '@getpapillon/papicons';
-import Typography from '@/ui/components/Typography';
+import Typography from '@/ui/new/Typography';
import { useTheme } from '@react-navigation/native';
import AnimatedPressable from '@/ui/components/AnimatedPressable';
import Stack from '@/ui/components/Stack';
+import { TouchableNativeFeedback } from 'react-native';
export interface HomeHeaderButtonItem {
title: string;
@@ -23,37 +24,49 @@ const HomeHeaderButton: React.FC = ({ item }) => {
const { colors } = useTheme();
return (
-
+
-
-
+
{item.title}
- {item.description}
+ {item.description}
-
-
+
+
+
);
};
diff --git a/app/(tabs)/index/components/HomeTopBarButton.tsx b/app/(tabs)/index/components/HomeTopBarButton.tsx
index 72fd4496..6f1dfae5 100644
--- a/app/(tabs)/index/components/HomeTopBarButton.tsx
+++ b/app/(tabs)/index/components/HomeTopBarButton.tsx
@@ -1,5 +1,5 @@
import React from 'react';
-import { Pressable, View } from 'react-native';
+import { Pressable, TouchableNativeFeedback, View } from 'react-native';
import { LiquidGlassView } from '@sbaiahmed1/react-native-blur';
import Icon from '@/ui/components/Icon';
import { Papicons } from '@getpapillon/papicons';
@@ -13,26 +13,26 @@ interface HomeTopBarButtonProps {
const HomeTopBarButton: React.FC = ({ icon, onPress }) => {
return (
-
-
-
-
+
+
);
};
diff --git a/app/(tabs)/index/components/HomeWidget.tsx b/app/(tabs)/index/components/HomeWidget.tsx
index 5566bc5e..73fee6f3 100644
--- a/app/(tabs)/index/components/HomeWidget.tsx
+++ b/app/(tabs)/index/components/HomeWidget.tsx
@@ -6,6 +6,10 @@ import Typography from '@/ui/components/Typography';
import AnimatedPressable from '@/ui/components/AnimatedPressable';
import { Papicons } from '@getpapillon/papicons';
import { useRouter } from 'expo-router';
+import { useTheme } from '@react-navigation/native';
+import { Platform } from 'react-native';
+import { ErrorBoundary } from '@/ui/components/ErrorBoundary';
+import { ListTouchable } from '@/ui/new/List';
export interface HomeWidgetItem {
icon: React.ReactNode;
@@ -15,21 +19,29 @@ export interface HomeWidgetItem {
buttonLabel?: string;
render?: () => React.ReactNode;
dev?: boolean;
+ hidden?: boolean;
}
interface HomeWidgetProps {
item: HomeWidgetItem;
}
-const HomeWidget: React.FC = React.memo(({ item }) => {
+const HomeWidgetContent: React.FC = ({ item }) => {
const router = useRouter();
+ const theme = useTheme();
if (!item || (item.dev && !__DEV__)) {
return null;
}
return (
-
+
{item.icon}
@@ -38,23 +50,31 @@ const HomeWidget: React.FC = React.memo(({ item }) => {
{item.title}
{(item.redirect || item.onPress) && (
- item.onPress ? item.onPress() : router.navigate(item.redirect as any)}
- >
-
-
- {t('Home_Display_More',)}
-
-
-
-
-
-
+
+ item.onPress ? item.onPress() : router.navigate(item.redirect as any)}
+ >
+
+
+ {t('Home_Display_More',)}
+
+
+
+
+
+
+
)}
{item.render && item.render()}
);
-});
+};
+
+const HomeWidget: React.FC = React.memo((props) => (
+
+
+
+));
export default HomeWidget;
diff --git a/app/(tabs)/index/hooks/useHomeData.ts b/app/(tabs)/index/hooks/useHomeData.ts
index b7b04ccb..e19a2464 100644
--- a/app/(tabs)/index/hooks/useHomeData.ts
+++ b/app/(tabs)/index/hooks/useHomeData.ts
@@ -5,16 +5,23 @@ import { useCallback, useEffect } from 'react';
import { getWeekNumberFromDate } from '@/database/useHomework';
import { AuthenticationError } from '@/services/errors/AuthenticationError';
import { getManager, initializeAccountManager } from "@/services/shared";
-import { Grade, Period } from '@/services/shared/grade';
import { Services } from '@/stores/account/types';
import { useSettingsStore } from '@/stores/settings';
import { useAlert } from '@/ui/components/AlertProvider';
import { getCurrentPeriod } from '@/utils/grades/helper/period';
import { log, warn } from '@/utils/logger/logger';
+import { useAccountStore } from '@/stores/account';
+
+const HOME_SYNC_TTL_MS = 5 * 60 * 1000;
+const homeSyncState = new Map<
+ string,
+ { lastSyncedAt: number; inFlight: Promise | null }
+>();
export const useHomeData = () => {
const alert = useAlert();
const settingsstore = useSettingsStore(state => state.personalization);
+ const lastUsedAccount = useAccountStore(state => state.lastUsedAccount);
const fetchEDT = useCallback(async () => {
const manager = getManager();
@@ -30,33 +37,41 @@ export const useHomeData = () => {
return;
}
const gradePeriods = await manager.getGradesPeriods();
- const validPeriods: Period[] = [];
- const date = new Date().getTime();
- for (const period of gradePeriods) {
- if (period.start.getTime() > date && period.end.getTime() > date) {
- validPeriods.push(period);
- }
- }
-
- const grades: Grade[] = [];
- const currentPeriod = getCurrentPeriod(validPeriods);
+ const currentPeriod = getCurrentPeriod(gradePeriods);
if (currentPeriod) {
- const periodGrades = await manager.getGradesForPeriod(currentPeriod, currentPeriod.createdByAccount);
- periodGrades.subjects.forEach(subject => {
- subject.grades.forEach(grade => {
- grades.push(grade);
- });
- });
+ await manager.getGradesForPeriod(currentPeriod, currentPeriod.createdByAccount);
}
}, []);
const initialize = useCallback(async () => {
+ if (!lastUsedAccount) {
+ return;
+ }
+
+ const state =
+ homeSyncState.get(lastUsedAccount) ?? {
+ lastSyncedAt: 0,
+ inFlight: null,
+ };
+ homeSyncState.set(lastUsedAccount, state);
+
+ if (state.inFlight) {
+ await state.inFlight;
+ return;
+ }
+
+ if (Date.now() - state.lastSyncedAt < HOME_SYNC_TTL_MS) {
+ return;
+ }
+
+ state.inFlight = (async () => {
try {
- await initializeAccountManager();
+ await initializeAccountManager(lastUsedAccount);
log("Refreshed Manager received");
await Promise.all([fetchEDT(), fetchGrades()]);
+ state.lastSyncedAt = Date.now();
if (settingsstore.showAlertAtLogin) {
alert.showAlert({
@@ -76,9 +91,10 @@ export const useHomeData = () => {
const serviceId = error?.service?.id ?? undefined;
alert.showAlert({
- title: "Connexion impossible",
+ title: "Vous avez été déconnecté",
+ message: instanceURL ? `En savoir plus et se reconnecter` : "En savoir plus",
description: "Il semblerait que ta session a expiré. Tu pourras renouveler ta session dans les paramètres en liant à nouveau ton compte.",
- icon: "TriangleAlert",
+ icon: "UserCross",
color: "#D60046",
customButton: instanceURL ? {
label: "Me reconnecter",
@@ -87,14 +103,17 @@ export const useHomeData = () => {
const authUrl = instanceURL;
const instanceInfo = await instance(authUrl as string);
- if (instanceInfo && instanceInfo.casToken && instanceInfo.casURL) {
+ if (instanceInfo && instanceInfo.name) {
return setTimeout(() => {
- router.push({ pathname: "/(onboarding)/pronote/webview", params: { url: authUrl, serviceId } })
- }, 200)
+ router.navigate("/(onboarding)/ageSelection");
+ setTimeout(() => {
+ router.navigate({ pathname: "/(onboarding)/services/pronote/browser", params: { url: authUrl, school: instanceInfo.name } })
+ }, 400)
+ }, 100)
}
setTimeout(() => {
- router.push({ pathname: "/(onboarding)/pronote/credentials", params: { url: authUrl, serviceId } })
+ router.navigate({ pathname: "/(onboarding)/services/pronote/browser", params: { url: authUrl, school: "N/A" } })
}, 200)
}
} : undefined,
@@ -102,7 +121,14 @@ export const useHomeData = () => {
})
}
}
- }, [alert, fetchEDT, fetchGrades, settingsstore.showAlertAtLogin]);
+ })();
+
+ try {
+ await state.inFlight;
+ } finally {
+ state.inFlight = null;
+ }
+ }, [alert, fetchEDT, fetchGrades, settingsstore.showAlertAtLogin, lastUsedAccount]);
useEffect(() => {
initialize();
diff --git a/app/(tabs)/index/hooks/useTimetableWidgetData.ts b/app/(tabs)/index/hooks/useTimetableWidgetData.ts
index 3613689c..b9c604fb 100644
--- a/app/(tabs)/index/hooks/useTimetableWidgetData.ts
+++ b/app/(tabs)/index/hooks/useTimetableWidgetData.ts
@@ -8,6 +8,7 @@ export const useTimetableWidgetData = () => {
const now = new Date();
const weekNumber = getWeekNumberFromDate(now);
+ const [loading, setLoading] = useState(false);
const accounts = useAccountStore((state) => state.accounts);
const lastUsedAccount = useAccountStore((state) => state.lastUsedAccount);
const account = accounts.find((a) => a.id === lastUsedAccount);
@@ -32,6 +33,7 @@ export const useTimetableWidgetData = () => {
useEffect(() => {
const fetchData = async () => {
+ setLoading(true);
const today = new Date();
today.setHours(0, 0, 0, 0);
@@ -49,6 +51,7 @@ export const useTimetableWidgetData = () => {
dayCourse = dayCourse.filter(course => course.to.getTime() > Date.now());
setCourses(dayCourse);
+ setLoading(false);
};
fetchData();
}, [weeklyTimetable]);
diff --git a/app/(tabs)/index/index.old.tsx b/app/(tabs)/index/index.old.tsx
index 4af431fd..5fe74b12 100644
--- a/app/(tabs)/index/index.old.tsx
+++ b/app/(tabs)/index/index.old.tsx
@@ -95,7 +95,7 @@ const IndexScreen = () => {
alert.showAlert({
title: "Connexion impossible",
description: "Il semblerait que ta session a expiré. Tu pourras renouveler ta session dans les paramètres en liant à nouveau ton compte.",
- icon: "TriangleAlert",
+ icon: "AlertTriangle",
color: "#D60046",
customButton: instanceURL ? {
label: "Me reconnecter",
diff --git a/app/(tabs)/index/index.tsx b/app/(tabs)/index/index.tsx
index 38880011..27533cef 100644
--- a/app/(tabs)/index/index.tsx
+++ b/app/(tabs)/index/index.tsx
@@ -3,8 +3,7 @@ import { useIsFocused } from '@react-navigation/native';
import { useRouter } from 'expo-router';
import { t } from 'i18next';
import React from 'react';
-import { FlatList, StatusBar } from 'react-native';
-import { useBottomTabBarHeight } from 'react-native-bottom-tabs';
+import { FlatList, Platform, StatusBar, View } from 'react-native';
import { useSafeAreaInsets } from 'react-native-safe-area-context';
import { useAccountStore } from '@/stores/account';
@@ -16,10 +15,16 @@ import Wallpaper from './atoms/Wallpaper';
import HomeWidget, { HomeWidgetItem } from './components/HomeWidget';
import { useHomeData } from './hooks/useHomeData';
import HomeTimeTableWidget from './widgets/timetable';
+import GradesWidget from './widgets/Grades';
+import { useAlert } from '@/ui/components/AlertProvider';
+import Button from '@/ui/new/Button';
+import MaskedView from '@react-native-masked-view/masked-view';
+import LinearGradient from 'react-native-linear-gradient';
+import Typography from '@/ui/new/Typography';
const HomeScreen = () => {
const insets = useSafeAreaInsets();
- const bottomTabBarHeight = useBottomTabBarHeight();
+ const bottomTabBarHeight = insets.bottom + 16;
const focused = useIsFocused();
// Account
@@ -47,7 +52,13 @@ const HomeScreen = () => {
useHomeData();
+ const [gradesWidgetHidden, setGradesWidgetHidden] = React.useState(true);
+
const renderTimeTable = React.useCallback(() => , []);
+ const renderGrades = React.useCallback(
+ () => ,
+ []
+ );
const data: HomeWidgetItem[] = React.useMemo(() => [
{
@@ -56,27 +67,62 @@ const HomeScreen = () => {
redirect: "(tabs)/calendar",
render: renderTimeTable
},
- ], [renderTimeTable]);
+ {
+ icon: ,
+ title: t("Home_Widget_Grades_Average"),
+ redirect: "(tabs)/grades",
+ hidden: gradesWidgetHidden,
+ render: renderGrades
+ }
+ ], [renderTimeTable, renderGrades, gradesWidgetHidden]);
+
+ const alert = useAlert();
return (
<>
{focused && }
- }
- keyExtractor={(item) => item.title}
- ListHeaderComponent={}
- style={{ flex: 1 }}
- contentContainerStyle={{
- paddingBottom: insets.bottom + bottomTabBarHeight,
- paddingHorizontal: 16,
- flexGrow: 1
- }}
- data={data}
- />
+
+ }
+ keyExtractor={(item) => item.title}
+ ListHeaderComponent={}
+ style={{ flex: 1 }}
+ contentContainerStyle={{
+ paddingBottom: Platform.OS === 'ios' ? bottomTabBarHeight : 16,
+ paddingHorizontal: 16,
+ flexGrow: 1,
+ gap: 12,
+ marginTop: 6
+ }}
+ data={data}
+ />
+
>
);
};
-export default HomeScreen;
\ No newline at end of file
+const HomeViewContainer = ({ children }) => {
+ const insets = useSafeAreaInsets();
+
+ return (
+
+
+
+
+ }
+ style={{ flex: 1 }}
+ >
+ {children}
+
+ )
+}
+
+export default HomeScreen;
diff --git a/app/(tabs)/index/widgets/Grades.tsx b/app/(tabs)/index/widgets/Grades.tsx
index ee9563bb..eb81bcd8 100644
--- a/app/(tabs)/index/widgets/Grades.tsx
+++ b/app/(tabs)/index/widgets/Grades.tsx
@@ -1,345 +1,217 @@
-/* eslint-disable unused-imports/no-unused-imports */
-import { t } from "i18next";
-import React, { useCallback, useEffect, useMemo, useRef, useState } from "react"
-import { useWindowDimensions, View } from "react-native"
-import { LineGraph } from 'react-native-graph';
-import Reanimated, { FadeIn, FadeOut } from "react-native-reanimated";
+import React, { useCallback, useEffect, useMemo, useState } from "react";
+import { View } from "react-native";
import { getManager, subscribeManagerUpdate } from "@/services/shared";
-import { Grade as SharedGrade, Period, Subject as SharedSubject } from "@/services/shared/grade";
-import AnimatedNumber from "@/ui/components/AnimatedNumber";
-import { Dynamic } from "@/ui/components/Dynamic";
-import Stack from "@/ui/components/Stack";
-import Typography from "@/ui/components/Typography"
-import { Animation } from "@/ui/utils/Animation";
-import { PapillonAppearIn, PapillonAppearOut } from "@/ui/utils/Transition";
-import PapillonMedian from "@/utils/grades/algorithms/median";
-import PapillonSubjectAvg from "@/utils/grades/algorithms/subject";
-import PapillonWeightedAvg from "@/utils/grades/algorithms/weighted";
+import { Period, Subject as SharedSubject } from "@/services/shared/grade";
import { getCurrentPeriod } from "@/utils/grades/helper/period";
-import { error, log } from "@/utils/logger/logger";
-import i18n from "@/utils/i18n";
+import { error } from "@/utils/logger/logger";
+import Averages from "../../grades/atoms/Averages";
+import { useSettingsStore } from "@/stores/settings";
+import { getGradeDisplayScale } from "@/utils/grades/scale";
-const avgAlgorithms = [
- {
- label: t("Grades_Avg_All_Title"),
- short: t("Grades_Avg_All_Short"),
- subtitle: t("Grades_Method_AllGrades"),
- value: "subject",
- algorithm: (grades: SharedGrade[]) => PapillonSubjectAvg(grades)
- },
- {
- label: t("Grades_Avg_Subject_Title"),
- short: t("Grades_Avg_Subject_Short"),
- subtitle: t("Grades_Method_Weighted"),
- value: "weighted",
- algorithm: (grades: SharedGrade[]) => PapillonWeightedAvg(grades)
- },
+const PERIODS_TTL_MS = 5 * 60 * 1000;
+const GRADES_TTL_MS = 5 * 60 * 1000;
+
+const periodsCache = new Map<
+ string,
{
- label: t("Grades_Avg_Median_Title"),
- short: t("Grades_Avg_Median_Short"),
- subtitle: t("Grades_Method_AllGrades"),
- value: "median",
- algorithm: (grades: SharedGrade[]) => PapillonMedian(grades)
- },
-]
+ fetchedAt: number;
+ value?: Period;
+ inFlight?: Promise;
+ }
+>();
-const GradesWidget = (
+const gradesCache = new Map<
+ string,
{
- accent = "#29947A",
- header = false,
- algorithm = "subject",
- period
- }: {
- accent?: string,
- header?: boolean,
- algorithm?: "subject" | "weighted" | "median",
- period?: Period
- }) => {
+ fetchedAt: number;
+ subjects: SharedSubject[];
+ serviceAverage?: number;
+ inFlight?: Promise<{
+ subjects: SharedSubject[];
+ serviceAverage?: number;
+ }>;
+ }
+>();
+
+type GradesWidgetProps = {
+ accent?: string;
+ header?: boolean;
+ algorithm?: "subject" | "weighted" | "median";
+ period?: Period;
+ onEmptyStateChange?: (isEmpty: boolean) => void;
+};
+
+const GradesWidget = ({ period, onEmptyStateChange }: GradesWidgetProps) => {
try {
const manager = getManager();
- const [periods, setPeriods] = useState([]);
- const [subjects, setSubjects] = useState>([]);
+ const [subjects, setSubjects] = useState([]);
const [currentPeriod, setCurrentPeriod] = useState(period);
const [serviceAverage, setServiceAverage] = useState(undefined);
+ const displayScale = getGradeDisplayScale(useSettingsStore(state => state.personalization.gradesDisplayScale));
+
+ const grades = useMemo(
+ () =>
+ subjects
+ .flatMap((subject) => subject.grades)
+ .filter(
+ (grade) =>
+ grade.studentScore?.value !== undefined &&
+ grade.givenAt &&
+ !isNaN(grade.studentScore.value) &&
+ !grade.studentScore.disabled,
+ ),
+ [subjects],
+ );
- const currentAlgorithm = algorithm;
-
- const getAverageHistory = useCallback((grades: SharedGrade[]) => {
- if (grades.length === 0) {
- return [];
- }
-
- // Filter out grades without valid scores and dates
- const validGrades = grades.filter(grade =>
- grade.studentScore?.value !== undefined &&
- grade.givenAt &&
- !isNaN(grade.studentScore.value) &&
- !grade.studentScore.disabled
- );
-
- if (validGrades.length === 0) {
- return [];
- }
-
- // Sort grades by date in ascending order
- const sortedGrades = [...validGrades].sort((a, b) => a.givenAt.getTime() - b.givenAt.getTime());
-
- // Initialize an array to store the average history
- const averageHistory: { date: number; average: number; }[] = [];
+ useEffect(() => {
+ onEmptyStateChange?.(grades.length === 0);
+ }, [grades.length, onEmptyStateChange]);
+
+ const fetchPeriods = useCallback(
+ async (managerToUse = manager) => {
+ if (period) {
+ setCurrentPeriod(period);
+ return;
+ }
+ if (!managerToUse) {
+ return;
+ }
- // Find the algorithm once outside the loop
- const selectedAlgorithm = avgAlgorithms.find(a => a.value === currentAlgorithm);
- if (!selectedAlgorithm) {
- return [];
- }
+ const accountId = managerToUse.getAccount().id;
+ const cache = periodsCache.get(accountId);
- // Group grades by date to handle multiple grades on same day
- const gradesByDate = new Map();
- sortedGrades.forEach(grade => {
- const dateKey = new Date(grade.givenAt).setHours(0, 0, 0, 0);
- if (!gradesByDate.has(dateKey)) {
- gradesByDate.set(dateKey, []);
+ if (cache && Date.now() - cache.fetchedAt < PERIODS_TTL_MS) {
+ if (cache.value) {
+ setCurrentPeriod(cache.value);
+ }
+ return;
}
- gradesByDate.get(dateKey)!.push(grade);
- });
- // Calculate average for each date
- const sortedDates = Array.from(gradesByDate.keys()).sort((a, b) => a - b);
- let cumulativeGrades: SharedGrade[] = [];
+ if (cache?.inFlight) {
+ const cachedPeriod = await cache.inFlight;
+ if (cachedPeriod) {
+ setCurrentPeriod(cachedPeriod);
+ }
+ return;
+ }
- sortedDates.forEach(dateKey => {
- const gradesOnThisDate = gradesByDate.get(dateKey)!;
- cumulativeGrades = [...cumulativeGrades, ...gradesOnThisDate];
+ const inFlight = (async () => {
+ const result = await managerToUse.getGradesPeriods();
+ return getCurrentPeriod(result);
+ })();
- const currentAverage = selectedAlgorithm.algorithm(cumulativeGrades);
+ periodsCache.set(accountId, {
+ fetchedAt: cache?.fetchedAt ?? 0,
+ value: cache?.value,
+ inFlight,
+ });
- if (!isNaN(currentAverage) && currentAverage !== -1 && currentAverage > 0) {
- averageHistory.push({
- date: dateKey,
- average: currentAverage,
+ try {
+ const nextPeriod = await inFlight;
+ periodsCache.set(accountId, {
+ fetchedAt: Date.now(),
+ value: nextPeriod,
});
+ if (nextPeriod) {
+ setCurrentPeriod(nextPeriod);
+ }
+ } catch (err) {
+ periodsCache.delete(accountId);
+ error(`Failed to fetch periods: ${err}`);
}
- });
-
- return averageHistory;
- }, [currentAlgorithm]);
-
- const grades = useMemo(() => {
- return subjects.flatMap(subject => subject.grades).filter(grade =>
- grade.studentScore?.value !== undefined &&
- grade.givenAt &&
- !isNaN(grade.studentScore.value) &&
- !grade.studentScore.disabled
- );
- }, [subjects]);
-
- const currentAverageHistory = useMemo(() => {
- if (grades.length > 0) {
- return getAverageHistory(grades);
- }
- return [];
- }, [grades, getAverageHistory]);
-
- const fetchPeriods = useCallback(async (managerToUse = manager) => {
- if (period) {
- setCurrentPeriod(period);
- return;
- }
- if (currentPeriod) {
- return;
- }
- if (!managerToUse) {
- return;
- }
- try {
- const result = await managerToUse.getGradesPeriods();
- setPeriods(result);
- const currentPeriodFound = getCurrentPeriod(result);
- setCurrentPeriod(currentPeriodFound);
- } catch (err) {
- error(`Failed to fetch periods: ${err}`);
- }
- }, [period, currentPeriod, manager]);
+ },
+ [period, manager],
+ );
useEffect(() => {
const unsubscribe = subscribeManagerUpdate((updatedManager) => {
fetchPeriods(updatedManager);
});
- fetchPeriods(); // Initial fetch
-
return () => unsubscribe();
}, [fetchPeriods]);
- const fetchGradesForPeriod = useCallback(async (period: Period | undefined, managerToUse = manager) => {
- if (period && managerToUse) {
+ const fetchGradesForPeriod = useCallback(
+ async (periodToFetch: Period | undefined, managerToUse = manager) => {
+ if (!periodToFetch || !managerToUse) {
+ return;
+ }
+
+ const periodKey = `${periodToFetch.createdByAccount}:${periodToFetch.name}`;
+ const cache = gradesCache.get(periodKey);
+
+ if (cache && Date.now() - cache.fetchedAt < GRADES_TTL_MS) {
+ setSubjects(cache.subjects);
+ setServiceAverage(cache.serviceAverage);
+ return;
+ }
+
+ if (cache?.inFlight) {
+ const cachedGrades = await cache.inFlight;
+ setSubjects(cachedGrades.subjects);
+ setServiceAverage(cachedGrades.serviceAverage);
+ return;
+ }
+
+ const inFlight = (async () => {
+ const result = await managerToUse.getGradesForPeriod(
+ periodToFetch,
+ periodToFetch.createdByAccount,
+ );
+ return {
+ subjects: result.subjects,
+ serviceAverage: result.studentOverall.value || undefined,
+ };
+ })();
+
+ gradesCache.set(periodKey, {
+ fetchedAt: cache?.fetchedAt ?? 0,
+ subjects: cache?.subjects ?? [],
+ serviceAverage: cache?.serviceAverage,
+ inFlight,
+ });
+
try {
- const grades = await managerToUse.getGradesForPeriod(period, period.createdByAccount);
- setSubjects(grades.subjects);
- if (grades.studentOverall.value) {
- setServiceAverage(grades.studentOverall.value)
- }
+ const nextGrades = await inFlight;
+ gradesCache.set(periodKey, {
+ fetchedAt: Date.now(),
+ subjects: nextGrades.subjects,
+ serviceAverage: nextGrades.serviceAverage,
+ });
+ setSubjects(nextGrades.subjects);
+ setServiceAverage(nextGrades.serviceAverage);
} catch (err) {
+ gradesCache.delete(periodKey);
error(`Failed to fetch grades: ${err}`);
}
- }
- }, [manager]);
+ },
+ [manager],
+ );
useEffect(() => {
fetchGradesForPeriod(currentPeriod);
}, [currentPeriod, fetchGradesForPeriod]);
- // If the period prop changes, update currentPeriod
useEffect(() => {
if (period) {
setCurrentPeriod(period);
}
}, [period]);
- const windowDimensions = useWindowDimensions();
- const graphWidth = useMemo(() => windowDimensions.width + (16 * 2), [windowDimensions.width]);
-
- const initialAverage = useMemo(() => {
- if (serviceAverage && currentAlgorithm === "subject") {
- return serviceAverage;
- }
- if (currentAverageHistory && currentAverageHistory.length > 0) {
- return currentAverageHistory[currentAverageHistory.length - 1]?.average;
- }
- return -1;
- }, [currentAverageHistory, serviceAverage, currentAlgorithm]);
-
- const [shownAverage, setShownAverage] = useState(initialAverage);
- const [selectionDate, setSelectionDate] = useState(undefined);
-
- useEffect(() => {
- setShownAverage(initialAverage);
- }, [initialAverage]);
-
- const graphAxis = useMemo(() => {
- return currentAverageHistory
- .filter(item => !isNaN(item.average) && item.average !== null && item.average !== undefined)
- .map(item => ({
- value: item.average,
- date: new Date(item.date)
- }));
- }, [currentAverageHistory]);
-
- const graphRef = useRef(null);
-
- const handleGestureUpdate = useCallback((p: { value: number, date: Date }) => {
- setShownAverage(p.value);
- setSelectionDate(p.date);
- }, []);
-
- const handleGestureEnd = useCallback(() => {
- setShownAverage(initialAverage);
- setSelectionDate(undefined);
- }, [initialAverage]);
-
- const selectedAlgorithm = useMemo(() =>
- avgAlgorithms.find(a => a.value === currentAlgorithm),
- [currentAlgorithm]
- );
+ if (grades.length === 0) {
+ return null;
+ }
return (
-
-
-
-
-
- {graphAxis.length > 0 ? (
-
- ) : (
- <>>
- )}
-
-
-
-
-
-
- {shownAverage !== -1 ? (shownAverage ?? 0).toFixed(2) : "--.--"}
-
-
-
-
- /20
-
-
-
-
-
- {selectedAlgorithm?.label || t("NoAverage")}
-
-
-
-
- {selectionDate ?
- t("Global_DatePrefix") + " " + selectionDate.toLocaleDateString(i18n.language, {
- day: "2-digit",
- month: "long",
- year: "numeric",
- })
- : selectedAlgorithm?.subtitle || t("NoAverage")}
-
-
-
-
+
+
- )
+ );
} catch (err) {
error(`Error in GradesWidget: ${err}`);
return null;
}
-}
+};
-export default GradesWidget;
\ No newline at end of file
+export default GradesWidget;
diff --git a/app/(tabs)/index/widgets/timetable.tsx b/app/(tabs)/index/widgets/timetable.tsx
index c878cd16..17857509 100644
--- a/app/(tabs)/index/widgets/timetable.tsx
+++ b/app/(tabs)/index/widgets/timetable.tsx
@@ -25,7 +25,7 @@ const HomeTimeTableWidget = React.memo(() => {
vAlign="center"
padding={[22, 16]}
gap={2}
- style={{ paddingTop: 12 }}
+ style={{ paddingTop: 12, marginBottom: 3 }}
>
{t("Home_Widget_NoCourses")}
diff --git a/app/(tabs)/news/index.tsx b/app/(tabs)/news/index.tsx
index a06c523f..7e856515 100644
--- a/app/(tabs)/news/index.tsx
+++ b/app/(tabs)/news/index.tsx
@@ -1,90 +1,82 @@
import { useNews } from '@/database/useNews'
import { getManager, subscribeManagerUpdate } from '@/services/shared'
-import Item, { Leading } from '@/ui/components/Item'
-import List from '@/ui/components/List'
+import Avatar from '@/ui/components/Avatar'
+import { Dynamic } from '@/ui/components/Dynamic'
+import Icon from '@/ui/components/Icon'
import Search from '@/ui/components/Search'
+import Stack from '@/ui/components/Stack'
import TabHeader from '@/ui/components/TabHeader'
import TabHeaderTitle from '@/ui/components/TabHeaderTitle'
-import TableFlatList from '@/ui/components/TableFlatList'
-import Typography from '@/ui/components/Typography'
+import { useKeyboardHeight } from '@/ui/hooks/useKeyboardHeight'
+import List from '@/ui/new/List'
+import Typography from '@/ui/new/Typography'
+import { PapillonAppearIn, PapillonAppearOut } from '@/ui/utils/Transition'
+import { getProfileColorByName } from '@/utils/chats/colors'
+import { getInitials } from '@/utils/chats/initials'
import { warn } from '@/utils/logger/logger'
-import { LegendList } from '@legendapp/list'
+import { Papicons } from '@getpapillon/papicons'
import { useTheme } from '@react-navigation/native'
+import { router, useRouter } from 'expo-router'
import { t } from 'i18next'
import React, { useCallback, useEffect, useMemo, useState } from 'react'
-import { View, Text, FlatList, Platform } from 'react-native'
-import { useSafeAreaInsets } from 'react-native-safe-area-context'
-import Reanimated, { LayoutAnimationConfig, LinearTransition, useAnimatedStyle } from 'react-native-reanimated'
-import { Dynamic } from '@/ui/components/Dynamic'
-import { PapillonAppearIn, PapillonAppearOut } from '@/ui/utils/Transition'
-import { useKeyboardHeight } from '@/ui/hooks/useKeyboardHeight'
-import { useBottomTabBarHeight } from 'react-native-bottom-tabs'
-import Stack from '@/ui/components/Stack'
-import Avatar from '@/ui/components/Avatar'
-import { getInitials } from '@/utils/chats/initials'
-import { getProfileColorByName } from '@/utils/chats/colors'
-import { useRouter } from 'expo-router'
-import AnimatedPressable from '@/ui/components/AnimatedPressable'
-import News from '@/database/models/News'
-import { Papicons } from '@getpapillon/papicons'
-import Icon from '@/ui/components/Icon'
+import { Platform, View } from 'react-native'
import { RefreshControl } from 'react-native-gesture-handler'
-import { FlashList } from '@shopify/flash-list'
+import Reanimated, { LayoutAnimationConfig, useAnimatedStyle } from 'react-native-reanimated'
+import { useSafeAreaInsets } from 'react-native-safe-area-context'
const NewsView = () => {
const theme = useTheme()
const colors = theme.colors
const insets = useSafeAreaInsets()
- const router = useRouter()
const [headerHeight, setHeaderHeight] = useState(0)
- const bottomTabBarHeight = useBottomTabBarHeight();
+ const bottomTabBarHeight = insets.bottom + 16;
const [isLoading, setIsLoading] = useState(false)
const [isManuallyLoading, setIsManuallyLoading] = useState(false)
- const keyboardHeight = useKeyboardHeight();
+ const keyboardHeight = useKeyboardHeight()
const footerStyle = useAnimatedStyle(() => ({
height: keyboardHeight.value - bottomTabBarHeight,
- }));
+ }))
- const news = useNews();
+ const news = useNews()
const sortedNews = useMemo(() => {
- return news.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());
- }, [news]);
+ return news.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime())
+ }, [news])
const fetchNews = useCallback(() => {
try {
setIsLoading(true)
- const manager = getManager();
+ const manager = getManager()
if (!manager) {
- warn("Manager is null, skipping news fetch");
- return;
+ warn('Manager is null, skipping news fetch')
+ return
}
- manager.getNews();
+ manager.getNews()
} catch (error) {
- console.error("Error fetching news:", error);
+ console.error('Error fetching news:', error)
} finally {
setIsLoading(false)
setIsManuallyLoading(false)
}
- }, []);
+ }, [])
useEffect(() => {
- const unsubscribe = subscribeManagerUpdate((_) => {
- fetchNews();
- });
+ const unsubscribe = subscribeManagerUpdate(() => {
+ fetchNews()
+ })
- return () => unsubscribe();
- }, []);
+ return () => unsubscribe()
+ }, [])
- const [searchText, setSearchText] = useState('');
+ const [searchText, setSearchText] = useState('')
const filteredNews = useMemo(() => {
- return sortedNews.filter((news) => news.title.toLowerCase().includes(searchText.toLowerCase()));
- }, [sortedNews, searchText]);
+ return sortedNews.filter((item) => item.title.toLowerCase().includes(searchText.toLowerCase()))
+ }, [sortedNews, searchText])
return (
<>
@@ -93,7 +85,7 @@ const NewsView = () => {
title={
@@ -102,9 +94,10 @@ const NewsView = () => {
/>
- {
progressViewOffset={headerHeight}
/>
}
- data={filteredNews}
- keyExtractor={(item: any) => item.id}
ListFooterComponent={}
- renderItem={({ item }) => }
scrollIndicatorInsets={{ top: headerHeight - insets.top }}
- ListHeaderComponent={}
+ ListHeaderComponent={}
ListEmptyComponent={
-
+
-
+
-
+
{searchText ? t('News_Search_NoResults') : t('News_Empty_Title')}
-
+
{searchText ? t('News_Search_NoResults_Description') : t('News_Empty_Description')}
}
- />
+ >
+ {filteredNews.map((item) => {
+ const profileColor = getProfileColorByName(item.author)
+ const profileInitials = getInitials(item.author)
+
+ return (
+
+ router.push({
+ pathname: '/(modals)/news',
+ params: { news: JSON.stringify(item) },
+ })
+ }
+ >
+
+
+
+
+
+ {item.title}
+
+
+ {item.content ? truncateString(cleanContent(item.content), 100) : ''}
+
+
+
+
+ {item.author}
+
+
+
+ {item.createdAt.toLocaleDateString(undefined, {
+ year: 'numeric',
+ month: 'short',
+ day: 'numeric',
+ })}
+
+
+
+ {item.attachments.length > 0 && (
+
+
+
+
+
+ )}
+
+ )
+ })}
+
>
)
}
-const NewsItem = ({ item }: { item: News }) => {
- const router = useRouter()
-
- const profileColor = useMemo(() => getProfileColorByName(item.author), [item.author]);
- const profileInitials = useMemo(() => getInitials(item.author), [item.author]);
-
- return (
- router.push({
- pathname: "/(modals)/news",
- params: { news: JSON.stringify(item) },
- })}
- >
-
- -
-
-
-
-
-
- {item.title}
-
-
- {item.content ? truncateString(cleanContent(item.content), 100) : ""}
-
-
-
-
-
- {item.author}
-
-
-
- {item.createdAt.toLocaleDateString(undefined, {
- year: "numeric",
- month: "short",
- day: "numeric",
- })}
-
-
- {item.attachments.length > 0 && (
-
-
-
- )}
-
-
-
-
- )
-}
-
function cleanContent(html: string): string {
- html = html.replace(/ /g, " ").replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, '"').replace(/'/g, "'");
- html = html.replace(/\n/g, " ");
- return html.replace(/<[^>]*>/g, "").replace(/\s+/g, " ").trim();
+ html = html.replace(/ /g, ' ').replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/'/g, "'")
+ html = html.replace(/\n/g, ' ')
+ return html.replace(/<[^>]*>/g, '').replace(/\s+/g, ' ').trim()
}
function truncateString(str: string, maxLength: number): string {
if (str.length <= maxLength) {
- return str;
+ return str
}
- return str.slice(0, maxLength) + "...";
+ return str.slice(0, maxLength) + '...'
}
-export default NewsView
\ No newline at end of file
+export default NewsView
diff --git a/app/(tabs)/tasks/atoms/EmptyState.tsx b/app/(tabs)/tasks/atoms/EmptyState.tsx
index 5d57ecf3..daf09da1 100644
--- a/app/(tabs)/tasks/atoms/EmptyState.tsx
+++ b/app/(tabs)/tasks/atoms/EmptyState.tsx
@@ -1,34 +1,38 @@
-import React, { memo } from 'react';
-import { StyleSheet, View } from 'react-native';
-import { t } from 'i18next';
-
-import Typography from '@/ui/components/Typography';
+import { Dynamic } from "@/ui/components/Dynamic";
+import Icon from "@/ui/components/Icon";
+import Stack from "@/ui/components/Stack";
+import Typography from "@/ui/components/Typography";
+import { PapillonAppearIn, PapillonAppearOut } from "@/ui/utils/Transition";
+import { Papicons } from "@getpapillon/papicons";
+import { t } from "i18next";
+import React, { memo } from "react";
interface EmptyStateProps {
isSearching: boolean;
}
const EmptyState = memo(({ isSearching }: EmptyStateProps) => (
-
-
- {isSearching ? t('Tasks_Search_NoResults') : t('Tasks_NoTasks_Title')}
-
-
- {isSearching ? "Essaie avec un autre mot clé." : t('Tasks_NoTasks_Description')}
-
-
+
+
+
+
+
+
+ {isSearching ? t("Tasks_Search_NoResults") : t("Tasks_NoTasks_Title")}
+
+
+ {isSearching
+ ? "Essaie avec un autre mot clé."
+ : t("Tasks_NoTasks_Description")}
+
+
+
));
EmptyState.displayName = "EmptyState";
-const styles = StyleSheet.create({
- emptyContainer: {
- alignItems: 'center',
- padding: 32,
- opacity: 0.6,
- },
- emptyText: {
- marginTop: 8,
- },
-});
-
export default EmptyState;
diff --git a/app/(tabs)/tasks/atoms/TasksSummary.tsx b/app/(tabs)/tasks/atoms/TasksSummary.tsx
index 24e1781a..420bb121 100644
--- a/app/(tabs)/tasks/atoms/TasksSummary.tsx
+++ b/app/(tabs)/tasks/atoms/TasksSummary.tsx
@@ -27,7 +27,7 @@ const TasksSummary: React.FC = ({ sections }) => {
exiting={PapillonAppearOut}
layout={LinearTransition}
>
-
+
= ({ sections }) => {
}
radius={15}
strokeWidth={5}
- fill={"#AB2276"}
+ fill={theme.colors.tint}
/>
-
+
{(() => {
const total = sections.reduce((acc, section) => acc + section.data.length, 0);
diff --git a/app/(tabs)/tasks/components/TaskItem.tsx b/app/(tabs)/tasks/components/TaskItem.tsx
index 7c899e7c..6fba1ff7 100644
--- a/app/(tabs)/tasks/components/TaskItem.tsx
+++ b/app/(tabs)/tasks/components/TaskItem.tsx
@@ -43,11 +43,12 @@ const TaskItem = memo(
date={new Date(item.dueDate)}
completed={item.isDone}
hasAttachments={item.attachments.length > 0}
+ isCustom={item.custom}
magic={magic}
onToggle={() => setAsDone(item, !item.isDone)}
onPress={() =>
// @ts-ignore Modal types
- navigation.navigate("(modals)/task", {
+ navigation.navigate("(modals)/tasks/task", {
task: item
})
}
diff --git a/app/(tabs)/tasks/components/TasksHeader.tsx b/app/(tabs)/tasks/components/TasksHeader.tsx
index 96d5bbf1..d23c9f6d 100644
--- a/app/(tabs)/tasks/components/TasksHeader.tsx
+++ b/app/(tabs)/tasks/components/TasksHeader.tsx
@@ -1,4 +1,4 @@
-import { useTheme } from '@react-navigation/native';
+import { useNavigation, useTheme } from '@react-navigation/native';
import { t } from 'i18next';
import React, { useMemo } from 'react';
import { Platform } from 'react-native';
@@ -8,6 +8,7 @@ import ChipButton from '@/ui/components/ChipButton';
import Search from '@/ui/components/Search';
import TabHeader from '@/ui/components/TabHeader';
import TabHeaderTitle from '@/ui/components/TabHeaderTitle';
+import Stack from '@/ui/components/Stack';
export type SortMethod = 'date' | 'subject' | 'done';
@@ -34,13 +35,15 @@ const TasksHeader: React.FC = ({
sortMethod,
shouldCollapseHeader,
}) => {
- const { colors } = useTheme();
+ const navigation = useNavigation();
+ const theme = useTheme();
+ const { colors } = theme;
const sortingOptions = useMemo(
() => [
- { label: t('Tasks_Sorting_Methods_DueDate'), value: "date", icon: "calendar" },
- { label: t('Tasks_Sorting_Methods_Subject'), value: "subject", icon: "font" },
- { label: t('Tasks_Sorting_Methods_Done'), value: "done", icon: "check" },
+ { label: t('Tasks_Sorting_Methods_DueDate'), value: "date", icon: "calendar", papicon: "calendar" },
+ { label: t('Tasks_Sorting_Methods_Subject'), value: "subject", icon: "font", papicon: "font" },
+ { label: t('Tasks_Sorting_Methods_Done'), value: "done", icon: "check", papicon: "check" },
],
[]
);
@@ -62,40 +65,55 @@ const TasksHeader: React.FC = ({
/>
}
trailing={
- {
- const actionId = nativeEvent.event;
- if (actionId === 'only-undone') {
- setShowUndoneOnly(prev => !prev);
- } else if (actionId.startsWith("sort:")) {
- setSortMethod(actionId.replace("sort:", "") as SortMethod);
- }
- }}
- actions={[
- {
- title: t('Task_Sorting_Title'),
- subactions: sortingOptions.map((method) => ({
- title: method.label,
- id: "sort:" + method.value,
- state: (sortMethod === method.value ? 'on' : 'off'),
- image: Platform.select({
- ios:
- method.value === 'date'
- ? "calendar"
- : method.value === 'subject'
- ? "character"
- : "checkmark.circle"
- }),
- imageColor: colors.text,
- })),
- displayInline: true
- }
- ]}
- icon="filter"
- chevron
- >
- {menuTitle}
-
+
+ {
+ const actionId = nativeEvent.event;
+ if (actionId === 'only-undone') {
+ setShowUndoneOnly(prev => !prev);
+ } else if (actionId.startsWith("sort:")) {
+ setSortMethod(actionId.replace("sort:", "") as SortMethod);
+ }
+ }}
+ actions={[
+ {
+ title: t('Task_Sorting_Title'),
+ papicon: "filter",
+ subactions: sortingOptions.map((method) => ({
+ title: method.label,
+ id: "sort:" + method.value,
+ papicon: method.papicon,
+ state: (sortMethod === method.value ? 'on' : 'off'),
+ image: Platform.select({
+ ios:
+ method.value === 'date'
+ ? "calendar"
+ : method.value === 'subject'
+ ? "character"
+ : "checkmark.circle"
+ }),
+ imageColor: colors.text,
+ })),
+ displayInline: true
+ }
+ ]}
+ icon="filter"
+ chevron
+ >
+ {menuTitle}
+
+
+ {
+ navigation.navigate("(modals)/tasks/custom")
+ }}
+ iconColor='white'
+ icon="add"
+ >
+
}
bottom={
= ({
return "hw:" + item.subject + item.content + item.createdByAccount + new Date(item.dueDate).toDateString();
}, []);
+ const bottomTabBarHeight = insets.bottom;
+
return (
{
const [isRefreshing, setIsRefreshing] = useState(false);
@@ -68,7 +69,9 @@ export const useHomeworkData = (selectedWeek: number, alert: any) => {
try {
const manager = getManager();
- await manager.setHomeworkCompletion(item, done)
+ if (!item.custom) {
+ await manager.setHomeworkCompletion(item, done)
+ }
updateHomeworkIsDone(id, done);
@@ -91,7 +94,7 @@ export const useHomeworkData = (selectedWeek: number, alert: any) => {
description:
"Nous n'avons pas réussi à mettre à jour l'état du devoir, si ce devoir est important, merci de vous rendre sur l'application officielle de ton établissement afin de définir son état.",
color: "#D60046",
- icon: "TriangleAlert",
+ icon: "AlertTriangle",
technical: String(err)
});
@@ -109,11 +112,88 @@ export const useHomeworkData = (selectedWeek: number, alert: any) => {
[]
);
+ const addHomework = useCallback(
+ async (item: Homework) => {
+ const id = generateId(
+ item.subject +
+ item.content +
+ item.createdByAccount +
+ new Date(item.dueDate).toDateString()
+ );
+ try {
+ setHomework(prev => ({
+ ...prev,
+ [id]: { ...item, id },
+ }));
+
+ await addHomeworkToDatabase([item]);
+
+ setRefreshTrigger(prev => prev + 1);
+ } catch (err) {
+ setHomework(prev => {
+ const next = { ...prev };
+ delete next[id];
+ return next;
+ });
+ setRefreshTrigger(prev => prev + 1);
+ }
+ }, [alert]
+ );
+
+ const deleteHomework = useCallback(
+ async (item: Homework) => {
+ const id = generateId(
+ item.subject +
+ item.content +
+ item.createdByAccount +
+ new Date(item.dueDate).toDateString()
+ );
+ try {
+ setHomework(prev => {
+ const next = { ...prev };
+ delete next[id];
+ return next;
+ });
+
+ const id = generateId(item.subject + item.content + item.createdByAccount + item.dueDate.toDateString());
+ await deleteHomeworkFromDatabase(id);
+
+ setRefreshTrigger(prev => prev + 1);
+ } catch (err) {
+ setHomework(prev => ({ ...prev, [id]: item }));
+ setRefreshTrigger(prev => prev + 1);
+ }
+ },[alert]
+ );
+
+ const setOnDelete = useHomeworkActionsStore(s => s.setOnDelete);
+ const setOnAdd = useHomeworkActionsStore(s => s.setOnAdd);
+
+ useEffect(() => {
+ setOnDelete(deleteHomework);
+ setOnAdd(addHomework);
+ }, [deleteHomework, addHomework]);
+
return {
homework,
homeworksFromCache,
isRefreshing,
handleRefresh,
setAsDone,
+ deleteHomework
};
-};
\ No newline at end of file
+};
+
+interface HomeworkActionsStore {
+ onDelete: ((item: Homework) => void) | null;
+ onAdd: ((item: Homework) => void) | null;
+ setOnDelete: (fn: (item: Homework) => void) => void;
+ setOnAdd: (fn: (item: Homework) => void) => void;
+}
+
+export const useHomeworkActionsStore = create((set) => ({
+ onDelete: null,
+ onAdd: null,
+ setOnDelete: (fn) => set({ onDelete: fn }),
+ setOnAdd: (fn) => set({ onAdd: fn }),
+}));
\ No newline at end of file
diff --git a/app/(tabs)/tasks/index.tsx b/app/(tabs)/tasks/index.tsx
index 9d9f6a1c..8a2f8fdf 100644
--- a/app/(tabs)/tasks/index.tsx
+++ b/app/(tabs)/tasks/index.tsx
@@ -1,5 +1,5 @@
import React, { useState } from 'react';
-import { StyleSheet, View } from 'react-native';
+import { Platform, StyleSheet, View } from 'react-native';
import TasksHeader from './components/TasksHeader';
import TasksList from './components/TasksList';
@@ -9,6 +9,7 @@ import { useTaskFilters } from './hooks/useTaskFilters';
import { useWeekSelection } from './hooks/useWeekSelection';
import { useAlert } from "@/ui/components/AlertProvider";
+import { useTheme } from '@react-navigation/native';
const TasksView: React.FC = () => {
const alert = useAlert();
@@ -44,6 +45,8 @@ const TasksView: React.FC = () => {
sections,
} = useTaskFilters(homeworksFromCache, homework);
+ const theme = useTheme();
+
return (
<>
{showWeekPicker && (
@@ -53,7 +56,7 @@ const TasksView: React.FC = () => {
onClose={() => setShowWeekPicker(false)}
/>
)}
-
+
)
- : undefined;
+ const IconComponent = useMemo(() => {
+ if (!params.icon) {
+ return null;
+ }
+ return ;
+ }, [params.icon]);
const [showTechnicalDetails, setShowTechnicalDetails] = useState(false);
@@ -58,7 +62,9 @@ export default function AlertModal() {
>
{/* icon */}
{IconComponent ? (
-
+
+ {IconComponent}
+
) : null}
diff --git a/app/devmode.tsx b/app/devmode.tsx
index ea1ad966..c78203ae 100644
--- a/app/devmode.tsx
+++ b/app/devmode.tsx
@@ -23,6 +23,7 @@ import { log } from "@/utils/logger/logger";
import ModelManager from "@/utils/magic/ModelManager";
import { scheduleNotificationAtDate } from "@/utils/notification/reminder/helper";
import { initializeTransport } from "@/utils/transport";
+import NativeSwitch from "@/ui/native/NativeSwitch";
export default function Devmode() {
const accountStore = useAccountStore();
@@ -64,7 +65,7 @@ export default function Devmode() {
-
- {
@@ -304,7 +305,7 @@ export default function Devmode() {
title: "Connexion impossible",
description:
"Il semblerait que ta session a expiré. Tu pourras renouveler ta session dans les paramètres en liant à nouveau ton compte.",
- icon: "TriangleAlert",
+ icon: "AlertTriangle",
color: "#D60046",
customButton: {
label: "Me reconnecter",
@@ -354,7 +355,7 @@ export default function Devmode() {
-
Activer Alert au Login
-
mutateProperty("personalization", { showAlertAtLogin: value })
diff --git a/assets/icons/calendar.svg b/assets/icons/calendar.svg
deleted file mode 100644
index 8737a863..00000000
--- a/assets/icons/calendar.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
diff --git a/assets/icons/calendar@3x.png b/assets/icons/calendar@3x.png
new file mode 100644
index 00000000..ee9a7612
Binary files /dev/null and b/assets/icons/calendar@3x.png differ
diff --git a/assets/icons/calendar_padding.svg b/assets/icons/calendar_padding.svg
deleted file mode 100644
index a0827c1b..00000000
--- a/assets/icons/calendar_padding.svg
+++ /dev/null
@@ -1,12 +0,0 @@
-
diff --git a/assets/icons/calendar_padding@3x.png b/assets/icons/calendar_padding@3x.png
new file mode 100644
index 00000000..c4975035
Binary files /dev/null and b/assets/icons/calendar_padding@3x.png differ
diff --git a/assets/icons/home.svg b/assets/icons/home.svg
deleted file mode 100644
index 7bd1e919..00000000
--- a/assets/icons/home.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
diff --git a/assets/icons/home@3x.png b/assets/icons/home@3x.png
new file mode 100644
index 00000000..e3954198
Binary files /dev/null and b/assets/icons/home@3x.png differ
diff --git a/assets/icons/home_padding.svg b/assets/icons/home_padding.svg
deleted file mode 100644
index 76495319..00000000
--- a/assets/icons/home_padding.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-
diff --git a/assets/icons/home_padding@3x.png b/assets/icons/home_padding@3x.png
new file mode 100644
index 00000000..8aeae1b6
Binary files /dev/null and b/assets/icons/home_padding@3x.png differ
diff --git a/assets/icons/location.svg b/assets/icons/location.svg
deleted file mode 100644
index 779b0c71..00000000
--- a/assets/icons/location.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
diff --git a/assets/icons/news.svg b/assets/icons/news.svg
deleted file mode 100644
index e6941bac..00000000
--- a/assets/icons/news.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
diff --git a/assets/icons/news_padding.svg b/assets/icons/news_padding.svg
deleted file mode 100644
index e6a4ce82..00000000
--- a/assets/icons/news_padding.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
diff --git a/assets/icons/newspaper@3x.png b/assets/icons/newspaper@3x.png
new file mode 100644
index 00000000..96373aa2
Binary files /dev/null and b/assets/icons/newspaper@3x.png differ
diff --git a/assets/icons/newspaper_padding@3x.png b/assets/icons/newspaper_padding@3x.png
new file mode 100644
index 00000000..0d250bb7
Binary files /dev/null and b/assets/icons/newspaper_padding@3x.png differ
diff --git a/assets/icons/pie@3x.png b/assets/icons/pie@3x.png
new file mode 100644
index 00000000..c175cf99
Binary files /dev/null and b/assets/icons/pie@3x.png differ
diff --git a/assets/icons/pie_padding@3x.png b/assets/icons/pie_padding@3x.png
new file mode 100644
index 00000000..36ce57f7
Binary files /dev/null and b/assets/icons/pie_padding@3x.png differ
diff --git a/assets/icons/profile.svg b/assets/icons/profile.svg
deleted file mode 100644
index 6e382b72..00000000
--- a/assets/icons/profile.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-
diff --git a/assets/icons/profile_padding.svg b/assets/icons/profile_padding.svg
deleted file mode 100644
index 43a9173e..00000000
--- a/assets/icons/profile_padding.svg
+++ /dev/null
@@ -1,11 +0,0 @@
-
diff --git a/assets/icons/results.svg b/assets/icons/results.svg
deleted file mode 100644
index 8ca48cec..00000000
--- a/assets/icons/results.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
diff --git a/assets/icons/results_padding.svg b/assets/icons/results_padding.svg
deleted file mode 100644
index cf8f1b17..00000000
--- a/assets/icons/results_padding.svg
+++ /dev/null
@@ -1,11 +0,0 @@
-
diff --git a/assets/icons/tasks.svg b/assets/icons/tasks.svg
deleted file mode 100644
index 081befd1..00000000
--- a/assets/icons/tasks.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
diff --git a/assets/icons/tasks@3x.png b/assets/icons/tasks@3x.png
new file mode 100644
index 00000000..ed1dbb6b
Binary files /dev/null and b/assets/icons/tasks@3x.png differ
diff --git a/assets/icons/tasks_padding.svg b/assets/icons/tasks_padding.svg
deleted file mode 100644
index b9e58f07..00000000
--- a/assets/icons/tasks_padding.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-
diff --git a/assets/icons/tasks_padding@3x.png b/assets/icons/tasks_padding@3x.png
new file mode 100644
index 00000000..6950f3f5
Binary files /dev/null and b/assets/icons/tasks_padding@3x.png differ
diff --git a/components/AndroidHeaderBackground.tsx b/components/AndroidHeaderBackground.tsx
new file mode 100644
index 00000000..47c79275
--- /dev/null
+++ b/components/AndroidHeaderBackground.tsx
@@ -0,0 +1,15 @@
+import { useTheme } from "@react-navigation/native";
+import { Platform, PlatformColor, View } from "react-native";
+
+export default function AndroidHeaderBackground() {
+ if(Platform.OS !== "android") return null;
+ const theme = useTheme();
+ return (
+
+ )
+}
+
+export const AndroidHeaderProps = {
+ headerBackVisible: Platform.select({ android: false, default: true }),
+ headerBackground: AndroidHeaderBackground
+}
diff --git a/components/AppProviders.tsx b/components/AppProviders.tsx
index afeb85e8..d15669bf 100644
--- a/components/AppProviders.tsx
+++ b/components/AppProviders.tsx
@@ -1,15 +1,15 @@
import { ThemeProvider } from '@react-navigation/native';
import * as SystemUI from 'expo-system-ui';
import React, { useEffect, useMemo } from 'react';
-import { useColorScheme } from 'react-native';
+import { Platform, useColorScheme } from 'react-native';
import { GestureHandlerRootView } from 'react-native-gesture-handler';
import { DatabaseProvider } from "@/database/DatabaseProvider";
-import { useSettingsStore } from '@/stores/settings';
+import { DEFAULT_MATERIAL_YOU_ENABLED, useSettingsStore } from '@/stores/settings';
import { AlertProvider } from '@/ui/components/AlertProvider';
import { runsIOS26 } from '@/ui/utils/IsLiquidGlass';
import { AppColors } from "@/utils/colors";
-import { DarkTheme, DefaultTheme } from '@/utils/theme/Theme';
+import { createDarkTheme, createDefaultTheme } from '@/utils/theme/Theme';
interface AppProvidersProps {
children: React.ReactNode;
@@ -19,6 +19,7 @@ export function AppProviders({ children }: AppProvidersProps) {
const colorScheme = useColorScheme();
const selectedTheme = useSettingsStore(state => state.personalization.theme);
const selectedColorEnum = useSettingsStore(state => state.personalization.colorSelected);
+ const useMaterialYou = useSettingsStore(state => state.personalization.useMaterialYou) ?? DEFAULT_MATERIAL_YOU_ENABLED;
const color = useMemo(() => {
const color = selectedColorEnum !== null ? AppColors.find(appColor => appColor.colorEnum === selectedColorEnum) : null;
@@ -27,15 +28,11 @@ export function AppProviders({ children }: AppProvidersProps) {
// Memoize theme selection to prevent unnecessary re-computations
const theme = useMemo(() => {
- const newScheme = selectedTheme === 'auto' ? (colorScheme === 'dark' ? DarkTheme : DefaultTheme) : (selectedTheme === 'dark' ? DarkTheme : DefaultTheme);
- return {
- ...newScheme,
- colors: {
- ...newScheme.colors,
- primary: color?.mainColor ?? newScheme.colors.primary,
- },
- };
- }, [colorScheme, color, selectedTheme]);
+ const defaultTheme = createDefaultTheme(useMaterialYou, color.mainColor);
+ const darkTheme = createDarkTheme(useMaterialYou, color.mainColor);
+ const newScheme = selectedTheme === 'auto' ? (colorScheme === 'dark' ? darkTheme : defaultTheme) : (selectedTheme === 'dark' ? darkTheme : defaultTheme);
+ return newScheme;
+ }, [colorScheme, color, selectedTheme, useMaterialYou]);
// Memoize background color to prevent string recreation
const backgroundColor = useMemo(() => {
diff --git a/components/BottomAccessory.tsx b/components/BottomAccessory.tsx
new file mode 100644
index 00000000..ffdec423
--- /dev/null
+++ b/components/BottomAccessory.tsx
@@ -0,0 +1,214 @@
+import { useTimetableWidgetData } from '@/app/(tabs)/index/hooks/useTimetableWidgetData';
+import Icon from '@/ui/components/Icon';
+import Typography from '@/ui/new/Typography';
+import i18n from '@/utils/i18n';
+import { getSubjectColor } from '@/utils/subjects/colors';
+import { getSubjectEmoji } from '@/utils/subjects/emoji';
+import { getSubjectName } from '@/utils/subjects/name';
+import { Papicons } from '@getpapillon/papicons';
+import { useTheme } from '@react-navigation/native';
+import { formatDistanceToNowStrict } from 'date-fns';
+import * as DateLocale from 'date-fns/locale';
+import { useNavigation } from 'expo-router';
+import { NativeTabs } from 'expo-router/unstable-native-tabs';
+import React from 'react';
+import { ActivityIndicator, Platform, Pressable } from 'react-native';
+import { View } from 'react-native';
+import LinearGradient from 'react-native-linear-gradient';
+
+function NextCourseAccessory({ placement }) {
+ if (Platform.OS !== 'ios') {
+ return null;
+ }
+
+ const theme = useTheme();
+ const { courses, loading } = useTimetableWidgetData();
+ const nextCourse = courses.length > 0 ? courses[0] : null;
+
+ // if (placement === 'inline') {}
+
+ const sbjColor = nextCourse ? getSubjectColor(nextCourse.subject) : theme.colors.primary;
+ const navigation = useNavigation();
+
+ if(loading) {
+ return (
+
+
+
+ Chargement des cours...
+
+
+ )
+ }
+
+ if(!nextCourse) {
+ return (
+
+
+ Aucun cours à venir prochainement
+
+
+ )
+ }
+
+ return (
+ <>
+ {
+ navigation.navigate("(modals)/course", {
+ course: nextCourse,
+ subjectInfo: {
+ id: nextCourse.subject,
+ name: getSubjectName(nextCourse.subject),
+ color: getSubjectColor(nextCourse.subject) || theme.colors.primary,
+ emoji: getSubjectEmoji(nextCourse.subject),
+ },
+ });
+ }}
+ style={{
+ height: "100%",
+ paddingVertical: 10,
+ paddingHorizontal: 14,
+ alignItems: "center",
+ justifyContent: "start",
+ flexDirection: "row",
+ gap: 10,
+ }}
+ >
+
+
+ {getSubjectEmoji(nextCourse.subject)}
+
+
+
+ {getSubjectName(nextCourse?.subject)}
+
+
+ {placement === 'inline' ? (
+
+
+
+
+
+ {formatDistanceToNowStrict(nextCourse.from, {
+ locale: DateLocale[i18n.language as keyof typeof DateLocale] || DateLocale.enUS,
+ addSuffix: true
+ })}
+
+
+ ) : (
+
+
+
+
+
+ {nextCourse?.room}
+
+
+
+
+
+
+ {nextCourse?.teacher}
+
+
+ )}
+
+
+ {placement !== 'inline' && (
+
+
+
+
+
+ {formatDistanceToNowStrict(nextCourse.from, {
+ locale: DateLocale[i18n.language as keyof typeof DateLocale] || DateLocale.enUS,
+ addSuffix: false
+ })}
+
+
+ )}
+
+
+
+ >
+ );
+}
+
+export default function BottomAccessory() {
+ const placement = NativeTabs.BottomAccessory.usePlacement();
+
+ return (
+
+ );
+}
\ No newline at end of file
diff --git a/components/ModalOverhead.tsx b/components/ModalOverhead.tsx
index dfe3c029..71ce80bf 100644
--- a/components/ModalOverhead.tsx
+++ b/components/ModalOverhead.tsx
@@ -6,9 +6,9 @@ import { Papicons } from "@getpapillon/papicons";
import { useTheme } from "@react-navigation/native";
import { t } from "i18next";
import React from "react";
-import { Text, View, ViewStyle } from "react-native";
+import { Platform, Text, View, ViewStyle } from "react-native";
-const ModalOverhead = ({ style, overhead, overtitle, color, emoji, subject, subjectVariant = "title", title, date, dateFormat }: { style?: ViewStyle, overhead?: React.ReactNode, overtitle?: string, color: string, emoji: string, subject: string, subjectVariant?: Variant, title?: string, date?: Date, dateFormat?: Intl.DateTimeFormatOptions }) => {
+const ModalOverhead = ({ style, overhead, overtitle, color, emoji, subject, subjectVariant = "title", custom = false, title, date, dateFormat }: { style?: ViewStyle, overhead?: React.ReactNode, overtitle?: string, color: string, emoji: string, subject: string, subjectVariant?: Variant, title?: string, custom?: boolean, date?: Date, dateFormat?: Intl.DateTimeFormatOptions }) => {
const theme = useTheme();
return (
@@ -21,19 +21,19 @@ const ModalOverhead = ({ style, overhead, overtitle, color, emoji, subject, subj
>
{emoji}
@@ -50,15 +50,22 @@ const ModalOverhead = ({ style, overhead, overtitle, color, emoji, subject, subj
{overtitle}
)}
- {subject && (
-
- {subject}
-
- )}
+
+ {subject && (
+
+ {subject}
+
+ )}
+ {custom && (
+
+
+
+ )}
+
{title && (
{
+const ModalOverHeadScore = ({ color, score, outOf }: { color: string, score: string, outOf: number | string }) => {
const theme = useTheme();
return (
@@ -97,11 +104,11 @@ const ModalOverHeadScore = ({ color, score, outOf }: { color: string, score: str
{score}
- /{outOf}
+ {typeof outOf === "string" && outOf.startsWith("%") ? outOf : `/${outOf}`}
)
}
export default ModalOverhead;
-export { ModalOverHeadScore };
\ No newline at end of file
+export { ModalOverHeadScore };
diff --git a/components/RootNavigator.tsx b/components/RootNavigator.tsx
index 26bb0ce0..da826b22 100644
--- a/components/RootNavigator.tsx
+++ b/components/RootNavigator.tsx
@@ -2,7 +2,7 @@ import { useTheme } from '@react-navigation/native';
import { Stack } from 'expo-router';
import { t } from 'i18next';
import React, { useMemo } from 'react';
-import { Platform } from 'react-native';
+import { Platform, StatusBar, View } from 'react-native';
import {
AI_SCREEN_OPTIONS,
@@ -16,6 +16,7 @@ import {
import getCorners from '@/ui/utils/Corners';
import { runsIOS26 } from '@/ui/utils/IsLiquidGlass';
import { screenOptions } from '@/utils/theme/ScreenOptions';
+import AndroidHeaderBackground from './AndroidHeaderBackground';
export function RootNavigator() {
const theme = useTheme();
@@ -31,55 +32,50 @@ export function RootNavigator() {
}), [theme]);
return (
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+ {Platform.OS === "android" && }
+
- 2 ? corners - 2 : 0,
- overflow: "hidden"
- }
- }}
- />
+
+
+
+
+
+
+
+
+
+
+
+
-
+ 2 ? corners - 2 : 0,
+ overflow: "hidden"
+ }
+ }}
+ />
+
-
-
-
-
-
+
+
+
+
+
+
-
+
-
+
-
+
-
+
-
+
-
-
+
+
+
+
+
);
}
diff --git a/components/SettingsHeader.tsx b/components/SettingsHeader.tsx
index 865b2b13..0c2e8e8b 100644
--- a/components/SettingsHeader.tsx
+++ b/components/SettingsHeader.tsx
@@ -4,6 +4,7 @@ import { Image, ImageSourcePropType, View, Switch } from "react-native"
import Stack from "@/ui/components/Stack"
import Typography from "@/ui/components/Typography"
import Icon from "@/ui/components/Icon"
+import NativeSwitch from "@/ui/native/NativeSwitch"
interface SettingsHeaderProps {
color: string
@@ -70,10 +71,11 @@ export default function SettingsHeader({
hAlign="center"
vAlign="center"
style={{
- backgroundColor: colors.card,
+ backgroundColor: colors.item,
gap: 10,
padding: 18,
- borderRadius: 15
+ borderRadius: 15,
+ elevation: 2,
}}
>
{iconName && (
@@ -95,7 +97,7 @@ export default function SettingsHeader({
{switchLabel}
)}
- {
+ await record.destroyPermanently();
+ },
+ 10000,
+ "deleteHomeworkFromDatabase"
+ );
+ }
+}
+
export async function addHomeworkToDatabase(homeworks: SharedHomework[]) {
const db = getDatabaseInstance();
diff --git a/database/useNews.ts b/database/useNews.ts
index f1e7d5ef..76bd880c 100644
--- a/database/useNews.ts
+++ b/database/useNews.ts
@@ -67,6 +67,7 @@ export async function addNewsToDatabase(news: SharedNews[]) {
newsModel.author = item.author ?? "";
newsModel.category = item.category ?? "";
newsModel.createdByAccount = item.createdByAccount ?? "";
+ newsModel.question = item.question ?? false;
})
);
@@ -81,6 +82,7 @@ export async function addNewsToDatabase(news: SharedNews[]) {
newsModel.author = item.author ?? newsModel.author;
newsModel.category = item.category ?? newsModel.category;
newsModel.createdByAccount = item.createdByAccount ?? newsModel.createdByAccount;
+ newsModel.question = item.question ?? newsModel.question;
})
);
diff --git a/ios/Papillon.xcodeproj/project.pbxproj b/ios/Papillon.xcodeproj/project.pbxproj
index c8c8a5e1..84677a32 100644
--- a/ios/Papillon.xcodeproj/project.pbxproj
+++ b/ios/Papillon.xcodeproj/project.pbxproj
@@ -7,33 +7,33 @@
objects = {
/* Begin PBXBuildFile section */
+ 0B160EC3374D4EA5BA2E9D4B /* app.icon in Resources */ = {isa = PBXBuildFile; fileRef = 1BE7618F0BC84320A5EF7CFC /* app.icon */; };
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */; };
- 74CF32C38FD95F21B982D41D /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 8E862773668B5E8098E68DDF /* PrivacyInfo.xcprivacy */; };
- A6B5A563820C4DC18505125E /* app.icon in Resources */ = {isa = PBXBuildFile; fileRef = 9BBF599094D24F2887D278AC /* app.icon */; };
- AED6C375AF184A92B8DB4364 /* CoreML.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0585B1D72FE64E26AA1D9945 /* CoreML.framework */; };
+ 9582D3CA74EE46C2BFA92CBD /* CoreML.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D76A138BFD484DBCB2F86D5C /* CoreML.framework */; };
+ 9ECC80395B664F360D205A47 /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = F931DB99F45501E9274D6A9C /* ExpoModulesProvider.swift */; };
BB2F792D24A3F905000567C9 /* Expo.plist in Resources */ = {isa = PBXBuildFile; fileRef = BB2F792C24A3F905000567C9 /* Expo.plist */; };
- C1A6BE98CB9F1199462DC52B /* libPods-Papillon.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 77B97111AE7C44D0217C15A0 /* libPods-Papillon.a */; };
+ C9097EDCE967053E33D70A3D /* libPods-Papillon.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E5ADAEB8BFE69FA8267220BB /* libPods-Papillon.a */; };
+ D29B5E1C9FF5C74A84817383 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 07D75E7C8A1E0B8F3717516D /* PrivacyInfo.xcprivacy */; };
F11748422D0307B40044C1D9 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F11748412D0307B40044C1D9 /* AppDelegate.swift */; };
- F63186B676826DEDB7C57760 /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF3DF4E361E799EB67EEAE94 /* ExpoModulesProvider.swift */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
- 0585B1D72FE64E26AA1D9945 /* CoreML.framework */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = wrapper.framework; name = CoreML.framework; path = System/Library/Frameworks/CoreML.framework; sourceTree = SDKROOT; };
+ 07D75E7C8A1E0B8F3717516D /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = Papillon/PrivacyInfo.xcprivacy; sourceTree = ""; };
13B07F961A680F5B00A75B9A /* Papillon.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Papillon.app; sourceTree = BUILT_PRODUCTS_DIR; };
13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = Papillon/Images.xcassets; sourceTree = ""; };
13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Papillon/Info.plist; sourceTree = ""; };
- 77B97111AE7C44D0217C15A0 /* libPods-Papillon.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Papillon.a"; sourceTree = BUILT_PRODUCTS_DIR; };
- 8E862773668B5E8098E68DDF /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xml; name = PrivacyInfo.xcprivacy; path = Papillon/PrivacyInfo.xcprivacy; sourceTree = ""; };
- 902CF49917EA5420F53714A8 /* Pods-Papillon.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Papillon.debug.xcconfig"; path = "Target Support Files/Pods-Papillon/Pods-Papillon.debug.xcconfig"; sourceTree = ""; };
- 9BBF599094D24F2887D278AC /* app.icon */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = app.icon; path = Papillon/app.icon; sourceTree = ""; };
+ 1BE7618F0BC84320A5EF7CFC /* app.icon */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = unknown; name = app.icon; path = Papillon/app.icon; sourceTree = ""; };
AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = SplashScreen.storyboard; path = Papillon/SplashScreen.storyboard; sourceTree = ""; };
+ AC1D8C23D8D7C1EF2989D2C9 /* Pods-Papillon.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Papillon.debug.xcconfig"; path = "Target Support Files/Pods-Papillon/Pods-Papillon.debug.xcconfig"; sourceTree = ""; };
+ B16457CECC98212842A065BC /* Pods-Papillon.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Papillon.release.xcconfig"; path = "Target Support Files/Pods-Papillon/Pods-Papillon.release.xcconfig"; sourceTree = ""; };
BB2F792C24A3F905000567C9 /* Expo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Expo.plist; sourceTree = ""; };
- D200F4503F68C0F12146CE1A /* Pods-Papillon.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Papillon.release.xcconfig"; path = "Target Support Files/Pods-Papillon/Pods-Papillon.release.xcconfig"; sourceTree = ""; };
+ D76A138BFD484DBCB2F86D5C /* CoreML.framework */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = undefined; includeInIndex = 0; lastKnownFileType = wrapper.framework; name = CoreML.framework; path = System/Library/Frameworks/CoreML.framework; sourceTree = SDKROOT; };
+ E5ADAEB8BFE69FA8267220BB /* libPods-Papillon.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Papillon.a"; sourceTree = BUILT_PRODUCTS_DIR; };
ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };
- EF3DF4E361E799EB67EEAE94 /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-Papillon/ExpoModulesProvider.swift"; sourceTree = ""; };
F11748412D0307B40044C1D9 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = Papillon/AppDelegate.swift; sourceTree = ""; };
F11748442D0722820044C1D9 /* Papillon-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "Papillon-Bridging-Header.h"; path = "Papillon/Papillon-Bridging-Header.h"; sourceTree = ""; };
+ F931DB99F45501E9274D6A9C /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-Papillon/ExpoModulesProvider.swift"; sourceTree = ""; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -41,8 +41,8 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
- AED6C375AF184A92B8DB4364 /* CoreML.framework in Frameworks */,
- C1A6BE98CB9F1199462DC52B /* libPods-Papillon.a in Frameworks */,
+ 9582D3CA74EE46C2BFA92CBD /* CoreML.framework in Frameworks */,
+ C9097EDCE967053E33D70A3D /* libPods-Papillon.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -58,28 +58,28 @@
13B07FB51A68108700A75B9A /* Images.xcassets */,
13B07FB61A68108700A75B9A /* Info.plist */,
AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */,
- 8E862773668B5E8098E68DDF /* PrivacyInfo.xcprivacy */,
- 9BBF599094D24F2887D278AC /* app.icon */,
+ 1BE7618F0BC84320A5EF7CFC /* app.icon */,
+ 07D75E7C8A1E0B8F3717516D /* PrivacyInfo.xcprivacy */,
);
name = Papillon;
sourceTree = "";
};
- 232A2C7EE44EF8F745F8A243 /* Papillon */ = {
+ 2D16E6871FA4F8E400B85C8A /* Frameworks */ = {
isa = PBXGroup;
children = (
- EF3DF4E361E799EB67EEAE94 /* ExpoModulesProvider.swift */,
+ ED297162215061F000B7C4FE /* JavaScriptCore.framework */,
+ D76A138BFD484DBCB2F86D5C /* CoreML.framework */,
+ E5ADAEB8BFE69FA8267220BB /* libPods-Papillon.a */,
);
- name = Papillon;
+ name = Frameworks;
sourceTree = "";
};
- 2D16E6871FA4F8E400B85C8A /* Frameworks */ = {
+ 6D6D4D686F34946CD27F197E /* Papillon */ = {
isa = PBXGroup;
children = (
- ED297162215061F000B7C4FE /* JavaScriptCore.framework */,
- 0585B1D72FE64E26AA1D9945 /* CoreML.framework */,
- 77B97111AE7C44D0217C15A0 /* libPods-Papillon.a */,
+ F931DB99F45501E9274D6A9C /* ExpoModulesProvider.swift */,
);
- name = Frameworks;
+ name = Papillon;
sourceTree = "";
};
832341AE1AAA6A7D00B99B32 /* Libraries */ = {
@@ -96,8 +96,8 @@
832341AE1AAA6A7D00B99B32 /* Libraries */,
83CBBA001A601CBA00E9B192 /* Products */,
2D16E6871FA4F8E400B85C8A /* Frameworks */,
- FE3F6A4DECE3F0E54371608D /* ExpoModulesProviders */,
- AE1C41A52A335B49DF1D238C /* Pods */,
+ ABCDAE79ED37DEC29669111C /* Pods */,
+ B437BB89730A11B833F0E5D7 /* ExpoModulesProviders */,
);
indentWidth = 2;
sourceTree = "";
@@ -112,30 +112,31 @@
name = Products;
sourceTree = "";
};
- AE1C41A52A335B49DF1D238C /* Pods */ = {
+ ABCDAE79ED37DEC29669111C /* Pods */ = {
isa = PBXGroup;
children = (
- 902CF49917EA5420F53714A8 /* Pods-Papillon.debug.xcconfig */,
- D200F4503F68C0F12146CE1A /* Pods-Papillon.release.xcconfig */,
+ AC1D8C23D8D7C1EF2989D2C9 /* Pods-Papillon.debug.xcconfig */,
+ B16457CECC98212842A065BC /* Pods-Papillon.release.xcconfig */,
);
+ name = Pods;
path = Pods;
sourceTree = "";
};
- BB2F792B24A3F905000567C9 /* Supporting */ = {
+ B437BB89730A11B833F0E5D7 /* ExpoModulesProviders */ = {
isa = PBXGroup;
children = (
- BB2F792C24A3F905000567C9 /* Expo.plist */,
+ 6D6D4D686F34946CD27F197E /* Papillon */,
);
- name = Supporting;
- path = Papillon/Supporting;
+ name = ExpoModulesProviders;
sourceTree = "";
};
- FE3F6A4DECE3F0E54371608D /* ExpoModulesProviders */ = {
+ BB2F792B24A3F905000567C9 /* Supporting */ = {
isa = PBXGroup;
children = (
- 232A2C7EE44EF8F745F8A243 /* Papillon */,
+ BB2F792C24A3F905000567C9 /* Expo.plist */,
);
- name = ExpoModulesProviders;
+ name = Supporting;
+ path = Papillon/Supporting;
sourceTree = "";
};
/* End PBXGroup section */
@@ -145,14 +146,15 @@
isa = PBXNativeTarget;
buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "Papillon" */;
buildPhases = (
- 25487004FC11C99E1853EDF4 /* [CP] Check Pods Manifest.lock */,
- 88D44716F8834B864CD8FCF1 /* [Expo] Configure project */,
+ 08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */,
+ 66FE6A2F16170AAD4B7FE3C7 /* [Expo] Configure project */,
13B07F871A680F5B00A75B9A /* Sources */,
13B07F8C1A680F5B00A75B9A /* Frameworks */,
13B07F8E1A680F5B00A75B9A /* Resources */,
00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,
- D5ACE73AA8A8640014D94E9E /* [CP] Embed Pods Frameworks */,
- C44E6B61B39BB34670E5700F /* [CP] Copy Pods Resources */,
+ 800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */,
+ C91CF740DE644BB2AD11C6E1 /* [Expo Dev Launcher] Strip Local Network Keys for Release */,
+ 81CB76F0EF188EEECD9E2092 /* [CP] Embed Pods Frameworks */,
);
buildRules = (
);
@@ -178,16 +180,11 @@
};
buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "Papillon" */;
compatibilityVersion = "Xcode 3.2";
- developmentRegion = fr;
+ developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
- fr,
en,
- de,
- es,
- tr,
- br,
- "pt-PT",
+ Base,
);
mainGroup = 83CBB9F61A601CBA00E9B192;
productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;
@@ -207,8 +204,8 @@
BB2F792D24A3F905000567C9 /* Expo.plist in Resources */,
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,
3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */,
- 74CF32C38FD95F21B982D41D /* PrivacyInfo.xcprivacy in Resources */,
- A6B5A563820C4DC18505125E /* app.icon in Resources */,
+ 0B160EC3374D4EA5BA2E9D4B /* app.icon in Resources */,
+ D29B5E1C9FF5C74A84817383 /* PrivacyInfo.xcprivacy in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -232,7 +229,7 @@
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";
};
- 25487004FC11C99E1853EDF4 /* [CP] Check Pods Manifest.lock */ = {
+ 08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
@@ -254,7 +251,7 @@
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;
};
- 88D44716F8834B864CD8FCF1 /* [Expo] Configure project */ = {
+ 66FE6A2F16170AAD4B7FE3C7 /* [Expo] Configure project */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
@@ -278,7 +275,7 @@
shellPath = /bin/sh;
shellScript = "# This script configures Expo modules and generates the modules provider file.\nbash -l -c \"./Pods/Target\\ Support\\ Files/Pods-Papillon/expo-configure-project.sh\"\n";
};
- C44E6B61B39BB34670E5700F /* [CP] Copy Pods Resources */ = {
+ 800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
@@ -288,22 +285,19 @@
"${PODS_CONFIGURATION_BUILD_DIR}/EXApplication/ExpoApplication_privacy.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/EXConstants/EXConstants.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/EXConstants/ExpoConstants_privacy.bundle",
- "${PODS_CONFIGURATION_BUILD_DIR}/EXNotifications/ExpoNotifications_privacy.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/ExpoDevice/ExpoDevice_privacy.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/ExpoFileSystem/ExpoFileSystem_privacy.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/ExpoLocalization/ExpoLocalization_privacy.bundle",
+ "${PODS_CONFIGURATION_BUILD_DIR}/ExpoNotifications/ExpoNotifications_privacy.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/ExpoSystemUI/ExpoSystemUI_privacy.bundle",
- "${PODS_CONFIGURATION_BUILD_DIR}/RCT-Folly/RCT-Folly_privacy.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/RNSVG/RNSVGFilters.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}/SDWebImage/SDWebImage.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/TensorFlowLiteC/TensorFlowLiteC.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/TensorFlowLiteC/TensorFlowLiteCCoreML.bundle",
- "${PODS_CONFIGURATION_BUILD_DIR}/boost/boost_privacy.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/expo-dev-launcher/EXDevLauncher.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/expo-dev-menu/EXDevMenu.bundle",
- "${PODS_CONFIGURATION_BUILD_DIR}/glog/glog_privacy.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/lottie-ios/LottiePrivacyInfo.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/lottie-react-native/Lottie_React_Native_Privacy.bundle",
);
@@ -312,22 +306,19 @@
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoApplication_privacy.bundle",
"${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}/ExpoNotifications_privacy.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoDevice_privacy.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoFileSystem_privacy.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoLocalization_privacy.bundle",
+ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoNotifications_privacy.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoSystemUI_privacy.bundle",
- "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RCT-Folly_privacy.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNSVGFilters.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}/SDWebImage.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/TensorFlowLiteC.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/TensorFlowLiteCCoreML.bundle",
- "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/boost_privacy.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXDevLauncher.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXDevMenu.bundle",
- "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/glog_privacy.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/LottiePrivacyInfo.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Lottie_React_Native_Privacy.bundle",
);
@@ -336,24 +327,42 @@
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Papillon/Pods-Papillon-resources.sh\"\n";
showEnvVarsInLog = 0;
};
- D5ACE73AA8A8640014D94E9E /* [CP] Embed Pods Frameworks */ = {
+ 81CB76F0EF188EEECD9E2092 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Papillon/Pods-Papillon-frameworks.sh",
- "${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes",
+ "${PODS_XCFRAMEWORKS_BUILD_DIR}/React-Core-prebuilt/React.framework/React",
+ "${PODS_XCFRAMEWORKS_BUILD_DIR}/ReactNativeDependencies/ReactNativeDependencies.framework/ReactNativeDependencies",
+ "${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermesvm.framework/hermesvm",
);
name = "[CP] Embed Pods Frameworks";
outputPaths = (
- "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework",
+ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/React.framework",
+ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ReactNativeDependencies.framework",
+ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermesvm.framework",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Papillon/Pods-Papillon-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
+ C91CF740DE644BB2AD11C6E1 /* [Expo Dev Launcher] Strip Local Network Keys for Release */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "[Expo Dev Launcher] Strip Local Network Keys for Release";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "# Strip dev-launcher-specific local network permission keys from non-Debug builds\n# This only removes _expo._tcp Bonjour services and the dev-launcher usage description.\n# Other Bonjour services and custom descriptions are preserved for production use.\n\nif [ \"$CONFIGURATION\" != \"Debug\" ]; then\n PLIST_PATH=\"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}\"\n if [ -f \"$PLIST_PATH\" ]; then\n # Check if NSBonjourServices exists\n if /usr/libexec/PlistBuddy -c \"Print :NSBonjourServices\" \"$PLIST_PATH\" >/dev/null 2>&1; then\n # Get the count of services\n COUNT=$(/usr/libexec/PlistBuddy -c \"Print :NSBonjourServices\" \"$PLIST_PATH\" 2>/dev/null | grep \"^ \" | wc -l | tr -d ' ')\n\n # Remove _expo._tcp\n for ((i=COUNT-1; i>=0; i--)); do\n SERVICE=$(/usr/libexec/PlistBuddy -c \"Print :NSBonjourServices:$i\" \"$PLIST_PATH\" 2>/dev/null || echo \"\")\n if echo \"$SERVICE\" | grep -q \"_expo._tcp\"; then\n /usr/libexec/PlistBuddy -c \"Delete :NSBonjourServices:$i\" \"$PLIST_PATH\" 2>/dev/null || true\n fi\n done\n\n # If the array is now empty, remove it entirely\n REMAINING=$(/usr/libexec/PlistBuddy -c \"Print :NSBonjourServices\" \"$PLIST_PATH\" 2>/dev/null | grep \"^ \" | wc -l | tr -d ' ')\n if [ \"$REMAINING\" -eq \"0\" ]; then\n /usr/libexec/PlistBuddy -c \"Delete :NSBonjourServices\" \"$PLIST_PATH\" 2>/dev/null || true\n fi\n fi\n\n # Only delete the description if it matches the dev-launcher default text\n DESC=$(/usr/libexec/PlistBuddy -c \"Print :NSLocalNetworkUsageDescription\" \"$PLIST_PATH\" 2>/dev/null || echo \"\")\n if echo \"$DESC\" | grep -q \"Expo Dev Launcher\"; then\n /usr/libexec/PlistBuddy -c \"Delete :NSLocalNetworkUsageDescription\" \"$PLIST_PATH\" 2>/dev/null || true\n fi\n fi\nfi\n";
+ };
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
@@ -362,7 +371,7 @@
buildActionMask = 2147483647;
files = (
F11748422D0307B40044C1D9 /* AppDelegate.swift in Sources */,
- F63186B676826DEDB7C57760 /* ExpoModulesProvider.swift in Sources */,
+ 9ECC80395B664F360D205A47 /* ExpoModulesProvider.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -371,20 +380,19 @@
/* Begin XCBuildConfiguration section */
13B07F941A680F5B00A75B9A /* Debug */ = {
isa = XCBuildConfiguration;
- baseConfigurationReference = 902CF49917EA5420F53714A8 /* Pods-Papillon.debug.xcconfig */;
+ baseConfigurationReference = AC1D8C23D8D7C1EF2989D2C9 /* Pods-Papillon.debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = app;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Papillon/Papillon.entitlements;
CURRENT_PROJECT_VERSION = 1;
- DEVELOPMENT_TEAM = 7RXNP6V83P;
ENABLE_BITCODE = NO;
GCC_PREPROCESSOR_DEFINITIONS = (
"$(inherited)",
"FB_SONARKIT_ENABLED=1",
);
INFOPLIST_FILE = Papillon/Info.plist;
- IPHONEOS_DEPLOYMENT_TARGET = 17.6;
+ IPHONEOS_DEPLOYMENT_TARGET = 15.1;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@@ -408,15 +416,14 @@
};
13B07F951A680F5B00A75B9A /* Release */ = {
isa = XCBuildConfiguration;
- baseConfigurationReference = D200F4503F68C0F12146CE1A /* Pods-Papillon.release.xcconfig */;
+ baseConfigurationReference = B16457CECC98212842A065BC /* Pods-Papillon.release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = app;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Papillon/Papillon.entitlements;
CURRENT_PROJECT_VERSION = 1;
- DEVELOPMENT_TEAM = 7RXNP6V83P;
INFOPLIST_FILE = Papillon/Info.plist;
- IPHONEOS_DEPLOYMENT_TARGET = 17.6;
+ IPHONEOS_DEPLOYMENT_TARGET = 15.1;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@@ -441,7 +448,6 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
- ASSETCATALOG_COMPILER_APPICON_NAME = app;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_CXX_LANGUAGE_STANDARD = "c++20";
CLANG_CXX_LIBRARY = "libc++";
@@ -485,26 +491,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- HEADER_SEARCH_PATHS = (
- "$(inherited)",
- "${PODS_ROOT}/ReactCommon",
- "${PODS_ROOT}/ReactCommon/react/nativemodule/core",
- "${PODS_ROOT}/ReactCommon-Samples",
- "${PODS_ROOT}/ReactCommon-Samples/platform/ios",
- "${PODS_ROOT}/React-Fabric/react/renderer/components/view/platform/cxx",
- "${PODS_ROOT}/React-NativeModulesApple",
- "${PODS_ROOT}/React-graphics",
- "${PODS_ROOT}/React-graphics/react/renderer/graphics/platform/ios",
- "${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon/ReactCommon.framework/Headers",
- "${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon/ReactCommon.framework/Headers/react/nativemodule/core",
- "${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon-Samples/ReactCommon_Samples.framework/Headers",
- "${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon-Samples/ReactCommon_Samples.framework/Headers/platform/ios",
- "${PODS_CONFIGURATION_BUILD_DIR}/React-Fabric/React_Fabric.framework/Headers/react/renderer/components/view/platform/cxx",
- "${PODS_CONFIGURATION_BUILD_DIR}/React-NativeModulesApple/React_NativeModulesApple.framework/Headers",
- "${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers",
- "${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers/react/renderer/graphics/platform/ios",
- );
- IPHONEOS_DEPLOYMENT_TARGET = 17.6;
+ IPHONEOS_DEPLOYMENT_TARGET = 15.1;
LD_RUNPATH_SEARCH_PATHS = (
/usr/lib/swift,
"$(inherited)",
@@ -512,13 +499,12 @@
LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift\"$(inherited)\"";
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
- OTHER_LDFLAGS = (
- "$(inherited)",
- " ",
- );
+ OTHER_CFLAGS = "$(inherited)";
+ OTHER_CPLUSPLUSFLAGS = "$(inherited)";
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
SDKROOT = iphoneos;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG";
+ SWIFT_ENABLE_EXPLICIT_MODULES = NO;
USE_HERMES = true;
};
name = Debug;
@@ -527,7 +513,6 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
- ASSETCATALOG_COMPILER_APPICON_NAME = app;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_CXX_LANGUAGE_STANDARD = "c++20";
CLANG_CXX_LIBRARY = "libc++";
@@ -564,38 +549,18 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- HEADER_SEARCH_PATHS = (
- "$(inherited)",
- "${PODS_ROOT}/ReactCommon",
- "${PODS_ROOT}/ReactCommon/react/nativemodule/core",
- "${PODS_ROOT}/ReactCommon-Samples",
- "${PODS_ROOT}/ReactCommon-Samples/platform/ios",
- "${PODS_ROOT}/React-Fabric/react/renderer/components/view/platform/cxx",
- "${PODS_ROOT}/React-NativeModulesApple",
- "${PODS_ROOT}/React-graphics",
- "${PODS_ROOT}/React-graphics/react/renderer/graphics/platform/ios",
- "${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon/ReactCommon.framework/Headers",
- "${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon/ReactCommon.framework/Headers/react/nativemodule/core",
- "${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon-Samples/ReactCommon_Samples.framework/Headers",
- "${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon-Samples/ReactCommon_Samples.framework/Headers/platform/ios",
- "${PODS_CONFIGURATION_BUILD_DIR}/React-Fabric/React_Fabric.framework/Headers/react/renderer/components/view/platform/cxx",
- "${PODS_CONFIGURATION_BUILD_DIR}/React-NativeModulesApple/React_NativeModulesApple.framework/Headers",
- "${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers",
- "${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers/react/renderer/graphics/platform/ios",
- );
- IPHONEOS_DEPLOYMENT_TARGET = 17.6;
+ 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)",
- " ",
- );
+ OTHER_CFLAGS = "$(inherited)";
+ OTHER_CPLUSPLUSFLAGS = "$(inherited)";
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
SDKROOT = iphoneos;
+ SWIFT_ENABLE_EXPLICIT_MODULES = NO;
USE_HERMES = true;
VALIDATE_PRODUCT = YES;
};
diff --git a/ios/Papillon/AppDelegate.swift b/ios/Papillon/AppDelegate.swift
index a7887e1e..9670a1ff 100644
--- a/ios/Papillon/AppDelegate.swift
+++ b/ios/Papillon/AppDelegate.swift
@@ -1,9 +1,9 @@
-import Expo
+internal import Expo
import React
import ReactAppDependencyProvider
-@UIApplicationMain
-public class AppDelegate: ExpoAppDelegate {
+@main
+class AppDelegate: ExpoAppDelegate {
var window: UIWindow?
var reactNativeDelegate: ExpoReactNativeFactoryDelegate?
@@ -19,7 +19,6 @@ public class AppDelegate: ExpoAppDelegate {
reactNativeDelegate = delegate
reactNativeFactory = factory
- bindReactNativeFactory(factory)
#if os(iOS) || os(tvOS)
window = UIWindow(frame: UIScreen.main.bounds)
diff --git a/ios/Papillon/Images.xcassets/AppIcon.appiconset/App-Icon-1024x1024@1x.png b/ios/Papillon/Images.xcassets/AppIcon.appiconset/App-Icon-1024x1024@1x.png
deleted file mode 100644
index c79580e3..00000000
Binary files a/ios/Papillon/Images.xcassets/AppIcon.appiconset/App-Icon-1024x1024@1x.png and /dev/null differ
diff --git a/ios/Papillon/Images.xcassets/AppIcon.appiconset/Contents.json b/ios/Papillon/Images.xcassets/AppIcon.appiconset/Contents.json
index 90d8d4c2..b93b7b2b 100644
--- a/ios/Papillon/Images.xcassets/AppIcon.appiconset/Contents.json
+++ b/ios/Papillon/Images.xcassets/AppIcon.appiconset/Contents.json
@@ -1,14 +1,13 @@
{
- "images": [
+ "images" : [
{
- "filename": "App-Icon-1024x1024@1x.png",
- "idiom": "universal",
- "platform": "ios",
- "size": "1024x1024"
+ "idiom" : "universal",
+ "platform" : "ios",
+ "size" : "1024x1024"
}
],
- "info": {
- "version": 1,
- "author": "expo"
+ "info" : {
+ "version" : 1,
+ "author" : "expo"
}
}
\ No newline at end of file
diff --git a/ios/Papillon/Images.xcassets/Contents.json b/ios/Papillon/Images.xcassets/Contents.json
index 73c00596..ed285c2e 100644
--- a/ios/Papillon/Images.xcassets/Contents.json
+++ b/ios/Papillon/Images.xcassets/Contents.json
@@ -1,6 +1,6 @@
{
"info" : {
- "author" : "xcode",
- "version" : 1
+ "version" : 1,
+ "author" : "expo"
}
}
diff --git a/ios/Papillon/Images.xcassets/SplashScreenLogo.imageset/Contents.json b/ios/Papillon/Images.xcassets/SplashScreenLogo.imageset/Contents.json
deleted file mode 100644
index f65c008b..00000000
--- a/ios/Papillon/Images.xcassets/SplashScreenLogo.imageset/Contents.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "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/ios/Papillon/Images.xcassets/SplashScreenLogo.imageset/image.png b/ios/Papillon/Images.xcassets/SplashScreenLogo.imageset/image.png
deleted file mode 100644
index cd423a1e..00000000
Binary files a/ios/Papillon/Images.xcassets/SplashScreenLogo.imageset/image.png and /dev/null differ
diff --git a/ios/Papillon/Images.xcassets/SplashScreenLogo.imageset/image@2x.png b/ios/Papillon/Images.xcassets/SplashScreenLogo.imageset/image@2x.png
deleted file mode 100644
index cd423a1e..00000000
Binary files a/ios/Papillon/Images.xcassets/SplashScreenLogo.imageset/image@2x.png and /dev/null differ
diff --git a/ios/Papillon/Images.xcassets/SplashScreenLogo.imageset/image@3x.png b/ios/Papillon/Images.xcassets/SplashScreenLogo.imageset/image@3x.png
deleted file mode 100644
index cd423a1e..00000000
Binary files a/ios/Papillon/Images.xcassets/SplashScreenLogo.imageset/image@3x.png and /dev/null differ
diff --git a/ios/Papillon/Info.plist b/ios/Papillon/Info.plist
index 5fd2a417..02dd92ff 100644
--- a/ios/Papillon/Info.plist
+++ b/ios/Papillon/Info.plist
@@ -61,7 +61,7 @@
CFBundlePackageType
$(PRODUCT_BUNDLE_PACKAGE_TYPE)
CFBundleShortVersionString
- 8.4.0
+ 8.4.1
CFBundleSignature
????
CFBundleURLTypes
@@ -101,10 +101,16 @@
NSAllowsLocalNetworking
+ NSBonjourServices
+
+ _expo._tcp
+
NSCameraUsageDescription
Allow $(PRODUCT_NAME) to access your camera
NSFaceIDUsageDescription
Allow $(PRODUCT_NAME) to access your Face ID biometric data.
+ NSLocalNetworkUsageDescription
+ Expo Dev Launcher uses the local network to discover and connect to development servers running on your computer.
NSLocationAlwaysAndWhenInUseUsageDescription
Allow $(PRODUCT_NAME) to access your location
NSLocationAlwaysUsageDescription
@@ -121,6 +127,10 @@
RCTNewArchEnabled
+ UIBackgroundModes
+
+ audio
+
UILaunchStoryboardName
SplashScreen
UIRequiredDeviceCapabilities
diff --git a/ios/Papillon/SplashScreen.storyboard b/ios/Papillon/SplashScreen.storyboard
index 8107f75a..9e730cef 100644
--- a/ios/Papillon/SplashScreen.storyboard
+++ b/ios/Papillon/SplashScreen.storyboard
@@ -1,11 +1,12 @@
-
+
-
+
+
@@ -37,6 +38,9 @@
+
+
+
diff --git a/ios/Podfile b/ios/Podfile
index 33e6d2e3..e0ae8db2 100644
--- a/ios/Podfile
+++ b/ios/Podfile
@@ -1,17 +1,28 @@
$EnableCoreMLDelegate=true
$EnableCoreMLDelegate=true
+# Set by expo-router. This enables Fabric-only features from react-native-screens
+ENV['RNS_GAMMA_ENABLED'] ||= '1'
+ENV['EXPO_UNSTABLE_LOG_BOX'] ||= '1'
+$EnableCoreMLDelegate=true
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'] = '0' if podfile_properties['newArchEnabled'] == 'false'
-ENV['EX_DEV_CLIENT_NETWORK_INSPECTOR'] = podfile_properties['EX_DEV_CLIENT_NETWORK_INSPECTOR']
+def ccache_enabled?(podfile_properties)
+ # Environment variable takes precedence
+ return ENV['USE_CCACHE'] == '1' if ENV['USE_CCACHE']
+
+ # Fall back to Podfile properties
+ podfile_properties['apple.ccacheEnabled'] == 'true'
+end
+ENV['EX_DEV_CLIENT_NETWORK_INSPECTOR'] ||= podfile_properties['EX_DEV_CLIENT_NETWORK_INSPECTOR']
+ENV['RCT_USE_RN_DEP'] ||= '1' if podfile_properties['ios.buildReactNativeFromSource'] != 'true'
+ENV['RCT_USE_PREBUILT_RNCORE'] ||= '1' if podfile_properties['ios.buildReactNativeFromSource'] != 'true'
+ENV['RCT_HERMES_V1_ENABLED'] ||= '1' if podfile_properties['expo.useHermesV1'] == 'true'
platform :ios, podfile_properties['ios.deploymentTarget'] || '15.1'
-install! 'cocoapods',
- :deterministic_uuids => false
prepare_react_native_project!
@@ -22,7 +33,10 @@ target 'Papillon' do
config_command = ['node', '-e', "process.argv=['', '', 'config'];require('@react-native-community/cli').run()"];
else
config_command = [
- 'npx',
+ 'node',
+ '--no-warnings',
+ '--eval',
+ 'require(\'expo/bin/autolinking\')',
'expo-modules-autolinking',
'react-native-config',
'--json',
@@ -36,6 +50,9 @@ target 'Papillon' do
# WatermelonDB dependency
pod 'simdjson', path: '../node_modules/@nozbe/simdjson', modular_headers: true
+ 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',
@@ -45,10 +62,6 @@ target 'Papillon' do
)
post_install do |installer|
- installer.pods_project.build_configurations.each do |config|
- config.build_settings["CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES"] = true
- end
-
# Workaround for Xcode 26: newer Apple Clang breaks consteval in fmt 11.0.2.
# Patch base.h to disable consteval since the header doesn't check for pre-defined FMT_USE_CONSTEVAL.
# TODO : Remove when expo have been updated
@@ -73,18 +86,7 @@ target 'Papillon' do
installer,
config[:reactNativePath],
:mac_catalyst_enabled => false,
- :ccache_enabled => podfile_properties['apple.ccacheEnabled'] == 'true',
+ :ccache_enabled => ccache_enabled?(podfile_properties),
)
-
- # 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
\ No newline at end of file
+end
diff --git a/locales/en.json b/locales/en.json
index 3809338c..1c473033 100644
--- a/locales/en.json
+++ b/locales/en.json
@@ -1,6 +1,7 @@
{
"Global_Back": "Back",
"Global_DatePrefix": "on",
+ "Global_Recommended": "Recommended",
"Tab_Home": "Home",
"Tab_Calendar": "Timetable",
"Tab_Tasks": "Tasks",
@@ -196,6 +197,7 @@
"Home_Widget_NewHomeworks": "To do",
"Home_Widget_NoCourses": "No upcoming classes",
"Home_Widget_NoCourses_Description": "There are no classes scheduled for today.",
+ "Home_Widget_Grades_Average": "Average",
"Home_Cards_Button_Title": "Cards",
"Home_Cards_Button_Description_None": "No cards",
"Home_Cards_Button_Description_Singular": "One card",
@@ -331,9 +333,17 @@
"News_Theme_Reading_Description": "A theme designed for reading",
"Attendance_Hours_Missed": "Hours missed",
"Attendance_Hours_Unjustified": "Unjustified hours",
+ "Attendance_Hours_Unjustified_Value": "{{duration}} unjustified",
"Attendance_Missing": "Absences",
"Attendance_Delays": "Delays",
"Attendance_NoReason": "No reason",
+ "Attendance_Duration_Minutes": "{{value}} min",
+ "Attendance_Duration_HoursMinutes_Detailed": "{{hours}} h {{minutes}} min",
+ "Attendance_Duration_HoursMinutes_Compact": "{{hours}}h{{minutes}}",
+ "Attendance_Unjustified_Description": "Remember to justify your absences and delays with your school office or institution.",
+ "Attendance_NoUnjustified_Title": "No unjustified hours",
+ "Attendance_NoUnjustified_Description": "Well done! Papillon did not find any unjustified hours for this period.",
+ "Attendance_InvalidPeriod": "Invalid period",
"Attendance_NoEvent_Title": "No event",
"Attendance_NoEvent_Description": "No absences or delays recorded for this period.",
"Settings_Account_Title": "My account",
@@ -374,6 +384,8 @@
"Settings_Personalization_Accent": "Accent color",
"Settings_Personalization_Accent_Description": "The color you choose here will apply to Papillon’s home page.",
"Settings_Personalization_Theme": "Theme",
+ "Settings_Personalization_MaterialYou_Title": "Use Material You (Beta)",
+ "Settings_Personalization_MaterialYou_Description": "Use Android dynamic system colors.",
"Settings_Personalization_Icon_Title": "Change icon",
"Settings_Personalization_Icon_Description": "Customize the app icon",
"Settings_Personalization_Subject_Title": "Customize subjects",
@@ -389,6 +401,9 @@
"Settings_About_Issue": "Report a bug",
"Settings_About_Issue_Description": "Report a bug encountered",
"Settings_About_Dependency_Version": "Dependency Version",
+ "Settings_Preferences": "Features",
+ "Settings_More": "About",
+ "Settings_About": "You and Papillon",
"Alert_No_Technical": "No technical information available.",
"Alert_Auth_Error": "Authentication error",
"Alert_Auth_Bad_Creds": "The credentials you entered are incorrect or you are trying to log in with a parent account. This type of account is not yet supported by Papillon.",
@@ -448,6 +463,10 @@
"Task_Undone": "Undone",
"Task_Done": "Done",
"Modal_Wallpaper_Title": "Customize wallpaper",
+ "Modal_Wallpaper_Clear": "Clear wallpaper",
+ "Modal_Wallpaper_Downloads": "Downloads",
+ "Modal_Wallpaper_Downloads_Size": "Download size",
+ "Modal_Wallpaper_ClearDownloads": "Clear downloads",
"Modal_Profile_Title": "Customize profile",
"Modal_Task_Status": "Assignment status",
"Modal_Task_Description": "Assignment description",
@@ -490,5 +509,22 @@
"Transport_Error_Cant_Open_Deeplink_Description": "Make sure the app is installed on your device, then try again.",
"Settings_Transport_Localisation_Needed": "Papillon needs your location",
"Settings_Transport_Localisation_Needed_Description": "To use transport features, Papillon needs access to your location to provide accurate transit information.",
- "Settings_Transport_Localisation_Request": "Enable location"
+ "Settings_Transport_Localisation_Request": "Enable location",
+ "Settings_Personalization_Emoji_Picker_Title": "Emoji selector",
+ "Settings_Personalization_Emoji_Picker_SetEmoji": "Select",
+ "Home_Add_Profile": "Ajouter un profil",
+ "Home_Edit_Profile": "Modifier mon profil",
+ "Modal_Soon": "Bientôt disponible",
+ "Modal_Task_Title": "Détail de la tâche",
+ "Profile_Cards_Loading_History": "Chargement de l\"historique des transactions",
+ "Profile_Cards_Loading_History_Description": "Cela peut prendre un moment...",
+ "Profile_QRCards_Subtitle": "{{count}} carte(s)",
+ "Settings_About_Contributors": "Contributeurs",
+ "Settings_About_Contributors_Description": "Voir les contributeurs GitHub",
+ "Settings_Accounts_Description": "Comptes, cantine...",
+ "Settings_Accounts_Title": "Comptes liés",
+ "Settings_Dev": "Développement",
+ "Settings_Personalization_Subject_Title_Card": "Matières",
+ "Settings_Tabs_Description": "Masquer des onglets du menu",
+ "Settings_Tabs_Title": "Onglets"
}
diff --git a/locales/fr.json b/locales/fr.json
index 6202bbef..ab8d517f 100644
--- a/locales/fr.json
+++ b/locales/fr.json
@@ -1,7 +1,7 @@
{
"Global_Back": "Retour",
"Global_DatePrefix": "le",
-
+ "Global_Recommended": "Recommandé",
"Tab_Home": "Accueil",
"Tab_Calendar": "Cours",
"Tab_Tasks": "Tâches",
@@ -16,7 +16,7 @@
"Tab_Page": "Page",
"Tab_Settings": "Paramètres",
"Tab_News": "Actualités",
-
+ "Modal_Soon": "Bientôt disponible",
"ONBOARDING_MAIN_TITLE": "L'application pour gérer ta vie scolaire",
"ONBOARDING_MAIN_DESCRIPTION": "Connecte tes applications scolaires pour accéder à tes notes, cours, devoirs et bien plus dans l'interface Papillon !",
"ONBOARDING_START_BTN": "Commencer",
@@ -126,7 +126,6 @@
"ONBOARDING_SERVICE_ARD": "ARD",
"ONBOARDING_SERVICE_IZLY": "Izly",
"ONBOARDING_SERVICE_ALISE": "Alise",
-
"WAITING": "En attente",
"IZLY_SMS_SEND": "Tu viens de recevoir un lien pour te connecter, clique dessus et suis les étapes.",
"STEP": "Étape",
@@ -141,27 +140,20 @@
"LOGIN_BTN": "Se connecter",
"CONFIRM_BTN": "Confirmer",
"CANCEL_BTN": "Annuler",
-
"Tab_New_Event": "Nouvel événement",
-
"Tab_Calendar_Icals": "Gestion des iCal",
"Tab_Calendar_Icals_Description": "Gérer tes URL iCal",
-
"Tab_Calendar_Icals_Add_URL": "Ajouter une URL iCal",
"Tab_Calendar_Icals_Manage_Title": "Gérer {{title}}",
"Tab_Calendar_Icals_Manage_Description": "Ajouter ou supprimer des URL iCal à synchroniser avec ton calendrier.",
"Tab_Calendar_Icals_Add_Title": "Titre manquant",
"Tab_Calendar_Icals_Add_Description": "Donne un nom à cette URL iCal pour l'ajouter.",
"Tab_Calendar_Icals_Empty": "Aucune URL iCal ajoutée",
-
"TabUnderConstruction_Title": "Cet onglet est en construction.",
"TabUnderConstruction_Details": "Reviens plus tard pour des mises à jour.",
-
"TabDevModeNotice_Title": "Mode Développement",
"TabDevModeNotice_Details": "Environnement de test complet pour les développeurs.",
-
"Alert_TechnicalDetails": "Détails techniques",
-
"Online_Course": "En ligne",
"Evaluated_Course": "Évaluation",
"Edited_Course": "Cours modifié",
@@ -169,36 +161,28 @@
"No_Course_Room": "Salle inconnue",
"Event_DeleteEvent": "Supprimer l'événement",
"Event_Confirm_DeleteEvent": "Es-tu sûr de vouloir supprimer cet événement ?",
-
"Course_Separator_Lunch_Default": "Pause méridienne",
"Course_Separator_Lunch_Alt_1": "Bon appétit !",
"Course_Separator_Lunch_Alt_2": "Miam !",
-
"Course_Separator_Morning_Default": "Pause matinale",
"Course_Separator_Morning_Alt_1": "Au dodo !",
"Course_Separator_Morning_Alt_2": "Petit déjeuner",
-
"Course_Separator_Evening_Default": "Pause de l'après-midi",
"Course_Separator_Evening_Alt_1": "Une pause s'impose !",
"Course_Separator_Evening_Alt_2": "Heure du goûter !",
-
"Course_Separator_Night_Default": "Pause du soir",
"Course_Separator_Night_Alt_1": "Au dodo !",
"Course_Separator_Night_Alt_2": "Il fait nuit !",
-
"Context_Delete": "Supprimer",
"Context_Cancel": "Annuler",
"Context_Edit": "Modifier",
"Context_Add": "Ajouter",
-
"Form_Title": "Titre",
"Form_Location": "Emplacement",
"Form_Organizer": "Organisateur",
"Form_Start": "Début",
"Form_End": "Fin",
-
"Confirm_DeleteEvent": "Es-tu sûr de vouloir supprimer cet événement ?",
-
"Home_Welcome_Name": "Bonjour, {{name}} {{emoji}}",
"Home_Display_More": "Afficher plus",
"Home_Cards_Button_Description_Plurial": "disponibles",
@@ -209,54 +193,43 @@
"Home_Planned_None": "Tu n'as aucun cours restant de prévu aujourd'hui",
"Home_Planned_One": "Tu as un cours restant aujourd'hui",
"Home_Planned_Number": "Tu as {{number}} cours restants aujourd'hui",
-
"Home_Widget_NextCourses": "Prochains cours",
"Home_Widget_NewGrades": "Nouvelles notes",
"Home_Widget_NewHomeworks": "Tâches à faire",
-
+ "Home_Widget_Grades_Average": "Moyenne",
"Home_Widget_NoCourses": "Aucun cours à venir",
"Home_Widget_NoCourses_Description": "Il n'y a pas de cours prévus pour aujourd'hui.",
-
"Home_Cards_Button_Title": "Cartes",
"Home_Cards_Button_Description_None": "Aucune carte",
"Home_Cards_Button_Description_Singular": "Une carte",
"Home_Cards_Button_Description_Number": "{{number}} cartes",
-
"Home_Chats_Button_Title": "Messages",
"Home_Chats_Button_Description_None": "Aucun message",
"Home_Chats_Button_Description_Singular": "Un message",
"Home_Chats_Button_Description_Number": "{{number}} messages",
-
"Home_Attendance_Title": "Absences",
"Home_Attendance_Button_Description_None": "Aucune absence",
"Home_Attendance_Button_Description_Singular": "Une absence",
"Home_Attendance_Button_Description_Number": "{{number}} absences",
-
"Home_Menu_Button_Title": "Menu",
"Home_Menu_Button_Description": "Menu du jour",
-
"Home_Release_Notes_Banner": "Nouveautés de la version {{version}}",
"Home_Release_Notes_Banner_Description": "Découvre les dernières améliorations et corrections de bugs.",
-
"Tab_Calendar_Empty": "Aucun événement trouvé",
"Tab_Calendar_Empty_Description": "Ajoute un événement ou synchronise ton calendrier pour commencer.",
-
"Modal_Course_Title": "Mon cours",
"Modal_Course_StartsIn": "Commence dans",
"Modal_Course_StartedAgo": "Terminé il y a",
"Modal_Course_Ongoing": "Commencé depuis",
"Modal_Course_Group": "Groupe",
"Modal_Course_Group_Full": "Classe",
-
"Modal_Course_Details": "Détails du cours",
"Modal_Course_Teacher": "Enseignant",
"Modal_Course_Room": "Salle",
"Modal_Course_Duration": "Durée",
-
"Modal_Course_Time": "Horaires du cours",
"Modal_Course_Start": "Début",
"Modal_Course_End": "Fin",
-
"Tasks_Search_Placeholder": "Rechercher des tâches",
"Tasks_LeftHomeworks_Title": "tâches restantes",
"Tasks_LeftHomeworks_Time": "cette semaine",
@@ -276,10 +249,8 @@
"Task_OnlyShowUndone": "Tâches terminées",
"Task_Show_Title": "Afficher",
"Settings_General": "Général",
-
"Latest_Grades": "Nouvelles notes",
"Grades_Search_Placeholder": "Rechercher une note, une matière",
-
"Grades_Avg_Methods": "Méthodes de calcul",
"Grades_Avg_All_Title": "Moyenne générale",
"Grades_Avg_All_Short": "Moy. générale",
@@ -289,13 +260,12 @@
"Grades_Avg_Subject_Title": "Moyenne des matières",
"Grades_Avg_Subject_Short": "Moy. matières",
"Grades_Avg_Subject_Description": "Calcule la moyenne pondérée des moyennes de matières",
- "Grades_Avg_Median_Title": "Médiane",
+ "Grades_Avg_Median_Title": "Médiane des notes",
"Grades_Avg_Median_Short": "Médiane",
-
+ "Grades_Avg_Median_Description": "Calcule la médiane de toutes les notes",
"Grades_Avg_More": "En savoir plus",
"Grades_Avg_KnowMore": "En savoir plus",
"Grades_Avg_KnowMore_Description": "Comprendre les méthodes de calcul de la moyenne générale",
-
"Grades_SubjectInfo": "Informations sur la matière",
"Grades_SubjectInfo_NbGrades": "{{number}} note(s)",
"SubjectInfo_StudentAverage_Label": "Moyenne de l'élève",
@@ -306,60 +276,46 @@
"SubjectInfo_MaxAverage_Description": "Meilleure moyenne du groupe",
"SubjectInfo_MinAverage_Label": "Moyenne minimale",
"SubjectInfo_MinAverage_Description": "Moyenne la plus faible du groupe",
-
"Grades_Semester": "Semestre",
"Grades_Trimester": "Trimestre",
"Grades_OutPeriod": "Hors période",
"Grades_Year": "Année",
"Grades_MockExamBac": "Bac blanc",
"Grades_MockExamBrevet": "Brevet blanc",
-
"Grades_Method_AllGrades": "Toutes les matières",
"Grades_Method_Weighted": "Pondération",
-
"Grades_Sort": "Trier",
"Grades_Sorting_Alphabetical": "Alphabétique",
"Grades_Sorting_Averages": "Moyennes",
"Grades_Sorting_Date": "Date",
-
"Grades_Menu_SortBy": "Tri par",
"Grades_Menu_AverageBy": "Moyenne par",
"NoAverage": "Aucune moyenne",
-
"Grades_Empty_Title": "Aucune note",
"Grades_Empty_Description": "Tu n'as pas encore été noté sur cette période.",
-
"Grade_NoDescription": "Devoir de {{subject}}",
-
"Grades_Tab_Subjects": "Matières",
"Grades_Tab_Latest": "Nouvelles notes",
-
"Profile_Attendance_Title": "Assiduité",
"Profile_Attendance_Denominator_Single": "absence",
"Profile_Attendance_Denominator_Plural": "absences",
-
"Profile_Discussions_Title": "Discussions",
"Profile_Discussions_Denominator_Single": "non lu",
"Profile_Discussions_Denominator_Plural": "non lus",
-
"Profile_News_Title": "Actualités",
"Profile_News_Denominator_Single": "nouveau",
"Profile_News_Denominator_Plural": "nouvelles",
"Profile_News_Open": "Ouvrir",
"Profile_News_Loading_Title": "Chargement des actualités...",
"Profile_News_Author_Unknown": "Auteur inconnu",
-
"Profile_Cards_Title": "QR-Code et cartes",
-
"Modal_Grades_Title": "Détail de la note",
"Modal_Grades_BestGrade": "Meilleure note du groupe",
-
"Modal_Grades_OptionalGrade": "Note optionnelle",
"Modal_Grades_BonusGrade": "Note bonus",
-
"Grades_Details_Title": "Détails",
- "Grades_NormalizedGrade_Title": "Note ramenée sur 20",
- "Grades_NormalizedGrade_Description": "Valeur de la note convertie sur une échelle de 20",
+ "Grades_NormalizedGrade_Title": "Note à l'échelle",
+ "Grades_NormalizedGrade_Description": "Valeur de la note convertie sur une échelle sélectionnée",
"Grades_HighestGrade_Title": "Note la plus haute",
"Grades_HighestGrade_Description": "Note maximale obtenue dans le groupe",
"Grades_LowestGrade_Title": "Note la plus basse",
@@ -370,27 +326,30 @@
"Grades_Avg_Group_Short": "Moy. groupe",
"Grades_Tab_Rank": "Classement",
"Grades_Tab_Rank_Description": "Position dans le groupe",
-
"News_Search_Placeholder": "Rechercher une actualité",
"News_Empty_Title": "Aucune actualité",
"News_Empty_Description": "Il n'y a pas d'actualités trouvées dans ton établissement.",
"News_Search_NoResults": "Aucune actualité trouvée",
"News_Search_NoResults_Description": "Aucune actualité trouvée pour votre recherche.",
-
"News_Theme_Papillon_Title": "Papillon",
"News_Theme_Papillon_Description": "Un thème doux et élégant",
-
"News_Theme_Reading_Title": "Lecture",
"News_Theme_Reading_Description": "Un thème conçu pour la lecture",
-
"Attendance_Hours_Missed": "Heures manquées",
"Attendance_Hours_Unjustified": "Heures injustifiées",
+ "Attendance_Hours_Unjustified_Value": "{{duration}} injustifiées",
"Attendance_Missing": "Absences",
"Attendance_Delays": "Retards",
"Attendance_NoReason": "Aucune raison",
+ "Attendance_Duration_Minutes": "{{value}} min",
+ "Attendance_Duration_HoursMinutes_Detailed": "{{hours}} h {{minutes}} min",
+ "Attendance_Duration_HoursMinutes_Compact": "{{hours}}h{{minutes}}",
+ "Attendance_Unjustified_Description": "Pense à justifier tes absences et retards auprès de ta vie scolaire ou de ton établissement.",
+ "Attendance_NoUnjustified_Title": "Aucune heure injustifiée",
+ "Attendance_NoUnjustified_Description": "Félicitations ! Papillon n'a pas trouvé d'heures injustifiées pour cette période.",
+ "Attendance_InvalidPeriod": "Période invalide",
"Attendance_NoEvent_Title": "Aucun événement",
- "Attendance_NoEvent_Description": "Pas d'absences ou de retards enregistrés pour cette période.",
-
+ "Attendance_NoEvent_Description": "Aucune absence ni aucun retard n'a été enregistré pour cette période.",
"Settings_Account_Title": "Mon compte",
"Settings_Account_Description": "Mon compte",
"Settings_Services_Title": "Comptes liés",
@@ -422,19 +381,19 @@
"Settings_Logout_Title": "Se déconnecter",
"Settings_ReleaseNotes_Title": "Notes de version",
"Settings_ReleaseNotes_Description": "Quoi de neuf dans cette version ?",
-
"Settings_Logout_Description": "Supprimer ce compte de Papillon",
"Settings_Language_Title": "Langue",
"Settings_Language_Description": "Changer la langue",
"Settings_Tabs_Title": "Onglets",
"Settings_Tabs_Description": "Masquer des onglets du menu",
-
"Settings_Personalization_Title_Card": "Personnalisation",
"Settings_Personalization_Subtitle_Card": "Thèmes, matières...",
"Settings_SubjectPersonalization_Title": "Personnaliser les matières",
"Settings_Personalization_Accent": "Couleur d'accentuation",
"Settings_Personalization_Accent_Description": "La couleur que tu choisis ici s'appliquera sur la page d'accueil de Papillon.",
"Settings_Personalization_Theme": "Thème",
+ "Settings_Personalization_MaterialYou_Title": "Utiliser les couleurs Android",
+ "Settings_Personalization_MaterialYou_Description": "Utiliser les couleurs Material You basées sur ton thème système",
"Settings_Personalization_Icon_Title": "Changer l’icône",
"Settings_Personalization_Icon_Description": "Personnalise l’icône de l’application",
"Settings_Personalization_Subject_Title": "Personnaliser les matières",
@@ -453,7 +412,6 @@
"Settings_About_Issue": "Signaler un bug",
"Settings_About_Issue_Description": "Reporter un bug rencontré",
"Settings_About_Dependency_Version": "Version des dépendances",
-
"Alert_No_Technical": "Aucune information technique disponible.",
"Alert_Auth_Error": "Erreur d'authentification",
"Alert_Auth_Bad_Creds": "Les identifiants que tu as saisis sont incorrects ou tu essaies de te connecter avec un compte parent. Ce type de compte n’est pas encore pris en charge par Papillon.",
@@ -463,45 +421,36 @@
"Alert_Invalid_Instance": "Papillon n'arrive pas à obtenir les informations de cette instance PRONOTE, est-elle encore valide ?",
"Alert_No_Pos": "Impossible de récupérer la position",
"Alert_Connexion_Fail": "Connexion impossible",
-
"Feature_Limited": "Fonctionnalités limitées",
"Feature_Soon": "Ça arrive bientôt !",
"Feature_Soon_Notification": "Nous travaillons dur pour vous offrir cette fonctionnalité dans une future mise à jour.",
"Feature_Add_Card": "Ajoute une nouvelle carte depuis l’onglet Profil accessible dans la barre de navigation",
-
"Webview_Wait": "Un peu de patience...",
-
"Profile_QRCards": "QR-Code et cartes",
"Profile_QRCards_Subtitle": "{{count}} carte(s)",
"Profile_Cards_Loading_History": "Chargement de l'historique des transactions",
"Profile_Cards_Loading_History_Description": "Cela peut prendre un moment...",
-
"Settings_Cards_Banner_Title": "Cartes",
"Settings_Cantineen_Subtitle_Card": "Cantine, accès",
"Settings_Cards_Banner_Description": "Ajoute tes cartes de cantine et de transport pour y accéder n'importe où depuis ton téléphone sur Papillon",
"Settings_Cards_None_Title": "Aucune carte",
"Settings_Cards_Add_Button": "Ajouter",
-
"Settings_Cards_None_Description": "Ajoute en-une pour accéder à ton solde de cantine, scanner ton QR-Code et plus encore",
"Settings_Subjects_None_Title": "Aucune matière",
"Settings_Subjects_None_Description": "Parcours les différents onglets de l'application afin de pouvoir customiser les matières.",
"Settings_Subjects_Reset_Title": "Réinitialiser",
"Settings_Subjects_Reset_Message": "Voulez-vous vraiment réinitialiser toutes les matières ?",
"Settings_Subjects_Reset_Button": "Réinitialiser",
-
"Settings_Donator": "Donateurs",
"Settings_Donator_Description": "Voir la liste des donateurs",
"Settings_App_Version": "Version de l'application",
-
"Profile_Cards_Scan_Orientation": "Oriente le QR-Code vers le scanner de la borne",
"Profile_Cards_No_Reservation": "Aucune réservation",
"Profile_Cards_No_Available_Reservation": "Il semblerait que tu ne puisses pas réserver ce jour.",
"Profile_Cards_History": "Historique",
"Magic_Important": "Peut-être important",
-
"OnBoarding_Step": "Étape ",
"OnBoarding_Step_Of": "sur ",
-
"Consent_Advanced_Title": "Je veux aider Papillon",
"Consent_Advanced_Description": "On récolte plus d’informations détaillées sur ton utilisation.",
"Consent_Required_Title": "Juste l'essentiel",
@@ -517,31 +466,40 @@
"Consent_Arg1": "Sert uniquement à améliorer l’application",
"Consent_Arg2": "Anonyme & sans lien avec ton identité",
"Consent_Arg3": "On n'a pas accès à tes comptes",
-
"Changelog_Title": "Notes de mise à jour",
- "Tasks_Sorting_Methods_DueDate": "Date de rendu",
+ "Tasks_Sorting_Methods_DueDate": "Date",
"Tasks_Sorting_Methods_Subject": "Matières",
"Tasks_Sorting_Methods_Done": "Non terminé",
"Tasks_ThisWeek": "Cette semaine",
-
"Task_Undone": "Non terminé",
"Task_Done": "Terminé",
+
+ "Task_New_Subject": "Matière",
+ "Task_New_Title": "Nouveau devoir",
+ "Task_Edit_Title": "Modification du devoir",
+ "Task_New_DueDate": "Date de rendu",
+ "Task_New_DueDate_Edit": "Modifier",
+ "Task_New_TaskTitle": "Titre du devoir",
+ "Task_New_TaskTitle_Placeholder": "Titre du devoir",
+ "Task_New_TaskDescription": "Contenu du devoir",
+ "Task_New_TaskDescription_Placeholder": "Contenu du devoir",
"Modal_Wallpaper_Title": "Personnaliser le fond d'écran",
+ "Modal_Wallpaper_Clear": "Supprimer le fond d'écran",
+ "Modal_Wallpaper_Downloads": "Téléchargements",
+ "Modal_Wallpaper_Downloads_Size": "Taille des téléchargements",
+ "Modal_Wallpaper_ClearDownloads": "Vider les téléchargements",
"Modal_Profile_Title": "Personnaliser le profil",
-
+ "Modal_Task_Title": "Détail de la tâche",
"Modal_Task_Status": "État du devoir",
"Modal_Task_Description": "Description du devoir",
"Modal_Task_Attachments": "Pièces jointes",
-
"Today": "Aujourd'hui",
"Yesterday": "Hier",
"Tomorrow": "Demain",
-
"Home_Edit_Profile": "Modifier mon profil",
"Home_Add_Profile": "Ajouter un profil",
-
"Settings_Transport_Address_Not_Set": "Non définie",
"Settings_Transport_Current_Position": "Position actuelle",
"Settings_Transport_Banner_Title": "Transport",
@@ -553,6 +511,8 @@
"Settings_Transport_Default_Application_Title": "Application par défaut",
"Settings_Transport_Title": "Transport",
"Settings_Transport_Description": "Application de transport, adresses...",
+ "Settings_Features_Title": "Fonctionnalités",
+ "Settings_Features_Description": "Gérer les fonctionnalités de Papillon",
"Transport_Error_Address_Not_Set_Title": "Aucune adresse n'a été définie",
"Transport_Error_Address_Not_Set_Description": "Configure tes adresses dans les préférences.",
"Transport_Error_Cant_Go_To_Current_Location_Title": "Impossible d'afficher cet itinéraire",
@@ -564,7 +524,7 @@
"Transport_Error_Location_Description": "Vérifie que Papillon a bien accès à ta localisation.",
"Transport_Maps_App": "ton application de transport",
"Transport_Open_In": "Ouvrir dans",
- "Settings_Transport_Search_Address_Placeholder": "Rechercher une adresse, un lieu, un arrêt…",
+ "Settings_Transport_Search_Address_Placeholder": "Rechercher une adresse, un arrêt...",
"Settings_Transport_Current_Position_Description": "Utilise ta position actuelle quand tu es dans ton calendrier.",
"Settings_Transport_Place": "Adresses et lieux",
"Settings_Transport_Stops": "Arrêts et stations",
@@ -574,5 +534,20 @@
"Transport_Error_Cant_Open_Deeplink_Description": "Vérifie que l'application est installée sur ton appareil, puis réessaie.",
"Settings_Transport_Localisation_Needed": "Papillon a besoin de ta localisation.",
"Settings_Transport_Localisation_Needed_Description": "Pour utiliser les fonctionnalités de transport, Papillon doit accéder à ta localisation afin de fournir des estimations de temps de trajets.",
- "Settings_Transport_Localisation_Request": "Activer la localisation"
+ "Settings_Transport_Localisation_Request": "Activer la localisation",
+ "Settings_Preferences": "Fonctionnalités",
+ "Settings_More": "À propos",
+ "Settings_About": "Toi et Papillon",
+ "Settings_Dev": "Développement",
+ "Settings_Personalization_Emoji_Picker_Title": "Sélectionne un emoji",
+ "Settings_Personalization_Emoji_Picker_SetEmoji": "Sélectionner",
+ "Settings_Features_BottomAccessory": "Coup d'oeil",
+ "Settings_Features_BottomAccessory_Description": "Affiche les prochains cours au dessus des onglets",
+ "Settings_Features_ShowTabBarLabels": "Afficher le nom des onglets",
+ "Settings_Features_ShowTabBarLabels_Description": "Indique le nom de l'onglet en dessous de celui-ci",
+ "Settings_Features_TabBar": "Barre d'onglets",
+ "Settings_Features_Grades": "Notes",
+ "Settings_Features_GradeScale": "Échelle des notes",
+ "Settings_Features_GradeScale_Description": "Notation par défaut dans l'interface",
+ "Global_Experimental": "Expérimental"
}
diff --git a/package-lock.json b/package-lock.json
index 6ebffc96..2f1e2b05 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,14 +1,12 @@
{
"name": "papillon",
- "version": "8.4.0",
+ "version": "8.4.1",
"lockfileVersion": 3,
"requires": true,
- "main": "expo-router/entry",
- "private": true,
"packages": {
"": {
"name": "papillon",
- "version": "8.4.0",
+ "version": "8.4.1",
"hasInstallScript": true,
"dependencies": {
"@aramir/react-native-barcode": "^1.0.2",
@@ -17,13 +15,14 @@
"@bottom-tabs/react-navigation": "^0.11.2",
"@callstack/liquid-glass": "^0.4.3",
"@eslint/js": "^9.39.1",
- "@expo/metro-config": "~54.0.10",
+ "@expo/metro-config": "~55.0.9",
"@expo/ngrok": "^4.1.3",
+ "@expo/ui": "~55.0.8",
"@expo/vector-icons": "^15.0.2",
- "@getpapillon/papicons": "^0.2.0",
+ "@getpapillon/papicons": "^0.2.1",
"@legendapp/list": "^2.0.15",
"@nozbe/watermelondb": "^0.28.0",
- "@react-native-community/datetimepicker": "8.4.4",
+ "@react-native-community/datetimepicker": "8.6.0",
"@react-native-masked-view/masked-view": "^0.3.2",
"@react-native-menu/menu": "^2.0.0",
"@react-navigation/elements": "^2.9.2",
@@ -31,7 +30,7 @@
"@react-navigation/native-stack": "^7.3.16",
"@sbaiahmed1/react-native-blur": "^4.2.1",
"@shopify/flash-list": "2.0.2",
- "@shopify/react-native-skia": "2.2.12",
+ "@shopify/react-native-skia": "2.4.18",
"@types/uuid": "^10.0.0",
"alise-api": "^0.2.5",
"appscho": "file:./stubs/appscho",
@@ -41,33 +40,34 @@
"eslint-plugin-react": "^7.37.5",
"eslint-plugin-simple-import-sort": "^12.1.1",
"esup-multi.js": "^1.0.4",
- "expo": "~54.0.32",
- "expo-audio": "~1.1.1",
- "expo-battery": "~10.0.8",
- "expo-blur": "~15.0.8",
- "expo-build-properties": "~1.0.10",
- "expo-camera": "~17.0.10",
- "expo-crypto": "~15.0.8",
- "expo-dev-client": "~6.0.20",
- "expo-device": "~8.0.10",
+ "expo": "~55.0.0",
+ "expo-asset": "~55.0.12",
+ "expo-audio": "~55.0.11",
+ "expo-battery": "~55.0.11",
+ "expo-blur": "~55.0.12",
+ "expo-build-properties": "~55.0.11",
+ "expo-camera": "~55.0.13",
+ "expo-crypto": "~55.0.12",
+ "expo-dev-client": "~55.0.22",
+ "expo-device": "~55.0.12",
"expo-fetcher": "^0.9.1",
- "expo-file-system": "~19.0.20",
- "expo-font": "~14.0.10",
- "expo-haptics": "~15.0.8",
- "expo-image-picker": "~17.0.9",
- "expo-linear-gradient": "~15.0.8",
- "expo-linking": "~8.0.10",
- "expo-localization": "~17.0.8",
- "expo-location": "~19.0.8",
- "expo-network": "~8.0.8",
- "expo-notifications": "^0.32.13",
- "expo-router": "~6.0.17",
- "expo-secure-store": "~15.0.8",
- "expo-splash-screen": "~31.0.12",
- "expo-status-bar": "~3.0.9",
- "expo-system-ui": "~6.0.9",
- "expo-video": "~3.0.14",
- "expo-web-browser": "~15.0.10",
+ "expo-file-system": "~55.0.14",
+ "expo-font": "~55.0.6",
+ "expo-haptics": "~55.0.11",
+ "expo-image-picker": "~55.0.16",
+ "expo-linear-gradient": "~55.0.11",
+ "expo-linking": "~55.0.11",
+ "expo-localization": "~55.0.11",
+ "expo-location": "~55.1.6",
+ "expo-network": "~55.0.11",
+ "expo-notifications": "~55.0.16",
+ "expo-router": "~55.0.10",
+ "expo-secure-store": "~55.0.11",
+ "expo-splash-screen": "~55.0.15",
+ "expo-status-bar": "~55.0.5",
+ "expo-system-ui": "~55.0.13",
+ "expo-video": "~55.0.13",
+ "expo-web-browser": "~55.0.12",
"ezly": "^1.4.3",
"fflate": "^0.8.2",
"i18next": "^25.7.2",
@@ -76,27 +76,28 @@
"lucide-react-native": "^0.511.0",
"patch-package": "^8.0.1",
"pawnote": "^1.6.2",
- "react": "19.1.0",
- "react-dom": "19.1.0",
+ "react": "19.2.0",
+ "react-dom": "19.2.0",
"react-i18next": "^15.7.4",
- "react-native": "0.81.5",
- "react-native-bottom-tabs": "^0.11.2",
+ "react-native": "0.83.4",
+ "react-native-bottom-tabs": "^1.1.0",
+ "react-native-dynamic-theme": "^0.3.4",
"react-native-edge-to-edge": "1.6.0",
"react-native-fast-tflite": "^1.6.1",
- "react-native-gesture-handler": "~2.28.0",
+ "react-native-gesture-handler": "~2.30.0",
"react-native-graph": "^1.1.0",
"react-native-htmlview": "^0.17.0",
"react-native-linear-gradient": "^2.8.3",
"react-native-mmkv": "^3.3.3",
"react-native-qrcode-svg": "^6.3.15",
- "react-native-reanimated": "~4.1.1",
+ "react-native-reanimated": "4.2.1",
"react-native-safe-area-context": "~5.6.0",
"react-native-screen-transitions": "^2.0.3",
- "react-native-screens": "~4.16.0",
- "react-native-svg": "15.12.1",
+ "react-native-screens": "~4.23.0",
+ "react-native-svg": "15.15.3",
"react-native-web": "^0.21.2",
- "react-native-webview": "13.15.0",
- "react-native-worklets": "0.5.1",
+ "react-native-webview": "13.16.0",
+ "react-native-worklets": "0.7.2",
"skolengojs": "^1.1.10",
"turboself-api": "^2.1.9",
"typescript-eslint": "^8.49.0",
@@ -104,47 +105,309 @@
},
"devDependencies": {
"@babel/core": "^7.28.5",
- "@types/react": "~19.1.17",
+ "@types/react": "~19.2.10",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-prettier": "^5.5.4",
"eslint-plugin-unused-imports": "^4.3.0",
"jest": "^29.7.0",
- "jest-expo": "~54.0.14",
+ "jest-expo": "~55.0.13",
"prettier": "^3.7.4",
"react-test-renderer": "19.0.0",
"typescript": "~5.9.3"
}
},
- "node_modules/@0no-co/graphql.web": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@0no-co/graphql.web/-/graphql.web-1.2.0.tgz",
- "integrity": "sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw==",
+ "node_modules/@aramir/react-native-barcode": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@aramir/react-native-barcode/-/react-native-barcode-1.0.3.tgz",
+ "integrity": "sha512-wpRdKWJndhrx/cN3IIMm4SOZXdLuYUP9FIv4aYkcWIkSl74hvR4Y5E3KwDCyqgnYKhl4wWcZiQFWH6mvo2TWZg==",
"license": "MIT",
+ "dependencies": {
+ "jsbarcode": "^3.12.1",
+ "prop-types": "^15.5.0",
+ "react-native": "^0.81.0",
+ "react-native-svg": "^15.11.2"
+ }
+ },
+ "node_modules/@aramir/react-native-barcode/node_modules/@react-native/assets-registry": {
+ "version": "0.81.6",
+ "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.81.6.tgz",
+ "integrity": "sha512-nNlJ7mdXFoq/7LMG3eJIncqjgXkpDJak3xO8Lb4yQmFI3XVI1nupPRjlYRY0ham1gLE0F/AWvKFChsKUfF5lOQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 20.19.4"
+ }
+ },
+ "node_modules/@aramir/react-native-barcode/node_modules/@react-native/codegen": {
+ "version": "0.81.6",
+ "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.81.6.tgz",
+ "integrity": "sha512-9KoYRep/KDnELLLmIYTtIIEOClVUJ88pxWObb/0sjkacA7uL4SgfbAg7rWLURAQJWI85L1YS67IhdEqNNk1I7w==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.25.2",
+ "@babel/parser": "^7.25.3",
+ "glob": "^7.1.1",
+ "hermes-parser": "0.29.1",
+ "invariant": "^2.2.4",
+ "nullthrows": "^1.1.1",
+ "yargs": "^17.6.2"
+ },
+ "engines": {
+ "node": ">= 20.19.4"
+ },
"peerDependencies": {
- "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0"
+ "@babel/core": "*"
+ }
+ },
+ "node_modules/@aramir/react-native-barcode/node_modules/@react-native/community-cli-plugin": {
+ "version": "0.81.6",
+ "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.81.6.tgz",
+ "integrity": "sha512-oTwIheF4TU7NkfoHxwSQAKtIDx4SQEs2xufgM3gguY7WkpnhGa/BYA/A+hdHXfqEKJFKlHcXQu4BrV/7Sv1fhw==",
+ "license": "MIT",
+ "dependencies": {
+ "@react-native/dev-middleware": "0.81.6",
+ "debug": "^4.4.0",
+ "invariant": "^2.2.4",
+ "metro": "^0.83.1",
+ "metro-config": "^0.83.1",
+ "metro-core": "^0.83.1",
+ "semver": "^7.1.3"
+ },
+ "engines": {
+ "node": ">= 20.19.4"
+ },
+ "peerDependencies": {
+ "@react-native-community/cli": "*",
+ "@react-native/metro-config": "*"
},
"peerDependenciesMeta": {
- "graphql": {
+ "@react-native-community/cli": {
+ "optional": true
+ },
+ "@react-native/metro-config": {
"optional": true
}
}
},
- "node_modules/@aramir/react-native-barcode": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@aramir/react-native-barcode/-/react-native-barcode-1.0.2.tgz",
- "integrity": "sha512-ZK4y9QR0k9zLZZEv2zCPo+BmmK/Jzr+nD7znOC4lQVlxbMfB/zYhRlIfrI317cD1TSdZz1XSD4lmaT2XVGrT2g==",
+ "node_modules/@aramir/react-native-barcode/node_modules/@react-native/debugger-frontend": {
+ "version": "0.81.6",
+ "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.81.6.tgz",
+ "integrity": "sha512-aGw28yzbtm25GQuuxNeVAT72tLuGoH0yh79uYOIZkvjI+5x1NjZyPrgiLZ2LlZi5dJdxfbz30p1zUcHvcAzEZw==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">= 20.19.4"
+ }
+ },
+ "node_modules/@aramir/react-native-barcode/node_modules/@react-native/dev-middleware": {
+ "version": "0.81.6",
+ "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.81.6.tgz",
+ "integrity": "sha512-mK2M3gJ25LtgtqxS1ZXe1vHrz8APOA79Ot/MpbLeovFgLu6YJki0kbO5MRpJagTd+HbesVYSZb/BhAsGN7QAXA==",
"license": "MIT",
"dependencies": {
- "jsbarcode": "^3.12.1",
- "prop-types": "^15.5.0",
- "react-native": "^0.81.0",
- "react-native-svg": "^15.11.2"
+ "@isaacs/ttlcache": "^1.4.1",
+ "@react-native/debugger-frontend": "0.81.6",
+ "chrome-launcher": "^0.15.2",
+ "chromium-edge-launcher": "^0.2.0",
+ "connect": "^3.6.5",
+ "debug": "^4.4.0",
+ "invariant": "^2.2.4",
+ "nullthrows": "^1.1.1",
+ "open": "^7.0.3",
+ "serve-static": "^1.16.2",
+ "ws": "^6.2.3"
+ },
+ "engines": {
+ "node": ">= 20.19.4"
+ }
+ },
+ "node_modules/@aramir/react-native-barcode/node_modules/@react-native/gradle-plugin": {
+ "version": "0.81.6",
+ "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.81.6.tgz",
+ "integrity": "sha512-atUItC5MZ6yaNaI0sbsoDwUdF+KMNZcMKBIrNhXlUyIj3x1AQ6Cf8CHHv6Qokn8ZFw+uU6GWmQSiOWYUbmi8Ag==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 20.19.4"
+ }
+ },
+ "node_modules/@aramir/react-native-barcode/node_modules/@react-native/js-polyfills": {
+ "version": "0.81.6",
+ "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.81.6.tgz",
+ "integrity": "sha512-P5MWH/9vM24XkJ1TasCq42DMLoCUjZVSppTn6VWv/cI65NDjuYEy7bUSaXbYxGTnqiKyPG5Y+ADymqlIkdSAcw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 20.19.4"
+ }
+ },
+ "node_modules/@aramir/react-native-barcode/node_modules/@react-native/normalize-colors": {
+ "version": "0.81.6",
+ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.6.tgz",
+ "integrity": "sha512-/OCgUysHIFhfmZxbJAydVc58l2SGIZbWpbQXBrYEYch8YElBbDFQ8IUtyogB7YJJQ8ewHZFj93rQGaECgkvvcw==",
+ "license": "MIT"
+ },
+ "node_modules/@aramir/react-native-barcode/node_modules/@react-native/virtualized-lists": {
+ "version": "0.81.6",
+ "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.81.6.tgz",
+ "integrity": "sha512-1RrZl3a7iCoAS2SGaRLjJPIn8bg/GLNXzqkIB2lufXcJsftu1umNLRIi17ZoDRejAWSd2pUfUtQBASo4R2mw4Q==",
+ "license": "MIT",
+ "dependencies": {
+ "invariant": "^2.2.4",
+ "nullthrows": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 20.19.4"
+ },
+ "peerDependencies": {
+ "@types/react": "^19.1.4",
+ "react": "*",
+ "react-native": "*"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@aramir/react-native-barcode/node_modules/babel-plugin-syntax-hermes-parser": {
+ "version": "0.29.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.29.1.tgz",
+ "integrity": "sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA==",
+ "license": "MIT",
+ "dependencies": {
+ "hermes-parser": "0.29.1"
+ }
+ },
+ "node_modules/@aramir/react-native-barcode/node_modules/commander": {
+ "version": "12.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz",
+ "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@aramir/react-native-barcode/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@aramir/react-native-barcode/node_modules/hermes-estree": {
+ "version": "0.29.1",
+ "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.29.1.tgz",
+ "integrity": "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==",
+ "license": "MIT"
+ },
+ "node_modules/@aramir/react-native-barcode/node_modules/hermes-parser": {
+ "version": "0.29.1",
+ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.29.1.tgz",
+ "integrity": "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==",
+ "license": "MIT",
+ "dependencies": {
+ "hermes-estree": "0.29.1"
+ }
+ },
+ "node_modules/@aramir/react-native-barcode/node_modules/react-native": {
+ "version": "0.81.6",
+ "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.81.6.tgz",
+ "integrity": "sha512-X/tI8GqfzVaa+zfbE4+lySNN5UzwBIAVRHVZPKymOny9Acc5GYYcjAcEVfG3AM4h920YALWoSl8favnDmQEWIg==",
+ "license": "MIT",
+ "dependencies": {
+ "@jest/create-cache-key-function": "^29.7.0",
+ "@react-native/assets-registry": "0.81.6",
+ "@react-native/codegen": "0.81.6",
+ "@react-native/community-cli-plugin": "0.81.6",
+ "@react-native/gradle-plugin": "0.81.6",
+ "@react-native/js-polyfills": "0.81.6",
+ "@react-native/normalize-colors": "0.81.6",
+ "@react-native/virtualized-lists": "0.81.6",
+ "abort-controller": "^3.0.0",
+ "anser": "^1.4.9",
+ "ansi-regex": "^5.0.0",
+ "babel-jest": "^29.7.0",
+ "babel-plugin-syntax-hermes-parser": "0.29.1",
+ "base64-js": "^1.5.1",
+ "commander": "^12.0.0",
+ "flow-enums-runtime": "^0.0.6",
+ "glob": "^7.1.1",
+ "invariant": "^2.2.4",
+ "jest-environment-node": "^29.7.0",
+ "memoize-one": "^5.0.0",
+ "metro-runtime": "^0.83.1",
+ "metro-source-map": "^0.83.1",
+ "nullthrows": "^1.1.1",
+ "pretty-format": "^29.7.0",
+ "promise": "^8.3.0",
+ "react-devtools-core": "^6.1.5",
+ "react-refresh": "^0.14.0",
+ "regenerator-runtime": "^0.13.2",
+ "scheduler": "0.26.0",
+ "semver": "^7.1.3",
+ "stacktrace-parser": "^0.1.10",
+ "whatwg-fetch": "^3.0.0",
+ "ws": "^6.2.3",
+ "yargs": "^17.6.2"
+ },
+ "bin": {
+ "react-native": "cli.js"
+ },
+ "engines": {
+ "node": ">= 20.19.4"
+ },
+ "peerDependencies": {
+ "@types/react": "^19.1.4",
+ "react": "^19.1.4"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@aramir/react-native-barcode/node_modules/scheduler": {
+ "version": "0.26.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz",
+ "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==",
+ "license": "MIT"
+ },
+ "node_modules/@aramir/react-native-barcode/node_modules/semver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@aramir/react-native-barcode/node_modules/ws": {
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz",
+ "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==",
+ "license": "MIT",
+ "dependencies": {
+ "async-limiter": "~1.0.0"
}
},
"node_modules/@babel/code-frame": {
- "version": "7.28.6",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz",
- "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==",
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz",
+ "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==",
"license": "MIT",
"dependencies": {
"@babel/helper-validator-identifier": "^7.28.5",
@@ -156,29 +419,29 @@
}
},
"node_modules/@babel/compat-data": {
- "version": "7.28.6",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz",
- "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==",
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz",
+ "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/core": {
- "version": "7.28.5",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz",
- "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==",
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz",
+ "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==",
"license": "MIT",
"dependencies": {
- "@babel/code-frame": "^7.27.1",
- "@babel/generator": "^7.28.5",
- "@babel/helper-compilation-targets": "^7.27.2",
- "@babel/helper-module-transforms": "^7.28.3",
- "@babel/helpers": "^7.28.4",
- "@babel/parser": "^7.28.5",
- "@babel/template": "^7.27.2",
- "@babel/traverse": "^7.28.5",
- "@babel/types": "^7.28.5",
+ "@babel/code-frame": "^7.29.0",
+ "@babel/generator": "^7.29.0",
+ "@babel/helper-compilation-targets": "^7.28.6",
+ "@babel/helper-module-transforms": "^7.28.6",
+ "@babel/helpers": "^7.28.6",
+ "@babel/parser": "^7.29.0",
+ "@babel/template": "^7.28.6",
+ "@babel/traverse": "^7.29.0",
+ "@babel/types": "^7.29.0",
"@jridgewell/remapping": "^2.3.5",
"convert-source-map": "^2.0.0",
"debug": "^4.1.0",
@@ -195,13 +458,13 @@
}
},
"node_modules/@babel/generator": {
- "version": "7.28.6",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz",
- "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==",
+ "version": "7.29.1",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz",
+ "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==",
"license": "MIT",
"dependencies": {
- "@babel/parser": "^7.28.6",
- "@babel/types": "^7.28.6",
+ "@babel/parser": "^7.29.0",
+ "@babel/types": "^7.29.0",
"@jridgewell/gen-mapping": "^0.3.12",
"@jridgewell/trace-mapping": "^0.3.28",
"jsesc": "^3.0.2"
@@ -260,13 +523,13 @@
}
},
"node_modules/@babel/helper-create-regexp-features-plugin": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz",
- "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==",
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz",
+ "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==",
"license": "MIT",
"dependencies": {
- "@babel/helper-annotate-as-pure": "^7.27.1",
- "regexpu-core": "^6.2.0",
+ "@babel/helper-annotate-as-pure": "^7.27.3",
+ "regexpu-core": "^6.3.1",
"semver": "^6.3.1"
},
"engines": {
@@ -277,9 +540,9 @@
}
},
"node_modules/@babel/helper-define-polyfill-provider": {
- "version": "0.6.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.6.tgz",
- "integrity": "sha512-mOAsxeeKkUKayvZR3HeTYD/fICpCPLJrU5ZjelT/PA6WHtNDBOE436YiaEUvHN454bRM3CebhDsIpieCc4texA==",
+ "version": "0.6.8",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz",
+ "integrity": "sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==",
"license": "MIT",
"dependencies": {
"@babel/helper-compilation-targets": "^7.28.6",
@@ -292,6 +555,26 @@
"@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
}
},
+ "node_modules/@babel/helper-define-polyfill-provider/node_modules/resolve": {
+ "version": "1.22.11",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz",
+ "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==",
+ "license": "MIT",
+ "dependencies": {
+ "is-core-module": "^2.16.1",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/@babel/helper-globals": {
"version": "7.28.0",
"resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
@@ -328,14 +611,14 @@
}
},
"node_modules/@babel/helper-module-transforms": {
- "version": "7.28.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz",
- "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz",
+ "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==",
"license": "MIT",
"dependencies": {
- "@babel/helper-module-imports": "^7.27.1",
- "@babel/helper-validator-identifier": "^7.27.1",
- "@babel/traverse": "^7.28.3"
+ "@babel/helper-module-imports": "^7.28.6",
+ "@babel/helper-validator-identifier": "^7.28.5",
+ "@babel/traverse": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
@@ -454,111 +737,25 @@
}
},
"node_modules/@babel/helpers": {
- "version": "7.28.4",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz",
- "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==",
+ "version": "7.29.2",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz",
+ "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==",
"license": "MIT",
"dependencies": {
- "@babel/template": "^7.27.2",
- "@babel/types": "^7.28.4"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/highlight": {
- "version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz",
- "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-validator-identifier": "^7.25.9",
- "chalk": "^2.4.2",
- "js-tokens": "^4.0.0",
- "picocolors": "^1.0.0"
+ "@babel/template": "^7.28.6",
+ "@babel/types": "^7.29.0"
},
"engines": {
"node": ">=6.9.0"
}
},
- "node_modules/@babel/highlight/node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "license": "MIT",
- "dependencies": {
- "color-convert": "^1.9.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@babel/highlight/node_modules/chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@babel/highlight/node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "license": "MIT",
- "dependencies": {
- "color-name": "1.1.3"
- }
- },
- "node_modules/@babel/highlight/node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "license": "MIT"
- },
- "node_modules/@babel/highlight/node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "license": "MIT",
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/@babel/highlight/node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@babel/highlight/node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "license": "MIT",
- "dependencies": {
- "has-flag": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/@babel/parser": {
- "version": "7.28.6",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz",
- "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==",
+ "version": "7.29.2",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz",
+ "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==",
"license": "MIT",
"dependencies": {
- "@babel/types": "^7.28.6"
+ "@babel/types": "^7.29.0"
},
"bin": {
"parser": "bin/babel-parser.js"
@@ -568,12 +765,14 @@
}
},
"node_modules/@babel/plugin-proposal-decorators": {
- "version": "7.28.0",
- "integrity": "sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==",
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.29.0.tgz",
+ "integrity": "sha512-CVBVv3VY/XRMxRYq5dwr2DS7/MvqPm23cOCjbwNnVrfOqcWlnefua1uUs0sjdKOGjvPUG633o07uWzJq4oI6dA==",
+ "license": "MIT",
"dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.27.1",
- "@babel/helper-plugin-utils": "^7.27.1",
- "@babel/plugin-syntax-decorators": "^7.27.1"
+ "@babel/helper-create-class-features-plugin": "^7.28.6",
+ "@babel/helper-plugin-utils": "^7.28.6",
+ "@babel/plugin-syntax-decorators": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
@@ -649,12 +848,12 @@
}
},
"node_modules/@babel/plugin-syntax-decorators": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz",
- "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.28.6.tgz",
+ "integrity": "sha512-71EYI0ONURHJBL4rSFXnITXqXrrY8q4P0q006DPfN+Rk+ASM+++IBXem/ruokgBZR8YNEWZ8R6B+rCb8VcUTqA==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
+ "@babel/helper-plugin-utils": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
@@ -706,12 +905,12 @@
}
},
"node_modules/@babel/plugin-syntax-import-attributes": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz",
- "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz",
+ "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
+ "@babel/helper-plugin-utils": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
@@ -862,12 +1061,12 @@
}
},
"node_modules/@babel/plugin-syntax-typescript": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz",
- "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz",
+ "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
+ "@babel/helper-plugin-utils": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
@@ -892,14 +1091,14 @@
}
},
"node_modules/@babel/plugin-transform-async-generator-functions": {
- "version": "7.28.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.6.tgz",
- "integrity": "sha512-9knsChgsMzBV5Yh3kkhrZNxH3oCYAfMBkNNaVN4cP2RVlFPe8wYdwwcnOsAbkdDoV9UjFtOXWrWB52M8W4jNeA==",
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.0.tgz",
+ "integrity": "sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==",
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.28.6",
"@babel/helper-remap-async-to-generator": "^7.27.1",
- "@babel/traverse": "^7.28.6"
+ "@babel/traverse": "^7.29.0"
},
"engines": {
"node": ">=6.9.0"
@@ -941,13 +1140,13 @@
}
},
"node_modules/@babel/plugin-transform-class-properties": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz",
- "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz",
+ "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==",
"license": "MIT",
"dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.27.1",
- "@babel/helper-plugin-utils": "^7.27.1"
+ "@babel/helper-create-class-features-plugin": "^7.28.6",
+ "@babel/helper-plugin-utils": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
@@ -973,17 +1172,17 @@
}
},
"node_modules/@babel/plugin-transform-classes": {
- "version": "7.28.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz",
- "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz",
+ "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==",
"license": "MIT",
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.27.3",
- "@babel/helper-compilation-targets": "^7.27.2",
+ "@babel/helper-compilation-targets": "^7.28.6",
"@babel/helper-globals": "^7.28.0",
- "@babel/helper-plugin-utils": "^7.27.1",
- "@babel/helper-replace-supers": "^7.27.1",
- "@babel/traverse": "^7.28.4"
+ "@babel/helper-plugin-utils": "^7.28.6",
+ "@babel/helper-replace-supers": "^7.28.6",
+ "@babel/traverse": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
@@ -1119,13 +1318,13 @@
}
},
"node_modules/@babel/plugin-transform-modules-commonjs": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz",
- "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz",
+ "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==",
"license": "MIT",
"dependencies": {
- "@babel/helper-module-transforms": "^7.27.1",
- "@babel/helper-plugin-utils": "^7.27.1"
+ "@babel/helper-module-transforms": "^7.28.6",
+ "@babel/helper-plugin-utils": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
@@ -1135,13 +1334,13 @@
}
},
"node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz",
- "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==",
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.0.tgz",
+ "integrity": "sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==",
"license": "MIT",
"dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.27.1",
- "@babel/helper-plugin-utils": "^7.27.1"
+ "@babel/helper-create-regexp-features-plugin": "^7.28.5",
+ "@babel/helper-plugin-utils": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
@@ -1151,12 +1350,12 @@
}
},
"node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz",
- "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz",
+ "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1"
+ "@babel/helper-plugin-utils": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
@@ -1215,12 +1414,12 @@
}
},
"node_modules/@babel/plugin-transform-optional-chaining": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz",
- "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz",
+ "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==",
"license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.28.6",
"@babel/helper-skip-transparent-expression-wrappers": "^7.27.1"
},
"engines": {
@@ -1374,9 +1573,9 @@
}
},
"node_modules/@babel/plugin-transform-regenerator": {
- "version": "7.28.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.6.tgz",
- "integrity": "sha512-eZhoEZHYQLL5uc1gS5e9/oTknS0sSSAtd5TkKMUp3J+S/CaUjagc0kOUPsEbDmMeva0nC3WWl4SxVY6+OBuxfw==",
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.0.tgz",
+ "integrity": "sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==",
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.28.6"
@@ -1389,13 +1588,13 @@
}
},
"node_modules/@babel/plugin-transform-runtime": {
- "version": "7.28.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.5.tgz",
- "integrity": "sha512-20NUVgOrinudkIBzQ2bNxP08YpKprUkRTiRSd2/Z5GOdPImJGkoN4Z7IQe1T5AdyKI1i5L6RBmluqdSzvaq9/w==",
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.0.tgz",
+ "integrity": "sha512-jlaRT5dJtMaMCV6fAuLbsQMSwz/QkvaHOHOSXRitGGwSpR1blCY4KUKoyP2tYO8vJcqYe8cEj96cqSztv3uF9w==",
"license": "MIT",
"dependencies": {
- "@babel/helper-module-imports": "^7.27.1",
- "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-module-imports": "^7.28.6",
+ "@babel/helper-plugin-utils": "^7.28.6",
"babel-plugin-polyfill-corejs2": "^0.4.14",
"babel-plugin-polyfill-corejs3": "^0.13.0",
"babel-plugin-polyfill-regenerator": "^0.6.5",
@@ -1470,16 +1669,16 @@
}
},
"node_modules/@babel/plugin-transform-typescript": {
- "version": "7.28.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.0.tgz",
- "integrity": "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==",
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz",
+ "integrity": "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==",
"license": "MIT",
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.27.3",
- "@babel/helper-create-class-features-plugin": "^7.27.1",
- "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-create-class-features-plugin": "^7.28.6",
+ "@babel/helper-plugin-utils": "^7.28.6",
"@babel/helper-skip-transparent-expression-wrappers": "^7.27.1",
- "@babel/plugin-syntax-typescript": "^7.27.1"
+ "@babel/plugin-syntax-typescript": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
@@ -1525,16 +1724,16 @@
}
},
"node_modules/@babel/preset-typescript": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz",
- "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==",
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz",
+ "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==",
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.27.1",
"@babel/helper-validator-option": "^7.27.1",
"@babel/plugin-syntax-jsx": "^7.27.1",
"@babel/plugin-transform-modules-commonjs": "^7.27.1",
- "@babel/plugin-transform-typescript": "^7.27.1"
+ "@babel/plugin-transform-typescript": "^7.28.5"
},
"engines": {
"node": ">=6.9.0"
@@ -1544,9 +1743,9 @@
}
},
"node_modules/@babel/runtime": {
- "version": "7.28.4",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz",
- "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==",
+ "version": "7.29.2",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz",
+ "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@@ -1567,36 +1766,17 @@
}
},
"node_modules/@babel/traverse": {
- "version": "7.28.6",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz",
- "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==",
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.28.6",
- "@babel/generator": "^7.28.6",
- "@babel/helper-globals": "^7.28.0",
- "@babel/parser": "^7.28.6",
- "@babel/template": "^7.28.6",
- "@babel/types": "^7.28.6",
- "debug": "^4.3.1"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/traverse--for-generate-function-map": {
- "name": "@babel/traverse",
- "version": "7.28.6",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz",
- "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==",
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz",
+ "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==",
"license": "MIT",
"dependencies": {
- "@babel/code-frame": "^7.28.6",
- "@babel/generator": "^7.28.6",
+ "@babel/code-frame": "^7.29.0",
+ "@babel/generator": "^7.29.0",
"@babel/helper-globals": "^7.28.0",
- "@babel/parser": "^7.28.6",
+ "@babel/parser": "^7.29.0",
"@babel/template": "^7.28.6",
- "@babel/types": "^7.28.6",
+ "@babel/types": "^7.29.0",
"debug": "^4.3.1"
},
"engines": {
@@ -1604,9 +1784,9 @@
}
},
"node_modules/@babel/types": {
- "version": "7.28.6",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz",
- "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==",
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz",
+ "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==",
"license": "MIT",
"dependencies": {
"@babel/helper-string-parser": "^7.27.1",
@@ -1644,52 +1824,6 @@
"react-native-bottom-tabs": "*"
}
},
- "node_modules/@bottom-tabs/react-navigation/node_modules/color": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/color/-/color-5.0.2.tgz",
- "integrity": "sha512-e2hz5BzbUPcYlIRHo8ieAhYgoajrJr+hWoceg6E345TPsATMUKqDgzt8fSXZJJbxfpiPzkWyphz8yn8At7q3fA==",
- "license": "MIT",
- "dependencies": {
- "color-convert": "^3.0.1",
- "color-string": "^2.0.0"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@bottom-tabs/react-navigation/node_modules/color-convert": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.2.tgz",
- "integrity": "sha512-UNqkvCDXstVck3kdowtOTWROIJQwafjOfXSmddoDrXo4cewMKmusCeF22Q24zvjR8nwWib/3S/dfyzPItPEiJg==",
- "license": "MIT",
- "dependencies": {
- "color-name": "^2.0.0"
- },
- "engines": {
- "node": ">=14.6"
- }
- },
- "node_modules/@bottom-tabs/react-navigation/node_modules/color-name": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.0.2.tgz",
- "integrity": "sha512-9vEt7gE16EW7Eu7pvZnR0abW9z6ufzhXxGXZEVU9IqPdlsUiMwJeJfRtq0zePUmnbHGT9zajca7mX8zgoayo4A==",
- "license": "MIT",
- "engines": {
- "node": ">=12.20"
- }
- },
- "node_modules/@bottom-tabs/react-navigation/node_modules/color-string": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.2.tgz",
- "integrity": "sha512-RxmjYxbWemV9gKu4zPgiZagUxbH3RQpEIO77XoSSX0ivgABDZ+h8Zuash/EMFLTI4N9QgFPOJ6JQpPZKFxa+dA==",
- "license": "MIT",
- "dependencies": {
- "color-name": "^2.0.0"
- },
- "engines": {
- "node": ">=18"
- }
- },
"node_modules/@callstack/liquid-glass": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/@callstack/liquid-glass/-/liquid-glass-0.4.3.tgz",
@@ -1716,9 +1850,9 @@
}
},
"node_modules/@eslint-community/eslint-utils": {
- "version": "4.9.0",
- "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz",
- "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==",
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz",
+ "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==",
"license": "MIT",
"dependencies": {
"eslint-visitor-keys": "^3.4.3"
@@ -1746,24 +1880,24 @@
}
},
"node_modules/@eslint-community/regexpp": {
- "version": "4.12.1",
- "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
- "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
+ "version": "4.12.2",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
+ "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
"license": "MIT",
"engines": {
"node": "^12.0.0 || ^14.0.0 || >=16.0.0"
}
},
"node_modules/@eslint/config-array": {
- "version": "0.21.1",
- "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz",
- "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==",
+ "version": "0.21.2",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz",
+ "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==",
"license": "Apache-2.0",
"peer": true,
"dependencies": {
"@eslint/object-schema": "^2.1.7",
"debug": "^4.3.1",
- "minimatch": "^3.1.2"
+ "minimatch": "^3.1.5"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1796,20 +1930,20 @@
}
},
"node_modules/@eslint/eslintrc": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz",
- "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==",
+ "version": "3.3.5",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz",
+ "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==",
"license": "MIT",
"peer": true,
"dependencies": {
- "ajv": "^6.12.4",
+ "ajv": "^6.14.0",
"debug": "^4.3.2",
"espree": "^10.0.1",
"globals": "^14.0.0",
"ignore": "^5.2.0",
"import-fresh": "^3.2.1",
"js-yaml": "^4.1.1",
- "minimatch": "^3.1.2",
+ "minimatch": "^3.1.5",
"strip-json-comments": "^3.1.1"
},
"engines": {
@@ -1819,81 +1953,10 @@
"url": "https://opencollective.com/eslint"
}
},
- "node_modules/@eslint/eslintrc/node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/@eslint/eslintrc/node_modules/argparse": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
- "license": "Python-2.0",
- "peer": true
- },
- "node_modules/@eslint/eslintrc/node_modules/import-fresh": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
- "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "parent-module": "^1.0.0",
- "resolve-from": "^4.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@eslint/eslintrc/node_modules/js-yaml": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
- "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "argparse": "^2.0.1"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
- },
- "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "license": "MIT",
- "peer": true
- },
- "node_modules/@eslint/eslintrc/node_modules/resolve-from": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
- "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/@eslint/js": {
- "version": "9.39.2",
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz",
- "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==",
+ "version": "9.39.4",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz",
+ "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==",
"license": "MIT",
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1926,6 +1989,12 @@
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
+ "node_modules/@expo-google-fonts/material-symbols": {
+ "version": "0.4.28",
+ "resolved": "https://registry.npmjs.org/@expo-google-fonts/material-symbols/-/material-symbols-0.4.28.tgz",
+ "integrity": "sha512-59qFO6w4W/wUZ6VuYfN1wtgyk4zFJspbKOdHYISMeDa2H4apZKY0Ab7K5ouee+C+s3/VfAp6tLK7ov+PsENhKw==",
+ "license": "MIT AND Apache-2.0"
+ },
"node_modules/@expo/code-signing-certificates": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.6.tgz",
@@ -1936,35 +2005,33 @@
}
},
"node_modules/@expo/config": {
- "version": "12.0.13",
- "resolved": "https://registry.npmjs.org/@expo/config/-/config-12.0.13.tgz",
- "integrity": "sha512-Cu52arBa4vSaupIWsF0h7F/Cg//N374nYb7HAxV0I4KceKA7x2UXpYaHOL7EEYYvp7tZdThBjvGpVmr8ScIvaQ==",
+ "version": "55.0.12",
+ "resolved": "https://registry.npmjs.org/@expo/config/-/config-55.0.12.tgz",
+ "integrity": "sha512-qVih0IrjupykH/yAUilZqW1RCpqm8TKG8XJabji2VHI1LstGqw0NJAsBjX927yns08u/fFJTwOsB4PYOoq1HiA==",
"license": "MIT",
"dependencies": {
- "@babel/code-frame": "~7.10.4",
- "@expo/config-plugins": "~54.0.4",
- "@expo/config-types": "^54.0.10",
- "@expo/json-file": "^10.0.8",
+ "@expo/config-plugins": "~55.0.7",
+ "@expo/config-types": "^55.0.5",
+ "@expo/json-file": "^10.0.13",
+ "@expo/require-utils": "^55.0.3",
"deepmerge": "^4.3.1",
"getenv": "^2.0.0",
"glob": "^13.0.0",
- "require-from-string": "^2.0.2",
"resolve-from": "^5.0.0",
"resolve-workspace-root": "^2.0.0",
"semver": "^7.6.0",
- "slugify": "^1.3.4",
- "sucrase": "~3.35.1"
+ "slugify": "^1.3.4"
}
},
"node_modules/@expo/config-plugins": {
- "version": "54.0.4",
- "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-54.0.4.tgz",
- "integrity": "sha512-g2yXGICdoOw5i3LkQSDxl2Q5AlQCrG7oniu0pCPPO+UxGb7He4AFqSvPSy8HpRUj55io17hT62FTjYRD+d6j3Q==",
+ "version": "55.0.7",
+ "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-55.0.7.tgz",
+ "integrity": "sha512-XZUoDWrsHEkH3yasnDSJABM/UxP5a1ixzRwU/M+BToyn/f0nTrSJJe/Ay/FpxkI4JSNz2n0e06I23b2bleXKVA==",
"license": "MIT",
"dependencies": {
- "@expo/config-types": "^54.0.10",
- "@expo/json-file": "~10.0.8",
- "@expo/plist": "^0.4.8",
+ "@expo/config-types": "^55.0.5",
+ "@expo/json-file": "~10.0.12",
+ "@expo/plist": "^0.5.2",
"@expo/sdk-runtime-versions": "^1.0.0",
"chalk": "^4.1.2",
"debug": "^4.3.5",
@@ -1972,48 +2039,15 @@
"glob": "^13.0.0",
"resolve-from": "^5.0.0",
"semver": "^7.5.4",
- "slash": "^3.0.0",
"slugify": "^1.6.6",
"xcode": "^3.0.1",
"xml2js": "0.6.0"
}
},
- "node_modules/@expo/config-plugins/node_modules/glob": {
- "version": "13.0.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz",
- "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==",
- "license": "BlueOak-1.0.0",
- "dependencies": {
- "minimatch": "^10.1.1",
- "minipass": "^7.1.2",
- "path-scurry": "^2.0.0"
- },
- "engines": {
- "node": "20 || >=22"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/@expo/config-plugins/node_modules/minimatch": {
- "version": "10.1.1",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz",
- "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==",
- "license": "BlueOak-1.0.0",
- "dependencies": {
- "@isaacs/brace-expansion": "^5.0.0"
- },
- "engines": {
- "node": "20 || >=22"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"node_modules/@expo/config-plugins/node_modules/semver": {
- "version": "7.7.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
- "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@@ -2023,56 +2057,15 @@
}
},
"node_modules/@expo/config-types": {
- "version": "54.0.10",
- "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-54.0.10.tgz",
- "integrity": "sha512-/J16SC2an1LdtCZ67xhSkGXpALYUVUNyZws7v+PVsFZxClYehDSoKLqyRaGkpHlYrCc08bS0RF5E0JV6g50psA==",
+ "version": "55.0.5",
+ "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-55.0.5.tgz",
+ "integrity": "sha512-sCmSUZG4mZ/ySXvfyyBdhjivz8Q539X1NondwDdYG7s3SBsk+wsgPJzYsqgAG/P9+l0xWjUD2F+kQ1cAJ6NNLg==",
"license": "MIT"
},
- "node_modules/@expo/config/node_modules/@babel/code-frame": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
- "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
- "license": "MIT",
- "dependencies": {
- "@babel/highlight": "^7.10.4"
- }
- },
- "node_modules/@expo/config/node_modules/glob": {
- "version": "13.0.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz",
- "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==",
- "license": "BlueOak-1.0.0",
- "dependencies": {
- "minimatch": "^10.1.1",
- "minipass": "^7.1.2",
- "path-scurry": "^2.0.0"
- },
- "engines": {
- "node": "20 || >=22"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/@expo/config/node_modules/minimatch": {
- "version": "10.1.1",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz",
- "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==",
- "license": "BlueOak-1.0.0",
- "dependencies": {
- "@isaacs/brace-expansion": "^5.0.0"
- },
- "engines": {
- "node": "20 || >=22"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"node_modules/@expo/config/node_modules/semver": {
- "version": "7.7.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
- "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@@ -2101,9 +2094,9 @@
}
},
"node_modules/@expo/devtools": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-0.1.8.tgz",
- "integrity": "sha512-SVLxbuanDjJPgc0sy3EfXUMLb/tXzp6XIHkhtPVmTWJAp+FOr6+5SeiCfJrCzZFet0Ifyke2vX3sFcKwEvCXwQ==",
+ "version": "55.0.2",
+ "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-55.0.2.tgz",
+ "integrity": "sha512-4VsFn9MUriocyuhyA+ycJP3TJhUsOFHDc270l9h3LhNpXMf6wvIdGcA0QzXkZtORXmlDybWXRP2KT1k36HcQkA==",
"license": "MIT",
"dependencies": {
"chalk": "^4.1.2"
@@ -2121,25 +2114,38 @@
}
}
},
+ "node_modules/@expo/dom-webview": {
+ "version": "55.0.5",
+ "resolved": "https://registry.npmjs.org/@expo/dom-webview/-/dom-webview-55.0.5.tgz",
+ "integrity": "sha512-lt3uxYOCk3wmWvtOOvsC35CKGbDAOx5C2EaY8SH1JVSfBzqmF8Cs0Xp1MPxncDPMyxpMiWx5SvvV/iLF1rJU4A==",
+ "license": "MIT",
+ "peerDependencies": {
+ "expo": "*",
+ "react": "*",
+ "react-native": "*"
+ }
+ },
"node_modules/@expo/env": {
- "version": "2.0.8",
- "resolved": "https://registry.npmjs.org/@expo/env/-/env-2.0.8.tgz",
- "integrity": "sha512-5VQD6GT8HIMRaSaB5JFtOXuvfDVU80YtZIuUT/GDhUF782usIXY13Tn3IdDz1Tm/lqA9qnRZQ1BF4t7LlvdJPA==",
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/@expo/env/-/env-2.1.1.tgz",
+ "integrity": "sha512-rVvHC4I6xlPcg+mAO09ydUi2Wjv1ZytpLmHOSzvXzBAz9mMrJggqCe4s4dubjJvi/Ino/xQCLhbaLCnTtLpikg==",
"license": "MIT",
"dependencies": {
"chalk": "^4.0.0",
"debug": "^4.3.4",
- "dotenv": "~16.4.5",
- "dotenv-expand": "~11.0.6",
"getenv": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=20.12.0"
}
},
"node_modules/@expo/fingerprint": {
- "version": "0.15.4",
- "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.15.4.tgz",
- "integrity": "sha512-eYlxcrGdR2/j2M6pEDXo9zU9KXXF1vhP+V+Tl+lyY+bU8lnzrN6c637mz6Ye3em2ANy8hhUR03Raf8VsT9Ogng==",
+ "version": "0.16.6",
+ "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.16.6.tgz",
+ "integrity": "sha512-nRITNbnu3RKSHPvKVehrSU4KG2VY9V8nvULOHBw98ukHCAU4bGrU5APvcblOkX3JAap+xEHsg/mZvqlvkLInmQ==",
"license": "MIT",
"dependencies": {
+ "@expo/env": "^2.0.11",
"@expo/spawn-async": "^1.7.2",
"arg": "^5.0.2",
"chalk": "^4.1.2",
@@ -2147,8 +2153,7 @@
"getenv": "^2.0.0",
"glob": "^13.0.0",
"ignore": "^5.3.1",
- "minimatch": "^9.0.0",
- "p-limit": "^3.1.0",
+ "minimatch": "^10.2.2",
"resolve-from": "^5.0.0",
"semver": "^7.6.0"
},
@@ -2156,66 +2161,46 @@
"fingerprint": "bin/cli.js"
}
},
- "node_modules/@expo/fingerprint/node_modules/brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "node_modules/@expo/fingerprint/node_modules/balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
"license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/@expo/fingerprint/node_modules/glob": {
- "version": "13.0.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz",
- "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==",
- "license": "BlueOak-1.0.0",
- "dependencies": {
- "minimatch": "^10.1.1",
- "minipass": "^7.1.2",
- "path-scurry": "^2.0.0"
- },
"engines": {
- "node": "20 || >=22"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "node": "18 || 20 || >=22"
}
},
- "node_modules/@expo/fingerprint/node_modules/glob/node_modules/minimatch": {
- "version": "10.1.1",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz",
- "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==",
- "license": "BlueOak-1.0.0",
+ "node_modules/@expo/fingerprint/node_modules/brace-expansion": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz",
+ "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==",
+ "license": "MIT",
"dependencies": {
- "@isaacs/brace-expansion": "^5.0.0"
+ "balanced-match": "^4.0.2"
},
"engines": {
- "node": "20 || >=22"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "node": "18 || 20 || >=22"
}
},
"node_modules/@expo/fingerprint/node_modules/minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
- "license": "ISC",
+ "version": "10.2.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
+ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "brace-expansion": "^2.0.1"
+ "brace-expansion": "^5.0.5"
},
"engines": {
- "node": ">=16 || 14 >=14.17"
+ "node": "18 || 20 || >=22"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/@expo/fingerprint/node_modules/semver": {
- "version": "7.7.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
- "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@@ -2225,9 +2210,9 @@
}
},
"node_modules/@expo/image-utils": {
- "version": "0.8.8",
- "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.8.8.tgz",
- "integrity": "sha512-HHHaG4J4nKjTtVa1GG9PCh763xlETScfEyNxxOvfTRr8IKPJckjTyqSLEtdJoFNJ1vqiABEjW7tqGhqGibZLeA==",
+ "version": "0.8.12",
+ "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.8.12.tgz",
+ "integrity": "sha512-3KguH7kyKqq7pNwLb9j6BBdD/bjmNwXZG/HPWT6GWIXbwrvAJt2JNyYTP5agWJ8jbbuys1yuCzmkX+TU6rmI7A==",
"license": "MIT",
"dependencies": {
"@expo/spawn-async": "^1.7.2",
@@ -2236,16 +2221,13 @@
"jimp-compact": "0.16.1",
"parse-png": "^2.1.0",
"resolve-from": "^5.0.0",
- "resolve-global": "^1.0.0",
- "semver": "^7.6.0",
- "temp-dir": "~2.0.0",
- "unique-string": "~2.0.0"
+ "semver": "^7.6.0"
}
},
"node_modules/@expo/image-utils/node_modules/semver": {
- "version": "7.7.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
- "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@@ -2255,71 +2237,87 @@
}
},
"node_modules/@expo/json-file": {
- "version": "10.0.8",
- "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.0.8.tgz",
- "integrity": "sha512-9LOTh1PgKizD1VXfGQ88LtDH0lRwq9lsTb4aichWTWSWqy3Ugfkhfm3BhzBIkJJfQQ5iJu3m/BoRlEIjoCGcnQ==",
+ "version": "10.0.13",
+ "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.0.13.tgz",
+ "integrity": "sha512-pX/XjQn7tgNw6zuuV2ikmegmwe/S7uiwhrs2wXrANMkq7ozrA+JcZwgW9Q/8WZgciBzfAhNp5hnackHcrmapQA==",
"license": "MIT",
"dependencies": {
- "@babel/code-frame": "~7.10.4",
+ "@babel/code-frame": "^7.20.0",
"json5": "^2.2.3"
}
},
- "node_modules/@expo/json-file/node_modules/@babel/code-frame": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
- "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+ "node_modules/@expo/local-build-cache-provider": {
+ "version": "55.0.8",
+ "resolved": "https://registry.npmjs.org/@expo/local-build-cache-provider/-/local-build-cache-provider-55.0.8.tgz",
+ "integrity": "sha512-jRr1cmrAuSkRa60dx9zWhALNfRJd/jUP+hKjywqpzE9GioFv9I5FXm6f4W1qLzskV8VutZ8alN6Yn3Vhu/ZJ6w==",
+ "license": "MIT",
+ "dependencies": {
+ "@expo/config": "~55.0.11",
+ "chalk": "^4.1.2"
+ }
+ },
+ "node_modules/@expo/log-box": {
+ "version": "55.0.10",
+ "resolved": "https://registry.npmjs.org/@expo/log-box/-/log-box-55.0.10.tgz",
+ "integrity": "sha512-7jdikExgIrCIF5e3P1qMwcUZ2tcxrNdVqE9Y8kNMUHqZ+ipMlin+SiZwJKHM1+am4CYGjhdyrzbnIpvEcLDYcg==",
"license": "MIT",
"dependencies": {
- "@babel/highlight": "^7.10.4"
+ "@expo/dom-webview": "^55.0.5",
+ "anser": "^1.4.9",
+ "stacktrace-parser": "^0.1.10"
+ },
+ "peerDependencies": {
+ "@expo/dom-webview": "^55.0.5",
+ "expo": "*",
+ "react": "*",
+ "react-native": "*"
}
},
"node_modules/@expo/metro": {
- "version": "54.2.0",
- "resolved": "https://registry.npmjs.org/@expo/metro/-/metro-54.2.0.tgz",
- "integrity": "sha512-h68TNZPGsk6swMmLm9nRSnE2UXm48rWwgcbtAHVMikXvbxdS41NDHHeqg1rcQ9AbznDRp6SQVC2MVpDnsRKU1w==",
- "license": "MIT",
- "dependencies": {
- "metro": "0.83.3",
- "metro-babel-transformer": "0.83.3",
- "metro-cache": "0.83.3",
- "metro-cache-key": "0.83.3",
- "metro-config": "0.83.3",
- "metro-core": "0.83.3",
- "metro-file-map": "0.83.3",
- "metro-minify-terser": "0.83.3",
- "metro-resolver": "0.83.3",
- "metro-runtime": "0.83.3",
- "metro-source-map": "0.83.3",
- "metro-symbolicate": "0.83.3",
- "metro-transform-plugins": "0.83.3",
- "metro-transform-worker": "0.83.3"
+ "version": "55.0.0",
+ "resolved": "https://registry.npmjs.org/@expo/metro/-/metro-55.0.0.tgz",
+ "integrity": "sha512-wohGl+4y17rGHU+lq8UqC5neOXL/HOThorDYXTMbOcBL1jYwcK11MBc151gDMpjpgdVUzgHne0H5RfCIhIN4hA==",
+ "license": "MIT",
+ "dependencies": {
+ "metro": "0.83.5",
+ "metro-babel-transformer": "0.83.5",
+ "metro-cache": "0.83.5",
+ "metro-cache-key": "0.83.5",
+ "metro-config": "0.83.5",
+ "metro-core": "0.83.5",
+ "metro-file-map": "0.83.5",
+ "metro-minify-terser": "0.83.5",
+ "metro-resolver": "0.83.5",
+ "metro-runtime": "0.83.5",
+ "metro-source-map": "0.83.5",
+ "metro-symbolicate": "0.83.5",
+ "metro-transform-plugins": "0.83.5",
+ "metro-transform-worker": "0.83.5"
}
},
"node_modules/@expo/metro-config": {
- "version": "54.0.14",
- "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-54.0.14.tgz",
- "integrity": "sha512-hxpLyDfOR4L23tJ9W1IbJJsG7k4lv2sotohBm/kTYyiG+pe1SYCAWsRmgk+H42o/wWf/HQjE5k45S5TomGLxNA==",
+ "version": "55.0.13",
+ "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-55.0.13.tgz",
+ "integrity": "sha512-uBfyCJCnoPvkqKQF8nz0uQBuimPe7EqU1yd8Gs0Y2gTTRQ8X5Rob/iI0ldLYURmYLYsopWhzvpwq++HO9DmShw==",
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.20.0",
"@babel/core": "^7.20.0",
"@babel/generator": "^7.20.5",
- "@expo/config": "~12.0.13",
- "@expo/env": "~2.0.8",
- "@expo/json-file": "~10.0.8",
- "@expo/metro": "~54.2.0",
+ "@expo/config": "~55.0.12",
+ "@expo/env": "~2.1.1",
+ "@expo/json-file": "~10.0.13",
+ "@expo/metro": "~55.0.0",
"@expo/spawn-async": "^1.7.2",
"browserslist": "^4.25.0",
"chalk": "^4.1.0",
"debug": "^4.3.2",
- "dotenv": "~16.4.5",
- "dotenv-expand": "~11.0.6",
"getenv": "^2.0.0",
"glob": "^13.0.0",
- "hermes-parser": "^0.29.1",
+ "hermes-parser": "^0.32.0",
"jsc-safe-url": "^0.2.4",
"lightningcss": "^1.30.1",
- "minimatch": "^9.0.0",
+ "picomatch": "^4.0.3",
"postcss": "~8.4.32",
"resolve-from": "^5.0.0"
},
@@ -2332,68 +2330,13 @@
}
}
},
- "node_modules/@expo/metro-config/node_modules/brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/@expo/metro-config/node_modules/glob": {
- "version": "13.0.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz",
- "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==",
- "license": "BlueOak-1.0.0",
- "dependencies": {
- "minimatch": "^10.1.1",
- "minipass": "^7.1.2",
- "path-scurry": "^2.0.0"
- },
- "engines": {
- "node": "20 || >=22"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/@expo/metro-config/node_modules/glob/node_modules/minimatch": {
- "version": "10.1.1",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz",
- "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==",
- "license": "BlueOak-1.0.0",
- "dependencies": {
- "@isaacs/brace-expansion": "^5.0.0"
- },
- "engines": {
- "node": "20 || >=22"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/@expo/metro-config/node_modules/minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"node_modules/@expo/metro-runtime": {
- "version": "6.1.2",
- "resolved": "https://registry.npmjs.org/@expo/metro-runtime/-/metro-runtime-6.1.2.tgz",
- "integrity": "sha512-nvM+Qv45QH7pmYvP8JB1G8JpScrWND3KrMA6ZKe62cwwNiX/BjHU28Ear0v/4bQWXlOY0mv6B8CDIm8JxXde9g==",
+ "version": "55.0.9",
+ "resolved": "https://registry.npmjs.org/@expo/metro-runtime/-/metro-runtime-55.0.9.tgz",
+ "integrity": "sha512-H37b2Mc/8GiQbwtUFzUTxA3KsAMZu00SRg/RhbHa9xVE7J0n5ZX4NHy0LJEFAbkzTb1TUy1hLpo3oEKnG+rLyg==",
"license": "MIT",
"dependencies": {
+ "@expo/log-box": "55.0.10",
"anser": "^1.4.9",
"pretty-format": "^29.7.0",
"stacktrace-parser": "^0.1.10",
@@ -2579,45 +2522,25 @@
"win32"
]
},
- "node_modules/@expo/ngrok/node_modules/uuid": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
- "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
- "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.",
- "license": "MIT",
- "bin": {
- "uuid": "bin/uuid"
- }
- },
- "node_modules/@expo/ngrok/node_modules/yaml": {
- "version": "1.10.2",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
- "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
- "license": "ISC",
- "engines": {
- "node": ">= 6"
- }
- },
"node_modules/@expo/osascript": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.3.8.tgz",
- "integrity": "sha512-/TuOZvSG7Nn0I8c+FcEaoHeBO07yu6vwDgk7rZVvAXoeAK5rkA09jRyjYsZo+0tMEFaToBeywA6pj50Mb3ny9w==",
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.4.2.tgz",
+ "integrity": "sha512-/XP7PSYF2hzOZzqfjgkoWtllyeTN8dW3aM4P6YgKcmmPikKL5FdoyQhti4eh6RK5a5VrUXJTOlTNIpIHsfB5Iw==",
"license": "MIT",
"dependencies": {
- "@expo/spawn-async": "^1.7.2",
- "exec-async": "^2.2.0"
+ "@expo/spawn-async": "^1.7.2"
},
"engines": {
"node": ">=12"
}
},
"node_modules/@expo/package-manager": {
- "version": "1.9.10",
- "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.9.10.tgz",
- "integrity": "sha512-axJm+NOj3jVxep49va/+L3KkF3YW/dkV+RwzqUJedZrv4LeTqOG4rhrCaCPXHTvLqCTDKu6j0Xyd28N7mnxsGA==",
+ "version": "1.10.3",
+ "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.10.3.tgz",
+ "integrity": "sha512-ZuXiK/9fCrIuLjPSe1VYmfp0Sa85kCMwd8QQpgyi5ufppYKRtLBg14QOgUqj8ZMbJTxE0xqzd0XR7kOs3vAK9A==",
"license": "MIT",
"dependencies": {
- "@expo/json-file": "^10.0.8",
+ "@expo/json-file": "^10.0.12",
"@expo/spawn-async": "^1.7.2",
"chalk": "^4.0.0",
"npm-package-arg": "^11.0.0",
@@ -2626,28 +2549,28 @@
}
},
"node_modules/@expo/plist": {
- "version": "0.4.8",
- "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.4.8.tgz",
- "integrity": "sha512-pfNtErGGzzRwHP+5+RqswzPDKkZrx+Cli0mzjQaus1ZWFsog5ibL+nVT3NcporW51o8ggnt7x813vtRbPiyOrQ==",
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.5.2.tgz",
+ "integrity": "sha512-o4xdVdBpe4aTl3sPMZ2u3fJH4iG1I768EIRk1xRZP+GaFI93MaR3JvoFibYqxeTmLQ1p1kNEVqylfUjezxx45g==",
"license": "MIT",
"dependencies": {
"@xmldom/xmldom": "^0.8.8",
- "base64-js": "^1.2.3",
+ "base64-js": "^1.5.1",
"xmlbuilder": "^15.1.1"
}
},
"node_modules/@expo/prebuild-config": {
- "version": "54.0.8",
- "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-54.0.8.tgz",
- "integrity": "sha512-EA7N4dloty2t5Rde+HP0IEE+nkAQiu4A/+QGZGT9mFnZ5KKjPPkqSyYcRvP5bhQE10D+tvz6X0ngZpulbMdbsg==",
+ "version": "55.0.12",
+ "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-55.0.12.tgz",
+ "integrity": "sha512-IiV1jRk7/jIjXYZG3NSeBO59aekonp2J0660EgeRz1OYEN+py64AnNapqvjAMYfDVQKt19Y4HslnOJp5mWSiTw==",
"license": "MIT",
"dependencies": {
- "@expo/config": "~12.0.13",
- "@expo/config-plugins": "~54.0.4",
- "@expo/config-types": "^54.0.10",
- "@expo/image-utils": "^0.8.8",
- "@expo/json-file": "^10.0.8",
- "@react-native/normalize-colors": "0.81.5",
+ "@expo/config": "~55.0.12",
+ "@expo/config-plugins": "~55.0.7",
+ "@expo/config-types": "^55.0.5",
+ "@expo/image-utils": "^0.8.12",
+ "@expo/json-file": "^10.0.13",
+ "@react-native/normalize-colors": "0.83.4",
"debug": "^4.3.1",
"resolve-from": "^5.0.0",
"semver": "^7.6.0",
@@ -2658,9 +2581,9 @@
}
},
"node_modules/@expo/prebuild-config/node_modules/semver": {
- "version": "7.7.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
- "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@@ -2669,10 +2592,29 @@
"node": ">=10"
}
},
+ "node_modules/@expo/require-utils": {
+ "version": "55.0.3",
+ "resolved": "https://registry.npmjs.org/@expo/require-utils/-/require-utils-55.0.3.tgz",
+ "integrity": "sha512-TS1m5tW45q4zoaTlt6DwmdYHxvFTIxoLrTHKOFrIirHIqIXnHCzpceg8wumiBi+ZXSaGY2gobTbfv+WVhJY6Fw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.20.0",
+ "@babel/core": "^7.25.2",
+ "@babel/plugin-transform-modules-commonjs": "^7.24.8"
+ },
+ "peerDependencies": {
+ "typescript": "^5.0.0 || ^5.0.0-0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@expo/schema-utils": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-0.1.8.tgz",
- "integrity": "sha512-9I6ZqvnAvKKDiO+ZF8BpQQFYWXOJvTAL5L/227RUbWG1OVZDInFifzCBiqAZ3b67NRfeAgpgvbA7rejsqhY62A==",
+ "version": "55.0.2",
+ "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-55.0.2.tgz",
+ "integrity": "sha512-QZ5WKbJOWkCrMq0/kfhV9ry8te/OaS34YgLVpG8u9y2gix96TlpRTbxM/YATjNcUR2s4fiQmPCOxkGtog4i37g==",
"license": "MIT"
},
"node_modules/@expo/sdk-runtime-versions": {
@@ -2699,10 +2641,24 @@
"integrity": "sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==",
"license": "MIT"
},
+ "node_modules/@expo/ui": {
+ "version": "55.0.8",
+ "resolved": "https://registry.npmjs.org/@expo/ui/-/ui-55.0.8.tgz",
+ "integrity": "sha512-YGKjr0sF9SwRK0sPu8AlBIbAnxM+yhoml39WnJ/+Xk2tm2Fe4uYuHgBmPhA9Zq/CR684hfz4eTJT63GafpM1aw==",
+ "license": "MIT",
+ "dependencies": {
+ "sf-symbols-typescript": "^2.1.0"
+ },
+ "peerDependencies": {
+ "expo": "*",
+ "react": "*",
+ "react-native": "*"
+ }
+ },
"node_modules/@expo/vector-icons": {
- "version": "15.0.3",
- "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-15.0.3.tgz",
- "integrity": "sha512-SBUyYKphmlfUBqxSfDdJ3jAdEVSALS2VUPOUyqn48oZmb2TL/O7t7/PQm5v4NQujYEPLPMTLn9KVw6H7twwbTA==",
+ "version": "15.1.1",
+ "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-15.1.1.tgz",
+ "integrity": "sha512-Iu2VkcoI5vygbtYngm7jb4ifxElNVXQYdDrYkT7UCEIiKLeWnQY0wf2ZhHZ+Wro6Sc5TaumpKUOqDRpLi5rkvw==",
"license": "MIT",
"peerDependencies": {
"expo-font": ">=14.0.4",
@@ -2717,9 +2673,9 @@
"license": "MIT"
},
"node_modules/@expo/xcpretty": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/@expo/xcpretty/-/xcpretty-4.4.0.tgz",
- "integrity": "sha512-o2qDlTqJ606h4xR36H2zWTywmZ3v3842K6TU8Ik2n1mfW0S580VHlt3eItVYdLYz+klaPp7CXqanja8eASZjRw==",
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/@expo/xcpretty/-/xcpretty-4.4.1.tgz",
+ "integrity": "sha512-KZNxZvnGCtiM2aYYZ6Wz0Ix5r47dAvpNLApFtZWnSoERzAdOMzVBOPysBoM0JlF6FKWZ8GPqgn6qt3dV/8Zlpg==",
"license": "BSD-3-Clause",
"dependencies": {
"@babel/code-frame": "^7.20.0",
@@ -2730,28 +2686,10 @@
"excpretty": "build/cli.js"
}
},
- "node_modules/@expo/xcpretty/node_modules/argparse": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
- "license": "Python-2.0"
- },
- "node_modules/@expo/xcpretty/node_modules/js-yaml": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
- "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
- "license": "MIT",
- "dependencies": {
- "argparse": "^2.0.1"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
- },
"node_modules/@getpapillon/papicons": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/@getpapillon/papicons/-/papicons-0.2.0.tgz",
- "integrity": "sha512-Rh9F2go/cLGz6Q2Mdhqy87Wk6qGCZ/CJbs+Gp8jga8K4RWPYri+X7wQkauFbj/H1+WoEt2BPnzx2NguKXLySgA==",
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/@getpapillon/papicons/-/papicons-0.2.1.tgz",
+ "integrity": "sha512-BuTul9OUTQX6R6xhb5erSoWIJRI13WjPl0P0GIRFeKqfYYzMtq+ZMK0fuP1yvGKGzOJi4DShqaR+r16lSKWeDA==",
"workspaces": [
"example"
],
@@ -2824,45 +2762,6 @@
"url": "https://github.com/sponsors/nzakas"
}
},
- "node_modules/@ide/backoff": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@ide/backoff/-/backoff-1.0.0.tgz",
- "integrity": "sha512-F0YfUDjvT+Mtt/R4xdl2X0EYCHMMiJqNLdxHD++jDT5ydEFIyqbCHh51Qx2E211dgZprPKhV7sHmnXKpLuvc5g==",
- "license": "MIT"
- },
- "node_modules/@isaacs/balanced-match": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz",
- "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==",
- "license": "MIT",
- "engines": {
- "node": "20 || >=22"
- }
- },
- "node_modules/@isaacs/brace-expansion": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz",
- "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==",
- "license": "MIT",
- "dependencies": {
- "@isaacs/balanced-match": "^4.0.1"
- },
- "engines": {
- "node": "20 || >=22"
- }
- },
- "node_modules/@isaacs/fs-minipass": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz",
- "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==",
- "license": "ISC",
- "dependencies": {
- "minipass": "^7.0.4"
- },
- "engines": {
- "node": ">=18.0.0"
- }
- },
"node_modules/@isaacs/ttlcache": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz",
@@ -2888,6 +2787,80 @@
"node": ">=8"
}
},
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "license": "MIT",
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": {
+ "version": "3.14.2",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz",
+ "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==",
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/@istanbuljs/schema": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
@@ -3083,15 +3056,37 @@
"v8-to-istanbul": "^9.0.1"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- },
- "peerDependencies": {
- "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@jest/reporters/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
},
- "peerDependenciesMeta": {
- "node-notifier": {
- "optional": true
- }
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/@jest/schemas": {
@@ -3197,9 +3192,9 @@
}
},
"node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.12",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz",
- "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==",
+ "version": "0.3.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
"license": "MIT",
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.5.0",
@@ -3236,15 +3231,15 @@
}
},
"node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.5.4",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz",
- "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==",
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
"license": "MIT"
},
"node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.29",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz",
- "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==",
+ "version": "0.3.31",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
"license": "MIT",
"dependencies": {
"@jridgewell/resolve-uri": "^3.1.0",
@@ -3252,9 +3247,9 @@
}
},
"node_modules/@legendapp/list": {
- "version": "2.0.15",
- "resolved": "https://registry.npmjs.org/@legendapp/list/-/list-2.0.15.tgz",
- "integrity": "sha512-t39c6TGWOzV8Ec7SxyKKT15+FQTyBgjvbKFnRzT2CUQP8o43Zets6qt1gVULImE7VXTTqNhRe+3FzHmF3EVB5g==",
+ "version": "2.0.19",
+ "resolved": "https://registry.npmjs.org/@legendapp/list/-/list-2.0.19.tgz",
+ "integrity": "sha512-zDWg8yg0smKxxk+M7gwAbZAnf5uczohPA+IjqLSkImz7+e9ytxeT0Mq35RBO9RTKODOXfV/aIgm1uqUHLBEdmg==",
"license": "MIT",
"dependencies": {
"use-sync-external-store": "^1.5.0"
@@ -3265,14 +3260,20 @@
}
},
"node_modules/@literate.ink/utilities": {
- "version": "1.0.0-10641118381.1",
- "resolved": "https://registry.npmjs.org/@literate.ink/utilities/-/utilities-1.0.0-10641118381.1.tgz",
- "integrity": "sha512-omhzgwfAjNXqIjt6dmWbU8pm6QfEvNYetykEXYk+vVaJ8oICglvkChxkC6FkF8zJKMM/lFrNHgD42obQ8lwolQ==",
+ "version": "1.0.0-11713907881.1",
+ "resolved": "https://registry.npmjs.org/@literate.ink/utilities/-/utilities-1.0.0-11713907881.1.tgz",
+ "integrity": "sha512-+RdZqu5dor5YQfL0CRSGPb9Gl6qCsXusziJZt84KxmJsL55ElPSc35AR4CNITzsYg7rAXVnoUCf8fXpaSeWJsg==",
"license": "MIT",
"dependencies": {
"set-cookie-parser": "^2.7.0"
}
},
+ "node_modules/@material/material-color-utilities": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@material/material-color-utilities/-/material-color-utilities-0.3.0.tgz",
+ "integrity": "sha512-ztmtTd6xwnuh2/xu+Vb01btgV8SQWYCaK56CkRK8gEkWe5TuDyBcYJ0wgkMRn+2VcE9KUmhvkz+N9GHrqw/C0g==",
+ "license": "Apache-2.0"
+ },
"node_modules/@noble/curves": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/@noble/curves/-/curves-2.0.1.tgz",
@@ -3288,7 +3289,7 @@
"url": "https://paulmillr.com/funding/"
}
},
- "node_modules/@noble/curves/node_modules/@noble/hashes": {
+ "node_modules/@noble/hashes": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.0.1.tgz",
"integrity": "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==",
@@ -3300,18 +3301,6 @@
"url": "https://paulmillr.com/funding/"
}
},
- "node_modules/@noble/hashes": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz",
- "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==",
- "license": "MIT",
- "engines": {
- "node": "^14.21.3 || >=16"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
"node_modules/@nozbe/simdjson": {
"version": "3.9.4",
"resolved": "https://registry.npmjs.org/@nozbe/simdjson/-/simdjson-3.9.4.tgz",
@@ -3325,7 +3314,9 @@
},
"node_modules/@nozbe/watermelondb": {
"version": "0.28.0",
+ "resolved": "https://registry.npmjs.org/@nozbe/watermelondb/-/watermelondb-0.28.0.tgz",
"integrity": "sha512-40ttcqPOLCTGnbfCQAXSEo8J4KlH/QQhwTfTb9E21CyX/driMEZueiJSI2rSkHICZrI2vnu52aRubNbI3UAzQQ==",
+ "license": "MIT",
"dependencies": {
"@babel/runtime": "7.26.0",
"@nozbe/simdjson": "3.9.4",
@@ -3358,33 +3349,33 @@
"license": "MIT"
},
"node_modules/@peculiar/asn1-ecc": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.5.0.tgz",
- "integrity": "sha512-t4eYGNhXtLRxaP50h3sfO6aJebUCDGQACoeexcelL4roMFRRVgB20yBIu2LxsPh/tdW9I282gNgMOyg3ywg/mg==",
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.6.1.tgz",
+ "integrity": "sha512-+Vqw8WFxrtDIN5ehUdvlN2m73exS2JVG0UAyfVB31gIfor3zWEAQPD+K9ydCxaj3MLen9k0JhKpu9LqviuCE1g==",
"license": "MIT",
"dependencies": {
- "@peculiar/asn1-schema": "^2.5.0",
- "@peculiar/asn1-x509": "^2.5.0",
+ "@peculiar/asn1-schema": "^2.6.0",
+ "@peculiar/asn1-x509": "^2.6.1",
"asn1js": "^3.0.6",
"tslib": "^2.8.1"
}
},
"node_modules/@peculiar/asn1-pkcs8": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.5.0.tgz",
- "integrity": "sha512-L7599HTI2SLlitlpEP8oAPaJgYssByI4eCwQq2C9eC90otFpm8MRn66PpbKviweAlhinWQ3ZjDD2KIVtx7PaVw==",
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.6.1.tgz",
+ "integrity": "sha512-JB5iQ9Izn5yGMw3ZG4Nw3Xn/hb/G38GYF3lf7WmJb8JZUydhVGEjK/ZlFSWhnlB7K/4oqEs8HnfFIKklhR58Tw==",
"license": "MIT",
"dependencies": {
- "@peculiar/asn1-schema": "^2.5.0",
- "@peculiar/asn1-x509": "^2.5.0",
+ "@peculiar/asn1-schema": "^2.6.0",
+ "@peculiar/asn1-x509": "^2.6.1",
"asn1js": "^3.0.6",
"tslib": "^2.8.1"
}
},
"node_modules/@peculiar/asn1-schema": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.5.0.tgz",
- "integrity": "sha512-YM/nFfskFJSlHqv59ed6dZlLZqtZQwjRVJ4bBAiWV08Oc+1rSd5lDZcBEx0lGDHfSoH3UziI2pXt2UM33KerPQ==",
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.6.0.tgz",
+ "integrity": "sha512-xNLYLBFTBKkCzEZIw842BxytQQATQv+lDTCEMZ8C196iJcJJMBUZxrhSTxLaohMyKK8QlzRNTRkUmanucnDSqg==",
"license": "MIT",
"dependencies": {
"asn1js": "^3.0.6",
@@ -3393,12 +3384,12 @@
}
},
"node_modules/@peculiar/asn1-x509": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.5.0.tgz",
- "integrity": "sha512-CpwtMCTJvfvYTFMuiME5IH+8qmDe3yEWzKHe7OOADbGfq7ohxeLaXwQo0q4du3qs0AII3UbLCvb9NF/6q0oTKQ==",
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.6.1.tgz",
+ "integrity": "sha512-O9jT5F1A2+t3r7C4VT7LYGXqkGLK7Kj1xFpz7U0isPrubwU5PbDoyYtx6MiGst29yq7pXN5vZbQFKRCP+lLZlA==",
"license": "MIT",
"dependencies": {
- "@peculiar/asn1-schema": "^2.5.0",
+ "@peculiar/asn1-schema": "^2.6.0",
"asn1js": "^3.0.6",
"pvtsutils": "^1.3.6",
"tslib": "^2.8.1"
@@ -3772,9 +3763,9 @@
}
},
"node_modules/@radix-ui/react-slot": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.0.tgz",
- "integrity": "sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w==",
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz",
+ "integrity": "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==",
"license": "MIT",
"dependencies": {
"@radix-ui/react-compose-refs": "1.1.2"
@@ -3905,9 +3896,9 @@
}
},
"node_modules/@react-native-community/datetimepicker": {
- "version": "8.4.4",
- "resolved": "https://registry.npmjs.org/@react-native-community/datetimepicker/-/datetimepicker-8.4.4.tgz",
- "integrity": "sha512-bc4ZixEHxZC9/qf5gbdYvIJiLZ5CLmEsC3j+Yhe1D1KC/3QhaIfGDVdUcid0PdlSoGOSEq4VlB93AWyetEyBSQ==",
+ "version": "8.6.0",
+ "resolved": "https://registry.npmjs.org/@react-native-community/datetimepicker/-/datetimepicker-8.6.0.tgz",
+ "integrity": "sha512-yxPSqNfxgpGaqHQIpatqe6ykeBdU/1pdsk/G3x01mY2bpTflLpmVTLqFSJYd3MiZzxNZcMs/j1dQakUczSjcYA==",
"license": "MIT",
"dependencies": {
"invariant": "^2.2.4"
@@ -3948,31 +3939,31 @@
}
},
"node_modules/@react-native/assets-registry": {
- "version": "0.81.5",
- "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.81.5.tgz",
- "integrity": "sha512-705B6x/5Kxm1RKRvSv0ADYWm5JOnoiQ1ufW7h8uu2E6G9Of/eE6hP/Ivw3U5jI16ERqZxiKQwk34VJbB0niX9w==",
+ "version": "0.83.4",
+ "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.83.4.tgz",
+ "integrity": "sha512-aqKtpbJDSQeSX/Dwv0yMe1/Rd2QfXi12lnyZDXNn/OEKz59u6+LuPBVgO/9CRyclHmdlvwg8c7PJ9eX2ZMnjWg==",
"license": "MIT",
"engines": {
"node": ">= 20.19.4"
}
},
"node_modules/@react-native/babel-plugin-codegen": {
- "version": "0.81.5",
- "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.81.5.tgz",
- "integrity": "sha512-oF71cIH6je3fSLi6VPjjC3Sgyyn57JLHXs+mHWc9MoCiJJcM4nqsS5J38zv1XQ8d3zOW2JtHro+LF0tagj2bfQ==",
+ "version": "0.83.4",
+ "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.83.4.tgz",
+ "integrity": "sha512-UFsK+c1rvT84XZfzpmwKePsc5nTr5LK7hh18TI0DooNlVcztDbMDsQZpDnhO/gmk7aTbWEqO5AB3HJ7tvGp+Jg==",
"license": "MIT",
"dependencies": {
"@babel/traverse": "^7.25.3",
- "@react-native/codegen": "0.81.5"
+ "@react-native/codegen": "0.83.4"
},
"engines": {
"node": ">= 20.19.4"
}
},
"node_modules/@react-native/babel-preset": {
- "version": "0.81.5",
- "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.81.5.tgz",
- "integrity": "sha512-UoI/x/5tCmi+pZ3c1+Ypr1DaRMDLI3y+Q70pVLLVgrnC3DHsHRIbHcCHIeG/IJvoeFqFM2sTdhSOLJrf8lOPrA==",
+ "version": "0.83.4",
+ "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.83.4.tgz",
+ "integrity": "sha512-SXPFn3Jp4gOzlBDnDOKPzMfxQPKJMYJs05EmEeFB/6km46xZ9l+2YKXwAwxfNhHnmwNf98U/bnVndU95I0TMCw==",
"license": "MIT",
"dependencies": {
"@babel/core": "^7.25.2",
@@ -4016,8 +4007,8 @@
"@babel/plugin-transform-typescript": "^7.25.2",
"@babel/plugin-transform-unicode-regex": "^7.24.7",
"@babel/template": "^7.25.0",
- "@react-native/babel-plugin-codegen": "0.81.5",
- "babel-plugin-syntax-hermes-parser": "0.29.1",
+ "@react-native/babel-plugin-codegen": "0.83.4",
+ "babel-plugin-syntax-hermes-parser": "0.32.0",
"babel-plugin-transform-flow-enums": "^0.0.2",
"react-refresh": "^0.14.0"
},
@@ -4028,16 +4019,40 @@
"@babel/core": "*"
}
},
+ "node_modules/@react-native/babel-preset/node_modules/babel-plugin-syntax-hermes-parser": {
+ "version": "0.32.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz",
+ "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==",
+ "license": "MIT",
+ "dependencies": {
+ "hermes-parser": "0.32.0"
+ }
+ },
+ "node_modules/@react-native/babel-preset/node_modules/hermes-estree": {
+ "version": "0.32.0",
+ "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz",
+ "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==",
+ "license": "MIT"
+ },
+ "node_modules/@react-native/babel-preset/node_modules/hermes-parser": {
+ "version": "0.32.0",
+ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz",
+ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==",
+ "license": "MIT",
+ "dependencies": {
+ "hermes-estree": "0.32.0"
+ }
+ },
"node_modules/@react-native/codegen": {
- "version": "0.81.5",
- "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.81.5.tgz",
- "integrity": "sha512-a2TDA03Up8lpSa9sh5VRGCQDXgCTOyDOFH+aqyinxp1HChG8uk89/G+nkJ9FPd0rqgi25eCTR16TWdS3b+fA6g==",
+ "version": "0.83.4",
+ "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.83.4.tgz",
+ "integrity": "sha512-CJ7XutzIqJPz3Lp/5TOiRWlU/JAjTboMT1BHNLSXjYHXwTmgHM3iGEbpCOtBMjWvsojRTJyRO/G3ghInIIXEYg==",
"license": "MIT",
"dependencies": {
"@babel/core": "^7.25.2",
"@babel/parser": "^7.25.3",
"glob": "^7.1.1",
- "hermes-parser": "0.29.1",
+ "hermes-parser": "0.32.0",
"invariant": "^2.2.4",
"nullthrows": "^1.1.1",
"yargs": "^17.6.2"
@@ -4049,18 +4064,54 @@
"@babel/core": "*"
}
},
+ "node_modules/@react-native/codegen/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@react-native/codegen/node_modules/hermes-estree": {
+ "version": "0.32.0",
+ "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz",
+ "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==",
+ "license": "MIT"
+ },
+ "node_modules/@react-native/codegen/node_modules/hermes-parser": {
+ "version": "0.32.0",
+ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz",
+ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==",
+ "license": "MIT",
+ "dependencies": {
+ "hermes-estree": "0.32.0"
+ }
+ },
"node_modules/@react-native/community-cli-plugin": {
- "version": "0.81.5",
- "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.81.5.tgz",
- "integrity": "sha512-yWRlmEOtcyvSZ4+OvqPabt+NS36vg0K/WADTQLhrYrm9qdZSuXmq8PmdJWz/68wAqKQ+4KTILiq2kjRQwnyhQw==",
+ "version": "0.83.4",
+ "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.83.4.tgz",
+ "integrity": "sha512-8os0weQEnjUhWy7Db881+JKRwNHVGM40VtTRvltAyA/YYkrGg4kPCqiTybMxQDEcF3rnviuxHyI+ITiglfmgmQ==",
"license": "MIT",
"dependencies": {
- "@react-native/dev-middleware": "0.81.5",
+ "@react-native/dev-middleware": "0.83.4",
"debug": "^4.4.0",
"invariant": "^2.2.4",
- "metro": "^0.83.1",
- "metro-config": "^0.83.1",
- "metro-core": "^0.83.1",
+ "metro": "^0.83.3",
+ "metro-config": "^0.83.3",
+ "metro-core": "^0.83.3",
"semver": "^7.1.3"
},
"engines": {
@@ -4080,9 +4131,9 @@
}
},
"node_modules/@react-native/community-cli-plugin/node_modules/semver": {
- "version": "7.7.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
- "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@@ -4092,22 +4143,36 @@
}
},
"node_modules/@react-native/debugger-frontend": {
- "version": "0.81.5",
- "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.81.5.tgz",
- "integrity": "sha512-bnd9FSdWKx2ncklOetCgrlwqSGhMHP2zOxObJbOWXoj7GHEmih4MKarBo5/a8gX8EfA1EwRATdfNBQ81DY+h+w==",
+ "version": "0.83.4",
+ "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.83.4.tgz",
+ "integrity": "sha512-mCE2s/S7SEjax3gZb6LFAraAI3x13gRVWJWqT0HIm71e4ITObENNTDuMw4mvZ/wr4Gz2wv4FcBH5/Nla9LXOcg==",
"license": "BSD-3-Clause",
"engines": {
"node": ">= 20.19.4"
}
},
+ "node_modules/@react-native/debugger-shell": {
+ "version": "0.83.4",
+ "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.83.4.tgz",
+ "integrity": "sha512-FtAnrvXqy1xeZ+onwilvxEeeBsvBlhtfrHVIC2R/BOJAK9TbKEtFfjio0wsn3DQIm+UZq48DSa+p9jJZ2aJUww==",
+ "license": "MIT",
+ "dependencies": {
+ "cross-spawn": "^7.0.6",
+ "fb-dotslash": "0.5.8"
+ },
+ "engines": {
+ "node": ">= 20.19.4"
+ }
+ },
"node_modules/@react-native/dev-middleware": {
- "version": "0.81.5",
- "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.81.5.tgz",
- "integrity": "sha512-WfPfZzboYgo/TUtysuD5xyANzzfka8Ebni6RIb2wDxhb56ERi7qDrE4xGhtPsjCL4pQBXSVxyIlCy0d8I6EgGA==",
+ "version": "0.83.4",
+ "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.83.4.tgz",
+ "integrity": "sha512-3s9nXZc/kj986nI2RPqxiIJeTS3o7pvZDxbHu7GE9WVIGX9YucA1l/tEiXd7BAm3TBFOfefDOT08xD46wH+R3Q==",
"license": "MIT",
"dependencies": {
"@isaacs/ttlcache": "^1.4.1",
- "@react-native/debugger-frontend": "0.81.5",
+ "@react-native/debugger-frontend": "0.83.4",
+ "@react-native/debugger-shell": "0.83.4",
"chrome-launcher": "^0.15.2",
"chromium-edge-launcher": "^0.2.0",
"connect": "^3.6.5",
@@ -4116,69 +4181,119 @@
"nullthrows": "^1.1.1",
"open": "^7.0.3",
"serve-static": "^1.16.2",
- "ws": "^6.2.3"
+ "ws": "^7.5.10"
},
"engines": {
"node": ">= 20.19.4"
}
},
"node_modules/@react-native/dev-middleware/node_modules/ws": {
- "version": "6.2.3",
- "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz",
- "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==",
+ "version": "7.5.10",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz",
+ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==",
"license": "MIT",
- "dependencies": {
- "async-limiter": "~1.0.0"
+ "engines": {
+ "node": ">=8.3.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": "^5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
}
},
"node_modules/@react-native/gradle-plugin": {
- "version": "0.81.5",
- "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.81.5.tgz",
- "integrity": "sha512-hORRlNBj+ReNMLo9jme3yQ6JQf4GZpVEBLxmTXGGlIL78MAezDZr5/uq9dwElSbcGmLEgeiax6e174Fie6qPLg==",
+ "version": "0.83.4",
+ "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.83.4.tgz",
+ "integrity": "sha512-AhaSWw2k3eMKqZ21IUdM7rpyTYOpAfsBbIIiom1QQii3QccX0uW2AWTcRhfuWRxqr2faGFaOBYedWl2fzp5hgw==",
"license": "MIT",
"engines": {
"node": ">= 20.19.4"
}
},
"node_modules/@react-native/js-polyfills": {
- "version": "0.81.5",
- "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.81.5.tgz",
- "integrity": "sha512-fB7M1CMOCIUudTRuj7kzxIBTVw2KXnsgbQ6+4cbqSxo8NmRRhA0Ul4ZUzZj3rFd3VznTL4Brmocv1oiN0bWZ8w==",
+ "version": "0.83.4",
+ "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.83.4.tgz",
+ "integrity": "sha512-wYUdv0rt4MjhKhQloO1AnGDXhZQOFZHDxm86dEtEA0WcsCdVrFdRULFM+rKUC/QQtJW2rS6WBqtBusgtrsDADg==",
"license": "MIT",
"engines": {
"node": ">= 20.19.4"
}
},
"node_modules/@react-native/normalize-colors": {
- "version": "0.81.5",
- "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.5.tgz",
- "integrity": "sha512-0HuJ8YtqlTVRXGZuGeBejLE04wSQsibpTI+RGOyVqxZvgtlLLC/Ssw0UmbHhT4lYMp2fhdtvKZSs5emWB1zR/g==",
+ "version": "0.83.4",
+ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.83.4.tgz",
+ "integrity": "sha512-9ezxaHjxqTkTOLg62SGg7YhFaE+fxa/jlrWP0nwf7eGFHlGOiTAaRR2KUfiN3K05e+EMbEhgcH/c7bgaXeGyJw==",
"license": "MIT"
},
+ "node_modules/@react-native/virtualized-lists": {
+ "version": "0.72.8",
+ "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.72.8.tgz",
+ "integrity": "sha512-J3Q4Bkuo99k7mu+jPS9gSUSgq+lLRSI/+ahXNwV92XgJ/8UgOTxu2LPwhJnBk/sQKxq7E8WkZBnBiozukQMqrw==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "invariant": "^2.2.4",
+ "nullthrows": "^1.1.1"
+ },
+ "peerDependencies": {
+ "react-native": "*"
+ }
+ },
"node_modules/@react-navigation/bottom-tabs": {
- "version": "7.4.2",
- "resolved": "https://registry.npmjs.org/@react-navigation/bottom-tabs/-/bottom-tabs-7.4.2.tgz",
- "integrity": "sha512-jyBux5l3qqEucY5M/ZWxVvfA8TQu7DVl2gK+xB6iKqRUfLf7dSumyVxc7HemDwGFoz3Ug8dVZFvSMEs+mfrieQ==",
+ "version": "7.15.9",
+ "resolved": "https://registry.npmjs.org/@react-navigation/bottom-tabs/-/bottom-tabs-7.15.9.tgz",
+ "integrity": "sha512-Ou28A1aZLj5wiFQ3F93aIsrI4NCwn3IJzkkjNo9KLFXsc0Yks+UqrVaFlffHFLsrbajuGRG/OQpnMA1ljayY5Q==",
"license": "MIT",
"dependencies": {
- "@react-navigation/elements": "^2.5.2",
- "color": "^4.2.3"
+ "@react-navigation/elements": "^2.9.14",
+ "color": "^4.2.3",
+ "sf-symbols-typescript": "^2.1.0"
},
"peerDependencies": {
- "@react-navigation/native": "^7.1.14",
+ "@react-navigation/native": "^7.2.2",
"react": ">= 18.2.0",
"react-native": "*",
"react-native-safe-area-context": ">= 4.0.0",
"react-native-screens": ">= 4.0.0"
}
},
+ "node_modules/@react-navigation/bottom-tabs/node_modules/color": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
+ "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1",
+ "color-string": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=12.5.0"
+ }
+ },
+ "node_modules/@react-navigation/bottom-tabs/node_modules/color-string": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
+ "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "^1.0.0",
+ "simple-swizzle": "^0.2.2"
+ }
+ },
"node_modules/@react-navigation/core": {
- "version": "7.13.6",
- "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-7.13.6.tgz",
- "integrity": "sha512-7QG29HAWOR8wYuPkfTN8L2Po+kE1xn3nsi2sS35sGngq8HYZRHfXvxrhrAZYfFnFq2hUtOhcXnSS6vEWU/5rmA==",
+ "version": "7.17.2",
+ "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-7.17.2.tgz",
+ "integrity": "sha512-Rt2OZwcgOmjv401uLGAKaRM6xo0fiBce/A7LfRHI1oe5FV+KooWcgAoZ2XOtgKj6UzVMuQWt3b2e6rxo/mDJRA==",
"license": "MIT",
"dependencies": {
- "@react-navigation/routers": "^7.5.2",
+ "@react-navigation/routers": "^7.5.3",
"escape-string-regexp": "^4.0.0",
"fast-deep-equal": "^3.1.3",
"nanoid": "^3.3.11",
@@ -4191,16 +4306,10 @@
"react": ">= 18.2.0"
}
},
- "node_modules/@react-navigation/core/node_modules/react-is": {
- "version": "19.2.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.1.tgz",
- "integrity": "sha512-L7BnWgRbMwzMAubQcS7sXdPdNLmKlucPlopgAzx7FtYbksWZgEWiuYM5x9T6UqS2Ne0rsgQTq5kY2SGqpzUkYA==",
- "license": "MIT"
- },
"node_modules/@react-navigation/elements": {
- "version": "2.9.2",
- "resolved": "https://registry.npmjs.org/@react-navigation/elements/-/elements-2.9.2.tgz",
- "integrity": "sha512-J1GltOAGowNLznEphV/kr4zs0U7mUBO1wVA2CqpkN8ePBsoxrAmsd+T5sEYUCXN9KgTDFvc6IfcDqrGSQngd/g==",
+ "version": "2.9.14",
+ "resolved": "https://registry.npmjs.org/@react-navigation/elements/-/elements-2.9.14.tgz",
+ "integrity": "sha512-lKqzu+su2pI/YIZmR7L7xdOs4UL+rVXKJAMpRMBrwInEy96SjIFst6QDGpE89Dunnu3VjVpjWfByo9f2GWBHDQ==",
"license": "MIT",
"dependencies": {
"color": "^4.2.3",
@@ -4209,7 +4318,7 @@
},
"peerDependencies": {
"@react-native-masked-view/masked-view": ">= 0.2.0",
- "@react-navigation/native": "^7.1.25",
+ "@react-navigation/native": "^7.2.2",
"react": ">= 18.2.0",
"react-native": "*",
"react-native-safe-area-context": ">= 4.0.0"
@@ -4220,13 +4329,36 @@
}
}
},
+ "node_modules/@react-navigation/elements/node_modules/color": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
+ "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1",
+ "color-string": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=12.5.0"
+ }
+ },
+ "node_modules/@react-navigation/elements/node_modules/color-string": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
+ "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "^1.0.0",
+ "simple-swizzle": "^0.2.2"
+ }
+ },
"node_modules/@react-navigation/native": {
- "version": "7.1.25",
- "resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-7.1.25.tgz",
- "integrity": "sha512-zQeWK9txDePWbYfqTs0C6jeRdJTm/7VhQtW/1IbJNDi9/rFIRzZule8bdQPAnf8QWUsNujRmi1J9OG/hhfbalg==",
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-7.2.2.tgz",
+ "integrity": "sha512-kem1Ko2BcbAjmbQIv66dNmr6EtfDut3QU0qjsVhMnLLhktwyXb6FzZYp8gTrUb6AvkAbaJoi+BF5Pl55pAUa5w==",
"license": "MIT",
"dependencies": {
- "@react-navigation/core": "^7.13.6",
+ "@react-navigation/core": "^7.17.2",
"escape-string-regexp": "^4.0.0",
"fast-deep-equal": "^3.1.3",
"nanoid": "^3.3.11",
@@ -4238,37 +4370,60 @@
}
},
"node_modules/@react-navigation/native-stack": {
- "version": "7.8.6",
- "resolved": "https://registry.npmjs.org/@react-navigation/native-stack/-/native-stack-7.8.6.tgz",
- "integrity": "sha512-eBY92xb4H53c9jiWriKMOZmQ/Tu9w1qcUrgOA/qjQOvJFbgKF9D6y3e4UuBaDQzjWjLEDZLaiwXe8cwXRb46mg==",
+ "version": "7.14.10",
+ "resolved": "https://registry.npmjs.org/@react-navigation/native-stack/-/native-stack-7.14.10.tgz",
+ "integrity": "sha512-mCbYbYhi7Em2R2nEgwYGdLU38smy+KK+HMMVcwuzllWsF3Qb+jOUEYbB6Or7LvE7SS77BZ6sHdx4HptCEv50hQ==",
"license": "MIT",
"dependencies": {
- "@react-navigation/elements": "^2.9.2",
+ "@react-navigation/elements": "^2.9.14",
"color": "^4.2.3",
"sf-symbols-typescript": "^2.1.0",
"warn-once": "^0.1.1"
},
"peerDependencies": {
- "@react-navigation/native": "^7.1.25",
+ "@react-navigation/native": "^7.2.2",
"react": ">= 18.2.0",
"react-native": "*",
"react-native-safe-area-context": ">= 4.0.0",
"react-native-screens": ">= 4.0.0"
}
},
+ "node_modules/@react-navigation/native-stack/node_modules/color": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
+ "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1",
+ "color-string": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=12.5.0"
+ }
+ },
+ "node_modules/@react-navigation/native-stack/node_modules/color-string": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
+ "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "^1.0.0",
+ "simple-swizzle": "^0.2.2"
+ }
+ },
"node_modules/@react-navigation/routers": {
- "version": "7.5.2",
- "resolved": "https://registry.npmjs.org/@react-navigation/routers/-/routers-7.5.2.tgz",
- "integrity": "sha512-kymreY5aeTz843E+iPAukrsOtc7nabAH6novtAPREmmGu77dQpfxPB2ZWpKb5nRErIRowp1kYRoN2Ckl+S6JYw==",
+ "version": "7.5.3",
+ "resolved": "https://registry.npmjs.org/@react-navigation/routers/-/routers-7.5.3.tgz",
+ "integrity": "sha512-1tJHg4KKRJuQ1/EvJxatrMef3NZXEPzwUIUZ3n1yJ2t7Q97siwRtbynRpQG9/69ebbtiZ8W3ScOZF/OmhvM4Rg==",
"license": "MIT",
"dependencies": {
"nanoid": "^3.3.11"
}
},
"node_modules/@sbaiahmed1/react-native-blur": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/@sbaiahmed1/react-native-blur/-/react-native-blur-4.2.1.tgz",
- "integrity": "sha512-7zLnsdXakJDquHv886eHeNMbKr4Yq7fO8uo5fHKEiRT1gotm5rNOuA/nW8jwP8Kq7WCwsYrFm0qV7uJbVC8Kog==",
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/@sbaiahmed1/react-native-blur/-/react-native-blur-4.6.0.tgz",
+ "integrity": "sha512-WuSEu90+kI5oGWnEA8DERm4wLGJ1xsJRrrn4fFzC8bPkD2MRw0ELO7QKW+xJpx33W+17M6kXTW8v7fwqlP6wIA==",
"license": "MIT",
"workspaces": [
"example"
@@ -4279,9 +4434,9 @@
}
},
"node_modules/@scure/base": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz",
- "integrity": "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@scure/base/-/base-2.0.0.tgz",
+ "integrity": "sha512-3E1kpuZginKkek01ovG8krQ0Z44E3DHPjc5S2rjJw9lZn3KSQOs8S7wqikF/AH7iRanHypj85uGyxk0XAyC37w==",
"license": "MIT",
"funding": {
"url": "https://paulmillr.com/funding/"
@@ -4302,9 +4457,10 @@
}
},
"node_modules/@shopify/react-native-skia": {
- "version": "2.2.12",
- "resolved": "https://registry.npmjs.org/@shopify/react-native-skia/-/react-native-skia-2.2.12.tgz",
- "integrity": "sha512-P5wZSMPTp00hM0do+awNFtb5aPh5hSpodMGwy7NaxK90AV+SmUu7wZe6NGevzQIwgFa89Epn6xK3j4jKWdQi+A==",
+ "version": "2.4.18",
+ "resolved": "https://registry.npmjs.org/@shopify/react-native-skia/-/react-native-skia-2.4.18.tgz",
+ "integrity": "sha512-/AB/mvb2dGSQVIJTxyG9ZMFn2PjwWlVcFxHU4TV+K25LCU49ntJXl4xda2ghXxdENMggKgO9R5pA+P/AQ0UUrA==",
+ "hasInstallScript": true,
"license": "MIT",
"dependencies": {
"canvaskit-wasm": "0.40.0",
@@ -4328,9 +4484,9 @@
}
},
"node_modules/@sinclair/typebox": {
- "version": "0.27.8",
- "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
- "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==",
+ "version": "0.27.10",
+ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz",
+ "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==",
"license": "MIT"
},
"node_modules/@sindresorhus/is": {
@@ -4418,12 +4574,12 @@
}
},
"node_modules/@types/babel__traverse": {
- "version": "7.20.7",
- "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz",
- "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==",
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz",
+ "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==",
"license": "MIT",
"dependencies": {
- "@babel/types": "^7.20.7"
+ "@babel/types": "^7.28.2"
}
},
"node_modules/@types/cacheable-request": {
@@ -4438,6 +4594,12 @@
"@types/responselike": "^1.0.0"
}
},
+ "node_modules/@types/emscripten": {
+ "version": "1.41.5",
+ "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.41.5.tgz",
+ "integrity": "sha512-cMQm7pxu6BxtHyqJ7mQZ2kXWV5SLmugybFdHCBbJ5eHzOo6VhBckEgAT3//rP5FwPHNPeEiq4SmQ5ucBwsOo4Q==",
+ "license": "MIT"
+ },
"node_modules/@types/estree": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
@@ -4461,9 +4623,9 @@
"license": "MIT"
},
"node_modules/@types/http-cache-semantics": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz",
- "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==",
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz",
+ "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==",
"license": "MIT"
},
"node_modules/@types/istanbul-lib-coverage": {
@@ -4519,21 +4681,21 @@
}
},
"node_modules/@types/node": {
- "version": "24.0.15",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.15.tgz",
- "integrity": "sha512-oaeTSbCef7U/z7rDeJA138xpG3NuKc64/rZ2qmUFkFJmnMsAPaluIifqyWd8hSSMxyP9oie3dLAqYPblag9KgA==",
+ "version": "25.5.2",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.2.tgz",
+ "integrity": "sha512-tO4ZIRKNC+MDWV4qKVZe3Ql/woTnmHDr5JD8UI5hn2pwBrHEwOEMZK7WlNb5RKB6EoJ02gwmQS9OrjuFnZYdpg==",
"license": "MIT",
"dependencies": {
- "undici-types": "~7.8.0"
+ "undici-types": "~7.18.0"
}
},
"node_modules/@types/react": {
- "version": "19.1.17",
- "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.17.tgz",
- "integrity": "sha512-Qec1E3mhALmaspIrhWt9jkQMNdw6bReVu64mjvhbhq2NFPftLPVr+l1SZgmw/66WwBNpDh7ao5AT6gF5v41PFA==",
+ "version": "19.2.14",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz",
+ "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==",
"license": "MIT",
"dependencies": {
- "csstype": "^3.0.2"
+ "csstype": "^3.2.2"
}
},
"node_modules/@types/react-native": {
@@ -4547,20 +4709,6 @@
"@types/react": "*"
}
},
- "node_modules/@types/react-native/node_modules/@react-native/virtualized-lists": {
- "version": "0.72.8",
- "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.72.8.tgz",
- "integrity": "sha512-J3Q4Bkuo99k7mu+jPS9gSUSgq+lLRSI/+ahXNwV92XgJ/8UgOTxu2LPwhJnBk/sQKxq7E8WkZBnBiozukQMqrw==",
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "invariant": "^2.2.4",
- "nullthrows": "^1.1.1"
- },
- "peerDependencies": {
- "react-native": "*"
- }
- },
"node_modules/@types/responselike": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz",
@@ -4585,12 +4733,14 @@
},
"node_modules/@types/uuid": {
"version": "10.0.0",
- "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ=="
+ "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz",
+ "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==",
+ "license": "MIT"
},
"node_modules/@types/yargs": {
- "version": "17.0.33",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz",
- "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==",
+ "version": "17.0.35",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz",
+ "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==",
"license": "MIT",
"dependencies": {
"@types/yargs-parser": "*"
@@ -4603,19 +4753,19 @@
"license": "MIT"
},
"node_modules/@typescript-eslint/eslint-plugin": {
- "version": "8.49.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.49.0.tgz",
- "integrity": "sha512-JXij0vzIaTtCwu6SxTh8qBc66kmf1xs7pI4UOiMDFVct6q86G0Zs7KRcEoJgY3Cav3x5Tq0MF5jwgpgLqgKG3A==",
+ "version": "8.58.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.58.0.tgz",
+ "integrity": "sha512-RLkVSiNuUP1C2ROIWfqX+YcUfLaSnxGE/8M+Y57lopVwg9VTYYfhuz15Yf1IzCKgZj6/rIbYTmJCUSqr76r0Wg==",
"license": "MIT",
"dependencies": {
- "@eslint-community/regexpp": "^4.10.0",
- "@typescript-eslint/scope-manager": "8.49.0",
- "@typescript-eslint/type-utils": "8.49.0",
- "@typescript-eslint/utils": "8.49.0",
- "@typescript-eslint/visitor-keys": "8.49.0",
- "ignore": "^7.0.0",
+ "@eslint-community/regexpp": "^4.12.2",
+ "@typescript-eslint/scope-manager": "8.58.0",
+ "@typescript-eslint/type-utils": "8.58.0",
+ "@typescript-eslint/utils": "8.58.0",
+ "@typescript-eslint/visitor-keys": "8.58.0",
+ "ignore": "^7.0.5",
"natural-compare": "^1.4.0",
- "ts-api-utils": "^2.1.0"
+ "ts-api-utils": "^2.5.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -4625,9 +4775,9 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "@typescript-eslint/parser": "^8.49.0",
- "eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <6.0.0"
+ "@typescript-eslint/parser": "^8.58.0",
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
}
},
"node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
@@ -4640,16 +4790,16 @@
}
},
"node_modules/@typescript-eslint/parser": {
- "version": "8.49.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.49.0.tgz",
- "integrity": "sha512-N9lBGA9o9aqb1hVMc9hzySbhKibHmB+N3IpoShyV6HyQYRGIhlrO5rQgttypi+yEeKsKI4idxC8Jw6gXKD4THA==",
+ "version": "8.58.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.58.0.tgz",
+ "integrity": "sha512-rLoGZIf9afaRBYsPUMtvkDWykwXwUPL60HebR4JgTI8mxfFe2cQTu3AGitANp4b9B2QlVru6WzjgB2IzJKiCSA==",
"license": "MIT",
"dependencies": {
- "@typescript-eslint/scope-manager": "8.49.0",
- "@typescript-eslint/types": "8.49.0",
- "@typescript-eslint/typescript-estree": "8.49.0",
- "@typescript-eslint/visitor-keys": "8.49.0",
- "debug": "^4.3.4"
+ "@typescript-eslint/scope-manager": "8.58.0",
+ "@typescript-eslint/types": "8.58.0",
+ "@typescript-eslint/typescript-estree": "8.58.0",
+ "@typescript-eslint/visitor-keys": "8.58.0",
+ "debug": "^4.4.3"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -4659,19 +4809,19 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <6.0.0"
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
}
},
"node_modules/@typescript-eslint/project-service": {
- "version": "8.49.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.49.0.tgz",
- "integrity": "sha512-/wJN0/DKkmRUMXjZUXYZpD1NEQzQAAn9QWfGwo+Ai8gnzqH7tvqS7oNVdTjKqOcPyVIdZdyCMoqN66Ia789e7g==",
+ "version": "8.58.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.58.0.tgz",
+ "integrity": "sha512-8Q/wBPWLQP1j16NxoPNIKpDZFMaxl7yWIoqXWYeWO+Bbd2mjgvoF0dxP2jKZg5+x49rgKdf7Ck473M8PC3V9lg==",
"license": "MIT",
"dependencies": {
- "@typescript-eslint/tsconfig-utils": "^8.49.0",
- "@typescript-eslint/types": "^8.49.0",
- "debug": "^4.3.4"
+ "@typescript-eslint/tsconfig-utils": "^8.58.0",
+ "@typescript-eslint/types": "^8.58.0",
+ "debug": "^4.4.3"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -4681,17 +4831,17 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "typescript": ">=4.8.4 <6.0.0"
+ "typescript": ">=4.8.4 <6.1.0"
}
},
"node_modules/@typescript-eslint/scope-manager": {
- "version": "8.49.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.49.0.tgz",
- "integrity": "sha512-npgS3zi+/30KSOkXNs0LQXtsg9ekZ8OISAOLGWA/ZOEn0ZH74Ginfl7foziV8DT+D98WfQ5Kopwqb/PZOaIJGg==",
+ "version": "8.58.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.58.0.tgz",
+ "integrity": "sha512-W1Lur1oF50FxSnNdGp3Vs6P+yBRSmZiw4IIjEeYxd8UQJwhUF0gDgDD/W/Tgmh73mxgEU3qX0Bzdl/NGuSPEpQ==",
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.49.0",
- "@typescript-eslint/visitor-keys": "8.49.0"
+ "@typescript-eslint/types": "8.58.0",
+ "@typescript-eslint/visitor-keys": "8.58.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -4702,9 +4852,9 @@
}
},
"node_modules/@typescript-eslint/tsconfig-utils": {
- "version": "8.49.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.49.0.tgz",
- "integrity": "sha512-8prixNi1/6nawsRYxet4YOhnbW+W9FK/bQPxsGB1D3ZrDzbJ5FXw5XmzxZv82X3B+ZccuSxo/X8q9nQ+mFecWA==",
+ "version": "8.58.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.58.0.tgz",
+ "integrity": "sha512-doNSZEVJsWEu4htiVC+PR6NpM+pa+a4ClH9INRWOWCUzMst/VA9c4gXq92F8GUD1rwhNvRLkgjfYtFXegXQF7A==",
"license": "MIT",
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -4714,20 +4864,20 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "typescript": ">=4.8.4 <6.0.0"
+ "typescript": ">=4.8.4 <6.1.0"
}
},
"node_modules/@typescript-eslint/type-utils": {
- "version": "8.49.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.49.0.tgz",
- "integrity": "sha512-KTExJfQ+svY8I10P4HdxKzWsvtVnsuCifU5MvXrRwoP2KOlNZ9ADNEWWsQTJgMxLzS5VLQKDjkCT/YzgsnqmZg==",
+ "version": "8.58.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.58.0.tgz",
+ "integrity": "sha512-aGsCQImkDIqMyx1u4PrVlbi/krmDsQUs4zAcCV6M7yPcPev+RqVlndsJy9kJ8TLihW9TZ0kbDAzctpLn5o+lOg==",
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.49.0",
- "@typescript-eslint/typescript-estree": "8.49.0",
- "@typescript-eslint/utils": "8.49.0",
- "debug": "^4.3.4",
- "ts-api-utils": "^2.1.0"
+ "@typescript-eslint/types": "8.58.0",
+ "@typescript-eslint/typescript-estree": "8.58.0",
+ "@typescript-eslint/utils": "8.58.0",
+ "debug": "^4.4.3",
+ "ts-api-utils": "^2.5.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -4737,14 +4887,14 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <6.0.0"
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
}
},
"node_modules/@typescript-eslint/types": {
- "version": "8.49.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.49.0.tgz",
- "integrity": "sha512-e9k/fneezorUo6WShlQpMxXh8/8wfyc+biu6tnAqA81oWrEic0k21RHzP9uqqpyBBeBKu4T+Bsjy9/b8u7obXQ==",
+ "version": "8.58.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.58.0.tgz",
+ "integrity": "sha512-O9CjxypDT89fbHxRfETNoAnHj/i6IpRK0CvbVN3qibxlLdo5p5hcLmUuCCrHMpxiWSwKyI8mCP7qRNYuOJ0Uww==",
"license": "MIT",
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -4755,20 +4905,20 @@
}
},
"node_modules/@typescript-eslint/typescript-estree": {
- "version": "8.49.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.49.0.tgz",
- "integrity": "sha512-jrLdRuAbPfPIdYNppHJ/D0wN+wwNfJ32YTAm10eJVsFmrVpXQnDWBn8niCSMlWjvml8jsce5E/O+86IQtTbJWA==",
+ "version": "8.58.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.58.0.tgz",
+ "integrity": "sha512-7vv5UWbHqew/dvs+D3e1RvLv1v2eeZ9txRHPnEEBUgSNLx5ghdzjHa0sgLWYVKssH+lYmV0JaWdoubo0ncGYLA==",
"license": "MIT",
"dependencies": {
- "@typescript-eslint/project-service": "8.49.0",
- "@typescript-eslint/tsconfig-utils": "8.49.0",
- "@typescript-eslint/types": "8.49.0",
- "@typescript-eslint/visitor-keys": "8.49.0",
- "debug": "^4.3.4",
- "minimatch": "^9.0.4",
- "semver": "^7.6.0",
+ "@typescript-eslint/project-service": "8.58.0",
+ "@typescript-eslint/tsconfig-utils": "8.58.0",
+ "@typescript-eslint/types": "8.58.0",
+ "@typescript-eslint/visitor-keys": "8.58.0",
+ "debug": "^4.4.3",
+ "minimatch": "^10.2.2",
+ "semver": "^7.7.3",
"tinyglobby": "^0.2.15",
- "ts-api-utils": "^2.1.0"
+ "ts-api-utils": "^2.5.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -4778,37 +4928,49 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "typescript": ">=4.8.4 <6.0.0"
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "license": "MIT",
+ "engines": {
+ "node": "18 || 20 || >=22"
}
},
"node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz",
+ "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==",
"license": "MIT",
"dependencies": {
- "balanced-match": "^1.0.0"
+ "balanced-match": "^4.0.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
}
},
"node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
- "license": "ISC",
+ "version": "10.2.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
+ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "brace-expansion": "^2.0.1"
+ "brace-expansion": "^5.0.5"
},
"engines": {
- "node": ">=16 || 14 >=14.17"
+ "node": "18 || 20 || >=22"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
- "version": "7.7.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
- "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@@ -4818,15 +4980,15 @@
}
},
"node_modules/@typescript-eslint/utils": {
- "version": "8.49.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.49.0.tgz",
- "integrity": "sha512-N3W7rJw7Rw+z1tRsHZbK395TWSYvufBXumYtEGzypgMUthlg0/hmCImeA8hgO2d2G4pd7ftpxxul2J8OdtdaFA==",
+ "version": "8.58.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.58.0.tgz",
+ "integrity": "sha512-RfeSqcFeHMHlAWzt4TBjWOAtoW9lnsAGiP3GbaX9uVgTYYrMbVnGONEfUCiSss+xMHFl+eHZiipmA8WkQ7FuNA==",
"license": "MIT",
"dependencies": {
- "@eslint-community/eslint-utils": "^4.7.0",
- "@typescript-eslint/scope-manager": "8.49.0",
- "@typescript-eslint/types": "8.49.0",
- "@typescript-eslint/typescript-estree": "8.49.0"
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "@typescript-eslint/scope-manager": "8.58.0",
+ "@typescript-eslint/types": "8.58.0",
+ "@typescript-eslint/typescript-estree": "8.58.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -4836,18 +4998,18 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <6.0.0"
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
}
},
"node_modules/@typescript-eslint/visitor-keys": {
- "version": "8.49.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.49.0.tgz",
- "integrity": "sha512-LlKaciDe3GmZFphXIc79THF/YYBugZ7FS1pO581E/edlVVNbZKDy93evqmrfQ9/Y4uN0vVhX4iuchq26mK/iiA==",
+ "version": "8.58.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.58.0.tgz",
+ "integrity": "sha512-XJ9UD9+bbDo4a4epraTwG3TsNPeiB9aShrUneAVXy8q4LuwowN+qu89/6ByLMINqvIMeI9H9hOHQtg/ijrYXzQ==",
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.49.0",
- "eslint-visitor-keys": "^4.2.1"
+ "@typescript-eslint/types": "8.58.0",
+ "eslint-visitor-keys": "^5.0.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -4857,35 +5019,24 @@
"url": "https://opencollective.com/typescript-eslint"
}
},
+ "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
+ "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
"node_modules/@ungap/structured-clone": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz",
"integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==",
"license": "ISC"
},
- "node_modules/@urql/core": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/@urql/core/-/core-5.2.0.tgz",
- "integrity": "sha512-/n0ieD0mvvDnVAXEQgX/7qJiVcvYvNkOHeBvkwtylfjydar123caCXcl58PXFY11oU1oquJocVXHxLAbtv4x1A==",
- "license": "MIT",
- "dependencies": {
- "@0no-co/graphql.web": "^1.0.13",
- "wonka": "^6.3.2"
- }
- },
- "node_modules/@urql/exchange-retry": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/@urql/exchange-retry/-/exchange-retry-1.3.2.tgz",
- "integrity": "sha512-TQMCz2pFJMfpNxmSfX1VSfTjwUIFx/mL+p1bnfM1xjjdla7Z+KnGMW/EhFbpckp3LyWAH4PgOsMwOMnIN+MBFg==",
- "license": "MIT",
- "dependencies": {
- "@urql/core": "^5.1.2",
- "wonka": "^6.3.2"
- },
- "peerDependencies": {
- "@urql/core": "^5.0.0"
- }
- },
"node_modules/@webgpu/types": {
"version": "0.1.21",
"resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.21.tgz",
@@ -4893,9 +5044,9 @@
"license": "BSD-3-Clause"
},
"node_modules/@xmldom/xmldom": {
- "version": "0.8.11",
- "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz",
- "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==",
+ "version": "0.8.12",
+ "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.12.tgz",
+ "integrity": "sha512-9k/gHF6n/pAi/9tqr3m3aqkuiNosYTurLLUtc7xQ9sxB/wm7WPygCv8GYa6mS0fLJEHhqMC1ATYhz++U/lRHqg==",
"license": "MIT",
"engines": {
"node": ">=10.0.0"
@@ -4928,22 +5079,47 @@
}
},
"node_modules/accepts": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
- "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
+ "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==",
"license": "MIT",
"dependencies": {
- "mime-types": "~2.1.34",
- "negotiator": "0.6.3"
+ "mime-types": "^3.0.0",
+ "negotiator": "^1.0.0"
},
"engines": {
"node": ">= 0.6"
}
},
+ "node_modules/accepts/node_modules/mime-db": {
+ "version": "1.54.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/accepts/node_modules/mime-types": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz",
+ "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "^1.54.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
"node_modules/acorn": {
- "version": "8.15.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
- "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
+ "version": "8.16.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
+ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
"license": "MIT",
"bin": {
"acorn": "bin/acorn"
@@ -4974,9 +5150,9 @@
}
},
"node_modules/acorn-walk": {
- "version": "8.3.4",
- "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz",
- "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==",
+ "version": "8.3.5",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz",
+ "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -5000,15 +5176,16 @@
}
},
"node_modules/ajv": {
- "version": "8.17.1",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
- "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "version": "6.14.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz",
+ "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
- "fast-deep-equal": "^3.1.3",
- "fast-uri": "^3.0.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2"
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
},
"funding": {
"type": "github",
@@ -5069,12 +5246,6 @@
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/any-promise": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
- "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
- "license": "MIT"
- },
"node_modules/anymatch": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
@@ -5089,9 +5260,9 @@
}
},
"node_modules/anymatch/node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
"license": "MIT",
"engines": {
"node": ">=8.6"
@@ -5111,13 +5282,10 @@
"license": "MIT"
},
"node_modules/argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "license": "MIT",
- "dependencies": {
- "sprintf-js": "~1.0.2"
- }
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "license": "Python-2.0"
},
"node_modules/aria-hidden": {
"version": "1.2.6",
@@ -5269,9 +5437,9 @@
"license": "MIT"
},
"node_modules/asn1js": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.6.tgz",
- "integrity": "sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA==",
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.7.tgz",
+ "integrity": "sha512-uLvq6KJu04qoQM6gvBfKFjlh6Gl0vOKQuR5cJMDHQkmwfMOQeN3F3SHCv9SNYSL+CRoHvOGFfllDlVz03GQjvQ==",
"license": "BSD-3-Clause",
"dependencies": {
"pvtsutils": "^1.3.6",
@@ -5282,19 +5450,6 @@
"node": ">=12.0.0"
}
},
- "node_modules/assert": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz",
- "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==",
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.2",
- "is-nan": "^1.3.2",
- "object-is": "^1.1.5",
- "object.assign": "^4.1.4",
- "util": "^0.12.5"
- }
- },
"node_modules/async-function": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz",
@@ -5401,13 +5556,13 @@
}
},
"node_modules/babel-plugin-polyfill-corejs2": {
- "version": "0.4.15",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.15.tgz",
- "integrity": "sha512-hR3GwrRwHUfYwGfrisXPIDP3JcYfBrW7wKE7+Au6wDYl7fm/ka1NEII6kORzxNU556JjfidZeBsO10kYvtV1aw==",
+ "version": "0.4.17",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz",
+ "integrity": "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==",
"license": "MIT",
"dependencies": {
"@babel/compat-data": "^7.28.6",
- "@babel/helper-define-polyfill-provider": "^0.6.6",
+ "@babel/helper-define-polyfill-provider": "^0.6.8",
"semver": "^6.3.1"
},
"peerDependencies": {
@@ -5428,12 +5583,12 @@
}
},
"node_modules/babel-plugin-polyfill-regenerator": {
- "version": "0.6.6",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.6.tgz",
- "integrity": "sha512-hYm+XLYRMvupxiQzrvXUj7YyvFFVfv5gI0R71AJzudg1g2AI2vyCPPIFEBjk162/wFzti3inBHo7isWFuEVS/A==",
+ "version": "0.6.8",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz",
+ "integrity": "sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==",
"license": "MIT",
"dependencies": {
- "@babel/helper-define-polyfill-provider": "^0.6.6"
+ "@babel/helper-define-polyfill-provider": "^0.6.8"
},
"peerDependencies": {
"@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
@@ -5455,12 +5610,12 @@
"license": "MIT"
},
"node_modules/babel-plugin-syntax-hermes-parser": {
- "version": "0.29.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.29.1.tgz",
- "integrity": "sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA==",
+ "version": "0.32.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.1.tgz",
+ "integrity": "sha512-HgErPZTghW76Rkq9uqn5ESeiD97FbqpZ1V170T1RG2RDp+7pJVQV2pQJs7y5YzN0/gcT6GM5ci9apRnIwuyPdQ==",
"license": "MIT",
"dependencies": {
- "hermes-parser": "0.29.1"
+ "hermes-parser": "0.32.1"
}
},
"node_modules/babel-plugin-transform-flow-enums": {
@@ -5473,9 +5628,9 @@
}
},
"node_modules/babel-preset-current-node-syntax": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz",
- "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==",
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz",
+ "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==",
"license": "MIT",
"dependencies": {
"@babel/plugin-syntax-async-generators": "^7.8.4",
@@ -5495,15 +5650,16 @@
"@babel/plugin-syntax-top-level-await": "^7.14.5"
},
"peerDependencies": {
- "@babel/core": "^7.0.0"
+ "@babel/core": "^7.0.0 || ^8.0.0-0"
}
},
"node_modules/babel-preset-expo": {
- "version": "54.0.10",
- "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-54.0.10.tgz",
- "integrity": "sha512-wTt7POavLFypLcPW/uC5v8y+mtQKDJiyGLzYCjqr9tx0Qc3vCXcDKk1iCFIj/++Iy5CWhhTflEa7VvVPNWeCfw==",
+ "version": "55.0.15",
+ "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-55.0.15.tgz",
+ "integrity": "sha512-xOfVoTaxa7DS8rpBoOuwNsJJAjtuMmy2rO9Aumpc9p6O0VSVwrkqB+rWWA/Xgh+u2ly1XoRproWA0pYQijWMhQ==",
"license": "MIT",
"dependencies": {
+ "@babel/generator": "^7.20.5",
"@babel/helper-module-imports": "^7.25.9",
"@babel/plugin-proposal-decorators": "^7.12.9",
"@babel/plugin-proposal-export-default-from": "^7.24.7",
@@ -5519,10 +5675,10 @@
"@babel/plugin-transform-runtime": "^7.24.7",
"@babel/preset-react": "^7.22.15",
"@babel/preset-typescript": "^7.23.0",
- "@react-native/babel-preset": "0.81.5",
+ "@react-native/babel-preset": "0.83.4",
"babel-plugin-react-compiler": "^1.0.0",
"babel-plugin-react-native-web": "~0.21.0",
- "babel-plugin-syntax-hermes-parser": "^0.29.1",
+ "babel-plugin-syntax-hermes-parser": "^0.32.0",
"babel-plugin-transform-flow-enums": "^0.0.2",
"debug": "^4.3.4",
"resolve-from": "^5.0.0"
@@ -5530,6 +5686,7 @@
"peerDependencies": {
"@babel/runtime": "^7.20.0",
"expo": "*",
+ "expo-widgets": "^55.0.10",
"react-refresh": ">=0.14.0 <1.0.0"
},
"peerDependenciesMeta": {
@@ -5538,6 +5695,9 @@
},
"expo": {
"optional": true
+ },
+ "expo-widgets": {
+ "optional": true
}
}
},
@@ -5569,6 +5729,15 @@
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"license": "MIT"
},
+ "node_modules/barcode-detector": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/barcode-detector/-/barcode-detector-3.1.2.tgz",
+ "integrity": "sha512-Q5kjXpVH5I3ItykNzbWmfWnNryFN1ZTWp10k9/PKJuS0RnoKR7jTrHEJODR4fn04bRomq7TJwie/Dr9fj/GoGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "zxing-wasm": "3.0.2"
+ }
+ },
"node_modules/base64-js": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
@@ -5590,12 +5759,15 @@
"license": "MIT"
},
"node_modules/baseline-browser-mapping": {
- "version": "2.9.6",
- "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.6.tgz",
- "integrity": "sha512-v9BVVpOTLB59C9E7aSnmIF8h7qRsFpx+A2nugVMTszEOMcfjlZMsXRm4LF23I3Z9AJxc8ANpIvzbzONoX9VJlg==",
+ "version": "2.10.15",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.15.tgz",
+ "integrity": "sha512-1nfKCq9wuAZFTkA2ey/3OXXx7GzFjLdkTiFVNwlJ9WqdI706CZRIhEqjuwanjMIja+84jDLa9rcyZDPDiVkASQ==",
"license": "Apache-2.0",
"bin": {
- "baseline-browser-mapping": "dist/cli.js"
+ "baseline-browser-mapping": "dist/cli.cjs"
+ },
+ "engines": {
+ "node": ">=6.0.0"
}
},
"node_modules/better-opn": {
@@ -5652,9 +5824,9 @@
}
},
"node_modules/bplist-parser": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz",
- "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==",
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz",
+ "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==",
"license": "MIT",
"dependencies": {
"big-integer": "1.6.x"
@@ -5664,9 +5836,9 @@
}
},
"node_modules/brace-expansion": {
- "version": "1.1.12",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
- "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz",
+ "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==",
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0",
@@ -5686,9 +5858,9 @@
}
},
"node_modules/browserslist": {
- "version": "4.28.1",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz",
- "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==",
+ "version": "4.28.2",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz",
+ "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==",
"funding": [
{
"type": "opencollective",
@@ -5705,11 +5877,11 @@
],
"license": "MIT",
"dependencies": {
- "baseline-browser-mapping": "^2.9.0",
- "caniuse-lite": "^1.0.30001759",
- "electron-to-chromium": "^1.5.263",
- "node-releases": "^2.0.27",
- "update-browserslist-db": "^1.2.0"
+ "baseline-browser-mapping": "^2.10.12",
+ "caniuse-lite": "^1.0.30001782",
+ "electron-to-chromium": "^1.5.328",
+ "node-releases": "^2.0.36",
+ "update-browserslist-db": "^1.2.3"
},
"bin": {
"browserslist": "cli.js"
@@ -5793,21 +5965,6 @@
"node": ">=8"
}
},
- "node_modules/cacheable-request/node_modules/get-stream": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
- "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
- "license": "MIT",
- "dependencies": {
- "pump": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/call-bind": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz",
@@ -5874,9 +6031,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001760",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001760.tgz",
- "integrity": "sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==",
+ "version": "1.0.30001785",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001785.tgz",
+ "integrity": "sha512-blhOL/WNR+Km1RI/LCVAvA73xplXA7ZbjzI4YkMK9pa6T/P3F2GxjNpEkyw5repTw9IvkyrjyHpwjnhZ5FOvYQ==",
"funding": [
{
"type": "opencollective",
@@ -5928,15 +6085,6 @@
"node": ">=10"
}
},
- "node_modules/chownr": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
- "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",
- "license": "BlueOak-1.0.0",
- "engines": {
- "node": ">=18"
- }
- },
"node_modules/chrome-launcher": {
"version": "0.15.2",
"resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz",
@@ -6068,23 +6216,23 @@
}
},
"node_modules/collect-v8-coverage": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz",
- "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz",
+ "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==",
"dev": true,
"license": "MIT"
},
"node_modules/color": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
- "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==",
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz",
+ "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==",
"license": "MIT",
"dependencies": {
- "color-convert": "^2.0.1",
- "color-string": "^1.9.0"
+ "color-convert": "^3.1.3",
+ "color-string": "^2.1.3"
},
"engines": {
- "node": ">=12.5.0"
+ "node": ">=18"
}
},
"node_modules/color-convert": {
@@ -6106,13 +6254,45 @@
"license": "MIT"
},
"node_modules/color-string": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
- "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz",
+ "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==",
"license": "MIT",
"dependencies": {
- "color-name": "^1.0.0",
- "simple-swizzle": "^0.2.2"
+ "color-name": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/color-string/node_modules/color-name": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz",
+ "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20"
+ }
+ },
+ "node_modules/color/node_modules/color-convert": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz",
+ "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=14.6"
+ }
+ },
+ "node_modules/color/node_modules/color-name": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz",
+ "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20"
}
},
"node_modules/combined-stream": {
@@ -6129,12 +6309,12 @@
}
},
"node_modules/commander": {
- "version": "12.1.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz",
- "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
"license": "MIT",
"engines": {
- "node": ">=18"
+ "node": ">= 10"
}
},
"node_modules/compressible": {
@@ -6191,6 +6371,26 @@
"node": ">= 0.6"
}
},
+ "node_modules/compression/node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -6234,9 +6434,9 @@
"license": "MIT"
},
"node_modules/core-js-compat": {
- "version": "3.48.0",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.48.0.tgz",
- "integrity": "sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==",
+ "version": "3.49.0",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.49.0.tgz",
+ "integrity": "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==",
"license": "MIT",
"dependencies": {
"browserslist": "^4.28.1"
@@ -6303,15 +6503,6 @@
"node": ">= 8"
}
},
- "node_modules/crypto-random-string": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
- "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/css-in-js-utils": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-3.1.0.tgz",
@@ -6334,7 +6525,74 @@
"nth-check": "^2.0.1"
},
"funding": {
- "url": "https://github.com/sponsors/fb55"
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/css-select/node_modules/dom-serializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+ "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.2",
+ "entities": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/css-select/node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/css-select/node_modules/domhandler": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+ "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "domelementtype": "^2.3.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/css-select/node_modules/domutils": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",
+ "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "dom-serializer": "^2.0.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/css-select/node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
}
},
"node_modules/css-tree": {
@@ -6390,9 +6648,9 @@
"license": "MIT"
},
"node_modules/csstype": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
- "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
+ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
"license": "MIT"
},
"node_modules/data-urls": {
@@ -6541,9 +6799,9 @@
}
},
"node_modules/dedent": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz",
- "integrity": "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==",
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz",
+ "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==",
"dev": true,
"license": "MIT",
"peerDependencies": {
@@ -6555,15 +6813,6 @@
}
}
},
- "node_modules/deep-extend": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
- "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
- "license": "MIT",
- "engines": {
- "node": ">=4.0.0"
- }
- },
"node_modules/deep-is": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
@@ -6694,9 +6943,9 @@
}
},
"node_modules/detect-libc": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz",
- "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==",
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
"license": "Apache-2.0",
"engines": {
"node": ">=8"
@@ -6734,6 +6983,12 @@
"integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==",
"license": "MIT"
},
+ "node_modules/dnssd-advertise": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/dnssd-advertise/-/dnssd-advertise-1.1.4.tgz",
+ "integrity": "sha512-AmGyK9WpNf06WeP5TjHZq/wNzP76OuEeaiTlKr9E/EEelYLczywUKoqRz+DPRq/ErssjT4lU+/W7wzJW+7K/ZA==",
+ "license": "MIT"
+ },
"node_modules/doctrine": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
@@ -6747,32 +7002,16 @@
}
},
"node_modules/dom-serializer": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
- "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
+ "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
"license": "MIT",
"dependencies": {
- "domelementtype": "^2.3.0",
- "domhandler": "^5.0.2",
- "entities": "^4.2.0"
- },
- "funding": {
- "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
- }
- },
- "node_modules/dom-serializer/node_modules/entities": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
- "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=0.12"
- },
- "funding": {
- "url": "https://github.com/fb55/entities?sponsor=1"
+ "domelementtype": "^2.0.1",
+ "entities": "^2.0.0"
}
},
- "node_modules/domelementtype": {
+ "node_modules/dom-serializer/node_modules/domelementtype": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
"integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
@@ -6784,6 +7023,21 @@
],
"license": "BSD-2-Clause"
},
+ "node_modules/dom-serializer/node_modules/entities": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+ "license": "BSD-2-Clause",
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/domelementtype": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
+ "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
+ "license": "BSD-2-Clause"
+ },
"node_modules/domexception": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz",
@@ -6799,59 +7053,22 @@
}
},
"node_modules/domhandler": {
- "version": "5.0.3",
- "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
- "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
+ "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
"license": "BSD-2-Clause",
"dependencies": {
- "domelementtype": "^2.3.0"
- },
- "engines": {
- "node": ">= 4"
- },
- "funding": {
- "url": "https://github.com/fb55/domhandler?sponsor=1"
+ "domelementtype": "1"
}
},
"node_modules/domutils": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",
- "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
- "license": "BSD-2-Clause",
- "dependencies": {
- "dom-serializer": "^2.0.0",
- "domelementtype": "^2.3.0",
- "domhandler": "^5.0.3"
- },
- "funding": {
- "url": "https://github.com/fb55/domutils?sponsor=1"
- }
- },
- "node_modules/dotenv": {
- "version": "16.4.7",
- "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz",
- "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==",
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://dotenvx.com"
- }
- },
- "node_modules/dotenv-expand": {
- "version": "11.0.7",
- "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz",
- "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==",
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
+ "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
"license": "BSD-2-Clause",
"dependencies": {
- "dotenv": "^16.4.5"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://dotenvx.com"
+ "dom-serializer": "0",
+ "domelementtype": "1"
}
},
"node_modules/dunder-proto": {
@@ -6875,9 +7092,9 @@
"license": "MIT"
},
"node_modules/electron-to-chromium": {
- "version": "1.5.267",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz",
- "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==",
+ "version": "1.5.331",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.331.tgz",
+ "integrity": "sha512-IbxXrsTlD3hRodkLnbxAPP4OuJYdWCeM3IOdT+CpcMoIwIoDfCmRpEtSPfwBXxVkg9xmBeY7Lz2Eo2TDn/HC3Q==",
"license": "ISC"
},
"node_modules/emittery": {
@@ -6930,19 +7147,10 @@
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
- "node_modules/env-editor": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/env-editor/-/env-editor-0.4.2.tgz",
- "integrity": "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/error-ex": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
- "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz",
+ "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -6959,9 +7167,9 @@
}
},
"node_modules/es-abstract": {
- "version": "1.24.0",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz",
- "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==",
+ "version": "1.24.1",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz",
+ "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==",
"license": "MIT",
"dependencies": {
"array-buffer-byte-length": "^1.0.2",
@@ -7045,26 +7253,27 @@
}
},
"node_modules/es-iterator-helpers": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz",
- "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==",
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.3.1.tgz",
+ "integrity": "sha512-zWwRvqWiuBPr0muUG/78cW3aHROFCNIQ3zpmYDpwdbnt2m+xlNyRWpHBpa2lJjSBit7BQ+RXA1iwbSmu5yJ/EQ==",
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.8",
- "call-bound": "^1.0.3",
+ "call-bound": "^1.0.4",
"define-properties": "^1.2.1",
- "es-abstract": "^1.23.6",
+ "es-abstract": "^1.24.1",
"es-errors": "^1.3.0",
- "es-set-tostringtag": "^2.0.3",
+ "es-set-tostringtag": "^2.1.0",
"function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.6",
+ "get-intrinsic": "^1.3.0",
"globalthis": "^1.0.4",
"gopd": "^1.2.0",
"has-property-descriptors": "^1.0.2",
"has-proto": "^1.2.0",
"has-symbols": "^1.1.0",
"internal-slot": "^1.1.0",
- "iterator.prototype": "^1.1.4",
+ "iterator.prototype": "^1.1.5",
+ "math-intrinsics": "^1.1.0",
"safe-array-concat": "^1.1.3"
},
"engines": {
@@ -7177,25 +7386,25 @@
}
},
"node_modules/eslint": {
- "version": "9.39.2",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz",
- "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==",
+ "version": "9.39.4",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz",
+ "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.8.0",
"@eslint-community/regexpp": "^4.12.1",
- "@eslint/config-array": "^0.21.1",
+ "@eslint/config-array": "^0.21.2",
"@eslint/config-helpers": "^0.4.2",
"@eslint/core": "^0.17.0",
- "@eslint/eslintrc": "^3.3.1",
- "@eslint/js": "9.39.2",
+ "@eslint/eslintrc": "^3.3.5",
+ "@eslint/js": "9.39.4",
"@eslint/plugin-kit": "^0.4.1",
"@humanfs/node": "^0.16.6",
"@humanwhocodes/module-importer": "^1.0.1",
"@humanwhocodes/retry": "^0.4.2",
"@types/estree": "^1.0.6",
- "ajv": "^6.12.4",
+ "ajv": "^6.14.0",
"chalk": "^4.0.0",
"cross-spawn": "^7.0.6",
"debug": "^4.3.2",
@@ -7214,7 +7423,7 @@
"is-glob": "^4.0.0",
"json-stable-stringify-without-jsonify": "^1.0.1",
"lodash.merge": "^4.6.2",
- "minimatch": "^3.1.2",
+ "minimatch": "^3.1.5",
"natural-compare": "^1.4.0",
"optionator": "^0.9.3"
},
@@ -7253,14 +7462,14 @@
}
},
"node_modules/eslint-plugin-prettier": {
- "version": "5.5.4",
- "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.4.tgz",
- "integrity": "sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==",
+ "version": "5.5.5",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.5.tgz",
+ "integrity": "sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "prettier-linter-helpers": "^1.0.0",
- "synckit": "^0.11.7"
+ "prettier-linter-helpers": "^1.0.1",
+ "synckit": "^0.11.12"
},
"engines": {
"node": "^14.18.0 || >=16.0.0"
@@ -7285,7 +7494,9 @@
},
"node_modules/eslint-plugin-react": {
"version": "7.37.5",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz",
"integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==",
+ "license": "MIT",
"dependencies": {
"array-includes": "^3.1.8",
"array.prototype.findlast": "^1.2.5",
@@ -7313,39 +7524,24 @@
"eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7"
}
},
- "node_modules/eslint-plugin-react/node_modules/resolve": {
- "version": "2.0.0-next.5",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz",
- "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==",
- "license": "MIT",
- "dependencies": {
- "is-core-module": "^2.13.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- },
- "bin": {
- "resolve": "bin/resolve"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/eslint-plugin-simple-import-sort": {
"version": "12.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-12.1.1.tgz",
"integrity": "sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==",
+ "license": "MIT",
"peerDependencies": {
"eslint": ">=5.0.0"
}
},
"node_modules/eslint-plugin-unused-imports": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-4.3.0.tgz",
- "integrity": "sha512-ZFBmXMGBYfHttdRtOG9nFFpmUvMtbHSjsKrS20vdWdbfiVYsO3yA2SGYy9i9XmZJDfMGBflZGBCm70SEnFQtOA==",
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-4.4.1.tgz",
+ "integrity": "sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ==",
"dev": true,
"license": "MIT",
"peerDependencies": {
"@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0",
- "eslint": "^9.0.0 || ^8.0.0"
+ "eslint": "^10.0.0 || ^9.0.0 || ^8.0.0"
},
"peerDependenciesMeta": {
"@typescript-eslint/eslint-plugin": {
@@ -7375,6 +7571,7 @@
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
"integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
"license": "Apache-2.0",
+ "peer": true,
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
@@ -7382,79 +7579,6 @@
"url": "https://opencollective.com/eslint"
}
},
- "node_modules/eslint/node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/eslint/node_modules/find-up": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/eslint/node_modules/json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "license": "MIT",
- "peer": true
- },
- "node_modules/eslint/node_modules/locate-path": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "p-locate": "^5.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/eslint/node_modules/p-locate": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
- "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "p-limit": "^3.0.2"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/espree": {
"version": "10.4.0",
"resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
@@ -7567,12 +7691,6 @@
"integrity": "sha512-EUFhWUYzqqBZlzBMI+dPU8rnKXfQZEUnitnccQuEIAnvWFHCpt3+4fts2+4dpxLtlsiseVXCMFg37KjYChSxpg==",
"license": "MIT"
},
- "node_modules/exec-async": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/exec-async/-/exec-async-2.2.0.tgz",
- "integrity": "sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw==",
- "license": "MIT"
- },
"node_modules/execa": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
@@ -7597,6 +7715,19 @@
"url": "https://github.com/sindresorhus/execa?sponsor=1"
}
},
+ "node_modules/execa/node_modules/get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/exit": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
@@ -7624,32 +7755,34 @@
}
},
"node_modules/expo": {
- "version": "54.0.32",
- "resolved": "https://registry.npmjs.org/expo/-/expo-54.0.32.tgz",
- "integrity": "sha512-yL9eTxiQ/QKKggVDAWO5CLjUl6IS0lPYgEvC3QM4q4fxd6rs7ks3DnbXSGVU3KNFoY/7cRNYihvd0LKYP+MCXA==",
+ "version": "55.0.11",
+ "resolved": "https://registry.npmjs.org/expo/-/expo-55.0.11.tgz",
+ "integrity": "sha512-EEFZHm8PDzQ1aVbRUM3NVG2Ao/bdHib+4FeD2SeaGmQJXTHiNyfFFVC8h5j2OyRHSj1R5UXw/zNPknlQHp5hRg==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.20.0",
- "@expo/cli": "54.0.22",
- "@expo/config": "~12.0.13",
- "@expo/config-plugins": "~54.0.4",
- "@expo/devtools": "0.1.8",
- "@expo/fingerprint": "0.15.4",
- "@expo/metro": "~54.2.0",
- "@expo/metro-config": "54.0.14",
- "@expo/vector-icons": "^15.0.3",
+ "@expo/cli": "55.0.21",
+ "@expo/config": "~55.0.12",
+ "@expo/config-plugins": "~55.0.7",
+ "@expo/devtools": "55.0.2",
+ "@expo/fingerprint": "0.16.6",
+ "@expo/local-build-cache-provider": "55.0.8",
+ "@expo/log-box": "55.0.10",
+ "@expo/metro": "~55.0.0",
+ "@expo/metro-config": "55.0.13",
+ "@expo/vector-icons": "^15.0.2",
"@ungap/structured-clone": "^1.3.0",
- "babel-preset-expo": "~54.0.10",
- "expo-asset": "~12.0.12",
- "expo-constants": "~18.0.13",
- "expo-file-system": "~19.0.21",
- "expo-font": "~14.0.11",
- "expo-keep-awake": "~15.0.8",
- "expo-modules-autolinking": "3.0.24",
- "expo-modules-core": "3.0.29",
+ "babel-preset-expo": "~55.0.15",
+ "expo-asset": "~55.0.12",
+ "expo-constants": "~55.0.11",
+ "expo-file-system": "~55.0.14",
+ "expo-font": "~55.0.6",
+ "expo-keep-awake": "~55.0.6",
+ "expo-modules-autolinking": "55.0.14",
+ "expo-modules-core": "55.0.20",
"pretty-format": "^29.7.0",
"react-refresh": "^0.14.2",
- "whatwg-url-without-unicode": "8.0.0-3"
+ "whatwg-url-minimum": "^0.1.1"
},
"bin": {
"expo": "bin/cli",
@@ -7676,22 +7809,22 @@
}
},
"node_modules/expo-application": {
- "version": "7.0.7",
- "resolved": "https://registry.npmjs.org/expo-application/-/expo-application-7.0.7.tgz",
- "integrity": "sha512-Jt1/qqnoDUbZ+bK91+dHaZ1vrPDtRBOltRa681EeedkisqguuEeUx4UHqwVyDK2oHWsK6lO3ojetoA4h8OmNcg==",
+ "version": "55.0.12",
+ "resolved": "https://registry.npmjs.org/expo-application/-/expo-application-55.0.12.tgz",
+ "integrity": "sha512-pDmgZKWZDCgLF9CUlPPBEDKEvYKaAELMXkS7EMz5tRsWTQswwvaa9DW7Lfz9cTn3Bw4fz8agliuF/AU2Ce9T+A==",
"license": "MIT",
"peerDependencies": {
"expo": "*"
}
},
"node_modules/expo-asset": {
- "version": "12.0.12",
- "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-12.0.12.tgz",
- "integrity": "sha512-CsXFCQbx2fElSMn0lyTdRIyKlSXOal6ilLJd+yeZ6xaC7I9AICQgscY5nj0QcwgA+KYYCCEQEBndMsmj7drOWQ==",
+ "version": "55.0.12",
+ "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-55.0.12.tgz",
+ "integrity": "sha512-Ad5RzNqn/dzIrQ+HIrQFSVZ/bZJ24523pV1LnpbruPnIiuhq5DgygmTKiXoK1InelqOoVyY7GIVZ8f07MvxCCQ==",
"license": "MIT",
"dependencies": {
- "@expo/image-utils": "^0.8.8",
- "expo-constants": "~18.0.12"
+ "@expo/image-utils": "^0.8.12",
+ "expo-constants": "~55.0.11"
},
"peerDependencies": {
"expo": "*",
@@ -7700,9 +7833,9 @@
}
},
"node_modules/expo-audio": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/expo-audio/-/expo-audio-1.1.1.tgz",
- "integrity": "sha512-CPCpJ+0AEHdzWROc0f00Zh6e+irLSl2ALos/LPvxEeIcJw1APfBa4DuHPkL4CQCWsVe7EnUjFpdwpqsEUWcP0g==",
+ "version": "55.0.11",
+ "resolved": "https://registry.npmjs.org/expo-audio/-/expo-audio-55.0.11.tgz",
+ "integrity": "sha512-XMgkYd0l54INuPtrFuiC+KqAqkbgKoYOqPWZ8wli/AvL+pxNkheW+xOF571O9pJ8hR5C5gBSTO+ainIQ1BIOHQ==",
"license": "MIT",
"peerDependencies": {
"expo": "*",
@@ -7712,9 +7845,9 @@
}
},
"node_modules/expo-battery": {
- "version": "10.0.8",
- "resolved": "https://registry.npmjs.org/expo-battery/-/expo-battery-10.0.8.tgz",
- "integrity": "sha512-4rwg603XNEnMO5XnM0exq3JJMrJmJcQJegh6lkobLUDZPGHXwxE+4b9kDcYcW8+m2v1BenUnr8tNVla6llYQUA==",
+ "version": "55.0.11",
+ "resolved": "https://registry.npmjs.org/expo-battery/-/expo-battery-55.0.11.tgz",
+ "integrity": "sha512-AyORXeEN0uDvsTLN0Vx1pUuSwyDgDdMO9ktBJYgWR0au2x7brIll/l84pcVE6V7yqw9qLXPKxqj0xFz28q+hUw==",
"license": "MIT",
"peerDependencies": {
"expo": "*",
@@ -7722,9 +7855,9 @@
}
},
"node_modules/expo-blur": {
- "version": "15.0.8",
- "resolved": "https://registry.npmjs.org/expo-blur/-/expo-blur-15.0.8.tgz",
- "integrity": "sha512-rWyE1NBRZEu9WD+X+5l7gyPRszw7n12cW3IRNAb5i6KFzaBp8cxqT5oeaphJapqURvcqhkOZn2k5EtBSbsuU7w==",
+ "version": "55.0.12",
+ "resolved": "https://registry.npmjs.org/expo-blur/-/expo-blur-55.0.12.tgz",
+ "integrity": "sha512-uxPpNduXlUGFT5G4uqKor9/VVvFAUU7AsfNmEsv7ENRCVH0PVOd5QiQ/U+rHTPxZalu/CJtprz3ZiCfF1riMRw==",
"license": "MIT",
"peerDependencies": {
"expo": "*",
@@ -7733,12 +7866,13 @@
}
},
"node_modules/expo-build-properties": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/expo-build-properties/-/expo-build-properties-1.0.10.tgz",
- "integrity": "sha512-mFCZbrbrv0AP5RB151tAoRzwRJelqM7bCJzCkxpu+owOyH+p/rFC/q7H5q8B9EpVWj8etaIuszR+gKwohpmu1Q==",
+ "version": "55.0.11",
+ "resolved": "https://registry.npmjs.org/expo-build-properties/-/expo-build-properties-55.0.11.tgz",
+ "integrity": "sha512-r/CvGqWPxP2pEfR3WQfQjJqgVMQvVqF6rGMN0wAf3HXqzPpvEZt/jB3gDAHIeUpFl3IwpxwBaAgX0rDYoftw9Q==",
"license": "MIT",
"dependencies": {
- "ajv": "^8.11.0",
+ "@expo/schema-utils": "^55.0.2",
+ "resolve-from": "^5.0.0",
"semver": "^7.6.0"
},
"peerDependencies": {
@@ -7746,9 +7880,9 @@
}
},
"node_modules/expo-build-properties/node_modules/semver": {
- "version": "7.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
- "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@@ -7758,12 +7892,12 @@
}
},
"node_modules/expo-camera": {
- "version": "17.0.10",
- "resolved": "https://registry.npmjs.org/expo-camera/-/expo-camera-17.0.10.tgz",
- "integrity": "sha512-w1RBw83mAGVk4BPPwNrCZyFop0VLiVSRE3c2V9onWbdFwonpRhzmB4drygG8YOUTl1H3wQvALJHyMPTbgsK1Jg==",
+ "version": "55.0.13",
+ "resolved": "https://registry.npmjs.org/expo-camera/-/expo-camera-55.0.13.tgz",
+ "integrity": "sha512-y1Jd1RHKgMN7Ba0001L+psGbou9U1gI38Ajfa1e7gl5WhWLjeyUROftkkVgYyg4z631w1FlGJLJurwLeCtp3Zg==",
"license": "MIT",
"dependencies": {
- "invariant": "^2.2.4"
+ "barcode-detector": "^3.0.0"
},
"peerDependencies": {
"expo": "*",
@@ -7778,13 +7912,13 @@
}
},
"node_modules/expo-constants": {
- "version": "18.0.13",
- "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-18.0.13.tgz",
- "integrity": "sha512-FnZn12E1dRYKDHlAdIyNFhBurKTS3F9CrfrBDJI5m3D7U17KBHMQ6JEfYlSj7LG7t+Ulr+IKaj58L1k5gBwTcQ==",
+ "version": "55.0.11",
+ "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-55.0.11.tgz",
+ "integrity": "sha512-efWOJr0oVDId0lhvXJwoWfzucwi1/upDDseuYAhK0m8v5Hg7ObDehMmKRMGL0dgABmlSnppNmmYIeTVe7e2yVg==",
"license": "MIT",
"dependencies": {
- "@expo/config": "~12.0.13",
- "@expo/env": "~2.0.8"
+ "@expo/config": "~55.0.12",
+ "@expo/env": "~2.1.1"
},
"peerDependencies": {
"expo": "*",
@@ -7792,72 +7926,69 @@
}
},
"node_modules/expo-crypto": {
- "version": "15.0.8",
- "resolved": "https://registry.npmjs.org/expo-crypto/-/expo-crypto-15.0.8.tgz",
- "integrity": "sha512-aF7A914TB66WIlTJvl5J6/itejfY78O7dq3ibvFltL9vnTALJ/7LYHvLT4fwmx9yUNS6ekLBtDGWivFWnj2Fcw==",
+ "version": "55.0.12",
+ "resolved": "https://registry.npmjs.org/expo-crypto/-/expo-crypto-55.0.12.tgz",
+ "integrity": "sha512-P6GHuypnOV2rUw8mCoVFlpBQtvXbIQSOjA3UECE72dTNAYUfa5nHZtB8HNEVAycNn+fW6f58vNlnl5oIYdMPkA==",
"license": "MIT",
- "dependencies": {
- "base64-js": "^1.3.0"
- },
"peerDependencies": {
"expo": "*"
}
},
"node_modules/expo-dev-client": {
- "version": "6.0.20",
- "resolved": "https://registry.npmjs.org/expo-dev-client/-/expo-dev-client-6.0.20.tgz",
- "integrity": "sha512-5XjoVlj1OxakNxy55j/AUaGPrDOlQlB6XdHLLWAw61w5ffSpUDHDnuZzKzs9xY1eIaogOqTOQaAzZ2ddBkdXLA==",
+ "version": "55.0.22",
+ "resolved": "https://registry.npmjs.org/expo-dev-client/-/expo-dev-client-55.0.22.tgz",
+ "integrity": "sha512-3AB4n28A07uWsUlu7mOxr76V/jjEpjc5TSlmR37u/qdaX4qwjTy+2GDZWCZumY8dSgy/hKgn1CThnKoVnIM5KA==",
"license": "MIT",
"dependencies": {
- "expo-dev-launcher": "6.0.20",
- "expo-dev-menu": "7.0.18",
- "expo-dev-menu-interface": "2.0.0",
- "expo-manifests": "~1.0.10",
- "expo-updates-interface": "~2.0.0"
+ "expo-dev-launcher": "55.0.23",
+ "expo-dev-menu": "55.0.19",
+ "expo-dev-menu-interface": "55.0.2",
+ "expo-manifests": "~55.0.13",
+ "expo-updates-interface": "~55.1.5"
},
"peerDependencies": {
"expo": "*"
}
},
"node_modules/expo-dev-launcher": {
- "version": "6.0.20",
- "resolved": "https://registry.npmjs.org/expo-dev-launcher/-/expo-dev-launcher-6.0.20.tgz",
- "integrity": "sha512-a04zHEeT9sB0L5EB38fz7sNnUKJ2Ar1pXpcyl60Ki8bXPNCs9rjY7NuYrDkP/irM8+1DklMBqHpyHiLyJ/R+EA==",
+ "version": "55.0.23",
+ "resolved": "https://registry.npmjs.org/expo-dev-launcher/-/expo-dev-launcher-55.0.23.tgz",
+ "integrity": "sha512-H0nLCdV0c7waLMJWX4vO0Rwhtb3d+q3W2YfeWauo250aqrhW2ZD3G9Vr58VGBUQRucE3NLfX8sjZmYNOuT9O5w==",
"license": "MIT",
"dependencies": {
- "ajv": "^8.11.0",
- "expo-dev-menu": "7.0.18",
- "expo-manifests": "~1.0.10"
+ "@expo/schema-utils": "^55.0.2",
+ "expo-dev-menu": "55.0.19",
+ "expo-manifests": "~55.0.13"
},
"peerDependencies": {
"expo": "*"
}
},
"node_modules/expo-dev-menu": {
- "version": "7.0.18",
- "resolved": "https://registry.npmjs.org/expo-dev-menu/-/expo-dev-menu-7.0.18.tgz",
- "integrity": "sha512-4kTdlHrnZCAWCT6tZRQHSSjZ7vECFisL4T+nsG/GJDo/jcHNaOVGV5qPV9wzlTxyMk3YOPggRw4+g7Ownrg5eA==",
+ "version": "55.0.19",
+ "resolved": "https://registry.npmjs.org/expo-dev-menu/-/expo-dev-menu-55.0.19.tgz",
+ "integrity": "sha512-IsXZKKEHothLuNwufhc+GYeBYNmyZyh+3jwhQI8RxbTYJKp17d3hs9agqxGG6CuW5JsOeV+yauQY488OFY40+Q==",
"license": "MIT",
"dependencies": {
- "expo-dev-menu-interface": "2.0.0"
+ "expo-dev-menu-interface": "55.0.2"
},
"peerDependencies": {
"expo": "*"
}
},
"node_modules/expo-dev-menu-interface": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/expo-dev-menu-interface/-/expo-dev-menu-interface-2.0.0.tgz",
- "integrity": "sha512-BvAMPt6x+vyXpThsyjjOYyjwfjREV4OOpQkZ0tNl+nGpsPfcY9mc6DRACoWnH9KpLzyIt3BOgh3cuy/h/OxQjw==",
+ "version": "55.0.2",
+ "resolved": "https://registry.npmjs.org/expo-dev-menu-interface/-/expo-dev-menu-interface-55.0.2.tgz",
+ "integrity": "sha512-DomUNvGzY/xliwnMdbAYY780sCv19N7zIbifc0ClcoCzJZpNSCkvJ2qGIFRPyM/7DmqmlHGCKi8di7kYYLKNEg==",
"license": "MIT",
"peerDependencies": {
"expo": "*"
}
},
"node_modules/expo-device": {
- "version": "8.0.10",
- "resolved": "https://registry.npmjs.org/expo-device/-/expo-device-8.0.10.tgz",
- "integrity": "sha512-jd5BxjaF7382JkDMaC+P04aXXknB2UhWaVx5WiQKA05ugm/8GH5uaz9P9ckWdMKZGQVVEOC8MHaUADoT26KmFA==",
+ "version": "55.0.12",
+ "resolved": "https://registry.npmjs.org/expo-device/-/expo-device-55.0.12.tgz",
+ "integrity": "sha512-RjInu7Wlq2gSEKAcSPjDLQI2U7mJyN6OOyDi0YZVGhf7/LyZghhPAsxbJSt4ETYcGiosFD25FodB575dBnkatw==",
"license": "MIT",
"dependencies": {
"ua-parser-js": "^0.7.33"
@@ -7866,36 +7997,10 @@
"expo": "*"
}
},
- "node_modules/expo-device/node_modules/ua-parser-js": {
- "version": "0.7.40",
- "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.40.tgz",
- "integrity": "sha512-us1E3K+3jJppDBa3Tl0L3MOJiGhe1C6P0+nIvQAFYbxlMAx0h81eOwLmU57xgqToduDDPx3y5QsdjPfDu+FgOQ==",
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/ua-parser-js"
- },
- {
- "type": "paypal",
- "url": "https://paypal.me/faisalman"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/faisalman"
- }
- ],
- "license": "MIT",
- "bin": {
- "ua-parser-js": "script/cli.js"
- },
- "engines": {
- "node": "*"
- }
- },
"node_modules/expo-fetcher": {
- "version": "0.9.1",
- "resolved": "https://registry.npmjs.org/expo-fetcher/-/expo-fetcher-0.9.1.tgz",
- "integrity": "sha512-uYDZW+25ieqoxXSsdL+ELXPWa6qdOl766BFcsFFi5QSmcKQueBrq7n8B2eUVSF8BNRXo2teOE4vYiOImYZquBQ==",
+ "version": "0.9.2",
+ "resolved": "https://registry.npmjs.org/expo-fetcher/-/expo-fetcher-0.9.2.tgz",
+ "integrity": "sha512-KwCRld7VplcjKUlTSJB1TEpjSYgNM/KpVkRt2nBVJIS1RvfbqKfZw8p2OkqwMQUro/aSgyO+ceBe4fOy5yWdfw==",
"license": "MIT",
"dependencies": {
"url-parse": "^1.5.10"
@@ -7907,23 +8012,34 @@
}
},
"node_modules/expo-file-system": {
- "version": "19.0.21",
- "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-19.0.21.tgz",
- "integrity": "sha512-s3DlrDdiscBHtab/6W1osrjGL+C2bvoInPJD7sOwmxfJ5Woynv2oc+Fz1/xVXaE/V7HE/+xrHC/H45tu6lZzzg==",
+ "version": "55.0.14",
+ "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-55.0.14.tgz",
+ "integrity": "sha512-73ukP72uJX+xr5k6zD0Z+rYZXU3a5gZabo0oUcNHMZvqdAxWDfYbwz/0aWy+D0t9R6EYRK2uA9UZhS0NA9iq+Q==",
+ "license": "MIT",
+ "peerDependencies": {
+ "expo": "*",
+ "react-native": "*"
+ }
+ },
+ "node_modules/expo-font": {
+ "version": "55.0.6",
+ "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-55.0.6.tgz",
+ "integrity": "sha512-x9czUA3UQWjIwa0ZUEs/eWJNqB4mAue/m4ltESlNPLZhHL0nWWqIfsyHmklTLFH7mVfcHSJvew6k+pR2FE1zVw==",
"license": "MIT",
+ "dependencies": {
+ "fontfaceobserver": "^2.1.0"
+ },
"peerDependencies": {
"expo": "*",
+ "react": "*",
"react-native": "*"
}
},
- "node_modules/expo-font": {
- "version": "14.0.11",
- "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-14.0.11.tgz",
- "integrity": "sha512-ga0q61ny4s/kr4k8JX9hVH69exVSIfcIc19+qZ7gt71Mqtm7xy2c6kwsPTCyhBW2Ro5yXTT8EaZOpuRi35rHbg==",
+ "node_modules/expo-glass-effect": {
+ "version": "55.0.10",
+ "resolved": "https://registry.npmjs.org/expo-glass-effect/-/expo-glass-effect-55.0.10.tgz",
+ "integrity": "sha512-5kL/jATvgJWdrqPdxixrECJqD2l8cfQ4ALr1DK7qi9XkyI97ejXvUjB2VsfEePNy3Fg+/VwzA3n3L7Nv3tAPkw==",
"license": "MIT",
- "dependencies": {
- "fontfaceobserver": "^2.1.0"
- },
"peerDependencies": {
"expo": "*",
"react": "*",
@@ -7931,45 +8047,65 @@
}
},
"node_modules/expo-haptics": {
- "version": "15.0.8",
- "resolved": "https://registry.npmjs.org/expo-haptics/-/expo-haptics-15.0.8.tgz",
- "integrity": "sha512-lftutojy8Qs8zaDzzjwM3gKHFZ8bOOEZDCkmh2Ddpe95Ra6kt2izeOfOfKuP/QEh0MZ1j9TfqippyHdRd1ZM9g==",
+ "version": "55.0.11",
+ "resolved": "https://registry.npmjs.org/expo-haptics/-/expo-haptics-55.0.11.tgz",
+ "integrity": "sha512-cvayByobLtoS5Yt2JFqcBPH+1mnLHkz+Rr+H1EOCZDdTVo5T6aaAHMOZrbRBZBhxrUevAPxfz0bfyhVZj3XHzA==",
"license": "MIT",
"peerDependencies": {
"expo": "*"
}
},
+ "node_modules/expo-image": {
+ "version": "55.0.8",
+ "resolved": "https://registry.npmjs.org/expo-image/-/expo-image-55.0.8.tgz",
+ "integrity": "sha512-fNdvdYVcGn3g1x6o5AXHKzk4xX8U6rg2W9vFdE1pQO80kWCNReh003ypqSrGy4dD+zA8FtZjrNF3oMDGnPpIGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "sf-symbols-typescript": "^2.2.0"
+ },
+ "peerDependencies": {
+ "expo": "*",
+ "react": "*",
+ "react-native": "*",
+ "react-native-web": "*"
+ },
+ "peerDependenciesMeta": {
+ "react-native-web": {
+ "optional": true
+ }
+ }
+ },
"node_modules/expo-image-loader": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/expo-image-loader/-/expo-image-loader-6.0.0.tgz",
- "integrity": "sha512-nKs/xnOGw6ACb4g26xceBD57FKLFkSwEUTDXEDF3Gtcu3MqF3ZIYd3YM+sSb1/z9AKV1dYT7rMSGVNgsveXLIQ==",
+ "version": "55.0.0",
+ "resolved": "https://registry.npmjs.org/expo-image-loader/-/expo-image-loader-55.0.0.tgz",
+ "integrity": "sha512-NOjp56wDrfuA5aiNAybBIjqIn1IxKeGJ8CECWZncQ/GzjZfyTYAHTCyeApYkdKkMBLHINzI4BbTGSlbCa0fXXQ==",
"license": "MIT",
"peerDependencies": {
"expo": "*"
}
},
"node_modules/expo-image-picker": {
- "version": "17.0.9",
- "resolved": "https://registry.npmjs.org/expo-image-picker/-/expo-image-picker-17.0.9.tgz",
- "integrity": "sha512-v40HcX1fXDlNdc5y88ygvGyZU/QrcybBajYgVVLaWrXXGBqqC8Yu8jOHR99BtIdljiQ6JfYfxbeDp1woiyUrTA==",
+ "version": "55.0.16",
+ "resolved": "https://registry.npmjs.org/expo-image-picker/-/expo-image-picker-55.0.16.tgz",
+ "integrity": "sha512-V0SMNlEdopFlt8drPDuIDcjHab0J+VD73MsTGuz0E/9zoWR6sozZPtTycPTwLifu23zJksG7pppkqFQoID1eFA==",
"license": "MIT",
"dependencies": {
- "expo-image-loader": "~6.0.0"
+ "expo-image-loader": "~55.0.0"
},
"peerDependencies": {
"expo": "*"
}
},
"node_modules/expo-json-utils": {
- "version": "0.15.0",
- "resolved": "https://registry.npmjs.org/expo-json-utils/-/expo-json-utils-0.15.0.tgz",
- "integrity": "sha512-duRT6oGl80IDzH2LD2yEFWNwGIC2WkozsB6HF3cDYNoNNdUvFk6uN3YiwsTsqVM/D0z6LEAQ01/SlYvN+Fw0JQ==",
+ "version": "55.0.2",
+ "resolved": "https://registry.npmjs.org/expo-json-utils/-/expo-json-utils-55.0.2.tgz",
+ "integrity": "sha512-QJMOZOPOG7CTnKcrdVaiummn2va1MCO56z++eyWkDv3GBRODldM6MFMDf/jTREWthFc2Nxo6TuyWRrEV9S6n/Q==",
"license": "MIT"
},
"node_modules/expo-keep-awake": {
- "version": "15.0.8",
- "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-15.0.8.tgz",
- "integrity": "sha512-YK9M1VrnoH1vLJiQzChZgzDvVimVoriibiDIFLbQMpjYBnvyfUeHJcin/Gx1a+XgupNXy92EQJLgI/9ZuXajYQ==",
+ "version": "55.0.6",
+ "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-55.0.6.tgz",
+ "integrity": "sha512-acJjeHqkNxMVckEcJhGQeIksqqsarscSHJtT559bNgyiM4r14dViQ66su7bb6qDVeBt0K7z3glXI1dHVck1Zgg==",
"license": "MIT",
"peerDependencies": {
"expo": "*",
@@ -7977,9 +8113,9 @@
}
},
"node_modules/expo-linear-gradient": {
- "version": "15.0.8",
- "resolved": "https://registry.npmjs.org/expo-linear-gradient/-/expo-linear-gradient-15.0.8.tgz",
- "integrity": "sha512-V2d8Wjn0VzhPHO+rrSBtcl+Fo+jUUccdlmQ6OoL9/XQB7Qk3d9lYrqKDJyccwDxmQT10JdST3Tmf2K52NLc3kw==",
+ "version": "55.0.11",
+ "resolved": "https://registry.npmjs.org/expo-linear-gradient/-/expo-linear-gradient-55.0.11.tgz",
+ "integrity": "sha512-lBGFK2mZuuu5pUfLajAPJiwbWfTvWuCHGxbkLgxlc6csGxuJdVgYNHLdAUuG4sfF9qLTuefzD5KBqQ8UZSytxg==",
"license": "MIT",
"peerDependencies": {
"expo": "*",
@@ -7988,12 +8124,12 @@
}
},
"node_modules/expo-linking": {
- "version": "8.0.10",
- "resolved": "https://registry.npmjs.org/expo-linking/-/expo-linking-8.0.10.tgz",
- "integrity": "sha512-0EKtn4Sk6OYmb/5ZqK8riO0k1Ic+wyT3xExbmDvUYhT7p/cKqlVUExMuOIAt3Cx3KUUU1WCgGmdd493W/D5XjA==",
+ "version": "55.0.11",
+ "resolved": "https://registry.npmjs.org/expo-linking/-/expo-linking-55.0.11.tgz",
+ "integrity": "sha512-qVKOeaFZvaJl99mB1gle0AWaC+36t4SxIIf23rkqyjEs/ZJtt7Zr2NKcQpzNhxUyWms8CSKTAlMO1k9Hx9z9zw==",
"license": "MIT",
"dependencies": {
- "expo-constants": "~18.0.11",
+ "expo-constants": "~55.0.11",
"invariant": "^2.2.4"
},
"peerDependencies": {
@@ -8002,9 +8138,9 @@
}
},
"node_modules/expo-localization": {
- "version": "17.0.8",
- "resolved": "https://registry.npmjs.org/expo-localization/-/expo-localization-17.0.8.tgz",
- "integrity": "sha512-UrdwklZBDJ+t+ZszMMiE0SXZ2eJxcquCuQcl6EvGHM9K+e6YqKVRQ+w8qE+iIB3H75v2RJy6MHAaLK+Mqeo04g==",
+ "version": "55.0.11",
+ "resolved": "https://registry.npmjs.org/expo-localization/-/expo-localization-55.0.11.tgz",
+ "integrity": "sha512-8VK6NNwDolDGteNlc0sYECa3aSYj3UBd3lJcLSz2sLVVEeWIvu+LnmyGc22Xt03oQBi4nNubW/TerxSjWVKxtQ==",
"license": "MIT",
"dependencies": {
"rtl-detect": "^1.0.2"
@@ -8015,56 +8151,49 @@
}
},
"node_modules/expo-location": {
- "version": "19.0.8",
- "resolved": "https://registry.npmjs.org/expo-location/-/expo-location-19.0.8.tgz",
- "integrity": "sha512-H/FI75VuJ1coodJbbMu82pf+Zjess8X8Xkiv9Bv58ZgPKS/2ztjC1YO1/XMcGz7+s9DrbLuMIw22dFuP4HqneA==",
+ "version": "55.1.6",
+ "resolved": "https://registry.npmjs.org/expo-location/-/expo-location-55.1.6.tgz",
+ "integrity": "sha512-GDzZmfiAWsfOVHpF4a5h/MGYAO3LotB2nyN+waxwK81Du4gNg+ALHNi+yeLSv3oy7LNcNfbdLAvEneQQgRvYLg==",
"license": "MIT",
+ "dependencies": {
+ "@expo/image-utils": "^0.8.12"
+ },
"peerDependencies": {
"expo": "*"
}
},
"node_modules/expo-manifests": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/expo-manifests/-/expo-manifests-1.0.10.tgz",
- "integrity": "sha512-oxDUnURPcL4ZsOBY6X1DGWGuoZgVAFzp6PISWV7lPP2J0r8u1/ucuChBgpK7u1eLGFp6sDIPwXyEUCkI386XSQ==",
+ "version": "55.0.13",
+ "resolved": "https://registry.npmjs.org/expo-manifests/-/expo-manifests-55.0.13.tgz",
+ "integrity": "sha512-eLU5PIF9Tg3hHfKK9NgkvCRxwLb3pn8j2W6G/Vt8R6MHSNgaFU7pujvcBDbJCe5t9109zeS5PJY/d+dcagIKNw==",
"license": "MIT",
"dependencies": {
- "@expo/config": "~12.0.11",
- "expo-json-utils": "~0.15.0"
+ "@expo/config": "~55.0.12",
+ "expo-json-utils": "~55.0.2"
},
"peerDependencies": {
"expo": "*"
}
},
"node_modules/expo-modules-autolinking": {
- "version": "3.0.24",
- "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-3.0.24.tgz",
- "integrity": "sha512-TP+6HTwhL7orDvsz2VzauyQlXJcAWyU3ANsZ7JGL4DQu8XaZv/A41ZchbtAYLfozNA2Ya1Hzmhx65hXryBMjaQ==",
+ "version": "55.0.14",
+ "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-55.0.14.tgz",
+ "integrity": "sha512-2dy5lDBx4DP8rV/1pdlRW0kLBVKlfdhd0Pj8LHGBWw6zohTtsu8OKV7Ks3v9lDRt4SHDPehj89yCZgg36c51tA==",
"license": "MIT",
"dependencies": {
+ "@expo/require-utils": "^55.0.3",
"@expo/spawn-async": "^1.7.2",
"chalk": "^4.1.0",
- "commander": "^7.2.0",
- "require-from-string": "^2.0.2",
- "resolve-from": "^5.0.0"
+ "commander": "^7.2.0"
},
"bin": {
"expo-modules-autolinking": "bin/expo-modules-autolinking.js"
}
},
- "node_modules/expo-modules-autolinking/node_modules/commander": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
- "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
- "license": "MIT",
- "engines": {
- "node": ">= 10"
- }
- },
"node_modules/expo-modules-core": {
- "version": "3.0.29",
- "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-3.0.29.tgz",
- "integrity": "sha512-LzipcjGqk8gvkrOUf7O2mejNWugPkf3lmd9GkqL9WuNyeN2fRwU0Dn77e3ZUKI3k6sI+DNwjkq4Nu9fNN9WS7Q==",
+ "version": "55.0.20",
+ "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-55.0.20.tgz",
+ "integrity": "sha512-XqWPvB9eWuUvEQclu0eLbsqNDg3J3KFlQo1l3qodqqzIWno5wM3eRJCycmSwWAFPeTDMk7CxeD2JNFxOJ5Nd8w==",
"license": "MIT",
"dependencies": {
"invariant": "^2.2.4"
@@ -8075,9 +8204,9 @@
}
},
"node_modules/expo-network": {
- "version": "8.0.8",
- "resolved": "https://registry.npmjs.org/expo-network/-/expo-network-8.0.8.tgz",
- "integrity": "sha512-dgrL8UHAmWofqeY4UEjWskCl/RoQAM0DG6PZR8xz2WZt+6aQEboQgFRXowCfhbKZ71d16sNuKXtwBEsp2DtdNw==",
+ "version": "55.0.11",
+ "resolved": "https://registry.npmjs.org/expo-network/-/expo-network-55.0.11.tgz",
+ "integrity": "sha512-p9wsKAJ9ksLpNdgGAMcLgktUGPqIouYkiHiUtZJJdZf2Yq2ZDjRt+N0MTVVdplVv9dvd3RfaO/JJ36AVXisdWg==",
"license": "MIT",
"peerDependencies": {
"expo": "*",
@@ -8085,18 +8214,16 @@
}
},
"node_modules/expo-notifications": {
- "version": "0.32.13",
- "resolved": "https://registry.npmjs.org/expo-notifications/-/expo-notifications-0.32.13.tgz",
- "integrity": "sha512-PL0R1ulLVUgAswlXtRDKxBlcipNM3YA6+P5nB5JIhXbsjLJ7y+EKVaEhHhbaGzuK1QVsRQSJNm/4oISX+vsmFQ==",
+ "version": "55.0.16",
+ "resolved": "https://registry.npmjs.org/expo-notifications/-/expo-notifications-55.0.16.tgz",
+ "integrity": "sha512-czurYxLL11uK+oXnbeBLKG0ZpC1h72+JZBAPOfldn1qvR4Vot3UTfIEvtGonsBDeVofCuxgpBIAQ+xPmZSy+6A==",
"license": "MIT",
"dependencies": {
- "@expo/image-utils": "^0.8.7",
- "@ide/backoff": "^1.0.0",
+ "@expo/image-utils": "^0.8.12",
"abort-controller": "^3.0.0",
- "assert": "^2.0.0",
"badgin": "^1.1.5",
- "expo-application": "~7.0.7",
- "expo-constants": "~18.0.10"
+ "expo-application": "~55.0.12",
+ "expo-constants": "~55.0.11"
},
"peerDependencies": {
"expo": "*",
@@ -8105,28 +8232,31 @@
}
},
"node_modules/expo-router": {
- "version": "6.0.17",
- "resolved": "https://registry.npmjs.org/expo-router/-/expo-router-6.0.17.tgz",
- "integrity": "sha512-2n0lTidH2H+dOjk/Lu+krKIgK7b1qQ3O/9RWmf9P5IEuFiu7BSUgSDc+g69bUEElTnca8FR+zPTyk15kMXHrXg==",
+ "version": "55.0.10",
+ "resolved": "https://registry.npmjs.org/expo-router/-/expo-router-55.0.10.tgz",
+ "integrity": "sha512-8aWTcWtuYN4vriMSWINMXC1rPVBGkHD4r4wWSAWX8e5RuSnXfy8RUcsC5L5Ewq4i7lo04VM2RJZAH6UYFFRKrQ==",
"license": "MIT",
"dependencies": {
- "@expo/metro-runtime": "^6.1.2",
- "@expo/schema-utils": "^0.1.8",
- "@radix-ui/react-slot": "1.2.0",
+ "@expo/metro-runtime": "^55.0.9",
+ "@expo/schema-utils": "^55.0.2",
+ "@radix-ui/react-slot": "^1.2.0",
"@radix-ui/react-tabs": "^1.1.12",
- "@react-navigation/bottom-tabs": "^7.4.0",
- "@react-navigation/native": "^7.1.8",
- "@react-navigation/native-stack": "^7.3.16",
+ "@react-navigation/bottom-tabs": "^7.15.5",
+ "@react-navigation/native": "^7.1.33",
+ "@react-navigation/native-stack": "^7.14.5",
"client-only": "^0.0.1",
"debug": "^4.3.4",
"escape-string-regexp": "^4.0.0",
- "expo-server": "^1.0.5",
+ "expo-glass-effect": "^55.0.10",
+ "expo-image": "^55.0.8",
+ "expo-server": "^55.0.7",
+ "expo-symbols": "^55.0.7",
"fast-deep-equal": "^3.1.3",
"invariant": "^2.2.4",
"nanoid": "^3.3.8",
"query-string": "^7.1.3",
"react-fast-compare": "^3.2.2",
- "react-native-is-edge-to-edge": "^1.1.6",
+ "react-native-is-edge-to-edge": "^1.2.1",
"semver": "~7.6.3",
"server-only": "^0.0.1",
"sf-symbols-typescript": "^2.1.0",
@@ -8135,12 +8265,13 @@
"vaul": "^1.1.2"
},
"peerDependencies": {
- "@expo/metro-runtime": "^6.1.2",
- "@react-navigation/drawer": "^7.5.0",
- "@testing-library/react-native": ">= 12.0.0",
+ "@expo/log-box": "55.0.10",
+ "@expo/metro-runtime": "^55.0.9",
+ "@react-navigation/drawer": "^7.9.4",
+ "@testing-library/react-native": ">= 13.2.0",
"expo": "*",
- "expo-constants": "^18.0.11",
- "expo-linking": "^8.0.10",
+ "expo-constants": "^55.0.11",
+ "expo-linking": "^55.0.11",
"react": "*",
"react-dom": "*",
"react-native": "*",
@@ -8149,7 +8280,7 @@
"react-native-safe-area-context": ">= 5.4.0",
"react-native-screens": "*",
"react-native-web": "*",
- "react-server-dom-webpack": "~19.0.1 || ~19.1.2 || ~19.2.1"
+ "react-server-dom-webpack": "~19.0.4 || ~19.1.5 || ~19.2.4"
},
"peerDependenciesMeta": {
"@react-navigation/drawer": {
@@ -8188,39 +8319,39 @@
}
},
"node_modules/expo-secure-store": {
- "version": "15.0.8",
- "resolved": "https://registry.npmjs.org/expo-secure-store/-/expo-secure-store-15.0.8.tgz",
- "integrity": "sha512-lHnzvRajBu4u+P99+0GEMijQMFCOYpWRO4dWsXSuMt77+THPIGjzNvVKrGSl6mMrLsfVaKL8BpwYZLGlgA+zAw==",
+ "version": "55.0.11",
+ "resolved": "https://registry.npmjs.org/expo-secure-store/-/expo-secure-store-55.0.11.tgz",
+ "integrity": "sha512-uESAb/yZvWTs0wI/IulCCVI6psoGO8T59XI3dRTkPfc/F8r1AXpVi/jh+gkmjG8lcU6ni2AUC1HNSFW9rLEXlg==",
"license": "MIT",
"peerDependencies": {
"expo": "*"
}
},
"node_modules/expo-server": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/expo-server/-/expo-server-1.0.5.tgz",
- "integrity": "sha512-IGR++flYH70rhLyeXF0Phle56/k4cee87WeQ4mamS+MkVAVP+dDlOHf2nN06Z9Y2KhU0Gp1k+y61KkghF7HdhA==",
+ "version": "55.0.7",
+ "resolved": "https://registry.npmjs.org/expo-server/-/expo-server-55.0.7.tgz",
+ "integrity": "sha512-Cc1btFyPsD9P4DT2xd1pG/uR96TLVMx0W+dPm9Gjk1uDV9xuzvMcUsY7nf9bt4U5pGyWWkCXmPJcKwWfdl51Pw==",
"license": "MIT",
"engines": {
"node": ">=20.16.0"
}
},
"node_modules/expo-splash-screen": {
- "version": "31.0.12",
- "resolved": "https://registry.npmjs.org/expo-splash-screen/-/expo-splash-screen-31.0.12.tgz",
- "integrity": "sha512-o466xFYh7Fld7CuBrzx5I12LONo7a4xzOSbxS+buOEObL/Wp4Xu4QhXg80ZY7puCGbJbtm7Ltjgg5olnWOU/Rg==",
+ "version": "55.0.15",
+ "resolved": "https://registry.npmjs.org/expo-splash-screen/-/expo-splash-screen-55.0.15.tgz",
+ "integrity": "sha512-j1RnPtw37mSUFgzrHeank2VbAkgziT5cWzVVECqAk706XWfDTO6a5yriyp68w3o4q8gBp3CdlDbmQpX19Yk7IQ==",
"license": "MIT",
"dependencies": {
- "@expo/prebuild-config": "^54.0.7"
+ "@expo/prebuild-config": "^55.0.12"
},
"peerDependencies": {
"expo": "*"
}
},
"node_modules/expo-status-bar": {
- "version": "3.0.9",
- "resolved": "https://registry.npmjs.org/expo-status-bar/-/expo-status-bar-3.0.9.tgz",
- "integrity": "sha512-xyYyVg6V1/SSOZWh4Ni3U129XHCnFHBTcUo0dhWtFDrZbNp/duw5AGsQfb2sVeU0gxWHXSY1+5F0jnKYC7WuOw==",
+ "version": "55.0.5",
+ "resolved": "https://registry.npmjs.org/expo-status-bar/-/expo-status-bar-55.0.5.tgz",
+ "integrity": "sha512-qb0c3rJO2b7CC0gUVGi1JYp92oLenWdYGyk8l4YQs6U+uaXUTPv6aaFa3KkT2HON10re3AxxPNJci8rsz6kPxg==",
"license": "MIT",
"dependencies": {
"react-native-is-edge-to-edge": "^1.2.1"
@@ -8230,13 +8361,29 @@
"react-native": "*"
}
},
+ "node_modules/expo-symbols": {
+ "version": "55.0.7",
+ "resolved": "https://registry.npmjs.org/expo-symbols/-/expo-symbols-55.0.7.tgz",
+ "integrity": "sha512-y4ALLbncSGQzhFLw1PaIBbO39xzaw3ie249HmK6zK/WLJYfw4Z/9UU4iPKO3KCE4FyCKIzd+yRsvzvlri23YrQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@expo-google-fonts/material-symbols": "^0.4.1",
+ "sf-symbols-typescript": "^2.0.0"
+ },
+ "peerDependencies": {
+ "expo": "*",
+ "expo-font": "*",
+ "react": "*",
+ "react-native": "*"
+ }
+ },
"node_modules/expo-system-ui": {
- "version": "6.0.9",
- "resolved": "https://registry.npmjs.org/expo-system-ui/-/expo-system-ui-6.0.9.tgz",
- "integrity": "sha512-eQTYGzw1V4RYiYHL9xDLYID3Wsec2aZS+ypEssmF64D38aDrqbDgz1a2MSlHLQp2jHXSs3FvojhZ9FVela1Zcg==",
+ "version": "55.0.13",
+ "resolved": "https://registry.npmjs.org/expo-system-ui/-/expo-system-ui-55.0.13.tgz",
+ "integrity": "sha512-I8GlIm62EOwivSccm0jAmPtkbs0lAT6U1kzsFNSkCcWfKMCSKwkNC+UYZD0HgTe7p9SEifca6ppUDmQkvsHJFQ==",
"license": "MIT",
"dependencies": {
- "@react-native/normalize-colors": "0.81.5",
+ "@react-native/normalize-colors": "0.83.4",
"debug": "^4.3.2"
},
"peerDependencies": {
@@ -8251,18 +8398,18 @@
}
},
"node_modules/expo-updates-interface": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/expo-updates-interface/-/expo-updates-interface-2.0.0.tgz",
- "integrity": "sha512-pTzAIufEZdVPKql6iMi5ylVSPqV1qbEopz9G6TSECQmnNde2nwq42PxdFBaUEd8IZJ/fdJLQnOT3m6+XJ5s7jg==",
+ "version": "55.1.5",
+ "resolved": "https://registry.npmjs.org/expo-updates-interface/-/expo-updates-interface-55.1.5.tgz",
+ "integrity": "sha512-YOk9vhplWi0djoeqxMlEQgcDFeOGhnj4dWU0v1QvF5RqpqwLGdx780E0k3zL85xw6LXljVN78d6g8z51qIZu5g==",
"license": "MIT",
"peerDependencies": {
"expo": "*"
}
},
"node_modules/expo-video": {
- "version": "3.0.15",
- "resolved": "https://registry.npmjs.org/expo-video/-/expo-video-3.0.15.tgz",
- "integrity": "sha512-KmxHVCtOBb1fnxXL6DpgLbEe7Qlv/vHNGTLfz0u/eY8fBC9s5cncD2BhPunEffrGvNMftBzYMYDaO86x+IYpnA==",
+ "version": "55.0.13",
+ "resolved": "https://registry.npmjs.org/expo-video/-/expo-video-55.0.13.tgz",
+ "integrity": "sha512-JcctuspiEgJShq1vuJ/AF5eJHdbaiEXUa/T+Ov9mSSFXN2O22DciwPwUU7tVR7Nqlo4L5iMuLlBdOa38wAoDCA==",
"license": "MIT",
"peerDependencies": {
"expo": "*",
@@ -8271,9 +8418,9 @@
}
},
"node_modules/expo-web-browser": {
- "version": "15.0.10",
- "resolved": "https://registry.npmjs.org/expo-web-browser/-/expo-web-browser-15.0.10.tgz",
- "integrity": "sha512-fvDhW4bhmXAeWFNFiInmsGCK83PAqAcQaFyp/3pE/jbdKmFKoRCWr46uZGIfN4msLK/OODhaQ/+US7GSJNDHJg==",
+ "version": "55.0.12",
+ "resolved": "https://registry.npmjs.org/expo-web-browser/-/expo-web-browser-55.0.12.tgz",
+ "integrity": "sha512-fMmDx/belJ7oW3+Ee7LbPMYKWxQlRYY/JXWFkQ72Zm1cg9Fmxzcu8iSu8gzdvjViM3B545PPv3src5TWq9qDdA==",
"license": "MIT",
"peerDependencies": {
"expo": "*",
@@ -8281,32 +8428,32 @@
}
},
"node_modules/expo/node_modules/@expo/cli": {
- "version": "54.0.22",
- "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-54.0.22.tgz",
- "integrity": "sha512-BTH2FCczhJLfj1cpfcKrzhKnvRLTOztgW4bVloKDqH+G3ZSohWLRFNAIz56XtdjPxBbi2/qWhGBAkl7kBon/Jw==",
+ "version": "55.0.21",
+ "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-55.0.21.tgz",
+ "integrity": "sha512-lBHSTRXXzIJwaEevZ+AAaTxhdlYpmjnb5T1Q/L1lVSmz/wzfQyh45OlxkPOePWrKuIMETxoK/aR05WmBAYL0Aw==",
"license": "MIT",
"dependencies": {
- "@0no-co/graphql.web": "^1.0.8",
"@expo/code-signing-certificates": "^0.0.6",
- "@expo/config": "~12.0.13",
- "@expo/config-plugins": "~54.0.4",
+ "@expo/config": "~55.0.12",
+ "@expo/config-plugins": "~55.0.7",
"@expo/devcert": "^1.2.1",
- "@expo/env": "~2.0.8",
- "@expo/image-utils": "^0.8.8",
- "@expo/json-file": "^10.0.8",
- "@expo/metro": "~54.2.0",
- "@expo/metro-config": "~54.0.14",
- "@expo/osascript": "^2.3.8",
- "@expo/package-manager": "^1.9.10",
- "@expo/plist": "^0.4.8",
- "@expo/prebuild-config": "^54.0.8",
- "@expo/schema-utils": "^0.1.8",
+ "@expo/env": "~2.1.1",
+ "@expo/image-utils": "^0.8.12",
+ "@expo/json-file": "^10.0.13",
+ "@expo/log-box": "55.0.10",
+ "@expo/metro": "~55.0.0",
+ "@expo/metro-config": "~55.0.13",
+ "@expo/osascript": "^2.4.2",
+ "@expo/package-manager": "^1.10.3",
+ "@expo/plist": "^0.5.2",
+ "@expo/prebuild-config": "^55.0.12",
+ "@expo/require-utils": "^55.0.3",
+ "@expo/router-server": "^55.0.13",
+ "@expo/schema-utils": "^55.0.2",
"@expo/spawn-async": "^1.7.2",
"@expo/ws-tunnel": "^1.0.1",
- "@expo/xcpretty": "^4.3.0",
- "@react-native/dev-middleware": "0.81.5",
- "@urql/core": "^5.0.6",
- "@urql/exchange-retry": "^1.3.0",
+ "@expo/xcpretty": "^4.4.0",
+ "@react-native/dev-middleware": "0.83.4",
"accepts": "^1.3.8",
"arg": "^5.0.2",
"better-opn": "~3.0.2",
@@ -8317,38 +8464,32 @@
"compression": "^1.7.4",
"connect": "^3.7.0",
"debug": "^4.3.4",
- "env-editor": "^0.4.1",
- "expo-server": "^1.0.5",
- "freeport-async": "^2.0.0",
+ "dnssd-advertise": "^1.1.3",
+ "expo-server": "^55.0.7",
+ "fetch-nodeshim": "^0.4.6",
"getenv": "^2.0.0",
"glob": "^13.0.0",
- "lan-network": "^0.1.6",
- "minimatch": "^9.0.0",
+ "lan-network": "^0.2.0",
+ "multitars": "^0.2.3",
"node-forge": "^1.3.3",
"npm-package-arg": "^11.0.0",
"ora": "^3.4.0",
- "picomatch": "^3.0.1",
- "pretty-bytes": "^5.6.0",
+ "picomatch": "^4.0.3",
"pretty-format": "^29.7.0",
"progress": "^2.0.3",
"prompts": "^2.3.2",
- "qrcode-terminal": "0.11.0",
- "require-from-string": "^2.0.2",
- "requireg": "^0.2.2",
- "resolve": "^1.22.2",
"resolve-from": "^5.0.0",
- "resolve.exports": "^2.0.3",
"semver": "^7.6.0",
"send": "^0.19.0",
"slugify": "^1.3.4",
"source-map-support": "~0.5.21",
"stacktrace-parser": "^0.1.10",
"structured-headers": "^0.4.1",
- "tar": "^7.5.2",
"terminal-link": "^2.1.1",
- "undici": "^6.18.2",
+ "toqr": "^0.1.1",
"wrap-ansi": "^7.0.0",
- "ws": "^8.12.1"
+ "ws": "^8.12.1",
+ "zod": "^3.25.76"
},
"bin": {
"expo-internal": "build/bin/cli"
@@ -8367,78 +8508,66 @@
}
}
},
- "node_modules/expo/node_modules/brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "node_modules/expo/node_modules/@expo/cli/node_modules/@expo/router-server": {
+ "version": "55.0.13",
+ "resolved": "https://registry.npmjs.org/@expo/router-server/-/router-server-55.0.13.tgz",
+ "integrity": "sha512-AoxfxJYkAIMey8YqAohFovp4M4DjzoCDH9ampVN/ZKt+bzXkTIFmWEinQ5mpMfHdfIWaumvxQbohgoo6D5xUZA==",
"license": "MIT",
"dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/expo/node_modules/glob": {
- "version": "13.0.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz",
- "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==",
- "license": "BlueOak-1.0.0",
- "dependencies": {
- "minimatch": "^10.1.1",
- "minipass": "^7.1.2",
- "path-scurry": "^2.0.0"
- },
- "engines": {
- "node": "20 || >=22"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/expo/node_modules/glob/node_modules/minimatch": {
- "version": "10.1.1",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz",
- "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==",
- "license": "BlueOak-1.0.0",
- "dependencies": {
- "@isaacs/brace-expansion": "^5.0.0"
+ "debug": "^4.3.4"
},
- "engines": {
- "node": "20 || >=22"
+ "peerDependencies": {
+ "@expo/metro-runtime": "^55.0.9",
+ "expo": "*",
+ "expo-constants": "^55.0.11",
+ "expo-font": "^55.0.6",
+ "expo-router": "*",
+ "expo-server": "^55.0.7",
+ "react": "*",
+ "react-dom": "*",
+ "react-server-dom-webpack": "~19.0.1 || ~19.1.2 || ~19.2.1"
},
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "peerDependenciesMeta": {
+ "@expo/metro-runtime": {
+ "optional": true
+ },
+ "expo-router": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ },
+ "react-server-dom-webpack": {
+ "optional": true
+ }
}
},
- "node_modules/expo/node_modules/minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
- "license": "ISC",
+ "node_modules/expo/node_modules/accepts": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+ "license": "MIT",
"dependencies": {
- "brace-expansion": "^2.0.1"
+ "mime-types": "~2.1.34",
+ "negotiator": "0.6.3"
},
"engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "node": ">= 0.6"
}
},
- "node_modules/expo/node_modules/picomatch": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz",
- "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==",
+ "node_modules/expo/node_modules/negotiator": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
"license": "MIT",
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
+ "node": ">= 0.6"
}
},
"node_modules/expo/node_modules/semver": {
- "version": "7.7.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
- "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@@ -8447,6 +8576,16 @@
"node": ">=10"
}
},
+ "node_modules/expo/node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "license": "MIT",
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
"node_modules/exponential-backoff": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz",
@@ -8454,49 +8593,19 @@
"license": "Apache-2.0"
},
"node_modules/ezly": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/ezly/-/ezly-1.4.3.tgz",
- "integrity": "sha512-FNN+gYoTUAAB9zf6aJSwzXHLJu6sSkLNpCDW4KZdihf9h8hm0jvMYgQyokd+rnWuqn6lQefYpCHNPQi5de9hAA==",
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/ezly/-/ezly-1.4.4.tgz",
+ "integrity": "sha512-ruEiRbpTR9t+hw7qp54AjyWgK+IIAq56H6ZH1uyEG089pJsD9jiZqJyDv8ybITEjIPRqhxwaBa6OI89Rpt9RNg==",
"license": "GPL-3.0-or-later",
"dependencies": {
"@literate.ink/utilities": "1.0.0-11713907881.1",
"@noble/curves": "^2.0.1",
"@noble/hashes": "^2.0.1",
- "@peculiar/asn1-ecc": "^2.5.0",
- "@peculiar/asn1-pkcs8": "^2.5.0",
- "@peculiar/asn1-schema": "^2.5.0",
+ "@peculiar/asn1-ecc": "^2.6.0",
+ "@peculiar/asn1-pkcs8": "^2.6.0",
+ "@peculiar/asn1-schema": "^2.6.0",
"@scure/base": "^2.0.0",
- "fast-xml-parser": "^5.3.0"
- }
- },
- "node_modules/ezly/node_modules/@literate.ink/utilities": {
- "version": "1.0.0-11713907881.1",
- "resolved": "https://registry.npmjs.org/@literate.ink/utilities/-/utilities-1.0.0-11713907881.1.tgz",
- "integrity": "sha512-+RdZqu5dor5YQfL0CRSGPb9Gl6qCsXusziJZt84KxmJsL55ElPSc35AR4CNITzsYg7rAXVnoUCf8fXpaSeWJsg==",
- "license": "MIT",
- "dependencies": {
- "set-cookie-parser": "^2.7.0"
- }
- },
- "node_modules/ezly/node_modules/@noble/hashes": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.0.1.tgz",
- "integrity": "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==",
- "license": "MIT",
- "engines": {
- "node": ">= 20.19.0"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
- "node_modules/ezly/node_modules/@scure/base": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@scure/base/-/base-2.0.0.tgz",
- "integrity": "sha512-3E1kpuZginKkek01ovG8krQ0Z44E3DHPjc5S2rjJw9lZn3KSQOs8S7wqikF/AH7iRanHypj85uGyxk0XAyC37w==",
- "license": "MIT",
- "funding": {
- "url": "https://paulmillr.com/funding/"
+ "fast-xml-parser": "^5.3.3"
}
},
"node_modules/fast-deep-equal": {
@@ -8525,26 +8634,25 @@
"license": "MIT",
"peer": true
},
- "node_modules/fast-uri": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz",
- "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==",
+ "node_modules/fast-xml-builder": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.4.tgz",
+ "integrity": "sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg==",
"funding": [
{
"type": "github",
- "url": "https://github.com/sponsors/fastify"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/fastify"
+ "url": "https://github.com/sponsors/NaturalIntelligence"
}
],
- "license": "BSD-3-Clause"
+ "license": "MIT",
+ "dependencies": {
+ "path-expression-matcher": "^1.1.3"
+ }
},
"node_modules/fast-xml-parser": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.3.0.tgz",
- "integrity": "sha512-gkWGshjYcQCF+6qtlrqBqELqNqnt4CxruY6UVAWWnqb3DQ6qaNFEIKqzYep1XzHLM/QtrHVCxyPOtTk4LTQ7Aw==",
+ "version": "5.5.10",
+ "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.5.10.tgz",
+ "integrity": "sha512-go2J2xODMc32hT+4Xr/bBGXMaIoiCwrwp2mMtAvKyvEFW6S/v5Gn2pBmE4nvbwNjGhpcAiOwEv7R6/GZ6XRa9w==",
"funding": [
{
"type": "github",
@@ -8553,12 +8661,26 @@
],
"license": "MIT",
"dependencies": {
- "strnum": "^2.1.0"
+ "fast-xml-builder": "^1.1.4",
+ "path-expression-matcher": "^1.2.1",
+ "strnum": "^2.2.2"
},
"bin": {
"fxparser": "src/cli/cli.js"
}
},
+ "node_modules/fb-dotslash": {
+ "version": "0.5.8",
+ "resolved": "https://registry.npmjs.org/fb-dotslash/-/fb-dotslash-0.5.8.tgz",
+ "integrity": "sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA==",
+ "license": "(MIT OR Apache-2.0)",
+ "bin": {
+ "dotslash": "bin/dotslash"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
"node_modules/fb-watchman": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz",
@@ -8598,6 +8720,32 @@
"asap": "~2.0.3"
}
},
+ "node_modules/fbjs/node_modules/ua-parser-js": {
+ "version": "1.0.41",
+ "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.41.tgz",
+ "integrity": "sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/ua-parser-js"
+ },
+ {
+ "type": "paypal",
+ "url": "https://paypal.me/faisalman"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/faisalman"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "ua-parser-js": "script/cli.js"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/fdir": {
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
@@ -8616,26 +8764,20 @@
}
},
"node_modules/fetch-cookie": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/fetch-cookie/-/fetch-cookie-3.1.0.tgz",
- "integrity": "sha512-s/XhhreJpqH0ftkGVcQt8JE9bqk+zRn4jF5mPJXWZeQMCI5odV9K+wEWYbnzFPHgQZlvPSMjS4n4yawWE8RINw==",
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/fetch-cookie/-/fetch-cookie-3.2.0.tgz",
+ "integrity": "sha512-n61pQIxP25C6DRhcJxn7BDzgHP/+S56Urowb5WFxtcRMpU6drqXD90xjyAsVQYsNSNNVbaCcYY1DuHsdkZLuiA==",
"license": "Unlicense",
"dependencies": {
"set-cookie-parser": "^2.4.8",
- "tough-cookie": "^5.0.0"
+ "tough-cookie": "^6.0.0"
}
},
- "node_modules/fetch-cookie/node_modules/tough-cookie": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz",
- "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==",
- "license": "BSD-3-Clause",
- "dependencies": {
- "tldts": "^6.1.32"
- },
- "engines": {
- "node": ">=16"
- }
+ "node_modules/fetch-nodeshim": {
+ "version": "0.4.10",
+ "resolved": "https://registry.npmjs.org/fetch-nodeshim/-/fetch-nodeshim-0.4.10.tgz",
+ "integrity": "sha512-m6I8ALe4L4XpdETy7MJZWs6L1IVMbjs99bwbpIKphxX+0CTns4IKDWJY0LWfr4YsFjfg+z1TjzTMU8lKl8rG0w==",
+ "license": "MIT"
},
"node_modules/fflate": {
"version": "0.8.2",
@@ -8711,16 +8853,20 @@
"license": "MIT"
},
"node_modules/find-up": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
"license": "MIT",
+ "peer": true,
"dependencies": {
- "locate-path": "^5.0.0",
+ "locate-path": "^6.0.0",
"path-exists": "^4.0.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/find-yarn-workspace-root": {
@@ -8747,9 +8893,9 @@
}
},
"node_modules/flatted": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
- "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz",
+ "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==",
"license": "ISC",
"peer": true
},
@@ -8781,9 +8927,9 @@
}
},
"node_modules/form-data": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz",
- "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==",
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz",
+ "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -8797,15 +8943,6 @@
"node": ">= 6"
}
},
- "node_modules/freeport-async": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/freeport-async/-/freeport-async-2.0.0.tgz",
- "integrity": "sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/fresh": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
@@ -8829,15 +8966,6 @@
"node": ">=12"
}
},
- "node_modules/fs-extra/node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
- "license": "MIT",
- "engines": {
- "node": ">= 10.0.0"
- }
- },
"node_modules/fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
@@ -8896,6 +9024,15 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/generator-function": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz",
+ "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/gensync": {
"version": "1.0.0-beta.2",
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
@@ -8970,13 +9107,15 @@
}
},
"node_modules/get-stream": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
- "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
- "dev": true,
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+ "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
"license": "MIT",
+ "dependencies": {
+ "pump": "^3.0.0"
+ },
"engines": {
- "node": ">=10"
+ "node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
@@ -9009,21 +9148,17 @@
}
},
"node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "deprecated": "Glob versions prior to v9 are no longer supported",
- "license": "ISC",
+ "version": "13.0.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz",
+ "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==",
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
+ "minimatch": "^10.2.2",
+ "minipass": "^7.1.3",
+ "path-scurry": "^2.0.2"
},
"engines": {
- "node": "*"
+ "node": "18 || 20 || >=22"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
@@ -9042,16 +9177,40 @@
"node": ">=10.13.0"
}
},
- "node_modules/global-dirs": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz",
- "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==",
+ "node_modules/glob/node_modules/balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "license": "MIT",
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/glob/node_modules/brace-expansion": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz",
+ "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==",
"license": "MIT",
"dependencies": {
- "ini": "^1.3.4"
+ "balanced-match": "^4.0.2"
},
"engines": {
- "node": ">=4"
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/glob/node_modules/minimatch": {
+ "version": "10.2.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
+ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "brace-expansion": "^5.0.5"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/globals": {
@@ -9213,19 +9372,25 @@
"node": ">= 0.4"
}
},
+ "node_modules/hermes-compiler": {
+ "version": "0.14.1",
+ "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.14.1.tgz",
+ "integrity": "sha512-+RPPQlayoZ9n6/KXKt5SFILWXCGJ/LV5d24L5smXrvTDrPS4L6dSctPczXauuvzFP3QEJbD1YO7Z3Ra4a+4IhA==",
+ "license": "MIT"
+ },
"node_modules/hermes-estree": {
- "version": "0.29.1",
- "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.29.1.tgz",
- "integrity": "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==",
+ "version": "0.32.1",
+ "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.1.tgz",
+ "integrity": "sha512-ne5hkuDxheNBAikDjqvCZCwihnz0vVu9YsBzAEO1puiyFR4F1+PAz/SiPHSsNTuOveCYGRMX8Xbx4LOubeC0Qg==",
"license": "MIT"
},
"node_modules/hermes-parser": {
- "version": "0.29.1",
- "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.29.1.tgz",
- "integrity": "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==",
+ "version": "0.32.1",
+ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.1.tgz",
+ "integrity": "sha512-175dz634X/W5AiwrpLdoMl/MOb17poLHyIqgyExlE8D9zQ1OPnoORnGMB5ltRKnpvQzBjMYvT2rN/sHeIfZW5Q==",
"license": "MIT",
"dependencies": {
- "hermes-estree": "0.29.1"
+ "hermes-estree": "0.32.1"
}
},
"node_modules/hoist-non-react-statics": {
@@ -9321,62 +9486,6 @@
"readable-stream": "^2.0.2"
}
},
- "node_modules/htmlparser2-without-node-native/node_modules/dom-serializer": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
- "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
- "license": "MIT",
- "dependencies": {
- "domelementtype": "^2.0.1",
- "entities": "^2.0.0"
- }
- },
- "node_modules/htmlparser2-without-node-native/node_modules/dom-serializer/node_modules/domelementtype": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
- "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/fb55"
- }
- ],
- "license": "BSD-2-Clause"
- },
- "node_modules/htmlparser2-without-node-native/node_modules/dom-serializer/node_modules/entities": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
- "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
- "license": "BSD-2-Clause",
- "funding": {
- "url": "https://github.com/fb55/entities?sponsor=1"
- }
- },
- "node_modules/htmlparser2-without-node-native/node_modules/domelementtype": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
- "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
- "license": "BSD-2-Clause"
- },
- "node_modules/htmlparser2-without-node-native/node_modules/domhandler": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
- "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
- "license": "BSD-2-Clause",
- "dependencies": {
- "domelementtype": "1"
- }
- },
- "node_modules/htmlparser2-without-node-native/node_modules/domutils": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
- "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
- "license": "BSD-2-Clause",
- "dependencies": {
- "dom-serializer": "0",
- "domelementtype": "1"
- }
- },
"node_modules/htmlparser2-without-node-native/node_modules/entities": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
@@ -9477,29 +9586,29 @@
"license": "BSD-3-Clause"
},
"node_modules/i18next": {
- "version": "25.7.2",
- "resolved": "https://registry.npmjs.org/i18next/-/i18next-25.7.2.tgz",
- "integrity": "sha512-58b4kmLpLv1buWUEwegMDUqZVR5J+rT+WTRFaBGL7lxDuJQQ0NrJFrq+eT2N94aYVR1k1Sr13QITNOL88tZCuw==",
+ "version": "25.10.10",
+ "resolved": "https://registry.npmjs.org/i18next/-/i18next-25.10.10.tgz",
+ "integrity": "sha512-cqUW2Z3EkRx7NqSyywjkgCLK7KLCL6IFVFcONG7nVYIJ3ekZ1/N5jUsihHV6Bq37NfhgtczxJcxduELtjTwkuQ==",
"funding": [
{
"type": "individual",
- "url": "https://locize.com"
+ "url": "https://www.locize.com/i18next"
},
{
"type": "individual",
- "url": "https://locize.com/i18next.html"
+ "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project"
},
{
"type": "individual",
- "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project"
+ "url": "https://www.locize.com"
}
],
"license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.28.4"
+ "@babel/runtime": "^7.29.2"
},
"peerDependencies": {
- "typescript": "^5"
+ "typescript": "^5 || ^6"
},
"peerDependenciesMeta": {
"typescript": {
@@ -9570,6 +9679,33 @@
"node": ">=16.x"
}
},
+ "node_modules/import-fresh": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/import-fresh/node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/import-local": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz",
@@ -9616,12 +9752,6 @@
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"license": "ISC"
},
- "node_modules/ini": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
- "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
- "license": "ISC"
- },
"node_modules/inline-style-prefixer": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-7.0.1.tgz",
@@ -9654,22 +9784,6 @@
"loose-envify": "^1.0.0"
}
},
- "node_modules/is-arguments": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz",
- "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==",
- "license": "MIT",
- "dependencies": {
- "call-bound": "^1.0.2",
- "has-tostringtag": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/is-array-buffer": {
"version": "3.0.5",
"resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
@@ -9864,13 +9978,14 @@
}
},
"node_modules/is-generator-function": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz",
- "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==",
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz",
+ "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==",
"license": "MIT",
"dependencies": {
- "call-bound": "^1.0.3",
- "get-proto": "^1.0.0",
+ "call-bound": "^1.0.4",
+ "generator-function": "^2.0.0",
+ "get-proto": "^1.0.1",
"has-tostringtag": "^1.0.2",
"safe-regex-test": "^1.1.0"
},
@@ -9906,22 +10021,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-nan": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz",
- "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==",
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.0",
- "define-properties": "^1.1.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/is-negative-zero": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
@@ -10166,9 +10265,9 @@
}
},
"node_modules/istanbul-lib-instrument/node_modules/semver": {
- "version": "7.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
- "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"dev": true,
"license": "ISC",
"bin": {
@@ -10209,9 +10308,9 @@
}
},
"node_modules/istanbul-reports": {
- "version": "3.1.7",
- "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz",
- "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==",
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz",
+ "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
@@ -10393,6 +10492,28 @@
}
}
},
+ "node_modules/jest-config/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/jest-diff": {
"version": "29.7.0",
"resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz",
@@ -10485,14 +10606,14 @@
}
},
"node_modules/jest-expo": {
- "version": "54.0.14",
- "resolved": "https://registry.npmjs.org/jest-expo/-/jest-expo-54.0.14.tgz",
- "integrity": "sha512-94EgBAfmP+TVbMzNaVh2c4vhrZe9isZJEUIONiVn6wK+DgI+UUbOr7BnlMFtd2M/5s0eawK3yC3SZurhCFXiyg==",
+ "version": "55.0.13",
+ "resolved": "https://registry.npmjs.org/jest-expo/-/jest-expo-55.0.13.tgz",
+ "integrity": "sha512-HMI2IDOsnoQnKbUNPPLuM+XDQ8QD+QUVP7ETeQWYeq87SUZWKYV+vMwwtRiZFawGnYEqYx0qj8iL0RzKXlFNWA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@expo/config": "~12.0.11",
- "@expo/json-file": "^10.0.8",
+ "@expo/config": "~55.0.12",
+ "@expo/json-file": "^10.0.13",
"@jest/create-cache-key-function": "^29.2.1",
"@jest/globals": "^29.2.1",
"babel-jest": "^29.2.1",
@@ -10502,7 +10623,7 @@
"jest-watch-typeahead": "2.2.1",
"json5": "^2.2.3",
"lodash": "^4.17.19",
- "react-test-renderer": "19.1.0",
+ "react-test-renderer": "19.2.0",
"server-only": "^0.0.1",
"stacktrace-js": "^2.0.2"
},
@@ -10512,7 +10633,7 @@
"peerDependencies": {
"expo": "*",
"react-native": "*",
- "react-server-dom-webpack": "~19.0.1 || ~19.1.2 || ~19.2.1"
+ "react-server-dom-webpack": "~19.0.4 || ~19.1.5 || ~19.2.4"
},
"peerDependenciesMeta": {
"react-server-dom-webpack": {
@@ -10520,34 +10641,20 @@
}
}
},
- "node_modules/jest-expo/node_modules/react-is": {
- "version": "19.1.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.1.1.tgz",
- "integrity": "sha512-tr41fA15Vn8p4X9ntI+yCyeGSf1TlYaY5vlTZfQmeLBrFo3psOPX6HhTDnFNL9uj3EhP0KAQ80cugCl4b4BERA==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/jest-expo/node_modules/react-test-renderer": {
- "version": "19.1.0",
- "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-19.1.0.tgz",
- "integrity": "sha512-jXkSl3CpvPYEF+p/eGDLB4sPoDX8pKkYvRl9+rR8HxLY0X04vW7hCm1/0zHoUSjPZ3bDa+wXWNTDVIw/R8aDVw==",
+ "version": "19.2.0",
+ "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-19.2.0.tgz",
+ "integrity": "sha512-zLCFMHFE9vy/w3AxO0zNxy6aAupnCuLSVOJYDe/Tp+ayGI1f2PLQsFVPANSD42gdSbmYx5oN+1VWDhcXtq7hAQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "react-is": "^19.1.0",
- "scheduler": "^0.26.0"
+ "react-is": "^19.2.0",
+ "scheduler": "^0.27.0"
},
"peerDependencies": {
- "react": "^19.1.0"
+ "react": "^19.2.0"
}
},
- "node_modules/jest-expo/node_modules/scheduler": {
- "version": "0.26.0",
- "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz",
- "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/jest-get-type": {
"version": "29.6.3",
"resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz",
@@ -10708,6 +10815,27 @@
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
+ "node_modules/jest-resolve/node_modules/resolve": {
+ "version": "1.22.11",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz",
+ "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-core-module": "^2.16.1",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/jest-runner": {
"version": "29.7.0",
"resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz",
@@ -10741,17 +10869,6 @@
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/jest-runner/node_modules/source-map-support": {
- "version": "0.5.13",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz",
- "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- }
- },
"node_modules/jest-runtime": {
"version": "29.7.0",
"resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz",
@@ -10786,6 +10903,28 @@
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
+ "node_modules/jest-runtime/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/jest-snapshot": {
"version": "29.7.0",
"resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz",
@@ -10819,9 +10958,9 @@
}
},
"node_modules/jest-snapshot/node_modules/semver": {
- "version": "7.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
- "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"dev": true,
"license": "ISC",
"bin": {
@@ -10849,9 +10988,9 @@
}
},
"node_modules/jest-util/node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
"license": "MIT",
"engines": {
"node": ">=8.6"
@@ -10951,9 +11090,9 @@
}
},
"node_modules/jest-watch-typeahead/node_modules/ansi-regex": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
- "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
+ "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -11004,13 +11143,13 @@
}
},
"node_modules/jest-watch-typeahead/node_modules/strip-ansi": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
- "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
+ "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
"dev": true,
"license": "MIT",
"dependencies": {
- "ansi-regex": "^6.0.1"
+ "ansi-regex": "^6.2.2"
},
"engines": {
"node": ">=12"
@@ -11082,22 +11221,21 @@
"license": "MIT"
},
"node_modules/js-yaml": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
+ "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
"license": "MIT",
"dependencies": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
+ "argparse": "^2.0.1"
},
"bin": {
"js-yaml": "bin/js-yaml.js"
}
},
"node_modules/jsbarcode": {
- "version": "3.12.1",
- "resolved": "https://registry.npmjs.org/jsbarcode/-/jsbarcode-3.12.1.tgz",
- "integrity": "sha512-QZQSqIknC2Rr/YOUyOkCBqsoiBAOTYK+7yNN3JsqfoUtJtkazxNw1dmPpxuv7VVvqW13kA3/mKiLq+s/e3o9hQ==",
+ "version": "3.12.3",
+ "resolved": "https://registry.npmjs.org/jsbarcode/-/jsbarcode-3.12.3.tgz",
+ "integrity": "sha512-CuHU9hC6dPsHF5oVFMo8NW76uQVjH4L22CsP4hW+dNnGywJHC/B0ThA1CTDVLnxKLrrpYdicBLnd2xsgTfRnvg==",
"license": "MIT"
},
"node_modules/jsc-safe-url": {
@@ -11152,6 +11290,32 @@
}
}
},
+ "node_modules/jsdom/node_modules/tough-cookie": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz",
+ "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "psl": "^1.1.33",
+ "punycode": "^2.1.1",
+ "universalify": "^0.2.0",
+ "url-parse": "^1.5.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jsdom/node_modules/universalify": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
+ "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
"node_modules/jsesc": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
@@ -11177,11 +11341,12 @@
"dev": true,
"license": "MIT"
},
- "node_modules/json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "license": "MIT"
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "license": "MIT",
+ "peer": true
},
"node_modules/json-stable-stringify": {
"version": "1.3.0",
@@ -11233,15 +11398,6 @@
"graceful-fs": "^4.1.6"
}
},
- "node_modules/jsonfile/node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
- "license": "MIT",
- "engines": {
- "node": ">= 10.0.0"
- }
- },
"node_modules/jsonify": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz",
@@ -11294,9 +11450,9 @@
}
},
"node_modules/lan-network": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/lan-network/-/lan-network-0.1.7.tgz",
- "integrity": "sha512-mnIlAEMu4OyEvUNdzco9xpuB9YVcPkQec+QsgycBCtPZvEqWPCDPfbAE4OJMdBBWpZWtpCn1xw9jJYlwjWI5zQ==",
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/lan-network/-/lan-network-0.2.0.tgz",
+ "integrity": "sha512-EZgbsXMrGS+oK+Ta12mCjzBFse+SIewGdwrSTr5g+MSymnjpox2x05ceI20PQejJOFvOgzcXrfDk/SdY7dSCtw==",
"license": "MIT",
"bin": {
"lan-network": "dist/lan-network-cli.js"
@@ -11351,9 +11507,9 @@
"license": "MIT"
},
"node_modules/lightningcss": {
- "version": "1.30.1",
- "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz",
- "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==",
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz",
+ "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==",
"license": "MPL-2.0",
"dependencies": {
"detect-libc": "^2.0.3"
@@ -11366,22 +11522,43 @@
"url": "https://opencollective.com/parcel"
},
"optionalDependencies": {
- "lightningcss-darwin-arm64": "1.30.1",
- "lightningcss-darwin-x64": "1.30.1",
- "lightningcss-freebsd-x64": "1.30.1",
- "lightningcss-linux-arm-gnueabihf": "1.30.1",
- "lightningcss-linux-arm64-gnu": "1.30.1",
- "lightningcss-linux-arm64-musl": "1.30.1",
- "lightningcss-linux-x64-gnu": "1.30.1",
- "lightningcss-linux-x64-musl": "1.30.1",
- "lightningcss-win32-arm64-msvc": "1.30.1",
- "lightningcss-win32-x64-msvc": "1.30.1"
+ "lightningcss-android-arm64": "1.32.0",
+ "lightningcss-darwin-arm64": "1.32.0",
+ "lightningcss-darwin-x64": "1.32.0",
+ "lightningcss-freebsd-x64": "1.32.0",
+ "lightningcss-linux-arm-gnueabihf": "1.32.0",
+ "lightningcss-linux-arm64-gnu": "1.32.0",
+ "lightningcss-linux-arm64-musl": "1.32.0",
+ "lightningcss-linux-x64-gnu": "1.32.0",
+ "lightningcss-linux-x64-musl": "1.32.0",
+ "lightningcss-win32-arm64-msvc": "1.32.0",
+ "lightningcss-win32-x64-msvc": "1.32.0"
+ }
+ },
+ "node_modules/lightningcss-android-arm64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz",
+ "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
}
},
"node_modules/lightningcss-darwin-arm64": {
- "version": "1.30.1",
- "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz",
- "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==",
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz",
+ "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==",
"cpu": [
"arm64"
],
@@ -11399,9 +11576,9 @@
}
},
"node_modules/lightningcss-darwin-x64": {
- "version": "1.30.1",
- "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz",
- "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==",
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz",
+ "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==",
"cpu": [
"x64"
],
@@ -11419,9 +11596,9 @@
}
},
"node_modules/lightningcss-freebsd-x64": {
- "version": "1.30.1",
- "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz",
- "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==",
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz",
+ "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==",
"cpu": [
"x64"
],
@@ -11439,9 +11616,9 @@
}
},
"node_modules/lightningcss-linux-arm-gnueabihf": {
- "version": "1.30.1",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz",
- "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==",
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz",
+ "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==",
"cpu": [
"arm"
],
@@ -11459,9 +11636,9 @@
}
},
"node_modules/lightningcss-linux-arm64-gnu": {
- "version": "1.30.1",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz",
- "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==",
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz",
+ "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==",
"cpu": [
"arm64"
],
@@ -11479,9 +11656,9 @@
}
},
"node_modules/lightningcss-linux-arm64-musl": {
- "version": "1.30.1",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz",
- "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==",
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz",
+ "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==",
"cpu": [
"arm64"
],
@@ -11499,9 +11676,9 @@
}
},
"node_modules/lightningcss-linux-x64-gnu": {
- "version": "1.30.1",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz",
- "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==",
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz",
+ "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==",
"cpu": [
"x64"
],
@@ -11519,9 +11696,9 @@
}
},
"node_modules/lightningcss-linux-x64-musl": {
- "version": "1.30.1",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz",
- "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==",
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz",
+ "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==",
"cpu": [
"x64"
],
@@ -11539,9 +11716,9 @@
}
},
"node_modules/lightningcss-win32-arm64-msvc": {
- "version": "1.30.1",
- "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz",
- "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==",
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz",
+ "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==",
"cpu": [
"arm64"
],
@@ -11559,9 +11736,9 @@
}
},
"node_modules/lightningcss-win32-x64-msvc": {
- "version": "1.30.1",
- "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz",
- "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==",
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz",
+ "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==",
"cpu": [
"x64"
],
@@ -11582,24 +11759,29 @@
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
"integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "dev": true,
"license": "MIT"
},
"node_modules/locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
- "p-locate": "^4.1.0"
+ "p-locate": "^5.0.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "version": "4.18.1",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz",
+ "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==",
"dev": true,
"license": "MIT"
},
@@ -11725,9 +11907,9 @@
}
},
"node_modules/lottie-react-native": {
- "version": "7.3.4",
- "resolved": "https://registry.npmjs.org/lottie-react-native/-/lottie-react-native-7.3.4.tgz",
- "integrity": "sha512-XUh7eGFb7ID8JRdU6U4N4cYQeYmjtdQRvd8ZXJ6xrdSsn5gZD0c79ITOREPcwJg4YupBFHgyV1GXdAHQP+KYUQ==",
+ "version": "7.3.6",
+ "resolved": "https://registry.npmjs.org/lottie-react-native/-/lottie-react-native-7.3.6.tgz",
+ "integrity": "sha512-TevFHRvFURh6GlaqLKrSNXuKAxvBvFCiXfS7FXQI1K/ikOStgAwWLFPGjW0i1qB2/VzPACKmRs+535VjHUZZZQ==",
"license": "Apache-2.0",
"peerDependencies": {
"@lottiefiles/dotlottie-react": "^0.13.5",
@@ -11790,9 +11972,9 @@
}
},
"node_modules/make-dir/node_modules/semver": {
- "version": "7.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
- "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"dev": true,
"license": "ISC",
"bin": {
@@ -11845,19 +12027,19 @@
"license": "MIT"
},
"node_modules/metro": {
- "version": "0.83.3",
- "resolved": "https://registry.npmjs.org/metro/-/metro-0.83.3.tgz",
- "integrity": "sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q==",
+ "version": "0.83.5",
+ "resolved": "https://registry.npmjs.org/metro/-/metro-0.83.5.tgz",
+ "integrity": "sha512-BgsXevY1MBac/3ZYv/RfNFf/4iuW9X7f4H8ZNkiH+r667HD9sVujxcmu4jvEzGCAm4/WyKdZCuyhAcyhTHOucQ==",
"license": "MIT",
"dependencies": {
- "@babel/code-frame": "^7.24.7",
+ "@babel/code-frame": "^7.29.0",
"@babel/core": "^7.25.2",
- "@babel/generator": "^7.25.0",
- "@babel/parser": "^7.25.3",
- "@babel/template": "^7.25.0",
- "@babel/traverse": "^7.25.3",
- "@babel/types": "^7.25.2",
- "accepts": "^1.3.7",
+ "@babel/generator": "^7.29.1",
+ "@babel/parser": "^7.29.0",
+ "@babel/template": "^7.28.6",
+ "@babel/traverse": "^7.29.0",
+ "@babel/types": "^7.29.0",
+ "accepts": "^2.0.0",
"chalk": "^4.0.0",
"ci-info": "^2.0.0",
"connect": "^3.6.5",
@@ -11865,25 +12047,25 @@
"error-stack-parser": "^2.0.6",
"flow-enums-runtime": "^0.0.6",
"graceful-fs": "^4.2.4",
- "hermes-parser": "0.32.0",
+ "hermes-parser": "0.33.3",
"image-size": "^1.0.2",
"invariant": "^2.2.4",
"jest-worker": "^29.7.0",
"jsc-safe-url": "^0.2.2",
"lodash.throttle": "^4.1.1",
- "metro-babel-transformer": "0.83.3",
- "metro-cache": "0.83.3",
- "metro-cache-key": "0.83.3",
- "metro-config": "0.83.3",
- "metro-core": "0.83.3",
- "metro-file-map": "0.83.3",
- "metro-resolver": "0.83.3",
- "metro-runtime": "0.83.3",
- "metro-source-map": "0.83.3",
- "metro-symbolicate": "0.83.3",
- "metro-transform-plugins": "0.83.3",
- "metro-transform-worker": "0.83.3",
- "mime-types": "^2.1.27",
+ "metro-babel-transformer": "0.83.5",
+ "metro-cache": "0.83.5",
+ "metro-cache-key": "0.83.5",
+ "metro-config": "0.83.5",
+ "metro-core": "0.83.5",
+ "metro-file-map": "0.83.5",
+ "metro-resolver": "0.83.5",
+ "metro-runtime": "0.83.5",
+ "metro-source-map": "0.83.5",
+ "metro-symbolicate": "0.83.5",
+ "metro-transform-plugins": "0.83.5",
+ "metro-transform-worker": "0.83.5",
+ "mime-types": "^3.0.1",
"nullthrows": "^1.1.1",
"serialize-error": "^2.1.0",
"source-map": "^0.5.6",
@@ -11899,14 +12081,14 @@
}
},
"node_modules/metro-babel-transformer": {
- "version": "0.83.3",
- "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.83.3.tgz",
- "integrity": "sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==",
+ "version": "0.83.5",
+ "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.83.5.tgz",
+ "integrity": "sha512-d9FfmgUEVejTiSb7bkQeLRGl6aeno2UpuPm3bo3rCYwxewj03ymvOn8s8vnS4fBqAPQ+cE9iQM40wh7nGXR+eA==",
"license": "MIT",
"dependencies": {
"@babel/core": "^7.25.2",
"flow-enums-runtime": "^0.0.6",
- "hermes-parser": "0.32.0",
+ "hermes-parser": "0.33.3",
"nullthrows": "^1.1.1"
},
"engines": {
@@ -11914,39 +12096,39 @@
}
},
"node_modules/metro-babel-transformer/node_modules/hermes-estree": {
- "version": "0.32.0",
- "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz",
- "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==",
+ "version": "0.33.3",
+ "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.33.3.tgz",
+ "integrity": "sha512-6kzYZHCk8Fy1Uc+t3HGYyJn3OL4aeqKLTyina4UFtWl8I0kSL7OmKThaiX+Uh2f8nGw3mo4Ifxg0M5Zk3/Oeqg==",
"license": "MIT"
},
"node_modules/metro-babel-transformer/node_modules/hermes-parser": {
- "version": "0.32.0",
- "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz",
- "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==",
+ "version": "0.33.3",
+ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.33.3.tgz",
+ "integrity": "sha512-Yg3HgaG4CqgyowtYjX/FsnPAuZdHOqSMtnbpylbptsQ9nwwSKsy6uRWcGO5RK0EqiX12q8HvDWKgeAVajRO5DA==",
"license": "MIT",
"dependencies": {
- "hermes-estree": "0.32.0"
+ "hermes-estree": "0.33.3"
}
},
"node_modules/metro-cache": {
- "version": "0.83.3",
- "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.83.3.tgz",
- "integrity": "sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q==",
+ "version": "0.83.5",
+ "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.83.5.tgz",
+ "integrity": "sha512-oH+s4U+IfZyg8J42bne2Skc90rcuESIYf86dYittcdWQtPfcaFXWpByPyTuWk3rR1Zz3Eh5HOrcVImfEhhJLng==",
"license": "MIT",
"dependencies": {
"exponential-backoff": "^3.1.1",
"flow-enums-runtime": "^0.0.6",
"https-proxy-agent": "^7.0.5",
- "metro-core": "0.83.3"
+ "metro-core": "0.83.5"
},
"engines": {
"node": ">=20.19.4"
}
},
"node_modules/metro-cache-key": {
- "version": "0.83.3",
- "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.83.3.tgz",
- "integrity": "sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw==",
+ "version": "0.83.5",
+ "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.83.5.tgz",
+ "integrity": "sha512-Ycl8PBajB7bhbAI7Rt0xEyiF8oJ0RWX8EKkolV1KfCUlC++V/GStMSGpPLwnnBZXZWkCC5edBPzv1Hz1Yi0Euw==",
"license": "MIT",
"dependencies": {
"flow-enums-runtime": "^0.0.6"
@@ -11978,42 +12160,57 @@
}
},
"node_modules/metro-config": {
- "version": "0.83.3",
- "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.83.3.tgz",
- "integrity": "sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA==",
+ "version": "0.83.5",
+ "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.83.5.tgz",
+ "integrity": "sha512-JQ/PAASXH7yczgV6OCUSRhZYME+NU8NYjI2RcaG5ga4QfQ3T/XdiLzpSb3awWZYlDCcQb36l4Vl7i0Zw7/Tf9w==",
"license": "MIT",
"dependencies": {
"connect": "^3.6.5",
"flow-enums-runtime": "^0.0.6",
"jest-validate": "^29.7.0",
- "metro": "0.83.3",
- "metro-cache": "0.83.3",
- "metro-core": "0.83.3",
- "metro-runtime": "0.83.3",
+ "metro": "0.83.5",
+ "metro-cache": "0.83.5",
+ "metro-core": "0.83.5",
+ "metro-runtime": "0.83.5",
"yaml": "^2.6.1"
},
"engines": {
"node": ">=20.19.4"
}
},
+ "node_modules/metro-config/node_modules/yaml": {
+ "version": "2.8.3",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz",
+ "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==",
+ "license": "ISC",
+ "bin": {
+ "yaml": "bin.mjs"
+ },
+ "engines": {
+ "node": ">= 14.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/eemeli"
+ }
+ },
"node_modules/metro-core": {
- "version": "0.83.3",
- "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.83.3.tgz",
- "integrity": "sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw==",
+ "version": "0.83.5",
+ "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.83.5.tgz",
+ "integrity": "sha512-YcVcLCrf0ed4mdLa82Qob0VxYqfhmlRxUS8+TO4gosZo/gLwSvtdeOjc/Vt0pe/lvMNrBap9LlmvZM8FIsMgJQ==",
"license": "MIT",
"dependencies": {
"flow-enums-runtime": "^0.0.6",
"lodash.throttle": "^4.1.1",
- "metro-resolver": "0.83.3"
+ "metro-resolver": "0.83.5"
},
"engines": {
"node": ">=20.19.4"
}
},
"node_modules/metro-file-map": {
- "version": "0.83.3",
- "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.83.3.tgz",
- "integrity": "sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA==",
+ "version": "0.83.5",
+ "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.83.5.tgz",
+ "integrity": "sha512-ZEt8s3a1cnYbn40nyCD+CsZdYSlwtFh2kFym4lo+uvfM+UMMH+r/BsrC6rbNClSrt+B7rU9T+Te/sh/NL8ZZKQ==",
"license": "MIT",
"dependencies": {
"debug": "^4.4.0",
@@ -12031,9 +12228,9 @@
}
},
"node_modules/metro-minify-terser": {
- "version": "0.83.3",
- "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.83.3.tgz",
- "integrity": "sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ==",
+ "version": "0.83.5",
+ "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.83.5.tgz",
+ "integrity": "sha512-Toe4Md1wS1PBqbvB0cFxBzKEVyyuYTUb0sgifAZh/mSvLH84qA1NAWik9sISWatzvfWf3rOGoUoO5E3f193a3Q==",
"license": "MIT",
"dependencies": {
"flow-enums-runtime": "^0.0.6",
@@ -12044,9 +12241,9 @@
}
},
"node_modules/metro-resolver": {
- "version": "0.83.3",
- "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.83.3.tgz",
- "integrity": "sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ==",
+ "version": "0.83.5",
+ "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.83.5.tgz",
+ "integrity": "sha512-7p3GtzVUpbAweJeCcUJihJeOQl1bDuimO5ueo1K0BUpUtR41q5EilbQ3klt16UTPPMpA+tISWBtsrqU556mY1A==",
"license": "MIT",
"dependencies": {
"flow-enums-runtime": "^0.0.6"
@@ -12056,9 +12253,9 @@
}
},
"node_modules/metro-runtime": {
- "version": "0.83.3",
- "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.83.3.tgz",
- "integrity": "sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw==",
+ "version": "0.83.5",
+ "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.83.5.tgz",
+ "integrity": "sha512-f+b3ue9AWTVlZe2Xrki6TAoFtKIqw30jwfk7GQ1rDUBQaE0ZQ+NkiMEtb9uwH7uAjJ87U7Tdx1Jg1OJqUfEVlA==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.25.0",
@@ -12069,19 +12266,18 @@
}
},
"node_modules/metro-source-map": {
- "version": "0.83.3",
- "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.83.3.tgz",
- "integrity": "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg==",
+ "version": "0.83.5",
+ "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.83.5.tgz",
+ "integrity": "sha512-VT9bb2KO2/4tWY9Z2yeZqTUao7CicKAOps9LUg2aQzsz+04QyuXL3qgf1cLUVRjA/D6G5u1RJAlN1w9VNHtODQ==",
"license": "MIT",
"dependencies": {
- "@babel/traverse": "^7.25.3",
- "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3",
- "@babel/types": "^7.25.2",
+ "@babel/traverse": "^7.29.0",
+ "@babel/types": "^7.29.0",
"flow-enums-runtime": "^0.0.6",
"invariant": "^2.2.4",
- "metro-symbolicate": "0.83.3",
+ "metro-symbolicate": "0.83.5",
"nullthrows": "^1.1.1",
- "ob1": "0.83.3",
+ "ob1": "0.83.5",
"source-map": "^0.5.6",
"vlq": "^1.0.0"
},
@@ -12099,14 +12295,14 @@
}
},
"node_modules/metro-symbolicate": {
- "version": "0.83.3",
- "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.83.3.tgz",
- "integrity": "sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw==",
+ "version": "0.83.5",
+ "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.83.5.tgz",
+ "integrity": "sha512-EMIkrjNRz/hF+p0RDdxoE60+dkaTLPN3vaaGkFmX5lvFdO6HPfHA/Ywznzkev+za0VhPQ5KSdz49/MALBRteHA==",
"license": "MIT",
"dependencies": {
"flow-enums-runtime": "^0.0.6",
"invariant": "^2.2.4",
- "metro-source-map": "0.83.3",
+ "metro-source-map": "0.83.5",
"nullthrows": "^1.1.1",
"source-map": "^0.5.6",
"vlq": "^1.0.0"
@@ -12128,15 +12324,15 @@
}
},
"node_modules/metro-transform-plugins": {
- "version": "0.83.3",
- "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.83.3.tgz",
- "integrity": "sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==",
+ "version": "0.83.5",
+ "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.83.5.tgz",
+ "integrity": "sha512-KxYKzZL+lt3Os5H2nx7YkbkWVduLZL5kPrE/Yq+Prm/DE1VLhpfnO6HtPs8vimYFKOa58ncl60GpoX0h7Wm0Vw==",
"license": "MIT",
"dependencies": {
"@babel/core": "^7.25.2",
- "@babel/generator": "^7.25.0",
- "@babel/template": "^7.25.0",
- "@babel/traverse": "^7.25.3",
+ "@babel/generator": "^7.29.1",
+ "@babel/template": "^7.28.6",
+ "@babel/traverse": "^7.29.0",
"flow-enums-runtime": "^0.0.6",
"nullthrows": "^1.1.1"
},
@@ -12145,23 +12341,23 @@
}
},
"node_modules/metro-transform-worker": {
- "version": "0.83.3",
- "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.83.3.tgz",
- "integrity": "sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==",
+ "version": "0.83.5",
+ "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.83.5.tgz",
+ "integrity": "sha512-8N4pjkNXc6ytlP9oAM6MwqkvUepNSW39LKYl9NjUMpRDazBQ7oBpQDc8Sz4aI8jnH6AGhF7s1m/ayxkN1t04yA==",
"license": "MIT",
"dependencies": {
"@babel/core": "^7.25.2",
- "@babel/generator": "^7.25.0",
- "@babel/parser": "^7.25.3",
- "@babel/types": "^7.25.2",
+ "@babel/generator": "^7.29.1",
+ "@babel/parser": "^7.29.0",
+ "@babel/types": "^7.29.0",
"flow-enums-runtime": "^0.0.6",
- "metro": "0.83.3",
- "metro-babel-transformer": "0.83.3",
- "metro-cache": "0.83.3",
- "metro-cache-key": "0.83.3",
- "metro-minify-terser": "0.83.3",
- "metro-source-map": "0.83.3",
- "metro-transform-plugins": "0.83.3",
+ "metro": "0.83.5",
+ "metro-babel-transformer": "0.83.5",
+ "metro-cache": "0.83.5",
+ "metro-cache-key": "0.83.5",
+ "metro-minify-terser": "0.83.5",
+ "metro-source-map": "0.83.5",
+ "metro-transform-plugins": "0.83.5",
"nullthrows": "^1.1.1"
},
"engines": {
@@ -12175,18 +12371,43 @@
"license": "MIT"
},
"node_modules/metro/node_modules/hermes-estree": {
- "version": "0.32.0",
- "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz",
- "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==",
+ "version": "0.33.3",
+ "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.33.3.tgz",
+ "integrity": "sha512-6kzYZHCk8Fy1Uc+t3HGYyJn3OL4aeqKLTyina4UFtWl8I0kSL7OmKThaiX+Uh2f8nGw3mo4Ifxg0M5Zk3/Oeqg==",
"license": "MIT"
},
"node_modules/metro/node_modules/hermes-parser": {
- "version": "0.32.0",
- "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz",
- "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==",
+ "version": "0.33.3",
+ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.33.3.tgz",
+ "integrity": "sha512-Yg3HgaG4CqgyowtYjX/FsnPAuZdHOqSMtnbpylbptsQ9nwwSKsy6uRWcGO5RK0EqiX12q8HvDWKgeAVajRO5DA==",
"license": "MIT",
"dependencies": {
- "hermes-estree": "0.32.0"
+ "hermes-estree": "0.33.3"
+ }
+ },
+ "node_modules/metro/node_modules/mime-db": {
+ "version": "1.54.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/metro/node_modules/mime-types": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz",
+ "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "^1.54.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
"node_modules/metro/node_modules/source-map": {
@@ -12233,9 +12454,9 @@
}
},
"node_modules/micromatch/node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
"license": "MIT",
"engines": {
"node": ">=8.6"
@@ -12297,9 +12518,9 @@
}
},
"node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
"license": "ISC",
"dependencies": {
"brace-expansion": "^1.1.7"
@@ -12318,26 +12539,14 @@
}
},
"node_modules/minipass": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
- "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
- "license": "ISC",
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz",
+ "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==",
+ "license": "BlueOak-1.0.0",
"engines": {
"node": ">=16 || 14 >=14.17"
}
},
- "node_modules/minizlib": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz",
- "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==",
- "license": "MIT",
- "dependencies": {
- "minipass": "^7.1.2"
- },
- "engines": {
- "node": ">= 18"
- }
- },
"node_modules/mkdirp": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
@@ -12356,16 +12565,11 @@
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"license": "MIT"
},
- "node_modules/mz": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
- "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
- "license": "MIT",
- "dependencies": {
- "any-promise": "^1.0.0",
- "object-assign": "^4.0.1",
- "thenify-all": "^1.0.0"
- }
+ "node_modules/multitars": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/multitars/-/multitars-0.2.4.tgz",
+ "integrity": "sha512-XgLbg1HHchFauMCQPRwMj6MSyDd5koPlTA1hM3rUFkeXzGpjU/I9fP3to7yrObE9jcN8ChIOQGrM0tV0kUZaKg==",
+ "license": "MIT"
},
"node_modules/nanoid": {
"version": "3.3.11",
@@ -12392,19 +12596,31 @@
"license": "MIT"
},
"node_modules/negotiator": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
- "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
+ "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
- "node_modules/nested-error-stacks": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz",
- "integrity": "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==",
- "license": "MIT"
+ "node_modules/node-exports-info": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz",
+ "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==",
+ "license": "MIT",
+ "dependencies": {
+ "array.prototype.flatmap": "^1.3.3",
+ "es-errors": "^1.3.0",
+ "object.entries": "^1.1.9",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
},
"node_modules/node-fetch": {
"version": "2.7.0",
@@ -12449,9 +12665,9 @@
}
},
"node_modules/node-forge": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.3.tgz",
- "integrity": "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==",
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.4.0.tgz",
+ "integrity": "sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ==",
"license": "(BSD-3-Clause OR GPL-2.0)",
"engines": {
"node": ">= 6.13.0"
@@ -12464,9 +12680,9 @@
"license": "MIT"
},
"node_modules/node-releases": {
- "version": "2.0.27",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz",
- "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==",
+ "version": "2.0.37",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.37.tgz",
+ "integrity": "sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==",
"license": "MIT"
},
"node_modules/normalize-path": {
@@ -12506,9 +12722,9 @@
}
},
"node_modules/npm-package-arg/node_modules/semver": {
- "version": "7.7.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
- "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@@ -12549,16 +12765,16 @@
"license": "MIT"
},
"node_modules/nwsapi": {
- "version": "2.2.20",
- "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.20.tgz",
- "integrity": "sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==",
+ "version": "2.2.23",
+ "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.23.tgz",
+ "integrity": "sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==",
"dev": true,
"license": "MIT"
},
"node_modules/ob1": {
- "version": "0.83.3",
- "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.83.3.tgz",
- "integrity": "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA==",
+ "version": "0.83.5",
+ "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.83.5.tgz",
+ "integrity": "sha512-vNKPYC8L5ycVANANpF/S+WZHpfnRWKx/F3AYP4QMn6ZJTh+l2HOrId0clNkEmua58NB9vmI9Qh7YOoV/4folYg==",
"license": "MIT",
"dependencies": {
"flow-enums-runtime": "^0.0.6"
@@ -12588,22 +12804,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/object-is": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz",
- "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==",
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.7",
- "define-properties": "^1.2.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/object-keys": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
@@ -12915,27 +13115,16 @@
}
},
"node_modules/p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
- "license": "MIT",
- "dependencies": {
- "p-limit": "^2.2.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/p-locate/node_modules/p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
- "p-try": "^2.0.0"
+ "p-limit": "^3.0.2"
},
"engines": {
- "node": ">=6"
+ "node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
@@ -13052,9 +13241,9 @@
}
},
"node_modules/patch-package/node_modules/semver": {
- "version": "7.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
- "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@@ -13072,6 +13261,21 @@
"node": ">=6"
}
},
+ "node_modules/patch-package/node_modules/yaml": {
+ "version": "2.8.3",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz",
+ "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==",
+ "license": "ISC",
+ "bin": {
+ "yaml": "bin.mjs"
+ },
+ "engines": {
+ "node": ">= 14.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/eemeli"
+ }
+ },
"node_modules/path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -13081,6 +13285,21 @@
"node": ">=8"
}
},
+ "node_modules/path-expression-matcher": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.2.1.tgz",
+ "integrity": "sha512-d7gQQmLvAKXKXE2GeP9apIGbMYKz88zWdsn/BN2HRWVQsDFdUY36WSLTY0Jvd4HWi7Fb30gQ62oAOzdgJA6fZw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
"node_modules/path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
@@ -13106,25 +13325,25 @@
"license": "MIT"
},
"node_modules/path-scurry": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz",
- "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz",
+ "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==",
"license": "BlueOak-1.0.0",
"dependencies": {
"lru-cache": "^11.0.0",
"minipass": "^7.1.2"
},
"engines": {
- "node": "20 || >=22"
+ "node": "18 || 20 || >=22"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/path-scurry/node_modules/lru-cache": {
- "version": "11.2.4",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz",
- "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==",
+ "version": "11.2.7",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz",
+ "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==",
"license": "BlueOak-1.0.0",
"engines": {
"node": "20 || >=22"
@@ -13142,6 +13361,15 @@
"pako": "^2.1.0"
}
},
+ "node_modules/pawnote/node_modules/@literate.ink/utilities": {
+ "version": "1.0.0-10641118381.1",
+ "resolved": "https://registry.npmjs.org/@literate.ink/utilities/-/utilities-1.0.0-10641118381.1.tgz",
+ "integrity": "sha512-omhzgwfAjNXqIjt6dmWbU8pm6QfEvNYetykEXYk+vVaJ8oICglvkChxkC6FkF8zJKMM/lFrNHgD42obQ8lwolQ==",
+ "license": "MIT",
+ "dependencies": {
+ "set-cookie-parser": "^2.7.0"
+ }
+ },
"node_modules/picocolors": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
@@ -13149,34 +13377,90 @@
"license": "ISC"
},
"node_modules/picomatch": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
- "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
+ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pirates": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz",
+ "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "find-up": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
"license": "MIT",
- "engines": {
- "node": ">=12"
+ "dependencies": {
+ "p-locate": "^4.1.0"
},
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/pirates": {
- "version": "4.0.7",
- "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz",
- "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==",
+ "node_modules/pkg-dir/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
"license": "MIT",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
"engines": {
- "node": ">= 6"
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/pkg-dir": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
- "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "node_modules/pkg-dir/node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "find-up": "^4.0.0"
+ "p-limit": "^2.2.0"
},
"engines": {
"node": ">=8"
@@ -13259,9 +13543,9 @@
}
},
"node_modules/prettier": {
- "version": "3.7.4",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.4.tgz",
- "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==",
+ "version": "3.8.1",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz",
+ "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==",
"dev": true,
"license": "MIT",
"bin": {
@@ -13275,9 +13559,9 @@
}
},
"node_modules/prettier-linter-helpers": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
- "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz",
+ "integrity": "sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -13287,18 +13571,6 @@
"node": ">=6.0.0"
}
},
- "node_modules/pretty-bytes": {
- "version": "5.6.0",
- "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
- "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/pretty-format": {
"version": "29.7.0",
"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
@@ -13325,6 +13597,12 @@
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
+ "node_modules/pretty-format/node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "license": "MIT"
+ },
"node_modules/proc-log": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz",
@@ -13402,9 +13680,9 @@
}
},
"node_modules/pump": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz",
- "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==",
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz",
+ "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==",
"license": "MIT",
"dependencies": {
"end-of-stream": "^1.1.0",
@@ -13447,12 +13725,12 @@
}
},
"node_modules/pvutils": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.3.tgz",
- "integrity": "sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==",
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz",
+ "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==",
"license": "MIT",
"engines": {
- "node": ">=6.0.0"
+ "node": ">=16.0.0"
}
},
"node_modules/qrcode": {
@@ -13472,14 +13750,6 @@
"node": ">=10.13.0"
}
},
- "node_modules/qrcode-terminal": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz",
- "integrity": "sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==",
- "bin": {
- "qrcode-terminal": "bin/qrcode-terminal.js"
- }
- },
"node_modules/qrcode/node_modules/cliui": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
@@ -13491,6 +13761,58 @@
"wrap-ansi": "^6.2.0"
}
},
+ "node_modules/qrcode/node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/qrcode/node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/qrcode/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/qrcode/node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/qrcode/node_modules/pngjs": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz",
@@ -13609,34 +13931,10 @@
"node": ">= 0.6"
}
},
- "node_modules/rc": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
- "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
- "license": "(BSD-2-Clause OR MIT OR Apache-2.0)",
- "dependencies": {
- "deep-extend": "^0.6.0",
- "ini": "~1.3.0",
- "minimist": "^1.2.0",
- "strip-json-comments": "~2.0.1"
- },
- "bin": {
- "rc": "cli.js"
- }
- },
- "node_modules/rc/node_modules/strip-json-comments": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
- "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/react": {
- "version": "19.1.0",
- "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz",
- "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==",
+ "version": "19.2.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz",
+ "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==",
"license": "MIT",
"engines": {
"node": ">=0.10.0"
@@ -13674,23 +13972,17 @@
}
},
"node_modules/react-dom": {
- "version": "19.1.0",
- "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz",
- "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==",
+ "version": "19.2.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz",
+ "integrity": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==",
"license": "MIT",
"dependencies": {
- "scheduler": "^0.26.0"
+ "scheduler": "^0.27.0"
},
"peerDependencies": {
- "react": "^19.1.0"
+ "react": "^19.2.0"
}
},
- "node_modules/react-dom/node_modules/scheduler": {
- "version": "0.26.0",
- "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz",
- "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==",
- "license": "MIT"
- },
"node_modules/react-fast-compare": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz",
@@ -13736,50 +14028,51 @@
}
},
"node_modules/react-is": {
- "version": "18.3.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
- "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "version": "19.2.4",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.4.tgz",
+ "integrity": "sha512-W+EWGn2v0ApPKgKKCy/7s7WHXkboGcsrXE+2joLyVxkbyVQfO3MUEaUQDHoSmb8TFFrSKYa9mw64WZHNHSDzYA==",
"license": "MIT"
},
"node_modules/react-native": {
- "version": "0.81.5",
- "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.81.5.tgz",
- "integrity": "sha512-1w+/oSjEXZjMqsIvmkCRsOc8UBYv163bTWKTI8+1mxztvQPhCRYGTvZ/PL1w16xXHneIj/SLGfxWg2GWN2uexw==",
+ "version": "0.83.4",
+ "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.83.4.tgz",
+ "integrity": "sha512-H5Wco3UJyY6zZsjoBayY8RM9uiAEQ3FeG4G2NAt+lr9DO43QeqPlVe9xxxYEukMkEmeIhNjR70F6bhXuWArOMQ==",
"license": "MIT",
"dependencies": {
"@jest/create-cache-key-function": "^29.7.0",
- "@react-native/assets-registry": "0.81.5",
- "@react-native/codegen": "0.81.5",
- "@react-native/community-cli-plugin": "0.81.5",
- "@react-native/gradle-plugin": "0.81.5",
- "@react-native/js-polyfills": "0.81.5",
- "@react-native/normalize-colors": "0.81.5",
- "@react-native/virtualized-lists": "0.81.5",
+ "@react-native/assets-registry": "0.83.4",
+ "@react-native/codegen": "0.83.4",
+ "@react-native/community-cli-plugin": "0.83.4",
+ "@react-native/gradle-plugin": "0.83.4",
+ "@react-native/js-polyfills": "0.83.4",
+ "@react-native/normalize-colors": "0.83.4",
+ "@react-native/virtualized-lists": "0.83.4",
"abort-controller": "^3.0.0",
"anser": "^1.4.9",
"ansi-regex": "^5.0.0",
"babel-jest": "^29.7.0",
- "babel-plugin-syntax-hermes-parser": "0.29.1",
+ "babel-plugin-syntax-hermes-parser": "0.32.0",
"base64-js": "^1.5.1",
"commander": "^12.0.0",
"flow-enums-runtime": "^0.0.6",
"glob": "^7.1.1",
+ "hermes-compiler": "0.14.1",
"invariant": "^2.2.4",
"jest-environment-node": "^29.7.0",
"memoize-one": "^5.0.0",
- "metro-runtime": "^0.83.1",
- "metro-source-map": "^0.83.1",
+ "metro-runtime": "^0.83.3",
+ "metro-source-map": "^0.83.3",
"nullthrows": "^1.1.1",
"pretty-format": "^29.7.0",
"promise": "^8.3.0",
"react-devtools-core": "^6.1.5",
"react-refresh": "^0.14.0",
"regenerator-runtime": "^0.13.2",
- "scheduler": "0.26.0",
+ "scheduler": "0.27.0",
"semver": "^7.1.3",
"stacktrace-parser": "^0.1.10",
"whatwg-fetch": "^3.0.0",
- "ws": "^6.2.3",
+ "ws": "^7.5.10",
"yargs": "^17.6.2"
},
"bin": {
@@ -13789,8 +14082,8 @@
"node": ">= 20.19.4"
},
"peerDependencies": {
- "@types/react": "^19.1.0",
- "react": "^19.1.0"
+ "@types/react": "^19.1.1",
+ "react": "^19.2.0"
},
"peerDependenciesMeta": {
"@types/react": {
@@ -13799,9 +14092,9 @@
}
},
"node_modules/react-native-bottom-tabs": {
- "version": "0.11.2",
- "resolved": "https://registry.npmjs.org/react-native-bottom-tabs/-/react-native-bottom-tabs-0.11.2.tgz",
- "integrity": "sha512-2zvR9DgQgqOKhxGeETkphXANDkMyUKN/i0+M+WF52JQd4q4h+uY3ctLnXNQ4pZf1cEDlWQ6aBtYWe3NJKvDIwA==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/react-native-bottom-tabs/-/react-native-bottom-tabs-1.1.0.tgz",
+ "integrity": "sha512-Uu1gvM3i1Hb4DjVvR/38J1QVQEs0RkPc7K6yon99HgvRWWOyLs7kjPDhUswtb8ije4pKW712skIXWJ0lgKzbyQ==",
"license": "MIT",
"dependencies": {
"react-freeze": "^1.0.0",
@@ -13813,6 +14106,22 @@
"react-native": "*"
}
},
+ "node_modules/react-native-dynamic-theme": {
+ "version": "0.3.4",
+ "resolved": "https://registry.npmjs.org/react-native-dynamic-theme/-/react-native-dynamic-theme-0.3.4.tgz",
+ "integrity": "sha512-xiEPHYTTJjdk9sSgAWDWNkWAjgJD0ETtmyT42G5kANNEn/X8cqTWAliyecIEDmHWZik94XruL8IGA1luQPTRUg==",
+ "license": "MIT",
+ "workspaces": [
+ "example"
+ ],
+ "dependencies": {
+ "@material/material-color-utilities": "^0.3.0"
+ },
+ "peerDependencies": {
+ "react": "*",
+ "react-native": "*"
+ }
+ },
"node_modules/react-native-edge-to-edge": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/react-native-edge-to-edge/-/react-native-edge-to-edge-1.6.0.tgz",
@@ -13837,9 +14146,9 @@
}
},
"node_modules/react-native-gesture-handler": {
- "version": "2.28.0",
- "resolved": "https://registry.npmjs.org/react-native-gesture-handler/-/react-native-gesture-handler-2.28.0.tgz",
- "integrity": "sha512-0msfJ1vRxXKVgTgvL+1ZOoYw3/0z1R+Ked0+udoJhyplC2jbVKIJ8Z1bzWdpQRCV3QcQ87Op0zJVE5DhKK2A0A==",
+ "version": "2.30.1",
+ "resolved": "https://registry.npmjs.org/react-native-gesture-handler/-/react-native-gesture-handler-2.30.1.tgz",
+ "integrity": "sha512-xIUBDo5ktmJs++0fZlavQNvDEE4PsihWhSeJsJtoz4Q6p0MiTM9TgrTgfEgzRR36qGPytFoeq+ShLrVwGdpUdA==",
"license": "MIT",
"dependencies": {
"@egjs/hammerjs": "^2.0.17",
@@ -13882,9 +14191,9 @@
"license": "BSD-2-Clause"
},
"node_modules/react-native-is-edge-to-edge": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/react-native-is-edge-to-edge/-/react-native-is-edge-to-edge-1.2.1.tgz",
- "integrity": "sha512-FLbPWl/MyYQWz+KwqOZsSyj2JmLKglHatd3xLZWskXOpRaio4LfEDEz8E/A6uD8QoTHW6Aobw1jbEwK7KMgR7Q==",
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/react-native-is-edge-to-edge/-/react-native-is-edge-to-edge-1.3.1.tgz",
+ "integrity": "sha512-NIXU/iT5+ORyCc7p0z2nnlkouYKX425vuU1OEm6bMMtWWR9yvb+Xg5AZmImTKoF9abxCPqrKC3rOZsKzUYgYZA==",
"license": "MIT",
"peerDependencies": {
"react": "*",
@@ -13893,7 +14202,9 @@
},
"node_modules/react-native-linear-gradient": {
"version": "2.8.3",
+ "resolved": "https://registry.npmjs.org/react-native-linear-gradient/-/react-native-linear-gradient-2.8.3.tgz",
"integrity": "sha512-KflAXZcEg54PXkLyflaSZQ3PJp4uC4whM7nT/Uot9m0e/qxFV3p6uor1983D1YOBJbJN7rrWdqIjq0T42jOJyA==",
+ "license": "MIT",
"peerDependencies": {
"react": "*",
"react-native": "*"
@@ -13926,25 +14237,34 @@
}
},
"node_modules/react-native-reanimated": {
- "version": "4.1.6",
- "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-4.1.6.tgz",
- "integrity": "sha512-F+ZJBYiok/6Jzp1re75F/9aLzkgoQCOh4yxrnwATa8392RvM3kx+fiXXFvwcgE59v48lMwd9q0nzF1oJLXpfxQ==",
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-4.2.1.tgz",
+ "integrity": "sha512-/NcHnZMyOvsD/wYXug/YqSKw90P9edN0kEPL5lP4PFf1aQ4F1V7MKe/E0tvfkXKIajy3Qocp5EiEnlcrK/+BZg==",
"license": "MIT",
"dependencies": {
- "react-native-is-edge-to-edge": "^1.2.1",
- "semver": "7.7.2"
+ "react-native-is-edge-to-edge": "1.2.1",
+ "semver": "7.7.3"
},
"peerDependencies": {
- "@babel/core": "^7.0.0-0",
"react": "*",
"react-native": "*",
- "react-native-worklets": ">=0.5.0"
+ "react-native-worklets": ">=0.7.0"
+ }
+ },
+ "node_modules/react-native-reanimated/node_modules/react-native-is-edge-to-edge": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/react-native-is-edge-to-edge/-/react-native-is-edge-to-edge-1.2.1.tgz",
+ "integrity": "sha512-FLbPWl/MyYQWz+KwqOZsSyj2JmLKglHatd3xLZWskXOpRaio4LfEDEz8E/A6uD8QoTHW6Aobw1jbEwK7KMgR7Q==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "*",
+ "react-native": "*"
}
},
"node_modules/react-native-reanimated/node_modules/semver": {
- "version": "7.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
- "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
+ "version": "7.7.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
+ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@@ -13983,109 +14303,194 @@
}
},
"node_modules/react-native-screens": {
- "version": "4.16.0",
- "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-4.16.0.tgz",
- "integrity": "sha512-yIAyh7F/9uWkOzCi1/2FqvNvK6Wb9Y1+Kzn16SuGfN9YFJDTbwlzGRvePCNTOX0recpLQF3kc2FmvMUhyTCH1Q==",
+ "version": "4.23.0",
+ "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-4.23.0.tgz",
+ "integrity": "sha512-XhO3aK0UeLpBn4kLecd+J+EDeRRJlI/Ro9Fze06vo1q163VeYtzfU9QS09/VyDFMWR1qxDC1iazCArTPSFFiPw==",
"license": "MIT",
"dependencies": {
"react-freeze": "^1.0.0",
- "react-native-is-edge-to-edge": "^1.2.1",
"warn-once": "^0.1.0"
},
"peerDependencies": {
- "react": "*",
- "react-native": "*"
+ "react": "*",
+ "react-native": "*"
+ }
+ },
+ "node_modules/react-native-svg": {
+ "version": "15.15.3",
+ "resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-15.15.3.tgz",
+ "integrity": "sha512-/k4KYwPBLGcx2f5d4FjE+vCScK7QOX14cl2lIASJ28u4slHHtIhL0SZKU7u9qmRBHxTCKPoPBtN6haT1NENJNA==",
+ "license": "MIT",
+ "dependencies": {
+ "css-select": "^5.1.0",
+ "css-tree": "^1.1.3",
+ "warn-once": "0.1.1"
+ },
+ "peerDependencies": {
+ "react": "*",
+ "react-native": "*"
+ }
+ },
+ "node_modules/react-native-web": {
+ "version": "0.21.2",
+ "resolved": "https://registry.npmjs.org/react-native-web/-/react-native-web-0.21.2.tgz",
+ "integrity": "sha512-SO2t9/17zM4iEnFvlu2DA9jqNbzNhoUP+AItkoCOyFmDMOhUnBBznBDCYN92fGdfAkfQlWzPoez6+zLxFNsZEg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.18.6",
+ "@react-native/normalize-colors": "^0.74.1",
+ "fbjs": "^3.0.4",
+ "inline-style-prefixer": "^7.0.1",
+ "memoize-one": "^6.0.0",
+ "nullthrows": "^1.1.1",
+ "postcss-value-parser": "^4.2.0",
+ "styleq": "^0.1.3"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/react-native-web/node_modules/@react-native/normalize-colors": {
+ "version": "0.74.89",
+ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.74.89.tgz",
+ "integrity": "sha512-qoMMXddVKVhZ8PA1AbUCk83trpd6N+1nF2A6k1i6LsQObyS92fELuk8kU/lQs6M7BsMHwqyLCpQJ1uFgNvIQXg==",
+ "license": "MIT"
+ },
+ "node_modules/react-native-web/node_modules/memoize-one": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz",
+ "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==",
+ "license": "MIT"
+ },
+ "node_modules/react-native-webview": {
+ "version": "13.16.0",
+ "resolved": "https://registry.npmjs.org/react-native-webview/-/react-native-webview-13.16.0.tgz",
+ "integrity": "sha512-Nh13xKZWW35C0dbOskD7OX01nQQavOzHbCw9XoZmar4eXCo7AvrYJ0jlUfRVVIJzqINxHlpECYLdmAdFsl9xDA==",
+ "license": "MIT",
+ "dependencies": {
+ "escape-string-regexp": "^4.0.0",
+ "invariant": "2.2.4"
+ },
+ "peerDependencies": {
+ "react": "*",
+ "react-native": "*"
+ }
+ },
+ "node_modules/react-native-worklets": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/react-native-worklets/-/react-native-worklets-0.7.2.tgz",
+ "integrity": "sha512-DuLu1kMV/Uyl9pQHp3hehAlThoLw7Yk2FwRTpzASOmI+cd4845FWn3m2bk9MnjUw8FBRIyhwLqYm2AJaXDXsog==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/plugin-transform-arrow-functions": "7.27.1",
+ "@babel/plugin-transform-class-properties": "7.27.1",
+ "@babel/plugin-transform-classes": "7.28.4",
+ "@babel/plugin-transform-nullish-coalescing-operator": "7.27.1",
+ "@babel/plugin-transform-optional-chaining": "7.27.1",
+ "@babel/plugin-transform-shorthand-properties": "7.27.1",
+ "@babel/plugin-transform-template-literals": "7.27.1",
+ "@babel/plugin-transform-unicode-regex": "7.27.1",
+ "@babel/preset-typescript": "7.27.1",
+ "convert-source-map": "2.0.0",
+ "semver": "7.7.3"
+ },
+ "peerDependencies": {
+ "@babel/core": "*",
+ "react": "*",
+ "react-native": "*"
+ }
+ },
+ "node_modules/react-native-worklets/node_modules/@babel/plugin-transform-class-properties": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz",
+ "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/react-native-worklets/node_modules/@babel/plugin-transform-classes": {
+ "version": "7.28.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz",
+ "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.3",
+ "@babel/helper-compilation-targets": "^7.27.2",
+ "@babel/helper-globals": "^7.28.0",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-replace-supers": "^7.27.1",
+ "@babel/traverse": "^7.28.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/react-native-svg": {
- "version": "15.12.1",
- "resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-15.12.1.tgz",
- "integrity": "sha512-vCuZJDf8a5aNC2dlMovEv4Z0jjEUET53lm/iILFnFewa15b4atjVxU6Wirm6O9y6dEsdjDZVD7Q3QM4T1wlI8g==",
+ "node_modules/react-native-worklets/node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz",
+ "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==",
"license": "MIT",
"dependencies": {
- "css-select": "^5.1.0",
- "css-tree": "^1.1.3",
- "warn-once": "0.1.1"
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
},
"peerDependencies": {
- "react": "*",
- "react-native": "*"
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/react-native-web": {
- "version": "0.21.2",
- "resolved": "https://registry.npmjs.org/react-native-web/-/react-native-web-0.21.2.tgz",
- "integrity": "sha512-SO2t9/17zM4iEnFvlu2DA9jqNbzNhoUP+AItkoCOyFmDMOhUnBBznBDCYN92fGdfAkfQlWzPoez6+zLxFNsZEg==",
+ "node_modules/react-native-worklets/node_modules/@babel/plugin-transform-optional-chaining": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz",
+ "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==",
"license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.18.6",
- "@react-native/normalize-colors": "^0.74.1",
- "fbjs": "^3.0.4",
- "inline-style-prefixer": "^7.0.1",
- "memoize-one": "^6.0.0",
- "nullthrows": "^1.1.1",
- "postcss-value-parser": "^4.2.0",
- "styleq": "^0.1.3"
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
},
"peerDependencies": {
- "react": "^18.0.0 || ^19.0.0",
- "react-dom": "^18.0.0 || ^19.0.0"
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/react-native-web/node_modules/@react-native/normalize-colors": {
- "version": "0.74.89",
- "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.74.89.tgz",
- "integrity": "sha512-qoMMXddVKVhZ8PA1AbUCk83trpd6N+1nF2A6k1i6LsQObyS92fELuk8kU/lQs6M7BsMHwqyLCpQJ1uFgNvIQXg==",
- "license": "MIT"
- },
- "node_modules/react-native-web/node_modules/memoize-one": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz",
- "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==",
- "license": "MIT"
- },
- "node_modules/react-native-webview": {
- "version": "13.15.0",
- "resolved": "https://registry.npmjs.org/react-native-webview/-/react-native-webview-13.15.0.tgz",
- "integrity": "sha512-Vzjgy8mmxa/JO6l5KZrsTC7YemSdq+qB01diA0FqjUTaWGAGwuykpJ73MDj3+mzBSlaDxAEugHzTtkUQkQEQeQ==",
+ "node_modules/react-native-worklets/node_modules/@babel/preset-typescript": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz",
+ "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==",
"license": "MIT",
"dependencies": {
- "escape-string-regexp": "^4.0.0",
- "invariant": "2.2.4"
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-validator-option": "^7.27.1",
+ "@babel/plugin-syntax-jsx": "^7.27.1",
+ "@babel/plugin-transform-modules-commonjs": "^7.27.1",
+ "@babel/plugin-transform-typescript": "^7.27.1"
},
- "peerDependencies": {
- "react": "*",
- "react-native": "*"
- }
- },
- "node_modules/react-native-worklets": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/react-native-worklets/-/react-native-worklets-0.5.1.tgz",
- "integrity": "sha512-lJG6Uk9YuojjEX/tQrCbcbmpdLCSFxDK1rJlkDhgqkVi1KZzG7cdcBFQRqyNOOzR9Y0CXNuldmtWTGOyM0k0+w==",
- "license": "MIT",
- "dependencies": {
- "@babel/plugin-transform-arrow-functions": "^7.0.0-0",
- "@babel/plugin-transform-class-properties": "^7.0.0-0",
- "@babel/plugin-transform-classes": "^7.0.0-0",
- "@babel/plugin-transform-nullish-coalescing-operator": "^7.0.0-0",
- "@babel/plugin-transform-optional-chaining": "^7.0.0-0",
- "@babel/plugin-transform-shorthand-properties": "^7.0.0-0",
- "@babel/plugin-transform-template-literals": "^7.0.0-0",
- "@babel/plugin-transform-unicode-regex": "^7.0.0-0",
- "@babel/preset-typescript": "^7.16.7",
- "convert-source-map": "^2.0.0",
- "semver": "7.7.2"
+ "engines": {
+ "node": ">=6.9.0"
},
"peerDependencies": {
- "@babel/core": "^7.0.0-0",
- "react": "*",
- "react-native": "*"
+ "@babel/core": "^7.0.0-0"
}
},
"node_modules/react-native-worklets/node_modules/semver": {
- "version": "7.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
- "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
+ "version": "7.7.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
+ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@@ -14095,9 +14500,9 @@
}
},
"node_modules/react-native/node_modules/@react-native/virtualized-lists": {
- "version": "0.81.5",
- "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.81.5.tgz",
- "integrity": "sha512-UVXgV/db25OPIvwZySeToXD/9sKKhOdkcWmmf4Jh8iBZuyfML+/5CasaZ1E7Lqg6g3uqVQq75NqIwkYmORJMPw==",
+ "version": "0.83.4",
+ "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.83.4.tgz",
+ "integrity": "sha512-vNF/8kokMW8JEjG4n+j7veLTjHRRABlt4CaTS6+wtqzvWxCJHNIC8fhCqrDPn9fIn8sNePd8DyiFVX5L9TBBRA==",
"license": "MIT",
"dependencies": {
"invariant": "^2.2.4",
@@ -14107,7 +14512,7 @@
"node": ">= 20.19.4"
},
"peerDependencies": {
- "@types/react": "^19.1.0",
+ "@types/react": "^19.2.0",
"react": "*",
"react-native": "*"
},
@@ -14117,16 +14522,64 @@
}
}
},
- "node_modules/react-native/node_modules/scheduler": {
- "version": "0.26.0",
- "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz",
- "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==",
+ "node_modules/react-native/node_modules/babel-plugin-syntax-hermes-parser": {
+ "version": "0.32.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz",
+ "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==",
+ "license": "MIT",
+ "dependencies": {
+ "hermes-parser": "0.32.0"
+ }
+ },
+ "node_modules/react-native/node_modules/commander": {
+ "version": "12.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz",
+ "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/react-native/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/react-native/node_modules/hermes-estree": {
+ "version": "0.32.0",
+ "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz",
+ "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==",
"license": "MIT"
},
+ "node_modules/react-native/node_modules/hermes-parser": {
+ "version": "0.32.0",
+ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz",
+ "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==",
+ "license": "MIT",
+ "dependencies": {
+ "hermes-estree": "0.32.0"
+ }
+ },
"node_modules/react-native/node_modules/semver": {
- "version": "7.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
- "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@@ -14136,12 +14589,24 @@
}
},
"node_modules/react-native/node_modules/ws": {
- "version": "6.2.3",
- "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz",
- "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==",
+ "version": "7.5.10",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz",
+ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==",
"license": "MIT",
- "dependencies": {
- "async-limiter": "~1.0.0"
+ "engines": {
+ "node": ">=8.3.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": "^5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
}
},
"node_modules/react-reconciler": {
@@ -14159,6 +14624,12 @@
"react": "^19.0.0"
}
},
+ "node_modules/react-reconciler/node_modules/scheduler": {
+ "version": "0.25.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz",
+ "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==",
+ "license": "MIT"
+ },
"node_modules/react-refresh": {
"version": "0.14.2",
"resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz",
@@ -14169,9 +14640,9 @@
}
},
"node_modules/react-remove-scroll": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.1.tgz",
- "integrity": "sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==",
+ "version": "2.7.2",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz",
+ "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==",
"license": "MIT",
"dependencies": {
"react-remove-scroll-bar": "^2.3.7",
@@ -14251,10 +14722,10 @@
"react": "^19.0.0"
}
},
- "node_modules/react-test-renderer/node_modules/react-is": {
- "version": "19.1.0",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.1.0.tgz",
- "integrity": "sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==",
+ "node_modules/react-test-renderer/node_modules/scheduler": {
+ "version": "0.25.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz",
+ "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==",
"dev": true,
"license": "MIT"
},
@@ -14279,12 +14750,6 @@
"integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
"license": "MIT"
},
- "node_modules/readable-stream/node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "license": "MIT"
- },
"node_modules/reflect.getprototypeof": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz",
@@ -14314,9 +14779,9 @@
"license": "MIT"
},
"node_modules/regenerate-unicode-properties": {
- "version": "10.2.0",
- "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz",
- "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==",
+ "version": "10.2.2",
+ "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz",
+ "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==",
"license": "MIT",
"dependencies": {
"regenerate": "^1.4.2"
@@ -14352,17 +14817,17 @@
}
},
"node_modules/regexpu-core": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz",
- "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==",
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz",
+ "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==",
"license": "MIT",
"dependencies": {
"regenerate": "^1.4.2",
- "regenerate-unicode-properties": "^10.2.0",
+ "regenerate-unicode-properties": "^10.2.2",
"regjsgen": "^0.8.0",
- "regjsparser": "^0.12.0",
+ "regjsparser": "^0.13.0",
"unicode-match-property-ecmascript": "^2.0.0",
- "unicode-match-property-value-ecmascript": "^2.1.0"
+ "unicode-match-property-value-ecmascript": "^2.2.1"
},
"engines": {
"node": ">=4"
@@ -14375,29 +14840,17 @@
"license": "MIT"
},
"node_modules/regjsparser": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz",
- "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==",
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.1.tgz",
+ "integrity": "sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw==",
"license": "BSD-2-Clause",
"dependencies": {
- "jsesc": "~3.0.2"
+ "jsesc": "~3.1.0"
},
"bin": {
"regjsparser": "bin/parser"
}
},
- "node_modules/regjsparser/node_modules/jsesc": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
- "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
- "license": "MIT",
- "bin": {
- "jsesc": "bin/jsesc"
- },
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@@ -14407,43 +14860,12 @@
"node": ">=0.10.0"
}
},
- "node_modules/require-from-string": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
- "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/require-main-filename": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
"integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
"license": "ISC"
},
- "node_modules/requireg": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz",
- "integrity": "sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==",
- "dependencies": {
- "nested-error-stacks": "~2.0.1",
- "rc": "~1.2.7",
- "resolve": "~1.7.1"
- },
- "engines": {
- "node": ">= 4.0.0"
- }
- },
- "node_modules/requireg/node_modules/resolve": {
- "version": "1.7.1",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz",
- "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==",
- "license": "MIT",
- "dependencies": {
- "path-parse": "^1.0.5"
- }
- },
"node_modules/requires-port": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
@@ -14451,12 +14873,15 @@
"license": "MIT"
},
"node_modules/resolve": {
- "version": "1.22.11",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz",
- "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==",
+ "version": "2.0.0-next.6",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.6.tgz",
+ "integrity": "sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==",
"license": "MIT",
"dependencies": {
+ "es-errors": "^1.3.0",
"is-core-module": "^2.16.1",
+ "node-exports-info": "^1.6.0",
+ "object-keys": "^1.1.1",
"path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
},
@@ -14498,28 +14923,17 @@
"node": ">=8"
}
},
- "node_modules/resolve-global": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz",
- "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==",
- "license": "MIT",
- "dependencies": {
- "global-dirs": "^0.1.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/resolve-workspace-root": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/resolve-workspace-root/-/resolve-workspace-root-2.0.0.tgz",
- "integrity": "sha512-IsaBUZETJD5WsI11Wt8PKHwaIe45or6pwNc8yflvLJ4DWtImK9kuLoH5kUva/2Mmx/RdIyr4aONNSa2v9LTJsw==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/resolve-workspace-root/-/resolve-workspace-root-2.0.1.tgz",
+ "integrity": "sha512-nR23LHAvaI6aHtMg6RWoaHpdR4D881Nydkzi2CixINyg9T00KgaJdJI6Vwty+Ps8WLxZHuxsS0BseWjxSA4C+w==",
"license": "MIT"
},
"node_modules/resolve.exports": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz",
"integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
@@ -14587,6 +15001,27 @@
"url": "https://github.com/sponsors/isaacs"
}
},
+ "node_modules/rimraf/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/rtl-detect": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.1.2.tgz",
@@ -14622,23 +15057,9 @@
}
},
"node_modules/safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
"license": "MIT"
},
"node_modules/safe-push-apply": {
@@ -14682,10 +15103,13 @@
"license": "MIT"
},
"node_modules/sax": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.3.tgz",
- "integrity": "sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==",
- "license": "BlueOak-1.0.0"
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz",
+ "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==",
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=11.0.0"
+ }
},
"node_modules/saxes": {
"version": "6.0.0",
@@ -14700,10 +15124,10 @@
"node": ">=v12.22.7"
}
},
- "node_modules/scheduler": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz",
- "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==",
+ "node_modules/scheduler": {
+ "version": "0.27.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
+ "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
"license": "MIT"
},
"node_modules/semver": {
@@ -14830,9 +15254,9 @@
"license": "ISC"
},
"node_modules/set-cookie-parser": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz",
- "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==",
+ "version": "2.7.2",
+ "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz",
+ "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==",
"license": "MIT"
},
"node_modules/set-function-length": {
@@ -14894,9 +15318,9 @@
"license": "ISC"
},
"node_modules/sf-symbols-typescript": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/sf-symbols-typescript/-/sf-symbols-typescript-2.1.0.tgz",
- "integrity": "sha512-ezT7gu/SHTPIOEEoG6TF+O0m5eewl0ZDAO4AtdBi5HjsrUI6JdCG17+Q8+aKp0heM06wZKApRCn5olNbs0Wb/A==",
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/sf-symbols-typescript/-/sf-symbols-typescript-2.2.0.tgz",
+ "integrity": "sha512-TPbeg0b7ylrswdGCji8FRGFAKuqbpQlLbL8SOle3j1iHSs5Ob5mhvMAxWN2UItOjgALAB5Zp3fmMfj8mbWvXKw==",
"license": "MIT",
"engines": {
"node": ">=10"
@@ -15030,31 +15454,19 @@
"plist": "^3.0.5"
}
},
- "node_modules/simple-plist/node_modules/bplist-parser": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz",
- "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==",
- "license": "MIT",
- "dependencies": {
- "big-integer": "1.6.x"
- },
- "engines": {
- "node": ">= 5.10.0"
- }
- },
"node_modules/simple-swizzle": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
- "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz",
+ "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==",
"license": "MIT",
"dependencies": {
"is-arrayish": "^0.3.1"
}
},
"node_modules/simple-swizzle/node_modules/is-arrayish": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
- "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
+ "version": "0.3.4",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz",
+ "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==",
"license": "MIT"
},
"node_modules/sisteransi": {
@@ -15077,6 +15489,27 @@
"node": ">=18"
}
},
+ "node_modules/skolengojs/node_modules/@noble/hashes": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz",
+ "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==",
+ "license": "MIT",
+ "engines": {
+ "node": "^14.21.3 || >=16"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/skolengojs/node_modules/@scure/base": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz",
+ "integrity": "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
"node_modules/slash": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
@@ -15087,9 +15520,9 @@
}
},
"node_modules/slugify": {
- "version": "1.6.6",
- "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz",
- "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==",
+ "version": "1.6.9",
+ "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.9.tgz",
+ "integrity": "sha512-vZ7rfeehZui7wQs438JXBckYLkIIdfHOXsaVEUMyS5fHo1483l1bMdo0EDSWYclY0yZKFOipDy4KHuKs6ssvdg==",
"license": "MIT",
"engines": {
"node": ">=8.0.0"
@@ -15114,9 +15547,10 @@
}
},
"node_modules/source-map-support": {
- "version": "0.5.21",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
- "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "version": "0.5.13",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz",
+ "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"buffer-from": "^1.0.0",
@@ -15284,12 +15718,6 @@
"safe-buffer": "~5.1.0"
}
},
- "node_modules/string_decoder/node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "license": "MIT"
- },
"node_modules/string-length": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
@@ -15456,9 +15884,9 @@
}
},
"node_modules/strnum": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz",
- "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==",
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.2.tgz",
+ "integrity": "sha512-DnR90I+jtXNSTXWdwrEy9FakW7UX+qUZg28gj5fk2vxxl7uS/3bpI4fjFYVmdK9etptYBPNkpahuQnEwhwECqA==",
"funding": [
{
"type": "github",
@@ -15479,37 +15907,6 @@
"integrity": "sha512-3ZUifmCDCQanjeej1f6kyl/BeP/Vae5EYkQ9iJfUm/QwZvlgnZzyflqAsAWYURdtea8Vkvswu2GrC57h3qffcA==",
"license": "MIT"
},
- "node_modules/sucrase": {
- "version": "3.35.1",
- "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz",
- "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==",
- "license": "MIT",
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.2",
- "commander": "^4.0.0",
- "lines-and-columns": "^1.1.6",
- "mz": "^2.7.0",
- "pirates": "^4.0.1",
- "tinyglobby": "^0.2.11",
- "ts-interface-checker": "^0.1.9"
- },
- "bin": {
- "sucrase": "bin/sucrase",
- "sucrase-node": "bin/sucrase-node"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- }
- },
- "node_modules/sucrase/node_modules/commander": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
- "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
- "license": "MIT",
- "engines": {
- "node": ">= 6"
- }
- },
"node_modules/supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
@@ -15555,9 +15952,9 @@
"license": "MIT"
},
"node_modules/synckit": {
- "version": "0.11.11",
- "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz",
- "integrity": "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==",
+ "version": "0.11.12",
+ "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz",
+ "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -15570,38 +15967,16 @@
"url": "https://opencollective.com/synckit"
}
},
- "node_modules/tar": {
- "version": "7.5.7",
- "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.7.tgz",
- "integrity": "sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==",
- "license": "BlueOak-1.0.0",
- "dependencies": {
- "@isaacs/fs-minipass": "^4.0.0",
- "chownr": "^3.0.0",
- "minipass": "^7.1.2",
- "minizlib": "^3.1.0",
- "yallist": "^5.0.0"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/tar/node_modules/yallist": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz",
- "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==",
- "license": "BlueOak-1.0.0",
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/temp-dir": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz",
- "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==",
+ "node_modules/tagged-tag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz",
+ "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==",
"license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/terminal-link": {
@@ -15621,9 +15996,9 @@
}
},
"node_modules/terser": {
- "version": "5.46.0",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.0.tgz",
- "integrity": "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==",
+ "version": "5.46.1",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.1.tgz",
+ "integrity": "sha512-vzCjQO/rgUuK9sf8VJZvjqiqiHFaZLnOiimmUuOKODxWL8mm/xua7viT7aqX7dgPY60otQjUotzFMmCB4VdmqQ==",
"license": "BSD-2-Clause",
"dependencies": {
"@jridgewell/source-map": "^0.3.3",
@@ -15644,6 +16019,16 @@
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"license": "MIT"
},
+ "node_modules/terser/node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "license": "MIT",
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
"node_modules/test-exclude": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
@@ -15658,6 +16043,27 @@
"node": ">=8"
}
},
+ "node_modules/test-exclude/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/text-encoding": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.7.0.tgz",
@@ -15665,27 +16071,6 @@
"deprecated": "no longer maintained",
"license": "(Unlicense OR Apache-2.0)"
},
- "node_modules/thenify": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
- "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
- "license": "MIT",
- "dependencies": {
- "any-promise": "^1.0.0"
- }
- },
- "node_modules/thenify-all": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
- "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
- "license": "MIT",
- "dependencies": {
- "thenify": ">= 3.1.0 < 4"
- },
- "engines": {
- "node": ">=0.8"
- }
- },
"node_modules/throat": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz",
@@ -15709,21 +16094,21 @@
}
},
"node_modules/tldts": {
- "version": "6.1.86",
- "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz",
- "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==",
+ "version": "7.0.28",
+ "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.28.tgz",
+ "integrity": "sha512-+Zg3vWhRUv8B1maGSTFdev9mjoo8Etn2Ayfs4cnjlD3CsGkxXX4QyW3j2WJ0wdjYcYmy7Lx2RDsZMhgCWafKIw==",
"license": "MIT",
"dependencies": {
- "tldts-core": "^6.1.86"
+ "tldts-core": "^7.0.28"
},
"bin": {
"tldts": "bin/cli.js"
}
},
"node_modules/tldts-core": {
- "version": "6.1.86",
- "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz",
- "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==",
+ "version": "7.0.28",
+ "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.28.tgz",
+ "integrity": "sha512-7W5Efjhsc3chVdFhqtaU0KtK32J37Zcr9RKtID54nG+tIpcY79CQK/veYPODxtD/LJ4Lue66jvrQzIX2Z2/pUQ==",
"license": "MIT"
},
"node_modules/tmp": {
@@ -15762,20 +16147,22 @@
"node": ">=0.6"
}
},
+ "node_modules/toqr": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/toqr/-/toqr-0.1.1.tgz",
+ "integrity": "sha512-FWAPzCIHZHnrE/5/w9MPk0kK25hSQSH2IKhYh9PyjS3SG/+IEMvlwIHbhz+oF7xl54I+ueZlVnMjyzdSwLmAwA==",
+ "license": "MIT"
+ },
"node_modules/tough-cookie": {
- "version": "4.1.4",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz",
- "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==",
- "dev": true,
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz",
+ "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==",
"license": "BSD-3-Clause",
"dependencies": {
- "psl": "^1.1.33",
- "punycode": "^2.1.1",
- "universalify": "^0.2.0",
- "url-parse": "^1.5.3"
+ "tldts": "^7.0.5"
},
"engines": {
- "node": ">=6"
+ "node": ">=16"
}
},
"node_modules/tr46": {
@@ -15792,9 +16179,9 @@
}
},
"node_modules/ts-api-utils": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
- "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz",
+ "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==",
"license": "MIT",
"engines": {
"node": ">=18.12"
@@ -15803,12 +16190,6 @@
"typescript": ">=4.8.4"
}
},
- "node_modules/ts-interface-checker": {
- "version": "0.1.13",
- "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
- "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
- "license": "Apache-2.0"
- },
"node_modules/tslib": {
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
@@ -15946,15 +16327,15 @@
}
},
"node_modules/typescript-eslint": {
- "version": "8.49.0",
- "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.49.0.tgz",
- "integrity": "sha512-zRSVH1WXD0uXczCXw+nsdjGPUdx4dfrs5VQoHnUWmv1U3oNlAKv4FUNdLDhVUg+gYn+a5hUESqch//Rv5wVhrg==",
+ "version": "8.58.0",
+ "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.58.0.tgz",
+ "integrity": "sha512-e2TQzKfaI85fO+F3QywtX+tCTsu/D3WW5LVU6nz8hTFKFZ8yBJ6mSYRpXqdR3mFjPWmO0eWsTa5f+UpAOe/FMA==",
"license": "MIT",
"dependencies": {
- "@typescript-eslint/eslint-plugin": "8.49.0",
- "@typescript-eslint/parser": "8.49.0",
- "@typescript-eslint/typescript-estree": "8.49.0",
- "@typescript-eslint/utils": "8.49.0"
+ "@typescript-eslint/eslint-plugin": "8.58.0",
+ "@typescript-eslint/parser": "8.58.0",
+ "@typescript-eslint/typescript-estree": "8.58.0",
+ "@typescript-eslint/utils": "8.58.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -15964,14 +16345,14 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <6.0.0"
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
}
},
"node_modules/ua-parser-js": {
- "version": "1.0.40",
- "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.40.tgz",
- "integrity": "sha512-z6PJ8Lml+v3ichVojCiB8toQJBuwR42ySM4ezjXIqXK3M0HczmKQ3LF4rhU55PfD99KEEXQG6yb7iOMyvYuHew==",
+ "version": "0.7.41",
+ "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.41.tgz",
+ "integrity": "sha512-O3oYyCMPYgNNHuO7Jjk3uacJWZF8loBgwrfd/5LE/HyZ3lUIOdniQ7DNXJcIgZbwioZxk0fLfI4EVnetdiX5jg==",
"funding": [
{
"type": "opencollective",
@@ -16012,19 +16393,10 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/undici": {
- "version": "6.23.0",
- "resolved": "https://registry.npmjs.org/undici/-/undici-6.23.0.tgz",
- "integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==",
- "license": "MIT",
- "engines": {
- "node": ">=18.17"
- }
- },
"node_modules/undici-types": {
- "version": "7.8.0",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz",
- "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==",
+ "version": "7.18.2",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz",
+ "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==",
"license": "MIT"
},
"node_modules/unicode-canonical-property-names-ecmascript": {
@@ -16050,43 +16422,30 @@
}
},
"node_modules/unicode-match-property-value-ecmascript": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz",
- "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==",
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz",
+ "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==",
"license": "MIT",
"engines": {
"node": ">=4"
}
},
"node_modules/unicode-property-aliases-ecmascript": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz",
- "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==",
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz",
+ "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==",
"license": "MIT",
"engines": {
"node": ">=4"
}
},
- "node_modules/unique-string": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
- "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
- "license": "MIT",
- "dependencies": {
- "crypto-random-string": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/universalify": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
- "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
- "dev": true,
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
"license": "MIT",
"engines": {
- "node": ">= 4.0.0"
+ "node": ">= 10.0.0"
}
},
"node_modules/unpipe": {
@@ -16099,9 +16458,9 @@
}
},
"node_modules/update-browserslist-db": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.2.tgz",
- "integrity": "sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==",
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
+ "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
"funding": [
{
"type": "opencollective",
@@ -16170,9 +16529,9 @@
}
},
"node_modules/use-latest-callback": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/use-latest-callback/-/use-latest-callback-0.2.4.tgz",
- "integrity": "sha512-LS2s2n1usUUnDq4oVh1ca6JFX9uSqUncTfAm44WMg0v6TxL7POUTk1B044NH8TeLkFbNajIsgDHcgNpNzZucdg==",
+ "version": "0.2.6",
+ "resolved": "https://registry.npmjs.org/use-latest-callback/-/use-latest-callback-0.2.6.tgz",
+ "integrity": "sha512-FvRG9i1HSo0wagmX63Vrm8SnlUU3LMM3WyZkQ76RnslpBrX694AdG4A0zQBx2B3ZifFA0yv/BaEHGBnEax5rZg==",
"license": "MIT",
"peerDependencies": {
"react": ">=16.8"
@@ -16201,27 +16560,14 @@
}
},
"node_modules/use-sync-external-store": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz",
- "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==",
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz",
+ "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==",
"license": "MIT",
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
}
},
- "node_modules/util": {
- "version": "0.12.5",
- "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz",
- "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==",
- "license": "MIT",
- "dependencies": {
- "inherits": "^2.0.3",
- "is-arguments": "^1.0.4",
- "is-generator-function": "^1.0.7",
- "is-typed-array": "^1.1.3",
- "which-typed-array": "^1.1.2"
- }
- },
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@@ -16238,12 +16584,13 @@
}
},
"node_modules/uuid": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz",
- "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==",
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+ "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.",
"license": "MIT",
"bin": {
- "uuid": "dist/bin/uuid"
+ "uuid": "bin/uuid"
}
},
"node_modules/v8-to-istanbul": {
@@ -16358,6 +16705,7 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz",
"integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==",
+ "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -16397,52 +16745,11 @@
"node": ">=12"
}
},
- "node_modules/whatwg-url-without-unicode": {
- "version": "8.0.0-3",
- "resolved": "https://registry.npmjs.org/whatwg-url-without-unicode/-/whatwg-url-without-unicode-8.0.0-3.tgz",
- "integrity": "sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig==",
- "license": "MIT",
- "dependencies": {
- "buffer": "^5.4.3",
- "punycode": "^2.1.1",
- "webidl-conversions": "^5.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/whatwg-url-without-unicode/node_modules/buffer": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
- "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.1.13"
- }
- },
- "node_modules/whatwg-url-without-unicode/node_modules/webidl-conversions": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz",
- "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==",
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=8"
- }
+ "node_modules/whatwg-url-minimum": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/whatwg-url-minimum/-/whatwg-url-minimum-0.1.1.tgz",
+ "integrity": "sha512-u2FNVjFVFZhdjb502KzXy1gKn1mEisQRJssmSJT8CPhZdZa0AP6VCbWlXERKyGu0l09t0k50FiDiralpGhBxgA==",
+ "license": "MIT"
},
"node_modules/which": {
"version": "2.0.2",
@@ -16530,9 +16837,9 @@
"license": "ISC"
},
"node_modules/which-typed-array": {
- "version": "1.1.19",
- "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz",
- "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==",
+ "version": "1.1.20",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz",
+ "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==",
"license": "MIT",
"dependencies": {
"available-typed-arrays": "^1.0.7",
@@ -16550,12 +16857,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/wonka": {
- "version": "6.3.5",
- "resolved": "https://registry.npmjs.org/wonka/-/wonka-6.3.5.tgz",
- "integrity": "sha512-SSil+ecw6B4/Dm7Pf2sAshKQ5hWFvfyGlfPbEd6A14dOH6VDjrmbY86u6nZvy9omGwwIPFR8V41+of1EezgoUw==",
- "license": "MIT"
- },
"node_modules/word-wrap": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
@@ -16603,9 +16904,9 @@
}
},
"node_modules/ws": {
- "version": "8.18.3",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz",
- "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==",
+ "version": "8.20.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz",
+ "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==",
"license": "MIT",
"engines": {
"node": ">=10.0.0"
@@ -16636,6 +16937,15 @@
"node": ">=10.0.0"
}
},
+ "node_modules/xcode/node_modules/uuid": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz",
+ "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==",
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
"node_modules/xml-name-validator": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz",
@@ -16700,15 +17010,12 @@
"license": "ISC"
},
"node_modules/yaml": {
- "version": "2.8.1",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz",
- "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==",
+ "version": "1.10.3",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz",
+ "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==",
"license": "ISC",
- "bin": {
- "yaml": "bin.mjs"
- },
"engines": {
- "node": ">= 14.6"
+ "node": ">= 6"
}
},
"node_modules/yargs": {
@@ -16750,10 +17057,19 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/zod": {
+ "version": "3.25.76",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
+ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
"node_modules/zustand": {
- "version": "5.0.9",
- "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.9.tgz",
- "integrity": "sha512-ALBtUj0AfjJt3uNRQoL1tL2tMvj6Gp/6e39dnfT6uzpelGru8v1tPOGBzayOWbPJvujM8JojDk3E1LxeFisBNg==",
+ "version": "5.0.12",
+ "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.12.tgz",
+ "integrity": "sha512-i77ae3aZq4dhMlRhJVCYgMLKuSiZAaUPAct2AksxQ+gOtimhGMdXljRT21P5BNpeT4kXlLIckvkPM029OljD7g==",
"license": "MIT",
"engines": {
"node": ">=12.20.0"
@@ -16779,33 +17095,36 @@
}
}
},
+ "node_modules/zxing-wasm": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/zxing-wasm/-/zxing-wasm-3.0.2.tgz",
+ "integrity": "sha512-2YMAriaYHX9wrBY2k7H0epSo+dyCaCZg/vOtt+nEDXM9ul480gkXz/9SkwpOeHcD2H5qqDG8lWDSBwpTcZpa6w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/emscripten": "^1.41.5",
+ "type-fest": "^5.5.0"
+ },
+ "peerDependencies": {
+ "@types/emscripten": ">=1.39.6"
+ }
+ },
+ "node_modules/zxing-wasm/node_modules/type-fest": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.5.0.tgz",
+ "integrity": "sha512-PlBfpQwiUvGViBNX84Yxwjsdhd1TUlXr6zjX7eoirtCPIr08NAmxwa+fcYBTeRQxHo9YC9wwF3m9i700sHma8g==",
+ "license": "(MIT OR CC0-1.0)",
+ "dependencies": {
+ "tagged-tag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"stubs/appscho": {
"version": "1.1.0"
}
- },
- "devDependencies": {
- "@babel/core": "^7.25.2",
- "@types/react": "~19.0.10",
- "eslint-config-prettier": "^10.1.5",
- "eslint-plugin-prettier": "^5.5.0",
- "eslint-plugin-unused-imports": "^4.1.4",
- "jest": "^29.2.1",
- "jest-expo": "~53.0.9",
- "prettier": "^3.6.0",
- "react-test-renderer": "19.0.0",
- "typescript": "~5.8.3"
- },
- "jest": {
- "preset": "jest-expo"
- },
- "scripts": {
- "android": "expo run:android",
- "format": "prettier --write .",
- "format:check": "prettier --check .",
- "ios": "expo run:ios",
- "lint": "eslint --fix",
- "start": "expo start",
- "test": "jest --watchAll",
- "web": "expo start --web"
}
}
diff --git a/package.json b/package.json
index aa3cdeeb..ab983bcf 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "papillon",
"main": "expo-router/entry",
- "version": "8.4.0",
+ "version": "8.4.1",
"scripts": {
"start": "expo start",
"android": "expo run:android",
@@ -23,13 +23,14 @@
"@bottom-tabs/react-navigation": "^0.11.2",
"@callstack/liquid-glass": "^0.4.3",
"@eslint/js": "^9.39.1",
- "@expo/metro-config": "~54.0.10",
+ "@expo/metro-config": "~55.0.9",
"@expo/ngrok": "^4.1.3",
+ "@expo/ui": "~55.0.8",
"@expo/vector-icons": "^15.0.2",
- "@getpapillon/papicons": "^0.2.0",
+ "@getpapillon/papicons": "^0.2.1",
"@legendapp/list": "^2.0.15",
"@nozbe/watermelondb": "^0.28.0",
- "@react-native-community/datetimepicker": "8.4.4",
+ "@react-native-community/datetimepicker": "8.6.0",
"@react-native-masked-view/masked-view": "^0.3.2",
"@react-native-menu/menu": "^2.0.0",
"@react-navigation/elements": "^2.9.2",
@@ -37,7 +38,7 @@
"@react-navigation/native-stack": "^7.3.16",
"@sbaiahmed1/react-native-blur": "^4.2.1",
"@shopify/flash-list": "2.0.2",
- "@shopify/react-native-skia": "2.2.12",
+ "@shopify/react-native-skia": "2.4.18",
"@types/uuid": "^10.0.0",
"alise-api": "^0.2.5",
"appscho": "file:./stubs/appscho",
@@ -47,33 +48,34 @@
"eslint-plugin-react": "^7.37.5",
"eslint-plugin-simple-import-sort": "^12.1.1",
"esup-multi.js": "^1.0.4",
- "expo": "~54.0.32",
- "expo-audio": "~1.1.1",
- "expo-battery": "~10.0.8",
- "expo-blur": "~15.0.8",
- "expo-build-properties": "~1.0.10",
- "expo-camera": "~17.0.10",
- "expo-crypto": "~15.0.8",
- "expo-dev-client": "~6.0.20",
- "expo-device": "~8.0.10",
+ "expo": "~55.0.0",
+ "expo-asset": "~55.0.12",
+ "expo-audio": "~55.0.11",
+ "expo-battery": "~55.0.11",
+ "expo-blur": "~55.0.12",
+ "expo-build-properties": "~55.0.11",
+ "expo-camera": "~55.0.13",
+ "expo-crypto": "~55.0.12",
+ "expo-dev-client": "~55.0.22",
+ "expo-device": "~55.0.12",
"expo-fetcher": "^0.9.1",
- "expo-file-system": "~19.0.20",
- "expo-font": "~14.0.10",
- "expo-haptics": "~15.0.8",
- "expo-image-picker": "~17.0.9",
- "expo-linear-gradient": "~15.0.8",
- "expo-linking": "~8.0.10",
- "expo-localization": "~17.0.8",
- "expo-location": "~19.0.8",
- "expo-network": "~8.0.8",
- "expo-notifications": "^0.32.13",
- "expo-router": "~6.0.17",
- "expo-secure-store": "~15.0.8",
- "expo-splash-screen": "~31.0.12",
- "expo-status-bar": "~3.0.9",
- "expo-system-ui": "~6.0.9",
- "expo-video": "~3.0.14",
- "expo-web-browser": "~15.0.10",
+ "expo-file-system": "~55.0.14",
+ "expo-font": "~55.0.6",
+ "expo-haptics": "~55.0.11",
+ "expo-image-picker": "~55.0.16",
+ "expo-linear-gradient": "~55.0.11",
+ "expo-linking": "~55.0.11",
+ "expo-localization": "~55.0.11",
+ "expo-location": "~55.1.6",
+ "expo-network": "~55.0.11",
+ "expo-notifications": "~55.0.16",
+ "expo-router": "~55.0.10",
+ "expo-secure-store": "~55.0.11",
+ "expo-splash-screen": "~55.0.15",
+ "expo-status-bar": "~55.0.5",
+ "expo-system-ui": "~55.0.13",
+ "expo-video": "~55.0.13",
+ "expo-web-browser": "~55.0.12",
"ezly": "^1.4.3",
"fflate": "^0.8.2",
"i18next": "^25.7.2",
@@ -82,27 +84,28 @@
"lucide-react-native": "^0.511.0",
"patch-package": "^8.0.1",
"pawnote": "^1.6.2",
- "react": "19.1.0",
- "react-dom": "19.1.0",
+ "react": "19.2.0",
+ "react-dom": "19.2.0",
"react-i18next": "^15.7.4",
- "react-native": "0.81.5",
- "react-native-bottom-tabs": "^0.11.2",
+ "react-native": "0.83.4",
+ "react-native-bottom-tabs": "^1.1.0",
+ "react-native-dynamic-theme": "^0.3.4",
"react-native-edge-to-edge": "1.6.0",
"react-native-fast-tflite": "^1.6.1",
- "react-native-gesture-handler": "~2.28.0",
+ "react-native-gesture-handler": "~2.30.0",
"react-native-graph": "^1.1.0",
"react-native-htmlview": "^0.17.0",
"react-native-linear-gradient": "^2.8.3",
"react-native-mmkv": "^3.3.3",
"react-native-qrcode-svg": "^6.3.15",
- "react-native-reanimated": "~4.1.1",
+ "react-native-reanimated": "4.2.1",
"react-native-safe-area-context": "~5.6.0",
"react-native-screen-transitions": "^2.0.3",
- "react-native-screens": "~4.16.0",
- "react-native-svg": "15.12.1",
+ "react-native-screens": "~4.23.0",
+ "react-native-svg": "15.15.3",
"react-native-web": "^0.21.2",
- "react-native-webview": "13.15.0",
- "react-native-worklets": "0.5.1",
+ "react-native-webview": "13.16.0",
+ "react-native-worklets": "0.7.2",
"skolengojs": "^1.1.10",
"turboself-api": "^2.1.9",
"typescript-eslint": "^8.49.0",
@@ -110,12 +113,12 @@
},
"devDependencies": {
"@babel/core": "^7.28.5",
- "@types/react": "~19.1.17",
+ "@types/react": "~19.2.10",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-prettier": "^5.5.4",
"eslint-plugin-unused-imports": "^4.3.0",
"jest": "^29.7.0",
- "jest-expo": "~54.0.14",
+ "jest-expo": "~55.0.13",
"prettier": "^3.7.4",
"react-test-renderer": "19.0.0",
"typescript": "~5.9.3"
diff --git a/scripts/generateEmojiList.sh b/scripts/generateEmojiList.sh
new file mode 100755
index 00000000..1784eb22
--- /dev/null
+++ b/scripts/generateEmojiList.sh
@@ -0,0 +1,48 @@
+#!/bin/bash
+
+UNICODE_EMOJI_DATA=$(curl https://unicode.org/Public/emoji/latest/emoji-test.txt);
+IS_FIRST_GROUP=0;
+
+get_icon() {
+ case "$1" in
+ smileys_and_emotion) echo "Emoji" ;;
+ people_and_body) echo "Accessibility" ;;
+ component) echo "Code" ;;
+ animals_and_nature) echo "Butterfly" ;;
+ food_and_drink) echo "Cutlery" ;;
+ travel_and_places) echo "Bus" ;;
+ activities) echo "Palette" ;;
+ objects) echo "Archive" ;;
+ symbols) echo "Grid" ;;
+ flags) echo "MapPin" ;;
+ *) echo "" ;;
+ esac
+}
+
+echo 'export const UnicodeEmojis = {'
+
+while IFS= read -r line; do
+ if [[ "$line" == "# group: "* ]]; then
+ GROUP=${line##*: }
+ FORMATED_GROUP_NAME=$(echo "$GROUP" \
+ | tr '[:upper:]' '[:lower:]' \
+ | sed 's/&/and/g; s/[^a-z0-9]/_/g; s/__*/_/g; s/^_//; s/_$//')
+ ICON=$(get_icon "$FORMATED_GROUP_NAME")
+
+ if [ "$IS_FIRST_GROUP" -eq 1 ]; then
+ echo -e ']\n\t},'
+ fi
+
+ echo -ne "\t$FORMATED_GROUP_NAME: { \n\t\ticon: \"$ICON\",\n\t\temojis: ["
+
+ IS_FIRST_GROUP=1
+ fi
+
+ if [[ "$line" == *"; fully-qualified"* ]]; then
+ EMOJI_LINE=("$line")
+ EMOJI_HEX=${EMOJI_LINE[0]};
+ echo -n "0x$EMOJI_HEX, "
+ fi
+done <<< "$UNICODE_EMOJI_DATA"
+
+echo -e ']\n\t}\n};';
\ No newline at end of file
diff --git a/services/ecoledirecte/grades.ts b/services/ecoledirecte/grades.ts
index 3f3d9d85..4d8d12a5 100644
--- a/services/ecoledirecte/grades.ts
+++ b/services/ecoledirecte/grades.ts
@@ -1,6 +1,7 @@
import { Client } from "@blockshub/blocksdirecte";
+import { getSubjectAverageByProperty } from "@/utils/grades/algorithms/helpers";
import { getSubjectAverage } from "@/utils/grades/algorithms/subject";
import { warn } from "@/utils/logger/logger";
@@ -24,17 +25,14 @@ export async function fetchEDGradePeriods(session: Client, accountId: string): P
export async function fetchEDGrades(session: Client, accountId: string, period: Period): Promise {
try {
const overview = await session.marks.getMark()
- const periodReport = overview.periodes.find(item => item.idPeriode === period.id)
- const grades = overview.notes.filter(grade => grade.codePeriode === period.id)
-
- if (!overview || !periodReport) {
+ const periodReport = overview.periodes.find(
+ item => item.codePeriode === period.id || item.idPeriode === period.id
+ )
+ const grades = getGradesForPeriod(overview.notes, period)
+
+ if (!periodReport) {
warn("Invalid grades data structure or period not found")
- return {
- createdByAccount: accountId,
- classAverage: { value: 16.66, disabled: true },
- studentOverall: { value: 16.66, disabled: true },
- subjects: []
- }
+ return emptyPeriodGrades(accountId)
}
const subjects: Record = {}
@@ -42,14 +40,14 @@ export async function fetchEDGrades(session: Client, accountId: string, period:
id: String(g.id),
subjectId: g.codeMatiere,
subjectName: g.libelleMatiere,
- description: g.commentaire,
+ description: g.devoir?.trim() || g.commentaire?.trim() || "",
givenAt: new Date(g.date),
subjectFile: undefined,
correctionFile: undefined,
bonus: false,
optional: g.nonSignificatif,
outOf: parseGradeValue(g.noteSur),
- coefficient: Number(g.coef),
+ coefficient: parseNumericValue(g.coef, 1) ?? 1,
studentScore: parseGradeValue(g.valeur),
averageScore: parseGradeValue(g.moyenneClasse),
minScore: parseGradeValue(g.minClasse),
@@ -57,50 +55,160 @@ export async function fetchEDGrades(session: Client, accountId: string, period:
createdByAccount: accountId
}))
- for (const subject of periodReport.ensembleMatieres.disciplines) {
+ for (const subject of periodReport.ensembleMatieres?.disciplines ?? []) {
const parsedAverage = parseGradeValue(subject.moyenne)
+ const parsedClassAverage = parseGradeValue(subject.moyenneClasse)
+ const parsedMaximum = parseGradeValue(subject.moyenneMax)
+ const parsedMinimum = parseGradeValue(subject.moyenneMin)
const grades = allMappedGrades.filter(grade => grade.subjectId === subject.codeMatiere)
+ const computedAverage = getSubjectAverage(grades)
+ const computedClassAverage = getSubjectAverageByProperty(grades, "averageScore")
+ const computedMaximum = getSubjectAverageByProperty(grades, "maxScore")
+ const computedMinimum = getSubjectAverageByProperty(grades, "minScore")
+
subjects[subject.codeMatiere] = {
id: subject.codeMatiere,
name: subject.discipline,
- studentAverage: parsedAverage.status === "Inconnu" ? { value: getSubjectAverage(grades) } : parsedAverage,
- classAverage: parseGradeValue(subject.moyenneClasse),
- maximum: parseGradeValue(subject.moyenneMax),
- minimum: parseGradeValue(subject.moyenneMin),
+ studentAverage: parsedAverage.disabled && computedAverage >= 0 ? { value: computedAverage } : parsedAverage,
+ classAverage: parsedClassAverage.disabled && computedClassAverage >= 0 ? { value: computedClassAverage } : parsedClassAverage,
+ maximum: parsedMaximum.disabled && computedMaximum >= 0 ? { value: computedMaximum } : parsedMaximum,
+ minimum: parsedMinimum.disabled && computedMinimum >= 0 ? { value: computedMinimum } : parsedMinimum,
outOf: { value: 20 },
grades
}
}
- const average = grades.length > 0
- ? grades.reduce((sum, grade) => sum + Number(grade.valeur), 0) / grades.length
- : 0;
- const subjectValues = Object.values(subjects);
- const classAverage = subjectValues.length > 0
- ? subjectValues.reduce((sum, subject) => sum + subject.classAverage.value, 0) / subjectValues.length
- : 0;
+ const subjectValues = Object.values(subjects).filter(subject => subject.grades?.length)
+ const average = getAverageScore(
+ parseGradeValue(periodReport.ensembleMatieres?.moyenneGenerale),
+ subjectValues,
+ "studentAverage"
+ )
+ const classAverage = getAverageScore(
+ parseGradeValue(periodReport.ensembleMatieres?.moyenneClasse),
+ subjectValues,
+ "classAverage"
+ )
return {
- studentOverall: { value: average },
- classAverage: { value: classAverage },
- subjects: Object.values(subjects).filter(subject => subject.grades?.length),
+ studentOverall: average,
+ classAverage,
+ subjects: subjectValues,
createdByAccount: accountId
}
} catch (error) {
warn(String(error))
- return {
- createdByAccount: accountId,
- classAverage: { value: 16.66, disabled: true },
- studentOverall: { value: 16.66, disabled: true },
- subjects: []
- }
+ return emptyPeriodGrades(accountId)
}
}
-function parseGradeValue(value: string): GradeScore {
- const score = parseFloat(value.replace(',', '.'));
- if (typeof score === 'number' && !isNaN(score)) {
+function emptyPeriodGrades(accountId: string): PeriodGrades {
+ return {
+ createdByAccount: accountId,
+ classAverage: { value: 16.66, disabled: true },
+ studentOverall: { value: 16.66, disabled: true },
+ subjects: []
+ }
+}
+
+function parseGradeValue(value?: string | number | null): GradeScore {
+ const score = parseNumericValue(value);
+ if (typeof score === "number" && Number.isFinite(score)) {
return { value: score };
}
- return { value: NaN, disabled: true, status: "Inconnu" };
-}
\ No newline at end of file
+
+ return { value: 0, disabled: true, status: formatGradeStatus(value) };
+}
+
+function getGradesForPeriod(grades: T[], period: Period): T[] {
+ const directMatches = grades.filter(grade => grade.codePeriode === period.id)
+
+ if (directMatches.length > 0) {
+ return directMatches
+ }
+
+ return grades.filter(grade => isGradeInPeriod(grade, period))
+}
+
+function parseNumericValue(value?: string | number | null, fallback?: number): number | undefined {
+ if (typeof value === "number") {
+ return Number.isFinite(value) ? value : fallback
+ }
+
+ if (typeof value !== "string") {
+ return fallback
+ }
+
+ const normalized = value
+ .replace(/\u00A0/g, " ")
+ .trim()
+
+ if (!normalized) {
+ return fallback
+ }
+
+ const score = Number.parseFloat(normalized.replace(",", "."))
+ return Number.isFinite(score) ? score : fallback
+}
+
+function isGradeInPeriod(grade: { date?: string }, period: Period): boolean {
+ if (!grade.date) {
+ return false
+ }
+
+ const gradeDate = new Date(grade.date)
+ return !Number.isNaN(gradeDate.getTime())
+ && gradeDate.getTime() >= period.start.getTime()
+ && gradeDate.getTime() <= period.end.getTime()
+}
+
+function formatGradeStatus(value?: string | number | null): string {
+ if (typeof value !== "string") {
+ return "Inconnu"
+ }
+
+ const normalized = value
+ .replace(/\u00A0/g, " ")
+ .trim()
+
+ if (!normalized) {
+ return "Inconnu"
+ }
+
+ switch (normalized.toLowerCase()) {
+ case "abs":
+ case "abs.":
+ return "Abs."
+ case "disp":
+ case "disp.":
+ return "Disp."
+ case "n.not":
+ case "n.not.":
+ return "N. Not."
+ default:
+ return normalized
+ }
+}
+
+function getAverageScore(
+ directScore: GradeScore,
+ subjects: Subject[],
+ key: "studentAverage" | "classAverage"
+): GradeScore {
+ if (!directScore.disabled && Number.isFinite(directScore.value)) {
+ return directScore
+ }
+
+ const validValues = subjects
+ .map(subject => subject[key])
+ .filter(score => !score.disabled && Number.isFinite(score.value))
+ .map(score => score.value)
+
+ if (validValues.length === 0) {
+ return { value: 0, disabled: true, status: "Inconnu" }
+ }
+
+ return {
+ value: validValues.reduce((sum, currentValue) => sum + currentValue, 0) / validValues.length
+ }
+}
diff --git a/services/pronote/news.ts b/services/pronote/news.ts
index 4636967a..519cab29 100644
--- a/services/pronote/news.ts
+++ b/services/pronote/news.ts
@@ -31,6 +31,7 @@ export async function fetchPronoteNews(session: SessionHandle, accountId: string
category: item.category.name,
ref: item,
createdByAccount: accountId,
+ question: item.question
});
}
return result;
diff --git a/services/shared/news.ts b/services/shared/news.ts
index 0e9d85e5..3af04c4d 100644
--- a/services/shared/news.ts
+++ b/services/shared/news.ts
@@ -25,5 +25,6 @@ export interface News extends GenericInterface {
content: string;
author: string;
category: string;
+ question?: boolean;
ref?: NewsInformation | SkolengoNews | ActualitiesResponse;
}
diff --git a/stores/account/types.ts b/stores/account/types.ts
index 0125ea55..45ef39c8 100644
--- a/stores/account/types.ts
+++ b/stores/account/types.ts
@@ -59,9 +59,11 @@ export interface Account {
updatedAt: string;
}
+export interface CustomisableSubject { color: string; emoji: string; name: string }
+
export interface CustomisationStorage {
profilePicture: string;
- subjects: Record;
+ subjects: Record;
}
export interface TransportAddress {
diff --git a/stores/settings/index.ts b/stores/settings/index.ts
index 6a6e12a9..16eb1524 100644
--- a/stores/settings/index.ts
+++ b/stores/settings/index.ts
@@ -1,5 +1,6 @@
import { create } from "zustand";
import { persist } from "zustand/middleware";
+import { Platform } from "react-native";
import { Colors } from "@/utils/colors";
import { MAGIC_URL } from "@/utils/endpoints";
@@ -7,14 +8,21 @@ import { MAGIC_URL } from "@/utils/endpoints";
import { createMMKVStorage } from "../global";
import { Personalization,SettingsState, SettingsStorage } from "./types";
+export const DEFAULT_MATERIAL_YOU_ENABLED =
+ Platform.OS === "android" && typeof Platform.Version === "number" && Platform.Version >= 31;
+
const defaultPersonalization: Personalization = {
colorSelected: Colors.PINK,
theme: "auto",
+ useMaterialYou: DEFAULT_MATERIAL_YOU_ENABLED,
+ iOSBottomAccessoryEnabled: true,
+ showTabBarLabels: true,
magicEnabled: true,
hideNameOnHomeScreen: false,
showAlertAtLogin: false,
showDevMode: false,
magicModelURL: MAGIC_URL,
+ gradesDisplayScale: "20",
};
export const useSettingsStore = create()(
diff --git a/stores/settings/types.ts b/stores/settings/types.ts
index 35aca5f5..750cea51 100644
--- a/stores/settings/types.ts
+++ b/stores/settings/types.ts
@@ -26,8 +26,12 @@ export interface Wallpaper {
}
export interface Personalization {
+ gradesDisplayScale?: "20" | "10" | "5" | "percentage";
colorSelected?: Colors;
theme?: "light" | "dark" | "auto";
+ useMaterialYou?: boolean;
+ iOSBottomAccessoryEnabled?: boolean;
+ showTabBarLabels?: boolean;
magicEnabled?: boolean;
hideNameOnHomeScreen?: boolean;
showAlertAtLogin?: boolean;
diff --git a/ui/components/ActionMenu.tsx b/ui/components/ActionMenu.tsx
new file mode 100644
index 00000000..4ada8e96
--- /dev/null
+++ b/ui/components/ActionMenu.tsx
@@ -0,0 +1,475 @@
+import React, { useState, useRef, useEffect, useMemo, useCallback } from "react";
+import type { ComponentType } from "react";
+import type { MenuAction as NativeMenuAction, MenuComponentProps as NativeMenuComponentProps } from "@react-native-menu/menu";
+import {
+ Modal,
+ Platform,
+ Pressable,
+ TouchableOpacity,
+ View,
+ StyleSheet,
+ Text,
+ LayoutRectangle,
+ Dimensions,
+} from "react-native";
+import { useTheme } from "@react-navigation/native";
+import { useSafeAreaInsets } from "react-native-safe-area-context";
+import Stack from "@/ui/components/Stack";
+import { Papicons } from "@getpapillon/papicons";
+import { runsIOS26 } from "@/ui/utils/IsLiquidGlass";
+import { warn } from "@/utils/logger/logger";
+import Typography from "../new/Typography";
+import Reanimated, { FadeIn, FadeInRight, FadeOut, FadeOutLeft, LayoutAnimationConfig, LinearTransition, useAnimatedStyle, useSharedValue, withSpring, withTiming, ZoomOut, ZoomOutEasyUp } from "react-native-reanimated";
+import { PapillonAndroidMenuIn, PapillonAppearIn, PapillonAppearOut, PapillonSpringIn, PapillonZoomIn, PapillonZoomOut } from "../utils/Transition";
+import { ListTouchable } from "../new/List";
+
+let NativeMenuView: ComponentType> | null = null;
+if (Platform.OS === "ios") {
+ try {
+ const mod = require("@react-native-menu/menu");
+ NativeMenuView = mod?.MenuView ?? null;
+ } catch (err: unknown) {
+ warn(`ActionMenu: impossible de charger @react-native-menu/menu MenuView: ${String(err)}`);
+ }
+}
+
+function MenuItem({
+ action,
+ textColor,
+ subtitleColor,
+ primaryColor,
+ destructiveColor,
+ onPress,
+}: {
+ action: NativeMenuAction;
+ textColor: string;
+ subtitleColor: string;
+ primaryColor: string;
+ destructiveColor: string;
+ onPress: () => void;
+}) {
+ const theme = useTheme();
+
+ // Reduced flags: compute isOn from action.state (attributes does not expose state in the types).
+ const isOn = action.state === "on";
+ const hasSubactions = Boolean(action.subactions?.length);
+ const legacy = action as unknown as { destructive?: boolean; disabled?: boolean };
+ const destructive = Boolean(action.attributes?.destructive ?? legacy.destructive);
+ const disabled = Boolean(action.attributes?.disabled ?? legacy.disabled);
+
+ let colorText: string;
+ if (action.imageColor !== undefined && action.imageColor !== null) {
+ colorText = String(action.imageColor);
+ } else if (destructive) {
+ colorText = destructiveColor;
+ } else {
+ colorText = theme.colors.text;
+ }
+
+ return (
+
+
+
+ {action.papicon ? (
+
+ ) : null}
+
+
+ {action.title}
+
+ {action.subtitle && (
+
+ {action.subtitle}
+
+ )}
+
+ {hasSubactions && (
+
+ )}
+ {(isOn && !hasSubactions) && (
+
+ )}
+
+
+
+ );
+}
+
+export default function ActionMenu({
+ actions = [],
+ children,
+ onPressAction,
+ title,
+ placement = "auto",
+}: NativeMenuComponentProps & { placement?: "auto" | "below" }) {
+ const handleActionPress = onPressAction ?? (() => { });
+ const { colors } = useTheme();
+ const insets = useSafeAreaInsets();
+ const subtitleColor = `${colors.text}80`;
+ const primaryColor = colors.primary;
+ const cardColor = colors.card;
+ const destructiveColor = (colors as any).danger;
+ const borderColor = colors.border;
+
+ const triggerRef = useRef(null);
+ const menuRef = useRef(null);
+ const measureTimeoutRef = useRef | null>(null);
+ const closeTimeoutRef = useRef | null>(null);
+ const actionCloseTimeoutRef = useRef | null>(null);
+ const [visible, setVisible] = useState(false);
+ const [modalVisible, setModalVisible] = useState(false);
+
+ const [submenuStack, setSubmenuStack] = useState([]);
+ const [position, setPosition] = useState(null);
+ const [menuSize, setMenuSize] = useState<{ width: number; height: number } | null>(null);
+
+ function clearTimer(timerRef: React.MutableRefObject | null>) {
+ if (timerRef.current) {
+ clearTimeout(timerRef.current);
+ timerRef.current = null;
+ }
+ }
+
+ useEffect(() => {
+ if (!visible) {
+ setModalVisible(false);
+ }
+ }, [visible]);
+
+ useEffect(() => {
+ return () => {
+ clearTimer(measureTimeoutRef);
+ clearTimer(closeTimeoutRef);
+ clearTimer(actionCloseTimeoutRef);
+ };
+ }, []);
+
+ // iOS
+ if (Platform.OS === "ios" && NativeMenuView) {
+ return (
+
+ {children}
+
+ );
+ }
+
+ // Android
+ function open() {
+ clearTimer(closeTimeoutRef);
+ clearTimer(actionCloseTimeoutRef);
+ clearTimer(measureTimeoutRef);
+ if (menuContentHeight.value <= 0) {
+ menuContentHeight.value = estimatedMenuContentHeight;
+ }
+ setVisible(true);
+ measureTimeoutRef.current = setTimeout(() => {
+ const trigger = triggerRef.current;
+ if (!trigger) {
+ setModalVisible(true);
+ return;
+ }
+ trigger.measure((x, y, width, height, pageX, pageY) => {
+ setPosition({ x: pageX ?? x, y: pageY ?? y, width, height });
+ setModalVisible(true);
+ });
+ }, 0);
+ }
+
+ function close() {
+ clearTimer(measureTimeoutRef);
+ clearTimer(actionCloseTimeoutRef);
+ setModalVisible(false);
+ clearTimer(closeTimeoutRef);
+ closeTimeoutRef.current = setTimeout(() => {
+ setVisible(false);
+ setSubmenuStack([]);
+ setPosition(null);
+ setMenuSize(null);
+ hasMeasuredMenuContent.current = false;
+ menuContentHeight.value = 0;
+ }, 220);
+ }
+
+ function handlePress(action: NativeMenuAction, fallbackId: string) {
+ if (action.subactions && action.subactions.length > 0) {
+ setSubmenuStack((prev) => [...prev, action]);
+ return;
+ }
+ handleActionPress({ nativeEvent: { event: action.id ?? fallbackId } });
+ clearTimer(actionCloseTimeoutRef);
+ actionCloseTimeoutRef.current = setTimeout(() => {
+ close();
+ }, 30);
+ }
+
+ function handleBack() {
+ setSubmenuStack((prev) => prev.slice(0, -1));
+ }
+
+ function getMenuPosition() {
+ if (!position) {
+ return { position: "absolute" as const, top: 0, left: 0, opacity: 0 };
+ }
+
+ const screen = Dimensions.get("window");
+ const MARGIN = 16;
+ const SPACING = 8;
+ const width = menuSize?.width ?? menuWidth;
+ const height = menuSize?.height ?? estimatedMenuHeight;
+
+ const safeLeft = insets.left + MARGIN;
+ const safeRight = screen.width - insets.right - MARGIN;
+ const safeTop = insets.top + MARGIN;
+ const safeBottom = screen.height - insets.bottom - MARGIN;
+
+ const left = Math.min(
+ Math.max(position.x, safeLeft),
+ safeRight - width
+ );
+
+ const topIfBelow = placement === "below"
+ ? Math.min(
+ Math.max(position.y, safeTop),
+ Math.max(safeTop, safeBottom - height)
+ )
+ : position.y + position.height + SPACING;
+ const hasSpaceBelow = placement === "below" || topIfBelow + height <= safeBottom;
+ const top = hasSpaceBelow
+ ? topIfBelow
+ : Math.max(safeTop, position.y - height - SPACING);
+
+ return { position: "absolute" as const, top, left };
+ }
+
+ const side = useMemo(() => {
+ if (!position) {
+ return "left";
+ }
+ const screen = Dimensions.get("window");
+ const centerX = position.x + position.width / 2;
+ return centerX < screen.width / 2 ? "left" : "right";
+ }, [position]);
+
+ const currentSubmenu = submenuStack[submenuStack.length - 1];
+ const currentActions = currentSubmenu?.subactions ?? actions;
+ const menuWidth = Math.min(Dimensions.get("window").width * 0.75, 320);
+ const estimatedMenuContentHeight = (currentActions.length + (currentSubmenu ? 1 : 0)) * 48;
+ const estimatedMenuHeight = estimatedMenuContentHeight + (currentSubmenu ? 52 : 0);
+ const menuContentHeight = useSharedValue(estimatedMenuContentHeight);
+ const hasMeasuredMenuContent = useRef(false);
+
+ useEffect(() => {
+ if (menuContentHeight.value <= 0) {
+ menuContentHeight.value = estimatedMenuContentHeight;
+ }
+ }, [estimatedMenuContentHeight, menuContentHeight]);
+
+ const menuContentAnimatedStyle = useAnimatedStyle(() => ({
+ height: menuContentHeight.value,
+ }));
+ const handleMenuContentLayout = useCallback((e: { nativeEvent: { layout: { height: number } } }) => {
+ const nextHeight = Math.ceil(e.nativeEvent.layout.height);
+ if (!hasMeasuredMenuContent.current) {
+ menuContentHeight.value = nextHeight;
+ hasMeasuredMenuContent.current = true;
+ return;
+ }
+ if (Math.abs(menuContentHeight.value - nextHeight) > 0.5) {
+ menuContentHeight.value = withSpring(nextHeight, { duration: 180 });
+ }
+ }, [menuContentHeight]);
+
+ const theme = useTheme();
+
+ return (
+ {
+ if (!modalVisible) {
+ e.stopPropagation();
+ open();
+ }
+ }}
+ >
+ {children}
+
+
+ {modalVisible && (
+
+ {
+ const { width, height } = e.nativeEvent.layout;
+ setMenuSize({ width, height });
+ }}
+ style={[
+ styles.menu,
+ getMenuPosition(),
+ {
+ backgroundColor: theme.colors.item,
+ width: menuWidth,
+ transformOrigin: side === "left" ? "top left" : "top right",
+ },
+ ]}
+ >
+
+
+
+ {currentSubmenu && (
+
+
+
+
+ {currentSubmenu.title}
+
+
+
+ )}
+ {currentActions.map((action, index) => (
+
+
+
+
+
+ )}
+
+
+ );
+}
+
+const styles = StyleSheet.create({
+ backdrop: {
+ flex: 1,
+ backgroundColor: "rgba(0,0,0,0.0)",
+ },
+ container: {
+ position: "absolute",
+ top: 0,
+ left: 0,
+ right: 0,
+ bottom: 0,
+ justifyContent: "center",
+ alignItems: "center",
+ padding: 16
+ },
+ menu: {
+ borderRadius: 16,
+ shadowColor: "#000",
+ shadowOffset: { width: 0, height: 4 },
+ shadowOpacity: 0.15,
+ shadowRadius: 12,
+ elevation: 8,
+ overflow: "hidden",
+ maxWidth: 250,
+ },
+ menuContent: {
+ overflow: "hidden",
+ },
+ menuContentInner: {},
+ header: {
+ paddingVertical: 10,
+ paddingHorizontal: 14,
+ borderBottomWidth: 0.5,
+ overflow: "hidden"
+ },
+ back: {
+ fontSize: 16,
+ fontWeight: "600",
+ lineHeight: 20,
+ },
+ itemContainer: {
+ borderRadius: 0,
+ overflow: "hidden",
+ },
+ item: {
+ minHeight: 48,
+ paddingVertical: 12,
+ paddingHorizontal: 16,
+ borderRadius: 0,
+ },
+ itemSelected: {
+ backgroundColor: "rgba(0,102,204,0.12)",
+ },
+ itemContent: {
+ flex: 1,
+ marginRight: 10,
+ },
+ itemTitle: {
+ fontSize: 16,
+ },
+ itemSubtitle: {
+ fontSize: 13,
+ marginTop: 2,
+ },
+ arrow: {
+ alignSelf: "center",
+ opacity: 0.7,
+ marginLeft: 4,
+ },
+ check: {
+ alignSelf: "center",
+ marginLeft: 6,
+ },
+ headerIcon: {
+ alignSelf: "center"
+ },
+ disabled: {
+ opacity: 0.4,
+ },
+});
diff --git a/ui/components/AlertProvider.tsx b/ui/components/AlertProvider.tsx
index 2d309ac9..a3b4f82e 100644
--- a/ui/components/AlertProvider.tsx
+++ b/ui/components/AlertProvider.tsx
@@ -12,6 +12,7 @@ import React, {
} from "react";
import {
KeyboardAvoidingView,
+ Platform,
Pressable,
StyleSheet,
} from "react-native";
@@ -27,7 +28,11 @@ import { useTheme } from "@react-navigation/native";
import { useRouter } from "expo-router";
import { PapillonAppearIn, PapillonAppearOut } from "../utils/Transition";
-import Typography from "./Typography";
+import Typography from "../new/Typography";
+import { runsIOS26 } from "../utils/IsLiquidGlass";
+import { LiquidGlassView } from "@sbaiahmed1/react-native-blur";
+import { Papicons } from "@getpapillon/papicons";
+import Icon from "./Icon";
// Extend Alert type with unique ID for better performance
export type Alert = {
@@ -102,7 +107,8 @@ export const AlertProvider = ({ children }: { children: ReactNode }) => {
bottom: alerts.some(alert => alert.withoutNavbar) ? 22 : 82,
left: 0,
right: 0,
- padding: 14,
+ padding: Platform.OS === "ios" ? 20 : 10,
+ paddingBottom: Platform.OS === "ios" ? 10 : 28,
zIndex: 1000,
gap: 10,
}), [alerts]);
@@ -158,7 +164,15 @@ export const AlertProvider = ({ children }: { children: ReactNode }) => {
{alerts.length > 0 && (
@@ -189,17 +203,17 @@ const AlertComponent = React.memo(({ alert, onPress }: { alert: Alert, onPress?:
if (!alert.icon) {
return null;
}
- return LucideIcons[alert.icon as keyof typeof LucideIcons] as ComponentType;
+ return ;
}, [alert.icon]);
// Memoized styles for better performance
const containerStyle = useMemo(() => [
styles.alertContainer,
{
- backgroundColor: colors.card,
+ backgroundColor: colors.item,
borderColor: colors.text + "30",
},
- ], [colors.card, colors.text]);
+ ], [colors.item, colors.text]);
const iconColor = useMemo(() => alert.color ?? colors.text, [alert.color, colors.text]);
@@ -209,6 +223,54 @@ const AlertComponent = React.memo(({ alert, onPress }: { alert: Alert, onPress?:
}
}, [onPress]);
+ if(runsIOS26) {
+ // For iOS 26, return a simpler alert without animations for better performance
+ return (
+
+
+
+ {IconComponent && (
+
+
+ {IconComponent}
+
+
+ )}
+
+ {alert.title}
+ {alert.message && (
+ {alert.message}
+ )}
+
+
+
+
+ );
+ }
+
return (
{IconComponent && (
-
+
+ {IconComponent}
+
)}
{alert.title}
{alert.message && (
{alert.message}
)}
@@ -252,7 +313,7 @@ const styles = StyleSheet.create({
alignItems: "center",
paddingHorizontal: 16,
paddingVertical: 10,
- borderRadius: 16,
+ borderRadius: Platform.OS === "ios" ? 0 : 14,
borderCurve: "continuous",
gap: 16,
shadowColor: "#000",
diff --git a/ui/components/AnimatedPressable.tsx b/ui/components/AnimatedPressable.tsx
index c0df4b41..b960cb43 100644
--- a/ui/components/AnimatedPressable.tsx
+++ b/ui/components/AnimatedPressable.tsx
@@ -1,4 +1,4 @@
-import React, { useCallback, useMemo, useRef } from "react";
+import React, { useCallback, useContext, useMemo, useRef } from "react";
import { Platform, PressableProps } from "react-native";
import Reanimated, {
LinearTransition,
@@ -9,6 +9,7 @@ import Reanimated, {
import * as ExpoHaptics from "expo-haptics";
import { Animation } from "../utils/Animation";
import { Pressable, TapGestureHandler } from "react-native-gesture-handler";
+import { ListTouchableBlockPressContext } from "../new/ListTouchableContext";
const ReanimatedPressable = Reanimated.createAnimatedComponent(Pressable);
@@ -35,6 +36,7 @@ function AnimatedPressable({
onPress,
...props
}: AnimatedPressableProps) {
+ const blockParentListTouchablePress = useContext(ListTouchableBlockPressContext);
const scale = useSharedValue(1);
const opacity = useSharedValue(1);
@@ -52,6 +54,7 @@ function AnimatedPressable({
const handlePressIn = useCallback(
(e: any) => {
+ blockParentListTouchablePress?.block();
if (hapticFeedback) {
ExpoHaptics.impactAsync(hapticFeedback);
}
@@ -59,16 +62,17 @@ function AnimatedPressable({
opacity.value = withSpring(opacityTo, SPRING_IN_CONFIG);
pressInRef.current?.(e);
},
- [hapticFeedback, scaleTo, opacityTo, scale, opacity]
+ [blockParentListTouchablePress, hapticFeedback, scaleTo, opacityTo, scale, opacity]
);
const handlePressOut = useCallback(
(e: any) => {
+ blockParentListTouchablePress?.unblock();
scale.value = withSpring(1, SPRING_OUT_CONFIG);
opacity.value = withSpring(1, SPRING_OUT_CONFIG);
pressOutRef.current?.(e);
},
- [scale, opacity]
+ [blockParentListTouchablePress, scale, opacity]
);
const handleOnActivated = useCallback((e) => {
@@ -101,4 +105,4 @@ function AnimatedPressable({
);
}
-export default React.memo(AnimatedPressable);
\ No newline at end of file
+export default React.memo(AnimatedPressable);
diff --git a/ui/components/ChipButton.tsx b/ui/components/ChipButton.tsx
index b2cb2a54..0b7450be 100644
--- a/ui/components/ChipButton.tsx
+++ b/ui/components/ChipButton.tsx
@@ -3,7 +3,7 @@ import { MenuAction, MenuView } from '@react-native-menu/menu';
import { useTheme } from "@react-navigation/native";
import { LiquidGlassView } from '@sbaiahmed1/react-native-blur';
import React from "react";
-import { Pressable, TouchableOpacity } from "react-native";
+import { Platform, Pressable, TouchableNativeFeedback, TouchableOpacity, View } from "react-native";
import { runsIOS26 } from "../utils/IsLiquidGlass";
import { PapillonAppearIn, PapillonAppearOut } from "../utils/Transition";
@@ -11,6 +11,7 @@ import { Dynamic } from "./Dynamic";
import Icon from "./Icon";
import Stack from "./Stack";
import Typography from "./Typography";
+import ActionMenu from "./ActionMenu";
const ChipButton: React.FC void;
@@ -18,8 +19,12 @@ const ChipButton: React.FC void;
single?: boolean;
+ large?: boolean;
actions?: MenuAction[];
-}>> = ({ onPress, icon, children, chevron, onPressAction, single, actions = [] }) => {
+ tintColor?: string;
+ iconColor?: string;
+ glassOpacity?: number;
+}>> = ({ onPress, icon, children, chevron, onPressAction, single, large, actions = [], tintColor, iconColor, glassOpacity = 0 }) => {
const { colors } = useTheme()
if (runsIOS26) {
@@ -27,27 +32,30 @@ const ChipButton: React.FC
-
-
+
+
{icon &&
-
+
@@ -69,19 +77,22 @@ const ChipButton: React.FC
}
-
+
);
}
return (
-
-
+
{icon &&
@@ -119,10 +133,30 @@ const ChipButton: React.FC
}
-
-
+
+
);
}
+const FallBackTouchable = ({ ...props }: React.ComponentProps) => {
+ if(Platform.OS === 'android') {
+ return (
+
+
+ {props.children}
+
+
+ );
+ }
+
+ return (
+
+ )
+}
+
export default ChipButton;
\ No newline at end of file
diff --git a/ui/components/CompactGrade.tsx b/ui/components/CompactGrade.tsx
index 51ff52e4..87f978f3 100644
--- a/ui/components/CompactGrade.tsx
+++ b/ui/components/CompactGrade.tsx
@@ -2,7 +2,7 @@ import { Papicons } from "@getpapillon/papicons";
import { useTheme } from "@react-navigation/native";
import { LinearGradient } from "expo-linear-gradient";
import { t } from "i18next";
-import { Text, View } from "react-native";
+import { Platform, Text, View } from "react-native";
import SkeletonView from "@/ui/components/SkeletonView";
import adjust from "@/utils/adjustColor";
@@ -11,6 +11,7 @@ import i18n from "@/utils/i18n";
import AnimatedPressable from "./AnimatedPressable";
import Stack from "./Stack";
import Typography from "./Typography";
+import { ListTouchable } from "../new/List";
interface CompactGradeProps {
emoji: string;
@@ -51,119 +52,138 @@ export const CompactGrade = ({
const trailingForeground = hasMaxScore ? "#FFFFFF" : trailingBase;
return (
-
-
-
-
- {skeleton ? (
-
- ) : (
-
-
- {emoji}
-
-
+ {Platform.OS !== 'android' && (
+
)}
-
- {title &&
-
- {capitalizeWords(title)}
-
- }
- {date &&
-
- {date.toLocaleDateString(i18n.language, {
- day: "2-digit",
- month: "short",
- })}
-
- }
-
-
-
- {description ? description : t('Grade_NoDescription', { subject: title })}
-
+
+
+ {skeleton ? (
+
+ ) : (
+
+
+ {emoji}
+
+
+ )}
-
- {disabled ? (
- <>
-
- {status}
+
+ {title &&
+
+ {capitalizeWords(title)}
- >
- ) : (
- <>
-
- {score.toFixed(2)}
+ }
+ {date &&
+
+ {date.toLocaleDateString(i18n.language, {
+ day: "2-digit",
+ month: "short",
+ })}
- >
- )}
-
- /{outOf}
-
+ }
+
+
+
+ {description ? description : t('Grade_NoDescription', { subject: title })}
+
- {hasMaxScore && (
-
- )}
-
-
-
+
+ {disabled ? (
+ <>
+
+ {status}
+
+ >
+ ) : (
+ <>
+
+ {score.toFixed(2)}
+
+ >
+ )}
+
+ /{outOf}
+
+
+ {hasMaxScore && (
+
+ )}
+
+
+
+
+
);
};
diff --git a/ui/components/ContainedNumber.tsx b/ui/components/ContainedNumber.tsx
index aca33531..72ad2bf3 100644
--- a/ui/components/ContainedNumber.tsx
+++ b/ui/components/ContainedNumber.tsx
@@ -1,6 +1,7 @@
import React from 'react';
import { View } from 'react-native';
import Typography from './Typography';
+import { useTheme } from '@react-navigation/native';
interface ContainedNumberProps {
children?: React.ReactNode;
@@ -9,10 +10,13 @@ interface ContainedNumberProps {
}
const ContainedNumber: React.FC = ({ denominator, color, children, ...rest }) => {
+ const theme = useTheme();
+ const finalColor = color || theme.colors.tint;
+
return (
= ({ denominator, color, c
gap: 2,
flexDirection: 'row',
alignItems: 'flex-end',
- borderColor: color + '46',
+ borderColor: finalColor + '46',
borderWidth: 0,
minWidth: 50,
justifyContent: "center"
}}
>
{children && (
-
+
{children}
)}
{denominator && (
-
+
{denominator}
)}
diff --git a/ui/components/Course.tsx b/ui/components/Course.tsx
index bd4dea80..b8cd0d19 100644
--- a/ui/components/Course.tsx
+++ b/ui/components/Course.tsx
@@ -4,7 +4,7 @@ import { LinearGradient } from "expo-linear-gradient";
import { LucideIcon } from "lucide-react-native";
import React, { useCallback, useState } from "react";
import { useTranslation } from "react-i18next";
-import { StyleProp, StyleSheet, View, ViewStyle } from "react-native";
+import { Platform, StyleProp, StyleSheet, View, ViewStyle } from "react-native";
import adjust from "@/utils/adjustColor";
import i18n from "@/utils/i18n";
@@ -14,6 +14,7 @@ import AnimatedPressable from "./AnimatedPressable";
import Icon from "./Icon";
import Stack from "./Stack";
import Typography from "./Typography";
+import { ListTouchable } from "../new/List";
type Variant = "primary" | "separator";
@@ -171,7 +172,15 @@ const Course = React.memo((props: CourseProps) => {
const message = t(messageKeys[timeKey][taps]);
return (
-
+ increaseTaps()}
style={{
flex: 1,
@@ -185,7 +194,7 @@ const Course = React.memo((props: CourseProps) => {
vAlign="start"
gap={8}
hAlign="center"
- style={{ flex: 1, backgroundColor: colors.card }}
+ style={{ flex: 1, backgroundColor: colors.item }}
>
{hStart < 11 ? : hStart < 14 ? : }
@@ -197,7 +206,8 @@ const Course = React.memo((props: CourseProps) => {
{formatDuration(duration)}
-
+
+
)
}, [colors.card, colors.text, duration, hStart, skeleton]);
@@ -252,7 +262,7 @@ const Course = React.memo((props: CourseProps) => {
styles.container,
compact && styles.compactContainer,
{
- borderWidth: 1,
+ borderWidth: Platform.OS === "android" ? 0 : 1,
borderColor: adjust(color, dark ? 0.7 : -0.7) + "36",
},
status?.canceled && { backgroundColor: colors.card },
@@ -260,7 +270,7 @@ const Course = React.memo((props: CourseProps) => {
containerStyle && StyleSheet.flatten(containerStyle),
]}
>
- {color && !status?.canceled && (
+ {color && !status?.canceled && Platform.OS !== "android" && (
{
right: 0,
bottom: 0,
borderRadius: compact ? 18 : 25,
- opacity: 0.55,
+ opacity: 0.7,
+ }}
+ />
+ )}
+
+ {color && !status?.canceled && Platform.OS == "android" && (
+
)}
@@ -338,7 +363,7 @@ const Course = React.memo((props: CourseProps) => {
)}
-
+
{formatDuration(duration)}
@@ -350,16 +375,21 @@ const Course = React.memo((props: CourseProps) => {
/** Cours principale */
const renderCourseCard = useCallback(() => (
-
-
+
+
{
{renderContent()}
-
+
), [color, compact, dark, onPress, renderContent, renderStatus, skeleton, status, colors.border]);
diff --git a/ui/components/NativeHeader.tsx b/ui/components/NativeHeader.tsx
index 8dcc4ee7..91b5406f 100644
--- a/ui/components/NativeHeader.tsx
+++ b/ui/components/NativeHeader.tsx
@@ -80,7 +80,7 @@ const getBackgroundColor = (color: string) => {
};
// Default color constant
-const DEFAULT_COLOR = "#29947A";
+const DEFAULT_COLOR = "29947A";
const DEFAULT_BACKGROUND_COLOR = getBackgroundColor(DEFAULT_COLOR);
interface NativeSideProps extends ViewProps {
@@ -262,19 +262,21 @@ interface NativeHeaderHighlightProps extends ViewProps {
const NativeHeaderHighlight = React.memo(function NativeHeaderHighlight({
children,
- color = DEFAULT_COLOR,
+ color,
light = false,
variant = "navigation",
style,
...props
}: NativeHeaderHighlightProps) {
+ const theme = useTheme();
+ if (!color) {
+ color = theme.colors.primary;
+ }
// Use cached background color
- const backgroundColor = light ? 'transparent' : color === DEFAULT_COLOR ? DEFAULT_BACKGROUND_COLOR : getBackgroundColor(color);
+ const backgroundColor = light ? 'transparent' : getBackgroundColor(color);
// Pre-compute style array once
const viewStyle = style ? [styles.highlight, { backgroundColor }, style, light ? { padding: 0 } : {}] : [styles.highlight, { backgroundColor }, { borderRadius: light ? 0 : styles.highlight.borderRadius }, light ? { padding: 0 } : {}];
-
- const theme = useTheme();
const adjustedColor = adjust(color, theme.dark ? 0.2 : -0.2);
return (
diff --git a/ui/components/Picker.tsx b/ui/components/Picker.tsx
new file mode 100644
index 00000000..fdb63e24
--- /dev/null
+++ b/ui/components/Picker.tsx
@@ -0,0 +1,79 @@
+import { Platform, Switch, TouchableOpacity, View } from "react-native"
+import { useState } from "react";
+import ActionMenu from "./ActionMenu";
+import Typography from "../new/Typography";
+import { ListTouchable } from "../new/List";
+import { LiquidGlassView } from "@sbaiahmed1/react-native-blur";
+import { Papicons } from "@getpapillon/papicons";
+import { useTheme } from "@react-navigation/native";
+
+type PickerProps = {
+ options: string[]
+ selectedIndex: number
+ onValueChange: (index: number) => void
+ disabled?: boolean
+}
+
+const Picker: React.FC = ({ options, selectedIndex, onValueChange, disabled }) => {
+ const theme = useTheme();
+
+ return (
+
+
+ ({
+ id: option,
+ title: option,
+ onPress: () => onValueChange(index),
+ state: index === selectedIndex ? "on" : "off",
+ }))}
+ onPressAction={(e: NativeActionEvent) => {
+ const index = options.findIndex(option => option === e.nativeEvent.event);
+ if(index !== -1) {
+ onValueChange(index);
+ }
+ }}
+ >
+
+
+ {options[selectedIndex]}
+
+
+
+
+
+
+ )
+}
+
+const PickerContainer: React.FC<{ children: React.ReactNode }> = (props) => {
+ if(Platform.OS === "android") {
+ return (
+
+ {props.children}
+
+ )
+ }
+
+ return (
+
+ {props.children}
+
+ )
+}
+
+export default Picker
\ No newline at end of file
diff --git a/ui/components/Search.tsx b/ui/components/Search.tsx
index e3f35b8b..7baccbd4 100644
--- a/ui/components/Search.tsx
+++ b/ui/components/Search.tsx
@@ -30,7 +30,7 @@ const SearchContainer = ({ children, style }: { children: React.ReactNode, style
style={[{
width: Dimensions.get("window").width - 32,
borderRadius: 300,
- backgroundColor: colors.text + "16",
+ backgroundColor: Platform.OS === 'ios' ? colors.text + "16" : colors.item,
}, style]}
>
{children}
diff --git a/ui/components/Stack.tsx b/ui/components/Stack.tsx
index c923948b..2ef141f5 100644
--- a/ui/components/Stack.tsx
+++ b/ui/components/Stack.tsx
@@ -1,6 +1,6 @@
import { useTheme } from "@react-navigation/native";
import React from "react";
-import { FlexAlignType, StyleProp, StyleSheet, ViewProps, ViewStyle } from "react-native";
+import { FlexAlignType, Platform, StyleProp, StyleSheet, ViewProps, ViewStyle } from "react-native";
import Reanimated, { LinearTransition } from "react-native-reanimated";
import { Animation } from "../utils/Animation";
@@ -154,12 +154,11 @@ const Stack: React.FC = ({
dynamicStyle.shadowOffset = { width: 0, height: 0 };
dynamicStyle.shadowOpacity = flat ? 0 : 0.16;
dynamicStyle.shadowRadius = 1.5;
- dynamicStyle.elevation = 1;
}
dynamicStyle.overflow = "visible"; // Ensure shadows are visible
dynamicStyle.borderColor = colors.text + "25";
- dynamicStyle.borderWidth = (bordered !== undefined && bordered === false) ? 0 : (flat ? 1 : 0.5);
- dynamicStyle.backgroundColor = backgroundColor || colors.card; // Default to theme background
+ dynamicStyle.borderWidth = Platform.OS === 'android' ? 0 : (bordered !== undefined && bordered === false) ? 0 : (flat ? 1 : 0.5);
+ dynamicStyle.backgroundColor = backgroundColor || colors.item; // Default to theme background
}
if (bordered) {
diff --git a/ui/components/TabHeader.tsx b/ui/components/TabHeader.tsx
index 9c659d79..1b0739d8 100644
--- a/ui/components/TabHeader.tsx
+++ b/ui/components/TabHeader.tsx
@@ -8,6 +8,7 @@ import { useSafeAreaInsets } from 'react-native-safe-area-context';
import { runsIOS26 } from '../utils/IsLiquidGlass';
import { TabHeaderTitleProps } from './TabHeaderTitle';
+import AndroidBackButton from '@/utils/theme/AndroidBackButton';
interface TabHeaderProps {
@@ -17,6 +18,8 @@ interface TabHeaderProps {
bottom?: React.ReactElement,
shouldCollapseHeader?: boolean,
modal?: boolean,
+ backgroundColor?: string,
+ showAndroidBackButton?: boolean,
};
const TabHeader: React.FC = ({
@@ -26,12 +29,15 @@ const TabHeader: React.FC = ({
bottom,
shouldCollapseHeader,
modal,
+ backgroundColor,
+ showAndroidBackButton,
}) => {
+ const isModal = Platform.OS === 'ios' ? modal : false;
const theme = useTheme();
const colors = theme.colors;
const insets = useSafeAreaInsets();
const [height, setHeight] = React.useState(0);
- const usedInsets = modal ? 16 : insets.top;
+ const usedInsets = isModal ? 16 : insets.top;
useEffect(() => {
onHeightChanged(height + (Platform.OS === 'android' ? 6 : 0));
@@ -41,7 +47,7 @@ const TabHeader: React.FC = ({
<>
= ({
height: height,
zIndex: 99,
overflow: Platform.OS === 'android' ? 'visible' : 'hidden',
- elevation: 2,
+ elevation: 0,
}]}
pointerEvents={'none'}
>
@@ -96,14 +102,22 @@ const TabHeader: React.FC = ({
style={{
flex: 1,
flexDirection: 'row',
- gap: 16,
+ gap: 8,
paddingHorizontal: 16,
- paddingLeft: modal ? 24 : 16,
+ paddingLeft: isModal ? 24 : 16,
height: 40,
alignItems: 'center',
justifyContent: 'center',
}}
>
+ {showAndroidBackButton && Platform.OS === 'android' && (
+
+
+
+ )}
+
{title}
void;
onPress: () => void;
}
-const Task: React.FC = ({
- subject,
- emoji,
- title,
- color,
- description,
- date,
- completed,
- hasAttachments,
- magic,
- onToggle,
- onPress
-}) => {
- const theme = useTheme();
- const tintedColor = adjust(color, theme.dark ? 0.3 : -0.3);
-
- function formatDistanceDay(date: Date): string {
+export function formatDistanceDay(date: Date): string {
// if yesterday, today or tomorrow
const today = new Date();
const yesterday = new Date(today);
@@ -68,22 +54,40 @@ const Task: React.FC = ({
return formatDistanceToNow(date, { addSuffix: true, locale: DateLocale[i18n.language as keyof typeof DateLocale] || DateLocale.enUS })
}
+const Task: React.FC = ({
+ subject,
+ emoji,
+ title,
+ color,
+ description,
+ date,
+ completed,
+ hasAttachments,
+ isCustom = false,
+ magic,
+ onToggle,
+ onPress
+}) => {
+ const theme = useTheme();
+ const tintedColor = adjust(color, theme.dark ? 0.3 : -0.3);
+
return (
-
-
+
+
-
+ /> )}
{/* Subejct */}
@@ -103,6 +107,11 @@ const Task: React.FC = ({
)}
+ {isCustom && (
+
+
+
+ )}
{/* Date */}
@@ -141,8 +150,8 @@ const Task: React.FC = ({
)}
-
-
+
+
= ({
}
-
+
-
+
);
};
diff --git a/ui/native/NativeSwitch.tsx b/ui/native/NativeSwitch.tsx
new file mode 100644
index 00000000..1972bf5d
--- /dev/null
+++ b/ui/native/NativeSwitch.tsx
@@ -0,0 +1,33 @@
+import { Platform, Switch, View } from "react-native"
+import { Host, Switch as AndroidSwitch } from '@expo/ui/jetpack-compose';
+
+type NativeSwitchProps = {
+ value: boolean
+ onValueChange: (value: boolean) => void
+ disabled?: boolean
+}
+
+const NativeSwitch: React.FC = ({ value, onValueChange, disabled }) => {
+ if(Platform.OS === "android") {
+ return (
+
+
+
+
+
+ )
+ }
+
+ return (
+
+ )
+}
+
+export default NativeSwitch
\ No newline at end of file
diff --git a/ui/new/List.tsx b/ui/new/List.tsx
index b5e41fdf..45a7233c 100644
--- a/ui/new/List.tsx
+++ b/ui/new/List.tsx
@@ -1,137 +1,616 @@
import { useTheme } from "@react-navigation/native";
-import React, { useMemo } from "react";
-import { FlatList, StyleSheet, TouchableOpacity, View } from "react-native";
-import Reanimated, { LinearTransition } from 'react-native-reanimated';
+import { FlashList } from "@shopify/flash-list";
+import React, { useCallback, useContext, useEffect, useMemo, useRef, useState } from "react";
+import { Platform, StyleSheet, TouchableNativeFeedback, TouchableOpacity, View } from "react-native";
+import Reanimated, { createAnimatedComponent, LinearTransition } from 'react-native-reanimated';
import { Animation } from "../utils/Animation";
import { PapillonAppearIn, PapillonAppearOut } from "../utils/Transition";
+import Typography from "./Typography";
+import { LegendList } from "@legendapp/list";
-// 1. Define markers outside the main component
-// 2. Add a static property for stable identification
-const Item: React.FC<{ id?: string, animated?: boolean, onPress?: () => void, containerStyle?: any, style?: any, entering?: any, exiting?: any }> = ({ children }) => children;
+type MarkerProps = {
+ children?: React.ReactNode;
+};
+
+type ListItemProps = MarkerProps & {
+ id?: string;
+ animated?: boolean;
+ onPress?: () => void;
+ containerStyle?: any;
+ style?: any;
+ entering?: any;
+ exiting?: any;
+};
+
+type ListViewProps = MarkerProps & {
+ id?: string;
+ style?: any;
+};
+
+type ListRuntimeItemContext = {
+ renderItem: (props: ListItemProps) => React.ReactNode;
+} | null;
+
+const ListRuntimeItemContext = React.createContext(null);
+
+const isType = (child, component, name) => {
+ return child?.type && (child.type === component || child.type.displayName === name);
+};
+
+const getComponentTypeName = (type: any) => {
+ return type?.displayName || type?.name || type?.type?.displayName || type?.type?.name || "";
+};
+
+const shouldApplyDefaultLeadingOpacity = (node: React.ReactNode) => {
+ if (!React.isValidElement(node)) {
+ return false;
+ }
+ const typeName = getComponentTypeName(node.type);
+ if (typeName === "Icon") {
+ return true;
+ }
+ return typeof typeName === "string" && typeName.toLowerCase().includes("papicon");
+};
+
+const withDefaultLeadingOpacity = (node: React.ReactNode): React.ReactNode => {
+ if (Platform.OS !== "ios" || node == null) {
+ return node;
+ }
+
+ if (Array.isArray(node)) {
+ return node.map((child) => withDefaultLeadingOpacity(child));
+ }
+
+ if (!React.isValidElement(node)) {
+ return node;
+ }
+
+ if (node.type === React.Fragment) {
+ return React.cloneElement(node, {
+ children: React.Children.map(node.props.children, (child) => withDefaultLeadingOpacity(child)),
+ });
+ }
+
+ if (node.props?.opacity !== undefined || !shouldApplyDefaultLeadingOpacity(node)) {
+ return node;
+ }
+
+ return React.cloneElement(node, { opacity: 0.6 });
+};
+
+const splitItemChildren = (children: React.ReactNode) => {
+ let leading = null;
+ let trailing = null;
+ const main = [];
+
+ React.Children.forEach(children, (child) => {
+ if (!child) {
+ return;
+ }
+
+ const type = child.type;
+ if (type === Leading || type?.displayName === "List.Leading") {
+ leading = withDefaultLeadingOpacity(child.props.children);
+ } else if (type === Trailing || type?.displayName === "List.Trailing") {
+ trailing = child.props.children;
+ } else {
+ main.push(child);
+ }
+ });
+
+ return { leading, trailing, main };
+};
+
+const renderListRow = ({
+ itemProps,
+ leading,
+ trailing,
+ main,
+ isFirst,
+ isLast,
+ gapBefore = 0,
+ listAnimated,
+ colors,
+}) => {
+ const ItemComponent = listAnimated ? Reanimated.View : View;
+ const entering = itemProps.entering ?? (itemProps.animated ? PapillonAppearIn : undefined);
+ const exiting = itemProps.exiting ?? (itemProps.animated ? PapillonAppearOut : undefined);
+
+ return (
+
+
+
+ {leading && {leading}}
+ {main}
+ {trailing && {trailing}}
+
+
+
+ );
+};
+
+const Item: React.FC = (props) => {
+ const runtimeContext = useContext(ListRuntimeItemContext);
+ if (runtimeContext) {
+ return runtimeContext.renderItem(props);
+ }
+ return props.children;
+};
Item.displayName = "List.Item";
-const Leading = ({ children }) => children;
+const Leading: React.FC = ({ children }) => children;
Leading.displayName = "List.Leading";
-const Trailing = ({ children }) => children;
+const Trailing: React.FC = ({ children }) => children;
Trailing.displayName = "List.Trailing";
-const List = ({ children, animated = false, ...rest }) => {
+const Section: React.FC = ({ children }) => children;
+Section.displayName = "List.Section";
+
+const SectionTitle: React.FC = ({ children }) => children;
+SectionTitle.displayName = "List.SectionTitle";
+
+const Label: React.FC = ({ children }) => children;
+Label.displayName = "List.Label";
+
+const ViewItem: React.FC = ({ children }) => children;
+ViewItem.displayName = "List.View";
+
+const RawRuntimeItem: React.FC<{
+ index: number;
+ total: number;
+ itemProps: ListItemProps;
+ animated: boolean;
+ colors: any;
+}> = ({ index, total, itemProps, animated, colors }) => {
+ const parsed = splitItemChildren(itemProps.children);
+ return renderListRow({
+ itemProps,
+ leading: parsed.leading,
+ trailing: parsed.trailing,
+ main: parsed.main,
+ isFirst: index === 0,
+ isLast: total > 0 ? index === total - 1 : false,
+ listAnimated: animated,
+ colors,
+ });
+};
+
+const RawRuntimeRenderer: React.FC<{
+ item: any;
+ animated: boolean;
+ colors: any;
+}> = ({ item, animated, colors }) => {
+ const indexCursorRef = useRef(0);
+ const countRef = useRef(0);
+ const [count, setCount] = useState(0);
+
+ indexCursorRef.current = 0;
+
+ const runtimeValue = useMemo(() => ({
+ renderItem: (itemProps: ListItemProps) => {
+ const index = indexCursorRef.current;
+ indexCursorRef.current += 1;
+ return (
+
+ );
+ },
+ }), [animated, colors, count]);
+
+ useEffect(() => {
+ if (countRef.current !== indexCursorRef.current) {
+ countRef.current = indexCursorRef.current;
+ if (count !== countRef.current) {
+ setCount(countRef.current);
+ }
+ }
+ });
+
+ return (
+
+
+ {item.rawItem}
+
+
+ );
+};
+
+const MemoizedRawRuntimeRenderer = React.memo(RawRuntimeRenderer);
+
+const List = ({ children, animated = false, gap = 12, ...rest }) => {
const theme = useTheme();
const { colors } = theme;
const data = useMemo(() => {
- return React.Children.toArray(children)
- .filter((child) => {
- // Use displayName or a custom property for comparison
- // This is much more stable during hot reloads than reference equality
- return child.type && (child.type === Item || child.type.displayName === "List.Item");
- })
- .map((item, index) => {
- let leading = null;
- let trailing = null;
- const main = [];
-
- React.Children.forEach(item.props.children, (child) => {
- if (!child) { return; }
-
- // Check against the stable displayName
- const type = child.type;
- if (type === Leading || type?.displayName === "List.Leading") {
- leading = child.props.children;
- } else if (type === Trailing || type?.displayName === "List.Trailing") {
- trailing = child.props.children;
- } else {
- main.push(child);
+ const parseItem = (item, index) => {
+ const { leading, trailing, main } = splitItemChildren(item.props.children);
+
+ return {
+ kind: "item",
+ id: item.props.id || `item-${index}`,
+ leading,
+ trailing,
+ main,
+ itemProps: item.props,
+ };
+ };
+
+ const parseRawItem = (rawItem, index) => {
+ return {
+ kind: "raw",
+ id: rawItem?.props?.id || rawItem?.key?.toString?.() || `raw-${index}`,
+ rawItem,
+ };
+ };
+
+ const parseSectionTitle = (sectionTitle, index, sectionId = null) => {
+ let label = null;
+ const main = [];
+
+ React.Children.forEach(sectionTitle.props.children, (child) => {
+ if (!child) {
+ return;
+ }
+
+ const type = child.type;
+ if (type === Label || type?.displayName === "List.Label") {
+ label = child.props.children;
+ } else {
+ main.push(child);
+ }
+ });
+
+ return {
+ kind: "sectionTitle",
+ id: sectionTitle.props.id || `section-title-${index}`,
+ sectionId,
+ label,
+ main,
+ };
+ };
+
+ const parseViewItem = (viewItem, index, sectionId = null) => {
+ return {
+ kind: "view",
+ id: viewItem.props.id || `view-${index}`,
+ sectionId,
+ viewProps: viewItem.props,
+ main: viewItem.props.children,
+ };
+ };
+
+ const withSectionFlags = (items, sectionId) => {
+ return items.map((item, index) => ({
+ ...item,
+ sectionId,
+ isFirstInSection: index === 0,
+ isLastInSection: index === items.length - 1,
+ }));
+ };
+
+ const output = [];
+ const topLevel = React.Children.toArray(children).filter(Boolean);
+ let implicitItems = [];
+ let implicitSectionId = null;
+
+ const flushImplicit = () => {
+ if (!implicitItems.length || !implicitSectionId) {
+ implicitItems = [];
+ implicitSectionId = null;
+ return;
+ }
+ output.push(...withSectionFlags(implicitItems, implicitSectionId));
+ implicitItems = [];
+ implicitSectionId = null;
+ };
+
+ topLevel.forEach((child, index) => {
+ if (isType(child, SectionTitle, "List.SectionTitle")) {
+ flushImplicit();
+ output.push(parseSectionTitle(child, index));
+ return;
+ }
+
+ if (isType(child, Section, "List.Section")) {
+ flushImplicit();
+ const sectionId = child.props?.id || `section-${index}`;
+ const sectionChildren = React.Children.toArray(child.props.children).filter(Boolean);
+ const sectionEntries = [];
+ let sectionItemCursor = 0;
+
+ sectionChildren.forEach((sectionChild, sectionChildIndex) => {
+ if (isType(sectionChild, SectionTitle, "List.SectionTitle")) {
+ sectionEntries.push(parseSectionTitle(sectionChild, `${index}-title-${sectionChildIndex}`, sectionId));
+ return;
+ }
+
+ if (isType(sectionChild, ViewItem, "List.View")) {
+ sectionEntries.push(parseViewItem(sectionChild, `${index}-view-${sectionChildIndex}`, sectionId));
+ return;
+ }
+
+ if (isType(sectionChild, Item, "List.Item")) {
+ sectionEntries.push(parseItem(sectionChild, `${index}-${sectionItemCursor}`));
+ sectionItemCursor += 1;
+ return;
+ }
+
+ sectionEntries.push(parseRawItem(sectionChild, `${index}-raw-${sectionChildIndex}`));
+ });
+
+ const sectionItems = sectionEntries.filter((entry) => entry.kind === "item" || entry.kind === "raw");
+ const sectionItemsWithFlags = withSectionFlags(sectionItems, sectionId);
+ let sectionItemIndex = 0;
+ const normalizedSectionEntries = sectionEntries.map((entry) => {
+ if (entry.kind !== "item" && entry.kind !== "raw") {
+ return entry;
}
+ const normalized = sectionItemsWithFlags[sectionItemIndex];
+ sectionItemIndex += 1;
+ return normalized;
});
- return {
- id: item.props.id || `item-${index}`,
- leading,
- trailing,
- main,
- itemProps: item.props,
- };
+ output.push(...normalizedSectionEntries);
+ return;
+ }
+
+ if (isType(child, ViewItem, "List.View")) {
+ flushImplicit();
+ output.push(parseViewItem(child, `${index}`));
+ return;
+ }
+
+ if (isType(child, Item, "List.Item")) {
+ if (!implicitSectionId) {
+ implicitSectionId = `section-implicit-${index}`;
+ }
+ implicitItems.push(parseItem(child, `${index}-${implicitItems.length}`));
+ return;
+ }
+
+ flushImplicit();
+ output.push({
+ ...parseRawItem(child, `${index}`),
+ sectionId: `section-raw-${index}`,
+ isFirstInSection: true,
+ isLastInSection: true,
});
- }, [children]);
+ });
+
+ flushImplicit();
+
+ return output.map((entry, index) => {
+ if (index === 0) {
+ return { ...entry, gapBefore: 0 };
+ }
+
+ const previous = output[index - 1];
+ if (entry.kind === "sectionTitle") {
+ return { ...entry, gapBefore: gap };
+ }
+
+ if (entry.kind === "view") {
+ return { ...entry, gapBefore: 0 };
+ }
+
+ if (entry.isFirstInSection && previous.kind === "sectionTitle") {
+ if (previous.sectionId === entry.sectionId) {
+ return { ...entry, gapBefore: 6 };
+ }
+ return { ...entry, gapBefore: 0 };
+ }
+
+ if (entry.isFirstInSection && previous.sectionId !== entry.sectionId) {
+ return { ...entry, gapBefore: gap };
+ }
+
+ return { ...entry, gapBefore: 0 };
+ });
+ }, [children, gap]);
+
+ const ListComponent = Reanimated.FlatList;
- const ListComponent = animated ? Reanimated.FlatList : FlatList;
- const ItemComponent = animated ? Reanimated.View : View;
+ const keyExtractor = useCallback((item) => item.id, []);
+
+ const renderItem = useCallback(({ item }) => {
+ if (item.kind === "sectionTitle") {
+ return (
+
+ {item.main}
+ {item.label && (
+
+ {item.label}
+
+ )}
+
+ );
+ }
+
+ if (item.kind === "view") {
+ return {item.main};
+ }
+
+ if (item.kind === "raw") {
+ return ;
+ }
+
+ return renderListRow({
+ itemProps: item.itemProps,
+ leading: item.leading,
+ trailing: item.trailing,
+ main: item.main,
+ isFirst: item.isFirstInSection,
+ isLast: item.isLastInSection,
+ gapBefore: item.gapBefore,
+ listAnimated: animated,
+ colors,
+ });
+ }, [animated, colors]);
+
+ const contentContainerStyle = useMemo(
+ () => [rest.contentContainerStyle, styles.listContentContainer],
+ [rest.contentContainerStyle],
+ );
+ const listStyle = useMemo(() => [rest.style, styles.list], [rest.style]);
+ const removeClippedSubviews = rest.removeClippedSubviews ?? Platform.OS === "android";
+ const initialNumToRender = rest.initialNumToRender ?? 10;
+ const maxToRenderPerBatch = rest.maxToRenderPerBatch ?? 10;
+ const updateCellsBatchingPeriod = rest.updateCellsBatchingPeriod ?? 16;
+ const windowSize = rest.windowSize ?? 10;
+ const estimatedItemSize = rest.estimatedItemSize ?? 74;
+ const nonAnimatedListPerfProps = animated ? null : { estimatedItemSize };
return (
item.id}
- renderItem={({ item, index }) => {
- const isFirst = index === 0;
- const isLast = index === data.length - 1;
-
- return (
-
- {
- item.itemProps.onPress?.();
- }}
- >
-
- {item.leading && {item.leading}}
- {item.main}
- {item.trailing && {item.trailing}}
-
-
-
- )
- }}
+ keyExtractor={keyExtractor}
+ renderItem={renderItem}
{...rest}
- contentContainerStyle={{
- ...rest.contentContainerStyle,
- gap: 0,
- overflow: "visible"
- }}
- style={{
- ...rest.style,
- overflow: "visible"
- }}
+ removeClippedSubviews={removeClippedSubviews}
+ initialNumToRender={initialNumToRender}
+ maxToRenderPerBatch={maxToRenderPerBatch}
+ updateCellsBatchingPeriod={updateCellsBatchingPeriod}
+ windowSize={windowSize}
+ {...nonAnimatedListPerfProps}
+ contentContainerStyle={contentContainerStyle}
+ style={listStyle}
/>
);
};
+export const ListTouchable = React.memo(({ ...props }) => {
+ const parentBlockPress = useContext(ListTouchableContext);
+ const blockOwnPressRef = useRef(false);
+ const theme = useTheme();
+ const hasOnPress = typeof props.onPress === "function";
+
+ const blockOwnPress = useCallback(() => {
+ blockOwnPressRef.current = true;
+ }, []);
+
+ const handlePress = useCallback((event) => {
+ if (blockOwnPressRef.current) {
+ blockOwnPressRef.current = false;
+ return;
+ }
+ props.onPress?.(event);
+ }, [props.onPress]);
+
+ if (!hasOnPress) {
+ return (
+
+ {props.children}
+
+ );
+ }
+
+ if (Platform.OS === "android") {
+ return (
+
+ {
+ parentBlockPress?.();
+ handlePress(event);
+ }}
+ >
+ {props.children}
+
+
+ );
+ }
+
+ return (
+
+ {
+ parentBlockPress?.();
+ handlePress(event);
+ }}
+ >
+ {props.children}
+
+
+ );
+});
+
+const ListTouchableContext = React.createContext(null);
+
List.Item = Item;
List.Leading = Leading;
List.Trailing = Trailing;
+List.Section = Section;
+List.SectionTitle = SectionTitle;
+List.Label = Label;
+List.View = ViewItem;
const styles = StyleSheet.create({
- row: { flexDirection: "row", alignItems: "center", paddingVertical: 14, paddingHorizontal: 16 },
+ rowContainer: {},
+ row: { flexDirection: "row", alignItems: "center", paddingVertical: Platform.OS === "android" ? 14 : 12, paddingHorizontal: 16 },
leading: { marginRight: 16 },
body: { flex: 1 },
trailing: { marginLeft: 16 },
+ sectionTitleContainer: { paddingHorizontal: Platform.OS === "android" ? 16 : 4, paddingVertical: 6, paddingBottom: Platform.OS === "android" ? 6 : 4, flexDirection: "row", alignItems: "center", gap: Platform.OS === "android" ? 10 : 8, marginRight: 6 },
first: {
borderTopLeftRadius: 20,
borderTopRightRadius: 20,
@@ -139,7 +618,14 @@ const styles = StyleSheet.create({
last: {
borderBottomLeftRadius: 20,
borderBottomRightRadius: 20,
- }
+ },
+ listContentContainer: {
+ gap: 0,
+ overflow: "visible",
+ },
+ list: {
+ overflow: "visible",
+ },
});
-export default List;
\ No newline at end of file
+export default List;
diff --git a/ui/new/ListTouchableContext.ts b/ui/new/ListTouchableContext.ts
new file mode 100644
index 00000000..735646e1
--- /dev/null
+++ b/ui/new/ListTouchableContext.ts
@@ -0,0 +1,8 @@
+import React from "react";
+
+export type ListTouchableBlockPressController = {
+ block: () => void;
+ unblock: () => void;
+};
+
+export const ListTouchableBlockPressContext = React.createContext(null);
diff --git a/ui/new/Typography.tsx b/ui/new/Typography.tsx
index 1e448420..99c70be8 100644
--- a/ui/new/Typography.tsx
+++ b/ui/new/Typography.tsx
@@ -1,6 +1,6 @@
import { useTheme } from "@react-navigation/native";
import React from "react";
-import { Text } from "react-native";
+import { Platform, Text } from "react-native";
const WEIGHTS = ["light", "regular", "medium", "semibold", "bold"];
@@ -32,7 +32,7 @@ const VARIANTS: Record> = {
},
"title": {
fontFamily: WEIGHTS[4],
- fontSize: 17,
+ fontSize: Platform.OS === "android" ? 18 : 17,
lineHeight: "130%"
},
"action": {
@@ -41,7 +41,7 @@ const VARIANTS: Record> = {
lineHeight: "140%"
},
"body1": {
- fontFamily: WEIGHTS[2],
+ fontFamily: Platform.OS === "android" ? WEIGHTS[3] : WEIGHTS[2],
fontSize: 15,
lineHeight: "140%"
},
@@ -81,7 +81,7 @@ export default function Typography({ variant = "body1", color = "textPrimary", a
const COLORS: Record = {
"textPrimary": colors.text,
"textSecondary": colors.text + "88",
- "primary": colors.primary,
+ "primary": colors.tint,
}
const variantStyle = fixLineHeight(variant in VARIANTS ? VARIANTS[variant] : VARIANTS["body1"]);
diff --git a/ui/utils/Transition.ts b/ui/utils/Transition.ts
index f4a350f8..f9d8f3f6 100644
--- a/ui/utils/Transition.ts
+++ b/ui/utils/Transition.ts
@@ -141,3 +141,30 @@ export const PapillonSpringOut = () => {
},
};
};
+
+export const PapillonAndroidMenuIn = () => {
+ "worklet";
+ return {
+ initialValues: {
+ opacity: 0,
+ transform: [{ scaleX: 0.8 }, { scaleY: 0.5 }],
+ },
+ animations: {
+ opacity: withSpring(1, {
+ duration: 100,
+ }),
+ transform: [
+ {
+ scaleX: withSpring(1, {
+ duration: 200,
+ })
+ },
+ {
+ scaleY: withSpring(1, {
+ duration: 250,
+ })
+ }
+ ],
+ },
+ };
+};
\ No newline at end of file
diff --git a/utils/grades/scale.ts b/utils/grades/scale.ts
new file mode 100644
index 00000000..e61ebd1e
--- /dev/null
+++ b/utils/grades/scale.ts
@@ -0,0 +1,62 @@
+export type GradeDisplayScale = "20" | "10" | "5" | "percentage";
+
+export const DEFAULT_GRADE_DISPLAY_SCALE: GradeDisplayScale = "20";
+
+export const getGradeDisplayScale = (
+ value?: string,
+): GradeDisplayScale => {
+ if (value === "10" || value === "5" || value === "percentage" || value === "20") {
+ return value;
+ }
+
+ return DEFAULT_GRADE_DISPLAY_SCALE;
+};
+
+export const getDisplayScaleMax = (scale: GradeDisplayScale): number => {
+ if (scale === "percentage") {
+ return 100;
+ }
+
+ return Number(scale);
+};
+
+export const toDisplayScaleFrom20 = (value: number, scale: GradeDisplayScale): number => {
+ if (scale === "percentage") {
+ return (value / 20) * 100;
+ }
+
+ return (value / 20) * Number(scale);
+};
+
+export const getDisplayDenominator = (scale: GradeDisplayScale): string => {
+ if (scale === "percentage") {
+ return "%";
+ }
+
+ return `/${scale}`;
+};
+
+export const formatAssumed20ForDisplay = (
+ value: number,
+ scale: GradeDisplayScale,
+): { value: number; denominator: string } => {
+ return {
+ value: toDisplayScaleFrom20(value, scale),
+ denominator: getDisplayDenominator(scale),
+ };
+};
+
+export const formatScoreForDisplay = (
+ value: number,
+ outOf: number,
+ scale: GradeDisplayScale,
+): { value: number; denominator: string } => {
+ if (outOf === 20) {
+ return formatAssumed20ForDisplay(value, scale);
+ }
+
+ return {
+ value,
+ denominator: `/${outOf}`,
+ };
+};
diff --git a/utils/native/AnimatedNavigator.ts b/utils/native/AnimatedNavigator.ts
index 3f5a5b0e..d3317814 100644
--- a/utils/native/AnimatedNavigator.ts
+++ b/utils/native/AnimatedNavigator.ts
@@ -2,12 +2,12 @@ import type {
ParamListBase,
StackNavigationState,
} from "@react-navigation/native";
-import { withLayoutContext } from "expo-router";
import {
createNativeStackNavigator,
type NativeStackNavigationEventMap,
type NativeStackNavigationOptions,
-} from "react-native-screen-transitions";
+} from "@react-navigation/native-stack";
+import { withLayoutContext } from "expo-router";
const { Navigator } = createNativeStackNavigator();
@@ -16,4 +16,4 @@ export const Stack = withLayoutContext<
typeof Navigator,
StackNavigationState,
NativeStackNavigationEventMap
->(Navigator);
\ No newline at end of file
+>(Navigator);
diff --git a/utils/subjects/lesson_formats.json b/utils/subjects/lesson_formats.json
index 2ae9c13d..b13f49c5 100644
--- a/utils/subjects/lesson_formats.json
+++ b/utils/subjects/lesson_formats.json
@@ -332,6 +332,8 @@
"ALLEMANDp LV2",
"ALLEMANbD LV1",
"ALhLEMADN LV1",
+ "ALLEMAND LVB",
+ "ALLEMAND LV B",
"Allemand Lv1",
"Allemand Lv2",
"ApLLEMAND LV",
@@ -531,6 +533,8 @@
"ANGLAIS LV2",
"ANGLAIS LV2 (TP)",
"ANGLAIS LV2 CAP",
+ "ANGLAIS LVA",
+ "ANGLAIS LV A",
"ANGLAIS VL2",
"ANGLAISLV1",
"ANGLAISLV2",
@@ -2252,6 +2256,17 @@
"ndl ses anglai"
]
},
+ {
+ "label": "histoiregeodnl",
+ "pretty": "Histoire-Géographie DNL",
+ "emoji": "🌎",
+ "formats": [
+ "HIST-GEO / HIST-GEO DNL",
+ "HIST-GEO / HIST-GEO DNL",
+ "HIST-GEO DNL",
+ "HISTOIRE-GEO DNL"
+ ]
+ },
{
"label": "ses",
"pretty": "Sciences Économiques Et Sociales",
@@ -3559,6 +3574,8 @@
"ESPAGNOL LV3",
"ESPAGNOL LV3 1ere",
"ESPAGNOL LV3 CAP",
+ "ESPAGNOL LVB",
+ "ESPAGNOL LV B",
"ESPAGNOLL V3",
"ESPAGNOLLV2",
"ESPAGNOLLV3",
@@ -4405,6 +4422,18 @@
"ist geo educd civiq"
]
},
+ {
+ "label": "histoire-geographie-emc",
+ "pretty": "Histoire-Géographie et EMC",
+ "emoji": "🌍",
+ "formats": [
+ "HISTOIRE-GEOGRAPHIE et EMC",
+ "Histoire-Géographie et EMC",
+ "Histoire Géographie et EMC",
+ "Histoire Géographie EMC",
+ "Histoire Géo EMC"
+ ]
+ },
{
"label": "histgeographmodule",
"pretty": "Hist Geograph Module",
@@ -6101,6 +6130,7 @@
"emoji": "💻",
"formats": [
"NUMÉRIQUE & SCIENCES INFORMATIQUES",
+ "NUMERIQUE SC.INFORM.",
"Numerique & Sciences Informatiques",
"Numerique Et Sciences Informatiques",
"Numéirque & Sciences nformatiques",
@@ -8535,6 +8565,33 @@
"formats": [
"strategie de com et marketing"
]
+ },
+ {
+ "label": "cesce",
+ "pretty": "Comité d'éducation à la santé, à la citoyenneté et à l'environnement",
+ "emoji": "🩺",
+ "formats": [
+ "CESCE",
+ "Cesce",
+ "cesce"
+ ]
+ },
+ {
+ "label": "langueetlitterature",
+ "pretty": "Langue & Littérature",
+ "emoji": "📖",
+ "formats": [
+ "LANGUE & LITTÉRATURE",
+ "LANGUE & LITTÉRATURE"
+ ]
+ },
+ {
+ "label": "sectionamericaine",
+ "pretty": "Anglais LV1 Section Américaine",
+ "emoji": "🇺🇸",
+ "formats": [
+ "AMERICAIN LV SECTION"
+ ]
}
]
diff --git a/utils/theme/AndroidBackButton.tsx b/utils/theme/AndroidBackButton.tsx
index 6b4d0985..aa9137a3 100644
--- a/utils/theme/AndroidBackButton.tsx
+++ b/utils/theme/AndroidBackButton.tsx
@@ -1,31 +1,33 @@
-import React from "react";
-
-import Icon from "@/ui/components/Icon";
-import { Papicons } from "@getpapillon/papicons";
+import React, { memo } from "react";
+import { Platform, StyleSheet, TouchableNativeFeedback, View } from "react-native";
import { useRouter } from "expo-router";
-import { TouchableNativeFeedback, TouchableOpacity, View } from "react-native";
+import { Papicons } from "@getpapillon/papicons";
+import Icon from "@/ui/components/Icon";
+
+export const AndroidBackButtonStyles = StyleSheet.create({
+ container: {
+ width: 42,
+ height: 42,
+ alignItems: "center",
+ justifyContent: "center",
+ borderRadius: 36,
+ marginRight: 12,
+ marginLeft: -6,
+ marginBottom: -3,
+ overflow: "hidden",
+ },
+});
const AndroidBackButton = () => {
+ if(Platform.OS !== "android") return null;
const router = useRouter();
return (
router.back()}
+ onPress={router.back}
useForeground
>
-
+
@@ -34,4 +36,4 @@ const AndroidBackButton = () => {
);
};
-export default AndroidBackButton;
+export default memo(AndroidBackButton);
\ No newline at end of file
diff --git a/utils/theme/ScreenOptions.tsx b/utils/theme/ScreenOptions.tsx
index cf89c63c..b2700f0d 100644
--- a/utils/theme/ScreenOptions.tsx
+++ b/utils/theme/ScreenOptions.tsx
@@ -1,5 +1,6 @@
import { Platform } from "react-native";
import AndroidBackButton from "./AndroidBackButton";
+import AndroidHeaderBackground from "@/components/AndroidHeaderBackground";
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export const screenOptions: any = {
@@ -20,11 +21,10 @@ export const screenOptions: any = {
fontFamily: "semibold",
fontSize: 17,
},
- animation: Platform.OS == 'android' ? "fade_from_bottom" : undefined,
headerBackIcon: Platform.OS == 'android' ? {
type: "image",
source: require("@/assets/icons/back.svg"),
} : undefined,
headerLeft: Platform.OS == 'android' ? () => : undefined,
- headerBackVisible: Platform.OS == 'android' ? false : undefined,
+ headerBackVisible: Platform.OS == 'android' ? false : undefined
};
diff --git a/utils/theme/Theme.ts b/utils/theme/Theme.ts
index 85232e61..0dfd8823 100644
--- a/utils/theme/Theme.ts
+++ b/utils/theme/Theme.ts
@@ -2,32 +2,89 @@ import {
DarkTheme as NativeDarkTheme,
DefaultTheme as NativeDefaultTheme,
} from "@react-navigation/native";
+import { Platform } from "react-native";
+import { getDynamicColorScheme } from "react-native-dynamic-theme";
-const PrimaryAccentColor = {
- light: "#29947A",
- dark: "#29947A",
-};
-
-export const DefaultTheme = {
- ...NativeDefaultTheme,
- colors: {
- ...NativeDefaultTheme.colors,
- primary: PrimaryAccentColor.light,
+const FALLBACK_COLORS = {
+ light: {
+ primary: "#29947A",
+ tint: "#29947A",
background: "#FFFFFF",
- overground: "#F3F6F7",
text: "#000000",
card: "#FFFFFF",
+ item: Platform.OS === "android" ? "#f1f1f1" : "#FFFFFF",
},
-};
-
-export const DarkTheme = {
- ...NativeDarkTheme,
- colors: {
- ...NativeDarkTheme.colors,
- primary: PrimaryAccentColor.dark,
+ dark: {
+ primary: "#29947A",
+ tint: "#29947A",
background: "#000000",
- overground: "#1E1E1E",
text: "#FFFFFF",
card: "#121212",
+ item: "#121212",
},
};
+
+const isMaterialYouAvailable =
+ Platform.OS === "android" && typeof Platform.Version === "number" && Platform.Version >= 31;
+
+function getThemeColors(useMaterialYou: boolean) {
+ if (useMaterialYou && isMaterialYouAvailable) {
+ const scheme = getDynamicColorScheme('#29947A');
+ return {
+ light: {
+ primary: scheme.light.primary,
+ tint: scheme.light.primary,
+ background: scheme.light.surfaceContainer,
+ text: scheme.light.onBackground,
+ card: scheme.light.surfaceDim,
+ item: scheme.light.surfaceContainerLowest,
+ },
+ dark: {
+ primary: scheme.dark.primaryContainer,
+ tint: scheme.dark.primary,
+ background: scheme.dark.background,
+ text: scheme.dark.onBackground,
+ card: scheme.dark.surfaceContainer,
+ item: scheme.dark.surfaceContainer,
+ },
+ };
+ }
+
+ return FALLBACK_COLORS;
+}
+
+export function createDefaultTheme(useMaterialYou: boolean, primaryColor: string) {
+ const colors = getThemeColors(useMaterialYou);
+
+ return {
+ ...NativeDefaultTheme,
+ colors: {
+ ...NativeDefaultTheme.colors,
+ primary: useMaterialYou ? colors.light.primary : (primaryColor || colors.light.primary),
+ tint: useMaterialYou ? colors.light.tint : (primaryColor || colors.light.tint),
+ background: colors.light.background,
+ overground: "#F3F6F7",
+ text: colors.light.text,
+ card: colors.light.card,
+ item: colors.light.item,
+ },
+ };
+}
+
+export function createDarkTheme(useMaterialYou: boolean, primaryColor: string) {
+ const colors = getThemeColors(useMaterialYou);
+
+ return {
+ ...NativeDarkTheme,
+ colors: {
+ ...NativeDarkTheme.colors,
+ primary: useMaterialYou ? colors.dark.primary : (primaryColor || colors.dark.primary),
+ tint: useMaterialYou ? colors.dark.tint : (primaryColor || colors.dark.tint),
+ background: colors.dark.background,
+ overground: "#1E1E1E",
+ text: colors.dark.text,
+ card: colors.dark.card,
+ item: colors.dark.item,
+ },
+ };
+}