diff --git a/.github/dependabot.yaml b/.github/dependabot.yaml index 9aadbcfb6..499a160c8 100644 --- a/.github/dependabot.yaml +++ b/.github/dependabot.yaml @@ -43,6 +43,11 @@ updates: versions: [">=35.0.0"] - dependency-name: react-native-sheet-transitions versions: [">0.1.2"] + + # filter not work + - dependency-name: unplugin-ast + versions: ["0.14.5"] + open-pull-requests-limit: 100 groups: minor-and-patch: diff --git a/.github/workflows/build-android.yml b/.github/workflows/build-android.yml index 459306b47..17fc59494 100644 --- a/.github/workflows/build-android.yml +++ b/.github/workflows/build-android.yml @@ -2,12 +2,8 @@ name: Build Android on: push: - branches: [dev] - paths: - - "apps/mobile/**" - - "pnpm-lock.yaml" - pull_request: - branches: [dev] + branches: + - "**" paths: - "apps/mobile/**" - "pnpm-lock.yaml" @@ -22,7 +18,7 @@ on: description: "Build profile" concurrency: - group: ${{ github.workflow }}-${{ github.ref }} + group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event.inputs.profile }} cancel-in-progress: true jobs: @@ -81,3 +77,8 @@ jobs: name: aab-android path: ${{ github.workspace }}/build.aab retention-days: 90 + + - name: Submit to Google Play + if: github.event.inputs.profile == 'production' + working-directory: apps/mobile + run: eas submit --platform android --path ${{ github.workspace }}/build.aab --non-interactive diff --git a/.github/workflows/build-desktop.yml b/.github/workflows/build-desktop.yml index e6a95a054..1f00fa78e 100644 --- a/.github/workflows/build-desktop.yml +++ b/.github/workflows/build-desktop.yml @@ -4,8 +4,9 @@ on: push: branches: - "**" - tags: - - "v*" + paths: + - "apps/desktop/**" + - "pnpm-lock.yaml" workflow_dispatch: inputs: tag_version: @@ -124,20 +125,17 @@ jobs: - name: Install dependencies run: pnpm i - name: Update main hash - run: | - cd apps/desktop - pnpm update:main-hash + working-directory: apps/desktop + run: pnpm update:main-hash - name: Build - Vite - run: | - cd apps/desktop - pnpm build:electron-vite ${{ env.PROD == 'false' && '--mode staging' || '' }} + working-directory: apps/desktop + run: pnpm build:electron-vite ${{ env.PROD == 'false' && '--mode staging' || '' }} env: SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} - name: Build - Windows and Linux if: runner.os != 'macOS' - run: | - cd apps/desktop - pnpm build:electron-forge ${{ env.PROD == 'false' && '--mode=staging' || '' }} + working-directory: apps/desktop + run: pnpm build:electron-forge ${{ env.PROD == 'false' && '--mode=staging' || '' }} env: SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} @@ -166,15 +164,13 @@ jobs: OSX_SIGN_IDENTITY: ${{ secrets.OSX_SIGN_IDENTITY_MAS }} OSX_SIGN_PROVISIONING_PROFILE_PATH: ${{ runner.temp }}/build_pp.provisionprofile BUILD_VERSION: ${{ github.event.inputs.build_version }} - run: | - cd apps/desktop - pnpm build:electron-forge:mas + working-directory: apps/desktop + run: pnpm build:electron-forge:mas - name: Build - Renderer if: runner.os == 'Linux' - run: | - cd apps/desktop - pnpm build:render + working-directory: apps/desktop + run: pnpm build:render env: SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} diff --git a/.github/workflows/build-ios-development.yml b/.github/workflows/build-ios-development.yml index d921bc01a..50b07e47d 100644 --- a/.github/workflows/build-ios-development.yml +++ b/.github/workflows/build-ios-development.yml @@ -2,14 +2,8 @@ name: Build iOS for development on: push: - branches: [dev] - paths: - - "apps/mobile/web-app/**" - - "apps/mobile/native/**" - - "apps/mobile/package.json" - - "apps/mobile/app.config.ts" - pull_request: - branches: [dev] + branches: + - "**" paths: - "apps/mobile/web-app/**" - "apps/mobile/native/**" @@ -69,9 +63,8 @@ jobs: run: pnpm install - name: 🔨 Build iOS IPA - run: | - cd apps/mobile - eas build --platform ios --profile development --non-interactive --local --output=./build.ipa + working-directory: apps/mobile + run: eas build --platform ios --profile development --non-interactive --local --output=./build.ipa env: CI: true @@ -116,9 +109,8 @@ jobs: run: pnpm install - name: 🔨 Build iOS IPA - run: | - cd apps/mobile - eas build --platform ios --profile ios-simulator --non-interactive --local --output=./build-simulator.ipa + working-directory: apps/mobile + run: eas build --platform ios --profile ios-simulator --non-interactive --local --output=./build-simulator.ipa env: CI: true diff --git a/.github/workflows/build-ios.yml b/.github/workflows/build-ios.yml index 61793111b..a0c4be32f 100644 --- a/.github/workflows/build-ios.yml +++ b/.github/workflows/build-ios.yml @@ -2,12 +2,8 @@ name: Build iOS on: push: - branches: [dev] - paths: - - "apps/mobile/**" - - "pnpm-lock.yaml" - pull_request: - branches: [dev] + branches: + - "**" paths: - "apps/mobile/**" - "pnpm-lock.yaml" @@ -22,7 +18,7 @@ on: description: "Build profile" concurrency: - group: ${{ github.workflow }}-${{ github.ref }} + group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event.inputs.profile }} cancel-in-progress: true jobs: @@ -74,9 +70,8 @@ jobs: run: pnpm install - name: 🔨 Build iOS IPA - run: | - cd apps/mobile - eas build --platform ios --profile ${{ github.event.inputs.profile || 'preview' }} --non-interactive --local --output=./build.ipa + working-directory: apps/mobile + run: eas build --platform ios --profile ${{ github.event.inputs.profile || 'preview' }} --non-interactive --local --output=./build.ipa env: CI: true @@ -95,6 +90,5 @@ jobs: - name: Submit to App Store if: github.event.inputs.profile == 'production' - run: | - cd apps/mobile - eas submit --platform ios --path build.ipa --non-interactive + working-directory: apps/mobile + run: eas submit --platform ios --path build.ipa --non-interactive diff --git a/.github/workflows/sync.yaml b/.github/workflows/sync.yaml new file mode 100644 index 000000000..79ad3bc69 --- /dev/null +++ b/.github/workflows/sync.yaml @@ -0,0 +1,42 @@ +name: Branch Synchronization + +on: + push: + branches: + - main + +jobs: + sync-branches: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Set up Git + run: | + git config --global user.name 'GitHub Actions' + git config --global user.email 'actions@github.com' + + - name: Prepare sync branch + id: branch + run: | + echo "SYNC_BRANCH_MAIN_DEV=sync/main-to-dev-$(date +'%Y%m%d')" >> $GITHUB_ENV + + - name: Sync main to dev + if: github.ref == 'refs/heads/main' + run: | + # Sync main to dev + git checkout main + SYNC_BRANCH_DEV=${{ env.SYNC_BRANCH_MAIN_DEV }} + git checkout -B $SYNC_BRANCH_DEV + DIFF=$(git diff origin/dev...) + if [ -z "$DIFF" ]; then + echo "No changes to sync" + exit 0 + fi + git push origin $SYNC_BRANCH_DEV -f + gh pr create --base dev --head $SYNC_BRANCH_DEV --title "Sync main branch to dev branch" --body "Automatic sync" || exit 0 + env: + GH_TOKEN: ${{ github.token }} diff --git a/.github/workflows/tag.yml b/.github/workflows/tag.yml index f824fa7d9..58f7c5aa1 100644 --- a/.github/workflows/tag.yml +++ b/.github/workflows/tag.yml @@ -45,5 +45,5 @@ jobs: curl -X POST \ -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ -H "Accept: application/vnd.github+json" \ - https://api.github.com/repos/${{ github.repository }}/actions/workflows/build.yml/dispatches \ + https://api.github.com/repos/${{ github.repository }}/actions/workflows/build-desktop.yml/dispatches \ -d '{"ref":"main", "inputs": {"tag_version": "true"}}' diff --git a/README.md b/README.md index 3ce3e0213..d11ef6629 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,8 @@ You can also install using the following methods maintained by our community: - If you are using Arch Linux, you can install package [follow-appimage](https://aur.archlinux.org/packages/follow-appimage) that maintained by [timochan](https://github.com/ttimochan). - If you are using Nix, you can install package [follow](https://github.com/NixOS/nixpkgs/blob/master/pkgs/by-name/fo/follow/package.nix) that maintained by [iosmanthus](https://github.com/iosmanthus). -- If you are using macOS with [Homebrew](https://brew.sh), you can install cask [follow](https://formulae.brew.sh/cask/follow) (also [@alpha](https://formulae.brew.sh/cask/follow@alpha) and [@nightly](https://formulae.brew.sh/cask/follow@nightly)) that maintained by [realSunyz](https://github.com/realSunyz). +- If you are using macOS with [Homebrew](https://brew.sh), you can install cask [folo](https://formulae.brew.sh/cask/folo) that maintained by [realSunyz](https://github.com/realSunyz). +- If you are using Windows with [Scoop](https://scoop.sh), you can install manifest [folo](https://github.com/cscnk52/cetacea/blob/master/bucket/folo.json) that maintained by [cscnk52](https://github.com/cscnk52). | [![Discord](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fdiscord.com%2Fapi%2Finvites%2Ffollowapp%3Fwith_counts%3Dtrue&query=approximate_member_count&color=5865F2&label=Discord&labelColor=black&logo=discord&logoColor=white&style=flat-square)](https://discord.gg/followapp) | Join our Discord server to connect with developers, request features, and receive support. | | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------- | diff --git a/apps/desktop/bump.config.ts b/apps/desktop/bump.config.ts new file mode 100644 index 000000000..b4d16b9cb --- /dev/null +++ b/apps/desktop/bump.config.ts @@ -0,0 +1,24 @@ +/* eslint-disable no-template-curly-in-string */ +import { defineConfig } from "nbump" + +export default defineConfig({ + leading: [ + "git pull --rebase", + "tsx scripts/apply-changelog.ts ${NEW_VERSION}", + "git add changelog", + "tsx plugins/vite/generate-main-hash.ts", + "pnpm eslint --fix package.json", + "pnpm prettier --ignore-unknown --write package.json", + "git add package.json", + ], + trailing: ["git checkout -b release/desktop/${NEW_VERSION}"], + finally: [ + "git push origin release/desktop/${NEW_VERSION}", + "gh pr create --title 'release(desktop): Release v${NEW_VERSION}' --body 'v${NEW_VERSION}' --base main --head release/desktop/${NEW_VERSION}", + ], + push: false, + commitMessage: "release(desktop): release v${NEW_VERSION}", + tagPrefix: "desktop@", + changelog: false, + allowedBranches: ["dev"], +}) diff --git a/apps/desktop/changelog/next.md b/apps/desktop/changelog/next.md index 62b641fa5..e2c58b405 100644 --- a/apps/desktop/changelog/next.md +++ b/apps/desktop/changelog/next.md @@ -2,6 +2,15 @@ ## Shiny new things +- Server side readability with AI summary and translation support (#3498) + ## Improvements +- Save AI summary as description option for Cubox integration (#3478) +- Delete your own RSSHub instance support (#2883) + ## No longer broken + +- Fixed TTS failed to play (#3522) +- Fixed corner player can not navigate to correct entry (#1401) +- Fixed unable to save to Readwise (#3497) diff --git a/apps/desktop/forge.config.cts b/apps/desktop/forge.config.cts index 9a24e2757..1d1a58028 100644 --- a/apps/desktop/forge.config.cts +++ b/apps/desktop/forge.config.cts @@ -96,6 +96,7 @@ const ignorePattern = new RegExp(`^/node_modules/(?!${[...keepModules].join("|") const config: ForgeConfig = { packagerConfig: { + name: isStaging ? "Folo Staging" : "Folo", appCategoryType: "public.app-category.news", buildVersion: process.env.BUILD_VERSION || undefined, appBundleId: "is.follow", @@ -196,7 +197,7 @@ const config: ForgeConfig = { }), new MakerPKG( { - name: "Folo", + name: "Folo Staging", keychain: process.env.KEYCHAIN_PATH, }, ["mas"], diff --git a/apps/desktop/package.json b/apps/desktop/package.json index f16ca3f50..7e9c54423 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -33,11 +33,12 @@ "update:main-hash": "tsx plugins/vite/generate-main-hash.ts" }, "dependencies": { + "cookie-es": "2.0.0", "react-google-recaptcha": "3.1.0", "react-google-recaptcha-v3": "1.10.1" }, "devDependencies": { - "@clack/prompts": "0.10.0", + "@clack/prompts": "0.10.1", "@electron-forge/cli": "7.8.0", "@electron-forge/maker-appx": "7.8.0", "@electron-forge/maker-dmg": "7.8.0", @@ -58,50 +59,30 @@ "@types/html-minifier-terser": "7.0.2", "@types/js-yaml": "4.0.9", "@types/react-google-recaptcha": "2.1.9", - "@vitejs/plugin-legacy": "6.0.2", - "@vitejs/plugin-react": "4.3.4", + "@vitejs/plugin-legacy": "6.1.0", + "@vitejs/plugin-react": "4.4.0", "autoprefixer": "10.4.21", "bufferutil": "4.0.9", "cssnano": "7.0.6", - "dotenv": "16.4.7", - "drizzle-orm": "0.41.0", - "electron": "34.5.0", + "dotenv": "16.5.0", + "drizzle-orm": "0.42.0", + "electron": "35.1.5", "electron-devtools-installer": "4.0.0", "electron-packager-languages": "0.6.0", "electron-vite": "3.1.0", "fake-indexeddb": "6.0.0", "happy-dom": "17.4.4", - "hono": "4.7.5", + "hono": "4.7.6", "html-minifier-terser": "7.2.0", "js-yaml": "4.1.0", - "nbump": "2.0.7", + "nbump": "2.1.0", "react": "18.3.1", "react-dom": "18.3.1", "tar": "7.4.3", "tsup": "8.4.0", - "unplugin-ast": "0.14.4", + "unplugin-ast": "0.14.6", "utf-8-validate": "6.0.5" }, "productName": "Folo", - "mainHash": "274b8ef4d0671d642c1350e1e4463fce6d677f81f77f59a666d6aa83f5866a22", - "bump": { - "before": [ - "git pull --rebase", - "tsx scripts/apply-changelog.ts ${NEW_VERSION}", - "git add changelog", - "tsx plugins/vite/generate-main-hash.ts", - "pnpm eslint --fix package.json", - "pnpm prettier --ignore-unknown --write package.json", - "git add package.json" - ], - "after": [ - "gh pr create --title 'release(desktop): Release v${NEW_VERSION}' --body 'v${NEW_VERSION}' --base main --head dev" - ], - "commit_message": "release(desktop): release v${NEW_VERSION}", - "tag": false, - "changelog": false, - "allowed_branches": [ - "dev" - ] - } + "mainHash": "274b8ef4d0671d642c1350e1e4463fce6d677f81f77f59a666d6aa83f5866a22" } diff --git a/apps/desktop/src/main/package.json b/apps/desktop/src/main/package.json index 4c329d2bf..60789bd03 100644 --- a/apps/desktop/src/main/package.json +++ b/apps/desktop/src/main/package.json @@ -29,7 +29,7 @@ "@follow/shared": "workspace:*", "@follow/utils": "workspace:*", "@openpanel/web": "1.0.1", - "@sentry/electron": "6.4.0", + "@sentry/electron": "6.5.0", "builder-util-runtime": "9.3.1", "cookie-es": "2.0.0", "electron-context-menu": "4.0.5", @@ -37,10 +37,10 @@ "electron-squirrel-startup": "1.0.1", "electron-store": "10.0.1", "electron-updater": "6.6.2", - "es-toolkit": "1.34.1", + "es-toolkit": "1.35.0", "fast-folder-size": "2.4.0", "font-list": "1.5.1", - "i18next": "24.2.3", + "i18next": "25.0.0", "js-yaml": "4.1.0", "linkedom": "0.18.9", "lowdb": "7.0.1", @@ -55,9 +55,9 @@ "@follow/models": "workspace:*", "@follow/types": "workspace:*", "@types/js-yaml": "4.0.9", - "@types/node": "22.14.0", - "electron": "34.5.0", + "@types/node": "22.14.1", + "electron": "35.1.5", "electron-devtools-installer": "4.0.0", - "hono": "4.7.5" + "hono": "4.7.6" } } diff --git a/apps/desktop/src/main/src/constants/app.ts b/apps/desktop/src/main/src/constants/app.ts index 0c5ef5d8d..33c1b5612 100644 --- a/apps/desktop/src/main/src/constants/app.ts +++ b/apps/desktop/src/main/src/constants/app.ts @@ -12,4 +12,4 @@ export const GITHUB_REPO = process.env.GITHUB_REPO || "follow" // https://github.com/electron/electron/issues/25081 export const START_IN_TRAY_ARGS = "--start-in-tray" -export const BETTER_AUTH_COOKIE_NAME_SESSION_TOKEN = "__Secure-better-auth.session_token" +export const BETTER_AUTH_COOKIE_NAME_SESSION_TOKEN = "better-auth.session_token" diff --git a/apps/desktop/src/main/src/index.ts b/apps/desktop/src/main/src/index.ts index 56c258ca6..adcdcd8b9 100644 --- a/apps/desktop/src/main/src/index.ts +++ b/apps/desktop/src/main/src/index.ts @@ -1,3 +1,5 @@ +import "./side-effects" + import { electronApp, optimizer } from "@electron-toolkit/utils" import { callWindowExpose } from "@follow/shared/bridge" import { APP_PROTOCOL, DEV } from "@follow/shared/constants" @@ -15,7 +17,7 @@ import { updateProxy } from "./lib/proxy" import { handleUrlRouting } from "./lib/router" import { store } from "./lib/store" import { registerAppTray } from "./lib/tray" -import { setBetterAuthSessionCookie, updateNotificationsToken } from "./lib/user" +import { updateNotificationsToken } from "./lib/user" import { logger } from "./logger" import { registerUpdater } from "./updater" import { cleanupOldRender } from "./updater/hot-updater" @@ -39,6 +41,9 @@ const buildSafeHeaders = createBuildSafeHeaders(env.VITE_WEB_URL, [ env.VITE_OPENPANEL_API_URL || "", IMAGE_PROXY_URL, env.VITE_API_URL, + // Fix unexpected CORS error when modify the origin header to request domain in the preflight request + // Learn more https://github.com/RSSNext/Folo/issues/3312 + "https://readwise.io", ]) function bootstrap() { @@ -109,67 +114,10 @@ function bootstrap() { mainWindow = createMainWindow() - // restore cookies - const cookies = store.get("cookies") - if (cookies) { - Promise.all( - cookies.map((cookie) => { - const setCookieDetails: Electron.CookiesSetDetails = { - url: apiURL, - name: cookie.name, - value: cookie.value, - domain: cookie.domain, - path: cookie.path, - secure: cookie.secure, - httpOnly: cookie.httpOnly, - expirationDate: cookie.expirationDate, - sameSite: cookie.sameSite as "unspecified" | "no_restriction" | "lax" | "strict", - } - - return mainWindow.webContents.session.cookies.set(setCookieDetails) - }), - ) - } - updateProxy() registerUpdater() registerAppTray() - // handle session cookie when sign in with email in electron - session.defaultSession.webRequest.onHeadersReceived( - { - urls: [ - `${apiURL}/better-auth/sign-in/email`, - `${apiURL}/better-auth/sign-in/email?*`, - `${apiURL}/better-auth/two-factor/verify-totp`, - `${apiURL}/better-auth/two-factor/verify-totp?*`, - ], - }, - (detail, callback) => { - const { responseHeaders } = detail - if (responseHeaders?.["set-cookie"]) { - const cookies = responseHeaders["set-cookie"] as string[] - cookies.forEach((cookie) => { - const cookieObj = parse(cookie, { decode: (value) => value }) - Object.keys(cookieObj).forEach((name) => { - const value = cookieObj[name] - mainWindow.webContents.session.cookies.set({ - url: apiURL, - name, - value, - secure: true, - httpOnly: true, - domain: new URL(apiURL).hostname, - sameSite: "no_restriction", - }) - }) - }) - } - - callback({ cancel: false, responseHeaders }) - }, - ) - app.on("open-url", (_, url) => { if (mainWindow && !mainWindow.isDestroyed()) { if (mainWindow.isMinimized()) mainWindow.restore() @@ -215,9 +163,6 @@ function bootstrap() { }) await session.defaultSession.cookies.flushStore() - const cookies = await session.defaultSession.cookies.get({}) - store.set("cookies", cookies) - await cleanupOldRender() }) @@ -227,29 +172,36 @@ function bootstrap() { const urlObj = new URL(url) if (urlObj.hostname === "auth" || urlObj.pathname === "//auth") { - const ck = urlObj.searchParams.get("ck") - const userId = urlObj.searchParams.get("userId") + const token = urlObj.searchParams.get("token") - if (ck && apiURL) { - setBetterAuthSessionCookie(ck) - const cookie = parse(atob(ck), { decode: (value) => value }) - Object.keys(cookie).forEach((name) => { - const value = cookie[name] - mainWindow.webContents.session.cookies.set({ - url: apiURL, - name, - value, - secure: true, - httpOnly: true, - domain: new URL(apiURL).hostname, - sameSite: "no_restriction", + if (token) { + await callWindowExpose(mainWindow).applyOneTimeToken(token) + } else { + // compatible with old version of ssr, should be removed in 0.4.4 + const ck = urlObj.searchParams.get("ck") + const userId = urlObj.searchParams.get("userId") + + if (ck && apiURL) { + const cookie = parse(atob(ck), { decode: (value) => value }) + Object.keys(cookie).forEach(async (name) => { + const value = cookie[name] + await mainWindow.webContents.session.cookies.set({ + url: apiURL, + name, + value, + secure: true, + httpOnly: true, + domain: new URL(apiURL).hostname, + sameSite: "no_restriction", + expirationDate: new Date().setDate(new Date().getDate() + 30), + }) }) - }) - userId && (await callWindowExpose(mainWindow).clearIfLoginOtherAccount(userId)) - mainWindow.reload() + userId && (await callWindowExpose(mainWindow).clearIfLoginOtherAccount(userId)) + mainWindow.reload() - updateNotificationsToken() + updateNotificationsToken() + } } } else { handleUrlRouting(url) diff --git a/apps/desktop/src/main/src/init.ts b/apps/desktop/src/main/src/init.ts index 41bb74d11..cba43e38f 100644 --- a/apps/desktop/src/main/src/init.ts +++ b/apps/desktop/src/main/src/init.ts @@ -28,7 +28,6 @@ if (process.argv.length === 3 && process.argv[2]!.startsWith("follow-dev:")) { * Mandatory and fast initializers for the app */ export function initializeAppStage0() { - if (DEV) app.setPath("appData", path.join(app.getPath("appData"), "Follow (dev)")) initializeSentry() } export const initializeAppStage1 = () => { @@ -154,8 +153,6 @@ const registerPushNotifications = async () => { const credentials = store.get(credentialsKey) const persistentIds = store.get(persistentIdsKey) - updateNotificationsToken() - const instance = new PushReceiver({ debug: true, firebase: JSON.parse(env.VITE_FIREBASE_CONFIG), diff --git a/apps/desktop/src/main/src/lib/api-client.ts b/apps/desktop/src/main/src/lib/api-client.ts index 27e773c9f..035e0624e 100644 --- a/apps/desktop/src/main/src/lib/api-client.ts +++ b/apps/desktop/src/main/src/lib/api-client.ts @@ -4,8 +4,10 @@ import PKG from "@pkg" import { hc } from "hono/client" import { ofetch } from "ofetch" +import { BETTER_AUTH_COOKIE_NAME_SESSION_TOKEN } from "~/constants/app" +import { getMainWindow } from "~/window" + import { logger } from "../logger" -import { getBetterAuthSessionCookie, getUser } from "./user" const abortController = new AbortController() export const apiFetch = ofetch.create({ @@ -14,12 +16,6 @@ export const apiFetch = ofetch.create({ signal: abortController.signal, retry: false, onRequest({ request }) { - const betterAuthSessionCookie = getBetterAuthSessionCookie() - if (!betterAuthSessionCookie) { - abortController.abort() - return - } - logger.info(`API Request: ${request.toString()}`) }, onRequestError(context) { @@ -31,14 +27,21 @@ export const apiFetch = ofetch.create({ export const apiClient = hc("", { fetch: async (input, options = {}) => apiFetch(input.toString(), options), - headers() { - const betterAuthSessionCookie = getBetterAuthSessionCookie() - const user = getUser() + async headers() { + const window = getMainWindow() + const cookies = await window?.webContents.session.cookies.get({ + domain: new URL(env.VITE_API_URL).hostname, + }) + const sessionCookie = cookies?.find((cookie) => + cookie.name.includes(BETTER_AUTH_COOKIE_NAME_SESSION_TOKEN), + ) + const headerCookie = sessionCookie ? `${sessionCookie.name}=${sessionCookie.value}` : "" + return { "X-App-Version": PKG.version, "X-App-Dev": process.env.NODE_ENV === "development" ? "1" : "0", - Cookie: betterAuthSessionCookie ? atob(betterAuthSessionCookie) : "", - "User-Agent": `Folo/${PKG.version}${user?.id ? ` uid: ${user.id}` : ""}`, + Cookie: headerCookie, + "User-Agent": `Folo/${PKG.version}`, } }, }) diff --git a/apps/desktop/src/main/src/lib/dock.ts b/apps/desktop/src/main/src/lib/dock.ts index a45c60aca..b2fcf8780 100644 --- a/apps/desktop/src/main/src/lib/dock.ts +++ b/apps/desktop/src/main/src/lib/dock.ts @@ -11,3 +11,12 @@ export const setDockCount = (input: number) => { app.setBadgeCount(input) } } + +export const getDockCount = () => { + if (isWindows) return null + if (app.dock) { + return app.dock.getBadge() + } else { + return app.getBadgeCount() + } +} diff --git a/apps/desktop/src/main/src/lib/store.ts b/apps/desktop/src/main/src/lib/store.ts index edb1abf0c..b8423ad64 100644 --- a/apps/desktop/src/main/src/lib/store.ts +++ b/apps/desktop/src/main/src/lib/store.ts @@ -1,5 +1,4 @@ import type { Credentials } from "@eneris/push-receiver/dist/types" -import type { Cookie } from "electron" import Store from "electron-store" // @keep-sorted @@ -7,9 +6,7 @@ type StoreData = { "notifications-credentials"?: Credentials | null "notifications-persistent-ids"?: string[] | null appearance?: "light" | "dark" | "system" | null - betterAuthSessionCookie?: string | null cacheSizeLimit?: number | null - cookies?: Cookie[] | null minimizeToTray?: boolean | null proxy?: string | null user?: string | null diff --git a/apps/desktop/src/main/src/lib/tray.ts b/apps/desktop/src/main/src/lib/tray.ts index c559add8a..a2988ac21 100644 --- a/apps/desktop/src/main/src/lib/tray.ts +++ b/apps/desktop/src/main/src/lib/tray.ts @@ -1,12 +1,13 @@ import { name } from "@pkg" import { app, Menu, nativeImage, Tray } from "electron" -import { isMacOS } from "~/env" +import { isMacOS, isWindows } from "~/env" import { getTrayIconPath } from "~/helper" import { logger, revealLogFile } from "~/logger" import { checkForAppUpdates } from "~/updater" import { getMainWindowOrCreate } from "../window" +import { getDockCount } from "./dock" import { t } from "./i18n" import { store } from "./store" @@ -14,19 +15,17 @@ import { store } from "./store" let tray: Tray | null = null -export const registerAppTray = () => { - if (!getTrayConfig()) return - if (tray) { - destroyAppTray() - } - - const icon = nativeImage.createFromPath(getTrayIconPath()) - // See https://stackoverflow.com/questions/41664208/electron-tray-icon-change-depending-on-dark-theme/41998326#41998326 - const trayIcon = isMacOS ? icon.resize({ width: 16 }) : icon - trayIcon.setTemplateImage(true) - tray = new Tray(trayIcon) - - const contextMenu = Menu.buildFromTemplate([ +const getTrayContextMenu = () => { + const count = getDockCount() + return Menu.buildFromTemplate([ + ...(count + ? [ + { + label: `${t("menu.unread")} ${count}`, + enabled: false, + }, + ] + : []), { label: t("menu.open", { name }), click: showWindow, @@ -71,9 +70,27 @@ export const registerAppTray = () => { }, }, ]) - tray.setContextMenu(contextMenu) +} +export const registerAppTray = () => { + if (!getTrayConfig()) return + if (tray) { + destroyAppTray() + } + + const icon = nativeImage.createFromPath(getTrayIconPath()) + // See https://stackoverflow.com/questions/41664208/electron-tray-icon-change-depending-on-dark-theme/41998326#41998326 + const trayIcon = isMacOS ? icon.resize({ width: 16 }) : icon + trayIcon.setTemplateImage(true) + tray = new Tray(trayIcon) + + tray.setContextMenu(getTrayContextMenu()) tray.setToolTip(app.getName()) - tray.on("click", showWindow) + tray.on("mouse-enter", () => { + tray?.setContextMenu(getTrayContextMenu()) + }) + if (isWindows) { + tray.on("click", showWindow) + } } const showWindow = () => { diff --git a/apps/desktop/src/main/src/lib/user.ts b/apps/desktop/src/main/src/lib/user.ts index f2445067c..1432f2b91 100644 --- a/apps/desktop/src/main/src/lib/user.ts +++ b/apps/desktop/src/main/src/lib/user.ts @@ -1,5 +1,4 @@ import type { Credentials } from "@eneris/push-receiver/dist/types" -import type { UserModel } from "@follow/models" import { isLinux, isMacOS, isWindows } from "~/env" import { logger } from "~/logger" @@ -7,19 +6,13 @@ import { logger } from "~/logger" import { apiClient } from "./api-client" import { store } from "./store" -const BetterAuthKey = "betterAuthSessionCookie" -export const setBetterAuthSessionCookie = (cookie: string) => store.set(BetterAuthKey, cookie) -export const getBetterAuthSessionCookie = () => store.get(BetterAuthKey) -export const cleanBetterAuthSessionCookie = () => store.set(BetterAuthKey, null) - -const UserKey = "user" -export const setUser = (user: UserModel) => store.set(UserKey, JSON.stringify(user)) -export const getUser = (): UserModel | null => { - const user = store.get(UserKey) - return user ? JSON.parse(user) : null -} - -export const cleanUser = () => store.set(UserKey, null) +const notificationChannel = isMacOS + ? "macos" + : isWindows + ? "windows" + : isLinux + ? "linux" + : "desktop" export const updateNotificationsToken = async (newCredentials?: Credentials) => { if (newCredentials) { @@ -31,7 +24,7 @@ export const updateNotificationsToken = async (newCredentials?: Credentials) => await apiClient.messaging.$post({ json: { token: credentials.fcm.token, - channel: isMacOS ? "macos" : isWindows ? "windows" : isLinux ? "linux" : "desktop", + channel: notificationChannel, }, }) } catch (error) { @@ -39,3 +32,11 @@ export const updateNotificationsToken = async (newCredentials?: Credentials) => } } } + +export const deleteNotificationsToken = async () => { + await apiClient.messaging.$delete({ + json: { + channel: notificationChannel, + }, + }) +} diff --git a/apps/desktop/src/main/src/side-effects.ts b/apps/desktop/src/main/src/side-effects.ts new file mode 100644 index 000000000..dbf90b611 --- /dev/null +++ b/apps/desktop/src/main/src/side-effects.ts @@ -0,0 +1,6 @@ +import path from "node:path" + +import { DEV } from "@follow/shared" +import { app } from "electron" + +if (DEV) app.setPath("userData", path.join(app.getPath("appData"), "Folo(dev)")) diff --git a/apps/desktop/src/main/src/tipc/app.ts b/apps/desktop/src/main/src/tipc/app.ts index c55260526..32567c8e4 100644 --- a/apps/desktop/src/main/src/tipc/app.ts +++ b/apps/desktop/src/main/src/tipc/app.ts @@ -6,10 +6,8 @@ import { fileURLToPath } from "node:url" import { getRendererHandlers } from "@egoist/tipc/main" import { callWindowExpose } from "@follow/shared/bridge" import { DEV } from "@follow/shared/constants" -import { env } from "@follow/shared/env.desktop" import { app, BrowserWindow, clipboard, dialog, shell } from "electron" -import { BETTER_AUTH_COOKIE_NAME_SESSION_TOKEN } from "~/constants/app" import { filePathToAppUrl } from "~/helper" import { registerMenuAndContextMenu } from "~/init" import { clearAllData, getCacheSize } from "~/lib/cleaner" @@ -20,7 +18,6 @@ import { cleanupOldRender, loadDynamicRenderEntry } from "~/updater/hot-updater" import { downloadFile } from "../lib/download" import { i18n } from "../lib/i18n" -import { cleanBetterAuthSessionCookie, cleanUser } from "../lib/user" import type { RendererHandlers } from "../renderer-handlers" import { quitAndInstall } from "../updater" import { getMainWindow } from "../window" @@ -151,16 +148,6 @@ export const appRoute = { quitAndInstall() }), - cleanBetterAuthSessionCookie: t.procedure.action(async () => { - cleanBetterAuthSessionCookie() - cleanUser() - - const mainWindow = getMainWindow() - await mainWindow?.webContents.session.cookies.remove( - env.VITE_API_URL, - BETTER_AUTH_COOKIE_NAME_SESSION_TOKEN, - ) - }), /// clipboard readClipboard: t.procedure.action(async () => clipboard.readText()), diff --git a/apps/desktop/src/main/src/tipc/auth.ts b/apps/desktop/src/main/src/tipc/auth.ts new file mode 100644 index 000000000..d06a38e9d --- /dev/null +++ b/apps/desktop/src/main/src/tipc/auth.ts @@ -0,0 +1,13 @@ +import { deleteNotificationsToken, updateNotificationsToken } from "~/lib/user" + +import { t } from "./_instance" + +export const authRoute = { + sessionChanged: t.procedure.action(async () => { + await updateNotificationsToken() + }), + + signOut: t.procedure.action(async () => { + await deleteNotificationsToken() + }), +} diff --git a/apps/desktop/src/main/src/tipc/index.ts b/apps/desktop/src/main/src/tipc/index.ts index 5918f3139..66a472fef 100644 --- a/apps/desktop/src/main/src/tipc/index.ts +++ b/apps/desktop/src/main/src/tipc/index.ts @@ -1,19 +1,19 @@ import { appRoute } from "./app" +import { authRoute } from "./auth" import { debugRoute } from "./debug" import { dockRoute } from "./dock" import { menuRoute } from "./menu" import { readerRoute } from "./reader" import { settingRoute } from "./setting" -import { trackerRoute } from "./tracker" export const router = { ...debugRoute, ...menuRoute, ...settingRoute, ...appRoute, - ...trackerRoute, ...dockRoute, ...readerRoute, + ...authRoute, } export type Router = typeof router diff --git a/apps/desktop/src/main/src/tipc/reader.ts b/apps/desktop/src/main/src/tipc/reader.ts index f1bfe1c99..a20edbaf3 100644 --- a/apps/desktop/src/main/src/tipc/reader.ts +++ b/apps/desktop/src/main/src/tipc/reader.ts @@ -41,8 +41,9 @@ export const readerRoute = { if (!window) return // It's ok to set voice every time, because it will be cached by msedge-tts + // Don't know why webm is not working, using mp3 instead await tts - .setMetadata(voice, OUTPUT_FORMAT.WEBM_24KHZ_16BIT_MONO_OPUS) + .setMetadata(voice, OUTPUT_FORMAT.AUDIO_24KHZ_96KBITRATE_MONO_MP3) .catch((error: unknown) => { console.error("Failed to set voice", error) if (error instanceof Error) { @@ -55,12 +56,17 @@ export const readerRoute = { }) }) - const filePath = path.join(app.getPath("userData"), `${id}.webm`) - if (fs.existsSync(filePath)) { + const dirPath = path.join(app.getPath("userData"), "Cache", "tts", id) + const possibleFilePathList = ["mp3", "webm"].map((ext) => { + return path.join(dirPath, `audio.${ext}`) + }) + const filePath = possibleFilePathList.find((p) => fs.existsSync(p)) + if (filePath) { return filePath } else { - await tts.toFile(filePath, text) - return filePath + fs.mkdirSync(dirPath, { recursive: true }) + const { audioFilePath } = await tts.toFile(dirPath, text) + return audioFilePath } }), diff --git a/apps/desktop/src/main/src/tipc/tracker.ts b/apps/desktop/src/main/src/tipc/tracker.ts deleted file mode 100644 index 63caa1116..000000000 --- a/apps/desktop/src/main/src/tipc/tracker.ts +++ /dev/null @@ -1,16 +0,0 @@ -import type { UserModel } from "@follow/models" - -import { setUser } from "../lib/user" -import { t } from "./_instance" - -export const trackerRoute = { - trackerIdentify: t.procedure - .input<{ - user: UserModel - }>() - .action(async ({ input }) => { - const { user } = input - - setUser(user) - }), -} diff --git a/apps/desktop/src/renderer/package.json b/apps/desktop/src/renderer/package.json index 5e90dc565..5d722af8a 100644 --- a/apps/desktop/src/renderer/package.json +++ b/apps/desktop/src/renderer/package.json @@ -20,25 +20,25 @@ "@follow/shared": "workspace:*", "@follow/tracker": "workspace:*", "@fontsource/sn-pro": "5.2.5", - "@headlessui/react": "2.2.1", + "@headlessui/react": "2.2.2", "@hookform/resolvers": "4.1.3", "@lottiefiles/dotlottie-react": "0.13.3", "@openpanel/web": "1.0.1", - "@radix-ui/react-avatar": "1.1.3", - "@radix-ui/react-context-menu": "2.2.6", - "@radix-ui/react-dialog": "1.1.6", - "@radix-ui/react-dropdown-menu": "2.1.6", - "@radix-ui/react-hover-card": "1.1.6", - "@radix-ui/react-label": "2.1.2", - "@radix-ui/react-popover": "1.1.6", - "@radix-ui/react-slider": "1.2.3", - "@radix-ui/react-slot": "1.1.2", - "@sentry/react": "9.11.0", - "@shikijs/transformers": "3.2.1", - "@tanstack/query-sync-storage-persister": "5.71.10", - "@tanstack/react-query": "5.71.10", - "@tanstack/react-query-devtools": "5.71.10", - "@tanstack/react-query-persist-client": "5.71.10", + "@radix-ui/react-avatar": "1.1.4", + "@radix-ui/react-context-menu": "2.2.7", + "@radix-ui/react-dialog": "1.1.7", + "@radix-ui/react-dropdown-menu": "2.1.7", + "@radix-ui/react-hover-card": "1.1.7", + "@radix-ui/react-label": "2.1.3", + "@radix-ui/react-popover": "1.1.7", + "@radix-ui/react-slider": "1.2.4", + "@radix-ui/react-slot": "1.2.0", + "@sentry/react": "9.13.0", + "@shikijs/transformers": "3.2.2", + "@tanstack/query-sync-storage-persister": "5.74.4", + "@tanstack/react-query": "5.74.4", + "@tanstack/react-query-devtools": "5.74.4", + "@tanstack/react-query-persist-client": "5.74.4", "@tanstack/react-virtual": "3.13.6", "@use-gesture/react": "10.3.1", "@welldone-software/why-did-you-render": "10.0.1", @@ -53,23 +53,23 @@ "dnum": "2.14.0", "embla-carousel-react": "8.6.0", "embla-carousel-wheel-gestures": "8.0.2", - "es-toolkit": "1.34.1", + "es-toolkit": "1.35.0", "firebase": "11.6.0", "foxact": "0.2.45", - "framer-motion": "12.6.3", "franc-min": "6.2.0", "fuse.js": "7.1.0", "hast-util-to-jsx-runtime": "2.3.6", "hast-util-to-mdast": "10.1.2", - "i18next": "24.2.3", + "i18next": "25.0.0", "i18next-browser-languagedetector": "8.0.4", "idb-keyval": "6.2.1", "immer": "10.1.1", - "jotai": "2.12.2", + "jotai": "2.12.3", "lethargy": "1.0.9", "masonic": "4.0.1", "mdast-util-gfm-table": "2.0.0", "mdast-util-to-markdown": "2.1.2", + "motion": "12.7.4", "nanoid": "5.1.5", "ofetch": "1.4.1", "plain-shiki": "0.2.0", @@ -77,23 +77,23 @@ "react-blurhash": "0.3.0", "react-fast-marquee": "1.6.5", "react-hook-form": "7.55.0", - "react-hotkeys-hook": "4.6.1", + "react-hotkeys-hook": "5.0.1", "react-i18next": "15.4.1", "react-intersection-observer": "9.16.0", "react-ios-pwa-prompt": "2.0.6", "react-qr-code": "2.0.15", "react-resizable-layout": "npm:@innei/react-resizable-layout@0.7.3-fork.1", - "react-router": "7.5.0", + "react-router": "7.5.1", "react-selecto": "1.26.3", "react-shadow": "20.6.0", "react-zoom-pan-pinch": "3.7.0", - "shiki": "3.2.1", + "shiki": "3.2.2", "sonner": "2.0.3", - "tldts": "6.1.85", + "tldts": "7.0.0", "use-context-selector": "2.0.0", "use-sync-external-store": "1.5.0", "usehooks-ts": "3.1.1", - "zod": "3.24.2", + "zod": "3.24.3", "zustand": "5.0.3" }, "devDependencies": { @@ -105,7 +105,7 @@ "@follow/models": "workspace:*", "@follow/types": "workspace:*", "@follow/utils": "workspace:*", - "@types/node": "22.14.0", + "@types/node": "22.14.1", "@vite-pwa/assets-generator": "1.0.0", "fake-indexeddb": "6.0.0", "happy-dom": "17.4.4", diff --git a/apps/desktop/src/renderer/src/atoms/readability.ts b/apps/desktop/src/renderer/src/atoms/readability.ts index 961384487..5ebba8eb5 100644 --- a/apps/desktop/src/renderer/src/atoms/readability.ts +++ b/apps/desktop/src/renderer/src/atoms/readability.ts @@ -1,4 +1,6 @@ +import { getStorageNS } from "@follow/utils/ns" import { atom } from "jotai" +import { atomWithStorage } from "jotai/utils" import { createAtomHooks } from "~/lib/jotai" @@ -28,7 +30,11 @@ export const [ getReadabilityContent, __setReadabilityContent, useReadabilityContentSelector, -] = createAtomHooks(atom>({})) +] = createAtomHooks( + atomWithStorage>(getStorageNS("readability-content"), {}, undefined, { + getOnInit: true, + }), +) export const setReadabilityContent = mergeObjectSetter( __setReadabilityContent, getReadabilityContent, @@ -57,6 +63,12 @@ export const useEntryIsInReadability = (entryId?: string) => [entryId], ) +export const useEntryIsInReadabilitySuccess = (entryId?: string) => + useReadabilityStatusSelector( + (map) => (entryId ? map[entryId] === ReadabilityStatus.SUCCESS : false), + [entryId], + ) + export const useEntryInReadabilityStatus = (entryId?: string) => useReadabilityStatusSelector( (map) => (entryId ? map[entryId] || ReadabilityStatus.INITIAL : ReadabilityStatus.INITIAL), diff --git a/apps/desktop/src/renderer/src/atoms/settings/general.ts b/apps/desktop/src/renderer/src/atoms/settings/general.ts index 895679afd..1be78c825 100644 --- a/apps/desktop/src/renderer/src/atoms/settings/general.ts +++ b/apps/desktop/src/renderer/src/atoms/settings/general.ts @@ -178,6 +178,13 @@ export function useActionLanguage() { ) as SupportedLanguages } +export function getActionLanguage() { + const { actionLanguage, language } = getGeneralSettingsInternal() + return ( + actionLanguage === DEFAULT_ACTION_LANGUAGE ? language : actionLanguage + ) as SupportedLanguages +} + export const subscribeShouldUseIndexedDB = (callback: (value: boolean) => void) => jotaiStore.sub(__generalSettingAtom, () => callback(getGeneralSettingsInternal().dataPersist)) diff --git a/apps/desktop/src/renderer/src/components/common/Motion.tsx b/apps/desktop/src/renderer/src/components/common/Motion.tsx index f6d092d48..dcec6083c 100644 --- a/apps/desktop/src/renderer/src/components/common/Motion.tsx +++ b/apps/desktop/src/renderer/src/components/common/Motion.tsx @@ -1,5 +1,5 @@ -import type { MotionProps, TargetAndTransition } from "framer-motion" -import { m as M } from "framer-motion" +import type { MotionProps, TargetAndTransition } from "motion/react" +import { m as M } from "motion/react" import { createElement, forwardRef } from "react" import { useReduceMotion } from "~/hooks/biz/useReduceMotion" diff --git a/apps/desktop/src/renderer/src/components/ui/auto-completion/AutoCompletion.tsx b/apps/desktop/src/renderer/src/components/ui/auto-completion/AutoCompletion.tsx index 653b5eafe..6d751dcea 100644 --- a/apps/desktop/src/renderer/src/components/ui/auto-completion/AutoCompletion.tsx +++ b/apps/desktop/src/renderer/src/components/ui/auto-completion/AutoCompletion.tsx @@ -3,8 +3,8 @@ import { useCorrectZIndex } from "@follow/components/ui/z-index/ctx.js" import { stopPropagation } from "@follow/utils/dom" import { cn } from "@follow/utils/utils" import { Combobox, ComboboxInput, ComboboxOption, ComboboxOptions } from "@headlessui/react" -import { AnimatePresence, m } from "framer-motion" import Fuse from "fuse.js" +import { AnimatePresence, m } from "motion/react" import { forwardRef, Fragment, useCallback, useEffect, useState } from "react" export type Suggestion = { diff --git a/apps/desktop/src/renderer/src/components/ui/button/CopyButton.tsx b/apps/desktop/src/renderer/src/components/ui/button/CopyButton.tsx index 6ffbe5a74..7abebc66c 100644 --- a/apps/desktop/src/renderer/src/components/ui/button/CopyButton.tsx +++ b/apps/desktop/src/renderer/src/components/ui/button/CopyButton.tsx @@ -7,7 +7,7 @@ import { AnimatedCommandButton } from "./base" export const CopyButton: Component<{ value: string style?: React.CSSProperties - variant?: "solid" | "outline" + variant?: "solid" | "outline" | "ghost" }> = ({ value, className, style, variant = "solid" }) => { const copiedTimerRef = useRef() const handleCopy = useCallback(() => { diff --git a/apps/desktop/src/renderer/src/components/ui/button/base.tsx b/apps/desktop/src/renderer/src/components/ui/button/base.tsx index a4b8b56d7..9b080cc22 100644 --- a/apps/desktop/src/renderer/src/components/ui/button/base.tsx +++ b/apps/desktop/src/renderer/src/components/ui/button/base.tsx @@ -1,8 +1,8 @@ import { MotionButtonBase } from "@follow/components/ui/button/index.js" import { useTypeScriptHappyCallback } from "@follow/hooks" import { cn } from "@follow/utils/utils" -import type { HTMLMotionProps, Variants } from "framer-motion" -import { AnimatePresence, m } from "framer-motion" +import type { HTMLMotionProps, Variants } from "motion/react" +import { AnimatePresence, m } from "motion/react" import type { FC } from "react" import * as React from "react" import { cloneElement, useRef, useState } from "react" @@ -44,7 +44,7 @@ export const AnimatedCommandButton: FC, typescriptreact: , @@ -62,15 +25,6 @@ const languageToIconMap = { css: , markdown: , } -export const getLanguageColor = (language?: string) => { - if (!language) return - - const alias = LanguageAlias[language] - if (alias) { - return LanguageToColorMap[alias] - } - return LanguageToColorMap[language] -} export const getLanguageIcon = (language?: string) => { if (!language) return null diff --git a/apps/desktop/src/renderer/src/components/ui/code-highlighter/shiki/Shiki.tsx b/apps/desktop/src/renderer/src/components/ui/code-highlighter/shiki/Shiki.tsx index 752c01eb2..86d17d593 100644 --- a/apps/desktop/src/renderer/src/components/ui/code-highlighter/shiki/Shiki.tsx +++ b/apps/desktop/src/renderer/src/components/ui/code-highlighter/shiki/Shiki.tsx @@ -1,4 +1,3 @@ -import { useIsDark } from "@follow/hooks" import { ELECTRON_BUILD } from "@follow/shared/constants" import { cn } from "@follow/utils/utils" import { useIsomorphicLayoutEffect } from "foxact/use-isomorphic-layout-effect" @@ -11,11 +10,12 @@ import type { DynamicImportThemeRegistration, } from "shiki" -import { useUISettingKey, useUISettingSelector } from "~/atoms/settings/ui" +import { useUISettingKey } from "~/atoms/settings/ui" import { tipcClient } from "~/lib/client" import { CopyButton } from "../../button/CopyButton" -import { getLanguageColor, getLanguageIcon } from "../constants" +import { getLanguageIcon } from "../constants" +import { useShikiDefaultTheme } from "./hooks" import { shiki, shikiTransformers } from "./shared" import styles from "./shiki.module.css" @@ -72,10 +72,7 @@ export const ShikiHighLighter: FC = (props) => { const [loaded, setLoaded] = useState(false) - const isDark = useIsDark() - const codeThemeLight = useUISettingSelector((s) => overrideTheme || s.codeHighlightThemeLight) - const codeThemeDark = useUISettingSelector((s) => overrideTheme || s.codeHighlightThemeDark) - const codeTheme = isDark ? codeThemeDark : codeThemeLight + const codeTheme = useShikiDefaultTheme(overrideTheme) useIsomorphicLayoutEffect(() => { let isMounted = true @@ -188,27 +185,22 @@ const ShikiCode: FC< return (
+
+ {language !== "plaintext" && ( + + {getLanguageIcon(language)} + {language} + + )} + +
- - {language !== "plaintext" && ( - - {getLanguageIcon(language)} - {language} - - )}
) } diff --git a/apps/desktop/src/renderer/src/components/ui/code-highlighter/shiki/hooks.ts b/apps/desktop/src/renderer/src/components/ui/code-highlighter/shiki/hooks.ts index e85bd7649..9b57d1b07 100644 --- a/apps/desktop/src/renderer/src/components/ui/code-highlighter/shiki/hooks.ts +++ b/apps/desktop/src/renderer/src/components/ui/code-highlighter/shiki/hooks.ts @@ -1,7 +1,11 @@ import { useIsDark } from "@follow/hooks" -export const useShikiDefaultTheme = () => { - const isDark = useIsDark() +import { useUISettingSelector } from "~/atoms/settings/ui" - return isDark ? "github-dark" : "github-light" +export const useShikiDefaultTheme = (overrideTheme?: string) => { + const isDark = useIsDark() + const codeThemeLight = useUISettingSelector((s) => overrideTheme || s.codeHighlightThemeLight) + const codeThemeDark = useUISettingSelector((s) => overrideTheme || s.codeHighlightThemeDark) + + return isDark ? codeThemeDark : codeThemeLight } diff --git a/apps/desktop/src/renderer/src/components/ui/collapse/Collapse.tsx b/apps/desktop/src/renderer/src/components/ui/collapse/Collapse.tsx index dc243fb90..4efb11a26 100644 --- a/apps/desktop/src/renderer/src/components/ui/collapse/Collapse.tsx +++ b/apps/desktop/src/renderer/src/components/ui/collapse/Collapse.tsx @@ -1,8 +1,8 @@ import { jotaiStore } from "@follow/utils/jotai" import { cn } from "@follow/utils/utils" -import type { Variants } from "framer-motion" -import { AnimatePresence, m } from "framer-motion" import { atom, useAtom, useStore } from "jotai" +import type { Variants } from "motion/react" +import { AnimatePresence, m } from "motion/react" import * as React from "react" import { useEffect } from "react" diff --git a/apps/desktop/src/renderer/src/components/ui/constants/spring.ts b/apps/desktop/src/renderer/src/components/ui/constants/spring.ts index f224a44b2..7f921c604 100644 --- a/apps/desktop/src/renderer/src/components/ui/constants/spring.ts +++ b/apps/desktop/src/renderer/src/components/ui/constants/spring.ts @@ -1,4 +1,4 @@ -import type { Spring } from "framer-motion" +import type { Spring } from "motion/react" export const reboundPreset: Spring = { type: "spring", diff --git a/apps/desktop/src/renderer/src/components/ui/fab/FABContainer.tsx b/apps/desktop/src/renderer/src/components/ui/fab/FABContainer.tsx index a936f40bc..93cdf3ddc 100644 --- a/apps/desktop/src/renderer/src/components/ui/fab/FABContainer.tsx +++ b/apps/desktop/src/renderer/src/components/ui/fab/FABContainer.tsx @@ -2,9 +2,9 @@ import { RootPortal } from "@follow/components/ui/portal/index.jsx" import { useTypeScriptHappyCallback } from "@follow/hooks" import { clsx, cn } from "@follow/utils/utils" import { typescriptHappyForwardRef } from "foxact/typescript-happy-forward-ref" -import type { HTMLMotionProps } from "framer-motion" -import { AnimatePresence } from "framer-motion" import { atom, useAtomValue } from "jotai" +import type { HTMLMotionProps } from "motion/react" +import { AnimatePresence } from "motion/react" import type * as React from "react" import type { JSX, PropsWithChildren, ReactNode } from "react" import { useId } from "react" diff --git a/apps/desktop/src/renderer/src/components/ui/markdown/components/Toc.tsx b/apps/desktop/src/renderer/src/components/ui/markdown/components/Toc.tsx index 61ff3ed5a..183d8cf66 100644 --- a/apps/desktop/src/renderer/src/components/ui/markdown/components/Toc.tsx +++ b/apps/desktop/src/renderer/src/components/ui/markdown/components/Toc.tsx @@ -1,7 +1,7 @@ import { useViewport } from "@follow/components/hooks/useViewport.js" import { cn } from "@follow/utils/utils" import * as HoverCard from "@radix-ui/react-hover-card" -import { AnimatePresence, m } from "framer-motion" +import { AnimatePresence, m } from "motion/react" import { memo, useContext, useEffect, useRef, useState } from "react" import { useRealInWideMode } from "~/atoms/settings/ui" diff --git a/apps/desktop/src/renderer/src/components/ui/media.tsx b/apps/desktop/src/renderer/src/components/ui/media.tsx index f8a1b45b9..ee0e44258 100644 --- a/apps/desktop/src/renderer/src/components/ui/media.tsx +++ b/apps/desktop/src/renderer/src/components/ui/media.tsx @@ -2,7 +2,7 @@ import { nextFrame } from "@follow/utils/dom" import { getImageProxyUrl } from "@follow/utils/img-proxy" import { cn } from "@follow/utils/utils" import { omit } from "es-toolkit/compat" -import { useForceUpdate } from "framer-motion" +import { useForceUpdate } from "motion/react" import type { FC, ImgHTMLAttributes, VideoHTMLAttributes } from "react" import { createContext, memo, useContext, useMemo, useState } from "react" import { Blurhash, BlurhashCanvas } from "react-blurhash" diff --git a/apps/desktop/src/renderer/src/components/ui/media/VideoPlayer.tsx b/apps/desktop/src/renderer/src/components/ui/media/VideoPlayer.tsx index 2c3a7cc44..37a8b1b62 100644 --- a/apps/desktop/src/renderer/src/components/ui/media/VideoPlayer.tsx +++ b/apps/desktop/src/renderer/src/components/ui/media/VideoPlayer.tsx @@ -5,7 +5,7 @@ import { useRefValue, useVideo } from "@follow/hooks" import { nextFrame, stopPropagation } from "@follow/utils/dom" import { clsx, cn } from "@follow/utils/utils" import * as Slider from "@radix-ui/react-slider" -import { m, useDragControls, useSpring } from "framer-motion" +import { m, useDragControls, useSpring } from "motion/react" import type { PropsWithChildren } from "react" import { forwardRef, diff --git a/apps/desktop/src/renderer/src/components/ui/modal/helper/async-loading.tsx b/apps/desktop/src/renderer/src/components/ui/modal/helper/async-loading.tsx index 38497947a..2ad058981 100644 --- a/apps/desktop/src/renderer/src/components/ui/modal/helper/async-loading.tsx +++ b/apps/desktop/src/renderer/src/components/ui/modal/helper/async-loading.tsx @@ -2,7 +2,7 @@ import { Button } from "@follow/components/ui/button/index.js" import { LoadingCircle } from "@follow/components/ui/loading/index.jsx" import { Tooltip, TooltipContent, TooltipTrigger } from "@follow/components/ui/tooltip/index.jsx" import { stopPropagation } from "@follow/utils/dom" -import { m } from "framer-motion" +import { m } from "motion/react" import * as React from "react" import { useTranslation } from "react-i18next" diff --git a/apps/desktop/src/renderer/src/components/ui/modal/stacked/constants.ts b/apps/desktop/src/renderer/src/components/ui/modal/stacked/constants.ts index 2d4c8ef4f..1d5b90099 100644 --- a/apps/desktop/src/renderer/src/components/ui/modal/stacked/constants.ts +++ b/apps/desktop/src/renderer/src/components/ui/modal/stacked/constants.ts @@ -1,4 +1,4 @@ -import type { MotionProps, Target } from "framer-motion" +import type { MotionProps, Target } from "motion/react" import { microReboundPreset } from "../../constants/spring" diff --git a/apps/desktop/src/renderer/src/components/ui/modal/stacked/custom-modal.tsx b/apps/desktop/src/renderer/src/components/ui/modal/stacked/custom-modal.tsx index c923bd404..a403365bc 100644 --- a/apps/desktop/src/renderer/src/components/ui/modal/stacked/custom-modal.tsx +++ b/apps/desktop/src/renderer/src/components/ui/modal/stacked/custom-modal.tsx @@ -1,6 +1,6 @@ import { nextFrame, stopPropagation } from "@follow/utils/dom" import { cn } from "@follow/utils/utils" -import { m, useAnimationControls } from "framer-motion" +import { m, useAnimationControls } from "motion/react" import type { FC, PropsWithChildren } from "react" import { useEffect, useState } from "react" diff --git a/apps/desktop/src/renderer/src/components/ui/modal/stacked/declarative-modal.tsx b/apps/desktop/src/renderer/src/components/ui/modal/stacked/declarative-modal.tsx index 838f2ec46..47209c442 100644 --- a/apps/desktop/src/renderer/src/components/ui/modal/stacked/declarative-modal.tsx +++ b/apps/desktop/src/renderer/src/components/ui/modal/stacked/declarative-modal.tsx @@ -1,5 +1,5 @@ import { cn } from "@follow/utils/utils" -import { AnimatePresence } from "framer-motion" +import { AnimatePresence } from "motion/react" import type { FC, ReactNode } from "react" import { useId, useMemo } from "react" diff --git a/apps/desktop/src/renderer/src/components/ui/modal/stacked/hooks.tsx b/apps/desktop/src/renderer/src/components/ui/modal/stacked/hooks.tsx index 56e707814..efb199485 100644 --- a/apps/desktop/src/renderer/src/components/ui/modal/stacked/hooks.tsx +++ b/apps/desktop/src/renderer/src/components/ui/modal/stacked/hooks.tsx @@ -1,7 +1,7 @@ import { Button } from "@follow/components/ui/button/index.js" import { nextFrame } from "@follow/utils/dom" -import type { DragControls } from "framer-motion" import { atom, useAtomValue } from "jotai" +import type { DragControls } from "motion/react" import type { ResizeCallback, ResizeStartCallback } from "re-resizable" import { useContext, useId, useRef, useState } from "react" import { flushSync } from "react-dom" diff --git a/apps/desktop/src/renderer/src/components/ui/modal/stacked/internal/use-animate.ts b/apps/desktop/src/renderer/src/components/ui/modal/stacked/internal/use-animate.ts index 68f77f64c..8f990f015 100644 --- a/apps/desktop/src/renderer/src/components/ui/modal/stacked/internal/use-animate.ts +++ b/apps/desktop/src/renderer/src/components/ui/modal/stacked/internal/use-animate.ts @@ -1,5 +1,5 @@ import { nextFrame } from "@follow/utils/dom" -import { useAnimationControls } from "framer-motion" +import { useAnimationControls } from "motion/react" import { useCallback, useEffect, useLayoutEffect } from "react" import { useEventCallback } from "usehooks-ts" diff --git a/apps/desktop/src/renderer/src/components/ui/modal/stacked/internal/use-drag.ts b/apps/desktop/src/renderer/src/components/ui/modal/stacked/internal/use-drag.ts index e34b87752..db89c4a9d 100644 --- a/apps/desktop/src/renderer/src/components/ui/modal/stacked/internal/use-drag.ts +++ b/apps/desktop/src/renderer/src/components/ui/modal/stacked/internal/use-drag.ts @@ -1,4 +1,4 @@ -import { useDragControls } from "framer-motion" +import { useDragControls } from "motion/react" import type { PointerEventHandler, RefObject } from "react" import { useCallback } from "react" diff --git a/apps/desktop/src/renderer/src/components/ui/modal/stacked/modal-stack.electron.tsx b/apps/desktop/src/renderer/src/components/ui/modal/stacked/modal-stack.electron.tsx index 3ccc950c7..5a13b83b6 100644 --- a/apps/desktop/src/renderer/src/components/ui/modal/stacked/modal-stack.electron.tsx +++ b/apps/desktop/src/renderer/src/components/ui/modal/stacked/modal-stack.electron.tsx @@ -1,5 +1,5 @@ -import { AnimatePresence } from "framer-motion" import { useAtomValue } from "jotai" +import { AnimatePresence } from "motion/react" import { modalStackAtom } from "./atom" import { useModalStack } from "./hooks" diff --git a/apps/desktop/src/renderer/src/components/ui/modal/stacked/modal-stack.mobile.tsx b/apps/desktop/src/renderer/src/components/ui/modal/stacked/modal-stack.mobile.tsx index 4045af289..f5edc948c 100644 --- a/apps/desktop/src/renderer/src/components/ui/modal/stacked/modal-stack.mobile.tsx +++ b/apps/desktop/src/renderer/src/components/ui/modal/stacked/modal-stack.mobile.tsx @@ -2,9 +2,9 @@ import { sheetStackAtom } from "@follow/components/ui/sheet/context.js" import type { SheetRef } from "@follow/components/ui/sheet/Sheet.js" import { PresentSheet } from "@follow/components/ui/sheet/Sheet.js" import { jotaiStore } from "@follow/utils/jotai" -import { AnimatePresence } from "framer-motion" import { produce } from "immer" import { useAtomValue, useSetAtom } from "jotai" +import { AnimatePresence } from "motion/react" import { createElement, useMemo, useRef } from "react" import { useEventCallback } from "usehooks-ts" diff --git a/apps/desktop/src/renderer/src/components/ui/modal/stacked/modal.tsx b/apps/desktop/src/renderer/src/components/ui/modal/stacked/modal.tsx index 5e465db72..14a003360 100644 --- a/apps/desktop/src/renderer/src/components/ui/modal/stacked/modal.tsx +++ b/apps/desktop/src/renderer/src/components/ui/modal/stacked/modal.tsx @@ -7,10 +7,10 @@ import { ELECTRON_BUILD } from "@follow/shared/constants" import { nextFrame, preventDefault, stopPropagation } from "@follow/utils/dom" import { cn, getOS } from "@follow/utils/utils" import * as Dialog from "@radix-ui/react-dialog" -import type { BoundingBox } from "framer-motion" import { produce } from "immer" import { useAtomValue, useSetAtom } from "jotai" import { selectAtom } from "jotai/utils" +import type { BoundingBox } from "motion/react" import { Resizable } from "re-resizable" import type { FC, PropsWithChildren, SyntheticEvent } from "react" import { diff --git a/apps/desktop/src/renderer/src/components/ui/modal/stacked/overlay.tsx b/apps/desktop/src/renderer/src/components/ui/modal/stacked/overlay.tsx index 7914d75cc..83ca2898f 100644 --- a/apps/desktop/src/renderer/src/components/ui/modal/stacked/overlay.tsx +++ b/apps/desktop/src/renderer/src/components/ui/modal/stacked/overlay.tsx @@ -1,6 +1,6 @@ import { cn } from "@follow/utils/utils" import * as Dialog from "@radix-ui/react-dialog" -import { AnimatePresence } from "framer-motion" +import { AnimatePresence } from "motion/react" import type { ForwardedRef } from "react" import { forwardRef } from "react" diff --git a/apps/desktop/src/renderer/src/components/ux/transition/icon.tsx b/apps/desktop/src/renderer/src/components/ux/transition/icon.tsx index 882aef604..573736f44 100644 --- a/apps/desktop/src/renderer/src/components/ux/transition/icon.tsx +++ b/apps/desktop/src/renderer/src/components/ux/transition/icon.tsx @@ -1,6 +1,6 @@ import { cn } from "@follow/utils/utils" -import type { Spring, Target } from "framer-motion" -import { AnimatePresence, m } from "framer-motion" +import type { Spring, Target } from "motion/react" +import { AnimatePresence, m } from "motion/react" import * as React from "react" import { cloneElement, useEffect, useState } from "react" diff --git a/apps/desktop/src/renderer/src/hooks/biz/useEntryActions.tsx b/apps/desktop/src/renderer/src/hooks/biz/useEntryActions.tsx index eeb3b06bd..5f33139c6 100644 --- a/apps/desktop/src/renderer/src/hooks/biz/useEntryActions.tsx +++ b/apps/desktop/src/renderer/src/hooks/biz/useEntryActions.tsx @@ -1,20 +1,22 @@ import { isMobile } from "@follow/components/hooks/useMobile.js" -import { FeedViewType, UserRole } from "@follow/constants" +import { FeedViewType, UserRole, views } from "@follow/constants" import { IN_ELECTRON } from "@follow/shared/constants" -import { useCallback, useMemo } from "react" +import { useMemo } from "react" import { useShowAISummaryAuto, useShowAISummaryOnce } from "~/atoms/ai-summary" import { useShowAITranslationAuto, useShowAITranslationOnce } from "~/atoms/ai-translation" import { + getReadabilityContent, getReadabilityStatus, ReadabilityStatus, setReadabilityContent, setReadabilityStatus, + useEntryIsInReadability, } from "~/atoms/readability" import { useShowSourceContent } from "~/atoms/source-content" import { useUserRole, whoami } from "~/atoms/user" import { shortcuts } from "~/constants/shortcuts" -import { tipcClient } from "~/lib/client" +import { apiClient } from "~/lib/api-fetch" import { COMMAND_ID } from "~/modules/command/commands/id" import { useRunCommandFn } from "~/modules/command/hooks/use-command" import type { FollowCommandId } from "~/modules/command/types" @@ -25,41 +27,45 @@ import { useInboxById } from "~/store/inbox" import { useRouteParamsSelector } from "./useRouteParams" -export const useEntryReadabilityToggle = ({ id, url }: { id: string; url: string }) => - useCallback(async () => { - const status = getReadabilityStatus()[id] - const isTurnOn = status !== ReadabilityStatus.INITIAL && !!status +export const toggleEntryReadability = async ({ id, url }: { id: string; url: string }) => { + const status = getReadabilityStatus()[id] + const isTurnOn = status !== ReadabilityStatus.INITIAL && !!status - if (!isTurnOn && url) { - setReadabilityStatus({ - [id]: ReadabilityStatus.WAITING, - }) - const result = await tipcClient - ?.readability({ - url, - }) - .catch(() => { - setReadabilityStatus({ - [id]: ReadabilityStatus.FAILURE, - }) - }) + if (!isTurnOn && url) { + setReadabilityStatus({ + [id]: ReadabilityStatus.WAITING, + }) + try { + let data = getReadabilityContent()[id] - if (result) { + if (!data) { + const result = await apiClient.entries.readability.$get({ query: { id } }) + if (result.data) { + data = result.data + } + } + + if (data) { const status = getReadabilityStatus()[id] if (status !== ReadabilityStatus.WAITING) return setReadabilityStatus({ [id]: ReadabilityStatus.SUCCESS, }) setReadabilityContent({ - [id]: result, + [id]: data, }) } - } else { + } catch { setReadabilityStatus({ - [id]: ReadabilityStatus.INITIAL, + [id]: ReadabilityStatus.FAILURE, }) } - }, [id, url]) + } else { + setReadabilityStatus({ + [id]: ReadabilityStatus.INITIAL, + }) + } +} export type EntryActionItem = { id: FollowCommandId @@ -68,10 +74,25 @@ export type EntryActionItem = { shortcut?: string active?: boolean disabled?: boolean + notice?: boolean + entryId: string } -export const useEntryActions = ({ entryId, view }: { entryId: string; view?: FeedViewType }) => { +function hasHTMLTags(text?: string | null): boolean { + return /<[^>]+>/.test(text || "") +} + +export const useEntryActions = ({ + entryId, + view, + compact, +}: { + entryId: string + view?: FeedViewType + compact?: boolean +}) => { const entry = useEntry(entryId) + const isEntryInReadability = useEntryIsInReadability(entry?.entries.id) const imageLength = entry?.entries.media?.filter((a) => a.type === "photo").length || 0 const feed = useFeedById(entry?.feedId, (feed) => { return { @@ -84,6 +105,7 @@ export const useEntryActions = ({ entryId, view }: { entryId: string; view?: Fee const inList = !!listId const inbox = useInboxById(entry?.inboxId) const isInbox = !!inbox + const isContentContainsHTMLTags = hasHTMLTags(entry?.entries.content) const isShowSourceContent = useShowSourceContent() const isShowAISummaryAuto = useShowAISummaryAuto(entry) @@ -208,17 +230,49 @@ export const useEntryActions = ({ entryId, view }: { entryId: string; view?: Fee active: !!entry?.read, shortcut: shortcuts.entry.toggleRead.key, }, + { + id: COMMAND_ID.entry.tts, + onClick: runCmdFn(COMMAND_ID.entry.tts, [ + { entryId, entryContent: entry?.entries.content }, + ]), + hide: !IN_ELECTRON || compact || !entry?.entries.content, + shortcut: shortcuts.entry.tts.key, + }, + { + id: COMMAND_ID.entry.readability, + onClick: runCmdFn(COMMAND_ID.entry.readability, [ + { entryId, entryUrl: entry?.entries.url }, + ]), + hide: + !!entry.settings?.readability || + compact || + (view && views[view]!.wideMode) || + !entry?.entries.url, + active: isEntryInReadability, + notice: !isContentContainsHTMLTags && !isEntryInReadability, + }, { id: COMMAND_ID.settings.customizeToolbar, onClick: runCmdFn(COMMAND_ID.settings.customizeToolbar, []), }, - ].filter((config) => !config.hide) + ] + .filter((config) => !config.hide) + .map((config) => { + return { + ...config, + entryId, + } + }) }, [ + compact, entry?.collections, + entry?.entries.content, entry?.entries.url, entry?.read, + entry?.settings?.readability, entry?.view, entryId, + isEntryInReadability, feed?.id, feed?.ownerUserId, hasEntry, @@ -230,6 +284,7 @@ export const useEntryActions = ({ entryId, view }: { entryId: string; view?: Fee isShowAITranslationAuto, isShowAITranslationOnce, isShowSourceContent, + isContentContainsHTMLTags, runCmdFn, userRole, view, @@ -241,11 +296,13 @@ export const useEntryActions = ({ entryId, view }: { entryId: string; view?: Fee export const useSortedEntryActions = ({ entryId, view, + compact, }: { entryId: string view?: FeedViewType + compact?: boolean }) => { - const entryActions = useEntryActions({ entryId, view }) + const entryActions = useEntryActions({ entryId, view, compact }) const orderMap = useToolbarOrderMap() const mainAction = useMemo( () => diff --git a/apps/desktop/src/renderer/src/hooks/biz/useFeedActions.tsx b/apps/desktop/src/renderer/src/hooks/biz/useFeedActions.tsx index e29f64a44..1df39c7e7 100644 --- a/apps/desktop/src/renderer/src/hooks/biz/useFeedActions.tsx +++ b/apps/desktop/src/renderer/src/hooks/biz/useFeedActions.tsx @@ -359,6 +359,16 @@ export const useFeedActions = ({ navigator.clipboard.writeText(feedId) }, }, + { + type: "text" as const, + label: t("sidebar.feed_actions.copy_feed_badge"), + disabled: isEntryList, + click: () => { + navigator.clipboard.writeText( + `https://badge.follow.is/feed/${feedId}?color=FF5C00&labelColor=black&style=flat-square`, + ) + }, + }, ] return items.filter( diff --git a/apps/desktop/src/renderer/src/hooks/biz/useReduceMotion.ts b/apps/desktop/src/renderer/src/hooks/biz/useReduceMotion.ts index 36d023f3b..1edb4d191 100644 --- a/apps/desktop/src/renderer/src/hooks/biz/useReduceMotion.ts +++ b/apps/desktop/src/renderer/src/hooks/biz/useReduceMotion.ts @@ -1,4 +1,4 @@ -import { useReducedMotion } from "framer-motion" +import { useReducedMotion } from "motion/react" import { useUISettingKey } from "~/atoms/settings/ui" diff --git a/apps/desktop/src/renderer/src/hooks/biz/useSignOut.ts b/apps/desktop/src/renderer/src/hooks/biz/useSignOut.ts deleted file mode 100644 index 1655a0095..000000000 --- a/apps/desktop/src/renderer/src/hooks/biz/useSignOut.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { clearStorage } from "@follow/utils/ns" -import { useCallback } from "react" - -import { setWhoami } from "~/atoms/user" -import { QUERY_PERSIST_KEY } from "~/constants" -import { signOut } from "~/lib/auth" -import { tipcClient } from "~/lib/client" -import { clearLocalPersistStoreData } from "~/store/utils/clear" - -export const useSignOut = () => - useCallback(async () => { - if (window.__RN__) { - window.ReactNativeWebView?.postMessage("sign-out") - return - } - - // Clear query cache - localStorage.removeItem(QUERY_PERSIST_KEY) - - // setLoginModalShow(true) - setWhoami(null) - - // Clear local storage - clearStorage() - - // clear local store data - await Promise.allSettled([ - clearLocalPersistStoreData(), - tipcClient?.cleanBetterAuthSessionCookie(), - ]) - // Sign out - await signOut().then(() => { - window.location.reload() - }) - }, []) diff --git a/apps/desktop/src/renderer/src/hooks/common/useSwitchHotkeyScope.ts b/apps/desktop/src/renderer/src/hooks/common/useSwitchHotkeyScope.ts index 46c0c7477..b24c298a3 100644 --- a/apps/desktop/src/renderer/src/hooks/common/useSwitchHotkeyScope.ts +++ b/apps/desktop/src/renderer/src/hooks/common/useSwitchHotkeyScope.ts @@ -26,8 +26,8 @@ export const useSwitchHotKeyScope = () => { ) } export const useHotkeyScopeFn = (scope: keyof typeof HotKeyScopeMap) => { - const { enableScope, disableScope, enabledScopes } = useHotkeysContext() - const currentScopeRef = useRef(enabledScopes) + const { enableScope, disableScope, activeScopes } = useHotkeysContext() + const currentScopeRef = useRef(activeScopes) return useCallback(() => { const currentScope = currentScopeRef.current diff --git a/apps/desktop/src/renderer/src/lib/auth.ts b/apps/desktop/src/renderer/src/lib/auth.ts index 793923b3c..be46cbc0f 100644 --- a/apps/desktop/src/renderer/src/lib/auth.ts +++ b/apps/desktop/src/renderer/src/lib/auth.ts @@ -1,52 +1,22 @@ -import { IN_ELECTRON } from "@follow/shared" +import { Auth } from "@follow/shared/auth" import { env } from "@follow/shared/env.desktop" -import type { authPlugins } from "@follow/shared/hono" -import type { BetterAuthClientPlugin } from "better-auth/client" -import { inferAdditionalFields, twoFactorClient } from "better-auth/client/plugins" -import { createAuthClient } from "better-auth/react" -import { WEB_URL } from "~/constants/env" - -type AuthPlugin = (typeof authPlugins)[number] -const serverPlugins = [ - { - id: "customGetProviders", - $InferServerPlugin: {} as Extract, - }, - { - id: "customCreateSession", - $InferServerPlugin: {} as Extract, - }, - { - id: "getAccountInfo", - $InferServerPlugin: {} as Extract, - }, - inferAdditionalFields({ - user: { - handle: { - type: "string", - required: false, - }, - }, - }), -] satisfies BetterAuthClientPlugin[] - -const authClient = createAuthClient({ - baseURL: `${env.VITE_API_URL}/better-auth`, - plugins: [...serverPlugins, twoFactorClient()], +const auth = new Auth({ + apiURL: env.VITE_API_URL, + webURL: env.VITE_WEB_URL, }) // @keep-sorted export const { changeEmail, changePassword, - createSession, forgetPassword, getAccountInfo, getProviders, getSession, linkSocial, listAccounts, + oneTimeToken, resetPassword, sendVerificationEmail, signIn, @@ -55,33 +25,6 @@ export const { twoFactor, unlinkAccount, updateUser, -} = authClient +} = auth.authClient -export type LoginRuntime = "browser" | "app" -export const loginHandler = async ( - provider: string, - runtime?: LoginRuntime, - args?: { - email?: string - password?: string - headers?: Record - }, -) => { - const { email, password, headers } = args ?? {} - if (IN_ELECTRON && provider !== "credential") { - window.open(`${WEB_URL}/login?provider=${provider}`) - } else { - if (provider === "credential") { - if (!email || !password) { - window.location.href = "/login" - return - } - return signIn.email({ email, password }, { headers }) - } - - signIn.social({ - provider: provider as "google" | "github" | "apple", - callbackURL: runtime === "app" ? `${WEB_URL}/login` : WEB_URL, - }) - } -} +export const { loginHandler } = auth diff --git a/apps/desktop/src/renderer/src/lib/load-language.ts b/apps/desktop/src/renderer/src/lib/load-language.ts index c8b3feb23..138a8a335 100644 --- a/apps/desktop/src/renderer/src/lib/load-language.ts +++ b/apps/desktop/src/renderer/src/lib/load-language.ts @@ -40,6 +40,9 @@ export const loadLanguageAndApply = async (lang: string) => { const loaded = loadedLangs.has(lang) if (loaded) { + if (import.meta.env.DEV) { + EventBus.dispatch("I18N_UPDATE", "") + } return } diff --git a/apps/desktop/src/renderer/src/lib/translate.ts b/apps/desktop/src/renderer/src/lib/translate.ts index bcf602b8d..58786b64c 100644 --- a/apps/desktop/src/renderer/src/lib/translate.ts +++ b/apps/desktop/src/renderer/src/lib/translate.ts @@ -4,6 +4,7 @@ import type { SupportedActionLanguage } from "@follow/shared" import { ACTION_LANGUAGE_MAP } from "@follow/shared" import { franc } from "franc-min" +import { getReadabilityContent } from "~/atoms/readability" import type { FlatEntryModel } from "~/store/entry" import { apiClient } from "./api-fetch" @@ -57,6 +58,16 @@ export async function translate({ } fields = fields.filter((field) => { + if (language && field === "readabilityContent") { + const content = getReadabilityContent()[entry.entries.id]?.content + if (!content) return false + const isLanguageMatch = checkLanguage({ + content, + language, + }) + return !isLanguageMatch + } + if (language && entry.entries[field]) { const isLanguageMatch = checkLanguage({ content: entry.entries[field], diff --git a/apps/desktop/src/renderer/src/modules/action/target-action-list.tsx b/apps/desktop/src/renderer/src/modules/action/target-action-list.tsx index 196254619..e6a8d3c67 100644 --- a/apps/desktop/src/renderer/src/modules/action/target-action-list.tsx +++ b/apps/desktop/src/renderer/src/modules/action/target-action-list.tsx @@ -23,6 +23,7 @@ import { actionActions, useActionByIndex } from "~/store/action" type Action = { title: string + icon: React.ReactNode config?: () => React.ReactNode configInline?: boolean enabled: boolean @@ -73,6 +74,7 @@ export const TargetActionList = ({ index }: { index: number }) => { () => [ { title: t("actions.action_card.generate_summary"), + icon: , enabled: !!summary, onInit: (data) => { data.result.summary = true @@ -83,6 +85,7 @@ export const TargetActionList = ({ index }: { index: number }) => { }, { title: t("actions.action_card.translate_into"), + icon: , enabled: !!translation, onInit: (data) => { data.result.translation = true @@ -93,6 +96,7 @@ export const TargetActionList = ({ index }: { index: number }) => { }, { title: t("actions.action_card.enable_readability"), + icon: , enabled: !!readability, onInit: (data) => { data.result.readability = true @@ -103,6 +107,7 @@ export const TargetActionList = ({ index }: { index: number }) => { }, { title: t("actions.action_card.source_content"), + icon: , enabled: !!sourceContent, onInit: (data) => { data.result.sourceContent = true @@ -113,6 +118,7 @@ export const TargetActionList = ({ index }: { index: number }) => { }, { title: t("actions.action_card.new_entry_notification"), + icon: , enabled: !!newEntryNotification, onInit: (data) => { data.result.newEntryNotification = true @@ -123,6 +129,7 @@ export const TargetActionList = ({ index }: { index: number }) => { }, { title: t("actions.action_card.silence"), + icon: , enabled: !!silence, onInit: (data) => { data.result.silence = true @@ -133,6 +140,7 @@ export const TargetActionList = ({ index }: { index: number }) => { }, { title: t("actions.action_card.block"), + icon: , enabled: !!block, onInit: (data) => { data.result.block = true @@ -143,6 +151,7 @@ export const TargetActionList = ({ index }: { index: number }) => { }, { title: t("actions.action_card.rewrite_rules"), + icon: , enabled: !!rewriteRules, onInit: (data) => { data.result.rewriteRules = [ @@ -226,6 +235,7 @@ export const TargetActionList = ({ index }: { index: number }) => { }, { title: t("actions.action_card.webhooks"), + icon: , enabled: !!webhooks, onInit: (data) => { data.result.webhooks = [""] @@ -324,7 +334,10 @@ export const TargetActionList = ({ index }: { index: number }) => { }) }} > - {action.title} +
+ {action.icon} + {action.title} +
) })} @@ -338,7 +351,10 @@ export const TargetActionList = ({ index }: { index: number }) => { return (
- {action.title} +
+ {action.icon} + {action.title} +
{action.configInline && action.config && action.config()}
diff --git a/apps/desktop/src/renderer/src/modules/entry-content/header.mobile.tsx b/apps/desktop/src/renderer/src/modules/entry-content/header.mobile.tsx index 74b99f41f..8553f61ec 100644 --- a/apps/desktop/src/renderer/src/modules/entry-content/header.mobile.tsx +++ b/apps/desktop/src/renderer/src/modules/entry-content/header.mobile.tsx @@ -3,7 +3,7 @@ import { RootPortal } from "@follow/components/ui/portal/index.js" import { findElementInShadowDOM } from "@follow/utils/dom" import { clsx, cn } from "@follow/utils/utils" import { DismissableLayer } from "@radix-ui/react-dismissable-layer" -import { AnimatePresence, m } from "framer-motion" +import { AnimatePresence, m } from "motion/react" import { memo, useEffect, useState } from "react" import { RemoveScroll } from "react-remove-scroll" import { useEventCallback } from "usehooks-ts" diff --git a/apps/desktop/src/renderer/src/modules/entry-content/index.electron.tsx b/apps/desktop/src/renderer/src/modules/entry-content/index.electron.tsx index e260e1651..b446ed226 100644 --- a/apps/desktop/src/renderer/src/modules/entry-content/index.electron.tsx +++ b/apps/desktop/src/renderer/src/modules/entry-content/index.electron.tsx @@ -2,14 +2,17 @@ import { MemoedDangerousHTMLStyle } from "@follow/components/common/MemoedDanger import { ScrollArea } from "@follow/components/ui/scroll-area/index.js" import { useTitle } from "@follow/hooks" import type { FeedModel, InboxModel } from "@follow/models/types" -import { IN_ELECTRON } from "@follow/shared/constants" import { stopPropagation } from "@follow/utils/dom" import { cn } from "@follow/utils/utils" import { ErrorBoundary } from "@sentry/react" import * as React from "react" import { useEffect, useMemo, useRef } from "react" -import { useEntryIsInReadability } from "~/atoms/readability" +import { + useEntryIsInReadability, + useEntryIsInReadabilitySuccess, + useEntryReadabilityContent, +} from "~/atoms/readability" import { useUISettingKey } from "~/atoms/settings/ui" import { ShadowDOM } from "~/components/common/ShadowDOM" import { useInPeekModal } from "~/components/ui/modal/inspire/PeekModal" @@ -35,7 +38,7 @@ import { ContainerToc, NoContent, ReadabilityAutoToggleEffect, - ReadabilityContent, + ReadabilityNotice, RenderError, TitleMetaHandler, ViewSourceContentAutoToggleEffect, @@ -62,11 +65,13 @@ export const EntryContent: Component = ({ staleTime: 300_000, }, ) + const readabilityContent = useEntryReadabilityContent(entryId) const readerFontFamily = useUISettingKey("readerFontFamily") const view = useRouteParamsSelector((route) => route.view) const isInReadabilityMode = useEntryIsInReadability(entryId) + const isReadabilitySuccess = useEntryIsInReadabilitySuccess(entryId) const scrollerRef = useRef(null) useEffect(() => { scrollerRef.current?.scrollTo(0, 0) @@ -114,14 +119,21 @@ export const EntryContent: Component = ({ ) const customCSS = useUISettingKey("customCSS") - const contentTranslated = useEntryTranslation({ entry, extraFields: ["content"] }) + const contentTranslated = useEntryTranslation({ + entry, + extraFields: isReadabilitySuccess ? ["readabilityContent"] : ["content"], + }) const isInPeekModal = useInPeekModal() if (!entry) return null - const entryContent = entry?.entries.content ?? data?.entries.content - const translatedContent = contentTranslated.data?.content + const entryContent = isInReadabilityMode + ? readabilityContent?.content + : (entry?.entries.content ?? data?.entries.content) + const translatedContent = isInReadabilityMode + ? contentTranslated.data?.readabilityContent + : contentTranslated.data?.content const content = translatedContent || entryContent const isInbox = !!inbox @@ -166,34 +178,31 @@ export const EntryContent: Component = ({ - {!isInReadabilityMode ? ( - - {!!customCSS && ( - {customCSS} - )} - - {content} - - - ) : ( - - )} + + + {!!customCSS && ( + {customCSS} + )} + + {content} + +
- {entry.settings?.readability && IN_ELECTRON && ( + {entry.settings?.readability && ( )} {entry.settings?.sourceContent && } diff --git a/apps/desktop/src/renderer/src/modules/entry-content/index.shared.tsx b/apps/desktop/src/renderer/src/modules/entry-content/index.shared.tsx index 22be07ce4..d508a0629 100644 --- a/apps/desktop/src/renderer/src/modules/entry-content/index.shared.tsx +++ b/apps/desktop/src/renderer/src/modules/entry-content/index.shared.tsx @@ -4,7 +4,7 @@ import { Button, MotionButtonBase } from "@follow/components/ui/button/index.js" import { LoadingWithIcon } from "@follow/components/ui/loading/index.jsx" import { RootPortal } from "@follow/components/ui/portal/index.jsx" import { useScrollViewElement } from "@follow/components/ui/scroll-area/hooks.js" -import { IN_ELECTRON, WEB_BUILD } from "@follow/shared/constants" +import { WEB_BUILD } from "@follow/shared/constants" import { EventBus } from "@follow/utils/event-bus" import { springScrollTo } from "@follow/utils/scroller" import { cn } from "@follow/utils/utils" @@ -17,12 +17,12 @@ import { ReadabilityStatus, setReadabilityStatus, useEntryInReadabilityStatus, + useEntryIsInReadability, useEntryReadabilityContent, } from "~/atoms/readability" import { enableShowSourceContent } from "~/atoms/source-content" import { Toc } from "~/components/ui/markdown/components/Toc" -import { useEntryReadabilityToggle } from "~/hooks/biz/useEntryActions" -import { useRouteParamsSelector } from "~/hooks/biz/useRouteParams" +import { toggleEntryReadability } from "~/hooks/biz/useEntryActions" import { getNewIssueUrl } from "~/lib/issues" import { useIsSoFWrappedElement, @@ -33,7 +33,6 @@ import { useEntry } from "~/store/entry" import { useFeedById } from "~/store/feed" import { useInboxById } from "~/store/inbox" -import { EntryContentHTMLRenderer } from "../renderer/html" import { setEntryContentScrollToTop, setEntryTitleMeta } from "./atoms" export interface EntryContentProps { @@ -85,10 +84,13 @@ export const TitleMetaHandler: Component<{ return null } -export const ReadabilityContent = ({ entryId, feedId }: { entryId: string; feedId: string }) => { +export const ReadabilityNotice = ({ entryId }: { entryId: string }) => { const { t } = useTranslation() const result = useEntryReadabilityContent(entryId) - const view = useRouteParamsSelector((route) => route.view) + const isInReadability = useEntryIsInReadability(entryId) + if (!isInReadability) { + return null + } return (
@@ -103,16 +105,6 @@ export const ReadabilityContent = ({ entryId, feedId }: { entryId: string; feedI {t("entry_content.fetching_content")}
)} - - - {result?.content ?? ""} - ) } @@ -134,12 +126,7 @@ export const NoContent: FC<{ {(WEB_BUILD || status === ReadabilityStatus.FAILURE) && ( {t("entry_content.no_content")} )} - {WEB_BUILD && ( -
- {t("entry_content.web_app_notice")} -
- )} - {!sourceContent && url && IN_ELECTRON && } + {!sourceContent && url && } ) @@ -159,10 +146,6 @@ export const ViewSourceContentAutoToggleEffect = () => { } export const ReadabilityAutoToggleEffect = ({ url, id }: { url: string; id: string }) => { - const toggle = useEntryReadabilityToggle({ - id, - url, - }) const onceRef = useRef(false) useEffect(() => { @@ -171,9 +154,9 @@ export const ReadabilityAutoToggleEffect = ({ url, id }: { url: string; id: stri setReadabilityStatus({ [id]: ReadabilityStatus.INITIAL, }) - toggle() + toggleEntryReadability({ id, url }) } - }, [toggle]) + }, [id, url]) return null } diff --git a/apps/desktop/src/renderer/src/modules/feed/feed-icon.tsx b/apps/desktop/src/renderer/src/modules/feed/feed-icon.tsx index d0cee7d53..6b7974009 100644 --- a/apps/desktop/src/renderer/src/modules/feed/feed-icon.tsx +++ b/apps/desktop/src/renderer/src/modules/feed/feed-icon.tsx @@ -4,7 +4,7 @@ import { getBackgroundGradient } from "@follow/utils/color" import { getImageProxyUrl } from "@follow/utils/img-proxy" import { cn, getUrlIcon } from "@follow/utils/utils" import { Avatar, AvatarFallback, AvatarImage } from "@radix-ui/react-avatar" -import { m } from "framer-motion" +import { m } from "motion/react" import type { ReactNode } from "react" import { forwardRef, useMemo } from "react" diff --git a/apps/desktop/src/renderer/src/modules/modal/shortcuts.tsx b/apps/desktop/src/renderer/src/modules/modal/shortcuts.tsx index f5717b13c..d04a6f49d 100644 --- a/apps/desktop/src/renderer/src/modules/modal/shortcuts.tsx +++ b/apps/desktop/src/renderer/src/modules/modal/shortcuts.tsx @@ -2,7 +2,7 @@ import { MotionButtonBase } from "@follow/components/ui/button/index.js" import { KbdCombined } from "@follow/components/ui/kbd/Kbd.js" import { ScrollArea } from "@follow/components/ui/scroll-area/index.js" import { clsx, cn } from "@follow/utils/utils" -import { m, useDragControls } from "framer-motion" +import { m, useDragControls } from "motion/react" import { useCallback, useEffect } from "react" import { useTranslation } from "react-i18next" diff --git a/apps/desktop/src/renderer/src/modules/new-user-guide/guide-modal-content.tsx b/apps/desktop/src/renderer/src/modules/new-user-guide/guide-modal-content.tsx index 56b65de1e..551d3da79 100644 --- a/apps/desktop/src/renderer/src/modules/new-user-guide/guide-modal-content.tsx +++ b/apps/desktop/src/renderer/src/modules/new-user-guide/guide-modal-content.tsx @@ -3,7 +3,7 @@ import { Button } from "@follow/components/ui/button/index.js" import { Kbd } from "@follow/components/ui/kbd/Kbd.js" import { tracker } from "@follow/tracker" import { cn } from "@follow/utils/utils" -import { AnimatePresence, m } from "framer-motion" +import { AnimatePresence, m } from "motion/react" import type { ComponentProps, FunctionComponentElement } from "react" import { createElement, useCallback, useEffect, useMemo, useState } from "react" import { Trans, useTranslation } from "react-i18next" diff --git a/apps/desktop/src/renderer/src/modules/panel/cmdf.tsx b/apps/desktop/src/renderer/src/modules/panel/cmdf.tsx index d03d5812c..1fe8f4745 100644 --- a/apps/desktop/src/renderer/src/modules/panel/cmdf.tsx +++ b/apps/desktop/src/renderer/src/modules/panel/cmdf.tsx @@ -6,7 +6,7 @@ import { RootPortal } from "@follow/components/ui/portal/index.jsx" import { useInputComposition, useRefValue } from "@follow/hooks" import { useSubscribeElectronEvent } from "@follow/shared/event" import { nextFrame } from "@follow/utils/dom" -import { AnimatePresence, m } from "framer-motion" +import { AnimatePresence, m } from "motion/react" import type { FC } from "react" import { useCallback, useEffect, useLayoutEffect, useRef, useState } from "react" import { useDebounceCallback, useEventCallback } from "usehooks-ts" diff --git a/apps/desktop/src/renderer/src/modules/player/corner-player.tsx b/apps/desktop/src/renderer/src/modules/player/corner-player.tsx index 9d176706b..c2addc84a 100644 --- a/apps/desktop/src/renderer/src/modules/player/corner-player.tsx +++ b/apps/desktop/src/renderer/src/modules/player/corner-player.tsx @@ -6,7 +6,7 @@ import { tracker } from "@follow/tracker" import { cn } from "@follow/utils/utils" import * as Slider from "@radix-ui/react-slider" import dayjs from "dayjs" -import { AnimatePresence, m } from "framer-motion" +import { AnimatePresence, m } from "motion/react" import { useEffect, useMemo, useState } from "react" import Marquee from "react-fast-marquee" import { useHotkeys } from "react-hotkeys-hook" @@ -26,7 +26,6 @@ import { useNavigateEntry } from "~/hooks/biz/useNavigateEntry" import { FeedIcon } from "~/modules/feed/feed-icon" import { useEntry } from "~/store/entry" import { useFeedById } from "~/store/feed" -import { useInboxById } from "~/store/inbox" import { useListById } from "~/store/list" const handleClickPlay = () => { @@ -112,6 +111,7 @@ const CornerPlayerImpl = ({ hideControls, rounded }: ControlButtonProps) => { const playerValue = { entryId, status, isMute } const entry = useEntry(playerValue.entryId) + const isInbox = !!entry?.inboxId const feed = useFeedById(entry?.feedId) const list = useListById(listId) @@ -141,8 +141,6 @@ const CornerPlayerImpl = ({ hideControls, rounded }: ControlButtonProps) => { } }, []) - const isInbox = useInboxById(entry?.feedId, (inbox) => inbox !== null) - const navigateToEntry = useNavigateEntry() usePlayerTracker() @@ -170,7 +168,7 @@ const CornerPlayerImpl = ({ hideControls, rounded }: ControlButtonProps) => { return null } return options - }, [entry, feed, list]) + }, [entry, feed, isInbox, list]) if (!entry || !feed) return null return ( diff --git a/apps/desktop/src/renderer/src/modules/profile/email-management.tsx b/apps/desktop/src/renderer/src/modules/profile/email-management.tsx index 8e87e1758..3658010df 100644 --- a/apps/desktop/src/renderer/src/modules/profile/email-management.tsx +++ b/apps/desktop/src/renderer/src/modules/profile/email-management.tsx @@ -12,7 +12,7 @@ import { Label } from "@follow/components/ui/label/index.js" import { cn } from "@follow/utils/utils" import { zodResolver } from "@hookform/resolvers/zod" import { useMutation } from "@tanstack/react-query" -import { m } from "framer-motion" +import { m } from "motion/react" import { useForm } from "react-hook-form" import { useTranslation } from "react-i18next" import { toast } from "sonner" diff --git a/apps/desktop/src/renderer/src/modules/profile/two-factor.tsx b/apps/desktop/src/renderer/src/modules/profile/two-factor.tsx index 0447b3ce3..5ac0eb152 100644 --- a/apps/desktop/src/renderer/src/modules/profile/two-factor.tsx +++ b/apps/desktop/src/renderer/src/modules/profile/two-factor.tsx @@ -11,7 +11,7 @@ import { Input, InputOTP, InputOTPGroup, InputOTPSlot } from "@follow/components import { Label } from "@follow/components/ui/label/index.js" import { zodResolver } from "@hookform/resolvers/zod" import { useMutation } from "@tanstack/react-query" -import { m, useAnimation } from "framer-motion" +import { m, useAnimation } from "motion/react" import { useState } from "react" import { useForm } from "react-hook-form" import { useTranslation } from "react-i18next" diff --git a/apps/desktop/src/renderer/src/modules/profile/user-profile-modal.electron.tsx b/apps/desktop/src/renderer/src/modules/profile/user-profile-modal.electron.tsx index b27c366bd..8ec04140d 100644 --- a/apps/desktop/src/renderer/src/modules/profile/user-profile-modal.electron.tsx +++ b/apps/desktop/src/renderer/src/modules/profile/user-profile-modal.electron.tsx @@ -7,9 +7,9 @@ import { nextFrame, stopPropagation } from "@follow/utils/dom" import { getStorageNS } from "@follow/utils/ns" import { clsx, cn } from "@follow/utils/utils" import { throttle } from "es-toolkit/compat" -import { useAnimationControls } from "framer-motion" import { useAtom } from "jotai" import { atomWithStorage } from "jotai/utils" +import { useAnimationControls } from "motion/react" import type { FC } from "react" import { Fragment, useEffect, useMemo, useRef, useState } from "react" import { useTranslation } from "react-i18next" @@ -220,7 +220,7 @@ export const UserProfileModalContent: FC = ({ use window.open(UrlBuilder.profile(user.data.handle ?? user.data.id)) }} > - + diff --git a/apps/desktop/src/renderer/src/modules/profile/user-profile-modal.shared.tsx b/apps/desktop/src/renderer/src/modules/profile/user-profile-modal.shared.tsx index fba486dc4..d43519df2 100644 --- a/apps/desktop/src/renderer/src/modules/profile/user-profile-modal.shared.tsx +++ b/apps/desktop/src/renderer/src/modules/profile/user-profile-modal.shared.tsx @@ -7,7 +7,7 @@ import { LoadingWithIcon } from "@follow/components/ui/loading/index.jsx" import { EllipsisHorizontalTextWithTooltip } from "@follow/components/ui/typography/index.js" import type { SubscriptionModel } from "@follow/models/types" import { cn } from "@follow/utils/utils" -import { AnimatePresence } from "framer-motion" +import { AnimatePresence } from "motion/react" import type { FC } from "react" import { Fragment, memo, useState } from "react" import { useEventCallback } from "usehooks-ts" diff --git a/apps/desktop/src/renderer/src/modules/rsshub/add-modal-content.tsx b/apps/desktop/src/renderer/src/modules/rsshub/add-modal-content.tsx index 016b5e611..1a6f92279 100644 --- a/apps/desktop/src/renderer/src/modules/rsshub/add-modal-content.tsx +++ b/apps/desktop/src/renderer/src/modules/rsshub/add-modal-content.tsx @@ -66,6 +66,13 @@ export function AddModalContent({ } }, [details.data]) + const codes = [ + `FOLLOW_OWNER_USER_ID=${me?.handle || me?.id} # User id or handle of your follow account`, + `FOLLOW_DESCRIPTION=${instance?.description || `${me?.name}'s instance`} # The description of your instance`, + `FOLLOW_PRICE=${instance?.price || 100} # The monthly price of your instance, set to 0 means free.`, + `FOLLOW_USER_LIMIT=${instance?.userLimit || 1000} # The user limit of your instance, set it to 0 or 1 can make your instance private, leaving it empty means no restriction`, + ] + return (
{t("rsshub.addModal.description")}
@@ -73,11 +80,8 @@ export function AddModalContent({ {details.isLoading ? ( diff --git a/apps/desktop/src/renderer/src/modules/rsshub/delete-modal-content.tsx b/apps/desktop/src/renderer/src/modules/rsshub/delete-modal-content.tsx new file mode 100644 index 000000000..230d115b6 --- /dev/null +++ b/apps/desktop/src/renderer/src/modules/rsshub/delete-modal-content.tsx @@ -0,0 +1,43 @@ +import { Button } from "@follow/components/ui/button/index.js" +import { useMutation } from "@tanstack/react-query" +import { useTranslation } from "react-i18next" +import { toast } from "sonner" + +import { apiClient } from "~/lib/api-fetch" +import { Queries } from "~/queries" + +export const ConfirmDeleteModalContent = ({ id, dismiss }: { dismiss: () => void; id: string }) => { + const { t } = useTranslation("settings") + const deleteMutation = useMutation({ + mutationFn: () => { + return apiClient.rsshub.$delete({ json: { id } }) + }, + onSuccess: () => { + Queries.rsshub.list().invalidate() + toast.success(t("rsshub.table.delete.success")) + }, + onError: (error) => { + toast.error(error.message) + }, + }) + + return ( +
+
+ + {t("rsshub.table.delete.confirm")} +
+
+ +
+
+ ) +} diff --git a/apps/desktop/src/renderer/src/modules/settings/modal/layout.tsx b/apps/desktop/src/renderer/src/modules/settings/modal/layout.tsx index 6051c6780..063422943 100644 --- a/apps/desktop/src/renderer/src/modules/settings/modal/layout.tsx +++ b/apps/desktop/src/renderer/src/modules/settings/modal/layout.tsx @@ -3,7 +3,7 @@ import { LetsIconsResizeDownRightLight } from "@follow/components/icons/resize.j import { IN_ELECTRON } from "@follow/shared/constants" import { preventDefault } from "@follow/utils/dom" import { cn, getOS } from "@follow/utils/utils" -import type { BoundingBox } from "framer-motion" +import type { BoundingBox } from "motion/react" import { Resizable } from "re-resizable" import type { PropsWithChildren } from "react" import { memo, Suspense, useCallback, useEffect, useRef } from "react" diff --git a/apps/desktop/src/renderer/src/modules/settings/tabs/apperance.tsx b/apps/desktop/src/renderer/src/modules/settings/tabs/apperance.tsx index c6d267c54..bc823e4ab 100644 --- a/apps/desktop/src/renderer/src/modules/settings/tabs/apperance.tsx +++ b/apps/desktop/src/renderer/src/modules/settings/tabs/apperance.tsx @@ -13,7 +13,7 @@ import { useIsDark, useThemeAtomValue } from "@follow/hooks" import { ELECTRON_BUILD, IN_ELECTRON } from "@follow/shared/constants" import { capitalizeFirstLetter, getOS } from "@follow/utils/utils" import dayjs from "dayjs" -import { useForceUpdate } from "framer-motion" +import { useForceUpdate } from "motion/react" import { lazy, Suspense, useEffect, useRef, useState } from "react" import { useTranslation } from "react-i18next" import { bundledThemesInfo } from "shiki/themes" diff --git a/apps/desktop/src/renderer/src/modules/settings/tabs/integration.tsx b/apps/desktop/src/renderer/src/modules/settings/tabs/integration.tsx index a12d31158..b32b5e220 100644 --- a/apps/desktop/src/renderer/src/modules/settings/tabs/integration.tsx +++ b/apps/desktop/src/renderer/src/modules/settings/tabs/integration.tsx @@ -210,6 +210,9 @@ export const SettingIntegration = () => { label: t("integration.cubox.autoMemo.label"), description: t("integration.cubox.autoMemo.description"), }), + defineSettingItem("saveSummaryAsDescription", { + label: t("integration.save_ai_summary_as_description.label"), + }), BottomTip, ]} /> diff --git a/apps/desktop/src/renderer/src/modules/timeline-column/FeedCategory.tsx b/apps/desktop/src/renderer/src/modules/timeline-column/FeedCategory.tsx index 79442cc13..880c031d6 100644 --- a/apps/desktop/src/renderer/src/modules/timeline-column/FeedCategory.tsx +++ b/apps/desktop/src/renderer/src/modules/timeline-column/FeedCategory.tsx @@ -9,7 +9,7 @@ import { useInputComposition, useRefValue } from "@follow/hooks" import { stopPropagation } from "@follow/utils/dom" import { cn, sortByAlphabet } from "@follow/utils/utils" import { useMutation } from "@tanstack/react-query" -import { AnimatePresence, m } from "framer-motion" +import { AnimatePresence, m } from "motion/react" import type { FC } from "react" import { Fragment, memo, useCallback, useEffect, useMemo, useRef, useState } from "react" import { useTranslation } from "react-i18next" diff --git a/apps/desktop/src/renderer/src/modules/timeline-column/FeedList.shared.tsx b/apps/desktop/src/renderer/src/modules/timeline-column/FeedList.shared.tsx index 6313fed2b..0adaac6ca 100644 --- a/apps/desktop/src/renderer/src/modules/timeline-column/FeedList.shared.tsx +++ b/apps/desktop/src/renderer/src/modules/timeline-column/FeedList.shared.tsx @@ -5,7 +5,7 @@ import { stopPropagation } from "@follow/utils/dom" import { cn } from "@follow/utils/utils" import * as HoverCard from "@radix-ui/react-hover-card" import { useQuery } from "@tanstack/react-query" -import { AnimatePresence, m } from "framer-motion" +import { AnimatePresence, m } from "motion/react" import { memo, useRef, useState } from "react" import { useTranslation } from "react-i18next" import { Link } from "react-router" diff --git a/apps/desktop/src/renderer/src/modules/timeline-column/TimelineColumnHeader.tsx b/apps/desktop/src/renderer/src/modules/timeline-column/TimelineColumnHeader.tsx index 9c934095a..afece99e5 100644 --- a/apps/desktop/src/renderer/src/modules/timeline-column/TimelineColumnHeader.tsx +++ b/apps/desktop/src/renderer/src/modules/timeline-column/TimelineColumnHeader.tsx @@ -4,7 +4,7 @@ import { ActionButton } from "@follow/components/ui/button/index.js" import { Popover, PopoverContent, PopoverTrigger } from "@follow/components/ui/popover/index.jsx" import { stopPropagation } from "@follow/utils/dom" import { cn } from "@follow/utils/utils" -import { m } from "framer-motion" +import { m } from "motion/react" import type { FC, PropsWithChildren } from "react" import { memo, useCallback, useEffect, useRef, useState } from "react" import { useHotkeys } from "react-hotkeys-hook" diff --git a/apps/desktop/src/renderer/src/modules/timeline-column/index.tsx b/apps/desktop/src/renderer/src/modules/timeline-column/index.tsx index afa43e065..429103084 100644 --- a/apps/desktop/src/renderer/src/modules/timeline-column/index.tsx +++ b/apps/desktop/src/renderer/src/modules/timeline-column/index.tsx @@ -6,8 +6,8 @@ import { useRegisterGlobalContext } from "@follow/shared/bridge" import { ELECTRON_BUILD } from "@follow/shared/constants" import { clamp, cn } from "@follow/utils/utils" import { useWheel } from "@use-gesture/react" -import { AnimatePresence, m } from "framer-motion" import { Lethargy } from "lethargy" +import { AnimatePresence, m } from "motion/react" import type { FC, PropsWithChildren } from "react" import { memo, useCallback, useEffect, useLayoutEffect, useRef, useState } from "react" import { isHotkeyPressed, useHotkeys } from "react-hotkeys-hook" diff --git a/apps/desktop/src/renderer/src/modules/update-notice/UpdateNotice.mobile.tsx b/apps/desktop/src/renderer/src/modules/update-notice/UpdateNotice.mobile.tsx index 03ece9048..29ff1f755 100644 --- a/apps/desktop/src/renderer/src/modules/update-notice/UpdateNotice.mobile.tsx +++ b/apps/desktop/src/renderer/src/modules/update-notice/UpdateNotice.mobile.tsx @@ -1,4 +1,4 @@ -import { m } from "framer-motion" +import { m } from "motion/react" import { useCallback } from "react" import { useTranslation } from "react-i18next" diff --git a/apps/desktop/src/renderer/src/modules/update-notice/UpdateNotice.tsx b/apps/desktop/src/renderer/src/modules/update-notice/UpdateNotice.tsx index f23af93eb..d8a63643e 100644 --- a/apps/desktop/src/renderer/src/modules/update-notice/UpdateNotice.tsx +++ b/apps/desktop/src/renderer/src/modules/update-notice/UpdateNotice.tsx @@ -1,6 +1,6 @@ import { tracker } from "@follow/tracker" import { cn } from "@follow/utils/utils" -import { m, useMotionTemplate, useMotionValue } from "framer-motion" +import { m, useMotionTemplate, useMotionValue } from "motion/react" import { useCallback, useEffect } from "react" import { useTranslation } from "react-i18next" diff --git a/apps/desktop/src/renderer/src/modules/user/ProfileButton.electron.tsx b/apps/desktop/src/renderer/src/modules/user/ProfileButton.electron.tsx index 8b67cc4d1..0cee2a0d1 100644 --- a/apps/desktop/src/renderer/src/modules/user/ProfileButton.electron.tsx +++ b/apps/desktop/src/renderer/src/modules/user/ProfileButton.electron.tsx @@ -22,12 +22,11 @@ import { DropdownMenuSeparator, DropdownMenuTrigger, } from "~/components/ui/dropdown-menu/dropdown-menu" -import { useSignOut } from "~/hooks/biz/useSignOut" import { UrlBuilder } from "~/lib/url-builder" import { useAchievementModal } from "~/modules/achievement/hooks" import { usePresentUserProfileModal } from "~/modules/profile/hooks" import { useSettingModal } from "~/modules/settings/modal/use-setting-modal-hack" -import { useSession } from "~/queries/auth" +import { signOut, useSession } from "~/queries/auth" import { useWallet } from "~/queries/wallet" import { useActivationModal } from "../activation" @@ -47,7 +46,6 @@ export type ProfileButtonProps = LoginProps & { export const ProfileButton: FC = memo((props) => { const { status, session } = useSession() const { user } = session || {} - const signOut = useSignOut() const settingModalPresent = useSettingModal() const presentUserProfile = usePresentUserProfileModal("dialog") const presentAchievement = useAchievementModal() diff --git a/apps/desktop/src/renderer/src/modules/user/ProfileButton.mobile.tsx b/apps/desktop/src/renderer/src/modules/user/ProfileButton.mobile.tsx index 002f6e89a..892821f8c 100644 --- a/apps/desktop/src/renderer/src/modules/user/ProfileButton.mobile.tsx +++ b/apps/desktop/src/renderer/src/modules/user/ProfileButton.mobile.tsx @@ -9,8 +9,8 @@ import { Link } from "react-router" import rsshubLogoUrl from "~/assets/rsshub-icon.png?url" import { useUserRole, useWhoami } from "~/atoms/user" -import { useSignOut } from "~/hooks/biz/useSignOut" import { UrlBuilder } from "~/lib/url-builder" +import { signOut } from "~/queries/auth" import { useWallet } from "~/queries/wallet" import { useAchievementModal } from "../achievement/hooks" @@ -26,8 +26,6 @@ import { UserAvatar } from "./UserAvatar" export const ProfileButton: FC = () => { const user = useWhoami() - const signOut = useSignOut() - const presentUserProfile = usePresentUserProfileModal("dialog") const presentAchievement = useAchievementModal() const { t } = useTranslation() diff --git a/apps/desktop/src/renderer/src/pages/(main)/(layer)/(subview)/rsshub/index.tsx b/apps/desktop/src/renderer/src/pages/(main)/(layer)/(subview)/rsshub/index.tsx index a42842c22..40f036eca 100644 --- a/apps/desktop/src/renderer/src/pages/(main)/(layer)/(subview)/rsshub/index.tsx +++ b/apps/desktop/src/renderer/src/pages/(main)/(layer)/(subview)/rsshub/index.tsx @@ -19,6 +19,7 @@ import { useAuthQuery } from "~/hooks/common" import { useSubViewTitle } from "~/modules/app-layout/subview/hooks" import { useTOTPModalWrapper } from "~/modules/profile/hooks" import { AddModalContent } from "~/modules/rsshub/add-modal-content" +import { ConfirmDeleteModalContent } from "~/modules/rsshub/delete-modal-content" import { SetModalContent } from "~/modules/rsshub/set-modal-content" import { UserAvatar } from "~/modules/user/UserAvatar" import { Queries } from "~/queries" @@ -145,6 +146,10 @@ function List({ data }: { data?: RSSHubModel[] }) { return a.price - b.price || loadA - loadB }) .map((instance) => { + const instanceUserCountExceptOwner = instance.userCount + ? instance.userCount - (instance.ownerUserId === me?.id ? 1 : 0) + : 0 + return ( @@ -226,6 +231,22 @@ function List({ data }: { data?: RSSHubModel[] }) { {t("rsshub.table.edit")} )} + {me?.id === instance.ownerUserId && ( + + )}
diff --git a/apps/desktop/src/renderer/src/pages/settings/(settings)/profile.tsx b/apps/desktop/src/renderer/src/pages/settings/(settings)/profile.tsx index 39a1c1813..1616be1ca 100644 --- a/apps/desktop/src/renderer/src/pages/settings/(settings)/profile.tsx +++ b/apps/desktop/src/renderer/src/pages/settings/(settings)/profile.tsx @@ -3,7 +3,6 @@ import { Divider } from "@follow/components/ui/divider/Divider.js" import { Label } from "@follow/components/ui/label/index.js" import { useModalStack } from "~/components/ui/modal/stacked/hooks" -import { signOut } from "~/lib/auth" import { isInMAS } from "~/lib/utils" import { AccountManagement } from "~/modules/profile/account-management" import { EmailManagement } from "~/modules/profile/email-management" @@ -12,6 +11,7 @@ import { TwoFactor } from "~/modules/profile/two-factor" import { UpdatePasswordForm } from "~/modules/profile/update-password-form" import { SettingsTitle } from "~/modules/settings/title" import { defineSettingPageData } from "~/modules/settings/utils" +import { signOut } from "~/queries/auth" const iconName = "i-mgc-user-setting-cute-re" const priority = 1090 @@ -51,13 +51,7 @@ export function Component() { Are you sure you want to delete your account? This action is irreversible and may take up to two days to take effect.

- diff --git a/apps/desktop/src/renderer/src/providers/extension-expose-provider.tsx b/apps/desktop/src/renderer/src/providers/extension-expose-provider.tsx index 782e75363..e2945ac5b 100644 --- a/apps/desktop/src/renderer/src/providers/extension-expose-provider.tsx +++ b/apps/desktop/src/renderer/src/providers/extension-expose-provider.tsx @@ -11,8 +11,10 @@ import { setUpdaterStatus } from "~/atoms/updater" import { useDialog, useModalStack } from "~/components/ui/modal/stacked/hooks" import { useDiscoverRSSHubRouteModal } from "~/hooks/biz/useDiscoverRSSHubRoute" import { useFollow } from "~/hooks/biz/useFollow" +import { oneTimeToken } from "~/lib/auth" import { usePresentUserProfileModal } from "~/modules/profile/hooks" import { useSettingModal } from "~/modules/settings/modal/use-setting-modal" +import { handleSessionChanges } from "~/queries/auth" import { clearDataIfLoginOtherAccount } from "~/store/utils/clear" declare module "@follow/components/providers/stable-router-provider.js" { @@ -42,6 +44,11 @@ export const ExtensionExposeProvider = () => { clearIfLoginOtherAccount(newUserId: string) { clearDataIfLoginOtherAccount(newUserId) }, + async applyOneTimeToken(token: string) { + await oneTimeToken.apply({ token }) + handleSessionChanges() + }, + readyToUpdate() { setUpdaterStatus({ type: "renderer", diff --git a/apps/desktop/src/renderer/src/providers/user-provider.tsx b/apps/desktop/src/renderer/src/providers/user-provider.tsx index d77bff776..a960b4b80 100644 --- a/apps/desktop/src/renderer/src/providers/user-provider.tsx +++ b/apps/desktop/src/renderer/src/providers/user-provider.tsx @@ -3,7 +3,6 @@ import { useEffect } from "react" import { setUserRole, setWhoami } from "~/atoms/user" import { setIntegrationIdentify } from "~/initialize/helper" -import { tipcClient } from "~/lib/client" import { useSession } from "~/queries/auth" import { CleanerService } from "~/services/cleaner" @@ -18,9 +17,6 @@ export const UserProvider = () => { } setIntegrationIdentify(session.user) - tipcClient?.trackerIdentify({ - user: session.user, - }) CleanerService.cleanRemainingData(session.user.id) }, [session?.role, session?.user]) diff --git a/apps/desktop/src/renderer/src/queries/ai.ts b/apps/desktop/src/renderer/src/queries/ai.ts index d52cd2850..2451a2878 100644 --- a/apps/desktop/src/renderer/src/queries/ai.ts +++ b/apps/desktop/src/renderer/src/queries/ai.ts @@ -22,12 +22,21 @@ export const ai = { defineQuery(["translation", entry?.entries.id, view, language, extraFields, part], () => translate({ entry, view, language, extraFields, part }), ), - summary: ({ entryId, language }: { entryId: string; language?: SupportedLanguages }) => - defineQuery(["summary", entryId, language], async () => { + summary: ({ + entryId, + language, + target = "content", + }: { + entryId: string + language?: SupportedLanguages + target?: "content" | "readabilityContent" + }) => + defineQuery(["summary", entryId, language, target], async () => { const res = await apiClient.ai.summary.$get({ query: { id: entryId, language, + target, }, }) return res.data diff --git a/apps/desktop/src/renderer/src/queries/auth.ts b/apps/desktop/src/renderer/src/queries/auth.ts index abf229dac..a8e7ed076 100644 --- a/apps/desktop/src/renderer/src/queries/auth.ts +++ b/apps/desktop/src/renderer/src/queries/auth.ts @@ -1,9 +1,14 @@ import type { AuthSession } from "@follow/shared/hono" +import { clearStorage } from "@follow/utils/ns" import type { FetchError } from "ofetch" +import { setWhoami } from "~/atoms/user" +import { QUERY_PERSIST_KEY } from "~/constants" import { useAuthQuery } from "~/hooks/common" -import { getAccountInfo, getSession } from "~/lib/auth" +import { getAccountInfo, getSession, signOut as signOutFn } from "~/lib/auth" +import { tipcClient } from "~/lib/client" import { defineQuery } from "~/lib/defineQuery" +import { clearLocalPersistStoreData } from "~/store/utils/clear" export const auth = { getSession: () => defineQuery(["auth", "session"], () => getSession()), @@ -65,3 +70,31 @@ export const useSession = (options?: { enabled?: boolean }) => { : "unknown", } } + +export const handleSessionChanges = () => { + tipcClient?.sessionChanged() + window.location.reload() +} + +export const signOut = async () => { + if (window.__RN__) { + window.ReactNativeWebView?.postMessage("sign-out") + return + } + + // Clear query cache + localStorage.removeItem(QUERY_PERSIST_KEY) + + // setLoginModalShow(true) + setWhoami(null) + + // Clear local storage + clearStorage() + + // clear local store data + await clearLocalPersistStoreData() + // Sign out + await tipcClient?.signOut() + await signOutFn() + window.location.reload() +} diff --git a/apps/desktop/vite.config.ts b/apps/desktop/vite.config.ts index cb364ed53..16c3df42d 100644 --- a/apps/desktop/vite.config.ts +++ b/apps/desktop/vite.config.ts @@ -47,6 +47,43 @@ const isWebBuild = process.env.WEB_BUILD === "1" // eslint-disable-next-line no-console console.log(green("Build type:"), isWebBuild ? "Web" : "Unknown") +const proxyConfig = { + target: "http://localhost:2234", + changeOrigin: true, + selfHandleResponse: true, + configure: (proxy, _options) => { + proxy.on("proxyRes", (proxyRes, req, res) => { + const body = [] as any[] + proxyRes.on("data", (chunk: any) => body.push(chunk)) + proxyRes.on("end", () => { + const html = parseHTML(Buffer.concat(body).toString()) + const doc = html.document + + const $scripts = doc.querySelectorAll("script") + $scripts.forEach((script) => { + const src = script.getAttribute("src") + if (src) { + script.setAttribute("src", `http://localhost:2234${src}`) + } + }) + + const $links = doc.querySelectorAll("link") + $links.forEach((link) => { + const href = link.getAttribute("href") + if (href) { + link.setAttribute("href", `http://localhost:2234${href}`) + } + }) + + res.setHeader("Content-Type", "text/html; charset=utf-8") + + const modifiedHtml = doc.toString() + res.end(modifiedHtml) + }) + }) + }, +} + export default ({ mode }) => { const env = loadEnv(mode, process.cwd()) const typedEnv = env as typeof EnvType @@ -73,42 +110,10 @@ export default ({ mode }) => { }, cors: true, proxy: { - "/login": { - target: "http://localhost:2234", - changeOrigin: true, - selfHandleResponse: true, - configure: (proxy, _options) => { - proxy.on("proxyRes", (proxyRes, req, res) => { - const body = [] as any[] - proxyRes.on("data", (chunk: any) => body.push(chunk)) - proxyRes.on("end", () => { - const html = parseHTML(Buffer.concat(body).toString()) - const doc = html.document - - const $scripts = doc.querySelectorAll("script") - $scripts.forEach((script) => { - const src = script.getAttribute("src") - if (src) { - script.setAttribute("src", `http://localhost:2234${src}`) - } - }) - - const $links = doc.querySelectorAll("link") - $links.forEach((link) => { - const href = link.getAttribute("href") - if (href) { - link.setAttribute("href", `http://localhost:2234${href}`) - } - }) - - res.setHeader("Content-Type", "text/html; charset=utf-8") - - const modifiedHtml = doc.toString() - res.end(modifiedHtml) - }) - }) - }, - }, + "/login": proxyConfig, + "/forget-password": proxyConfig, + "/reset-password": proxyConfig, + "/register": proxyConfig, ...(env.VITE_DEV_PROXY ? { @@ -236,7 +241,7 @@ export default ({ mode }) => { ], ["vfile", "unified"], ["es-toolkit/compat"], - ["framer-motion"], + ["motion/react"], ["clsx", "tailwind-merge", "class-variance-authority"], [ diff --git a/apps/mobile/app.config.ts b/apps/mobile/app.config.ts index 292004202..4a4ddc0c4 100644 --- a/apps/mobile/app.config.ts +++ b/apps/mobile/app.config.ts @@ -160,6 +160,17 @@ export default ({ config }: ConfigContext): ExpoConfig => ({ enableBackgroundRemoteNotifications: true, }, ], + [ + // Fix status bar flash issue on Android + // Learn more: https://github.com/expo/expo/blob/main/packages/expo-status-bar/src/StatusBar.android.tsx#L21 + "react-native-edge-to-edge", + { + android: { + parentTheme: "Default", + enforceNavigationBarContrast: false, + }, + }, + ], ], experiments: { typedRoutes: true, diff --git a/apps/mobile/bump.config.ts b/apps/mobile/bump.config.ts new file mode 100644 index 000000000..b7e17bfaf --- /dev/null +++ b/apps/mobile/bump.config.ts @@ -0,0 +1,23 @@ +/* eslint-disable no-template-curly-in-string */ +import { defineConfig } from "nbump" + +export default defineConfig({ + leading: [ + "git pull --rebase", + "tsx scripts/apply-changelog.ts ${NEW_VERSION}", + "git add changelog", + "pnpm eslint --fix package.json", + "pnpm prettier --ignore-unknown --write package.json", + "git add package.json", + ], + trailing: ["git checkout -b release/mobile/${NEW_VERSION}"], + finally: [ + "git push origin release/mobile/${NEW_VERSION}", + "gh pr create --title 'release(mobile): Release v${NEW_VERSION}' --body 'v${NEW_VERSION}' --base main --head release/mobile/${NEW_VERSION}", + ], + push: false, + commitMessage: "release(mobile): release v${NEW_VERSION}", + tagPrefix: "mobile@", + changelog: false, + allowedBranches: ["dev"], +}) diff --git a/apps/mobile/changelog/0.1.6.md b/apps/mobile/changelog/0.1.6.md new file mode 100644 index 000000000..74de0b245 --- /dev/null +++ b/apps/mobile/changelog/0.1.6.md @@ -0,0 +1,19 @@ +# What's New in v0.1.6 + +## Shiny new things + +- Server‑side readability with AI summaries and instant translation (#3498) +- Discover page completely overhauled for a vibrant, streamlined experience (cce400c) +- Added openLinksInExternalApp setting to let you choose where links open (61c099b) + +## Improvements + +- React re‑renders cut by 10×, delivering lightning‑fast, buttery‑smooth interactions (22964c7, a758e43) +- Added action icons and refreshed share & AI icons for a cleaner interface (ece2637, 3bc6585) + +## No longer broken + +- Fixed an issue that prevented video preview images from loading (bcf752b) +- Resolved the iOS swipe‑back gesture conflict with React Native’s Pressable, restoring silky‑smooth navigation +- Corrected a bug where some images failed to display in the entry body (4654dc9) +- Fixed an issue causing entry timestamps to display incorrectly in the timeline (4ee5944) diff --git a/apps/mobile/changelog/next.md b/apps/mobile/changelog/next.md index 4ef2c94b6..efca4370b 100644 --- a/apps/mobile/changelog/next.md +++ b/apps/mobile/changelog/next.md @@ -1,7 +1,7 @@ # What's New in vNEXT_VERSION -## Shiny new things +## New Features ## Improvements -## No longer broken +## Bug Fixes diff --git a/apps/mobile/drizzle/0020_little_marauders.sql b/apps/mobile/drizzle/0020_little_marauders.sql new file mode 100644 index 000000000..9a6f6ae3d --- /dev/null +++ b/apps/mobile/drizzle/0020_little_marauders.sql @@ -0,0 +1,2 @@ +ALTER TABLE `summaries` ADD `readability_summary` text;--> statement-breakpoint +ALTER TABLE `translations` ADD `readability_content` text; \ No newline at end of file diff --git a/apps/mobile/drizzle/meta/0020_snapshot.json b/apps/mobile/drizzle/meta/0020_snapshot.json new file mode 100644 index 000000000..0b7d8b6e4 --- /dev/null +++ b/apps/mobile/drizzle/meta/0020_snapshot.json @@ -0,0 +1,708 @@ +{ + "version": "6", + "dialect": "sqlite", + "id": "493dc0df-ddca-4c5c-96bc-f74802251bc6", + "prevId": "0295d33b-ce34-41aa-a428-1dc63c6bb447", + "tables": { + "collections": { + "name": "collections", + "columns": { + "feed_id": { + "name": "feed_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "entry_id": { + "name": "entry_id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "view": { + "name": "view", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "entries": { + "name": "entries", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "source_content": { + "name": "source_content", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "guid": { + "name": "guid", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "author": { + "name": "author", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "author_url": { + "name": "author_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "author_avatar": { + "name": "author_avatar", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "inserted_at": { + "name": "inserted_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "published_at": { + "name": "published_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "media": { + "name": "media", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "categories": { + "name": "categories", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "attachments": { + "name": "attachments", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "extra": { + "name": "extra", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "language": { + "name": "language", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "feed_id": { + "name": "feed_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "inbox_handle": { + "name": "inbox_handle", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "read": { + "name": "read", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sources": { + "name": "sources", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "settings": { + "name": "settings", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "feeds": { + "name": "feeds", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "image": { + "name": "image", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "error_at": { + "name": "error_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "site_url": { + "name": "site_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "owner_user_id": { + "name": "owner_user_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "error_message": { + "name": "error_message", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "images": { + "name": "images", + "columns": { + "url": { + "name": "url", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "colors": { + "name": "colors", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "inboxes": { + "name": "inboxes", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "lists": { + "name": "lists", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "feed_ids": { + "name": "feed_ids", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "view": { + "name": "view", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "image": { + "name": "image", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "fee": { + "name": "fee", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "owner_user_id": { + "name": "owner_user_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "subscriptions": { + "name": "subscriptions", + "columns": { + "feed_id": { + "name": "feed_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "list_id": { + "name": "list_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "inbox_id": { + "name": "inbox_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "view": { + "name": "view", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_private": { + "name": "is_private", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "category": { + "name": "category", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "summaries": { + "name": "summaries", + "columns": { + "entry_id": { + "name": "entry_id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "summary": { + "name": "summary", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "readability_summary": { + "name": "readability_summary", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "language": { + "name": "language", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "unq": { + "name": "unq", + "columns": ["entry_id", "language"], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "translations": { + "name": "translations", + "columns": { + "entry_id": { + "name": "entry_id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "language": { + "name": "language", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "readability_content": { + "name": "readability_content", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "translation-unique-index": { + "name": "translation-unique-index", + "columns": ["entry_id", "language"], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "unread": { + "name": "unread", + "columns": { + "subscription_id": { + "name": "subscription_id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "count": { + "name": "count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "users": { + "name": "users", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "handle": { + "name": "handle", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "image": { + "name": "image", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "is_me": { + "name": "is_me", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "email_verified": { + "name": "email_verified", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + } + }, + "views": {}, + "enums": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "internal": { + "indexes": {} + } +} diff --git a/apps/mobile/drizzle/meta/_journal.json b/apps/mobile/drizzle/meta/_journal.json index c3a1b8b57..69e0d760f 100644 --- a/apps/mobile/drizzle/meta/_journal.json +++ b/apps/mobile/drizzle/meta/_journal.json @@ -141,6 +141,13 @@ "when": 1743153830369, "tag": "0019_wonderful_shape", "breakpoints": true + }, + { + "idx": 20, + "version": "6", + "when": 1744793226628, + "tag": "0020_little_marauders", + "breakpoints": true } ] } diff --git a/apps/mobile/drizzle/migrations.js b/apps/mobile/drizzle/migrations.js index f66e18730..3ac3f929d 100644 --- a/apps/mobile/drizzle/migrations.js +++ b/apps/mobile/drizzle/migrations.js @@ -20,6 +20,7 @@ import m0016 from "./0016_curious_carnage.sql" import m0017 from "./0017_talented_captain_cross.sql" import m0018 from "./0018_dashing_the_fury.sql" import m0019 from "./0019_wonderful_shape.sql" +import m0020 from "./0020_little_marauders.sql" import journal from "./meta/_journal.json" export default { @@ -45,5 +46,6 @@ export default { m0017, m0018, m0019, + m0020, }, } diff --git a/apps/mobile/eas.json b/apps/mobile/eas.json index 8c4881cbf..e38bbddc9 100644 --- a/apps/mobile/eas.json +++ b/apps/mobile/eas.json @@ -42,6 +42,9 @@ "appleId": "diygod@rss3.io", "ascAppId": "6739802604", "appleTeamId": "492J8Q67PF" + }, + "android": { + "releaseStatus": "draft" } } } diff --git a/apps/mobile/native/expo-module.config.json b/apps/mobile/native/expo-module.config.json index 904b0a42b..5806f648b 100644 --- a/apps/mobile/native/expo-module.config.json +++ b/apps/mobile/native/expo-module.config.json @@ -12,7 +12,8 @@ "TabScreenModule", "TabBarPortalModule", "EnhancePagerViewModule", - "EnhancePageViewModule" + "EnhancePageViewModule", + "ItemPressableModule" ] }, "android": { diff --git a/apps/mobile/native/ios/Modules/ItemPressable/ItemPressableModule.swift b/apps/mobile/native/ios/Modules/ItemPressable/ItemPressableModule.swift new file mode 100644 index 000000000..5a06b57b8 --- /dev/null +++ b/apps/mobile/native/ios/Modules/ItemPressable/ItemPressableModule.swift @@ -0,0 +1,60 @@ +// +// ItemPressableModule.swift +// Pods +// +// Created by Innei on 2025/4/15. +// + +import ExpoModulesCore +import UIKit + +public class ItemPressableModule: Module { + public func definition() -> ModuleDefinition { + Name("ItemPressable") + + View(ItemPressableView.self) { + OnViewDidUpdateProps { view in + view.initizlize() + } + + Prop("touchHighlight") { (view: ItemPressableView, value: Bool) in + view.setTouchHighlight(value) + } + + Events("onItemPress") + } + } +} + +class ItemPressableView: ExpoView { + private var onItemPress: EventDispatcher! + private var touchHighlight = true + required init(appContext: AppContext? = nil) { + self.onItemPress = EventDispatcher() + super.init(appContext: appContext) + } + + func setTouchHighlight(_ value: Bool) { + touchHighlight = value + } + + func initizlize() { + let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap)) + tapGesture.delegate = self + gestureRecognizers = [tapGesture] + } + + @objc func handleTap() { + let bgColor = layer.backgroundColor + if touchHighlight { + layer.backgroundColor = UIColor.systemGray5.cgColor + + UIView.animate(withDuration: 0.2, delay: 0.1, options: [.curveEaseOut]) { + self.layer.backgroundColor = bgColor + } + } + onItemPress() + } +} + +extension ItemPressableView: UIGestureRecognizerDelegate {} diff --git a/apps/mobile/native/ios/Modules/PagerView/EnhancePagerViewModule.swift b/apps/mobile/native/ios/Modules/PagerView/EnhancePagerViewModule.swift index c77edffc8..bb628a753 100644 --- a/apps/mobile/native/ios/Modules/PagerView/EnhancePagerViewModule.swift +++ b/apps/mobile/native/ios/Modules/PagerView/EnhancePagerViewModule.swift @@ -13,15 +13,15 @@ public class EnhancePagerViewModule: Module { View(EnhancePagerView.self) { OnViewDidUpdateProps { view in - view.initizlize() + view.initialize() } Prop("page") { (view: EnhancePagerView, index: Int) in view.page = index } - Prop("pageGap") { (view: EnhancePagerView, gap: Int) in - view.pageGap = gap + Prop("initialPageIndex") { (view: EnhancePagerView, index: Int) in + view.initialPageIndex = index } Prop("transitionStyle") { (view: EnhancePagerView, style: TransitionStyle?) in @@ -98,20 +98,23 @@ private class EnhancePagerView: ExpoView, UIGestureRecognizerDelegate { } } + var initialPageIndex: Int = 0 + var pageGap = 20 var transitionStyle: TransitionStyle = .scroll var panGestureRecognizer: UIGestureRecognizer? - func initizlize() { + func initialize() { let panGestureRecognizer = UIPanGestureRecognizer() panGestureRecognizer.delegate = self self.panGestureRecognizer = panGestureRecognizer addGestureRecognizer(panGestureRecognizer) - pageController = EnhancePagerController(pageViews: pageViews, initialPageIndex: page, - transitionStyle: transitionStyle.toUIPageViewControllerTransitionStyle(), - options: [ - .interPageSpacing: pageGap, - ]) + pageController = EnhancePagerController( + pageViews: pageViews, initialPageIndex: initialPageIndex, + transitionStyle: transitionStyle.toUIPageViewControllerTransitionStyle(), + options: [ + .interPageSpacing: pageGap + ]) guard let pageController = pageController else { return } addSubview(pageController.view) pageController.view.snp.makeConstraints { make in @@ -149,12 +152,16 @@ private class EnhancePagerView: ExpoView, UIGestureRecognizerDelegate { } #endif - func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { + func gestureRecognizer( + _ gestureRecognizer: UIGestureRecognizer, + shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer + ) -> Bool { guard let pageController = pageController else { return false } let currentIndex = pageController.getCurrentPageIndex() guard let scrollView = pageController.scrollView else { return false } if gestureRecognizer == panGestureRecognizer, - NSStringFromClass(type(of: otherGestureRecognizer)) == "RNSPanGestureRecognizer" { + NSStringFromClass(type(of: otherGestureRecognizer)) == "RNSPanGestureRecognizer" + { if let panGestureRecognizer = gestureRecognizer as? UIPanGestureRecognizer { let velocity = panGestureRecognizer.velocity(in: self) let isLTR = true diff --git a/apps/mobile/package.json b/apps/mobile/package.json index db16888a2..76548219e 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -1,6 +1,6 @@ { "name": "@follow/mobile", - "version": "0.1.5", + "version": "0.1.6", "private": true, "main": "src/main.tsx", "scripts": { @@ -18,7 +18,7 @@ "web": "expo start --web" }, "dependencies": { - "@better-auth/expo": "1.2.6-beta.1", + "@better-auth/expo": "1.2.7", "@expo/metro-runtime": "4.0.1", "@expo/react-native-action-sheet": "4.1.1", "@follow/components": "workspace:*", @@ -33,25 +33,25 @@ "@hookform/resolvers": "4.1.3", "@openpanel/sdk": "1.0.0", "@react-native-community/image-editor": "4.3.0", - "@react-native-firebase/analytics": "21.13.0", - "@react-native-firebase/app": "21.13.0", - "@react-native-firebase/app-check": "21.13.0", - "@react-native-firebase/crashlytics": "21.13.0", - "@react-native-firebase/messaging": "21.13.0", + "@react-native-firebase/analytics": "21.14.0", + "@react-native-firebase/app": "21.14.0", + "@react-native-firebase/app-check": "21.14.0", + "@react-native-firebase/crashlytics": "21.14.0", + "@react-native-firebase/messaging": "21.14.0", "@react-native-masked-view/masked-view": "0.3.2", "@react-native-menu/menu": "1.2.3", "@react-native-picker/picker": "2.11.0", - "@shopify/flash-list": "1.7.3", - "@tanstack/query-sync-storage-persister": "5.71.10", - "@tanstack/react-query": "5.71.10", - "@tanstack/react-query-persist-client": "5.71.10", + "@shopify/flash-list": "1.8.0", + "@tanstack/query-sync-storage-persister": "5.74.4", + "@tanstack/react-query": "5.74.4", + "@tanstack/react-query-persist-client": "5.74.4", "@types/qrcode": "1.5.5", - "better-auth": "1.2.6-beta.2", - "cookie-es": "2.0.0", + "better-auth": "1.2.7", + "camelcase-keys": "9.1.3", "dayjs": "1.11.13", "dnum": "2.14.0", - "es-toolkit": "1.34.1", - "expo": "52.0.44", + "es-toolkit": "1.35.0", + "expo": "52.0.46", "expo-apple-authentication": "7.1.3", "expo-application": "6.0.2", "expo-av": "15.0.2", @@ -83,10 +83,10 @@ "expo-updates": "0.27.4", "expo-web-browser": "14.0.2", "franc-min": "6.2.0", - "hono": "4.7.5", - "i18next": "24.2.3", + "hono": "4.7.6", + "i18next": "25.0.0", "immer": "10.1.1", - "jotai": "2.12.2", + "jotai": "2.12.3", "lru-cache": "11.1.0", "nanoid": "5.1.5", "nativewind": "4.1.23", @@ -101,31 +101,32 @@ "react-native-awesome-slider": "2.9.0", "react-native-bouncy-checkbox": "4.1.2", "react-native-color-matrix-image-filters": "7.0.2", + "react-native-edge-to-edge": "1.6.0", "react-native-gesture-handler": "2.25.0", "react-native-image-colors": "2.4.0", "react-native-ios-context-menu": "3.1.1", "react-native-ios-utilities": "5.1.4", - "react-native-keyboard-controller": "1.16.8", + "react-native-keyboard-controller": "1.17.0", "react-native-otp-entry": "1.8.4", "react-native-pager-view": "6.7.0", - "react-native-reanimated": "3.17.2", + "react-native-reanimated": "3.17.4", "react-native-root-siblings": "5.0.1", - "react-native-safe-area-context": "5.3.0", + "react-native-safe-area-context": "5.4.0", "react-native-screens": "4.10.0", "react-native-sheet-transitions": "0.1.2", "react-native-svg": "15.11.2", "react-native-track-player": "4.1.1", "react-native-uikit-colors": "0.3.10", - "react-native-video": "6.11.0", + "react-native-video": "6.12.0", "react-native-volume-manager": "2.0.8", "react-native-web": "0.20.0", "react-native-webview": "13.13.5", - "shiki": "3.2.1", + "shiki": "3.2.2", "tailwindcss": "3.4.17", "use-sync-external-store": "1.5.0", "usehooks-ts": "3.1.1", "zeego": "3.0.6", - "zod": "3.24.2", + "zod": "3.24.3", "zustand": "5.0.3" }, "devDependencies": { @@ -133,11 +134,12 @@ "@types/react": "18.3.12", "babel-plugin-inline-import": "3.0.0", "babel-plugin-module-resolver": "5.0.2", - "drizzle-kit": "0.30.6", - "eas-cli": "16.2.1", + "drizzle-kit": "0.31.0", + "eas-cli": "16.3.2", "expo-drizzle-studio-plugin": "0.1.2", - "nbump": "2.0.7", - "postcss": "8.5.3" + "nbump": "2.1.0", + "postcss": "8.5.3", + "sf-symbols-typescript": "2.1.0" }, "appName": "Folo", "expo": { @@ -153,21 +155,5 @@ "autolinking": { "nativeModulesDir": "./native" } - }, - "bump": { - "before": [ - "git pull --rebase", - "tsx scripts/apply-changelog.ts ${NEW_VERSION}", - "git add changelog", - "pnpm eslint --fix package.json", - "pnpm prettier --ignore-unknown --write package.json", - "git add package.json" - ], - "commit_message": "release(mobile): release v${NEW_VERSION}", - "tag": false, - "changelog": false, - "allowed_branches": [ - "dev" - ] } } diff --git a/apps/mobile/src/App.tsx b/apps/mobile/src/App.tsx index f228e9697..0cb63e64e 100644 --- a/apps/mobile/src/App.tsx +++ b/apps/mobile/src/App.tsx @@ -4,6 +4,7 @@ import Animated, { interpolate, useAnimatedStyle } from "react-native-reanimated import { RootSiblingParent } from "react-native-root-siblings" import { useSheet } from "react-native-sheet-transitions" +import { useBackHandler } from "./hooks/useBackHandler" import { useIntentHandler } from "./hooks/useIntentHandler" import { DebugButton, EnvProfileIndicator } from "./modules/debug" import { usePrefetchActions } from "./store/action/hooks" @@ -15,6 +16,7 @@ export function App({ children }: { children: React.ReactNode }) { useIntentHandler() useOnboarding() useUnreadCountBadge() + useBackHandler() // prefetch actions to detect if the user has any actions contains notifications usePrefetchActions() diff --git a/apps/mobile/src/api/trending.ts b/apps/mobile/src/api/trending.ts new file mode 100644 index 000000000..59db4e0ad --- /dev/null +++ b/apps/mobile/src/api/trending.ts @@ -0,0 +1,17 @@ +import type { Models } from "@follow/models/src" +import camelcaseKeys from "camelcase-keys" + +import { apiFetch } from "../lib/api-fetch" + +const v1ApiPrefix = "/v1" +export const getTrendingAggregates = async (params: { language: string }) => { + const data = await apiFetch( + `${v1ApiPrefix}/trendings?language=${params.language}`, + { + params: { + language: params.language, + }, + }, + ) + return camelcaseKeys(data as any, { deep: true }) as Models.TrendingAggregates +} diff --git a/apps/mobile/src/components/common/ErrorBoundary.tsx b/apps/mobile/src/components/common/ErrorBoundary.tsx index bc5f6ce51..a8f5c0bfa 100644 --- a/apps/mobile/src/components/common/ErrorBoundary.tsx +++ b/apps/mobile/src/components/common/ErrorBoundary.tsx @@ -34,7 +34,7 @@ export const ErrorBoundary = ({ const defaultFallbackRender = ({ error }: { error: Error }) => { return ( - {error.message} + {error.message} ) } diff --git a/apps/mobile/src/components/common/NoLoginInfo.tsx b/apps/mobile/src/components/common/NoLoginInfo.tsx index bbf61b530..c7b5e7172 100644 --- a/apps/mobile/src/components/common/NoLoginInfo.tsx +++ b/apps/mobile/src/components/common/NoLoginInfo.tsx @@ -2,7 +2,7 @@ import { Pressable, Text } from "react-native" import { useColor } from "react-native-uikit-colors" import { useNavigation } from "@/src/lib/navigation/hooks" -import { LoginScreen } from "@/src/screens/(modal)/login" +import { LoginScreen } from "@/src/screens/(modal)/LoginScreen" import { Logo } from "../ui/logo" diff --git a/apps/mobile/src/components/icons/PhUsersBold.tsx b/apps/mobile/src/components/icons/PhUsersBold.tsx new file mode 100644 index 000000000..0fe5581ad --- /dev/null +++ b/apps/mobile/src/components/icons/PhUsersBold.tsx @@ -0,0 +1,15 @@ +import * as React from "react" +import type { SvgProps } from "react-native-svg" +import Svg, { Path } from "react-native-svg" + +export function PhUsersBold(props: SvgProps & { size?: number; color?: string }) { + const { size = 24, color = "currentColor", ...rest } = props + return ( + + + + ) +} diff --git a/apps/mobile/src/components/layouts/header/NavigationHeader.tsx b/apps/mobile/src/components/layouts/header/NavigationHeader.tsx index ea01753c2..664a17f00 100644 --- a/apps/mobile/src/components/layouts/header/NavigationHeader.tsx +++ b/apps/mobile/src/components/layouts/header/NavigationHeader.tsx @@ -1,4 +1,5 @@ import { cn } from "@follow/utils" +import { EventBus } from "@follow/utils/src/event-bus" import type { FC, PropsWithChildren, ReactNode } from "react" import { createElement, @@ -35,7 +36,6 @@ import { useScreenIsInSheetModal, } from "@/src/lib/navigation/hooks" import { ScreenItemContext } from "@/src/lib/navigation/ScreenItemContext" -import { useHorizontalScrolling } from "@/src/modules/screen/atoms" import { ThemedBlurView } from "../../common/ThemedBlurView" import { PlatformActivityIndicator } from "../../ui/loading/PlatformActivityIndicator" @@ -105,12 +105,11 @@ const useHideableBottom = ( }, ) - const horizontalScrolling = useHorizontalScrolling() useEffect(() => { - if (horizontalScrolling) { + EventBus.subscribe("SELECT_TIMELINE", () => { largeHeaderHeight.value = withTiming(largeDefaultHeaderHeightRef.current) - } - }, [horizontalScrolling, largeHeaderHeight]) + }) + }, [largeHeaderHeight]) const layoutHeightOnceRef = useRef(false) const onLayout = useCallback( @@ -335,7 +334,7 @@ export const InternalNavigationHeader = ({ {/* Only show loading indicator when headerTitle is not absolute */} {!headerTitleAbsolute && isLoading && ( diff --git a/apps/mobile/src/components/layouts/tabbar/BottomTabProvider.tsx b/apps/mobile/src/components/layouts/tabbar/BottomTabProvider.tsx index 484c710cb..ae5d79f4b 100644 --- a/apps/mobile/src/components/layouts/tabbar/BottomTabProvider.tsx +++ b/apps/mobile/src/components/layouts/tabbar/BottomTabProvider.tsx @@ -1,6 +1,11 @@ +import { atom } from "jotai" import { useMemo, useState } from "react" import { useSharedValue } from "react-native-reanimated" +import type { BottomTabContextType } from "@/src/lib/navigation/bottom-tab/BottomTabContext" +import { BottomTabContext } from "@/src/lib/navigation/bottom-tab/BottomTabContext" +import type { TabScreenProps } from "@/src/lib/navigation/bottom-tab/types" + import { BottomTabHeightProvider } from "./BottomTabHeightProvider" import { BottomTabBarBackgroundContext } from "./contexts/BottomTabBarBackgroundContext" import { @@ -8,17 +13,37 @@ import { SetBottomTabBarVisibleContext, } from "./contexts/BottomTabBarVisibleContext" -export const BottomTabProvider = ({ children }: { children: React.ReactNode }) => { +export const BottomTabProvider = ({ + children, + initialTabIndex = 0, +}: { + children: React.ReactNode + initialTabIndex?: number +}) => { const opacity = useSharedValue(1) const [tabBarVisible, setTabBarVisible] = useState(true) + const [tabIndexAtom] = useState(() => atom(initialTabIndex)) + + const ctxValue = useMemo( + () => ({ + currentIndexAtom: tabIndexAtom, + loadedableIndexAtom: atom(new Set()), + tabScreensAtom: atom([]), + tabHeightAtom: atom(0), + }), + [tabIndexAtom], + ) + return ( - ({ opacity }), [opacity])}> - - - {children} - - - + + ({ opacity }), [opacity])}> + + + {children} + + + + ) } diff --git a/apps/mobile/src/components/layouts/tabbar/Tabbar.tsx b/apps/mobile/src/components/layouts/tabbar/Tabbar.tsx index 395657467..d191e9f66 100644 --- a/apps/mobile/src/components/layouts/tabbar/Tabbar.tsx +++ b/apps/mobile/src/components/layouts/tabbar/Tabbar.tsx @@ -1,6 +1,6 @@ import { useAtom, useAtomValue } from "jotai" import type { FC } from "react" -import { memo, useContext, useEffect, useMemo } from "react" +import { memo, useCallback, useContext, useEffect, useMemo } from "react" import type { StyleProp, TextStyle } from "react-native" import { Platform, Pressable, StyleSheet, Text, View } from "react-native" import Animated, { @@ -10,6 +10,7 @@ import Animated, { withSpring, } from "react-native-reanimated" import { useSafeAreaInsets } from "react-native-safe-area-context" +import { useEventCallback } from "usehooks-ts" import { SetBottomTabBarHeightContext } from "@/src/components/layouts/tabbar/contexts/BottomTabBarHeightContext" import { gentleSpringPreset, quickSpringPreset, softSpringPreset } from "@/src/constants/spring" @@ -57,6 +58,11 @@ export const Tabbar: FC<{ const renderTabScreens = tabScreens.length > 0 ? tabScreens : placeholderTabScreens + const onPress = useEventCallback((index: number) => { + setSelectedIndex(index) + onPressProp?.(index) + }) + return ( 0 ? "auto" : "none"} @@ -76,53 +82,16 @@ export const Tabbar: FC<{ {renderTabScreens.map((route, index) => { const focused = index === selectedIndex - - const inactiveTintColor = "#999" - const onPress = () => { - setSelectedIndex(index) - onPressProp?.(index) - } - const label = route.title - const accessibilityLabel = - typeof label === "string" && Platform.OS === "ios" - ? `${label}, tab, ${index + 1} of ${tabScreens.length}` - : undefined - - const renderIcon = ({ focused }: { focused: boolean }) => { - const iconSize = ICON_SIZE_ROUND - return ( - - ) - } - - const renderLabel = ({ focused }: { focused: boolean }) => { - return ( - - ) - } - return ( - ) })} @@ -131,6 +100,62 @@ export const Tabbar: FC<{ ) } +const MemoedTabItem: FC<{ + focused: boolean + index: number + label: string + renderIcon?: (options: TabbarIconProps) => React.ReactNode + onPress: (index: number) => void +}> = memo(({ focused, index, label, renderIcon: renderIconFn, onPress: onPressProp }) => { + const inactiveTintColor = "#999" + const onPress = () => { + onPressProp?.(index) + } + + const accessibilityLabel = + typeof label === "string" && Platform.OS === "ios" ? `${label}, tab` : undefined + + const renderIcon = useCallback( + ({ focused }: { focused: boolean }) => { + const iconSize = ICON_SIZE_ROUND + return ( + + ) + }, + [renderIconFn], + ) + + const renderLabel = useCallback( + ({ focused }: { focused: boolean }) => { + return ( + + ) + }, + [label, accessibilityLabel, inactiveTintColor], + ) + + return ( + + ) +}) + const TextLabel = (props: { focused: boolean accessibilityLabel: string | undefined @@ -165,33 +190,10 @@ const TabIcon = ({ const activeOpacity = focused ? 1 : 0 const inactiveOpacity = focused ? 0 : 1 - const opacity = useSharedValue(focused ? 1 : 0.8) - const scale = useSharedValue(focused ? 1 : 0.92) - const rotate = useSharedValue(focused ? 0 : 0.2) - - useEffect(() => { - if (focused) { - opacity.value = withSpring(1) - scale.value = withSpring(1) - rotate.value = withSpring(0) - } else { - opacity.value = 0.8 - scale.value = 0.92 - rotate.value = 0.2 - } - }, [focused, opacity, scale, rotate]) - - const animatedStyle = useAnimatedStyle(() => { - return { - opacity: opacity.value, - transform: [{ scale: scale.value }, { rotate: `${rotate.value}rad` }], - } - }) - return ( {focused && ( - + {renderIcon({ focused: true, size: iconSize, @@ -258,7 +260,7 @@ const TabBarBackground = () => { { const TabItem = memo( ({ - route, focused, onPress, @@ -280,12 +281,11 @@ const TabItem = memo( originalRenderLabel, accessibilityLabel, }: { - route: any focused: boolean onPress: () => void - originalRenderIcon: (scene: { route: any; focused: boolean }) => React.ReactNode - originalRenderLabel: (scene: { route: any; focused: boolean }) => React.ReactNode + originalRenderIcon: (scene: { focused: boolean }) => React.ReactNode + originalRenderLabel: (scene: { focused: boolean }) => React.ReactNode accessibilityLabel?: string }) => { const pressed = useSharedValue(0) @@ -296,23 +296,32 @@ const TabItem = memo( } }) - const scene = { route, focused } + const scene = { focused } return ( { + onPress() + cancelAnimation(pressed) + pressed.value = withSpring(0, quickSpringPreset) + }} onPressIn={() => { pressed.value = withSpring(1, gentleSpringPreset) }} onPressOut={() => { - pressed.value = withSpring(0, gentleSpringPreset) + cancelAnimation(pressed) + pressed.value = withSpring(0, quickSpringPreset) }} className="flex-1 flex-col items-center justify-center" accessibilityLabel={accessibilityLabel} accessibilityRole="button" accessibilityState={{ selected: focused }} > - {originalRenderIcon(scene)} + + {useMemo(() => { + return originalRenderIcon(scene) + }, [JSON.stringify(scene), originalRenderIcon])} + {originalRenderLabel(scene)} ) diff --git a/apps/mobile/src/components/layouts/tabbar/hooks.ts b/apps/mobile/src/components/layouts/tabbar/hooks.ts index 2eafaa968..3404cd076 100644 --- a/apps/mobile/src/components/layouts/tabbar/hooks.ts +++ b/apps/mobile/src/components/layouts/tabbar/hooks.ts @@ -1,5 +1,5 @@ import type { RefObject } from "react" -import { useCallback, useContext, useEffect, useRef } from "react" +import { useCallback, useContext, useEffect, useLayoutEffect, useRef } from "react" import type { FlatList, ScrollView } from "react-native" import { findNodeHandle, Platform } from "react-native" @@ -8,8 +8,9 @@ import { SetAttachNavigationScrollViewContext, useAttachNavigationScrollView, } from "@/src/lib/navigation/AttachNavigationScrollViewContext" -import { useScreenIsAppeared } from "@/src/lib/navigation/bottom-tab/hooks" +import { useScreenIsAppeared, useTabScreenIsFocused } from "@/src/lib/navigation/bottom-tab/hooks" +import { BottomTabBarBackgroundContext } from "./contexts/BottomTabBarBackgroundContext" import { BottomTabBarHeightContext } from "./contexts/BottomTabBarHeightContext" export const useBottomTabBarHeight = () => { @@ -62,8 +63,26 @@ export const useRegisterNavigationScrollView = (active = true) => { if (!active) return if (!setAttachNavigationScrollViewRef) return if (!tabScreenIsFocused) return + if ( + scrollViewRef.current && + typeof scrollViewRef.current === "object" && + "checkScrollToBottom" in scrollViewRef.current && + typeof scrollViewRef.current.checkScrollToBottom === "function" + ) { + scrollViewRef.current.checkScrollToBottom() + } setAttachNavigationScrollViewRef(scrollViewRef as unknown as RefObject) }, [setAttachNavigationScrollViewRef, scrollViewRef, active, tabScreenIsFocused]) return scrollViewRef } + +export const useResetTabOpacityWhenFocused = () => { + const { opacity } = useContext(BottomTabBarBackgroundContext) + const tabScreenIsFocus = useTabScreenIsFocused() + useLayoutEffect(() => { + if (tabScreenIsFocus) { + opacity.value = 1 + } + }, [tabScreenIsFocus, opacity]) +} diff --git a/apps/mobile/src/components/layouts/views/SafeNavigationScrollView.tsx b/apps/mobile/src/components/layouts/views/SafeNavigationScrollView.tsx index ba649340d..100029a4c 100644 --- a/apps/mobile/src/components/layouts/views/SafeNavigationScrollView.tsx +++ b/apps/mobile/src/components/layouts/views/SafeNavigationScrollView.tsx @@ -48,6 +48,9 @@ type SafeNavigationScrollViewProps = Omit & { Header?: React.ReactNode } & PropsWithChildren +export interface ForwardedSafeNavigationScrollView extends ScrollView { + checkScrollToBottom: () => void +} export const SafeNavigationScrollView = forwardRef( ( { @@ -74,7 +77,11 @@ export const SafeNavigationScrollView = forwardRef(null) - useImperativeHandle(forwardedRef, () => ref.current!) + useImperativeHandle(forwardedRef, () => { + return Object.assign({}, ref.current!, { + checkScrollToBottom, + }) + }) const { opacity } = useContext(BottomTabBarBackgroundContext) const inTabScreen = useInTabScreen() @@ -172,6 +179,13 @@ export const NavigationBlurEffectHeaderView = ({ ) } +/** + * @deprecated + * please use `NavigationBlurEffectHeaderView` instead, pass `` in `SafeNavigationScrollView`'s `Header` prop + * + * e.g. `} />` + * @see NavigationBlurEffectHeaderView + */ export const NavigationBlurEffectHeader = ({ headerHideableBottom, headerHideableBottomHeight, diff --git a/apps/mobile/src/components/native/PagerView/index.tsx b/apps/mobile/src/components/native/PagerView/index.tsx index d0a789482..f9a3c0782 100644 --- a/apps/mobile/src/components/native/PagerView/index.tsx +++ b/apps/mobile/src/components/native/PagerView/index.tsx @@ -1,4 +1,5 @@ import { cn } from "@follow/utils" +import { cssInterop } from "nativewind" import type { FC, ForwardRefExoticComponent, @@ -6,13 +7,16 @@ import type { ReactNode, RefAttributes, } from "react" -import { forwardRef, useEffect, useRef, useState } from "react" -import type { ViewStyle } from "react-native" +import { forwardRef, useEffect, useImperativeHandle, useRef, useState } from "react" +import type { StyleProp, ViewStyle } from "react-native" import { StyleSheet } from "react-native" import type { PagerRef } from "./specs" import { EnhancePagerView, EnhancePageView } from "./specs" +cssInterop(EnhancePagerView, { + className: "style", +}) interface PagerViewProps { pageContainerStyle?: ViewStyle pageContainerClassName?: string @@ -24,27 +28,32 @@ interface PagerViewProps { onPageChange?: (index: number) => void onScroll?: (percent: number, direction: "left" | "right") => void onScrollBegin?: () => void - onScrollEnd?: () => void + onScrollEnd?: (index: number) => void onPageWillAppear?: (index: number) => void - containerStyle?: ViewStyle + containerStyle?: StyleProp containerClassName?: string + initialPageIndex?: number } -const PagerViewImpl: FC = ({ - pageContainerStyle, - pageContainerClassName, - renderPage, - pageTotal, - pageGap, - transitionStyle, - containerStyle, - containerClassName, - page, - onPageChange, - onScroll, - onScrollBegin, - onScrollEnd, - onPageWillAppear, -}) => { +const PagerViewImpl: FC = ( + { + pageContainerStyle, + pageContainerClassName, + renderPage, + pageTotal, + pageGap, + transitionStyle, + containerStyle, + containerClassName, + page, + onPageChange, + onScroll, + onScrollBegin, + onScrollEnd, + onPageWillAppear, + initialPageIndex, + }, + ref: any, +) => { const [currentPage, setCurrentPage] = useState(page ?? 0) const nativeRef = useRef(null) @@ -56,8 +65,17 @@ const PagerViewImpl: FC = ({ } } }, [currentPage]) + useImperativeHandle(ref, () => ({ + setPage: (index: number) => { + setCurrentPage(index) + nativeRef.current?.setPage(index) + }, + getPage: () => currentPage, + getState: () => nativeRef.current?.getState(), + })) return ( { @@ -70,15 +88,14 @@ const PagerViewImpl: FC = ({ onScrollBegin={() => { onScrollBegin?.() }} - onScrollEnd={() => { - onScrollEnd?.() + onScrollEnd={(e) => { + onScrollEnd?.(e.nativeEvent.index) }} onPageWillAppear={(e) => { onPageWillAppear?.(e.nativeEvent.index) }} className={cn("flex-1", containerClassName)} style={containerStyle} - // @ts-expect-error ref={nativeRef} > {Array.from({ length: pageTotal }).map((_, index) => ( diff --git a/apps/mobile/src/components/native/PagerView/specs.ts b/apps/mobile/src/components/native/PagerView/specs.ts index 17cb03d2a..2f46f88f6 100644 --- a/apps/mobile/src/components/native/PagerView/specs.ts +++ b/apps/mobile/src/components/native/PagerView/specs.ts @@ -1,18 +1,24 @@ import { requireNativeView } from "expo" import type { NativeSyntheticEvent, ViewProps } from "react-native" -export const EnhancePagerView = requireNativeView("EnhancePagerView") +export const EnhancePagerView = requireNativeView< + ViewProps & + PagerProps & { + ref: React.RefObject + } +>("EnhancePagerView") export const EnhancePageView = requireNativeView("EnhancePageView") export interface PagerProps { onPageChange?: (e: NativeSyntheticEvent<{ index: number }>) => void onScroll?: (e: NativeSyntheticEvent<{ percent: number; direction: "left" | "right" }>) => void onScrollBegin?: () => void - onScrollEnd?: () => void + onScrollEnd?: (e: NativeSyntheticEvent<{ index: number }>) => void onPageWillAppear?: (e: NativeSyntheticEvent<{ index: number }>) => void page?: number pageGap?: number transitionStyle?: "scroll" | "pageCurl" + initialPageIndex?: number } export interface PagerRef { setPage: (index: number) => void diff --git a/apps/mobile/src/components/native/webview/EntryContentWebView.tsx b/apps/mobile/src/components/native/webview/EntryContentWebView.tsx index 3027c5d7f..55c5c7ad9 100644 --- a/apps/mobile/src/components/native/webview/EntryContentWebView.tsx +++ b/apps/mobile/src/components/native/webview/EntryContentWebView.tsx @@ -66,21 +66,16 @@ export function EntryContentWebView(props: EntryContentWebViewProps) { }, [codeThemeLight, codeThemeDark, mode]) const entryInWebview = React.useMemo(() => { - if (showReadability) { - return { - ...entry, - content: entry.readabilityContent, - } - } + const entryContent = showReadability ? entry.readabilityContent : entry.content + const translatedContent = showReadability + ? entry.translation?.readabilityContent + : entry.translation?.content + const content = showTranslation ? translatedContent || entryContent : entryContent - if (showTranslation) { - return { - ...entry, - content: entry.translation?.content || entry.content, - } + return { + ...entry, + content, } - - return entry }, [entry, showReadability, showTranslation]) useEffect(() => { diff --git a/apps/mobile/src/components/ui/datetime/RelativeDateTime.tsx b/apps/mobile/src/components/ui/datetime/RelativeDateTime.tsx index f754df054..ff945345a 100644 --- a/apps/mobile/src/components/ui/datetime/RelativeDateTime.tsx +++ b/apps/mobile/src/components/ui/datetime/RelativeDateTime.tsx @@ -2,9 +2,10 @@ import dayjs from "dayjs" import { useEffect, useMemo, useState } from "react" import { useTranslation } from "react-i18next" import type { TextProps } from "react-native" -import { Pressable } from "react-native" import Animated, { FadeOut } from "react-native-reanimated" +import { NativePressable } from "../pressable/NativePressable" + const formatTemplateString = "lll" const formatTime = ( @@ -48,7 +49,7 @@ interface RelativeDateTimeProps extends TextProps { export const RelativeDateTime = ({ date, - displayAbsoluteTimeAfterDay, + displayAbsoluteTimeAfterDay = 29, dateFormatTemplate, postfixText, ...props @@ -76,7 +77,7 @@ export const RelativeDateTime = ({ }, [date, displayAbsoluteTimeAfterDay, dateFormatTemplate, mode]) return ( - { setMode((mode) => (mode === "relative" ? "absolute" : "relative")) @@ -87,6 +88,6 @@ export const RelativeDateTime = ({ ? `${relative}${t("space")}${postfixText ?? t("words.ago")}` : memoizedFormatTime} - + ) } diff --git a/apps/mobile/src/components/ui/grouped/GroupedList.tsx b/apps/mobile/src/components/ui/grouped/GroupedList.tsx index 0a1d12ce1..e7da097c7 100644 --- a/apps/mobile/src/components/ui/grouped/GroupedList.tsx +++ b/apps/mobile/src/components/ui/grouped/GroupedList.tsx @@ -1,10 +1,12 @@ import { cn } from "@follow/utils" +import { SymbolView } from "expo-symbols" import type { FC, PropsWithChildren } from "react" import * as React from "react" import { Fragment } from "react" import type { PressableProps, ViewProps } from "react-native" import { Pressable, StyleSheet, Text, View } from "react-native" import Animated, { FadeIn, FadeOut } from "react-native-reanimated" +import type { SFSymbol } from "sf-symbols-typescript" import { CheckFilledIcon } from "@/src/icons/check_filled" import { MingcuteRightLine } from "@/src/icons/mingcute_right_line" @@ -23,6 +25,7 @@ import { GroupedInsetListCardItemStyle } from "./GroupedInsetListCardItemStyle" interface GroupedInsetListCardProps { showSeparator?: boolean SeparatorComponent?: FC + SeparatorElement?: React.ReactNode } interface BaseCellClassNames { @@ -38,7 +41,14 @@ export const GroupedOutlineDescription: FC<{ export const GroupedInsetListCard: FC< PropsWithChildren & ViewProps & GroupedInsetListCardProps -> = ({ children, className, showSeparator = true, SeparatorComponent, ...props }) => { +> = ({ + children, + className, + showSeparator = true, + SeparatorComponent, + SeparatorElement, + ...props +}) => { const nextChildren = React.useMemo( () => React.Children.toArray(children).filter(Boolean), [children], @@ -63,15 +73,24 @@ export const GroupedInsetListCard: FC< ((child.type as Function).name === GroupedInsetListNavigationLink.name || (child.type as any).itemStyle === GroupedInsetListCardItemStyle.NavigationLink) + const NextSeparatorComponent = + typeof SeparatorComponent === "function" ? : undefined + const NextSeparatorElement = SeparatorElement + ? React.isValidElement(SeparatorElement) + ? SeparatorElement + : NextSeparatorComponent + : NextSeparatorComponent + return ( {child} {!isLast && - (SeparatorComponent ? ( - - ) : ( + (NextSeparatorElement ?? ( ))} @@ -178,12 +197,16 @@ export const GroupedInsetListCell: FC< label: string description?: string children?: React.ReactNode + icon?: SFSymbol } & BaseCellClassNames -> = ({ label, description, children, leftClassName, rightClassName }) => { +> = ({ label, description, children, leftClassName, rightClassName, icon }) => { return ( - {label} + + {!!icon && } + {label} + {!!description && ( {description} )} @@ -254,7 +277,8 @@ export const GroupedInsetListActionCell: FC<{ description?: string onPress?: () => void disabled?: boolean -}> = ({ label, description, onPress, disabled }) => { + icon?: SFSymbol +}> = ({ label, description, onPress, disabled, icon }) => { const rightIconColor = useColor("tertiaryLabel") return ( - {label} + + {!!icon && } + {label} + {!!description && ( {description} )} diff --git a/apps/mobile/src/components/ui/pressable/IosItemPressable.ios.tsx b/apps/mobile/src/components/ui/pressable/IosItemPressable.ios.tsx new file mode 100644 index 000000000..afa8f1bf1 --- /dev/null +++ b/apps/mobile/src/components/ui/pressable/IosItemPressable.ios.tsx @@ -0,0 +1,14 @@ +import { requireNativeView } from "expo" +import { cssInterop } from "nativewind" +import type { ViewProps } from "react-native" + +const NativeItemPressable = requireNativeView< + ViewProps & { + onItemPress: () => any + touchHighlight?: boolean + } +>("ItemPressable") +cssInterop(NativeItemPressable, { + className: "style", +}) +export { NativeItemPressable } diff --git a/apps/mobile/src/components/ui/pressable/IosItemPressable.tsx b/apps/mobile/src/components/ui/pressable/IosItemPressable.tsx new file mode 100644 index 000000000..27da52fc6 --- /dev/null +++ b/apps/mobile/src/components/ui/pressable/IosItemPressable.tsx @@ -0,0 +1,12 @@ +import type { FC } from "react" +import type { ViewProps } from "react-native" + +const NativeItemPressable: FC< + ViewProps & { + onItemPress?: () => any + touchHighlight?: boolean + } +> = () => { + throw new Error("NativeItemPressable is not supported on iOS") +} +export { NativeItemPressable } diff --git a/apps/mobile/src/components/ui/pressable/ItemPressable.ios.tsx b/apps/mobile/src/components/ui/pressable/ItemPressable.ios.tsx new file mode 100644 index 000000000..24aee7a2f --- /dev/null +++ b/apps/mobile/src/components/ui/pressable/ItemPressable.ios.tsx @@ -0,0 +1,42 @@ +import { cn } from "@follow/utils" +import type { FC } from "react" +import { memo } from "react" +import type { ViewProps } from "react-native" + +import { ItemPressableStyle } from "./enum" +import { NativeItemPressable } from "./IosItemPressable" + +export interface ItemPressableProps extends ViewProps { + itemStyle?: ItemPressableStyle + touchHighlight?: boolean + onPress?: () => any +} + +export const ItemPressable: FC = memo( + ({ children, itemStyle = ItemPressableStyle.Grouped, className, ...props }) => { + const isUnStyled = itemStyle === ItemPressableStyle.UnStyled + return ( + { + props.onPress?.() + }} + > + {children} + + ) + }, +) diff --git a/apps/mobile/src/components/ui/pressable/ItemPressable.tsx b/apps/mobile/src/components/ui/pressable/ItemPressable.tsx index 90b61872f..e1779a6a3 100644 --- a/apps/mobile/src/components/ui/pressable/ItemPressable.tsx +++ b/apps/mobile/src/components/ui/pressable/ItemPressable.tsx @@ -19,7 +19,7 @@ import { useColor } from "@/src/theme/colors" import { ReAnimatedPressable } from "../../common/AnimatedComponents" import { ItemPressableStyle } from "./enum" -interface ItemPressableProps extends PressableProps { +export interface ItemPressableProps extends PressableProps { itemStyle?: ItemPressableStyle touchHighlight?: boolean } @@ -67,6 +67,7 @@ export const ItemPressable: FC = memo( }, 100) }) }, [setIsPressing]) + const isUnStyled = itemStyle === ItemPressableStyle.UnStyled return ( @@ -77,7 +78,10 @@ export const ItemPressable: FC = memo( onLongPress={composeEventHandlers(props.onLongPress, () => {})} delayLongPress={props.delayLongPress ?? 100} className={cn("relative overflow-hidden", props.className)} - style={StyleSheet.flatten([props.style, { backgroundColor: itemNormalColor }])} + style={StyleSheet.flatten([ + props.style, + !isUnStyled && { backgroundColor: itemNormalColor }, + ])} > {useTypeScriptHappyCallback( (props) => { diff --git a/apps/mobile/src/components/ui/pressable/NativePressable.ios.tsx b/apps/mobile/src/components/ui/pressable/NativePressable.ios.tsx new file mode 100644 index 000000000..2771a9df7 --- /dev/null +++ b/apps/mobile/src/components/ui/pressable/NativePressable.ios.tsx @@ -0,0 +1,10 @@ +import { NativeItemPressable } from "./IosItemPressable" +import type { NativePressableProps } from "./NativePressable.types" + +export const NativePressable = ({ children, onPress, ...props }: NativePressableProps) => { + return ( + + {children} + + ) +} diff --git a/apps/mobile/src/components/ui/pressable/NativePressable.tsx b/apps/mobile/src/components/ui/pressable/NativePressable.tsx new file mode 100644 index 000000000..233e91634 --- /dev/null +++ b/apps/mobile/src/components/ui/pressable/NativePressable.tsx @@ -0,0 +1,11 @@ +import { Pressable } from "react-native" + +import type { NativePressableProps } from "./NativePressable.types" + +/** + * In order to resolve the conflict between the gesture handling of the native view and the RCTSurfaceGestureHandler in React Native. + * + */ +export const NativePressable = ({ children, ...props }: NativePressableProps) => { + return {children} +} diff --git a/apps/mobile/src/components/ui/pressable/NativePressable.types.tsx b/apps/mobile/src/components/ui/pressable/NativePressable.types.tsx new file mode 100644 index 000000000..ac0533fa5 --- /dev/null +++ b/apps/mobile/src/components/ui/pressable/NativePressable.types.tsx @@ -0,0 +1,5 @@ +import type { ViewProps } from "react-native" + +export interface NativePressableProps extends ViewProps { + onPress?: () => any +} diff --git a/apps/mobile/src/components/ui/pressable/enum.ts b/apps/mobile/src/components/ui/pressable/enum.ts index f777c26fb..f1d972865 100644 --- a/apps/mobile/src/components/ui/pressable/enum.ts +++ b/apps/mobile/src/components/ui/pressable/enum.ts @@ -1,4 +1,5 @@ export enum ItemPressableStyle { + UnStyled, Plain, Grouped, } diff --git a/apps/mobile/src/components/ui/tabview/TabView.tsx b/apps/mobile/src/components/ui/tabview/TabView.tsx index f38e5ab6d..1752f5653 100644 --- a/apps/mobile/src/components/ui/tabview/TabView.tsx +++ b/apps/mobile/src/components/ui/tabview/TabView.tsx @@ -20,7 +20,10 @@ type Tab = { value: string } -export type TabComponent = FC<{ isSelected: boolean; tab: Tab } & Pick> +// eslint-disable-next-line @typescript-eslint/no-empty-object-type +export type TabComponent = FC< + { isSelected: boolean; tab: Tab } & T & Pick +> interface TabViewProps { tabs: Tab[] Tab?: TabComponent diff --git a/apps/mobile/src/database/schemas/index.ts b/apps/mobile/src/database/schemas/index.ts index 4af8ed1c4..9a628c2b6 100644 --- a/apps/mobile/src/database/schemas/index.ts +++ b/apps/mobile/src/database/schemas/index.ts @@ -109,12 +109,11 @@ export const summariesTable = sqliteTable( { entryId: text("entry_id").notNull().primaryKey(), summary: text("summary").notNull(), + readabilitySummary: text("readability_summary"), createdAt: text("created_at").$defaultFn(() => new Date().toISOString()), language: text("language"), }, - (table) => ({ - unq: uniqueIndex("unq").on(table.entryId, table.language), - }), + (t) => [uniqueIndex("unq").on(t.entryId, t.language)], ) export const translationsTable = sqliteTable( @@ -125,6 +124,7 @@ export const translationsTable = sqliteTable( title: t.text("title").notNull(), description: t.text("description").notNull(), content: t.text("content").notNull(), + readabilityContent: t.text("readability_content"), createdAt: t .text("created_at") .notNull() diff --git a/apps/mobile/src/hooks/useBackHandler.ts b/apps/mobile/src/hooks/useBackHandler.ts new file mode 100644 index 000000000..4e286af4a --- /dev/null +++ b/apps/mobile/src/hooks/useBackHandler.ts @@ -0,0 +1,28 @@ +import { useEffect } from "react" +import { BackHandler } from "react-native" + +import { useCanDismiss, useNavigation } from "../lib/navigation/hooks" +import { isAndroid } from "../lib/platform" + +export const useBackHandler = () => { + const navigation = useNavigation() + const canDismiss = useCanDismiss() + + useEffect(() => { + if (!isAndroid) return + + // eslint-disable-next-line @eslint-react/web-api/no-leaked-event-listener -- listener.remove() handles cleanup + const listener = BackHandler.addEventListener("hardwareBackPress", () => { + if (canDismiss) { + navigation.dismiss() + } else { + navigation.back() + } + return true + }) + + return () => { + listener.remove() + } + }, [canDismiss, navigation]) +} diff --git a/apps/mobile/src/hooks/useIntentHandler.ts b/apps/mobile/src/hooks/useIntentHandler.ts index b4d482c1c..eccd2067f 100644 --- a/apps/mobile/src/hooks/useIntentHandler.ts +++ b/apps/mobile/src/hooks/useIntentHandler.ts @@ -2,7 +2,7 @@ import * as Linking from "expo-linking" import { useEffect } from "react" import { useNavigation } from "../lib/navigation/hooks" -import { FollowScreen } from "../screens/(modal)/follow" +import { FollowScreen } from "../screens/(modal)/FollowScreen" // This needs to stay outside of react to persist between account switches let previousIntentUrl = "" diff --git a/apps/mobile/src/icons/ai_cute_re.tsx b/apps/mobile/src/icons/ai_cute_re.tsx new file mode 100644 index 000000000..0b9a480b4 --- /dev/null +++ b/apps/mobile/src/icons/ai_cute_re.tsx @@ -0,0 +1,20 @@ +import * as React from "react" +import Svg, { Path } from "react-native-svg" + +interface AiCuteReIconProps { + width?: number + height?: number + color?: string +} + +export const AiCuteReIcon = ({ width = 24, height = 24, color = "#10161F" }: AiCuteReIconProps) => { + return ( + + + + ) +} diff --git a/apps/mobile/src/icons/bell_ringing_cute_re.tsx b/apps/mobile/src/icons/bell_ringing_cute_re.tsx new file mode 100644 index 000000000..2cf23cf22 --- /dev/null +++ b/apps/mobile/src/icons/bell_ringing_cute_re.tsx @@ -0,0 +1,24 @@ +import * as React from "react" +import Svg, { Path } from "react-native-svg" + +interface BellRingingCuteReIconProps { + width?: number + height?: number + color?: string +} + +export const BellRingingCuteReIcon = ({ + width = 24, + height = 24, + color = "#10161F", +}: BellRingingCuteReIconProps) => { + return ( + + + + ) +} diff --git a/apps/mobile/src/icons/close_circle_fill.tsx b/apps/mobile/src/icons/close_circle_fill.tsx index 8597960ba..8e8d2c096 100644 --- a/apps/mobile/src/icons/close_circle_fill.tsx +++ b/apps/mobile/src/icons/close_circle_fill.tsx @@ -1,12 +1,16 @@ -import type { SvgProps } from "react-native-svg" import { G, Path, Svg } from "react-native-svg" -export const CloseCircleFillIcon = (props: SvgProps & { color?: string }) => ( - +interface IconProps { + width?: number + height?: number + color?: string +} +export const CloseCircleFillIcon = ({ width = 24, height = 24, color = "#10161F" }: IconProps) => ( + diff --git a/apps/mobile/src/icons/ghost_cute_re.tsx b/apps/mobile/src/icons/ghost_cute_re.tsx new file mode 100644 index 000000000..6bb2d459a --- /dev/null +++ b/apps/mobile/src/icons/ghost_cute_re.tsx @@ -0,0 +1,24 @@ +import * as React from "react" +import Svg, { Path } from "react-native-svg" + +interface GhostCuteReIconProps { + width?: number + height?: number + color?: string +} + +export const GhostCuteReIcon = ({ + width = 24, + height = 24, + color = "#10161F", +}: GhostCuteReIconProps) => { + return ( + + + + ) +} diff --git a/apps/mobile/src/icons/info_circle_fill.tsx b/apps/mobile/src/icons/info_circle_fill.tsx index 22381e0b1..135fa0849 100644 --- a/apps/mobile/src/icons/info_circle_fill.tsx +++ b/apps/mobile/src/icons/info_circle_fill.tsx @@ -1,12 +1,16 @@ -import type { SvgProps } from "react-native-svg" import { G, Path, Svg } from "react-native-svg" -export const InfoCircleFillIcon = (props: SvgProps & { color?: string }) => ( - +interface IconProps { + width?: number + height?: number + color?: string +} +export const InfoCircleFillIcon = ({ width = 24, height = 24, color = "#10161F" }: IconProps) => ( + diff --git a/apps/mobile/src/icons/quill_pen_cute_re.tsx b/apps/mobile/src/icons/quill_pen_cute_re.tsx new file mode 100644 index 000000000..aa5b8060c --- /dev/null +++ b/apps/mobile/src/icons/quill_pen_cute_re.tsx @@ -0,0 +1,24 @@ +import * as React from "react" +import Svg, { Path } from "react-native-svg" + +interface QuillPenCuteReIconProps { + width?: number + height?: number + color?: string +} + +export const QuillPenCuteReIcon = ({ + width = 24, + height = 24, + color = "#10161F", +}: QuillPenCuteReIconProps) => { + return ( + + + + ) +} diff --git a/apps/mobile/src/icons/share_3_cute_re.tsx b/apps/mobile/src/icons/share_3_cute_re.tsx deleted file mode 100644 index 40e255ee6..000000000 --- a/apps/mobile/src/icons/share_3_cute_re.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import * as React from "react" -import Svg, { Path } from "react-native-svg" - -interface Share3CuteReIconProps { - width?: number - height?: number - color?: string -} - -export const Share3CuteReIcon = ({ - width = 24, - height = 24, - color = "#10161F", -}: Share3CuteReIconProps) => { - return ( - - - - ) -} diff --git a/apps/mobile/src/icons/translate_2_ai_cute_re.tsx b/apps/mobile/src/icons/translate_2_ai_cute_re.tsx new file mode 100644 index 000000000..8df834904 --- /dev/null +++ b/apps/mobile/src/icons/translate_2_ai_cute_re.tsx @@ -0,0 +1,24 @@ +import * as React from "react" +import Svg, { Path } from "react-native-svg" + +interface Translate2AiCuteReIconProps { + width?: number + height?: number + color?: string +} + +export const Translate2AiCuteReIcon = ({ + width = 24, + height = 24, + color = "#10161F", +}: Translate2AiCuteReIconProps) => { + return ( + + + + ) +} diff --git a/apps/mobile/src/icons/webhook_cute_re.tsx b/apps/mobile/src/icons/webhook_cute_re.tsx new file mode 100644 index 000000000..b89b6d1fb --- /dev/null +++ b/apps/mobile/src/icons/webhook_cute_re.tsx @@ -0,0 +1,24 @@ +import * as React from "react" +import Svg, { Path } from "react-native-svg" + +interface WebhookCuteReIconProps { + width?: number + height?: number + color?: string +} + +export const WebhookCuteReIcon = ({ + width = 24, + height = 24, + color = "#10161F", +}: WebhookCuteReIconProps) => { + return ( + + + + ) +} diff --git a/apps/mobile/src/lib/api-fetch.ts b/apps/mobile/src/lib/api-fetch.ts index 5b93d6573..f74eeaf1b 100644 --- a/apps/mobile/src/lib/api-fetch.ts +++ b/apps/mobile/src/lib/api-fetch.ts @@ -2,7 +2,7 @@ import type { AppType } from "@follow/shared" import { FetchError, ofetch } from "ofetch" -import { InvitationScreen } from "../screens/(modal)/invitation" +import { InvitationScreen } from "../screens/(modal)/InvitationScreen" import { userActions } from "../store/user/store" import { getCookie } from "./auth" import { getUserAgent } from "./native/user-agent" diff --git a/apps/mobile/src/lib/auth.ts b/apps/mobile/src/lib/auth.ts index c13bc4fd0..2507a66ad 100644 --- a/apps/mobile/src/lib/auth.ts +++ b/apps/mobile/src/lib/auth.ts @@ -22,14 +22,14 @@ const serverPlugins = [ id: "customGetProviders", $InferServerPlugin: {} as Extract, }, - { - id: "customCreateSession", - $InferServerPlugin: {} as Extract, - }, { id: "getAccountInfo", $InferServerPlugin: {} as Extract, }, + { + id: "oneTimeToken", + $InferServerPlugin: {} as Extract, + }, inferAdditionalFields({ user: { handle: { @@ -75,6 +75,7 @@ export const { getCookie, getProviders, linkSocial, + oneTimeToken, sendVerificationEmail, signIn, signOut, diff --git a/apps/mobile/src/lib/native/index.ios.ts b/apps/mobile/src/lib/native/index.ios.ts index 9cf99f8c9..3ad767ea4 100644 --- a/apps/mobile/src/lib/native/index.ios.ts +++ b/apps/mobile/src/lib/native/index.ios.ts @@ -13,8 +13,8 @@ interface NativeModule { } const nativeModule = requireNativeModule("Helper") as NativeModule export const openLink = (url: string, onDismiss?: () => void) => { - const { openLinksInApp } = getGeneralSettings() - if (!openLinksInApp) { + const { openLinksInExternalApp } = getGeneralSettings() + if (openLinksInExternalApp) { openURL(url) return } diff --git a/apps/mobile/src/lib/navigation/WrappedScreenItem.tsx b/apps/mobile/src/lib/navigation/WrappedScreenItem.tsx index 8a627643b..58c2768c5 100644 --- a/apps/mobile/src/lib/navigation/WrappedScreenItem.tsx +++ b/apps/mobile/src/lib/navigation/WrappedScreenItem.tsx @@ -3,7 +3,7 @@ import type { PrimitiveAtom } from "jotai" import { atom, useAtomValue, useSetAtom } from "jotai" import type { FC, ReactNode } from "react" import { memo, useCallback, useContext, useMemo, useRef } from "react" -import type { NativeSyntheticEvent } from "react-native" +import type { NativeSyntheticEvent, StyleProp, ViewStyle } from "react-native" import { StyleSheet, View } from "react-native" import { useSharedValue } from "react-native-reanimated" import type { ScreenStackHeaderConfigProps, StackPresentationTypes } from "react-native-screens" @@ -33,6 +33,7 @@ export const WrappedScreenItem: FC< headerConfig?: ScreenStackHeaderConfigProps screenOptions?: NavigationControllerViewExtraProps + style?: StyleProp } & ScreenOptionsContextType > = memo( ({ @@ -41,6 +42,7 @@ export const WrappedScreenItem: FC< stackPresentation, headerConfig, screenOptions: screenOptionsProp, + style, ...rest }) => { const navigation = useNavigation() @@ -143,6 +145,7 @@ export const WrappedScreenItem: FC< style={[ StyleSheet.absoluteFill, { backgroundColor: screenOptionsProp?.transparent ? undefined : backgroundColor }, + style, ]} {...rest} {...mergedScreenOptions} diff --git a/apps/mobile/src/lib/navigation/bottom-tab/TabRoot.ios.tsx b/apps/mobile/src/lib/navigation/bottom-tab/TabRoot.ios.tsx index 099dd8f8b..49109a475 100644 --- a/apps/mobile/src/lib/navigation/bottom-tab/TabRoot.ios.tsx +++ b/apps/mobile/src/lib/navigation/bottom-tab/TabRoot.ios.tsx @@ -1,19 +1,13 @@ import { requireNativeView } from "expo" -import { atom, useAtom } from "jotai" +import { useAtom } from "jotai" import type { FC, PropsWithChildren } from "react" import * as React from "react" -import { useCallback, useMemo, useState } from "react" +import { useCallback, useMemo } from "react" import type { NativeSyntheticEvent, ViewProps } from "react-native" import { StyleSheet } from "react-native" -import type { BottomTabContextType } from "./BottomTabContext" import { BottomTabContext } from "./BottomTabContext" import { TabScreen } from "./TabScreen.ios" -import type { TabScreenProps } from "./types" - -interface TabRootProps { - initialTabIndex?: number -} const TabBarRoot = requireNativeView< { @@ -22,22 +16,9 @@ const TabBarRoot = requireNativeView< } & ViewProps >("TabBarRoot") -export const TabRoot: FC = ({ - children, - initialTabIndex = 0, -}) => { - const [tabIndexAtom] = useState(() => atom(initialTabIndex)) - const [tabIndex, setTabIndex] = useAtom(tabIndexAtom) - - const ctxValue = useMemo( - () => ({ - currentIndexAtom: tabIndexAtom, - loadedableIndexAtom: atom(new Set()), - tabScreensAtom: atom([]), - tabHeightAtom: atom(0), - }), - [tabIndexAtom], - ) +export const TabRoot: FC = ({ children }) => { + const { currentIndexAtom } = React.useContext(BottomTabContext) + const [tabIndex, setTabIndex] = useAtom(currentIndexAtom) const MapChildren = useMemo(() => { let cnt = 0 @@ -51,19 +32,17 @@ export const TabRoot: FC = ({ }) }, [children]) return ( - - { - setTabIndex(e.nativeEvent.index) - }, - [setTabIndex], - )} - selectedIndex={tabIndex} - > - {MapChildren} - - + { + setTabIndex(e.nativeEvent.index) + }, + [setTabIndex], + )} + selectedIndex={tabIndex} + > + {MapChildren} + ) } diff --git a/apps/mobile/src/lib/navigation/bottom-tab/TabRoot.tsx b/apps/mobile/src/lib/navigation/bottom-tab/TabRoot.tsx index 6be3ddae4..eb99934f5 100644 --- a/apps/mobile/src/lib/navigation/bottom-tab/TabRoot.tsx +++ b/apps/mobile/src/lib/navigation/bottom-tab/TabRoot.tsx @@ -1,34 +1,11 @@ -import { atom } from "jotai" import type { FC, PropsWithChildren } from "react" import * as React from "react" -import { useMemo, useState } from "react" +import { useMemo } from "react" import { StyleSheet, View } from "react-native" -import type { BottomTabContextType } from "./BottomTabContext" -import { BottomTabContext } from "./BottomTabContext" import { TabScreen } from "./TabScreen" -import type { TabScreenProps } from "./types" - -interface TabRootProps { - initialTabIndex?: number -} - -export const TabRoot: FC = ({ - children, - initialTabIndex = 0, -}) => { - const [tabIndexAtom] = useState(() => atom(initialTabIndex)) - - const ctxValue = useMemo( - () => ({ - currentIndexAtom: tabIndexAtom, - loadedableIndexAtom: atom(new Set()), - tabScreensAtom: atom([]), - tabHeightAtom: atom(0), - }), - [tabIndexAtom], - ) +export const TabRoot: FC = ({ children }) => { const MapChildren = useMemo(() => { let cnt = 0 return React.Children.map(children, (child) => { @@ -40,9 +17,5 @@ export const TabRoot: FC = ({ return child }) }, [children]) - return ( - - {MapChildren} - - ) + return {MapChildren} } diff --git a/apps/mobile/src/lib/navigation/bottom-tab/TabScreen.ios.tsx b/apps/mobile/src/lib/navigation/bottom-tab/TabScreen.ios.tsx index c128a9bc5..0ed63427a 100644 --- a/apps/mobile/src/lib/navigation/bottom-tab/TabScreen.ios.tsx +++ b/apps/mobile/src/lib/navigation/bottom-tab/TabScreen.ios.tsx @@ -64,7 +64,7 @@ export const TabScreen: FC tabScreen.tabScreenIndex !== tabScreenIndex), ) } - }, [setTabScreens, props, tabScreenIndex, children, mergedProps]) + }, [mergedProps, setTabScreens, tabScreenIndex]) const currentSelectedIndex = useAtomValue(currentIndexAtom) @@ -95,15 +95,15 @@ export const TabScreen: FC - {shouldLoadReact && ( + {shouldLoadReact && render && ( {children} - {/* */} )} diff --git a/apps/mobile/src/main.tsx b/apps/mobile/src/main.tsx index 880ccf08f..327509098 100644 --- a/apps/mobile/src/main.tsx +++ b/apps/mobile/src/main.tsx @@ -2,6 +2,7 @@ import "./global.css" import { registerRootComponent } from "expo" import { Image } from "expo-image" +import { LinearGradient } from "expo-linear-gradient" import { cssInterop } from "nativewind" import { useTranslation } from "react-i18next" import { enableFreeze } from "react-native-screens" @@ -23,10 +24,11 @@ import { SubscriptionsTabScreen } from "./screens/(stack)/(tabs)/subscriptions" import { registerSitemap } from "./sitemap" enableFreeze(true) -cssInterop(Image, { className: "style" }) +;[Image, LinearGradient].forEach((Component) => { + cssInterop(Component, { className: "style" }) +}) initializeApp() - registerSitemap() initializeI18n().then(() => { registerRootComponent(RootComponent) diff --git a/apps/mobile/src/modules/ai/summary.tsx b/apps/mobile/src/modules/ai/summary.tsx index baf6dea52..4a6f556a7 100644 --- a/apps/mobile/src/modules/ai/summary.tsx +++ b/apps/mobile/src/modules/ai/summary.tsx @@ -15,7 +15,7 @@ import Animated, { } from "react-native-reanimated" import { useColor } from "react-native-uikit-colors" -import { Magic2CuteReIcon } from "@/src/icons/magic_2_cute_re" +import { AiCuteReIcon } from "@/src/icons/ai_cute_re" export const AISummary: FC<{ className?: string @@ -69,7 +69,7 @@ export const AISummary: FC<{ style={styles.card} > - + diff --git a/apps/mobile/src/modules/context-menu/entry.tsx b/apps/mobile/src/modules/context-menu/entry.tsx index 85ab13840..8c8511140 100644 --- a/apps/mobile/src/modules/context-menu/entry.tsx +++ b/apps/mobile/src/modules/context-menu/entry.tsx @@ -12,8 +12,7 @@ import { import { ContextMenu } from "@/src/components/ui/context-menu" import { useNavigation } from "@/src/lib/navigation/hooks" import { toast } from "@/src/lib/toast" -import { getHorizontalScrolling } from "@/src/modules/screen/atoms" -import { EntryDetailScreen } from "@/src/screens/(stack)/entries/[entryId]" +import { EntryDetailScreen } from "@/src/screens/(stack)/entries/[entryId]/EntryDetailScreen" import { useIsEntryStarred } from "@/src/store/collection/hooks" import { collectionSyncService } from "@/src/store/collection/store" import { useEntry } from "@/src/store/entry/hooks" @@ -31,8 +30,7 @@ export const EntryItemContextMenu = ({ const navigation = useNavigation() const handlePressPreview = useCallback(() => { - const isHorizontalScrolling = getHorizontalScrolling() - if (entry && !isHorizontalScrolling) { + if (entry) { preloadWebViewEntry(entry) navigation.pushControllerView(EntryDetailScreen, { entryId: id, diff --git a/apps/mobile/src/modules/context-menu/feeds.tsx b/apps/mobile/src/modules/context-menu/feeds.tsx index 0237f8420..7f87f9626 100644 --- a/apps/mobile/src/modules/context-menu/feeds.tsx +++ b/apps/mobile/src/modules/context-menu/feeds.tsx @@ -9,11 +9,12 @@ import type { ListRenderItemInfo } from "react-native" import { Alert, FlatList, View } from "react-native" import { ContextMenu } from "@/src/components/ui/context-menu" +import { PlatformActivityIndicator } from "@/src/components/ui/loading/PlatformActivityIndicator" import { views } from "@/src/constants/views" import { useNavigation } from "@/src/lib/navigation/hooks" import type { Navigation } from "@/src/lib/navigation/Navigation" import { toast } from "@/src/lib/toast" -import { FeedScreen } from "@/src/screens/(stack)/feeds/[feedId]" +import { FeedScreen } from "@/src/screens/(stack)/feeds/[feedId]/FeedScreen" import { useEntryIdsByFeedId, usePrefetchEntries } from "@/src/store/entry/hooks" import { getFeed } from "@/src/store/feed/getter" import { getSubscription } from "@/src/store/subscription/getter" @@ -322,16 +323,19 @@ export const SubscriptionFeedCategoryContextMenu = ({ const PreviewFeeds = (props: { id: string; view: FeedViewType }) => { const { id: feedId } = props const entryIds = useEntryIdsByFeedId(feedId) - usePrefetchEntries({ feedId, limit: 5 }) + const { isLoading } = usePrefetchEntries({ feedId, limit: 5 }) const renderItem = useCallback( ({ item: id }: ListRenderItemInfo) => ( ), - [], + [props.view], ) return ( + {isLoading && !entryIds?.length && ( + + )} entryIds?.slice(0, 5), [entryIds])} diff --git a/apps/mobile/src/modules/context-menu/lists.tsx b/apps/mobile/src/modules/context-menu/lists.tsx index 98bdba536..4e3559270 100644 --- a/apps/mobile/src/modules/context-menu/lists.tsx +++ b/apps/mobile/src/modules/context-menu/lists.tsx @@ -1,4 +1,4 @@ -import { env } from "@follow/shared/src/env" +import { env } from "@follow/shared/src/env.rn" import type { FC, PropsWithChildren } from "react" import { useMemo } from "react" import { useTranslation } from "react-i18next" @@ -33,7 +33,7 @@ export const SubscriptionListItemContextMenu: FC< const list = getList(id) if (!list) return toast.success("Link copied to clipboard") - Clipboard.setString(`${env.VITE_WEB_URL}/share/lists/${list.id}`) + Clipboard.setString(`${env.WEB_URL}/share/lists/${list.id}`) }, }, { diff --git a/apps/mobile/src/modules/dialogs/AddFeedDialog.tsx b/apps/mobile/src/modules/dialogs/AddFeedDialog.tsx index a708e53bd..ac736e1e8 100644 --- a/apps/mobile/src/modules/dialogs/AddFeedDialog.tsx +++ b/apps/mobile/src/modules/dialogs/AddFeedDialog.tsx @@ -6,7 +6,7 @@ import type { DialogComponent } from "@/src/lib/dialog" import { Dialog } from "@/src/lib/dialog" import { useNavigation } from "@/src/lib/navigation/hooks" import { Navigation } from "@/src/lib/navigation/Navigation" -import { FollowScreen } from "@/src/screens/(modal)/follow" +import { FollowScreen } from "@/src/screens/(modal)/FollowScreen" import { accentColor } from "@/src/theme/colors" export const AddFeedDialog: DialogComponent<{ diff --git a/apps/mobile/src/modules/discover/DiscoverContext.ts b/apps/mobile/src/modules/discover/DiscoverContext.ts index 32c33e7f0..96fc869d1 100644 --- a/apps/mobile/src/modules/discover/DiscoverContext.ts +++ b/apps/mobile/src/modules/discover/DiscoverContext.ts @@ -1,12 +1,6 @@ import type { PrimitiveAtom } from "jotai" import { createContext } from "react" -import type { Animated } from "react-native" -import type { SharedValue } from "react-native-reanimated" export const DiscoverContext = createContext<{ - animatedX: Animated.Value - currentTabAtom: PrimitiveAtom - headerHeightAtom: PrimitiveAtom - animatedY: SharedValue }>(null!) diff --git a/apps/mobile/src/modules/discover/GoodLuck.tsx b/apps/mobile/src/modules/discover/GoodLuck.tsx new file mode 100644 index 000000000..c38068837 --- /dev/null +++ b/apps/mobile/src/modules/discover/GoodLuck.tsx @@ -0,0 +1,53 @@ +import { RSSHubCategories } from "@follow/constants" +import type { RSSHubRouteDeclaration } from "@follow/models/src/rsshub" +import { useQuery } from "@tanstack/react-query" +import { shuffle } from "es-toolkit/compat" +import { useMemo } from "react" +import { View } from "react-native" + +import { PlatformActivityIndicator } from "@/src/components/ui/loading/PlatformActivityIndicator" + +import { fetchRsshubPopular } from "./api" +import { RecommendationListItem } from "./RecommendationListItem" + +export const GoodLuck = () => { + const randomTab = useMemo( + () => RSSHubCategories[Math.floor(Math.random() * RSSHubCategories.length)]!, + [], + ) + const { data, isLoading } = useQuery({ + queryKey: ["rsshub-popular", "cache", randomTab], + queryFn: () => fetchRsshubPopular(randomTab, "all").then((res) => res.data), + }) + + const arr = useMemo(() => { + if (!data) return [] + const keys = shuffle(Object.keys(data)).slice(0, 2) + + return keys.map((key) => { + const route = data[key] + return { + key, + route, + } + }) + }, [data]) + + return ( + + {isLoading ? ( + + + + ) : ( + arr.map((item) => ( + + )) + )} + + ) +} diff --git a/apps/mobile/src/modules/discover/RecommendationListItem.tsx b/apps/mobile/src/modules/discover/RecommendationListItem.tsx index b075f9e67..542aa0f96 100644 --- a/apps/mobile/src/modules/discover/RecommendationListItem.tsx +++ b/apps/mobile/src/modules/discover/RecommendationListItem.tsx @@ -12,7 +12,7 @@ import { FeedIcon } from "@/src/components/ui/icon/feed-icon" import { openLink } from "@/src/lib/native" import { useNavigation } from "@/src/lib/navigation/hooks" import { toast } from "@/src/lib/toast" -import { RsshubFormScreen } from "@/src/screens/(modal)/rsshub-form" +import { RsshubFormScreen } from "@/src/screens/(modal)/RsshubFormScreen" export const RecommendationListItem: FC<{ data: RSSHubRouteDeclaration diff --git a/apps/mobile/src/modules/discover/Recommendations.tsx b/apps/mobile/src/modules/discover/Recommendations.tsx index 1d745ae83..434295c46 100644 --- a/apps/mobile/src/modules/discover/Recommendations.tsx +++ b/apps/mobile/src/modules/discover/Recommendations.tsx @@ -1,34 +1,46 @@ import { RSSHubCategories } from "@follow/constants" import type { RSSHubRouteDeclaration } from "@follow/models/src/rsshub" import { isASCII } from "@follow/utils" +import type { ContentStyle } from "@shopify/flash-list" import { FlashList } from "@shopify/flash-list" import { useQuery } from "@tanstack/react-query" -import { useAtomValue } from "jotai" import type { FC } from "react" -import { memo, useCallback, useContext, useEffect, useMemo, useRef, useState } from "react" +import { memo, useCallback, useEffect, useMemo, useRef, useState } from "react" import { useTranslation } from "react-i18next" import type { ScrollView } from "react-native" -import { Animated, Text, TouchableOpacity, useWindowDimensions, View } from "react-native" +import { + Animated, + Text, + TouchableOpacity, + useAnimatedValue, + useWindowDimensions, + View, +} from "react-native" import type { PanGestureHandlerGestureEvent } from "react-native-gesture-handler" import { PanGestureHandler } from "react-native-gesture-handler" +import type { SharedValue } from "react-native-reanimated" +import { useSharedValue } from "react-native-reanimated" +import { useSafeAreaInsets } from "react-native-safe-area-context" import { AnimatedScrollView } from "@/src/components/common/AnimatedComponents" -import { - useBottomTabBarHeight, - useRegisterNavigationScrollView, -} from "@/src/components/layouts/tabbar/hooks" +import { BlurEffect } from "@/src/components/common/BlurEffect" +import { UINavigationHeaderActionButton } from "@/src/components/layouts/header/NavigationHeader" +import { useRegisterNavigationScrollView } from "@/src/components/layouts/tabbar/hooks" import { PlatformActivityIndicator } from "@/src/components/ui/loading/PlatformActivityIndicator" +import { TabBar } from "@/src/components/ui/tabview/TabBar" import type { TabComponent } from "@/src/components/ui/tabview/TabView" -import { apiClient } from "@/src/lib/api-fetch" +import { MingcuteLeftLineIcon } from "@/src/icons/mingcute_left_line" +import { useNavigation } from "@/src/lib/navigation/hooks" +import { useColor } from "@/src/theme/colors" -import { DiscoverContext } from "./DiscoverContext" +import { fetchRsshubPopular } from "./api" import { RecommendationListItem } from "./RecommendationListItem" export const Recommendations = () => { const { t } = useTranslation("common") - const { animatedX, currentTabAtom } = useContext(DiscoverContext) - const currentTab = useAtomValue(currentTabAtom) + const animatedX = useAnimatedValue(0) + const [currentTab, setCurrentTab] = useState(0) const windowWidth = useWindowDimensions().width const ref = useRef(null) @@ -44,63 +56,71 @@ export const Recommendations = () => { }) }, [currentTab]) + const insets = useSafeAreaInsets() + const navigation = useNavigation() + const label = useColor("label") return ( - - {RSSHubCategories.map((category, index) => ( - - {loadedTabIndex.has(index) && ( - - )} - - ))} - + + + + + { + navigation.back() + }} + className="-mb-2 ml-4" + > + + + ({ + name: t(`discover.category.${category}`), + value: category, + }))} + currentTab={currentTab} + onTabItemPress={(tab) => { + setCurrentTab(tab) + }} + /> + + + {RSSHubCategories.map((category, index) => ( + + {loadedTabIndex.has(index) && ( + + )} + + ))} + + ) } -const _languageOptions = [ - { - label: "All", - value: "all", - }, - { - label: "English", - value: "en", - }, - { - label: "中文", - value: "zh-CN", - }, -] as const - -type Language = (typeof _languageOptions)[number]["value"] -type DiscoverCategories = (typeof RSSHubCategories)[number] | string - -const fetchRsshubPopular = (category: DiscoverCategories, lang: Language) => { - return apiClient.discover.rsshub.$get({ - query: { - category: "popular", - categories: category === "all" ? "popular" : `popular,${category}`, - lang: lang === "all" ? undefined : lang, - }, - }) -} - -const Tab: TabComponent = ({ tab, isSelected, ...rest }) => { - const tabHeight = useBottomTabBarHeight() +export const RecommendationTab: TabComponent<{ + contentContainerStyle?: ContentStyle + reanimatedScrollY?: SharedValue +}> = ({ tab, isSelected, contentContainerStyle, reanimatedScrollY, ...rest }) => { const { data, isLoading } = useQuery({ queryKey: ["rsshub-popular", "cache", tab.value], queryFn: () => fetchRsshubPopular(tab.value, "all").then((res) => res.data), @@ -175,19 +195,16 @@ const Tab: TabComponent = ({ tab, isSelected, ...rest }) => { FlashList<{ key: string; data: RSSHubRouteDeclaration } | string> >(isSelected) - const getItemType = useCallback((item: string | { key: string }) => { + const getItemType = useRef((item: string | { key: string }) => { return typeof item === "string" ? "sectionHeader" : "row" - }, []) + }).current - const keyExtractor = useCallback((item: string | { key: string }) => { + const keyExtractor = useRef((item: string | { key: string }) => { return typeof item === "string" ? item : item.key - }, []) - - const { headerHeightAtom } = useContext(DiscoverContext) - const headerHeight = useAtomValue(headerHeightAtom) + }).current const scrollOffsetRef = useRef(0) - const { animatedY } = useContext(DiscoverContext) + const animatedY = useSharedValue(0) useEffect(() => { if (isSelected) { @@ -195,6 +212,8 @@ const Tab: TabComponent = ({ tab, isSelected, ...rest }) => { } }, [animatedY, isSelected]) + const insets = useSafeAreaInsets() + if (isLoading) { return } @@ -205,6 +224,9 @@ const Tab: TabComponent = ({ tab, isSelected, ...rest }) => { onScroll={(e) => { scrollOffsetRef.current = e.nativeEvent.contentOffset.y animatedY.value = scrollOffsetRef.current + if (reanimatedScrollY) { + reanimatedScrollY.value = scrollOffsetRef.current + } }} scrollEventThrottle={16} estimatedItemSize={150} @@ -213,13 +235,15 @@ const Tab: TabComponent = ({ tab, isSelected, ...rest }) => { keyExtractor={keyExtractor} getItemType={getItemType} renderItem={ItemRenderer} + automaticallyAdjustContentInsets={false} + contentInsetAdjustmentBehavior="never" automaticallyAdjustsScrollIndicatorInsets={false} + contentContainerStyle={contentContainerStyle} scrollIndicatorInsets={{ right: -2, - top: headerHeight, - bottom: tabHeight, + top: 0, + bottom: insets.bottom, }} - contentContainerStyle={{ paddingBottom: tabHeight, paddingTop: headerHeight }} removeClippedSubviews /> {/* Right Sidebar */} @@ -304,15 +328,8 @@ const NavigationSidebar: FC<{ [scrollToLetter, titles], ) - const { headerHeightAtom } = useContext(DiscoverContext) - const headerHeight = useAtomValue(headerHeightAtom) - const tabHeight = useBottomTabBarHeight() - return ( - + {titles.map((title) => ( diff --git a/apps/mobile/src/modules/discover/api.ts b/apps/mobile/src/modules/discover/api.ts new file mode 100644 index 000000000..5deeabe55 --- /dev/null +++ b/apps/mobile/src/modules/discover/api.ts @@ -0,0 +1,13 @@ +import { apiClient } from "@/src/lib/api-fetch" + +import type { DiscoverCategories, Language } from "./constants" + +export const fetchRsshubPopular = (category: DiscoverCategories, lang: Language) => { + return apiClient.discover.rsshub.$get({ + query: { + category: "popular", + categories: category === "all" ? "popular" : `popular,${category}`, + lang: lang === "all" ? undefined : lang, + }, + }) +} diff --git a/apps/mobile/src/modules/discover/constants.ts b/apps/mobile/src/modules/discover/constants.ts index 39dcfb891..606abec2f 100644 --- a/apps/mobile/src/modules/discover/constants.ts +++ b/apps/mobile/src/modules/discover/constants.ts @@ -1,3 +1,5 @@ +import type { RSSHubCategories } from "@follow/constants" + export enum SearchType { Feed = "feed", List = "list", @@ -9,3 +11,21 @@ export const SearchTabs = [ { name: "List", value: SearchType.List }, // { name: "User", value: SearchType.User }, ] + +const _languageOptions = [ + { + label: "All", + value: "all", + }, + { + label: "English", + value: "en", + }, + { + label: "中文", + value: "zh-CN", + }, +] as const + +export type Language = (typeof _languageOptions)[number]["value"] +export type DiscoverCategories = (typeof RSSHubCategories)[number] | string diff --git a/apps/mobile/src/modules/discover/search-tabs/SearchFeed.tsx b/apps/mobile/src/modules/discover/search-tabs/SearchFeed.tsx index b02dd061f..fe1ebc2f3 100644 --- a/apps/mobile/src/modules/discover/search-tabs/SearchFeed.tsx +++ b/apps/mobile/src/modules/discover/search-tabs/SearchFeed.tsx @@ -13,7 +13,7 @@ import { ItemPressableStyle } from "@/src/components/ui/pressable/enum" import { ItemPressable } from "@/src/components/ui/pressable/ItemPressable" import { apiClient } from "@/src/lib/api-fetch" import { useNavigation } from "@/src/lib/navigation/hooks" -import { FollowScreen } from "@/src/screens/(modal)/follow" +import { FollowScreen } from "@/src/screens/(modal)/FollowScreen" import { useSubscriptionByFeedId } from "@/src/store/subscription/hooks" import { useSearchPageContext } from "../ctx" diff --git a/apps/mobile/src/modules/discover/search-tabs/SearchList.tsx b/apps/mobile/src/modules/discover/search-tabs/SearchList.tsx index 029165fb6..1abd68e35 100644 --- a/apps/mobile/src/modules/discover/search-tabs/SearchList.tsx +++ b/apps/mobile/src/modules/discover/search-tabs/SearchList.tsx @@ -9,7 +9,7 @@ import { ItemPressableStyle } from "@/src/components/ui/pressable/enum" import { ItemPressable } from "@/src/components/ui/pressable/ItemPressable" import { apiClient } from "@/src/lib/api-fetch" import { useNavigation } from "@/src/lib/navigation/hooks" -import { FollowScreen } from "@/src/screens/(modal)/follow" +import { FollowScreen } from "@/src/screens/(modal)/FollowScreen" import { useSubscriptionByListId } from "@/src/store/subscription/hooks" import { useSearchPageContext } from "../ctx" diff --git a/apps/mobile/src/modules/discover/search-tabs/__base.tsx b/apps/mobile/src/modules/discover/search-tabs/__base.tsx index 73ff8d4f5..2dcbbc098 100644 --- a/apps/mobile/src/modules/discover/search-tabs/__base.tsx +++ b/apps/mobile/src/modules/discover/search-tabs/__base.tsx @@ -74,7 +74,10 @@ export function BaseSearchPageFlatList({ } const itemSeparator = ( - + ) export const ItemSeparator = () => itemSeparator diff --git a/apps/mobile/src/modules/discover/search.tsx b/apps/mobile/src/modules/discover/search.tsx index e1f9de14f..5147df13f 100644 --- a/apps/mobile/src/modules/discover/search.tsx +++ b/apps/mobile/src/modules/discover/search.tsx @@ -1,4 +1,3 @@ -import { RSSHubCategories } from "@follow/constants" import { useAtom, useAtomValue, useSetAtom } from "jotai" import type { FC } from "react" import { useContext, useEffect, useRef, useState } from "react" @@ -15,10 +14,10 @@ import { useSafeAreaFrame, useSafeAreaInsets } from "react-native-safe-area-cont import { BlurEffect } from "@/src/components/common/BlurEffect" import { getDefaultHeaderHeight } from "@/src/components/layouts/utils" -import { TabBar } from "@/src/components/ui/tabview/TabBar" import { Search2CuteReIcon } from "@/src/icons/search_2_cute_re" import { useScreenIsInSheetModal } from "@/src/lib/navigation/hooks" import { Navigation } from "@/src/lib/navigation/Navigation" +import { ScreenItemContext } from "@/src/lib/navigation/ScreenItemContext" import SearchScreen from "@/src/screens/(headless)/search" import { accentColor, useColor } from "@/src/theme/colors" @@ -54,9 +53,9 @@ export const SearchHeader: FC<{ } const DynamicBlurEffect = () => { - const { animatedY } = useContext(DiscoverContext) + const { reAnimatedScrollY } = useContext(ScreenItemContext) const blurStyle = useAnimatedStyle(() => ({ - opacity: Math.max(0, Math.min(1, animatedY.value / 50)), + opacity: Math.max(0, Math.min(1, reAnimatedScrollY.value / 50)), })) return ( @@ -64,17 +63,14 @@ const DynamicBlurEffect = () => { ) } + export const DiscoverHeader = () => { - return -} -const DiscoverHeaderImpl = () => { - const { t } = useTranslation("common") const frame = useSafeAreaFrame() const insets = useSafeAreaInsets() const sheetModal = useScreenIsInSheetModal() const headerHeight = getDefaultHeaderHeight(frame, sheetModal, insets.top) - const { animatedX, currentTabAtom, headerHeightAtom } = useContext(DiscoverContext) - const setCurrentTab = useSetAtom(currentTabAtom) + const { headerHeightAtom } = useContext(DiscoverContext) + const setHeaderHeight = useSetAtom(headerHeightAtom) return ( @@ -87,26 +83,10 @@ const DiscoverHeaderImpl = () => { > - + - - {/* Right actions group */} - - - + - - ({ - name: t(`discover.category.${category}`), - value: category, - }))} - tabScrollContainerAnimatedX={animatedX} - onTabItemPress={(index) => { - setCurrentTab(index) - }} - tabbarClassName="border-b border-b-quaternary-system-fill" - /> ) } @@ -279,10 +259,6 @@ const styles = StyleSheet.create({ position: "relative", }, - discoverHeader: { - marginRight: 0, - }, - searchbar: { flex: 1, display: "flex", diff --git a/apps/mobile/src/modules/entry-content/EntryAISummary.tsx b/apps/mobile/src/modules/entry-content/EntryAISummary.tsx index d6cdf6707..8e30eb9b0 100644 --- a/apps/mobile/src/modules/entry-content/EntryAISummary.tsx +++ b/apps/mobile/src/modules/entry-content/EntryAISummary.tsx @@ -13,10 +13,13 @@ export const EntryAISummary: FC<{ entryId: string }> = ({ entryId }) => { const ctx = useEntryContentContext() + const showReadability = useAtomValue(ctx.showReadabilityAtom) const showAISummaryOnce = useAtomValue(ctx.showAISummaryAtom) const showAISummary = useGeneralSettingKey("summary") || showAISummaryOnce const summary = useSummary(entryId) - usePrefetchSummary(entryId, { enabled: showAISummary }) + usePrefetchSummary(entryId, showReadability ? "readabilityContent" : "content", { + enabled: showAISummary, + }) const status = useSummaryStore((state) => state.generatingStatus[entryId]) if (!showAISummary) return null @@ -24,7 +27,11 @@ export const EntryAISummary: FC<{ return ( diff --git a/apps/mobile/src/modules/entry-content/EntryContentHeaderRightActions.tsx b/apps/mobile/src/modules/entry-content/EntryContentHeaderRightActions.tsx index e4f52ca91..4b2a317ea 100644 --- a/apps/mobile/src/modules/entry-content/EntryContentHeaderRightActions.tsx +++ b/apps/mobile/src/modules/entry-content/EntryContentHeaderRightActions.tsx @@ -11,10 +11,10 @@ import type { MenuItemIconProps } from "zeego/lib/typescript/menu" import { getGeneralSettings, useGeneralSettingKey } from "@/src/atoms/settings/general" import { ActionBarItem } from "@/src/components/ui/action-bar/ActionBarItem" import { DropdownMenu } from "@/src/components/ui/context-menu" +import { AiCuteReIcon } from "@/src/icons/ai_cute_re" import { DocmentCuteReIcon } from "@/src/icons/docment_cute_re" -import { Magic2CuteReIcon } from "@/src/icons/magic_2_cute_re" import { More1CuteReIcon } from "@/src/icons/more_1_cute_re" -import { Share3CuteReIcon } from "@/src/icons/share_3_cute_re" +import { ShareForwardCuteReIcon } from "@/src/icons/share_forward_cute_re" import { StarCuteFiIcon } from "@/src/icons/star_cute_fi" import { StarCuteReIcon } from "@/src/icons/star_cute_re" import { Translate2CuteReIcon } from "@/src/icons/translate_2_cute_re" @@ -111,7 +111,10 @@ const HeaderRightActionsImpl = ({ if (hasSummary) return const hideGlowEffect = showIntelligenceGlowEffect() - await summarySyncService.generateSummary(entryId) + await summarySyncService.generateSummary( + entryId, + showReadability ? "readabilityContent" : "content", + ) hideGlowEffect() } @@ -127,6 +130,7 @@ const HeaderRightActionsImpl = ({ entryId, language: getGeneralSettings().actionLanguage as SupportedLanguages, withContent: true, + target: showReadability ? "readabilityContent" : "content", }) setShowTranslation((prev) => !prev) } @@ -173,12 +177,12 @@ const HeaderRightActionsImpl = ({ onPress: toggleReadability, active: showReadability, isCheckbox: true, - inMenu: true, + // inMenu: true, }, !showAISummarySetting && { key: "GenerateSummary", title: "Generate Summary", - icon: , + icon: , iconIOS: { name: "sparkles" }, onPress: toggleAISummary, active: showAISummary, @@ -198,7 +202,7 @@ const HeaderRightActionsImpl = ({ { key: "Share", title: t("operation.share"), - icon: , + icon: , iconIOS: { name: "square.and.arrow.up" }, onPress: handleShare, }, diff --git a/apps/mobile/src/modules/entry-content/EntryGridFooter.tsx b/apps/mobile/src/modules/entry-content/EntryGridFooter.tsx index f70d9857c..c312a1823 100644 --- a/apps/mobile/src/modules/entry-content/EntryGridFooter.tsx +++ b/apps/mobile/src/modules/entry-content/EntryGridFooter.tsx @@ -1,12 +1,9 @@ import { FeedViewType } from "@follow/constants" import { cn } from "@follow/utils" -import { useEffect } from "react" import { Text, View } from "react-native" -import ReAnimated, { useAnimatedStyle, useSharedValue, withSpring } from "react-native-reanimated" import { RelativeDateTime } from "@/src/components/ui/datetime/RelativeDateTime" import { FeedIcon } from "@/src/components/ui/icon/feed-icon" -import { gentleSpringPreset } from "@/src/constants/spring" import { useEntry } from "@/src/store/entry/hooks" import { useFeed } from "@/src/store/feed/hooks" import { useEntryTranslation } from "@/src/store/translation/hooks" @@ -27,34 +24,12 @@ export const EntryGridFooter = ({ const translation = useEntryTranslation(entryId) const feed = useFeed(entry?.feedId || "") - const unreadZoomSharedValue = useSharedValue(entry?.read ? 0 : 1) - - useEffect(() => { - if (!entry) return - - if (entry.read) { - unreadZoomSharedValue.value = withSpring(0, gentleSpringPreset) - } else { - unreadZoomSharedValue.value = withSpring(1, gentleSpringPreset) - } - }, [entry, entry?.read, unreadZoomSharedValue]) - - const unreadIndicatorStyle = useAnimatedStyle(() => { - return { - width: unreadZoomSharedValue.value * 8, - height: unreadZoomSharedValue.value * 8, - } - }) - if (!entry) return null return ( - + {!entry.read && } {entry.title && ( = ({ entryId }) => { + const opacityAnimatedValue = useSharedValue(0) + + const headerHeight = useHeaderHeight() + + const title = useEntry(entryId, (entry) => { + return entry.title + }) + + const [isHeaderTitleVisible, setIsHeaderTitleVisible] = useState(true) + + const reanimatedScrollY = useContext(ScreenItemContext).reAnimatedScrollY + + const ctxValue = useContext(EntryContentContext) + const titleHeight = useAtomValue(ctxValue.titleHeightAtom) + useAnimatedReaction( + () => reanimatedScrollY.value, + (value) => { + if (value > titleHeight + headerHeight) { + opacityAnimatedValue.value = withTiming(1, { duration: 100 }) + runOnJS(setIsHeaderTitleVisible)(true) + } else { + opacityAnimatedValue.value = withTiming(0, { duration: 100 }) + runOnJS(setIsHeaderTitleVisible)(false) + } + }, + ) + const headerBarWidth = useWindowDimensions().width + + return ( + ( + + ), + [entryId], + )} + headerRight={ + + + + } + headerTitle={ + + + {title} + + + } + /> + ) +} +interface EntryLeftGroupProps { + canGoBack: boolean + entryId: string + titleOpacityShareValue: SharedValue +} + +const EntryLeftGroup = ({ canGoBack, entryId, titleOpacityShareValue }: EntryLeftGroupProps) => { + const hideRecentReader = useUISettingKey("hideRecentReader") + const animatedOpacity = useAnimatedStyle(() => { + return { + opacity: interpolate(titleOpacityShareValue.value, [0, 1], [1, 0]), + } + }) + return ( + + + + {!hideRecentReader && ( + + + + )} + + ) +} diff --git a/apps/mobile/src/modules/entry-content/EntryReadHistory.tsx b/apps/mobile/src/modules/entry-content/EntryReadHistory.tsx index d6f99e542..59273d66f 100644 --- a/apps/mobile/src/modules/entry-content/EntryReadHistory.tsx +++ b/apps/mobile/src/modules/entry-content/EntryReadHistory.tsx @@ -4,7 +4,7 @@ import { Pressable, View } from "react-native" import { UserAvatar } from "@/src/components/ui/avatar/UserAvatar" import { apiClient } from "@/src/lib/api-fetch" import { useNavigation } from "@/src/lib/navigation/hooks" -import { ProfileScreen } from "@/src/screens/(modal)/profile" +import { ProfileScreen } from "@/src/screens/(modal)/ProfileScreen" import { useEntry } from "@/src/store/entry/hooks" import { isInboxEntry } from "@/src/store/entry/utils" import { userActions } from "@/src/store/user/store" diff --git a/apps/mobile/src/modules/entry-content/EntryTitle.tsx b/apps/mobile/src/modules/entry-content/EntryTitle.tsx index 4b32faac4..2875c36b0 100644 --- a/apps/mobile/src/modules/entry-content/EntryTitle.tsx +++ b/apps/mobile/src/modules/entry-content/EntryTitle.tsx @@ -1,118 +1,38 @@ -import { useTypeScriptHappyCallback } from "@follow/hooks" -import { useCallback, useContext, useState } from "react" -import { Text, useWindowDimensions, View } from "react-native" -import type { SharedValue } from "react-native-reanimated" -import Animated, { - interpolate, - runOnJS, - useAnimatedReaction, - useAnimatedStyle, - useSharedValue, - withTiming, -} from "react-native-reanimated" +import { useSetAtom } from "jotai" +import { useContext } from "react" +import { Text, View } from "react-native" -import { useUISettingKey } from "@/src/atoms/settings/ui" -import { DefaultHeaderBackButton } from "@/src/components/layouts/header/NavigationHeader" -import { NavigationBlurEffectHeader } from "@/src/components/layouts/views/SafeNavigationScrollView" import { UserAvatar } from "@/src/components/ui/avatar/UserAvatar" import { FeedIcon } from "@/src/components/ui/icon/feed-icon" -import { ScreenItemContext } from "@/src/lib/navigation/ScreenItemContext" -import { EntryContentContext, useEntryContentContext } from "@/src/modules/entry-content/ctx" -import { EntryContentHeaderRightActions } from "@/src/modules/entry-content/EntryContentHeaderRightActions" +import { EntryContentContext } from "@/src/modules/entry-content/ctx" import { useEntry } from "@/src/store/entry/hooks" import { useFeed } from "@/src/store/feed/hooks" import { useEntryTranslation } from "@/src/store/translation/hooks" import { EntryTranslation } from "../entry-list/templates/EntryTranslation" -import { useHeaderHeight } from "../screen/hooks/useHeaderHeight" -import { EntryReadHistory } from "./EntryReadHistory" export const EntryTitle = ({ title, entryId }: { title: string; entryId: string }) => { const translation = useEntryTranslation(entryId) - const reanimatedScrollY = useContext(ScreenItemContext).reAnimatedScrollY - const [titleHeight, setTitleHeight] = useState(0) - const opacityAnimatedValue = useSharedValue(0) + const { titleHeightAtom } = useContext(EntryContentContext) + const setTitleHeight = useSetAtom(titleHeightAtom) - const headerHeight = useHeaderHeight() - - const [isHeaderTitleVisible, setIsHeaderTitleVisible] = useState(true) - - useAnimatedReaction( - () => reanimatedScrollY.value, - (value) => { - if (value > titleHeight + headerHeight) { - opacityAnimatedValue.value = withTiming(1, { duration: 100 }) - runOnJS(setIsHeaderTitleVisible)(true) - } else { - opacityAnimatedValue.value = withTiming(0, { duration: 100 }) - runOnJS(setIsHeaderTitleVisible)(false) - } - }, - ) - - const ctxValue = useEntryContentContext() - const headerBarWidth = useWindowDimensions().width return ( - <> - ( - - ), - [entryId], - )} - headerRight={ - - - - } - headerTitle={ - - - {title} - - - } + { + setTitleHeight(e.nativeEvent.layout.height) + }} + > + - { - setTitleHeight(titleHeight) - }} - > - - - + ) } export const EntrySocialTitle = ({ entryId }: { entryId: string }) => { - const reanimatedScrollY = useContext(ScreenItemContext).reAnimatedScrollY - - const opacityAnimatedValue = useSharedValue(0) - const entry = useEntry(entryId, (entry) => { return { authorAvatar: entry.authorAvatar, @@ -123,87 +43,16 @@ export const EntrySocialTitle = ({ entryId }: { entryId: string }) => { const feed = useFeed(entry?.feedId as string) - const headerHeight = useHeaderHeight() - - const titleHeight = -60 - const [isHeaderTitleVisible, setIsHeaderTitleVisible] = useState(true) - - useAnimatedReaction( - () => reanimatedScrollY.value, - (value) => { - if (value > titleHeight + headerHeight) { - opacityAnimatedValue.value = withTiming(1, { duration: 100 }) - runOnJS(setIsHeaderTitleVisible)(true) - } else { - opacityAnimatedValue.value = withTiming(0, { duration: 100 }) - runOnJS(setIsHeaderTitleVisible)(false) - } - }, - ) - - const ctxValue = useEntryContentContext() return ( - <> - ( - - - - ), - [ctxValue, entryId, opacityAnimatedValue, isHeaderTitleVisible], - )} - headerTitle={() => ( - - Post - - )} - /> - - {entry?.authorAvatar ? ( - - ) : ( - feed && - )} - - {entry?.author || feed?.title || ""} - - - - ) -} - -interface EntryLeftGroupProps { - canGoBack: boolean - entryId: string - titleOpacityShareValue: SharedValue -} - -const EntryLeftGroup = ({ canGoBack, entryId, titleOpacityShareValue }: EntryLeftGroupProps) => { - const hideRecentReader = useUISettingKey("hideRecentReader") - const animatedOpacity = useAnimatedStyle(() => { - return { - opacity: interpolate(titleOpacityShareValue.value, [0, 1], [1, 0]), - } - }) - return ( - - - - {!hideRecentReader && ( - - - + + {entry?.authorAvatar ? ( + + ) : ( + feed && )} + + {entry?.author || feed?.title || ""} + ) } diff --git a/apps/mobile/src/modules/entry-content/ctx.ts b/apps/mobile/src/modules/entry-content/ctx.ts index 2f92a5663..82e36bda7 100644 --- a/apps/mobile/src/modules/entry-content/ctx.ts +++ b/apps/mobile/src/modules/entry-content/ctx.ts @@ -5,6 +5,7 @@ interface EntryContentContextType { showAISummaryAtom: PrimitiveAtom showAITranslationAtom: PrimitiveAtom showReadabilityAtom: PrimitiveAtom + titleHeightAtom: PrimitiveAtom } export const EntryContentContext = createContext(null!) export const useEntryContentContext = () => { diff --git a/apps/mobile/src/modules/entry-list/EntryListContentArticle.tsx b/apps/mobile/src/modules/entry-list/EntryListContentArticle.tsx index 4ffc3a3ad..a7582912f 100644 --- a/apps/mobile/src/modules/entry-list/EntryListContentArticle.tsx +++ b/apps/mobile/src/modules/entry-list/EntryListContentArticle.tsx @@ -1,7 +1,7 @@ import type { FeedViewType } from "@follow/constants" import type { ListRenderItemInfo } from "@shopify/flash-list" import type { ElementRef } from "react" -import { forwardRef, useCallback, useMemo } from "react" +import { forwardRef, useCallback, useImperativeHandle, useMemo } from "react" import { View } from "react-native" import { usePlayingUrl } from "@/src/lib/player" @@ -10,14 +10,14 @@ import { usePrefetchEntryTranslation } from "@/src/store/translation/hooks" import { useFetchEntriesControls } from "../screen/atoms" import { TimelineSelectorList } from "../screen/TimelineSelectorList" import { EntryListFooter } from "./EntryListFooter" -import { useOnViewableItemsChanged } from "./hooks" +import { useOnViewableItemsChanged, usePagerListPerformanceHack } from "./hooks" import { ItemSeparator } from "./ItemSeparator" import { EntryNormalItem } from "./templates/EntryNormalItem" export const EntryListContentArticle = forwardRef< ElementRef, { entryIds: string[] | null; active?: boolean; view: FeedViewType } ->(({ entryIds, active, view }, ref) => { +>(({ entryIds, active, view }, forwardRef) => { const playingAudioUrl = usePlayingUrl() const { fetchNextPage, isFetching, refetch, isRefetching, hasNextPage } = @@ -35,11 +35,16 @@ export const EntryListContentArticle = forwardRef< [hasNextPage], ) + const { onScroll: hackOnScroll, ref, style: hackStyle } = usePagerListPerformanceHack() + const { onViewableItemsChanged, onScroll, viewableItems } = useOnViewableItemsChanged({ disabled: active === false || isFetching, + onScroll: hackOnScroll, }) - usePrefetchEntryTranslation(active ? viewableItems.map((item) => item.key) : []) + useImperativeHandle(forwardRef, () => ref.current!) + + usePrefetchEntryTranslation({ entryIds: active ? viewableItems.map((item) => item.key) : [] }) return ( id} + keyExtractor={defaultKeyExtractor} estimatedItemSize={100} renderItem={renderItem} onEndReached={fetchNextPage} @@ -56,10 +61,13 @@ export const EntryListContentArticle = forwardRef< onViewableItemsChanged={onViewableItemsChanged} ItemSeparatorComponent={ItemSeparator} ListFooterComponent={ListFooterComponent} + style={hackStyle} /> ) }) +const defaultKeyExtractor = (id: string) => id + export function EntryItemSkeleton() { return ( diff --git a/apps/mobile/src/modules/entry-list/EntryListContentPicture.tsx b/apps/mobile/src/modules/entry-list/EntryListContentPicture.tsx index fc69da2ff..3ef90c133 100644 --- a/apps/mobile/src/modules/entry-list/EntryListContentPicture.tsx +++ b/apps/mobile/src/modules/entry-list/EntryListContentPicture.tsx @@ -1,7 +1,7 @@ import { useTypeScriptHappyCallback } from "@follow/hooks" import type { MasonryFlashListProps } from "@shopify/flash-list" import type { ElementRef } from "react" -import { forwardRef } from "react" +import { forwardRef, useImperativeHandle } from "react" import { View } from "react-native" import { PlatformActivityIndicator } from "@/src/components/ui/loading/PlatformActivityIndicator" @@ -10,7 +10,7 @@ import { usePrefetchEntryTranslation } from "@/src/store/translation/hooks" import { TimelineSelectorMasonryList } from "../screen/TimelineSelectorList" import { GridEntryListFooter } from "./EntryListFooter" -import { useOnViewableItemsChanged } from "./hooks" +import { useOnViewableItemsChanged, usePagerListPerformanceHack } from "./hooks" // import type { MasonryItem } from "./templates/EntryGridItem" import { EntryPictureItem } from "./templates/EntryPictureItem" @@ -20,14 +20,17 @@ export const EntryListContentPicture = forwardRef< MasonryFlashListProps, "data" | "renderItem" > ->(({ entryIds, active, ...rest }, ref) => { +>(({ entryIds, active, ...rest }, forwardRef) => { + const { onScroll: hackOnScroll, ref, style: hackStyle } = usePagerListPerformanceHack() + useImperativeHandle(forwardRef, () => ref.current!) const { fetchNextPage, refetch, isRefetching, hasNextPage, isFetching } = useFetchEntriesControls() const { onViewableItemsChanged, onScroll, viewableItems } = useOnViewableItemsChanged({ disabled: active === false || isFetching, + onScroll: hackOnScroll, }) - usePrefetchEntryTranslation(active ? viewableItems.map((item) => item.key) : []) + usePrefetchEntryTranslation({ entryIds: active ? viewableItems.map((item) => item.key) : [] }) return ( , { entryIds: string[] | null; active?: boolean } ->(({ entryIds, active }, ref) => { +>(({ entryIds, active }, forwardRef) => { const { fetchNextPage, isFetching, refetch, isRefetching, hasNextPage } = useFetchEntriesControls() + const { onScroll: hackOnScroll, ref, style: hackStyle } = usePagerListPerformanceHack() + useImperativeHandle(forwardRef, () => ref.current!) + // eslint-disable-next-line @eslint-react/hooks-extra/no-unnecessary-use-callback const renderItem = useCallback( ({ item: id }: ListRenderItemInfo) => , [], @@ -31,9 +34,10 @@ export const EntryListContentSocial = forwardRef< const { onViewableItemsChanged, onScroll, viewableItems } = useOnViewableItemsChanged({ disabled: active === false || isFetching, + onScroll: hackOnScroll, }) - usePrefetchEntryTranslation(active ? viewableItems.map((item) => item.key) : []) + usePrefetchEntryTranslation({ entryIds: active ? viewableItems.map((item) => item.key) : [] }) return ( ) }) diff --git a/apps/mobile/src/modules/entry-list/EntryListContentVideo.tsx b/apps/mobile/src/modules/entry-list/EntryListContentVideo.tsx index 8101c6432..7580c739d 100644 --- a/apps/mobile/src/modules/entry-list/EntryListContentVideo.tsx +++ b/apps/mobile/src/modules/entry-list/EntryListContentVideo.tsx @@ -1,7 +1,7 @@ import { useTypeScriptHappyCallback } from "@follow/hooks" import type { MasonryFlashListProps } from "@shopify/flash-list" import type { ElementRef } from "react" -import { forwardRef, useMemo } from "react" +import { forwardRef, useImperativeHandle, useMemo } from "react" import { View } from "react-native" import { useFetchEntriesControls } from "@/src/modules/screen/atoms" @@ -9,7 +9,7 @@ import { usePrefetchEntryTranslation } from "@/src/store/translation/hooks" import { TimelineSelectorMasonryList } from "../screen/TimelineSelectorList" import { GridEntryListFooter } from "./EntryListFooter" -import { useOnViewableItemsChanged } from "./hooks" +import { useOnViewableItemsChanged, usePagerListPerformanceHack } from "./hooks" import { EntryVideoItem } from "./templates/EntryVideoItem" export const EntryListContentVideo = forwardRef< @@ -18,14 +18,17 @@ export const EntryListContentVideo = forwardRef< MasonryFlashListProps, "data" | "renderItem" > ->(({ entryIds, active, ...rest }, ref) => { +>(({ entryIds, active, ...rest }, forwardRef) => { + const { onScroll: hackOnScroll, ref, style: hackStyle } = usePagerListPerformanceHack() + useImperativeHandle(forwardRef, () => ref.current!) const { fetchNextPage, refetch, isRefetching, isFetching, hasNextPage } = useFetchEntriesControls() const { onViewableItemsChanged, onScroll, viewableItems } = useOnViewableItemsChanged({ disabled: active === false || isFetching, + onScroll: hackOnScroll, }) - usePrefetchEntryTranslation(active ? viewableItems.map((item) => item.key) : []) + usePrefetchEntryTranslation({ entryIds: active ? viewableItems.map((item) => item.key) : [] }) const ListFooterComponent = useMemo( () => @@ -57,6 +60,7 @@ export const EntryListContentVideo = forwardRef< ListFooterComponent={ListFooterComponent} {...rest} onRefresh={refetch} + style={hackStyle} /> ) }) diff --git a/apps/mobile/src/modules/entry-list/EntryListFooter.tsx b/apps/mobile/src/modules/entry-list/EntryListFooter.tsx index aadc8e2e3..dd2bcf660 100644 --- a/apps/mobile/src/modules/entry-list/EntryListFooter.tsx +++ b/apps/mobile/src/modules/entry-list/EntryListFooter.tsx @@ -4,6 +4,7 @@ import { Text, TouchableOpacity } from "react-native" import { CheckCircleCuteReIcon } from "@/src/icons/check_circle_cute_re" import { getFetchEntryPayload } from "@/src/store/entry/getter" import { unreadSyncService } from "@/src/store/unread/store" +import { useColor } from "@/src/theme/colors" import { useSelectedFeed, useSelectedView } from "../screen/atoms" import { ItemSeparator } from "./ItemSeparator" @@ -13,11 +14,12 @@ export const EntryListFooter = () => { const selectedView = useSelectedView() const selectedFeed = useSelectedFeed() + const labelColor = useColor("label") return ( <> { if (typeof selectedView === "number") { const payload = getFetchEntryPayload(selectedFeed, selectedView) @@ -25,8 +27,8 @@ export const EntryListFooter = () => { } }} > - - + + {t("operation.mark_all_as_read_which", { which: t("operation.mark_all_as_read_which_above"), })} diff --git a/apps/mobile/src/modules/entry-list/ItemSeparator.tsx b/apps/mobile/src/modules/entry-list/ItemSeparator.tsx index e4a836087..bf6e6f06c 100644 --- a/apps/mobile/src/modules/entry-list/ItemSeparator.tsx +++ b/apps/mobile/src/modules/entry-list/ItemSeparator.tsx @@ -3,7 +3,7 @@ import { View } from "react-native" const el = ( @@ -16,7 +16,7 @@ export const ItemSeparator = () => { const el2 = ( diff --git a/apps/mobile/src/modules/entry-list/hooks.ts b/apps/mobile/src/modules/entry-list/hooks.ts index 96ce3ed64..a999111e2 100644 --- a/apps/mobile/src/modules/entry-list/hooks.ts +++ b/apps/mobile/src/modules/entry-list/hooks.ts @@ -1,18 +1,33 @@ +import type { FlashList } from "@shopify/flash-list" import type ViewToken from "@shopify/flash-list/dist/viewability/ViewToken" -import { useCallback, useEffect, useInsertionEffect, useMemo, useRef, useState } from "react" -import type { NativeScrollEvent, NativeSyntheticEvent } from "react-native" +import type { RefObject } from "react" +import { + useCallback, + useContext, + useEffect, + useInsertionEffect, + useMemo, + useRef, + useState, +} from "react" +import type { NativeScrollEvent, NativeSyntheticEvent, StyleProp, ViewStyle } from "react-native" +import { useEventCallback } from "usehooks-ts" import { useGeneralSettingKey } from "@/src/atoms/settings/general" import { debouncedFetchEntryContentByStream } from "@/src/store/entry/store" import { unreadSyncService } from "@/src/store/unread/store" +import { PagerListVisibleContext, PagerListWillVisibleContext } from "../screen/PagerListContext" + const defaultIdExtractor = (item: ViewToken) => item.key export function useOnViewableItemsChanged({ disabled, idExtractor = defaultIdExtractor, + onScroll: onScrollProp, }: { disabled?: boolean idExtractor?: (item: ViewToken) => string + onScroll?: (e: NativeSyntheticEvent) => void } = {}) { const orientation = useRef<"down" | "up">("down") const lastOffset = useRef(0) @@ -82,12 +97,16 @@ export function useOnViewableItemsChanged({ stableIdExtractor, ]) - const onScroll = useCallback((e: NativeSyntheticEvent) => { - const currentOffset = e.nativeEvent.contentOffset.y - const currentOrientation = currentOffset > lastOffset.current ? "down" : "up" - orientation.current = currentOrientation - lastOffset.current = currentOffset - }, []) + const onScroll = useCallback( + (e: NativeSyntheticEvent) => { + const currentOffset = e.nativeEvent.contentOffset.y + const currentOrientation = currentOffset > lastOffset.current ? "down" : "up" + orientation.current = currentOrientation + lastOffset.current = currentOffset + onScrollProp?.(e) + }, + [onScrollProp], + ) return useMemo( () => ({ onViewableItemsChanged, onScroll, viewableItems }), @@ -108,3 +127,33 @@ function useNonReactiveCallback any>(fn: T): T { [ref], ) as unknown as T } + +export const usePagerListPerformanceHack = (provideRef?: RefObject>) => { + const lastY = useRef(0) + + const onScroll = useEventCallback((e: NativeSyntheticEvent) => { + if (!visible) return + + lastY.current = e.nativeEvent.contentOffset.y + }) + + const visible = useContext(PagerListVisibleContext) + const willVisible = useContext(PagerListWillVisibleContext) + + const nextVisible = visible || willVisible + + const ref = useRef>(null) + + const usingRef = provideRef ?? ref + const [style, setStyle] = useState>({}) + useEffect(() => { + setStyle({ display: nextVisible ? "flex" : "none" }) + if (nextVisible && lastY.current > 0) { + requestAnimationFrame(() => { + usingRef.current?.scrollToOffset({ offset: lastY.current, animated: false }) + }) + } + }, [nextVisible, usingRef]) + + return { onScroll, ref, style } +} diff --git a/apps/mobile/src/modules/entry-list/index.tsx b/apps/mobile/src/modules/entry-list/index.tsx index c23aa75da..a3cb47ece 100644 --- a/apps/mobile/src/modules/entry-list/index.tsx +++ b/apps/mobile/src/modules/entry-list/index.tsx @@ -2,7 +2,7 @@ import { FeedViewType } from "@follow/constants" import { memo, useMemo } from "react" import { useSelectedFeed, useSelectedView } from "@/src/modules/screen/atoms" -import { PagerList } from "@/src/modules/screen/PageList" +import { PagerList } from "@/src/modules/screen/PagerList" import { TimelineHeader } from "@/src/modules/screen/TimelineSelectorProvider" import { useEntryIdsByCategory, diff --git a/apps/mobile/src/modules/entry-list/templates/EntryNormalItem.tsx b/apps/mobile/src/modules/entry-list/templates/EntryNormalItem.tsx index c43e94e4c..42b434bce 100644 --- a/apps/mobile/src/modules/entry-list/templates/EntryNormalItem.tsx +++ b/apps/mobile/src/modules/entry-list/templates/EntryNormalItem.tsx @@ -1,9 +1,8 @@ import { FeedViewType } from "@follow/constants" import { tracker } from "@follow/tracker" import { cn, formatEstimatedMins, formatTimeToSeconds } from "@follow/utils" -import { memo, useCallback, useEffect, useMemo } from "react" -import { StyleSheet, Text, TouchableOpacity, View } from "react-native" -import ReAnimated, { useAnimatedStyle, useSharedValue, withSpring } from "react-native-reanimated" +import { memo, useCallback, useMemo } from "react" +import { StyleSheet, Text, View } from "react-native" import { useUISettingKey } from "@/src/atoms/settings/ui" import { ThemedBlurView } from "@/src/components/common/ThemedBlurView" @@ -14,13 +13,12 @@ import { Image } from "@/src/components/ui/image/Image" import { PlatformActivityIndicator } from "@/src/components/ui/loading/PlatformActivityIndicator" import { ItemPressableStyle } from "@/src/components/ui/pressable/enum" import { ItemPressable } from "@/src/components/ui/pressable/ItemPressable" -import { gentleSpringPreset } from "@/src/constants/spring" +import { NativePressable } from "@/src/components/ui/pressable/NativePressable" import { PauseCuteFiIcon } from "@/src/icons/pause_cute_fi" import { PlayCuteFiIcon } from "@/src/icons/play_cute_fi" import { useNavigation } from "@/src/lib/navigation/hooks" import { getAttachmentState, player } from "@/src/lib/player" -import { getHorizontalScrolling } from "@/src/modules/screen/atoms" -import { EntryDetailScreen } from "@/src/screens/(stack)/entries/[entryId]" +import { EntryDetailScreen } from "@/src/screens/(stack)/entries/[entryId]/EntryDetailScreen" import { useEntry } from "@/src/store/entry/hooks" import { getInboxFrom } from "@/src/store/entry/utils" import { useFeed } from "@/src/store/feed/hooks" @@ -38,8 +36,7 @@ export const EntryNormalItem = memo( const feed = useFeed(entry?.feedId as string) const navigation = useNavigation() const handlePress = useCallback(() => { - const isHorizontalScrolling = getHorizontalScrolling() - if (entry && !isHorizontalScrolling) { + if (entry) { preloadWebViewEntry(entry) tracker.navigateEntry({ feedId: entry.feedId!, @@ -53,32 +50,10 @@ export const EntryNormalItem = memo( } }, [entryId, entry, navigation, view]) - const unreadZoomSharedValue = useSharedValue(entry?.read ? 0 : 1) - - const unreadIndicatorStyle = useAnimatedStyle(() => { - return { - transform: [ - { - scale: unreadZoomSharedValue.value, - }, - ], - } - }) - - useEffect(() => { - if (!entry) return - - if (entry.read) { - unreadZoomSharedValue.value = withSpring(0, gentleSpringPreset) - } else { - unreadZoomSharedValue.value = withSpring(1, gentleSpringPreset) - } - }, [entry, entry?.read, unreadZoomSharedValue]) - const thumbnailRatio = useUISettingKey("thumbnailRatio") const coverImage = entry?.media?.[0] - const image = coverImage?.url + const image = coverImage?.url || (view === FeedViewType.Audios ? feed?.image : null) const blurhash = coverImage?.blurhash const audio = entry?.attachments?.find((attachment) => @@ -105,14 +80,14 @@ export const EntryNormalItem = memo( )} onPress={handlePress} > - - + {!entry.read && ( + + )} @@ -158,7 +133,7 @@ export const EntryNormalItem = memo( )} {view !== FeedViewType.Notifications && ( - + {image && (thumbnailRatio === "square" ? ( @@ -172,7 +147,7 @@ export const EntryNormalItem = memo( ))} {audio && ( - { if (isLoading) return @@ -198,7 +173,7 @@ export const EntryNormalItem = memo( )} - + )} )} diff --git a/apps/mobile/src/modules/entry-list/templates/EntrySocialItem.tsx b/apps/mobile/src/modules/entry-list/templates/EntrySocialItem.tsx index 1fe48e0d7..06729dae0 100644 --- a/apps/mobile/src/modules/entry-list/templates/EntrySocialItem.tsx +++ b/apps/mobile/src/modules/entry-list/templates/EntrySocialItem.tsx @@ -1,8 +1,7 @@ import { FeedViewType } from "@follow/constants" import { tracker } from "@follow/tracker" -import { memo, useCallback, useEffect, useMemo } from "react" +import { memo, useCallback, useMemo } from "react" import { Pressable, Text, View } from "react-native" -import ReAnimated, { useAnimatedStyle, useSharedValue, withSpring } from "react-native-reanimated" import { useGeneralSettingKey } from "@/src/atoms/settings/general" import { UserAvatar } from "@/src/components/ui/avatar/UserAvatar" @@ -12,11 +11,9 @@ import { Galeria } from "@/src/components/ui/image/galeria" import { Image } from "@/src/components/ui/image/Image" import { ItemPressableStyle } from "@/src/components/ui/pressable/enum" import { ItemPressable } from "@/src/components/ui/pressable/ItemPressable" -import { gentleSpringPreset } from "@/src/constants/spring" import { useNavigation } from "@/src/lib/navigation/hooks" -import { getHorizontalScrolling } from "@/src/modules/screen/atoms" -import { EntryDetailScreen } from "@/src/screens/(stack)/entries/[entryId]" -import { FeedScreen } from "@/src/screens/(stack)/feeds/[feedId]" +import { EntryDetailScreen } from "@/src/screens/(stack)/entries/[entryId]/EntryDetailScreen" +import { FeedScreen } from "@/src/screens/(stack)/feeds/[feedId]/FeedScreen" import { useEntry } from "@/src/store/entry/hooks" import { useFeed } from "@/src/store/feed/hooks" import { useEntryTranslation } from "@/src/store/translation/hooks" @@ -34,46 +31,25 @@ export const EntrySocialItem = memo(({ entryId }: { entryId: string }) => { const navigation = useNavigation() const handlePress = useCallback(() => { - const isHorizontalScrolling = getHorizontalScrolling() - if (!isHorizontalScrolling) { - unreadSyncService.markEntryAsRead(entryId) - tracker.navigateEntry({ - feedId: entry?.feedId!, - entryId, - }) - navigation.pushControllerView(EntryDetailScreen, { - entryId, - view: FeedViewType.SocialMedia, - }) - } + unreadSyncService.markEntryAsRead(entryId) + tracker.navigateEntry({ + feedId: entry?.feedId!, + entryId, + }) + navigation.pushControllerView(EntryDetailScreen, { + entryId, + view: FeedViewType.SocialMedia, + }) }, [entry?.feedId, entryId, navigation]) - const unreadZoomSharedValue = useSharedValue(entry?.read ? 0 : 1) - - const unreadIndicatorStyle = useAnimatedStyle(() => { - return { - transform: [ - { - scale: unreadZoomSharedValue.value, - }, - ], - } - }) - - useEffect(() => { - if (!entry) return - - if (entry.read) { - unreadZoomSharedValue.value = withSpring(0, gentleSpringPreset) - } else { - unreadZoomSharedValue.value = withSpring(1, gentleSpringPreset) - } - }, [entry, entry?.read, unreadZoomSharedValue]) - const autoExpandLongSocialMedia = useGeneralSettingKey("autoExpandLongSocialMedia") const memoedMediaUrlList = useMemo(() => { - return entry?.media?.map((i) => i.url) ?? [] + return (entry?.media + ?.map((i) => + i.type === "video" ? i.preview_image_url : i.type === "photo" ? i.url : undefined, + ) + .filter(Boolean) || []) as string[] }, [entry]) if (!entry) return @@ -87,10 +63,7 @@ export const EntrySocialItem = memo(({ entryId }: { entryId: string }) => { className="flex flex-col gap-2 p-4 pl-6" onPress={handlePress} > - + {!entry.read && } { {media && media.length > 0 && ( - {media.map((image, index) => { + {media.map((mediaItem, index) => { + // TODO: support video + const imageUrl = + mediaItem.type === "video" + ? mediaItem.preview_image_url + : mediaItem.type === "photo" + ? mediaItem.url + : undefined const fullWidth = index === media.length - 1 && media.length % 2 === 1 + if (!imageUrl) return null return ( @@ -143,11 +124,13 @@ export const EntrySocialItem = memo(({ entryId }: { entryId: string }) => { proxy={{ width: fullWidth ? 400 : 200, }} - source={{ uri: image.url }} - blurhash={image.blurhash} + source={{ uri: imageUrl }} + blurhash={mediaItem.blurhash} className="border-secondary-system-background w-full rounded-lg border" aspectRatio={ - fullWidth && image.width && image.height ? image.width / image.height : 1 + fullWidth && mediaItem.width && mediaItem.height + ? mediaItem.width / mediaItem.height + : 1 } /> diff --git a/apps/mobile/src/modules/entry-list/templates/EntryTranslation.tsx b/apps/mobile/src/modules/entry-list/templates/EntryTranslation.tsx index ccff4bb6d..7cc94ca0b 100644 --- a/apps/mobile/src/modules/entry-list/templates/EntryTranslation.tsx +++ b/apps/mobile/src/modules/entry-list/templates/EntryTranslation.tsx @@ -1,4 +1,3 @@ -import { cn } from "@follow/utils" import { useMemo } from "react" import type { TextProps } from "react-native" import { Text, View } from "react-native" @@ -47,19 +46,14 @@ export const EntryTranslation = ({ return ( - {nextTarget && ( - <> - - {nextTarget} - - - ⇋ - - - )} {nextSource} + {nextTarget && ( + + {nextTarget} + + )} ) } diff --git a/apps/mobile/src/modules/entry-list/templates/EntryVideoItem.tsx b/apps/mobile/src/modules/entry-list/templates/EntryVideoItem.tsx index 6a0f3b8e2..ab0998bf1 100644 --- a/apps/mobile/src/modules/entry-list/templates/EntryVideoItem.tsx +++ b/apps/mobile/src/modules/entry-list/templates/EntryVideoItem.tsx @@ -82,8 +82,8 @@ const parseSchemeLink = (url: string) => { } const openVideo = async (url: string) => { - const { openLinksInApp } = getGeneralSettings() - if (!openLinksInApp) { + const { openLinksInExternalApp } = getGeneralSettings() + if (openLinksInExternalApp) { const schemeLink = parseSchemeLink(url) try { const isInstalled = !!schemeLink && (await Linking.canOpenURL(schemeLink)) diff --git a/apps/mobile/src/modules/login/email.tsx b/apps/mobile/src/modules/login/email.tsx index cf369ba9e..cb370ab88 100644 --- a/apps/mobile/src/modules/login/email.tsx +++ b/apps/mobile/src/modules/login/email.tsx @@ -11,9 +11,9 @@ import { signIn } from "@/src/lib/auth" import { useNavigation } from "@/src/lib/navigation/hooks" import { Navigation } from "@/src/lib/navigation/Navigation" import { getTokenHeaders } from "@/src/lib/token" -import { TwoFactorAuthScreen } from "@/src/screens/(modal)/2fa" -import { ForgetPasswordScreen } from "@/src/screens/(modal)/forget-password" -import { SignUpScreen } from "@/src/screens/(modal)/sign-up" +import { ForgetPasswordScreen } from "@/src/screens/(modal)/ForgetPasswordScreen" +import { SignUpScreen } from "@/src/screens/(modal)/SignUpScreen" +import { TwoFactorAuthScreen } from "@/src/screens/(modal)/TwoFactorAuthScreen" import { accentColor } from "@/src/theme/colors" const formSchema = z.object({ diff --git a/apps/mobile/src/modules/onboarding/step-preferences.tsx b/apps/mobile/src/modules/onboarding/step-preferences.tsx index 896d6ecad..eba5537ef 100644 --- a/apps/mobile/src/modules/onboarding/step-preferences.tsx +++ b/apps/mobile/src/modules/onboarding/step-preferences.tsx @@ -11,7 +11,7 @@ import { MingcuteRightLine } from "@/src/icons/mingcute_right_line" import { Settings1CuteReIcon } from "@/src/icons/settings_1_cute_re" import { Translate2CuteReIcon } from "@/src/icons/translate_2_cute_re" import { useNavigation } from "@/src/lib/navigation/hooks" -import { SelectReadingModeScreen } from "@/src/screens/(modal)/onboarding/select-reading-mode" +import { SelectReadingModeScreen } from "@/src/screens/(modal)/onboarding/SelectReadingModeScreen" import { accentColor } from "@/src/theme/colors" import { EditProfileScreen } from "../settings/routes/EditProfile" diff --git a/apps/mobile/src/modules/player/PlayerTabBar.tsx b/apps/mobile/src/modules/player/PlayerTabBar.tsx index fa86623a6..75f6980ab 100644 --- a/apps/mobile/src/modules/player/PlayerTabBar.tsx +++ b/apps/mobile/src/modules/player/PlayerTabBar.tsx @@ -13,7 +13,7 @@ import { Image } from "@/src/components/ui/image/Image" import { BottomTabContext } from "@/src/lib/navigation/bottom-tab/BottomTabContext" import { useNavigation } from "@/src/lib/navigation/hooks" import { useActiveTrack } from "@/src/lib/player" -import { PlayerScreen } from "@/src/screens/player" +import { PlayerScreen } from "@/src/screens/PlayerScreen" import { usePrefetchImageColors } from "@/src/store/image/hooks" import { PlayPauseButton, SeekButton } from "./control" @@ -47,7 +47,10 @@ export function PlayerTabBar({ className }: { className?: string }) { return ( { diff --git a/apps/mobile/src/modules/screen/PagerList.ios.tsx b/apps/mobile/src/modules/screen/PagerList.ios.tsx new file mode 100644 index 000000000..d05550015 --- /dev/null +++ b/apps/mobile/src/modules/screen/PagerList.ios.tsx @@ -0,0 +1,72 @@ +import type { FeedViewType } from "@follow/constants" +import { useTypeScriptHappyCallback } from "@follow/hooks" +import { EventBus } from "@follow/utils/src/event-bus" +import * as Haptics from "expo-haptics" +import { useEffect, useId, useMemo, useRef, useState } from "react" +import type { StyleProp, ViewStyle } from "react-native" + +import { PagerView } from "@/src/components/native/PagerView" +import type { PagerRef } from "@/src/components/native/PagerView/specs" +import { useViewWithSubscription } from "@/src/store/subscription/hooks" + +import { selectTimeline, useSelectedFeed } from "./atoms" +import { PagerListVisibleContext, PagerListWillVisibleContext } from "./PagerListContext" + +export function PagerList({ + renderItem, + style, +}: { + renderItem: (view: FeedViewType, active: boolean) => React.ReactNode + style?: StyleProp | undefined +}) { + const selectedFeed = useSelectedFeed() + const viewId = selectedFeed?.type === "view" ? selectedFeed.viewId : undefined + + const activeViews = useViewWithSubscription() + const activeViewIndex = useMemo( + () => activeViews.findIndex((view) => view.view === viewId), + [activeViews, viewId], + ) + const pagerRef = useRef(null) + const rid = useId() + useEffect(() => { + return EventBus.subscribe("SELECT_TIMELINE", (data) => { + if (data.target !== rid) { + pagerRef.current?.setPage(activeViews.findIndex((view) => view.view === data.view.viewId)) + } + }) + }, [activeViews, pagerRef, rid]) + const [dragging, setDragging] = useState(false) + + return ( + setDragging(true)} + onScrollEnd={() => setDragging(false)} + pageContainerClassName="flex-1" + containerClassName="flex-1 absolute inset-0" + containerStyle={style} + onPageChange={(targetIndex) => { + selectTimeline({ type: "view", viewId: activeViews[targetIndex]!.view }, rid) + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light) + }} + renderPage={useTypeScriptHappyCallback( + (index) => ( + + + {renderItem(activeViews[index]!.view, index === activeViewIndex)} + + + ), + [activeViews, activeViewIndex, dragging, renderItem], + )} + pageTotal={activeViews.length} + /> + ) +} diff --git a/apps/mobile/src/modules/screen/PageList.tsx b/apps/mobile/src/modules/screen/PagerList.tsx similarity index 74% rename from apps/mobile/src/modules/screen/PageList.tsx rename to apps/mobile/src/modules/screen/PagerList.tsx index 40fa71584..f56a49905 100644 --- a/apps/mobile/src/modules/screen/PageList.tsx +++ b/apps/mobile/src/modules/screen/PagerList.tsx @@ -1,7 +1,7 @@ import type { FeedViewType } from "@follow/constants" import { EventBus } from "@follow/utils/src/event-bus" import * as Haptics from "expo-haptics" -import { useCallback, useEffect, useId, useMemo, useRef } from "react" +import { useCallback, useEffect, useId, useMemo, useRef, useState } from "react" import type { StyleProp, ViewStyle } from "react-native" import { Animated, StyleSheet } from "react-native" import PagerView from "react-native-pager-view" @@ -10,7 +10,7 @@ import { useSharedValue } from "react-native-reanimated" import { selectTimeline, useSelectedFeed } from "@/src/modules/screen/atoms" import { useViewWithSubscription } from "@/src/store/subscription/hooks" -import { setHorizontalScrolling } from "./atoms" +import { PagerListVisibleContext, PagerListWillVisibleContext } from "./PagerListContext" const AnimatedPagerView = Animated.createAnimatedComponent(PagerView) @@ -43,6 +43,7 @@ export function PagerList({ }, [activeViews, pagerRef, rid]) const userInitiatedDragRef = useSharedValue(false) + const [dragging, setDragging] = useState(false) const pageScrollHandler = useCallback( (e: { nativeEvent: { @@ -86,11 +87,15 @@ export function PagerList({ overdrag onPageScroll={pageScrollHandler} onPageScrollStateChanged={(e) => { - if (e.nativeEvent.pageScrollState === "dragging") { + const { pageScrollState } = e.nativeEvent + if (pageScrollState === "dragging") { + setDragging(true) userInitiatedDragRef.value = true + } else if (pageScrollState === "idle") { + setDragging(false) } - setHorizontalScrolling(e.nativeEvent.pageScrollState !== "idle") - if (e.nativeEvent.pageScrollState === "settling") { + + if (pageScrollState === "settling") { Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light) } }} @@ -98,8 +103,17 @@ export function PagerList({ orientation="horizontal" > {useMemo( - () => activeViews.map((view, index) => renderItem(view.view, index === activeViewIndex)), - [activeViews, activeViewIndex, renderItem], + () => + activeViews.map((view, index) => ( + + + {renderItem(view.view, index === activeViewIndex)} + + + )), + [activeViews, activeViewIndex, dragging, renderItem], )} ) diff --git a/apps/mobile/src/modules/screen/PagerListContext.ts b/apps/mobile/src/modules/screen/PagerListContext.ts new file mode 100644 index 000000000..e02890910 --- /dev/null +++ b/apps/mobile/src/modules/screen/PagerListContext.ts @@ -0,0 +1,4 @@ +import { createContext } from "react" + +export const PagerListVisibleContext = createContext(true) +export const PagerListWillVisibleContext = createContext(false) diff --git a/apps/mobile/src/modules/screen/TimelineSelectorList.tsx b/apps/mobile/src/modules/screen/TimelineSelectorList.tsx index 166a4321a..7c363eb3f 100644 --- a/apps/mobile/src/modules/screen/TimelineSelectorList.tsx +++ b/apps/mobile/src/modules/screen/TimelineSelectorList.tsx @@ -10,13 +10,11 @@ import * as Haptics from "expo-haptics" import type { ElementRef, RefObject } from "react" import { forwardRef, useCallback, useContext, useImperativeHandle, useRef } from "react" import type { NativeScrollEvent, NativeSyntheticEvent } from "react-native" -import { findNodeHandle, RefreshControl } from "react-native" +import { RefreshControl, View } from "react-native" import { useSafeAreaInsets } from "react-native-safe-area-context" import { useColor } from "react-native-uikit-colors" -import { BottomTabBarBackgroundContext } from "@/src/components/layouts/tabbar/contexts/BottomTabBarBackgroundContext" import { useBottomTabBarHeight } from "@/src/components/layouts/tabbar/hooks" -import { isScrollToEnd } from "@/src/lib/native" import { ScreenItemContext } from "@/src/lib/navigation/ScreenItemContext" import { useHeaderHeight } from "@/src/modules/screen/hooks/useHeaderHeight" import { usePrefetchSubscription } from "@/src/store/subscription/hooks" @@ -39,30 +37,18 @@ export const TimelineSelectorList = forwardRef< const { refetch: subscriptionRefetch } = usePrefetchSubscription() const headerHeight = useHeaderHeight() - const { reAnimatedScrollY, scrollViewHeight, scrollViewContentHeight } = + const { scrollViewHeight, scrollViewContentHeight, reAnimatedScrollY } = useContext(ScreenItemContext)! - const { opacity } = useContext(BottomTabBarBackgroundContext) - const checkScrollToBottom = useCallback(() => { - const handle = findNodeHandle(ref.current!) - if (!handle) { - return - } - isScrollToEnd(handle).then((isEnd) => { - opacity.value = isEnd ? 0 : 1 - }) - }, [opacity]) + + const tabBarHeight = useBottomTabBarHeight() const onScroll = useCallback( (e: NativeSyntheticEvent) => { props.onScroll?.(e) reAnimatedScrollY.value = e.nativeEvent.contentOffset.y - checkScrollToBottom() }, - [props, reAnimatedScrollY, checkScrollToBottom], + [props, reAnimatedScrollY], ) - - const tabBarHeight = useBottomTabBarHeight() - const systemFill = useColor("secondaryLabel") const onLayout = useTypeScriptHappyCallback( @@ -84,42 +70,44 @@ export const TimelineSelectorList = forwardRef< } return ( - { - unreadRefetch() - subscriptionRefetch() - Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light) - onRefresh() - }} - refreshing={isRefetching} - /> - } - scrollIndicatorInsets={{ - top: headerHeight, - bottom: tabBarHeight, - }} - contentContainerStyle={{ - paddingTop: headerHeight, - paddingBottom: tabBarHeight, - }} - {...props} - onScroll={onScroll} - onEndReached={() => { - nextFrame(() => { - props.onEndReached?.() - }) - }} - /> + + { + unreadRefetch() + subscriptionRefetch() + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light) + onRefresh() + }} + refreshing={isRefetching} + /> + } + scrollIndicatorInsets={{ + top: headerHeight, + bottom: tabBarHeight, + }} + contentContainerStyle={{ + paddingTop: headerHeight, + paddingBottom: tabBarHeight, + }} + {...props} + onScroll={onScroll} + onEndReached={() => { + nextFrame(() => { + props.onEndReached?.() + }) + }} + /> + ) }) diff --git a/apps/mobile/src/modules/screen/action.tsx b/apps/mobile/src/modules/screen/action.tsx index 0488e8728..c2aa347b2 100644 --- a/apps/mobile/src/modules/screen/action.tsx +++ b/apps/mobile/src/modules/screen/action.tsx @@ -12,13 +12,13 @@ import { AddCuteReIcon } from "@/src/icons/add_cute_re" import { CheckCircleCuteReIcon } from "@/src/icons/check_circle_cute_re" import { RoundCuteFiIcon } from "@/src/icons/round_cute_fi" import { RoundCuteReIcon } from "@/src/icons/round_cute_re" -import { Share3CuteReIcon } from "@/src/icons/share_3_cute_re" +import { ShareForwardCuteReIcon } from "@/src/icons/share_forward_cute_re" import { Dialog } from "@/src/lib/dialog" import { useNavigation } from "@/src/lib/navigation/hooks" import { proxyEnv } from "@/src/lib/proxy-env" import { toast } from "@/src/lib/toast" -import { LoginScreen } from "@/src/screens/(modal)/login" -import { ProfileScreen } from "@/src/screens/(modal)/profile" +import { LoginScreen } from "@/src/screens/(modal)/LoginScreen" +import { ProfileScreen } from "@/src/screens/(modal)/ProfileScreen" import { getFeed } from "@/src/store/feed/getter" import { useWhoami } from "@/src/store/user/hooks" import { accentColor, useColor } from "@/src/theme/colors" @@ -133,7 +133,7 @@ export const FeedShareActionButton = ({ return ( } + normalIcon={} onPress={() => { const feed = getFeed(feedId) if (!feed) return diff --git a/apps/mobile/src/modules/screen/atoms.ts b/apps/mobile/src/modules/screen/atoms.ts index e1083f5a8..93fed3326 100644 --- a/apps/mobile/src/modules/screen/atoms.ts +++ b/apps/mobile/src/modules/screen/atoms.ts @@ -184,16 +184,3 @@ export const useViewDefinition = (view?: FeedViewType) => { const viewDef = useMemo(() => views.find((v) => v.view === view), [view]) return viewDef } - -// horizontal scrolling state - -const horizontalScrollingAtom = atom(false) - -export const setHorizontalScrolling = (value: boolean) => - jotaiStore.set(horizontalScrollingAtom, value) - -export const getHorizontalScrolling = () => jotaiStore.get(horizontalScrollingAtom) - -export const useHorizontalScrolling = () => { - return useAtomValue(horizontalScrollingAtom) -} diff --git a/apps/mobile/src/modules/screen/usePagerView.ts b/apps/mobile/src/modules/screen/usePagerView.ts deleted file mode 100644 index e3caaa9db..000000000 --- a/apps/mobile/src/modules/screen/usePagerView.ts +++ /dev/null @@ -1,89 +0,0 @@ -/* - * @Author: czy0729 - * @Date: 2023-12-27 15:42:54 - * @Last Modified by: czy0729 - * @Last Modified time: 2024-08-13 16:14:43 - * - * Ported from https://github.com/czy0729/Bangumi/blob/6f2c46bba0bb2c1ffa98fb54d9609d87cb5f06a2/src/components/nested-scroll/hooks/usePagerView.tsx - * License: MIT - */ -import { useCallback, useMemo, useRef, useState } from "react" -import { Animated, Platform, useAnimatedValue } from "react-native" -import type { - default as PagerView, - PagerViewOnPageScrollEventData, - PagerViewOnPageSelectedEvent, - PageScrollStateChangedNativeEvent, -} from "react-native-pager-view" - -export function usePagerView({ - initialPage = 0, - onIndexChange, -}: { - initialPage?: number - onIndexChange?: (index: number) => void -}) { - const pagerRef = useRef(null) - const [activePage, setActivePage] = useState(initialPage) - const [isIdle, setIdle] = useState(true) - - const setPage = useCallback((page: number, animated = true) => { - if (animated) { - pagerRef.current?.setPage(page) - } else { - pagerRef.current?.setPageWithoutAnimation(page) - } - setActivePage(page) - }, []) - - const offset = useAnimatedValue(0) - const position = useAnimatedValue(initialPage) - - const onPageScroll = useMemo( - () => - Animated.event( - [ - { - nativeEvent: { - offset, - position, - }, - }, - ], - { - useNativeDriver: true, - }, - ), - [offset, position], - ) - - const onPageSelected = useCallback( - (e: PagerViewOnPageSelectedEvent) => { - const { position } = e.nativeEvent - setActivePage(position) - if (Platform.OS === "ios") setIdle(true) - - if (typeof onIndexChange === "function") onIndexChange(position) - }, - [onIndexChange], - ) - - const onPageScrollStateChanged = useCallback( - ({ nativeEvent: { pageScrollState } }: PageScrollStateChangedNativeEvent) => { - setIdle(pageScrollState === "idle") - }, - [], - ) - - return { - pagerRef, - setPage, - page: activePage, - isIdle, - position, - offset, - onPageScroll, - onPageSelected, - onPageScrollStateChanged, - } -} diff --git a/apps/mobile/src/modules/settings/SettingsList.tsx b/apps/mobile/src/modules/settings/SettingsList.tsx index f84eed9d0..8e49005e7 100644 --- a/apps/mobile/src/modules/settings/SettingsList.tsx +++ b/apps/mobile/src/modules/settings/SettingsList.tsx @@ -27,7 +27,7 @@ import { UserSettingCuteFiIcon } from "@/src/icons/user_setting_cute_fi" import { signOut } from "@/src/lib/auth" import { useNavigation } from "@/src/lib/navigation/hooks" import type { Navigation } from "@/src/lib/navigation/Navigation" -import { InvitationScreen } from "@/src/screens/(modal)/invitation" +import { InvitationScreen } from "@/src/screens/(modal)/InvitationScreen" import { useRole, useWhoami } from "@/src/store/user/hooks" import { AboutScreen } from "./routes/About" diff --git a/apps/mobile/src/modules/settings/UserHeaderBanner.tsx b/apps/mobile/src/modules/settings/UserHeaderBanner.tsx index 5a948e269..14b528c1e 100644 --- a/apps/mobile/src/modules/settings/UserHeaderBanner.tsx +++ b/apps/mobile/src/modules/settings/UserHeaderBanner.tsx @@ -9,7 +9,7 @@ import { useColor } from "react-native-uikit-colors" import { UserAvatar } from "@/src/components/ui/avatar/UserAvatar" import { useNavigation } from "@/src/lib/navigation/hooks" -import { LoginScreen } from "@/src/screens/(modal)/login" +import { LoginScreen } from "@/src/screens/(modal)/LoginScreen" import { useImageColors, usePrefetchImageColors } from "@/src/store/image/hooks" import { useUser } from "@/src/store/user/hooks" @@ -64,7 +64,7 @@ export const UserHeaderBanner = ({ if (!gradientColors) return {} return { transform: [{ scale: scaleValue }], - height: 250 + (scrollY.value < 0 ? -scrollY.value : 0), + height: 250, } }) @@ -118,8 +118,8 @@ export const UserHeaderBanner = ({ )} , `actions.action_card.${string}`> onEnable?: (index: number) => void onNavigate?: (router: Navigation, index: number) => void - component?: React.FC<{ rule: ActionRule }> + icon: SFSymbol }> = [ { value: "summary", label: "actions.action_card.generate_summary", + icon: "sparkles", }, { value: "translation", label: "actions.action_card.translate_into", + icon: "translate", }, { value: "readability", label: "actions.action_card.enable_readability", + icon: "text.document", }, { value: "sourceContent", label: "actions.action_card.source_content", + icon: "macwindow", }, { value: "newEntryNotification", label: "actions.action_card.new_entry_notification", + icon: "bell.and.waves.left.and.right", }, { value: "silence", label: "actions.action_card.silence", + icon: "speaker.slash", }, { value: "block", label: "actions.action_card.block", + icon: "xmark.circle", }, { value: "rewriteRules", label: "actions.action_card.rewrite_rules", + icon: "pencil.and.outline", onEnable: (index: number) => { actionActions.patchRule(index, { result: { @@ -156,6 +165,7 @@ export const availableActionList: Array<{ { value: "webhooks", label: "actions.action_card.webhooks", + icon: "arrow.up.right.square", onEnable: (index) => { actionActions.patchRule(index, { result: { webhooks: [""] } }) }, diff --git a/apps/mobile/src/modules/settings/hooks/useShareSubscription.tsx b/apps/mobile/src/modules/settings/hooks/useShareSubscription.tsx index 9ebf43764..acd7c69a3 100644 --- a/apps/mobile/src/modules/settings/hooks/useShareSubscription.tsx +++ b/apps/mobile/src/modules/settings/hooks/useShareSubscription.tsx @@ -1,10 +1,15 @@ -import { useQuery } from "@tanstack/react-query" +import type { UseQueryResult } from "@tanstack/react-query" +import { useQuery, useQueryClient } from "@tanstack/react-query" +import { useCallback, useMemo } from "react" import { apiClient } from "@/src/lib/api-fetch" +// eslint-disable-next-line unused-imports/no-unused-vars +type ExtractQueryData = T extends UseQueryResult ? T : never export const useShareSubscription = ({ userId }: { userId: string }) => { - return useQuery({ - queryKey: ["public", "subscription", userId], + const queryKey = useMemo(() => ["public", "subscription", userId], [userId]) + const query = useQuery({ + queryKey, queryFn: async () => { const subscriptions = await apiClient.subscriptions.$get({ query: { @@ -15,4 +20,22 @@ export const useShareSubscription = ({ userId }: { userId: string }) => { return subscriptions }, }) + const queryClient = useQueryClient() + return { + ...query, + removeItemById: useCallback( + (id: string) => { + type QueryData = ExtractQueryData + queryClient.cancelQueries({ queryKey }) + queryClient.setQueryData(queryKey, (data) => { + if (!data) return + return { + ...data, + data: data?.data.filter((item) => item.feedId !== id), + } + }) + }, + [queryClient, queryKey], + ), + } } diff --git a/apps/mobile/src/modules/settings/hooks/useTOTPModalWrapper.tsx b/apps/mobile/src/modules/settings/hooks/useTOTPModalWrapper.tsx index 037e5b364..963fa0985 100644 --- a/apps/mobile/src/modules/settings/hooks/useTOTPModalWrapper.tsx +++ b/apps/mobile/src/modules/settings/hooks/useTOTPModalWrapper.tsx @@ -4,7 +4,7 @@ import Siblings from "react-native-root-siblings" import { getFetchErrorInfo } from "@/src/lib/error-parser" import { useNavigation } from "@/src/lib/navigation/hooks" import { toast } from "@/src/lib/toast" -import { TwoFactorAuthScreen } from "@/src/screens/(modal)/2fa" +import { TwoFactorAuthScreen } from "@/src/screens/(modal)/TwoFactorAuthScreen" import { useWhoami } from "@/src/store/user/hooks" import { OTPWindow } from "../components/OTPWindow" diff --git a/apps/mobile/src/modules/settings/routes/Actions.tsx b/apps/mobile/src/modules/settings/routes/Actions.tsx index 02702f3c8..d92f2ad6e 100644 --- a/apps/mobile/src/modules/settings/routes/Actions.tsx +++ b/apps/mobile/src/modules/settings/routes/Actions.tsx @@ -135,7 +135,7 @@ const SaveRuleButton = ({ disabled }: { disabled?: boolean }) => { const ItemSeparatorComponent = () => { return ( diff --git a/apps/mobile/src/modules/settings/routes/EditProfile.tsx b/apps/mobile/src/modules/settings/routes/EditProfile.tsx index 5c74ea157..d18f91f22 100644 --- a/apps/mobile/src/modules/settings/routes/EditProfile.tsx +++ b/apps/mobile/src/modules/settings/routes/EditProfile.tsx @@ -23,7 +23,7 @@ import { CheckCircleCuteReIcon } from "@/src/icons/check_circle_cute_re" import { CloseCircleFillIcon } from "@/src/icons/close_circle_fill" import { useNavigation } from "@/src/lib/navigation/hooks" import { toast } from "@/src/lib/toast" -import { EditEmailScreen } from "@/src/screens/(modal)/edit-email" +import { EditEmailScreen } from "@/src/screens/(modal)/EditEmailScreen" import { useWhoami } from "@/src/store/user/hooks" import type { MeModel } from "@/src/store/user/store" import { userSyncService } from "@/src/store/user/store" diff --git a/apps/mobile/src/modules/settings/routes/EditRule.tsx b/apps/mobile/src/modules/settings/routes/EditRule.tsx index 500c9ed05..41c9309da 100644 --- a/apps/mobile/src/modules/settings/routes/EditRule.tsx +++ b/apps/mobile/src/modules/settings/routes/EditRule.tsx @@ -255,20 +255,22 @@ const ActionSection: React.FC<{ rule: ActionRule }> = ({ rule }) => { }, ]} > - {action.component ? ( - - ) : action.onNavigate ? ( - action.onNavigate?.(navigation, rule.index)} - /> - ) : ( - - )} + + {action.onNavigate ? ( + action.onNavigate?.(navigation, rule.index)} + /> + ) : ( + + )} + ))} {notEnabledActions.length > 0 && ( @@ -288,6 +290,11 @@ const ActionSection: React.FC<{ rule: ActionRule }> = ({ rule }) => { } }} > + {t(action.label)} ))} diff --git a/apps/mobile/src/modules/settings/routes/General.tsx b/apps/mobile/src/modules/settings/routes/General.tsx index e40699709..18620bea0 100644 --- a/apps/mobile/src/modules/settings/routes/General.tsx +++ b/apps/mobile/src/modules/settings/routes/General.tsx @@ -84,7 +84,7 @@ export const GeneralScreen: NavigationControllerView = () => { const expandLongSocialMedia = useGeneralSettingKey("autoExpandLongSocialMedia") const markAsReadWhenScrolling = useGeneralSettingKey("scrollMarkUnread") const markAsReadWhenInView = useGeneralSettingKey("renderMarkUnread") - const openLinksInApp = useGeneralSettingKey("openLinksInApp") + const openLinksInExternalApp = useGeneralSettingKey("openLinksInExternalApp") return ( { - + { - setGeneralSetting("openLinksInApp", value) + setGeneralSetting("openLinksInExternalApp", value) }} /> diff --git a/apps/mobile/src/modules/settings/routes/Lists.tsx b/apps/mobile/src/modules/settings/routes/Lists.tsx index 06de1facd..425ca2e7a 100644 --- a/apps/mobile/src/modules/settings/routes/Lists.tsx +++ b/apps/mobile/src/modules/settings/routes/Lists.tsx @@ -26,7 +26,7 @@ import { UserAdd2CuteFiIcon } from "@/src/icons/user_add_2_cute_fi" import { Wallet2CuteFiIcon } from "@/src/icons/wallet_2_cute_fi" import { useNavigation } from "@/src/lib/navigation/hooks" import type { HonoApiClient } from "@/src/morph/types" -import { ListScreen } from "@/src/screens/(modal)/list" +import { ListScreen } from "@/src/screens/(modal)/ListScreen" import { useOwnedLists, usePrefetchOwnedLists } from "@/src/store/list/hooks" import type { ListModel } from "@/src/store/list/store" import { accentColor } from "@/src/theme/colors" diff --git a/apps/mobile/src/modules/settings/routes/ManageList.tsx b/apps/mobile/src/modules/settings/routes/ManageList.tsx index b53d4b6e9..45540ffe0 100644 --- a/apps/mobile/src/modules/settings/routes/ManageList.tsx +++ b/apps/mobile/src/modules/settings/routes/ManageList.tsx @@ -120,7 +120,7 @@ const ListImpl: React.FC<{ id: string }> = ({ id }) => { const SeparatorComponent = () => { return ( diff --git a/apps/mobile/src/modules/subscription/CategoryGrouped.tsx b/apps/mobile/src/modules/subscription/CategoryGrouped.tsx index 9143625b5..1fad0bbad 100644 --- a/apps/mobile/src/modules/subscription/CategoryGrouped.tsx +++ b/apps/mobile/src/modules/subscription/CategoryGrouped.tsx @@ -1,15 +1,16 @@ import { cn } from "@follow/utils" import { memo, useState } from "react" -import { Text, TouchableOpacity, View } from "react-native" +import { Text, View } from "react-native" import Animated, { useAnimatedStyle, useSharedValue, withSpring } from "react-native-reanimated" import { GROUPED_LIST_MARGIN } from "@/src/components/ui/grouped/constants" import { ItemPressableStyle } from "@/src/components/ui/pressable/enum" import { ItemPressable } from "@/src/components/ui/pressable/ItemPressable" +import { NativePressable } from "@/src/components/ui/pressable/NativePressable" import { RightCuteFiIcon } from "@/src/icons/right_cute_fi" import { useNavigation } from "@/src/lib/navigation/hooks" -import { closeDrawer, getHorizontalScrolling, selectFeed } from "@/src/modules/screen/atoms" -import { FeedScreen } from "@/src/screens/(stack)/feeds/[feedId]" +import { closeDrawer, selectFeed } from "@/src/modules/screen/atoms" +import { FeedScreen } from "@/src/screens/(stack)/feeds/[feedId]/FeedScreen" import { useUnreadCounts } from "@/src/store/unread/hooks" import { useColor } from "@/src/theme/colors" @@ -50,10 +51,6 @@ export const CategoryGrouped = memo( { - const isHorizontalScrolling = getHorizontalScrolling() - if (isHorizontalScrolling) { - return - } selectFeed({ type: "category", categoryName: category, @@ -68,7 +65,7 @@ export const CategoryGrouped = memo( "rounded-b-[10px]": isLast && !expanded, })} > - { rotateSharedValue.value = withSpring(expanded ? 0 : 90, {}) @@ -79,7 +76,7 @@ export const CategoryGrouped = memo( - + {category} diff --git a/apps/mobile/src/modules/subscription/ItemSeparator.tsx b/apps/mobile/src/modules/subscription/ItemSeparator.tsx index fe4027f02..120f47094 100644 --- a/apps/mobile/src/modules/subscription/ItemSeparator.tsx +++ b/apps/mobile/src/modules/subscription/ItemSeparator.tsx @@ -8,7 +8,7 @@ const el = ( style={{ marginHorizontal: GROUPED_LIST_MARGIN }} > @@ -24,7 +24,7 @@ const el2 = ( style={{ marginHorizontal: GROUPED_LIST_MARGIN }} > diff --git a/apps/mobile/src/modules/subscription/SubscriptionLists.tsx b/apps/mobile/src/modules/subscription/SubscriptionLists.tsx index fa97eee97..ef36897a2 100644 --- a/apps/mobile/src/modules/subscription/SubscriptionLists.tsx +++ b/apps/mobile/src/modules/subscription/SubscriptionLists.tsx @@ -19,9 +19,9 @@ import { ItemPressableStyle } from "@/src/components/ui/pressable/enum" import { ItemPressable } from "@/src/components/ui/pressable/ItemPressable" import { StarCuteFiIcon } from "@/src/icons/star_cute_fi" import { useNavigation } from "@/src/lib/navigation/hooks" -import { closeDrawer, getHorizontalScrolling, selectFeed } from "@/src/modules/screen/atoms" +import { closeDrawer, selectFeed } from "@/src/modules/screen/atoms" import { TimelineSelectorList } from "@/src/modules/screen/TimelineSelectorList" -import { FeedScreen } from "@/src/screens/(stack)/feeds/[feedId]" +import { FeedScreen } from "@/src/screens/(stack)/feeds/[feedId]/FeedScreen" import { FEED_COLLECTION_LIST } from "@/src/store/entry/utils" import { useGroupedSubscription, @@ -33,6 +33,7 @@ import { } from "@/src/store/subscription/hooks" import { subscriptionSyncService } from "@/src/store/subscription/store" +import { usePagerListPerformanceHack } from "../entry-list/hooks" import { useFeedListSortMethod, useFeedListSortOrder } from "./atoms" import { CategoryGrouped } from "./CategoryGrouped" import { InboxItem } from "./items/InboxItem" @@ -103,6 +104,8 @@ const SubscriptionListImpl = ({ const scrollViewRef = useRegisterNavigationScrollView>(active) + const { onScroll, style } = usePagerListPerformanceHack(scrollViewRef) + return ( ) } @@ -232,10 +236,6 @@ const StarItem = () => { { - const isHorizontalScrolling = getHorizontalScrolling() - if (isHorizontalScrolling) { - return - } selectFeed({ type: "feed", feedId: FEED_COLLECTION_LIST }) closeDrawer() navigation.pushControllerView(FeedScreen, { diff --git a/apps/mobile/src/modules/subscription/items/InboxItem.tsx b/apps/mobile/src/modules/subscription/items/InboxItem.tsx index e1a4ccd35..424f46c8d 100644 --- a/apps/mobile/src/modules/subscription/items/InboxItem.tsx +++ b/apps/mobile/src/modules/subscription/items/InboxItem.tsx @@ -9,8 +9,8 @@ import { ItemPressableStyle } from "@/src/components/ui/pressable/enum" import { ItemPressable } from "@/src/components/ui/pressable/ItemPressable" import { InboxCuteFiIcon } from "@/src/icons/inbox_cute_fi" import { useNavigation } from "@/src/lib/navigation/hooks" -import { getHorizontalScrolling, selectFeed } from "@/src/modules/screen/atoms" -import { FeedScreen } from "@/src/screens/(stack)/feeds/[feedId]" +import { selectFeed } from "@/src/modules/screen/atoms" +import { FeedScreen } from "@/src/screens/(stack)/feeds/[feedId]/FeedScreen" import { useSubscription } from "@/src/store/subscription/hooks" import { getInboxStoreId } from "@/src/store/subscription/utils" import { useUnreadCount } from "@/src/store/unread/hooks" @@ -37,10 +37,6 @@ export const InboxItem = memo(({ id, isFirst, isLast }: SubscriptionItemBaseProp itemStyle={ItemPressableStyle.Grouped} className="h-12 flex-row items-center px-3" onPress={() => { - const isHorizontalScrolling = getHorizontalScrolling() - if (isHorizontalScrolling) { - return - } selectFeed({ type: "inbox", inboxId: id }) navigation.pushControllerView(FeedScreen, { feedId: id, diff --git a/apps/mobile/src/modules/subscription/items/ListSubscriptionItem.tsx b/apps/mobile/src/modules/subscription/items/ListSubscriptionItem.tsx index b174b9e60..d95db5805 100644 --- a/apps/mobile/src/modules/subscription/items/ListSubscriptionItem.tsx +++ b/apps/mobile/src/modules/subscription/items/ListSubscriptionItem.tsx @@ -9,12 +9,12 @@ import { Image } from "@/src/components/ui/image/Image" import { ItemPressableStyle } from "@/src/components/ui/pressable/enum" import { ItemPressable } from "@/src/components/ui/pressable/ItemPressable" import { useNavigation } from "@/src/lib/navigation/hooks" -import { FeedScreen } from "@/src/screens/(stack)/feeds/[feedId]" +import { FeedScreen } from "@/src/screens/(stack)/feeds/[feedId]/FeedScreen" import { useList } from "@/src/store/list/hooks" import { useListUnreadCount } from "@/src/store/unread/hooks" import { SubscriptionListItemContextMenu } from "../../context-menu/lists" -import { getHorizontalScrolling, selectFeed } from "../../screen/atoms" +import { selectFeed } from "../../screen/atoms" import { ItemSeparator } from "../ItemSeparator" import type { SubscriptionItemBaseProps } from "./types" import { UnreadCount } from "./UnreadCount" @@ -41,10 +41,6 @@ export const ListSubscriptionItem = memo(({ id, isFirst, isLast }: ListSubscript itemStyle={ItemPressableStyle.Grouped} className="h-12 flex-row items-center px-3" onPress={() => { - const isHorizontalScrolling = getHorizontalScrolling() - if (isHorizontalScrolling) { - return - } selectFeed({ type: "list", listId: id, diff --git a/apps/mobile/src/modules/subscription/items/SubscriptionItem.tsx b/apps/mobile/src/modules/subscription/items/SubscriptionItem.tsx index 1efc20b9e..d95217986 100644 --- a/apps/mobile/src/modules/subscription/items/SubscriptionItem.tsx +++ b/apps/mobile/src/modules/subscription/items/SubscriptionItem.tsx @@ -11,8 +11,8 @@ import { ItemPressableStyle } from "@/src/components/ui/pressable/enum" import { ItemPressable } from "@/src/components/ui/pressable/ItemPressable" import { WifiOffCuteReIcon } from "@/src/icons/wifi_off_cute_re" import { useNavigation } from "@/src/lib/navigation/hooks" -import { closeDrawer, getHorizontalScrolling, selectFeed } from "@/src/modules/screen/atoms" -import { FeedScreen } from "@/src/screens/(stack)/feeds/[feedId]" +import { closeDrawer, selectFeed } from "@/src/modules/screen/atoms" +import { FeedScreen } from "@/src/screens/(stack)/feeds/[feedId]/FeedScreen" import { useFeed, usePrefetchFeed } from "@/src/store/feed/hooks" import { useSubscription } from "@/src/store/subscription/hooks" import { useUnreadCount } from "@/src/store/unread/hooks" @@ -63,10 +63,6 @@ export const SubscriptionItem = memo( className, )} onPress={() => { - const isHorizontalScrolling = getHorizontalScrolling() - if (isHorizontalScrolling) { - return - } selectFeed({ type: "feed", feedId: id, diff --git a/apps/mobile/src/screens/(modal)/edit-email.tsx b/apps/mobile/src/screens/(modal)/EditEmailScreen.tsx similarity index 100% rename from apps/mobile/src/screens/(modal)/edit-email.tsx rename to apps/mobile/src/screens/(modal)/EditEmailScreen.tsx diff --git a/apps/mobile/src/screens/(modal)/follow.tsx b/apps/mobile/src/screens/(modal)/FollowScreen.tsx similarity index 100% rename from apps/mobile/src/screens/(modal)/follow.tsx rename to apps/mobile/src/screens/(modal)/FollowScreen.tsx diff --git a/apps/mobile/src/screens/(modal)/forget-password.tsx b/apps/mobile/src/screens/(modal)/ForgetPasswordScreen.tsx similarity index 100% rename from apps/mobile/src/screens/(modal)/forget-password.tsx rename to apps/mobile/src/screens/(modal)/ForgetPasswordScreen.tsx diff --git a/apps/mobile/src/screens/(modal)/invitation.tsx b/apps/mobile/src/screens/(modal)/InvitationScreen.tsx similarity index 100% rename from apps/mobile/src/screens/(modal)/invitation.tsx rename to apps/mobile/src/screens/(modal)/InvitationScreen.tsx diff --git a/apps/mobile/src/screens/(modal)/list.tsx b/apps/mobile/src/screens/(modal)/ListScreen.tsx similarity index 100% rename from apps/mobile/src/screens/(modal)/list.tsx rename to apps/mobile/src/screens/(modal)/ListScreen.tsx diff --git a/apps/mobile/src/screens/(modal)/login.tsx b/apps/mobile/src/screens/(modal)/LoginScreen.tsx similarity index 100% rename from apps/mobile/src/screens/(modal)/login.tsx rename to apps/mobile/src/screens/(modal)/LoginScreen.tsx diff --git a/apps/mobile/src/screens/(modal)/profile.tsx b/apps/mobile/src/screens/(modal)/ProfileScreen.tsx similarity index 66% rename from apps/mobile/src/screens/(modal)/profile.tsx rename to apps/mobile/src/screens/(modal)/ProfileScreen.tsx index 48056e0b0..95ba64545 100644 --- a/apps/mobile/src/screens/(modal)/profile.tsx +++ b/apps/mobile/src/screens/(modal)/ProfileScreen.tsx @@ -1,7 +1,8 @@ import type { FeedViewType } from "@follow/constants" -import { Fragment, useCallback, useEffect, useMemo } from "react" +import { useQuery } from "@tanstack/react-query" +import { createContext, Fragment, useCallback, useContext, useEffect, useMemo } from "react" import { useTranslation } from "react-i18next" -import { FlatList, Image, Share, Text, TouchableOpacity, View } from "react-native" +import { Alert, FlatList, Image, Share, Text, TouchableOpacity, View } from "react-native" import Animated, { interpolate, useAnimatedScrollHandler, @@ -12,6 +13,7 @@ import { useSafeAreaFrame, useSafeAreaInsets } from "react-native-safe-area-cont import { ReAnimatedScrollView } from "@/src/components/common/AnimatedComponents" import { BlurEffect } from "@/src/components/common/BlurEffect" +import { SwipeableItem } from "@/src/components/common/SwipeableItem" import { InternalNavigationHeader, UINavigationHeaderActionButton, @@ -30,8 +32,10 @@ import { FallbackIcon } from "@/src/components/ui/icon/fallback-icon" import type { FeedIconRequiredFeed } from "@/src/components/ui/icon/feed-icon" import { FeedIcon } from "@/src/components/ui/icon/feed-icon" import { PlatformActivityIndicator } from "@/src/components/ui/loading/PlatformActivityIndicator" -import { Share3CuteReIcon } from "@/src/icons/share_3_cute_re" +import { ItemPressable } from "@/src/components/ui/pressable/ItemPressable" +import { ShareForwardCuteReIcon } from "@/src/icons/share_forward_cute_re" import type { apiClient } from "@/src/lib/api-fetch" +import { Navigation } from "@/src/lib/navigation/Navigation" import type { NavigationControllerView } from "@/src/lib/navigation/types" import { toast } from "@/src/lib/toast" import { useShareSubscription } from "@/src/modules/settings/hooks/useShareSubscription" @@ -39,9 +43,15 @@ import { UserHeaderBanner } from "@/src/modules/settings/UserHeaderBanner" import { ItemSeparator } from "@/src/modules/subscription/ItemSeparator" import type { FeedModel } from "@/src/store/feed/types" import type { ListModel } from "@/src/store/list/store" +import { getSubscription } from "@/src/store/subscription/getter" +import { subscriptionSyncService } from "@/src/store/subscription/store" import { useUser, useWhoami } from "@/src/store/user/hooks" +import { userSyncService } from "@/src/store/user/store" import { useColor } from "@/src/theme/colors" +import { FeedScreen } from "../(stack)/feeds/[feedId]/FeedScreen" +import { FollowScreen } from "./FollowScreen" + type Subscription = Awaited>["data"][number] export const ProfileScreen: NavigationControllerView<{ @@ -55,6 +65,22 @@ export const ProfileScreen: NavigationControllerView<{ return } +const IsMyProfileContext = createContext(false) + +const ActionContext = createContext<{ + removeItemById: (id: string) => void +}>({ + removeItemById: () => {}, +}) +const usePrefetchUser = (userId: string) => { + const { data } = useQuery({ + queryKey: ["user", userId], + queryFn: () => userSyncService.fetchUser(userId), + enabled: !!userId, + staleTime: 1000 * 60 * 5, + }) + return data +} function ProfileScreenImpl(props: { userId: string }) { const { t } = useTranslation() const scrollY = useSharedValue(0) @@ -62,6 +88,8 @@ function ProfileScreenImpl(props: { userId: string }) { data: subscriptions, isLoading, isError, + + removeItemById, } = useShareSubscription({ userId: props.userId, }) @@ -72,6 +100,7 @@ function ProfileScreenImpl(props: { userId: string }) { headerOpacity.value = scrollY.value / 100 }) + usePrefetchUser(props.userId) const user = useUser(props.userId) useEffect(() => { if (isError) { @@ -93,6 +122,10 @@ function ProfileScreenImpl(props: { userId: string }) { const frame = useSafeAreaFrame() const headerHeight = getDefaultHeaderHeight(frame, false, 0) + const whoami = useWhoami() + const isMyProfile = user?.id === whoami?.id + const actionCtx = useMemo(() => ({ removeItemById }), [removeItemById]) + return ( + - + } /> @@ -120,7 +154,11 @@ function ProfileScreenImpl(props: { userId: string }) { {isLoading && } - {!isLoading && subscriptions && } + + + {!isLoading && subscriptions && } + + - + @@ -247,9 +285,21 @@ const SubscriptionList = ({ subscriptions }: { subscriptions: Subscription[] }) ) } const renderListItems = ({ item }: { item: PickedListModel }) => ( - { + if (getSubscription(item.id)) + Navigation.rootNavigation.pushControllerView(FeedScreen, { + feedId: item.id, + }) + else { + Navigation.rootNavigation.pushControllerView(FollowScreen, { + type: "list", + id: item.id, + }) + } + }} > {!!item.image && ( @@ -258,38 +308,98 @@ const renderListItems = ({ item }: { item: PickedListModel }) => ( {!item.image && } - + {item.title} - + ) const renderFeedItems = ({ item }: { item: PickedFeedModel }) => ( - - - + { + if (getSubscription(item.id)) + Navigation.rootNavigation.pushControllerView(FeedScreen, { + feedId: item.id, + }) + else { + Navigation.rootNavigation.pushControllerView(FollowScreen, { + type: "feed", id: item.id, - title: item.title, - url: item.url, - image: item.image, - type: item.view, - siteUrl: item.siteUrl || "", - } as FeedIconRequiredFeed + }) } - size={24} - /> - - - {item.title} - - + }} + > + + + + + {item.title} + + + ) +const MaybeSwipeable = ({ id, children }: { id: string; children: React.ReactNode }) => { + const isMyProfile = useContext(IsMyProfileContext) + const { t } = useTranslation() + const { removeItemById } = useContext(ActionContext) + if (!isMyProfile) { + return children + } + return ( + { + // unsubscribe + Alert.alert("Unsubscribe?", "This will remove the feed from your subscriptions", [ + { + text: "Cancel", + style: "cancel", + }, + { + text: t("operation.unfollow"), + style: "destructive", + onPress: () => { + subscriptionSyncService.unsubscribe(id) + removeItemById(id) + }, + }, + ]) + }, + backgroundColor: "red", + label: t("operation.unfollow"), + }, + ]} + > + {children} + + ) +} + const SectionHeader = ({ title }: { title: string }) => ( atom(0))[0] const headerHeightAtom = useState(() => atom(0))[0] - const animatedY = useSharedValue(0) - const ctxValue = useMemo( - () => ({ animatedX, currentTabAtom, headerHeightAtom, animatedY }), - [animatedX, currentTabAtom, headerHeightAtom, animatedY], - ) + + const ctxValue = useMemo(() => ({ headerHeightAtom }), [headerHeightAtom]) + return ( - - - - - + + + + } + > + + Good Luck + - + + + + Categories + + + + ) } +const DiscoverGrid = () => { + return ( + + + {RSSHubCategories.map((category) => ( + + ))} + + + ) +} + +const CategoryItem = memo(({ category }: { category: string }) => { + const { t } = useTranslation("common") + const name = t(`discover.category.${category}` as any) + const navigation = useNavigation() + + return ( + { + if (category === "all") { + navigation.pushControllerView(Recommendations) + } else { + navigation.pushControllerView(RecommendationCategoryScreen, { + category, + }) + } + }} + > + + + + {CategoryMap[category as keyof typeof CategoryMap].emoji} + + {name} + + + + ) +}) + +const styles = StyleSheet.create({ + cardItem: { + aspectRatio: 16 / 9, + }, +}) export const DiscoverTabScreen: TabScreenComponent = Discover DiscoverTabScreen.tabBarIcon = ({ focused, color }) => { const Icon = !focused ? Search3CuteReIcon : Search3CuteFiIcon diff --git a/apps/mobile/src/screens/(stack)/(tabs)/index.tsx b/apps/mobile/src/screens/(stack)/(tabs)/index.tsx index f5668dc01..bf13451de 100644 --- a/apps/mobile/src/screens/(stack)/(tabs)/index.tsx +++ b/apps/mobile/src/screens/(stack)/(tabs)/index.tsx @@ -1,3 +1,4 @@ +import { useResetTabOpacityWhenFocused } from "@/src/components/layouts/tabbar/hooks" import { usePrepareEntryRenderWebView } from "@/src/components/native/webview/hooks" import { Home5CuteFiIcon } from "@/src/icons/home_5_cute_fi" import { Home5CuteReIcon } from "@/src/icons/home_5_cute_re" @@ -6,7 +7,7 @@ import { EntryList } from "@/src/modules/entry-list" export const IndexTabScreen: TabScreenComponent = () => { usePrepareEntryRenderWebView() - + useResetTabOpacityWhenFocused() return } diff --git a/apps/mobile/src/screens/(stack)/(tabs)/subscriptions.tsx b/apps/mobile/src/screens/(stack)/(tabs)/subscriptions.tsx index 637a8b005..d0f54e580 100644 --- a/apps/mobile/src/screens/(stack)/(tabs)/subscriptions.tsx +++ b/apps/mobile/src/screens/(stack)/(tabs)/subscriptions.tsx @@ -6,11 +6,12 @@ import { useColor } from "react-native-uikit-colors" import { ErrorBoundary } from "@/src/components/common/ErrorBoundary" import { NoLoginInfo } from "@/src/components/common/NoLoginInfo" import { ListErrorView } from "@/src/components/errors/ListErrorView" +import { useResetTabOpacityWhenFocused } from "@/src/components/layouts/tabbar/hooks" import { BlackBoard2CuteFiIcon } from "@/src/icons/black_board_2_cute_fi" import { BlackBoard2CuteReIcon } from "@/src/icons/black_board_2_cute_re" import type { TabScreenComponent } from "@/src/lib/navigation/bottom-tab/types" import { EntryListContext } from "@/src/modules/screen/atoms" -import { PagerList } from "@/src/modules/screen/PageList" +import { PagerList } from "@/src/modules/screen/PagerList" import { TimelineHeader } from "@/src/modules/screen/TimelineSelectorProvider" import { SubscriptionList } from "@/src/modules/subscription/SubscriptionLists" import { useWhoami } from "@/src/store/user/hooks" @@ -18,7 +19,7 @@ import { useWhoami } from "@/src/store/user/hooks" export default function Subscriptions() { const whoami = useWhoami() const systemGroupedBackground = useColor("systemGroupedBackground") - + useResetTabOpacityWhenFocused() return ( ({ type: "subscriptions" }), [])}> diff --git a/apps/mobile/src/screens/(stack)/entries/[entryId]/index.tsx b/apps/mobile/src/screens/(stack)/entries/[entryId]/EntryDetailScreen.tsx similarity index 83% rename from apps/mobile/src/screens/(stack)/entries/[entryId]/index.tsx rename to apps/mobile/src/screens/(stack)/entries/[entryId]/EntryDetailScreen.tsx index beed0c695..ad84ddea7 100644 --- a/apps/mobile/src/screens/(stack)/entries/[entryId]/index.tsx +++ b/apps/mobile/src/screens/(stack)/entries/[entryId]/EntryDetailScreen.tsx @@ -2,8 +2,7 @@ import { FeedViewType } from "@follow/constants" import { PortalProvider } from "@gorhom/portal" import { atom, useAtomValue } from "jotai" import { useEffect, useMemo } from "react" -import { Pressable, Text, View } from "react-native" -import Animated, { FadeIn, FadeOut } from "react-native-reanimated" +import { Text, View } from "react-native" import { useSafeAreaInsets } from "react-native-safe-area-context" import { useColor } from "react-native-uikit-colors" @@ -13,11 +12,14 @@ import { SafeNavigationScrollView } from "@/src/components/layouts/views/SafeNav import { EntryContentWebView } from "@/src/components/native/webview/EntryContentWebView" import { RelativeDateTime } from "@/src/components/ui/datetime/RelativeDateTime" import { FeedIcon } from "@/src/components/ui/icon/feed-icon" +import { ItemPressableStyle } from "@/src/components/ui/pressable/enum" +import { ItemPressable } from "@/src/components/ui/pressable/ItemPressable" import { CalendarTimeAddCuteReIcon } from "@/src/icons/calendar_time_add_cute_re" import { openLink } from "@/src/lib/native" import type { NavigationControllerView } from "@/src/lib/navigation/types" import { EntryContentContext, useEntryContentContext } from "@/src/modules/entry-content/ctx" import { EntryAISummary } from "@/src/modules/entry-content/EntryAISummary" +import { EntryNavigationHeader } from "@/src/modules/entry-content/EntryNavigationHeader" import { useEntry, usePrefetchEntryDetail } from "@/src/store/entry/hooks" import { entrySyncServices } from "@/src/store/entry/store" import type { EntryWithTranslation } from "@/src/store/entry/types" @@ -32,7 +34,6 @@ export const EntryDetailScreen: NavigationControllerView<{ view: FeedViewType }> = ({ entryId, view: viewType }) => { usePrefetchEntryDetail(entryId) - usePrefetchEntryTranslation([entryId], true) useAutoMarkAsRead(entryId) const entry = useEntry(entryId) const translation = useEntryTranslation(entryId) @@ -50,6 +51,8 @@ export const EntryDetailScreen: NavigationControllerView<{ showAISummaryAtom: atom(entry?.settings?.summary || false), showAITranslationAtom: atom(!!entry?.settings?.translation || false), showReadabilityAtom: atom(entry?.settings?.readability || false), + + titleHeightAtom: atom(0), }), [entry?.settings?.readability, entry?.settings?.summary, entry?.settings?.translation], ) @@ -65,30 +68,24 @@ export const EntryDetailScreen: NavigationControllerView<{ } automaticallyAdjustContentInsets={false} className="bg-system-background" > - entry?.url && openLink(entry.url)} className="relative py-4"> - {({ pressed }) => ( + entry?.url && openLink(entry.url)} + className="relative rounded-xl py-4" + > + {viewType === FeedViewType.SocialMedia ? ( + + ) : ( <> - {pressed && ( - - )} - {viewType === FeedViewType.SocialMedia ? ( - - ) : ( - <> - - - - )} + + )} - + {entryWithTranslation && ( @@ -112,6 +109,11 @@ const EntryContentWebViewWithContext = ({ entry }: { entry: EntryWithTranslation const showReadability = useAtomValue(showReadabilityAtom) const translationSetting = useGeneralSettingKey("translation") const showTranslation = useAtomValue(showAITranslationAtom) + usePrefetchEntryTranslation({ + entryIds: [entry.id], + withContent: true, + target: showReadability ? "readabilityContent" : "content", + }) return ( = ({ category }) => { + const { t } = useTranslation("common") + const { reAnimatedScrollY } = useContext(ScreenItemContext)! + const defaultHeaderHeight = useDefaultHeaderHeight() + const insets = useSafeAreaInsets() + return ( + + + + + + ) +} diff --git a/apps/mobile/src/screens/onboarding.tsx b/apps/mobile/src/screens/OnboardingScreen.tsx similarity index 100% rename from apps/mobile/src/screens/onboarding.tsx rename to apps/mobile/src/screens/OnboardingScreen.tsx diff --git a/apps/mobile/src/screens/player.tsx b/apps/mobile/src/screens/PlayerScreen.tsx similarity index 100% rename from apps/mobile/src/screens/player.tsx rename to apps/mobile/src/screens/PlayerScreen.tsx diff --git a/apps/mobile/src/services/summary.ts b/apps/mobile/src/services/summary.ts index db98e042f..d3d95ddfd 100644 --- a/apps/mobile/src/services/summary.ts +++ b/apps/mobile/src/services/summary.ts @@ -6,6 +6,13 @@ import type { SummarySchema } from "../database/schemas/types" class SummaryServiceStatic { async insertSummary(data: Omit) { + const updateExceptEmpty = Object.fromEntries( + Object.entries({ + summary: data.summary, + readabilitySummary: data.readabilitySummary, + }).filter(([_, value]) => !!value), + ) + await db .insert(summariesTable) .values({ @@ -14,9 +21,7 @@ class SummaryServiceStatic { }) .onConflictDoUpdate({ target: [summariesTable.entryId, summariesTable.language], - set: { - summary: data.summary, - }, + set: updateExceptEmpty, }) } diff --git a/apps/mobile/src/services/translation.ts b/apps/mobile/src/services/translation.ts index 22e1e6d73..7bd1744b9 100644 --- a/apps/mobile/src/services/translation.ts +++ b/apps/mobile/src/services/translation.ts @@ -21,6 +21,7 @@ class TranslationServiceStatic implements Hydratable, Resetable { title: data.title, description: data.description, content: data.content, + readabilityContent: data.readabilityContent, }).filter(([_, value]) => !!value), ) diff --git a/apps/mobile/src/sitemap.tsx b/apps/mobile/src/sitemap.tsx index 108255f17..7a02091f9 100644 --- a/apps/mobile/src/sitemap.tsx +++ b/apps/mobile/src/sitemap.tsx @@ -7,12 +7,12 @@ import { NavigationSitemapRegistry } from "./lib/navigation/sitemap/registry" import type { NavigationControllerView } from "./lib/navigation/types" import { OTPWindow } from "./modules/settings/components/OTPWindow" import { TermsScreen } from "./screens/(headless)/terms" -import { TwoFactorAuthScreen } from "./screens/(modal)/2fa" -import { ForgetPasswordScreen } from "./screens/(modal)/forget-password" -import { InvitationScreen } from "./screens/(modal)/invitation" -import { LoginScreen } from "./screens/(modal)/login" -import { SignUpScreen } from "./screens/(modal)/sign-up" -import { OnboardingScreen } from "./screens/onboarding" +import { ForgetPasswordScreen } from "./screens/(modal)/ForgetPasswordScreen" +import { InvitationScreen } from "./screens/(modal)/InvitationScreen" +import { LoginScreen } from "./screens/(modal)/LoginScreen" +import { SignUpScreen } from "./screens/(modal)/SignUpScreen" +import { TwoFactorAuthScreen } from "./screens/(modal)/TwoFactorAuthScreen" +import { OnboardingScreen } from "./screens/OnboardingScreen" export function registerSitemap() { ;[TermsScreen].forEach((Component) => { diff --git a/apps/mobile/src/store/entry/store.ts b/apps/mobile/src/store/entry/store.ts index 165f7c302..3d06d96f9 100644 --- a/apps/mobile/src/store/entry/store.ts +++ b/apps/mobile/src/store/entry/store.ts @@ -1,5 +1,4 @@ import { FeedViewType } from "@follow/constants" -import { readability } from "@follow/utils" import { debounce } from "es-toolkit/compat" import { fetch as expoFetch } from "expo/fetch" @@ -436,8 +435,19 @@ class EntrySyncServices { const entry = honoMorph.toEntry(res.data) if (!currentEntry && entry) { await entryActions.upsertMany([entry]) - } else if (entry?.content && currentEntry?.content !== entry.content) { - await entryActions.updateEntryContent({ entryId, content: entry.content }) + } else { + if (entry?.content && currentEntry?.content !== entry.content) { + await entryActions.updateEntryContent({ entryId, content: entry.content }) + } + if ( + entry?.readabilityContent && + currentEntry?.readabilityContent !== entry.readabilityContent + ) { + await entryActions.updateEntryContent({ + entryId, + readabilityContent: entry.readabilityContent, + }) + } } return entry } @@ -445,8 +455,12 @@ class EntrySyncServices { async fetchEntryReadabilityContent(entryId: EntryId) { const entry = getEntry(entryId) - if (entry?.url && !entry?.readabilityContent) { - const contentByFetch = await readability(entry.url) + if (entry?.url && entry?.readabilityContent === null) { + const { data: contentByFetch } = await apiClient.entries.readability.$get({ + query: { + id: entryId, + }, + }) if (contentByFetch?.content && entry?.readabilityContent !== contentByFetch.content) { await entryActions.updateEntryContent({ entryId, diff --git a/apps/mobile/src/store/messaging/hooks.ts b/apps/mobile/src/store/messaging/hooks.ts index 4315e8618..6c6f23b47 100644 --- a/apps/mobile/src/store/messaging/hooks.ts +++ b/apps/mobile/src/store/messaging/hooks.ts @@ -8,7 +8,7 @@ import { apiClient } from "@/src/lib/api-fetch" import { kv } from "@/src/lib/kv" import { useNavigation } from "@/src/lib/navigation/hooks" import { requestNotificationPermission } from "@/src/lib/permission" -import { EntryDetailScreen } from "@/src/screens/(stack)/entries/[entryId]" +import { EntryDetailScreen } from "@/src/screens/(stack)/entries/[entryId]/EntryDetailScreen" import { useHasNotificationActions } from "../action/hooks" import { useWhoami } from "../user/hooks" diff --git a/apps/mobile/src/store/summary/hooks.ts b/apps/mobile/src/store/summary/hooks.ts index 8f5ac68d4..4fccbfa62 100644 --- a/apps/mobile/src/store/summary/hooks.ts +++ b/apps/mobile/src/store/summary/hooks.ts @@ -12,11 +12,15 @@ export const useSummaryStatus = (entryId: string) => { return status } -export const usePrefetchSummary = (entryId: string, options?: { enabled?: boolean }) => { +export const usePrefetchSummary = ( + entryId: string, + target: "content" | "readabilityContent", + options?: { enabled?: boolean }, +) => { return useQuery({ - queryKey: ["summary", entryId], + queryKey: ["summary", entryId, target], queryFn: () => { - return summarySyncService.generateSummary(entryId) + return summarySyncService.generateSummary(entryId, target) }, enabled: options?.enabled, staleTime: 1000 * 60 * 60 * 24, diff --git a/apps/mobile/src/store/summary/store.ts b/apps/mobile/src/store/summary/store.ts index 63ada4166..e56760ada 100644 --- a/apps/mobile/src/store/summary/store.ts +++ b/apps/mobile/src/store/summary/store.ts @@ -13,6 +13,7 @@ type SummaryModel = Omit interface SummaryData { lang?: string summary: string + readabilitySummary: string | null lastAccessed: number } @@ -41,7 +42,9 @@ class SummaryActions { immerSet((state) => { state.data[summary.entryId] = { lang: summary.language ?? undefined, - summary: summary.summary, + summary: summary.summary || state.data[summary.entryId]?.summary || "", + readabilitySummary: + summary.readabilitySummary || state.data[summary.entryId]?.readabilitySummary || null, lastAccessed: now, } }) @@ -96,7 +99,7 @@ export const summaryActions = new SummaryActions() class SummarySyncService { private pendingPromises: Record> = {} - async generateSummary(entryId: string) { + async generateSummary(entryId: string, target: "content" | "readabilityContent") { const entry = getEntry(entryId) if (!entry) return @@ -116,6 +119,7 @@ class SummarySyncService { query: { id: entryId, language: actionLanguage as SupportedLanguages, + target, }, }) .then((summary) => { @@ -127,7 +131,11 @@ class SummarySyncService { state.data[entryId] = { lang: actionLanguage, - summary: summary.data, + summary: target === "content" ? summary.data : state.data[entryId]?.summary || "", + readabilitySummary: + target === "readabilityContent" + ? summary.data + : state.data[entryId]?.readabilitySummary || null, lastAccessed: Date.now(), } state.generatingStatus[entryId] = SummaryGeneratingStatus.Success @@ -153,8 +161,9 @@ class SummarySyncService { summaryActions.upsertMany([ { entryId, - summary, + summary: target === "content" ? summary : "", language: actionLanguage ?? null, + readabilitySummary: target === "readabilityContent" ? summary : null, }, ]) } diff --git a/apps/mobile/src/store/translation/hooks.ts b/apps/mobile/src/store/translation/hooks.ts index 4861f711d..126e658f7 100644 --- a/apps/mobile/src/store/translation/hooks.ts +++ b/apps/mobile/src/store/translation/hooks.ts @@ -7,7 +7,15 @@ import type { SupportedLanguages } from "@/src/lib/language" import { useEntryList } from "../entry/hooks" import { translationSyncService, useTranslationStore } from "./store" -export const usePrefetchEntryTranslation = (entryIds: string[], withContent?: boolean) => { +export const usePrefetchEntryTranslation = ({ + entryIds, + withContent, + target = "content", +}: { + entryIds: string[] + withContent?: boolean + target?: "content" | "readabilityContent" +}) => { const translation = useGeneralSettingKey("translation") const entryList = useEntryList(entryIds) @@ -18,12 +26,13 @@ export const usePrefetchEntryTranslation = (entryIds: string[], withContent?: bo return useQueries({ queries: entryList.map((entryId) => ({ - queryKey: ["translation", entryId, actionLanguage, withContent], + queryKey: ["translation", entryId, actionLanguage, withContent, target], queryFn: () => translationSyncService.generateTranslation({ entryId, language: actionLanguage, withContent, + target, }), })), }) diff --git a/apps/mobile/src/store/translation/store.ts b/apps/mobile/src/store/translation/store.ts index 0fb48895c..412d112f8 100644 --- a/apps/mobile/src/store/translation/store.ts +++ b/apps/mobile/src/store/translation/store.ts @@ -30,6 +30,7 @@ class TranslationActions { title: translation.title, description: translation.description, content: translation.content, + readabilityContent: translation.readabilityContent, } if (!state.data[translation.entryId]) { @@ -61,17 +62,19 @@ class TranslationSyncService { entryId, language, withContent, + target, }: { entryId: string language: SupportedLanguages withContent?: boolean + target: "content" | "readabilityContent" }) { const entry = getEntry(entryId) if (!entry) return const translationSession = translationActions.getTranslation(entryId, language) const fields = ( - ["title", "description", ...(withContent ? ["content"] : [])] as Array< + ["title", "description", ...(withContent ? [target] : [])] as Array< "title" | "description" | "content" > ).filter((field) => { @@ -100,6 +103,7 @@ class TranslationSyncService { title: res.data.title || "", description: res.data.description || "", content: res.data.content || "", + readabilityContent: res.data.readabilityContent || "", } await translationActions.upsertMany([translation]) diff --git a/apps/mobile/src/store/translation/types.ts b/apps/mobile/src/store/translation/types.ts index 02b675d56..fbb86ad40 100644 --- a/apps/mobile/src/store/translation/types.ts +++ b/apps/mobile/src/store/translation/types.ts @@ -2,4 +2,5 @@ export interface EntryTranslation { title: string description: string content: string + readabilityContent: string | null } diff --git a/apps/mobile/src/store/user/hooks.ts b/apps/mobile/src/store/user/hooks.ts index 8d72f2c59..b8039fd43 100644 --- a/apps/mobile/src/store/user/hooks.ts +++ b/apps/mobile/src/store/user/hooks.ts @@ -5,7 +5,7 @@ import { useEffect } from "react" import { apiClient } from "@/src/lib/api-fetch" import { kv } from "@/src/lib/kv" import { useNavigation } from "@/src/lib/navigation/hooks" -import { OnboardingScreen } from "@/src/screens/onboarding" +import { OnboardingScreen } from "@/src/screens/OnboardingScreen" import { isNewUserQueryKey, isOnboardingFinishedStorageKey } from "./constants" import { userSyncService, useUserStore } from "./store" diff --git a/apps/mobile/src/store/user/store.ts b/apps/mobile/src/store/user/store.ts index e8a7ed3ba..dab251149 100644 --- a/apps/mobile/src/store/user/store.ts +++ b/apps/mobile/src/store/user/store.ts @@ -98,9 +98,9 @@ class UserSyncService { if (!me) throw new Error("user not login") - const method = enabled ? twoFactor.enable : twoFactor.disable - - const res = await method({ password }) + const res = enabled + ? await twoFactor.enable({ password }) + : await twoFactor.disable({ password }) if (!res.error) { immerSet((state) => { @@ -153,6 +153,22 @@ class UserSyncService { return res } + + async fetchUser(userId: string) { + const res = await apiClient.profiles.$get({ query: { id: userId } }) + if (res.code === 0) { + const { whoami } = get() + immerSet((state) => { + state.users[userId] = { + email: null, + isMe: whoami?.id === userId ? 1 : 0, + ...res.data, + } + }) + } + + return res.data + } } class UserActions { diff --git a/apps/mobile/web-app/html-renderer/src/components/image.tsx b/apps/mobile/web-app/html-renderer/src/components/image.tsx index b8747efad..593d6366c 100644 --- a/apps/mobile/web-app/html-renderer/src/components/image.tsx +++ b/apps/mobile/web-app/html-renderer/src/components/image.tsx @@ -53,7 +53,7 @@ export const MarkdownImage = (props: HTMLProps<"img">) => { }) }} > - {image?.blurhash && ( + {image?.blurhash && scaleWidth && scaleHeight && ( ) => { {...rest} onLoad={() => setIsLoading(false)} style={{ - width: scaleWidth, - height: scaleHeight, + width: scaleWidth || undefined, + height: scaleHeight || undefined, }} loading="lazy" className={clsx( - "absolute inset-0 !my-0 transition-opacity duration-500", + "!my-0 transition-opacity duration-500", isLoading && "opacity-0", + scaleWidth && scaleHeight && "absolute inset-0", )} crossOrigin="anonymous" src={src} diff --git a/apps/ssr/client/@types/default-resource.ts b/apps/ssr/client/@types/default-resource.ts index 80dc3ca98..5b7954e1f 100644 --- a/apps/ssr/client/@types/default-resource.ts +++ b/apps/ssr/client/@types/default-resource.ts @@ -21,6 +21,7 @@ import common_zhCN from "@locales/common/zh-CN.json" import common_zhHK from "@locales/common/zh-HK.json" import common_zhTW from "@locales/common/zh-TW.json" import external_en from "@locales/external/en.json" +import external_zhCN from "@locales/external/zh-CN.json" import type { ns, SSRSupportedLanguages } from "./constants" @@ -38,6 +39,7 @@ export const defaultResources = { }, "zh-CN": { common: common_zhCN, + external: external_zhCN, }, "zh-HK": { common: common_zhHK, diff --git a/apps/ssr/client/components/items/picture.tsx b/apps/ssr/client/components/items/picture.tsx index e8098b2b0..d9b9c2c73 100644 --- a/apps/ssr/client/components/items/picture.tsx +++ b/apps/ssr/client/components/items/picture.tsx @@ -19,8 +19,8 @@ import { nextFrame } from "@follow/utils/dom" import { cn } from "@follow/utils/utils" import dayjs from "dayjs" import { throttle } from "es-toolkit/compat" -import { AnimatePresence, m } from "framer-motion" import type { RenderComponentProps } from "masonic" +import { AnimatePresence, m } from "motion/react" import type { FC, PropsWithChildren } from "react" import { memo, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react" import { PhotoProvider, PhotoView } from "react-photo-view" diff --git a/apps/ssr/client/components/layout/header/index.tsx b/apps/ssr/client/components/layout/header/index.tsx index 41e0565d5..5f00b837b 100644 --- a/apps/ssr/client/components/layout/header/index.tsx +++ b/apps/ssr/client/components/layout/header/index.tsx @@ -4,8 +4,8 @@ import { Logo } from "@follow/components/icons/logo.jsx" import { Button } from "@follow/components/ui/button/index.jsx" import { Kbd } from "@follow/components/ui/kbd/Kbd.jsx" import { cn } from "@follow/utils/utils" -import type { MotionValue } from "framer-motion" -import { useMotionValueEvent, useScroll } from "framer-motion" +import type { MotionValue } from "motion/react" +import { useMotionValueEvent, useScroll } from "motion/react" import * as React from "react" import { useState } from "react" import { useHotkeys } from "react-hotkeys-hook" diff --git a/apps/ssr/client/initialize/analytics.ts b/apps/ssr/client/initialize/analytics.ts index 12d738a7c..976884bee 100644 --- a/apps/ssr/client/initialize/analytics.ts +++ b/apps/ssr/client/initialize/analytics.ts @@ -1,4 +1,4 @@ -import { env } from "@follow/shared/env" +import { env } from "@follow/shared/env.ssr" import { setOpenPanelTracker } from "@follow/tracker" import { op } from "./op" diff --git a/apps/ssr/client/initialize/op.ts b/apps/ssr/client/initialize/op.ts index 5cbf50cc2..489367073 100644 --- a/apps/ssr/client/initialize/op.ts +++ b/apps/ssr/client/initialize/op.ts @@ -1,4 +1,4 @@ -import { env } from "@follow/shared/env" +import { env } from "@follow/shared/env.ssr" import { OpenPanel } from "@openpanel/web" export const op = new OpenPanel({ diff --git a/apps/ssr/client/initialize/sentry.ts b/apps/ssr/client/initialize/sentry.ts index 2919bfe23..47586b5f3 100644 --- a/apps/ssr/client/initialize/sentry.ts +++ b/apps/ssr/client/initialize/sentry.ts @@ -1,4 +1,4 @@ -import { env } from "@follow/shared/env" +import { env } from "@follow/shared/env.ssr" import type { BrowserOptions } from "@sentry/react" import { FetchError } from "ofetch" diff --git a/apps/ssr/client/lib/api-fetch.ts b/apps/ssr/client/lib/api-fetch.ts index 7afdd3d5f..396917c4c 100644 --- a/apps/ssr/client/lib/api-fetch.ts +++ b/apps/ssr/client/lib/api-fetch.ts @@ -1,4 +1,4 @@ -import { env } from "@follow/shared/env" +import { env } from "@follow/shared/env.ssr" import type { AppType } from "@follow/shared/hono" import { hc } from "hono/client" import { ofetch } from "ofetch" diff --git a/apps/ssr/client/lib/auth.ts b/apps/ssr/client/lib/auth.ts index 1b0c17fd6..c8d937488 100644 --- a/apps/ssr/client/lib/auth.ts +++ b/apps/ssr/client/lib/auth.ts @@ -1,50 +1,22 @@ -import { env } from "@follow/shared/env" -import type { authPlugins } from "@follow/shared/hono" -import type { BetterAuthClientPlugin } from "better-auth/client" -import { inferAdditionalFields, twoFactorClient } from "better-auth/client/plugins" -import { createAuthClient } from "better-auth/react" +import { Auth } from "@follow/shared/auth" +import { env } from "@follow/shared/env.ssr" -const WEB_URL = env.VITE_WEB_URL -type AuthPlugin = (typeof authPlugins)[number] -const serverPlugins = [ - { - id: "customGetProviders", - $InferServerPlugin: {} as Extract, - }, - { - id: "customCreateSession", - $InferServerPlugin: {} as Extract, - }, - { - id: "getAccountInfo", - $InferServerPlugin: {} as Extract, - }, - inferAdditionalFields({ - user: { - handle: { - type: "string", - required: false, - }, - }, - }), -] satisfies BetterAuthClientPlugin[] - -const authClient = createAuthClient({ - baseURL: `${env.VITE_API_URL}/better-auth`, - plugins: [...serverPlugins, twoFactorClient()], +const auth = new Auth({ + apiURL: env.VITE_API_URL, + webURL: env.VITE_WEB_URL, }) // @keep-sorted export const { changeEmail, changePassword, - createSession, forgetPassword, getAccountInfo, getProviders, getSession, linkSocial, listAccounts, + oneTimeToken, resetPassword, sendVerificationEmail, signIn, @@ -53,30 +25,6 @@ export const { twoFactor, unlinkAccount, updateUser, -} = authClient +} = auth.authClient -export type LoginRuntime = "browser" | "app" -export const loginHandler = async ( - provider: string, - runtime?: LoginRuntime, - args?: { - email?: string - password?: string - headers?: Record - }, -) => { - const { email, password, headers } = args ?? {} - - if (provider === "credential") { - if (!email || !password) { - window.location.href = "/login" - return - } - return signIn.email({ email, password }, { headers }) - } - - signIn.social({ - provider: provider as "google" | "github" | "apple", - callbackURL: runtime === "app" ? `${WEB_URL}/login` : WEB_URL, - }) -} +export const { loginHandler } = auth diff --git a/apps/ssr/client/lib/url-builder.ts b/apps/ssr/client/lib/url-builder.ts index 69a5a6bf3..58b20d091 100644 --- a/apps/ssr/client/lib/url-builder.ts +++ b/apps/ssr/client/lib/url-builder.ts @@ -1,4 +1,4 @@ -import { env } from "@follow/shared/env" +import { env } from "@follow/shared/env.ssr" import { UrlBuilder as UrlBuilderClass } from "@follow/utils/url-builder" export const UrlBuilder = new UrlBuilderClass(env.VITE_WEB_URL) diff --git a/apps/ssr/client/modules/login/index.tsx b/apps/ssr/client/modules/login/index.tsx index c47ded507..04c9e7577 100644 --- a/apps/ssr/client/modules/login/index.tsx +++ b/apps/ssr/client/modules/login/index.tsx @@ -1,5 +1,5 @@ import { UserAvatar } from "@client/components/ui/user-avatar" -import { createSession, loginHandler, signOut, twoFactor } from "@client/lib/auth" +import { loginHandler, oneTimeToken, signOut, twoFactor } from "@client/lib/auth" import { queryClient } from "@client/lib/query-client" import { useSession } from "@client/query/auth" import { useAuthProviders } from "@client/query/users" @@ -18,7 +18,7 @@ import { Input } from "@follow/components/ui/input/index.js" import { LoadingCircle } from "@follow/components/ui/loading/index.jsx" import { authProvidersConfig } from "@follow/constants" import { DEEPLINK_SCHEME } from "@follow/shared/constants" -import { env } from "@follow/shared/env" +import { env } from "@follow/shared/env.ssr" import { cn } from "@follow/utils/utils" import { zodResolver } from "@hookform/resolvers/zod" import { useCallback, useEffect, useMemo, useRef, useState } from "react" @@ -29,6 +29,27 @@ import { Link, useLocation, useNavigate } from "react-router" import { toast } from "sonner" import { z } from "zod" +function closeRecaptcha(recaptchaRef: React.RefObject, resetLoadingState: () => void) { + const handleClick = (e: MouseEvent) => { + const recaptchaIframeSelector = + 'iframe[src*="recaptcha/api2"], iframe[src*="www.recaptcha.net"], iframe[src*="google.com/recaptcha"]' + const recaptchaChallengeIframe = document.querySelector(recaptchaIframeSelector) + + if ( + e.target instanceof Element && + recaptchaChallengeIframe && + !recaptchaChallengeIframe.contains(e.target) && + !e.target.closest(".g-recaptcha") + ) { + recaptchaRef.current?.reset() + resetLoadingState() + } + } + + document.addEventListener("click", handleClick) + return () => document.removeEventListener("click", handleClick) +} + export function Login() { const { status, refetch } = useSession() @@ -53,11 +74,10 @@ export function Login() { }, [isCredentialProvider, provider, status]) const getCallbackUrl = useCallback(async () => { - const { data } = await createSession() + const { data } = await oneTimeToken.generate() if (!data) return null return { - url: `${DEEPLINK_SCHEME}auth?ck=${data.ck}&userId=${data.userId}`, - userId: data.userId, + url: `${DEEPLINK_SCHEME}auth?token=${data.token}`, } }, []) @@ -223,41 +243,67 @@ function LoginWithPassword() { }, }) const [needTwoFactor, setNeedTwoFactor] = useState(false) + const [isButtonLoading, setIsButtonLoading] = useState(false) - const { isSubmitting } = form.formState const navigate = useNavigate() - const recaptchaRef = useRef(null) + const resetLoadingState = useCallback(() => { + setIsButtonLoading(false) + }, []) + + useEffect(() => { + if (isButtonLoading) { + return closeRecaptcha(recaptchaRef, resetLoadingState) + } + }, [isButtonLoading, resetLoadingState]) + async function onSubmit(values: z.infer) { - if (needTwoFactor && values.code) { - const res = await twoFactor.verifyTotp({ code: values.code }) + setIsButtonLoading(true) + try { + if (needTwoFactor && values.code) { + const res = await twoFactor.verifyTotp({ code: values.code }) + if (res?.error) { + toast.error(res.error.message) + setIsButtonLoading(false) + } else { + queryClient.invalidateQueries({ queryKey: ["auth", "session"] }) + } + return + } + + const token = await recaptchaRef.current?.executeAsync() + if (!token) { + setIsButtonLoading(false) + return + } + + const res = await loginHandler("credential", "app", { + ...values, + headers: { + "x-token": `r2:${token}`, + }, + }) + if (res?.error) { toast.error(res.error.message) + setIsButtonLoading(false) + return + } + + if ((res?.data as any)?.twoFactorRedirect) { + setNeedTwoFactor(true) + form.setValue("code", "") + setTimeout(() => form.setFocus("code"), 0) + setIsButtonLoading(false) + return } else { queryClient.invalidateQueries({ queryKey: ["auth", "session"] }) } - return - } - - const token = await recaptchaRef.current?.executeAsync() - const res = await loginHandler("credential", "app", { - ...values, - headers: { - "x-token": `r2:${token}`, - }, - }) - if (res?.error) { - toast.error(res.error.message) - return - } - if ((res?.data as any)?.twoFactorRedirect) { - setNeedTwoFactor(true) - form.setValue("code", "") - form.setFocus("code") - return - } else { - queryClient.invalidateQueries({ queryKey: ["auth", "session"] }) + } catch (error) { + console.error("Login error:", error) + toast.error(t("login.errors.unknown")) + setIsButtonLoading(false) } } @@ -271,7 +317,7 @@ function LoginWithPassword() { {t("login.email")} - + @@ -292,7 +338,7 @@ function LoginWithPassword() { - + @@ -306,7 +352,7 @@ function LoginWithPassword() { {t("login.two_factor.code")} - + @@ -314,8 +360,16 @@ function LoginWithPassword() { /> )} -
@@ -116,7 +155,11 @@ export function Component() { size="invisible" />
-
diff --git a/apps/ssr/client/pages/(login)/register.tsx b/apps/ssr/client/pages/(login)/register.tsx index 29fd66aa2..d8d7a4b7d 100644 --- a/apps/ssr/client/pages/(login)/register.tsx +++ b/apps/ssr/client/pages/(login)/register.tsx @@ -10,10 +10,10 @@ import { FormMessage, } from "@follow/components/ui/form/index.jsx" import { Input } from "@follow/components/ui/input/index.js" -import { env } from "@follow/shared/env" +import { env } from "@follow/shared/env.ssr" import { tracker } from "@follow/tracker" import { zodResolver } from "@hookform/resolvers/zod" -import { useRef } from "react" +import { useEffect, useRef, useState } from "react" import ReCAPTCHA from "react-google-recaptcha" import { useForm } from "react-hook-form" import { Trans, useTranslation } from "react-i18next" @@ -21,6 +21,30 @@ import { Link, useNavigate } from "react-router" import { toast } from "sonner" import { z } from "zod" +function closeRecaptcha( + recaptchaRef: React.RefObject, + setIsSubmitting: (value: boolean) => void, +) { + const handleClick = (e: MouseEvent) => { + const recaptchaIframeSelector = + 'iframe[src*="recaptcha/api2"], iframe[src*="www.recaptcha.net"], iframe[src*="google.com/recaptcha"]' + const recaptchaChallengeIframe = document.querySelector(recaptchaIframeSelector) + + if ( + e.target instanceof Element && + recaptchaChallengeIframe && + !recaptchaChallengeIframe.contains(e.target) && + !e.target.closest(".g-recaptcha") + ) { + recaptchaRef.current?.reset() + setIsSubmitting(false) + } + } + + document.addEventListener("click", handleClick) + return () => document.removeEventListener("click", handleClick) +} + export function Component() { return (
@@ -43,6 +67,9 @@ const formSchema = z function RegisterForm() { const { t } = useTranslation() + const [isSubmitting, setIsSubmitting] = useState(false) + const navigate = useNavigate() + const recaptchaRef = useRef(null) const form = useForm>({ resolver: zodResolver(formSchema), @@ -53,34 +80,48 @@ function RegisterForm() { }, }) - const { isValid } = form.formState - - const navigate = useNavigate() - - const recaptchaRef = useRef(null) + useEffect(() => { + if (isSubmitting) { + return closeRecaptcha(recaptchaRef, setIsSubmitting) + } + }, [isSubmitting]) async function onSubmit(values: z.infer) { - const token = await recaptchaRef.current?.executeAsync() - return signUp.email({ - email: values.email, - password: values.password, - name: values.email.split("@")[0]!, - callbackURL: "/", - fetchOptions: { - onSuccess() { - tracker.register({ - type: "email", - }) - navigate("/login") + setIsSubmitting(true) + + try { + const token = await recaptchaRef.current?.executeAsync() + + if (!token) { + return + } + + await signUp.email({ + email: values.email, + password: values.password, + name: values.email.split("@")[0]!, + callbackURL: "/", + fetchOptions: { + onSuccess() { + tracker.register({ + type: "email", + }) + navigate("/login") + }, + onError(context) { + toast.error(context.error.message) + }, + headers: { + "x-token": `r2:${token}`, + }, }, - onError(context) { - toast.error(context.error.message) - }, - headers: { - "x-token": `r2:${token}`, - }, - }, - }) + }) + } finally { + if (recaptchaRef.current) { + recaptchaRef.current.reset() + } + setIsSubmitting(false) + } } return ( @@ -109,7 +150,7 @@ function RegisterForm() { {t("register.email")} - + @@ -122,7 +163,7 @@ function RegisterForm() { {t("register.password")} - + @@ -135,14 +176,20 @@ function RegisterForm() { {t("register.confirm_password")} - + )} /> - diff --git a/apps/ssr/index.ts b/apps/ssr/index.ts index 6f30c0250..49954217d 100644 --- a/apps/ssr/index.ts +++ b/apps/ssr/index.ts @@ -2,7 +2,7 @@ import "./src/lib/load-env" import middie from "@fastify/middie" import { fastifyRequestContext } from "@fastify/request-context" -import { env } from "@follow/shared/env" +import { env } from "@follow/shared/env.ssr" import type { FastifyRequest } from "fastify" import Fastify from "fastify" import { nanoid } from "nanoid" diff --git a/apps/ssr/package.json b/apps/ssr/package.json index 14afaab48..81ccfa5dd 100644 --- a/apps/ssr/package.json +++ b/apps/ssr/package.json @@ -15,31 +15,31 @@ "@fontsource/sn-pro": "5.2.5", "@openpanel/web": "1.0.1", "@resvg/resvg-js": "2.6.2", - "@sentry/react": "9.11.0", - "@tanstack/react-query": "5.71.10", + "@sentry/react": "9.13.0", + "@tanstack/react-query": "5.74.4", "blurhash": "2.0.5", "click-to-react-component": "1.1.2", "dayjs": "1.11.13", - "fastify": "5.2.2", - "framer-motion": "12.6.3", - "i18next": "24.2.3", - "jotai": "2.12.2", + "fastify": "5.3.0", + "i18next": "25.0.0", + "jotai": "2.12.3", "kose-font": "1.0.0", "linkedom": "0.18.9", + "motion": "12.7.4", "ofetch": "1.4.1", - "rc-modal-sheet": "0.3.2", + "rc-modal-sheet": "1.0.0", "react-blurhash": "0.3.0", "react-google-recaptcha": "3.1.0", "react-hook-form": "7.55.0", - "react-hotkeys-hook": "4.6.1", + "react-hotkeys-hook": "5.0.1", "react-i18next": "15.4.1", "react-photo-view": "1.2.7", - "react-router": "7.5.0", + "react-router": "7.5.1", "satori": "0.12.2", "sonner": "2.0.3", "use-context-selector": "2.0.0", "xss": "1.0.15", - "zod": "3.24.2" + "zod": "3.24.3" }, "devDependencies": { "@follow/components": "workspace:*", @@ -49,13 +49,13 @@ "@follow/shared": "workspace:*", "@follow/types": "workspace:*", "@follow/utils": "workspace:*", - "@radix-ui/react-avatar": "1.1.3", + "@radix-ui/react-avatar": "1.1.4", "@types/html-minifier-terser": "7.0.2", "@types/react-google-recaptcha": "2.1.9", "chokidar": "4.0.3", "daisyui": "4.12.24", "dotenv-flow": "4.1.0", - "es-toolkit": "1.34.1", + "es-toolkit": "1.35.0", "fast-glob": "3.3.3", "foxact": "0.2.45", "html-minifier-terser": "7.2.0", @@ -65,6 +65,6 @@ "path-to-regexp": "8.2.0", "tsup": "8.4.0", "tsx": "4.19.3", - "vite": "6.2.5" + "vite": "6.3.2" } } diff --git a/apps/ssr/src/lib/api-client.ts b/apps/ssr/src/lib/api-client.ts index 969fe43af..c5187f36a 100644 --- a/apps/ssr/src/lib/api-client.ts +++ b/apps/ssr/src/lib/api-client.ts @@ -1,7 +1,7 @@ import "./load-env" import { requestContext } from "@fastify/request-context" -import { env } from "@follow/shared/env" +import { env } from "@follow/shared/env.ssr" import type { AppType } from "@follow/shared/hono" import { hc } from "hono/client" import { ofetch } from "ofetch" diff --git a/apps/ssr/src/router/global.ts b/apps/ssr/src/router/global.ts index 75a9d4cbc..5a9402c87 100644 --- a/apps/ssr/src/router/global.ts +++ b/apps/ssr/src/router/global.ts @@ -1,7 +1,7 @@ import { readFileSync } from "node:fs" import path, { resolve } from "node:path" -import { env } from "@follow/shared/env" +import { env } from "@follow/shared/env.ssr" import type { FastifyInstance, FastifyReply, FastifyRequest } from "fastify" import { minify } from "html-minifier-terser" import { parseHTML } from "linkedom" diff --git a/eslint.config.mjs b/eslint.config.mjs index d21de4f80..e595ace97 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -43,6 +43,7 @@ export default defineConfig( "@eslint-react/no-clone-element": 0, "@eslint-react/hooks-extra/no-direct-set-state-in-use-effect": 0, "@eslint-react/dom/no-flush-sync": 1, + "@eslint-react/hooks-extra/no-unnecessary-use-callback": "warn", // NOTE: Disable this temporarily "react-compiler/react-compiler": 0, "no-restricted-syntax": 0, diff --git a/icons/mgc/ai_cute_re.svg b/icons/mgc/ai_cute_re.svg new file mode 100644 index 000000000..fb43faeb6 --- /dev/null +++ b/icons/mgc/ai_cute_re.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icons/mgc/bell_ringing_cute_re.svg b/icons/mgc/bell_ringing_cute_re.svg new file mode 100644 index 000000000..5bb67e1c0 --- /dev/null +++ b/icons/mgc/bell_ringing_cute_re.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icons/mgc/ghost_cute_re.svg b/icons/mgc/ghost_cute_re.svg new file mode 100644 index 000000000..f528cd9c6 --- /dev/null +++ b/icons/mgc/ghost_cute_re.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icons/mgc/quill_pen_cute_re.svg b/icons/mgc/quill_pen_cute_re.svg new file mode 100644 index 000000000..a9f59e67c --- /dev/null +++ b/icons/mgc/quill_pen_cute_re.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icons/mgc/share_3_cute_re.svg b/icons/mgc/share_3_cute_re.svg deleted file mode 100644 index 9d4d7c73d..000000000 --- a/icons/mgc/share_3_cute_re.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/icons/mgc/translate_2_ai_cute_re.svg b/icons/mgc/translate_2_ai_cute_re.svg new file mode 100644 index 000000000..024fe5b70 --- /dev/null +++ b/icons/mgc/translate_2_ai_cute_re.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icons/mgc/webhook_cute_re.svg b/icons/mgc/webhook_cute_re.svg new file mode 100644 index 000000000..734d0a406 --- /dev/null +++ b/icons/mgc/webhook_cute_re.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/locales/app/en.json b/locales/app/en.json index 870846870..e7bfdeecc 100644 --- a/locales/app/en.json +++ b/locales/app/en.json @@ -312,6 +312,7 @@ "sidebar.feed_actions.claim": "Claim", "sidebar.feed_actions.claim_feed": "Claim Feed", "sidebar.feed_actions.copy_email_address": "Copy Email Address", + "sidebar.feed_actions.copy_feed_badge": "Copy Feed Badge", "sidebar.feed_actions.copy_feed_id": "Copy Feed ID", "sidebar.feed_actions.copy_feed_url": "Copy Feed URL", "sidebar.feed_actions.copy_list_id": "Copy List ID", diff --git a/locales/app/zh-CN.json b/locales/app/zh-CN.json index 9205e1d1f..8fcc96497 100644 --- a/locales/app/zh-CN.json +++ b/locales/app/zh-CN.json @@ -102,6 +102,7 @@ "entry_actions.open_in_browser": "在{{which}}打开", "entry_actions.recent_reader": "最近阅读者:", "entry_actions.save_media_to_eagle": "保存到 Eagle", + "entry_actions.save_to_cubox": "保存到 Cubox", "entry_actions.save_to_instapaper": "保存到 Instapaper", "entry_actions.save_to_obsidian": "保存到 Obsidian", "entry_actions.save_to_outline": "保存到 Outline", @@ -118,7 +119,7 @@ "entry_actions.star": "收藏", "entry_actions.starred": "已收藏", "entry_actions.tip": "打赏", - "entry_actions.toggle_ai_summary": "切换 AI 摘要", + "entry_actions.toggle_ai_summary": "切换 AI 总结", "entry_actions.toggle_ai_translation": "切换 AI 翻译", "entry_actions.unstar": "取消收藏", "entry_actions.unstarred": "取消收藏", @@ -154,6 +155,8 @@ "entry_list_header.unread": "未读", "feed.actions.follow": "订阅", "feed.actions.followed": "已订阅", + "feed.entry_week_one": "{{count}} 条目/周", + "feed.entry_week_other": "{{count}} 条目/周", "feed.follower_one": "订阅者", "feed.follower_other": "订阅者", "feed.followsAndFeeds": "在 {{appName}} 上有 {{subscriptionCount}} 个{{subscriptionNoun}}和 {{feedsCount}} 个{{feedsNoun}}", @@ -220,6 +223,7 @@ "mark_all_read_button.confirm": "确认", "mark_all_read_button.confirm_mark_all": "将 标记为已读?", "mark_all_read_button.confirm_mark_all_info": "确认将全部标记为已读?", + "mark_all_read_button.done": "已标记", "mark_all_read_button.mark_all_as_read": "全部标记为已读", "mark_all_read_button.mark_as_read": "标记 为已读", "mark_all_read_button.undo": "撤销", @@ -239,7 +243,7 @@ "new_user_guide.step.behavior.unread_question.option1": "主动:显示时自动标记为已读。", "new_user_guide.step.behavior.unread_question.option2": "平衡:悬停或滚出视野时自动标记为已读。", "new_user_guide.step.behavior.unread_question.option3": "被动:仅在点击时标记为已读。", - "new_user_guide.step.features.actions.description": "自动化规则允许你对不同的订阅执行不同的操作。\n- 使用 AI 进行摘要或翻译\n- 配置阅读条目的方式\n- 启用新条目的通知或静音\n- 重写或屏蔽特定条目\n- 将新条目发送到 webhook 地址", + "new_user_guide.step.features.actions.description": "自动化规则允许你对不同的订阅执行不同的操作。\n- 使用 AI 进行总结或翻译\n- 配置阅读条目的方式\n- 启用新条目的通知或静音\n- 重写或屏蔽特定条目\n- 将新条目发送到 webhook 地址", "new_user_guide.step.features.integration.description": "集成允许你将条目保存到其他服务。目前支持的服务有:\n- Eagle\n- Readwise\n- Instapaper\n- Obsidian\n- Outline\n- Readeck", "new_user_guide.step.migrate.profile": "设置你的个人资料", "new_user_guide.step.migrate.title": "从 OPML 文件导入", @@ -308,6 +312,7 @@ "sidebar.feed_actions.claim": "认证", "sidebar.feed_actions.claim_feed": "认证订阅", "sidebar.feed_actions.copy_email_address": "复制邮件地址", + "sidebar.feed_actions.copy_feed_badge": "复制订阅源徽章", "sidebar.feed_actions.copy_feed_id": "复制 ID", "sidebar.feed_actions.copy_feed_url": "复制链接", "sidebar.feed_actions.copy_list_id": "复制列表 ID", diff --git a/locales/app/zh-TW.json b/locales/app/zh-TW.json index 43e98cd05..c5821d2d6 100644 --- a/locales/app/zh-TW.json +++ b/locales/app/zh-TW.json @@ -89,9 +89,10 @@ "entry_actions.deleted": "已刪除。", "entry_actions.export_as_pdf": "匯出為 PDF", "entry_actions.failed_to_delete": "刪除失敗。", + "entry_actions.failed_to_save_to_cubox": "無法儲存到 Cubox。", "entry_actions.failed_to_save_to_eagle": "無法儲存到 Eagle。", "entry_actions.failed_to_save_to_instapaper": "無法儲存到 Instapaper。", - "entry_actions.failed_to_save_to_obsidian": "儲存到 Obsidian 失敗", + "entry_actions.failed_to_save_to_obsidian": "無法儲存到 Obsidian。", "entry_actions.failed_to_save_to_outline": "無法儲存到 Outline。", "entry_actions.failed_to_save_to_readeck": "無法儲存到 Readeck。", "entry_actions.failed_to_save_to_readwise": "無法儲存到 Readwise。", @@ -101,17 +102,19 @@ "entry_actions.open_in_browser": "在{{which}}中打開", "entry_actions.recent_reader": "最近閲讀者:", "entry_actions.save_media_to_eagle": "儲存媒體至 Eagle", + "entry_actions.save_to_cubox": "儲存到 Cubox", "entry_actions.save_to_instapaper": "儲存到 Instapaper", "entry_actions.save_to_obsidian": "儲存到 Obsidian", "entry_actions.save_to_outline": "儲存到 Outline", "entry_actions.save_to_readeck": "儲存到 Readeck", "entry_actions.save_to_readwise": "儲存到 Readwise", - "entry_actions.saved_to_eagle": "已儲存至 Eagle。", - "entry_actions.saved_to_instapaper": "已儲存至 Instapaper。", + "entry_actions.saved_to_cubox": "已儲存到 Cubox", + "entry_actions.saved_to_eagle": "已儲存到 Eagle", + "entry_actions.saved_to_instapaper": "已儲存到 Instapaper", "entry_actions.saved_to_obsidian": "已儲存到 Obsidian", - "entry_actions.saved_to_outline": "已儲存至 Outline。", - "entry_actions.saved_to_readeck": "已儲存至 Readeck。", - "entry_actions.saved_to_readwise": "已儲存至 Readwise。", + "entry_actions.saved_to_outline": "已儲存到 Outline", + "entry_actions.saved_to_readeck": "已儲存到 Readeck", + "entry_actions.saved_to_readwise": "已儲存到 Readwise", "entry_actions.share": "分享", "entry_actions.star": "收藏", "entry_actions.starred": "已收藏", @@ -152,12 +155,15 @@ "entry_list_header.unread": "未讀", "feed.actions.follow": "跟隨", "feed.actions.followed": "已跟隨", + "feed.entry_week_one": "{{count}} 條目/週", + "feed.entry_week_other": "{{count}} 條目/週", "feed.follower_one": "跟隨者", "feed.follower_other": "跟隨者", "feed.followsAndFeeds": "在 {{appName}} 上有 {{subscriptionCount}} 個 {{subscriptionNoun}} 和 {{feedsCount}} 個 {{feedsNoun}}", "feed.followsAndReads": "在 {{appName}} 上有 {{subscriptionCount}} 個 {{subscriptionNoun}} 和 {{readCount}} 次近期 {{readNoun}}", "feed.read_one": "閱讀", "feed.read_other": "閱讀", + "feed.updated_at": "已更新", "feed_claim_modal.choose_verification_method": "有三種驗證方式,您可以選擇其中一種進行驗證。", "feed_claim_modal.claim_button": "認領", "feed_claim_modal.content_instructions": "複製以下內容,發佈到需要驗證的 RSS 摘要。", @@ -217,6 +223,7 @@ "mark_all_read_button.confirm": "確認", "mark_all_read_button.confirm_mark_all": "將 標記為已讀?", "mark_all_read_button.confirm_mark_all_info": "確認將全部標記為已讀?", + "mark_all_read_button.done": "已標記", "mark_all_read_button.mark_all_as_read": "全部標記為已讀", "mark_all_read_button.mark_as_read": "標記 為已讀", "mark_all_read_button.undo": "復原", diff --git a/locales/common/en.json b/locales/common/en.json index fa2fed7e1..2ee5cca52 100644 --- a/locales/common/en.json +++ b/locales/common/en.json @@ -1,6 +1,6 @@ { "app.copied_to_clipboard": "Copied to clipboard", - "discover.category.all": "All", + "discover.category.all": "Popular", "discover.category.anime": "ACG", "discover.category.bbs": "BBS", "discover.category.blog": "Blog", diff --git a/locales/common/zh-CN.json b/locales/common/zh-CN.json index bb4098a42..81c676aa4 100644 --- a/locales/common/zh-CN.json +++ b/locales/common/zh-CN.json @@ -49,6 +49,7 @@ "words.create": "创建", "words.default": "默认", "words.delete": "删除", + "words.documentation": "文档", "words.download": "下载", "words.edit": "编辑", "words.entry": "条目", diff --git a/locales/common/zh-TW.json b/locales/common/zh-TW.json index d3ec2ad98..b2027e69f 100644 --- a/locales/common/zh-TW.json +++ b/locales/common/zh-TW.json @@ -49,19 +49,23 @@ "words.create": "創建", "words.default": "預設", "words.delete": "刪除", + "words.documentation": "文件", "words.download": "下載", "words.edit": "編輯", "words.entry": "條目", "words.expand": "展開", "words.feeds": "RSS 摘要", + "words.finishSetup": "完成設置", "words.follow": "跟隨", "words.id": "ID", "words.inbox": "收件匣", "words.items_one": "內容", "words.items_other": "內容", + "words.letsGo": "開始吧", "words.lists": "列表", "words.local": "本地", "words.manage": "管理", + "words.next": "下一步", "words.record": "記錄", "words.record_one": "記錄", "words.record_other": "記錄", @@ -75,5 +79,6 @@ "words.starred": "收藏", "words.submit": "提交", "words.update": "更新", + "words.which.above": "以上", "words.which.all": "全部" } diff --git a/locales/errors/zh-TW.json b/locales/errors/zh-TW.json index 2919af85a..afa10c234 100644 --- a/locales/errors/zh-TW.json +++ b/locales/errors/zh-TW.json @@ -8,6 +8,7 @@ "1004": "無權限", "1005": "內部錯誤", "1006": "電子信箱未驗證", + "1007": "人機驗證失敗", "1100": "超出預覽版 RSS 摘要最大數量限制", "1101": "超出預覽版訂閲列表最大數量限制", "1102": "超出預覽版收件箱最大數量限制", @@ -46,6 +47,7 @@ "8001": "沒有權限存取列表", "8002": "超出列表限制", "8003": "此 RSS 摘要已經加入列表", + "8004": "無法刪除包含訂閱的列表。", "9000": "尚未完成成就", "9001": "成就已領取", "9002": "成就審核中", diff --git a/locales/external/en.json b/locales/external/en.json index 45035373b..1ae0afa93 100644 --- a/locales/external/en.json +++ b/locales/external/en.json @@ -38,7 +38,10 @@ "login.confirm_password.label": "Confirm Password", "login.continueWith": "Continue with {{provider}}", "login.email": "Email", + "login.errors.unknown": "Errors Unknown", "login.forget_password.description": "Enter the email address associated with your account and we’ll send you an email about how to reset your password.", + "login.forget_password.email_invalid": "Invalid email", + "login.forget_password.email_required": "Email required", "login.forget_password.label": "Forget Password", "login.forget_password.note": "Forgot your password?", "login.forget_password.success": "Email has been sent successfully", @@ -57,6 +60,7 @@ "login.signUp": "Sign up with email", "login.submit": "Submit", "login.two_factor.code": "Two Factor Code", + "login.two_factor.verify": "Complete Verification", "login.welcomeTo": "Welcome to ", "redirect.continueInBrowser": "Continue in Browser", "redirect.instruction": "Now is the time to open {{app_name}} and safely close this page.", diff --git a/locales/external/zh-CN.json b/locales/external/zh-CN.json index dba4dd4db..5ecbf1105 100644 --- a/locales/external/zh-CN.json +++ b/locales/external/zh-CN.json @@ -38,7 +38,10 @@ "login.confirm_password.label": "确认密码", "login.continueWith": "使用 {{provider}} 登入", "login.email": "邮件地址", + "login.errors.unknown": "未知错误", "login.forget_password.description": "请输入与你的帐户关联的邮件地址,我们将向你发送一封关于如何重置密码的邮件。", + "login.forget_password.email_invalid": "无效的邮箱地址", + "login.forget_password.email_required": "请输入邮箱", "login.forget_password.label": "忘记密码", "login.forget_password.note": "忘记了密码?", "login.forget_password.success": "邮件已成功发送。", @@ -57,6 +60,7 @@ "login.signUp": "使用邮件地址注册", "login.submit": "提交", "login.two_factor.code": "双重身份验证码", + "login.two_factor.verify": "完成验证", "login.welcomeTo": "欢迎来到 ", "redirect.continueInBrowser": "在浏览器中继续", "redirect.instruction": "现在可以打开 {{app_name}} 并关闭此页面。", diff --git a/locales/mobile/default/zh-CN.json b/locales/mobile/default/zh-CN.json index a0a1f6bb9..f43346c3b 100644 --- a/locales/mobile/default/zh-CN.json +++ b/locales/mobile/default/zh-CN.json @@ -32,9 +32,11 @@ "operation.mark_all_as_read_which": "将{{which}}标记为已读", "operation.mark_all_as_read_which_above": "以上", "operation.mark_as_read": "标记为已读", + "operation.mark_as_unread": "标记为未读", "operation.open_link": "打开链接", "operation.rename_category": "重命名分类", "operation.share": "分享", + "operation.show_error_message": "显示错误信息", "operation.star": "收藏", "operation.toggle_unread_only.show_all.label": "显示全部", "operation.toggle_unread_only.show_all.success": "正在显示所有条目", diff --git a/locales/mobile/default/zh-TW.json b/locales/mobile/default/zh-TW.json index 92f5508c1..4ff5a65de 100644 --- a/locales/mobile/default/zh-TW.json +++ b/locales/mobile/default/zh-TW.json @@ -30,15 +30,24 @@ "operation.mark_all_as_read": "全部標記為已讀", "operation.mark_all_as_read_confirm": "確認將全部標記為已讀?", "operation.mark_all_as_read_which": "將 {{which}} 標記為已讀", + "operation.mark_all_as_read_which_above": "以上", "operation.mark_as_read": "標記為已讀", + "operation.mark_as_unread": "標記為未讀", + "operation.open_link": "開啟連結", "operation.rename_category": "重新命名類別", "operation.share": "分享", + "operation.show_error_message": "顯示錯誤訊息", "operation.star": "收藏", + "operation.toggle_unread_only.show_all.label": "顯示全部", + "operation.toggle_unread_only.show_all.success": "顯示全部條目", + "operation.toggle_unread_only.show_unread_only.label": "只顯示未讀", + "operation.toggle_unread_only.show_unread_only.success": "顯示未讀條目", "operation.unfollow": "取消跟隨", + "operation.unstar": "取消收藏", "profile.title": "{{name}} 的個人資料", "profile.uncategorized_feeds": "未分類的 RSS 摘要", "tabs.discover": "探索", "tabs.home": "首頁", "tabs.settings": "設定", - "tabs.subscriptions": "跟隨" + "tabs.subscriptions": "訂閱" } diff --git a/locales/native/en.json b/locales/native/en.json index 88bccdc32..b7dd0d843 100644 --- a/locales/native/en.json +++ b/locales/native/en.json @@ -65,6 +65,7 @@ "menu.toggleDevTools": "Toggle Developer Tools", "menu.toggleFullScreen": "Toggle Full Screen", "menu.undo": "Undo", + "menu.unread": "Unread", "menu.view": "View", "menu.window": "Window", "menu.zenMode": "Zen Mode", diff --git a/locales/native/zh-CN.json b/locales/native/zh-CN.json index d205d52f0..b4d9e0b72 100644 --- a/locales/native/zh-CN.json +++ b/locales/native/zh-CN.json @@ -65,6 +65,7 @@ "menu.toggleDevTools": "切换开发者工具", "menu.toggleFullScreen": "切换全屏", "menu.undo": "撤销", + "menu.unread": "未读", "menu.view": "视图", "menu.window": "窗口", "menu.zenMode": "禅定模式", diff --git a/locales/settings/en.json b/locales/settings/en.json index 14cc4abe2..633110d13 100644 --- a/locales/settings/en.json +++ b/locales/settings/en.json @@ -38,7 +38,7 @@ "actions.action_card.operation_options.matches_regex": "matches regex", "actions.action_card.operator": "Operator", "actions.action_card.or": "Or", - "actions.action_card.rewrite_rules": "Rewrite Rules", + "actions.action_card.rewrite_rules": "Rewrite rules", "actions.action_card.silence": "Silence", "actions.action_card.source_content": "View source content", "actions.action_card.then_do": "Then do…", @@ -192,7 +192,7 @@ "general.minimize_to_tray.description": "Minimize to system tray when closing window", "general.minimize_to_tray.label": "Minimize to tray", "general.network": "Network", - "general.open_links_in_app.label": "Open links in app", + "general.open_links_in_external_app.label": "Open links in external app", "general.privacy": "Privacy", "general.proxy.description": "Set proxy for network traffic routing, e.g., socks://proxy.example.com:1080", "general.proxy.label": "Proxy", @@ -259,6 +259,7 @@ "integration.readwise.title": "Readwise", "integration.readwise.token.description": "You can get it here: ", "integration.readwise.token.label": "Readwise Access Token", + "integration.save_ai_summary_as_description.label": "Save AI Summary as description", "integration.sidebar_title": "Integration", "integration.tip": "Tip: Your sensitive data is stored locally and is not uploaded to the server.", "integration.title": "Integration", @@ -378,6 +379,9 @@ "rsshub.add_new_instance": "Add New Instance", "rsshub.description": "RSSHub is a community-driven open-source RSS network. Folo provides a built-in dedicated instance and uses it to support thousands of subscription contents, you can also achieve more stable content acquisition by using your own or third-party instances.", "rsshub.public_instances": "Available Instances", + "rsshub.table.delete.confirm": "Are you sure you want to delete this instance?", + "rsshub.table.delete.label": "Delete", + "rsshub.table.delete.success": "Instance deleted successfully.", "rsshub.table.description": "Description", "rsshub.table.edit": "Edit", "rsshub.table.inuse": "In Use", diff --git a/locales/settings/zh-CN.json b/locales/settings/zh-CN.json index 818f6d778..fe9ef5b43 100644 --- a/locales/settings/zh-CN.json +++ b/locales/settings/zh-CN.json @@ -161,8 +161,8 @@ "general.data_persist.description": "在本地保留数据以启用离线访问和本地搜索。", "general.data_persist.label": "保留数据以供离线使用", "general.enhanced.description": "启用增强设置可提供更多自定义选项,但也可能引发不可预见的问题。", - "general.enhanced.disabled.tip": "增强设置已停用,你可以在「常规」设置的「高级」选项中将其启用。", - "general.enhanced.enabled.tip": "增强设置已启用,你可以在「常规」设置的「高级」选项中将其停用。", + "general.enhanced.disabled.tip": "增强设置已停用,你可以在「通用」设置的「高级」选项中将其启用。", + "general.enhanced.enabled.tip": "增强设置已启用,你可以在「通用」设置的「高级」选项中将其停用。", "general.enhanced.label": "增强设置", "general.export.button": "导出", "general.export.description": "将你的订阅源导出到 OPML 文件。", @@ -192,7 +192,7 @@ "general.minimize_to_tray.description": "关闭窗口时最小化到系统托盘。", "general.minimize_to_tray.label": "最小化到托盘", "general.network": "网络", - "general.open_links_in_app.label": "在应用内打开链接", + "general.open_links_in_external_app.label": "在外部应用内打开链接", "general.privacy": "隐私", "general.proxy.description": "代理网络请求,例如:socks://proxy.example.com:1080", "general.proxy.label": "代理", @@ -259,6 +259,7 @@ "integration.readwise.title": "Readwise", "integration.readwise.token.description": "在这里获取令牌", "integration.readwise.token.label": "Readwise 访问令牌", + "integration.save_ai_summary_as_description.label": "将 AI 总结保存为描述", "integration.sidebar_title": "第三方接入", "integration.tip": "提示:敏感数据仅在本地存储,不会被收集或上传到云端。", "integration.title": "第三方接入", @@ -329,7 +330,10 @@ "profile.current_password.label": "当前密码", "profile.danger_zone": "危险区", "profile.delete_account.label": "注销账户", + "profile.edit_email": "编辑邮件地址", + "profile.edit_profile": "编辑个人资料", "profile.email.change": "更改邮件地址", + "profile.email.change_note": "如需更改邮件地址,请先验证你的新邮件地址。", "profile.email.changed": "邮件地址已更改。", "profile.email.changed_verification_sent": "已发送验证新邮件地址的邮件。", "profile.email.label": "邮件地址", @@ -338,6 +342,7 @@ "profile.email.verification_sent": "验证邮件已发送。", "profile.email.verified": "已验证", "profile.email.verify_email": "请验证你的邮件地址 ({{email_address}}) 以继续。", + "profile.email.verify_status": "你的邮件地址{{status}}", "profile.handle.description": "你的唯一标识。", "profile.handle.label": "唯一标识", "profile.link_social.authentication": "身份验证", @@ -374,6 +379,9 @@ "rsshub.add_new_instance": "添加新实例", "rsshub.description": "RSSHub 是由社区驱动的开源 RSS 网络。Folo 提供了内建的专用实例来支持数以千计的订阅内容,你也可以通过使用自己的或第三方的实例来实现更稳定的内容获取。", "rsshub.public_instances": "实例", + "rsshub.table.delete.confirm": "确定要删除此实例吗?", + "rsshub.table.delete.label": "删除", + "rsshub.table.delete.success": "实例删除成功。", "rsshub.table.description": "描述", "rsshub.table.edit": "编辑", "rsshub.table.inuse": "使用中", diff --git a/locales/settings/zh-TW.json b/locales/settings/zh-TW.json index a65911957..5d63cb220 100644 --- a/locales/settings/zh-TW.json +++ b/locales/settings/zh-TW.json @@ -47,6 +47,14 @@ "actions.action_card.value": "值", "actions.action_card.webhooks": "Webhooks", "actions.action_card.when_feeds_match": "當 RSS 摘要匹配時…", + "actions.condition": "條件", + "actions.conditions": "條件", + "actions.edit_condition": "編輯條件", + "actions.edit_rewrite_rule": "編輯覆寫規則", + "actions.edit_rule": "編輯規則", + "actions.edit_webhook": "編輯 Webhook", + "actions.info": "自動化操作是您可以自動化以在伺服器或客戶端執行任務的規則集合。", + "actions.navigate.prompt": "您有未儲存的自動化操作變更。您確定要離開嗎?", "actions.newRule": "新增規則", "actions.save": "儲存", "actions.saveSuccess": "🎉 規則已儲存", @@ -89,6 +97,7 @@ "appearance.save": "儲存", "appearance.sidebar": "側邊欄", "appearance.sidebar_title": "外觀", + "appearance.subscriptions": "訂閱", "appearance.text_size.default": "預設", "appearance.text_size.label": "介面字體大小", "appearance.text_size.large": "大", @@ -121,25 +130,40 @@ "data_control.app_cache_limit.description": "程式快取大小的上限。一旦快取達到此上限,最早的項目將被刪除以釋放空間。", "data_control.app_cache_limit.label": "程式快取限制", "data_control.clean_cache.button": "清理快取", + "data_control.clean_cache.cancel": "取消", + "data_control.clean_cache.clear": "清理", "data_control.clean_cache.description": "清理程式快取以釋放空間。", "data_control.clean_cache.description_web": "清理網頁應用服務快取以釋放空間。", + "data_control.data_sources": "資料來源", + "data_control.export_local_database.label": "匯出本地資料庫", + "data_control.import_opml.label": "從 OPML 匯入訂閱", + "data_control.utils": "工具", "feeds.claimTips": "要認領您的 RSS 摘要並接收贊助,請在您的訂閱列表中右鍵點擊該 RSS 摘要,然後選擇「認領」。", "feeds.noFeeds": "沒有已認領的 RSS 摘要", "feeds.tableHeaders.name": "名稱", "feeds.tableHeaders.subscriptionCount": "訂閱數", "feeds.tableHeaders.tipAmount": "收到的贊助", + "general.action.summary": "AI 總結", + "general.action.title": "自動化操作", + "general.action.translation": "AI 翻譯", "general.action_language.default": "預設(介面語言)", - "general.action_language.label": "自動化語言", + "general.action_language.label": "自動化翻譯語言", + "general.advanced": "進階", "general.app": "App", "general.auto_expand_long_social_media.description": "自動擴展包含長文字的社群媒體條目。", "general.auto_expand_long_social_media.label": "拓展長社群媒體", "general.auto_group.description": "自動依照網址域名分類 RSS 摘要。", "general.auto_group.label": "自動分類", "general.cache": "快取", + "general.content": "內容", "general.data": "資料", "general.data_file.label": "資料檔案", "general.data_persist.description": "本機儲存資料以啟用離線瀏覽和離線搜尋。", - "general.data_persist.label": "離線時儲存資料", + "general.data_persist.label": "儲存資料以供離線使用", + "general.enhanced.description": "啟用增強設定可提供更多自訂選項,但也可能引入不可預見的問題。", + "general.enhanced.disabled.tip": "增強設定已停用,您可以在「一般設定 - 進階」中啟用。", + "general.enhanced.enabled.tip": "增強設定已啟用,您可以在「一般設定 - 進階」中停用。", + "general.enhanced.label": "增強設定", "general.export.button": "匯出", "general.export.description": "匯出你的訂閱到 OPML 文件。", "general.export.folder_mode.description": "決定您想要如何組織匯出資料夾。", @@ -168,10 +192,12 @@ "general.minimize_to_tray.description": "關閉視窗時最小化到工作列通知區域", "general.minimize_to_tray.label": "最小化到通知區域", "general.network": "網路", + "general.open_links_in_external_app.label": "在外部 app 開啟連結", "general.privacy": "隱私", "general.proxy.description": "設定 Proxy 伺服器來處理網路流量,例如:socks://proxy.example.com:1080", "general.proxy.label": "Proxy 伺服器", "general.rebuild_database.button": "重置", + "general.rebuild_database.cancel": "取消", "general.rebuild_database.description": "如果您遇到渲染問題,重置資料庫可能可以解決。", "general.rebuild_database.label": "重置資料庫", "general.rebuild_database.title": "重置資料庫", @@ -188,15 +214,23 @@ "general.startup_screen.subscription": "訂閱", "general.startup_screen.timeline": "時間軸", "general.startup_screen.title": "開始畫面", + "general.subscriptions": "訂閱", "general.timeline": "時間軸", "general.unread": "未讀", "general.voices": "聲音", + "integration.cubox.autoMemo.description": "當選取文字儲存到 Cubox 時,自動使用備忘模式。", + "integration.cubox.autoMemo.label": "自動備忘模式", + "integration.cubox.enable.description": "顯示「儲存到 Cubox」按鈕(如果可用)。", + "integration.cubox.enable.label": "啟用", + "integration.cubox.title": "Cubox", + "integration.cubox.token.description": "請輸入完整的 Cubox API URL,格式為:https://cubox.pro/c/api/save/xxxxxxxxx。您可以在此處獲取:", + "integration.cubox.token.label": "Cubox API 網址", "integration.eagle.enable.description": "顯示「將媒體儲存到 Eagle」按鈕(如果可用)。", "integration.eagle.enable.label": "啟用", "integration.eagle.title": "Eagle", "integration.instapaper.enable.description": "顯示「儲存到 Instapaper」按钮(如果可用)。", "integration.instapaper.enable.label": "啟用", - "integration.instapaper.password.label": "密碼", + "integration.instapaper.password.label": "Instapaper 密碼", "integration.instapaper.title": "Instapaper", "integration.instapaper.username.label": "Instapaper 使用者", "integration.obsidian.enable.description": "顯示「儲存到 Obsidian」按鈕(如果可用)", @@ -206,17 +240,17 @@ "integration.obsidian.vaultPath.label": "Obsidian 儲存庫路徑", "integration.outline.collection.description": "儲存文檔的文檔集的 UUID 或 urlId", "integration.outline.collection.label": "Outline 文檔集", - "integration.outline.enable.description": "顯示\"儲存到 Outline\"按鈕(如果可用)", + "integration.outline.enable.description": "顯示'儲存到 Outline'按鈕(如果可用)", "integration.outline.enable.label": "啟用", - "integration.outline.endpoint.description": "此網址為 \"https://<你的 OUTLINE 域名>/api\"", - "integration.outline.endpoint.label": "Outline 端口網址", + "integration.outline.endpoint.description": "此網址為 'https://<你的 OUTLINE 域名>/api'。", + "integration.outline.endpoint.label": "Outline API 基礎網址", "integration.outline.title": "Outline", "integration.outline.token.description": "在你的 Outline 帳戶設置中獲取", "integration.outline.token.label": "Outline API 密鑰", "integration.readeck.enable.description": "顯示\"儲存到 Readeck\"按鈕(如果可用)", "integration.readeck.enable.label": "啟用", - "integration.readeck.endpoint.description": "此網址為 \"https://<你的 READECK 域名>\"", - "integration.readeck.endpoint.label": "Readeck 端口網址", + "integration.readeck.endpoint.description": "此網址為 'https://<你的 READECK 域名>'", + "integration.readeck.endpoint.label": "Readeck API 基礎網址", "integration.readeck.title": "Readeck", "integration.readeck.token.description": "在你的 Readeck 帳戶設置中獲取", "integration.readeck.token.label": "Readeck API 密鑰", @@ -224,7 +258,7 @@ "integration.readwise.enable.label": "啟用", "integration.readwise.title": "Readwise", "integration.readwise.token.description": "您可以在這裡取得 Token", - "integration.readwise.token.label": "Readwise Token", + "integration.readwise.token.label": "Readwise 存取密鑰", "integration.sidebar_title": "整合功能", "integration.tip": "提示:您的敏感資料儲存於本機,不會上傳到伺服器。", "integration.title": "整合功能", @@ -237,8 +271,10 @@ "invitation.confirmModal.continue": "繼續", "invitation.confirmModal.message": "產生邀請碼將會花費您 {{INVITATION_PRICE}} Power。", "invitation.confirmModal.title": "確認", + "invitation.created_at": "建立者:", "invitation.earlyAccess": "Folo 目前處於早期開發狀態,需要邀請碼才能使用。", "invitation.earlyAccessMessage": "😰 抱歉,關注目前處於搶先體驗階段,需要邀請碼才能使用。", + "invitation.generate": "產生", "invitation.generateButton": "產生邀請碼", "invitation.generateCost": "您可以花費 {{INVITATION_PRICE}} Power 為您的朋友產生邀請碼。", "invitation.getCodeMessage": "您可以通過以下方式獲取邀請碼:", @@ -279,16 +315,24 @@ "lists.feeds.title": "標題", "lists.image": "圖片", "lists.info": "列表是您可以分享或出售給他人訂閱的 RSS 摘要集合。訂閱者將同步並訪問列表中的所有 RSS 摘要。", + "lists.manage_list": "管理列表", "lists.noLists": "沒有列表", + "lists.select_feeds": "選擇要新增到當前列表的 RSS 摘要", "lists.submit": "送出", "lists.subscriptions": "訂閱", "lists.title": "標題", "lists.view": "查看", + "privacy.terms": "條款", "profile.avatar.label": "頭像", "profile.change_password.label": "修改密碼", "profile.confirm_password.label": "確認密碼", "profile.current_password.label": "目前密碼", + "profile.danger_zone": "危險操作區域", + "profile.delete_account.label": "刪除帳號", + "profile.edit_email": "編輯電子信箱", + "profile.edit_profile": "編輯個人資料", "profile.email.change": "變更電子信箱", + "profile.email.change_note": "如果你想更改電子信箱,應該驗證你的新電子信箱。", "profile.email.changed": "電子信箱已變更。", "profile.email.changed_verification_sent": "已發送驗證新電子信箱的信件。", "profile.email.label": "電子信箱", @@ -297,6 +341,7 @@ "profile.email.verification_sent": "驗證信件已發送", "profile.email.verified": "已驗證", "profile.email.verify_email": "請先驗證你的電子信箱 ({{email_address}}) 後繼續。", + "profile.email.verify_status": "你的電子信箱目前狀態為 {{status}}", "profile.handle.description": "你的獨一無二名稱。", "profile.handle.label": "名稱", "profile.link_social.authentication": "驗證", @@ -308,6 +353,8 @@ "profile.no_password": "重設密碼以設定新密碼。", "profile.password.label": "密碼", "profile.reset_password_mail_sent": "重設密碼信件已發送。", + "profile.security": "安全性", + "profile.set_avatar": "設定頭像", "profile.sidebar_title": "個人資料", "profile.submit": "送出", "profile.title": "個人資料設定", diff --git a/package.json b/package.json index 9557a90a8..b6373c1e3 100644 --- a/package.json +++ b/package.json @@ -36,14 +36,14 @@ "@eslint/compat": "1.2.8", "@iconify-json/logos": "1.2.4", "@iconify-json/mingcute": "1.2.3", - "@iconify-json/simple-icons": "1.2.30", + "@iconify-json/simple-icons": "1.2.32", "@iconify/tools": "4.1.2", "@tailwindcss/container-queries": "0.1.1", "@tailwindcss/typography": "0.5.16", "@tsslint/cli": "1.5.11", "@tsslint/config": "1.5.11", "@tsslint/eslint": "1.5.11", - "@types/node": "22.14.0", + "@types/node": "22.14.1", "@types/react": "18.3.12", "@types/react-dom": "18.3.1", "@vercel/node": "5.1.14", @@ -52,11 +52,11 @@ "cross-env": "7.0.3", "cssnano": "7.0.6", "eslint": "9.24.0", - "eslint-config-hyoban": "4.0.2", + "eslint-config-hyoban": "4.0.3", "eslint-plugin-react-native": "5.0.0", "fast-glob": "3.3.3", - "lint-staged": "15.5.0", - "nbump": "2.0.7", + "lint-staged": "15.5.1", + "nbump": "2.1.0", "postcss": "8.5.3", "postcss-js": "4.0.1", "prettier": "3.5.3", @@ -75,7 +75,7 @@ "tsx": "4.19.3", "turbo": "2.5.0", "typescript": "5.8.3", - "vite": "6.2.5", + "vite": "6.3.2", "vite-bundle-analyzer": "0.18.1", "vite-plugin-mkcert": "1.17.8", "vite-plugin-pwa": "1.0.0", @@ -101,8 +101,8 @@ }, "overrides": { "@electron/node-gyp": "10.2.0-electron.2", - "is-core-module": "npm:@nolyfill/is-core-module@1", - "isarray": "npm:@nolyfill/isarray@1", + "is-core-module": "npm:@nolyfill/is-core-module@1.0.39", + "isarray": "npm:@nolyfill/isarray@1.0.44", "react": "18.3.1", "react-dom": "18.3.1", "unist-util-visit-parents": "5.1.3", diff --git a/packages/atoms/package.json b/packages/atoms/package.json index e225709a8..03c1faa61 100644 --- a/packages/atoms/package.json +++ b/packages/atoms/package.json @@ -19,6 +19,6 @@ "@follow/hooks": "workspace:*", "@follow/types": "workspace:*", "@follow/utils": "workspace:*", - "jotai": "2.12.2" + "jotai": "2.12.3" } } diff --git a/packages/components/package.json b/packages/components/package.json index 077e80b72..1f89c718d 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -26,39 +26,39 @@ "@follow/shared": "workspace:*", "@follow/types": "workspace:*", "@follow/utils": "workspace:*", - "@headlessui/react": "2.2.1", + "@headlessui/react": "2.2.2", "@microflash/remark-callout-directives": "4.4.0", - "@radix-ui/react-avatar": "1.1.3", - "@radix-ui/react-checkbox": "1.1.4", - "@radix-ui/react-context-menu": "2.2.6", - "@radix-ui/react-dialog": "1.1.6", - "@radix-ui/react-dropdown-menu": "2.1.6", - "@radix-ui/react-hover-card": "1.1.6", - "@radix-ui/react-label": "2.1.2", - "@radix-ui/react-navigation-menu": "1.2.5", - "@radix-ui/react-popover": "1.1.6", - "@radix-ui/react-radio-group": "1.2.3", - "@radix-ui/react-scroll-area": "1.2.3", - "@radix-ui/react-select": "2.1.6", - "@radix-ui/react-slider": "1.2.3", - "@radix-ui/react-slot": "1.1.2", - "@radix-ui/react-switch": "1.1.3", - "@radix-ui/react-tabs": "1.1.3", - "@radix-ui/react-toast": "1.2.6", - "@radix-ui/react-tooltip": "1.1.8", + "@radix-ui/react-avatar": "1.1.4", + "@radix-ui/react-checkbox": "1.1.5", + "@radix-ui/react-context-menu": "2.2.7", + "@radix-ui/react-dialog": "1.1.7", + "@radix-ui/react-dropdown-menu": "2.1.7", + "@radix-ui/react-hover-card": "1.1.7", + "@radix-ui/react-label": "2.1.3", + "@radix-ui/react-navigation-menu": "1.2.6", + "@radix-ui/react-popover": "1.1.7", + "@radix-ui/react-radio-group": "1.2.4", + "@radix-ui/react-scroll-area": "1.2.4", + "@radix-ui/react-select": "2.1.7", + "@radix-ui/react-slider": "1.2.4", + "@radix-ui/react-slot": "1.2.0", + "@radix-ui/react-switch": "1.1.4", + "@radix-ui/react-tabs": "1.1.4", + "@radix-ui/react-toast": "1.2.7", + "@radix-ui/react-tooltip": "1.2.0", "@react-hook/window-size": "3.1.1", "@types/hast": "3.0.4", "@types/unist": "3.0.3", "class-variance-authority": "0.7.1", "dayjs": "1.11.13", "foxact": "0.2.45", - "framer-motion": "12.6.3", "hast-util-to-jsx-runtime": "2.3.6", "hast-util-to-text": "4.0.2", "input-otp": "1.4.2", - "jotai": "2.12.2", - "katex": "0.16.21", + "jotai": "2.12.3", + "katex": "0.16.22", "masonic": "4.0.1", + "motion": "12.7.4", "react-blurhash": "0.3.0", "react-fast-marquee": "1.6.5", "react-hook-form": "7.55.0", diff --git a/packages/components/src/common/MotionProvider.tsx b/packages/components/src/common/MotionProvider.tsx index 7eca3d296..898c9a31a 100644 --- a/packages/components/src/common/MotionProvider.tsx +++ b/packages/components/src/common/MotionProvider.tsx @@ -1,4 +1,4 @@ -import { LazyMotion, MotionConfig } from "framer-motion" +import { LazyMotion, MotionConfig } from "motion/react" const loadFeatures = () => import("../framer-lazy-feature").then((res) => res.default) export const MotionProvider = ({ children }: { children: React.ReactNode }) => { diff --git a/packages/components/src/framer-lazy-feature.ts b/packages/components/src/framer-lazy-feature.ts index b61a58f03..1c2a9c1d8 100644 --- a/packages/components/src/framer-lazy-feature.ts +++ b/packages/components/src/framer-lazy-feature.ts @@ -1 +1 @@ -export { domMax as default } from "framer-motion" +export { domMax as default } from "motion/react" diff --git a/packages/components/src/ui/auto-resize-height/index.tsx b/packages/components/src/ui/auto-resize-height/index.tsx index cd56382dd..bd8112009 100644 --- a/packages/components/src/ui/auto-resize-height/index.tsx +++ b/packages/components/src/ui/auto-resize-height/index.tsx @@ -1,6 +1,6 @@ import { cn } from "@follow/utils/utils" -import type { Spring } from "framer-motion" -import { m } from "framer-motion" +import type { Spring } from "motion/react" +import { m } from "motion/react" import { useEffect, useRef, useState } from "react" const softSpringPreset: Spring = { diff --git a/packages/components/src/ui/button/action-button.tsx b/packages/components/src/ui/button/action-button.tsx index d951c9b77..9c77b88b9 100644 --- a/packages/components/src/ui/button/action-button.tsx +++ b/packages/components/src/ui/button/action-button.tsx @@ -7,12 +7,13 @@ import type { Options } from "react-hotkeys-hook" import { useHotkeys } from "react-hotkeys-hook" import { KbdCombined } from "../kbd/Kbd" -import { Tooltip, TooltipContent, TooltipPortal, TooltipTrigger } from "../tooltip" +import { Tooltip, TooltipContent, TooltipPortal, TooltipRoot, TooltipTrigger } from "../tooltip" export interface ActionButtonProps { icon?: React.ReactNode | ((props: { isActive?: boolean; className: string }) => React.ReactNode) tooltip?: React.ReactNode tooltipSide?: "top" | "bottom" + tooltipDefaultOpen?: boolean active?: boolean disabled?: boolean clickableDisabled?: boolean @@ -20,6 +21,7 @@ export interface ActionButtonProps { disableTriggerShortcut?: boolean enableHoverableContent?: boolean size?: "sm" | "base" | "lg" + id?: string /** * @description only trigger shortcut when focus with in `` @@ -43,10 +45,11 @@ export const ActionButton = React.forwardRef< ( { icon, - + id, tooltip, className, tooltipSide, + tooltipDefaultOpen, children, active, shortcut, @@ -126,19 +129,24 @@ export const ActionButton = React.forwardRef< )} {tooltip ? ( - - {Trigger} - - - - {tooltip} - {!!finalShortcut && ( -
- {finalShortcut} -
- )} -
-
+ + + {Trigger} + + + + {tooltip} + {!!finalShortcut && ( +
+ {finalShortcut} +
+ )} +
+
+
) : ( Trigger diff --git a/packages/components/src/ui/button/index.tsx b/packages/components/src/ui/button/index.tsx index d0f47c716..743ae287c 100644 --- a/packages/components/src/ui/button/index.tsx +++ b/packages/components/src/ui/button/index.tsx @@ -2,8 +2,8 @@ import { useMobile } from "@follow/components/hooks/useMobile.js" import { LoadingCircle } from "@follow/components/ui/loading/index.jsx" import { cn } from "@follow/utils/utils" import type { VariantProps } from "class-variance-authority" -import type { HTMLMotionProps } from "framer-motion" -import { m } from "framer-motion" +import type { HTMLMotionProps } from "motion/react" +import { m } from "motion/react" import * as React from "react" import { styledButtonVariant } from "./variants" diff --git a/packages/components/src/ui/feed-icon/index.tsx b/packages/components/src/ui/feed-icon/index.tsx index bc8d2c79d..ec2195cbb 100644 --- a/packages/components/src/ui/feed-icon/index.tsx +++ b/packages/components/src/ui/feed-icon/index.tsx @@ -3,7 +3,7 @@ import { getColorScheme, stringToHue } from "@follow/utils/color" import { getImageProxyUrl } from "@follow/utils/img-proxy" import { cn } from "@follow/utils/utils" import { Avatar, AvatarFallback, AvatarImage } from "@radix-ui/react-avatar" -import { m } from "framer-motion" +import { m } from "motion/react" import type { ReactNode } from "react" import { forwardRef, useMemo } from "react" diff --git a/packages/components/src/ui/input/TextArea.tsx b/packages/components/src/ui/input/TextArea.tsx index 85a383e10..e15c33dd4 100644 --- a/packages/components/src/ui/input/TextArea.tsx +++ b/packages/components/src/ui/input/TextArea.tsx @@ -2,7 +2,7 @@ import { useInputComposition } from "@follow/hooks" import { stopPropagation } from "@follow/utils/dom" import { cn } from "@follow/utils/utils" import clsx from "clsx" -import { useMotionValue } from "framer-motion" +import { useMotionValue } from "motion/react" import type { DetailedHTMLProps, PropsWithChildren, TextareaHTMLAttributes } from "react" import { forwardRef, useCallback, useState } from "react" diff --git a/packages/components/src/ui/loading/index.tsx b/packages/components/src/ui/loading/index.tsx index b13b0cd17..4cff455a6 100644 --- a/packages/components/src/ui/loading/index.tsx +++ b/packages/components/src/ui/loading/index.tsx @@ -1,5 +1,5 @@ import { cn } from "@follow/utils/utils" -import { m, useAnimation } from "framer-motion" +import { m, useAnimation } from "motion/react" import * as React from "react" import { cloneElement, useEffect } from "react" diff --git a/packages/components/src/ui/masonry/index.tsx b/packages/components/src/ui/masonry/index.tsx index e9d1e161d..91bf5ad56 100644 --- a/packages/components/src/ui/masonry/index.tsx +++ b/packages/components/src/ui/masonry/index.tsx @@ -2,9 +2,9 @@ import { clearRequestTimeout, requestTimeout } from "@essentials/request-timeout" import { useWindowSize } from "@react-hook/window-size" import { isEqual, throttle } from "es-toolkit/compat" -import { useForceUpdate } from "framer-motion" import type { ContainerPosition, MasonryProps, MasonryScrollerProps, Positioner } from "masonic" import { createResizeObserver, useMasonry, usePositioner, useScrollToIndex } from "masonic" +import { useForceUpdate } from "motion/react" import * as React from "react" import { useScrollViewElement } from "../scroll-area/hooks.js" diff --git a/packages/components/src/ui/segment/index.tsx b/packages/components/src/ui/segment/index.tsx index 309e11e0e..6e4eee232 100644 --- a/packages/components/src/ui/segment/index.tsx +++ b/packages/components/src/ui/segment/index.tsx @@ -1,5 +1,5 @@ import { cn } from "@follow/utils/utils" -import { m } from "framer-motion" +import { m } from "motion/react" import type { ReactNode } from "react" import { useId, useMemo, useState } from "react" import { useContextSelector } from "use-context-selector" diff --git a/packages/components/src/ui/tooltip/index.tsx b/packages/components/src/ui/tooltip/index.tsx index 3b8a87e9f..edb13733f 100644 --- a/packages/components/src/ui/tooltip/index.tsx +++ b/packages/components/src/ui/tooltip/index.tsx @@ -1,11 +1,12 @@ import { cn } from "@follow/utils/utils" import * as TooltipPrimitive from "@radix-ui/react-tooltip" -import { m } from "framer-motion" +import { m } from "motion/react" import * as React from "react" import { tooltipStyle } from "./styles" const TooltipProvider = TooltipPrimitive.Provider +const TooltipRoot = TooltipPrimitive.Root const Tooltip: typeof TooltipProvider = ({ children, ...props }) => ( @@ -45,6 +46,6 @@ const TooltipContent = React.forwardRef< )) TooltipContent.displayName = TooltipPrimitive.Content.displayName -export { Tooltip, TooltipContent, TooltipTrigger } +export { Tooltip, TooltipContent, TooltipRoot, TooltipTrigger } export { RootPortal as TooltipPortal } from "../portal" diff --git a/packages/constants/src/rsshub.ts b/packages/constants/src/rsshub.ts index 0646af072..d67b769a6 100644 --- a/packages/constants/src/rsshub.ts +++ b/packages/constants/src/rsshub.ts @@ -23,3 +23,32 @@ export const RSSHubCategories = [ "journal", "finance", ] as const + +export const CategoryMap: Record< + (typeof RSSHubCategories)[number], + { fromColor: string; toColor: string; emoji: string } +> = { + all: { fromColor: "#E6C07B", toColor: "#FFCA28", emoji: "⭐️" }, + "social-media": { fromColor: "#A0C4FF", toColor: "#42A5F5", emoji: "💬" }, + "new-media": { fromColor: "#FFB4A2", toColor: "#FF7043", emoji: "📣" }, + "traditional-media": { fromColor: "#C0C0C0", toColor: "#BDBDBD", emoji: "📰" }, + bbs: { fromColor: "#FFD6A5", toColor: "#FFB74D", emoji: "💭" }, + blog: { fromColor: "#CAA6E9", toColor: "#AB47BC", emoji: "✍️" }, + programming: { fromColor: "#A8E6CF", toColor: "#66BB6A", emoji: "💻" }, + design: { fromColor: "#FFB7CE", toColor: "#EC407A", emoji: "🎨" }, + live: { fromColor: "#E07A5F", toColor: "#EF5350", emoji: "📺" }, + multimedia: { fromColor: "#FFE5D4", toColor: "#FF8A65", emoji: "🎞️" }, + picture: { fromColor: "#B2DBBF", toColor: "#26A69A", emoji: "🖼️" }, + anime: { fromColor: "#FFCAD4", toColor: "#F06292", emoji: "🌸" }, + "program-update": { fromColor: "#C2CAD0", toColor: "#78909C", emoji: "🔄" }, + university: { fromColor: "#9DB4C0", toColor: "#5C6BC0", emoji: "🎓" }, + forecast: { fromColor: "#A2D2FF", toColor: "#4FC3F7", emoji: "⛅️" }, + travel: { fromColor: "#BDE0FE", toColor: "#4DD0E1", emoji: "✈️" }, + shopping: { fromColor: "#FFADAD", toColor: "#F48FB1", emoji: "🛍️" }, + game: { fromColor: "#BDB2FF", toColor: "#7E57C2", emoji: "🎮" }, + reading: { fromColor: "#DDBEA9", toColor: "#8D6E63", emoji: "📖" }, + government: { fromColor: "#C4C4C4", toColor: "#90A4AE", emoji: "🏛️" }, + study: { fromColor: "#FFE5A0", toColor: "#FFD54F", emoji: "📚" }, + journal: { fromColor: "#D9BF77", toColor: "#A1887F", emoji: "📓" }, + finance: { fromColor: "#A8C686", toColor: "#81C784", emoji: "💰" }, +} diff --git a/packages/hooks/package.json b/packages/hooks/package.json index 6e8756a71..b876b76a0 100644 --- a/packages/hooks/package.json +++ b/packages/hooks/package.json @@ -17,7 +17,7 @@ "@follow/types": "workspace:*", "@follow/utils": "workspace:*", "foxact": "0.2.45", - "jotai": "2.12.2", + "jotai": "2.12.3", "usehooks-ts": "3.1.1" } } diff --git a/packages/models/package.json b/packages/models/package.json index 92afb4bfe..00325bd13 100644 --- a/packages/models/package.json +++ b/packages/models/package.json @@ -24,6 +24,6 @@ "@follow/shared": "workspace:*", "@follow/types": "workspace:*", "@follow/utils": "workspace:*", - "hono": "4.7.5" + "hono": "4.7.6" } } diff --git a/packages/shared/exports.ts b/packages/shared/exports.ts index a5bb77cb4..d22a48456 100644 --- a/packages/shared/exports.ts +++ b/packages/shared/exports.ts @@ -1,5 +1,4 @@ export * from "./src/bridge" -export * from "./src/env" export { type AppType } from "./src/hono" export * from "./src/hono" export * from "./src/language" diff --git a/packages/shared/package.json b/packages/shared/package.json index f6fdfa706..3003b52c5 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -34,12 +34,12 @@ "dependencies": { "@electron-toolkit/preload": "3.0.1", "@electron-toolkit/tsconfig": "1.0.1", - "@hono/node-server": "1.14.0", + "@hono/node-server": "1.14.1", "@t3-oss/env-core": "0.12.0", - "better-auth": "1.2.6-beta.2", - "drizzle-orm": "0.41.0", - "hono": "4.7.5", + "better-auth": "1.2.7", + "drizzle-orm": "0.42.0", + "hono": "4.7.6", "sonner": "2.0.3", - "zod": "3.24.2" + "zod": "3.24.3" } } diff --git a/packages/shared/src/auth.ts b/packages/shared/src/auth.ts new file mode 100644 index 000000000..6031654e4 --- /dev/null +++ b/packages/shared/src/auth.ts @@ -0,0 +1,81 @@ +import { IN_ELECTRON } from "@follow/shared" +import type { authPlugins } from "@follow/shared/hono" +import type { BetterAuthClientPlugin } from "better-auth/client" +import { inferAdditionalFields, twoFactorClient } from "better-auth/client/plugins" +import { createAuthClient } from "better-auth/react" + +type AuthPlugin = (typeof authPlugins)[number] +const serverPlugins = [ + { + id: "customGetProviders", + $InferServerPlugin: {} as Extract, + }, + { + id: "getAccountInfo", + $InferServerPlugin: {} as Extract, + }, + { + id: "oneTimeToken", + $InferServerPlugin: {} as Extract, + }, + inferAdditionalFields({ + user: { + handle: { + type: "string", + required: false, + }, + }, + }), +] satisfies BetterAuthClientPlugin[] +const plugins = [...serverPlugins, twoFactorClient()] + +export type LoginRuntime = "browser" | "app" + +export class Auth { + authClient: ReturnType< + typeof createAuthClient<{ + baseURL: string + plugins: typeof plugins + }> + > + + constructor( + private readonly options: { + apiURL: string + webURL: string + }, + ) { + this.authClient = createAuthClient({ + baseURL: `${this.options.apiURL}/better-auth`, + plugins, + }) + } + + loginHandler = async ( + provider: string, + runtime?: LoginRuntime, + args?: { + email?: string + password?: string + headers?: Record + }, + ) => { + const { email, password, headers } = args ?? {} + if (IN_ELECTRON && provider !== "credential") { + window.open(`${this.options.webURL}/login?provider=${provider}`) + } else { + if (provider === "credential") { + if (!email || !password) { + window.location.href = "/login" + return + } + return this.authClient.signIn.email({ email, password }, { headers }) + } + + this.authClient.signIn.social({ + provider: provider as "google" | "github" | "apple", + callbackURL: runtime === "app" ? `${this.options.webURL}/login` : this.options.webURL, + }) + } + } +} diff --git a/packages/shared/src/bridge.ts b/packages/shared/src/bridge.ts index a2e6af40a..ec49de605 100644 --- a/packages/shared/src/bridge.ts +++ b/packages/shared/src/bridge.ts @@ -48,6 +48,7 @@ interface RenderGlobalContext { // user data clearIfLoginOtherAccount: (newUserId: string) => void + applyOneTimeToken: (token: string) => void /// Utils toast: typeof toast diff --git a/packages/shared/src/env.common.ts b/packages/shared/src/env.common.ts new file mode 100644 index 000000000..786fb5399 --- /dev/null +++ b/packages/shared/src/env.common.ts @@ -0,0 +1,23 @@ +export const DEFAULT_VALUES = { + PROD: { + API_URL: "https://api.follow.is", + WEB_URL: "https://app.follow.is", + INBOXES_EMAIL: "@follow.re", + OPENPANEL_CLIENT_ID: "4382168f-b8d2-40c1-9a26-133a312d072b", + OPENPANEL_API_URL: "https://openpanel.follow.is/api", + RECAPTCHA_V2_SITE_KEY: "6LdxQ-sqAAAAAN-_za3hUdFkJEO_cu2xHSpLKVan", + RECAPTCHA_V3_SITE_KEY: "6LdG-asqAAAAAEXr96565MKbRvxGEv31XEykRSHV", + }, + DEV: { + API_URL: "https://api.dev.follow.is", + WEB_URL: "https://dev.follow.is", + INBOXES_EMAIL: "__dev@follow.re", + }, + STAGING: { + API_URL: "https://api.follow.is", + WEB_URL: "https://staging.follow.is", + INBOXES_EMAIL: "@follow.re", + OPENPANEL_CLIENT_ID: "4382168f-b8d2-40c1-9a26-133a312d072b", + OPENPANEL_API_URL: "https://openpanel.follow.is/api", + }, +} diff --git a/packages/shared/src/env.desktop.ts b/packages/shared/src/env.desktop.ts index dfeef9ced..6766b80b4 100644 --- a/packages/shared/src/env.desktop.ts +++ b/packages/shared/src/env.desktop.ts @@ -4,21 +4,23 @@ import { createEnv } from "@t3-oss/env-core" import { z } from "zod" +import { DEFAULT_VALUES } from "./env.common" + export const env = createEnv({ clientPrefix: "VITE_", client: { - VITE_WEB_URL: z.string().url().default("https://app.follow.is"), - VITE_API_URL: z.string(), + VITE_WEB_URL: z.string().url().default(DEFAULT_VALUES.PROD.WEB_URL), + VITE_API_URL: z.string().default(DEFAULT_VALUES.PROD.API_URL), VITE_DEV_PROXY: z.string().optional(), VITE_SENTRY_DSN: z.string().optional(), - VITE_INBOXES_EMAIL: z.string().default("@follow.re"), + VITE_INBOXES_EMAIL: z.string().default(DEFAULT_VALUES.PROD.INBOXES_EMAIL), VITE_FIREBASE_CONFIG: z.string().optional(), VITE_OPENPANEL_CLIENT_ID: z.string().optional(), VITE_OPENPANEL_API_URL: z.string().url().optional(), - VITE_RECAPTCHA_V2_SITE_KEY: z.string().default("6LdxQ-sqAAAAAN-_za3hUdFkJEO_cu2xHSpLKVan"), - VITE_RECAPTCHA_V3_SITE_KEY: z.string().default("6LdG-asqAAAAAEXr96565MKbRvxGEv31XEykRSHV"), + VITE_RECAPTCHA_V2_SITE_KEY: z.string().default(DEFAULT_VALUES.PROD.RECAPTCHA_V2_SITE_KEY), + VITE_RECAPTCHA_V3_SITE_KEY: z.string().default(DEFAULT_VALUES.PROD.RECAPTCHA_V3_SITE_KEY), }, emptyStringAsUndefined: true, diff --git a/packages/shared/src/env.rn.ts b/packages/shared/src/env.rn.ts index 00fefe392..1cd5f6c04 100644 --- a/packages/shared/src/env.rn.ts +++ b/packages/shared/src/env.rn.ts @@ -1,27 +1,29 @@ /** * This env for apps/mobile */ +import { DEFAULT_VALUES } from "./env.common" + const profile = "prod" const envProfileMap = { prod: { - API_URL: "https://api.follow.is", - WEB_URL: "https://app.follow.is", - INBOXES_EMAIL: "@follow.re", - OPENPANEL_CLIENT_ID: "4382168f-b8d2-40c1-9a26-133a312d072b", - OPENPANEL_API_URL: "https://openpanel.follow.is/api", + API_URL: DEFAULT_VALUES.PROD.API_URL, + WEB_URL: DEFAULT_VALUES.PROD.WEB_URL, + INBOXES_EMAIL: DEFAULT_VALUES.PROD.INBOXES_EMAIL, + OPENPANEL_CLIENT_ID: DEFAULT_VALUES.PROD.OPENPANEL_CLIENT_ID, + OPENPANEL_API_URL: DEFAULT_VALUES.PROD.OPENPANEL_API_URL, }, dev: { - API_URL: "https://api.dev.follow.is", - WEB_URL: "https://dev.follow.is", - INBOXES_EMAIL: "__dev@follow.re", + API_URL: DEFAULT_VALUES.DEV.API_URL, + WEB_URL: DEFAULT_VALUES.DEV.WEB_URL, + INBOXES_EMAIL: DEFAULT_VALUES.DEV.INBOXES_EMAIL, }, staging: { - API_URL: "https://api.follow.is", - WEB_URL: "https://staging.follow.is", - INBOXES_EMAIL: "@follow.re", - OPENPANEL_CLIENT_ID: "4382168f-b8d2-40c1-9a26-133a312d072b", - OPENPANEL_API_URL: "https://openpanel.follow.is/api", + API_URL: DEFAULT_VALUES.STAGING.API_URL, + WEB_URL: DEFAULT_VALUES.STAGING.WEB_URL, + INBOXES_EMAIL: DEFAULT_VALUES.STAGING.INBOXES_EMAIL, + OPENPANEL_CLIENT_ID: DEFAULT_VALUES.STAGING.OPENPANEL_CLIENT_ID, + OPENPANEL_API_URL: DEFAULT_VALUES.STAGING.OPENPANEL_API_URL, }, } export const getEnvProfiles__dangerously = () => envProfileMap diff --git a/packages/shared/src/env.ssr.ts b/packages/shared/src/env.ssr.ts new file mode 100644 index 000000000..484067872 --- /dev/null +++ b/packages/shared/src/env.ssr.ts @@ -0,0 +1,56 @@ +/** + * This env for apps/ssr + */ +import { createEnv } from "@t3-oss/env-core" +import { z } from "zod" + +import { DEFAULT_VALUES } from "./env.common" + +export const env = createEnv({ + clientPrefix: "VITE_", + client: { + VITE_WEB_URL: z.string().url().default(DEFAULT_VALUES.PROD.WEB_URL), + VITE_API_URL: z.string().default(DEFAULT_VALUES.PROD.API_URL), + VITE_DEV_PROXY: z.string().optional(), + VITE_SENTRY_DSN: z.string().optional(), + VITE_INBOXES_EMAIL: z.string().default(DEFAULT_VALUES.PROD.INBOXES_EMAIL), + VITE_FIREBASE_CONFIG: z.string().optional(), + + VITE_OPENPANEL_CLIENT_ID: z.string().optional(), + VITE_OPENPANEL_API_URL: z.string().url().optional(), + + // For external, use api_url if you don't want to fill it in. + VITE_EXTERNAL_PROD_API_URL: z.string().optional(), + VITE_EXTERNAL_DEV_API_URL: z.string().optional(), + VITE_EXTERNAL_API_URL: z.string().optional(), + VITE_WEB_PROD_URL: z.string().optional(), + VITE_WEB_DEV_URL: z.string().optional(), + + VITE_RECAPTCHA_V2_SITE_KEY: z.string().default(DEFAULT_VALUES.PROD.RECAPTCHA_V2_SITE_KEY), + VITE_RECAPTCHA_V3_SITE_KEY: z.string().default(DEFAULT_VALUES.PROD.RECAPTCHA_V3_SITE_KEY), + }, + + emptyStringAsUndefined: true, + runtimeEnv: getRuntimeEnv() as any, + + skipValidation: "process" in globalThis ? process.env.VITEST === "true" : false, +}) + +function metaEnvIsEmpty() { + try { + return Object.keys(import.meta.env || {}).length === 0 + } catch { + return true + } +} + +function getRuntimeEnv() { + try { + if (metaEnvIsEmpty()) { + return process.env + } + return import.meta.env + } catch { + return process.env + } +} diff --git a/packages/shared/src/env.ts b/packages/shared/src/env.ts deleted file mode 100644 index 35a42343f..000000000 --- a/packages/shared/src/env.ts +++ /dev/null @@ -1,28 +0,0 @@ -/** - * This is universal env - */ -import { z } from "zod" - -export const envSchema = { - VITE_WEB_URL: z.string().url().default("https://app.follow.is"), - VITE_API_URL: z.string().default("https://api.follow.is"), - VITE_DEV_PROXY: z.string().optional(), - VITE_SENTRY_DSN: z.string().optional(), - VITE_INBOXES_EMAIL: z.string().default("@follow.re"), - VITE_FIREBASE_CONFIG: z.string().optional(), - - VITE_OPENPANEL_CLIENT_ID: z.string().optional(), - VITE_OPENPANEL_API_URL: z.string().url().optional(), - - // For external, use api_url if you don't want to fill it in. - VITE_EXTERNAL_PROD_API_URL: z.string().optional(), - VITE_EXTERNAL_DEV_API_URL: z.string().optional(), - VITE_EXTERNAL_API_URL: z.string().optional(), - VITE_WEB_PROD_URL: z.string().optional(), - VITE_WEB_DEV_URL: z.string().optional(), - - VITE_RECAPTCHA_V2_SITE_KEY: z.string().default("6LdxQ-sqAAAAAN-_za3hUdFkJEO_cu2xHSpLKVan"), - VITE_RECAPTCHA_V3_SITE_KEY: z.string().default("6LdG-asqAAAAAEXr96565MKbRvxGEv31XEykRSHV"), -} - -export const env = z.object(envSchema).parse(process.env || {}) diff --git a/packages/shared/src/hono.ts b/packages/shared/src/hono.ts index 39d472e90..c6365760f 100644 --- a/packages/shared/src/hono.ts +++ b/packages/shared/src/hono.ts @@ -2,14 +2,13 @@ import * as hono_hono_base from 'hono/hono-base'; import * as hono_types from 'hono/types'; import * as hono_utils_http_status from 'hono/utils/http-status'; import { HttpBindings } from '@hono/node-server'; -import * as better_call from 'better-call'; import * as zod from 'zod'; import { z } from 'zod'; +import * as better_call from 'better-call'; import * as drizzle_orm_pg_core from 'drizzle-orm/pg-core'; import { AnyPgColumn } from 'drizzle-orm/pg-core'; import * as drizzle_orm from 'drizzle-orm'; import { InferInsertModel, SQL } from 'drizzle-orm'; -import * as better_auth_adapters_drizzle from 'better-auth/adapters/drizzle'; import * as better_auth_plugins from 'better-auth/plugins'; import * as better_auth from 'better-auth'; @@ -21,15 +20,27 @@ declare const authPlugins: ({ id: "customGetProviders"; endpoints: { customGetProviders: { - (inputCtx_0?: ({ + body?: undefined; } & { - use: any[]; - }> | undefined)?]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }) | undefined): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: any; } : any>; @@ -41,49 +52,31 @@ declare const authPlugins: ({ path: "/get-providers"; }; }; -} | { - id: "customCreateSession"; - endpoints: { - customCreateSession: { - | undefined)?]>(...inputCtx: C): Promise; - options: { - method: "GET"; - } & { - use: any[]; - }; - path: "/create-session"; - }; - }; } | { id: "getAccountInfo"; endpoints: { getAccountInfo: { - (inputCtx_0?: ({ + body?: undefined; } & { - use: any[]; - }> | undefined)?]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }) | undefined): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { id: string; @@ -119,15 +112,27 @@ declare const authPlugins: ({ id: "customUpdateUser"; endpoints: { customUpdateUser: { - (inputCtx_0?: ({ + body?: undefined; } & { - use: any[]; - }> | undefined)?]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }) | undefined): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: string | null; } : string | null>; @@ -139,6 +144,172 @@ declare const authPlugins: ({ path: "/update-user-ccc"; }; }; +} | { + id: "oneTimeToken"; + endpoints: { + generateOneTimeToken: { + (inputCtx_0?: ({ + body?: undefined; + } & { + method?: "GET" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }) | undefined): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + token: string; + }; + } : { + token: string; + }>; + options: { + method: "GET"; + use: ((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + name: string; + email: string; + emailVerified: boolean; + createdAt: Date; + updatedAt: Date; + image?: string | null | undefined; + }; + }; + }>)[]; + } & { + use: any[]; + }; + path: "/one-time-token/generate"; + }; + applyOneTimeToken: { + (inputCtx_0: { + body: { + token: string; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + user: { + id: string; + name: string; + email: string; + emailVerified: boolean; + createdAt: Date; + updatedAt: Date; + image?: string | null | undefined; + } & Record; + }; + } : { + user: { + id: string; + name: string; + email: string; + emailVerified: boolean; + createdAt: Date; + updatedAt: Date; + image?: string | null | undefined; + } & Record; + }>; + options: { + method: "POST"; + body: zod.ZodObject<{ + token: zod.ZodString; + }, "strip", zod.ZodTypeAny, { + token: string; + }, { + token: string; + }>; + } & { + use: any[]; + }; + path: "/one-time-token/apply"; + }; + }; +} | { + id: "customCreateSession"; + endpoints: { + customCreateSession: { + (inputCtx_0?: ({ + body?: undefined; + } & { + method?: "GET" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }) | undefined): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + ck: string; + userId: string; + } | null; + } : { + ck: string; + userId: string; + } | null>; + options: { + method: "GET"; + } & { + use: any[]; + }; + path: "/create-session"; + }; + }; })[]; declare const achievements: drizzle_orm_pg_core.PgTableWithColumns<{ @@ -4629,6 +4800,65 @@ type MessagingData = { description: string; }; +declare const readabilities: drizzle_orm_pg_core.PgTableWithColumns<{ + name: "readabilities"; + schema: undefined; + columns: { + id: drizzle_orm_pg_core.PgColumn<{ + name: "id"; + tableName: "readabilities"; + dataType: "string"; + columnType: "PgText"; + data: string; + driverParam: string; + notNull: true; + hasDefault: true; + isPrimaryKey: true; + isAutoincrement: false; + hasRuntimeDefault: true; + enumValues: [string, ...string[]]; + baseColumn: never; + identity: undefined; + generated: undefined; + }, {}, {}>; + entryId: drizzle_orm_pg_core.PgColumn<{ + name: "entry_id"; + tableName: "readabilities"; + dataType: "string"; + columnType: "PgText"; + data: string; + driverParam: string; + notNull: true; + hasDefault: false; + isPrimaryKey: false; + isAutoincrement: false; + hasRuntimeDefault: false; + enumValues: [string, ...string[]]; + baseColumn: never; + identity: undefined; + generated: undefined; + }, {}, {}>; + content: drizzle_orm_pg_core.PgColumn<{ + name: "content"; + tableName: "readabilities"; + dataType: "string"; + columnType: "PgText"; + data: string; + driverParam: string; + notNull: false; + hasDefault: false; + isPrimaryKey: false; + isAutoincrement: false; + hasRuntimeDefault: false; + enumValues: [string, ...string[]]; + baseColumn: never; + identity: undefined; + generated: undefined; + }, {}, {}>; + }; + dialect: "pg"; +}>; + declare const rsshub: drizzle_orm_pg_core.PgTableWithColumns<{ name: "rsshub"; schema: undefined; @@ -7004,38 +7234,27 @@ declare const auth: { handler: (request: Request) => Promise; api: better_auth.InferAPI<{ ok: { - (inputCtx_0?: ({ + body?: undefined; } & { - use: any[]; - }> | undefined)?]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }) | undefined): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { ok: boolean; @@ -7058,8 +7277,10 @@ declare const auth: { properties: { ok: { type: string; + description: string; }; }; + required: string[]; }; }; }; @@ -7074,33 +7295,27 @@ declare const auth: { path: "/ok"; }; error: { - (inputCtx_0?: ({ + body?: undefined; } & { - use: any[]; - }> | undefined)?]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }) | undefined): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: Response; } : Response>; @@ -7116,6 +7331,7 @@ declare const auth: { "text/html": { schema: { type: "string"; + description: string; }; }; }; @@ -7130,38 +7346,9 @@ declare const auth: { path: "/error"; }; signInSocial: { - ; - newUserCallbackURL: zod.ZodOptional; - errorCallbackURL: zod.ZodOptional; - provider: zod.ZodEnum<["github", ...("apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter" | "dropbox" | "linkedin" | "gitlab" | "tiktok" | "reddit" | "roblox" | "vk" | "kick")[]]>; - disableRedirect: zod.ZodOptional; - idToken: zod.ZodOptional; - accessToken: zod.ZodOptional; - refreshToken: zod.ZodOptional; - expiresAt: zod.ZodOptional; - }, "strip", zod.ZodTypeAny, { - token: string; - refreshToken?: string | undefined; - accessToken?: string | undefined; - expiresAt?: number | undefined; - nonce?: string | undefined; - }, { - token: string; - refreshToken?: string | undefined; - accessToken?: string | undefined; - expiresAt?: number | undefined; - nonce?: string | undefined; - }>>; - scopes: zod.ZodOptional>; - requestSignUp: zod.ZodOptional; - loginHint: zod.ZodOptional; - }, "strip", zod.ZodTypeAny, { - provider: "apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter" | "dropbox" | "linkedin" | "gitlab" | "tiktok" | "reddit" | "roblox" | "vk" | "kick"; + (inputCtx_0: { + body: { + provider: "apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter" | "dropbox" | "linkedin" | "gitlab" | "tiktok" | "reddit" | "roblox" | "vk" | "kick" | "zoom"; scopes?: string[] | undefined; loginHint?: string | undefined; idToken?: { @@ -7176,63 +7363,26 @@ declare const auth: { errorCallbackURL?: string | undefined; newUserCallbackURL?: string | undefined; disableRedirect?: boolean | undefined; - }, { - provider: "apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter" | "dropbox" | "linkedin" | "gitlab" | "tiktok" | "reddit" | "roblox" | "vk" | "kick"; - scopes?: string[] | undefined; - loginHint?: string | undefined; - idToken?: { - token: string; - refreshToken?: string | undefined; - accessToken?: string | undefined; - expiresAt?: number | undefined; - nonce?: string | undefined; - } | undefined; - callbackURL?: string | undefined; - requestSignUp?: boolean | undefined; - errorCallbackURL?: string | undefined; - newUserCallbackURL?: string | undefined; - disableRedirect?: boolean | undefined; - }>; - metadata: { - openapi: { - description: string; - responses: { - "200": { - description: string; - content: { - "application/json": { - schema: { - type: "object"; - properties: { - token: { - type: string; - }; - user: { - type: string; - ref: string; - }; - url: { - type: string; - }; - redirect: { - type: string; - }; - }; - required: string[]; - }; - }; - }; - }; - }; - }; }; } & { - use: any[]; - }>]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { redirect: boolean; @@ -7274,7 +7424,7 @@ declare const auth: { callbackURL: zod.ZodOptional; newUserCallbackURL: zod.ZodOptional; errorCallbackURL: zod.ZodOptional; - provider: zod.ZodEnum<["github", ...("apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter" | "dropbox" | "linkedin" | "gitlab" | "tiktok" | "reddit" | "roblox" | "vk" | "kick")[]]>; + provider: zod.ZodEnum<["github", ...("apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter" | "dropbox" | "linkedin" | "gitlab" | "tiktok" | "reddit" | "roblox" | "vk" | "kick" | "zoom")[]]>; disableRedirect: zod.ZodOptional; idToken: zod.ZodOptional; loginHint: zod.ZodOptional; }, "strip", zod.ZodTypeAny, { - provider: "apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter" | "dropbox" | "linkedin" | "gitlab" | "tiktok" | "reddit" | "roblox" | "vk" | "kick"; + provider: "apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter" | "dropbox" | "linkedin" | "gitlab" | "tiktok" | "reddit" | "roblox" | "vk" | "kick" | "zoom"; scopes?: string[] | undefined; loginHint?: string | undefined; idToken?: { @@ -7315,7 +7465,7 @@ declare const auth: { newUserCallbackURL?: string | undefined; disableRedirect?: boolean | undefined; }, { - provider: "apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter" | "dropbox" | "linkedin" | "gitlab" | "tiktok" | "reddit" | "roblox" | "vk" | "kick"; + provider: "apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter" | "dropbox" | "linkedin" | "gitlab" | "tiktok" | "reddit" | "roblox" | "vk" | "kick" | "zoom"; scopes?: string[] | undefined; loginHint?: string | undefined; idToken?: { @@ -7334,6 +7484,7 @@ declare const auth: { metadata: { openapi: { description: string; + operationId: string; responses: { "200": { description: string; @@ -7341,22 +7492,53 @@ declare const auth: { "application/json": { schema: { type: "object"; + description: string; properties: { - token: { - type: string; - }; - user: { - type: string; - ref: string; - }; - url: { - type: string; - }; redirect: { type: string; + enum: boolean[]; }; + token: { + type: string; + description: string; + url: { + type: string; + nullable: boolean; + }; + user: { + type: string; + properties: { + id: { + type: string; + }; + email: { + type: string; + }; + name: { + type: string; + nullable: boolean; + }; + image: { + type: string; + nullable: boolean; + }; + emailVerified: { + type: string; + }; + createdAt: { + type: string; + format: string; + }; + updatedAt: { + type: string; + format: string; + }; + }; + required: string[]; + }; + }; + required: string[]; }; - required: string[]; }; }; }; @@ -7370,56 +7552,43 @@ declare const auth: { path: "/sign-in/social"; }; callbackOAuth: { - ; - error: zod.ZodOptional; - device_id: zod.ZodOptional; - error_description: zod.ZodOptional; - state: zod.ZodOptional; - }, "strip", zod.ZodTypeAny, { + (inputCtx_0: { + body?: { state?: string | undefined; code?: string | undefined; device_id?: string | undefined; error?: string | undefined; + user?: string | undefined; error_description?: string | undefined; - }, { + } | undefined; + } & { + method: "GET" | "POST"; + } & { + query?: { state?: string | undefined; code?: string | undefined; device_id?: string | undefined; error?: string | undefined; + user?: string | undefined; error_description?: string | undefined; - }>>; - query: zod.ZodOptional; - error: zod.ZodOptional; - device_id: zod.ZodOptional; - error_description: zod.ZodOptional; - state: zod.ZodOptional; - }, "strip", zod.ZodTypeAny, { - state?: string | undefined; - code?: string | undefined; - device_id?: string | undefined; - error?: string | undefined; - error_description?: string | undefined; - }, { - state?: string | undefined; - code?: string | undefined; - device_id?: string | undefined; - error?: string | undefined; - error_description?: string | undefined; - }>>; - metadata: { - isAction: false; + } | undefined; + } & { + params: { + id: string; }; } & { - use: any[]; - }>]>(...inputCtx: C): Promise; @@ -7431,17 +7600,20 @@ declare const auth: { device_id: zod.ZodOptional; error_description: zod.ZodOptional; state: zod.ZodOptional; + user: zod.ZodOptional; }, "strip", zod.ZodTypeAny, { state?: string | undefined; code?: string | undefined; device_id?: string | undefined; error?: string | undefined; + user?: string | undefined; error_description?: string | undefined; }, { state?: string | undefined; code?: string | undefined; device_id?: string | undefined; error?: string | undefined; + user?: string | undefined; error_description?: string | undefined; }>>; query: zod.ZodOptional; error_description: zod.ZodOptional; state: zod.ZodOptional; + user: zod.ZodOptional; }, "strip", zod.ZodTypeAny, { state?: string | undefined; code?: string | undefined; device_id?: string | undefined; error?: string | undefined; + user?: string | undefined; error_description?: string | undefined; }, { state?: string | undefined; code?: string | undefined; device_id?: string | undefined; error?: string | undefined; + user?: string | undefined; error_description?: string | undefined; }>>; metadata: { @@ -7472,53 +7647,30 @@ declare const auth: { path: "/callback/:id"; }; getSession: { - ]>>>; - disableRefresh: zod.ZodOptional]>>; - }, "strip", zod.ZodTypeAny, { - disableCookieCache?: boolean | undefined; - disableRefresh?: boolean | undefined; - }, { + (inputCtx_0: { + body?: undefined; + } & { + method?: "GET" | undefined; + } & { + query?: { disableCookieCache?: string | boolean | undefined; disableRefresh?: string | boolean | undefined; - }>>; - requireHeaders: true; - metadata: { - openapi: { - description: string; - responses: { - "200": { - description: string; - content: { - "application/json": { - schema: { - type: "object"; - properties: { - session: { - type: string; - $ref: string; - }; - user: { - type: string; - $ref: string; - }; - }; - }; - }; - }; - }; - }; - }; - }; + } | undefined; } & { - use: any[]; - }>]>(...inputCtx: C): Promise; + } & { + request?: Request; + } & { + headers: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { session: { @@ -7550,16 +7702,6 @@ declare const auth: { image?: string | null | undefined | undefined; twoFactorEnabled: boolean | null | undefined; handle: string; - } & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined | undefined; - isAnonymous?: boolean | null | undefined; - handle: string; }; } | null; } : { @@ -7592,16 +7734,6 @@ declare const auth: { image?: string | null | undefined | undefined; twoFactorEnabled: boolean | null | undefined; handle: string; - } & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined | undefined; - isAnonymous?: boolean | null | undefined; - handle: string; }; } | null>; options: { @@ -7629,14 +7761,13 @@ declare const auth: { type: "object"; properties: { session: { - type: string; $ref: string; }; user: { - type: string; $ref: string; }; }; + required: string[]; }; }; }; @@ -7650,38 +7781,27 @@ declare const auth: { path: "/get-session"; }; signOut: { - (inputCtx_0: { + body?: undefined; } & { - use: any[]; - }>]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { success: boolean; @@ -7720,96 +7840,39 @@ declare const auth: { path: "/sign-out"; }; signUpEmail: { - ; - metadata: { - $Infer: { - body: ({ - name: string; - email: string; - password: string; - } & ({} | ({} & {}) | ({} & { - isAnonymous?: boolean | null | undefined; - }))) & { - handle: string; - } & { - handle?: string | null | undefined; - }; - }; - openapi: { - description: string; - requestBody: { - content: { - "application/json": { - schema: { - type: "object"; - properties: { - name: { - type: string; - description: string; - }; - email: { - type: string; - description: string; - }; - password: { - type: string; - description: string; - }; - callbackURL: { - type: string; - description: string; - }; - }; - required: string[]; - }; - }; - }; - }; - responses: { - "200": { - description: string; - content: { - "application/json": { - schema: { - type: "object"; - properties: { - id: { - type: string; - description: string; - }; - email: { - type: string; - description: string; - }; - name: { - type: string; - description: string; - }; - image: { - type: string; - description: string; - }; - emailVerified: { - type: string; - description: string; - }; - }; - }; - }; - }; - }; - }; - }; + (inputCtx_0: { + body: ({ + name: string; + email: string; + password: string; + } | ({ + name: string; + email: string; + password: string; + } & {} & {})) & { + handle: string; + } & { + handle?: string | null | undefined; }; } & { - use: any[]; - }>]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { token: null; @@ -7866,9 +7929,11 @@ declare const auth: { name: string; email: string; password: string; - } & ({} | ({} & {}) | ({} & { - isAnonymous?: boolean | null | undefined; - }))) & { + } | ({ + name: string; + email: string; + password: string; + } & {} & {})) & { handle: string; } & { handle?: string | null | undefined; @@ -7912,27 +7977,52 @@ declare const auth: { schema: { type: "object"; properties: { - id: { + token: { type: string; + nullable: boolean; description: string; }; - email: { + user: { type: string; - description: string; - }; - name: { - type: string; - description: string; - }; - image: { - type: string; - description: string; - }; - emailVerified: { - type: string; - description: string; + properties: { + id: { + type: string; + description: string; + }; + email: { + type: string; + format: string; + description: string; + }; + name: { + type: string; + description: string; + }; + image: { + type: string; + format: string; + nullable: boolean; + description: string; + }; + emailVerified: { + type: string; + description: string; + }; + createdAt: { + type: string; + format: string; + description: string; + }; + updatedAt: { + type: string; + format: string; + description: string; + }; + }; + required: string[]; }; }; + required: string[]; }; }; }; @@ -7946,64 +8036,32 @@ declare const auth: { path: "/sign-up/email"; }; signInEmail: { - ; - rememberMe: zod.ZodOptional>; - }, "strip", zod.ZodTypeAny, { + (inputCtx_0: { + body: { password: string; email: string; callbackURL?: string | undefined; rememberMe?: boolean | undefined; - }, { - password: string; - email: string; - callbackURL?: string | undefined; - rememberMe?: boolean | undefined; - }>; - metadata: { - openapi: { - description: string; - responses: { - "200": { - description: string; - content: { - "application/json": { - schema: { - type: "object"; - properties: { - token: { - type: string; - }; - user: { - type: string; - ref: string; - }; - url: { - type: string; - }; - redirect: { - type: string; - }; - }; - required: string[]; - }; - }; - }; - }; - }; - }; }; } & { - use: any[]; - }>]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { redirect: boolean; @@ -8061,19 +8119,50 @@ declare const auth: { "application/json": { schema: { type: "object"; + description: string; properties: { + redirect: { + type: string; + enum: boolean[]; + }; token: { type: string; - }; - user: { - type: string; - ref: string; + description: string; }; url: { type: string; + nullable: boolean; }; - redirect: { + user: { type: string; + properties: { + id: { + type: string; + }; + email: { + type: string; + }; + name: { + type: string; + nullable: boolean; + }; + image: { + type: string; + nullable: boolean; + }; + emailVerified: { + type: string; + }; + createdAt: { + type: string; + format: string; + }; + updatedAt: { + type: string; + format: string; + }; + }; + required: string[]; }; }; required: string[]; @@ -8090,47 +8179,30 @@ declare const auth: { path: "/sign-in/email"; }; forgetPassword: { - ; - }, "strip", zod.ZodTypeAny, { + (inputCtx_0: { + body: { email: string; redirectTo?: string | undefined; - }, { - email: string; - redirectTo?: string | undefined; - }>; - metadata: { - openapi: { - description: string; - responses: { - "200": { - description: string; - content: { - "application/json": { - schema: { - type: "object"; - properties: { - status: { - type: string; - }; - }; - }; - }; - }; - }; - }; - }; }; } & { - use: any[]; - }>]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { status: boolean; @@ -8178,54 +8250,32 @@ declare const auth: { path: "/forget-password"; }; resetPassword: { - ; - }, "strip", zod.ZodTypeAny, { - token?: string | undefined; - }, { - token?: string | undefined; - }>>; - body: zod.ZodObject<{ - newPassword: zod.ZodString; - token: zod.ZodOptional; - }, "strip", zod.ZodTypeAny, { + (inputCtx_0: { + body: { newPassword: string; token?: string | undefined; - }, { - newPassword: string; - token?: string | undefined; - }>; - metadata: { - openapi: { - description: string; - responses: { - "200": { - description: string; - content: { - "application/json": { - schema: { - type: "object"; - properties: { - status: { - type: string; - }; - }; - }; - }; - }; - }; - }; - }; }; } & { - use: any[]; - }>]>(...inputCtx: C): Promise; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { status: boolean; @@ -8280,53 +8330,30 @@ declare const auth: { path: "/reset-password"; }; verifyEmail: { - ; - }, "strip", zod.ZodTypeAny, { + (inputCtx_0: { + body?: undefined; + } & { + method?: "GET" | undefined; + } & { + query: { token: string; callbackURL?: string | undefined; - }, { - token: string; - callbackURL?: string | undefined; - }>; - use: ((inputContext: better_call.MiddlewareInputContext) => Promise)[]; - metadata: { - openapi: { - description: string; - responses: { - "200": { - description: string; - content: { - "application/json": { - schema: { - type: "object"; - properties: { - user: { - type: string; - ref: string; - }; - status: { - type: string; - }; - }; - required: string[]; - }; - }; - }; - }; - }; - }; }; } & { - use: any[]; - }>]>(...inputCtx: C): Promise; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: void | { status: boolean; @@ -8374,6 +8401,23 @@ declare const auth: { metadata: { openapi: { description: string; + parameters: ({ + name: string; + in: "query"; + description: string; + required: true; + schema: { + type: "string"; + }; + } | { + name: string; + in: "query"; + description: string; + required: false; + schema: { + type: "string"; + }; + })[]; responses: { "200": { description: string; @@ -8384,13 +8428,44 @@ declare const auth: { properties: { user: { type: string; - ref: string; + properties: { + id: { + type: string; + description: string; + }; + email: { + type: string; + description: string; + }; + name: { + type: string; + description: string; + }; + image: { + type: string; + description: string; + }; + emailVerified: { + type: string; + description: string; + }; + createdAt: { + type: string; + description: string; + }; + updatedAt: { + type: string; + description: string; + }; + }; + required: string[]; }; status: { type: string; + description: string; }; + required: string[]; }; - required: string[]; }; }; }; @@ -8404,67 +8479,30 @@ declare const auth: { path: "/verify-email"; }; sendVerificationEmail: { - ; - }, "strip", zod.ZodTypeAny, { + (inputCtx_0: { + body: { email: string; callbackURL?: string | undefined; - }, { - email: string; - callbackURL?: string | undefined; - }>; - metadata: { - openapi: { - description: string; - requestBody: { - content: { - "application/json": { - schema: { - type: "object"; - properties: { - email: { - type: string; - description: string; - }; - callbackURL: { - type: string; - description: string; - }; - }; - required: string[]; - }; - }; - }; - }; - responses: { - "200": { - description: string; - content: { - "application/json": { - schema: { - type: "object"; - properties: { - status: { - type: string; - }; - }; - }; - }; - }; - }; - }; - }; }; } & { - use: any[]; - }>]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { status: boolean; @@ -8496,10 +8534,13 @@ declare const auth: { email: { type: string; description: string; + example: string; }; callbackURL: { type: string; description: string; + example: string; + nullable: boolean; }; }; required: string[]; @@ -8517,6 +8558,25 @@ declare const auth: { properties: { status: { type: string; + description: string; + example: boolean; + }; + }; + }; + }; + }; + }; + "400": { + description: string; + content: { + "application/json": { + schema: { + type: "object"; + properties: { + message: { + type: string; + description: string; + example: string; }; }; }; @@ -8532,73 +8592,30 @@ declare const auth: { path: "/send-verification-email"; }; changeEmail: { - ; - }, "strip", zod.ZodTypeAny, { + (inputCtx_0: { + body: { newEmail: string; callbackURL?: string | undefined; - }, { - newEmail: string; - callbackURL?: string | undefined; - }>; - use: ((inputContext: better_call.MiddlewareInputContext) => Promise<{ - session: { - session: Record & { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: Record & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined; - }; - }; - }>)[]; - metadata: { - openapi: { - responses: { - "200": { - description: string; - content: { - "application/json": { - schema: { - type: "object"; - properties: { - user: { - type: string; - ref: string; - }; - status: { - type: string; - }; - }; - }; - }; - }; - }; - }; - }; }; } & { - use: any[]; - }>]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { status: boolean; @@ -8651,14 +8668,18 @@ declare const auth: { schema: { type: "object"; properties: { - user: { - type: string; - ref: string; - }; status: { type: string; + description: string; + }; + message: { + type: string; + enum: string[]; + description: string; + nullable: boolean; }; }; + required: string[]; }; }; }; @@ -8672,74 +8693,31 @@ declare const auth: { path: "/change-email"; }; changePassword: { - ; - }, "strip", zod.ZodTypeAny, { + (inputCtx_0: { + body: { newPassword: string; currentPassword: string; revokeOtherSessions?: boolean | undefined; - }, { - newPassword: string; - currentPassword: string; - revokeOtherSessions?: boolean | undefined; - }>; - use: ((inputContext: better_call.MiddlewareInputContext) => Promise<{ - session: { - session: Record & { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: Record & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined; - }; - }; - }>)[]; - metadata: { - openapi: { - description: string; - responses: { - "200": { - description: string; - content: { - "application/json": { - schema: { - type: "object"; - properties: { - user: { - description: string; - $ref: string; - }; - }; - }; - }; - }; - }; - }; - }; }; } & { - use: any[]; - }>]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { token: string | null; @@ -8814,11 +8792,52 @@ declare const auth: { schema: { type: "object"; properties: { - user: { + token: { + type: string; + nullable: boolean; description: string; - $ref: string; + }; + user: { + type: string; + properties: { + id: { + type: string; + description: string; + }; + email: { + type: string; + format: string; + description: string; + }; + name: { + type: string; + description: string; + }; + image: { + type: string; + format: string; + nullable: boolean; + description: string; + }; + emailVerified: { + type: string; + description: string; + }; + createdAt: { + type: string; + format: string; + description: string; + }; + updatedAt: { + type: string; + format: string; + description: string; + }; + }; + required: string[]; }; }; + required: string[]; }; }; }; @@ -8832,48 +8851,29 @@ declare const auth: { path: "/change-password"; }; setPassword: { - (inputCtx_0: { + body: { newPassword: string; - }, { - newPassword: string; - }>; - metadata: { - SERVER_ONLY: true; }; - use: ((inputContext: better_call.MiddlewareInputContext) => Promise<{ - session: { - session: Record & { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: Record & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined; - }; - }; - }>)[]; } & { - use: any[]; - }>]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { status: boolean; @@ -8922,93 +8922,36 @@ declare const auth: { path: "/set-password"; }; updateUser: { - ; - use: ((inputContext: better_call.MiddlewareInputContext) => Promise<{ - session: { - session: Record & { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: Record & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined; - }; - }; - }>)[]; - metadata: { - $Infer: { - body: Partial>; - }; - openapi: { - description: string; - requestBody: { - content: { - "application/json": { - schema: { - type: "object"; - properties: { - name: { - type: string; - description: string; - }; - image: { - type: string; - description: string; - }; - }; - }; - }; - }; - }; - responses: { - "200": { - description: string; - content: { - "application/json": { - schema: { - type: "object"; - properties: { - user: { - type: string; - ref: string; - }; - }; - }; - }; - }; - }; - }; - }; - }; + (inputCtx_0: { + body: Partial>; } & { - use: any[]; - }>]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { status: boolean; @@ -9044,11 +8987,11 @@ declare const auth: { }>)[]; metadata: { $Infer: { - body: Partial) => Promise<{ - session: { - session: Record & { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: Record & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined; - }; - }; - }>)[]; - body: zod.ZodObject<{ - callbackURL: zod.ZodOptional; - password: zod.ZodOptional; - token: zod.ZodOptional; - }, "strip", zod.ZodTypeAny, { + (inputCtx_0: { + body: { password?: string | undefined; token?: string | undefined; callbackURL?: string | undefined; - }, { - password?: string | undefined; - token?: string | undefined; - callbackURL?: string | undefined; - }>; - metadata: { - openapi: { - description: string; - responses: { - "200": { - description: string; - content: { - "application/json": { - schema: { - type: "object"; - }; - }; - }; - }; - }; - }; }; } & { - use: any[]; - }>]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { success: boolean; @@ -9221,6 +9127,18 @@ declare const auth: { "application/json": { schema: { type: "object"; + properties: { + success: { + type: string; + description: string; + }; + message: { + type: string; + enum: string[]; + description: string; + }; + }; + required: string[]; }; }; }; @@ -9234,45 +9152,31 @@ declare const auth: { path: "/delete-user"; }; forgetPasswordCallback: { - (inputCtx_0: { + body?: undefined; + } & { + method?: "GET" | undefined; + } & { + query: { callbackURL: string; - }, { - callbackURL: string; - }>; - use: ((inputContext: better_call.MiddlewareInputContext) => Promise)[]; - metadata: { - openapi: { - description: string; - responses: { - "200": { - description: string; - content: { - "application/json": { - schema: { - type: "object"; - properties: { - token: { - type: string; - }; - }; - }; - }; - }; - }; - }; - }; }; } & { - use: any[]; - }>]>(...inputCtx: C): Promise; @@ -9314,70 +9218,27 @@ declare const auth: { path: "/reset-password/:token"; }; listSessions: { - ) => Promise<{ - session: { - session: Record & { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: Record & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined; - }; - }; - }>)[]; - requireHeaders: true; - metadata: { - openapi: { - description: string; - responses: { - "200": { - description: string; - content: { - "application/json": { - schema: { - type: "array"; - items: { - type: string; - properties: { - token: { - type: string; - }; - userId: { - type: string; - }; - expiresAt: { - type: string; - }; - }; - }; - }; - }; - }; - }; - }; - }; - }; + (inputCtx_0: { + body?: undefined; } & { - use: any[]; - }>]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: better_auth.Prettify<{ id: string; @@ -9436,18 +9297,7 @@ declare const auth: { schema: { type: "array"; items: { - type: string; - properties: { - token: { - type: string; - }; - userId: { - type: string; - }; - expiresAt: { - type: string; - }; - }; + $ref: string; }; }; }; @@ -9462,66 +9312,29 @@ declare const auth: { path: "/list-sessions"; }; revokeSession: { - (inputCtx_0: { + body: { token: string; - }, { - token: string; - }>; - use: ((inputContext: better_call.MiddlewareInputContext) => Promise<{ - session: { - session: Record & { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: Record & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined; - }; - }; - }>)[]; - requireHeaders: true; - metadata: { - openapi: { - description: string; - requestBody: { - content: { - "application/json": { - schema: { - type: "object"; - properties: { - token: { - type: string; - }; - }; - required: string[]; - }; - }; - }; - }; - }; }; } & { - use: any[]; - }>]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { status: boolean; @@ -9573,6 +9386,7 @@ declare const auth: { properties: { token: { type: string; + description: string; }; }; required: string[]; @@ -9580,43 +9394,6 @@ declare const auth: { }; }; }; - }; - }; - } & { - use: any[]; - }; - path: "/revoke-session"; - }; - revokeSessions: { - ) => Promise<{ - session: { - session: Record & { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: Record & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined; - }; - }; - }>)[]; - requireHeaders: true; - metadata: { - openapi: { - description: string; responses: { "200": { description: string; @@ -9627,6 +9404,7 @@ declare const auth: { properties: { status: { type: string; + description: string; }; }; required: string[]; @@ -9639,11 +9417,31 @@ declare const auth: { }; } & { use: any[]; - }>]>(...inputCtx: C): Promise(inputCtx_0: { + body?: undefined; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { status: boolean; @@ -9690,6 +9488,7 @@ declare const auth: { properties: { status: { type: string; + description: string; }; }; required: string[]; @@ -9706,61 +9505,27 @@ declare const auth: { path: "/revoke-sessions"; }; revokeOtherSessions: { - ) => Promise<{ - session: { - session: Record & { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: Record & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined; - }; - }; - }>)[]; - metadata: { - openapi: { - description: string; - responses: { - "200": { - description: string; - content: { - "application/json": { - schema: { - type: "object"; - properties: { - status: { - type: string; - }; - }; - }; - }; - }; - }; - }; - }; - }; + (inputCtx_0: { + body?: undefined; } & { - use: any[]; - }>]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { status: boolean; @@ -9807,8 +9572,10 @@ declare const auth: { properties: { status: { type: string; + description: string; }; }; + required: string[]; }; }; }; @@ -9822,75 +9589,31 @@ declare const auth: { path: "/revoke-other-sessions"; }; linkSocialAccount: { - ; - provider: zod.ZodEnum<["github", ...("apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter" | "dropbox" | "linkedin" | "gitlab" | "tiktok" | "reddit" | "roblox" | "vk" | "kick")[]]>; - }, "strip", zod.ZodTypeAny, { - provider: "apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter" | "dropbox" | "linkedin" | "gitlab" | "tiktok" | "reddit" | "roblox" | "vk" | "kick"; + (inputCtx_0: { + body: { + provider: "apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter" | "dropbox" | "linkedin" | "gitlab" | "tiktok" | "reddit" | "roblox" | "vk" | "kick" | "zoom"; + scopes?: string[] | undefined; callbackURL?: string | undefined; - }, { - provider: "apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter" | "dropbox" | "linkedin" | "gitlab" | "tiktok" | "reddit" | "roblox" | "vk" | "kick"; - callbackURL?: string | undefined; - }>; - use: ((inputContext: better_call.MiddlewareInputContext) => Promise<{ - session: { - session: Record & { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: Record & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined; - }; - }; - }>)[]; - metadata: { - openapi: { - description: string; - responses: { - "200": { - description: string; - content: { - "application/json": { - schema: { - type: "object"; - properties: { - url: { - type: string; - }; - redirect: { - type: string; - }; - }; - required: string[]; - }; - }; - }; - }; - }; - }; }; } & { - use: any[]; - }>]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { url: string; @@ -9905,12 +9628,15 @@ declare const auth: { requireHeaders: true; body: zod.ZodObject<{ callbackURL: zod.ZodOptional; - provider: zod.ZodEnum<["github", ...("apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter" | "dropbox" | "linkedin" | "gitlab" | "tiktok" | "reddit" | "roblox" | "vk" | "kick")[]]>; + provider: zod.ZodEnum<["github", ...("apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter" | "dropbox" | "linkedin" | "gitlab" | "tiktok" | "reddit" | "roblox" | "vk" | "kick" | "zoom")[]]>; + scopes: zod.ZodOptional>; }, "strip", zod.ZodTypeAny, { - provider: "apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter" | "dropbox" | "linkedin" | "gitlab" | "tiktok" | "reddit" | "roblox" | "vk" | "kick"; + provider: "apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter" | "dropbox" | "linkedin" | "gitlab" | "tiktok" | "reddit" | "roblox" | "vk" | "kick" | "zoom"; + scopes?: string[] | undefined; callbackURL?: string | undefined; }, { - provider: "apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter" | "dropbox" | "linkedin" | "gitlab" | "tiktok" | "reddit" | "roblox" | "vk" | "kick"; + provider: "apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter" | "dropbox" | "linkedin" | "gitlab" | "tiktok" | "reddit" | "roblox" | "vk" | "kick" | "zoom"; + scopes?: string[] | undefined; callbackURL?: string | undefined; }>; use: ((inputContext: better_call.MiddlewareInputContext) => Promise<{ @@ -9949,9 +9675,11 @@ declare const auth: { properties: { url: { type: string; + description: string; }; redirect: { type: string; + description: string; }; }; required: string[]; @@ -9968,81 +9696,27 @@ declare const auth: { path: "/link-social"; }; listUserAccounts: { - ) => Promise<{ - session: { - session: Record & { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: Record & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined; - }; - }; - }>)[]; - metadata: { - openapi: { - description: string; - responses: { - "200": { - description: string; - content: { - "application/json": { - schema: { - type: "array"; - items: { - type: string; - properties: { - id: { - type: string; - }; - provider: { - type: string; - }; - createdAt: { - type: string; - }; - updatedAt: { - type: string; - }; - accountId: { - type: string; - }; - scopes: { - type: string; - items: { - type: string; - }; - }; - }; - }; - }; - }; - }; - }; - }; - }; - }; + (inputCtx_0?: ({ + body?: undefined; } & { - use: any[]; - }> | undefined)?]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }) | undefined): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { id: string; @@ -10106,21 +9780,24 @@ declare const auth: { }; createdAt: { type: string; + format: string; }; updatedAt: { type: string; + format: string; }; - accountId: { + }; + accountId: { + type: string; + }; + scopes: { + type: string; + items: { type: string; }; - scopes: { - type: string; - items: { - type: string; - }; - }; }; }; + required: string[]; }; }; }; @@ -10134,26 +9811,30 @@ declare const auth: { path: "/list-accounts"; }; deleteUserCallback: { - ; - }, "strip", zod.ZodTypeAny, { - token: string; - callbackURL?: string | undefined; - }, { - token: string; - callbackURL?: string | undefined; - }>; - use: ((inputContext: better_call.MiddlewareInputContext) => Promise)[]; + (inputCtx_0: { + body?: undefined; } & { - use: any[]; - }>]>(...inputCtx: C): Promise; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { success: boolean; @@ -10176,54 +9857,65 @@ declare const auth: { callbackURL?: string | undefined; }>; use: ((inputContext: better_call.MiddlewareInputContext) => Promise)[]; + metadata: { + openapi: { + description: string; + responses: { + "200": { + description: string; + content: { + "application/json": { + schema: { + type: "object"; + properties: { + success: { + type: string; + description: string; + }; + message: { + type: string; + enum: string[]; + description: string; + }; + }; + required: string[]; + }; + }; + }; + }; + }; + }; + }; } & { use: any[]; }; path: "/delete-user/callback"; }; unlinkAccount: { - ; - }, "strip", zod.ZodTypeAny, { + (inputCtx_0: { + body: { providerId: string; accountId?: string | undefined; - }, { - providerId: string; - accountId?: string | undefined; - }>; - use: ((inputContext: better_call.MiddlewareInputContext) => Promise<{ - session: { - session: Record & { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: Record & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined; - }; - }; - }>)[]; + }; } & { - use: any[]; - }>]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { status: boolean; @@ -10266,76 +9958,59 @@ declare const auth: { }; }; }>)[]; - } & { - use: any[]; - }; - path: "/unlink-account"; - }; - refreshToken: { - ; - userId: zod.ZodOptional; - }, "strip", zod.ZodTypeAny, { - providerId: string; - accountId?: string | undefined; - userId?: string | undefined; - }, { - providerId: string; - accountId?: string | undefined; - userId?: string | undefined; - }>; metadata: { openapi: { description: string; responses: { - 200: { + "200": { description: string; content: { "application/json": { schema: { type: "object"; properties: { - tokenType: { + status: { type: string; }; - idToken: { - type: string; - }; - accessToken: { - type: string; - }; - refreshToken: { - type: string; - }; - accessTokenExpiresAt: { - type: string; - format: string; - }; - refreshTokenExpiresAt: { - type: string; - format: string; - }; }; }; }; }; }; - 400: { - description: string; - }; }; }; }; } & { use: any[]; - }>]>(...inputCtx: C): Promise(inputCtx_0: { + body: { + providerId: string; + accountId?: string | undefined; + userId?: string | undefined; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: better_auth.OAuth2Tokens; } : better_auth.OAuth2Tokens>; @@ -10403,15 +10078,27 @@ declare const auth: { }; } & { customGetProviders: { - (inputCtx_0?: ({ + body?: undefined; } & { - use: any[]; - }> | undefined)?]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }) | undefined): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: any; } : any>; @@ -10422,44 +10109,29 @@ declare const auth: { }; path: "/get-providers"; }; - } & { - customCreateSession: { - | undefined)?]>(...inputCtx: C): Promise; - options: { - method: "GET"; - } & { - use: any[]; - }; - path: "/create-session"; - }; } & { getAccountInfo: { - (inputCtx_0?: ({ + body?: undefined; } & { - use: any[]; - }> | undefined)?]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }) | undefined): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { id: string; @@ -10492,15 +10164,27 @@ declare const auth: { }; } & { customUpdateUser: { - (inputCtx_0?: ({ + body?: undefined; } & { - use: any[]; - }> | undefined)?]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }) | undefined): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: string | null; } : string | null>; @@ -10512,16 +10196,37 @@ declare const auth: { path: "/update-user-ccc"; }; } & { - enableTwoFactor: { - ; + generateOneTimeToken: { + (inputCtx_0?: ({ + body?: undefined; + } & { + method?: "GET" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }) | undefined): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + token: string; + }; + } : { + token: string; + }>; + options: { + method: "GET"; use: ((inputContext: better_call.MiddlewareInputContext) => Promise<{ session: { session: Record & { @@ -10545,44 +10250,137 @@ declare const auth: { }; }; }>)[]; - metadata: { - openapi: { - summary: string; - description: string; - responses: { - 200: { - description: string; - content: { - "application/json": { - schema: { - type: "object"; - properties: { - totpURI: { - type: string; - description: string; - }; - backupCodes: { - type: string; - items: { - type: string; - }; - description: string; - }; - }; - }; - }; - }; - }; - }; - }; - }; } & { use: any[]; - }>]>(...inputCtx: C): Promise(inputCtx_0: { + body: { + token: string; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + user: { + id: string; + name: string; + email: string; + emailVerified: boolean; + createdAt: Date; + updatedAt: Date; + image?: string | null | undefined; + } & Record; + }; + } : { + user: { + id: string; + name: string; + email: string; + emailVerified: boolean; + createdAt: Date; + updatedAt: Date; + image?: string | null | undefined; + } & Record; + }>; + options: { + method: "POST"; + body: zod.ZodObject<{ + token: zod.ZodString; + }, "strip", zod.ZodTypeAny, { + token: string; + }, { + token: string; + }>; + } & { + use: any[]; + }; + path: "/one-time-token/apply"; + }; + } & { + customCreateSession: { + (inputCtx_0?: ({ + body?: undefined; + } & { + method?: "GET" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }) | undefined): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + ck: string; + userId: string; + } | null; + } : { + ck: string; + userId: string; + } | null>; + options: { + method: "GET"; + } & { + use: any[]; + }; + path: "/create-session"; + }; + } & { + enableTwoFactor: { + (inputCtx_0: { + body: { + password: string; + issuer?: string | undefined; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { totpURI: string; @@ -10596,10 +10394,13 @@ declare const auth: { method: "POST"; body: zod.ZodObject<{ password: zod.ZodString; + issuer: zod.ZodOptional; }, "strip", zod.ZodTypeAny, { password: string; + issuer?: string | undefined; }, { password: string; + issuer?: string | undefined; }>; use: ((inputContext: better_call.MiddlewareInputContext) => Promise<{ session: { @@ -10661,68 +10462,29 @@ declare const auth: { path: "/two-factor/enable"; }; disableTwoFactor: { - (inputCtx_0: { + body: { password: string; - }, { - password: string; - }>; - use: ((inputContext: better_call.MiddlewareInputContext) => Promise<{ - session: { - session: Record & { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: Record & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined; - }; - }; - }>)[]; - metadata: { - openapi: { - summary: string; - description: string; - responses: { - 200: { - description: string; - content: { - "application/json": { - schema: { - type: "object"; - properties: { - status: { - type: string; - }; - }; - }; - }; - }; - }; - }; - }; }; } & { - use: any[]; - }>]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { status: boolean; @@ -10791,176 +10553,54 @@ declare const auth: { path: "/two-factor/disable"; }; verifyBackupCode: { - ; - trustDevice: zod.ZodOptional; - }, "strip", zod.ZodTypeAny, { + (inputCtx_0: { + body: { code: string; trustDevice?: boolean | undefined; disableSession?: boolean | undefined; - }, { - code: string; - trustDevice?: boolean | undefined; - disableSession?: boolean | undefined; - }>; - use: ((inputContext: better_call.MiddlewareInputContext<{ - body: zod.ZodObject<{ - trustDevice: zod.ZodOptional; - }, "strip", zod.ZodTypeAny, { - trustDevice?: boolean | undefined; - }, { - trustDevice?: boolean | undefined; - }>; - }>) => Promise<{ - valid: (ctx: better_auth.GenericEndpointContext) => Promise<{ - token: string; - user: { - id: string; - email: string; - emailVerified: boolean; - name: string; - image: string | null | undefined; - createdAt: Date; - updatedAt: Date; - }; - }>; - invalid: () => Promise; - session: { - session: { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: better_auth_plugins.UserWithTwoFactor; - }; - } | { - valid: (ctx: better_auth.GenericEndpointContext) => Promise<{ - token: string; - user: { - id: string; - email: string; - emailVerified: boolean; - name: string; - image: string | null | undefined; - createdAt: Date; - updatedAt: Date; - }; - }>; - invalid: () => Promise; - session: { - session: Record & { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: Record & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined; - }; - }; - }>)[]; + }; } & { - use: any[]; - }>]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { - user: better_auth_plugins.UserWithTwoFactor; - session: { - session: better_auth.Session & Record; - user: better_auth.User & Record; - } & { - session: { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: better_auth_plugins.UserWithTwoFactor; - } & { - session: Record & { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: Record & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined; - }; + token: string | undefined; + user: { + id: string; + email: string; + emailVerified: boolean; + name: string; + image: string | null | undefined; + createdAt: Date; + updatedAt: Date; }; }; } : { - user: better_auth_plugins.UserWithTwoFactor; - session: { - session: better_auth.Session & Record; - user: better_auth.User & Record; - } & { - session: { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: better_auth_plugins.UserWithTwoFactor; - } & { - session: Record & { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: Record & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined; - }; + token: string | undefined; + user: { + id: string; + email: string; + emailVerified: boolean; + name: string; + image: string | null | undefined; + createdAt: Date; + updatedAt: Date; }; }>; options: { @@ -10978,122 +10618,127 @@ declare const auth: { trustDevice?: boolean | undefined; disableSession?: boolean | undefined; }>; - use: ((inputContext: better_call.MiddlewareInputContext<{ - body: zod.ZodObject<{ - trustDevice: zod.ZodOptional; - }, "strip", zod.ZodTypeAny, { - trustDevice?: boolean | undefined; - }, { - trustDevice?: boolean | undefined; - }>; - }>) => Promise<{ - valid: (ctx: better_auth.GenericEndpointContext) => Promise<{ - token: string; - user: { - id: string; - email: string; - emailVerified: boolean; - name: string; - image: string | null | undefined; - createdAt: Date; - updatedAt: Date; - }; - }>; - invalid: () => Promise; - session: { - session: { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: better_auth_plugins.UserWithTwoFactor; - }; - } | { - valid: (ctx: better_auth.GenericEndpointContext) => Promise<{ - token: string; - user: { - id: string; - email: string; - emailVerified: boolean; - name: string; - image: string | null | undefined; - createdAt: Date; - updatedAt: Date; - }; - }>; - invalid: () => Promise; - session: { - session: Record & { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: Record & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined; + metadata: { + openapi: { + description: string; + responses: { + "200": { + description: string; + content: { + "application/json": { + schema: { + type: "object"; + properties: { + user: { + type: string; + properties: { + id: { + type: string; + description: string; + }; + email: { + type: string; + format: string; + nullable: boolean; + description: string; + }; + emailVerified: { + type: string; + nullable: boolean; + description: string; + }; + name: { + type: string; + nullable: boolean; + description: string; + }; + image: { + type: string; + format: string; + nullable: boolean; + description: string; + }; + twoFactorEnabled: { + type: string; + description: string; + }; + createdAt: { + type: string; + format: string; + description: string; + }; + updatedAt: { + type: string; + format: string; + description: string; + }; + }; + required: string[]; + description: string; + }; + session: { + type: string; + properties: { + token: { + type: string; + description: string; + }; + userId: { + type: string; + description: string; + }; + createdAt: { + type: string; + format: string; + description: string; + }; + expiresAt: { + type: string; + format: string; + description: string; + }; + }; + required: string[]; + description: string; + }; + }; + required: string[]; + }; + }; + }; + }; }; }; - }>)[]; + }; } & { use: any[]; }; path: "/two-factor/verify-backup-code"; }; generateBackupCodes: { - (inputCtx_0: { + body: { password: string; - }, { - password: string; - }>; - use: ((inputContext: better_call.MiddlewareInputContext) => Promise<{ - session: { - session: Record & { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: Record & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined; - }; - }; - }>)[]; + }; } & { - use: any[]; - }>]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { status: boolean; @@ -11135,31 +10780,67 @@ declare const auth: { }; }; }>)[]; + metadata: { + openapi: { + description: string; + responses: { + "200": { + description: string; + content: { + "application/json": { + schema: { + type: "object"; + properties: { + status: { + type: string; + description: string; + enum: boolean[]; + }; + backupCodes: { + type: string; + items: { + type: string; + }; + description: string; + }; + }; + required: string[]; + }; + }; + }; + }; + }; + }; + }; } & { use: any[]; }; path: "/two-factor/generate-backup-codes"; }; viewBackupCodes: { - (inputCtx_0: { + body: { userId: string; - }, { - userId: string; - }>; - metadata: { - SERVER_ONLY: true; }; } & { - use: any[]; - }>]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { status: boolean; @@ -11187,116 +10868,29 @@ declare const auth: { path: "/two-factor/view-backup-codes"; }; sendTwoFactorOTP: { - ; - }, "strip", zod.ZodTypeAny, { + (inputCtx_0?: ({ + body?: { trustDevice?: boolean | undefined; - }, { - trustDevice?: boolean | undefined; - }>>; - use: ((inputContext: better_call.MiddlewareInputContext<{ - body: zod.ZodObject<{ - trustDevice: zod.ZodOptional; - }, "strip", zod.ZodTypeAny, { - trustDevice?: boolean | undefined; - }, { - trustDevice?: boolean | undefined; - }>; - }>) => Promise<{ - valid: (ctx: better_auth.GenericEndpointContext) => Promise<{ - token: string; - user: { - id: string; - email: string; - emailVerified: boolean; - name: string; - image: string | null | undefined; - createdAt: Date; - updatedAt: Date; - }; - }>; - invalid: () => Promise; - session: { - session: { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: better_auth_plugins.UserWithTwoFactor; - }; - } | { - valid: (ctx: better_auth.GenericEndpointContext) => Promise<{ - token: string; - user: { - id: string; - email: string; - emailVerified: boolean; - name: string; - image: string | null | undefined; - createdAt: Date; - updatedAt: Date; - }; - }>; - invalid: () => Promise; - session: { - session: Record & { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: Record & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined; - }; - }; - }>)[]; - metadata: { - openapi: { - summary: string; - description: string; - responses: { - 200: { - description: string; - content: { - "application/json": { - schema: { - type: "object"; - properties: { - status: { - type: string; - }; - }; - }; - }; - }; - }; - }; - }; - }; + } | undefined; } & { - use: any[]; - }> | undefined)?]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }) | undefined): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { status: boolean; @@ -11313,77 +10907,6 @@ declare const auth: { }, { trustDevice?: boolean | undefined; }>>; - use: ((inputContext: better_call.MiddlewareInputContext<{ - body: zod.ZodObject<{ - trustDevice: zod.ZodOptional; - }, "strip", zod.ZodTypeAny, { - trustDevice?: boolean | undefined; - }, { - trustDevice?: boolean | undefined; - }>; - }>) => Promise<{ - valid: (ctx: better_auth.GenericEndpointContext) => Promise<{ - token: string; - user: { - id: string; - email: string; - emailVerified: boolean; - name: string; - image: string | null | undefined; - createdAt: Date; - updatedAt: Date; - }; - }>; - invalid: () => Promise; - session: { - session: { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: better_auth_plugins.UserWithTwoFactor; - }; - } | { - valid: (ctx: better_auth.GenericEndpointContext) => Promise<{ - token: string; - user: { - id: string; - email: string; - emailVerified: boolean; - name: string; - image: string | null | undefined; - createdAt: Date; - updatedAt: Date; - }; - }>; - invalid: () => Promise; - session: { - session: Record & { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: Record & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined; - }; - }; - }>)[]; metadata: { openapi: { summary: string; @@ -11413,142 +10936,53 @@ declare const auth: { path: "/two-factor/send-otp"; }; verifyTwoFactorOTP: { - ; - }, "strip", zod.ZodTypeAny, { + (inputCtx_0: { + body: { code: string; trustDevice?: boolean | undefined; - }, { - code: string; - trustDevice?: boolean | undefined; - }>; - use: ((inputContext: better_call.MiddlewareInputContext<{ - body: zod.ZodObject<{ - trustDevice: zod.ZodOptional; - }, "strip", zod.ZodTypeAny, { - trustDevice?: boolean | undefined; - }, { - trustDevice?: boolean | undefined; - }>; - }>) => Promise<{ - valid: (ctx: better_auth.GenericEndpointContext) => Promise<{ - token: string; - user: { - id: string; - email: string; - emailVerified: boolean; - name: string; - image: string | null | undefined; - createdAt: Date; - updatedAt: Date; - }; - }>; - invalid: () => Promise; - session: { - session: { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: better_auth_plugins.UserWithTwoFactor; - }; - } | { - valid: (ctx: better_auth.GenericEndpointContext) => Promise<{ - token: string; - user: { - id: string; - email: string; - emailVerified: boolean; - name: string; - image: string | null | undefined; - createdAt: Date; - updatedAt: Date; - }; - }>; - invalid: () => Promise; - session: { - session: Record & { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: Record & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined; - }; - }; - }>)[]; - metadata: { - openapi: { - summary: string; - description: string; - responses: { - 200: { - description: string; - content: { - "application/json": { - schema: { - type: "object"; - properties: { - status: { - type: string; - }; - }; - }; - }; - }; - }; - }; - }; }; } & { - use: any[]; - }>]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { token: string; user: { - id: string; - email: string; - emailVerified: boolean; - name: string; - image: string | null | undefined; - createdAt: Date; - updatedAt: Date; + id: any; + email: any; + emailVerified: any; + name: any; + image: any; + createdAt: any; + updatedAt: any; }; }; } : { token: string; user: { - id: string; - email: string; - emailVerified: boolean; - name: string; - image: string | null | undefined; - createdAt: Date; - updatedAt: Date; + id: any; + email: any; + emailVerified: any; + name: any; + image: any; + createdAt: any; + updatedAt: any; }; }>; options: { @@ -11563,93 +10997,67 @@ declare const auth: { code: string; trustDevice?: boolean | undefined; }>; - use: ((inputContext: better_call.MiddlewareInputContext<{ - body: zod.ZodObject<{ - trustDevice: zod.ZodOptional; - }, "strip", zod.ZodTypeAny, { - trustDevice?: boolean | undefined; - }, { - trustDevice?: boolean | undefined; - }>; - }>) => Promise<{ - valid: (ctx: better_auth.GenericEndpointContext) => Promise<{ - token: string; - user: { - id: string; - email: string; - emailVerified: boolean; - name: string; - image: string | null | undefined; - createdAt: Date; - updatedAt: Date; - }; - }>; - invalid: () => Promise; - session: { - session: { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: better_auth_plugins.UserWithTwoFactor; - }; - } | { - valid: (ctx: better_auth.GenericEndpointContext) => Promise<{ - token: string; - user: { - id: string; - email: string; - emailVerified: boolean; - name: string; - image: string | null | undefined; - createdAt: Date; - updatedAt: Date; - }; - }>; - invalid: () => Promise; - session: { - session: Record & { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: Record & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined; - }; - }; - }>)[]; metadata: { openapi: { summary: string; description: string; responses: { - 200: { + "200": { description: string; content: { "application/json": { schema: { type: "object"; properties: { - status: { + token: { type: string; + description: string; + }; + user: { + type: string; + properties: { + id: { + type: string; + description: string; + }; + email: { + type: string; + format: string; + nullable: boolean; + description: string; + }; + emailVerified: { + type: string; + nullable: boolean; + description: string; + }; + name: { + type: string; + nullable: boolean; + description: string; + }; + image: { + type: string; + format: string; + nullable: boolean; + description: string; + }; + createdAt: { + type: string; + format: string; + description: string; + }; + updatedAt: { + type: string; + format: string; + description: string; + }; + }; + required: string[]; + description: string; }; }; + required: string[]; }; }; }; @@ -11663,61 +11071,29 @@ declare const auth: { path: "/two-factor/verify-otp"; }; generateTOTP: { - ) => Promise<{ - session: { - session: Record & { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: Record & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined; - }; - }; - }>)[]; - metadata: { - openapi: { - summary: string; - description: string; - responses: { - 200: { - description: string; - content: { - "application/json": { - schema: { - type: "object"; - properties: { - code: { - type: string; - }; - }; - }; - }; - }; - }; - }; - }; + (inputCtx_0: { + body: { + secret: string; }; } & { - use: any[]; - }> | undefined)?]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { code: string; @@ -11727,89 +11103,12 @@ declare const auth: { }>; options: { method: "POST"; - use: ((inputContext: better_call.MiddlewareInputContext) => Promise<{ - session: { - session: Record & { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: Record & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined; - }; - }; - }>)[]; - metadata: { - openapi: { - summary: string; - description: string; - responses: { - 200: { - description: string; - content: { - "application/json": { - schema: { - type: "object"; - properties: { - code: { - type: string; - }; - }; - }; - }; - }; - }; - }; - }; - }; - } & { - use: any[]; - }; - path: "/totp/generate"; - }; - getTOTPURI: { - ) => Promise<{ - session: { - session: Record & { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: Record & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined; - }; - }; - }>)[]; body: zod.ZodObject<{ - password: zod.ZodString; + secret: zod.ZodString; }, "strip", zod.ZodTypeAny, { - password: string; + secret: string; }, { - password: string; + secret: string; }>; metadata: { openapi: { @@ -11823,7 +11122,7 @@ declare const auth: { schema: { type: "object"; properties: { - totpURI: { + code: { type: string; }; }; @@ -11833,14 +11132,37 @@ declare const auth: { }; }; }; + SERVER_ONLY: true; }; } & { use: any[]; - }>]>(...inputCtx: C): Promise(inputCtx_0: { + body: { + password: string; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { totpURI: string; @@ -11909,119 +11231,30 @@ declare const auth: { path: "/two-factor/get-totp-uri"; }; verifyTOTP: { - ; - }, "strip", zod.ZodTypeAny, { + (inputCtx_0: { + body: { code: string; trustDevice?: boolean | undefined; - }, { - code: string; - trustDevice?: boolean | undefined; - }>; - use: ((inputContext: better_call.MiddlewareInputContext<{ - body: zod.ZodObject<{ - trustDevice: zod.ZodOptional; - }, "strip", zod.ZodTypeAny, { - trustDevice?: boolean | undefined; - }, { - trustDevice?: boolean | undefined; - }>; - }>) => Promise<{ - valid: (ctx: better_auth.GenericEndpointContext) => Promise<{ - token: string; - user: { - id: string; - email: string; - emailVerified: boolean; - name: string; - image: string | null | undefined; - createdAt: Date; - updatedAt: Date; - }; - }>; - invalid: () => Promise; - session: { - session: { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: better_auth_plugins.UserWithTwoFactor; - }; - } | { - valid: (ctx: better_auth.GenericEndpointContext) => Promise<{ - token: string; - user: { - id: string; - email: string; - emailVerified: boolean; - name: string; - image: string | null | undefined; - createdAt: Date; - updatedAt: Date; - }; - }>; - invalid: () => Promise; - session: { - session: Record & { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: Record & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined; - }; - }; - }>)[]; - metadata: { - openapi: { - summary: string; - description: string; - responses: { - 200: { - description: string; - content: { - "application/json": { - schema: { - type: "object"; - properties: { - status: { - type: string; - }; - }; - }; - }; - }; - }; - }; - }; }; } & { - use: any[]; - }>]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { token: string; @@ -12059,77 +11292,6 @@ declare const auth: { code: string; trustDevice?: boolean | undefined; }>; - use: ((inputContext: better_call.MiddlewareInputContext<{ - body: zod.ZodObject<{ - trustDevice: zod.ZodOptional; - }, "strip", zod.ZodTypeAny, { - trustDevice?: boolean | undefined; - }, { - trustDevice?: boolean | undefined; - }>; - }>) => Promise<{ - valid: (ctx: better_auth.GenericEndpointContext) => Promise<{ - token: string; - user: { - id: string; - email: string; - emailVerified: boolean; - name: string; - image: string | null | undefined; - createdAt: Date; - updatedAt: Date; - }; - }>; - invalid: () => Promise; - session: { - session: { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: better_auth_plugins.UserWithTwoFactor; - }; - } | { - valid: (ctx: better_auth.GenericEndpointContext) => Promise<{ - token: string; - user: { - id: string; - email: string; - emailVerified: boolean; - name: string; - image: string | null | undefined; - createdAt: Date; - updatedAt: Date; - }; - }>; - invalid: () => Promise; - session: { - session: Record & { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: Record & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined; - }; - }; - }>)[]; metadata: { openapi: { summary: string; @@ -12158,121 +11320,32 @@ declare const auth: { }; path: "/two-factor/verify-totp"; }; - } & { - signInAnonymous: { - | undefined)?]>(...inputCtx: C): Promise; - options: { - method: "POST"; - metadata: { - openapi: { - description: string; - responses: { - 200: { - description: string; - content: { - "application/json": { - schema: { - type: "object"; - properties: { - user: { - $ref: string; - }; - session: { - $ref: string; - }; - }; - }; - }; - }; - }; - }; - }; - }; - } & { - use: any[]; - }; - path: "/sign-in/anonymous"; - }; } & { getSession: { - ]>>; - disableRefresh: zod.ZodOptional; - }, "strip", zod.ZodTypeAny, { - disableCookieCache?: boolean | undefined; - disableRefresh?: boolean | undefined; - }, { + (inputCtx_0: { + body?: undefined; + } & { + method?: "GET" | undefined; + } & { + query?: { disableCookieCache?: string | boolean | undefined; disableRefresh?: boolean | undefined; - }>>; + } | undefined; } & { - use: any[]; - }> | undefined)?]>(...inputCtx: C): Promise; + } & { + request?: Request; + } & { + headers: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { user: { @@ -12342,9 +11415,6 @@ declare const auth: { } | null>; options: { method: "GET"; - metadata: { - CUSTOM_SESSION: boolean; - }; query: zod.ZodOptional]>>; disableRefresh: zod.ZodOptional; @@ -12355,6 +11425,29 @@ declare const auth: { disableCookieCache?: string | boolean | undefined; disableRefresh?: boolean | undefined; }>>; + metadata: { + CUSTOM_SESSION: boolean; + openapi: { + description: string; + responses: { + "200": { + description: string; + content: { + "application/json": { + schema: { + type: "array"; + nullable: boolean; + items: { + $ref: string; + }; + }; + }; + }; + }; + }; + }; + }; + requireHeaders: true; } & { use: any[]; }; @@ -12363,52 +11456,7 @@ declare const auth: { }>; options: { appName: string; - database: (options: better_auth.BetterAuthOptions) => { - id: string; - create, R = T>(data: { - model: string; - data: T; - select?: string[]; - }): Promise; - findOne(data: { - model: string; - where: better_auth.Where[]; - select?: string[]; - }): Promise; - findMany(data: { - model: string; - where?: better_auth.Where[]; - limit?: number; - sortBy?: { - field: string; - direction: "asc" | "desc"; - }; - offset?: number; - }): Promise; - count(data: { - model: string; - where?: better_auth.Where[]; - }): Promise; - update(data: { - model: string; - where: better_auth.Where[]; - update: Record; - }): Promise; - updateMany(data: { - model: string; - where: better_auth.Where[]; - update: Record; - }): Promise; - delete(data: { - model: string; - where: better_auth.Where[]; - }): Promise; - deleteMany(data: { - model: string; - where: better_auth.Where[]; - }): Promise; - options: better_auth_adapters_drizzle.DrizzleAdapterConfig; - }; + database: (options: better_auth.BetterAuthOptions) => better_auth.Adapter; advanced: { generateId: false; defaultCookieAttributes: { @@ -12481,76 +11529,30 @@ declare const auth: { id: "two-factor"; endpoints: { enableTwoFactor: { - (inputCtx_0: { + body: { password: string; - }, { - password: string; - }>; - use: ((inputContext: better_call.MiddlewareInputContext) => Promise<{ - session: { - session: Record & { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: Record & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined; - }; - }; - }>)[]; - metadata: { - openapi: { - summary: string; - description: string; - responses: { - 200: { - description: string; - content: { - "application/json": { - schema: { - type: "object"; - properties: { - totpURI: { - type: string; - description: string; - }; - backupCodes: { - type: string; - items: { - type: string; - }; - description: string; - }; - }; - }; - }; - }; - }; - }; - }; + issuer?: string | undefined; }; } & { - use: any[]; - }>]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { totpURI: string; @@ -12564,10 +11566,13 @@ declare const auth: { method: "POST"; body: zod.ZodObject<{ password: zod.ZodString; + issuer: zod.ZodOptional; }, "strip", zod.ZodTypeAny, { password: string; + issuer?: string | undefined; }, { password: string; + issuer?: string | undefined; }>; use: ((inputContext: better_call.MiddlewareInputContext) => Promise<{ session: { @@ -12629,68 +11634,29 @@ declare const auth: { path: "/two-factor/enable"; }; disableTwoFactor: { - (inputCtx_0: { + body: { password: string; - }, { - password: string; - }>; - use: ((inputContext: better_call.MiddlewareInputContext) => Promise<{ - session: { - session: Record & { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: Record & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined; - }; - }; - }>)[]; - metadata: { - openapi: { - summary: string; - description: string; - responses: { - 200: { - description: string; - content: { - "application/json": { - schema: { - type: "object"; - properties: { - status: { - type: string; - }; - }; - }; - }; - }; - }; - }; - }; }; } & { - use: any[]; - }>]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { status: boolean; @@ -12759,176 +11725,54 @@ declare const auth: { path: "/two-factor/disable"; }; verifyBackupCode: { - ; - trustDevice: zod.ZodOptional; - }, "strip", zod.ZodTypeAny, { + (inputCtx_0: { + body: { code: string; trustDevice?: boolean | undefined; disableSession?: boolean | undefined; - }, { - code: string; - trustDevice?: boolean | undefined; - disableSession?: boolean | undefined; - }>; - use: ((inputContext: better_call.MiddlewareInputContext<{ - body: zod.ZodObject<{ - trustDevice: zod.ZodOptional; - }, "strip", zod.ZodTypeAny, { - trustDevice?: boolean | undefined; - }, { - trustDevice?: boolean | undefined; - }>; - }>) => Promise<{ - valid: (ctx: better_auth.GenericEndpointContext) => Promise<{ - token: string; - user: { - id: string; - email: string; - emailVerified: boolean; - name: string; - image: string | null | undefined; - createdAt: Date; - updatedAt: Date; - }; - }>; - invalid: () => Promise; - session: { - session: { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: better_auth_plugins.UserWithTwoFactor; - }; - } | { - valid: (ctx: better_auth.GenericEndpointContext) => Promise<{ - token: string; - user: { - id: string; - email: string; - emailVerified: boolean; - name: string; - image: string | null | undefined; - createdAt: Date; - updatedAt: Date; - }; - }>; - invalid: () => Promise; - session: { - session: Record & { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: Record & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined; - }; - }; - }>)[]; + }; } & { - use: any[]; - }>]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { - user: better_auth_plugins.UserWithTwoFactor; - session: { - session: better_auth.Session & Record; - user: better_auth.User & Record; - } & { - session: { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: better_auth_plugins.UserWithTwoFactor; - } & { - session: Record & { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: Record & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined; - }; + token: string | undefined; + user: { + id: string; + email: string; + emailVerified: boolean; + name: string; + image: string | null | undefined; + createdAt: Date; + updatedAt: Date; }; }; } : { - user: better_auth_plugins.UserWithTwoFactor; - session: { - session: better_auth.Session & Record; - user: better_auth.User & Record; - } & { - session: { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: better_auth_plugins.UserWithTwoFactor; - } & { - session: Record & { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: Record & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined; - }; + token: string | undefined; + user: { + id: string; + email: string; + emailVerified: boolean; + name: string; + image: string | null | undefined; + createdAt: Date; + updatedAt: Date; }; }>; options: { @@ -12946,122 +11790,127 @@ declare const auth: { trustDevice?: boolean | undefined; disableSession?: boolean | undefined; }>; - use: ((inputContext: better_call.MiddlewareInputContext<{ - body: zod.ZodObject<{ - trustDevice: zod.ZodOptional; - }, "strip", zod.ZodTypeAny, { - trustDevice?: boolean | undefined; - }, { - trustDevice?: boolean | undefined; - }>; - }>) => Promise<{ - valid: (ctx: better_auth.GenericEndpointContext) => Promise<{ - token: string; - user: { - id: string; - email: string; - emailVerified: boolean; - name: string; - image: string | null | undefined; - createdAt: Date; - updatedAt: Date; - }; - }>; - invalid: () => Promise; - session: { - session: { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: better_auth_plugins.UserWithTwoFactor; - }; - } | { - valid: (ctx: better_auth.GenericEndpointContext) => Promise<{ - token: string; - user: { - id: string; - email: string; - emailVerified: boolean; - name: string; - image: string | null | undefined; - createdAt: Date; - updatedAt: Date; - }; - }>; - invalid: () => Promise; - session: { - session: Record & { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: Record & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined; + metadata: { + openapi: { + description: string; + responses: { + "200": { + description: string; + content: { + "application/json": { + schema: { + type: "object"; + properties: { + user: { + type: string; + properties: { + id: { + type: string; + description: string; + }; + email: { + type: string; + format: string; + nullable: boolean; + description: string; + }; + emailVerified: { + type: string; + nullable: boolean; + description: string; + }; + name: { + type: string; + nullable: boolean; + description: string; + }; + image: { + type: string; + format: string; + nullable: boolean; + description: string; + }; + twoFactorEnabled: { + type: string; + description: string; + }; + createdAt: { + type: string; + format: string; + description: string; + }; + updatedAt: { + type: string; + format: string; + description: string; + }; + }; + required: string[]; + description: string; + }; + session: { + type: string; + properties: { + token: { + type: string; + description: string; + }; + userId: { + type: string; + description: string; + }; + createdAt: { + type: string; + format: string; + description: string; + }; + expiresAt: { + type: string; + format: string; + description: string; + }; + }; + required: string[]; + description: string; + }; + }; + required: string[]; + }; + }; + }; + }; }; }; - }>)[]; + }; } & { use: any[]; }; path: "/two-factor/verify-backup-code"; }; generateBackupCodes: { - (inputCtx_0: { + body: { password: string; - }, { - password: string; - }>; - use: ((inputContext: better_call.MiddlewareInputContext) => Promise<{ - session: { - session: Record & { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: Record & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined; - }; - }; - }>)[]; + }; } & { - use: any[]; - }>]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { status: boolean; @@ -13103,31 +11952,67 @@ declare const auth: { }; }; }>)[]; + metadata: { + openapi: { + description: string; + responses: { + "200": { + description: string; + content: { + "application/json": { + schema: { + type: "object"; + properties: { + status: { + type: string; + description: string; + enum: boolean[]; + }; + backupCodes: { + type: string; + items: { + type: string; + }; + description: string; + }; + }; + required: string[]; + }; + }; + }; + }; + }; + }; + }; } & { use: any[]; }; path: "/two-factor/generate-backup-codes"; }; viewBackupCodes: { - (inputCtx_0: { + body: { userId: string; - }, { - userId: string; - }>; - metadata: { - SERVER_ONLY: true; }; } & { - use: any[]; - }>]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { status: boolean; @@ -13155,116 +12040,29 @@ declare const auth: { path: "/two-factor/view-backup-codes"; }; sendTwoFactorOTP: { - ; - }, "strip", zod.ZodTypeAny, { + (inputCtx_0?: ({ + body?: { trustDevice?: boolean | undefined; - }, { - trustDevice?: boolean | undefined; - }>>; - use: ((inputContext: better_call.MiddlewareInputContext<{ - body: zod.ZodObject<{ - trustDevice: zod.ZodOptional; - }, "strip", zod.ZodTypeAny, { - trustDevice?: boolean | undefined; - }, { - trustDevice?: boolean | undefined; - }>; - }>) => Promise<{ - valid: (ctx: better_auth.GenericEndpointContext) => Promise<{ - token: string; - user: { - id: string; - email: string; - emailVerified: boolean; - name: string; - image: string | null | undefined; - createdAt: Date; - updatedAt: Date; - }; - }>; - invalid: () => Promise; - session: { - session: { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: better_auth_plugins.UserWithTwoFactor; - }; - } | { - valid: (ctx: better_auth.GenericEndpointContext) => Promise<{ - token: string; - user: { - id: string; - email: string; - emailVerified: boolean; - name: string; - image: string | null | undefined; - createdAt: Date; - updatedAt: Date; - }; - }>; - invalid: () => Promise; - session: { - session: Record & { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: Record & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined; - }; - }; - }>)[]; - metadata: { - openapi: { - summary: string; - description: string; - responses: { - 200: { - description: string; - content: { - "application/json": { - schema: { - type: "object"; - properties: { - status: { - type: string; - }; - }; - }; - }; - }; - }; - }; - }; - }; + } | undefined; } & { - use: any[]; - }> | undefined)?]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }) | undefined): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { status: boolean; @@ -13281,77 +12079,6 @@ declare const auth: { }, { trustDevice?: boolean | undefined; }>>; - use: ((inputContext: better_call.MiddlewareInputContext<{ - body: zod.ZodObject<{ - trustDevice: zod.ZodOptional; - }, "strip", zod.ZodTypeAny, { - trustDevice?: boolean | undefined; - }, { - trustDevice?: boolean | undefined; - }>; - }>) => Promise<{ - valid: (ctx: better_auth.GenericEndpointContext) => Promise<{ - token: string; - user: { - id: string; - email: string; - emailVerified: boolean; - name: string; - image: string | null | undefined; - createdAt: Date; - updatedAt: Date; - }; - }>; - invalid: () => Promise; - session: { - session: { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: better_auth_plugins.UserWithTwoFactor; - }; - } | { - valid: (ctx: better_auth.GenericEndpointContext) => Promise<{ - token: string; - user: { - id: string; - email: string; - emailVerified: boolean; - name: string; - image: string | null | undefined; - createdAt: Date; - updatedAt: Date; - }; - }>; - invalid: () => Promise; - session: { - session: Record & { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: Record & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined; - }; - }; - }>)[]; metadata: { openapi: { summary: string; @@ -13381,142 +12108,53 @@ declare const auth: { path: "/two-factor/send-otp"; }; verifyTwoFactorOTP: { - ; - }, "strip", zod.ZodTypeAny, { + (inputCtx_0: { + body: { code: string; trustDevice?: boolean | undefined; - }, { - code: string; - trustDevice?: boolean | undefined; - }>; - use: ((inputContext: better_call.MiddlewareInputContext<{ - body: zod.ZodObject<{ - trustDevice: zod.ZodOptional; - }, "strip", zod.ZodTypeAny, { - trustDevice?: boolean | undefined; - }, { - trustDevice?: boolean | undefined; - }>; - }>) => Promise<{ - valid: (ctx: better_auth.GenericEndpointContext) => Promise<{ - token: string; - user: { - id: string; - email: string; - emailVerified: boolean; - name: string; - image: string | null | undefined; - createdAt: Date; - updatedAt: Date; - }; - }>; - invalid: () => Promise; - session: { - session: { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: better_auth_plugins.UserWithTwoFactor; - }; - } | { - valid: (ctx: better_auth.GenericEndpointContext) => Promise<{ - token: string; - user: { - id: string; - email: string; - emailVerified: boolean; - name: string; - image: string | null | undefined; - createdAt: Date; - updatedAt: Date; - }; - }>; - invalid: () => Promise; - session: { - session: Record & { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: Record & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined; - }; - }; - }>)[]; - metadata: { - openapi: { - summary: string; - description: string; - responses: { - 200: { - description: string; - content: { - "application/json": { - schema: { - type: "object"; - properties: { - status: { - type: string; - }; - }; - }; - }; - }; - }; - }; - }; }; } & { - use: any[]; - }>]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { token: string; user: { - id: string; - email: string; - emailVerified: boolean; - name: string; - image: string | null | undefined; - createdAt: Date; - updatedAt: Date; + id: any; + email: any; + emailVerified: any; + name: any; + image: any; + createdAt: any; + updatedAt: any; }; }; } : { token: string; user: { - id: string; - email: string; - emailVerified: boolean; - name: string; - image: string | null | undefined; - createdAt: Date; - updatedAt: Date; + id: any; + email: any; + emailVerified: any; + name: any; + image: any; + createdAt: any; + updatedAt: any; }; }>; options: { @@ -13531,93 +12169,67 @@ declare const auth: { code: string; trustDevice?: boolean | undefined; }>; - use: ((inputContext: better_call.MiddlewareInputContext<{ - body: zod.ZodObject<{ - trustDevice: zod.ZodOptional; - }, "strip", zod.ZodTypeAny, { - trustDevice?: boolean | undefined; - }, { - trustDevice?: boolean | undefined; - }>; - }>) => Promise<{ - valid: (ctx: better_auth.GenericEndpointContext) => Promise<{ - token: string; - user: { - id: string; - email: string; - emailVerified: boolean; - name: string; - image: string | null | undefined; - createdAt: Date; - updatedAt: Date; - }; - }>; - invalid: () => Promise; - session: { - session: { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: better_auth_plugins.UserWithTwoFactor; - }; - } | { - valid: (ctx: better_auth.GenericEndpointContext) => Promise<{ - token: string; - user: { - id: string; - email: string; - emailVerified: boolean; - name: string; - image: string | null | undefined; - createdAt: Date; - updatedAt: Date; - }; - }>; - invalid: () => Promise; - session: { - session: Record & { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: Record & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined; - }; - }; - }>)[]; metadata: { openapi: { summary: string; description: string; responses: { - 200: { + "200": { description: string; content: { "application/json": { schema: { type: "object"; properties: { - status: { + token: { type: string; + description: string; + }; + user: { + type: string; + properties: { + id: { + type: string; + description: string; + }; + email: { + type: string; + format: string; + nullable: boolean; + description: string; + }; + emailVerified: { + type: string; + nullable: boolean; + description: string; + }; + name: { + type: string; + nullable: boolean; + description: string; + }; + image: { + type: string; + format: string; + nullable: boolean; + description: string; + }; + createdAt: { + type: string; + format: string; + description: string; + }; + updatedAt: { + type: string; + format: string; + description: string; + }; + }; + required: string[]; + description: string; }; }; + required: string[]; }; }; }; @@ -13631,61 +12243,29 @@ declare const auth: { path: "/two-factor/verify-otp"; }; generateTOTP: { - ) => Promise<{ - session: { - session: Record & { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: Record & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined; - }; - }; - }>)[]; - metadata: { - openapi: { - summary: string; - description: string; - responses: { - 200: { - description: string; - content: { - "application/json": { - schema: { - type: "object"; - properties: { - code: { - type: string; - }; - }; - }; - }; - }; - }; - }; - }; + (inputCtx_0: { + body: { + secret: string; }; } & { - use: any[]; - }> | undefined)?]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { code: string; @@ -13695,89 +12275,12 @@ declare const auth: { }>; options: { method: "POST"; - use: ((inputContext: better_call.MiddlewareInputContext) => Promise<{ - session: { - session: Record & { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: Record & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined; - }; - }; - }>)[]; - metadata: { - openapi: { - summary: string; - description: string; - responses: { - 200: { - description: string; - content: { - "application/json": { - schema: { - type: "object"; - properties: { - code: { - type: string; - }; - }; - }; - }; - }; - }; - }; - }; - }; - } & { - use: any[]; - }; - path: "/totp/generate"; - }; - getTOTPURI: { - ) => Promise<{ - session: { - session: Record & { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: Record & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined; - }; - }; - }>)[]; body: zod.ZodObject<{ - password: zod.ZodString; + secret: zod.ZodString; }, "strip", zod.ZodTypeAny, { - password: string; + secret: string; }, { - password: string; + secret: string; }>; metadata: { openapi: { @@ -13791,7 +12294,7 @@ declare const auth: { schema: { type: "object"; properties: { - totpURI: { + code: { type: string; }; }; @@ -13801,14 +12304,37 @@ declare const auth: { }; }; }; + SERVER_ONLY: true; }; } & { use: any[]; - }>]>(...inputCtx: C): Promise(inputCtx_0: { + body: { + password: string; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { totpURI: string; @@ -13877,119 +12403,30 @@ declare const auth: { path: "/two-factor/get-totp-uri"; }; verifyTOTP: { - ; - }, "strip", zod.ZodTypeAny, { + (inputCtx_0: { + body: { code: string; trustDevice?: boolean | undefined; - }, { - code: string; - trustDevice?: boolean | undefined; - }>; - use: ((inputContext: better_call.MiddlewareInputContext<{ - body: zod.ZodObject<{ - trustDevice: zod.ZodOptional; - }, "strip", zod.ZodTypeAny, { - trustDevice?: boolean | undefined; - }, { - trustDevice?: boolean | undefined; - }>; - }>) => Promise<{ - valid: (ctx: better_auth.GenericEndpointContext) => Promise<{ - token: string; - user: { - id: string; - email: string; - emailVerified: boolean; - name: string; - image: string | null | undefined; - createdAt: Date; - updatedAt: Date; - }; - }>; - invalid: () => Promise; - session: { - session: { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: better_auth_plugins.UserWithTwoFactor; - }; - } | { - valid: (ctx: better_auth.GenericEndpointContext) => Promise<{ - token: string; - user: { - id: string; - email: string; - emailVerified: boolean; - name: string; - image: string | null | undefined; - createdAt: Date; - updatedAt: Date; - }; - }>; - invalid: () => Promise; - session: { - session: Record & { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: Record & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined; - }; - }; - }>)[]; - metadata: { - openapi: { - summary: string; - description: string; - responses: { - 200: { - description: string; - content: { - "application/json": { - schema: { - type: "object"; - properties: { - status: { - type: string; - }; - }; - }; - }; - }; - }; - }; - }; }; } & { - use: any[]; - }>]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { token: string; @@ -14027,77 +12464,6 @@ declare const auth: { code: string; trustDevice?: boolean | undefined; }>; - use: ((inputContext: better_call.MiddlewareInputContext<{ - body: zod.ZodObject<{ - trustDevice: zod.ZodOptional; - }, "strip", zod.ZodTypeAny, { - trustDevice?: boolean | undefined; - }, { - trustDevice?: boolean | undefined; - }>; - }>) => Promise<{ - valid: (ctx: better_auth.GenericEndpointContext) => Promise<{ - token: string; - user: { - id: string; - email: string; - emailVerified: boolean; - name: string; - image: string | null | undefined; - createdAt: Date; - updatedAt: Date; - }; - }>; - invalid: () => Promise; - session: { - session: { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: better_auth_plugins.UserWithTwoFactor; - }; - } | { - valid: (ctx: better_auth.GenericEndpointContext) => Promise<{ - token: string; - user: { - id: string; - email: string; - emailVerified: boolean; - name: string; - image: string | null | undefined; - createdAt: Date; - updatedAt: Date; - }; - }>; - invalid: () => Promise; - session: { - session: Record & { - id: string; - createdAt: Date; - updatedAt: Date; - userId: string; - expiresAt: Date; - token: string; - ipAddress?: string | null | undefined; - userAgent?: string | null | undefined; - }; - user: Record & { - id: string; - name: string; - email: string; - emailVerified: boolean; - createdAt: Date; - updatedAt: Date; - image?: string | null | undefined; - }; - }; - }>)[]; metadata: { openapi: { summary: string; @@ -14176,6 +12542,17 @@ declare const auth: { window: number; max: number; }[]; + $ERROR_CODES: { + readonly OTP_NOT_ENABLED: "OTP not enabled"; + readonly OTP_HAS_EXPIRED: "OTP has expired"; + readonly TOTP_NOT_ENABLED: "TOTP not enabled"; + readonly TWO_FACTOR_NOT_ENABLED: "Two factor isn't enabled"; + readonly BACKUP_CODES_NOT_ENABLED: "Backup codes aren't enabled"; + readonly INVALID_BACKUP_CODE: "Invalid backup code"; + readonly INVALID_CODE: "Invalid code"; + readonly TOO_MANY_ATTEMPTS_REQUEST_NEW_CODE: "Too many attempts. Please request a new code."; + readonly INVALID_TWO_FACTOR_COOKIE: "Invalid two factor cookie"; + }; } | { id: "expo"; init: (ctx: better_auth.AuthContext) => { @@ -14192,147 +12569,34 @@ declare const auth: { handler: (inputContext: better_call.MiddlewareInputContext) => Promise; }[]; }; - } | { - id: "anonymous"; - endpoints: { - signInAnonymous: { - | undefined)?]>(...inputCtx: C): Promise; - options: { - method: "POST"; - metadata: { - openapi: { - description: string; - responses: { - 200: { - description: string; - content: { - "application/json": { - schema: { - type: "object"; - properties: { - user: { - $ref: string; - }; - session: { - $ref: string; - }; - }; - }; - }; - }; - }; - }; - }; - }; - } & { - use: any[]; - }; - path: "/sign-in/anonymous"; - }; - }; - hooks: { - after: { - matcher(ctx: better_auth.HookEndpointContext): boolean; - handler: (inputContext: better_call.MiddlewareInputContext) => Promise; - }[]; - }; - schema: { - user: { - fields: { - isAnonymous: { - type: "boolean"; - required: false; - }; - }; - }; - }; - $ERROR_CODES: { - readonly FAILED_TO_CREATE_USER: "Failed to create user"; - readonly COULD_NOT_CREATE_SESSION: "Could not create session"; - readonly ANONYMOUS_USERS_CANNOT_SIGN_IN_AGAIN_ANONYMOUSLY: "Anonymous users cannot sign in again anonymously"; - }; } | { id: "custom-session"; endpoints: { getSession: { - ]>>; - disableRefresh: zod.ZodOptional; - }, "strip", zod.ZodTypeAny, { - disableCookieCache?: boolean | undefined; - disableRefresh?: boolean | undefined; - }, { + (inputCtx_0: { + body?: undefined; + } & { + method?: "GET" | undefined; + } & { + query?: { disableCookieCache?: string | boolean | undefined; disableRefresh?: boolean | undefined; - }>>; + } | undefined; } & { - use: any[]; - }> | undefined)?]>(...inputCtx: C): Promise; + } & { + request?: Request; + } & { + headers: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { user: { @@ -14402,9 +12666,6 @@ declare const auth: { } | null>; options: { method: "GET"; - metadata: { - CUSTOM_SESSION: boolean; - }; query: zod.ZodOptional]>>; disableRefresh: zod.ZodOptional; @@ -14415,6 +12676,29 @@ declare const auth: { disableCookieCache?: string | boolean | undefined; disableRefresh?: boolean | undefined; }>>; + metadata: { + CUSTOM_SESSION: boolean; + openapi: { + description: string; + responses: { + "200": { + description: string; + content: { + "application/json": { + schema: { + type: "array"; + nullable: boolean; + items: { + $ref: string; + }; + }; + }; + }; + }; + }; + }; + }; + requireHeaders: true; } & { use: any[]; }; @@ -14425,15 +12709,27 @@ declare const auth: { id: "customGetProviders"; endpoints: { customGetProviders: { - (inputCtx_0?: ({ + body?: undefined; } & { - use: any[]; - }> | undefined)?]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }) | undefined): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: any; } : any>; @@ -14445,49 +12741,31 @@ declare const auth: { path: "/get-providers"; }; }; - } | { - id: "customCreateSession"; - endpoints: { - customCreateSession: { - | undefined)?]>(...inputCtx: C): Promise; - options: { - method: "GET"; - } & { - use: any[]; - }; - path: "/create-session"; - }; - }; } | { id: "getAccountInfo"; endpoints: { getAccountInfo: { - (inputCtx_0?: ({ + body?: undefined; } & { - use: any[]; - }> | undefined)?]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }) | undefined): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: { id: string; @@ -14523,15 +12801,27 @@ declare const auth: { id: "customUpdateUser"; endpoints: { customUpdateUser: { - (inputCtx_0?: ({ + body?: undefined; } & { - use: any[]; - }> | undefined)?]>(...inputCtx: C): Promise | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }) | undefined): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { headers: Headers; response: string | null; } : string | null>; @@ -14543,6 +12833,172 @@ declare const auth: { path: "/update-user-ccc"; }; }; + } | { + id: "oneTimeToken"; + endpoints: { + generateOneTimeToken: { + (inputCtx_0?: ({ + body?: undefined; + } & { + method?: "GET" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }) | undefined): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + token: string; + }; + } : { + token: string; + }>; + options: { + method: "GET"; + use: ((inputContext: better_call.MiddlewareInputContext) => Promise<{ + session: { + session: Record & { + id: string; + createdAt: Date; + updatedAt: Date; + userId: string; + expiresAt: Date; + token: string; + ipAddress?: string | null | undefined; + userAgent?: string | null | undefined; + }; + user: Record & { + id: string; + name: string; + email: string; + emailVerified: boolean; + createdAt: Date; + updatedAt: Date; + image?: string | null | undefined; + }; + }; + }>)[]; + } & { + use: any[]; + }; + path: "/one-time-token/generate"; + }; + applyOneTimeToken: { + (inputCtx_0: { + body: { + token: string; + }; + } & { + method?: "POST" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + user: { + id: string; + name: string; + email: string; + emailVerified: boolean; + createdAt: Date; + updatedAt: Date; + image?: string | null | undefined; + } & Record; + }; + } : { + user: { + id: string; + name: string; + email: string; + emailVerified: boolean; + createdAt: Date; + updatedAt: Date; + image?: string | null | undefined; + } & Record; + }>; + options: { + method: "POST"; + body: zod.ZodObject<{ + token: zod.ZodString; + }, "strip", zod.ZodTypeAny, { + token: string; + }, { + token: string; + }>; + } & { + use: any[]; + }; + path: "/one-time-token/apply"; + }; + }; + } | { + id: "customCreateSession"; + endpoints: { + customCreateSession: { + (inputCtx_0?: ({ + body?: undefined; + } & { + method?: "GET" | undefined; + } & { + query?: Record | undefined; + } & { + params?: Record; + } & { + request?: Request; + } & { + headers?: HeadersInit; + } & { + asResponse?: boolean; + returnHeaders?: boolean; + use?: better_call.Middleware[]; + path?: string; + } & { + asResponse?: AsResponse | undefined; + returnHeaders?: ReturnHeaders | undefined; + }) | undefined): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? { + headers: Headers; + response: { + ck: string; + userId: string; + } | null; + } : { + ck: string; + userId: string; + } | null>; + options: { + method: "GET"; + } & { + use: any[]; + }; + path: "/create-session"; + }; + }; })[]; }; $context: Promise; @@ -14568,14 +13024,19 @@ declare const auth: { image?: string | null | undefined | undefined; handle: string; twoFactorEnabled: boolean | null | undefined; - isAnonymous?: boolean | null | undefined; }; }; }; $ERROR_CODES: { - readonly FAILED_TO_CREATE_USER: "Failed to create user"; - readonly COULD_NOT_CREATE_SESSION: "Could not create session"; - readonly ANONYMOUS_USERS_CANNOT_SIGN_IN_AGAIN_ANONYMOUSLY: "Anonymous users cannot sign in again anonymously"; + readonly OTP_NOT_ENABLED: "OTP not enabled"; + readonly OTP_HAS_EXPIRED: "OTP has expired"; + readonly TOTP_NOT_ENABLED: "TOTP not enabled"; + readonly TWO_FACTOR_NOT_ENABLED: "Two factor isn't enabled"; + readonly BACKUP_CODES_NOT_ENABLED: "Backup codes aren't enabled"; + readonly INVALID_BACKUP_CODE: "Invalid backup code"; + readonly INVALID_CODE: "Invalid code"; + readonly TOO_MANY_ATTEMPTS_REQUEST_NEW_CODE: "Too many attempts. Please request a new code."; + readonly INVALID_TWO_FACTOR_COOKIE: "Invalid two factor cookie"; } & { USER_NOT_FOUND: string; FAILED_TO_CREATE_USER: string; @@ -14816,6 +13277,7 @@ declare const _routes: hono_hono_base.HonoBase | hono_types.MergeSchemaPath<{ "/configs": { $get: { @@ -17705,4 +16201,4 @@ declare const _routes: hono_hono_base.HonoBase, "/">; type AppType = typeof _routes; -export { type ActionsModel, type AirdropActivity, type AppType, type AttachmentsModel, type AuthSession, type AuthUser, CommonEntryFields, type ConditionItem, type DetailModel, type EntriesModel, type ExtraModel, type FeedModel, type ListModel, type MediaModel, type MessagingData, MessagingType, type SettingsModel, type UrlReadsModel, account, achievements, achievementsOpenAPISchema, actions, actionsItemOpenAPISchema, actionsOpenAPISchema, actionsRelations, activityEnum, airdrops, airdropsOpenAPISchema, attachmentsZodSchema, authPlugins, boosts, captcha, collections, collectionsOpenAPISchema, collectionsRelations, detailModelSchema, entries, entriesOpenAPISchema, entriesRelations, extraZodSchema, feedPowerTokens, feedPowerTokensOpenAPISchema, feedPowerTokensRelations, feeds, feedsOpenAPISchema, feedsRelations, inboxHandleSchema, inboxes, inboxesEntries, inboxesEntriesInsertOpenAPISchema, type inboxesEntriesModel, inboxesEntriesOpenAPISchema, inboxesEntriesRelations, inboxesOpenAPISchema, inboxesRelations, invitations, invitationsOpenAPISchema, invitationsRelations, languageSchema, levels, levelsOpenAPISchema, levelsRelations, lists, listsOpenAPISchema, listsRelations, listsSubscriptions, listsSubscriptionsOpenAPISchema, listsSubscriptionsRelations, lower, mediaZodSchema, messaging, messagingOpenAPISchema, messagingRelations, rsshub, rsshubOpenAPISchema, rsshubPurchase, rsshubUsage, rsshubUsageOpenAPISchema, rsshubUsageRelations, session, settings, subscriptions, subscriptionsOpenAPISchema, subscriptionsRelations, timeline, timelineOpenAPISchema, timelineRelations, transactionType, transactions, transactionsOpenAPISchema, transactionsRelations, twoFactor, uploads, urlReads, urlReadsOpenAPISchema, user, users, usersOpenApiSchema, usersRelations, verification, wallets, walletsOpenAPISchema, walletsRelations }; +export { type ActionsModel, type AirdropActivity, type AppType, type AttachmentsModel, type AuthSession, type AuthUser, CommonEntryFields, type ConditionItem, type DetailModel, type EntriesModel, type ExtraModel, type FeedModel, type ListModel, type MediaModel, type MessagingData, MessagingType, type SettingsModel, type UrlReadsModel, account, achievements, achievementsOpenAPISchema, actions, actionsItemOpenAPISchema, actionsOpenAPISchema, actionsRelations, activityEnum, airdrops, airdropsOpenAPISchema, attachmentsZodSchema, authPlugins, boosts, captcha, collections, collectionsOpenAPISchema, collectionsRelations, detailModelSchema, entries, entriesOpenAPISchema, entriesRelations, extraZodSchema, feedPowerTokens, feedPowerTokensOpenAPISchema, feedPowerTokensRelations, feeds, feedsOpenAPISchema, feedsRelations, inboxHandleSchema, inboxes, inboxesEntries, inboxesEntriesInsertOpenAPISchema, type inboxesEntriesModel, inboxesEntriesOpenAPISchema, inboxesEntriesRelations, inboxesOpenAPISchema, inboxesRelations, invitations, invitationsOpenAPISchema, invitationsRelations, languageSchema, levels, levelsOpenAPISchema, levelsRelations, lists, listsOpenAPISchema, listsRelations, listsSubscriptions, listsSubscriptionsOpenAPISchema, listsSubscriptionsRelations, lower, mediaZodSchema, messaging, messagingOpenAPISchema, messagingRelations, readabilities, rsshub, rsshubOpenAPISchema, rsshubPurchase, rsshubUsage, rsshubUsageOpenAPISchema, rsshubUsageRelations, session, settings, subscriptions, subscriptionsOpenAPISchema, subscriptionsRelations, timeline, timelineOpenAPISchema, timelineRelations, transactionType, transactions, transactionsOpenAPISchema, transactionsRelations, twoFactor, uploads, urlReads, urlReadsOpenAPISchema, user, users, usersOpenApiSchema, usersRelations, verification, wallets, walletsOpenAPISchema, walletsRelations }; diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index e268b9b23..ee2eae8e1 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -1,4 +1,3 @@ export * from "./constants" -export * from "./env" export type { AppType, languageSchema, users } from "./hono" export * from "./language" diff --git a/packages/shared/src/settings/defaults.ts b/packages/shared/src/settings/defaults.ts index adee6d4a3..de00ca008 100644 --- a/packages/shared/src/settings/defaults.ts +++ b/packages/shared/src/settings/defaults.ts @@ -36,7 +36,7 @@ export const defaultGeneralSettings: GeneralSettings = { enhancedSettings: false, // @mobile - openLinksInApp: true, + openLinksInExternalApp: false, } export const defaultUISettings: UISettings = { @@ -90,7 +90,7 @@ export const defaultUISettings: UISettings = { export const defaultIntegrationSettings: IntegrationSettings = { // eagle - enableEagle: true, + enableEagle: false, // readwise enableReadwise: false, @@ -120,6 +120,8 @@ export const defaultIntegrationSettings: IntegrationSettings = { enableCubox: false, cuboxToken: "", enableCuboxAutoMemo: false, + + saveSummaryAsDescription: false, } export const defaultSettings = { diff --git a/packages/shared/src/settings/interface.ts b/packages/shared/src/settings/interface.ts index c481ba823..7c8764928 100644 --- a/packages/shared/src/settings/interface.ts +++ b/packages/shared/src/settings/interface.ts @@ -29,7 +29,7 @@ export interface GeneralSettings { enhancedSettings: boolean // @mobile - openLinksInApp: boolean + openLinksInExternalApp: boolean } export interface UISettings { @@ -106,4 +106,6 @@ export interface IntegrationSettings { enableCubox: boolean cuboxToken: string enableCuboxAutoMemo: boolean + + saveSummaryAsDescription: boolean } diff --git a/packages/tracker/package.json b/packages/tracker/package.json index 3c85e470e..adc6f340e 100644 --- a/packages/tracker/package.json +++ b/packages/tracker/package.json @@ -4,6 +4,6 @@ "private": true, "main": "./src/index.ts", "devDependencies": { - "@react-native-firebase/analytics": "21.13.0" + "@react-native-firebase/analytics": "21.14.0" } } diff --git a/packages/utils/package.json b/packages/utils/package.json index 6382787ef..cba704388 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -37,12 +37,12 @@ "chardet": "2.1.0", "clsx": "2.1.1", "dompurify": "3.2.5", - "framer-motion": "12.6.3", "linkedom": "0.18.9", + "motion": "12.7.4", "nanoid": "5.1.5", "path-to-regexp": "8.2.0", - "tailwind-merge": "3.1.0", - "tldts": "6.1.85", + "tailwind-merge": "3.2.0", + "tldts": "7.0.0", "uniqolor": "1.1.1" } } diff --git a/packages/utils/src/scroller.ts b/packages/utils/src/scroller.ts index 56735a946..3504b48f6 100644 --- a/packages/utils/src/scroller.ts +++ b/packages/utils/src/scroller.ts @@ -1,7 +1,7 @@ // @see https://github.com/Innei/sprightly/blob/2444dcdb789ca585337a4d241095640a524231db/src/lib/scroller.ts -import type { Spring } from "framer-motion" -import { animateValue } from "framer-motion" +import type { Spring } from "motion/react" +import { animateValue } from "motion/react" const spring: Spring = { type: "spring", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6483ef883..029f5751e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,8 +6,8 @@ settings: overrides: '@electron/node-gyp': 10.2.0-electron.2 - is-core-module: npm:@nolyfill/is-core-module@1 - isarray: npm:@nolyfill/isarray@1 + is-core-module: npm:@nolyfill/is-core-module@1.0.39 + isarray: npm:@nolyfill/isarray@1.0.44 react: 18.3.1 react-dom: 18.3.1 unist-util-visit-parents: 5.1.3 @@ -63,7 +63,7 @@ importers: devDependencies: '@egoist/tailwindcss-icons': specifier: 1.9.0 - version: 1.9.0(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.0)(typescript@5.8.3))) + version: 1.9.0(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3))) '@eslint/compat': specifier: 1.2.8 version: 1.2.8(eslint@9.24.0(jiti@2.4.2)) @@ -74,17 +74,17 @@ importers: specifier: 1.2.3 version: 1.2.3 '@iconify-json/simple-icons': - specifier: 1.2.30 - version: 1.2.30 + specifier: 1.2.32 + version: 1.2.32 '@iconify/tools': specifier: 4.1.2 version: 4.1.2 '@tailwindcss/container-queries': specifier: 0.1.1 - version: 0.1.1(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.0)(typescript@5.8.3))) + version: 0.1.1(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3))) '@tailwindcss/typography': specifier: 0.5.16 - version: 0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.0)(typescript@5.8.3))) + version: 0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3))) '@tsslint/cli': specifier: 1.5.11 version: 1.5.11(typescript@5.8.3) @@ -95,8 +95,8 @@ importers: specifier: 1.5.11 version: 1.5.11(jiti@2.4.2)(typescript@5.8.3) '@types/node': - specifier: 22.14.0 - version: 22.14.0 + specifier: 22.14.1 + version: 22.14.1 '@types/react': specifier: 18.3.12 version: 18.3.12 @@ -122,8 +122,8 @@ importers: specifier: 9.24.0 version: 9.24.0(jiti@2.4.2) eslint-config-hyoban: - specifier: 4.0.2 - version: 4.0.2(@types/estree@1.0.7)(@typescript-eslint/eslint-plugin@8.28.0(@typescript-eslint/parser@8.28.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2))(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.0)(typescript@5.8.3)))(ts-api-utils@2.1.0(typescript@5.8.3))(typescript@5.8.3) + specifier: 4.0.3 + version: 4.0.3(@types/estree@1.0.7)(@typescript-eslint/eslint-plugin@8.30.1(@typescript-eslint/parser@8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2))(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3)))(ts-api-utils@2.1.0(typescript@5.8.3))(typescript@5.8.3) eslint-plugin-react-native: specifier: 5.0.0 version: 5.0.0(eslint@9.24.0(jiti@2.4.2)) @@ -131,11 +131,11 @@ importers: specifier: 3.3.3 version: 3.3.3 lint-staged: - specifier: 15.5.0 - version: 15.5.0 + specifier: 15.5.1 + version: 15.5.1 nbump: - specifier: 2.0.7 - version: 2.0.7(conventional-commits-filter@5.0.0) + specifier: 2.1.0 + version: 2.1.0(conventional-commits-filter@5.0.0) postcss: specifier: 8.5.3 version: 8.5.3 @@ -168,16 +168,16 @@ importers: version: 2.0.4 tailwindcss: specifier: 3.4.17 - version: 3.4.17(ts-node@10.9.2(@types/node@22.14.0)(typescript@5.8.3)) + version: 3.4.17(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3)) tailwindcss-animate: specifier: 1.0.7 - version: 1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.0)(typescript@5.8.3))) + version: 1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3))) tailwindcss-motion: specifier: 1.1.0 - version: 1.1.0(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.0)(typescript@5.8.3))) + version: 1.1.0(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3))) tailwindcss-safe-area: specifier: 0.6.0 - version: 0.6.0(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.0)(typescript@5.8.3))) + version: 0.6.0(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3))) tar: specifier: 7.4.3 version: 7.4.3 @@ -191,26 +191,29 @@ importers: specifier: 5.8.3 version: 5.8.3 vite: - specifier: 6.2.5 - version: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1) + specifier: 6.3.2 + version: 6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1) vite-bundle-analyzer: specifier: 0.18.1 version: 0.18.1 vite-plugin-mkcert: specifier: 1.17.8 - version: 1.17.8(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)) + version: 1.17.8(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)) vite-plugin-pwa: specifier: 1.0.0 - version: 1.0.0(@vite-pwa/assets-generator@1.0.0)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0) + version: 1.0.0(@vite-pwa/assets-generator@1.0.0)(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0) vite-tsconfig-paths: specifier: 5.1.4 - version: 5.1.4(typescript@5.8.3)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)) + version: 5.1.4(typescript@5.8.3)(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)) vitest: specifier: 3.1.1 - version: 3.1.1(@edge-runtime/vm@3.2.0)(@types/debug@4.1.12)(@types/node@22.14.0)(happy-dom@17.4.4)(jiti@2.4.2)(jsdom@20.0.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1) + version: 3.1.1(@edge-runtime/vm@3.2.0)(@types/debug@4.1.12)(@types/node@22.14.1)(happy-dom@17.4.4)(jiti@2.4.2)(jsdom@20.0.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1) apps/desktop: dependencies: + cookie-es: + specifier: 2.0.0 + version: 2.0.0 react-google-recaptcha: specifier: 3.1.0 version: 3.1.0(react@18.3.1) @@ -219,8 +222,8 @@ importers: version: 1.10.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) devDependencies: '@clack/prompts': - specifier: 0.10.0 - version: 0.10.0 + specifier: 0.10.1 + version: 0.10.1 '@electron-forge/cli': specifier: 7.8.0 version: 7.8.0(encoding@0.1.13) @@ -247,7 +250,7 @@ importers: version: 7.8.0(encoding@0.1.13) '@electron-toolkit/tsconfig': specifier: 1.0.1 - version: 1.0.1(@types/node@22.14.0) + version: 1.0.1(@types/node@22.14.1) '@follow/components': specifier: workspace:* version: link:../../packages/components @@ -282,11 +285,11 @@ importers: specifier: 2.1.9 version: 2.1.9 '@vitejs/plugin-legacy': - specifier: 6.0.2 - version: 6.0.2(terser@5.39.0)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)) + specifier: 6.1.0 + version: 6.1.0(terser@5.39.0)(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)) '@vitejs/plugin-react': - specifier: 4.3.4 - version: 4.3.4(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)) + specifier: 4.4.0 + version: 4.4.0(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)) autoprefixer: specifier: 10.4.21 version: 10.4.21(postcss@8.5.3) @@ -297,14 +300,14 @@ importers: specifier: 7.0.6 version: 7.0.6(postcss@8.5.3) dotenv: - specifier: 16.4.7 - version: 16.4.7 + specifier: 16.5.0 + version: 16.5.0 drizzle-orm: - specifier: 0.41.0 - version: 0.41.0(9928b483d1845c28fd62a2a8fba14be2) + specifier: 0.42.0 + version: 0.42.0(f40899e93cf53ec5f598dddbb63d39a8) electron: - specifier: 34.5.0 - version: 34.5.0 + specifier: 35.1.5 + version: 35.1.5 electron-devtools-installer: specifier: 4.0.0 version: 4.0.0 @@ -313,7 +316,7 @@ importers: version: 0.6.0 electron-vite: specifier: 3.1.0 - version: 3.1.0(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)) + version: 3.1.0(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)) fake-indexeddb: specifier: 6.0.0 version: 6.0.0 @@ -321,8 +324,8 @@ importers: specifier: 17.4.4 version: 17.4.4 hono: - specifier: 4.7.5 - version: 4.7.5(patch_hash=5c74c2d2afaa5880c13d75458dd26c84da568851691b1fb6de6d877c29936d05) + specifier: 4.7.6 + version: 4.7.6(patch_hash=5c74c2d2afaa5880c13d75458dd26c84da568851691b1fb6de6d877c29936d05) html-minifier-terser: specifier: 7.2.0 version: 7.2.0 @@ -330,8 +333,8 @@ importers: specifier: 4.1.0 version: 4.1.0 nbump: - specifier: 2.0.7 - version: 2.0.7(conventional-commits-filter@5.0.0) + specifier: 2.1.0 + version: 2.1.0(conventional-commits-filter@5.0.0) react: specifier: 18.3.1 version: 18.3.1 @@ -345,8 +348,8 @@ importers: specifier: 8.4.0 version: 8.4.0(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.7.1) unplugin-ast: - specifier: 0.14.4 - version: 0.14.4 + specifier: 0.14.6 + version: 0.14.6 utf-8-validate: specifier: 6.0.5 version: 6.0.5 @@ -355,13 +358,13 @@ importers: dependencies: '@egoist/tipc': specifier: 0.3.2 - version: 0.3.2(electron@34.5.0)(react@18.3.1) + version: 0.3.2(electron@35.1.5)(react@18.3.1) '@electron-toolkit/preload': specifier: 3.0.1 - version: 3.0.1(electron@34.5.0) + version: 3.0.1(electron@35.1.5) '@electron-toolkit/utils': specifier: 4.0.0 - version: 4.0.0(electron@34.5.0) + version: 4.0.0(electron@35.1.5) '@eneris/push-receiver': specifier: 4.3.0 version: 4.3.0 @@ -375,8 +378,8 @@ importers: specifier: 1.0.1 version: 1.0.1 '@sentry/electron': - specifier: 6.4.0 - version: 6.4.0 + specifier: 6.5.0 + version: 6.5.0 builder-util-runtime: specifier: 9.3.1 version: 9.3.1 @@ -399,8 +402,8 @@ importers: specifier: 6.6.2 version: 6.6.2 es-toolkit: - specifier: 1.34.1 - version: 1.34.1 + specifier: 1.35.0 + version: 1.35.0 fast-folder-size: specifier: 2.4.0 version: 2.4.0 @@ -408,8 +411,8 @@ importers: specifier: 1.5.1 version: 1.5.1 i18next: - specifier: 24.2.3 - version: 24.2.3(typescript@5.8.3) + specifier: 25.0.0 + version: 25.0.0(typescript@5.8.3) js-yaml: specifier: 4.1.0 version: 4.1.0 @@ -448,17 +451,17 @@ importers: specifier: 4.0.9 version: 4.0.9 '@types/node': - specifier: 22.14.0 - version: 22.14.0 + specifier: 22.14.1 + version: 22.14.1 electron: - specifier: 34.5.0 - version: 34.5.0 + specifier: 35.1.5 + version: 35.1.5 electron-devtools-installer: specifier: 4.0.0 version: 4.0.0 hono: - specifier: 4.7.5 - version: 4.7.5(patch_hash=5c74c2d2afaa5880c13d75458dd26c84da568851691b1fb6de6d877c29936d05) + specifier: 4.7.6 + version: 4.7.6(patch_hash=5c74c2d2afaa5880c13d75458dd26c84da568851691b1fb6de6d877c29936d05) apps/desktop/src/renderer: dependencies: @@ -470,10 +473,10 @@ importers: version: 10.0.0(@dnd-kit/core@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) '@egoist/tipc': specifier: 0.3.2 - version: 0.3.2(electron@34.5.0)(react@18.3.1) + version: 0.3.2(electron@35.1.5)(react@18.3.1) '@electron-toolkit/preload': specifier: 3.0.1 - version: 3.0.1(electron@34.5.0) + version: 3.0.1(electron@35.1.5) '@follow/electron-main': specifier: workspace:* version: link:../main @@ -487,8 +490,8 @@ importers: specifier: 5.2.5 version: 5.2.5 '@headlessui/react': - specifier: 2.2.1 - version: 2.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 2.2.2 + version: 2.2.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@hookform/resolvers': specifier: 4.1.3 version: 4.1.3(react-hook-form@7.55.0(react@18.3.1)) @@ -499,50 +502,50 @@ importers: specifier: 1.0.1 version: 1.0.1 '@radix-ui/react-avatar': - specifier: 1.1.3 - version: 1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 1.1.4 + version: 1.1.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-context-menu': - specifier: 2.2.6 - version: 2.2.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 2.2.7 + version: 2.2.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-dialog': - specifier: 1.1.6 - version: 1.1.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 1.1.7 + version: 1.1.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-dropdown-menu': - specifier: 2.1.6 - version: 2.1.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 2.1.7 + version: 2.1.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-hover-card': - specifier: 1.1.6 - version: 1.1.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 1.1.7 + version: 1.1.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-label': - specifier: 2.1.2 - version: 2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 2.1.3 + version: 2.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-popover': - specifier: 1.1.6 - version: 1.1.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 1.1.7 + version: 1.1.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-slider': - specifier: 1.2.3 - version: 1.2.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 1.2.4 + version: 1.2.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-slot': - specifier: 1.1.2 - version: 1.1.2(@types/react@18.3.12)(react@18.3.1) + specifier: 1.2.0 + version: 1.2.0(@types/react@18.3.12)(react@18.3.1) '@sentry/react': - specifier: 9.11.0 - version: 9.11.0(react@18.3.1) + specifier: 9.13.0 + version: 9.13.0(react@18.3.1) '@shikijs/transformers': - specifier: 3.2.1 - version: 3.2.1 + specifier: 3.2.2 + version: 3.2.2 '@tanstack/query-sync-storage-persister': - specifier: 5.71.10 - version: 5.71.10 + specifier: 5.74.4 + version: 5.74.4 '@tanstack/react-query': - specifier: 5.71.10 - version: 5.71.10(react@18.3.1) + specifier: 5.74.4 + version: 5.74.4(react@18.3.1) '@tanstack/react-query-devtools': - specifier: 5.71.10 - version: 5.71.10(@tanstack/react-query@5.71.10(react@18.3.1))(react@18.3.1) + specifier: 5.74.4 + version: 5.74.4(@tanstack/react-query@5.74.4(react@18.3.1))(react@18.3.1) '@tanstack/react-query-persist-client': - specifier: 5.71.10 - version: 5.71.10(@tanstack/react-query@5.71.10(react@18.3.1))(react@18.3.1) + specifier: 5.74.4 + version: 5.74.4(@tanstack/react-query@5.74.4(react@18.3.1))(react@18.3.1) '@tanstack/react-virtual': specifier: 3.13.6 version: 3.13.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -586,17 +589,14 @@ importers: specifier: 8.0.2 version: 8.0.2(embla-carousel@8.6.0) es-toolkit: - specifier: 1.34.1 - version: 1.34.1 + specifier: 1.35.0 + version: 1.35.0 firebase: specifier: 11.6.0 version: 11.6.0 foxact: specifier: 0.2.45 version: 0.2.45(react@18.3.1) - framer-motion: - specifier: 12.6.3 - version: 12.6.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) franc-min: specifier: 6.2.0 version: 6.2.0 @@ -610,8 +610,8 @@ importers: specifier: 10.1.2 version: 10.1.2 i18next: - specifier: 24.2.3 - version: 24.2.3(typescript@5.8.3) + specifier: 25.0.0 + version: 25.0.0(typescript@5.8.3) i18next-browser-languagedetector: specifier: 8.0.4 version: 8.0.4 @@ -622,8 +622,8 @@ importers: specifier: 10.1.1 version: 10.1.1(patch_hash=594c60b929bc0a3b56576f1a1787da1aec2a1fba51e3c21ec09c0ed38280af6c) jotai: - specifier: 2.12.2 - version: 2.12.2(@types/react@18.3.12)(react@18.3.1) + specifier: 2.12.3 + version: 2.12.3(@types/react@18.3.12)(react@18.3.1) lethargy: specifier: 1.0.9 version: 1.0.9 @@ -636,6 +636,9 @@ importers: mdast-util-to-markdown: specifier: 2.1.2 version: 2.1.2 + motion: + specifier: 12.7.4 + version: 12.7.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) nanoid: specifier: 5.1.5 version: 5.1.5 @@ -644,7 +647,7 @@ importers: version: 1.4.1 plain-shiki: specifier: 0.2.0 - version: 0.2.0(shiki@3.2.1) + version: 0.2.0(shiki@3.2.2) re-resizable: specifier: 6.11.2 version: 6.11.2(patch_hash=adb774d32dfdf0ef779d30a8e9e35ba7f3d07706cfe61907db2a53775ea09f23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -658,11 +661,11 @@ importers: specifier: 7.55.0 version: 7.55.0(react@18.3.1) react-hotkeys-hook: - specifier: 4.6.1 - version: 4.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 5.0.1 + version: 5.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-i18next: specifier: 15.4.1 - version: 15.4.1(i18next@24.2.3(typescript@5.8.3))(react-dom@18.3.1(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) + version: 15.4.1(i18next@25.0.0(typescript@5.8.3))(react-dom@18.3.1(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) react-intersection-observer: specifier: 9.16.0 version: 9.16.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -676,8 +679,8 @@ importers: specifier: npm:@innei/react-resizable-layout@0.7.3-fork.1 version: '@innei/react-resizable-layout@0.7.3-fork.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)' react-router: - specifier: 7.5.0 - version: 7.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 7.5.1 + version: 7.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-selecto: specifier: 1.26.3 version: 1.26.3 @@ -688,14 +691,14 @@ importers: specifier: 3.7.0 version: 3.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) shiki: - specifier: 3.2.1 - version: 3.2.1 + specifier: 3.2.2 + version: 3.2.2 sonner: specifier: 2.0.3 version: 2.0.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) tldts: - specifier: 6.1.85 - version: 6.1.85 + specifier: 7.0.0 + version: 7.0.0 use-context-selector: specifier: 2.0.0 version: 2.0.0(react@18.3.1)(scheduler@0.24.0-canary-efb381bbf-20230505) @@ -706,8 +709,8 @@ importers: specifier: 3.1.1 version: 3.1.1(react@18.3.1) zod: - specifier: 3.24.2 - version: 3.24.2 + specifier: 3.24.3 + version: 3.24.3 zustand: specifier: 5.0.3 version: 5.0.3(@types/react@18.3.12)(immer@10.1.1(patch_hash=594c60b929bc0a3b56576f1a1787da1aec2a1fba51e3c21ec09c0ed38280af6c))(react@18.3.1)(use-sync-external-store@1.5.0(react@18.3.1)) @@ -737,8 +740,8 @@ importers: specifier: workspace:* version: link:../../../../packages/utils '@types/node': - specifier: 22.14.0 - version: 22.14.0 + specifier: 22.14.1 + version: 22.14.1 '@vite-pwa/assets-generator': specifier: 1.0.0 version: 1.0.0 @@ -750,13 +753,13 @@ importers: version: 17.4.4 react-scan: specifier: 0.3.3 - version: 0.3.3(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react-router@7.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(rollup@4.39.0) + version: 0.3.3(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react-router@7.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(rollup@4.40.0) apps/mobile: dependencies: '@better-auth/expo': - specifier: 1.2.6-beta.1 - version: 1.2.6-beta.1(better-auth@1.2.6-beta.2(typescript@5.8.3)) + specifier: 1.2.7 + version: 1.2.7(better-auth@1.2.7) '@expo/metro-runtime': specifier: 4.0.1 version: 4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)) @@ -800,20 +803,20 @@ importers: specifier: 4.3.0 version: 4.3.0(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)) '@react-native-firebase/analytics': - specifier: 21.13.0 - version: 21.13.0(@react-native-firebase/app@21.13.0(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)) + specifier: 21.14.0 + version: 21.14.0(@react-native-firebase/app@21.14.0(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)) '@react-native-firebase/app': - specifier: 21.13.0 - version: 21.13.0(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) + specifier: 21.14.0 + version: 21.14.0(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) '@react-native-firebase/app-check': - specifier: 21.13.0 - version: 21.13.0(2511037f97ab10cd056affaf5ecb511d) + specifier: 21.14.0 + version: 21.14.0(21fb7edb71e7d0731f9ddb20f02a89c2) '@react-native-firebase/crashlytics': - specifier: 21.13.0 - version: 21.13.0(2511037f97ab10cd056affaf5ecb511d) + specifier: 21.14.0 + version: 21.14.0(21fb7edb71e7d0731f9ddb20f02a89c2) '@react-native-firebase/messaging': - specifier: 21.13.0 - version: 21.13.0(2511037f97ab10cd056affaf5ecb511d) + specifier: 21.14.0 + version: 21.14.0(21fb7edb71e7d0731f9ddb20f02a89c2) '@react-native-masked-view/masked-view': specifier: 0.3.2 version: 0.3.2(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) @@ -824,26 +827,26 @@ importers: specifier: 2.11.0 version: 2.11.0(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) '@shopify/flash-list': - specifier: 1.7.3 - version: 1.7.3(@babel/runtime@7.27.0)(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) + specifier: 1.8.0 + version: 1.8.0(@babel/runtime@7.27.0)(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) '@tanstack/query-sync-storage-persister': - specifier: 5.71.10 - version: 5.71.10 + specifier: 5.74.4 + version: 5.74.4 '@tanstack/react-query': - specifier: 5.71.10 - version: 5.71.10(react@18.3.1) + specifier: 5.74.4 + version: 5.74.4(react@18.3.1) '@tanstack/react-query-persist-client': - specifier: 5.71.10 - version: 5.71.10(@tanstack/react-query@5.71.10(react@18.3.1))(react@18.3.1) + specifier: 5.74.4 + version: 5.74.4(@tanstack/react-query@5.74.4(react@18.3.1))(react@18.3.1) '@types/qrcode': specifier: 1.5.5 version: 1.5.5 better-auth: - specifier: 1.2.6-beta.2 - version: 1.2.6-beta.2(typescript@5.8.3) - cookie-es: - specifier: 2.0.0 - version: 2.0.0 + specifier: 1.2.7 + version: 1.2.7 + camelcase-keys: + specifier: 9.1.3 + version: 9.1.3 dayjs: specifier: 1.11.13 version: 1.11.13 @@ -851,116 +854,116 @@ importers: specifier: 2.14.0 version: 2.14.0 es-toolkit: - specifier: 1.34.1 - version: 1.34.1 + specifier: 1.35.0 + version: 1.35.0 expo: - specifier: 52.0.44 - version: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + specifier: 52.0.46 + version: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) expo-apple-authentication: specifier: 7.1.3 - version: 7.1.3(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)) + version: 7.1.3(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)) expo-application: specifier: 6.0.2 - version: 6.0.2(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) + version: 6.0.2(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) expo-av: specifier: 15.0.2 - version: 15.0.2(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native-web@0.20.0(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) + version: 15.0.2(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native-web@0.20.0(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) expo-background-fetch: specifier: 13.0.6 - version: 13.0.6(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)) + version: 13.0.6(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)) expo-blur: specifier: 14.0.3 - version: 14.0.3(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) + version: 14.0.3(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) expo-build-properties: specifier: 0.13.2 - version: 0.13.2(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) + version: 0.13.2(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) expo-clipboard: specifier: 7.0.1 - version: 7.0.1(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) + version: 7.0.1(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) expo-constants: specifier: 17.0.8 - version: 17.0.8(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)) + version: 17.0.8(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)) expo-dev-client: specifier: 5.0.20 - version: 5.0.20(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) + version: 5.0.20(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) expo-document-picker: specifier: 13.0.3 - version: 13.0.3(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) + version: 13.0.3(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) expo-file-system: specifier: 18.0.12 - version: 18.0.12(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)) + version: 18.0.12(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)) expo-haptics: specifier: 14.0.1 - version: 14.0.1(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) + version: 14.0.1(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) expo-image: specifier: 2.0.7 - version: 2.0.7(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native-web@0.20.0(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) + version: 2.0.7(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native-web@0.20.0(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) expo-image-manipulator: specifier: 13.0.6 - version: 13.0.6(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) + version: 13.0.6(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) expo-image-picker: specifier: ~16.0.6 - version: 16.0.6(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) + version: 16.0.6(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) expo-linear-gradient: specifier: 14.0.2 - version: 14.0.2(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) + version: 14.0.2(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) expo-linking: specifier: 7.0.5 - version: 7.0.5(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) + version: 7.0.5(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) expo-localization: specifier: 16.0.1 - version: 16.0.1(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) + version: 16.0.1(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) expo-media-library: specifier: 17.0.6 - version: 17.0.6(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)) + version: 17.0.6(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)) expo-notifications: specifier: 0.29.14 - version: 0.29.14(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) + version: 0.29.14(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) expo-secure-store: specifier: 14.0.1 - version: 14.0.1(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) + version: 14.0.1(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) expo-sharing: specifier: 13.0.1 - version: 13.0.1(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) + version: 13.0.1(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) expo-splash-screen: specifier: 0.29.22 - version: 0.29.22(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) + version: 0.29.22(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) expo-sqlite: specifier: 15.1.4 - version: 15.1.4(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) + version: 15.1.4(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) expo-status-bar: specifier: 2.0.1 version: 2.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) expo-symbols: specifier: 0.2.2 - version: 0.2.2(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) + version: 0.2.2(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) expo-system-ui: specifier: 4.0.9 - version: 4.0.9(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native-web@0.20.0(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)) + version: 4.0.9(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native-web@0.20.0(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)) expo-task-manager: specifier: 12.0.6 - version: 12.0.6(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)) + version: 12.0.6(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)) expo-updates: specifier: 0.27.4 - version: 0.27.4(encoding@0.1.13)(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) + version: 0.27.4(encoding@0.1.13)(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) expo-web-browser: specifier: 14.0.2 - version: 14.0.2(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)) + version: 14.0.2(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)) franc-min: specifier: 6.2.0 version: 6.2.0 hono: - specifier: 4.7.5 - version: 4.7.5(patch_hash=5c74c2d2afaa5880c13d75458dd26c84da568851691b1fb6de6d877c29936d05) + specifier: 4.7.6 + version: 4.7.6(patch_hash=5c74c2d2afaa5880c13d75458dd26c84da568851691b1fb6de6d877c29936d05) i18next: - specifier: 24.2.3 - version: 24.2.3(typescript@5.8.3) + specifier: 25.0.0 + version: 25.0.0(typescript@5.8.3) immer: specifier: 10.1.1 version: 10.1.1(patch_hash=594c60b929bc0a3b56576f1a1787da1aec2a1fba51e3c21ec09c0ed38280af6c) jotai: - specifier: 2.12.2 - version: 2.12.2(@types/react@18.3.12)(react@18.3.1) + specifier: 2.12.3 + version: 2.12.3(@types/react@18.3.12)(react@18.3.1) lru-cache: specifier: 11.1.0 version: 11.1.0 @@ -969,7 +972,7 @@ importers: version: 5.1.5 nativewind: specifier: 4.1.23 - version: 4.1.23(react-native-reanimated@3.17.2(@babel/core@7.26.10)(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native-safe-area-context@5.3.0(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native-svg@15.11.2(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.0)(typescript@5.8.3))) + version: 4.1.23(react-native-reanimated@3.17.4(@babel/core@7.26.10)(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native-safe-area-context@5.4.0(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native-svg@15.11.2(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3))) ofetch: specifier: 1.4.1 version: 1.4.1 @@ -990,25 +993,28 @@ importers: version: 7.55.0(react@18.3.1) react-i18next: specifier: 15.4.1 - version: 15.4.1(i18next@24.2.3(typescript@5.8.3))(react-dom@18.3.1(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) + version: 15.4.1(i18next@25.0.0(typescript@5.8.3))(react-dom@18.3.1(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) react-native: specifier: 0.77.2 version: 0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5) react-native-awesome-slider: specifier: 2.9.0 - version: 2.9.0(react-native-gesture-handler@2.25.0(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native-reanimated@3.17.2(@babel/core@7.26.10)(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) + version: 2.9.0(react-native-gesture-handler@2.25.0(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native-reanimated@3.17.4(@babel/core@7.26.10)(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) react-native-bouncy-checkbox: specifier: 4.1.2 version: 4.1.2 react-native-color-matrix-image-filters: specifier: 7.0.2 version: 7.0.2(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) + react-native-edge-to-edge: + specifier: 1.6.0 + version: 1.6.0(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) react-native-gesture-handler: specifier: 2.25.0 version: 2.25.0(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) react-native-image-colors: specifier: 2.4.0 - version: 2.4.0(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) + version: 2.4.0(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) react-native-ios-context-menu: specifier: 3.1.1 version: 3.1.1(react-native-ios-utilities@5.1.4(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) @@ -1016,8 +1022,8 @@ importers: specifier: 5.1.4 version: 5.1.4(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) react-native-keyboard-controller: - specifier: 1.16.8 - version: 1.16.8(react-native-reanimated@3.17.2(@babel/core@7.26.10)(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) + specifier: 1.17.0 + version: 1.17.0(react-native-reanimated@3.17.4(@babel/core@7.26.10)(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) react-native-otp-entry: specifier: 1.8.4 version: 1.8.4(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) @@ -1025,20 +1031,20 @@ importers: specifier: 6.7.0 version: 6.7.0(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) react-native-reanimated: - specifier: 3.17.2 - version: 3.17.2(@babel/core@7.26.10)(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) + specifier: 3.17.4 + version: 3.17.4(@babel/core@7.26.10)(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) react-native-root-siblings: specifier: 5.0.1 version: 5.0.1 react-native-safe-area-context: - specifier: 5.3.0 - version: 5.3.0(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) + specifier: 5.4.0 + version: 5.4.0(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) react-native-screens: specifier: 4.10.0 version: 4.10.0(patch_hash=4904c53aa4ed573c7e31df357d1b73feeefa4f92b6d41d4157a611401b34345d)(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) react-native-sheet-transitions: specifier: 0.1.2 - version: 0.1.2(patch_hash=8a10ea43dd4d194a581d3d765a1eb3e864441b968d5d5729382a9986f710ef32)(react-native-gesture-handler@2.25.0(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native-reanimated@3.17.2(@babel/core@7.26.10)(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) + version: 0.1.2(patch_hash=8a10ea43dd4d194a581d3d765a1eb3e864441b968d5d5729382a9986f710ef32)(react-native-gesture-handler@2.25.0(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native-reanimated@3.17.4(@babel/core@7.26.10)(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) react-native-svg: specifier: 15.11.2 version: 15.11.2(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) @@ -1047,10 +1053,10 @@ importers: version: 4.1.1(patch_hash=24a9527477cf307020abf337d3f5db78cdc015636e7ab47d085a1eb5792a5ff0)(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) react-native-uikit-colors: specifier: 0.3.10 - version: 0.3.10(c3c9b1a438cd987dd9135e4e8eef4db8) + version: 0.3.10(770d0d17290c2afbbfe1c689eda06db3) react-native-video: - specifier: 6.11.0 - version: 6.11.0(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) + specifier: 6.12.0 + version: 6.12.0(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) react-native-volume-manager: specifier: 2.0.8 version: 2.0.8(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) @@ -1061,11 +1067,11 @@ importers: specifier: 13.13.5 version: 13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) shiki: - specifier: 3.2.1 - version: 3.2.1 + specifier: 3.2.2 + version: 3.2.2 tailwindcss: specifier: 3.4.17 - version: 3.4.17(ts-node@10.9.2(@types/node@22.14.0)(typescript@5.8.3)) + version: 3.4.17(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3)) use-sync-external-store: specifier: 1.5.0 version: 1.5.0(react@18.3.1) @@ -1076,8 +1082,8 @@ importers: specifier: 3.0.6 version: 3.0.6(7baa755d257c8317dd25d3d2a15d809c) zod: - specifier: 3.24.2 - version: 3.24.2 + specifier: 3.24.3 + version: 3.24.3 zustand: specifier: 5.0.3 version: 5.0.3(@types/react@18.3.12)(immer@10.1.1(patch_hash=594c60b929bc0a3b56576f1a1787da1aec2a1fba51e3c21ec09c0ed38280af6c))(react@18.3.1)(use-sync-external-store@1.5.0(react@18.3.1)) @@ -1095,20 +1101,23 @@ importers: specifier: 5.0.2 version: 5.0.2 drizzle-kit: - specifier: 0.30.6 - version: 0.30.6 + specifier: 0.31.0 + version: 0.31.0 eas-cli: - specifier: 16.2.1 - version: 16.2.1(@types/node@22.14.0)(encoding@0.1.13)(typescript@5.8.3) + specifier: 16.3.2 + version: 16.3.2(@types/node@22.14.1)(encoding@0.1.13)(typescript@5.8.3) expo-drizzle-studio-plugin: specifier: 0.1.2 - version: 0.1.2(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) + version: 0.1.2(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) nbump: - specifier: 2.0.7 - version: 2.0.7(conventional-commits-filter@5.0.0) + specifier: 2.1.0 + version: 2.1.0(conventional-commits-filter@5.0.0) postcss: specifier: 8.5.3 version: 8.5.3 + sf-symbols-typescript: + specifier: 2.1.0 + version: 2.1.0 apps/mobile/web-app: {} @@ -1133,11 +1142,11 @@ importers: specifier: 2.6.2 version: 2.6.2 '@sentry/react': - specifier: 9.11.0 - version: 9.11.0(react@18.3.1) + specifier: 9.13.0 + version: 9.13.0(react@18.3.1) '@tanstack/react-query': - specifier: 5.71.10 - version: 5.71.10(react@18.3.1) + specifier: 5.74.4 + version: 5.74.4(react@18.3.1) blurhash: specifier: 2.0.5 version: 2.0.5 @@ -1148,29 +1157,29 @@ importers: specifier: 1.11.13 version: 1.11.13 fastify: - specifier: 5.2.2 - version: 5.2.2 - framer-motion: - specifier: 12.6.3 - version: 12.6.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 5.3.0 + version: 5.3.0 i18next: - specifier: 24.2.3 - version: 24.2.3(typescript@5.8.3) + specifier: 25.0.0 + version: 25.0.0(typescript@5.8.3) jotai: - specifier: 2.12.2 - version: 2.12.2(@types/react@18.3.12)(react@18.3.1) + specifier: 2.12.3 + version: 2.12.3(@types/react@18.3.12)(react@18.3.1) kose-font: specifier: 1.0.0 version: 1.0.0 linkedom: specifier: 0.18.9 version: 0.18.9 + motion: + specifier: 12.7.4 + version: 12.7.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) ofetch: specifier: 1.4.1 version: 1.4.1 rc-modal-sheet: - specifier: 0.3.2 - version: 0.3.2(@radix-ui/react-dialog@1.1.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(clsx@2.1.1)(framer-motion@12.6.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(tailwind-merge@3.1.0)(vaul@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + specifier: 1.0.0 + version: 1.0.0(@radix-ui/react-dialog@1.1.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(clsx@2.1.1)(motion@12.7.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(tailwind-merge@3.2.0)(vaul@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) react-blurhash: specifier: 0.3.0 version: 0.3.0(blurhash@2.0.5)(react@18.3.1) @@ -1181,17 +1190,17 @@ importers: specifier: 7.55.0 version: 7.55.0(react@18.3.1) react-hotkeys-hook: - specifier: 4.6.1 - version: 4.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 5.0.1 + version: 5.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-i18next: specifier: 15.4.1 - version: 15.4.1(i18next@24.2.3(typescript@5.8.3))(react-dom@18.3.1(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) + version: 15.4.1(i18next@25.0.0(typescript@5.8.3))(react-dom@18.3.1(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) react-photo-view: specifier: 1.2.7 version: 1.2.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-router: - specifier: 7.5.0 - version: 7.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 7.5.1 + version: 7.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) satori: specifier: 0.12.2 version: 0.12.2 @@ -1205,8 +1214,8 @@ importers: specifier: 1.0.15 version: 1.0.15 zod: - specifier: 3.24.2 - version: 3.24.2 + specifier: 3.24.3 + version: 3.24.3 devDependencies: '@follow/components': specifier: workspace:* @@ -1230,8 +1239,8 @@ importers: specifier: workspace:* version: link:../../packages/utils '@radix-ui/react-avatar': - specifier: 1.1.3 - version: 1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 1.1.4 + version: 1.1.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/html-minifier-terser': specifier: 7.0.2 version: 7.0.2 @@ -1248,8 +1257,8 @@ importers: specifier: 4.1.0 version: 4.1.0 es-toolkit: - specifier: 1.34.1 - version: 1.34.1 + specifier: 1.35.0 + version: 1.35.0 fast-glob: specifier: 3.3.3 version: 3.3.3 @@ -1278,8 +1287,8 @@ importers: specifier: 4.19.3 version: 4.19.3 vite: - specifier: 6.2.5 - version: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1) + specifier: 6.3.2 + version: 6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1) packages/atoms: dependencies: @@ -1293,8 +1302,8 @@ importers: specifier: workspace:* version: link:../utils jotai: - specifier: 2.12.2 - version: 2.12.2(@types/react@18.3.12)(react@18.3.1) + specifier: 2.12.3 + version: 2.12.3(@types/react@18.3.12)(react@18.3.1) packages/components: dependencies: @@ -1317,65 +1326,65 @@ importers: specifier: workspace:* version: link:../utils '@headlessui/react': - specifier: 2.2.1 - version: 2.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 2.2.2 + version: 2.2.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@microflash/remark-callout-directives': specifier: 4.4.0 version: 4.4.0(patch_hash=6160b1cf0eab6deca36415693dda703746edcd42e0e64b9174294e2210481396) '@radix-ui/react-avatar': - specifier: 1.1.3 - version: 1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-checkbox': specifier: 1.1.4 version: 1.1.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-checkbox': + specifier: 1.1.5 + version: 1.1.5(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-context-menu': - specifier: 2.2.6 - version: 2.2.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 2.2.7 + version: 2.2.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-dialog': - specifier: 1.1.6 - version: 1.1.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 1.1.7 + version: 1.1.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-dropdown-menu': - specifier: 2.1.6 - version: 2.1.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 2.1.7 + version: 2.1.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-hover-card': - specifier: 1.1.6 - version: 1.1.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 1.1.7 + version: 1.1.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-label': - specifier: 2.1.2 - version: 2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 2.1.3 + version: 2.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-navigation-menu': - specifier: 1.2.5 - version: 1.2.5(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-popover': - specifier: 1.1.6 - version: 1.1.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-radio-group': - specifier: 1.2.3 - version: 1.2.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-scroll-area': - specifier: 1.2.3 - version: 1.2.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-select': - specifier: 2.1.6 - version: 2.1.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slider': - specifier: 1.2.3 - version: 1.2.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': - specifier: 1.1.2 - version: 1.1.2(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-switch': - specifier: 1.1.3 - version: 1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-tabs': - specifier: 1.1.3 - version: 1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-toast': specifier: 1.2.6 version: 1.2.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-popover': + specifier: 1.1.7 + version: 1.1.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-radio-group': + specifier: 1.2.4 + version: 1.2.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-scroll-area': + specifier: 1.2.4 + version: 1.2.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-select': + specifier: 2.1.7 + version: 2.1.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slider': + specifier: 1.2.4 + version: 1.2.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': + specifier: 1.2.0 + version: 1.2.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-switch': + specifier: 1.1.4 + version: 1.1.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-tabs': + specifier: 1.1.4 + version: 1.1.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-toast': + specifier: 1.2.7 + version: 1.2.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-tooltip': - specifier: 1.1.8 - version: 1.1.8(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: 1.2.0 + version: 1.2.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@react-hook/window-size': specifier: 3.1.1 version: 3.1.1(react@18.3.1) @@ -1394,9 +1403,6 @@ importers: foxact: specifier: 0.2.45 version: 0.2.45(react@18.3.1) - framer-motion: - specifier: 12.6.3 - version: 12.6.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) hast-util-to-jsx-runtime: specifier: 2.3.6 version: 2.3.6 @@ -1407,14 +1413,17 @@ importers: specifier: 1.4.2 version: 1.4.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) jotai: - specifier: 2.12.2 - version: 2.12.2(@types/react@18.3.12)(react@18.3.1) + specifier: 2.12.3 + version: 2.12.3(@types/react@18.3.12)(react@18.3.1) katex: - specifier: 0.16.21 - version: 0.16.21 + specifier: 0.16.22 + version: 0.16.22 masonic: specifier: 4.0.1 version: 4.0.1(react@18.3.1) + motion: + specifier: 12.7.4 + version: 12.7.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-blurhash: specifier: 0.3.0 version: 0.3.0(blurhash@2.0.5)(react@18.3.1) @@ -1426,7 +1435,7 @@ importers: version: 7.55.0(react@18.3.1) react-i18next: specifier: 15.4.1 - version: 15.4.1(i18next@24.2.3(typescript@5.8.3))(react-dom@18.3.1(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) + version: 15.4.1(i18next@25.0.0(typescript@5.8.3))(react-dom@18.3.1(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) rehype-infer-description-meta: specifier: 2.0.0 version: 2.0.0 @@ -1501,8 +1510,8 @@ importers: specifier: 0.2.45 version: 0.2.45(react@18.3.1) jotai: - specifier: 2.12.2 - version: 2.12.2(@types/react@18.3.12)(react@18.3.1) + specifier: 2.12.3 + version: 2.12.3(@types/react@18.3.12)(react@18.3.1) usehooks-ts: specifier: 3.1.1 version: 3.1.1(react@18.3.1) @@ -1528,44 +1537,44 @@ importers: specifier: workspace:* version: link:../utils hono: - specifier: 4.7.5 - version: 4.7.5(patch_hash=5c74c2d2afaa5880c13d75458dd26c84da568851691b1fb6de6d877c29936d05) + specifier: 4.7.6 + version: 4.7.6(patch_hash=5c74c2d2afaa5880c13d75458dd26c84da568851691b1fb6de6d877c29936d05) packages/shared: dependencies: '@electron-toolkit/preload': specifier: 3.0.1 - version: 3.0.1(electron@34.5.0) + version: 3.0.1(electron@35.1.5) '@electron-toolkit/tsconfig': specifier: 1.0.1 - version: 1.0.1(@types/node@22.14.0) + version: 1.0.1(@types/node@22.14.1) '@hono/node-server': - specifier: 1.14.0 - version: 1.14.0(hono@4.7.5(patch_hash=5c74c2d2afaa5880c13d75458dd26c84da568851691b1fb6de6d877c29936d05)) + specifier: 1.14.1 + version: 1.14.1(hono@4.7.6(patch_hash=5c74c2d2afaa5880c13d75458dd26c84da568851691b1fb6de6d877c29936d05)) '@t3-oss/env-core': specifier: 0.12.0 - version: 0.12.0(typescript@5.8.3)(valibot@1.0.0-beta.15(typescript@5.8.3))(zod@3.24.2) + version: 0.12.0(typescript@5.8.3)(valibot@1.0.0-beta.15(typescript@5.8.3))(zod@3.24.3) better-auth: - specifier: 1.2.6-beta.2 - version: 1.2.6-beta.2(typescript@5.8.3) + specifier: 1.2.7 + version: 1.2.7 drizzle-orm: - specifier: 0.41.0 - version: 0.41.0(9928b483d1845c28fd62a2a8fba14be2) + specifier: 0.42.0 + version: 0.42.0(f40899e93cf53ec5f598dddbb63d39a8) hono: - specifier: 4.7.5 - version: 4.7.5(patch_hash=5c74c2d2afaa5880c13d75458dd26c84da568851691b1fb6de6d877c29936d05) + specifier: 4.7.6 + version: 4.7.6(patch_hash=5c74c2d2afaa5880c13d75458dd26c84da568851691b1fb6de6d877c29936d05) sonner: specifier: 2.0.3 version: 2.0.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) zod: - specifier: 3.24.2 - version: 3.24.2 + specifier: 3.24.3 + version: 3.24.3 packages/tracker: devDependencies: '@react-native-firebase/analytics': - specifier: 21.13.0 - version: 21.13.0(@react-native-firebase/app@21.13.0(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)) + specifier: 21.14.0 + version: 21.14.0(@react-native-firebase/app@21.14.0(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)) packages/types: {} @@ -1589,12 +1598,12 @@ importers: dompurify: specifier: 3.2.5 version: 3.2.5 - framer-motion: - specifier: 12.6.3 - version: 12.6.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) linkedom: specifier: 0.18.9 version: 0.18.9 + motion: + specifier: 12.7.4 + version: 12.7.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) nanoid: specifier: 5.1.5 version: 5.1.5 @@ -1605,11 +1614,11 @@ importers: specifier: '>=0.74.0' version: 0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5) tailwind-merge: - specifier: 3.1.0 - version: 3.1.0 + specifier: 3.2.0 + version: 3.2.0 tldts: - specifier: 6.1.85 - version: 6.1.85 + specifier: 7.0.0 + version: 7.0.0 uniqolor: specifier: 1.1.1 version: 1.1.1 @@ -2372,10 +2381,10 @@ packages: resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} engines: {node: '>=6.9.0'} - '@better-auth/expo@1.2.6-beta.1': - resolution: {integrity: sha512-h72IzVHxp6xCinkiVIvwFzPWKsSQUVMdZ5KO4THGn5LORhaUyq3SqkFv8wewl6Cr0GOoRCdL51BIeVGOYMyt4A==} + '@better-auth/expo@1.2.7': + resolution: {integrity: sha512-g8qBx7lBFfOWvAzWwNUVZr6IWYwBcZ7D/HcTzBG1zoZmD7PbdseQugWlIeS711vZ/Qqez7ZV0mDwpk2h+uT4nQ==} peerDependencies: - better-auth: 1.2.6-beta.1 + better-auth: 1.2.7 '@better-auth/utils@0.2.4': resolution: {integrity: sha512-ayiX87Xd5sCHEplAdeMgwkA0FgnXsEZBgDn890XHHwSWNqqRZDYOq3uj2Ei2leTv1I2KbG5HHn60Ah1i2JWZjQ==} @@ -2392,11 +2401,11 @@ packages: '@clack/core@0.3.5': resolution: {integrity: sha512-5cfhQNH+1VQ2xLQlmzXMqUoiaH0lRBq9/CLW9lTyMbuKLC3+xEK01tHVvyut++mLOn5urSHmkm6I0Lg9MaJSTQ==} - '@clack/core@0.4.1': - resolution: {integrity: sha512-Pxhij4UXg8KSr7rPek6Zowm+5M22rbd2g1nfojHJkxp5YkFqiZ2+YLEM/XGVIzvGOcM0nqjIFxrpDwWRZYWYjA==} + '@clack/core@0.4.2': + resolution: {integrity: sha512-NYQfcEy8MWIxrT5Fj8nIVchfRFA26yYKJcvBS7WlUIlw2OmQOY9DhGGXMovyI5J5PpxrCPGkgUi207EBrjpBvg==} - '@clack/prompts@0.10.0': - resolution: {integrity: sha512-H3rCl6CwW1NdQt9rE3n373t7o5cthPv7yUoxF2ytZvyvlJv89C5RYMJu83Hed8ODgys5vpBU0GKxIRG83jd8NQ==} + '@clack/prompts@0.10.1': + resolution: {integrity: sha512-Q0T02vx8ZM9XSv9/Yde0jTmmBQufZhPJfYAg2XrrrxWWaZgq1rr8nU8Hv710BQ1dhoP8rtY7YUdpGej2Qza/cw==} '@clack/prompts@0.8.2': resolution: {integrity: sha512-6b9Ab2UiZwJYA9iMyboYyW9yJvAO9V753ZhS+DHKEjZRKAxPPOb7MXXu84lsPFG+vZt6FRFniZ8rXi+zCIw4yQ==} @@ -2656,14 +2665,17 @@ packages: engines: {node: '>=14.14'} hasBin: true - '@emnapi/core@1.3.1': - resolution: {integrity: sha512-pVGjBIt1Y6gg3EJN8jTcfpP/+uuRksIo055oE/OBkDNcjZqVbfkWCksG1Jp4yZnj3iKWyWX8fdG/j6UDYPbFog==} + '@emnapi/core@1.4.3': + resolution: {integrity: sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==} '@emnapi/runtime@1.4.0': resolution: {integrity: sha512-64WYIf4UYcdLnbKn/umDlNjQDSS8AgZrI/R9+x5ilkUVFxXcA1Ebl+gQLc/6mERA4407Xof0R7wEyEuj091CVw==} - '@emnapi/wasi-threads@1.0.1': - resolution: {integrity: sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==} + '@emnapi/runtime@1.4.3': + resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} + + '@emnapi/wasi-threads@1.0.2': + resolution: {integrity: sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==} '@eneris/push-receiver@4.3.0': resolution: {integrity: sha512-COn7fZIh1P+3FYEpE87E2KoACW/gYTxwURykYqQ1lKMO1O/vdfrWP4ECsew/Kto9Mec34J46hvD5I/2nNa8kfA==} @@ -2681,12 +2693,6 @@ packages: resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} deprecated: 'Merged into tsx: https://tsx.is' - '@esbuild/aix-ppc64@0.19.12': - resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - '@esbuild/aix-ppc64@0.24.2': resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} engines: {node: '>=18'} @@ -2711,12 +2717,6 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.19.12': - resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm64@0.24.2': resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} engines: {node: '>=18'} @@ -2741,12 +2741,6 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.19.12': - resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - '@esbuild/android-arm@0.24.2': resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} engines: {node: '>=18'} @@ -2771,12 +2765,6 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.19.12': - resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - '@esbuild/android-x64@0.24.2': resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} engines: {node: '>=18'} @@ -2801,12 +2789,6 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.19.12': - resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-arm64@0.24.2': resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} engines: {node: '>=18'} @@ -2831,12 +2813,6 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.19.12': - resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - '@esbuild/darwin-x64@0.24.2': resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} engines: {node: '>=18'} @@ -2861,12 +2837,6 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.19.12': - resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-arm64@0.24.2': resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} engines: {node: '>=18'} @@ -2891,12 +2861,6 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.19.12': - resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - '@esbuild/freebsd-x64@0.24.2': resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} engines: {node: '>=18'} @@ -2921,12 +2885,6 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.19.12': - resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm64@0.24.2': resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} engines: {node: '>=18'} @@ -2951,12 +2909,6 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.19.12': - resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - '@esbuild/linux-arm@0.24.2': resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} engines: {node: '>=18'} @@ -2981,12 +2933,6 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.19.12': - resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-ia32@0.24.2': resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} engines: {node: '>=18'} @@ -3011,12 +2957,6 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.19.12': - resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-loong64@0.24.2': resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} engines: {node: '>=18'} @@ -3041,12 +2981,6 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.19.12': - resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-mips64el@0.24.2': resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} engines: {node: '>=18'} @@ -3071,12 +3005,6 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.19.12': - resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-ppc64@0.24.2': resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} engines: {node: '>=18'} @@ -3101,12 +3029,6 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.19.12': - resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-riscv64@0.24.2': resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} engines: {node: '>=18'} @@ -3131,12 +3053,6 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.19.12': - resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-s390x@0.24.2': resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} engines: {node: '>=18'} @@ -3161,12 +3077,6 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.19.12': - resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - '@esbuild/linux-x64@0.24.2': resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} engines: {node: '>=18'} @@ -3209,12 +3119,6 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.19.12': - resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - '@esbuild/netbsd-x64@0.24.2': resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} engines: {node: '>=18'} @@ -3257,12 +3161,6 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.19.12': - resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - '@esbuild/openbsd-x64@0.24.2': resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} engines: {node: '>=18'} @@ -3287,12 +3185,6 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.19.12': - resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - '@esbuild/sunos-x64@0.24.2': resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} engines: {node: '>=18'} @@ -3317,12 +3209,6 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.19.12': - resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-arm64@0.24.2': resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} engines: {node: '>=18'} @@ -3347,12 +3233,6 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.19.12': - resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-ia32@0.24.2': resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} engines: {node: '>=18'} @@ -3377,12 +3257,6 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.19.12': - resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - '@esbuild/win32-x64@0.24.2': resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} engines: {node: '>=18'} @@ -3407,24 +3281,30 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/eslint-utils@4.6.1': + resolution: {integrity: sha512-KTsJMmobmbrFLe3LDh0PC2FXpcSYJt/MLjlkh/9LEnmKYLSYmT/0EW9JWANjeoemiuZrmogti0tW5Ch+qNUYDw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/regexpp@4.12.1': resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint-react/ast@1.38.0': - resolution: {integrity: sha512-4nZtK57dcWB/QgqEzTOX56w8QL5HIDjqv7xqd1X3XR+T8nQum/XXqGIaQzL7SkX8oC2VosOykFJyI0s3cLdVLQ==} + '@eslint-react/ast@1.48.3': + resolution: {integrity: sha512-jWZD7C6MflABxNx92IeHGXj7Q/35mCp0wrF+FnNTjW29x5vGNugfG9h7Cvkpg+ZRxBuB39VQ7DcG7BFw5GCGIg==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} - '@eslint-react/core@1.38.0': - resolution: {integrity: sha512-IJ8HO0BN1fAWCfeP4eBTAi3PAMq4Hb1wAHBLII7XPukyoRsIxqUpIYCowyZquxT0MUOPqJn6XQ/yk0RWOtCHXQ==} + '@eslint-react/core@1.48.3': + resolution: {integrity: sha512-QOfsNgDDfrfWIHUvRKsK6OV2kiJ8sIrJg334n6gRPJUWmOTiiw3DYuauvab1Z54BnJ7StfWmQ0pHWHRRSM4dJw==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} - '@eslint-react/eff@1.38.0': - resolution: {integrity: sha512-09x1sQlvaoUEQVh2doARQcG3xsniRCOyI8ykKSqfsOBE3iA3tyufnHkliOJjcJPpascxk5xr/+u5keJ5kLUQcQ==} + '@eslint-react/eff@1.48.3': + resolution: {integrity: sha512-PCdwnWxtmXNvZVznEW9UXMmQFxg2WyyP4qQpCl0iAe2+e0r8OovzoTcn4RIBZzsn0BzVYCzLhvXjo8wbgWvVoQ==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} - '@eslint-react/eslint-plugin@1.38.0': - resolution: {integrity: sha512-dQ0pyFCkR5JvCaGhSFfYRr/cX+W8xt9Eb73Eh6WP1F5wj1hUaXpZ2mAEZqhKbm3gMzgG3kpvKYNM+SfmhUJw3w==} + '@eslint-react/eslint-plugin@1.48.3': + resolution: {integrity: sha512-B6vDZhMxY809QXGF8GdqmpZ4xudtSHof9sc+tC1W4c+6aM4EEUcclTlNR80uPLUYUkMbF/3Mt7fBWpQaB5M0lQ==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -3433,20 +3313,16 @@ packages: typescript: optional: true - '@eslint-react/jsx@1.38.0': - resolution: {integrity: sha512-UawUz686U0Fj24vOPff/xZntnFTo6/Yp0syw6qhtYqOagECoewTUwJ3DUfKoyjExZOUukojXSLLbintujvgCuA==} + '@eslint-react/kit@1.48.3': + resolution: {integrity: sha512-hMA+gKknPRXPTqEDqDjhcLZtCZFuuPl15a3YujJzU4qFj6qbZS6maBGZNvXxKh2DxbFD45fhaD2JQwN2iUvxVA==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} - '@eslint-react/kit@1.38.0': - resolution: {integrity: sha512-ngIvZxucEMWPpYqzeaAagK8igdMGOyLjZdhrh1XRnbllNESryNV6t8HGoiOE/wsfZo8KhZMD4IbY/4hPTSKGVQ==} + '@eslint-react/shared@1.48.3': + resolution: {integrity: sha512-1qvII476ssPtxf5u5ZdOblh06+JfIwqoX7ss4+yr4QDZL0AnecFeuGpEKtYG/88qsuEXLEl+8aFXhHlDsY7NUQ==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} - '@eslint-react/shared@1.38.0': - resolution: {integrity: sha512-8g61tCr5Qj8UBSVEbq4rs71OVrN7aDHpQRY3YCEGtSWr8OBPmgJ+rrxfBAx1Zq3p4B2KZFDy3R2ho/haII/5Vg==} - engines: {bun: '>=1.0.15', node: '>=18.18.0'} - - '@eslint-react/var@1.38.0': - resolution: {integrity: sha512-qsytJEj4Es4fZVW5kpLHx4Yh+k5DWz8h2OeXlmNJCzIvSIYC0bRTgd43lWsexwDAVfWINWMs32qFeR88HpMU8Q==} + '@eslint-react/var@1.48.3': + resolution: {integrity: sha512-kr3bOSNKqYwKmAeLpD+IzIdQcTCRmFuuzU++3Kg5X6x9dTIzqdkMYn6lUedoXmx4gVadS/WtcXUFAExblBuEAA==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} '@eslint/compat@1.2.8': @@ -3478,10 +3354,6 @@ packages: resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.23.0': - resolution: {integrity: sha512-35MJ8vCPU0ZMxo7zfev2pypqTwWTofFZO6m4KAtdoFhRpLJUpHTZZ+KB3C7Hb1d7bULYwO4lJXGCi5Se+8OMbw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.24.0': resolution: {integrity: sha512-uIY/y3z0uvOGX8cp1C2fiC4+ZmBhp6yZWkojtHL1YEMnRt1Y63HB9TM17proGEmeG7HeUY+UP36F0aknKYTpYA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3514,8 +3386,8 @@ packages: resolution: {integrity: sha512-+Lla7nYSiHZirgK+U/uYzsLv/X+HaJienbD5AKX1UQZHYfWaP+9uuQluRB4GrEVWF0GZ7vEVp/jzaOT9k/SQlg==} engines: {node: '>=0.10.0'} - '@expo/cli@0.22.24': - resolution: {integrity: sha512-lhdenxBC8/x/vL39j79eXE09mOaqNNLmiSDdY/PblnI+UNzGgsQ48hBTYa/MQhd0ioXXVKurZL2941dLKwcxJw==} + '@expo/cli@0.22.26': + resolution: {integrity: sha512-I689wc8Fn/AX7aUGiwrh3HnssiORMJtR2fpksX+JIe8Cj/EDleblYMSwRPd0025wrwOV9UN1KM/RuEt/QjCS3Q==} hasBin: true '@expo/code-signing-certificates@0.0.5': @@ -3536,8 +3408,8 @@ packages: '@expo/config@10.0.6': resolution: {integrity: sha512-xXkfPElrtxznkOZxFASJ7OPa6E9IHSjcZwj5BQ6XUF2dz5M7AFa2h5sXM8AalSaDU5tEBSgoUOjTh5957TlR8g==} - '@expo/devcert@1.1.4': - resolution: {integrity: sha512-fqBODr8c72+gBSX5Ty3SIzaY4bXainlpab78+vEYEKL3fXmsOswMLf0+KE36mUEAa36BYabX7K3EiXOXX5OPMw==} + '@expo/devcert@1.2.0': + resolution: {integrity: sha512-Uilcv3xGELD5t/b0eM4cxBFEKQRIivB3v7i+VhWLV/gL98aw810unLKKJbGAxAIhY6Ipyz8ChWibFsKFXYwstA==} '@expo/eas-build-job@1.0.173': resolution: {integrity: sha512-OtayVwXQaQEjJkpeKYvB4N6lsXVX+QSEz5okNx/d+8esI2KCjxOy/hzaqKBTovkxRlmWgE3XLw8RhrjAaBY2Gw==} @@ -3549,8 +3421,8 @@ packages: '@expo/env@0.4.2': resolution: {integrity: sha512-TgbCgvSk0Kq0e2fLoqHwEBL4M0ztFjnBEz0YCDm5boc1nvkV1VMuIMteVdeBwnTh8Z0oPJTwHCD49vhMEt1I6A==} - '@expo/env@1.0.0': - resolution: {integrity: sha512-43R5rxlaLJQOWunyfnQEpgHJCsSLCUWDoU/wJNABEYkHdt1Sjrlf+ieH3MG1f/RZYE+1Wss3sYiO9oPps1aMNg==} + '@expo/env@1.0.3': + resolution: {integrity: sha512-94l5HV9FSCMt4dnFykFmcfh94NmajyaoYXY2Z36pTdR5UbgCtR1brAhlvJ/5Ma8eHbzdqvmta+LXA9LHNKpyww==} '@expo/fingerprint@0.11.11': resolution: {integrity: sha512-gNyn1KnAOpEa8gSNsYqXMTcq0fSwqU/vit6fP5863vLSKxHm/dNt/gm/uZJxrRZxKq71KUJWF6I7d3z8qIfq5g==} @@ -3616,8 +3488,8 @@ packages: '@expo/prebuild-config@8.0.29': resolution: {integrity: sha512-CoZBxUQLZpGwbnPREr2sFnObOn4j+Mp7AHxX6Rz5jhSSz2VifC1jMM4NFiXrZe6LZyjYNqBGRe3D8bAqdpVGkg==} - '@expo/prebuild-config@8.0.31': - resolution: {integrity: sha512-YTuS5ic9KolD/WA3GqgLcZytHQU1dpitlZ/cbDq8ZqkY+1ae5YWX+GkYEZf2VyECPaWnHYuDGddaTQVw5miTRg==} + '@expo/prebuild-config@8.2.0': + resolution: {integrity: sha512-CxiPpd980s0jyxi7eyN3i/7YKu3XL+8qPjBZUCYtc0+axpGweqIkq2CslyLSKHyqVyH/zlPkbVgWdyiYavFS5Q==} '@expo/react-native-action-sheet@4.1.1': resolution: {integrity: sha512-4KRaba2vhqDRR7ObBj6nrD5uJw8ePoNHdIOMETTpgGTX7StUbrF4j/sfrP1YUyaPEa1P8FXdwG6pB+2WtrJd1A==} @@ -3643,11 +3515,18 @@ packages: resolution: {integrity: sha512-XT8+FsZWIzwK+/TGnPrHe0HMQrzRGjTsjVDx8Yt922tL5TkX69XeB/twA0PcPWBLMxq+JiKtFm68yPTPqjIMNg==} engines: {node: '>=18'} + '@expo/sudo-prompt@9.3.2': + resolution: {integrity: sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==} + '@expo/timeago.js@1.0.0': resolution: {integrity: sha512-PD45CGlCL8kG0U3YcH1NvYxQThw5XAS7qE9bgP4L7dakm8lsMz+p8BQ1IjBFMmImawVWsV3py6JZINaEebXLnw==} - '@expo/vector-icons@14.0.4': - resolution: {integrity: sha512-+yKshcbpDfbV4zoXOgHxCwh7lkE9VVTT5T03OUlBsqfze1PLy6Hi4jp1vSb1GVbY6eskvMIivGVc9SKzIv0oEQ==} + '@expo/vector-icons@14.1.0': + resolution: {integrity: sha512-7T09UE9h8QDTsUeMGymB4i+iqvtEeaO5VvUjryFB4tugDTG/bkzViWA74hm5pfjjDEhYMXWaX112mcvhccmIwQ==} + peerDependencies: + expo-font: '*' + react: 18.3.1 + react-native: '*' '@expo/ws-tunnel@1.0.6': resolution: {integrity: sha512-nDRbLmSrJar7abvUjp3smDwH8HcbZcoOEa5jVPUv9/9CajgmWw20JNRwTuBRzWIWIkEJDkz20GoNA+tSwUqk0Q==} @@ -3666,8 +3545,8 @@ packages: '@fastify/error@4.1.0': resolution: {integrity: sha512-KeFcciOr1eo/YvIXHP65S94jfEEqn1RxTRBT1aJaHxY5FK0/GDXYozsQMMWlZoHgi8i0s+YtrLsgj/JkUUjSkQ==} - '@fastify/fast-json-stringify-compiler@5.0.2': - resolution: {integrity: sha512-YdR7gqlLg1xZAQa+SX4sMNzQHY5pC54fu9oC5aYSUqBhyn6fkLkrdtKlpVdCNPlwuUuXA1PjFTEmvMF6ZVXVGw==} + '@fastify/fast-json-stringify-compiler@5.0.3': + resolution: {integrity: sha512-uik7yYHkLr6fxd8hJSZ8c+xF4WafPK+XzneQDPU+D10r5X19GW8lJcom2YijX2+qtFF1ENJlHXKFM9ouXNJYgQ==} '@fastify/forwarded@3.0.0': resolution: {integrity: sha512-kJExsp4JCms7ipzg7SJ3y8DwmePaELHxKYtg+tZow+k0znUTf3cb+npgyqm8+ATZOdmfgfydIebPDWM172wfyA==} @@ -4108,14 +3987,19 @@ packages: engines: {node: '>=6'} hasBin: true + '@grpc/proto-loader@0.7.14': + resolution: {integrity: sha512-oS0FyK8eGNBJC6aB/qsS4LOxCYQlBniNzp6W8IdjlRVRGs0FOK9dS84OV+kXGaZf8Ozeos8fbUMJUGGzSpOCzQ==} + engines: {node: '>=6'} + hasBin: true + '@hapi/hoek@9.3.0': resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} '@hapi/topo@5.1.0': resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} - '@headlessui/react@2.2.1': - resolution: {integrity: sha512-daiUqVLae8CKVjEVT19P/izW0aGK0GNhMSAeMlrDebKmoVZHcRRwbxzgtnEadUVDXyBsWo9/UH4KHeniO+0tMg==} + '@headlessui/react@2.2.2': + resolution: {integrity: sha512-zbniWOYBQ8GHSUIOPY7BbdIn6PzUOq0z41RFrF30HbjsxG6Rrfk+6QulR8Kgf2Vwj2a/rE6i62q5vo+2gI5dJA==} engines: {node: '>=10'} peerDependencies: react: 18.3.1 @@ -4124,8 +4008,8 @@ packages: '@hexagon/base64@1.1.28': resolution: {integrity: sha512-lhqDEAvWixy3bZ+UOYbPwUbBkwBq5C1LAJ/xPC8Oi+lL54oyakv/npbA0aU2hgCsx/1NUd4IBvV03+aUBWxerw==} - '@hono/node-server@1.14.0': - resolution: {integrity: sha512-YUCxJwgHRKSqjrdTk9e4VMGKN27MK5r4+MGPyZTgKH+IYbK+KtYbHeOcPGJ91KGGD6RIQiz2dAHxvjauNhOS8g==} + '@hono/node-server@1.14.1': + resolution: {integrity: sha512-vmbuM+HPinjWzPe7FFPWMMQMsbKE9gDPhaH0FFdqbGpkT5lp++tcWDTxwBl5EgS5y6JVgIaCdjeHRfQ4XRBRjQ==} engines: {node: '>=18.14.1'} peerDependencies: hono: ^4 @@ -4171,8 +4055,8 @@ packages: '@iconify-json/mingcute@1.2.3': resolution: {integrity: sha512-yiEQfLBF5iwyOdxuY0kEU06+8Mp6Mrp14KVXTb+5jjSVuD71C9EQrzM/mm1Efd8Nu2amJalTPisl3loC8pHBqQ==} - '@iconify-json/simple-icons@1.2.30': - resolution: {integrity: sha512-KiVViMvnohpS5Q9WMP+4ksOhF3Dnq73Ba9hxBhUIIhp1r6RJ6edMZ8QGKZcFZp/B0/PZC4jAIhXcKKq73WZckQ==} + '@iconify-json/simple-icons@1.2.32': + resolution: {integrity: sha512-gxgLq0raip7SJaeJ0302vwhsqupQttS21B93Ci1kA/++B+hIgGw71HzTOWQoUhwjlrdWcoVUxSvpPJoMs7oURg==} '@iconify/tools@4.1.2': resolution: {integrity: sha512-q6NzLQYEN9zkDfcyBqD3vItHcZw97w/s++3H3TBxUORr57EfHxj6tOW6fyufDjMq+Vl56WXWaPx1csBPYlI5CA==} @@ -4444,14 +4328,14 @@ packages: resolution: {integrity: sha512-juG5VWh4qAivzTAeMzvY9xs9HY5rAcr2E4I7tiSSCokRFi7XIZCAu92ZkSTsIj1OPceCifL3cpfteP3pDT9/QQ==} engines: {node: '>=14.0.0'} - '@napi-rs/wasm-runtime@0.2.7': - resolution: {integrity: sha512-5yximcFK5FNompXfJFoWanu5l8v1hNGqNHh9du1xETp9HWk/B/PzvchX55WYOPaIeNglG8++68AAiauBAtbnzw==} + '@napi-rs/wasm-runtime@0.2.9': + resolution: {integrity: sha512-OKRBiajrrxB9ATokgEQoG87Z25c67pCpYcCwmXYX8PBftC9pBfN18gnm/fh1wurSLEKIAt+QRFLFCQISrb66Jg==} '@noble/ciphers@0.6.0': resolution: {integrity: sha512-mIbq/R9QXk5/cTfESb1OKtyFnk7oc1Om/8onA1158K9/OZUQFDEVy55jVTato+xmp3XX6F6Qh0zz0Nc1AxAlRQ==} - '@noble/hashes@1.7.1': - resolution: {integrity: sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==} + '@noble/hashes@1.7.2': + resolution: {integrity: sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ==} engines: {node: ^14.21.3 || >=16} '@nodelib/fs.scandir@2.1.5': @@ -4752,8 +4636,8 @@ packages: resolution: {integrity: sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==} engines: {node: '>=14'} - '@opentelemetry/semantic-conventions@1.30.0': - resolution: {integrity: sha512-4VlGgo32k2EQ2wcCY3vEU28A0O13aOtHz3Xt2/2U5FAh9EfhD6t6DqL5Z6yAnRCntbTFDU4YfbpyzSlHNWycPw==} + '@opentelemetry/semantic-conventions@1.32.0': + resolution: {integrity: sha512-s0OpmpQFSfMrmedAn9Lhg4KWJELHCU6uU9dtIJ28N8UGhf9Y55im5X8fEzwhwDwiSqN+ZPSNrDJF7ivf/AuRPQ==} engines: {node: '>=14'} '@opentelemetry/sql-common@0.40.1': @@ -4762,8 +4646,8 @@ packages: peerDependencies: '@opentelemetry/api': ^1.1.0 - '@peculiar/asn1-android@2.3.15': - resolution: {integrity: sha512-8U2TIj59cRlSXTX2d0mzUKP7whfWGFMzTeC3qPgAbccXFrPNZLaDhpNEdG5U2QZ/tBv/IHlCJ8s+KYXpJeop6w==} + '@peculiar/asn1-android@2.3.16': + resolution: {integrity: sha512-a1viIv3bIahXNssrOIkXZIlI2ePpZaNmR30d4aBL99mu2rO+mT9D6zBsp7H6eROWGtmwv0Ionp5olJurIo09dw==} '@peculiar/asn1-ecc@2.3.15': resolution: {integrity: sha512-/HtR91dvgog7z/WhCVdxZJ/jitJuIu8iTqiyWVgRE9Ac5imt2sT/E4obqIVGKQw7PIy+X6i8lVBoT6wC73XUgA==} @@ -4797,8 +4681,8 @@ packages: resolution: {integrity: sha512-fdDH1LSGfZdTH2sxdpVMw31BanV28K/Gry0cVFxaNP77neJSkd82mM8ErPNYs9e+0O7SdHBLTDzDgwUuy18RnQ==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@pkgr/core@0.2.0': - resolution: {integrity: sha512-vsJDAkYR6qCPu+ioGScGiMYR7LvZYIXh/dlQeviqoTWNCVfKTLYD/LkNWH4Mxsv2a5vpIRc77FN5DnmK1eBggQ==} + '@pkgr/core@0.2.4': + resolution: {integrity: sha512-ROFF39F6ZrnzSUEmQQZUar0Jt4xVoP9WnDRdWwF4NNcXs3xBTLgBUDoOwW141y1jP+S8nahIbdxbFC7IShw9Iw==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} '@preact/signals-core@1.8.0': @@ -4848,14 +4732,14 @@ packages: resolution: {integrity: sha512-ezIadUb1aFhwJLd++WVqVpi9rnlX8vnd4ju7saPhwLHJN1mJgOv0puePTGV+FbtSnWtwoHDT8lAm4kagDZmpCg==} engines: {node: '>=20.0.0'} - '@radix-ui/number@1.1.0': - resolution: {integrity: sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==} + '@radix-ui/number@1.1.1': + resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} - '@radix-ui/primitive@1.1.1': - resolution: {integrity: sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==} + '@radix-ui/primitive@1.1.2': + resolution: {integrity: sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==} - '@radix-ui/react-arrow@1.1.2': - resolution: {integrity: sha512-G+KcpzXHq24iH0uGG/pF8LyzpFJYGD4RfLjCIBfGdSLXvjLHST31RUiRVrupIBMvIppMgSzQ6l66iAxl03tdlg==} + '@radix-ui/react-arrow@1.1.3': + resolution: {integrity: sha512-2dvVU4jva0qkNZH6HHWuSz5FN5GeU5tymvCgutF8WaXz9WnD1NgUhy73cqzkjkN4Zkn8lfTPv5JIfrC221W+Nw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -4867,8 +4751,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-avatar@1.1.3': - resolution: {integrity: sha512-Paen00T4P8L8gd9bNsRMw7Cbaz85oxiv+hzomsRZgFm2byltPFDtfcoqlWJ8GyZlIBWgLssJlzLCnKU0G0302g==} + '@radix-ui/react-avatar@1.1.4': + resolution: {integrity: sha512-+kBesLBzwqyDiYCtYFK+6Ktf+N7+Y6QOTUueLGLIbLZ/YeyFW6bsBGDsN+5HxHpM55C90u5fxsg0ErxzXTcwKA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -4880,8 +4764,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-checkbox@1.1.4': - resolution: {integrity: sha512-wP0CPAHq+P5I4INKe3hJrIa1WoNqqrejzW+zoU0rOvo1b9gDEJJFl2rYfO1PYJUQCc2H1WZxIJmyv9BS8i5fLw==} + '@radix-ui/react-checkbox@1.1.5': + resolution: {integrity: sha512-B0gYIVxl77KYDR25AY9EGe/G//ef85RVBIxQvK+m5pxAC7XihAc/8leMHhDvjvhDu02SBSb6BuytlWr/G7F3+g==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -4893,8 +4777,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-collection@1.1.2': - resolution: {integrity: sha512-9z54IEKRxIa9VityapoEYMuByaG42iSy1ZXlY2KcuLSEtq8x4987/N6m15ppoMffgZX72gER2uHe1D9Y6Unlcw==} + '@radix-ui/react-collection@1.1.3': + resolution: {integrity: sha512-mM2pxoQw5HJ49rkzwOs7Y6J4oYH22wS8BfK2/bBxROlI4xuR0c4jEenQP63LlTlDkO6Buj2Vt+QYAYcOgqtrXA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -4915,8 +4799,17 @@ packages: '@types/react': optional: true - '@radix-ui/react-context-menu@2.2.6': - resolution: {integrity: sha512-aUP99QZ3VU84NPsHeaFt4cQUNgJqFsLLOt/RbbWXszZ6MP0DpDyjkFZORr4RpAEx3sUBk+Kc8h13yGtC5Qw8dg==} + '@radix-ui/react-compose-refs@1.1.2': + resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} + peerDependencies: + '@types/react': '*' + react: 18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context-menu@2.2.7': + resolution: {integrity: sha512-EwO3tyyqwGaLPg0P64jmIKJnBywD0yjiL1eRuMPyhUXPkWWpa5JPDS+oyeIWHy2JbhF+NUlfUPVq6vE7OqgZww==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -4928,8 +4821,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-context@1.1.1': - resolution: {integrity: sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==} + '@radix-ui/react-context@1.1.2': + resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} peerDependencies: '@types/react': '*' react: 18.3.1 @@ -4937,8 +4830,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-dialog@1.1.6': - resolution: {integrity: sha512-/IVhJV5AceX620DUJ4uYVMymzsipdKBzo3edo+omeskCKGm9FRHM0ebIdbPnlQVJqyuHbuBltQUOG2mOTq2IYw==} + '@radix-ui/react-dialog@1.1.7': + resolution: {integrity: sha512-EIdma8C0C/I6kL6sO02avaCRqi3fmWJpxH6mqbVScorW6nNktzKJT/le7VPho3o/7wCsyRg3z0+Q+Obr0Gy/VQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -4950,8 +4843,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-direction@1.1.0': - resolution: {integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==} + '@radix-ui/react-direction@1.1.1': + resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} peerDependencies: '@types/react': '*' react: 18.3.1 @@ -4959,8 +4852,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-dismissable-layer@1.1.5': - resolution: {integrity: sha512-E4TywXY6UsXNRhFrECa5HAvE5/4BFcGyfTyK36gP+pAW1ed7UTK4vKwdr53gAJYwqbfCWC6ATvJa3J3R/9+Qrg==} + '@radix-ui/react-dismissable-layer@1.1.6': + resolution: {integrity: sha512-7gpgMT2gyKym9Jz2ZhlRXSg2y6cNQIK8d/cqBZ0RBCaps8pFryCWXiUKI+uHGFrhMrbGUP7U6PWgiXzIxoyF3Q==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -4972,8 +4865,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-dropdown-menu@2.1.6': - resolution: {integrity: sha512-no3X7V5fD487wab/ZYSHXq3H37u4NVeLDKI/Ks724X/eEFSSEFYZxWgsIlr1UBeEyDaM29HM5x9p1Nv8DuTYPA==} + '@radix-ui/react-dropdown-menu@2.1.7': + resolution: {integrity: sha512-7/1LiuNZuCQE3IzdicGoHdQOHkS2Q08+7p8w6TXZ6ZjgAULaCI85ZY15yPl4o4FVgoKLRT43/rsfNVN8osClQQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -4985,8 +4878,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-focus-guards@1.1.1': - resolution: {integrity: sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==} + '@radix-ui/react-focus-guards@1.1.2': + resolution: {integrity: sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==} peerDependencies: '@types/react': '*' react: 18.3.1 @@ -4994,8 +4887,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-focus-scope@1.1.2': - resolution: {integrity: sha512-zxwE80FCU7lcXUGWkdt6XpTTCKPitG1XKOwViTxHVKIJhZl9MvIl2dVHeZENCWD9+EdWv05wlaEkRXUykU27RA==} + '@radix-ui/react-focus-scope@1.1.3': + resolution: {integrity: sha512-4XaDlq0bPt7oJwR+0k0clCiCO/7lO7NKZTAaJBYxDNQT/vj4ig0/UvctrRscZaFREpRvUTkpKR96ov1e6jptQg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -5007,8 +4900,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-hover-card@1.1.6': - resolution: {integrity: sha512-E4ozl35jq0VRlrdc4dhHrNSV0JqBb4Jy73WAhBEK7JoYnQ83ED5r0Rb/XdVKw89ReAJN38N492BAPBZQ57VmqQ==} + '@radix-ui/react-hover-card@1.1.7': + resolution: {integrity: sha512-HwM03kP8psrv21J1+9T/hhxi0f5rARVbqIZl9+IAq13l4j4fX+oGIuxisukZZmebO7J35w9gpoILvtG8bbph0w==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -5029,8 +4922,17 @@ packages: '@types/react': optional: true - '@radix-ui/react-label@2.1.2': - resolution: {integrity: sha512-zo1uGMTaNlHehDyFQcDZXRJhUPDuukcnHz0/jnrup0JA6qL+AFpAnty+7VKa9esuU5xTblAZzTGYJKSKaBxBhw==} + '@radix-ui/react-id@1.1.1': + resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} + peerDependencies: + '@types/react': '*' + react: 18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-label@2.1.3': + resolution: {integrity: sha512-zwSQ1NzSKG95yA0tvBMgv6XPHoqapJCcg9nsUBaQQ66iRBhZNhlpaQG2ERYYX4O4stkYFK5rxj5NsWfO9CS+Hg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -5042,8 +4944,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-menu@2.1.6': - resolution: {integrity: sha512-tBBb5CXDJW3t2mo9WlO7r6GTmWV0F0uzHZVFmlRmYpiSK1CDU5IKojP1pm7oknpBOrFZx/YgBRW9oorPO2S/Lg==} + '@radix-ui/react-menu@2.1.7': + resolution: {integrity: sha512-tBODsrk68rOi1/iQzbM54toFF+gSw/y+eQgttFflqlGekuSebNqvFNHjJgjqPhiMb4Fw9A0zNFly1QT6ZFdQ+Q==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -5055,8 +4957,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-navigation-menu@1.2.5': - resolution: {integrity: sha512-myMHHQUZ3ZLTi8W381/Vu43Ia0NqakkQZ2vzynMmTUtQQ9kNkjzhOwkZC9TAM5R07OZUVIQyHC06f/9JZJpvvA==} + '@radix-ui/react-navigation-menu@1.2.6': + resolution: {integrity: sha512-HJqyzqG74Lj7KV58rk73i/B1nnopVyCfUmKgeGWWrZZiCuMNcY0KKugTrmqMbIeMliUnkBUDKCy9J6Mzl6xeWw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -5068,8 +4970,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-popover@1.1.6': - resolution: {integrity: sha512-NQouW0x4/GnkFJ/pRqsIS3rM/k97VzKnVb2jB7Gq7VEGPy5g7uNV1ykySFt7eWSp3i2uSGFwaJcvIRJBAHmmFg==} + '@radix-ui/react-popover@1.1.7': + resolution: {integrity: sha512-I38OYWDmJF2kbO74LX8UsFydSHWOJuQ7LxPnTefjxxvdvPLempvAnmsyX9UsBlywcbSGpRH7oMLfkUf+ij4nrw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -5081,8 +4983,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-popper@1.2.2': - resolution: {integrity: sha512-Rvqc3nOpwseCyj/rgjlJDYAgyfw7OC1tTkKn2ivhaMGcYt8FSBlahHOZak2i3QwkRXUXgGgzeEe2RuqeEHuHgA==} + '@radix-ui/react-popper@1.2.3': + resolution: {integrity: sha512-iNb9LYUMkne9zIahukgQmHlSBp9XWGeQQ7FvUGNk45ywzOb6kQa+Ca38OphXlWDiKvyneo9S+KSJsLfLt8812A==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -5094,8 +4996,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-portal@1.1.4': - resolution: {integrity: sha512-sn2O9k1rPFYVyKd5LAJfo96JlSGVFpa1fS6UuBJfrZadudiw5tAmru+n1x7aMRQ84qDM71Zh1+SzK5QwU0tJfA==} + '@radix-ui/react-portal@1.1.5': + resolution: {integrity: sha512-ps/67ZqsFm+Mb6lSPJpfhRLrVL2i2fntgCmGMqqth4eaGUf+knAuuRtWVJrNjUhExgmdRqftSgzpf0DF0n6yXA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -5107,8 +5009,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-presence@1.1.2': - resolution: {integrity: sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==} + '@radix-ui/react-presence@1.1.3': + resolution: {integrity: sha512-IrVLIhskYhH3nLvtcBLQFZr61tBG7wx7O3kEmdzcYwRGAEBmBicGGL7ATzNgruYJ3xBTbuzEEq9OXJM3PAX3tA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -5133,8 +5035,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-radio-group@1.2.3': - resolution: {integrity: sha512-xtCsqt8Rp09FK50ItqEqTJ7Sxanz8EM8dnkVIhJrc/wkMMomSmXHvYbhv3E7Zx4oXh98aaLt9W679SUYXg4IDA==} + '@radix-ui/react-primitive@2.0.3': + resolution: {integrity: sha512-Pf/t/GkndH7CQ8wE2hbkXA+WyZ83fhQQn5DDmwDiDo6AwN/fhaH8oqZ0jRjMrO2iaMhDi6P1HRx6AZwyMinY1g==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -5146,8 +5048,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-roving-focus@1.1.2': - resolution: {integrity: sha512-zgMQWkNO169GtGqRvYrzb0Zf8NhMHS2DuEB/TiEmVnpr5OqPU3i8lfbxaAmC2J/KYuIQxyoQQ6DxepyXp61/xw==} + '@radix-ui/react-radio-group@1.2.4': + resolution: {integrity: sha512-oLz7ATfKgVTUbpr5OBu6Q7hQcnV22uPT306bmG0QwgnKqBStR98RfWfJGCfW/MmhL4ISmrmmBPBW+c77SDwV9g==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -5159,8 +5061,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-scroll-area@1.2.3': - resolution: {integrity: sha512-l7+NNBfBYYJa9tNqVcP2AGvxdE3lmE6kFTBXdvHgUaZuy+4wGCL1Cl2AfaR7RKyimj7lZURGLwFO59k4eBnDJQ==} + '@radix-ui/react-roving-focus@1.1.3': + resolution: {integrity: sha512-ufbpLUjZiOg4iYgb2hQrWXEPYX6jOLBbR27bDyAff5GYMRrCzcze8lukjuXVUQvJ6HZe8+oL+hhswDcjmcgVyg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -5172,8 +5074,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-select@2.1.6': - resolution: {integrity: sha512-T6ajELxRvTuAMWH0YmRJ1qez+x4/7Nq7QIx7zJ0VK3qaEWdnWpNbEDnmWldG1zBDwqrLy5aLMUWcoGirVj5kMg==} + '@radix-ui/react-scroll-area@1.2.4': + resolution: {integrity: sha512-G9rdWTQjOR4sk76HwSdROhPU0jZWpfozn9skU1v4N0/g9k7TmswrJn8W8WMU+aYktnLLpk5LX6fofj2bGe5NFQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -5185,8 +5087,21 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-slider@1.2.3': - resolution: {integrity: sha512-nNrLAWLjGESnhqBqcCNW4w2nn7LxudyMzeB6VgdyAnFLC6kfQgnAjSL2v6UkQTnDctJBlxrmxfplWS4iYjdUTw==} + '@radix-ui/react-select@2.1.7': + resolution: {integrity: sha512-exzGIRtc7S8EIM2KjFg+7lJZsH7O7tpaBaJbBNVDnOZNhtoQ2iV+iSNfi2Wth0m6h3trJkMVvzAehB3c6xj/3Q==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: 18.3.1 + react-dom: 18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slider@1.2.4': + resolution: {integrity: sha512-Vr/OgNejNJPAghIhjS7Mf/2F/EXGDT0qgtiHf2BHz71+KqgN+jndFLKq5xAB9JOGejGzejfJLIvT04Do+yzhcg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -5207,8 +5122,17 @@ packages: '@types/react': optional: true - '@radix-ui/react-switch@1.1.3': - resolution: {integrity: sha512-1nc+vjEOQkJVsJtWPSiISGT6OKm4SiOdjMo+/icLxo2G4vxz1GntC5MzfL4v8ey9OEfw787QCD1y3mUv0NiFEQ==} + '@radix-ui/react-slot@1.2.0': + resolution: {integrity: sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w==} + peerDependencies: + '@types/react': '*' + react: 18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-switch@1.1.4': + resolution: {integrity: sha512-zGP6W8plLeogoeGMiTHJ/uvf+TE1C2chVsEwfP8YlvpQKJHktG+iCkUtCLGPAuDV8/qDSmIRPm4NggaTxFMVBQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -5220,8 +5144,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-tabs@1.1.3': - resolution: {integrity: sha512-9mFyI30cuRDImbmFF6O2KUJdgEOsGh9Vmx9x/Dh9tOhL7BngmQPQfwW4aejKm5OHpfWIdmeV6ySyuxoOGjtNng==} + '@radix-ui/react-tabs@1.1.4': + resolution: {integrity: sha512-fuHMHWSf5SRhXke+DbHXj2wVMo+ghVH30vhX3XVacdXqDl+J4XWafMIGOOER861QpBx1jxgwKXL2dQnfrsd8MQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -5233,8 +5157,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-toast@1.2.6': - resolution: {integrity: sha512-gN4dpuIVKEgpLn1z5FhzT9mYRUitbfZq9XqN/7kkBMUgFTzTG8x/KszWJugJXHcwxckY8xcKDZPz7kG3o6DsUA==} + '@radix-ui/react-toast@1.2.7': + resolution: {integrity: sha512-0IWTbAUKvzdpOaWDMZisXZvScXzF0phaQjWspK8RUMEUxjLbli+886mB/kXTIC3F+t5vQ0n0vYn+dsX8s+WdfA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -5246,8 +5170,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-tooltip@1.1.8': - resolution: {integrity: sha512-YAA2cu48EkJZdAMHC0dqo9kialOcRStbtiY4nJPaht7Ptrhcvpo+eDChaM6BIs8kL6a8Z5l5poiqLnXcNduOkA==} + '@radix-ui/react-tooltip@1.2.0': + resolution: {integrity: sha512-b1Sdc75s7zN9B8ONQTGBSHL3XS8+IcjcOIY51fhM4R1Hx8s0YbgqgyNZiri4qcYMVZK8hfCZVBiyCm7N9rs0rw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -5259,8 +5183,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-use-callback-ref@1.1.0': - resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==} + '@radix-ui/react-use-callback-ref@1.1.1': + resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} peerDependencies: '@types/react': '*' react: 18.3.1 @@ -5268,8 +5192,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-controllable-state@1.1.0': - resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==} + '@radix-ui/react-use-controllable-state@1.1.1': + resolution: {integrity: sha512-YnEXIy8/ga01Y1PN0VfaNH//MhA91JlEGVBDxDzROqwrAtG5Yr2QGEPz8A/rJA3C7ZAHryOYGaUv8fLSW2H/mg==} peerDependencies: '@types/react': '*' react: 18.3.1 @@ -5277,8 +5201,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-escape-keydown@1.1.0': - resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==} + '@radix-ui/react-use-escape-keydown@1.1.1': + resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==} peerDependencies: '@types/react': '*' react: 18.3.1 @@ -5295,8 +5219,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-previous@1.1.0': - resolution: {integrity: sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==} + '@radix-ui/react-use-layout-effect@1.1.1': + resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} peerDependencies: '@types/react': '*' react: 18.3.1 @@ -5304,8 +5228,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-rect@1.1.0': - resolution: {integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==} + '@radix-ui/react-use-previous@1.1.1': + resolution: {integrity: sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==} peerDependencies: '@types/react': '*' react: 18.3.1 @@ -5313,8 +5237,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-size@1.1.0': - resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==} + '@radix-ui/react-use-rect@1.1.1': + resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==} peerDependencies: '@types/react': '*' react: 18.3.1 @@ -5322,8 +5246,17 @@ packages: '@types/react': optional: true - '@radix-ui/react-visually-hidden@1.1.2': - resolution: {integrity: sha512-1SzA4ns2M1aRlvxErqhLHsBHoS5eI5UUcI2awAMgGUp4LoaoWOKYmvqDY2s/tltuPkh3Yk77YF/r3IRj+Amx4Q==} + '@radix-ui/react-use-size@1.1.1': + resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==} + peerDependencies: + '@types/react': '*' + react: 18.3.1 + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-visually-hidden@1.1.3': + resolution: {integrity: sha512-oXSF3ZQRd5fvomd9hmUCb2EHSZbPp3ZSHAHJJU/DlF9XoFkJBBW8RHU/E8WEH+RbSfJd/QFA0sl8ClJXknBwHQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -5335,29 +5268,29 @@ packages: '@types/react-dom': optional: true - '@radix-ui/rect@1.1.0': - resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==} + '@radix-ui/rect@1.1.1': + resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} - '@react-aria/focus@3.20.1': - resolution: {integrity: sha512-lgYs+sQ1TtBrAXnAdRBQrBo0/7o5H6IrfDxec1j+VRpcXL0xyk0xPq+m3lZp8typzIghqDgpnKkJ5Jf4OrzPIw==} + '@react-aria/focus@3.20.2': + resolution: {integrity: sha512-Q3rouk/rzoF/3TuH6FzoAIKrl+kzZi9LHmr8S5EqLAOyP9TXIKG34x2j42dZsAhrw7TbF9gA8tBKwnCNH4ZV+Q==} peerDependencies: react: 18.3.1 react-dom: 18.3.1 - '@react-aria/interactions@3.24.1': - resolution: {integrity: sha512-OWEcIC6UQfWq4Td5Ptuh4PZQ4LHLJr/JL2jGYvuNL6EgL3bWvzPrRYIF/R64YbfVxIC7FeZpPSkS07sZ93/NoA==} + '@react-aria/interactions@3.25.0': + resolution: {integrity: sha512-GgIsDLlO8rDU/nFn6DfsbP9rfnzhm8QFjZkB9K9+r+MTSCn7bMntiWQgMM+5O6BiA8d7C7x4zuN4bZtc0RBdXQ==} peerDependencies: react: 18.3.1 react-dom: 18.3.1 - '@react-aria/ssr@3.9.7': - resolution: {integrity: sha512-GQygZaGlmYjmYM+tiNBA5C6acmiDWF52Nqd40bBp0Znk4M4hP+LTmI0lpI1BuKMw45T8RIhrAsICIfKwZvi2Gg==} + '@react-aria/ssr@3.9.8': + resolution: {integrity: sha512-lQDE/c9uTfBSDOjaZUJS8xP2jCKVk4zjQeIlCH90xaLhHDgbpCdns3xvFpJJujfj3nI4Ll9K7A+ONUBDCASOuw==} engines: {node: '>= 12'} peerDependencies: react: 18.3.1 - '@react-aria/utils@3.28.1': - resolution: {integrity: sha512-mnHFF4YOVu9BRFQ1SZSKfPhg3z+lBRYoW5mLcYTQihbKhz48+I1sqRkP7ahMITr8ANH3nb34YaMME4XWmK2Mgg==} + '@react-aria/utils@3.28.2': + resolution: {integrity: sha512-J8CcLbvnQgiBn54eeEvQQbIOfBF3A1QizxMw9P4cl9MkeR03ug7RnjTIdJY/n2p7t59kLeAB3tqiczhcj+Oi5w==} peerDependencies: react: 18.3.1 react-dom: 18.3.1 @@ -5405,22 +5338,22 @@ packages: react-native: optional: true - '@react-native-firebase/analytics@21.13.0': - resolution: {integrity: sha512-i2XMGcCOSiuFCi20wINVCtRsKgJ/Qcmh7Qy7Io3yPL+nuszClGL3v6LMAFjkEDPhlXwCD0gy5/uEF/X79vUZdg==} + '@react-native-firebase/analytics@21.14.0': + resolution: {integrity: sha512-hWzb/mMCw9DHu3y8tYlSFTcG6cpUNTbnOO8CDKxjmkCRlryU/sU+dT3ih3NlJXiuI6W9wSUy4qigA0SEBCiQlQ==} peerDependencies: - '@react-native-firebase/app': 21.13.0 + '@react-native-firebase/app': 21.14.0 - '@react-native-firebase/app-check@21.13.0': - resolution: {integrity: sha512-qYAy2wGhFHrhMUfOEV7d0nGos4GSmfhEfAtvzJuwWiL/DwhM0xrI82k4xjGzau+6RyGZ4Ro4Sab8Q9jpemkInw==} + '@react-native-firebase/app-check@21.14.0': + resolution: {integrity: sha512-44zbx3v51mn6SUvZXQAC5sStVW+VLYnbqum+Y6zy1j9fEVKhCtu4kGVnt7aN2eQhYlUxggD8BUt90QclRyYWug==} peerDependencies: - '@react-native-firebase/app': 21.13.0 + '@react-native-firebase/app': 21.14.0 expo: '>=47.0.0' peerDependenciesMeta: expo: optional: true - '@react-native-firebase/app@21.13.0': - resolution: {integrity: sha512-UjM+yTTuBTQkGQHSTmJtKoXumgWxN+G90q6TCBqf2fQzAGhWpeMQSKOpD3arW+gmmO2eNIb1P8wyMYQk9GeGVA==} + '@react-native-firebase/app@21.14.0': + resolution: {integrity: sha512-vBNfn7PoQrZfANLJnJiWZSHVu7WG6hjM5w3MDfmG8DLdr8VsAVBUgsn8lGpqobSuno1vTgwDIhR8PYZjMGsuvg==} peerDependencies: expo: '>=47.0.0' react: 18.3.1 @@ -5429,19 +5362,19 @@ packages: expo: optional: true - '@react-native-firebase/crashlytics@21.13.0': - resolution: {integrity: sha512-GAkrlffyhQYuwVCW1kSxsRX/g3c5n5p3ruzpnGMRMVoUy7Md9L1LbxkkGTSHfdCaO/RJ/P5lLTL4GyBlI/KF7g==} + '@react-native-firebase/crashlytics@21.14.0': + resolution: {integrity: sha512-w51Huoyg3iWgS0UfiozBqofnIaG2ZY8pdVI8iEMRAD82PKYCxFABH7WqSZOefJHvYuqip02DCmEZ9Q0b3lpBug==} peerDependencies: - '@react-native-firebase/app': 21.13.0 + '@react-native-firebase/app': 21.14.0 expo: '>=47.0.0' peerDependenciesMeta: expo: optional: true - '@react-native-firebase/messaging@21.13.0': - resolution: {integrity: sha512-ZUc44XRPjVvg0os9TdcOB7GECewJXsEzsder8gJRgCrOL6wn96uAqqOOmzAja64SQeMxvnelbfOtDtwoltLCvA==} + '@react-native-firebase/messaging@21.14.0': + resolution: {integrity: sha512-EwJVFr2xtQFf6wQ3anXvnxCyFNRc6Hw7B6Ov4GYwgBEXNzw0MIPN2qDDA3lIN2a6nf6zESPuflYyG6Tel1ovSQ==} peerDependencies: - '@react-native-firebase/app': 21.13.0 + '@react-native-firebase/app': 21.14.0 expo: '>=47.0.0' peerDependenciesMeta: expo: @@ -5569,16 +5502,16 @@ packages: '@types/react': optional: true - '@react-stately/flags@3.1.0': - resolution: {integrity: sha512-KSHOCxTFpBtxhIRcKwsD1YDTaNxFtCYuAUb0KEihc16QwqZViq4hasgPBs2gYm7fHRbw7WYzWKf6ZSo/+YsFlg==} + '@react-stately/flags@3.1.1': + resolution: {integrity: sha512-XPR5gi5LfrPdhxZzdIlJDz/B5cBf63l4q6/AzNqVWFKgd0QqY5LvWJftXkklaIUpKSJkIKQb8dphuZXDtkWNqg==} - '@react-stately/utils@3.10.5': - resolution: {integrity: sha512-iMQSGcpaecghDIh3mZEpZfoFH3ExBwTtuBEcvZ2XnGzCgQjeYXcMdIUwAfVQLXFTdHUHGF6Gu6/dFrYsCzySBQ==} + '@react-stately/utils@3.10.6': + resolution: {integrity: sha512-O76ip4InfTTzAJrg8OaZxKU4vvjMDOpfA/PGNOytiXwBbkct2ZeZwaimJ8Bt9W1bj5VsZ81/o/tW4BacbdDOMA==} peerDependencies: react: 18.3.1 - '@react-types/shared@3.28.0': - resolution: {integrity: sha512-9oMEYIDc3sk0G5rysnYvdNrkSg7B04yTKl50HHSZVbokeHpnU0yRmsDaWb9B/5RprcKj8XszEk5guBO8Sa/Q+Q==} + '@react-types/shared@3.29.0': + resolution: {integrity: sha512-IDQYu/AHgZimObzCFdNl1LpZvQW/xcfLt3v20sorl5qRucDVj4S9os98sVTZ4IRIBjmS+MkjqpR5E70xan7ooA==} peerDependencies: react: 18.3.1 @@ -5712,8 +5645,8 @@ packages: cpu: [arm] os: [android] - '@rollup/rollup-android-arm-eabi@4.39.0': - resolution: {integrity: sha512-lGVys55Qb00Wvh8DMAocp5kIcaNzEFTmGhfFd88LfaogYTRKrdxgtlO5H6S49v2Nd8R2C6wLOal0qv6/kCkOwA==} + '@rollup/rollup-android-arm-eabi@4.40.0': + resolution: {integrity: sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==} cpu: [arm] os: [android] @@ -5722,8 +5655,8 @@ packages: cpu: [arm64] os: [android] - '@rollup/rollup-android-arm64@4.39.0': - resolution: {integrity: sha512-It9+M1zE31KWfqh/0cJLrrsCPiF72PoJjIChLX+rEcujVRCb4NLQ5QzFkzIZW8Kn8FTbvGQBY5TkKBau3S8cCQ==} + '@rollup/rollup-android-arm64@4.40.0': + resolution: {integrity: sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==} cpu: [arm64] os: [android] @@ -5732,8 +5665,8 @@ packages: cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-arm64@4.39.0': - resolution: {integrity: sha512-lXQnhpFDOKDXiGxsU9/l8UEGGM65comrQuZ+lDcGUx+9YQ9dKpF3rSEGepyeR5AHZ0b5RgiligsBhWZfSSQh8Q==} + '@rollup/rollup-darwin-arm64@4.40.0': + resolution: {integrity: sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==} cpu: [arm64] os: [darwin] @@ -5742,8 +5675,8 @@ packages: cpu: [x64] os: [darwin] - '@rollup/rollup-darwin-x64@4.39.0': - resolution: {integrity: sha512-mKXpNZLvtEbgu6WCkNij7CGycdw9cJi2k9v0noMb++Vab12GZjFgUXD69ilAbBh034Zwn95c2PNSz9xM7KYEAQ==} + '@rollup/rollup-darwin-x64@4.40.0': + resolution: {integrity: sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==} cpu: [x64] os: [darwin] @@ -5752,8 +5685,8 @@ packages: cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-arm64@4.39.0': - resolution: {integrity: sha512-jivRRlh2Lod/KvDZx2zUR+I4iBfHcu2V/BA2vasUtdtTN2Uk3jfcZczLa81ESHZHPHy4ih3T/W5rPFZ/hX7RtQ==} + '@rollup/rollup-freebsd-arm64@4.40.0': + resolution: {integrity: sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==} cpu: [arm64] os: [freebsd] @@ -5762,8 +5695,8 @@ packages: cpu: [x64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.39.0': - resolution: {integrity: sha512-8RXIWvYIRK9nO+bhVz8DwLBepcptw633gv/QT4015CpJ0Ht8punmoHU/DuEd3iw9Hr8UwUV+t+VNNuZIWYeY7Q==} + '@rollup/rollup-freebsd-x64@4.40.0': + resolution: {integrity: sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==} cpu: [x64] os: [freebsd] @@ -5772,8 +5705,8 @@ packages: cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-gnueabihf@4.39.0': - resolution: {integrity: sha512-mz5POx5Zu58f2xAG5RaRRhp3IZDK7zXGk5sdEDj4o96HeaXhlUwmLFzNlc4hCQi5sGdR12VDgEUqVSHer0lI9g==} + '@rollup/rollup-linux-arm-gnueabihf@4.40.0': + resolution: {integrity: sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==} cpu: [arm] os: [linux] @@ -5782,8 +5715,8 @@ packages: cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.39.0': - resolution: {integrity: sha512-+YDwhM6gUAyakl0CD+bMFpdmwIoRDzZYaTWV3SDRBGkMU/VpIBYXXEvkEcTagw/7VVkL2vA29zU4UVy1mP0/Yw==} + '@rollup/rollup-linux-arm-musleabihf@4.40.0': + resolution: {integrity: sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==} cpu: [arm] os: [linux] @@ -5792,8 +5725,8 @@ packages: cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.39.0': - resolution: {integrity: sha512-EKf7iF7aK36eEChvlgxGnk7pdJfzfQbNvGV/+l98iiMwU23MwvmV0Ty3pJ0p5WQfm3JRHOytSIqD9LB7Bq7xdQ==} + '@rollup/rollup-linux-arm64-gnu@4.40.0': + resolution: {integrity: sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==} cpu: [arm64] os: [linux] @@ -5802,8 +5735,8 @@ packages: cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.39.0': - resolution: {integrity: sha512-vYanR6MtqC7Z2SNr8gzVnzUul09Wi1kZqJaek3KcIlI/wq5Xtq4ZPIZ0Mr/st/sv/NnaPwy/D4yXg5x0B3aUUA==} + '@rollup/rollup-linux-arm64-musl@4.40.0': + resolution: {integrity: sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==} cpu: [arm64] os: [linux] @@ -5812,8 +5745,8 @@ packages: cpu: [loong64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.39.0': - resolution: {integrity: sha512-NMRUT40+h0FBa5fb+cpxtZoGAggRem16ocVKIv5gDB5uLDgBIwrIsXlGqYbLwW8YyO3WVTk1FkFDjMETYlDqiw==} + '@rollup/rollup-linux-loongarch64-gnu@4.40.0': + resolution: {integrity: sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==} cpu: [loong64] os: [linux] @@ -5822,8 +5755,8 @@ packages: cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.39.0': - resolution: {integrity: sha512-0pCNnmxgduJ3YRt+D+kJ6Ai/r+TaePu9ZLENl+ZDV/CdVczXl95CbIiwwswu4L+K7uOIGf6tMo2vm8uadRaICQ==} + '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': + resolution: {integrity: sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==} cpu: [ppc64] os: [linux] @@ -5832,8 +5765,8 @@ packages: cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.39.0': - resolution: {integrity: sha512-t7j5Zhr7S4bBtksT73bO6c3Qa2AV/HqiGlj9+KB3gNF5upcVkx+HLgxTm8DK4OkzsOYqbdqbLKwvGMhylJCPhQ==} + '@rollup/rollup-linux-riscv64-gnu@4.40.0': + resolution: {integrity: sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==} cpu: [riscv64] os: [linux] @@ -5842,8 +5775,8 @@ packages: cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.39.0': - resolution: {integrity: sha512-m6cwI86IvQ7M93MQ2RF5SP8tUjD39Y7rjb1qjHgYh28uAPVU8+k/xYWvxRO3/tBN2pZkSMa5RjnPuUIbrwVxeA==} + '@rollup/rollup-linux-riscv64-musl@4.40.0': + resolution: {integrity: sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==} cpu: [riscv64] os: [linux] @@ -5852,8 +5785,8 @@ packages: cpu: [s390x] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.39.0': - resolution: {integrity: sha512-iRDJd2ebMunnk2rsSBYlsptCyuINvxUfGwOUldjv5M4tpa93K8tFMeYGpNk2+Nxl+OBJnBzy2/JCscGeO507kA==} + '@rollup/rollup-linux-s390x-gnu@4.40.0': + resolution: {integrity: sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==} cpu: [s390x] os: [linux] @@ -5862,8 +5795,8 @@ packages: cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.39.0': - resolution: {integrity: sha512-t9jqYw27R6Lx0XKfEFe5vUeEJ5pF3SGIM6gTfONSMb7DuG6z6wfj2yjcoZxHg129veTqU7+wOhY6GX8wmf90dA==} + '@rollup/rollup-linux-x64-gnu@4.40.0': + resolution: {integrity: sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==} cpu: [x64] os: [linux] @@ -5872,8 +5805,8 @@ packages: cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.39.0': - resolution: {integrity: sha512-ThFdkrFDP55AIsIZDKSBWEt/JcWlCzydbZHinZ0F/r1h83qbGeenCt/G/wG2O0reuENDD2tawfAj2s8VK7Bugg==} + '@rollup/rollup-linux-x64-musl@4.40.0': + resolution: {integrity: sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==} cpu: [x64] os: [linux] @@ -5882,8 +5815,8 @@ packages: cpu: [arm64] os: [win32] - '@rollup/rollup-win32-arm64-msvc@4.39.0': - resolution: {integrity: sha512-jDrLm6yUtbOg2TYB3sBF3acUnAwsIksEYjLeHL+TJv9jg+TmTwdyjnDex27jqEMakNKf3RwwPahDIt7QXCSqRQ==} + '@rollup/rollup-win32-arm64-msvc@4.40.0': + resolution: {integrity: sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==} cpu: [arm64] os: [win32] @@ -5892,8 +5825,8 @@ packages: cpu: [ia32] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.39.0': - resolution: {integrity: sha512-6w9uMuza+LbLCVoNKL5FSLE7yvYkq9laSd09bwS0tMjkwXrmib/4KmoJcrKhLWHvw19mwU+33ndC69T7weNNjQ==} + '@rollup/rollup-win32-ia32-msvc@4.40.0': + resolution: {integrity: sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==} cpu: [ia32] os: [win32] @@ -5902,8 +5835,8 @@ packages: cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.39.0': - resolution: {integrity: sha512-yAkUOkIKZlK5dl7u6dg897doBgLXmUHhIINM2c+sND3DZwnrdQkkSiDh7N75Ll4mM4dxSkYfXqU9fW3lLkMFug==} + '@rollup/rollup-win32-x64-msvc@4.40.0': + resolution: {integrity: sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==} cpu: [x64] os: [win32] @@ -5924,50 +5857,50 @@ packages: '@segment/loosely-validate-event@2.0.0': resolution: {integrity: sha512-ZMCSfztDBqwotkl848ODgVcAmN4OItEWDCkshcKz0/W6gGSQayuuCtWV/MlodFivAZD793d6UgANd6wCXUfrIw==} - '@sentry-internal/browser-utils@9.10.1': - resolution: {integrity: sha512-O/ibpHbKfpG+xtZuEzbLNtLcbanRcDYGxT+QbslVItmcS9GjMSwvMpp1jnD9Y7/LIFtv7O1gJZ9Hrz///lLprw==} - engines: {node: '>=18'} - '@sentry-internal/browser-utils@9.11.0': resolution: {integrity: sha512-XS71kRf7lw5St/Jc9G2Viy1cKgqGoPHqUAykXEtFt38JVXdf1TY/dSbKv/PAgNqMvC1xvdTsN0HF/81o7DNUEA==} engines: {node: '>=18'} - '@sentry-internal/feedback@9.10.1': - resolution: {integrity: sha512-DM32eAzRvXk36iGBWtlLZA88QzOFBODd+kbz55X4Py+1bDNdRc3Vl6214uuAr7iweHcOQy1rIvmAeO8Xusp7tQ==} + '@sentry-internal/browser-utils@9.13.0': + resolution: {integrity: sha512-uZcbwcGI49oPC/YDEConJ+3xi2mu0TsVsDiMQKb6JoSc33KH37wq2IwXJb9nakzKJXxyMNemb44r8irAswjItw==} engines: {node: '>=18'} '@sentry-internal/feedback@9.11.0': resolution: {integrity: sha512-50KiRmrF1Ldr+KoRawqcCYVk7TAVP8K/I81Jk9YWwlp1+Pu1ArpYDmTNCLXTgoyiyO38aHefKGZJX6AKFuSsUQ==} engines: {node: '>=18'} - '@sentry-internal/replay-canvas@9.10.1': - resolution: {integrity: sha512-fxrpqElqdsAQrzVly0V/XaljhAlwwMk+iGyf+wZeK6RwEPVxtoxXVfx7fEEtPn+gortqQR09N/zH179hefjuaw==} + '@sentry-internal/feedback@9.13.0': + resolution: {integrity: sha512-fOhMnhEbOR5QVPtn5Gc5+UKQHjvAN/LmtYE6Qya3w2FDh3ZlnIXNFJWqwOneuICV3kCWjN4lLckwmzzwychr7A==} engines: {node: '>=18'} '@sentry-internal/replay-canvas@9.11.0': resolution: {integrity: sha512-ZcRg8TWfF0ucjK2i+4TY/blRNJ7YKrgMpx19pFj6eCOJ1K8geSkAFPIfDHcQEwIU1ZTN+HiCwx0JvTI9YZxjfg==} engines: {node: '>=18'} - '@sentry-internal/replay@9.10.1': - resolution: {integrity: sha512-nqG33NwojtteL8e3Qg/SOu0BsTJ9R7AjpmQIlOpFGL007nzKgcJHOngewd7FEHyB+F3iOI0MoI9iEWhRFEGRLw==} + '@sentry-internal/replay-canvas@9.13.0': + resolution: {integrity: sha512-5muW2BmEfWP1fpVWDNcIsph/WgqOqpHaXC1QMr4hk8/BWgt1/S2KPy85YiGVtM5lJJr0VhASKK8rBXG+9zm9IQ==} engines: {node: '>=18'} '@sentry-internal/replay@9.11.0': resolution: {integrity: sha512-0k24h58O/2VQw1dwT/zQiWvUzLNQxpxbrVN/MYPT7czSEhI+1bX8fxMHXZORl2JqhetImMXzxH3XkuHQPEqQMg==} engines: {node: '>=18'} + '@sentry-internal/replay@9.13.0': + resolution: {integrity: sha512-l+Atwab/bqI1N8+PSG1WWTCVmiOl7swL85Z9ntwS39QBnd66CTyzt/+j/n/UbAs8GienJK6FIfX1dvG1WmvUhA==} + engines: {node: '>=18'} + '@sentry/babel-plugin-component-annotate@3.3.1': resolution: {integrity: sha512-5GOxGT7lZN+I8A7Vp0rWY+726FDKEw8HnFiebe51rQrMbfGfCu2Aw9uSM0nT9OG6xhV6WvGccIcCszTPs4fUZQ==} engines: {node: '>= 14'} - '@sentry/browser@9.10.1': - resolution: {integrity: sha512-9RWjcyskhnDK2Q6LntFR90EqZD5+DXcXNqeTlE+mpVf65y7wz+9SIuVjAMP7qiDBwfxNbmTxiVCXeCuQnnATsQ==} - engines: {node: '>=18'} - '@sentry/browser@9.11.0': resolution: {integrity: sha512-DSDj8wQJoiLqqOcntl+7phjd8l8KN9A0vaV7mZNHWbrHU3MVwXqTyLyERRLC6wi0t7F5kqczqa3xLmKjK/fMZg==} engines: {node: '>=18'} + '@sentry/browser@9.13.0': + resolution: {integrity: sha512-KiC8s9/6HvdlfCRqA420YbiBiXMBif7GYESJ8VQqOKUmlPczn8V2CRrEZjMqxhlHdIGiR0PS6jb2VSgeJBchJQ==} + engines: {node: '>=18'} + '@sentry/bundler-plugin-core@3.3.1': resolution: {integrity: sha512-Dd6xaWb293j9otEJ1yJqG2Ra6zB49OPzMNdIkdP8wdY+S9UFQE5PyKTyredmPY7hqCc005OrUQZolIIo9Zl13A==} engines: {node: '>= 14'} @@ -6018,23 +5951,23 @@ packages: engines: {node: '>= 10'} hasBin: true - '@sentry/core@9.10.1': - resolution: {integrity: sha512-TE2zZV3Od4131mZNgFo2Mv4aKU8FXxL0s96yqRvmV+8AU57mJoycMXBnmNSYfWuDICbPJTVAp+3bYMXwX7N5YA==} - engines: {node: '>=18'} - '@sentry/core@9.11.0': resolution: {integrity: sha512-qfb4ahGZubbrNh1MnbEqyHFp87rIwQIZapyQLCaYpudXrP1biEpLOV3mMDvDJWCdX460hoOwQ3SkwipV3We/7w==} engines: {node: '>=18'} - '@sentry/electron@6.4.0': - resolution: {integrity: sha512-CbOhTwHH1i3jbLr1OTeDrFGajWK8Pr0jcAXUj8zf93ItTJPS09sEi9cd3CRGzHcC7ODX4nHB5RbUD9GYe6ms4w==} - - '@sentry/node@9.10.1': - resolution: {integrity: sha512-salNc4R0GiZZNNScNpdAB3OI3kz+clmgXL1rl5O2Kh1IW5vftf5I69n+qqZLJ3kaUp0Sm6V+deCHyUOnw9GozA==} + '@sentry/core@9.13.0': + resolution: {integrity: sha512-Zn1Qec5XNkNRE/M5QjL6YJLghETg6P188G/v2OzdHdHIRf0Y58/SnJilu3louF+ogos6kaSqqdMgzqKgZ8tCdg==} engines: {node: '>=18'} - '@sentry/opentelemetry@9.10.1': - resolution: {integrity: sha512-qqcsbIyoOPI91Tm6w0oFzsx/mlu+lywRGSVbPRFhk4zCXBOhCCp4Mg7nwKK0wGJ7AZRl6qtELrRSGClAthC55g==} + '@sentry/electron@6.5.0': + resolution: {integrity: sha512-VFwIr8ovbJGWW3rdnWGEVkRHTVLFj9IiTjguzcCKGGDS3Q1oBqhbxPjX6EKaIubVSKjE1G2gtt+Q9CfM/tMDdg==} + + '@sentry/node@9.11.0': + resolution: {integrity: sha512-luDsNDHsHkoXbL2Rf1cEKijh6hBfjzGQe09iP6kdZr+HB0bO+qoLe+nZLzSIQTWgWSt2XYNQyiLAsaMlbJZhJg==} + engines: {node: '>=18'} + + '@sentry/opentelemetry@9.11.0': + resolution: {integrity: sha512-B6RumUFGb1+Q4MymY7IZbdl1Ayz2srqf46itFr1ohE/IpwY7OWKMntop8fxyccUW3ptmPp9cPkBJOaa9UdJhSg==} engines: {node: '>=18'} peerDependencies: '@opentelemetry/api': ^1.9.0 @@ -6044,8 +5977,8 @@ packages: '@opentelemetry/sdk-trace-base': ^1.30.1 '@opentelemetry/semantic-conventions': ^1.28.0 - '@sentry/react@9.11.0': - resolution: {integrity: sha512-sH/3KnDsLxBFRoxPyIpab7OewkfStdZQQwgpfv8R0yDKpGg4lU7KdTccryFvWL123UpHC7ydPWjdcfC8YV/EPQ==} + '@sentry/react@9.13.0': + resolution: {integrity: sha512-CpJ23YoFmb3sY3NZ3g/6GEqwXhfEZMz+X1nZvu7RC0aB9Psdtk5sZmoqhWwveeEwVFBNq66QxSeSBvwODLergA==} engines: {node: '>=18'} peerDependencies: react: 18.3.1 @@ -6054,32 +5987,32 @@ packages: resolution: {integrity: sha512-eIIIHqVOTO0m7+3aTg//gVi11XNpKi4G0xA45hjz46UmRiToVfqgBH7Dsn1qRrDxa7YPYCdREQkyGEINlElT2A==} engines: {node: '>= 14'} - '@shikijs/core@3.2.1': - resolution: {integrity: sha512-FhsdxMWYu/C11sFisEp7FMGBtX/OSSbnXZDMBhGuUDBNTdsoZlMSgQv5f90rwvzWAdWIW6VobD+G3IrazxA6dQ==} + '@shikijs/core@3.2.2': + resolution: {integrity: sha512-yvlSKVMLjddAGBa2Yu+vUZxuu3sClOWW1AG+UtJkvejYuGM5BVL35s6Ijiwb75O9QdEx6IkMxinHZSi8ZyrBaA==} - '@shikijs/engine-javascript@3.2.1': - resolution: {integrity: sha512-eMdcUzN3FMQYxOmRf2rmU8frikzoSHbQDFH2hIuXsrMO+IBOCI9BeeRkCiBkcLDHeRKbOCtYMJK3D6U32ooU9Q==} + '@shikijs/engine-javascript@3.2.2': + resolution: {integrity: sha512-tlDKfhWpF4jKLUyVAnmL+ggIC+0VyteNsUpBzh1iwWLZu4i+PelIRr0TNur6pRRo5UZIv3ss/PLMuwahg9S2hg==} - '@shikijs/engine-oniguruma@3.2.1': - resolution: {integrity: sha512-wZZAkayEn6qu2+YjenEoFqj0OyQI64EWsNR6/71d1EkG4sxEOFooowKivsWPpaWNBu3sxAG+zPz5kzBL/SsreQ==} + '@shikijs/engine-oniguruma@3.2.2': + resolution: {integrity: sha512-vyXRnWVCSvokwbaUD/8uPn6Gqsf5Hv7XwcW4AgiU4Z2qwy19sdr6VGzMdheKKN58tJOOe5MIKiNb901bgcUXYQ==} - '@shikijs/langs@3.2.1': - resolution: {integrity: sha512-If0iDHYRSGbihiA8+7uRsgb1er1Yj11pwpX1c6HLYnizDsKAw5iaT3JXj5ZpaimXSWky/IhxTm7C6nkiYVym+A==} + '@shikijs/langs@3.2.2': + resolution: {integrity: sha512-NY0Urg2dV9ETt3JIOWoMPuoDNwte3geLZ4M1nrPHbkDS8dWMpKcEwlqiEIGqtwZNmt5gKyWpR26ln2Bg2ecPgw==} - '@shikijs/themes@3.2.1': - resolution: {integrity: sha512-k5DKJUT8IldBvAm8WcrDT5+7GA7se6lLksR+2E3SvyqGTyFMzU2F9Gb7rmD+t+Pga1MKrYFxDIeyWjMZWM6uBQ==} + '@shikijs/themes@3.2.2': + resolution: {integrity: sha512-Zuq4lgAxVKkb0FFdhHSdDkALuRpsj1so1JdihjKNQfgM78EHxV2JhO10qPsMrm01FkE3mDRTdF68wfmsqjt6HA==} - '@shikijs/transformers@3.2.1': - resolution: {integrity: sha512-oIT40p8LOPV/6XLnUrVPeRtJtbu0Mpl+BjGFuMXw870eX9zTSQlidg7CsksFDVyUiSAOC/CH1RQm+ldZp0/6eQ==} + '@shikijs/transformers@3.2.2': + resolution: {integrity: sha512-DQvrPdygc6NNdbfeOZoO1+KiRnnjUQuuPLwsAbUuSKq4QFLD0Ik15FbHojmot5NbgCQRbVr8ufRg8U6X5rGWuQ==} - '@shikijs/types@3.2.1': - resolution: {integrity: sha512-/NTWAk4KE2M8uac0RhOsIhYQf4pdU0OywQuYDGIGAJ6Mjunxl2cGiuLkvu4HLCMn+OTTLRWkjZITp+aYJv60yA==} + '@shikijs/types@3.2.2': + resolution: {integrity: sha512-a5TiHk7EH5Lso8sHcLHbVNNhWKP0Wi3yVnXnu73g86n3WoDgEra7n3KszyeCGuyoagspQ2fzvy4cpSc8pKhb0A==} '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} - '@shopify/flash-list@1.7.3': - resolution: {integrity: sha512-RLhNptm02aqpqZvjj9pJPcU+EVYxOAJhPRCmDOaUbUP86+636w+plsbjpBPSYGvPZhPj56RtZ9FBlvolPeEmYA==} + '@shopify/flash-list@1.8.0': + resolution: {integrity: sha512-APZ48kceCCJobUimmI2594io+HujELK60HFKgzIyIdHGX5ySR5YfvsPy3PKtPwHHDtIMFNaq3U/BY3qZocOhCA==} peerDependencies: '@babel/runtime': '*' react: 18.3.1 @@ -6131,8 +6064,8 @@ packages: '@surma/rollup-plugin-off-main-thread@2.2.3': resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} - '@swc/helpers@0.5.15': - resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + '@swc/helpers@0.5.17': + resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} '@szmarczak/http-timer@4.0.6': resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} @@ -6165,28 +6098,28 @@ packages: '@tanstack/query-core@5.69.0': resolution: {integrity: sha512-Kn410jq6vs1P8Nm+ZsRj9H+U3C0kjuEkYLxbiCyn3MDEiYor1j2DGVULqAz62SLZtUZ/e9Xt6xMXiJ3NJ65WyQ==} - '@tanstack/query-core@5.71.10': - resolution: {integrity: sha512-/fKEY8fO1nbszfrBatzmhJa1nEwIKn0c6Tv2A1ocSA5OiD2GukOIV8nnBbvJRgZb/VIoBy9/N4PVbABI8YQLow==} + '@tanstack/query-core@5.74.4': + resolution: {integrity: sha512-YuG0A0+3i9b2Gfo9fkmNnkUWh5+5cFhWBN0pJAHkHilTx6A0nv8kepkk4T4GRt4e5ahbtFj2eTtkiPcVU1xO4A==} - '@tanstack/query-devtools@5.71.5': - resolution: {integrity: sha512-Fq1JeAp+I52Md/KnyeFxzG7G0RpdHgeOfDNhSPkZQs/JqqXuAfpUf+wFHDz+vP0GZbSnla2JmcLSQebOkIb1yA==} + '@tanstack/query-devtools@5.73.3': + resolution: {integrity: sha512-hBQyYwsOuO7QOprK75NzfrWs/EQYjgFA0yykmcvsV62q0t6Ua97CU3sYgjHx0ZvxkXSOMkY24VRJ5uv9f5Ik4w==} - '@tanstack/query-persist-client-core@5.71.10': - resolution: {integrity: sha512-GVYWTBIVCOzIv0B1Kj9kyVO7bVAgShSrmQYNZ+AubDqXC7FEl36Bp1OcByyqhLOF12NsrJ9us14g1+UsyKApsw==} + '@tanstack/query-persist-client-core@5.74.4': + resolution: {integrity: sha512-jeFRIOfnoJUtivYv4KD0xFkQHtF4QpJl/hD3uvPSFH6qN51+cDUGRiEibLVjD8exkh48GTG8cmgk69ugMJ/S6Q==} - '@tanstack/query-sync-storage-persister@5.71.10': - resolution: {integrity: sha512-e9O7ygI08vX0V3K80u3e6uLOwe5wkJ9pJm82H67sGwmdhm14FD42KAsp1ClMDsbDoPb7NnxBUeJcZaixitz8AQ==} + '@tanstack/query-sync-storage-persister@5.74.4': + resolution: {integrity: sha512-hUg7RezHQTxschr2QGN3ELp69eindGe0z7ihDV7wyngXvQZdE0MATwql+efZp9fpATO5QzTm7sKQgwvGazZQcQ==} - '@tanstack/react-query-devtools@5.71.10': - resolution: {integrity: sha512-n0xsIzwNvkIoZCmfHww28jFmnVTVzOt5dHj/py3LNFMJHGnJq9o9ttQESzVt2Hr7as00Aqf8ElVwH6na1o6dnw==} + '@tanstack/react-query-devtools@5.74.4': + resolution: {integrity: sha512-PGCAcytQMmeagoeGG45ccBhrC1x0/5OlNjsM1FAb9OfsQZIhPzjwjhGcwmMu6TbT4RIHgvjxLwC5NHgkUwJQzw==} peerDependencies: - '@tanstack/react-query': ^5.71.10 + '@tanstack/react-query': ^5.74.4 react: 18.3.1 - '@tanstack/react-query-persist-client@5.71.10': - resolution: {integrity: sha512-Q1oBHbSieLsg2ZggZwtFqHmdNMulvfClq9zUyGOIJD0Wjk/wEzyzzcIfVouMDTlqYa/O1xlwAtUZXub+RxD6Lg==} + '@tanstack/react-query-persist-client@5.74.4': + resolution: {integrity: sha512-JP1MyuzjVLpsJOCKPbiXki1nvYrBGFamnWV59kSS0R2zb3mxpDoNmrwBqUJOPFTLPUyMx1APqqF5FynX6ooeyA==} peerDependencies: - '@tanstack/react-query': ^5.71.10 + '@tanstack/react-query': ^5.74.4 react: 18.3.1 '@tanstack/react-query@5.69.0': @@ -6194,8 +6127,8 @@ packages: peerDependencies: react: 18.3.1 - '@tanstack/react-query@5.71.10': - resolution: {integrity: sha512-mQYM/ObpL8YMDz8vCoUuHkbe8Yu7NnVRH8aBaBa/3zlufjp1f1VuWjeO3TcumNHfuVMDwEAGinsgwrB7OKADiQ==} + '@tanstack/react-query@5.74.4': + resolution: {integrity: sha512-mAbxw60d4ffQ4qmRYfkO1xzRBPUEf/72Dgo3qqea0J66nIKuDTLEqQt0ku++SDFlMGMnB6uKDnEG1xD/TDse4Q==} peerDependencies: react: 18.3.1 @@ -6261,8 +6194,8 @@ packages: '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - '@types/babel__generator@7.6.8': - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} '@types/babel__template@7.4.4': resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} @@ -6282,9 +6215,6 @@ packages: '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - '@types/cookie@0.6.0': - resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} - '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} @@ -6375,8 +6305,8 @@ packages: '@types/node@20.17.30': resolution: {integrity: sha512-7zf4YyHA+jvBNfVrk2Gtvs6x7E8V+YDW05bNfG2XkWDJfYRXrTiP/DsB2zSYTaHX0bGIujTBQdMVAhb+j7mwpg==} - '@types/node@22.14.0': - resolution: {integrity: sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA==} + '@types/node@22.14.1': + resolution: {integrity: sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -6416,8 +6346,8 @@ packages: '@types/responselike@1.0.3': resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} - '@types/semver@7.5.8': - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + '@types/semver@7.7.0': + resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==} '@types/shimmer@1.2.0': resolution: {integrity: sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==} @@ -6452,8 +6382,8 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@typescript-eslint/eslint-plugin@8.28.0': - resolution: {integrity: sha512-lvFK3TCGAHsItNdWZ/1FkvpzCxTHUVuFrdnOGLMa0GGCFIbCgQWVk3CzCGdA7kM3qGVc+dfW9tr0Z/sHnGDFyg==} + '@typescript-eslint/eslint-plugin@8.30.1': + resolution: {integrity: sha512-v+VWphxMjn+1t48/jO4t950D6KR8JaJuNXzi33Ve6P8sEmPr5k6CEXjdGwT6+LodVnEa91EQCtwjWNUCPweo+Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 @@ -6467,12 +6397,23 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/parser@8.30.1': + resolution: {integrity: sha512-H+vqmWwT5xoNrXqWs/fesmssOW70gxFlgcMlYcBaWNPIEWDgLa4W9nkSPmhuOgLnXq9QYgkZ31fhDyLhleCsAg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/scope-manager@8.28.0': resolution: {integrity: sha512-u2oITX3BJwzWCapoZ/pXw6BCOl8rJP4Ij/3wPoGvY8XwvXflOzd1kLrDUUUAIEdJSFh+ASwdTHqtan9xSg8buw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.28.0': - resolution: {integrity: sha512-oRoXu2v0Rsy/VoOGhtWrOKDiIehvI+YNrDk5Oqj40Mwm0Yt01FC/Q7nFqg088d3yAsR1ZcZFVfPCTTFCe/KPwg==} + '@typescript-eslint/scope-manager@8.30.1': + resolution: {integrity: sha512-+C0B6ChFXZkuaNDl73FJxRYT0G7ufVPOSQkqkpM/U198wUwUFOtgo1k/QzFh1KjpBitaK7R1tgjVz6o9HmsRPg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/type-utils@8.30.1': + resolution: {integrity: sha512-64uBF76bfQiJyHgZISC7vcNz3adqQKIccVoKubyQcOnNcdJBvYOILV1v22Qhsw3tw3VQu5ll8ND6hycgAR5fEA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -6482,14 +6423,24 @@ packages: resolution: {integrity: sha512-bn4WS1bkKEjx7HqiwG2JNB3YJdC1q6Ue7GyGlwPHyt0TnVq6TtD/hiOdTZt71sq0s7UzqBFXD8t8o2e63tXgwA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.30.1': + resolution: {integrity: sha512-81KawPfkuulyWo5QdyG/LOKbspyyiW+p4vpn4bYO7DM/hZImlVnFwrpCTnmNMOt8CvLRr5ojI9nU1Ekpw4RcEw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@8.28.0': resolution: {integrity: sha512-H74nHEeBGeklctAVUvmDkxB1mk+PAZ9FiOMPFncdqeRBXxk1lWSYraHw8V12b7aa6Sg9HOBNbGdSHobBPuQSuA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.28.0': - resolution: {integrity: sha512-OELa9hbTYciYITqgurT1u/SzpQVtDLmQMFzy/N8pQE+tefOyCWT79jHsav294aTqV1q1u+VzqDGbuujvRYaeSQ==} + '@typescript-eslint/typescript-estree@8.30.1': + resolution: {integrity: sha512-kQQnxymiUy9tTb1F2uep9W6aBiYODgq5EMSk6Nxh4Z+BDUoYUSa029ISs5zTzKBFnexQEh71KqwjKnRz58lusQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/utils@8.30.1': + resolution: {integrity: sha512-T/8q4R9En2tcEsWPQgB5BQ0XJVOtfARcUvOa8yJP3fh9M/mXraLxZrkCfGb6ChrO/V3W+Xbd04RacUEqk1CFEQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -6499,100 +6450,109 @@ packages: resolution: {integrity: sha512-hbn8SZ8w4u2pRwgQ1GlUrPKE+t2XvcCW5tTRF7j6SMYIuYG37XuzIW44JCZPa36evi0Oy2SnM664BlIaAuQcvg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.30.1': + resolution: {integrity: sha512-aEhgas7aJ6vZnNFC7K4/vMGDGyOiqWcYZPpIWrTKuTAlsvDNKy2GFDqh9smL+iq069ZvR0YzEeq0B8NJlLzjFA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@unocss/config@66.1.0-beta.7': - resolution: {integrity: sha512-4FILwDExyRgBmZpky9OyJpgjHetCLUzythNhuU6wxBD+6xyfa8aZSrtC27bcMRbjLweXMKFVYk49bSkajmUWMw==} + '@unocss/config@66.1.0-beta.11': + resolution: {integrity: sha512-tj8pjCC+6g37V9kxcPuh/muHd7VDJUY2DwoJJqUfGrLoo3jVbFmPDLUAMlrFZZkTUF2NyTyv+Q49A6xEpSHV3g==} engines: {node: '>=14'} - '@unocss/core@66.1.0-beta.7': - resolution: {integrity: sha512-l1/r+Jd9TbsRqR/geEdIV/Erzvs26GitTtMVsGcJfuaK1/WWOLtbSHRUDQAB/UpcOOWvuNuAv4UWsXX9Z0DFmw==} + '@unocss/core@66.1.0-beta.11': + resolution: {integrity: sha512-KkCyEO+KK1B05hA9uu+gcm/bvkr7a+bj6IP/S4Yu9ojtRVpJwpDnwAEdc6vgLk6qNWyM4V88dVqWGrRYy0Buvg==} - '@unocss/eslint-config@66.1.0-beta.7': - resolution: {integrity: sha512-Gupx2hyC/QICvdZTdxc0YPT7Z/8hC1r+JnEaJGtEoLIpR1vkGtkI5aj8OQ0U6DWX8+stKAWu3jx6sFzGvuTN8w==} + '@unocss/eslint-config@66.1.0-beta.11': + resolution: {integrity: sha512-rDfIsazARybnrPPS7GSMtwPhQFNqz092lWTlWjEEWbNh0FOEXV+XdUYaegICJg3MhFtIMUedk18y5Au1g1FA7Q==} engines: {node: '>=14'} - '@unocss/eslint-plugin@66.1.0-beta.7': - resolution: {integrity: sha512-5dT78YCVSqUXJSKR6C3ekuWMbT5y1nchyFmFRmrMcTYpyesIhQGjCbMilXR09p1fkD35ODPAcdBwhnuB7nQd6Q==} + '@unocss/eslint-plugin@66.1.0-beta.11': + resolution: {integrity: sha512-Sn/Guz6K25Ra+X9sMpizTJZ8OGQiwZmhQt20PBhGrtVgj73P6VTtw23SAZM/sMxuBWvM8DEQ1DwJfE0rKsnJ6Q==} engines: {node: '>=14'} - '@unocss/rule-utils@66.1.0-beta.7': - resolution: {integrity: sha512-oJ5lcHRgN1aabsszkBXoiYp0G6LLM011BJoAEfKOeRZ14FGFlg0zuOi/h7aKlVuIvBt6q8BWosJLlZSAQnNypg==} + '@unocss/rule-utils@66.1.0-beta.11': + resolution: {integrity: sha512-qK5YQbstTP0rUgRkm1s1Ly9TMBKzP38TARVdh35yKW03YY8Lq1huUGEnLt5JV6iPdWzuiNRnnD/KKjBzZvP5FQ==} engines: {node: '>=14'} - '@unrs/rspack-resolver-binding-darwin-arm64@1.3.0': - resolution: {integrity: sha512-EcjI0Hh2HiNOM0B9UuYH1PfLWgE6/SBQ4dKoHXWNloERfveha/n6aUZSBThtPGnJenmdfaJYXXZtqyNbWtJAFw==} + '@unrs/resolver-binding-darwin-arm64@1.5.0': + resolution: {integrity: sha512-YmocNlEcX/AgJv8gI41bhjMOTcKcea4D2nRIbZj+MhRtSH5+vEU8r/pFuTuoF+JjVplLsBueU+CILfBPVISyGQ==} cpu: [arm64] os: [darwin] - '@unrs/rspack-resolver-binding-darwin-x64@1.3.0': - resolution: {integrity: sha512-3CgG+mhfudDfnaDqwEl0W1mcGTto5f5mqPyJSXcWDxrnNc7pr/p01khIgWOoOD1eCwVejmgpYvRKGBwJPwgHOQ==} + '@unrs/resolver-binding-darwin-x64@1.5.0': + resolution: {integrity: sha512-qpUrXgH4e/0xu1LOhPEdfgSY3vIXOxDQv370NEL8npN8h40HcQDA+Pl2r4HBW6tTXezWIjxUFcP7tj529RZtDw==} cpu: [x64] os: [darwin] - '@unrs/rspack-resolver-binding-freebsd-x64@1.3.0': - resolution: {integrity: sha512-ww8BwryDrpXlSajwSIEUXEv8oKDkw04L2ke3hxjaxWohuBV8pAQie9XBS4yQTyREuL2ypcqbARfoCXJJzVp7ig==} + '@unrs/resolver-binding-freebsd-x64@1.5.0': + resolution: {integrity: sha512-3tX8r8vgjvZzaJZB4jvxUaaFCDCb3aWDCpZN3EjhGnnwhztslI05KSG5NY/jNjlcZ5QWZ7dEZZ/rNBFsmTaSPw==} cpu: [x64] os: [freebsd] - '@unrs/rspack-resolver-binding-linux-arm-gnueabihf@1.3.0': - resolution: {integrity: sha512-WyhonI1mkuAlnG2iaMjk7uy4aWX+FWi2Au8qCCwj57wVHbAEfrN6xN2YhzbrsCC+ciumKhj5c01MqwsnYDNzWQ==} + '@unrs/resolver-binding-linux-arm-gnueabihf@1.5.0': + resolution: {integrity: sha512-FH+ixzBKaUU9fWOj3TYO+Yn/eO6kYvMLV9eNJlJlkU7OgrxkCmiMS6wUbyT0KA3FOZGxnEQ2z3/BHgYm2jqeLA==} cpu: [arm] os: [linux] - '@unrs/rspack-resolver-binding-linux-arm-musleabihf@1.3.0': - resolution: {integrity: sha512-+uCP6hIAMVWHKQnLZHESJ1U1TFVGLR3FTeaS2A4zB0k8w+IbZlWwl9FiBUOwOiqhcCCyKiUEifgnYFNGpxi3pw==} + '@unrs/resolver-binding-linux-arm-musleabihf@1.5.0': + resolution: {integrity: sha512-pxCgXMgwB/4PfqFQg73lMhmWwcC0j5L+dNXhZoz/0ek0iS/oAWl65fxZeT/OnU7fVs52MgdP2q02EipqJJXHSg==} cpu: [arm] os: [linux] - '@unrs/rspack-resolver-binding-linux-arm64-gnu@1.3.0': - resolution: {integrity: sha512-p+s/Wp8rf75Qqs2EPw4HC0xVLLW+/60MlVAsB7TYLoeg1e1CU/QCis36FxpziLS0ZY2+wXdTnPUxr+5kkThzwQ==} + '@unrs/resolver-binding-linux-arm64-gnu@1.5.0': + resolution: {integrity: sha512-FX2FV7vpLE/+Z0NZX9/1pwWud5Wocm/2PgpUXbT5aSV3QEB10kBPJAzssOQylvdj8mOHoKl5pVkXpbCwww/T2g==} cpu: [arm64] os: [linux] - '@unrs/rspack-resolver-binding-linux-arm64-musl@1.3.0': - resolution: {integrity: sha512-cZEL9jmZ2kAN53MEk+fFCRJM8pRwOEboDn7sTLjZW+hL6a0/8JNfHP20n8+MBDrhyD34BSF4A6wPCj/LNhtOIQ==} + '@unrs/resolver-binding-linux-arm64-musl@1.5.0': + resolution: {integrity: sha512-+gF97xst1BZb28T3nwwzEtq2ewCoMDGKsenYsZuvpmNrW0019G1iUAunZN+FG55L21y+uP7zsGX06OXDQ/viKw==} cpu: [arm64] os: [linux] - '@unrs/rspack-resolver-binding-linux-ppc64-gnu@1.3.0': - resolution: {integrity: sha512-IOeRhcMXTNlk2oApsOozYVcOHu4t1EKYKnTz4huzdPyKNPX0Y9C7X8/6rk4aR3Inb5s4oVMT9IVKdgNXLcpGAQ==} + '@unrs/resolver-binding-linux-ppc64-gnu@1.5.0': + resolution: {integrity: sha512-5bEmVcQw9js8JYM2LkUBw5SeELSIxX+qKf9bFrfFINKAp4noZ//hUxLpbF7u/3gTBN1GsER6xOzIZlw/VTdXtA==} cpu: [ppc64] os: [linux] - '@unrs/rspack-resolver-binding-linux-s390x-gnu@1.3.0': - resolution: {integrity: sha512-op54XrlEbhgVRCxzF1pHFcLamdOmHDapwrqJ9xYRB7ZjwP/zQCKzz/uAsSaAlyQmbSi/PXV7lwfca4xkv860/Q==} + '@unrs/resolver-binding-linux-riscv64-gnu@1.5.0': + resolution: {integrity: sha512-GGk/8TPUsf1Q99F+lzMdjE6sGL26uJCwQ9TlvBs8zR3cLQNw/MIumPN7zrs3GFGySjnwXc8gA6J3HKbejywmqA==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-s390x-gnu@1.5.0': + resolution: {integrity: sha512-5uRkFYYVNAeVaA4W/CwugjFN3iDOHCPqsBLCCOoJiMfFMMz4evBRsg+498OFa9w6VcTn2bD5aI+RRayaIgk2Sw==} cpu: [s390x] os: [linux] - '@unrs/rspack-resolver-binding-linux-x64-gnu@1.3.0': - resolution: {integrity: sha512-orbQF7sN02N/b9QF8Xp1RBO5YkfI+AYo9VZw0H2Gh4JYWSuiDHjOPEeFPDIRyWmXbQJuiVNSB+e1pZOjPPKIyg==} + '@unrs/resolver-binding-linux-x64-gnu@1.5.0': + resolution: {integrity: sha512-j905CZH3nehYy6NimNqC2B14pxn4Ltd7guKMyPTzKehbFXTUgihQS/ZfHQTdojkMzbSwBOSgq1dOrY+IpgxDsA==} cpu: [x64] os: [linux] - '@unrs/rspack-resolver-binding-linux-x64-musl@1.3.0': - resolution: {integrity: sha512-kpjqjIAC9MfsjmlgmgeC8U9gZi6g/HTuCqpI7SBMjsa7/9MvBaQ6TJ7dtnsV/+DXvfJ2+L5teBBXG+XxfpvIFA==} + '@unrs/resolver-binding-linux-x64-musl@1.5.0': + resolution: {integrity: sha512-dmLevQTuzQRwu5A+mvj54R5aye5I4PVKiWqGxg8tTaYP2k2oTs/3Mo8mgnhPk28VoYCi0fdFYpgzCd4AJndQvQ==} cpu: [x64] os: [linux] - '@unrs/rspack-resolver-binding-wasm32-wasi@1.3.0': - resolution: {integrity: sha512-JAg0hY3kGsCPk7Jgh16yMTBZ6VEnoNR1DFZxiozjKwH+zSCfuDuM5S15gr50ofbwVw9drobIP2TTHdKZ15MJZQ==} + '@unrs/resolver-binding-wasm32-wasi@1.5.0': + resolution: {integrity: sha512-LtJMhwu7avhoi+kKfAZOKN773RtzLBVVF90YJbB0wyMpUj9yQPeA+mteVUI9P70OG/opH47FeV5AWeaNWWgqJg==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@unrs/rspack-resolver-binding-win32-arm64-msvc@1.3.0': - resolution: {integrity: sha512-h5N83i407ntS3ndDkhT/3vC3Dj8oP0BIwMtekETNJcxk7IuWccSXifzCEhdxxu/FOX4OICGIHdHrxf5fJuAjfw==} + '@unrs/resolver-binding-win32-arm64-msvc@1.5.0': + resolution: {integrity: sha512-FTZBxLL4SO1mgIM86KykzJmPeTPisBDHQV6xtfDXbTMrentuZ6SdQKJUV5BWaoUK3p8kIULlrCcucqdCnk8Npg==} cpu: [arm64] os: [win32] - '@unrs/rspack-resolver-binding-win32-ia32-msvc@1.3.0': - resolution: {integrity: sha512-9QH7Gq3dRL8Q/D6PGS3Dwtjx9yw6kbCEu6iBkAUhFTDAuVUk2L0H/5NekRVA13AQaSc3OsEUKt60EOn/kq5Dug==} + '@unrs/resolver-binding-win32-ia32-msvc@1.5.0': + resolution: {integrity: sha512-i5bB7vJ1waUsFciU/FKLd4Zw0VnAkvhiJ4//jYQXyDUuiLKodmtQZVTcOPU7pp97RrNgCFtXfC1gnvj/DHPJTw==} cpu: [ia32] os: [win32] - '@unrs/rspack-resolver-binding-win32-x64-msvc@1.3.0': - resolution: {integrity: sha512-IYuXJCuwBOVV0H73l6auaZwtAPHjCPBJkxd4Co0yO6dSjDM5Na5OceaxhUmJLZ3z8kuEGhTYWIHH7PchGztnlg==} + '@unrs/resolver-binding-win32-x64-msvc@1.5.0': + resolution: {integrity: sha512-wAvXp4k7jhioi4SebXW/yfzzYwsUCr9kIX4gCsUFKpCTUf8Mi7vScJXI3S+kupSUf0LbVHudR8qBbe2wFMSNUw==} cpu: [x64] os: [win32] @@ -6640,15 +6600,15 @@ packages: engines: {node: '>=16.14.0'} hasBin: true - '@vitejs/plugin-legacy@6.0.2': - resolution: {integrity: sha512-b/a6ARuJ1yCoIH/lSjpwPMyqo3NSCoqyxYtff7VCC6cnJfvBTzd7PthcrbomhLZnMsp/eW41b6TrbNSQvHW2lA==} + '@vitejs/plugin-legacy@6.1.0': + resolution: {integrity: sha512-D5/33NZFBDdlXvCoRbdGe3DcnSY4TZIDkQpolbMdMXBtUNgwJc03X1LHmEov4Igi4f5z2l9/lC0te74R8iHn5A==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} peerDependencies: terser: ^5.16.0 vite: ^6.0.0 - '@vitejs/plugin-react@4.3.4': - resolution: {integrity: sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==} + '@vitejs/plugin-react@4.4.0': + resolution: {integrity: sha512-x/EztcTKVj+TDeANY1WjNeYsvZjZdfWRMP/KXi5Yn8BoTzpa13ZltaQqKfvWYbX8CE10GOHHdC5v86jY9x8i/g==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 @@ -6715,6 +6675,12 @@ packages: '@yornaath/batshit@0.10.1': resolution: {integrity: sha512-WGZ1WNoiVN6CLf28O73+6SCf+2lUn4U7TLGM9f4zOad0pn9mdoXIq8cwu3Kpf7N2OTYgWGK4eQPTflwFlduDGA==} + '@zod/core@0.6.2': + resolution: {integrity: sha512-KdH7bT0BRG1CvJ1LWH8oyNnkvLpjVZ5qVGpRu7Vq8WsFTKRDWfdr3rFfBYh8atZJSWDgD0ibhOyff1AyRvG1DA==} + + '@zod/mini@4.0.0-beta.20250417T043022': + resolution: {integrity: sha512-psmC71oKQ7hih08nnfD0G1QuT4HfPE9dijs5mUkK+3NlyAS4P2f8gNhmHAtuH6e0pi6K+b+36sLz2i9UdvFCKg==} + abab@2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} deprecated: Use your platform's native atob() and btoa() methods instead @@ -6894,9 +6860,6 @@ packages: apple-uikit-colors@0.3.10: resolution: {integrity: sha512-X0JDuFSHCdTxmrspiIq2jb1u5xgh4w2Bi4C9hlBPFrlJMU2qcEdNjXDzBVg9gJAdc+UwRoOwuIikR3l0kkNJTQ==} - application-config-path@0.1.1: - resolution: {integrity: sha512-zy9cHePtMP0YhwG+CfHm0bgwdnga2X3gZexpdCwEj//dpb+TKajtiC8REEUJUSq6Ab4f9cgNy2l8ObXzCXFkEw==} - archiver-utils@2.1.0: resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==} engines: {node: '>= 6'} @@ -6955,8 +6918,8 @@ packages: asn1@0.2.6: resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} - asn1js@3.0.5: - resolution: {integrity: sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==} + asn1js@3.0.6: + resolution: {integrity: sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA==} engines: {node: '>=12.0.0'} assert-plus@1.0.0: @@ -7154,11 +7117,11 @@ packages: before-after-hook@2.2.3: resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} - better-auth@1.2.6-beta.2: - resolution: {integrity: sha512-ZW410mmYHGK1WsZBB6mgmw5hvtQocdCiDvFChbXQd71IYj9X8xjsTIVn1m6IstvssDAi3vKRbOELnVy1RDVvhw==} + better-auth@1.2.7: + resolution: {integrity: sha512-2hCB263GSrgetsMUZw8vv9O1e4S4AlYJW3P4e8bX9u3Q3idv4u9BzDFCblpTLuL4YjYovghMCN0vurAsctXOAQ==} - better-call@1.0.5: - resolution: {integrity: sha512-rAT73GWIJ8LbSP8Y3BdJnY1hwAiQPRRmUJ4R3YVhcVGS927l3eTXG5o5TD6Bv6je6ygjdx6iVq3/BU49eGUCHg==} + better-call@1.0.8: + resolution: {integrity: sha512-/PV8JLqDRUN7JyBPbklVsS/8E4SO3pnf8hbpa8B7xrBrr+BBYpeOAxoqtnsyk/pRs35vNB4MZx8cn9dBuNlLDA==} better-opn@3.0.2: resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==} @@ -7329,8 +7292,8 @@ packages: builder-util@24.13.1: resolution: {integrity: sha512-NhbCSIntruNDTOVI9fdXz0dihaqX2YuE1D6zZMrwiErzH4ELZHE6mdiB40wEgZNprDia+FghRFgKoAqMZRRjSA==} - builtin-modules@4.0.0: - resolution: {integrity: sha512-p1n8zyCkt1BVrKNFymOHjcDSAl7oq/gUvfgULv2EblgpPVQlQr9yHnWjg9IJ2MhfwPqiYqMMrr01OY7yQoK2yA==} + builtin-modules@5.0.0: + resolution: {integrity: sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==} engines: {node: '>=18.20'} bundle-require@5.1.0: @@ -7348,10 +7311,10 @@ packages: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} - c12@1.11.2: - resolution: {integrity: sha512-oBs8a4uvSDO9dm8b7OCFW7+dgtVrwmwnrVXYzLm43ta7ep2jCn/0MhoUFygIWtxhyy6+/MG7/agvpY0U1Iemew==} + c12@3.0.3: + resolution: {integrity: sha512-uC3MacKBb0Z15o5QWCHvHWj5Zv34pGQj9P+iXKSpTuSGFS0KKhUWf4t9AJ+gWjYOdmWCPEGpEzm8sS0iqbpo1w==} peerDependencies: - magicast: ^0.3.4 + magicast: ^0.3.5 peerDependenciesMeta: magicast: optional: true @@ -7436,6 +7399,9 @@ packages: caniuse-lite@1.0.30001707: resolution: {integrity: sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==} + caniuse-lite@1.0.30001714: + resolution: {integrity: sha512-mtgapdwDLSSBnCI3JokHM7oEQBLxiJKVRtg10AxM1AyeiKcM96f0Mkbqeq+1AbiCtvMcHRulAAEMu693JrSWqg==} + cardinal@2.1.1: resolution: {integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==} hasBin: true @@ -7688,9 +7654,6 @@ packages: comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - command-exists@1.2.9: - resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} - commander@10.0.1: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} @@ -7783,8 +7746,8 @@ packages: confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - confbox@0.2.1: - resolution: {integrity: sha512-hkT3yDPFbs95mNCy1+7qNKC6Pro+/ibzYxtM2iqEigpf0sVw+bg4Zh9/snjsBcf990vfIsg5+1U7VyiyBb3etg==} + confbox@0.2.2: + resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} config-file-ts@0.2.6: resolution: {integrity: sha512-6boGVaglwblBgJqGyxm4+xCmEGcWgnWHSWHY5jad58awQhB6gftq0G8HbzU39YqCIYHMLAiL1yjwiZ36m/CL8w==} @@ -8218,6 +8181,9 @@ packages: destr@2.0.3: resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -8371,16 +8337,20 @@ packages: resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} engines: {node: '>=12'} + dotenv@16.5.0: + resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} + engines: {node: '>=12'} + dotenv@9.0.2: resolution: {integrity: sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==} engines: {node: '>=10'} - drizzle-kit@0.30.6: - resolution: {integrity: sha512-U4wWit0fyZuGuP7iNmRleQyK2V8wCuv57vf5l3MnG4z4fzNTjY/U13M8owyQ5RavqvqxBifWORaR3wIUzlN64g==} + drizzle-kit@0.31.0: + resolution: {integrity: sha512-pcKVT+GbfPA+bUovPIilgVOoq+onNBo/YQBG86sf3/GFHkN6lRJPm1l7dKN0IMAk57RQoIm4GUllRrasLlcaSg==} hasBin: true - drizzle-orm@0.41.0: - resolution: {integrity: sha512-7A4ZxhHk9gdlXmTdPj/lREtP+3u8KvZ4yEN6MYVxBzZGex5Wtdc+CWSbu7btgF6TB0N+MNPrvW7RKBbxJchs/Q==} + drizzle-orm@0.42.0: + resolution: {integrity: sha512-pS8nNJm2kBNZwrOjTHJfdKkaU+KuUQmV/vk5D57NojDq4FG+0uAYGMulXtYT///HfgsMF0hnFFvu1ezI3OwOkg==} peerDependencies: '@aws-sdk/client-rds-data': '>=3' '@cloudflare/workers-types': '>=4' @@ -8390,7 +8360,7 @@ packages: '@neondatabase/serverless': '>=0.10.0' '@op-engineering/op-sqlite': '>=2' '@opentelemetry/api': ^1.4.1 - '@planetscale/database': '>=1' + '@planetscale/database': '>=1.13' '@prisma/client': '*' '@tidbcloud/serverless': '*' '@types/better-sqlite3': '*' @@ -8479,8 +8449,8 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - eas-cli@16.2.1: - resolution: {integrity: sha512-evWMLJZOdAbBSdPsr1pnFKI3FfXwoheH8iFLTJxa8gXUIiucT6SYgCUIBSWGqogHqxtfbkxdlqyWM9D3OkF74Q==} + eas-cli@16.3.2: + resolution: {integrity: sha512-hWmZFziEdxKz2OWb2naabXOXA9X22dqF7T1AyICwHF1jisdHXeyEFV3Rligk/p8SuQ0E6qEEcigCTZbSXS3d9A==} engines: {node: '>=18.0.0'} hasBin: true @@ -8544,8 +8514,8 @@ packages: resolution: {integrity: sha512-Ok0bF13WWdTzZi9rCtPN8wUfwx+yDMmV6PAnCMqjNRKEXHmklW/rV+6DofV/Vf5qoAh+Bl9Bj7dQ+0W+IL2psg==} engines: {node: '>=20'} - electron-to-chromium@1.5.123: - resolution: {integrity: sha512-refir3NlutEZqlKaBLK0tzlVLe5P2wDKS7UQt/3SpibizgsRAPOsqQC3ffw1nlv3ze5gjRQZYHoPymgVZkplFA==} + electron-to-chromium@1.5.138: + resolution: {integrity: sha512-FWlQc52z1dXqm+9cCJ2uyFgJkESd+16j6dBEjsgDNuHjBpuIzL8/lRc0uvh1k8RNI6waGo6tcy2DvwkTBJOLDg==} electron-updater@6.6.2: resolution: {integrity: sha512-Cr4GDOkbAUqRHP5/oeOmH/L2Bn6+FQPxVLZtPbcmKZC63a1F3uu5EefYOssgZXG3u/zBlubbJ5PJdITdMVggbw==} @@ -8570,8 +8540,8 @@ packages: resolution: {integrity: sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==} engines: {node: '>=8.0.0'} - electron@34.5.0: - resolution: {integrity: sha512-GabFMG7r2P1NQf5DYp6mnCXo5CcatxXb8YQo54VTStql6weeEv7tsqvl3lAssGwDdd4iMc8QpTCFjErBSVRWeQ==} + electron@35.1.5: + resolution: {integrity: sha512-LolvbKKQUSCGvEwbEQNt1cxD1t+YYClDNwBIjn4d28KM8FSqUn9zJuf6AbqNA7tVs9OFl/EQpmg/m4lZV1hH8g==} engines: {node: '>= 12.20.55'} hasBin: true @@ -8665,9 +8635,6 @@ packages: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} engines: {node: '>=18'} - eol@0.9.1: - resolution: {integrity: sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==} - err-code@2.0.3: resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} @@ -8707,8 +8674,8 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - es-toolkit@1.34.1: - resolution: {integrity: sha512-OA6cd94fJV9bm8dWhIySkWq4xV+rAQnBZUr2dnpXam0QJ8c+hurLbKA8/QooL9Mx4WCAxvIDsiEkid5KPQ5xgQ==} + es-toolkit@1.35.0: + resolution: {integrity: sha512-kVHyrRoC0eLc1hWJ6npG8nNFtOG+nWfcMI+XE0RaFO0gxd6Ions8r0O/U64QyZgY7IeidUnS5oZlRZYUgMGCAg==} es6-error@4.1.1: resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} @@ -8848,11 +8815,6 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.19.12: - resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} - engines: {node: '>=12'} - hasBin: true - esbuild@0.24.2: resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} engines: {node: '>=18'} @@ -8900,8 +8862,8 @@ packages: engines: {node: '>=6.0'} hasBin: true - eslint-compat-utils@0.6.4: - resolution: {integrity: sha512-/u+GQt8NMfXO8w17QendT4gvO5acfxQsAKirAt0LVxDnr2N8YLCVbregaNc/Yhp7NM128DwCaRvr8PLDfeNkQw==} + eslint-compat-utils@0.6.5: + resolution: {integrity: sha512-vAUHYzue4YAa2hNACjB8HvUQj5yehAZgiClyFVVom9cP8z5NSFq3PwB/TtJslN2zAMgRX6FCFCjYBbQh71g5RQ==} engines: {node: '>=12'} peerDependencies: eslint: '>=6.0.0' @@ -8911,8 +8873,8 @@ packages: peerDependencies: eslint: ^9.5.0 - eslint-config-hyoban@4.0.2: - resolution: {integrity: sha512-50d2vKj9/KZoLnL1A2Zp37IAzIulNc0cLWxUp90Xk1d4J5PFQOiM+9meGKaw6/UGkHN5X1PsZxHyL26aAkKbUw==} + eslint-config-hyoban@4.0.3: + resolution: {integrity: sha512-rx0bJZBNoadO4Dtuh7eqFFNUR9RKkCrJc77hJMRu8Ec8kidAgkeyjRJM19Y1+6H2CQCh+XQqnX7JX9iRQlMuXQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^9.0.0 @@ -8960,8 +8922,8 @@ packages: peerDependencies: eslint: '*' - eslint-plugin-import-x@4.9.2: - resolution: {integrity: sha512-wFuy/kJRziBoJBr/Nw3H0TIUAqOwqeUXeeTtKhffDuQLNzQTEDOWTOMJRVwkExErNJ8HYqpAM4rSzsCM4vfmxA==} + eslint-plugin-import-x@4.10.5: + resolution: {integrity: sha512-cmteCl8P5q1lkuL/4qqQw1uvnQHytpv2fjHFZ2UIqSfkM0RwWm/KLgasXKIqDRjgMnmUJTeyP8+9hDpJJuiZgg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -8972,21 +8934,21 @@ packages: peerDependencies: eslint: '>=6.0.0' - eslint-plugin-package-json@0.29.0: - resolution: {integrity: sha512-S2YjWLMb+vaI0QbvkSrM6F2lEulaehGWEgHAXSoJI0F2eDw4udp5gtdFyKMLP2GSrfJB5cnKPnSJiOO5RGuaKg==} + eslint-plugin-package-json@0.29.1: + resolution: {integrity: sha512-4Jn1YO0JJyqs2W7Tt9I0QahQ0sPc2G5hLcWBUxkTdVF84Rdn+bVm9NY/XbjVJOlujkgZAK8Hi8irv+Mx4aTqaw==} engines: {node: '>=18'} peerDependencies: eslint: '>=8.0.0' jsonc-eslint-parser: ^2.0.0 - eslint-plugin-react-compiler@19.0.0-beta-e552027-20250112: - resolution: {integrity: sha512-VjkIXHouCYyJHgk5HmZ1LH+fAK5CX+ULRX9iNYtwYJ+ljbivFhIT+JJyxNT/USQpCeS2Dt5ahjFeeMv0RRwTww==} + eslint-plugin-react-compiler@19.0.0-beta-ebf51a3-20250411: + resolution: {integrity: sha512-R7ncuwbCPFAoeMlS56DGGSJFxmRtlWafYH/iWyep5Ks0RaPqTCL4k5gA87axUBBcITsaIgUGkbqAxDxl8Xfm5A==} engines: {node: ^14.17.0 || ^16.0.0 || >= 18.0.0} peerDependencies: eslint: '>=7' - eslint-plugin-react-debug@1.38.0: - resolution: {integrity: sha512-k/VLEAimM3GRMnvWaf9ionKWbxMCN9aFKmbXvx56t2HezniRfW7lEi9l6S8s/7JToXvm+tHAWy8IdulwLXcwdA==} + eslint-plugin-react-debug@1.48.3: + resolution: {integrity: sha512-kO71hJf7Mu6txctbBIPSiTKpYhFaITh/Ch8NHoDx+uu6jR3cu0cPnWQF/p2NpNatpdnFkQQ7WIl/gdol1wlfHg==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -8995,8 +8957,8 @@ packages: typescript: optional: true - eslint-plugin-react-dom@1.38.0: - resolution: {integrity: sha512-xfxVeRmYDeYvrm63ltIh7Hn+/9Y/NHIfwPwYqo3j3thgmtTAagWhhy/nwFG/qQjXkGPoxERAw4OCqOqXvIJ+4g==} + eslint-plugin-react-dom@1.48.3: + resolution: {integrity: sha512-ObAyi37LCRWAJnMKyqTDkjUvaTg6i4VB7jcxEbd7TbpKrN0q5NN6COYnvGPBp9MHc1BrZPUmwX95RherhRwo4Q==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -9005,14 +8967,14 @@ packages: typescript: optional: true - eslint-plugin-react-google-translate@0.1.0: - resolution: {integrity: sha512-VWCr1caffmTL5i6wJTD5/+rSUcCtiiJu1dj7v3qBPZc6bIcT7S/4f7IB9IMCrw8IjByc2Llbhj9aPTVeNmgjow==} + eslint-plugin-react-google-translate@0.1.1: + resolution: {integrity: sha512-70w3YW211yFSexWLshO+rSVtr6NDuA0qaU/ARVQ9pG0WFia5CyGFhKCed6LKKngdgfQTzjrcWlg7IPJehJwTsg==} engines: {node: ^14.17.0 || ^16.0.0 || >= 18.0.0} peerDependencies: eslint: '>=7' - eslint-plugin-react-hooks-extra@1.38.0: - resolution: {integrity: sha512-1nzFpfPPJ7hcZwlabpTV7svMwDCJFYpqECfUVijjKqVUEcZO98UpV/olj4WZfPBp2ll4nsm+escxO85qOrLqpg==} + eslint-plugin-react-hooks-extra@1.48.3: + resolution: {integrity: sha512-8VfhYctnEdekcDwvyrQ0H+5mhBsTwWyu7s7SCJgtaOZh0UCNARSk5DVJOHEqANzvZ0RtXVGFd2pRTRGpvsL4eg==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -9027,8 +8989,8 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - eslint-plugin-react-naming-convention@1.38.0: - resolution: {integrity: sha512-QX2MRfDEubTb0EbcNY33ek4faizU+edQgKCRwUWVcBgI4Yw1AWJrbQ5dOZQjJHYRP0s/tDpBj0MZ+CCxdS3URQ==} + eslint-plugin-react-naming-convention@1.48.3: + resolution: {integrity: sha512-y+8DNaQmT9mRyJyJ6zAF67xGZHo9xhu6aqLiRe3p+aHwFftwvcWf+SxNQHb0/93xDde6VVA1c30ZuVicMYD0mA==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -9050,8 +9012,8 @@ packages: peerDependencies: eslint: '>=8.40' - eslint-plugin-react-web-api@1.38.0: - resolution: {integrity: sha512-ub1y17j2qiJWdrMTEd+9ZKq+SBkP6W/a8H67YCIZxMvS/XKcNptLXlDJqK/ZnioC6E9WRJzzWfaatVV644218A==} + eslint-plugin-react-web-api@1.48.3: + resolution: {integrity: sha512-FlXUa4278cdwT9yRQp4Nyqk0MOo57oUTFSgWZTaYXfF00fkSzVCrfu9e2nAgGSSqy4vJmZffmPSX/G+DN99mIw==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -9060,12 +9022,12 @@ packages: typescript: optional: true - eslint-plugin-react-x@1.38.0: - resolution: {integrity: sha512-IBdmaZvJGA+NShlERuCLnEfSxLERP8lDdgvrgF3Kt2inDL8K8Wr40t969IycYHczcIUk9iGpVu2SQlp/YGnIjA==} + eslint-plugin-react-x@1.48.3: + resolution: {integrity: sha512-mXUQ6yFnv+xVrP6RdcS6c+59CRPq8jgnyEY+ddvjGwQ+18g1+j/JllhIxBY+xmwzUv+qXCbqpobrEYBZeoRfrw==} engines: {bun: '>=1.0.15', node: '>=18.18.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - ts-api-utils: ^2.0.1 + ts-api-utils: ^2.1.0 typescript: ^4.9.5 || ^5.3.3 peerDependenciesMeta: ts-api-utils: @@ -9084,11 +9046,11 @@ packages: peerDependencies: eslint: '>=5.0.0' - eslint-plugin-unicorn@57.0.0: - resolution: {integrity: sha512-zUYYa6zfNdTeG9BISWDlcLmz16c+2Ck2o5ZDHh0UzXJz3DEP7xjmlVDTzbyV0W+XksgZ0q37WEWzN2D2Ze+g9Q==} - engines: {node: '>=18.18'} + eslint-plugin-unicorn@58.0.0: + resolution: {integrity: sha512-fc3iaxCm9chBWOHPVjn+Czb/wHS0D2Mko7wkOdobqo9R2bbFObc4LyZaLTNy0mhZOP84nKkLhTUQxlLOZ7EjKw==} + engines: {node: ^18.20.0 || ^20.10.0 || >=21.0.0} peerDependencies: - eslint: '>=9.20.0' + eslint: '>=9.22.0' eslint-plugin-unused-imports@4.1.4: resolution: {integrity: sha512-YptD6IzQjDardkl0POxnnRBhU1OEePMV0nd6siHaRBbd+lyh6NAhFEobiznKU7kTsSsDeSD62Pe7kAM1b7dAZQ==} @@ -9461,8 +9423,8 @@ packages: expo: '*' react-native: '*' - expo@52.0.44: - resolution: {integrity: sha512-qj3+MWxmqLyBaYQ8jDOvVLEgSqNplH3cf+nDhxCo4C1cpTPD1u/HGh1foibtaeuCYLHsE5km1lrcOpRbFJ4luQ==} + expo@52.0.46: + resolution: {integrity: sha512-JG89IVZLp7DWzgeiQb+0N43kWOF1DUm3esBvAS9cPFWZsM9x8nDXgbvtREcycDPA6E+yJsSC+086CigeUY6sVA==} hasBin: true peerDependencies: '@expo/dom-webview': '*' @@ -9555,8 +9517,8 @@ packages: fastify-plugin@5.0.1: resolution: {integrity: sha512-HCxs+YnRaWzCl+cWRYFnHmeRFyR5GVnJTAaCJQiYzQSDwK9MgJdyAsuL3nh0EWRCYMgQ5MeziymvmAhUHYHDUQ==} - fastify@5.2.2: - resolution: {integrity: sha512-22T/PnhquWozuFXg3Ish4md5ipsF1Nx1mJ9ulLdZPXSk14WFj/wMlyNB/yll9sQOojKRgOIxT2inK3Xpjg5hyw==} + fastify@5.3.0: + resolution: {integrity: sha512-vDpCJa4KRkHrdDMpDNtyPaIDi/ptCwoJ0M8RiefuIMvyXTgG63xYGe9DYYiCpydjh0ETIaLoSyKBNKkh7ew1eA==} fastparse@1.1.2: resolution: {integrity: sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==} @@ -9702,6 +9664,10 @@ packages: resolution: {integrity: sha512-dON6h+yO7FGa/FO5NQCZuZHN0o3I23Ev6VYOJf9d8LpdrArHPt39wE++LLmueNV/hNY5hgWGIIrgnrDkRcXkPg==} engines: {node: '>=0.4.0'} + flow-parser@0.268.0: + resolution: {integrity: sha512-URZmPy/jKDDIJUHUfC+5KNwaPcfONTL3R8xltQWVEoCKLWowVebEBg89nbAnYHNo6ev8KzKWFpOROfHZdaCoxA==} + engines: {node: '>=0.4.0'} + fmix@0.1.0: resolution: {integrity: sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w==} @@ -9754,8 +9720,8 @@ packages: fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - framer-motion@12.6.3: - resolution: {integrity: sha512-2hsqknz23aloK85bzMc9nSR2/JP+fValQ459ZTVElFQ0xgwR2YqNjYSuDZdFBPOwVCt4Q9jgyTt6hg6sVOALzw==} + framer-motion@12.7.4: + resolution: {integrity: sha512-jX0bPsTmU0oPZTYz/dVyD0dmOyEOEJvdn0TaZBE5I8g2GvVnnQnW9f65cJnoVfUkY3WZWNXGXnPbVA9YnaIfVA==} peerDependencies: '@emotion/is-prop-valid': '*' react: 18.3.1 @@ -9908,10 +9874,6 @@ packages: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} - get-port@3.2.0: - resolution: {integrity: sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==} - engines: {node: '>=4'} - get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} @@ -9950,8 +9912,8 @@ packages: gifwrap@0.9.4: resolution: {integrity: sha512-MDMwbhASQuVeD4JKd1fKgNgCRL3fGqMM4WaqpNhWO0JiMOAjbQdumbs4BbBZEy9/M00EHEjKN3HieVhCUlwjeQ==} - giget@1.2.5: - resolution: {integrity: sha512-r1ekGw/Bgpi3HLV3h1MRBIlSAdHoIMklpaQ3OQLFcRw9PwAj2rqigvIbg+dBUI51OxVI2jsEtDywDBjSiuf7Ug==} + giget@2.0.0: + resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==} hasBin: true git-hooks-list@3.2.0: @@ -10203,8 +10165,8 @@ packages: hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} - hono@4.7.5: - resolution: {integrity: sha512-fDOK5W2C1vZACsgLONigdZTRZxuBqFtcKh7bUQ5cVSbwI2RWjloJDcgFOVzbQrlI6pCmhlTsVYZ7zpLj4m4qMQ==} + hono@4.7.6: + resolution: {integrity: sha512-564rVzELU+9BRqqx5k8sT2NFwGD3I3Vifdb6P7CmM6FiarOSY+fDC+6B+k9wcCb86ReoayteZP2ki0cRLN1jbw==} engines: {node: '>=16.9.0'} hosted-git-info@2.8.9: @@ -10299,8 +10261,8 @@ packages: i18next-browser-languagedetector@8.0.4: resolution: {integrity: sha512-f3frU3pIxD50/Tz20zx9TD9HobKYg47fmAETb117GKGPrhwcSSPJDoCposXlVycVebQ9GQohC3Efbpq7/nnJ5w==} - i18next@24.2.3: - resolution: {integrity: sha512-lfbf80OzkocvX7nmZtu7nSTNbrTYR52sLWxPtlXX1zAhVw8WEnFk4puUkCR4B1dNQwbSpEHHHemcZu//7EcB7A==} + i18next@25.0.0: + resolution: {integrity: sha512-POPvwjOPR1GQvRnbikTMPEhQD+ekd186MHE6NtVxl3Lby+gPp0iq60eCqGrY6wfRnp1lejjFNu0EKs1afA322w==} peerDependencies: typescript: ^5 peerDependenciesMeta: @@ -10386,8 +10348,8 @@ packages: resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} engines: {node: '>=12'} - index-to-position@1.0.0: - resolution: {integrity: sha512-sCO7uaLVhRJ25vz1o8s9IFM3nVS4DkuQnyjMwiQPKvQuBYBDmb8H7zx8ki7nVh4HJQOdVWebyvLE0qt+clruxA==} + index-to-position@1.1.0: + resolution: {integrity: sha512-XPdx9Dq4t9Qk1mTMbWONJqU7boCoumEH7fRET37HX5+khDUl3J2W6PdALxhILYlIYx2amlwYcRPp28p0tSiojg==} engines: {node: '>=18'} infer-owner@1.0.4: @@ -10497,8 +10459,8 @@ packages: resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} engines: {node: '>=4'} - is-builtin-module@4.0.0: - resolution: {integrity: sha512-rWP3AMAalQSesXO8gleROyL2iKU73SX5Er66losQn9rWOWL4Gef0a/xOEOVqjWGMuR2vHG3FJ8UUmT700O8oFg==} + is-builtin-module@5.0.0: + resolution: {integrity: sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==} engines: {node: '>=18.20'} is-callable@1.2.7: @@ -10816,8 +10778,8 @@ packages: jose@5.10.0: resolution: {integrity: sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==} - jotai@2.12.2: - resolution: {integrity: sha512-oN8715y7MkjXlSrpyjlR887TOuc/NLZMs9gvgtfWH/JP47ChwO0lR2ijSwBvPMYyXRAPT+liIAhuBavluKGgtA==} + jotai@2.12.3: + resolution: {integrity: sha512-DpoddSkmPGXMFtdfnoIHfueFeGP643nqYUWC6REjUcME+PG2UkAtYnLbffRDw3OURI9ZUTcRWkRGLsOvxuWMCg==} engines: {node: '>=12.20.0'} peerDependencies: '@types/react': '>=17.0.0' @@ -10968,8 +10930,8 @@ packages: jws@3.2.2: resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} - katex@0.16.21: - resolution: {integrity: sha512-XvqR7FgOHtWupfMiigNzmh+MgUVmDGU2kXZm899ZkPfcuoPuFxyHmXsgATDpFZDAXCI8tvinaVcDo8PIIJSo4A==} + katex@0.16.22: + resolution: {integrity: sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==} hasBin: true keychain@1.5.0: @@ -11174,8 +11136,8 @@ packages: linkedom@0.18.9: resolution: {integrity: sha512-Pfvhwjs46nBrcQdauQjMXDJZqj6VwN7KStT84xQqmIgD9bPH6UVJ/ESW8y4VHVF2h7di0/P+f4Iln4U5emRcmg==} - lint-staged@15.5.0: - resolution: {integrity: sha512-WyCzSbfYGhK7cU+UuDDkzUiytbfbi0ZdPy2orwtM75P3WTtQBzmG40cCxIa8Ii2+XjfxzLH6Be46tUfWS85Xfg==} + lint-staged@15.5.1: + resolution: {integrity: sha512-6m7u8mue4Xn6wK6gZvSCQwBvMBR36xfY24nF5bMTf2MHDYG6S3yhJuOgdYVw99hsjyDt2d4z168b3naI8+NWtQ==} engines: {node: '>=18.12.0'} hasBin: true @@ -11183,8 +11145,8 @@ packages: resolution: {integrity: sha512-rJysbR9GKIalhTbVL2tYbF2hVyDnrf7pFUZBwjPaMIdadYHmeT+EVi/Bu3qd7ETQPahTotg2WRCatXwRBW554g==} engines: {node: '>=16.0.0'} - listr2@8.2.5: - resolution: {integrity: sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==} + listr2@8.3.2: + resolution: {integrity: sha512-vsBzcU4oE+v0lj4FhVLzr9dBTv4/fHIa57l+GCwovP8MoFNZJTOhGU8PXd4v2VJCbECAaijBiHntiekFMLvo0g==} engines: {node: '>=18.0.0'} load-bmfont@1.4.2: @@ -11315,6 +11277,9 @@ packages: long@5.3.1: resolution: {integrity: sha512-ka87Jz3gcx/I7Hal94xaN2tZEOPoUOEVftkQqZx2EeQRN7LGdfLlI3FvZ+7WDplm+vK2Urx9ULrvSowtdCieng==} + long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} @@ -11358,8 +11323,8 @@ packages: resolution: {integrity: sha512-yiLHa7cfJcGRFq4FrR4tMlpNHb4Vy4mWnpajlSSIFM5k4Lv8/7BbbDLzCAVogWNl0LlLhizRp1drXv0hK9h0Yw==} os: [darwin] - magic-string-ast@0.8.0: - resolution: {integrity: sha512-e9eH6YOYl2OuDd3fNt2ciFhj/l2vxJmGeWLLcY+0NcW6k0Xitq7XIxN2++QVVhswXeJLy95SjF8oVKRyJC95GQ==} + magic-string-ast@0.9.1: + resolution: {integrity: sha512-18dv2ZlSSgJ/jDWlZGKfnDJx56ilNlYq9F7NnwuWTErsmYmqJ2TWE4l1o2zlUHBYUGBy3tIhPCC1gxq8M5HkMA==} engines: {node: '>=20.18.0'} magic-string@0.25.9: @@ -11820,11 +11785,25 @@ packages: moment@2.30.1: resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} - motion-dom@12.6.3: - resolution: {integrity: sha512-gRY08RjcnzgFYLemUZ1lo/e9RkBxR+6d4BRvoeZDSeArG4XQXERSPapKl3LNQRu22Sndjf1h+iavgY0O4NrYqA==} + motion-dom@12.7.4: + resolution: {integrity: sha512-1ZUHAoSUMMxP6jPqyxlk9XUfb6NxMsnWPnH2YGhrOhTURLcXWbETi6eemoKb60Pe32NVJYduL4B62VQSO5Jq8Q==} - motion-utils@12.6.3: - resolution: {integrity: sha512-R/b3Ia2VxtTNZ4LTEO5pKYau1OUNHOuUfxuP0WFCTDYdHkeTBR9UtxR1cc8mDmKr8PEhmmfnTKGz3rSMjNRoRg==} + motion-utils@12.7.2: + resolution: {integrity: sha512-XhZwqctxyJs89oX00zn3OGCuIIpVevbTa+u82usWBC6pSHUd2AoNWiYa7Du8tJxJy9TFbZ82pcn5t7NOm1PHAw==} + + motion@12.7.4: + resolution: {integrity: sha512-MBGrMbYageHw4iZJn+pGTr7abq5n53jCxYkhFC1It3vYukQPRWg5zij46MnwYGpLR8KG465MLHSASXot9edYOw==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: 18.3.1 + react-dom: 18.3.1 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} @@ -11901,8 +11880,8 @@ packages: natural-orderby@2.0.3: resolution: {integrity: sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q==} - nbump@2.0.7: - resolution: {integrity: sha512-BhHrnS1G21VMssWUU18SOHHwAFHUvIHUSdlDtX62SCoAc97GrE3bwtUUkWSPJA18fLndCMOB5PbMZoBumDl2/g==} + nbump@2.1.0: + resolution: {integrity: sha512-2xHOFtULhfpZfmYLOtx0fPkcTEqer9fTQCrT1qVmmdk00dznSZ/j1ntDBM6UMB2LiduZmnWde69dt7R17E+N9A==} hasBin: true ncp@2.0.0: @@ -12050,8 +12029,8 @@ packages: nwsapi@2.2.20: resolution: {integrity: sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==} - nypm@0.5.4: - resolution: {integrity: sha512-X0SNNrZiGU8/e/zAB7sCTtdxWTMSIO73q+xuKgglm2Yvzwlo8UoC5FNySQFCvl84uPaeADkqHUZUkWy4aH4xOA==} + nypm@0.6.0: + resolution: {integrity: sha512-mn8wBFV9G9+UFHIrq+pZ2r2zL4aPau/by3kJb3cM7+5tQHMt6HGQB8FDIeKFYp8o0D2pnH6nVsO88N4AmUxIWg==} engines: {node: ^14.16.0 || >=16.10.0} hasBin: true @@ -12090,8 +12069,8 @@ packages: ofetch@1.4.1: resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} - ohash@1.1.6: - resolution: {integrity: sha512-TBu7PtV8YkAZn0tSxobKY2n2aAQva936lhRrj6957aDaCf9IEtqsKbgMzXE/F/sjqYOwmrukeORHNLe5glk7Cg==} + ohash@2.0.11: + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} omggif@1.0.10: resolution: {integrity: sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==} @@ -12231,8 +12210,8 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - package-json-validator@0.10.0: - resolution: {integrity: sha512-zaPt4x0ZIxA4KYWpPMkbOEhkEDfQdtkCCC1xhnbnYrQV+Kry3zMAxENujgdT6aPA5BJ+FfpncKoNULWc/qjloQ==} + package-json-validator@0.10.1: + resolution: {integrity: sha512-lT7Dxx56Opfiu5xFJDUGNiCrBILCwlHZa/ogWgr9/fa1uD+LadhCnLrKcpQHFN03/qWSRvxvcUnBt3sM7JjFiQ==} engines: {node: '>=18'} hasBin: true @@ -12289,8 +12268,8 @@ packages: resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} engines: {node: '>=4'} - parse-json@8.2.0: - resolution: {integrity: sha512-eONBZy4hm2AgxjNFd8a4nyDJnzUAH0g34xSQAwWEVGCjdZ4ZL7dKZBfq267GWP/JaS9zW62Xs2FeAdDvpHHJGQ==} + parse-json@8.3.0: + resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==} engines: {node: '>=18'} parse-ms@2.1.0: @@ -12902,6 +12881,9 @@ packages: process-warning@4.0.1: resolution: {integrity: sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==} + process-warning@5.0.0: + resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==} + process@0.11.10: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} @@ -12945,6 +12927,10 @@ packages: resolution: {integrity: sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==} engines: {node: '>=12.0.0'} + protobufjs@7.5.0: + resolution: {integrity: sha512-Z2E/kOY1QjoMlCytmexzYfDm/w5fKAiRwpSzGtdnXW1zC88Z2yXazHHrOtwCzn+7wSxyE8PYM4rvVcMphF9sOA==} + engines: {node: '>=12.0.0'} + proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} @@ -13038,12 +13024,12 @@ packages: resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} engines: {node: '>= 0.8'} - rc-modal-sheet@0.3.2: - resolution: {integrity: sha512-V6q4+xpeIj9VRL/44zCaXCkRLjVZ1iSYUuyiqveD24gQFy41s9GwjTrMoZ0T6Xg54I2wzuXRUITRH1hrHIjF+A==} + rc-modal-sheet@1.0.0: + resolution: {integrity: sha512-bhKDxa67CyQUvjoJQ+IBms6eyTR1XV0COE/Vbuy33RznO66EkeFGh0dtwM2pbMcVhvJscAR7G9+n2msU4EWI1A==} peerDependencies: '@radix-ui/react-dialog': ^1 clsx: '*' - framer-motion: ^11 + motion: ^12 tailwind-merge: ^2 vaul: ^0.9.0 @@ -13113,8 +13099,8 @@ packages: peerDependencies: react: 18.3.1 - react-hotkeys-hook@4.6.1: - resolution: {integrity: sha512-XlZpbKUj9tkfgPgT9gA+1p7Ey6vFIZHttUjPqpTdyT5nqQ8mHL7elxvSbaC+dpSiHUSmr21Ya1mDxBZG3aje4Q==} + react-hotkeys-hook@5.0.1: + resolution: {integrity: sha512-TysTwXrUSj6QclMZIEoxCfvy/6EsoZcrfE970aUVa9fO3c3vcms+IVjv3ljbhUPM/oY1iEoun7O2W8v8INl5hw==} peerDependencies: react: 18.3.1 react-dom: 18.3.1 @@ -13190,6 +13176,12 @@ packages: react-native-svg: optional: true + react-native-edge-to-edge@1.6.0: + resolution: {integrity: sha512-2WCNdE3Qd6Fwg9+4BpbATUxCLcouF6YRY7K+J36KJ4l3y+tWN6XCqAC4DuoGblAAbb2sLkhEDp4FOlbOIot2Og==} + peerDependencies: + react: 18.3.1 + react-native: '*' + react-native-gesture-handler@2.25.0: resolution: {integrity: sha512-NPjJi6mislXxvjxQPU9IYwBjb1Uejp8GvAbE1Lhh+xMIMEvmgAvVIp5cz1P+xAbV6uYcRRArm278+tEInGOqWg==} peerDependencies: @@ -13216,14 +13208,14 @@ packages: react: 18.3.1 react-native: '*' - react-native-is-edge-to-edge@1.1.6: - resolution: {integrity: sha512-1pHnFTlBahins6UAajXUqeCOHew9l9C2C8tErnpGC3IyLJzvxD+TpYAixnCbrVS52f7+NvMttbiSI290XfwN0w==} + react-native-is-edge-to-edge@1.1.7: + resolution: {integrity: sha512-EH6i7E8epJGIcu7KpfXYXiV2JFIYITtq+rVS8uEb+92naMRBdxhTuS8Wn2Q7j9sqyO0B+Xbaaf9VdipIAmGW4w==} peerDependencies: react: 18.3.1 - react-native: '>=0.73.0' + react-native: '*' - react-native-keyboard-controller@1.16.8: - resolution: {integrity: sha512-Ua6S4+ooMqNW3dFQ7/S/fhzgumAuOk0eUkYmNRyjg3ezYdOjwQNl7QiVQg6cxZkpPmeIkgHdmeOR1HZ45S2h4Q==} + react-native-keyboard-controller@1.17.0: + resolution: {integrity: sha512-JbpKNKStiA6Ud04dMSwObp8cCqNVk8CCb3c6TDFJVbirz+ALVulD6i8l3P6YhQGhA42Vpc3QHhuFlRtBrbQkcA==} peerDependencies: react: 18.3.1 react-native: '*' @@ -13241,8 +13233,8 @@ packages: react: 18.3.1 react-native: '*' - react-native-reanimated@3.17.2: - resolution: {integrity: sha512-8z4o8/qZRM02oI3qzVh48417/AXDx+aKl95X8qn+vqQx+s7Z1sGI8GPah645vYDB/DrPDRkoJOp0tAhrJdXs9w==} + react-native-reanimated@3.17.4: + resolution: {integrity: sha512-vmkG/N5KZrexHr4v0rZB7ohPVseGVNaCXjGxoRo+NYKgC9+mIZAkg/QIfy9xxfJ73FfTrryO9iYUrxks3ZfKbA==} peerDependencies: '@babel/core': ^7.0.0-0 react: 18.3.1 @@ -13251,8 +13243,8 @@ packages: react-native-root-siblings@5.0.1: resolution: {integrity: sha512-Ay3k/fBj6ReUkWX5WNS+oEAcgPLEGOK8n7K/L7D85mf3xvd8rm/b4spsv26E4HlFzluVx5HKbxEt9cl0wQ1u3g==} - react-native-safe-area-context@5.3.0: - resolution: {integrity: sha512-glV9bwuozTjf/JDBIBm+ITnukHNaUT3nucgdeADwjtHsfEN3RL5UO6nq99vvdWv5j/O9yCZBvFncM1BBQ+UvpQ==} + react-native-safe-area-context@5.4.0: + resolution: {integrity: sha512-JaEThVyJcLhA+vU0NU8bZ0a1ih6GiF4faZ+ArZLqpYbL6j7R3caRqj+mE3lEtKCuHgwjLg3bCxLL1GPUJZVqUA==} peerDependencies: react: 18.3.1 react-native: '*' @@ -13298,8 +13290,8 @@ packages: react-native: '>=0.76.0' tailwindcss: '>=3.0.0' - react-native-video@6.11.0: - resolution: {integrity: sha512-+lxuyQqUwowWQ5vx82mSnPiAW7ZHvyZrgCRy/6WHREAyCcdveA118SIAjPurRc5bASXPDeit7WkYF4xRlonyYQ==} + react-native-video@6.12.0: + resolution: {integrity: sha512-MPiOk/8qszBY2zAZZuuzyNPcRK6+UFHutzRcEJlGodZ5GCUNmw1vIE6FCInL22S/YpnGywwiKVQDQCjjqQx9Fg==} peerDependencies: react: 18.3.1 react-native: '*' @@ -13348,6 +13340,10 @@ packages: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} + react-refresh@0.17.0: + resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} + engines: {node: '>=0.10.0'} + react-remove-scroll-bar@2.3.8: resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} engines: {node: '>=10'} @@ -13368,8 +13364,8 @@ packages: '@types/react': optional: true - react-router@7.5.0: - resolution: {integrity: sha512-estOHrRlDMKdlQa6Mj32gIks4J+AxNsYoE0DbTTxiMy2mPzZuWSDU+N85/r1IlNR7kGfznF3VCUlvc5IUO+B9g==} + react-router@7.5.1: + resolution: {integrity: sha512-/jjU3fcYNd2bwz9Q0xt5TwyiyoO8XjSEFXJY4O/lMAlkGTHWuHRAbR9Etik+lSDqMC7A7mz3UlXzgYT6Vl58sA==} engines: {node: '>=20.0.0'} peerDependencies: react: 18.3.1 @@ -13501,8 +13497,8 @@ packages: resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} engines: {node: '>= 10.13.0'} - recyclerlistview@4.2.1: - resolution: {integrity: sha512-NtVYjofwgUCt1rEsTp6jHQg/47TWjnO92TU2kTVgJ9wsc/ely4HnizHHa+f/dI7qaw4+zcSogElrLjhMltN2/g==} + recyclerlistview@4.2.3: + resolution: {integrity: sha512-STR/wj/FyT8EMsBzzhZ1l2goYirMkIgfV3gYEPxI3Kf3lOnu6f7Dryhyw7/IkQrgX5xtTcDrZMqytvteH9rL3g==} peerDependencies: react: 18.3.1 react-native: '>= 0.30.0' @@ -13767,17 +13763,14 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - rollup@4.39.0: - resolution: {integrity: sha512-thI8kNc02yNvnmJp8dr3fNWJ9tCONDhp6TV35X6HkKGGs9E6q7YWCHbe5vKiTa7TAiNcFEmXKj3X/pG2b3ci0g==} + rollup@4.40.0: + resolution: {integrity: sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true rou3@0.5.1: resolution: {integrity: sha512-OXMmJ3zRk2xeXFGfA3K+EOPHC5u7RDFG7lIOx0X1pdnhUkI8MdVrbV+sNsD80ElpUZ+MRHdyxPnFthq9VHs8uQ==} - rspack-resolver@1.3.0: - resolution: {integrity: sha512-az/PLDwa1xijNv4bAFBS8mtqqJC1Y3lVyFag4cuyIUOHq/ft5kSZlHbqYaLZLpsQtPWv4ZGDo5ycySKJzUvU/A==} - rtl-detect@1.1.2: resolution: {integrity: sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ==} @@ -13847,8 +13840,8 @@ packages: resolution: {integrity: sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ==} engines: {node: ^14.0.0 || >=16.0.0} - secure-json-parse@3.0.2: - resolution: {integrity: sha512-H6nS2o8bWfpFEV6U38sOSjS7bTbdgbCGU9wEM6W14P5H0QOsz94KCusifV44GpHDTu2nqZbuDNhTzu+mjDSw1w==} + secure-json-parse@4.0.0: + resolution: {integrity: sha512-dxtLJO6sc35jWidmLxo7ij+Eg48PM/kleBsxpC8QJE0qJICe+KawkDQmvCMZUr9u7WKVHgMW6vy3fQ7zMiFZMA==} seek-bzip@1.0.6: resolution: {integrity: sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==} @@ -13980,8 +13973,8 @@ packages: resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==} engines: {node: '>= 0.4'} - shiki@3.2.1: - resolution: {integrity: sha512-VML/2o1/KGYkEf/stJJ+s9Ypn7jUKQPomGLGYso4JJFMFxVDyPNsjsI3MB3KLjlMOeH44gyaPdXC6rik2WXvUQ==} + shiki@3.2.2: + resolution: {integrity: sha512-0qWBkM2t/0NXPRcVgtLhtHv6Ak3Q5yI4K/ggMqcgLRKm4+pCs3namgZlhlat/7u2CuqNtlShNs9lENOG6n7UaQ==} shimmer@1.2.1: resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==} @@ -14350,10 +14343,6 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true - sudo-prompt@8.2.5: - resolution: {integrity: sha512-rlBo3HU/1zAJUrkY6jNxDOC9eVYliG6nS4JA8u8KAshITd07tafMc/Br7xQwCSseXwJ2iCcHCE8SNWX3q8Z+kw==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - sudo-prompt@9.1.1: resolution: {integrity: sha512-es33J1g2HjMpyAhz8lOR+ICmXXAqTuKbuXuUWLhOLew20oN9oUCgCJx615U/v7aioZg7IX5lIh9x34vwneu4pA==} deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. @@ -14415,8 +14404,8 @@ packages: tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - tailwind-merge@3.1.0: - resolution: {integrity: sha512-aV27Oj8B7U/tAOMhJsSGdWqelfmudnGMdXIlMnk1JfsjwSjts6o8HyfN7SFH3EztzH4YH8kk6GbLTHzITJO39Q==} + tailwind-merge@3.2.0: + resolution: {integrity: sha512-FQT/OVqCD+7edmmJpsgCsY820RTD5AkBryuG5IUqR5YQZSdj5xlH5nLgH7YPths7WsLPSpSBNneJdM8aS8aeFA==} tailwindcss-animate@1.0.7: resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} @@ -14561,11 +14550,11 @@ packages: resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} - tldts-core@6.1.85: - resolution: {integrity: sha512-DTjUVvxckL1fIoPSb3KE7ISNtkWSawZdpfxGxwiIrZoO6EbHVDXXUIlIuWympPaeS+BLGyggozX/HTMsRAdsoA==} + tldts-core@7.0.0: + resolution: {integrity: sha512-ZDylm+F2UZYtJp3zZj0PRSBTJ1aCQ7SmPr0tcq9UDMPEUfRd1qRBh/n6HL1KxQuV0gmLmSrRgiapMoDs0KllCA==} - tldts@6.1.85: - resolution: {integrity: sha512-gBdZ1RjCSevRPFix/hpaUWeak2/RNUZB4/8frF1r5uYMHjFptkiT0JXIebWvgI/0ZHXvxaUDDJshiA0j6GdL3w==} + tldts@7.0.0: + resolution: {integrity: sha512-f1DBZcYLK+YVRuiKKSuBS4QbZB5J+gf376pB/4CtJFxYQ3ivAWhQzgBolAmcUH0+zLJybXi2B9lcqHYnumT3yg==} hasBin: true tmp-promise@3.0.3: @@ -14696,8 +14685,8 @@ packages: ts-object-utils@0.0.5: resolution: {integrity: sha512-iV0GvHqOmilbIKJsfyfJY9/dNHCs969z3so90dQWsO1eMMozvTpnB1MEaUbb3FYtZTGjv5sIy/xmslEz0Rg2TA==} - ts-pattern@5.6.2: - resolution: {integrity: sha512-d4IxJUXROL5NCa3amvMg6VQW2HVtZYmUTPfvVtO7zJWGYLJ+mry9v2OmYm+z67aniQoQ8/yFNadiEwtNS9qQiw==} + ts-pattern@5.7.0: + resolution: {integrity: sha512-0/FvIG4g3kNkYgbNwBBW5pZBkfpeYQnH+2AA3xmjkCAit/DSDPKmgwC3fKof4oYUq6gupClVOJlFl+939VRBMg==} ts-tiny-invariant@2.0.5: resolution: {integrity: sha512-NGQzWRLGLMjOUTpsxMSRj63fuFBC8HV8L4NUxzDVgU4MFeOt3qFI2534M5L+ch22x53oDEwPaRBPXgAfRjcXHA==} @@ -14826,6 +14815,10 @@ packages: resolution: {integrity: sha512-2dBz5D5ycHIoliLYLi0Q2V7KRaDlH0uWIvmk7TYlAg5slqwiPv1ezJdZm1QEM0xgk29oYWMCbIG7E6gHpvChlg==} engines: {node: '>=16'} + type-fest@4.40.0: + resolution: {integrity: sha512-ABHZ2/tS2JkvH1PEjxFDTUWC8dB5OsIGZP4IFLhR293GqT5Y5qB1WwL2kMPYhQW9DVgVD8Hd7I8gjwPIf5GFkw==} + engines: {node: '>=16'} + typed-array-buffer@1.0.3: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} @@ -14842,8 +14835,8 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typescript-eslint@8.28.0: - resolution: {integrity: sha512-jfZtxJoHm59bvoCMYCe2BM0/baMswRhMmYhy+w6VfcyHrjxZ0OJe0tGasydCpIpA+A/WIJhTyZfb3EtwNC/kHQ==} + typescript-eslint@8.30.1: + resolution: {integrity: sha512-D7lC0kcehVH7Mb26MRQi64LMyRJsj3dToJxM1+JVTl53DQSV5/7oUGWQLcKl1C1KnoVHxMMU2FNQMffr7F3Row==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -15011,12 +15004,8 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - unplugin-ast@0.14.4: - resolution: {integrity: sha512-9EWJqy9PblRP/7/6Fl2YSAXEuzkJmTMSmoWEd+NBlqHETDaYgd2hGrRNC2gHmz4Ec7lUVxeWKtowYmYuC+lJng==} - engines: {node: '>=18.12.0'} - - unplugin-utils@0.2.4: - resolution: {integrity: sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA==} + unplugin-ast@0.14.6: + resolution: {integrity: sha512-HdntpxAN8fWyJ28n8iRkRrez9UrxTPda27XzdEkI8tz0Cn0+fLrnN+8qHqHlzRWXxSPVP7M9eEJ5MeMwbbhy4g==} engines: {node: '>=18.12.0'} unplugin@1.0.1: @@ -15026,10 +15015,13 @@ packages: resolution: {integrity: sha512-us4j03/499KhbGP8BU7Hrzrgseo+KdfJYWcbcajCOqsAyb8Gk0Yn2kiUIcZISYCb1JFaZfIuG3b42HmguVOKCQ==} engines: {node: '>=18.12.0'} - unplugin@2.2.2: - resolution: {integrity: sha512-Qp+iiD+qCRnUek+nDoYvtWX7tfnYyXsrOnJ452FRTgOyKmTM7TUJ3l+PLPJOOWPTUyKISKp4isC5JJPSXUjGgw==} + unplugin@2.3.2: + resolution: {integrity: sha512-3n7YA46rROb3zSj8fFxtxC/PqoyvYQ0llwz9wtUPUutr9ig09C8gGo5CWCwHrUzlqC1LLR43kxp5vEIyH1ac1w==} engines: {node: '>=18.12.0'} + unrs-resolver@1.5.0: + resolution: {integrity: sha512-6aia3Oy7SEe0MuUGQm2nsyob0L2+g57w178K5SE/3pvSGAIp28BB2O921fKx424Ahc/gQ6v0DXFbhcpyhGZdOA==} + untildify@4.0.0: resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} engines: {node: '>=8'} @@ -15226,8 +15218,8 @@ packages: vite: optional: true - vite@6.2.5: - resolution: {integrity: sha512-j023J/hCAa4pRIUH6J9HemwYfjB5llR2Ps0CWeikOtdR8+pAURAk0DoJC5/mm9kd+UgdnIy7d6HE4EAvlYhPhA==} + vite@6.3.2: + resolution: {integrity: sha512-ZSvGOXKGceizRQIZSz7TGJ0pS3QLlVY/9hwxVh17W3re67je1RKYzFHivZ/t0tubU78Vkyb9WnHPENSBCzbckg==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -15639,11 +15631,6 @@ packages: engines: {node: '>= 14'} hasBin: true - yaml@2.7.0: - resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} - engines: {node: '>= 14'} - hasBin: true - yaml@2.7.1: resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==} engines: {node: '>= 14'} @@ -15698,8 +15685,8 @@ packages: peerDependencies: zod: ^3.18.0 - zod@3.24.2: - resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} + zod@3.24.3: + resolution: {integrity: sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg==} zustand@5.0.3: resolution: {integrity: sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==} @@ -16660,12 +16647,12 @@ snapshots: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@better-auth/expo@1.2.6-beta.1(better-auth@1.2.6-beta.2(typescript@5.8.3))': + '@better-auth/expo@1.2.7(better-auth@1.2.7)': dependencies: '@better-fetch/fetch': 1.1.18 - better-auth: 1.2.6-beta.2(typescript@5.8.3) - better-call: 1.0.5 - zod: 3.24.2 + better-auth: 1.2.7 + better-call: 1.0.8 + zod: 3.24.3 '@better-auth/utils@0.2.4': dependencies: @@ -16685,14 +16672,14 @@ snapshots: picocolors: 1.1.1 sisteransi: 1.0.5 - '@clack/core@0.4.1': + '@clack/core@0.4.2': dependencies: picocolors: 1.1.1 sisteransi: 1.0.5 - '@clack/prompts@0.10.0': + '@clack/prompts@0.10.1': dependencies: - '@clack/core': 0.4.1 + '@clack/core': 0.4.2 picocolors: 1.1.1 sisteransi: 1.0.5 @@ -16704,7 +16691,7 @@ snapshots: '@conventional-changelog/git-client@1.0.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.1.0)': dependencies: - '@types/semver': 7.5.8 + '@types/semver': 7.7.0 semver: 7.7.1 optionalDependencies: conventional-commits-filter: 5.0.0 @@ -16774,16 +16761,16 @@ snapshots: '@egjs/list-differ@1.0.1': {} - '@egoist/tailwindcss-icons@1.9.0(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.0)(typescript@5.8.3)))': + '@egoist/tailwindcss-icons@1.9.0(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3)))': dependencies: '@iconify/utils': 2.3.0 - tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@22.14.0)(typescript@5.8.3)) + tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3)) transitivePeerDependencies: - supports-color - '@egoist/tipc@0.3.2(electron@34.5.0)(react@18.3.1)': + '@egoist/tipc@0.3.2(electron@35.1.5)(react@18.3.1)': dependencies: - electron: 34.5.0 + electron: 35.1.5 optionalDependencies: '@tanstack/react-query': 5.69.0(react@18.3.1) transitivePeerDependencies: @@ -17030,17 +17017,17 @@ snapshots: dependencies: chrome-trace-event: 1.0.4 - '@electron-toolkit/preload@3.0.1(electron@34.5.0)': + '@electron-toolkit/preload@3.0.1(electron@35.1.5)': dependencies: - electron: 34.5.0 + electron: 35.1.5 - '@electron-toolkit/tsconfig@1.0.1(@types/node@22.14.0)': + '@electron-toolkit/tsconfig@1.0.1(@types/node@22.14.1)': dependencies: - '@types/node': 22.14.0 + '@types/node': 22.14.1 - '@electron-toolkit/utils@4.0.0(electron@34.5.0)': + '@electron-toolkit/utils@4.0.0(electron@35.1.5)': dependencies: - electron: 34.5.0 + electron: 35.1.5 '@electron/asar@3.3.1': dependencies: @@ -17214,9 +17201,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@emnapi/core@1.3.1': + '@emnapi/core@1.4.3': dependencies: - '@emnapi/wasi-threads': 1.0.1 + '@emnapi/wasi-threads': 1.0.2 tslib: 2.8.1 optional: true @@ -17225,7 +17212,12 @@ snapshots: tslib: 2.8.1 optional: true - '@emnapi/wasi-threads@1.0.1': + '@emnapi/runtime@1.4.3': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.0.2': dependencies: tslib: 2.8.1 optional: true @@ -17241,7 +17233,7 @@ snapshots: dependencies: '@types/eslint': 9.6.1 '@types/estree': 1.0.7 - '@typescript-eslint/types': 8.28.0 + '@typescript-eslint/types': 8.30.1 comment-parser: 1.4.1 esquery: 1.6.0 jsdoc-type-pratt-parser: 4.1.0 @@ -17256,9 +17248,6 @@ snapshots: '@esbuild-kit/core-utils': 3.3.2 get-tsconfig: 4.10.0 - '@esbuild/aix-ppc64@0.19.12': - optional: true - '@esbuild/aix-ppc64@0.24.2': optional: true @@ -17271,9 +17260,6 @@ snapshots: '@esbuild/android-arm64@0.18.20': optional: true - '@esbuild/android-arm64@0.19.12': - optional: true - '@esbuild/android-arm64@0.24.2': optional: true @@ -17286,9 +17272,6 @@ snapshots: '@esbuild/android-arm@0.18.20': optional: true - '@esbuild/android-arm@0.19.12': - optional: true - '@esbuild/android-arm@0.24.2': optional: true @@ -17301,9 +17284,6 @@ snapshots: '@esbuild/android-x64@0.18.20': optional: true - '@esbuild/android-x64@0.19.12': - optional: true - '@esbuild/android-x64@0.24.2': optional: true @@ -17316,9 +17296,6 @@ snapshots: '@esbuild/darwin-arm64@0.18.20': optional: true - '@esbuild/darwin-arm64@0.19.12': - optional: true - '@esbuild/darwin-arm64@0.24.2': optional: true @@ -17331,9 +17308,6 @@ snapshots: '@esbuild/darwin-x64@0.18.20': optional: true - '@esbuild/darwin-x64@0.19.12': - optional: true - '@esbuild/darwin-x64@0.24.2': optional: true @@ -17346,9 +17320,6 @@ snapshots: '@esbuild/freebsd-arm64@0.18.20': optional: true - '@esbuild/freebsd-arm64@0.19.12': - optional: true - '@esbuild/freebsd-arm64@0.24.2': optional: true @@ -17361,9 +17332,6 @@ snapshots: '@esbuild/freebsd-x64@0.18.20': optional: true - '@esbuild/freebsd-x64@0.19.12': - optional: true - '@esbuild/freebsd-x64@0.24.2': optional: true @@ -17376,9 +17344,6 @@ snapshots: '@esbuild/linux-arm64@0.18.20': optional: true - '@esbuild/linux-arm64@0.19.12': - optional: true - '@esbuild/linux-arm64@0.24.2': optional: true @@ -17391,9 +17356,6 @@ snapshots: '@esbuild/linux-arm@0.18.20': optional: true - '@esbuild/linux-arm@0.19.12': - optional: true - '@esbuild/linux-arm@0.24.2': optional: true @@ -17406,9 +17368,6 @@ snapshots: '@esbuild/linux-ia32@0.18.20': optional: true - '@esbuild/linux-ia32@0.19.12': - optional: true - '@esbuild/linux-ia32@0.24.2': optional: true @@ -17421,9 +17380,6 @@ snapshots: '@esbuild/linux-loong64@0.18.20': optional: true - '@esbuild/linux-loong64@0.19.12': - optional: true - '@esbuild/linux-loong64@0.24.2': optional: true @@ -17436,9 +17392,6 @@ snapshots: '@esbuild/linux-mips64el@0.18.20': optional: true - '@esbuild/linux-mips64el@0.19.12': - optional: true - '@esbuild/linux-mips64el@0.24.2': optional: true @@ -17451,9 +17404,6 @@ snapshots: '@esbuild/linux-ppc64@0.18.20': optional: true - '@esbuild/linux-ppc64@0.19.12': - optional: true - '@esbuild/linux-ppc64@0.24.2': optional: true @@ -17466,9 +17416,6 @@ snapshots: '@esbuild/linux-riscv64@0.18.20': optional: true - '@esbuild/linux-riscv64@0.19.12': - optional: true - '@esbuild/linux-riscv64@0.24.2': optional: true @@ -17481,9 +17428,6 @@ snapshots: '@esbuild/linux-s390x@0.18.20': optional: true - '@esbuild/linux-s390x@0.19.12': - optional: true - '@esbuild/linux-s390x@0.24.2': optional: true @@ -17496,9 +17440,6 @@ snapshots: '@esbuild/linux-x64@0.18.20': optional: true - '@esbuild/linux-x64@0.19.12': - optional: true - '@esbuild/linux-x64@0.24.2': optional: true @@ -17520,9 +17461,6 @@ snapshots: '@esbuild/netbsd-x64@0.18.20': optional: true - '@esbuild/netbsd-x64@0.19.12': - optional: true - '@esbuild/netbsd-x64@0.24.2': optional: true @@ -17544,9 +17482,6 @@ snapshots: '@esbuild/openbsd-x64@0.18.20': optional: true - '@esbuild/openbsd-x64@0.19.12': - optional: true - '@esbuild/openbsd-x64@0.24.2': optional: true @@ -17559,9 +17494,6 @@ snapshots: '@esbuild/sunos-x64@0.18.20': optional: true - '@esbuild/sunos-x64@0.19.12': - optional: true - '@esbuild/sunos-x64@0.24.2': optional: true @@ -17574,9 +17506,6 @@ snapshots: '@esbuild/win32-arm64@0.18.20': optional: true - '@esbuild/win32-arm64@0.19.12': - optional: true - '@esbuild/win32-arm64@0.24.2': optional: true @@ -17589,9 +17518,6 @@ snapshots: '@esbuild/win32-ia32@0.18.20': optional: true - '@esbuild/win32-ia32@0.19.12': - optional: true - '@esbuild/win32-ia32@0.24.2': optional: true @@ -17604,9 +17530,6 @@ snapshots: '@esbuild/win32-x64@0.18.20': optional: true - '@esbuild/win32-x64@0.19.12': - optional: true - '@esbuild/win32-x64@0.24.2': optional: true @@ -17621,109 +17544,100 @@ snapshots: eslint: 9.24.0(jiti@2.4.2) eslint-visitor-keys: 3.4.3 + '@eslint-community/eslint-utils@4.6.1(eslint@9.24.0(jiti@2.4.2))': + dependencies: + eslint: 9.24.0(jiti@2.4.2) + eslint-visitor-keys: 3.4.3 + '@eslint-community/regexpp@4.12.1': {} - '@eslint-react/ast@1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': + '@eslint-react/ast@1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: - '@eslint-react/eff': 1.38.0 - '@typescript-eslint/types': 8.28.0 - '@typescript-eslint/typescript-estree': 8.28.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.28.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@eslint-react/eff': 1.48.3 + '@typescript-eslint/types': 8.30.1 + '@typescript-eslint/typescript-estree': 8.30.1(typescript@5.8.3) + '@typescript-eslint/utils': 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) string-ts: 2.2.1 - ts-pattern: 5.6.2 + ts-pattern: 5.7.0 transitivePeerDependencies: - eslint - supports-color - typescript - '@eslint-react/core@1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': + '@eslint-react/core@1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: - '@eslint-react/ast': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@eslint-react/eff': 1.38.0 - '@eslint-react/jsx': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@eslint-react/kit': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@eslint-react/shared': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@eslint-react/var': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.28.0 - '@typescript-eslint/type-utils': 8.28.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/types': 8.28.0 - '@typescript-eslint/utils': 8.28.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@eslint-react/ast': 1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@eslint-react/eff': 1.48.3 + '@eslint-react/kit': 1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@eslint-react/shared': 1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@eslint-react/var': 1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.30.1 + '@typescript-eslint/type-utils': 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/types': 8.30.1 + '@typescript-eslint/utils': 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) birecord: 0.1.1 - ts-pattern: 5.6.2 + ts-pattern: 5.7.0 transitivePeerDependencies: - eslint - supports-color - typescript - '@eslint-react/eff@1.38.0': {} + '@eslint-react/eff@1.48.3': {} - '@eslint-react/eslint-plugin@1.38.0(eslint@9.24.0(jiti@2.4.2))(ts-api-utils@2.1.0(typescript@5.8.3))(typescript@5.8.3)': + '@eslint-react/eslint-plugin@1.48.3(eslint@9.24.0(jiti@2.4.2))(ts-api-utils@2.1.0(typescript@5.8.3))(typescript@5.8.3)': dependencies: - '@eslint-react/eff': 1.38.0 - '@eslint-react/kit': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@eslint-react/shared': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.28.0 - '@typescript-eslint/type-utils': 8.28.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/types': 8.28.0 - '@typescript-eslint/utils': 8.28.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@eslint-react/eff': 1.48.3 + '@eslint-react/kit': 1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@eslint-react/shared': 1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.30.1 + '@typescript-eslint/type-utils': 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/types': 8.30.1 + '@typescript-eslint/utils': 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) eslint: 9.24.0(jiti@2.4.2) - eslint-plugin-react-debug: 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - eslint-plugin-react-dom: 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - eslint-plugin-react-hooks-extra: 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - eslint-plugin-react-naming-convention: 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - eslint-plugin-react-web-api: 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - eslint-plugin-react-x: 1.38.0(eslint@9.24.0(jiti@2.4.2))(ts-api-utils@2.1.0(typescript@5.8.3))(typescript@5.8.3) + eslint-plugin-react-debug: 1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + eslint-plugin-react-dom: 1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + eslint-plugin-react-hooks-extra: 1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + eslint-plugin-react-naming-convention: 1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + eslint-plugin-react-web-api: 1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + eslint-plugin-react-x: 1.48.3(eslint@9.24.0(jiti@2.4.2))(ts-api-utils@2.1.0(typescript@5.8.3))(typescript@5.8.3) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: - supports-color - ts-api-utils - '@eslint-react/jsx@1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': + '@eslint-react/kit@1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: - '@eslint-react/ast': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@eslint-react/eff': 1.38.0 - '@eslint-react/var': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.28.0 - '@typescript-eslint/types': 8.28.0 - '@typescript-eslint/utils': 8.28.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - ts-pattern: 5.6.2 + '@eslint-react/eff': 1.48.3 + '@typescript-eslint/utils': 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@zod/mini': 4.0.0-beta.20250417T043022 + ts-pattern: 5.7.0 transitivePeerDependencies: - eslint - supports-color - typescript - '@eslint-react/kit@1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': + '@eslint-react/shared@1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: - '@eslint-react/eff': 1.38.0 - '@typescript-eslint/utils': 8.28.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - ts-pattern: 5.6.2 + '@eslint-react/eff': 1.48.3 + '@eslint-react/kit': 1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@zod/mini': 4.0.0-beta.20250417T043022 + ts-pattern: 5.7.0 transitivePeerDependencies: - eslint - supports-color - typescript - '@eslint-react/shared@1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': + '@eslint-react/var@1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: - '@eslint-react/eff': 1.38.0 - '@eslint-react/kit': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/utils': 8.28.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - picomatch: 4.0.2 - ts-pattern: 5.6.2 - transitivePeerDependencies: - - eslint - - supports-color - - typescript - - '@eslint-react/var@1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': - dependencies: - '@eslint-react/ast': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@eslint-react/eff': 1.38.0 - '@typescript-eslint/scope-manager': 8.28.0 - '@typescript-eslint/types': 8.28.0 - '@typescript-eslint/utils': 8.28.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@eslint-react/ast': 1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@eslint-react/eff': 1.48.3 + '@typescript-eslint/scope-manager': 8.30.1 + '@typescript-eslint/types': 8.30.1 + '@typescript-eslint/utils': 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) string-ts: 2.2.1 - ts-pattern: 5.6.2 + ts-pattern: 5.7.0 transitivePeerDependencies: - eslint - supports-color @@ -17765,8 +17679,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.23.0': {} - '@eslint/js@9.24.0': {} '@eslint/object-schema@2.1.6': {} @@ -17792,14 +17704,14 @@ snapshots: dependencies: uuid: 8.3.2 - '@expo/cli@0.22.24(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(utf-8-validate@6.0.5)': + '@expo/cli@0.22.26(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(utf-8-validate@6.0.5)': dependencies: '@0no-co/graphql.web': 1.1.2(graphql@16.8.1) '@babel/runtime': 7.27.0 '@expo/code-signing-certificates': 0.0.5 '@expo/config': 10.0.11 '@expo/config-plugins': 9.0.17 - '@expo/devcert': 1.1.4 + '@expo/devcert': 1.2.0 '@expo/env': 0.4.2 '@expo/image-utils': 0.6.5 '@expo/json-file': 9.0.2 @@ -17807,7 +17719,7 @@ snapshots: '@expo/osascript': 2.1.6 '@expo/package-manager': 1.7.2 '@expo/plist': 0.2.2 - '@expo/prebuild-config': 8.0.31 + '@expo/prebuild-config': 8.2.0 '@expo/rudder-sdk-node': 1.1.1(encoding@0.1.13) '@expo/spawn-async': 1.7.2 '@expo/ws-tunnel': 1.0.6 @@ -17882,14 +17794,14 @@ snapshots: dependencies: '@expo/config-types': 52.0.5 '@expo/json-file': 9.0.2 - '@expo/plist': 0.2.2 + '@expo/plist': 0.2.0 '@expo/sdk-runtime-versions': 1.0.0 chalk: 4.1.2 debug: 4.4.0(supports-color@8.1.1) getenv: 1.0.0 glob: 10.4.5 resolve-from: 5.0.0 - semver: 7.7.1 + semver: 7.5.4 slash: 3.0.0 slugify: 1.6.6 xcode: 3.0.1 @@ -17939,7 +17851,7 @@ snapshots: '@expo/config@10.0.6': dependencies: '@babel/code-frame': 7.10.4 - '@expo/config-plugins': 9.0.17 + '@expo/config-plugins': 9.0.12 '@expo/config-types': 52.0.5 '@expo/json-file': 9.0.2 deepmerge: 4.3.1 @@ -17954,20 +17866,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@expo/devcert@1.1.4': + '@expo/devcert@1.2.0': dependencies: - application-config-path: 0.1.1 - command-exists: 1.2.9 + '@expo/sudo-prompt': 9.3.2 debug: 3.2.7 - eol: 0.9.1 - get-port: 3.2.0 glob: 10.4.5 - lodash: 4.17.21 - mkdirp: 0.5.6 - password-prompt: 1.1.3 - sudo-prompt: 8.2.5 - tmp: 0.0.33 - tslib: 2.8.1 transitivePeerDependencies: - supports-color @@ -17976,7 +17879,7 @@ snapshots: '@expo/logger': 1.0.117 joi: 17.13.3 semver: 7.7.1 - zod: 3.24.2 + zod: 3.24.3 '@expo/eas-json@16.1.0': dependencies: @@ -18002,7 +17905,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@expo/env@1.0.0': + '@expo/env@1.0.3': dependencies: chalk: 4.1.2 debug: 4.4.0(supports-color@8.1.1) @@ -18144,25 +18047,25 @@ snapshots: base64-js: 1.5.1 xmlbuilder: 14.0.0 - '@expo/plugin-help@5.1.23(@types/node@22.14.0)(typescript@5.8.3)': + '@expo/plugin-help@5.1.23(@types/node@22.14.1)(typescript@5.8.3)': dependencies: - '@oclif/core': 2.16.0(@types/node@22.14.0)(typescript@5.8.3) + '@oclif/core': 2.16.0(@types/node@22.14.1)(typescript@5.8.3) transitivePeerDependencies: - '@swc/core' - '@swc/wasm' - '@types/node' - typescript - '@expo/plugin-warn-if-update-available@2.5.1(@types/node@22.14.0)(typescript@5.8.3)': + '@expo/plugin-warn-if-update-available@2.5.1(@types/node@22.14.1)(typescript@5.8.3)': dependencies: - '@oclif/core': 2.16.0(@types/node@22.14.0)(typescript@5.8.3) + '@oclif/core': 2.16.0(@types/node@22.14.1)(typescript@5.8.3) chalk: 4.1.2 debug: 4.4.0(supports-color@8.1.1) ejs: 3.1.10 fs-extra: 10.1.0 http-call: 5.3.0 - semver: 7.7.1 - tslib: 2.8.1 + semver: 7.5.4 + tslib: 2.6.2 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -18172,8 +18075,8 @@ snapshots: '@expo/prebuild-config@8.0.17': dependencies: - '@expo/config': 10.0.11 - '@expo/config-plugins': 9.0.17 + '@expo/config': 10.0.6 + '@expo/config-plugins': 9.0.12 '@expo/config-types': 52.0.5 '@expo/image-utils': 0.6.5 '@expo/json-file': 9.0.2 @@ -18202,7 +18105,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@expo/prebuild-config@8.0.31': + '@expo/prebuild-config@8.2.0': dependencies: '@expo/config': 10.0.11 '@expo/config-plugins': 9.0.17 @@ -18232,7 +18135,7 @@ snapshots: '@segment/loosely-validate-event': 2.0.0 fetch-retry: 4.1.1 md5: 2.3.0 - node-fetch: 2.7.0(encoding@0.1.13) + node-fetch: 2.6.7(encoding@0.1.13) remove-trailing-slash: 0.1.1 uuid: 8.3.2 transitivePeerDependencies: @@ -18250,20 +18153,24 @@ snapshots: '@expo/logger': 1.0.117 '@expo/spawn-async': 1.7.2 arg: 5.0.2 - fs-extra: 11.3.0 + fs-extra: 11.2.0 joi: 17.13.3 jsep: 1.4.0 lodash.clonedeep: 4.5.0 lodash.get: 4.4.2 this-file: 2.0.3 uuid: 9.0.1 - yaml: 2.7.1 + yaml: 2.6.0 + + '@expo/sudo-prompt@9.3.2': {} '@expo/timeago.js@1.0.0': {} - '@expo/vector-icons@14.0.4': + '@expo/vector-icons@14.1.0(expo-font@13.0.4(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)': dependencies: - prop-types: 15.8.1 + expo-font: 13.0.4(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) + react: 18.3.1 + react-native: 0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5) '@expo/ws-tunnel@1.0.6': {} @@ -18284,7 +18191,7 @@ snapshots: '@fastify/error@4.1.0': {} - '@fastify/fast-json-stringify-compiler@5.0.2': + '@fastify/fast-json-stringify-compiler@5.0.3': dependencies: fast-json-stringify: 6.0.1 @@ -18613,7 +18520,7 @@ snapshots: '@firebase/util': 1.10.3 '@firebase/webchannel-wrapper': 1.0.3 '@grpc/grpc-js': 1.9.15 - '@grpc/proto-loader': 0.7.13 + '@grpc/proto-loader': 0.7.14 tslib: 2.8.1 '@firebase/functions-compat@0.3.19(@firebase/app-compat@0.2.50)(@firebase/app@0.11.1)': @@ -18984,7 +18891,7 @@ snapshots: '@grpc/grpc-js@1.9.15': dependencies: '@grpc/proto-loader': 0.7.13 - '@types/node': 22.14.0 + '@types/node': 22.14.1 '@grpc/proto-loader@0.7.13': dependencies: @@ -18993,26 +18900,34 @@ snapshots: protobufjs: 7.4.0 yargs: 17.7.2 + '@grpc/proto-loader@0.7.14': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.3.2 + protobufjs: 7.5.0 + yargs: 17.7.2 + '@hapi/hoek@9.3.0': {} '@hapi/topo@5.1.0': dependencies: '@hapi/hoek': 9.3.0 - '@headlessui/react@2.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@headlessui/react@2.2.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@floating-ui/react': 0.26.28(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/focus': 3.20.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/interactions': 3.24.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/focus': 3.20.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/interactions': 3.25.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@tanstack/react-virtual': 3.13.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + use-sync-external-store: 1.5.0(react@18.3.1) '@hexagon/base64@1.1.28': {} - '@hono/node-server@1.14.0(hono@4.7.5(patch_hash=5c74c2d2afaa5880c13d75458dd26c84da568851691b1fb6de6d877c29936d05))': + '@hono/node-server@1.14.1(hono@4.7.6(patch_hash=5c74c2d2afaa5880c13d75458dd26c84da568851691b1fb6de6d877c29936d05))': dependencies: - hono: 4.7.5(patch_hash=5c74c2d2afaa5880c13d75458dd26c84da568851691b1fb6de6d877c29936d05) + hono: 4.7.6(patch_hash=5c74c2d2afaa5880c13d75458dd26c84da568851691b1fb6de6d877c29936d05) '@hookform/resolvers@4.1.3(react-hook-form@7.55.0(react@18.3.1))': dependencies: @@ -19034,11 +18949,11 @@ snapshots: '@hutson/parse-repository-url@5.0.0': {} - '@hyoban/eslint-plugin-tailwindcss@3.18.0(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.0)(typescript@5.8.3)))': + '@hyoban/eslint-plugin-tailwindcss@3.18.0(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3)))': dependencies: fast-glob: 3.3.3 postcss: 8.5.3 - tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@22.14.0)(typescript@5.8.3)) + tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3)) '@iconify-json/logos@1.2.4': dependencies: @@ -19048,7 +18963,7 @@ snapshots: dependencies: '@iconify/types': 2.0.0 - '@iconify-json/simple-icons@1.2.30': + '@iconify-json/simple-icons@1.2.32': dependencies: '@iconify/types': 2.0.0 @@ -19199,14 +19114,14 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.14.0 + '@types/node': 22.14.1 jest-mock: 29.7.0 '@jest/fake-timers@29.7.0': dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 22.14.0 + '@types/node': 22.14.1 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -19240,7 +19155,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 22.14.0 + '@types/node': 22.14.1 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -19401,16 +19316,16 @@ snapshots: '@mozilla/readability@0.6.0(patch_hash=61709486ef07e9c8175a4b3f19f1aa4e2a1a75a3c557643c574d6cdacd6dd959)': {} - '@napi-rs/wasm-runtime@0.2.7': + '@napi-rs/wasm-runtime@0.2.9': dependencies: - '@emnapi/core': 1.3.1 - '@emnapi/runtime': 1.4.0 + '@emnapi/core': 1.4.3 + '@emnapi/runtime': 1.4.3 '@tybys/wasm-util': 0.9.0 optional: true '@noble/ciphers@0.6.0': {} - '@noble/hashes@1.7.1': {} + '@noble/hashes@1.7.2': {} '@nodelib/fs.scandir@2.1.5': dependencies: @@ -19464,16 +19379,16 @@ snapshots: natural-orderby: 2.0.3 object-treeify: 1.1.33 password-prompt: 1.1.3 - semver: 7.7.1 + semver: 7.5.4 string-width: 4.2.3 strip-ansi: 6.0.1 supports-color: 8.1.1 supports-hyperlinks: 2.3.0 - tslib: 2.8.1 + tslib: 2.6.2 widest-line: 3.1.0 wrap-ansi: 7.0.0 - '@oclif/core@2.16.0(@types/node@22.14.0)(typescript@5.8.3)': + '@oclif/core@2.16.0(@types/node@22.14.1)(typescript@5.8.3)': dependencies: '@types/cli-progress': 3.11.6 ansi-escapes: 4.3.2 @@ -19498,8 +19413,8 @@ snapshots: strip-ansi: 6.0.1 supports-color: 8.1.1 supports-hyperlinks: 2.3.0 - ts-node: 10.9.2(@types/node@22.14.0)(typescript@5.8.3) - tslib: 2.8.1 + ts-node: 10.9.2(@types/node@22.14.1)(typescript@5.8.3) + tslib: 2.6.2 widest-line: 3.1.0 wordwrap: 1.0.0 wrap-ansi: 7.0.0 @@ -19511,9 +19426,9 @@ snapshots: '@oclif/linewrap@1.0.0': {} - '@oclif/plugin-autocomplete@2.3.10(@types/node@22.14.0)(typescript@5.8.3)': + '@oclif/plugin-autocomplete@2.3.10(@types/node@22.14.1)(typescript@5.8.3)': dependencies: - '@oclif/core': 2.16.0(@types/node@22.14.0)(typescript@5.8.3) + '@oclif/core': 2.16.0(@types/node@22.14.1)(typescript@5.8.3) chalk: 4.1.2 debug: 4.4.0(supports-color@8.1.1) transitivePeerDependencies: @@ -19645,7 +19560,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.30.0 + '@opentelemetry/semantic-conventions': 1.32.0 transitivePeerDependencies: - supports-color @@ -19654,7 +19569,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.30.0 + '@opentelemetry/semantic-conventions': 1.32.0 '@types/connect': 3.4.38 transitivePeerDependencies: - supports-color @@ -19671,7 +19586,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.30.0 + '@opentelemetry/semantic-conventions': 1.32.0 transitivePeerDependencies: - supports-color @@ -19680,7 +19595,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.30.0 + '@opentelemetry/semantic-conventions': 1.32.0 transitivePeerDependencies: - supports-color @@ -19711,7 +19626,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.30.0 + '@opentelemetry/semantic-conventions': 1.32.0 transitivePeerDependencies: - supports-color @@ -19731,7 +19646,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) '@opentelemetry/redis-common': 0.36.2 - '@opentelemetry/semantic-conventions': 1.30.0 + '@opentelemetry/semantic-conventions': 1.32.0 transitivePeerDependencies: - supports-color @@ -19739,7 +19654,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.30.0 + '@opentelemetry/semantic-conventions': 1.32.0 transitivePeerDependencies: - supports-color @@ -19747,7 +19662,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.30.0 + '@opentelemetry/semantic-conventions': 1.32.0 transitivePeerDependencies: - supports-color @@ -19756,7 +19671,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.30.0 + '@opentelemetry/semantic-conventions': 1.32.0 transitivePeerDependencies: - supports-color @@ -19771,7 +19686,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.30.0 + '@opentelemetry/semantic-conventions': 1.32.0 transitivePeerDependencies: - supports-color @@ -19780,7 +19695,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.30.0 + '@opentelemetry/semantic-conventions': 1.32.0 transitivePeerDependencies: - supports-color @@ -19788,7 +19703,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.30.0 + '@opentelemetry/semantic-conventions': 1.32.0 '@opentelemetry/sql-common': 0.40.1(@opentelemetry/api@1.9.0) transitivePeerDependencies: - supports-color @@ -19797,7 +19712,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.30.0 + '@opentelemetry/semantic-conventions': 1.32.0 '@types/mysql': 2.15.26 transitivePeerDependencies: - supports-color @@ -19807,7 +19722,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.30.0 + '@opentelemetry/semantic-conventions': 1.32.0 '@opentelemetry/sql-common': 0.40.1(@opentelemetry/api@1.9.0) '@types/pg': 8.6.1 '@types/pg-pool': 2.0.6 @@ -19819,7 +19734,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) '@opentelemetry/redis-common': 0.36.2 - '@opentelemetry/semantic-conventions': 1.30.0 + '@opentelemetry/semantic-conventions': 1.32.0 transitivePeerDependencies: - supports-color @@ -19827,7 +19742,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.30.0 + '@opentelemetry/semantic-conventions': 1.32.0 '@types/tedious': 4.0.14 transitivePeerDependencies: - supports-color @@ -19869,43 +19784,43 @@ snapshots: '@opentelemetry/semantic-conventions@1.28.0': {} - '@opentelemetry/semantic-conventions@1.30.0': {} + '@opentelemetry/semantic-conventions@1.32.0': {} '@opentelemetry/sql-common@0.40.1(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@peculiar/asn1-android@2.3.15': + '@peculiar/asn1-android@2.3.16': dependencies: '@peculiar/asn1-schema': 2.3.15 - asn1js: 3.0.5 + asn1js: 3.0.6 tslib: 2.8.1 '@peculiar/asn1-ecc@2.3.15': dependencies: '@peculiar/asn1-schema': 2.3.15 '@peculiar/asn1-x509': 2.3.15 - asn1js: 3.0.5 + asn1js: 3.0.6 tslib: 2.8.1 '@peculiar/asn1-rsa@2.3.15': dependencies: '@peculiar/asn1-schema': 2.3.15 '@peculiar/asn1-x509': 2.3.15 - asn1js: 3.0.5 + asn1js: 3.0.6 tslib: 2.8.1 '@peculiar/asn1-schema@2.3.15': dependencies: - asn1js: 3.0.5 + asn1js: 3.0.6 pvtsutils: 1.3.6 tslib: 2.8.1 '@peculiar/asn1-x509@2.3.15': dependencies: '@peculiar/asn1-schema': 2.3.15 - asn1js: 3.0.5 + asn1js: 3.0.6 pvtsutils: 1.3.6 tslib: 2.8.1 @@ -19920,7 +19835,8 @@ snapshots: - electron-builder-squirrel-windows - supports-color - '@petamoriken/float16@3.9.2': {} + '@petamoriken/float16@3.9.2': + optional: true '@pivanov/utils@0.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -19932,7 +19848,7 @@ snapshots: '@pkgr/core@0.1.2': {} - '@pkgr/core@0.2.0': {} + '@pkgr/core@0.2.4': {} '@preact/signals-core@1.8.0': {} @@ -19975,53 +19891,53 @@ snapshots: dependencies: quansync: 0.2.10 - '@radix-ui/number@1.1.0': {} + '@radix-ui/number@1.1.1': {} - '@radix-ui/primitive@1.1.1': {} + '@radix-ui/primitive@1.1.2': {} - '@radix-ui/react-arrow@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-arrow@1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.12 '@types/react-dom': 18.3.1 - '@radix-ui/react-avatar@1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-avatar@1.1.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.12)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.12 '@types/react-dom': 18.3.1 - '@radix-ui/react-checkbox@1.1.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-checkbox@1.1.5(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-presence': 1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.1(@types/react@18.3.12)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.12 '@types/react-dom': 18.3.1 - '@radix-ui/react-collection@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-collection@1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.2.0(@types/react@18.3.12)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: @@ -20034,40 +19950,46 @@ snapshots: optionalDependencies: '@types/react': 18.3.12 - '@radix-ui/react-context-menu@2.2.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-compose-refs@1.1.2(@types/react@18.3.12)(react@18.3.1)': dependencies: - '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-menu': 2.1.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-context-menu@2.2.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-context': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-menu': 2.1.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.1(@types/react@18.3.12)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.12 '@types/react-dom': 18.3.1 - '@radix-ui/react-context@1.1.1(@types/react@18.3.12)(react@18.3.1)': + '@radix-ui/react-context@1.1.2(@types/react@18.3.12)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: '@types/react': 18.3.12 - '@radix-ui/react-dialog@1.1.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-dialog@1.1.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.5(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-portal': 1.1.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.2(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-portal': 1.1.5(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.2.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.1(@types/react@18.3.12)(react@18.3.1) aria-hidden: 1.2.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -20076,68 +19998,68 @@ snapshots: '@types/react': 18.3.12 '@types/react-dom': 18.3.1 - '@radix-ui/react-direction@1.1.0(@types/react@18.3.12)(react@18.3.1)': + '@radix-ui/react-direction@1.1.1(@types/react@18.3.12)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: '@types/react': 18.3.12 - '@radix-ui/react-dismissable-layer@1.1.5(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-dismissable-layer@1.1.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@18.3.12)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.12 '@types/react-dom': 18.3.1 - '@radix-ui/react-dropdown-menu@2.1.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-dropdown-menu@2.1.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-menu': 2.1.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-id': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-menu': 2.1.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.1(@types/react@18.3.12)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.12 '@types/react-dom': 18.3.1 - '@radix-ui/react-focus-guards@1.1.1(@types/react@18.3.12)(react@18.3.1)': + '@radix-ui/react-focus-guards@1.1.2(@types/react@18.3.12)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: '@types/react': 18.3.12 - '@radix-ui/react-focus-scope@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-focus-scope@1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.12)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.12 '@types/react-dom': 18.3.1 - '@radix-ui/react-hover-card@1.1.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-hover-card@1.1.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.5(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-popper': 1.2.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-popper': 1.2.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.5(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.1(@types/react@18.3.12)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: @@ -20151,33 +20073,40 @@ snapshots: optionalDependencies: '@types/react': 18.3.12 - '@radix-ui/react-label@2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-id@1.1.1(@types/react@18.3.12)(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-label@2.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.12 '@types/react-dom': 18.3.1 - '@radix-ui/react-menu@2.1.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-menu@2.1.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-collection': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.5(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-popper': 1.2.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-roving-focus': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.2(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-collection': 1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-direction': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-popper': 1.2.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.5(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.2.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.12)(react@18.3.1) aria-hidden: 1.2.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -20186,43 +20115,43 @@ snapshots: '@types/react': 18.3.12 '@types/react-dom': 18.3.1 - '@radix-ui/react-navigation-menu@1.2.5(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-navigation-menu@1.2.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-collection': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.5(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-collection': 1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-direction': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-presence': 1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.12 '@types/react-dom': 18.3.1 - '@radix-ui/react-popover@1.1.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-popover@1.1.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.5(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-popper': 1.2.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.2(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-popper': 1.2.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.5(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.2.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.1(@types/react@18.3.12)(react@18.3.1) aria-hidden: 1.2.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -20231,38 +20160,38 @@ snapshots: '@types/react': 18.3.12 '@types/react-dom': 18.3.1 - '@radix-ui/react-popper@1.2.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-popper@1.2.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-arrow': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-use-rect': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/rect': 1.1.0 + '@radix-ui/react-arrow': 1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-rect': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/rect': 1.1.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.12 '@types/react-dom': 18.3.1 - '@radix-ui/react-portal@1.1.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-portal@1.1.5(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.12)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.12 '@types/react-dom': 18.3.1 - '@radix-ui/react-presence@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-presence@1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.12)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: @@ -20278,79 +20207,88 @@ snapshots: '@types/react': 18.3.12 '@types/react-dom': 18.3.1 - '@radix-ui/react-radio-group@1.2.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-primitive@2.0.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-roving-focus': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-slot': 1.2.0(@types/react@18.3.12)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.12 '@types/react-dom': 18.3.1 - '@radix-ui/react-roving-focus@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-radio-group@1.2.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-collection': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-direction': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-presence': 1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.1(@types/react@18.3.12)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.12 '@types/react-dom': 18.3.1 - '@radix-ui/react-scroll-area@1.2.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-roving-focus@1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/number': 1.1.0 - '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-collection': 1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-direction': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-id': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.1(@types/react@18.3.12)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.12 '@types/react-dom': 18.3.1 - '@radix-ui/react-select@2.1.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-scroll-area@1.2.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/number': 1.1.0 - '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-collection': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.5(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-popper': 1.2.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.2(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/number': 1.1.1 + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-direction': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-presence': 1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-select@2.1.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/number': 1.1.1 + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-collection': 1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-direction': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-popper': 1.2.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.5(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.2.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) aria-hidden: 1.2.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -20359,19 +20297,19 @@ snapshots: '@types/react': 18.3.12 '@types/react-dom': 18.3.1 - '@radix-ui/react-slider@1.2.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-slider@1.2.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/number': 1.1.0 - '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-collection': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/number': 1.1.1 + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-collection': 1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-direction': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.1(@types/react@18.3.12)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: @@ -20385,93 +20323,100 @@ snapshots: optionalDependencies: '@types/react': 18.3.12 - '@radix-ui/react-switch@1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-slot@1.2.0(@types/react@18.3.12)(react@18.3.1)': dependencies: - '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-use-previous': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-switch@1.1.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.1(@types/react@18.3.12)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.12 '@types/react-dom': 18.3.1 - '@radix-ui/react-tabs@1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-tabs@1.1.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-direction': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-roving-focus': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-context': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-direction': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-id': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-presence': 1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.1(@types/react@18.3.12)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.12 '@types/react-dom': 18.3.1 - '@radix-ui/react-toast@1.2.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-toast@1.2.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-collection': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.5(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-collection': 1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.5(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.12 '@types/react-dom': 18.3.1 - '@radix-ui/react-tooltip@1.1.8(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-tooltip@1.2.0(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/primitive': 1.1.1 - '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-context': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.5(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-popper': 1.2.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.2(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-popper': 1.2.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.5(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.2.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.1.1(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.12 '@types/react-dom': 18.3.1 - '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.12)(react@18.3.1)': + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@18.3.12)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: '@types/react': 18.3.12 - '@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.12)(react@18.3.1)': + '@radix-ui/react-use-controllable-state@1.1.1(@types/react@18.3.12)(react@18.3.1)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.12)(react@18.3.1) react: 18.3.1 optionalDependencies: '@types/react': 18.3.12 - '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.12)(react@18.3.1)': + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@18.3.12)(react@18.3.1)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.12)(react@18.3.1) react: 18.3.1 optionalDependencies: '@types/react': 18.3.12 @@ -20482,69 +20427,75 @@ snapshots: optionalDependencies: '@types/react': 18.3.12 - '@radix-ui/react-use-previous@1.1.0(@types/react@18.3.12)(react@18.3.1)': + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@18.3.12)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: '@types/react': 18.3.12 - '@radix-ui/react-use-rect@1.1.0(@types/react@18.3.12)(react@18.3.1)': + '@radix-ui/react-use-previous@1.1.1(@types/react@18.3.12)(react@18.3.1)': dependencies: - '@radix-ui/rect': 1.1.0 react: 18.3.1 optionalDependencies: '@types/react': 18.3.12 - '@radix-ui/react-use-size@1.1.0(@types/react@18.3.12)(react@18.3.1)': + '@radix-ui/react-use-rect@1.1.1(@types/react@18.3.12)(react@18.3.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.12)(react@18.3.1) + '@radix-ui/rect': 1.1.1 react: 18.3.1 optionalDependencies: '@types/react': 18.3.12 - '@radix-ui/react-visually-hidden@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-use-size@1.1.1(@types/react@18.3.12)(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.12)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-visually-hidden@1.1.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: '@types/react': 18.3.12 '@types/react-dom': 18.3.1 - '@radix-ui/rect@1.1.0': {} + '@radix-ui/rect@1.1.1': {} - '@react-aria/focus@3.20.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-aria/focus@3.20.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@react-aria/interactions': 3.24.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-aria/utils': 3.28.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-types/shared': 3.28.0(react@18.3.1) - '@swc/helpers': 0.5.15 + '@react-aria/interactions': 3.25.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-aria/utils': 3.28.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-types/shared': 3.29.0(react@18.3.1) + '@swc/helpers': 0.5.17 clsx: 2.1.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@react-aria/interactions@3.24.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-aria/interactions@3.25.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@react-aria/ssr': 3.9.7(react@18.3.1) - '@react-aria/utils': 3.28.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-stately/flags': 3.1.0 - '@react-types/shared': 3.28.0(react@18.3.1) - '@swc/helpers': 0.5.15 + '@react-aria/ssr': 3.9.8(react@18.3.1) + '@react-aria/utils': 3.28.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-stately/flags': 3.1.1 + '@react-types/shared': 3.29.0(react@18.3.1) + '@swc/helpers': 0.5.17 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@react-aria/ssr@3.9.7(react@18.3.1)': + '@react-aria/ssr@3.9.8(react@18.3.1)': dependencies: - '@swc/helpers': 0.5.15 + '@swc/helpers': 0.5.17 react: 18.3.1 - '@react-aria/utils@3.28.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-aria/utils@3.28.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@react-aria/ssr': 3.9.7(react@18.3.1) - '@react-stately/flags': 3.1.0 - '@react-stately/utils': 3.10.5(react@18.3.1) - '@react-types/shared': 3.28.0(react@18.3.1) - '@swc/helpers': 0.5.15 + '@react-aria/ssr': 3.9.8(react@18.3.1) + '@react-stately/flags': 3.1.1 + '@react-stately/utils': 3.10.6(react@18.3.1) + '@react-types/shared': 3.29.0(react@18.3.1) + '@swc/helpers': 0.5.17 clsx: 2.1.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -20588,39 +20539,39 @@ snapshots: optionalDependencies: react-native: 0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5) - '@react-native-firebase/analytics@21.13.0(@react-native-firebase/app@21.13.0(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))': + '@react-native-firebase/analytics@21.14.0(@react-native-firebase/app@21.14.0(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))': dependencies: - '@react-native-firebase/app': 21.13.0(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) + '@react-native-firebase/app': 21.14.0(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) superstruct: 2.0.2 - '@react-native-firebase/app-check@21.13.0(2511037f97ab10cd056affaf5ecb511d)': + '@react-native-firebase/app-check@21.14.0(21fb7edb71e7d0731f9ddb20f02a89c2)': dependencies: - '@react-native-firebase/app': 21.13.0(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) + '@react-native-firebase/app': 21.14.0(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) optionalDependencies: - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) - '@react-native-firebase/app@21.13.0(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)': + '@react-native-firebase/app@21.14.0(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)': dependencies: firebase: 11.3.1 react: 18.3.1 react-native: 0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5) optionalDependencies: - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) transitivePeerDependencies: - '@react-native-async-storage/async-storage' - '@react-native-firebase/crashlytics@21.13.0(2511037f97ab10cd056affaf5ecb511d)': + '@react-native-firebase/crashlytics@21.14.0(21fb7edb71e7d0731f9ddb20f02a89c2)': dependencies: - '@react-native-firebase/app': 21.13.0(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) + '@react-native-firebase/app': 21.14.0(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) stacktrace-js: 2.0.2 optionalDependencies: - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) - '@react-native-firebase/messaging@21.13.0(2511037f97ab10cd056affaf5ecb511d)': + '@react-native-firebase/messaging@21.14.0(21fb7edb71e7d0731f9ddb20f02a89c2)': dependencies: - '@react-native-firebase/app': 21.13.0(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) + '@react-native-firebase/app': 21.14.0(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) optionalDependencies: - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) '@react-native-masked-view/masked-view@0.3.2(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)': dependencies: @@ -20879,16 +20830,16 @@ snapshots: optionalDependencies: '@types/react': 18.3.12 - '@react-stately/flags@3.1.0': + '@react-stately/flags@3.1.1': dependencies: - '@swc/helpers': 0.5.15 + '@swc/helpers': 0.5.17 - '@react-stately/utils@3.10.5(react@18.3.1)': + '@react-stately/utils@3.10.6(react@18.3.1)': dependencies: - '@swc/helpers': 0.5.15 + '@swc/helpers': 0.5.17 react: 18.3.1 - '@react-types/shared@3.28.0(react@18.3.1)': + '@react-types/shared@3.29.0(react@18.3.1)': dependencies: react: 18.3.1 @@ -20993,132 +20944,132 @@ snapshots: optionalDependencies: rollup: 2.79.2 - '@rollup/pluginutils@5.1.4(rollup@4.39.0)': + '@rollup/pluginutils@5.1.4(rollup@4.40.0)': dependencies: '@types/estree': 1.0.7 estree-walker: 2.0.2 picomatch: 4.0.2 optionalDependencies: - rollup: 4.39.0 + rollup: 4.40.0 '@rollup/rollup-android-arm-eabi@4.37.0': optional: true - '@rollup/rollup-android-arm-eabi@4.39.0': + '@rollup/rollup-android-arm-eabi@4.40.0': optional: true '@rollup/rollup-android-arm64@4.37.0': optional: true - '@rollup/rollup-android-arm64@4.39.0': + '@rollup/rollup-android-arm64@4.40.0': optional: true '@rollup/rollup-darwin-arm64@4.37.0': optional: true - '@rollup/rollup-darwin-arm64@4.39.0': + '@rollup/rollup-darwin-arm64@4.40.0': optional: true '@rollup/rollup-darwin-x64@4.37.0': optional: true - '@rollup/rollup-darwin-x64@4.39.0': + '@rollup/rollup-darwin-x64@4.40.0': optional: true '@rollup/rollup-freebsd-arm64@4.37.0': optional: true - '@rollup/rollup-freebsd-arm64@4.39.0': + '@rollup/rollup-freebsd-arm64@4.40.0': optional: true '@rollup/rollup-freebsd-x64@4.37.0': optional: true - '@rollup/rollup-freebsd-x64@4.39.0': + '@rollup/rollup-freebsd-x64@4.40.0': optional: true '@rollup/rollup-linux-arm-gnueabihf@4.37.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.39.0': + '@rollup/rollup-linux-arm-gnueabihf@4.40.0': optional: true '@rollup/rollup-linux-arm-musleabihf@4.37.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.39.0': + '@rollup/rollup-linux-arm-musleabihf@4.40.0': optional: true '@rollup/rollup-linux-arm64-gnu@4.37.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.39.0': + '@rollup/rollup-linux-arm64-gnu@4.40.0': optional: true '@rollup/rollup-linux-arm64-musl@4.37.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.39.0': + '@rollup/rollup-linux-arm64-musl@4.40.0': optional: true '@rollup/rollup-linux-loongarch64-gnu@4.37.0': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.39.0': + '@rollup/rollup-linux-loongarch64-gnu@4.40.0': optional: true '@rollup/rollup-linux-powerpc64le-gnu@4.37.0': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.39.0': + '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': optional: true '@rollup/rollup-linux-riscv64-gnu@4.37.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.39.0': + '@rollup/rollup-linux-riscv64-gnu@4.40.0': optional: true '@rollup/rollup-linux-riscv64-musl@4.37.0': optional: true - '@rollup/rollup-linux-riscv64-musl@4.39.0': + '@rollup/rollup-linux-riscv64-musl@4.40.0': optional: true '@rollup/rollup-linux-s390x-gnu@4.37.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.39.0': + '@rollup/rollup-linux-s390x-gnu@4.40.0': optional: true '@rollup/rollup-linux-x64-gnu@4.37.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.39.0': + '@rollup/rollup-linux-x64-gnu@4.40.0': optional: true '@rollup/rollup-linux-x64-musl@4.37.0': optional: true - '@rollup/rollup-linux-x64-musl@4.39.0': + '@rollup/rollup-linux-x64-musl@4.40.0': optional: true '@rollup/rollup-win32-arm64-msvc@4.37.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.39.0': + '@rollup/rollup-win32-arm64-msvc@4.40.0': optional: true '@rollup/rollup-win32-ia32-msvc@4.37.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.39.0': + '@rollup/rollup-win32-ia32-msvc@4.40.0': optional: true '@rollup/rollup-win32-x64-msvc@4.37.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.39.0': + '@rollup/rollup-win32-x64-msvc@4.40.0': optional: true '@scena/dragscroll@1.4.0': @@ -21143,51 +21094,43 @@ snapshots: component-type: 1.2.2 join-component: 1.1.0 - '@sentry-internal/browser-utils@9.10.1': - dependencies: - '@sentry/core': 9.10.1 - '@sentry-internal/browser-utils@9.11.0': dependencies: '@sentry/core': 9.11.0 - '@sentry-internal/feedback@9.10.1': + '@sentry-internal/browser-utils@9.13.0': dependencies: - '@sentry/core': 9.10.1 + '@sentry/core': 9.13.0 '@sentry-internal/feedback@9.11.0': dependencies: '@sentry/core': 9.11.0 - '@sentry-internal/replay-canvas@9.10.1': + '@sentry-internal/feedback@9.13.0': dependencies: - '@sentry-internal/replay': 9.10.1 - '@sentry/core': 9.10.1 + '@sentry/core': 9.13.0 '@sentry-internal/replay-canvas@9.11.0': dependencies: '@sentry-internal/replay': 9.11.0 '@sentry/core': 9.11.0 - '@sentry-internal/replay@9.10.1': + '@sentry-internal/replay-canvas@9.13.0': dependencies: - '@sentry-internal/browser-utils': 9.10.1 - '@sentry/core': 9.10.1 + '@sentry-internal/replay': 9.13.0 + '@sentry/core': 9.13.0 '@sentry-internal/replay@9.11.0': dependencies: '@sentry-internal/browser-utils': 9.11.0 '@sentry/core': 9.11.0 - '@sentry/babel-plugin-component-annotate@3.3.1': {} - - '@sentry/browser@9.10.1': + '@sentry-internal/replay@9.13.0': dependencies: - '@sentry-internal/browser-utils': 9.10.1 - '@sentry-internal/feedback': 9.10.1 - '@sentry-internal/replay': 9.10.1 - '@sentry-internal/replay-canvas': 9.10.1 - '@sentry/core': 9.10.1 + '@sentry-internal/browser-utils': 9.13.0 + '@sentry/core': 9.13.0 + + '@sentry/babel-plugin-component-annotate@3.3.1': {} '@sentry/browser@9.11.0': dependencies: @@ -21197,12 +21140,20 @@ snapshots: '@sentry-internal/replay-canvas': 9.11.0 '@sentry/core': 9.11.0 + '@sentry/browser@9.13.0': + dependencies: + '@sentry-internal/browser-utils': 9.13.0 + '@sentry-internal/feedback': 9.13.0 + '@sentry-internal/replay': 9.13.0 + '@sentry-internal/replay-canvas': 9.13.0 + '@sentry/core': 9.13.0 + '@sentry/bundler-plugin-core@3.3.1(encoding@0.1.13)': dependencies: '@babel/core': 7.26.10 '@sentry/babel-plugin-component-annotate': 3.3.1 '@sentry/cli': 2.42.2(encoding@0.1.13) - dotenv: 16.4.7 + dotenv: 16.5.0 find-up: 5.0.0 glob: 9.3.5 magic-string: 0.30.8 @@ -21251,20 +21202,20 @@ snapshots: - encoding - supports-color - '@sentry/core@9.10.1': {} - '@sentry/core@9.11.0': {} - '@sentry/electron@6.4.0': + '@sentry/core@9.13.0': {} + + '@sentry/electron@6.5.0': dependencies: - '@sentry/browser': 9.10.1 - '@sentry/core': 9.10.1 - '@sentry/node': 9.10.1 + '@sentry/browser': 9.11.0 + '@sentry/core': 9.11.0 + '@sentry/node': 9.11.0 deepmerge: 4.3.1 transitivePeerDependencies: - supports-color - '@sentry/node@9.10.1': + '@sentry/node@9.11.0': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/context-async-hooks': 1.30.1(@opentelemetry/api@1.9.0) @@ -21295,28 +21246,28 @@ snapshots: '@opentelemetry/instrumentation-undici': 0.10.1(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.30.0 + '@opentelemetry/semantic-conventions': 1.32.0 '@prisma/instrumentation': 6.5.0(@opentelemetry/api@1.9.0) - '@sentry/core': 9.10.1 - '@sentry/opentelemetry': 9.10.1(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.30.0) + '@sentry/core': 9.11.0 + '@sentry/opentelemetry': 9.11.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.32.0) import-in-the-middle: 1.13.1 transitivePeerDependencies: - supports-color - '@sentry/opentelemetry@9.10.1(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.30.0)': + '@sentry/opentelemetry@9.11.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.32.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/context-async-hooks': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.30.0 - '@sentry/core': 9.10.1 - - '@sentry/react@9.11.0(react@18.3.1)': - dependencies: - '@sentry/browser': 9.11.0 + '@opentelemetry/semantic-conventions': 1.32.0 '@sentry/core': 9.11.0 + + '@sentry/react@9.13.0(react@18.3.1)': + dependencies: + '@sentry/browser': 9.13.0 + '@sentry/core': 9.13.0 hoist-non-react-statics: 3.3.2 react: 18.3.1 @@ -21328,50 +21279,50 @@ snapshots: - encoding - supports-color - '@shikijs/core@3.2.1': + '@shikijs/core@3.2.2': dependencies: - '@shikijs/types': 3.2.1 + '@shikijs/types': 3.2.2 '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 hast-util-to-html: 9.0.5 - '@shikijs/engine-javascript@3.2.1': + '@shikijs/engine-javascript@3.2.2': dependencies: - '@shikijs/types': 3.2.1 + '@shikijs/types': 3.2.2 '@shikijs/vscode-textmate': 10.0.2 oniguruma-to-es: 4.1.0 - '@shikijs/engine-oniguruma@3.2.1': + '@shikijs/engine-oniguruma@3.2.2': dependencies: - '@shikijs/types': 3.2.1 + '@shikijs/types': 3.2.2 '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/langs@3.2.1': + '@shikijs/langs@3.2.2': dependencies: - '@shikijs/types': 3.2.1 + '@shikijs/types': 3.2.2 - '@shikijs/themes@3.2.1': + '@shikijs/themes@3.2.2': dependencies: - '@shikijs/types': 3.2.1 + '@shikijs/types': 3.2.2 - '@shikijs/transformers@3.2.1': + '@shikijs/transformers@3.2.2': dependencies: - '@shikijs/core': 3.2.1 - '@shikijs/types': 3.2.1 + '@shikijs/core': 3.2.2 + '@shikijs/types': 3.2.2 - '@shikijs/types@3.2.1': + '@shikijs/types@3.2.2': dependencies: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 '@shikijs/vscode-textmate@10.0.2': {} - '@shopify/flash-list@1.7.3(@babel/runtime@7.27.0)(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)': + '@shopify/flash-list@1.8.0(@babel/runtime@7.27.0)(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)': dependencies: '@babel/runtime': 7.27.0 react: 18.3.1 react-native: 0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5) - recyclerlistview: 4.2.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) + recyclerlistview: 4.2.3(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) tslib: 2.8.1 '@shuding/opentype.js@1.4.0-beta.0': @@ -21393,7 +21344,7 @@ snapshots: dependencies: '@hexagon/base64': 1.1.28 '@levischuck/tiny-cbor': 0.2.11 - '@peculiar/asn1-android': 2.3.15 + '@peculiar/asn1-android': 2.3.16 '@peculiar/asn1-ecc': 2.3.15 '@peculiar/asn1-rsa': 2.3.15 '@peculiar/asn1-schema': 2.3.15 @@ -21415,7 +21366,7 @@ snapshots: '@stylistic/eslint-plugin@4.2.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: - '@typescript-eslint/utils': 8.28.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) eslint: 9.24.0(jiti@2.4.2) eslint-visitor-keys: 4.2.0 espree: 10.3.0 @@ -21432,7 +21383,7 @@ snapshots: magic-string: 0.25.9 string.prototype.matchall: 4.0.12 - '@swc/helpers@0.5.15': + '@swc/helpers@0.5.17': dependencies: tslib: 2.8.1 @@ -21440,50 +21391,50 @@ snapshots: dependencies: defer-to-connect: 2.0.1 - '@t3-oss/env-core@0.12.0(typescript@5.8.3)(valibot@1.0.0-beta.15(typescript@5.8.3))(zod@3.24.2)': + '@t3-oss/env-core@0.12.0(typescript@5.8.3)(valibot@1.0.0-beta.15(typescript@5.8.3))(zod@3.24.3)': optionalDependencies: typescript: 5.8.3 valibot: 1.0.0-beta.15(typescript@5.8.3) - zod: 3.24.2 + zod: 3.24.3 - '@tailwindcss/container-queries@0.1.1(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.0)(typescript@5.8.3)))': + '@tailwindcss/container-queries@0.1.1(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3)))': dependencies: - tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@22.14.0)(typescript@5.8.3)) + tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3)) - '@tailwindcss/typography@0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.0)(typescript@5.8.3)))': + '@tailwindcss/typography@0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3)))': dependencies: lodash.castarray: 4.4.0 lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 - tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@22.14.0)(typescript@5.8.3)) + tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3)) '@tanstack/query-core@5.69.0': optional: true - '@tanstack/query-core@5.71.10': {} + '@tanstack/query-core@5.74.4': {} - '@tanstack/query-devtools@5.71.5': {} + '@tanstack/query-devtools@5.73.3': {} - '@tanstack/query-persist-client-core@5.71.10': + '@tanstack/query-persist-client-core@5.74.4': dependencies: - '@tanstack/query-core': 5.71.10 + '@tanstack/query-core': 5.74.4 - '@tanstack/query-sync-storage-persister@5.71.10': + '@tanstack/query-sync-storage-persister@5.74.4': dependencies: - '@tanstack/query-core': 5.71.10 - '@tanstack/query-persist-client-core': 5.71.10 + '@tanstack/query-core': 5.74.4 + '@tanstack/query-persist-client-core': 5.74.4 - '@tanstack/react-query-devtools@5.71.10(@tanstack/react-query@5.71.10(react@18.3.1))(react@18.3.1)': + '@tanstack/react-query-devtools@5.74.4(@tanstack/react-query@5.74.4(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/query-devtools': 5.71.5 - '@tanstack/react-query': 5.71.10(react@18.3.1) + '@tanstack/query-devtools': 5.73.3 + '@tanstack/react-query': 5.74.4(react@18.3.1) react: 18.3.1 - '@tanstack/react-query-persist-client@5.71.10(@tanstack/react-query@5.71.10(react@18.3.1))(react@18.3.1)': + '@tanstack/react-query-persist-client@5.74.4(@tanstack/react-query@5.74.4(react@18.3.1))(react@18.3.1)': dependencies: - '@tanstack/query-persist-client-core': 5.71.10 - '@tanstack/react-query': 5.71.10(react@18.3.1) + '@tanstack/query-persist-client-core': 5.74.4 + '@tanstack/react-query': 5.74.4(react@18.3.1) react: 18.3.1 '@tanstack/react-query@5.69.0(react@18.3.1)': @@ -21492,9 +21443,9 @@ snapshots: react: 18.3.1 optional: true - '@tanstack/react-query@5.71.10(react@18.3.1)': + '@tanstack/react-query@5.74.4(react@18.3.1)': dependencies: - '@tanstack/query-core': 5.71.10 + '@tanstack/query-core': 5.74.4 react: 18.3.1 '@tanstack/react-virtual@3.13.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': @@ -21570,18 +21521,18 @@ snapshots: '@types/appdmg@0.5.5': dependencies: - '@types/node': 22.14.0 + '@types/node': 22.14.1 optional: true '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.27.0 '@babel/types': 7.27.0 - '@types/babel__generator': 7.6.8 + '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.7 - '@types/babel__generator@7.6.8': + '@types/babel__generator@7.27.0': dependencies: '@babel/types': 7.27.0 @@ -21596,24 +21547,22 @@ snapshots: '@types/bunyan@1.8.11': dependencies: - '@types/node': 22.14.0 + '@types/node': 22.14.1 '@types/cacheable-request@6.0.3': dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 - '@types/node': 22.14.0 + '@types/node': 22.14.1 '@types/responselike': 1.0.3 '@types/cli-progress@3.11.6': dependencies: - '@types/node': 22.14.0 + '@types/node': 22.14.1 '@types/connect@3.4.38': dependencies: - '@types/node': 22.14.0 - - '@types/cookie@0.6.0': {} + '@types/node': 22.14.1 '@types/debug@4.1.12': dependencies: @@ -21638,11 +21587,11 @@ snapshots: '@types/fs-extra@9.0.13': dependencies: - '@types/node': 22.14.0 + '@types/node': 22.14.1 '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 22.14.0 + '@types/node': 22.14.1 '@types/hammerjs@2.0.46': {} @@ -21677,7 +21626,7 @@ snapshots: '@types/keyv@3.1.4': dependencies: - '@types/node': 22.14.0 + '@types/node': 22.14.1 '@types/lodash@4.17.16': {} @@ -21689,11 +21638,11 @@ snapshots: '@types/mysql@2.15.26': dependencies: - '@types/node': 22.14.0 + '@types/node': 22.14.1 '@types/node-forge@1.3.11': dependencies: - '@types/node': 22.14.0 + '@types/node': 22.14.1 '@types/node@10.17.60': {} @@ -21705,7 +21654,7 @@ snapshots: dependencies: undici-types: 6.19.8 - '@types/node@22.14.0': + '@types/node@22.14.1': dependencies: undici-types: 6.21.0 @@ -21717,13 +21666,13 @@ snapshots: '@types/pg@8.6.1': dependencies: - '@types/node': 22.14.0 + '@types/node': 22.14.1 pg-protocol: 1.8.0 pg-types: 2.2.0 '@types/plist@3.0.5': dependencies: - '@types/node': 22.14.0 + '@types/node': 22.14.1 xmlbuilder: 15.1.1 optional: true @@ -21731,7 +21680,7 @@ snapshots: '@types/qrcode@1.5.5': dependencies: - '@types/node': 22.14.0 + '@types/node': 22.14.1 '@types/react-dom@18.3.1': dependencies: @@ -21754,9 +21703,9 @@ snapshots: '@types/responselike@1.0.3': dependencies: - '@types/node': 22.14.0 + '@types/node': 22.14.1 - '@types/semver@7.5.8': {} + '@types/semver@7.7.0': {} '@types/shimmer@1.2.0': {} @@ -21764,12 +21713,12 @@ snapshots: '@types/tar@6.1.13': dependencies: - '@types/node': 22.14.0 + '@types/node': 22.14.1 minipass: 4.2.8 '@types/tedious@4.0.14': dependencies: - '@types/node': 22.14.0 + '@types/node': 22.14.1 '@types/trusted-types@2.0.7': {} @@ -21788,17 +21737,17 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 22.14.0 + '@types/node': 22.14.1 optional: true - '@typescript-eslint/eslint-plugin@8.28.0(@typescript-eslint/parser@8.28.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.30.1(@typescript-eslint/parser@8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.28.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.28.0 - '@typescript-eslint/type-utils': 8.28.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/utils': 8.28.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.28.0 + '@typescript-eslint/parser': 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.30.1 + '@typescript-eslint/type-utils': 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.30.1 eslint: 9.24.0(jiti@2.4.2) graphemer: 1.4.0 ignore: 5.3.2 @@ -21820,15 +21769,32 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/parser@8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.30.1 + '@typescript-eslint/types': 8.30.1 + '@typescript-eslint/typescript-estree': 8.30.1(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.30.1 + debug: 4.4.0(supports-color@8.1.1) + eslint: 9.24.0(jiti@2.4.2) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/scope-manager@8.28.0': dependencies: '@typescript-eslint/types': 8.28.0 '@typescript-eslint/visitor-keys': 8.28.0 - '@typescript-eslint/type-utils@8.28.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/scope-manager@8.30.1': dependencies: - '@typescript-eslint/typescript-estree': 8.28.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.28.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/types': 8.30.1 + '@typescript-eslint/visitor-keys': 8.30.1 + + '@typescript-eslint/type-utils@8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': + dependencies: + '@typescript-eslint/typescript-estree': 8.30.1(typescript@5.8.3) + '@typescript-eslint/utils': 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) debug: 4.4.0(supports-color@8.1.1) eslint: 9.24.0(jiti@2.4.2) ts-api-utils: 2.1.0(typescript@5.8.3) @@ -21838,6 +21804,8 @@ snapshots: '@typescript-eslint/types@8.28.0': {} + '@typescript-eslint/types@8.30.1': {} + '@typescript-eslint/typescript-estree@8.28.0(typescript@5.8.3)': dependencies: '@typescript-eslint/types': 8.28.0 @@ -21852,12 +21820,26 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.28.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@8.30.1(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@9.24.0(jiti@2.4.2)) - '@typescript-eslint/scope-manager': 8.28.0 - '@typescript-eslint/types': 8.28.0 - '@typescript-eslint/typescript-estree': 8.28.0(typescript@5.8.3) + '@typescript-eslint/types': 8.30.1 + '@typescript-eslint/visitor-keys': 8.30.1 + debug: 4.4.0(supports-color@8.1.1) + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.1 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': + dependencies: + '@eslint-community/eslint-utils': 4.6.1(eslint@9.24.0(jiti@2.4.2)) + '@typescript-eslint/scope-manager': 8.30.1 + '@typescript-eslint/types': 8.30.1 + '@typescript-eslint/typescript-estree': 8.30.1(typescript@5.8.3) eslint: 9.24.0(jiti@2.4.2) typescript: 5.8.3 transitivePeerDependencies: @@ -21868,29 +21850,34 @@ snapshots: '@typescript-eslint/types': 8.28.0 eslint-visitor-keys: 4.2.0 + '@typescript-eslint/visitor-keys@8.30.1': + dependencies: + '@typescript-eslint/types': 8.30.1 + eslint-visitor-keys: 4.2.0 + '@ungap/structured-clone@1.3.0': {} - '@unocss/config@66.1.0-beta.7': + '@unocss/config@66.1.0-beta.11': dependencies: - '@unocss/core': 66.1.0-beta.7 + '@unocss/core': 66.1.0-beta.11 unconfig: 7.3.1 - '@unocss/core@66.1.0-beta.7': {} + '@unocss/core@66.1.0-beta.11': {} - '@unocss/eslint-config@66.1.0-beta.7(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': + '@unocss/eslint-config@66.1.0-beta.11(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: - '@unocss/eslint-plugin': 66.1.0-beta.7(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@unocss/eslint-plugin': 66.1.0-beta.11(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) transitivePeerDependencies: - eslint - supports-color - typescript - '@unocss/eslint-plugin@66.1.0-beta.7(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': + '@unocss/eslint-plugin@66.1.0-beta.11(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: - '@typescript-eslint/utils': 8.28.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@unocss/config': 66.1.0-beta.7 - '@unocss/core': 66.1.0-beta.7 - '@unocss/rule-utils': 66.1.0-beta.7 + '@typescript-eslint/utils': 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@unocss/config': 66.1.0-beta.11 + '@unocss/core': 66.1.0-beta.11 + '@unocss/rule-utils': 66.1.0-beta.11 magic-string: 0.30.17 synckit: 0.9.2 transitivePeerDependencies: @@ -21898,56 +21885,59 @@ snapshots: - supports-color - typescript - '@unocss/rule-utils@66.1.0-beta.7': + '@unocss/rule-utils@66.1.0-beta.11': dependencies: - '@unocss/core': 66.1.0-beta.7 + '@unocss/core': 66.1.0-beta.11 magic-string: 0.30.17 - '@unrs/rspack-resolver-binding-darwin-arm64@1.3.0': + '@unrs/resolver-binding-darwin-arm64@1.5.0': optional: true - '@unrs/rspack-resolver-binding-darwin-x64@1.3.0': + '@unrs/resolver-binding-darwin-x64@1.5.0': optional: true - '@unrs/rspack-resolver-binding-freebsd-x64@1.3.0': + '@unrs/resolver-binding-freebsd-x64@1.5.0': optional: true - '@unrs/rspack-resolver-binding-linux-arm-gnueabihf@1.3.0': + '@unrs/resolver-binding-linux-arm-gnueabihf@1.5.0': optional: true - '@unrs/rspack-resolver-binding-linux-arm-musleabihf@1.3.0': + '@unrs/resolver-binding-linux-arm-musleabihf@1.5.0': optional: true - '@unrs/rspack-resolver-binding-linux-arm64-gnu@1.3.0': + '@unrs/resolver-binding-linux-arm64-gnu@1.5.0': optional: true - '@unrs/rspack-resolver-binding-linux-arm64-musl@1.3.0': + '@unrs/resolver-binding-linux-arm64-musl@1.5.0': optional: true - '@unrs/rspack-resolver-binding-linux-ppc64-gnu@1.3.0': + '@unrs/resolver-binding-linux-ppc64-gnu@1.5.0': optional: true - '@unrs/rspack-resolver-binding-linux-s390x-gnu@1.3.0': + '@unrs/resolver-binding-linux-riscv64-gnu@1.5.0': optional: true - '@unrs/rspack-resolver-binding-linux-x64-gnu@1.3.0': + '@unrs/resolver-binding-linux-s390x-gnu@1.5.0': optional: true - '@unrs/rspack-resolver-binding-linux-x64-musl@1.3.0': + '@unrs/resolver-binding-linux-x64-gnu@1.5.0': optional: true - '@unrs/rspack-resolver-binding-wasm32-wasi@1.3.0': + '@unrs/resolver-binding-linux-x64-musl@1.5.0': + optional: true + + '@unrs/resolver-binding-wasm32-wasi@1.5.0': dependencies: - '@napi-rs/wasm-runtime': 0.2.7 + '@napi-rs/wasm-runtime': 0.2.9 optional: true - '@unrs/rspack-resolver-binding-win32-arm64-msvc@1.3.0': + '@unrs/resolver-binding-win32-arm64-msvc@1.5.0': optional: true - '@unrs/rspack-resolver-binding-win32-ia32-msvc@1.3.0': + '@unrs/resolver-binding-win32-ia32-msvc@1.5.0': optional: true - '@unrs/rspack-resolver-binding-win32-x64-msvc@1.3.0': + '@unrs/resolver-binding-win32-x64-msvc@1.5.0': optional: true '@urql/core@4.0.11(graphql@16.8.1)': @@ -21966,7 +21956,7 @@ snapshots: '@urql/exchange-retry@1.2.0(graphql@16.8.1)': dependencies: - '@urql/core': 5.1.1(graphql@16.8.1) + '@urql/core': 4.0.11(graphql@16.8.1) wonka: 6.3.5 transitivePeerDependencies: - graphql @@ -22051,7 +22041,7 @@ snapshots: sharp-ico: 0.1.5 unconfig: 7.3.1 - '@vitejs/plugin-legacy@6.0.2(terser@5.39.0)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))': + '@vitejs/plugin-legacy@6.1.0(terser@5.39.0)(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))': dependencies: '@babel/core': 7.26.10 '@babel/preset-env': 7.26.9(@babel/core@7.26.10) @@ -22062,18 +22052,18 @@ snapshots: regenerator-runtime: 0.14.1 systemjs: 6.15.1 terser: 5.39.0 - vite: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1) + vite: 6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1) transitivePeerDependencies: - supports-color - '@vitejs/plugin-react@4.3.4(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))': + '@vitejs/plugin-react@4.4.0(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))': dependencies: '@babel/core': 7.26.10 '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.10) '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.10) '@types/babel__core': 7.20.5 - react-refresh: 0.14.2 - vite: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1) + react-refresh: 0.17.0 + vite: 6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1) transitivePeerDependencies: - supports-color @@ -22084,13 +22074,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.1.1(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))': + '@vitest/mocker@3.1.1(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))': dependencies: '@vitest/spy': 3.1.1 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1) + vite: 6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1) '@vitest/pretty-format@3.1.1': dependencies: @@ -22146,6 +22136,12 @@ snapshots: dependencies: '@yornaath/batshit-devtools': 1.7.1 + '@zod/core@0.6.2': {} + + '@zod/mini@4.0.0-beta.20250417T043022': + dependencies: + '@zod/core': 0.6.2 + abab@2.0.6: optional: true @@ -22345,8 +22341,6 @@ snapshots: apple-uikit-colors@0.3.10: {} - application-config-path@0.1.1: {} - archiver-utils@2.1.0: dependencies: glob: 7.2.3 @@ -22432,7 +22426,7 @@ snapshots: dependencies: safer-buffer: 2.1.2 - asn1js@3.0.5: + asn1js@3.0.6: dependencies: pvtsutils: 1.3.6 pvutils: 1.1.3 @@ -22672,25 +22666,22 @@ snapshots: before-after-hook@2.2.3: {} - better-auth@1.2.6-beta.2(typescript@5.8.3): + better-auth@1.2.7: dependencies: '@better-auth/utils': 0.2.4 '@better-fetch/fetch': 1.1.18 '@noble/ciphers': 0.6.0 - '@noble/hashes': 1.7.1 + '@noble/hashes': 1.7.2 '@simplewebauthn/browser': 13.1.0 '@simplewebauthn/server': 13.1.1 - better-call: 1.0.5 + better-call: 1.0.8 defu: 6.1.4 jose: 5.10.0 kysely: 0.27.6 nanostores: 0.11.4 - valibot: 1.0.0-beta.15(typescript@5.8.3) - zod: 3.24.2 - transitivePeerDependencies: - - typescript + zod: 3.24.3 - better-call@1.0.5: + better-call@1.0.8: dependencies: '@better-fetch/fetch': 1.1.18 rou3: 0.5.1 @@ -22834,8 +22825,8 @@ snapshots: browserslist@4.24.4: dependencies: - caniuse-lite: 1.0.30001707 - electron-to-chromium: 1.5.123 + caniuse-lite: 1.0.30001714 + electron-to-chromium: 1.5.138 node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.24.4) @@ -22913,7 +22904,7 @@ snapshots: transitivePeerDependencies: - supports-color - builtin-modules@4.0.0: {} + builtin-modules@5.0.0: {} bundle-require@5.1.0(esbuild@0.25.1): dependencies: @@ -22929,19 +22920,19 @@ snapshots: bytes@3.1.2: {} - c12@1.11.2: + c12@3.0.3: dependencies: - chokidar: 3.6.0 - confbox: 0.1.8 + chokidar: 4.0.3 + confbox: 0.2.2 defu: 6.1.4 - dotenv: 16.4.7 - giget: 1.2.5 - jiti: 1.21.7 - mlly: 1.7.4 - ohash: 1.1.6 - pathe: 1.1.2 + dotenv: 16.5.0 + exsolve: 1.0.4 + giget: 2.0.0 + jiti: 2.4.2 + ohash: 2.0.11 + pathe: 2.0.3 perfect-debounce: 1.0.0 - pkg-types: 1.3.1 + pkg-types: 2.1.0 rc9: 2.1.2 cac@6.7.14: {} @@ -23050,12 +23041,14 @@ snapshots: caniuse-api@3.0.0: dependencies: browserslist: 4.24.4 - caniuse-lite: 1.0.30001707 + caniuse-lite: 1.0.30001714 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 caniuse-lite@1.0.30001707: {} + caniuse-lite@1.0.30001714: {} + cardinal@2.1.1: dependencies: ansicolors: 0.3.2 @@ -23152,7 +23145,7 @@ snapshots: chrome-launcher@0.15.2: dependencies: - '@types/node': 22.14.0 + '@types/node': 22.14.1 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -23163,7 +23156,7 @@ snapshots: chromium-edge-launcher@0.2.0: dependencies: - '@types/node': 22.14.0 + '@types/node': 22.14.1 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -23295,7 +23288,7 @@ snapshots: cmdk@1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.12)(react@18.3.1) - '@radix-ui/react-dialog': 1.1.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-dialog': 1.1.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-id': 1.1.0(@types/react@18.3.12)(react@18.3.1) '@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 @@ -23343,8 +23336,6 @@ snapshots: comma-separated-tokens@2.0.3: {} - command-exists@1.2.9: {} - commander@10.0.1: {} commander@11.1.0: {} @@ -23433,7 +23424,7 @@ snapshots: confbox@0.1.8: {} - confbox@0.2.1: {} + confbox@0.2.2: {} config-file-ts@0.2.6: dependencies: @@ -23940,6 +23931,8 @@ snapshots: destr@2.0.3: {} + destr@2.0.5: {} + destroy@1.2.0: {} detect-indent@6.1.0: {} @@ -24087,29 +24080,30 @@ snapshots: dotenv-flow@4.1.0: dependencies: - dotenv: 16.4.7 + dotenv: 16.5.0 dotenv@16.3.1: {} dotenv@16.4.7: {} + dotenv@16.5.0: {} + dotenv@9.0.2: {} - drizzle-kit@0.30.6: + drizzle-kit@0.31.0: dependencies: '@drizzle-team/brocli': 0.10.2 '@esbuild-kit/esm-loader': 2.6.5 - esbuild: 0.19.12 - esbuild-register: 3.6.0(esbuild@0.19.12) - gel: 2.0.1 + esbuild: 0.25.2 + esbuild-register: 3.6.0(esbuild@0.25.2) transitivePeerDependencies: - supports-color - drizzle-orm@0.41.0(9928b483d1845c28fd62a2a8fba14be2): + drizzle-orm@0.42.0(f40899e93cf53ec5f598dddbb63d39a8): optionalDependencies: '@opentelemetry/api': 1.9.0 '@types/pg': 8.6.1 - expo-sqlite: 15.1.4(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) + expo-sqlite: 15.1.4(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) gel: 2.0.1 kysely: 0.27.6 @@ -24131,7 +24125,7 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - eas-cli@16.2.1(@types/node@22.14.0)(encoding@0.1.13)(typescript@5.8.3): + eas-cli@16.3.2(@types/node@22.14.1)(encoding@0.1.13)(typescript@5.8.3): dependencies: '@expo/apple-utils': 2.1.12 '@expo/code-signing-certificates': 0.0.5 @@ -24139,7 +24133,7 @@ snapshots: '@expo/config-plugins': 9.0.12 '@expo/eas-build-job': 1.0.173 '@expo/eas-json': 16.1.0 - '@expo/env': 1.0.0 + '@expo/env': 1.0.3 '@expo/json-file': 8.3.3 '@expo/logger': 1.0.117 '@expo/multipart-body-parser': 2.0.0 @@ -24147,8 +24141,8 @@ snapshots: '@expo/package-manager': 1.7.0 '@expo/pkcs12': 0.1.3 '@expo/plist': 0.2.0 - '@expo/plugin-help': 5.1.23(@types/node@22.14.0)(typescript@5.8.3) - '@expo/plugin-warn-if-update-available': 2.5.1(@types/node@22.14.0)(typescript@5.8.3) + '@expo/plugin-help': 5.1.23(@types/node@22.14.1)(typescript@5.8.3) + '@expo/plugin-warn-if-update-available': 2.5.1(@types/node@22.14.1)(typescript@5.8.3) '@expo/prebuild-config': 8.0.17 '@expo/results': 1.0.0 '@expo/rudder-sdk-node': 1.1.1(encoding@0.1.13) @@ -24156,7 +24150,7 @@ snapshots: '@expo/steps': 1.0.173 '@expo/timeago.js': 1.0.0 '@oclif/core': 1.26.2 - '@oclif/plugin-autocomplete': 2.3.10(@types/node@22.14.0)(typescript@5.8.3) + '@oclif/plugin-autocomplete': 2.3.10(@types/node@22.14.1)(typescript@5.8.3) '@segment/ajv-human-errors': 2.15.0(ajv@8.11.0) '@urql/core': 4.0.11(graphql@16.8.1) '@urql/exchange-retry': 1.2.0(graphql@16.8.1) @@ -24215,7 +24209,7 @@ snapshots: uuid: 9.0.1 wrap-ansi: 7.0.0 yaml: 2.6.0 - zod: 3.24.2 + zod: 3.24.3 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -24316,7 +24310,7 @@ snapshots: conf: 13.1.0 type-fest: 4.38.0 - electron-to-chromium@1.5.123: {} + electron-to-chromium@1.5.138: {} electron-updater@6.6.2: dependencies: @@ -24331,7 +24325,7 @@ snapshots: transitivePeerDependencies: - supports-color - electron-vite@3.1.0(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)): + electron-vite@3.1.0(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)): dependencies: '@babel/core': 7.26.10 '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.10) @@ -24339,7 +24333,7 @@ snapshots: esbuild: 0.25.1 magic-string: 0.30.17 picocolors: 1.1.1 - vite: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1) + vite: 6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1) transitivePeerDependencies: - supports-color @@ -24371,10 +24365,10 @@ snapshots: - supports-color optional: true - electron@34.5.0: + electron@35.1.5: dependencies: '@electron/get': 2.0.3 - '@types/node': 20.17.30 + '@types/node': 22.14.1 extract-zip: 2.0.1 transitivePeerDependencies: - supports-color @@ -24453,8 +24447,6 @@ snapshots: environment@1.1.0: {} - eol@0.9.1: {} - err-code@2.0.3: {} error-ex@1.3.2: @@ -24544,7 +24536,7 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - es-toolkit@1.34.1: {} + es-toolkit@1.35.0: {} es6-error@4.1.1: optional: true @@ -24597,10 +24589,10 @@ snapshots: esbuild-openbsd-64@0.14.47: optional: true - esbuild-register@3.6.0(esbuild@0.19.12): + esbuild-register@3.6.0(esbuild@0.25.2): dependencies: debug: 4.4.0(supports-color@8.1.1) - esbuild: 0.19.12 + esbuild: 0.25.2 transitivePeerDependencies: - supports-color @@ -24664,32 +24656,6 @@ snapshots: '@esbuild/win32-ia32': 0.18.20 '@esbuild/win32-x64': 0.18.20 - esbuild@0.19.12: - optionalDependencies: - '@esbuild/aix-ppc64': 0.19.12 - '@esbuild/android-arm': 0.19.12 - '@esbuild/android-arm64': 0.19.12 - '@esbuild/android-x64': 0.19.12 - '@esbuild/darwin-arm64': 0.19.12 - '@esbuild/darwin-x64': 0.19.12 - '@esbuild/freebsd-arm64': 0.19.12 - '@esbuild/freebsd-x64': 0.19.12 - '@esbuild/linux-arm': 0.19.12 - '@esbuild/linux-arm64': 0.19.12 - '@esbuild/linux-ia32': 0.19.12 - '@esbuild/linux-loong64': 0.19.12 - '@esbuild/linux-mips64el': 0.19.12 - '@esbuild/linux-ppc64': 0.19.12 - '@esbuild/linux-riscv64': 0.19.12 - '@esbuild/linux-s390x': 0.19.12 - '@esbuild/linux-x64': 0.19.12 - '@esbuild/netbsd-x64': 0.19.12 - '@esbuild/openbsd-x64': 0.19.12 - '@esbuild/sunos-x64': 0.19.12 - '@esbuild/win32-arm64': 0.19.12 - '@esbuild/win32-ia32': 0.19.12 - '@esbuild/win32-x64': 0.19.12 - esbuild@0.24.2: optionalDependencies: '@esbuild/aix-ppc64': 0.24.2 @@ -24797,7 +24763,7 @@ snapshots: source-map: 0.6.1 optional: true - eslint-compat-utils@0.6.4(eslint@9.24.0(jiti@2.4.2)): + eslint-compat-utils@0.6.5(eslint@9.24.0(jiti@2.4.2)): dependencies: eslint: 9.24.0(jiti@2.4.2) semver: 7.7.1 @@ -24807,36 +24773,36 @@ snapshots: '@eslint/compat': 1.2.8(eslint@9.24.0(jiti@2.4.2)) eslint: 9.24.0(jiti@2.4.2) - eslint-config-hyoban@4.0.2(@types/estree@1.0.7)(@typescript-eslint/eslint-plugin@8.28.0(@typescript-eslint/parser@8.28.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2))(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.0)(typescript@5.8.3)))(ts-api-utils@2.1.0(typescript@5.8.3))(typescript@5.8.3): + eslint-config-hyoban@4.0.3(@types/estree@1.0.7)(@typescript-eslint/eslint-plugin@8.30.1(@typescript-eslint/parser@8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2))(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3)))(ts-api-utils@2.1.0(typescript@5.8.3))(typescript@5.8.3): dependencies: - '@eslint-react/eslint-plugin': 1.38.0(eslint@9.24.0(jiti@2.4.2))(ts-api-utils@2.1.0(typescript@5.8.3))(typescript@5.8.3) - '@eslint/js': 9.23.0 + '@eslint-react/eslint-plugin': 1.48.3(eslint@9.24.0(jiti@2.4.2))(ts-api-utils@2.1.0(typescript@5.8.3))(typescript@5.8.3) + '@eslint/js': 9.24.0 '@stylistic/eslint-plugin': 4.2.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/types': 8.28.0 - '@unocss/eslint-config': 66.1.0-beta.7(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/types': 8.30.1 + '@unocss/eslint-config': 66.1.0-beta.11(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) defu: 6.1.4 eslint: 9.24.0(jiti@2.4.2) eslint-config-flat-gitignore: 2.1.0(eslint@9.24.0(jiti@2.4.2)) eslint-plugin-antfu: 3.1.1(eslint@9.24.0(jiti@2.4.2)) eslint-plugin-command: 3.2.0(eslint@9.24.0(jiti@2.4.2)) eslint-plugin-hyoban: 0.6.1(eslint@9.24.0(jiti@2.4.2)) - eslint-plugin-import-x: 4.9.2(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + eslint-plugin-import-x: 4.10.5(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) eslint-plugin-jsonc: 2.20.0(eslint@9.24.0(jiti@2.4.2)) - eslint-plugin-package-json: 0.29.0(@types/estree@1.0.7)(eslint@9.24.0(jiti@2.4.2))(jsonc-eslint-parser@2.4.0) - eslint-plugin-react-compiler: 19.0.0-beta-e552027-20250112(eslint@9.24.0(jiti@2.4.2)) - eslint-plugin-react-google-translate: 0.1.0(eslint@9.24.0(jiti@2.4.2)) + eslint-plugin-package-json: 0.29.1(@types/estree@1.0.7)(eslint@9.24.0(jiti@2.4.2))(jsonc-eslint-parser@2.4.0) + eslint-plugin-react-compiler: 19.0.0-beta-ebf51a3-20250411(eslint@9.24.0(jiti@2.4.2)) + eslint-plugin-react-google-translate: 0.1.1(eslint@9.24.0(jiti@2.4.2)) eslint-plugin-react-hooks: 5.2.0(eslint@9.24.0(jiti@2.4.2)) eslint-plugin-react-refresh: 0.4.19(eslint@9.24.0(jiti@2.4.2)) eslint-plugin-regexp: 2.7.0(eslint@9.24.0(jiti@2.4.2)) eslint-plugin-simple-import-sort: 12.1.1(eslint@9.24.0(jiti@2.4.2)) - eslint-plugin-tailwindcss: '@hyoban/eslint-plugin-tailwindcss@3.18.0(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.0)(typescript@5.8.3)))' - eslint-plugin-unicorn: 57.0.0(eslint@9.24.0(jiti@2.4.2)) - eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.28.0(@typescript-eslint/parser@8.28.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2)) + eslint-plugin-tailwindcss: '@hyoban/eslint-plugin-tailwindcss@3.18.0(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3)))' + eslint-plugin-unicorn: 58.0.0(eslint@9.24.0(jiti@2.4.2)) + eslint-plugin-unused-imports: 4.1.4(@typescript-eslint/eslint-plugin@8.30.1(@typescript-eslint/parser@8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2)) globals: 16.0.0 jsonc-eslint-parser: 2.4.0 local-pkg: 1.1.1 read-package-up: 11.0.0 - typescript-eslint: 8.28.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + typescript-eslint: 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -24880,10 +24846,11 @@ snapshots: dependencies: eslint: 9.24.0(jiti@2.4.2) - eslint-plugin-import-x@4.9.2(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3): + eslint-plugin-import-x@4.10.5(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3): dependencies: + '@pkgr/core': 0.2.4 '@types/doctrine': 0.0.9 - '@typescript-eslint/utils': 8.28.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) debug: 4.4.0(supports-color@8.1.1) doctrine: 3.0.0 eslint: 9.24.0(jiti@2.4.2) @@ -24891,19 +24858,19 @@ snapshots: get-tsconfig: 4.10.0 is-glob: 4.0.3 minimatch: 10.0.1 - rspack-resolver: 1.3.0 semver: 7.7.1 stable-hash: 0.0.5 tslib: 2.8.1 + unrs-resolver: 1.5.0 transitivePeerDependencies: - supports-color - typescript eslint-plugin-jsonc@2.20.0(eslint@9.24.0(jiti@2.4.2)): dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@9.24.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.6.1(eslint@9.24.0(jiti@2.4.2)) eslint: 9.24.0(jiti@2.4.2) - eslint-compat-utils: 0.6.4(eslint@9.24.0(jiti@2.4.2)) + eslint-compat-utils: 0.6.5(eslint@9.24.0(jiti@2.4.2)) eslint-json-compat-utils: 0.2.1(eslint@9.24.0(jiti@2.4.2))(jsonc-eslint-parser@2.4.0) espree: 10.3.0 graphemer: 1.4.0 @@ -24913,7 +24880,7 @@ snapshots: transitivePeerDependencies: - '@eslint/json' - eslint-plugin-package-json@0.29.0(@types/estree@1.0.7)(eslint@9.24.0(jiti@2.4.2))(jsonc-eslint-parser@2.4.0): + eslint-plugin-package-json@0.29.1(@types/estree@1.0.7)(eslint@9.24.0(jiti@2.4.2))(jsonc-eslint-parser@2.4.0): dependencies: '@altano/repository-tools': 0.1.1 detect-indent: 6.1.0 @@ -24921,7 +24888,7 @@ snapshots: eslint: 9.24.0(jiti@2.4.2) eslint-fix-utils: 0.2.1(@types/estree@1.0.7)(eslint@9.24.0(jiti@2.4.2)) jsonc-eslint-parser: 2.4.0 - package-json-validator: 0.10.0 + package-json-validator: 0.10.1 semver: 7.7.1 sort-object-keys: 1.1.3 sort-package-json: 3.0.0 @@ -24929,81 +24896,78 @@ snapshots: transitivePeerDependencies: - '@types/estree' - eslint-plugin-react-compiler@19.0.0-beta-e552027-20250112(eslint@9.24.0(jiti@2.4.2)): + eslint-plugin-react-compiler@19.0.0-beta-ebf51a3-20250411(eslint@9.24.0(jiti@2.4.2)): dependencies: '@babel/core': 7.26.10 '@babel/parser': 7.27.0 '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.26.10) eslint: 9.24.0(jiti@2.4.2) hermes-parser: 0.25.1 - zod: 3.24.2 - zod-validation-error: 3.4.0(zod@3.24.2) + zod: 3.24.3 + zod-validation-error: 3.4.0(zod@3.24.3) transitivePeerDependencies: - supports-color - eslint-plugin-react-debug@1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3): + eslint-plugin-react-debug@1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3): dependencies: - '@eslint-react/ast': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@eslint-react/core': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@eslint-react/eff': 1.38.0 - '@eslint-react/jsx': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@eslint-react/kit': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@eslint-react/shared': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@eslint-react/var': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.28.0 - '@typescript-eslint/type-utils': 8.28.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/types': 8.28.0 - '@typescript-eslint/utils': 8.28.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@eslint-react/ast': 1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@eslint-react/core': 1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@eslint-react/eff': 1.48.3 + '@eslint-react/kit': 1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@eslint-react/shared': 1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@eslint-react/var': 1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.30.1 + '@typescript-eslint/type-utils': 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/types': 8.30.1 + '@typescript-eslint/utils': 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) eslint: 9.24.0(jiti@2.4.2) string-ts: 2.2.1 - ts-pattern: 5.6.2 + ts-pattern: 5.7.0 optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: - supports-color - eslint-plugin-react-dom@1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3): + eslint-plugin-react-dom@1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3): dependencies: - '@eslint-react/ast': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@eslint-react/core': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@eslint-react/eff': 1.38.0 - '@eslint-react/jsx': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@eslint-react/kit': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@eslint-react/shared': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@eslint-react/var': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.28.0 - '@typescript-eslint/types': 8.28.0 - '@typescript-eslint/utils': 8.28.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@eslint-react/ast': 1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@eslint-react/core': 1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@eslint-react/eff': 1.48.3 + '@eslint-react/kit': 1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@eslint-react/shared': 1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@eslint-react/var': 1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.30.1 + '@typescript-eslint/types': 8.30.1 + '@typescript-eslint/utils': 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) compare-versions: 6.1.1 eslint: 9.24.0(jiti@2.4.2) string-ts: 2.2.1 - ts-pattern: 5.6.2 + ts-pattern: 5.7.0 optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: - supports-color - eslint-plugin-react-google-translate@0.1.0(eslint@9.24.0(jiti@2.4.2)): + eslint-plugin-react-google-translate@0.1.1(eslint@9.24.0(jiti@2.4.2)): dependencies: eslint: 9.24.0(jiti@2.4.2) requireindex: 1.2.0 - eslint-plugin-react-hooks-extra@1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3): + eslint-plugin-react-hooks-extra@1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3): dependencies: - '@eslint-react/ast': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@eslint-react/core': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@eslint-react/eff': 1.38.0 - '@eslint-react/jsx': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@eslint-react/kit': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@eslint-react/shared': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@eslint-react/var': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.28.0 - '@typescript-eslint/type-utils': 8.28.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/types': 8.28.0 - '@typescript-eslint/utils': 8.28.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@eslint-react/ast': 1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@eslint-react/core': 1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@eslint-react/eff': 1.48.3 + '@eslint-react/kit': 1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@eslint-react/shared': 1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@eslint-react/var': 1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.30.1 + '@typescript-eslint/type-utils': 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/types': 8.30.1 + '@typescript-eslint/utils': 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) eslint: 9.24.0(jiti@2.4.2) string-ts: 2.2.1 - ts-pattern: 5.6.2 + ts-pattern: 5.7.0 optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -25013,22 +24977,21 @@ snapshots: dependencies: eslint: 9.24.0(jiti@2.4.2) - eslint-plugin-react-naming-convention@1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3): + eslint-plugin-react-naming-convention@1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3): dependencies: - '@eslint-react/ast': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@eslint-react/core': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@eslint-react/eff': 1.38.0 - '@eslint-react/jsx': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@eslint-react/kit': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@eslint-react/shared': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@eslint-react/var': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.28.0 - '@typescript-eslint/type-utils': 8.28.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/types': 8.28.0 - '@typescript-eslint/utils': 8.28.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@eslint-react/ast': 1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@eslint-react/core': 1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@eslint-react/eff': 1.48.3 + '@eslint-react/kit': 1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@eslint-react/shared': 1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@eslint-react/var': 1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.30.1 + '@typescript-eslint/type-utils': 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/types': 8.30.1 + '@typescript-eslint/utils': 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) eslint: 9.24.0(jiti@2.4.2) string-ts: 2.2.1 - ts-pattern: 5.6.2 + ts-pattern: 5.7.0 optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -25045,44 +25008,42 @@ snapshots: dependencies: eslint: 9.24.0(jiti@2.4.2) - eslint-plugin-react-web-api@1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3): + eslint-plugin-react-web-api@1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3): dependencies: - '@eslint-react/ast': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@eslint-react/core': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@eslint-react/eff': 1.38.0 - '@eslint-react/jsx': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@eslint-react/kit': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@eslint-react/shared': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@eslint-react/var': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.28.0 - '@typescript-eslint/types': 8.28.0 - '@typescript-eslint/utils': 8.28.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@eslint-react/ast': 1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@eslint-react/core': 1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@eslint-react/eff': 1.48.3 + '@eslint-react/kit': 1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@eslint-react/shared': 1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@eslint-react/var': 1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.30.1 + '@typescript-eslint/types': 8.30.1 + '@typescript-eslint/utils': 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) eslint: 9.24.0(jiti@2.4.2) string-ts: 2.2.1 - ts-pattern: 5.6.2 + ts-pattern: 5.7.0 optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: - supports-color - eslint-plugin-react-x@1.38.0(eslint@9.24.0(jiti@2.4.2))(ts-api-utils@2.1.0(typescript@5.8.3))(typescript@5.8.3): + eslint-plugin-react-x@1.48.3(eslint@9.24.0(jiti@2.4.2))(ts-api-utils@2.1.0(typescript@5.8.3))(typescript@5.8.3): dependencies: - '@eslint-react/ast': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@eslint-react/core': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@eslint-react/eff': 1.38.0 - '@eslint-react/jsx': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@eslint-react/kit': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@eslint-react/shared': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@eslint-react/var': 1.38.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.28.0 - '@typescript-eslint/type-utils': 8.28.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/types': 8.28.0 - '@typescript-eslint/utils': 8.28.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@eslint-react/ast': 1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@eslint-react/core': 1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@eslint-react/eff': 1.48.3 + '@eslint-react/kit': 1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@eslint-react/shared': 1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@eslint-react/var': 1.48.3(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.30.1 + '@typescript-eslint/type-utils': 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/types': 8.30.1 + '@typescript-eslint/utils': 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) compare-versions: 6.1.1 eslint: 9.24.0(jiti@2.4.2) is-immutable-type: 5.0.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) string-ts: 2.2.1 - ts-pattern: 5.6.2 + ts-pattern: 5.7.0 optionalDependencies: ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 @@ -25091,7 +25052,7 @@ snapshots: eslint-plugin-regexp@2.7.0(eslint@9.24.0(jiti@2.4.2)): dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@9.24.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.6.1(eslint@9.24.0(jiti@2.4.2)) '@eslint-community/regexpp': 4.12.1 comment-parser: 1.4.1 eslint: 9.24.0(jiti@2.4.2) @@ -25104,18 +25065,19 @@ snapshots: dependencies: eslint: 9.24.0(jiti@2.4.2) - eslint-plugin-unicorn@57.0.0(eslint@9.24.0(jiti@2.4.2)): + eslint-plugin-unicorn@58.0.0(eslint@9.24.0(jiti@2.4.2)): dependencies: '@babel/helper-validator-identifier': 7.25.9 - '@eslint-community/eslint-utils': 4.5.1(eslint@9.24.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.6.1(eslint@9.24.0(jiti@2.4.2)) + '@eslint/plugin-kit': 0.2.8 ci-info: 4.2.0 clean-regexp: 1.0.0 core-js-compat: 3.41.0 eslint: 9.24.0(jiti@2.4.2) esquery: 1.6.0 - globals: 15.15.0 + globals: 16.0.0 indent-string: 5.0.0 - is-builtin-module: 4.0.0 + is-builtin-module: 5.0.0 jsesc: 3.1.0 pluralize: 8.0.0 read-package-up: 11.0.0 @@ -25124,11 +25086,11 @@ snapshots: semver: 7.7.1 strip-indent: 4.0.0 - eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.28.0(@typescript-eslint/parser@8.28.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2)): + eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.30.1(@typescript-eslint/parser@8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2)): dependencies: eslint: 9.24.0(jiti@2.4.2) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.28.0(@typescript-eslint/parser@8.28.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/eslint-plugin': 8.30.1(@typescript-eslint/parser@8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) eslint-scope@8.3.0: dependencies: @@ -25258,20 +25220,20 @@ snapshots: expect-type@1.2.1: {} - expo-apple-authentication@7.1.3(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)): + expo-apple-authentication@7.1.3(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)): dependencies: - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) react-native: 0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5) - expo-application@6.0.2(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)): + expo-application@6.0.2(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)): dependencies: - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) - expo-asset@11.0.5(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): + expo-asset@11.0.5(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): dependencies: '@expo/image-utils': 0.6.5 - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) - expo-constants: 17.0.8(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo-constants: 17.0.8(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)) invariant: 2.2.4 md5-file: 3.2.3 react: 18.3.1 @@ -25279,125 +25241,125 @@ snapshots: transitivePeerDependencies: - supports-color - expo-av@15.0.2(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native-web@0.20.0(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): + expo-av@15.0.2(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native-web@0.20.0(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): dependencies: - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) react: 18.3.1 react-native: 0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5) optionalDependencies: react-native-web: 0.20.0(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - expo-background-fetch@13.0.6(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)): + expo-background-fetch@13.0.6(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)): dependencies: - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) - expo-task-manager: 12.0.6(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo-task-manager: 12.0.6(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)) transitivePeerDependencies: - react-native - expo-blur@14.0.3(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): + expo-blur@14.0.3(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): dependencies: - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) react: 18.3.1 react-native: 0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5) - expo-build-properties@0.13.2(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)): + expo-build-properties@0.13.2(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)): dependencies: ajv: 8.17.1 - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) semver: 7.7.1 - expo-clipboard@7.0.1(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): + expo-clipboard@7.0.1(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): dependencies: - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) react: 18.3.1 react-native: 0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5) - expo-constants@17.0.8(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)): + expo-constants@17.0.8(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)): dependencies: '@expo/config': 10.0.11 '@expo/env': 0.4.2 - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) react-native: 0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5) transitivePeerDependencies: - supports-color - expo-dev-client@5.0.20(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)): + expo-dev-client@5.0.20(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)): dependencies: - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) - expo-dev-launcher: 5.0.35(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) - expo-dev-menu: 6.0.25(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) - expo-dev-menu-interface: 1.9.3(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) - expo-manifests: 0.15.8(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) - expo-updates-interface: 1.0.0(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo-dev-launcher: 5.0.35(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) + expo-dev-menu: 6.0.25(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) + expo-dev-menu-interface: 1.9.3(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) + expo-manifests: 0.15.8(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) + expo-updates-interface: 1.0.0(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) transitivePeerDependencies: - supports-color - expo-dev-launcher@5.0.35(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)): + expo-dev-launcher@5.0.35(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)): dependencies: ajv: 8.11.0 - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) - expo-dev-menu: 6.0.25(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) - expo-manifests: 0.15.8(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo-dev-menu: 6.0.25(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) + expo-manifests: 0.15.8(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) resolve-from: 5.0.0 transitivePeerDependencies: - supports-color - expo-dev-menu-interface@1.9.3(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)): + expo-dev-menu-interface@1.9.3(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)): dependencies: - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) - expo-dev-menu@6.0.25(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)): + expo-dev-menu@6.0.25(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)): dependencies: - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) - expo-dev-menu-interface: 1.9.3(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo-dev-menu-interface: 1.9.3(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) - expo-document-picker@13.0.3(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)): + expo-document-picker@13.0.3(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)): dependencies: - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) - expo-drizzle-studio-plugin@0.1.2(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): + expo-drizzle-studio-plugin@0.1.2(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): dependencies: - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) - expo-sqlite: 15.1.4(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo-sqlite: 15.1.4(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) transitivePeerDependencies: - react - react-native expo-eas-client@0.13.3: {} - expo-file-system@18.0.12(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)): + expo-file-system@18.0.12(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)): dependencies: - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) react-native: 0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5) web-streams-polyfill: 3.3.3 - expo-font@13.0.4(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): + expo-font@13.0.4(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): dependencies: - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) fontfaceobserver: 2.3.0 react: 18.3.1 - expo-haptics@14.0.1(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)): + expo-haptics@14.0.1(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)): dependencies: - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) - expo-image-loader@5.0.0(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)): + expo-image-loader@5.0.0(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)): dependencies: - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) - expo-image-manipulator@13.0.6(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)): + expo-image-manipulator@13.0.6(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)): dependencies: - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) - expo-image-loader: 5.0.0(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo-image-loader: 5.0.0(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) - expo-image-picker@16.0.6(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)): + expo-image-picker@16.0.6(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)): dependencies: - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) - expo-image-loader: 5.0.0(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo-image-loader: 5.0.0(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) - expo-image@2.0.7(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native-web@0.20.0(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): + expo-image@2.0.7(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native-web@0.20.0(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): dependencies: - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) react: 18.3.1 react-native: 0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5) optionalDependencies: @@ -25405,20 +25367,20 @@ snapshots: expo-json-utils@0.14.0: {} - expo-keep-awake@14.0.3(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): + expo-keep-awake@14.0.3(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): dependencies: - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) react: 18.3.1 - expo-linear-gradient@14.0.2(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): + expo-linear-gradient@14.0.2(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): dependencies: - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) react: 18.3.1 react-native: 0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5) - expo-linking@7.0.5(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): + expo-linking@7.0.5(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): dependencies: - expo-constants: 17.0.8(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)) + expo-constants: 17.0.8(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)) invariant: 2.2.4 react: 18.3.1 react-native: 0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5) @@ -25426,31 +25388,31 @@ snapshots: - expo - supports-color - expo-localization@16.0.1(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): + expo-localization@16.0.1(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): dependencies: - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) react: 18.3.1 rtl-detect: 1.1.2 - expo-manifests@0.15.7(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)): + expo-manifests@0.15.7(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)): dependencies: '@expo/config': 10.0.11 - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) expo-json-utils: 0.14.0 transitivePeerDependencies: - supports-color - expo-manifests@0.15.8(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)): + expo-manifests@0.15.8(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)): dependencies: '@expo/config': 10.0.11 - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) expo-json-utils: 0.14.0 transitivePeerDependencies: - supports-color - expo-media-library@17.0.6(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)): + expo-media-library@17.0.6(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)): dependencies: - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) react-native: 0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5) expo-modules-autolinking@2.0.8: @@ -25468,39 +25430,39 @@ snapshots: dependencies: invariant: 2.2.4 - expo-notifications@0.29.14(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): + expo-notifications@0.29.14(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): dependencies: '@expo/image-utils': 0.6.5 '@ide/backoff': 1.0.0 abort-controller: 3.0.0 assert: 2.1.0 badgin: 1.2.3 - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) - expo-application: 6.0.2(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) - expo-constants: 17.0.8(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo-application: 6.0.2(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) + expo-constants: 17.0.8(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)) react: 18.3.1 react-native: 0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5) transitivePeerDependencies: - supports-color - expo-secure-store@14.0.1(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)): + expo-secure-store@14.0.1(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)): dependencies: - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) - expo-sharing@13.0.1(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)): + expo-sharing@13.0.1(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)): dependencies: - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) - expo-splash-screen@0.29.22(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)): + expo-splash-screen@0.29.22(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)): dependencies: '@expo/prebuild-config': 8.0.29 - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) transitivePeerDependencies: - supports-color - expo-sqlite@15.1.4(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): + expo-sqlite@15.1.4(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): dependencies: - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) react: 18.3.1 react-native: 0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5) @@ -25511,33 +25473,33 @@ snapshots: expo-structured-headers@4.0.0: {} - expo-symbols@0.2.2(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)): + expo-symbols@0.2.2(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)): dependencies: - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) sf-symbols-typescript: 2.1.0 - expo-system-ui@4.0.9(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native-web@0.20.0(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)): + expo-system-ui@4.0.9(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native-web@0.20.0(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)): dependencies: '@react-native/normalize-colors': 0.76.8 debug: 4.4.0(supports-color@8.1.1) - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) react-native: 0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5) optionalDependencies: react-native-web: 0.20.0(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) transitivePeerDependencies: - supports-color - expo-task-manager@12.0.6(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)): + expo-task-manager@12.0.6(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)): dependencies: - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) react-native: 0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5) unimodules-app-loader: 5.0.1 - expo-updates-interface@1.0.0(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)): + expo-updates-interface@1.0.0(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)): dependencies: - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) - expo-updates@0.27.4(encoding@0.1.13)(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): + expo-updates@0.27.4(encoding@0.1.13)(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): dependencies: '@expo/code-signing-certificates': 0.0.5 '@expo/config': 10.0.11 @@ -25545,11 +25507,11 @@ snapshots: '@expo/spawn-async': 1.7.2 arg: 4.1.0 chalk: 4.1.2 - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) expo-eas-client: 0.13.3 - expo-manifests: 0.15.7(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) + expo-manifests: 0.15.7(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) expo-structured-headers: 4.0.0 - expo-updates-interface: 1.0.0(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) + expo-updates-interface: 1.0.0(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5)) fast-glob: 3.3.3 fbemitter: 3.0.0(encoding@0.1.13) ignore: 5.3.2 @@ -25559,26 +25521,26 @@ snapshots: - encoding - supports-color - expo-web-browser@14.0.2(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)): + expo-web-browser@14.0.2(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)): dependencies: - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) react-native: 0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5) - expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5): + expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5): dependencies: '@babel/runtime': 7.27.0 - '@expo/cli': 0.22.24(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(utf-8-validate@6.0.5) + '@expo/cli': 0.22.26(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(utf-8-validate@6.0.5) '@expo/config': 10.0.11 '@expo/config-plugins': 9.0.17 '@expo/fingerprint': 0.11.11 '@expo/metro-config': 0.19.12 - '@expo/vector-icons': 14.0.4 + '@expo/vector-icons': 14.1.0(expo-font@13.0.4(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) babel-preset-expo: 12.0.11(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10)) - expo-asset: 11.0.5(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) - expo-constants: 17.0.8(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)) - expo-file-system: 18.0.12(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)) - expo-font: 13.0.4(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) - expo-keep-awake: 14.0.3(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) + expo-asset: 11.0.5(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) + expo-constants: 17.0.8(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)) + expo-file-system: 18.0.12(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)) + expo-font: 13.0.4(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) + expo-keep-awake: 14.0.3(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) expo-modules-autolinking: 2.0.8 expo-modules-core: 2.2.3 fbemitter: 3.0.0(encoding@0.1.13) @@ -25689,11 +25651,11 @@ snapshots: fastify-plugin@5.0.1: {} - fastify@5.2.2: + fastify@5.3.0: dependencies: '@fastify/ajv-compiler': 4.0.2 '@fastify/error': 4.1.0 - '@fastify/fast-json-stringify-compiler': 5.0.2 + '@fastify/fast-json-stringify-compiler': 5.0.3 '@fastify/proxy-addr': 5.0.0 abstract-logging: 2.0.1 avvio: 9.1.0 @@ -25701,9 +25663,9 @@ snapshots: find-my-way: 9.3.0 light-my-request: 6.6.0 pino: 9.6.0 - process-warning: 4.0.1 + process-warning: 5.0.0 rfdc: 1.4.1 - secure-json-parse: 3.0.2 + secure-json-parse: 4.0.0 semver: 7.7.1 toad-cache: 3.7.0 @@ -25928,6 +25890,8 @@ snapshots: flow-parser@0.266.1: {} + flow-parser@0.268.0: {} + fmix@0.1.0: dependencies: imul: 1.0.1 @@ -25981,10 +25945,10 @@ snapshots: fraction.js@4.3.7: {} - framer-motion@12.6.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + framer-motion@12.7.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - motion-dom: 12.6.3 - motion-utils: 12.6.3 + motion-dom: 12.7.4 + motion-utils: 12.7.2 tslib: 2.8.1 optionalDependencies: react: 18.3.1 @@ -26106,6 +26070,7 @@ snapshots: which: 4.0.0 transitivePeerDependencies: - supports-color + optional: true generate-function@2.3.1: dependencies: @@ -26156,8 +26121,6 @@ snapshots: get-package-type@0.1.0: {} - get-port@3.2.0: {} - get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 @@ -26197,15 +26160,14 @@ snapshots: image-q: 4.0.0 omggif: 1.0.10 - giget@1.2.5: + giget@2.0.0: dependencies: citty: 0.1.6 consola: 3.4.2 defu: 6.1.4 node-fetch-native: 1.6.6 - nypm: 0.5.4 + nypm: 0.6.0 pathe: 2.0.3 - tar: 6.2.1 git-hooks-list@3.2.0: {} @@ -26321,7 +26283,7 @@ snapshots: array-union: 2.1.0 dir-glob: 3.0.1 fast-glob: 3.3.2 - ignore: 5.3.2 + ignore: 5.3.0 merge2: 1.4.1 slash: 3.0.0 @@ -26356,7 +26318,7 @@ snapshots: graphql-tag@2.12.6(graphql@16.8.1): dependencies: graphql: 16.8.1 - tslib: 2.8.1 + tslib: 2.6.2 graphql@16.8.1: {} @@ -26600,7 +26562,7 @@ snapshots: dependencies: react-is: 16.13.1 - hono@4.7.5(patch_hash=5c74c2d2afaa5880c13d75458dd26c84da568851691b1fb6de6d877c29936d05): {} + hono@4.7.6(patch_hash=5c74c2d2afaa5880c13d75458dd26c84da568851691b1fb6de6d877c29936d05): {} hosted-git-info@2.8.9: {} @@ -26719,7 +26681,7 @@ snapshots: dependencies: '@babel/runtime': 7.27.0 - i18next@24.2.3(typescript@5.8.3): + i18next@25.0.0(typescript@5.8.3): dependencies: '@babel/runtime': 7.27.0 optionalDependencies: @@ -26793,7 +26755,7 @@ snapshots: indent-string@5.0.0: {} - index-to-position@1.0.0: {} + index-to-position@1.1.0: {} infer-owner@1.0.4: {} @@ -26911,9 +26873,9 @@ snapshots: is-buffer@2.0.5: {} - is-builtin-module@4.0.0: + is-builtin-module@5.0.0: dependencies: - builtin-modules: 4.0.0 + builtin-modules: 5.0.0 is-callable@1.2.7: {} @@ -26972,7 +26934,7 @@ snapshots: is-immutable-type@5.0.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3): dependencies: - '@typescript-eslint/type-utils': 8.28.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/type-utils': 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) eslint: 9.24.0(jiti@2.4.2) ts-api-utils: 2.1.0(typescript@5.8.3) ts-declaration-location: 1.0.7(typescript@5.8.3) @@ -27099,7 +27061,8 @@ snapshots: isexe@2.0.0: {} - isexe@3.1.1: {} + isexe@3.1.1: + optional: true isobject@3.0.1: {} @@ -27141,7 +27104,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.14.0 + '@types/node': 22.14.1 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -27151,7 +27114,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 22.14.0 + '@types/node': 22.14.1 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -27178,7 +27141,7 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.14.0 + '@types/node': 22.14.1 jest-util: 29.7.0 jest-regex-util@29.6.3: {} @@ -27186,7 +27149,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.14.0 + '@types/node': 22.14.1 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -27203,7 +27166,7 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 22.14.0 + '@types/node': 22.14.1 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -27240,7 +27203,7 @@ snapshots: jose@5.10.0: {} - jotai@2.12.2(@types/react@18.3.12)(react@18.3.1): + jotai@2.12.3(@types/react@18.3.12)(react@18.3.1): optionalDependencies: '@types/react': 18.3.12 react: 18.3.1 @@ -27280,7 +27243,7 @@ snapshots: '@babel/register': 7.25.9(@babel/core@7.26.10) babel-core: 7.0.0-bridge.0(@babel/core@7.26.10) chalk: 4.1.2 - flow-parser: 0.266.1 + flow-parser: 0.268.0 graceful-fs: 4.2.11 micromatch: 4.0.8 neo-async: 2.6.2 @@ -27410,7 +27373,7 @@ snapshots: jws: 3.2.2 lodash: 4.17.21 ms: 2.1.3 - semver: 7.7.1 + semver: 7.5.4 jsonwebtoken@9.0.2: dependencies: @@ -27445,7 +27408,7 @@ snapshots: jwa: 1.4.1 safe-buffer: 5.2.1 - katex@0.16.21: + katex@0.16.22: dependencies: commander: 8.3.0 @@ -27615,18 +27578,18 @@ snapshots: htmlparser2: 10.0.0 uhyphen: 0.2.0 - lint-staged@15.5.0: + lint-staged@15.5.1: dependencies: chalk: 5.4.1 commander: 13.1.0 debug: 4.4.0(supports-color@8.1.1) execa: 8.0.1 lilconfig: 3.1.3 - listr2: 8.2.5 + listr2: 8.3.2 micromatch: 4.0.8 pidtree: 0.6.0 string-argv: 0.3.2 - yaml: 2.7.0 + yaml: 2.7.1 transitivePeerDependencies: - supports-color @@ -27639,7 +27602,7 @@ snapshots: rfdc: 1.4.1 wrap-ansi: 8.1.0 - listr2@8.2.5: + listr2@8.3.2: dependencies: cli-truncate: 4.0.0 colorette: 2.0.20 @@ -27774,6 +27737,8 @@ snapshots: long@5.3.1: {} + long@5.3.2: {} + longest-streak@3.1.0: {} loose-envify@1.4.0: @@ -27811,7 +27776,7 @@ snapshots: nan: 2.22.2 optional: true - magic-string-ast@0.8.0: + magic-string-ast@0.9.1: dependencies: magic-string: 0.30.17 @@ -28614,11 +28579,19 @@ snapshots: moment@2.30.1: optional: true - motion-dom@12.6.3: + motion-dom@12.7.4: dependencies: - motion-utils: 12.6.3 + motion-utils: 12.7.2 - motion-utils@12.6.3: {} + motion-utils@12.7.2: {} + + motion@12.7.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + framer-motion: 12.7.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + tslib: 2.8.1 + optionalDependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) mri@1.2.0: {} @@ -28686,12 +28659,12 @@ snapshots: nanostores@0.11.4: {} - nativewind@4.1.23(react-native-reanimated@3.17.2(@babel/core@7.26.10)(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native-safe-area-context@5.3.0(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native-svg@15.11.2(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.0)(typescript@5.8.3))): + nativewind@4.1.23(react-native-reanimated@3.17.4(@babel/core@7.26.10)(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native-safe-area-context@5.4.0(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native-svg@15.11.2(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3))): dependencies: comment-json: 4.2.5 debug: 4.4.0(supports-color@8.1.1) - react-native-css-interop: 0.1.22(react-native-reanimated@3.17.2(@babel/core@7.26.10)(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native-safe-area-context@5.3.0(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native-svg@15.11.2(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.0)(typescript@5.8.3))) - tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@22.14.0)(typescript@5.8.3)) + react-native-css-interop: 0.1.22(react-native-reanimated@3.17.4(@babel/core@7.26.10)(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native-safe-area-context@5.4.0(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native-svg@15.11.2(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3))) + tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3)) transitivePeerDependencies: - react - react-native @@ -28704,9 +28677,9 @@ snapshots: natural-orderby@2.0.3: {} - nbump@2.0.7(conventional-commits-filter@5.0.0): + nbump@2.1.0(conventional-commits-filter@5.0.0): dependencies: - c12: 1.11.2 + c12: 3.0.3 conventional-changelog: 6.0.0(conventional-commits-filter@5.0.0) slugify: 1.6.6 transitivePeerDependencies: @@ -28845,14 +28818,13 @@ snapshots: nwsapi@2.2.20: optional: true - nypm@0.5.4: + nypm@0.6.0: dependencies: citty: 0.1.6 consola: 3.4.2 pathe: 2.0.3 - pkg-types: 1.3.1 + pkg-types: 2.1.0 tinyexec: 0.3.2 - ufo: 1.5.4 ob1@0.81.4: dependencies: @@ -28888,7 +28860,7 @@ snapshots: node-fetch-native: 1.6.6 ufo: 1.5.4 - ohash@1.1.6: {} + ohash@2.0.11: {} omggif@1.0.10: {} @@ -28985,7 +28957,8 @@ snapshots: strip-ansi: 6.0.1 wcwidth: 1.0.1 - os-tmpdir@1.0.2: {} + os-tmpdir@1.0.2: + optional: true overlap-area@1.1.0: dependencies: @@ -29043,7 +29016,7 @@ snapshots: package-json-from-dist@1.0.1: {} - package-json-validator@0.10.0: + package-json-validator@0.10.1: dependencies: yargs: 17.7.2 @@ -29117,11 +29090,11 @@ snapshots: error-ex: 1.3.2 json-parse-better-errors: 1.0.2 - parse-json@8.2.0: + parse-json@8.3.0: dependencies: '@babel/code-frame': 7.26.2 - index-to-position: 1.0.0 - type-fest: 4.38.0 + index-to-position: 1.1.0 + type-fest: 4.40.0 parse-ms@2.1.0: {} @@ -29304,7 +29277,7 @@ snapshots: pkg-types@2.1.0: dependencies: - confbox: 0.2.1 + confbox: 0.2.2 exsolve: 1.0.4 pathe: 2.0.3 @@ -29312,9 +29285,9 @@ snapshots: dependencies: find-up: 3.0.0 - plain-shiki@0.2.0(shiki@3.2.1): + plain-shiki@0.2.0(shiki@3.2.2): dependencies: - shiki: 3.2.1 + shiki: 3.2.2 playwright-core@1.51.1: {} @@ -29391,13 +29364,13 @@ snapshots: camelcase-css: 2.0.1 postcss: 8.5.3 - postcss-load-config@4.0.2(postcss@8.5.3)(ts-node@10.9.2(@types/node@22.14.0)(typescript@5.8.3)): + postcss-load-config@4.0.2(postcss@8.5.3)(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3)): dependencies: lilconfig: 3.1.3 yaml: 2.7.1 optionalDependencies: postcss: 8.5.3 - ts-node: 10.9.2(@types/node@22.14.0)(typescript@5.8.3) + ts-node: 10.9.2(@types/node@22.14.1)(typescript@5.8.3) postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.3)(yaml@2.7.1): dependencies: @@ -29600,6 +29573,8 @@ snapshots: process-warning@4.0.1: {} + process-warning@5.0.0: {} + process@0.11.10: {} progress@2.0.3: {} @@ -29646,9 +29621,24 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 22.14.0 + '@types/node': 22.14.1 long: 5.3.1 + protobufjs@7.5.0: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 22.14.1 + long: 5.3.2 + proxy-from-env@1.1.0: {} psl@1.15.0: @@ -29743,18 +29733,18 @@ snapshots: iconv-lite: 0.6.3 unpipe: 1.0.0 - rc-modal-sheet@0.3.2(@radix-ui/react-dialog@1.1.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(clsx@2.1.1)(framer-motion@12.6.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(tailwind-merge@3.1.0)(vaul@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): + rc-modal-sheet@1.0.0(@radix-ui/react-dialog@1.1.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(clsx@2.1.1)(motion@12.7.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(tailwind-merge@3.2.0)(vaul@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): dependencies: - '@radix-ui/react-dialog': 1.1.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-dialog': 1.1.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) clsx: 2.1.1 - framer-motion: 12.6.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - tailwind-merge: 3.1.0 + motion: 12.7.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + tailwind-merge: 3.2.0 vaul: 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) rc9@2.1.2: dependencies: defu: 6.1.4 - destr: 2.0.3 + destr: 2.0.5 rc@1.2.8: dependencies: @@ -29823,16 +29813,16 @@ snapshots: dependencies: react: 18.3.1 - react-hotkeys-hook@4.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-hotkeys-hook@5.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-i18next@15.4.1(i18next@24.2.3(typescript@5.8.3))(react-dom@18.3.1(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): + react-i18next@15.4.1(i18next@25.0.0(typescript@5.8.3))(react-dom@18.3.1(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): dependencies: '@babel/runtime': 7.27.0 html-parse-stringify: 3.0.1 - i18next: 24.2.3(typescript@5.8.3) + i18next: 25.0.0(typescript@5.8.3) react: 18.3.1 optionalDependencies: react-dom: 18.3.1(react@18.3.1) @@ -29855,12 +29845,12 @@ snapshots: react-merge-refs@1.1.0: {} - react-native-awesome-slider@2.9.0(react-native-gesture-handler@2.25.0(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native-reanimated@3.17.2(@babel/core@7.26.10)(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): + react-native-awesome-slider@2.9.0(react-native-gesture-handler@2.25.0(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native-reanimated@3.17.4(@babel/core@7.26.10)(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): dependencies: react: 18.3.1 react-native: 0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5) react-native-gesture-handler: 2.25.0(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) - react-native-reanimated: 3.17.2(@babel/core@7.26.10)(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) + react-native-reanimated: 3.17.4(@babel/core@7.26.10)(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) react-native-bouncy-checkbox@4.1.2: dependencies: @@ -29874,7 +29864,7 @@ snapshots: rn-color-matrices: 4.1.0(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)) ts-tiny-invariant: 2.0.5 - react-native-css-interop@0.1.22(react-native-reanimated@3.17.2(@babel/core@7.26.10)(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native-safe-area-context@5.3.0(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native-svg@15.11.2(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.0)(typescript@5.8.3))): + react-native-css-interop@0.1.22(react-native-reanimated@3.17.4(@babel/core@7.26.10)(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native-safe-area-context@5.4.0(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native-svg@15.11.2(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3))): dependencies: '@babel/helper-module-imports': 7.25.9 '@babel/traverse': 7.27.0 @@ -29883,15 +29873,20 @@ snapshots: lightningcss: 1.29.3 react: 18.3.1 react-native: 0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5) - react-native-reanimated: 3.17.2(@babel/core@7.26.10)(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) + react-native-reanimated: 3.17.4(@babel/core@7.26.10)(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) semver: 7.7.1 - tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@22.14.0)(typescript@5.8.3)) + tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3)) optionalDependencies: - react-native-safe-area-context: 5.3.0(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) + react-native-safe-area-context: 5.4.0(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) react-native-svg: 15.11.2(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) transitivePeerDependencies: - supports-color + react-native-edge-to-edge@1.6.0(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): + dependencies: + react: 18.3.1 + react-native: 0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5) + react-native-gesture-handler@2.25.0(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): dependencies: '@egjs/hammerjs': 2.0.17 @@ -29900,9 +29895,9 @@ snapshots: react: 18.3.1 react-native: 0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5) - react-native-image-colors@2.4.0(expo@52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): + react-native-image-colors@2.4.0(expo@52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): dependencies: - expo: 52.0.44(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) + expo: 52.0.46(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@expo/metro-runtime@4.0.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5)))(bufferutil@4.0.9)(encoding@0.1.13)(graphql@16.8.1)(react-native-webview@13.13.5(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(utf-8-validate@6.0.5) node-vibrant: 3.1.6 react: 18.3.1 react-native: 0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5) @@ -29921,17 +29916,17 @@ snapshots: react: 18.3.1 react-native: 0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5) - react-native-is-edge-to-edge@1.1.6(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): + react-native-is-edge-to-edge@1.1.7(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): dependencies: react: 18.3.1 react-native: 0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5) - react-native-keyboard-controller@1.16.8(react-native-reanimated@3.17.2(@babel/core@7.26.10)(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): + react-native-keyboard-controller@1.17.0(react-native-reanimated@3.17.4(@babel/core@7.26.10)(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): dependencies: react: 18.3.1 react-native: 0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5) - react-native-is-edge-to-edge: 1.1.6(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) - react-native-reanimated: 3.17.2(@babel/core@7.26.10)(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) + react-native-is-edge-to-edge: 1.1.7(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) + react-native-reanimated: 3.17.4(@babel/core@7.26.10)(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) react-native-otp-entry@1.8.4(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): dependencies: @@ -29943,7 +29938,7 @@ snapshots: react: 18.3.1 react-native: 0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5) - react-native-reanimated@3.17.2(@babel/core@7.26.10)(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): + react-native-reanimated@3.17.4(@babel/core@7.26.10)(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): dependencies: '@babel/core': 7.26.10 '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.10) @@ -29959,13 +29954,13 @@ snapshots: invariant: 2.2.4 react: 18.3.1 react-native: 0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5) - react-native-is-edge-to-edge: 1.1.6(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) + react-native-is-edge-to-edge: 1.1.7(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) transitivePeerDependencies: - supports-color react-native-root-siblings@5.0.1: {} - react-native-safe-area-context@5.3.0(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): + react-native-safe-area-context@5.4.0(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): dependencies: react: 18.3.1 react-native: 0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5) @@ -29977,12 +29972,12 @@ snapshots: react-native: 0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5) warn-once: 0.1.1 - react-native-sheet-transitions@0.1.2(patch_hash=8a10ea43dd4d194a581d3d765a1eb3e864441b968d5d5729382a9986f710ef32)(react-native-gesture-handler@2.25.0(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native-reanimated@3.17.2(@babel/core@7.26.10)(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): + react-native-sheet-transitions@0.1.2(patch_hash=8a10ea43dd4d194a581d3d765a1eb3e864441b968d5d5729382a9986f710ef32)(react-native-gesture-handler@2.25.0(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native-reanimated@3.17.4(@babel/core@7.26.10)(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): dependencies: react: 18.3.1 react-native: 0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5) react-native-gesture-handler: 2.25.0(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) - react-native-reanimated: 3.17.2(@babel/core@7.26.10)(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) + react-native-reanimated: 3.17.4(@babel/core@7.26.10)(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) react-native-svg@15.11.2(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): dependencies: @@ -29997,16 +29992,16 @@ snapshots: react: 18.3.1 react-native: 0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5) - react-native-uikit-colors@0.3.10(c3c9b1a438cd987dd9135e4e8eef4db8): + react-native-uikit-colors@0.3.10(770d0d17290c2afbbfe1c689eda06db3): dependencies: apple-uikit-colors: 0.3.10 - nativewind: 4.1.23(react-native-reanimated@3.17.2(@babel/core@7.26.10)(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native-safe-area-context@5.3.0(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native-svg@15.11.2(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.0)(typescript@5.8.3))) + nativewind: 4.1.23(react-native-reanimated@3.17.4(@babel/core@7.26.10)(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native-safe-area-context@5.4.0(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native-svg@15.11.2(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1))(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1)(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3))) react: 18.3.1 react-native: 0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5) - tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@22.14.0)(typescript@5.8.3)) + tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3)) tailwindcss-uikit-colors: 0.3.10 - react-native-video@6.11.0(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): + react-native-video@6.12.0(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): dependencies: react: 18.3.1 react-native: 0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5) @@ -30101,6 +30096,8 @@ snapshots: react-refresh@0.14.2: {} + react-refresh@0.17.0: {} + react-remove-scroll-bar@2.3.8(@types/react@18.3.12)(react@18.3.1): dependencies: react: 18.3.1 @@ -30120,9 +30117,8 @@ snapshots: optionalDependencies: '@types/react': 18.3.12 - react-router@7.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-router@7.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@types/cookie': 0.6.0 cookie: 1.0.2 react: 18.3.1 set-cookie-parser: 2.7.1 @@ -30130,7 +30126,7 @@ snapshots: optionalDependencies: react-dom: 18.3.1(react@18.3.1) - react-scan@0.3.3(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react-router@7.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(rollup@4.39.0): + react-scan@0.3.3(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react-router@7.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(rollup@4.40.0): dependencies: '@babel/core': 7.26.10 '@babel/generator': 7.27.0 @@ -30139,7 +30135,7 @@ snapshots: '@clack/prompts': 0.8.2 '@pivanov/utils': 0.0.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@preact/signals': 1.3.2(preact@10.26.4) - '@rollup/pluginutils': 5.1.4(rollup@4.39.0) + '@rollup/pluginutils': 5.1.4(rollup@4.40.0) '@types/node': 20.17.30 bippy: 0.3.8(@types/react@18.3.12)(react@18.3.1) esbuild: 0.24.2 @@ -30152,7 +30148,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) tsx: 4.19.3 optionalDependencies: - react-router: 7.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-router: 7.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) unplugin: 2.1.0 transitivePeerDependencies: - '@types/react' @@ -30210,7 +30206,7 @@ snapshots: dependencies: find-up-simple: 1.0.1 read-pkg: 9.0.1 - type-fest: 4.38.0 + type-fest: 4.40.0 read-pkg-up@2.0.0: dependencies: @@ -30227,8 +30223,8 @@ snapshots: dependencies: '@types/normalize-package-data': 2.4.4 normalize-package-data: 6.0.2 - parse-json: 8.2.0 - type-fest: 4.38.0 + parse-json: 8.3.0 + type-fest: 4.40.0 unicorn-magic: 0.1.0 readable-stream@2.3.8: @@ -30292,7 +30288,7 @@ snapshots: dependencies: resolve: 1.22.10 - recyclerlistview@4.2.1(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): + recyclerlistview@4.2.3(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1): dependencies: lodash.debounce: 4.0.8 prop-types: 15.8.1 @@ -30629,52 +30625,34 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.37.0 fsevents: 2.3.3 - rollup@4.39.0: + rollup@4.40.0: dependencies: '@types/estree': 1.0.7 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.39.0 - '@rollup/rollup-android-arm64': 4.39.0 - '@rollup/rollup-darwin-arm64': 4.39.0 - '@rollup/rollup-darwin-x64': 4.39.0 - '@rollup/rollup-freebsd-arm64': 4.39.0 - '@rollup/rollup-freebsd-x64': 4.39.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.39.0 - '@rollup/rollup-linux-arm-musleabihf': 4.39.0 - '@rollup/rollup-linux-arm64-gnu': 4.39.0 - '@rollup/rollup-linux-arm64-musl': 4.39.0 - '@rollup/rollup-linux-loongarch64-gnu': 4.39.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.39.0 - '@rollup/rollup-linux-riscv64-gnu': 4.39.0 - '@rollup/rollup-linux-riscv64-musl': 4.39.0 - '@rollup/rollup-linux-s390x-gnu': 4.39.0 - '@rollup/rollup-linux-x64-gnu': 4.39.0 - '@rollup/rollup-linux-x64-musl': 4.39.0 - '@rollup/rollup-win32-arm64-msvc': 4.39.0 - '@rollup/rollup-win32-ia32-msvc': 4.39.0 - '@rollup/rollup-win32-x64-msvc': 4.39.0 + '@rollup/rollup-android-arm-eabi': 4.40.0 + '@rollup/rollup-android-arm64': 4.40.0 + '@rollup/rollup-darwin-arm64': 4.40.0 + '@rollup/rollup-darwin-x64': 4.40.0 + '@rollup/rollup-freebsd-arm64': 4.40.0 + '@rollup/rollup-freebsd-x64': 4.40.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.40.0 + '@rollup/rollup-linux-arm-musleabihf': 4.40.0 + '@rollup/rollup-linux-arm64-gnu': 4.40.0 + '@rollup/rollup-linux-arm64-musl': 4.40.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.40.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.40.0 + '@rollup/rollup-linux-riscv64-gnu': 4.40.0 + '@rollup/rollup-linux-riscv64-musl': 4.40.0 + '@rollup/rollup-linux-s390x-gnu': 4.40.0 + '@rollup/rollup-linux-x64-gnu': 4.40.0 + '@rollup/rollup-linux-x64-musl': 4.40.0 + '@rollup/rollup-win32-arm64-msvc': 4.40.0 + '@rollup/rollup-win32-ia32-msvc': 4.40.0 + '@rollup/rollup-win32-x64-msvc': 4.40.0 fsevents: 2.3.3 rou3@0.5.1: {} - rspack-resolver@1.3.0: - optionalDependencies: - '@unrs/rspack-resolver-binding-darwin-arm64': 1.3.0 - '@unrs/rspack-resolver-binding-darwin-x64': 1.3.0 - '@unrs/rspack-resolver-binding-freebsd-x64': 1.3.0 - '@unrs/rspack-resolver-binding-linux-arm-gnueabihf': 1.3.0 - '@unrs/rspack-resolver-binding-linux-arm-musleabihf': 1.3.0 - '@unrs/rspack-resolver-binding-linux-arm64-gnu': 1.3.0 - '@unrs/rspack-resolver-binding-linux-arm64-musl': 1.3.0 - '@unrs/rspack-resolver-binding-linux-ppc64-gnu': 1.3.0 - '@unrs/rspack-resolver-binding-linux-s390x-gnu': 1.3.0 - '@unrs/rspack-resolver-binding-linux-x64-gnu': 1.3.0 - '@unrs/rspack-resolver-binding-linux-x64-musl': 1.3.0 - '@unrs/rspack-resolver-binding-wasm32-wasi': 1.3.0 - '@unrs/rspack-resolver-binding-win32-arm64-msvc': 1.3.0 - '@unrs/rspack-resolver-binding-win32-ia32-msvc': 1.3.0 - '@unrs/rspack-resolver-binding-win32-x64-msvc': 1.3.0 - rtl-detect@1.1.2: {} run-async@2.4.1: @@ -30762,7 +30740,7 @@ snapshots: refa: 0.12.1 regexp-ast-analysis: 0.7.1 - secure-json-parse@3.0.2: {} + secure-json-parse@4.0.0: {} seek-bzip@1.0.6: dependencies: @@ -30950,14 +30928,14 @@ snapshots: shell-quote@1.8.2: {} - shiki@3.2.1: + shiki@3.2.2: dependencies: - '@shikijs/core': 3.2.1 - '@shikijs/engine-javascript': 3.2.1 - '@shikijs/engine-oniguruma': 3.2.1 - '@shikijs/langs': 3.2.1 - '@shikijs/themes': 3.2.1 - '@shikijs/types': 3.2.1 + '@shikijs/core': 3.2.2 + '@shikijs/engine-javascript': 3.2.2 + '@shikijs/engine-oniguruma': 3.2.2 + '@shikijs/langs': 3.2.2 + '@shikijs/themes': 3.2.2 + '@shikijs/types': 3.2.2 '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 @@ -31360,8 +31338,6 @@ snapshots: pirates: 4.0.7 ts-interface-checker: 0.1.13 - sudo-prompt@8.2.5: {} - sudo-prompt@9.1.1: {} sudo-prompt@9.2.1: {} @@ -31410,7 +31386,7 @@ snapshots: synckit@0.10.3: dependencies: - '@pkgr/core': 0.2.0 + '@pkgr/core': 0.2.4 tslib: 2.8.1 synckit@0.9.2: @@ -31422,25 +31398,25 @@ snapshots: tabbable@6.2.0: {} - tailwind-merge@3.1.0: {} + tailwind-merge@3.2.0: {} - tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.0)(typescript@5.8.3))): + tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3))): dependencies: - tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@22.14.0)(typescript@5.8.3)) + tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3)) - tailwindcss-motion@1.1.0(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.0)(typescript@5.8.3))): + tailwindcss-motion@1.1.0(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3))): dependencies: - tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@22.14.0)(typescript@5.8.3)) + tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3)) - tailwindcss-safe-area@0.6.0(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.0)(typescript@5.8.3))): + tailwindcss-safe-area@0.6.0(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3))): dependencies: - tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@22.14.0)(typescript@5.8.3)) + tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3)) tailwindcss-uikit-colors@0.3.10: dependencies: apple-uikit-colors: 0.3.10 - tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.0)(typescript@5.8.3)): + tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -31459,7 +31435,7 @@ snapshots: postcss: 8.5.3 postcss-import: 15.1.0(postcss@8.5.3) postcss-js: 4.0.1(postcss@8.5.3) - postcss-load-config: 4.0.2(postcss@8.5.3)(ts-node@10.9.2(@types/node@22.14.0)(typescript@5.8.3)) + postcss-load-config: 4.0.2(postcss@8.5.3)(ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3)) postcss-nested: 6.2.0(postcss@8.5.3) postcss-selector-parser: 6.1.2 resolve: 1.22.10 @@ -31610,11 +31586,11 @@ snapshots: tinyspy@3.0.2: {} - tldts-core@6.1.85: {} + tldts-core@7.0.0: {} - tldts@6.1.85: + tldts@7.0.0: dependencies: - tldts-core: 6.1.85 + tldts-core: 7.0.0 tmp-promise@3.0.3: dependencies: @@ -31623,6 +31599,7 @@ snapshots: tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 + optional: true tmp@0.2.3: {} @@ -31726,14 +31703,14 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - ts-node@10.9.2(@types/node@22.14.0)(typescript@5.8.3): + ts-node@10.9.2(@types/node@22.14.1)(typescript@5.8.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 22.14.0 + '@types/node': 22.14.1 acorn: 8.14.1 acorn-walk: 8.3.4 arg: 4.1.3 @@ -31746,7 +31723,7 @@ snapshots: ts-object-utils@0.0.5: {} - ts-pattern@5.6.2: {} + ts-pattern@5.7.0: {} ts-tiny-invariant@2.0.5: {} @@ -31855,6 +31832,8 @@ snapshots: type-fest@4.38.0: {} + type-fest@4.40.0: {} + typed-array-buffer@1.0.3: dependencies: call-bound: 1.0.4 @@ -31888,11 +31867,11 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.28.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3): + typescript-eslint@8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.28.0(@typescript-eslint/parser@8.28.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/parser': 8.28.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/utils': 8.28.0(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/eslint-plugin': 8.30.1(@typescript-eslint/parser@8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/parser': 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.30.1(eslint@9.24.0(jiti@2.4.2))(typescript@5.8.3) eslint: 9.24.0(jiti@2.4.2) typescript: 5.8.3 transitivePeerDependencies: @@ -32053,18 +32032,12 @@ snapshots: unpipe@1.0.0: {} - unplugin-ast@0.14.4: + unplugin-ast@0.14.6: dependencies: '@babel/generator': 7.27.0 ast-kit: 1.4.2 - magic-string-ast: 0.8.0 - unplugin: 2.2.2 - unplugin-utils: 0.2.4 - - unplugin-utils@0.2.4: - dependencies: - pathe: 2.0.3 - picomatch: 4.0.2 + magic-string-ast: 0.9.1 + unplugin: 2.3.2 unplugin@1.0.1: dependencies: @@ -32079,11 +32052,31 @@ snapshots: webpack-virtual-modules: 0.6.2 optional: true - unplugin@2.2.2: + unplugin@2.3.2: dependencies: acorn: 8.14.1 + picomatch: 4.0.2 webpack-virtual-modules: 0.6.2 + unrs-resolver@1.5.0: + optionalDependencies: + '@unrs/resolver-binding-darwin-arm64': 1.5.0 + '@unrs/resolver-binding-darwin-x64': 1.5.0 + '@unrs/resolver-binding-freebsd-x64': 1.5.0 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.5.0 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.5.0 + '@unrs/resolver-binding-linux-arm64-gnu': 1.5.0 + '@unrs/resolver-binding-linux-arm64-musl': 1.5.0 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.5.0 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.5.0 + '@unrs/resolver-binding-linux-s390x-gnu': 1.5.0 + '@unrs/resolver-binding-linux-x64-gnu': 1.5.0 + '@unrs/resolver-binding-linux-x64-musl': 1.5.0 + '@unrs/resolver-binding-wasm32-wasi': 1.5.0 + '@unrs/resolver-binding-win32-arm64-msvc': 1.5.0 + '@unrs/resolver-binding-win32-ia32-msvc': 1.5.0 + '@unrs/resolver-binding-win32-x64-msvc': 1.5.0 + untildify@4.0.0: {} unused-filename@4.0.1: @@ -32193,6 +32186,7 @@ snapshots: valibot@1.0.0-beta.15(typescript@5.8.3): optionalDependencies: typescript: 5.8.3 + optional: true validate-npm-package-license@3.0.4: dependencies: @@ -32207,7 +32201,7 @@ snapshots: vaul@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@radix-ui/react-dialog': 1.1.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-dialog': 1.1.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: @@ -32245,13 +32239,13 @@ snapshots: vite-bundle-analyzer@0.18.1: {} - vite-node@3.1.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1): + vite-node@3.1.1(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1): dependencies: cac: 6.7.14 debug: 4.4.0(supports-color@8.1.1) es-module-lexer: 1.6.0 pathe: 2.0.3 - vite: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1) + vite: 6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1) transitivePeerDependencies: - '@types/node' - jiti @@ -32266,21 +32260,21 @@ snapshots: - tsx - yaml - vite-plugin-mkcert@1.17.8(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)): + vite-plugin-mkcert@1.17.8(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)): dependencies: axios: 1.8.4(debug@4.4.0) debug: 4.4.0(supports-color@8.1.1) picocolors: 1.1.1 - vite: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1) + vite: 6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1) transitivePeerDependencies: - supports-color - vite-plugin-pwa@1.0.0(@vite-pwa/assets-generator@1.0.0)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0): + vite-plugin-pwa@1.0.0(@vite-pwa/assets-generator@1.0.0)(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))(workbox-build@7.3.0(@types/babel__core@7.20.5))(workbox-window@7.3.0): dependencies: debug: 4.4.0(supports-color@8.1.1) pretty-bytes: 6.1.1 tinyglobby: 0.2.12 - vite: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1) + vite: 6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1) workbox-build: 7.3.0(@types/babel__core@7.20.5) workbox-window: 7.3.0 optionalDependencies: @@ -32288,24 +32282,27 @@ snapshots: transitivePeerDependencies: - supports-color - vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)): + vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)): dependencies: debug: 4.4.0(supports-color@8.1.1) globrex: 0.1.2 tsconfck: 3.1.5(typescript@5.8.3) optionalDependencies: - vite: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1) + vite: 6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1) transitivePeerDependencies: - supports-color - typescript - vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1): + vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1): dependencies: esbuild: 0.25.2 + fdir: 6.4.3(picomatch@4.0.2) + picomatch: 4.0.2 postcss: 8.5.3 - rollup: 4.39.0 + rollup: 4.40.0 + tinyglobby: 0.2.12 optionalDependencies: - '@types/node': 22.14.0 + '@types/node': 22.14.1 fsevents: 2.3.3 jiti: 2.4.2 lightningcss: 1.29.3 @@ -32313,10 +32310,10 @@ snapshots: tsx: 4.19.3 yaml: 2.7.1 - vitest@3.1.1(@edge-runtime/vm@3.2.0)(@types/debug@4.1.12)(@types/node@22.14.0)(happy-dom@17.4.4)(jiti@2.4.2)(jsdom@20.0.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1): + vitest@3.1.1(@edge-runtime/vm@3.2.0)(@types/debug@4.1.12)(@types/node@22.14.1)(happy-dom@17.4.4)(jiti@2.4.2)(jsdom@20.0.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1): dependencies: '@vitest/expect': 3.1.1 - '@vitest/mocker': 3.1.1(vite@6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)) + '@vitest/mocker': 3.1.1(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1)) '@vitest/pretty-format': 3.1.1 '@vitest/runner': 3.1.1 '@vitest/snapshot': 3.1.1 @@ -32332,13 +32329,13 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.2.5(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1) - vite-node: 3.1.1(@types/node@22.14.0)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1) + vite: 6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1) + vite-node: 3.1.1(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.29.3)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1) why-is-node-running: 2.3.0 optionalDependencies: '@edge-runtime/vm': 3.2.0 '@types/debug': 4.1.12 - '@types/node': 22.14.0 + '@types/node': 22.14.1 happy-dom: 17.4.4 jsdom: 20.0.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) transitivePeerDependencies: @@ -32500,6 +32497,7 @@ snapshots: which@4.0.0: dependencies: isexe: 3.1.1 + optional: true why-is-node-running@2.3.0: dependencies: @@ -32749,8 +32747,6 @@ snapshots: yaml@2.6.0: {} - yaml@2.7.0: {} - yaml@2.7.1: {} yargs-parser@18.1.3: @@ -32797,8 +32793,8 @@ snapshots: zeego@3.0.6(7baa755d257c8317dd25d3d2a15d809c): dependencies: - '@radix-ui/react-context-menu': 2.2.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-dropdown-menu': 2.1.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-context-menu': 2.2.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-dropdown-menu': 2.1.7(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@react-native-menu/menu': 1.2.3(react-native@0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5))(react@18.3.1) react: 18.3.1 react-native: 0.77.2(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@18.3.12)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@6.0.5) @@ -32816,11 +32812,11 @@ snapshots: compress-commons: 4.1.2 readable-stream: 3.6.2 - zod-validation-error@3.4.0(zod@3.24.2): + zod-validation-error@3.4.0(zod@3.24.3): dependencies: - zod: 3.24.2 + zod: 3.24.3 - zod@3.24.2: {} + zod@3.24.3: {} zustand@5.0.3(@types/react@18.3.12)(immer@10.1.1(patch_hash=594c60b929bc0a3b56576f1a1787da1aec2a1fba51e3c21ec09c0ed38280af6c))(react@18.3.1)(use-sync-external-store@1.5.0(react@18.3.1)): optionalDependencies: diff --git a/vercel.json b/vercel.json index 1824d6ae4..72cfceac4 100644 --- a/vercel.json +++ b/vercel.json @@ -1,4 +1,5 @@ { + "$schema": "https://openapi.vercel.sh/vercel.json", "rewrites": [ { "source": "/__debug_proxy", @@ -10,35 +11,163 @@ }, { "source": "/share/:path*", - "destination": "https://follow-external-ssr.vercel.app/share/:path*" + "destination": "https://follow-external-ssr.vercel.app/share/:path*", + "has": [ + { + "type": "host", + "value": "app.follow.is" + } + ] }, { "source": "/og/:path*", - "destination": "https://follow-external-ssr.vercel.app/og/:path*" + "destination": "https://follow-external-ssr.vercel.app/og/:path*", + "has": [ + { + "type": "host", + "value": "app.follow.is" + } + ] }, { "source": "/login", - "destination": "https://follow-external-ssr.vercel.app/login" + "destination": "https://follow-external-ssr.vercel.app/login", + "has": [ + { + "type": "host", + "value": "app.follow.is" + } + ] }, { "source": "/register", - "destination": "https://follow-external-ssr.vercel.app/register" + "destination": "https://follow-external-ssr.vercel.app/register", + "has": [ + { + "type": "host", + "value": "app.follow.is" + } + ] }, { "source": "/forget-password", - "destination": "https://follow-external-ssr.vercel.app/forget-password" + "destination": "https://follow-external-ssr.vercel.app/forget-password", + "has": [ + { + "type": "host", + "value": "app.follow.is" + } + ] }, { "source": "/reset-password", - "destination": "https://follow-external-ssr.vercel.app/reset-password" + "destination": "https://follow-external-ssr.vercel.app/reset-password", + "has": [ + { + "type": "host", + "value": "app.follow.is" + } + ] }, { "source": "/external-dist/:path*", - "destination": "https://follow-external-ssr.vercel.app/external-dist/:path*" + "destination": "https://follow-external-ssr.vercel.app/external-dist/:path*", + "has": [ + { + "type": "host", + "value": "app.follow.is" + } + ] }, { "source": "/dist-external/:path*", - "destination": "https://follow-external-ssr.vercel.app/dist-external/:path*" + "destination": "https://follow-external-ssr.vercel.app/dist-external/:path*", + "has": [ + { + "type": "host", + "value": "app.follow.is" + } + ] + }, + { + "source": "/share/:path*", + "destination": "https://follow-external-ssr-dev.vercel.app/share/:path*", + "has": [ + { + "type": "host", + "value": "dev.follow.is" + } + ] + }, + { + "source": "/og/:path*", + "destination": "https://follow-external-ssr-dev.vercel.app/og/:path*", + "has": [ + { + "type": "host", + "value": "dev.follow.is" + } + ] + }, + { + "source": "/login", + "destination": "https://follow-external-ssr-dev.vercel.app/login", + "has": [ + { + "type": "host", + "value": "dev.follow.is" + } + ] + }, + { + "source": "/register", + "destination": "https://follow-external-ssr-dev.vercel.app/register", + "has": [ + { + "type": "host", + "value": "dev.follow.is" + } + ] + }, + { + "source": "/forget-password", + "destination": "https://follow-external-ssr-dev.vercel.app/forget-password", + "has": [ + { + "type": "host", + "value": "dev.follow.is" + } + ] + }, + { + "source": "/reset-password", + "destination": "https://follow-external-ssr-dev.vercel.app/reset-password", + "has": [ + { + "type": "host", + "value": "dev.follow.is" + } + ] + }, + { + "source": "/external-dist/:path*", + "destination": "https://follow-external-ssr-dev.vercel.app/external-dist/:path*", + "has": [ + { + "type": "host", + "value": "dev.follow.is" + } + ] + }, + { + "source": "/dist-external/:path*", + "destination": "https://follow-external-ssr-dev.vercel.app/dist-external/:path*", + "has": [ + { + "type": "host", + "value": "dev.follow.is" + } + ] }, { "source": "/((?!assets|vendor|locales|dist-external|external-dist/).*)",