From 49cbcc0a7db11dee14755a1bf459b9e3958d5b9c Mon Sep 17 00:00:00 2001 From: acharlop Date: Wed, 9 Sep 2026 22:21:46 +0200 Subject: [PATCH 01/17] chore(tokens): render the design tokens as a Tailwind v4 @theme block MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Tailwind v4 is CSS-first: a theme is CSS custom properties in an `@theme` block, and there is no supported way to hand it a plain JS object (`@config` only loads a whole v3-shaped config file). So the tokens stay authored in TypeScript — still the single source of truth — and are *rendered* to a committed `theme.css` that both apps import. `theme-css.test.ts` is both the generator (`GENERATE_THEME_CSS=1`, via `pnpm --filter @whocards/tokens generate:theme`) and the drift guard: a token change that forgets to regenerate fails CI. The generated file is excluded from oxfmt so the formatter and the generator can't fight over it. Drops `tailwind-preset.ts` (a v3 `theme.extend` object) — nothing can consume it under Tailwind v4. --- .oxfmtrc.json | 1 + packages/tokens/package.json | 4 +- packages/tokens/src/tailwind-preset.ts | 33 ----------- packages/tokens/src/theme-css.test.ts | 32 +++++++++++ packages/tokens/src/theme-css.ts | 80 ++++++++++++++++++++++++++ packages/tokens/src/tokens.test.ts | 11 +--- packages/tokens/theme.css | 51 ++++++++++++++++ packages/tokens/tsconfig.json | 3 +- 8 files changed, 170 insertions(+), 45 deletions(-) delete mode 100644 packages/tokens/src/tailwind-preset.ts create mode 100644 packages/tokens/src/theme-css.test.ts create mode 100644 packages/tokens/src/theme-css.ts create mode 100644 packages/tokens/theme.css diff --git a/.oxfmtrc.json b/.oxfmtrc.json index d147ee1c..b3062ab6 100644 --- a/.oxfmtrc.json +++ b/.oxfmtrc.json @@ -21,6 +21,7 @@ "**/.turbo/**", "pnpm-lock.yaml", "**/drizzle/**", + "packages/tokens/theme.css", "apps/website/**", "**/routeTree.gen.ts" ] diff --git a/packages/tokens/package.json b/packages/tokens/package.json index ae749980..e3d87499 100644 --- a/packages/tokens/package.json +++ b/packages/tokens/package.json @@ -5,13 +5,15 @@ "type": "module", "exports": { ".": "./src/index.ts", - "./tailwind-preset": "./src/tailwind-preset.ts" + "./theme.css": "./theme.css" }, "scripts": { + "generate:theme": "GENERATE_THEME_CSS=1 vitest run src/theme-css.test.ts", "typecheck": "tsc --noEmit", "test": "vitest run" }, "devDependencies": { + "@types/node": "catalog:", "@whocards/typescript-config": "workspace:*", "typescript": "catalog:", "vitest": "catalog:" diff --git a/packages/tokens/src/tailwind-preset.ts b/packages/tokens/src/tailwind-preset.ts deleted file mode 100644 index 20275fd6..00000000 --- a/packages/tokens/src/tailwind-preset.ts +++ /dev/null @@ -1,33 +0,0 @@ -import {colors} from './colors' -import {gradients} from './gradients' -import {radius, spacing} from './spacing' -import {fonts} from './typography' - -/** - * Tailwind `theme.extend` shaped from the tokens. Consumed by mobile's NativeWind - * config and available to regenerate the web's `@theme` block, so utility classes - * (`bg-yellow-400`, `text-primary-light`, `rounded-2.5xl`, `font-title`, …) resolve - * the same on every surface. - */ -export const tailwindTheme = { - extend: { - colors, - spacing, - borderRadius: radius, - fontFamily: { - sans: [...fonts.sans.stack], - title: [...fonts.title.stack], - chinese: [...fonts.chinese.stack], - hebrew: [...fonts.hebrew.stack], - japanese: [...fonts.japanese.stack], - }, - backgroundImage: { - 'gradient-primary': gradients.primary, - }, - }, -} as const - -/** A drop-in Tailwind preset: `presets: [tailwindPreset]`. */ -export const tailwindPreset = {theme: tailwindTheme} as const - -export type TailwindPreset = typeof tailwindPreset diff --git a/packages/tokens/src/theme-css.test.ts b/packages/tokens/src/theme-css.test.ts new file mode 100644 index 00000000..6bc32fe0 --- /dev/null +++ b/packages/tokens/src/theme-css.test.ts @@ -0,0 +1,32 @@ +/** + * `theme.css` is a generated artifact — the TypeScript tokens rendered as a + * Tailwind v4 `@theme` block (see theme-css.ts for why it has to be rendered at + * all). This file is both the drift guard and the generator: + * + * - normally it asserts the committed file matches the renderer, so a token + * change that forgets to regenerate fails CI; + * - with `GENERATE_THEME_CSS=1` (`pnpm --filter @whocards/tokens + * generate:theme`) it writes the file instead. + * + * Deliberately one file rather than a script plus a separate check: a + * standalone Node script can't load this package's extensionless TypeScript + * imports without adding a runner dependency, and a generator that shares no + * code with its own check can drift from it. + */ +import {readFileSync, writeFileSync} from 'node:fs' +import {fileURLToPath} from 'node:url' +import {describe, expect, it} from 'vitest' + +import {renderThemeCss} from './theme-css' + +const themeCssPath = fileURLToPath(new URL('../theme.css', import.meta.url)) + +describe('theme.css', () => { + it('matches the tokens it is generated from', () => { + const rendered = renderThemeCss() + + if (process.env.GENERATE_THEME_CSS) writeFileSync(themeCssPath, rendered) + + expect(readFileSync(themeCssPath, 'utf8')).toBe(rendered) + }) +}) diff --git a/packages/tokens/src/theme-css.ts b/packages/tokens/src/theme-css.ts new file mode 100644 index 00000000..8007b197 --- /dev/null +++ b/packages/tokens/src/theme-css.ts @@ -0,0 +1,80 @@ +/** + * Renders the design tokens as a Tailwind v4 `@theme` block. + * + * Tailwind v4 is CSS-first: a theme is CSS custom properties in a `@theme` + * block, not a JS `theme.extend` object, and there is no supported way to hand + * it a plain JS object (`@config` only loads a whole *v3-shaped* config file). + * So the tokens — still authored in TypeScript, still the single source of + * truth — are *rendered* to CSS here, and the rendered file (`theme.css`) is + * committed next to them and imported by both apps. `theme-css.test.ts` fails + * if the committed file ever drifts from this renderer. + * + * Keep in sync with the Tailwind v4 theme namespaces: + * https://tailwindcss.com/docs/theme#theme-variable-namespaces + */ +import {colors} from './colors' +import {gradients} from './gradients' +import {radius, spacing} from './spacing' +import {fonts} from './typography' + +/** `4.5` → `4\.5` — a `.` is a class separator in CSS, so it must be escaped. */ +const escapeName = (name: string) => name.replace(/\./g, '\\.') + +const line = (namespace: string, name: string, value: string) => + ` --${namespace}-${escapeName(name)}: ${value};` + +/** + * Flattens one colour token into its `--color-*` declarations. A nested group + * renders `group-shade` per shade, with a `DEFAULT` shade rendering as the bare + * group name (`--color-gray`), matching Tailwind's own `DEFAULT` convention. + */ +const colorLines = (name: string, value: string | Record): string[] => { + if (typeof value === 'string') return [line('color', name, value)] + return Object.entries(value).map(([shade, hex]) => + line('color', shade === 'DEFAULT' ? name : `${name}-${shade}`, hex) + ) +} + +const section = (title: string, lines: string[]) => [` /* ${title} */`, ...lines].join('\n') + +/** The tokens as a Tailwind v4 `@theme` block. The body of `theme.css`. */ +export const renderThemeCss = (): string => { + const body = [ + section( + 'Spacing — extra steps beyond Tailwind’s default scale', + Object.entries(spacing).map(([name, value]) => line('spacing', name, value)) + ), + section( + 'Border radius', + Object.entries(radius).map(([name, value]) => line('radius', name, value)) + ), + section( + 'Colours', + Object.entries(colors).flatMap(([name, value]) => colorLines(name, value)) + ), + section( + 'Font families', + Object.entries(fonts).map(([name, font]) => line('font', name, font.stack.join(', '))) + ), + section( + 'Background images', + Object.entries(gradients).map(([name, value]) => + line('background-image', `gradient-${name}`, value) + ) + ), + ].join('\n\n') + + return `/* + * GENERATED FILE — do not edit by hand. + * Source of truth: packages/tokens/src/*.ts, rendered by src/theme-css.ts. + * Regenerate with \`pnpm --filter @whocards/tokens generate:theme\`. + * + * Imported by every surface that uses Tailwind, so \`bg-yellow-400\`, + * \`text-mutedOnLight\`, \`rounded-2.5xl\`, \`font-title\`, … resolve to the same + * value on the website (Tailwind v4) and in the app (NativeWind v5). + */ +@theme { +${body} +} +` +} diff --git a/packages/tokens/src/tokens.test.ts b/packages/tokens/src/tokens.test.ts index 7bd15b7c..8a86e0af 100644 --- a/packages/tokens/src/tokens.test.ts +++ b/packages/tokens/src/tokens.test.ts @@ -1,7 +1,6 @@ import {describe, expect, it} from 'vitest' import {colors, fonts, gradients, radius, spacing, tokens} from './index' -import {tailwindTheme} from './tailwind-preset' /** * `Object.keys` always widens to `string[]`; every key set this test walks is @@ -39,16 +38,8 @@ describe('gradients', () => { }) }) -describe('aggregate + tailwind preset', () => { +describe('aggregate', () => { it('groups every token family', () => { expect(tokens).toMatchObject({colors, spacing, radius, fonts, gradients}) }) - - it('shapes a tailwind theme.extend that mirrors the tokens', () => { - expect(tailwindTheme.extend.colors).toBe(colors) - expect(tailwindTheme.extend.borderRadius).toBe(radius) - expect(tailwindTheme.extend.spacing).toBe(spacing) - expect(tailwindTheme.extend.fontFamily.title[0]).toBe('aptly') - expect(tailwindTheme.extend.backgroundImage['gradient-primary']).toBe(gradients.primary) - }) }) diff --git a/packages/tokens/theme.css b/packages/tokens/theme.css new file mode 100644 index 00000000..b2f2eeb6 --- /dev/null +++ b/packages/tokens/theme.css @@ -0,0 +1,51 @@ +/* + * GENERATED FILE — do not edit by hand. + * Source of truth: packages/tokens/src/*.ts, rendered by src/theme-css.ts. + * Regenerate with `pnpm --filter @whocards/tokens generate:theme`. + * + * Imported by every surface that uses Tailwind, so `bg-yellow-400`, + * `text-mutedOnLight`, `rounded-2.5xl`, `font-title`, … resolve to the same + * value on the website (Tailwind v4) and in the app (NativeWind v5). + */ +@theme { + /* Spacing — extra steps beyond Tailwind’s default scale */ + --spacing-4\.5: 1.125rem; + --spacing-7\.5: 1.875rem; + + /* Border radius */ + --radius-2\.5xl: 1.25rem; + + /* Colours */ + --color-yellow-100: #7e7552; + --color-yellow-300: #ffe37e; + --color-yellow-400: #f9d75f; + --color-yellow-500: #f6c944; + --color-gray: #65636e; + --color-gray-lighter: #dcdee9; + --color-gray-light: #474a69; + --color-gray-dark: #9698af; + --color-primary-light: #f9d75f; + --color-primary-dark: #c058d2; + --color-dark: #262432; + --color-darker: #111516; + --color-darkest: #08001a; + --color-background: #0d051f; + --color-white: #f5f5f5; + --color-red: #ee1e23; + --color-canvasLight: #efe7f7; + --color-mutedOnLight: #6b6d82; + --color-accentOnLight: #9a3aac; + --color-errorOnLight: #c9151a; + --color-accentOnDark: #d485e2; + --color-errorOnDark: #ff5b5f; + + /* Font families */ + --font-sans: golos-text, ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; + --font-title: aptly, ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; + --font-chinese: noto-sans-chinese, ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; + --font-hebrew: noto-sans-hebrew, ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; + --font-japanese: noto-sans-japanese, ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; + + /* Background images */ + --background-image-gradient-primary: linear-gradient(to bottom left, #c058d2 25%, #f9d75f 92%); +} diff --git a/packages/tokens/tsconfig.json b/packages/tokens/tsconfig.json index 2944ed3a..23b73c69 100644 --- a/packages/tokens/tsconfig.json +++ b/packages/tokens/tsconfig.json @@ -1,7 +1,8 @@ { "extends": "@whocards/typescript-config/base.json", "compilerOptions": { - "noEmit": true + "noEmit": true, + "types": ["node"] }, "include": ["src"], "exclude": ["node_modules", "dist"] From 3e94342760d4c6226c7cc9df3d5e33bf06aa4b47 Mon Sep 17 00:00:00 2001 From: acharlop Date: Wed, 9 Sep 2026 22:22:04 +0200 Subject: [PATCH 02/17] chore(mobile): migrate to NativeWind 5 and Tailwind 4 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Dependabot's tailwindcss 3.4.19 -> 4.3.3 bump (#280) is green in CI but would have shipped an unstyled app: NativeWind 4.2.6 imports `tailwindcss/lib/cli`, `tailwindcss/lib/util/*`, `tailwindcss/loadConfig` and `tailwindcss/types/config` — all v3-only paths that v4 removed — and the Quality gate runs no Metro or native build, so nothing catches it. NativeWind v5 is the supported path onto Tailwind v4. - `tailwind.config.ts` is gone; `src/global.css` is the whole configuration (`@import`s, `@source`, and the generated `@whocards/tokens/theme.css`). - Metro: `withNativewind(config)` — no `input` option; global.css is imported as a normal module from `src/app/_layout.tsx`. The v5 resolver is what gives every RN primitive its `className` prop. - `nativewind`'s `colorScheme`/`useColorScheme` exports are gone in v5. The equivalent react-native-css API is wrapped in `src/lib/color-scheme.ts` so the seven components that read the resolved scheme in JS keep one import site. - `@expo/metro-config>lightningcss` is pinned to 1.30.1: react-native-css resolves lightningcss through @expo/metro-config, and >= 1.32 regressed the napi visitor bridge so any unresolved `var()` throws during `transform()` — which Tailwind v4's preflight and `@property` rules both emit. Without the pin every Metro build fails. Rationale is inline in pnpm-workspace.yaml. nativewind@5.0.0-preview.4 is a preview release; there is no stable v5 yet. --- apps/mobile/babel.config.js | 13 +- apps/mobile/metro.config.js | 8 +- apps/mobile/nativewind-env.d.ts | 9 +- apps/mobile/package.json | 9 +- apps/mobile/postcss.config.mjs | 10 + apps/mobile/src/app/_layout.tsx | 18 +- apps/mobile/src/app/play/[deck].tsx | 5 +- apps/mobile/src/components/pick-player.tsx | 5 +- apps/mobile/src/components/player-bar.tsx | 5 +- .../src/components/screen-background.tsx | 5 +- apps/mobile/src/components/settings-modal.tsx | 5 +- .../src/components/settings-sheet-header.tsx | 5 +- apps/mobile/src/components/share-modal.tsx | 5 +- apps/mobile/src/global.css | 37 +- apps/mobile/src/hooks/use-theme-setting.ts | 26 +- apps/mobile/src/lib/color-scheme.ts | 70 +++ apps/mobile/tailwind.config.ts | 12 - apps/mobile/tsconfig.json | 2 +- pnpm-lock.yaml | 545 ++++++------------ pnpm-workspace.yaml | 12 + 20 files changed, 371 insertions(+), 435 deletions(-) create mode 100644 apps/mobile/postcss.config.mjs create mode 100644 apps/mobile/src/lib/color-scheme.ts delete mode 100644 apps/mobile/tailwind.config.ts diff --git a/apps/mobile/babel.config.js b/apps/mobile/babel.config.js index 65407051..fea48111 100644 --- a/apps/mobile/babel.config.js +++ b/apps/mobile/babel.config.js @@ -1,13 +1,24 @@ +const path = require('node:path') + module.exports = function (api) { // Calling api.env() registers env-keyed caching (so we must NOT also call // api.cache(true), which would throw "Caching has already been configured"). const isTest = api.env('test') return { - presets: [['babel-preset-expo', {jsxImportSource: 'nativewind'}], 'nativewind/babel'], + presets: ['babel-preset-expo'], // In Metro builds, babel-preset-expo already injects babel-plugin-react-compiler // (it reads app.json experiments.reactCompiler via the Metro caller), so adding it // here too would run the compiler twice. Jest has no Metro caller, so the preset // can't inject it — add it explicitly for the test transform only. plugins: isTest ? ['babel-plugin-react-compiler'] : [], + // NativeWind v5 makes `className` work by swapping `react-native` for + // `react-native-css/components`. On device that swap is done by the Metro + // resolver (see metro.config.js), which only rewrites the app's own modules. + // Jest has no Metro, so there the rewrite has to happen in Babel — but the + // Babel transform also runs over react-native's own internals, and rewriting + // *those* deadlocks the jest-expo Image mock (react-native's LogBox imports + // Image, which would resolve back into the half-initialised mock). Scoping + // the preset to src/ keeps the rewrite where Metro would have applied it. + overrides: isTest ? [{test: path.join(__dirname, 'src'), presets: ['nativewind/babel']}] : [], } } diff --git a/apps/mobile/metro.config.js b/apps/mobile/metro.config.js index 2841d8e9..6a6d7113 100644 --- a/apps/mobile/metro.config.js +++ b/apps/mobile/metro.config.js @@ -1,6 +1,6 @@ // Learn more: https://docs.expo.dev/guides/monorepo/ const {getDefaultConfig} = require('expo/metro-config') -const {withNativeWind} = require('nativewind/metro') +const {withNativewind} = require('nativewind/metro') const path = require('path') const projectRoot = __dirname @@ -20,4 +20,8 @@ config.resolver.nodeModulesPaths = [ // 3. Honour the "exports" field so @whocards/* resolve to their src entry points. config.resolver.unstable_enablePackageExports = true -module.exports = withNativeWind(config, {input: './src/global.css'}) +// 4. NativeWind v5: registers the CSS transformer and the resolver that swaps +// `react-native` for `react-native-css/components`, which is what gives every +// primitive its `className` prop. There is no `input` option any more — +// src/global.css is imported as a normal module from src/app/_layout.tsx. +module.exports = withNativewind(config) diff --git a/apps/mobile/nativewind-env.d.ts b/apps/mobile/nativewind-env.d.ts index 62e8864c..2ef5b750 100644 --- a/apps/mobile/nativewind-env.d.ts +++ b/apps/mobile/nativewind-env.d.ts @@ -1,3 +1,10 @@ -/// +/// +/* + * NativeWind v5 dropped the ambient `*.css` module declaration that v4's + * generated `nativewind-env.d.ts` carried, and TypeScript errors (TS2882) on a + * side-effect import it can't resolve. `src/global.css` is consumed by Metro + * (and, in tests, by jest.global-setup.js) — it has no runtime exports, so an + * empty module is the accurate type. + */ declare module '*.css' {} diff --git a/apps/mobile/package.json b/apps/mobile/package.json index e4aa727f..1a123bb6 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -53,23 +53,23 @@ "expo-store-review": "~57.0.2", "expo-system-ui": "~57.0.3", "expo-updates": "~57.0.21", - "nativewind": "^4.1.23", + "nativewind": "5.0.0-preview.4", "posthog-react-native": "^4.67.0", "react": "19.2.3", "react-dom": "19.2.3", "react-native": "0.85.3", - "react-native-css-interop": "0.2.6", + "react-native-css": "^3.0.7", "react-native-gesture-handler": "~3.2.1", "react-native-reanimated": "4.3.1", "react-native-safe-area-context": "~5.7.0", "react-native-screens": "4.25.2", "react-native-web": "~0.21.0", "react-native-worklets": "0.8.3", - "tailwindcss": "^3.4.17", "zod": "catalog:" }, "devDependencies": { "@babel/plugin-transform-react-jsx": "^7.29.7", + "@tailwindcss/postcss": "^4.3.3", "@testing-library/react-native": "^13.3.3", "@types/jest": "^29.5.14", "@types/react": "~19.2.18", @@ -77,6 +77,9 @@ "babel-preset-expo": "~57.0.10", "jest": "^29.7.0", "jest-expo": "~56.0.5", + "lightningcss": "1.30.1", + "postcss": "^8.5.28", + "tailwindcss": "^4.3.3", "typescript": "~6.0.3" } } diff --git a/apps/mobile/postcss.config.mjs b/apps/mobile/postcss.config.mjs new file mode 100644 index 00000000..579a4332 --- /dev/null +++ b/apps/mobile/postcss.config.mjs @@ -0,0 +1,10 @@ +/** + * Tailwind v4 runs as a PostCSS plugin. Expo's Metro CSS pipeline picks this + * file up when it transforms src/global.css, and NativeWind v5 compiles that + * output into the native stylesheet (see metro.config.js). + */ +export default { + plugins: { + '@tailwindcss/postcss': {}, + }, +} diff --git a/apps/mobile/src/app/_layout.tsx b/apps/mobile/src/app/_layout.tsx index e25c7cde..124c728e 100644 --- a/apps/mobile/src/app/_layout.tsx +++ b/apps/mobile/src/app/_layout.tsx @@ -1,7 +1,6 @@ import {Stack} from 'expo-router' import * as SplashScreen from 'expo-splash-screen' import {StatusBar} from 'expo-status-bar' -import {colorScheme, useColorScheme} from 'nativewind' import {PostHogProvider} from 'posthog-react-native' import {useEffect} from 'react' import {GestureHandlerRootView} from 'react-native-gesture-handler' @@ -9,6 +8,7 @@ import {identify} from '@whocards/observability' import {colors} from '@whocards/tokens' import {ErrorBoundary} from '@/components/error-boundary' +import {setColorScheme, useColorScheme} from '@/lib/color-scheme' import {getDeviceId} from '@/lib/device-id' import {initObservability, posthog} from '@/lib/observability' import {getStoredTheme} from '@/lib/theme-store' @@ -22,12 +22,11 @@ void getDeviceId().then((id) => identify(id)) // Restore a previously-chosen Theme override as early as possible (issue #163, // a Display setting — CONTEXT.md), before the first paint that could show the -// wrong scheme. NativeWind already follows the OS Appearance out of the box -// with nothing called (`colorScheme.get()` falls back to it), so this only -// needs to act when the player has an explicit stored override; calling -// `colorScheme.set('system')` for the (common) unset/default case is a no-op -// in effect, just an explicit one. -void getStoredTheme().then((stored) => colorScheme.set(stored)) +// wrong scheme. `@/lib/color-scheme` already follows the OS Appearance out of +// the box, so this only needs to act when the player has an explicit stored +// override; calling `setColorScheme('system')` for the (common) unset/default +// case is a no-op in effect, just an explicit one. +void getStoredTheme().then((stored) => setColorScheme(stored)) import '../global.css' @@ -48,9 +47,8 @@ export default function RootLayout() { // Previously hardcoded to `darkest` because Play/Pick a Card forced dark regardless // of the Theme setting (amendment 2) — that justification dissolved once issue #173 // themed those screens' chrome too, so every screen now themes and this gap color - // just follows suit, live, via NativeWind's `colorScheme`. - const {colorScheme: resolvedScheme} = useColorScheme() - const isDark = resolvedScheme !== 'light' + // just follows suit, live, via `@/lib/color-scheme`. + const isDark = useColorScheme() === 'dark' const navigator = ( (ADR-0003) const reducer = useMemo(() => navReducer(questionIds), [questionIds]) diff --git a/apps/mobile/src/components/pick-player.tsx b/apps/mobile/src/components/pick-player.tsx index 235bf209..4b9a7f42 100644 --- a/apps/mobile/src/components/pick-player.tsx +++ b/apps/mobile/src/components/pick-player.tsx @@ -3,7 +3,6 @@ import {Image} from 'expo-image' import {ScreenBackground} from '@/components/screen-background' import {useRouter} from 'expo-router' import {StatusBar} from 'expo-status-bar' -import {useColorScheme} from 'nativewind' import {useCallback, useEffect, useMemo, useReducer, useRef, useState} from 'react' import type {AppStateStatus, LayoutChangeEvent} from 'react-native' import {AppState, Pressable, StyleSheet, Text, useWindowDimensions, View} from 'react-native' @@ -31,6 +30,7 @@ import {usePlayerChrome} from '@/hooks/use-player-chrome' import {useReviewPrompt} from '@/hooks/use-review-prompt' import {enqueue, flush} from '@/lib/answer-queue' import {send} from '@/lib/answer-transport' +import {useIsDark} from '@/lib/color-scheme' import {incrementCardCount, incrementSessionCount} from '@/lib/app-review' import {getDeviceId} from '@/lib/device-id' import {impact, selection} from '@/lib/haptics' @@ -113,8 +113,7 @@ export const PickPlayer = ({ // Display setting like every other screen now; the deck/card faces below // (CardBack, the revealed face) are untouched — they stay dark in both themes // (amendment 2, docs/design/163-light-mode/proposal.md). - const {colorScheme} = useColorScheme() - const isDark = colorScheme !== 'light' + const isDark = useIsDark() const reducer = useMemo(() => pickReducer(questionIds), [questionIds]) const [{nav, phase, dealt}, dispatch] = useReducer(reducer, questionIds, getInitialPick) diff --git a/apps/mobile/src/components/player-bar.tsx b/apps/mobile/src/components/player-bar.tsx index c93228f1..867d42ae 100644 --- a/apps/mobile/src/components/player-bar.tsx +++ b/apps/mobile/src/components/player-bar.tsx @@ -1,10 +1,10 @@ import {Ionicons} from '@expo/vector-icons' -import {useColorScheme} from 'nativewind' import {Text, View} from 'react-native' import {useSafeAreaInsets} from 'react-native-safe-area-context' import {colors} from '@whocards/tokens' import {PressableScale} from '@/components/pressable-scale' +import {useIsDark} from '@/lib/color-scheme' import {impact} from '@/lib/haptics' type IconName = keyof typeof Ionicons.glyphMap @@ -73,8 +73,7 @@ export const PlayerBar = ({ onExit, }: PlayerBarProps) => { const insets = useSafeAreaInsets() - const {colorScheme} = useColorScheme() - const isDark = colorScheme !== 'light' + const isDark = useIsDark() const iconColor = isDark ? colors.white : colors.darker return ( diff --git a/apps/mobile/src/components/screen-background.tsx b/apps/mobile/src/components/screen-background.tsx index e16add45..3cc42200 100644 --- a/apps/mobile/src/components/screen-background.tsx +++ b/apps/mobile/src/components/screen-background.tsx @@ -1,11 +1,11 @@ import {Image} from 'expo-image' -import {useColorScheme} from 'nativewind' import type {ReactNode} from 'react' import {StyleSheet, View} from 'react-native' import type {SharedValue} from 'react-native-reanimated' import Animated, {useAnimatedStyle} from 'react-native-reanimated' import {colors} from '@whocards/tokens' +import {useIsDark} from '@/lib/color-scheme' // Rasterized from the website's public/background.svg (the bg-hero texture). // Dark is the original (dark-only) asset; light is a recolored variant for the // Theme Display setting (issue #163) — see docs/design/163-light-mode/proposal.md. @@ -40,8 +40,7 @@ type ScreenBackgroundProps = { * of forcing this whole canvas dark (see `app/play/[deck].tsx`). */ export const ScreenBackground = ({children, textureOpacity, table}: ScreenBackgroundProps) => { - const {colorScheme} = useColorScheme() - const isDark = colorScheme !== 'light' + const isDark = useIsDark() const midTable = table && isDark const textureStyle = useAnimatedStyle(() => ({ diff --git a/apps/mobile/src/components/settings-modal.tsx b/apps/mobile/src/components/settings-modal.tsx index f674580e..5db6ebd1 100644 --- a/apps/mobile/src/components/settings-modal.tsx +++ b/apps/mobile/src/components/settings-modal.tsx @@ -1,5 +1,4 @@ import {Ionicons} from '@expo/vector-icons' -import {useColorScheme} from 'nativewind' import {StatusBar} from 'expo-status-bar' import {useEffect, useState} from 'react' import { @@ -29,6 +28,7 @@ import {LanguageSettingsPage} from '@/components/language-settings-page' import {SecondLanguageSettingsPage} from '@/components/second-language-settings-page' import {SettingsSheetHeader} from '@/components/settings-sheet-header' import {ThemeSettingsPage} from '@/components/theme-settings-page' +import {useIsDark} from '@/lib/color-scheme' import {getStoredGame, setStoredGame} from '@/lib/game-store' import {selection} from '@/lib/haptics' import {GAME_CATALOG} from '@/lib/games' @@ -218,8 +218,7 @@ export const SettingsModal = ({ onSelectTheme, }: SettingsModalProps) => { const insets = useSafeAreaInsets() - const {colorScheme} = useColorScheme() - const isDark = colorScheme !== 'light' + const isDark = useIsDark() const chevronColor = isDark ? colors.gray.dark : colors.mutedOnLight const reduceMotion = useReducedMotion() diff --git a/apps/mobile/src/components/settings-sheet-header.tsx b/apps/mobile/src/components/settings-sheet-header.tsx index 9c245f57..a038ba45 100644 --- a/apps/mobile/src/components/settings-sheet-header.tsx +++ b/apps/mobile/src/components/settings-sheet-header.tsx @@ -1,8 +1,8 @@ import {Ionicons} from '@expo/vector-icons' -import {useColorScheme} from 'nativewind' import {Pressable, Text, View} from 'react-native' import {colors} from '@whocards/tokens' +import {useIsDark} from '@/lib/color-scheme' type SettingsSheetHeaderProps = { title: string /** @@ -31,8 +31,7 @@ type SettingsSheetHeaderProps = { * this app (the close button this replaces used the same "close" label). */ export const SettingsSheetHeader = ({title, icon, onPress}: SettingsSheetHeaderProps) => { - const {colorScheme} = useColorScheme() - const isDark = colorScheme !== 'light' + const isDark = useIsDark() const iconColor = isDark ? colors.white : colors.darker return ( diff --git a/apps/mobile/src/components/share-modal.tsx b/apps/mobile/src/components/share-modal.tsx index e3affe6f..70970d63 100644 --- a/apps/mobile/src/components/share-modal.tsx +++ b/apps/mobile/src/components/share-modal.tsx @@ -1,6 +1,5 @@ import {Ionicons} from '@expo/vector-icons' import {StatusBar} from 'expo-status-bar' -import {useColorScheme} from 'nativewind' import {logWarn} from '@whocards/observability' import type {ShareFormat} from '@whocards/observability/events' import {useCallback, useEffect, useMemo, useState} from 'react' @@ -18,6 +17,7 @@ import {Gesture, GestureDetector, GestureHandlerRootView} from 'react-native-ges import {useSafeAreaInsets} from 'react-native-safe-area-context' import {colors} from '@whocards/tokens' +import {useIsDark} from '@/lib/color-scheme' import {downloadAndShareImage} from '@/lib/share-image' // A downward drag past this many px, or a fling faster than this velocity @@ -145,8 +145,7 @@ export const ShareModal = ({ const [error, setError] = useState(null) // Themed (issue #163, amendment 1): a dark surface in dark mode, the // pre-existing light sheet surface in light mode. - const {colorScheme} = useColorScheme() - const isDark = colorScheme !== 'light' + const isDark = useIsDark() const iconColor = isDark ? colors.white : colors.darker const spinnerColor = isDark ? colors.gray.dark : colors.mutedOnLight diff --git a/apps/mobile/src/global.css b/apps/mobile/src/global.css index b5c61c95..12affad6 100644 --- a/apps/mobile/src/global.css +++ b/apps/mobile/src/global.css @@ -1,3 +1,34 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; +/* + * NativeWind v5 / Tailwind v4 entry point. Compiled by Metro (see + * metro.config.js) and, in tests, by the same Tailwind pipeline — see + * jest.global-setup.js. + * + * The explicit `@import`s below are what NativeWind v5 recommends over a bare + * `@import "tailwindcss"`: react-native-web needs preflight in its own layer. + */ +@import 'tailwindcss/theme.css' layer(theme); +@import 'tailwindcss/preflight.css' layer(base); +@import 'tailwindcss/utilities.css'; + +/* NativeWind's own theme: elevation-*, ripple-*, the unitless leading-* override. */ +@import 'nativewind/theme'; + +/* + * The WhoCards design tokens, generated from packages/tokens/src/*.ts. Imported + * after nativewind/theme so the brand faces win over the platform defaults that + * file sets for --font-sans/--font-serif/--font-mono. + */ +@import '@whocards/tokens/theme.css'; + +/* Replaces Tailwind v3's `content: ['./src/**‍/*.{ts,tsx}']`. */ +@source './**/*.{ts,tsx}'; + +:root { + /* + * nativewind/theme sets --font-sans per platform in an *unlayered* `:root`, + * which outranks any `@theme` block no matter the import order. Restate the + * brand face here, unlayered and last, so `font-sans` stays golos-text on + * device. Asserted by src/__tests__/tailwind-theme.test.tsx. + */ + --font-sans: golos-text; +} diff --git a/apps/mobile/src/hooks/use-theme-setting.ts b/apps/mobile/src/hooks/use-theme-setting.ts index 322c82cd..39b33cee 100644 --- a/apps/mobile/src/hooks/use-theme-setting.ts +++ b/apps/mobile/src/hooks/use-theme-setting.ts @@ -1,7 +1,7 @@ -import {colorScheme, useColorScheme} from 'nativewind' import {useCallback, useEffect, useState} from 'react' import {EVENTS, track} from '@whocards/observability/events' +import {setColorScheme, useColorScheme} from '@/lib/color-scheme' import {getStoredTheme, setStoredTheme} from '@/lib/theme-store' import type {ThemeSetting} from '@/lib/theme-store' @@ -10,12 +10,9 @@ import type {ThemeSetting} from '@/lib/theme-store' * never affects which Card is drawn or whose progress is remembered): * System-follow by default, with a manual Light/Dark override. * - * NativeWind already follows the OS Appearance out of the box (its - * `colorScheme` observable falls back to `Appearance.getColorScheme()` - * whenever no explicit override has been set) — this hook's job is just to - * restore a previously-chosen manual override on boot and to apply/persist a - * new choice, via NativeWind's own `colorScheme.set()` / `useColorScheme()` - * rather than a separate theming mechanism. + * The scheme itself lives in `@/lib/color-scheme`, which follows the OS + * Appearance out of the box — this hook's job is just to restore a + * previously-chosen manual override on boot and to apply/persist a new choice. * * `resolvedScheme` is the live, effective 'light' | 'dark' for the rare * JS-level conditional (an `Ionicons` color, a `StatusBar` style, which @@ -26,28 +23,21 @@ import type {ThemeSetting} from '@/lib/theme-store' */ export const useThemeSetting = () => { const [theme, setTheme] = useState('system') - const {colorScheme: resolvedScheme} = useColorScheme() + const resolvedScheme = useColorScheme() useEffect(() => { void getStoredTheme().then((stored) => { - colorScheme.set(stored) + setColorScheme(stored) setTheme(stored) }) }, []) const select = useCallback((next: ThemeSetting) => { - colorScheme.set(next) + setColorScheme(next) setTheme(next) void setStoredTheme(next) track({name: EVENTS.THEME_CHANGED, props: {theme: next}}) }, []) - return { - theme, - // Dark-first fallback for the brief window before the boot effect above - // resolves — matches the app's historical (dark-only) appearance rather - // than assuming light. - resolvedScheme: resolvedScheme ?? 'dark', - select, - } + return {theme, resolvedScheme, select} } diff --git a/apps/mobile/src/lib/color-scheme.ts b/apps/mobile/src/lib/color-scheme.ts new file mode 100644 index 00000000..e9ac07f0 --- /dev/null +++ b/apps/mobile/src/lib/color-scheme.ts @@ -0,0 +1,70 @@ +import {useSyncExternalStore} from 'react' +import {Appearance} from 'react-native' +import {colorScheme} from 'react-native-css' + +import type {ThemeSetting} from './theme-store' + +/** + * The app's single source of truth for "is this screen light or dark right now". + * + * NativeWind v4 exported a `colorScheme` observable whose setter took the full + * `'system' | 'light' | 'dark'` triple. v5 dropped that export: the underlying + * `react-native-css` observable is two-valued, seeded from + * `Appearance.getColorScheme()` and kept in sync with it by a change listener. + * The "system" mode is now the app's job, and this module is it. + * + * It deliberately does *not* call `Appearance.setColorScheme()`. That API + * overrides what `Appearance.getColorScheme()` reports, so once used the real + * OS preference becomes unreadable and "System" could never resolve back to it. + * Writing the `react-native-css` observable instead drives every `dark:` class, + * and `useColorScheme()` below reads the same value, so the classes and the + * handful of JS-level conditionals (an Ionicons colour, a StatusBar style, + * which Image source to load) can never disagree. + */ +let setting: ThemeSetting = 'system' + +const listeners = new Set<() => void>() + +/** + * Dark-first fallback for the (rare) platforms that report no OS preference at + * all — matches the app's historical, dark-only appearance rather than + * assuming light. + */ +const resolve = () => (setting === 'system' ? (Appearance.getColorScheme() ?? 'dark') : setting) + +const apply = () => { + colorScheme.set(resolve()) + for (const listener of listeners) listener() +} + +// Seed the observable immediately: `dark:` variants compare against its raw +// value, so leaving it null (which is what a platform with no preference +// reports) would make both `dark:` and its light-mode counterpart miss. +apply() + +/** + * `react-native-css` mirrors OS appearance changes straight into its observable, + * which would silently drop a manual override. Re-assert ours afterwards — this + * listener is registered second, because importing this module runs theirs first. + */ +Appearance.addChangeListener(() => apply()) + +/** Applies (and remembers) a Theme setting. Persistence lives in theme-store.ts. */ +export const setColorScheme = (next: ThemeSetting): void => { + setting = next + apply() +} + +/** The effective scheme right now. Never null. */ +export const getColorScheme = () => colorScheme.get() ?? resolve() + +const subscribe = (listener: () => void) => { + listeners.add(listener) + return () => listeners.delete(listener) +} + +/** Re-renders on every scheme change, whether from the OS or from Settings. */ +export const useColorScheme = () => useSyncExternalStore(subscribe, getColorScheme) + +/** Shorthand for the overwhelmingly common `useColorScheme() === 'dark'`. */ +export const useIsDark = () => useColorScheme() === 'dark' diff --git a/apps/mobile/tailwind.config.ts b/apps/mobile/tailwind.config.ts deleted file mode 100644 index deba80ee..00000000 --- a/apps/mobile/tailwind.config.ts +++ /dev/null @@ -1,12 +0,0 @@ -// Loaded by Tailwind/NativeWind via jiti (which transpiles this and the imported -// @whocards/tokens source on the fly). Excluded from `tsc` typecheck because the -// nativewind preset ships loose types — see tsconfig.json "exclude". -import {tailwindPreset} from '@whocards/tokens/tailwind-preset' -import nativewindPreset from 'nativewind/preset' - -const config = { - content: ['./src/**/*.{ts,tsx}'], - presets: [nativewindPreset, tailwindPreset], -} - -export default config diff --git a/apps/mobile/tsconfig.json b/apps/mobile/tsconfig.json index 54f8aa0f..183e20cc 100644 --- a/apps/mobile/tsconfig.json +++ b/apps/mobile/tsconfig.json @@ -9,5 +9,5 @@ "types": ["jest"] }, "include": ["**/*.ts", "**/*.tsx", "nativewind-env.d.ts", ".expo/types/**/*.ts", "expo-env.d.ts"], - "exclude": ["node_modules", "tailwind.config.ts"] + "exclude": ["node_modules"] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f6322f41..48b4c131 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -43,6 +43,9 @@ catalogs: specifier: ^4.1.13 version: 4.4.3 +overrides: + '@expo/metro-config>lightningcss': 1.30.1 + importers: .: @@ -303,7 +306,7 @@ importers: version: 57.0.1(expo@57.0.20)(react@19.2.3) expo-router: specifier: ~57.0.19 - version: 57.0.19(16f7296de013c3d4a93c1733f9fcfb8f) + version: 57.0.19(b2351fcb6910ef1427410bea90fce4d0) expo-sharing: specifier: ~57.0.18 version: 57.0.18(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) @@ -323,8 +326,8 @@ importers: specifier: ~57.0.21 version: 57.0.21(expo-dev-client@57.0.18(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3)))(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) nativewind: - specifier: ^4.1.23 - version: 4.2.6(1df2f4422cbbe12c9a5134b979f353ff) + specifier: 5.0.0-preview.4 + version: 5.0.0-preview.4(react-native-css@3.0.7(@expo/metro-config@57.0.12(expo@57.0.20)(typescript@6.0.3))(lightningcss@1.30.1)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(tailwindcss@4.3.3) posthog-react-native: specifier: ^4.67.0 version: 4.67.0(@react-native-async-storage/async-storage@2.2.0(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3)))(expo-application@57.0.2(expo@57.0.20))(expo-device@57.0.1(expo@57.0.20))(expo-file-system@57.0.6(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3)))(expo-localization@57.0.1(expo@57.0.20)(react@19.2.3))(react-native-safe-area-context@5.7.0(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)) @@ -337,9 +340,9 @@ importers: react-native: specifier: 0.85.3 version: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) - react-native-css-interop: - specifier: 0.2.6 - version: 0.2.6(1df2f4422cbbe12c9a5134b979f353ff) + react-native-css: + specifier: ^3.0.7 + version: 3.0.7(@expo/metro-config@57.0.12(expo@57.0.20)(typescript@6.0.3))(lightningcss@1.30.1)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) react-native-gesture-handler: specifier: ~3.2.1 version: 3.2.1(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) @@ -358,9 +361,6 @@ importers: react-native-worklets: specifier: 0.8.3 version: 0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) - tailwindcss: - specifier: ^3.4.17 - version: 3.4.19(tsx@4.23.13)(yaml@2.9.0) zod: specifier: 'catalog:' version: 4.4.3 @@ -368,9 +368,12 @@ importers: '@babel/plugin-transform-react-jsx': specifier: ^7.29.7 version: 7.29.7(@babel/core@7.29.7) + '@tailwindcss/postcss': + specifier: ^4.3.3 + version: 4.3.3 '@testing-library/react-native': specifier: ^13.3.3 - version: 13.3.3(jest@29.7.0(@types/node@26.1.0))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react-test-renderer@19.2.3(react@19.2.3))(react@19.2.3) + version: 13.3.3(jest@29.7.0(@types/node@26.4.1))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react-test-renderer@19.2.3(react@19.2.3))(react@19.2.3) '@types/jest': specifier: ^29.5.14 version: 29.5.14 @@ -385,10 +388,19 @@ importers: version: 57.0.10(@babel/core@7.29.7)(@babel/runtime@7.29.7)(expo@57.0.20)(react-refresh@0.18.0) jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@26.1.0) + version: 29.7.0(@types/node@26.4.1) jest-expo: specifier: ~56.0.5 - version: 56.0.5(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(expo@57.0.20)(jest@29.7.0(@types/node@26.1.0))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) + version: 56.0.5(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(expo@57.0.20)(jest@29.7.0(@types/node@26.4.1))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) + lightningcss: + specifier: 1.30.1 + version: 1.30.1 + postcss: + specifier: ^8.5.28 + version: 8.5.28 + tailwindcss: + specifier: ^4.3.3 + version: 4.3.3 typescript: specifier: ~6.0.3 version: 6.0.3 @@ -445,7 +457,7 @@ importers: version: 0.13.11(typescript@5.9.3)(zod@4.4.3) '@tailwindcss/typography': specifier: ^0.5.20 - version: 0.5.20(tailwindcss@4.3.2) + version: 0.5.20(tailwindcss@4.3.3) '@tailwindcss/vite': specifier: ^4.3.3 version: 4.3.3(vite@8.2.2(@types/node@24.13.2)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)) @@ -476,6 +488,9 @@ importers: '@whocards/observability': specifier: workspace:* version: link:../../packages/observability + '@whocards/tokens': + specifier: workspace:* + version: link:../../packages/tokens astro: specifier: ^7.3.1 version: 7.3.1(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@netlify/blobs@10.7.13)(@types/node@24.13.2)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.23.0)(postgres@3.4.9)))(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0) @@ -543,8 +558,8 @@ importers: specifier: ^3.6.0 version: 3.6.0 tailwindcss: - specifier: ^4.3.1 - version: 4.3.2 + specifier: ^4.3.3 + version: 4.3.3 wawoff2: specifier: ^2.0.1 version: 2.0.1 @@ -667,6 +682,9 @@ importers: packages/tokens: devDependencies: + '@types/node': + specifier: 'catalog:' + version: 24.13.2 '@whocards/typescript-config': specifier: workspace:* version: link:../../tooling/typescript @@ -675,7 +693,7 @@ importers: version: 7.0.2 vitest: specifier: 'catalog:' - version: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@26.4.1)(jsdom@20.0.3)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)) + version: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(jsdom@20.0.3)(vite@8.2.2(@types/node@24.13.2)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)) tooling/typescript: {} @@ -5023,6 +5041,9 @@ packages: resolution: {integrity: sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==} engines: {node: '>= 20'} + '@tailwindcss/postcss@4.3.3': + resolution: {integrity: sha512-JTSZZGQi1AyKirbLN3azmjVzef92tcX7h+iSqPdaeStyFpGpDlKvvpxeOE8njhbUanbRwr3z8DyzhICWnMtQeg==} + '@tailwindcss/typography@0.5.20': resolution: {integrity: sha512-hwbzQuNUfcPvbegQFatVPl/MY/tcM9KLl963hQ5laJKPh81TEZ1+dNG9PirGvcaDBkp+BCshExAyKVPW91dozw==} peerDependencies: @@ -5276,6 +5297,9 @@ packages: '@types/cors@2.8.19': resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==} + '@types/debug@4.1.13': + resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} + '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} @@ -5313,15 +5337,15 @@ packages: '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + '@types/nlcst@2.0.3': resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} '@types/node@24.13.2': resolution: {integrity: sha512-fRa09kZTgu8o71KFcDjUFuc7F+dEbZYZmkI0mg5YBTRs0yMKjYHsq/c0urDKeDb+D5qVgXOdFcuu+DZPKOITwA==} - '@types/node@26.1.0': - resolution: {integrity: sha512-O0A1G3xPGy4w7AgQdAQYUlQ+BKk2Oovw8eRpofyp5KdBZULnbe+WqaOVNrm705SHphCiG4XHsACrSmPu1f+Kgw==} - '@types/node@26.4.1': resolution: {integrity: sha512-k97ENvZWtvA6yqz5/FS6a7duDgOPEeOQOc2iKS/nY6mX6qJUKtLnWzQS+Xj6tXweyj6ZcTAK2Qecetnvi9nCLA==} @@ -5785,9 +5809,6 @@ packages: resolution: {integrity: sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA==} engines: {node: '>=14'} - any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -5943,6 +5964,10 @@ packages: babel-plugin-react-compiler@1.0.0: resolution: {integrity: sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==} + babel-plugin-react-compiler@19.1.0-rc.1-rc-af1b7da-20250421: + resolution: {integrity: sha512-E3kaokBhWDLf7ZD8fuYjYn0ZJHYZ+3EHtAWCdX2hl4lpu1z9S/Xr99sxhx2bTCVB41oIesz9FtM8f4INsrZaOw==} + deprecated: Wrong version name was published + babel-plugin-react-native-web@0.21.2: resolution: {integrity: sha512-SPD0J6qjJn8231i0HZhlAGH6NORe+QvRSQM2mwQEzJ2Fb3E4ruWTiiicPlHjmeWShDXLcvoorOCXjeR7k/lyWA==} @@ -6321,10 +6346,6 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - camelcase-css@2.0.1: - resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} - engines: {node: '>= 6'} - camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} @@ -6532,6 +6553,9 @@ packages: colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + colorjs.io@0.6.0-alpha.1: + resolution: {integrity: sha512-c/h/8uAmPydQcriRdX8UTAFHj6SpSHFHBA8LvMikvYWAVApPTwg/pyOXNsGmaCBd6L/EeDlRHSNhTtnIFp/qsg==} + combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -6558,10 +6582,6 @@ packages: commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - commander@7.2.0: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} @@ -6981,11 +7001,6 @@ packages: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - detect-libc@1.0.3: - resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} - engines: {node: '>=0.10'} - hasBin: true - detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} @@ -7055,9 +7070,6 @@ packages: devtools-protocol@0.0.1666840: resolution: {integrity: sha512-gCcO42XCHKEs7Ag0S7aGYsnJ7hlgrO3qderYqeiY0Eqk+0GFfuvT13IA0hHreJTa2KCdDVyGMeOhdMNmrrTjVg==} - didyoumean@1.2.2: - resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - diff-sequences@29.6.3: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -7070,9 +7082,6 @@ packages: resolution: {integrity: sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw==} engines: {node: '>=0.3.1'} - dlv@1.1.3: - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - dnssd-advertise@1.1.6: resolution: {integrity: sha512-Ndrrf6BMPalkQPd/zubL+4YghH2J9NspapQ09uDXwYbvOPkP0oaqf5CkcwJ0b50kS2O3ul6yVu+jz+RY62Cejg==} @@ -8140,10 +8149,6 @@ packages: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - glob@13.0.6: resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} engines: {node: 18 || 20 || >=22} @@ -8883,10 +8888,6 @@ packages: jimp-compact@0.16.1: resolution: {integrity: sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==} - jiti@1.21.7: - resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} - hasBin: true - jiti@2.6.1: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true @@ -9049,8 +9050,8 @@ packages: cpu: [arm64] os: [android] - lightningcss-darwin-arm64@1.27.0: - resolution: {integrity: sha512-Gl/lqIXY+d+ySmMbgDf0pgaWSqrWYxVHoc88q+Vhf2YNzZ8DwoRzGt5NZDVqqIW5ScpSnmmjcgXP87Dn2ylSSQ==} + lightningcss-darwin-arm64@1.30.1: + resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] @@ -9067,8 +9068,8 @@ packages: cpu: [arm64] os: [darwin] - lightningcss-darwin-x64@1.27.0: - resolution: {integrity: sha512-0+mZa54IlcNAoQS9E0+niovhyjjQWEMrwW0p2sSdLRhLDc8LMQ/b67z7+B5q4VmjYCMSfnFi3djAAQFIDuj/Tg==} + lightningcss-darwin-x64@1.30.1: + resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] @@ -9085,8 +9086,8 @@ packages: cpu: [x64] os: [darwin] - lightningcss-freebsd-x64@1.27.0: - resolution: {integrity: sha512-n1sEf85fePoU2aDN2PzYjoI8gbBqnmLGEhKq7q0DKLj0UTVmOTwDC7PtLcy/zFxzASTSBlVQYJUhwIStQMIpRA==} + lightningcss-freebsd-x64@1.30.1: + resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] @@ -9103,8 +9104,8 @@ packages: cpu: [x64] os: [freebsd] - lightningcss-linux-arm-gnueabihf@1.27.0: - resolution: {integrity: sha512-MUMRmtdRkOkd5z3h986HOuNBD1c2lq2BSQA1Jg88d9I7bmPGx08bwGcnB75dvr17CwxjxD6XPi3Qh8ArmKFqCA==} + lightningcss-linux-arm-gnueabihf@1.30.1: + resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] @@ -9121,8 +9122,8 @@ packages: cpu: [arm] os: [linux] - lightningcss-linux-arm64-gnu@1.27.0: - resolution: {integrity: sha512-cPsxo1QEWq2sfKkSq2Bq5feQDHdUEwgtA9KaB27J5AX22+l4l0ptgjMZZtYtUnteBofjee+0oW1wQ1guv04a7A==} + lightningcss-linux-arm64-gnu@1.30.1: + resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] @@ -9142,8 +9143,8 @@ packages: os: [linux] libc: [glibc] - lightningcss-linux-arm64-musl@1.27.0: - resolution: {integrity: sha512-rCGBm2ax7kQ9pBSeITfCW9XSVF69VX+fm5DIpvDZQl4NnQoMQyRwhZQm9pd59m8leZ1IesRqWk2v/DntMo26lg==} + lightningcss-linux-arm64-musl@1.30.1: + resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] @@ -9163,8 +9164,8 @@ packages: os: [linux] libc: [musl] - lightningcss-linux-x64-gnu@1.27.0: - resolution: {integrity: sha512-Dk/jovSI7qqhJDiUibvaikNKI2x6kWPN79AQiD/E/KeQWMjdGe9kw51RAgoWFDi0coP4jinaH14Nrt/J8z3U4A==} + lightningcss-linux-x64-gnu@1.30.1: + resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] @@ -9184,8 +9185,8 @@ packages: os: [linux] libc: [glibc] - lightningcss-linux-x64-musl@1.27.0: - resolution: {integrity: sha512-QKjTxXm8A9s6v9Tg3Fk0gscCQA1t/HMoF7Woy1u68wCk5kS4fR+q3vXa1p3++REW784cRAtkYKrPy6JKibrEZA==} + lightningcss-linux-x64-musl@1.30.1: + resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] @@ -9205,8 +9206,8 @@ packages: os: [linux] libc: [musl] - lightningcss-win32-arm64-msvc@1.27.0: - resolution: {integrity: sha512-/wXegPS1hnhkeG4OXQKEMQeJd48RDC3qdh+OA8pCuOPCyvnm/yEayrJdJVqzBsqpy1aJklRCVxscpFur80o6iQ==} + lightningcss-win32-arm64-msvc@1.30.1: + resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] @@ -9223,8 +9224,8 @@ packages: cpu: [arm64] os: [win32] - lightningcss-win32-x64-msvc@1.27.0: - resolution: {integrity: sha512-/OJLj94Zm/waZShL8nB5jsNj3CfNATLCTyFxZyouilfTmSoLDX7VlVAmhPHoZWVFp4vdmoiEbPEYC8HID3m6yw==} + lightningcss-win32-x64-msvc@1.30.1: + resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] @@ -9241,8 +9242,8 @@ packages: cpu: [x64] os: [win32] - lightningcss@1.27.0: - resolution: {integrity: sha512-8f7aNmS1+etYSLHht0fQApPc2kNO8qGRutifN5rVIc6Xo6ABsEbqOr758UwI7ALVbTt4x1fllKt0PYgzD9S3yQ==} + lightningcss@1.30.1: + resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} engines: {node: '>= 12.0.0'} lightningcss@1.32.0: @@ -9689,9 +9690,6 @@ packages: resolution: {integrity: sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==} engines: {node: ^20.17.0 || >=22.9.0} - mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nanoid@3.3.15: resolution: {integrity: sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -9713,11 +9711,12 @@ packages: napi-build-utils@2.0.0: resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} - nativewind@4.2.6: - resolution: {integrity: sha512-kLPRH3Yh/hhIFufXzUZDe39fuK471GwaPBCqYNgcRygILr+obV+wFfDmG+zaJnniVUFFQzYOTCEldem6XktZ+A==} - engines: {node: '>=16'} + nativewind@5.0.0-preview.4: + resolution: {integrity: sha512-eLsFGczxIsWADoD18EbEyt01aWgw4uP1/t/O7JIsp/OEbSgVYVobW97e2DDTOxxiiqSu0RexC1KSo5d7tes9uQ==} + engines: {node: '>=20'} peerDependencies: - tailwindcss: '>3.3.0' + react-native-css: ^3.0.1 + tailwindcss: '>4.1.11' natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -9912,10 +9911,6 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - object-hash@3.0.0: - resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} - engines: {node: '>= 6'} - object-inspect@1.13.4: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} @@ -10303,10 +10298,6 @@ packages: engines: {node: '>=0.10'} hasBin: true - pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - pirates@4.0.7: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} @@ -10343,50 +10334,10 @@ packages: postal-mime@2.7.5: resolution: {integrity: sha512-GNEXKvWFQnbgO5NlrGzVa0FmWzBZ24PersAWErttSg1Hjpf0ATxTwS5DOMGaOpTG6bUh5cTr7xi0jAD942wCJA==} - postcss-import@15.1.0: - resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} - engines: {node: '>=14.0.0'} - peerDependencies: - postcss: ^8.0.0 - - postcss-js@4.1.0: - resolution: {integrity: sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==} - engines: {node: ^12 || ^14 || >= 16} - peerDependencies: - postcss: ^8.4.21 - - postcss-load-config@6.0.1: - resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} - engines: {node: '>= 18'} - peerDependencies: - jiti: '>=1.21.0' - postcss: '>=8.0.9' - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - jiti: - optional: true - postcss: - optional: true - tsx: - optional: true - yaml: - optional: true - - postcss-nested@6.2.0: - resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.2.14 - postcss-selector-parser@6.0.10: resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} engines: {node: '>=4'} - postcss-selector-parser@6.1.4: - resolution: {integrity: sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==} - engines: {node: '>=4'} - postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} @@ -10718,21 +10669,13 @@ packages: react-is@19.2.8: resolution: {integrity: sha512-s5un28nYxKJw5gvUHyW5PCC28CvBqLu9r3cWgzHT4Vo/5fqqkFcdRYsGcKf50WMPpjjFZS5d76fn3YCo2njKwQ==} - react-native-css-interop@0.2.6: - resolution: {integrity: sha512-uXad6EWqufupnRjrba2De30tiAx26kLEcwSV3eSLVBwpfYeOnrpDc9k6kHk6SBNbmHHlE5sc9vsfKdVRS9msYg==} - engines: {node: '>=18'} + react-native-css@3.0.7: + resolution: {integrity: sha512-xsU9T5MleHI/DDmY72A7ZikbkDfDNkMrAEichOJW2bBUMxPzAJPrFk9ys4cXYk4gLFaR11y23EccOJ+JT6Iusw==} peerDependencies: - react: '>=18' - react-native: '*' - react-native-reanimated: '>=3.6.2' - react-native-safe-area-context: '*' - react-native-svg: '*' - tailwindcss: ~3 - peerDependenciesMeta: - react-native-safe-area-context: - optional: true - react-native-svg: - optional: true + '@expo/metro-config': '>=54' + lightningcss: '>=1.27.0' + react: '>=19' + react-native: '>=0.81' react-native-drawer-layout@4.2.10: resolution: {integrity: sha512-O6TQdZ5LSm3dqnuR4rX9KPtE+9dVg7jsezEYz1l01rkQTe4fQvYZIoPu2sZFl5X2N70uhRdjnPULySVR3sBUwA==} @@ -10848,9 +10791,6 @@ packages: resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==} engines: {node: '>=0.10.0'} - read-cache@1.0.0: - resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} - read-package-up@11.0.0: resolution: {integrity: sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==} engines: {node: '>=18'} @@ -11568,11 +11508,6 @@ packages: styleq@0.1.3: resolution: {integrity: sha512-3ZUifmCDCQanjeej1f6kyl/BeP/Vae5EYkQ9iJfUm/QwZvlgnZzyflqAsAWYURdtea8Vkvswu2GrC57h3qffcA==} - sucrase@3.35.1: - resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - suf-log@2.5.3: resolution: {integrity: sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==} @@ -11614,13 +11549,11 @@ packages: tailwind-merge@3.6.0: resolution: {integrity: sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==} - tailwindcss@3.4.19: - resolution: {integrity: sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==} - engines: {node: '>=14.0.0'} - hasBin: true - - tailwindcss@4.3.2: - resolution: {integrity: sha512-WtctNNSH8A9jlMIqxzuYumOHU5uGZyRv0Q5svQl+oEPy5w84YpBxdb7MdqyiSPQge5jTJ6zFQLq0PFygdccSBA==} + tailwindcss-safe-area@1.3.0: + resolution: {integrity: sha512-RoxnW1zAjBWC3XK+row7Qj5toRMRlKNN/p3FLXb6fTGKxDGWT6JP/mcNX1yf09xRficQ308hbwiedgniepSp1Q==} + engines: {node: '>=20'} + peerDependencies: + tailwindcss: ^4.0.0 tailwindcss@4.3.3: resolution: {integrity: sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==} @@ -11665,13 +11598,6 @@ packages: text-hex@1.0.0: resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} - thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} - - thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - third-party-web@0.29.2: resolution: {integrity: sha512-fegtha91tq2DHphyoiBXVHjVi2YG9zFaRnboT9C28tO1en9Y3wJsfspuy40F+u5wl3hHVbw7cnd1b67kEGHb8g==} @@ -11772,9 +11698,6 @@ packages: peerDependencies: typescript: '>=4.8.4' - ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - tsconfck@3.1.6: resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} engines: {node: ^18 || >=20} @@ -14341,7 +14264,7 @@ snapshots: ws: 8.21.3 zod: 3.25.76 optionalDependencies: - expo-router: 57.0.19(16f7296de013c3d4a93c1733f9fcfb8f) + expo-router: 57.0.19(b2351fcb6910ef1427410bea90fce4d0) react-native: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) transitivePeerDependencies: - '@expo/dom-webview' @@ -14506,7 +14429,7 @@ snapshots: glob: 13.0.6 hermes-parser: 0.36.1 jsc-safe-url: 0.2.4 - lightningcss: 1.33.0 + lightningcss: 1.30.1 picomatch: 4.0.7 postcss: 8.5.28 resolve-from: 5.0.0 @@ -14618,7 +14541,7 @@ snapshots: react: 19.2.3 optionalDependencies: '@expo/metro-runtime': 57.0.15(@expo/log-box@57.0.4)(expo@57.0.20)(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) - expo-router: 57.0.19(16f7296de013c3d4a93c1733f9fcfb8f) + expo-router: 57.0.19(b2351fcb6910ef1427410bea90fce4d0) react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: - supports-color @@ -15083,7 +15006,7 @@ snapshots: '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 - '@types/node': 26.1.0 + '@types/node': 26.4.1 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -15096,14 +15019,14 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 26.1.0 + '@types/node': 26.4.1 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@26.1.0) + jest-config: 29.7.0(@types/node@26.4.1) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -15134,7 +15057,7 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 26.1.0 + '@types/node': 26.4.1 jest-mock: 29.7.0 '@jest/expect-utils@29.7.0': @@ -15152,7 +15075,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 26.1.0 + '@types/node': 26.4.1 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -15176,7 +15099,7 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.31 - '@types/node': 26.1.0 + '@types/node': 26.4.1 chalk: 4.1.2 collect-v8-coverage: 1.0.3 exit: 0.1.2 @@ -15250,7 +15173,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 26.1.0 + '@types/node': 26.4.1 '@types/yargs': 17.0.35 chalk: 4.1.2 @@ -16698,7 +16621,7 @@ snapshots: dependencies: '@react-email/text': 0.1.6(react@19.2.3) react: 19.2.3 - tailwindcss: 4.3.2 + tailwindcss: 4.3.3 optionalDependencies: '@react-email/body': 0.3.0(react@19.2.3) '@react-email/button': 0.2.1(react@19.2.3) @@ -17376,10 +17299,18 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.3.3 '@tailwindcss/oxide-win32-x64-msvc': 4.3.3 - '@tailwindcss/typography@0.5.20(tailwindcss@4.3.2)': + '@tailwindcss/postcss@4.3.3': + dependencies: + '@alloc/quick-lru': 5.2.0 + '@tailwindcss/node': 4.3.3 + '@tailwindcss/oxide': 4.3.3 + postcss: 8.5.28 + tailwindcss: 4.3.3 + + '@tailwindcss/typography@0.5.20(tailwindcss@4.3.3)': dependencies: postcss-selector-parser: 6.0.10 - tailwindcss: 4.3.2 + tailwindcss: 4.3.3 '@tailwindcss/vite@4.3.3(vite@8.2.2(@types/node@24.13.2)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0))': dependencies: @@ -17630,7 +17561,7 @@ snapshots: '@tanstack/virtual-file-routes@1.162.0': {} - '@testing-library/react-native@13.3.3(jest@29.7.0(@types/node@26.1.0))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react-test-renderer@19.2.3(react@19.2.3))(react@19.2.3)': + '@testing-library/react-native@13.3.3(jest@29.7.0(@types/node@26.4.1))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react-test-renderer@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: jest-matcher-utils: 30.4.1 picocolors: 1.1.1 @@ -17640,7 +17571,7 @@ snapshots: react-test-renderer: 19.2.3(react@19.2.3) redent: 3.0.0 optionalDependencies: - jest: 29.7.0(@types/node@26.1.0) + jest: 29.7.0(@types/node@26.4.1) '@tootallnate/once@2.0.1': {} @@ -17724,6 +17655,10 @@ snapshots: dependencies: '@types/node': 26.4.1 + '@types/debug@4.1.13': + dependencies: + '@types/ms': 2.1.0 + '@types/deep-eql@4.0.2': {} '@types/diff@8.0.0': @@ -17761,7 +17696,7 @@ snapshots: '@types/jsdom@20.0.1': dependencies: - '@types/node': 26.1.0 + '@types/node': 26.4.1 '@types/tough-cookie': 4.0.5 parse5: 7.3.0 @@ -17769,6 +17704,8 @@ snapshots: dependencies: '@types/unist': 3.0.3 + '@types/ms@2.1.0': {} + '@types/nlcst@2.0.3': dependencies: '@types/unist': 3.0.3 @@ -17777,10 +17714,6 @@ snapshots: dependencies: undici-types: 7.18.2 - '@types/node@26.1.0': - dependencies: - undici-types: 8.3.0 - '@types/node@26.4.1': dependencies: undici-types: 8.3.0 @@ -17793,7 +17726,7 @@ snapshots: '@types/pg@8.20.0': dependencies: - '@types/node': 24.13.2 + '@types/node': 26.4.1 pg-protocol: 1.15.0 pg-types: 2.2.0 @@ -18280,8 +18213,6 @@ snapshots: ansis@4.3.1: {} - any-promise@1.3.0: {} - anymatch@3.1.3: dependencies: normalize-path: 3.0.0 @@ -18559,6 +18490,10 @@ snapshots: dependencies: '@babel/types': 7.29.7 + babel-plugin-react-compiler@19.1.0-rc.1-rc-af1b7da-20250421: + dependencies: + '@babel/types': 7.29.8 + babel-plugin-react-native-web@0.21.2: {} babel-plugin-syntax-hermes-parser@0.33.3: @@ -18988,8 +18923,6 @@ snapshots: callsites@3.1.0: {} - camelcase-css@2.0.1: {} - camelcase@5.3.1: {} camelcase@6.3.0: {} @@ -19193,6 +19126,8 @@ snapshots: colorette@2.0.20: {} + colorjs.io@0.6.0-alpha.1: {} + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 @@ -19209,8 +19144,6 @@ snapshots: commander@2.20.3: {} - commander@4.1.1: {} - commander@7.2.0: {} comment-json@4.6.2: @@ -19380,13 +19313,13 @@ snapshots: crc-32: 1.2.2 readable-stream: 4.7.0 - create-jest@29.7.0(@types/node@26.1.0): + create-jest@29.7.0(@types/node@26.4.1): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@26.1.0) + jest-config: 29.7.0(@types/node@26.4.1) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -19614,8 +19547,6 @@ snapshots: destroy@1.2.0: {} - detect-libc@1.0.3: {} - detect-libc@2.1.2: {} detect-newline@3.1.0: {} @@ -19690,16 +19621,12 @@ snapshots: devtools-protocol@0.0.1666840: {} - didyoumean@1.2.2: {} - diff-sequences@29.6.3: {} diff@8.0.4: {} diff@9.0.0: {} - dlv@1.1.3: {} - dnssd-advertise@1.1.6: {} dom-serializer@2.0.0: @@ -20335,7 +20262,7 @@ snapshots: dependencies: react-native: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) - expo-router@57.0.19(16f7296de013c3d4a93c1733f9fcfb8f): + expo-router@57.0.19(b2351fcb6910ef1427410bea90fce4d0): dependencies: '@expo/log-box': 57.0.4(@expo/dom-webview@56.0.6)(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) '@expo/metro-runtime': 57.0.15(@expo/log-box@57.0.4)(expo@57.0.20)(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) @@ -20371,7 +20298,7 @@ snapshots: standard-navigation: 0.0.5 vaul: 1.1.2(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) optionalDependencies: - '@testing-library/react-native': 13.3.3(jest@29.7.0(@types/node@26.1.0))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react-test-renderer@19.2.3(react@19.2.3))(react@19.2.3) + '@testing-library/react-native': 13.3.3(jest@29.7.0(@types/node@26.4.1))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react-test-renderer@19.2.3(react@19.2.3))(react@19.2.3) react-dom: 19.2.3(react@19.2.3) react-native-gesture-handler: 3.2.1(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) react-native-reanimated: 4.3.1(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) @@ -20814,10 +20741,6 @@ snapshots: dependencies: is-glob: 4.0.3 - glob-parent@6.0.2: - dependencies: - is-glob: 4.0.3 - glob@13.0.6: dependencies: minimatch: 10.2.6 @@ -21486,16 +21409,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@26.1.0): + jest-cli@29.7.0(@types/node@26.4.1): dependencies: '@jest/core': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@26.1.0) + create-jest: 29.7.0(@types/node@26.4.1) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@26.1.0) + jest-config: 29.7.0(@types/node@26.4.1) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.3 @@ -21505,7 +21428,7 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@26.1.0): + jest-config@29.7.0(@types/node@26.4.1): dependencies: '@babel/core': 7.29.7 '@jest/test-sequencer': 29.7.0 @@ -21530,7 +21453,7 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 26.1.0 + '@types/node': 26.4.1 transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -21567,7 +21490,7 @@ snapshots: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 '@types/jsdom': 20.0.1 - '@types/node': 26.1.0 + '@types/node': 26.4.1 jest-mock: 29.7.0 jest-util: 29.7.0 jsdom: 20.0.3 @@ -21585,7 +21508,7 @@ snapshots: jest-mock: 29.7.0 jest-util: 29.7.0 - jest-expo@56.0.5(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(expo@57.0.20)(jest@29.7.0(@types/node@26.1.0))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3): + jest-expo@56.0.5(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(expo@57.0.20)(jest@29.7.0(@types/node@26.4.1))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3): dependencies: '@jest/create-cache-key-function': 29.7.0 '@jest/globals': 29.7.0 @@ -21594,7 +21517,7 @@ snapshots: jest-environment-jsdom: 29.7.0 jest-snapshot: 29.7.0 jest-watch-select-projects: 2.0.0 - jest-watch-typeahead: 2.2.1(jest@29.7.0(@types/node@26.1.0)) + jest-watch-typeahead: 2.2.1(jest@29.7.0(@types/node@26.4.1)) json5: 2.2.3 lodash: 4.18.1 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) @@ -21618,7 +21541,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 26.1.0 + '@types/node': 26.4.1 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -21664,7 +21587,7 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 26.1.0 + '@types/node': 26.4.1 jest-util: 29.7.0 jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): @@ -21699,7 +21622,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 26.1.0 + '@types/node': 26.4.1 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -21727,7 +21650,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 26.1.0 + '@types/node': 26.4.1 chalk: 4.1.2 cjs-module-lexer: 1.4.3 collect-v8-coverage: 1.0.3 @@ -21773,7 +21696,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 26.1.0 + '@types/node': 26.4.1 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -21794,11 +21717,11 @@ snapshots: chalk: 3.0.0 prompts: 2.4.2 - jest-watch-typeahead@2.2.1(jest@29.7.0(@types/node@26.1.0)): + jest-watch-typeahead@2.2.1(jest@29.7.0(@types/node@26.4.1)): dependencies: ansi-escapes: 6.2.1 chalk: 4.1.2 - jest: 29.7.0(@types/node@26.1.0) + jest: 29.7.0(@types/node@26.4.1) jest-regex-util: 29.6.3 jest-watcher: 29.7.0 slash: 5.1.0 @@ -21809,7 +21732,7 @@ snapshots: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 26.1.0 + '@types/node': 26.4.1 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -21823,12 +21746,12 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@26.1.0): + jest@29.7.0(@types/node@26.4.1): dependencies: '@jest/core': 29.7.0 '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@26.1.0) + jest-cli: 29.7.0(@types/node@26.4.1) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -21837,8 +21760,6 @@ snapshots: jimp-compact@0.16.1: {} - jiti@1.21.7: {} - jiti@2.6.1: {} jiti@2.7.0: {} @@ -22032,7 +21953,7 @@ snapshots: lightningcss-android-arm64@1.33.0: optional: true - lightningcss-darwin-arm64@1.27.0: + lightningcss-darwin-arm64@1.30.1: optional: true lightningcss-darwin-arm64@1.32.0: @@ -22041,7 +21962,7 @@ snapshots: lightningcss-darwin-arm64@1.33.0: optional: true - lightningcss-darwin-x64@1.27.0: + lightningcss-darwin-x64@1.30.1: optional: true lightningcss-darwin-x64@1.32.0: @@ -22050,7 +21971,7 @@ snapshots: lightningcss-darwin-x64@1.33.0: optional: true - lightningcss-freebsd-x64@1.27.0: + lightningcss-freebsd-x64@1.30.1: optional: true lightningcss-freebsd-x64@1.32.0: @@ -22059,7 +21980,7 @@ snapshots: lightningcss-freebsd-x64@1.33.0: optional: true - lightningcss-linux-arm-gnueabihf@1.27.0: + lightningcss-linux-arm-gnueabihf@1.30.1: optional: true lightningcss-linux-arm-gnueabihf@1.32.0: @@ -22068,7 +21989,7 @@ snapshots: lightningcss-linux-arm-gnueabihf@1.33.0: optional: true - lightningcss-linux-arm64-gnu@1.27.0: + lightningcss-linux-arm64-gnu@1.30.1: optional: true lightningcss-linux-arm64-gnu@1.32.0: @@ -22077,7 +21998,7 @@ snapshots: lightningcss-linux-arm64-gnu@1.33.0: optional: true - lightningcss-linux-arm64-musl@1.27.0: + lightningcss-linux-arm64-musl@1.30.1: optional: true lightningcss-linux-arm64-musl@1.32.0: @@ -22086,7 +22007,7 @@ snapshots: lightningcss-linux-arm64-musl@1.33.0: optional: true - lightningcss-linux-x64-gnu@1.27.0: + lightningcss-linux-x64-gnu@1.30.1: optional: true lightningcss-linux-x64-gnu@1.32.0: @@ -22095,7 +22016,7 @@ snapshots: lightningcss-linux-x64-gnu@1.33.0: optional: true - lightningcss-linux-x64-musl@1.27.0: + lightningcss-linux-x64-musl@1.30.1: optional: true lightningcss-linux-x64-musl@1.32.0: @@ -22104,7 +22025,7 @@ snapshots: lightningcss-linux-x64-musl@1.33.0: optional: true - lightningcss-win32-arm64-msvc@1.27.0: + lightningcss-win32-arm64-msvc@1.30.1: optional: true lightningcss-win32-arm64-msvc@1.32.0: @@ -22113,7 +22034,7 @@ snapshots: lightningcss-win32-arm64-msvc@1.33.0: optional: true - lightningcss-win32-x64-msvc@1.27.0: + lightningcss-win32-x64-msvc@1.30.1: optional: true lightningcss-win32-x64-msvc@1.32.0: @@ -22122,20 +22043,20 @@ snapshots: lightningcss-win32-x64-msvc@1.33.0: optional: true - lightningcss@1.27.0: + lightningcss@1.30.1: dependencies: - detect-libc: 1.0.3 + detect-libc: 2.1.2 optionalDependencies: - lightningcss-darwin-arm64: 1.27.0 - lightningcss-darwin-x64: 1.27.0 - lightningcss-freebsd-x64: 1.27.0 - lightningcss-linux-arm-gnueabihf: 1.27.0 - lightningcss-linux-arm64-gnu: 1.27.0 - lightningcss-linux-arm64-musl: 1.27.0 - lightningcss-linux-x64-gnu: 1.27.0 - lightningcss-linux-x64-musl: 1.27.0 - lightningcss-win32-arm64-msvc: 1.27.0 - lightningcss-win32-x64-msvc: 1.27.0 + lightningcss-darwin-arm64: 1.30.1 + lightningcss-darwin-x64: 1.30.1 + lightningcss-freebsd-x64: 1.30.1 + lightningcss-linux-arm-gnueabihf: 1.30.1 + lightningcss-linux-arm64-gnu: 1.30.1 + lightningcss-linux-arm64-musl: 1.30.1 + lightningcss-linux-x64-gnu: 1.30.1 + lightningcss-linux-x64-musl: 1.30.1 + lightningcss-win32-arm64-msvc: 1.30.1 + lightningcss-win32-x64-msvc: 1.30.1 lightningcss@1.32.0: dependencies: @@ -22829,12 +22750,6 @@ snapshots: mute-stream@3.0.0: {} - mz@2.7.0: - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 - nanoid@3.3.15: {} nanoid@3.3.18: {} @@ -22845,19 +22760,11 @@ snapshots: napi-build-utils@2.0.0: {} - nativewind@4.2.6(1df2f4422cbbe12c9a5134b979f353ff): + nativewind@5.0.0-preview.4(react-native-css@3.0.7(@expo/metro-config@57.0.12(expo@57.0.20)(typescript@6.0.3))(lightningcss@1.30.1)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(tailwindcss@4.3.3): dependencies: - comment-json: 4.6.2 - debug: 4.4.3 - react-native-css-interop: 0.2.6(1df2f4422cbbe12c9a5134b979f353ff) - tailwindcss: 3.4.19(tsx@4.23.13)(yaml@2.9.0) - transitivePeerDependencies: - - react - - react-native - - react-native-reanimated - - react-native-safe-area-context - - react-native-svg - - supports-color + react-native-css: 3.0.7(@expo/metro-config@57.0.12(expo@57.0.20)(typescript@6.0.3))(lightningcss@1.30.1)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) + tailwindcss: 4.3.3 + tailwindcss-safe-area: 1.3.0(tailwindcss@4.3.3) natural-compare@1.4.0: {} @@ -23055,8 +22962,6 @@ snapshots: object-assign@4.1.1: {} - object-hash@3.0.0: {} - object-inspect@1.13.4: {} object-keys@1.1.1: {} @@ -23486,8 +23391,6 @@ snapshots: pidtree@0.6.1: {} - pify@2.3.0: {} - pirates@4.0.7: {} pkg-dir@4.2.0: @@ -23518,42 +23421,11 @@ snapshots: postal-mime@2.7.5: {} - postcss-import@15.1.0(postcss@8.5.16): - dependencies: - postcss: 8.5.16 - postcss-value-parser: 4.2.0 - read-cache: 1.0.0 - resolve: 1.22.12 - - postcss-js@4.1.0(postcss@8.5.16): - dependencies: - camelcase-css: 2.0.1 - postcss: 8.5.16 - - postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.16)(tsx@4.23.13)(yaml@2.9.0): - dependencies: - lilconfig: 3.1.3 - optionalDependencies: - jiti: 1.21.7 - postcss: 8.5.16 - tsx: 4.23.13 - yaml: 2.9.0 - - postcss-nested@6.2.0(postcss@8.5.16): - dependencies: - postcss: 8.5.16 - postcss-selector-parser: 6.1.4 - postcss-selector-parser@6.0.10: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss-selector-parser@6.1.4: - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - postcss-value-parser@4.2.0: {} postcss-values-parser@6.0.2(postcss@8.5.28): @@ -23852,20 +23724,17 @@ snapshots: react-is@19.2.8: {} - react-native-css-interop@0.2.6(1df2f4422cbbe12c9a5134b979f353ff): + react-native-css@3.0.7(@expo/metro-config@57.0.12(expo@57.0.20)(typescript@6.0.3))(lightningcss@1.30.1)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3): dependencies: - '@babel/helper-module-imports': 7.29.7 - '@babel/traverse': 7.29.8 - '@babel/types': 7.29.8 + '@expo/metro-config': 57.0.12(expo@57.0.20)(typescript@6.0.3) + '@types/debug': 4.1.13 + babel-plugin-react-compiler: 19.1.0-rc.1-rc-af1b7da-20250421 + colorjs.io: 0.6.0-alpha.1 + comment-json: 4.6.2 debug: 4.4.3 - lightningcss: 1.27.0 + lightningcss: 1.30.1 react: 19.2.3 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) - react-native-reanimated: 4.3.1(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) - semver: 7.8.5 - tailwindcss: 3.4.19(tsx@4.23.13)(yaml@2.9.0) - optionalDependencies: - react-native-safe-area-context: 5.7.0(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) transitivePeerDependencies: - supports-color @@ -24030,10 +23899,6 @@ snapshots: react@19.2.3: {} - read-cache@1.0.0: - dependencies: - pify: 2.3.0 - read-package-up@11.0.0: dependencies: find-up-simple: 1.0.1 @@ -24975,16 +24840,6 @@ snapshots: styleq@0.1.3: {} - sucrase@3.35.1: - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - commander: 4.1.1 - lines-and-columns: 1.2.4 - mz: 2.7.0 - pirates: 4.0.7 - tinyglobby: 0.2.17 - ts-interface-checker: 0.1.13 - suf-log@2.5.3: dependencies: s.color: 0.0.15 @@ -25028,35 +24883,9 @@ snapshots: tailwind-merge@3.6.0: {} - tailwindcss@3.4.19(tsx@4.23.13)(yaml@2.9.0): + tailwindcss-safe-area@1.3.0(tailwindcss@4.3.3): dependencies: - '@alloc/quick-lru': 5.2.0 - arg: 5.0.2 - chokidar: 3.6.0 - didyoumean: 1.2.2 - dlv: 1.1.3 - fast-glob: 3.3.3 - glob-parent: 6.0.2 - is-glob: 4.0.3 - jiti: 1.21.7 - lilconfig: 3.1.3 - micromatch: 4.0.8 - normalize-path: 3.0.0 - object-hash: 3.0.0 - picocolors: 1.1.1 - postcss: 8.5.16 - postcss-import: 15.1.0(postcss@8.5.16) - postcss-js: 4.1.0(postcss@8.5.16) - postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.16)(tsx@4.23.13)(yaml@2.9.0) - postcss-nested: 6.2.0(postcss@8.5.16) - postcss-selector-parser: 6.1.4 - resolve: 1.22.12 - sucrase: 3.35.1 - transitivePeerDependencies: - - tsx - - yaml - - tailwindcss@4.3.2: {} + tailwindcss: 4.3.3 tailwindcss@4.3.3: {} @@ -25129,14 +24958,6 @@ snapshots: text-hex@1.0.0: {} - thenify-all@1.6.0: - dependencies: - thenify: 3.3.1 - - thenify@3.3.1: - dependencies: - any-promise: 1.3.0 - third-party-web@0.29.2: {} throat@5.0.0: {} @@ -25214,8 +25035,6 @@ snapshots: dependencies: typescript: 5.9.3 - ts-interface-checker@0.1.13: {} - tsconfck@3.1.6(typescript@7.0.2): optionalDependencies: typescript: 7.0.2 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 6c953dab..8bdb1ef2 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -41,6 +41,18 @@ catalog: '@types/react-dom': ^19.2.7 '@types/node': ^24.10.2 +# react-native-css 3 (NativeWind v5) resolves lightningcss through +# @expo/metro-config rather than through its own peer dependency, and +# lightningcss >= 1.32 regressed the napi visitor bridge: with a JS `visitor` +# installed, any unresolved `var()` makes `transform()` throw +# `failed to deserialize; expected an object-like struct named Specifier`. +# Tailwind v4's preflight and `@property` rules both emit such vars, so every +# Metro build (and the jest globalSetup that mirrors it) would fail. 1.30.1 is +# the version NativeWind's v5 migration guide pins. Scoped to @expo/metro-config +# so @tailwindcss/node keeps its own exact 1.32.0 for the website build. +overrides: + '@expo/metro-config>lightningcss': 1.30.1 + # Supply-chain guard: quarantine newly published versions for 2 days (2880 min) # before they're installable. minimumReleaseAge: 2880 From dba4e337edaff1a6f84bf5109474b92dfe66061e Mon Sep 17 00:00:00 2001 From: acharlop Date: Wed, 9 Sep 2026 22:24:15 +0200 Subject: [PATCH 03/17] test(mobile): assert resolved styles rather than className strings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Under NativeWind v5 `className` never reaches the rendered element — the component wrapper compiles it away into a `style` array — so the existing `expect(node.props.className).toBe('text-white')` assertions could only ever prove a string was passed in. They would keep passing with the whole CSS pipeline dead. Snapshots would be no better: they assert "unchanged", not "correct", and would happily bless an unstyled render. Instead the assertions now read the resolved style back and compare it against @whocards/tokens: - `src/test-utils/resolved-style.ts` flattens a node's `style` prop, plus `withOpacity()` (the 8-digit hex lightningcss serialises `/NN` to, f32 alpha and all) and `rem()` (tokens compile to px at REM 14). - `src/__tests__/tailwind-theme.test.tsx` walks the token → Tailwind → NativeWind pipeline: every colour, spacing step, radius and font token renders its utility class and must resolve to the token's value. Each table is checked for completeness against the token object, so a new token fails the suite until it is covered. - question-text, secondary-button and theme-settings-page now assert token values (colour, family, weight, size) where they asserted class strings. - `jest.global-setup.js` compiles the real `src/global.css` through the same PostCSS/Tailwind + react-native-css pipeline Metro uses, once per run, and caches the stylesheet for jest.setup.ts to install. Proven to fail closed, twice. Removing the `nativewind/babel` override from babel.config.js (i.e. class resolution off): 4 suites red, 41 tests failed / 24 passed, with `Expected "#262432", Received undefined`. Changing `colors.white` without regenerating theme.css (i.e. token binding broken): 6 tests red across 3 suites plus the tokens drift guard. Both restored, all green. --- apps/mobile/jest.config.js | 3 +- apps/mobile/jest.global-setup.js | 35 ++++ apps/mobile/jest.setup.ts | 21 +++ apps/mobile/src/__tests__/player-bar.test.tsx | 10 +- .../src/__tests__/question-text.test.tsx | 60 ++++++- .../src/__tests__/secondary-button.test.tsx | 15 ++ .../mobile/src/__tests__/share-modal.test.tsx | 10 +- .../src/__tests__/tailwind-theme.test.tsx | 155 ++++++++++++++++++ .../__tests__/theme-settings-page.test.tsx | 33 +++- .../src/__tests__/use-theme-setting.test.ts | 7 +- apps/mobile/src/test-utils/resolved-style.ts | 53 ++++++ 11 files changed, 378 insertions(+), 24 deletions(-) create mode 100644 apps/mobile/jest.global-setup.js create mode 100644 apps/mobile/src/__tests__/tailwind-theme.test.tsx create mode 100644 apps/mobile/src/test-utils/resolved-style.ts diff --git a/apps/mobile/jest.config.js b/apps/mobile/jest.config.js index 295e0874..7f555421 100644 --- a/apps/mobile/jest.config.js +++ b/apps/mobile/jest.config.js @@ -16,7 +16,7 @@ module.exports = { '|@expo(-.*)?/?' + '|@unimodules/?' + '|nativewind' + - '|react-native-css-interop' + + '|react-native-css' + '|react-native-gesture-handler' + '|react-native-safe-area-context' + '|react-native-screens' + @@ -27,6 +27,7 @@ module.exports = { '/node_modules/react-native-reanimated/plugin/', '/node_modules/@react-native/babel-preset/', ], + globalSetup: '/jest.global-setup.js', setupFilesAfterEnv: ['/jest.setup.ts'], moduleNameMapper: { // Resolve the @/* path alias declared in tsconfig.json. diff --git a/apps/mobile/jest.global-setup.js b/apps/mobile/jest.global-setup.js new file mode 100644 index 00000000..9467b9e0 --- /dev/null +++ b/apps/mobile/jest.global-setup.js @@ -0,0 +1,35 @@ +const fs = require('node:fs') +const path = require('node:path') + +/** + * Compiles the app's real src/global.css once, before the suite runs, and caches + * the result for jest.setup.ts to inject into every test. + * + * This is the exact pipeline Metro runs on device (react-native-css's Metro + * transformer: PostCSS/Tailwind → `compile()` → `StyleCollection.inject()`), so + * the styles the tests assert on are the styles the app ships — including the + * `@theme` block generated from @whocards/tokens. A test that renders a + * component and reads back a resolved colour is therefore also a check that the + * whole CSS pipeline still works, which is the part of a NativeWind upgrade + * that CI otherwise can't see. + */ +const STYLESHEET_PATH = path.join(__dirname, 'node_modules/.cache/whocards/global-css.json') + +module.exports = async () => { + // Required lazily: these are build-time-only deps, and globalSetup runs + // outside the jest module registry. + const postcss = require('postcss') + const tailwindcss = require('@tailwindcss/postcss') + const {compile} = require('react-native-css/compiler') + + const input = path.join(__dirname, 'src/global.css') + const {css} = await postcss([tailwindcss()]).process(fs.readFileSync(input, 'utf8'), { + from: input, + }) + const stylesheet = compile(css, {filename: input, projectRoot: __dirname}).stylesheet() + + fs.mkdirSync(path.dirname(STYLESHEET_PATH), {recursive: true}) + fs.writeFileSync(STYLESHEET_PATH, JSON.stringify(stylesheet)) +} + +module.exports.STYLESHEET_PATH = STYLESHEET_PATH diff --git a/apps/mobile/jest.setup.ts b/apps/mobile/jest.setup.ts index 91dd4b42..7a9e3a3e 100644 --- a/apps/mobile/jest.setup.ts +++ b/apps/mobile/jest.setup.ts @@ -4,3 +4,24 @@ // Gesture handler needs its jest shims loaded before any component under test // that imports react-native-gesture-handler. import 'react-native-gesture-handler/jestSetup' + +import {readFileSync} from 'node:fs' +import {StyleCollection} from 'react-native-css/native' + +// oxlint-disable-next-line typescript/no-unsafe-type-assertion -- globalSetup is CJS-only, so its one exported constant has to be require()d and re-typed here. +const {STYLESHEET_PATH} = require('./jest.global-setup.js') as {STYLESHEET_PATH: string} + +/** + * Load the compiled global.css (see jest.global-setup.js) into the same style + * registry the Metro bundler writes into on device, so `className` resolves in + * tests exactly as it does in the app. Without this every className is inert + * and components render unstyled — which is precisely the failure mode the + * styling tests are there to catch. + */ +const stylesheet: unknown = JSON.parse(readFileSync(STYLESHEET_PATH, 'utf8')) + +beforeEach(() => { + StyleCollection.styles.clear() + // oxlint-disable-next-line typescript/no-unsafe-type-assertion -- JSON round-trip of the compiler's own output. + StyleCollection.inject(stylesheet as Parameters[0]) +}) diff --git a/apps/mobile/src/__tests__/player-bar.test.tsx b/apps/mobile/src/__tests__/player-bar.test.tsx index 70cc3974..6adcf77d 100644 --- a/apps/mobile/src/__tests__/player-bar.test.tsx +++ b/apps/mobile/src/__tests__/player-bar.test.tsx @@ -18,7 +18,7 @@ import React from 'react' import {Ionicons} from '@expo/vector-icons' import {act, fireEvent, render, screen} from '@testing-library/react-native' -import {colorScheme} from 'nativewind' +import {setColorScheme} from '@/lib/color-scheme' import {colors} from '@whocards/tokens' jest.mock('react-native-safe-area-context', () => ({ @@ -26,10 +26,10 @@ jest.mock('react-native-safe-area-context', () => ({ })) afterEach(() => { - // NativeWind's colorScheme is a global observable — reset it so a test that + // The resolved colour scheme is a global observable — reset it so a test that // sets it doesn't bleed into whichever test runs next (mirrors // settings-modal.test.tsx). - act(() => colorScheme.set('system')) + act(() => setColorScheme('system')) }) // PressableScale drives its press animation through react-native-reanimated / @@ -104,7 +104,7 @@ describe('PlayerBar — Exit button (issue #186)', () => { describe('PlayerBar — themed icon color (issue #173)', () => { it('uses white icons when the resolved scheme is dark', () => { - act(() => colorScheme.set('dark')) + act(() => setColorScheme('dark')) renderBar() const icons = screen.UNSAFE_getAllByType(Ionicons) expect(icons.length).toBeGreaterThan(0) @@ -114,7 +114,7 @@ describe('PlayerBar — themed icon color (issue #173)', () => { }) it('uses darker icons when the resolved scheme is light', () => { - act(() => colorScheme.set('light')) + act(() => setColorScheme('light')) renderBar() const icons = screen.UNSAFE_getAllByType(Ionicons) expect(icons.length).toBeGreaterThan(0) diff --git a/apps/mobile/src/__tests__/question-text.test.tsx b/apps/mobile/src/__tests__/question-text.test.tsx index f948f27b..8d6c9155 100644 --- a/apps/mobile/src/__tests__/question-text.test.tsx +++ b/apps/mobile/src/__tests__/question-text.test.tsx @@ -9,8 +9,11 @@ * `fitSecondaryFontSize`'s headroom growth (issue #189). */ import React from 'react' -import {render, screen} from '@testing-library/react-native' +import {act, render, screen} from '@testing-library/react-native' +import {colors} from '@whocards/tokens' +import {setColorScheme} from '@/lib/color-scheme' +import {resolvedStyle, withOpacity} from '@/test-utils/resolved-style' import {QuestionText, fitFontSize, fitSecondaryFontSize} from '../components/question-text' describe('fitFontSize — minFont override', () => { @@ -113,11 +116,21 @@ describe('QuestionText — Tabletop mode (mirrored, issue #148)', () => { }) }) +// These read the *resolved* colour rather than the `className` string: under +// NativeWind v5 the class is compiled away before it reaches the element, so +// asserting on the prop would pass even with the style pipeline dead. Going +// through the token values checks the whole chain — class → theme → token. +const textColor = (text: string) => resolvedStyle(screen.getByText(text)).color + describe('QuestionText — themedText (issue #173, final)', () => { const box = {width: 300, height: 400} const question = 'What matters to you right now?' const secondaryText = '¿Qué te importa ahora mismo?' + // The resolved colour scheme is a global observable — reset it so a test that + // sets it doesn't bleed into whichever test runs next. + afterEach(() => act(() => setColorScheme('system'))) + it('defaults to hardcoded white — card surfaces (Pick a Card) omit themedText', () => { render( { secondaries={[{language: 'es', text: secondaryText}]} /> ) - expect(screen.getByText(question).props.className).toBe('text-white') - expect(screen.getByText(secondaryText).props.className).toBe('text-white/70') + expect(textColor(question)).toBe(colors.white) + expect(textColor(secondaryText)).toBe(withOpacity(colors.white, 70)) + }) + + it('stays white on a card surface even in light mode — the card is always dark', () => { + act(() => setColorScheme('light')) + render( + + ) + expect(textColor(question)).toBe(colors.white) + expect(textColor(secondaryText)).toBe(withOpacity(colors.white, 70)) }) it('follows the theme when themedText is set — classic play on the themed canvas', () => { + act(() => setColorScheme('light')) render( { themedText /> ) - expect(screen.getByText(question).props.className).toBe('text-darker dark:text-white') - expect(screen.getByText(secondaryText).props.className).toBe( - 'text-darker/70 dark:text-white/70' + expect(textColor(question)).toBe(colors.darker) + expect(textColor(secondaryText)).toBe(withOpacity(colors.darker, 70)) + }) + + it('flips to white when themedText meets the dark scheme', () => { + act(() => setColorScheme('dark')) + render( + ) + expect(textColor(question)).toBe(colors.white) + expect(textColor(secondaryText)).toBe(withOpacity(colors.white, 70)) }) it('threads themedText through both mirrored (Tabletop) halves', () => { + act(() => setColorScheme('light')) render() for (const node of screen.getAllByText(question, {includeHiddenElements: true})) { - expect(node.props.className).toBe('text-darker dark:text-white') + expect(resolvedStyle(node).color).toBe(colors.darker) } }) }) @@ -170,7 +212,7 @@ describe('QuestionText — secondary language sizing (issue #189)', () => { secondaries={[{language: 'es', text: secondaryText}]} /> ) - const shortPrimarySecondarySize = short.getByText(secondaryText).props.style.fontSize + const shortPrimarySecondarySize = Number(resolvedStyle(short.getByText(secondaryText)).fontSize) const long = render( { secondaries={[{language: 'es', text: secondaryText}]} /> ) - const longPrimarySecondarySize = long.getByText(secondaryText).props.style.fontSize + const longPrimarySecondarySize = Number(resolvedStyle(long.getByText(secondaryText)).fontSize) // A short question leaves the primary's fit with headroom (issue #189) — // the secondary grows to use some of it. A long question pins the primary diff --git a/apps/mobile/src/__tests__/secondary-button.test.tsx b/apps/mobile/src/__tests__/secondary-button.test.tsx index faa705b6..6f3107ca 100644 --- a/apps/mobile/src/__tests__/secondary-button.test.tsx +++ b/apps/mobile/src/__tests__/secondary-button.test.tsx @@ -7,6 +7,9 @@ import React from 'react' import {Text} from 'react-native' import {fireEvent, render, screen} from '@testing-library/react-native' +import {colors, fonts} from '@whocards/tokens' + +import {resolvedStyle} from '@/test-utils/resolved-style' // PressableScale drives its press animation through react-native-reanimated / // react-native-worklets, whose native module isn't available under plain @@ -50,6 +53,18 @@ describe('SecondaryButton', () => { expect(screen.queryByLabelText('Settings')).toBeNull() }) + it('styles its label from the design tokens — white, on the sans face, bold', () => { + // Reading the resolved style rather than the `className` string: NativeWind + // v5 compiles the class away before it reaches the element, so a className + // assertion would still pass with the whole style pipeline broken. + render( {}} />) + expect(resolvedStyle(screen.getByText('Settings'))).toMatchObject({ + color: colors.white, + fontFamily: fonts.sans.family, + fontWeight: 700, + }) + }) + it('renders an optional leading icon', () => { render( icon} onPress={() => {}} /> diff --git a/apps/mobile/src/__tests__/share-modal.test.tsx b/apps/mobile/src/__tests__/share-modal.test.tsx index 1c3879a7..accf9eb1 100644 --- a/apps/mobile/src/__tests__/share-modal.test.tsx +++ b/apps/mobile/src/__tests__/share-modal.test.tsx @@ -42,7 +42,7 @@ import React from 'react' import {Share} from 'react-native' import {act, fireEvent, render, screen} from '@testing-library/react-native' import {StatusBar} from 'expo-status-bar' -import {colorScheme} from 'nativewind' +import {setColorScheme} from '@/lib/color-scheme' jest.mock('react-native-safe-area-context', () => ({ useSafeAreaInsets: () => ({top: 0, bottom: 0, left: 0, right: 0}), @@ -56,10 +56,10 @@ jest.mock('@/lib/share-image', () => ({ import {ShareModal} from '../components/share-modal' afterEach(() => { - // NativeWind's colorScheme is a global observable — reset it so a test that + // The resolved colour scheme is a global observable — reset it so a test that // sets it doesn't bleed into whichever test runs next (mirrors // settings-modal.test.tsx). - act(() => colorScheme.set('system')) + act(() => setColorScheme('system')) }) const PROPS = { @@ -246,13 +246,13 @@ describe('ShareModal', () => { // StatusBar-override coverage). describe('ShareModal — StatusBar override (issue #173)', () => { it('shows light (white) status-bar icons when the resolved scheme is dark', () => { - act(() => colorScheme.set('dark')) + act(() => setColorScheme('dark')) render( {}} onClose={() => {}} />) expect(screen.UNSAFE_getByType(StatusBar).props.style).toBe('light') }) it('shows dark status-bar icons when the resolved scheme is light', () => { - act(() => colorScheme.set('light')) + act(() => setColorScheme('light')) render( {}} onClose={() => {}} />) expect(screen.UNSAFE_getByType(StatusBar).props.style).toBe('dark') }) diff --git a/apps/mobile/src/__tests__/tailwind-theme.test.tsx b/apps/mobile/src/__tests__/tailwind-theme.test.tsx new file mode 100644 index 00000000..cd3e0881 --- /dev/null +++ b/apps/mobile/src/__tests__/tailwind-theme.test.tsx @@ -0,0 +1,155 @@ +/** + * The design-token → Tailwind → NativeWind pipeline, asserted end to end. + * + * Every screen in this app is styled with `className`, and nothing else in CI + * runs Metro or a simulator — so if the Tailwind theme stopped being built from + * @whocards/tokens, or NativeWind stopped resolving classes altogether, every + * other test here would still pass and the app would ship unstyled. This file + * is the guard: `jest.global-setup.js` compiles the real `src/global.css` + * through the same PostCSS/Tailwind + react-native-css pipeline Metro uses, and + * the cases below render each token's utility class and read the resolved style + * back. + * + * The case tables are checked for completeness against the token objects + * themselves, so adding a token to @whocards/tokens fails this file until the + * token is covered. The class names must stay written out in full: Tailwind + * only emits a utility it has seen literally in a scanned source file, and + * `src/**` (this file included) is what `global.css` scans. + */ +import React from 'react' +import {Text, View} from 'react-native' +import {act, render, screen} from '@testing-library/react-native' +import {colors, fonts, radius, spacing} from '@whocards/tokens' + +import {resolvedStyle, rem, withOpacity} from '@/test-utils/resolved-style' +import {setColorScheme} from '@/lib/color-scheme' + +const styleFor = (className: string) => { + render() + return resolvedStyle(screen.getByTestId('subject')) +} + +/** Every `--color-*` the theme should expose, as `[utility, token value]`. */ +const COLOR_CASES: [className: string, expected: string][] = [ + ['bg-yellow-100', colors.yellow[100]], + ['bg-yellow-300', colors.yellow[300]], + ['bg-yellow-400', colors.yellow[400]], + ['bg-yellow-500', colors.yellow[500]], + ['bg-gray', colors.gray.DEFAULT], + ['bg-gray-lighter', colors.gray.lighter], + ['bg-gray-light', colors.gray.light], + ['bg-gray-dark', colors.gray.dark], + ['bg-primary-light', colors.primary.light], + ['bg-primary-dark', colors.primary.dark], + ['bg-dark', colors.dark], + ['bg-darker', colors.darker], + ['bg-darkest', colors.darkest], + ['bg-background', colors.background], + ['bg-white', colors.white], + ['bg-red', colors.red], + ['bg-canvasLight', colors.canvasLight], + ['bg-mutedOnLight', colors.mutedOnLight], + ['bg-accentOnLight', colors.accentOnLight], + ['bg-errorOnLight', colors.errorOnLight], + ['bg-accentOnDark', colors.accentOnDark], + ['bg-errorOnDark', colors.errorOnDark], +] + +describe('Tailwind theme — colours', () => { + it.each(COLOR_CASES)('%s resolves to the token value', (className, expected) => { + expect(styleFor(className).backgroundColor).toBe(expected) + }) + + it('covers every colour token — a new token must be added above', () => { + const covered = new Set(COLOR_CASES.map(([className]) => className)) + const expected = Object.entries(colors).flatMap(([name, value]) => + typeof value === 'string' + ? [`bg-${name}`] + : Object.keys(value).map((shade) => + shade === 'DEFAULT' ? `bg-${name}` : `bg-${name}-${shade}` + ) + ) + expect([...covered].toSorted()).toEqual([...new Set(expected)].toSorted()) + }) +}) + +/** The custom spacing/radius steps, in the px their `rem` values compile to. */ +const SPACING_CASES: [className: string, expected: number][] = [ + ['p-4.5', rem(spacing['4.5'])], + ['p-7.5', rem(spacing['7.5'])], +] + +describe('Tailwind theme — spacing and radius', () => { + it.each(SPACING_CASES)('%s resolves to the token value in px', (className, expected) => { + expect(styleFor(className).padding).toBe(expected) + }) + + it('covers every custom spacing step', () => { + expect(SPACING_CASES.map(([className]) => className)).toEqual( + Object.keys(spacing).map((name) => `p-${name}`) + ) + }) + + it('rounded-2.5xl resolves to the token value in px', () => { + expect(styleFor('rounded-2.5xl').borderRadius).toBe(rem(radius['2.5xl'])) + }) + + it('covers every custom radius step', () => { + expect(Object.keys(radius)).toEqual(['2.5xl']) + }) +}) + +/** + * `font-*` maps to the *registered* face, not the whole CSS stack: the tokens + * carry a web fallback list, and react-native-css takes the first family from + * it — which is the name `expo-font` loads the file under. + */ +const FONT_CASES: [className: string, expected: string][] = [ + ['font-sans', fonts.sans.family], + ['font-title', fonts.title.family], + ['font-chinese', fonts.chinese.family], + ['font-hebrew', fonts.hebrew.family], + ['font-japanese', fonts.japanese.family], +] + +describe('Tailwind theme — fonts', () => { + it.each(FONT_CASES)('%s resolves to the registered family', (className, expected) => { + render({className}) + expect(resolvedStyle(screen.getByText(className)).fontFamily).toBe(expected) + }) + + it('covers every font token', () => { + expect(FONT_CASES.map(([className]) => className)).toEqual( + Object.keys(fonts).map((name) => `font-${name}`) + ) + }) + + it('keeps golos-text as the default sans face, beating nativewind/theme’s System', () => { + // nativewind/theme ships an unlayered `@media ios { :root { --font-sans: System } }`, + // which outranks anything in a cascade layer — including our @theme block. + // src/global.css re-declares --font-sans after that import to win it back; + // this is the assertion that the ordering still holds. + expect(styleFor('font-sans').fontFamily).toBe(fonts.sans.family) + }) +}) + +describe('Tailwind theme — modifiers', () => { + it('applies the /NN opacity modifier to a token colour', () => { + expect(styleFor('bg-primary-dark/25').backgroundColor).toBe( + withOpacity(colors.primary.dark, 25) + ) + expect(styleFor('bg-white/70').backgroundColor).toBe(withOpacity(colors.white, 70)) + }) + + it('switches on `dark:` with the app’s colour-scheme setting', () => { + act(() => setColorScheme('light')) + expect(styleFor('bg-canvasLight dark:bg-darkest').backgroundColor).toBe(colors.canvasLight) + + act(() => setColorScheme('dark')) + expect(styleFor('bg-canvasLight dark:bg-darkest').backgroundColor).toBe(colors.darkest) + }) + + // The resolved colour scheme is a global observable — reset it so a test that + // sets it doesn't bleed into whichever test runs next. + afterEach(() => act(() => setColorScheme('system'))) +}) diff --git a/apps/mobile/src/__tests__/theme-settings-page.test.tsx b/apps/mobile/src/__tests__/theme-settings-page.test.tsx index 9bbf6a4d..8b4448ab 100644 --- a/apps/mobile/src/__tests__/theme-settings-page.test.tsx +++ b/apps/mobile/src/__tests__/theme-settings-page.test.tsx @@ -9,7 +9,11 @@ * only one now), so there's nothing to test about those here. */ import React from 'react' -import {fireEvent, render, screen} from '@testing-library/react-native' +import {act, fireEvent, render, screen} from '@testing-library/react-native' +import {colors} from '@whocards/tokens' + +import {setColorScheme} from '@/lib/color-scheme' +import {resolvedStyle} from '@/test-utils/resolved-style' jest.mock('react-native-safe-area-context', () => ({ useSafeAreaInsets: () => ({top: 0, bottom: 0, left: 0, right: 0}), @@ -49,3 +53,30 @@ describe('ThemeSettingsPage — options (issue #189, third pass)', () => { expect(onBack).toHaveBeenCalled() }) }) + +// The selected pill is the only signal that a segmented control has a +// selection, and it comes entirely from a conditional `className`. Asserting the +// *resolved* background (rather than the class string, which NativeWind v5 +// compiles away before render) checks both the conditional and the theme behind it. +const background = (label: string) => resolvedStyle(screen.getByLabelText(label)).backgroundColor + +describe('ThemeSettingsPage — selected segment styling', () => { + afterEach(() => act(() => setColorScheme('system'))) + + it('fills the selected segment with white on light, leaving the others bare', async () => { + act(() => setColorScheme('light')) + renderPage('dark') + await screen.findByLabelText('Theme: Dark') + expect(background('Theme: Dark')).toBe(colors.white) + expect(background('Theme: System')).toBeUndefined() + expect(background('Theme: Light')).toBeUndefined() + }) + + it('fills the selected segment with the dark token on dark', async () => { + act(() => setColorScheme('dark')) + renderPage('light') + await screen.findByLabelText('Theme: Light') + expect(background('Theme: Light')).toBe(colors.dark) + expect(background('Theme: System')).toBeUndefined() + }) +}) diff --git a/apps/mobile/src/__tests__/use-theme-setting.test.ts b/apps/mobile/src/__tests__/use-theme-setting.test.ts index 14ca59a4..0a935b72 100644 --- a/apps/mobile/src/__tests__/use-theme-setting.test.ts +++ b/apps/mobile/src/__tests__/use-theme-setting.test.ts @@ -6,9 +6,10 @@ * expressed as a `dark:` class (an `Ionicons` color, the Library screen's * `` override — see index.tsx). * - * `theme-store.ts` and `nativewind`'s `colorScheme`/`useColorScheme` run for - * real (only `AsyncStorage` is mocked) — this hook's whole job is composing - * the two, so mocking either away would test nothing. + * `theme-store.ts` and `src/lib/color-scheme.ts` (our thin wrapper over + * react-native-css's colour-scheme observable, which is what NativeWind v5 + * reads `dark:` off) run for real — only `AsyncStorage` is mocked. This hook's + * whole job is composing the two, so mocking either away would test nothing. * * Unlike theme-store.test.ts, this file does NOT `jest.resetModules()` * between tests: doing that alongside `renderHook` breaks React's internal diff --git a/apps/mobile/src/test-utils/resolved-style.ts b/apps/mobile/src/test-utils/resolved-style.ts new file mode 100644 index 00000000..f51d8d0f --- /dev/null +++ b/apps/mobile/src/test-utils/resolved-style.ts @@ -0,0 +1,53 @@ +/** + * Helpers for asserting on the styles NativeWind actually resolved a + * `className` into. + * + * Under NativeWind v5 a `className` never reaches the rendered element: the + * component wrapper compiles it away and emits a `style` prop instead. So + * `expect(node.props.className).toBe('text-white')` — which is what these tests + * used to do — can only ever assert that a string was passed *in*, and would + * keep passing even if the whole CSS pipeline stopped producing styles. Reading + * the resolved `style` back asserts the thing that actually reaches the screen: + * that `text-white` is `colors.white`, that the Tailwind theme was built from + * @whocards/tokens, and that class resolution is running at all. + */ + +type StyledNode = {props: {style?: unknown}} + +/** + * The single flattened style object behind a node's `style` prop. NativeWind + * emits an array (one entry per contributing rule, in cascade order), which + * React Native flattens last-wins. + */ +export const resolvedStyle = (node: StyledNode): Record => { + const merged: Record = {} + for (const entry of [node.props.style].flat(Number.POSITIVE_INFINITY)) { + if (entry && typeof entry === 'object') Object.assign(merged, entry) + } + return merged +} + +/** + * A token colour with Tailwind's `/NN` opacity modifier applied, in the 8-digit + * hex form lightningcss serialises to — `withOpacity(colors.white, 70)` is what + * `text-white/70` should resolve to. + * + * The alpha byte is `round(f32(percent / 100) * 255)`: lightningcss holds alpha + * as a 32-bit float, so `70%` is 0.69999998 and rounds *down* to 178 (`b2`) + * rather than the 179 an exact 0.7 would give. + */ +export const withOpacity = (hex: string, percent: number): string => + hex + + Math.round(Math.fround(percent / 100) * 255) + .toString(16) + .padStart(2, '0') + +/** + * Tailwind's root font size, in the px React Native works in. Tailwind emits + * spacing/radius tokens in `rem`; react-native-css inlines them at compile time + * against this multiplier, so `rounded-2.5xl` (1.25rem) is 17.5. + */ +export const REM_PX = 14 + +/** `rem('1.125rem')` → 15.75 — a rem-valued token as the px it compiles to. */ +export const rem = (value: string): number => Number.parseFloat(value) * REM_PX From d0bfe22d5522244403a20e0e3da235ea0751ff80 Mon Sep 17 00:00:00 2001 From: acharlop Date: Wed, 9 Sep 2026 22:24:22 +0200 Subject: [PATCH 04/17] chore(website): consume the shared token theme, bump Tailwind to 4.3.3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The website already had a Tailwind v4 `@theme` block that restated the design tokens by hand — a second copy of the same values, kept in sync by nobody. Now that packages/tokens renders those tokens to a `@theme` block of its own, the website imports it and keeps only what is genuinely website-only (the hero background image and the question grid-template row). Output is byte-identical: 172367 bytes before and after, with the same set of theme custom properties; only the order of the `:root` declarations moved. Closes the mobile half of Dependabot's tailwindcss 4.3.3 bump (#280), which is what this branch replaces. --- apps/website/package.json | 3 +- apps/website/src/styles/base.css | 48 ++++---------------------------- 2 files changed, 8 insertions(+), 43 deletions(-) diff --git a/apps/website/package.json b/apps/website/package.json index 2dffb880..68f52da2 100644 --- a/apps/website/package.json +++ b/apps/website/package.json @@ -28,6 +28,7 @@ "@whocards/decks": "workspace:*", "@whocards/emails": "workspace:*", "@whocards/observability": "workspace:*", + "@whocards/tokens": "workspace:*", "@trpc/client": "catalog:", "@trpc/server": "catalog:", "@astrojs/mdx": "^8.0.0", @@ -72,7 +73,7 @@ "split-text-js": "^1.0.3", "svix": "^1.96.0", "tailwind-merge": "^3.6.0", - "tailwindcss": "^4.3.1", + "tailwindcss": "^4.3.3", "wawoff2": "^2.0.1", "zod": "catalog:" }, diff --git a/apps/website/src/styles/base.css b/apps/website/src/styles/base.css index bf3a2018..ece9b7c6 100644 --- a/apps/website/src/styles/base.css +++ b/apps/website/src/styles/base.css @@ -1,4 +1,9 @@ @import 'tailwindcss'; +/* + * The design tokens, shared with the app: a Tailwind v4 `@theme` block rendered + * from packages/tokens/src/*.ts. Website-only theme values stay below. + */ +@import '@whocards/tokens/theme.css'; @plugin "daisyui" { themes: false; logs: false; @@ -6,49 +11,8 @@ @plugin "@tailwindcss/typography"; @theme { - /* Spacing */ - --spacing-4\.5: 1.125rem; - --spacing-7\.5: 1.875rem; - - /* Border radius */ - --radius-2\.5xl: 1.25rem; - - /* Colors */ - --color-yellow-100: #7e7552; - --color-yellow-300: #ffe37e; - --color-yellow-400: #f9d75f; - --color-yellow-500: #f6c944; - - --color-gray: #65636e; - --color-gray-lighter: #dcdee9; - --color-gray-light: #474a69; - --color-gray-dark: #9698af; - - --color-dark: #262432; - --color-darker: #111516; - --color-darkest: #08001a; - --color-background: #0d051f; - --color-white: #f5f5f5; - --color-red: #ee1e23; - - --color-primary-light: #f9d75f; - --color-primary-dark: #c058d2; - - /* Background images */ + /* Background images — the hero art is website-only */ --background-image-hero: url(/background.svg); - --background-image-gradient-primary: linear-gradient(to bottom left, #c058d2 25%, #f9d75f 92%); - - /* Font families */ - --font-sans: golos-text, ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', - 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; - --font-title: aptly, ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', - 'Segoe UI Symbol', 'Noto Color Emoji'; - --font-chinese: noto-sans-chinese, ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', - 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; - --font-hebrew: noto-sans-hebrew, ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', - 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; - --font-japanese: noto-sans-japanese, ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', - 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; /* Grid template rows */ --grid-template-rows-question: 1fr min-content; From 516c4901a15c63d97c4a2a0ce0b24b011ac59e00 Mon Sep 17 00:00:00 2001 From: acharlop Date: Wed, 9 Sep 2026 21:51:30 +0200 Subject: [PATCH 05/17] chore(deps): bump React Native to 0.86.3 and the test tooling to jest 30 / RNTL 14 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Lands dependabot/#290 (minor-and-patch: react, react-native and friends) and dependabot/#279 (test tooling: jest, jest-expo, @testing-library/react-native, vitest) as one change — neither is green on its own. main already carries expo@~57.0.20 with every expo-* at ~57.x, but react-native@0.85.3 and jest-expo@~56.0.5. jest-expo 57's setup calls a non-virtual `jest.mock('@react-native/assets-registry/registry', ...)` without depending on that package itself, so under pnpm's strict node_modules only the react-native version bundled with SDK 57 exposes it. #279 alone (jest-expo 57 + RN 0.85) and #290 alone (RN bump + jest-expo 56) both fail the Quality gate with `Cannot find module '@react-native/assets-registry/registry'`. react-native lands on 0.86.3, not #290's 0.87.1: 0.86.3 is the version Expo SDK 57 pins in its bundledNativeModules.json (`npx expo install --check` no longer lists react-native at all), while 0.87 drops @react-native/assets-registry and is outside the SDK 57 matrix. reanimated 4.6.0 and worklets 0.12.1 both declare `react-native: "0.83 - 0.87"`, so the rest of #290 lands unchanged. RNTL 14 is a breaking release (render/renderHook/rerender/unmount/fireEvent/act are all async now, and the UNSAFE_* composite queries are gone), so the mobile test files move to the new API — see the PR body for the per-file rationale. nativewind, tailwindcss and react-native-css-interop are deliberately untouched (the NativeWind v5 / Tailwind v4 migration is its own branch). Supersedes #290 Supersedes #279 --- apps/mobile/package.json | 22 +- .../src/__tests__/error-boundary.test.tsx | 20 +- .../src/__tests__/game-settings-page.test.tsx | 12 +- .../__tests__/language-settings-page.test.tsx | 20 +- apps/mobile/src/__tests__/player-bar.test.tsx | 72 +- .../src/__tests__/question-text.test.tsx | 34 +- .../second-language-settings-page.test.tsx | 20 +- .../src/__tests__/secondary-button.test.tsx | 18 +- .../src/__tests__/settings-modal.test.tsx | 119 +- .../__tests__/settings-sheet-header.test.tsx | 16 +- .../mobile/src/__tests__/share-modal.test.tsx | 80 +- .../__tests__/theme-settings-page.test.tsx | 10 +- .../src/__tests__/use-internal-marker.test.ts | 12 +- .../src/__tests__/use-theme-setting.test.ts | 34 +- pnpm-lock.yaml | 3124 ++++++++++------- pnpm-workspace.yaml | 2 +- 16 files changed, 2107 insertions(+), 1508 deletions(-) diff --git a/apps/mobile/package.json b/apps/mobile/package.json index e4aa727f..85aa2b8b 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -55,28 +55,28 @@ "expo-updates": "~57.0.21", "nativewind": "^4.1.23", "posthog-react-native": "^4.67.0", - "react": "19.2.3", - "react-dom": "19.2.3", - "react-native": "0.85.3", + "react": "19.2.8", + "react-dom": "19.2.8", + "react-native": "0.86.3", "react-native-css-interop": "0.2.6", "react-native-gesture-handler": "~3.2.1", - "react-native-reanimated": "4.3.1", - "react-native-safe-area-context": "~5.7.0", - "react-native-screens": "4.25.2", + "react-native-reanimated": "4.6.0", + "react-native-safe-area-context": "~5.9.1", + "react-native-screens": "4.27.0", "react-native-web": "~0.21.0", - "react-native-worklets": "0.8.3", + "react-native-worklets": "0.12.1", "tailwindcss": "^3.4.17", "zod": "catalog:" }, "devDependencies": { "@babel/plugin-transform-react-jsx": "^7.29.7", - "@testing-library/react-native": "^13.3.3", - "@types/jest": "^29.5.14", + "@testing-library/react-native": "^14.0.1", + "@types/jest": "^30.0.0", "@types/react": "~19.2.18", "babel-plugin-react-compiler": "1.0.0", "babel-preset-expo": "~57.0.10", - "jest": "^29.7.0", - "jest-expo": "~56.0.5", + "jest": "^30.5.1", + "jest-expo": "~57.0.5", "typescript": "~6.0.3" } } diff --git a/apps/mobile/src/__tests__/error-boundary.test.tsx b/apps/mobile/src/__tests__/error-boundary.test.tsx index cc292caa..bd5010e7 100644 --- a/apps/mobile/src/__tests__/error-boundary.test.tsx +++ b/apps/mobile/src/__tests__/error-boundary.test.tsx @@ -37,8 +37,8 @@ const ThrowingChild = () => { const StableChild = () => describe('ErrorBoundary', () => { - it('renders children when there is no error', () => { - const {queryByText} = render( + it('renders children when there is no error', async () => { + const {queryByText} = await render( @@ -46,8 +46,8 @@ describe('ErrorBoundary', () => { expect(queryByText('Something went wrong')).toBeNull() }) - it('shows the fallback when a child throws', () => { - const {getByText} = render( + it('shows the fallback when a child throws', async () => { + const {getByText} = await render( @@ -56,8 +56,8 @@ describe('ErrorBoundary', () => { expect(getByText('Try again')).toBeTruthy() }) - it('calls logError with the thrown error', () => { - render( + it('calls logError with the thrown error', async () => { + await render( @@ -69,7 +69,7 @@ describe('ErrorBoundary', () => { ) }) - it('resets to rendering children when "Try again" is pressed', () => { + it('resets to rendering children when "Try again" is pressed', async () => { // Use a stateful wrapper so we can swap the child after reset. let shouldThrow = true const ConditionalChild = () => { @@ -77,7 +77,7 @@ describe('ErrorBoundary', () => { return } - const {getByText, queryByText, rerender} = render( + const {getByText, queryByText, rerender} = await render( @@ -88,10 +88,10 @@ describe('ErrorBoundary', () => { // Stop throwing, then press reset. shouldThrow = false - fireEvent.press(getByText('Try again')) + await fireEvent.press(getByText('Try again')) // Re-render after reset — the fallback is gone. - rerender( + await rerender( diff --git a/apps/mobile/src/__tests__/game-settings-page.test.tsx b/apps/mobile/src/__tests__/game-settings-page.test.tsx index 5f199e12..2cf8e3ca 100644 --- a/apps/mobile/src/__tests__/game-settings-page.test.tsx +++ b/apps/mobile/src/__tests__/game-settings-page.test.tsx @@ -22,14 +22,14 @@ const renderPage = (onSelect = jest.fn(), onBack = jest.fn()) => describe('GameSettingsPage (issue #189, third pass)', () => { it('renders the game catalog under a "Choose your game" header', async () => { - renderPage() + await renderPage() await screen.findByText('Choose your game') expect(screen.getByText('Classic')).toBeTruthy() expect(screen.getByText('Pick a Card')).toBeTruthy() }) it('marks the current game selected', async () => { - renderPage() + await renderPage() const selected = await screen.findByLabelText('Classic') expect(selected.props.accessibilityState).toEqual({selected: true}) expect(screen.getByLabelText('Pick a Card').props.accessibilityState).toEqual({ @@ -39,17 +39,17 @@ describe('GameSettingsPage (issue #189, third pass)', () => { it('reports the pressed game via onSelect', async () => { const onSelect = jest.fn() - renderPage(onSelect) + await renderPage(onSelect) const pick = await screen.findByLabelText('Pick a Card') - fireEvent.press(pick) + await fireEvent.press(pick) expect(onSelect).toHaveBeenCalledWith('pick') }) it('reports the back arrow press via onBack', async () => { const onBack = jest.fn() - renderPage(undefined, onBack) + await renderPage(undefined, onBack) await screen.findByText('Choose your game') - fireEvent.press(screen.getByLabelText('back')) + await fireEvent.press(screen.getByLabelText('back')) expect(onBack).toHaveBeenCalled() }) }) diff --git a/apps/mobile/src/__tests__/language-settings-page.test.tsx b/apps/mobile/src/__tests__/language-settings-page.test.tsx index a87e2077..0cfc52a0 100644 --- a/apps/mobile/src/__tests__/language-settings-page.test.tsx +++ b/apps/mobile/src/__tests__/language-settings-page.test.tsx @@ -41,7 +41,7 @@ const renderPage = () => describe('LanguageSettingsPage — Tabletop mode moved out (issue #176)', () => { it('never renders a Tabletop mode row — that setting lives in settings-modal.tsx now', async () => { - renderPage() + await renderPage() await screen.findByText('Choose your language') expect(screen.queryByText('Tabletop mode')).toBeNull() expect(screen.queryByLabelText('Tabletop mode')).toBeNull() @@ -50,7 +50,7 @@ describe('LanguageSettingsPage — Tabletop mode moved out (issue #176)', () => describe('LanguageSettingsPage — "Also show" moved out (issue #189, fourth pass)', () => { it('never renders an "Also show" section — that setting is its own page now', async () => { - renderPage() + await renderPage() await screen.findByText('Choose your language') expect(screen.queryByText('Also show')).toBeNull() }) @@ -59,7 +59,7 @@ describe('LanguageSettingsPage — "Also show" moved out (issue #189, fourth pas describe('LanguageSettingsPage — back arrow', () => { it('reports the back arrow press via onBack', async () => { const onBack = jest.fn() - render( + await render( { /> ) await screen.findByText('Choose your language') - fireEvent.press(screen.getByLabelText('back')) + await fireEvent.press(screen.getByLabelText('back')) expect(onBack).toHaveBeenCalled() }) }) describe('LanguageSettingsPage — single-language deck (issue #148 review, carried by #176)', () => { it('titles the page "Language", not "Choose your language"', async () => { - render( + await render( {}} onBack={() => {}} /> ) await screen.findByText('Language') @@ -83,7 +83,7 @@ describe('LanguageSettingsPage — single-language deck (issue #148 review, carr }) it('hides the inert, always-checked language row', async () => { - render( + await render( {}} onBack={() => {}} /> ) await screen.findByText('Language') @@ -91,7 +91,7 @@ describe('LanguageSettingsPage — single-language deck (issue #148 review, carr }) it('keeps "Choose your language" and the language row for a multi-language deck', async () => { - renderPage() + await renderPage() await screen.findByText('Choose your language') expect(screen.getByText('English')).toBeTruthy() }) @@ -100,7 +100,7 @@ describe('LanguageSettingsPage — single-language deck (issue #148 review, carr describe('LanguageSettingsPage — primary selection', () => { it('reports the pressed language via onSelect', async () => { const onSelect = jest.fn() - render( + await render( { /> ) const hebrew = await screen.findByText('Hebrew') - fireEvent.press(hebrew) + await fireEvent.press(hebrew) expect(onSelect).toHaveBeenCalledWith('he') }) it('marks the current primary language selected', async () => { - renderPage() + await renderPage() const english = await screen.findByText('English') // The primary rows are matched by their Text content (no explicit // accessibilityLabel — same as before the split), so walk up from the diff --git a/apps/mobile/src/__tests__/player-bar.test.tsx b/apps/mobile/src/__tests__/player-bar.test.tsx index 70cc3974..79de1021 100644 --- a/apps/mobile/src/__tests__/player-bar.test.tsx +++ b/apps/mobile/src/__tests__/player-bar.test.tsx @@ -16,7 +16,7 @@ * `accessibilityLabel="exit deck"` for Maestro/VoiceOver continuity. */ import React from 'react' -import {Ionicons} from '@expo/vector-icons' +import {StyleSheet} from 'react-native' import {act, fireEvent, render, screen} from '@testing-library/react-native' import {colorScheme} from 'nativewind' import {colors} from '@whocards/tokens' @@ -25,11 +25,11 @@ jest.mock('react-native-safe-area-context', () => ({ useSafeAreaInsets: () => ({top: 0, bottom: 0, left: 0, right: 0}), })) -afterEach(() => { +afterEach(async () => { // NativeWind's colorScheme is a global observable — reset it so a test that // sets it doesn't bleed into whichever test runs next (mirrors // settings-modal.test.tsx). - act(() => colorScheme.set('system')) + await act(() => colorScheme.set('system')) }) // PressableScale drives its press animation through react-native-reanimated / @@ -58,24 +58,40 @@ const noop = () => {} const renderBar = (props: Partial> = {}) => render() +/** + * The color of every rendered `Ionicons` glyph. + * + * @testing-library/react-native 14 removed the composite `UNSAFE_getAllByType` + * query — the tree it models is host elements only + * (https://github.com/callstack/react-native-testing-library/releases/tag/v14.0.0). + * `Ionicons` renders a host `` whose flattened style carries both the + * glyph font and the `color` prop this test is about, so match on that instead. + */ +const iconColors = () => + ( + screen.root?.queryAll( + (node) => StyleSheet.flatten(node.props.style)?.fontFamily === 'ionicons' + ) ?? [] + ).map((node) => StyleSheet.flatten(node.props.style).color) + describe('PlayerBar — no Language/Display button (issue #176)', () => { - it('never renders a Language or Display action — that setting moved to the home Settings menu', () => { - renderBar() + it('never renders a Language or Display action — that setting moved to the home Settings menu', async () => { + await renderBar() expect(screen.queryByText('Language')).toBeNull() expect(screen.queryByText('Display')).toBeNull() expect(screen.queryByLabelText('change language')).toBeNull() expect(screen.queryByLabelText('display settings')).toBeNull() }) - it('renders Back, Share, and Next', () => { - renderBar() + it('renders Back, Share, and Next', async () => { + await renderBar() expect(screen.getByLabelText('previous question')).toBeTruthy() expect(screen.getByLabelText('share question')).toBeTruthy() expect(screen.getByLabelText('next question')).toBeTruthy() }) - it('hides Share when showShare is false, keeping Back and Next', () => { - renderBar({showShare: false}) + it('hides Share when showShare is false, keeping Back and Next', async () => { + await renderBar({showShare: false}) expect(screen.queryByLabelText('share question')).toBeNull() expect(screen.getByLabelText('previous question')).toBeTruthy() expect(screen.getByLabelText('next question')).toBeTruthy() @@ -83,43 +99,43 @@ describe('PlayerBar — no Language/Display button (issue #176)', () => { }) describe('PlayerBar — Exit button (issue #186)', () => { - it('renders an Exit action, mid-bar right after Back, with the legacy "exit deck" label', () => { - renderBar() + it('renders an Exit action, mid-bar right after Back, with the legacy "exit deck" label', async () => { + await renderBar() expect(screen.getByText('Exit')).toBeTruthy() expect(screen.getByLabelText('exit deck')).toBeTruthy() }) - it('calls onExit when pressed', () => { + it('calls onExit when pressed', async () => { const onExit = jest.fn() - renderBar({onExit}) - fireEvent.press(screen.getByLabelText('exit deck')) + await renderBar({onExit}) + await fireEvent.press(screen.getByLabelText('exit deck')) expect(onExit).toHaveBeenCalledTimes(1) }) - it('is present regardless of showShare — Exit is the only exit once the top chip is gone', () => { - renderBar({showShare: false}) + it('is present regardless of showShare — Exit is the only exit once the top chip is gone', async () => { + await renderBar({showShare: false}) expect(screen.getByLabelText('exit deck')).toBeTruthy() }) }) describe('PlayerBar — themed icon color (issue #173)', () => { - it('uses white icons when the resolved scheme is dark', () => { - act(() => colorScheme.set('dark')) - renderBar() - const icons = screen.UNSAFE_getAllByType(Ionicons) + it('uses white icons when the resolved scheme is dark', async () => { + await act(() => colorScheme.set('dark')) + await renderBar() + const icons = iconColors() expect(icons.length).toBeGreaterThan(0) - for (const icon of icons) { - expect(icon.props.color).toBe(colors.white) + for (const color of icons) { + expect(color).toBe(colors.white) } }) - it('uses darker icons when the resolved scheme is light', () => { - act(() => colorScheme.set('light')) - renderBar() - const icons = screen.UNSAFE_getAllByType(Ionicons) + it('uses darker icons when the resolved scheme is light', async () => { + await act(() => colorScheme.set('light')) + await renderBar() + const icons = iconColors() expect(icons.length).toBeGreaterThan(0) - for (const icon of icons) { - expect(icon.props.color).toBe(colors.darker) + for (const color of icons) { + expect(color).toBe(colors.darker) } }) }) diff --git a/apps/mobile/src/__tests__/question-text.test.tsx b/apps/mobile/src/__tests__/question-text.test.tsx index f948f27b..070bf9ef 100644 --- a/apps/mobile/src/__tests__/question-text.test.tsx +++ b/apps/mobile/src/__tests__/question-text.test.tsx @@ -74,20 +74,20 @@ describe('QuestionText — Tabletop mode (mirrored, issue #148)', () => { const box = {width: 300, height: 400} const question = 'What matters to you right now?' - it('renders the question once when not mirrored', () => { - render() + it('renders the question once when not mirrored', async () => { + await render() expect(screen.getAllByText(question)).toHaveLength(1) }) - it('renders the question twice in the tree when mirrored — one normal, one rotated', () => { - render() + it('renders the question twice in the tree when mirrored — one normal, one rotated', async () => { + await render() // includeHiddenElements: true bypasses RNTL's default accessibility-hidden // filter, so this counts both copies regardless of a11y state. expect(screen.getAllByText(question, {includeHiddenElements: true})).toHaveLength(2) }) - it('hides the rotated copy from the accessibility tree — only one is queryable by default', () => { - render() + it('hides the rotated copy from the accessibility tree — only one is queryable by default', async () => { + await render() // RNTL's default query excludes accessibilityElementsHidden / // importantForAccessibility="no-hide-descendants" subtrees — exactly the // marking QuestionText puts on the rotated half. A screen reader hits the @@ -96,8 +96,8 @@ describe('QuestionText — Tabletop mode (mirrored, issue #148)', () => { expect(screen.getAllByText(question)).toHaveLength(1) }) - it('renders secondaries in both mirrored halves, one hidden from accessibility', () => { - render( + it('renders secondaries in both mirrored halves, one hidden from accessibility', async () => { + await render( { const question = 'What matters to you right now?' const secondaryText = '¿Qué te importa ahora mismo?' - it('defaults to hardcoded white — card surfaces (Pick a Card) omit themedText', () => { - render( + it('defaults to hardcoded white — card surfaces (Pick a Card) omit themedText', async () => { + await render( { expect(screen.getByText(secondaryText).props.className).toBe('text-white/70') }) - it('follows the theme when themedText is set — classic play on the themed canvas', () => { - render( + it('follows the theme when themedText is set — classic play on the themed canvas', async () => { + await render( { ) }) - it('threads themedText through both mirrored (Tabletop) halves', () => { - render() + it('threads themedText through both mirrored (Tabletop) halves', async () => { + await render() for (const node of screen.getAllByText(question, {includeHiddenElements: true})) { expect(node.props.className).toBe('text-darker dark:text-white') } @@ -159,10 +159,10 @@ describe('QuestionText — secondary language sizing (issue #189)', () => { const box = {width: 300, height: 400} const secondaryText = 'Hola' - it('renders the secondary noticeably bigger under a short primary than a long one', () => { + it('renders the secondary noticeably bigger under a short primary than a long one', async () => { // Each render is queried through its own RenderResult (rather than the // shared `screen`) so the two independent trees can't cross-match. - const short = render( + const short = await render( { ) const shortPrimarySecondarySize = short.getByText(secondaryText).props.style.fontSize - const long = render( + const long = await render( { it('is selected when no secondary is chosen', async () => { - renderPage([]) + await renderPage([]) const none = await screen.findByText('None') let node: typeof none | null = none while (node && node.props?.accessibilityState === undefined) node = node.parent @@ -40,7 +40,7 @@ describe('SecondLanguageSettingsPage — "None" option', () => { }) it('is not selected once a secondary is chosen', async () => { - renderPage(['he']) + await renderPage(['he']) const none = await screen.findByText('None') let node: typeof none | null = none while (node && node.props?.accessibilityState === undefined) node = node.parent @@ -49,21 +49,21 @@ describe('SecondLanguageSettingsPage — "None" option', () => { it('reports an empty array via onChange when pressed', async () => { const onChange = jest.fn() - renderPage(['he'], onChange) - fireEvent.press(await screen.findByText('None')) + await renderPage(['he'], onChange) + await fireEvent.press(await screen.findByText('None')) expect(onChange).toHaveBeenCalledWith([]) }) }) describe('SecondLanguageSettingsPage — language options (issue #176: at most 1)', () => { it('never lists the current primary as an option', async () => { - renderPage([]) + await renderPage([]) await screen.findByText('None') expect(screen.queryByText('English')).toBeNull() }) it('reflects the checked state of the current secondary', async () => { - renderPage(['he']) + await renderPage(['he']) const checked = await screen.findByText('Hebrew') let node: typeof checked | null = checked while (node && node.props?.accessibilityState === undefined) node = node.parent @@ -72,8 +72,8 @@ describe('SecondLanguageSettingsPage — language options (issue #176: at most 1 it('picking a new secondary REPLACES the previous one (no append-until-cap)', async () => { const onChange = jest.fn() - renderPage(['he'], onChange) - fireEvent.press(await screen.findByText('Spanish')) + await renderPage(['he'], onChange) + await fireEvent.press(await screen.findByText('Spanish')) expect(onChange).toHaveBeenCalledWith(['es']) }) }) @@ -81,9 +81,9 @@ describe('SecondLanguageSettingsPage — language options (issue #176: at most 1 describe('SecondLanguageSettingsPage — back arrow', () => { it('reports the back arrow press via onBack', async () => { const onBack = jest.fn() - renderPage([], jest.fn(), onBack) + await renderPage([], jest.fn(), onBack) await screen.findByText('None') - fireEvent.press(screen.getByLabelText('back')) + await fireEvent.press(screen.getByLabelText('back')) expect(onBack).toHaveBeenCalled() }) }) diff --git a/apps/mobile/src/__tests__/secondary-button.test.tsx b/apps/mobile/src/__tests__/secondary-button.test.tsx index faa705b6..832c905d 100644 --- a/apps/mobile/src/__tests__/secondary-button.test.tsx +++ b/apps/mobile/src/__tests__/secondary-button.test.tsx @@ -30,28 +30,28 @@ jest.mock('@/components/pressable-scale', () => { import {SecondaryButton} from '../components/secondary-button' describe('SecondaryButton', () => { - it('renders its label and fires onPress', () => { + it('renders its label and fires onPress', async () => { const onPress = jest.fn() - render() - fireEvent.press(screen.getByText('Settings')) + await render() + await fireEvent.press(screen.getByText('Settings')) expect(onPress).toHaveBeenCalledTimes(1) }) - it('defaults its accessibilityLabel to the visible label', () => { - render( {}} />) + it('defaults its accessibilityLabel to the visible label', async () => { + await render( {}} />) expect(screen.getByLabelText('Settings')).toBeTruthy() }) - it('accepts an explicit accessibilityLabel override', () => { - render( + it('accepts an explicit accessibilityLabel override', async () => { + await render( {}} /> ) expect(screen.getByLabelText('Open settings')).toBeTruthy() expect(screen.queryByLabelText('Settings')).toBeNull() }) - it('renders an optional leading icon', () => { - render( + it('renders an optional leading icon', async () => { + await render( icon} onPress={() => {}} /> ) expect(screen.getByTestId('icon')).toBeTruthy() diff --git a/apps/mobile/src/__tests__/settings-modal.test.tsx b/apps/mobile/src/__tests__/settings-modal.test.tsx index 67033a60..522a35a8 100644 --- a/apps/mobile/src/__tests__/settings-modal.test.tsx +++ b/apps/mobile/src/__tests__/settings-modal.test.tsx @@ -35,7 +35,6 @@ * job is the component's wiring — not the storage layer itself. */ import React from 'react' -import {Modal} from 'react-native' import {act, fireEvent, render, screen, waitFor} from '@testing-library/react-native' jest.mock('react-native-safe-area-context', () => ({ @@ -141,9 +140,23 @@ const renderModal = (overrides: Partial ) +/** + * Fires the sheet's Android hardware-back handler (``). + * + * @testing-library/react-native 14 removed the composite `UNSAFE_getByType` + * query (https://github.com/callstack/react-native-testing-library/releases/tag/v14.0.0); + * RN's `` does render a host element that carries `onRequestClose`, so + * match on the host type instead. + */ +const pressAndroidBack = async () => { + const [modal] = screen.root?.queryAll((node) => node.type === 'Modal', {includeSelf: true}) ?? [] + if (!modal) throw new Error('no in the rendered tree') + await act(() => modal.props.onRequestClose()) +} + describe('SettingsModal — menu', () => { it('shows Gameplay (Game, Language, Second language, Tabletop) and Appearance (Theme)', async () => { - renderModal() + await renderModal() await screen.findByText('Settings') expect(screen.getByText('Gameplay')).toBeTruthy() expect(screen.getByText('Game')).toBeTruthy() @@ -158,7 +171,7 @@ describe('SettingsModal — menu', () => { mockedGetStoredGame.mockResolvedValue('pick') mockedGetStoredLanguage.mockResolvedValue('he') mockedGetStoredSecondaryLanguages.mockResolvedValue(['en']) - renderModal({theme: 'dark', languages: ['en', 'he']}) + await renderModal({theme: 'dark', languages: ['en', 'he']}) await waitFor(() => expect(screen.getByText('Pick a Card')).toBeTruthy()) expect(screen.getByText('Dark')).toBeTruthy() expect(screen.getByLabelText('Language: Hebrew')).toBeTruthy() @@ -166,24 +179,24 @@ describe('SettingsModal — menu', () => { }) it('shows "None" for Second language when no secondary is stored', async () => { - renderModal() + await renderModal() await screen.findByText('Settings') expect(screen.getByLabelText('Second language: None')).toBeTruthy() }) it('disables the Language row for a single-language deck (no chevron, no navigation)', async () => { - renderModal({languages: ['en']}) + await renderModal({languages: ['en']}) const row = await screen.findByLabelText('Language: English') expect(row.props.accessibilityState).toEqual({disabled: true}) - fireEvent.press(row) + await fireEvent.press(row) expect(screen.queryByText('Choose your language')).toBeNull() }) it('disables the Second language row for a single-language deck (no possible secondary)', async () => { - renderModal({languages: ['en']}) + await renderModal({languages: ['en']}) const row = await screen.findByLabelText('Second language: None') expect(row.props.accessibilityState).toEqual({disabled: true}) - fireEvent.press(row) + await fireEvent.press(row) // No page opened — "back" only ever renders on a pushed page's header. expect(screen.queryByLabelText('back')).toBeNull() }) @@ -191,11 +204,11 @@ describe('SettingsModal — menu', () => { describe('SettingsModal — Game page', () => { it('navigates on press, applies + persists a selection, and returns to the menu', async () => { - renderModal() + await renderModal() const gameRow = await screen.findByLabelText('Game: Classic') - fireEvent.press(gameRow) + await fireEvent.press(gameRow) const pick = await screen.findByLabelText('Pick a Card') - fireEvent.press(pick) + await fireEvent.press(pick) expect(mockedSetStoredGame).toHaveBeenCalledWith('pick') // Back on the menu (not left on the Game page) — updated value shown. await waitFor(() => expect(screen.queryByText('Choose your game')).toBeNull()) @@ -207,11 +220,11 @@ describe('SettingsModal — Game page', () => { describe('SettingsModal — Theme page', () => { it('navigates on press, reports a selection via onSelectTheme, and returns to the menu', async () => { const onSelectTheme = jest.fn() - renderModal({onSelectTheme}) + await renderModal({onSelectTheme}) const themeRow = await screen.findByLabelText('Theme: System') - fireEvent.press(themeRow) + await fireEvent.press(themeRow) const dark = await screen.findByLabelText('Theme: Dark') - fireEvent.press(dark) + await fireEvent.press(dark) expect(onSelectTheme).toHaveBeenCalledWith('dark') await waitFor(() => expect(screen.queryByLabelText('Theme: Dark')).toBeNull()) expect(screen.getByText('Settings')).toBeTruthy() @@ -220,12 +233,12 @@ describe('SettingsModal — Theme page', () => { describe('SettingsModal — Language page', () => { it('navigates on press, applies + persists a primary selection, tracks LANGUAGE_CHANGED, and returns to the menu', async () => { - renderModal() + await renderModal() const languageRow = await screen.findByLabelText('Language: English') - fireEvent.press(languageRow) + await fireEvent.press(languageRow) await screen.findByText('Choose your language') const hebrew = await screen.findByText('Hebrew') - fireEvent.press(hebrew) + await fireEvent.press(hebrew) expect(mockedSetStoredLanguage).toHaveBeenCalledWith('library', 'he') expect(mockedTrack).toHaveBeenCalledWith( expect.objectContaining({ @@ -240,25 +253,25 @@ describe('SettingsModal — Language page', () => { }) it('clears an existing Second language when it becomes the new primary', async () => { - renderModal({languages: ['en', 'he']}) + await renderModal({languages: ['en', 'he']}) // Set Hebrew as the secondary first. - fireEvent.press(await screen.findByLabelText('Second language: None')) - fireEvent.press(await screen.findByText('Hebrew')) + await fireEvent.press(await screen.findByLabelText('Second language: None')) + await fireEvent.press(await screen.findByText('Hebrew')) await waitFor(() => expect(screen.getByLabelText('Second language: Hebrew')).toBeTruthy()) // Now pick Hebrew as the primary too — it can't remain the secondary. - fireEvent.press(screen.getByLabelText('Language: English')) - fireEvent.press(await screen.findByText('Hebrew')) + await fireEvent.press(screen.getByLabelText('Language: English')) + await fireEvent.press(await screen.findByText('Hebrew')) await waitFor(() => expect(screen.getByLabelText('Second language: None')).toBeTruthy()) }) }) describe('SettingsModal — Second language page (issue #189, owner on-device feedback)', () => { it('navigates on press, applies + persists a selection, tracks SECONDARY_LANGUAGES_CHANGED, and returns to the menu', async () => { - renderModal({languages: ['en', 'he']}) - fireEvent.press(await screen.findByLabelText('Second language: None')) + await renderModal({languages: ['en', 'he']}) + await fireEvent.press(await screen.findByLabelText('Second language: None')) await screen.findByText('Second language') - fireEvent.press(await screen.findByText('Hebrew')) + await fireEvent.press(await screen.findByText('Hebrew')) expect(mockedTrack).toHaveBeenCalledWith({ name: 'secondary_languages_changed', props: {deck_id: 'library', secondary: ['he']}, @@ -269,21 +282,21 @@ describe('SettingsModal — Second language page (issue #189, owner on-device fe }) it('never lists the current primary as a choice', async () => { - renderModal({languages: ['en', 'he']}) - fireEvent.press(await screen.findByLabelText('Second language: None')) + await renderModal({languages: ['en', 'he']}) + await fireEvent.press(await screen.findByLabelText('Second language: None')) await screen.findByText('Second language') expect(screen.queryByText('English')).toBeNull() }) it('picking "None" clears an existing secondary', async () => { - renderModal({languages: ['en', 'he']}) - fireEvent.press(await screen.findByLabelText('Second language: None')) - fireEvent.press(await screen.findByText('Hebrew')) + await renderModal({languages: ['en', 'he']}) + await fireEvent.press(await screen.findByLabelText('Second language: None')) + await fireEvent.press(await screen.findByText('Hebrew')) await waitFor(() => expect(screen.getByLabelText('Second language: Hebrew')).toBeTruthy()) - fireEvent.press(screen.getByLabelText('Second language: Hebrew')) + await fireEvent.press(screen.getByLabelText('Second language: Hebrew')) const [none] = await screen.findAllByText('None') - fireEvent.press(none) + await fireEvent.press(none) await waitFor(() => expect(screen.getByLabelText('Second language: None')).toBeTruthy()) }) }) @@ -291,16 +304,16 @@ describe('SettingsModal — Second language page (issue #189, owner on-device fe describe('SettingsModal — Tabletop mode (inline switch, issue #148/#176)', () => { it('reflects the loaded preference as the switch checked state', async () => { mockedGetStoredTabletopMode.mockResolvedValue(true) - renderModal() + await renderModal() const toggle = await screen.findByLabelText('Tabletop mode') await waitFor(() => expect(toggle.props.accessibilityState).toEqual({checked: true})) }) it('flips, persists, and tracks TABLETOP_MODE_CHANGED with no deck_id (global setting)', async () => { - renderModal() + await renderModal() const toggle = await screen.findByLabelText('Tabletop mode') await waitFor(() => expect(toggle.props.accessibilityState).toEqual({checked: false})) - act(() => fireEvent.press(toggle)) + await fireEvent.press(toggle) expect(mockedSetStoredTabletopMode).toHaveBeenCalledWith(true) expect(mockedTrack).toHaveBeenCalledWith({ name: 'tabletop_mode_changed', @@ -311,9 +324,9 @@ describe('SettingsModal — Tabletop mode (inline switch, issue #148/#176)', () describe('SettingsModal — single Modal, internal pages (issue #189, third/fourth pass)', () => { it('hides the menu from the accessibility tree while a page is risen', async () => { - renderModal() + await renderModal() const gameRow = await screen.findByLabelText('Game: Classic') - fireEvent.press(gameRow) + await fireEvent.press(gameRow) await screen.findByText('Choose your game') // includeHiddenElements bypasses RNTL's default accessibility-hidden filter — // the menu's "Tabletop mode" text still exists in the tree (not unmounted, @@ -324,19 +337,19 @@ describe('SettingsModal — single Modal, internal pages (issue #189, third/four }) it('reveals the menu again once back on it', async () => { - renderModal() + await renderModal() const gameRow = await screen.findByLabelText('Game: Classic') - fireEvent.press(gameRow) - fireEvent.press(screen.getByLabelText('back')) + await fireEvent.press(gameRow) + await fireEvent.press(screen.getByLabelText('back')) await waitFor(() => expect(screen.queryByText('Choose your game')).toBeNull()) expect(screen.getByText('Tabletop mode')).toBeTruthy() }) it('Android back pops to the menu first, then closes only from the menu', async () => { const onClose = jest.fn() - renderModal({onClose}) + await renderModal({onClose}) const gameRow = await screen.findByLabelText('Game: Classic') - fireEvent.press(gameRow) + await fireEvent.press(gameRow) await screen.findByText('Choose your game') // Re-read `onRequestClose` after the first press rather than reusing one @@ -344,23 +357,23 @@ describe('SettingsModal — single Modal, internal pages (issue #189, third/four // every render (like any prop), so the version bound to "still on the // Game page" would forever evaluate that same branch — a stale-closure // testing artifact, not how a real re-render behaves. - void act(() => screen.UNSAFE_getByType(Modal).props.onRequestClose()) + await pressAndroidBack() // First press: popped back to the menu, sheet still open. await waitFor(() => expect(screen.queryByText('Choose your game')).toBeNull()) expect(onClose).not.toHaveBeenCalled() - void act(() => screen.UNSAFE_getByType(Modal).props.onRequestClose()) + await pressAndroidBack() // Second press, now on the menu: closes the sheet. expect(onClose).toHaveBeenCalled() }) it('tapping the dim behind a risen page pops it, same as Android back — not a full close', async () => { const onClose = jest.fn() - renderModal({onClose}) + await renderModal({onClose}) const gameRow = await screen.findByLabelText('Game: Classic') - fireEvent.press(gameRow) + await fireEvent.press(gameRow) await screen.findByText('Choose your game') - fireEvent.press(screen.getByLabelText('dismiss page')) + await fireEvent.press(screen.getByLabelText('dismiss page')) await waitFor(() => expect(screen.queryByText('Choose your game')).toBeNull()) expect(onClose).not.toHaveBeenCalled() expect(screen.getByText('Settings')).toBeTruthy() @@ -368,19 +381,19 @@ describe('SettingsModal — single Modal, internal pages (issue #189, third/four it('the outer backdrop still fully closes the sheet from the menu', async () => { const onClose = jest.fn() - renderModal({onClose}) + await renderModal({onClose}) await screen.findByText('Settings') - fireEvent.press(screen.getByLabelText('dismiss')) + await fireEvent.press(screen.getByLabelText('dismiss')) expect(onClose).toHaveBeenCalled() }) it('starts back at the menu on every fresh open, regardless of where it was left', async () => { - const {rerender} = renderModal() + const {rerender} = await renderModal() const gameRow = await screen.findByLabelText('Game: Classic') - fireEvent.press(gameRow) + await fireEvent.press(gameRow) await screen.findByText('Choose your game') - rerender( + await rerender( {}} @@ -390,7 +403,7 @@ describe('SettingsModal — single Modal, internal pages (issue #189, third/four onSelectTheme={() => {}} /> ) - rerender( + await rerender( {}} diff --git a/apps/mobile/src/__tests__/settings-sheet-header.test.tsx b/apps/mobile/src/__tests__/settings-sheet-header.test.tsx index ba1dcfbf..4e975397 100644 --- a/apps/mobile/src/__tests__/settings-sheet-header.test.tsx +++ b/apps/mobile/src/__tests__/settings-sheet-header.test.tsx @@ -51,14 +51,18 @@ describe('SettingsSheetHeader — Android/iOS inset', () => { // big dead band above the title. Flat 16 on both platforms. it('uses flat 16px top padding on Android — a bottom sheet never meets the status bar', async () => { Object.defineProperty(Platform, 'OS', {configurable: true, value: 'android'}) - render( {}} />) + await render( + {}} /> + ) await screen.findByText('Choose your language') expect(headerPaddingTop()).toBe(16) }) it('uses flat 16px top padding on iOS (bottom-anchored, content-hugging sheet)', async () => { Object.defineProperty(Platform, 'OS', {configurable: true, value: 'ios'}) - render( {}} />) + await render( + {}} /> + ) await screen.findByText('Choose your language') expect(headerPaddingTop()).toBe(16) }) @@ -67,18 +71,18 @@ describe('SettingsSheetHeader — Android/iOS inset', () => { describe('SettingsSheetHeader — icon variants', () => { it('renders a chevron-back labeled "back" for a pushed page', async () => { const onPress = jest.fn() - render() + await render() await screen.findByText('Theme') - fireEvent.press(screen.getByLabelText('back')) + await fireEvent.press(screen.getByLabelText('back')) expect(onPress).toHaveBeenCalled() expect(screen.queryByLabelText('close')).toBeNull() }) it('renders a close "X" labeled "close" for the root menu page', async () => { const onPress = jest.fn() - render() + await render() await screen.findByText('Settings') - fireEvent.press(screen.getByLabelText('close')) + await fireEvent.press(screen.getByLabelText('close')) expect(onPress).toHaveBeenCalled() expect(screen.queryByLabelText('back')).toBeNull() }) diff --git a/apps/mobile/src/__tests__/share-modal.test.tsx b/apps/mobile/src/__tests__/share-modal.test.tsx index 1c3879a7..c0769fd3 100644 --- a/apps/mobile/src/__tests__/share-modal.test.tsx +++ b/apps/mobile/src/__tests__/share-modal.test.tsx @@ -48,6 +48,16 @@ jest.mock('react-native-safe-area-context', () => ({ useSafeAreaInsets: () => ({top: 0, bottom: 0, left: 0, right: 0}), })) +// `` is a side-effect component: it renders `null`, so it never +// appears in the host-element tree. @testing-library/react-native 14 removed +// the composite `UNSAFE_getByType` query that used to reach it +// (https://github.com/callstack/react-native-testing-library/releases/tag/v14.0.0), +// so spy on the props it's rendered with instead. +jest.mock('expo-status-bar', () => ({StatusBar: jest.fn(() => null)})) + +/** The `style` of the most recently rendered ``. */ +const lastStatusBarStyle = () => jest.mocked(StatusBar).mock.calls.at(-1)?.[0].style + const mockDownloadAndShareImage = jest.fn() jest.mock('@/lib/share-image', () => ({ downloadAndShareImage: (...args: unknown[]) => mockDownloadAndShareImage(...args), @@ -55,11 +65,11 @@ jest.mock('@/lib/share-image', () => ({ import {ShareModal} from '../components/share-modal' -afterEach(() => { +afterEach(async () => { // NativeWind's colorScheme is a global observable — reset it so a test that // sets it doesn't bleed into whichever test runs next (mirrors // settings-modal.test.tsx). - act(() => colorScheme.set('system')) + await act(() => colorScheme.set('system')) }) const PROPS = { @@ -83,15 +93,15 @@ describe('ShareModal', () => { shareSpy.mockRestore() }) - it('renders all three rows when the caller supplies both image URLs (a Pool-backed deck)', () => { - render( {}} onClose={() => {}} />) + it('renders all three rows when the caller supplies both image URLs (a Pool-backed deck)', async () => { + await render( {}} onClose={() => {}} />) expect(screen.getByText('Share link')).toBeTruthy() expect(screen.getByText('Story image')).toBeTruthy() expect(screen.getByText('Post image')).toBeTruthy() }) - it('renders only the link row when the image URLs are omitted (an inline-source deck)', () => { - render( + it('renders only the link row when the image URLs are omitted (an inline-source deck)', async () => { + await render( { expect(screen.queryByText('Post image')).toBeNull() }) - it('renders only the link row when just one image URL is omitted', () => { - render( + it('renders only the link row when just one image URL is omitted', async () => { + await render( { it('shares the unchanged link payload, reports completion, and leaves the sheet open', async () => { const onShare = jest.fn() const onClose = jest.fn() - render() + await render() await act(async () => { - fireEvent.press(screen.getByText('Share link')) + await fireEvent.press(screen.getByText('Share link')) }) expect(shareSpy).toHaveBeenCalledWith({ @@ -152,10 +162,10 @@ describe('ShareModal', () => { shareSpy.mockResolvedValue({action: Share.dismissedAction}) const onShare = jest.fn() const onClose = jest.fn() - render() + await render() await act(async () => { - fireEvent.press(screen.getByText('Share link')) + await fireEvent.press(screen.getByText('Share link')) }) expect(onShare).not.toHaveBeenCalled() @@ -166,10 +176,10 @@ describe('ShareModal', () => { mockDownloadAndShareImage.mockResolvedValue(undefined) const onShare = jest.fn() const onClose = jest.fn() - render() + await render() await act(async () => { - fireEvent.press(screen.getByText('Story image')) + await fireEvent.press(screen.getByText('Story image')) }) expect(mockDownloadAndShareImage).toHaveBeenCalledWith(PROPS.storyImageUrl) @@ -180,7 +190,7 @@ describe('ShareModal', () => { // different row works right away (issue #192 acceptance criteria) mockDownloadAndShareImage.mockResolvedValue(undefined) await act(async () => { - fireEvent.press(screen.getByText('Post image')) + await fireEvent.press(screen.getByText('Post image')) }) expect(mockDownloadAndShareImage).toHaveBeenCalledWith(PROPS.postImageUrl) expect(onShare).toHaveBeenCalledWith('post') @@ -191,10 +201,10 @@ describe('ShareModal', () => { mockDownloadAndShareImage.mockRejectedValue(new Error('network request failed')) const onShare = jest.fn() const onClose = jest.fn() - render() + await render() await act(async () => { - fireEvent.press(screen.getByText('Post image')) + await fireEvent.press(screen.getByText('Post image')) }) expect(onShare).not.toHaveBeenCalled() @@ -203,37 +213,37 @@ describe('ShareModal', () => { // the link row must still work offline after an image failure await act(async () => { - fireEvent.press(screen.getByText('Share link')) + await fireEvent.press(screen.getByText('Share link')) }) expect(shareSpy).toHaveBeenCalled() expect(onShare).toHaveBeenCalledWith('link') }) - it('dismisses when the dimmed backdrop is tapped', () => { + it('dismisses when the dimmed backdrop is tapped', async () => { const onClose = jest.fn() - render( {}} onClose={onClose} />) + await render( {}} onClose={onClose} />) - fireEvent.press(screen.getByLabelText('dismiss')) + await fireEvent.press(screen.getByLabelText('dismiss')) expect(onClose).toHaveBeenCalled() }) - it('does not dismiss when the sheet content itself is tapped', () => { + it('does not dismiss when the sheet content itself is tapped', async () => { const onClose = jest.fn() - render( {}} onClose={onClose} />) + await render( {}} onClose={onClose} />) // The title sits on the sheet's own whitespace, not on a row or the close // button — it must not fall through to the backdrop's dismiss handler. - fireEvent.press(screen.getByText('Share')) + await fireEvent.press(screen.getByText('Share')) expect(onClose).not.toHaveBeenCalled() }) - it('dismisses via the explicit close button', () => { + it('dismisses via the explicit close button', async () => { const onClose = jest.fn() - render( {}} onClose={onClose} />) + await render( {}} onClose={onClose} />) - fireEvent.press(screen.getByLabelText('close')) + await fireEvent.press(screen.getByLabelText('close')) expect(onClose).toHaveBeenCalled() }) @@ -245,15 +255,15 @@ describe('ShareModal', () => { // flip as every other themed sheet (see settings-modal.test.tsx's own // StatusBar-override coverage). describe('ShareModal — StatusBar override (issue #173)', () => { - it('shows light (white) status-bar icons when the resolved scheme is dark', () => { - act(() => colorScheme.set('dark')) - render( {}} onClose={() => {}} />) - expect(screen.UNSAFE_getByType(StatusBar).props.style).toBe('light') + it('shows light (white) status-bar icons when the resolved scheme is dark', async () => { + await act(() => colorScheme.set('dark')) + await render( {}} onClose={() => {}} />) + expect(lastStatusBarStyle()).toBe('light') }) - it('shows dark status-bar icons when the resolved scheme is light', () => { - act(() => colorScheme.set('light')) - render( {}} onClose={() => {}} />) - expect(screen.UNSAFE_getByType(StatusBar).props.style).toBe('dark') + it('shows dark status-bar icons when the resolved scheme is light', async () => { + await act(() => colorScheme.set('light')) + await render( {}} onClose={() => {}} />) + expect(lastStatusBarStyle()).toBe('dark') }) }) diff --git a/apps/mobile/src/__tests__/theme-settings-page.test.tsx b/apps/mobile/src/__tests__/theme-settings-page.test.tsx index 9bbf6a4d..7679f8a5 100644 --- a/apps/mobile/src/__tests__/theme-settings-page.test.tsx +++ b/apps/mobile/src/__tests__/theme-settings-page.test.tsx @@ -25,7 +25,7 @@ const renderPage = ( describe('ThemeSettingsPage — options (issue #189, third pass)', () => { it('marks the current theme selected', async () => { - renderPage('dark') + await renderPage('dark') const selected = await screen.findByLabelText('Theme: Dark') expect(selected.props.accessibilityState).toEqual({selected: true}) expect(screen.getByLabelText('Theme: System').props.accessibilityState).toEqual({ @@ -35,17 +35,17 @@ describe('ThemeSettingsPage — options (issue #189, third pass)', () => { it('reports the pressed option via onSelect', async () => { const onSelect = jest.fn() - renderPage('system', onSelect) + await renderPage('system', onSelect) const lightOption = await screen.findByLabelText('Theme: Light') - fireEvent.press(lightOption) + await fireEvent.press(lightOption) expect(onSelect).toHaveBeenCalledWith('light') }) it('reports the back arrow press via onBack', async () => { const onBack = jest.fn() - renderPage('system', undefined, onBack) + await renderPage('system', undefined, onBack) await screen.findByText('Theme') - fireEvent.press(screen.getByLabelText('back')) + await fireEvent.press(screen.getByLabelText('back')) expect(onBack).toHaveBeenCalled() }) }) diff --git a/apps/mobile/src/__tests__/use-internal-marker.test.ts b/apps/mobile/src/__tests__/use-internal-marker.test.ts index 699a899d..03cdc0dd 100644 --- a/apps/mobile/src/__tests__/use-internal-marker.test.ts +++ b/apps/mobile/src/__tests__/use-internal-marker.test.ts @@ -37,7 +37,7 @@ describe('useInternalMarker', () => { }) it('starts off, and stays off, when nothing has ever been persisted', async () => { - const {result} = renderHook(() => useInternalMarker()) + const {result} = await renderHook(() => useInternalMarker()) expect(result.current.internal).toBe(false) await waitFor(() => expect(getStoredInternal()).resolves.toBe(false)) expect(result.current.internal).toBe(false) @@ -46,7 +46,7 @@ describe('useInternalMarker', () => { it('restores a persisted "on" marker on mount and re-applies it to PostHog', async () => { await setStoredInternal(true) - const {result} = renderHook(() => useInternalMarker()) + const {result} = await renderHook(() => useInternalMarker()) await waitFor(() => expect(result.current.internal).toBe(true)) expect(mockSetInternalMarker).toHaveBeenCalledWith(true) }) @@ -55,10 +55,10 @@ describe('useInternalMarker', () => { // explicit, like theme-store's tests — an earlier test in this file may have // left the module-level cache (internal-store.ts) warm at `true` await setStoredInternal(false) - const {result} = renderHook(() => useInternalMarker()) + const {result} = await renderHook(() => useInternalMarker()) await waitFor(() => expect(result.current.internal).toBe(false)) - act(() => result.current.toggle()) + await act(() => result.current.toggle()) expect(result.current.internal).toBe(true) expect(await getStoredInternal()).toBe(true) @@ -69,11 +69,11 @@ describe('useInternalMarker', () => { it('toggle() again turns the marker back off and unregisters with PostHog', async () => { await setStoredInternal(true) - const {result} = renderHook(() => useInternalMarker()) + const {result} = await renderHook(() => useInternalMarker()) await waitFor(() => expect(result.current.internal).toBe(true)) mockSetInternalMarker.mockClear() - act(() => result.current.toggle()) + await act(() => result.current.toggle()) expect(result.current.internal).toBe(false) expect(await getStoredInternal()).toBe(false) diff --git a/apps/mobile/src/__tests__/use-theme-setting.test.ts b/apps/mobile/src/__tests__/use-theme-setting.test.ts index 14ca59a4..e681295e 100644 --- a/apps/mobile/src/__tests__/use-theme-setting.test.ts +++ b/apps/mobile/src/__tests__/use-theme-setting.test.ts @@ -32,7 +32,7 @@ import {getStoredTheme, setStoredTheme} from '../lib/theme-store' describe('useThemeSetting', () => { it('starts, and stays, on "system" when nothing has ever been persisted', async () => { - const {result} = renderHook(() => useThemeSetting()) + const {result} = await renderHook(() => useThemeSetting()) expect(result.current.theme).toBe('system') // let the boot effect's getStoredTheme() promise settle before asserting it held await waitFor(() => expect(getStoredTheme()).resolves.toBe('system')) @@ -41,25 +41,35 @@ describe('useThemeSetting', () => { it('starts on "system" before a persisted "dark" override resolves, then restores it', async () => { await setStoredTheme('dark') - const {result} = renderHook(() => useThemeSetting()) - expect(result.current.theme).toBe('system') + // @testing-library/react-native 14's `renderHook` is async and flushes + // pending microtasks before it resolves, so `result.current` can no longer + // observe the pre-hydration render — the boot effect's getStoredTheme() + // has already landed by then. Record what each render saw instead. + // https://github.com/callstack/react-native-testing-library/releases/tag/v14.0.0 + const seen: string[] = [] + const {result} = await renderHook(() => { + const state = useThemeSetting() + seen.push(state.theme) + return state + }) + expect(seen[0]).toBe('system') await waitFor(() => expect(result.current.theme).toBe('dark')) expect(result.current.resolvedScheme).toBe('dark') }) it('restores a persisted "light" override on mount', async () => { await setStoredTheme('light') - const {result} = renderHook(() => useThemeSetting()) + const {result} = await renderHook(() => useThemeSetting()) await waitFor(() => expect(result.current.theme).toBe('light')) expect(result.current.resolvedScheme).toBe('light') }) it('select() applies a manual "light" override immediately, resolvedScheme included', async () => { await setStoredTheme('dark') // start from the opposite override - const {result} = renderHook(() => useThemeSetting()) + const {result} = await renderHook(() => useThemeSetting()) await waitFor(() => expect(result.current.theme).toBe('dark')) - act(() => result.current.select('light')) + await act(() => result.current.select('light')) expect(result.current.theme).toBe('light') expect(result.current.resolvedScheme).toBe('light') @@ -67,30 +77,30 @@ describe('useThemeSetting', () => { it('select() applies a manual "dark" override immediately, resolvedScheme included', async () => { await setStoredTheme('light') - const {result} = renderHook(() => useThemeSetting()) + const {result} = await renderHook(() => useThemeSetting()) await waitFor(() => expect(result.current.theme).toBe('light')) - act(() => result.current.select('dark')) + await act(() => result.current.select('dark')) expect(result.current.theme).toBe('dark') expect(result.current.resolvedScheme).toBe('dark') }) it('select() persists the choice so a later boot restores it', async () => { - const {result} = renderHook(() => useThemeSetting()) + const {result} = await renderHook(() => useThemeSetting()) await waitFor(() => expect(result.current.theme).not.toBeUndefined()) - act(() => result.current.select('dark')) + await act(() => result.current.select('dark')) expect(await getStoredTheme()).toBe('dark') }) it('selecting "system" again clears a manual override back to system-follow', async () => { await setStoredTheme('light') - const {result} = renderHook(() => useThemeSetting()) + const {result} = await renderHook(() => useThemeSetting()) await waitFor(() => expect(result.current.theme).toBe('light')) - act(() => result.current.select('system')) + await act(() => result.current.select('system')) expect(result.current.theme).toBe('system') expect(await getStoredTheme()).toBe('system') diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f6322f41..4266dc30 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -37,8 +37,8 @@ catalogs: specifier: 7.0.2 version: 7.0.2 vitest: - specifier: ^4.0.15 - version: 4.1.9 + specifier: ^5.0.0 + version: 5.0.0 zod: specifier: ^4.1.13 version: 4.4.3 @@ -112,7 +112,7 @@ importers: version: link:../../packages/tokens better-auth: specifier: ^1.7.3 - version: 1.7.3(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@tanstack/react-start@1.168.50(crossws@0.4.8(srvx@0.11.20))(esbuild@0.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rolldown@1.2.7)(rollup@4.62.2)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)))(better-sqlite3@12.11.1)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.22.0)(postgres@3.4.9))(pg@8.22.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vitest@4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(jsdom@20.0.3)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0))) + version: 1.7.3(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@tanstack/react-start@1.168.50(crossws@0.4.8(srvx@0.11.20))(esbuild@0.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rolldown@1.2.7)(rollup@4.62.2)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)))(better-sqlite3@12.11.1)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.22.0)(postgres@3.4.9))(pg@8.22.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vitest@5.0.0(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(jsdom@20.0.3)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0))) diff: specifier: ^9.0.0 version: 9.0.0 @@ -134,10 +134,10 @@ importers: devDependencies: '@better-auth/cli': specifier: ^1.4.21 - version: 1.4.21(@better-fetch/fetch@1.1.21)(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@tanstack/react-start@1.168.50(crossws@0.4.8(srvx@0.11.20))(esbuild@0.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rolldown@1.2.7)(rollup@4.62.2)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)))(better-call@1.1.8(zod@4.4.3))(drizzle-kit@0.31.10)(jose@6.2.12)(kysely@0.29.5)(magicast@0.5.4)(nanostores@1.5.3)(postgres@3.4.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vitest@4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(jsdom@20.0.3)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0))) + version: 1.4.21(@better-fetch/fetch@1.1.21)(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@tanstack/react-start@1.168.50(crossws@0.4.8(srvx@0.11.20))(esbuild@0.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rolldown@1.2.7)(rollup@4.62.2)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)))(better-call@1.1.8(zod@4.4.3))(drizzle-kit@0.31.10)(jose@6.2.12)(kysely@0.29.5)(magicast@0.5.4)(nanostores@1.5.3)(postgres@3.4.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vitest@5.0.0(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(jsdom@20.0.3)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0))) '@netlify/vite-plugin-tanstack-start': specifier: ^1.3.19 - version: 1.3.19(@tanstack/react-start@1.168.50(crossws@0.4.8(srvx@0.11.20))(esbuild@0.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rolldown@1.2.7)(rollup@4.62.2)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)))(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.22.0)(postgres@3.4.9)))(rollup@4.62.2)(srvx@0.11.20)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)) + version: 1.3.19(@parcel/watcher@2.6.0)(@tanstack/react-start@1.168.50(crossws@0.4.8(srvx@0.11.20))(esbuild@0.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rolldown@1.2.7)(rollup@4.62.2)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)))(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.22.0)(postgres@3.4.9)))(rollup@4.62.2)(srvx@0.11.20)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)) '@tanstack/react-router-devtools': specifier: ^1.167.1 version: 1.167.1(@tanstack/react-router@1.170.33(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@tanstack/router-core@1.171.28)(csstype@3.2.3)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) @@ -179,7 +179,7 @@ importers: version: 6.1.1(typescript@7.0.2)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)) vitest: specifier: 'catalog:' - version: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(jsdom@20.0.3)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)) + version: 5.0.0(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(jsdom@20.0.3)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)) apps/emails: dependencies: @@ -234,19 +234,19 @@ importers: version: 7.0.2 vitest: specifier: 'catalog:' - version: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(jsdom@20.0.3)(vite@8.2.2(@types/node@24.13.2)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)) + version: 5.0.0(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(jsdom@20.0.3)(vite@8.2.2(@types/node@24.13.2)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)) apps/mobile: dependencies: '@expo/metro-runtime': specifier: ~57.0.15 - version: 57.0.15(@expo/log-box@57.0.4)(expo@57.0.20)(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) + version: 57.0.15(@expo/log-box@57.0.4)(expo@57.0.20)(react-dom@19.2.8(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) '@expo/vector-icons': specifier: ^15.1.1 - version: 15.1.1(expo-font@57.0.3)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) + version: 15.1.1(expo-font@57.0.3)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) '@react-native-async-storage/async-storage': specifier: 2.2.0 - version: 2.2.0(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3)) + version: 2.2.0(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8)) '@trpc/client': specifier: 'catalog:' version: 11.18.0(@trpc/server@11.18.0(typescript@6.0.3))(typescript@6.0.3) @@ -267,97 +267,97 @@ importers: version: link:../../packages/tokens expo: specifier: ~57.0.20 - version: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + version: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.8(react@19.2.8))(react-native-web@0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3) expo-application: specifier: ~57.0.2 version: 57.0.2(expo@57.0.20) expo-constants: specifier: ~57.0.17 - version: 57.0.17(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3)) + version: 57.0.17(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8)) expo-crypto: specifier: ~57.0.2 version: 57.0.2(expo@57.0.20) expo-dev-client: specifier: ~57.0.18 - version: 57.0.18(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3)) + version: 57.0.18(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8)) expo-device: specifier: ~57.0.1 version: 57.0.1(expo@57.0.20) expo-file-system: specifier: ~57.0.6 - version: 57.0.6(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3)) + version: 57.0.6(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8)) expo-font: specifier: ~57.0.3 - version: 57.0.3(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) + version: 57.0.3(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) expo-haptics: specifier: ~57.0.2 version: 57.0.2(expo@57.0.20) expo-image: specifier: ~57.0.4 - version: 57.0.4(expo@57.0.20)(react-native-web@0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) + version: 57.0.4(expo@57.0.20)(react-native-web@0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) expo-linking: specifier: ~57.0.9 - version: 57.0.9(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) + version: 57.0.9(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) expo-localization: specifier: ~57.0.1 - version: 57.0.1(expo@57.0.20)(react@19.2.3) + version: 57.0.1(expo@57.0.20)(react@19.2.8) expo-router: specifier: ~57.0.19 - version: 57.0.19(16f7296de013c3d4a93c1733f9fcfb8f) + version: 57.0.19(e35e5e20434eb6ba82cd6cc8e8e72f51) expo-sharing: specifier: ~57.0.18 - version: 57.0.18(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + version: 57.0.18(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3) expo-splash-screen: specifier: ~57.0.8 version: 57.0.8(expo@57.0.20)(typescript@6.0.3) expo-status-bar: specifier: ~57.0.1 - version: 57.0.1(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) + version: 57.0.1(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) expo-store-review: specifier: ~57.0.2 - version: 57.0.2(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3)) + version: 57.0.2(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8)) expo-system-ui: specifier: ~57.0.3 - version: 57.0.3(expo@57.0.20)(react-native-web@0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3)) + version: 57.0.3(expo@57.0.20)(react-native-web@0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8)) expo-updates: specifier: ~57.0.21 - version: 57.0.21(expo-dev-client@57.0.18(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3)))(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) + version: 57.0.21(expo-dev-client@57.0.18(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8)))(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) nativewind: specifier: ^4.1.23 - version: 4.2.6(1df2f4422cbbe12c9a5134b979f353ff) + version: 4.2.6(04ea67d64433bb4fe6d83655c1150d1d) posthog-react-native: specifier: ^4.67.0 - version: 4.67.0(@react-native-async-storage/async-storage@2.2.0(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3)))(expo-application@57.0.2(expo@57.0.20))(expo-device@57.0.1(expo@57.0.20))(expo-file-system@57.0.6(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3)))(expo-localization@57.0.1(expo@57.0.20)(react@19.2.3))(react-native-safe-area-context@5.7.0(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)) + version: 4.67.0(@react-native-async-storage/async-storage@2.2.0(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8)))(expo-application@57.0.2(expo@57.0.20))(expo-device@57.0.1(expo@57.0.20))(expo-file-system@57.0.6(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8)))(expo-localization@57.0.1(expo@57.0.20)(react@19.2.8))(react-native-safe-area-context@5.9.1(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)) react: - specifier: 19.2.3 - version: 19.2.3 + specifier: 19.2.8 + version: 19.2.8 react-dom: - specifier: 19.2.3 - version: 19.2.3(react@19.2.3) + specifier: 19.2.8 + version: 19.2.8(react@19.2.8) react-native: - specifier: 0.85.3 - version: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) + specifier: 0.86.3 + version: 0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8) react-native-css-interop: specifier: 0.2.6 - version: 0.2.6(1df2f4422cbbe12c9a5134b979f353ff) + version: 0.2.6(04ea67d64433bb4fe6d83655c1150d1d) react-native-gesture-handler: specifier: ~3.2.1 - version: 3.2.1(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) + version: 3.2.1(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) react-native-reanimated: - specifier: 4.3.1 - version: 4.3.1(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) + specifier: 4.6.0 + version: 4.6.0(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) react-native-safe-area-context: - specifier: ~5.7.0 - version: 5.7.0(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) + specifier: ~5.9.1 + version: 5.9.1(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) react-native-screens: - specifier: 4.25.2 - version: 4.25.2(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) + specifier: 4.27.0 + version: 4.27.0(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) react-native-web: specifier: ~0.21.0 - version: 0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) react-native-worklets: - specifier: 0.8.3 - version: 0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) + specifier: 0.12.1 + version: 0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) tailwindcss: specifier: ^3.4.17 version: 3.4.19(tsx@4.23.13)(yaml@2.9.0) @@ -369,11 +369,11 @@ importers: specifier: ^7.29.7 version: 7.29.7(@babel/core@7.29.7) '@testing-library/react-native': - specifier: ^13.3.3 - version: 13.3.3(jest@29.7.0(@types/node@26.1.0))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react-test-renderer@19.2.3(react@19.2.3))(react@19.2.3) + specifier: ^14.0.1 + version: 14.0.1(jest@30.5.1(@types/node@26.4.1))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(test-renderer@1.2.0(@types/react@19.2.18)(react@19.2.8)) '@types/jest': - specifier: ^29.5.14 - version: 29.5.14 + specifier: ^30.0.0 + version: 30.0.0 '@types/react': specifier: ~19.2.18 version: 19.2.18 @@ -384,11 +384,11 @@ importers: specifier: ~57.0.10 version: 57.0.10(@babel/core@7.29.7)(@babel/runtime@7.29.7)(expo@57.0.20)(react-refresh@0.18.0) jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@26.1.0) + specifier: ^30.5.1 + version: 30.5.1(@types/node@26.4.1) jest-expo: - specifier: ~56.0.5 - version: 56.0.5(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(expo@57.0.20)(jest@29.7.0(@types/node@26.1.0))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) + specifier: ~57.0.5 + version: 57.0.5(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(expo@57.0.20)(jest@30.5.1(@types/node@26.4.1))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) typescript: specifier: ~6.0.3 version: 6.0.3 @@ -400,7 +400,7 @@ importers: version: 8.0.0(@astrojs/markdown-satteri@0.4.0)(astro@7.3.1(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@netlify/blobs@10.7.13)(@types/node@24.13.2)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.23.0)(postgres@3.4.9)))(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)) '@astrojs/netlify': specifier: ^8.2.5 - version: 8.2.5(@types/node@24.13.2)(astro@7.3.1(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@netlify/blobs@10.7.13)(@types/node@24.13.2)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.23.0)(postgres@3.4.9)))(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0))(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.23.0)(postgres@3.4.9)))(jiti@2.7.0)(rollup@4.62.2)(srvx@0.11.22)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0) + version: 8.2.5(@parcel/watcher@2.6.0)(@types/node@24.13.2)(astro@7.3.1(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@netlify/blobs@10.7.13)(@types/node@24.13.2)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.23.0)(postgres@3.4.9)))(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0))(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.23.0)(postgres@3.4.9)))(jiti@2.7.0)(rollup@4.62.2)(srvx@0.11.22)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0) '@astrojs/react': specifier: ^6.0.5 version: 6.0.5(@types/node@24.13.2)(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(esbuild@0.28.2)(jiti@2.7.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0) @@ -599,7 +599,7 @@ importers: version: 5.9.3 vitest: specifier: 'catalog:' - version: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(jsdom@20.0.3)(vite@8.2.2(@types/node@24.13.2)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)) + version: 5.0.0(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(jsdom@20.0.3)(vite@8.2.2(@types/node@24.13.2)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)) packages/api: dependencies: @@ -621,7 +621,7 @@ importers: version: 7.0.2 vitest: specifier: 'catalog:' - version: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@26.4.1)(jsdom@20.0.3)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)) + version: 5.0.0(@opentelemetry/api@1.9.1)(@types/node@26.4.1)(jsdom@20.0.3)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)) packages/app-store: devDependencies: @@ -636,7 +636,7 @@ importers: version: 7.0.2 vitest: specifier: 'catalog:' - version: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(jsdom@20.0.3)(vite@8.2.2(@types/node@24.13.2)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)) + version: 5.0.0(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(jsdom@20.0.3)(vite@8.2.2(@types/node@24.13.2)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)) packages/decks: devDependencies: @@ -648,7 +648,7 @@ importers: version: 7.0.2 vitest: specifier: 'catalog:' - version: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@26.4.1)(jsdom@20.0.3)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)) + version: 5.0.0(@opentelemetry/api@1.9.1)(@types/node@26.4.1)(jsdom@20.0.3)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)) packages/observability: devDependencies: @@ -663,7 +663,7 @@ importers: version: 7.0.2 vitest: specifier: 'catalog:' - version: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@26.4.1)(jsdom@20.0.3)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)) + version: 5.0.0(@opentelemetry/api@1.9.1)(@types/node@26.4.1)(jsdom@20.0.3)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)) packages/tokens: devDependencies: @@ -675,7 +675,7 @@ importers: version: 7.0.2 vitest: specifier: 'catalog:' - version: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@26.4.1)(jsdom@20.0.3)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)) + version: 5.0.0(@opentelemetry/api@1.9.1)(@types/node@26.4.1)(jsdom@20.0.3)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)) tooling/typescript: {} @@ -1565,15 +1565,24 @@ packages: '@emmetio/stream-reader@2.2.0': resolution: {integrity: sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==} + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + '@emnapi/core@1.11.1': resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==} + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + '@emnapi/runtime@1.11.1': resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} '@emnapi/runtime@1.11.3': resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==} + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + '@emnapi/wasi-threads@1.2.2': resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} @@ -2889,6 +2898,10 @@ packages: '@types/node': optional: true + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + '@isaacs/fs-minipass@4.0.1': resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} engines: {node: '>=18.0.0'} @@ -2909,9 +2922,13 @@ packages: resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/core@29.7.0': - resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/console@30.5.1': + resolution: {integrity: sha512-u5Ncuc+gXVUwjNMFQOnphHo2Qx2DxyC8Dvpmf4HCx4y0kvSkRRNiQYRixrvOP4V7y52JcSuNxqochCt0PpdHVg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/core@30.5.1': + resolution: {integrity: sha512-BL9g6CJUUhIbdoAflz/Va658erSSXUIvU8XUYiWNTbZljJjZ5yaC9EJ9/dQ19rpbYV3ZOK4sBACqhPaTyhoUIA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: @@ -2926,33 +2943,65 @@ packages: resolution: {integrity: sha512-zOpzlfUs45l6u7jm39qr87JCHUDsaeCtvL+kQe/Vn9jSnRB4/5IPXISm0h9I1vZW/o00Kn4UTJ2MOlhnUGwv3g==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/diff-sequences@30.5.0': + resolution: {integrity: sha512-OsqBjHXCn8cadasoAZBP6nWYvMsRhpMzGXTpxJ5aO04NlbdhIz+FVe3q49l0AwVhsz/cEmIpBes6gAFl1/dWQg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/environment@29.7.0': resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/environment@30.5.1': + resolution: {integrity: sha512-eYJAkOsrpwDXPcoLNEG6lN9Zo3Cy35pxnVQD74vyIfsi/Q8wB/lZFsEjU4wrecOgT4ZviQDZaX/cFIJyMdMxTw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/expect-utils@29.7.0': resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/expect-utils@30.5.1': + resolution: {integrity: sha512-WcRWhHQdTMRDpyWKZ/6MINBmovI7zeD+bL8wFjCncRV3NQOwKy1X45IfyblfHR4k/XciIlNEdFL9QjFO+HNKOg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/expect@29.7.0': resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/expect@30.5.1': + resolution: {integrity: sha512-uOGd40P/COyUp9xHf5jeGiGJC2/ANg+2+Tk9/xN5/LxmlY/r/gxsPrx3DTEtaRZsLAX4wgNSLEDELZ5bmVs2bA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/fake-timers@29.7.0': resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/fake-timers@30.5.1': + resolution: {integrity: sha512-rEkV6YzpBXo/L9cnj2ibyuYZuyGiNWaPUsyCu3HYJbqCV4jnEiKmf7hId20z8eKjZ0JQ9jtIYKxRSmYB/OYSsA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/get-type@30.1.0': resolution: {integrity: sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/get-type@30.5.0': + resolution: {integrity: sha512-9/2VUPitAjmBzbvDvqrxmvB7BzWsBW0WmkkojX1ODuxX1NLGxx9gfaZpHB0z8DtJ9uhGNmZG/VXBhf8uO0OV8Q==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/globals@29.7.0': resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/reporters@29.7.0': - resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/globals@30.5.1': + resolution: {integrity: sha512-VhqvQ251XIC7pk46YymI3HCeBLOdvriDw9zibekodAHEwoVvbVVgpU5H13GvmyOAzxtZCfsm1uvzqkaqJf2I+g==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/pattern@30.5.0': + resolution: {integrity: sha512-HdNQYSdRTEBNrginaqzQtTjG0HRMfrra/z6Ok7uL3S87vSlarIVohEsJsSj5edu3MiHoHjAkvPROz5ZjoKai+w==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/reporters@30.5.1': + resolution: {integrity: sha512-RbUXIfv85KxitJn4l3MpAoMilkvXe2QCO5lXxHWftywo/VdZ5vkEoHRDgphcxP6qmoIkUaN8/UZj6NhdkIFdJg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: @@ -2967,26 +3016,46 @@ packages: resolution: {integrity: sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/source-map@29.6.3': - resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/schemas@30.5.0': + resolution: {integrity: sha512-/hunigyNpc4RCjC0VaW3f5RCUZVM2+WQ65qP7z083Gmvac7or2LI50XVNOtE4YPgBpV0yxYiAgorAPGniCoJmg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/snapshot-utils@30.5.1': + resolution: {integrity: sha512-V3wnxNtiVmw5PPVg433Cn3VdXnsOeu/ofLw3KC04Bn2y1wIlU5kozXQn48rhrgj/02LrCVtntTEF1yBha0XSUw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/source-map@30.5.0': + resolution: {integrity: sha512-xWpTJP9D0bDFGbPGT8XuWSwwha/iHADyyKzUnMx4UbdgnHugxrDaQFO4RZ8x4ZsFzRP6pNii8uvlgKCDxCIuDg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/test-result@29.7.0': resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/test-sequencer@29.7.0': - resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/test-result@30.5.1': + resolution: {integrity: sha512-A/1S6ZBdpic50E0pxLgvaB9XNPL4k7AksmG69OO2oiotxciWZwHkbOec+qbIi+uUtIIByOVlXJUl97oZUsz+Jw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/test-sequencer@30.5.1': + resolution: {integrity: sha512-SHcPnrjdVRYJv6y6l4JUTy4Jccu7zmO6BmiOfOA34UiVBto22s19WiDC0A/2qfM7MWB/qdcoqfSIRMitpjTT4A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/transform@29.7.0': resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/transform@30.5.1': + resolution: {integrity: sha512-EDnDhn0jleU9ZhpVoA4gvqw+Ev0iw/r5upNT2b79RiwiaTiYAMMhvNJP3lmocjIe5J2ZkoNr0B3K/J6O5GIm4Q==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/types@29.6.3': resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/types@30.5.1': + resolution: {integrity: sha512-LvVYn83nnXPl+Rg98nvcFgjx6nRMTArhSn6RAX/w3ELn54S8A42TYZvsCMdGUqTM8S0wyXbtlQdU6Hi6dykj9g==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -3000,9 +3069,6 @@ packages: '@jridgewell/source-map@0.3.11': resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} - '@jridgewell/sourcemap-codec@1.5.5': - resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@jridgewell/sourcemap-codec@1.6.0': resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} @@ -3778,12 +3844,94 @@ packages: cpu: [x64] os: [win32] + '@parcel/watcher-android-arm64@2.6.0': + resolution: {integrity: sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.6.0': + resolution: {integrity: sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.6.0': + resolution: {integrity: sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.6.0': + resolution: {integrity: sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.6.0': + resolution: {integrity: sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm-musl@2.6.0': + resolution: {integrity: sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-arm64-glibc@2.6.0': + resolution: {integrity: sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm64-musl@2.6.0': + resolution: {integrity: sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-x64-glibc@2.6.0': + resolution: {integrity: sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-x64-musl@2.6.0': + resolution: {integrity: sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + '@parcel/watcher-wasm@2.6.0': resolution: {integrity: sha512-dtjbDxKSDPQ8AmA+pS4OFaHE1FKrjtGpLGBxw85uKFkRorjNbvDM/aFPgqosu40wprbp1xw2ZSxIKqghCUHe2w==} engines: {node: '>= 10.0.0'} bundledDependencies: - napi-wasm + '@parcel/watcher-win32-arm64@2.6.0': + resolution: {integrity: sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-x64@2.6.0': + resolution: {integrity: sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.6.0': + resolution: {integrity: sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==} + engines: {node: '>= 10.0.0'} + '@paulirish/trace_engine@0.0.65': resolution: {integrity: sha512-Qsm6F5C8xf6ZzQXbQc2+wcpe6sggfs/gvc/ytqSurdvYg3kyW0ECHCqE0CWBKZpqgjVfPNX9c7SCS3r2nEIRGg==} @@ -3800,6 +3948,14 @@ packages: resolution: {integrity: sha512-oeQJs1aa8Ghke8JIK9yuq/+KjMiaYeDZ38jx7MhkXncXlUKjqQ3wEm2X3qCKyjo+ZZofZj+WsEEiqkTtRuE2xQ==} engines: {node: ^20.9.0 || >=22.0.0, npm: '>=10.8.2'} + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pkgr/core@0.3.6': + resolution: {integrity: sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==} + engines: {node: ^14.18.0 || >=16.0.0} + '@playwright/test@1.63.0': resolution: {integrity: sha512-oxMK4vllB9RK5NQ2l1pq1IfOf2AvnEuj/vYGDj0H2nMtmtZpKtCwt/l00GEO6xjGfpBNAvjovvYdCm50dRQkpQ==} engines: {node: '>=20'} @@ -4252,26 +4408,16 @@ packages: react: '>=16' react-native: '>=0.57' - '@react-native/assets-registry@0.85.3': - resolution: {integrity: sha512-u9ZiYP23vA2IFtdFQFmetzSmk6SM0xgKIoiOsr1hXNHjHaLhOm+/Ph1ud57wX6+Dbwdzx8coJgnzSKL3W21PCg==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - - '@react-native/babel-plugin-codegen@0.85.3': - resolution: {integrity: sha512-Wc94zGfeFG8Njf9SHMPfYZP04kjigkOps6F1TYTvd7ZVXuGxqseCDgxc50LWcOhOCLypI9n3oVVqz81C3p44ZA==} + '@react-native/assets-registry@0.86.3': + resolution: {integrity: sha512-TDhgCZA4wjJg84d5A9swiOQYPIWSKEEVdg9IwMFZDupQzW/F3QoLUrfAJOcalgqTDA9/buTB8awhE3Whwg6u9Q==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} '@react-native/babel-plugin-codegen@0.86.3': resolution: {integrity: sha512-O6Xza4JBGPIU8J7YbKTyBoYL4thpy8jMW/oaLDWdAyOwYHKIjK47pAL5HUEbOe2bWz2PEKjbYRF2ApkJv1ottQ==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - '@react-native/babel-preset@0.85.3': - resolution: {integrity: sha512-fD7fxEhkJB/aF57tWoXjaAWpklfrExYZS3k6aXPP3BQ77DZY7gvf/b7dbirwjID6NVnP1JDRJyTuPBGr0K/vlw==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - peerDependencies: - '@babel/core': '*' - - '@react-native/codegen@0.85.3': - resolution: {integrity: sha512-/JkS1lGLyzBWP1FbgDwaqEf7qShIC6pUC1M0a/YMAd/v4iqR24MRkQWe7jkYvcBQ2LpEhs5NGE9InhxSv21zCA==} + '@react-native/babel-preset@0.86.3': + resolution: {integrity: sha512-/eqs/Hy9RZRcjdcs4wj3Cqmxvtb3NM5g+Uuh1RIvsjynMO8PRsrVWWLWgBcZL/jYUo+ogXd2NFB0W8L5Bg89xw==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} peerDependencies: '@babel/core': '*' @@ -4282,82 +4428,67 @@ packages: peerDependencies: '@babel/core': '*' - '@react-native/community-cli-plugin@0.85.3': - resolution: {integrity: sha512-fs85dmbIqNmtzEixDb0g+q6R3Vt4H9eAt8/inIZdDKfjN76+sUJA2r1nxODQ76bU23MrIbz8sI7KFBPaWk/zQw==} + '@react-native/community-cli-plugin@0.86.3': + resolution: {integrity: sha512-qSDL9LQc5mZSZPNczT95WU9YQuPzxBklgON9vLhhqfI0yWIwKInqFx88dQ/uiEXBtf0yossthaQIqA4Ml6bF6g==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} peerDependencies: '@react-native-community/cli': '*' - '@react-native/metro-config': 0.85.3 + '@react-native/metro-config': 0.86.3 peerDependenciesMeta: '@react-native-community/cli': optional: true '@react-native/metro-config': optional: true - '@react-native/debugger-frontend@0.85.3': - resolution: {integrity: sha512-uAu7rM5o/Np1zgp6fi5zM1sP1aB8DcS7DdOLcj/TkSutOAjkMqqd2lWt1/+3S7qXexRHVK5XcP+o3VXo4L/V0A==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - '@react-native/debugger-frontend@0.86.3': resolution: {integrity: sha512-TQmeofQ0PcuylhhlleOeuzHYZfbrgm3gayXzowqUEzgRisTm1D40/J3ggqs7XkQi5HP5ZA3n8dHmKL9vIzPcsw==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - '@react-native/debugger-shell@0.85.3': - resolution: {integrity: sha512-/jRAaT9boiCttIcEwS02WPwYkUihqsjSaK/TMtHz05vT6uMgac9PaQt5kzBQLIABv5aEIa5gtrMmKVz49MjkjQ==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - '@react-native/debugger-shell@0.86.3': resolution: {integrity: sha512-O4ds+J7xZfxkbih9T+cAGegBdvKSPKYJm/lDgC9CpEjFMkmzWTpVLU3Qsv9sqZuo58z+sGhIcJfPsCFFWHpqbQ==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - '@react-native/dev-middleware@0.85.3': - resolution: {integrity: sha512-JYzBiT4A8w+KQt+dOD5v+ti+tDrGoPnsSTuApq3Ls4RB5sfWbDlYMyz3dbc8qBIHz9tv0sQ5+eOu6Xwqzr5AQA==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - '@react-native/dev-middleware@0.86.3': resolution: {integrity: sha512-LiEPTqTg/63bYUnrPyHLfjTDCNhA/+CUqI1+DsA9tYyewtSbULd5awsva6SgE10I+2iMhgKXS3ymkhU/kSCrGA==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - '@react-native/gradle-plugin@0.85.3': - resolution: {integrity: sha512-39dY2j50Q1pntejzwt3XL7vwXtrj8jcIfHq6E+gyu3jzYxZJVvMkMutQ39vSg6zinIQOX36oQDhidXUbCXzgoA==} + '@react-native/gradle-plugin@0.86.3': + resolution: {integrity: sha512-lxmx0GqLEWRIpZfpYFXlYVIs3ENQwaW6Vmp6oi29l2GoQJ1wZfFZRdMimDWlGEk8LKfHar3QH3iaPMkTcK9lEQ==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - '@react-native/jest-preset@0.85.3': - resolution: {integrity: sha512-ALPSrM0q2fU+5AXcOXzDKx7rxVKPMvygAZfsTWLdrGRVWIqf/HEfM0R8euQqIKUqmEuQ1TxMWN+px3h6gc4vow==} + '@react-native/jest-preset@0.86.3': + resolution: {integrity: sha512-oMmBwXUpTgJvGlcXQQPuiQLykoM8jsWYp6RwdJ2NWyIWzJcGp1rmSr3XV7istoIcUt0wdOVLtQs0A0nDm9ND+A==} engines: {node: '>= 20.19.4'} peerDependencies: react: ^19.2.3 - '@react-native/js-polyfills@0.85.3': - resolution: {integrity: sha512-U2+aMshIXf1uFn77tpBb/xhHWB9vkVrMpt7kkucAugF8hJKYTDGB587X7WwelHduK2KBfhl4giSv0rzZGoef9A==} + '@react-native/js-polyfills@0.86.3': + resolution: {integrity: sha512-eYIJ0es967+tePBFQDnl/gidVFxLns3fnbiK6rxscQrGodvuUO6hwxpQnfNynJ8MjbbndImXihXjcnJdc7SzJg==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - '@react-native/metro-babel-transformer@0.85.3': - resolution: {integrity: sha512-omuKq+r7jM4XvCMIlNMPP7Up3SyB8o5EAdZtF7YXniKyq7UOMBqhYHFqgsdOXr0lT+3ADf7VCJG3sb82jlBrrQ==} + '@react-native/metro-babel-transformer@0.86.3': + resolution: {integrity: sha512-0nlwVkG0uT9o72nrGTKUz/IqDnCkM4zE0ihe4r+OJcxH93yBdDm58AXJ3EXZeSjv3osHEFXU7ceajdZiS34mTw==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} peerDependencies: '@babel/core': '*' - '@react-native/metro-config@0.85.3': - resolution: {integrity: sha512-sVo6HepUmCcpdfozEf91lA0FjpLNNZYu/Zi9FiYiAQTK8pzATXDVTqhvdxpFrQn435p5eUTSbllvbH/KN+bnyA==} + '@react-native/metro-config@0.86.3': + resolution: {integrity: sha512-qdzDMepV2xdUhsO4XC7idnnbt8K6+Hd59AjeK9y4KS86fxSQq5oL0TAbqUuajDGR7beNQoYTuS6AowN/zP0oaQ==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} '@react-native/normalize-colors@0.74.89': resolution: {integrity: sha512-qoMMXddVKVhZ8PA1AbUCk83trpd6N+1nF2A6k1i6LsQObyS92fELuk8kU/lQs6M7BsMHwqyLCpQJ1uFgNvIQXg==} - '@react-native/normalize-colors@0.85.3': - resolution: {integrity: sha512-hj0PScZEhIbcOvQV5yMKX3ha4XEIOy/SVE1Rrpp0beW0dpNLOgSC7KDxGewmDnIHK9YdQUXGY9eMEfShUMIaZw==} - '@react-native/normalize-colors@0.86.3': resolution: {integrity: sha512-Cv3CDkprb67GrzuaS9BGbBJC/6G4lIw3nyKOHRKTqTTum4bn37y5+R0Z04L8mcbQN85eEohNrRwb7IOM4j6uvg==} - '@react-native/virtualized-lists@0.85.3': - resolution: {integrity: sha512-dsCjI//OIPEUJMyNHp4l7zNLVjCx7bcaRUceOCkU+IB17hkbtbGWvi7HjGFSzy7FJGmS/MOlcfpb72xXiy1Oig==} + '@react-native/virtualized-lists@0.86.3': + resolution: {integrity: sha512-1j44NEyNn05Ut40vHAmoSWbsIcybFkMAOBTwQt1PrESyfSS+qBoyU1LGIogNva0VIa0rQyEC5PzbA7R4/7Nhyw==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} peerDependencies: '@types/react': ^19.2.0 react: '*' - react-native: 0.85.3 + react-native: 0.86.3 peerDependenciesMeta: '@types/react': optional: true @@ -4900,6 +5031,9 @@ packages: '@sinonjs/fake-timers@10.3.0': resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + '@sinonjs/fake-timers@15.4.0': + resolution: {integrity: sha512-DsG+8/LscQIQg68J6Ef3dv10u6nVyetYn923s3/sus5eaGfTo1of5WMZSLf0UJc9KDuKPilPH0UDJCjvNbDNCA==} + '@so-ric/colorspace@1.1.6': resolution: {integrity: sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==} @@ -5196,14 +5330,14 @@ packages: resolution: {integrity: sha512-uhOeFyxLcU41HzvrxsGpiWdcMbScY1EDgbZ5K7DVRMYInbLYWAC0EA/kx9wXAoSM8q82bUG2hRl8+EAjE6XAbA==} engines: {node: '>=20.19'} - '@testing-library/react-native@13.3.3': - resolution: {integrity: sha512-k6Mjsd9dbZgvY4Bl7P1NIpePQNi+dfYtlJ5voi9KQlynxSyQkfOgJmYGCYmw/aSgH/rUcFvG8u5gd4npzgRDyg==} - engines: {node: '>=18'} + '@testing-library/react-native@14.0.1': + resolution: {integrity: sha512-2r2e2y8SkUNRWKRXlUGqDYunB+AkbdXUPn49Bs5rpv9oxRb0K3USBVugbPbAKJjfj4w5Ba91NJ8LcQCZyopUZA==} + engines: {node: ^22.13.0 || >=24} peerDependencies: jest: '>=29.0.0' - react: '>=18.2.0' - react-native: '>=0.71' - react-test-renderer: '>=18.2.0' + react: '>=19.0.0' + react-native: '>=0.78' + test-renderer: ^1.0.0 peerDependenciesMeta: jest: optional: true @@ -5304,8 +5438,8 @@ packages: '@types/istanbul-reports@3.0.4': resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - '@types/jest@29.5.14': - resolution: {integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==} + '@types/jest@30.0.0': + resolution: {integrity: sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==} '@types/jsdom@20.0.1': resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} @@ -5319,9 +5453,6 @@ packages: '@types/node@24.13.2': resolution: {integrity: sha512-fRa09kZTgu8o71KFcDjUFuc7F+dEbZYZmkI0mg5YBTRs0yMKjYHsq/c0urDKeDb+D5qVgXOdFcuu+DZPKOITwA==} - '@types/node@26.1.0': - resolution: {integrity: sha512-O0A1G3xPGy4w7AgQdAQYUlQ+BKk2Oovw8eRpofyp5KdBZULnbe+WqaOVNrm705SHphCiG4XHsACrSmPu1f+Kgw==} - '@types/node@26.4.1': resolution: {integrity: sha512-k97ENvZWtvA6yqz5/FS6a7duDgOPEeOQOc2iKS/nY6mX6qJUKtLnWzQS+Xj6tXweyj6ZcTAK2Qecetnvi9nCLA==} @@ -5340,6 +5471,11 @@ packages: peerDependencies: '@types/react': ^19.2.0 + '@types/react-reconciler@0.33.0': + resolution: {integrity: sha512-HZOXsKT0tGI9LlUw2LuedXsVeB88wFa536vVL0M6vE8zN63nI+sSr1ByxmPToP5K5bukaVscyeCJcF9guVNJ1g==} + peerDependencies: + '@types/react': '*' + '@types/react-test-renderer@19.1.0': resolution: {integrity: sha512-XD0WZrHqjNrxA/MaR9O22w/RNidWR9YZmBdRGI7wcnWGrv/3dA8wKCJ8m63Sn+tLJhcjmuhOi629N66W6kgWzQ==} @@ -5528,6 +5664,126 @@ packages: '@ungap/structured-clone@1.4.0': resolution: {integrity: sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==} + '@unrs/resolver-binding-android-arm-eabi@1.12.2': + resolution: {integrity: sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w==} + cpu: [arm] + os: [android] + + '@unrs/resolver-binding-android-arm64@1.12.2': + resolution: {integrity: sha512-YGCRZv/9GLhwmz6mYDeTsm/92BAyR28l6c2ReweVW5pWgfsitWLY8upvfRlGdoyD8HjeTHSYJWyZGD4KJA/nFQ==} + cpu: [arm64] + os: [android] + + '@unrs/resolver-binding-darwin-arm64@1.12.2': + resolution: {integrity: sha512-u9DiNT1auQMO20A9SyTuG3wUgQWB9Z7KjAg0uFuCDR1FsAY8A0CG2S6JpHS1xwm/w1G08bjXZDcyOCjv1WAm2w==} + cpu: [arm64] + os: [darwin] + + '@unrs/resolver-binding-darwin-x64@1.12.2': + resolution: {integrity: sha512-f7rPLi/T1HVKZu/u6t87lroib16n8vrSzcyxI7lg4BGO9UF26KhQL44sd9eOUgrTYhvRXtWOIZT5PejdPyJfUA==} + cpu: [x64] + os: [darwin] + + '@unrs/resolver-binding-freebsd-x64@1.12.2': + resolution: {integrity: sha512-BpcOjWCJub6nRZUS2zA20pmLvjtqAtGejETaIyRLiZiQf++cbrjltLA5NN/xaXfqeOBOSlMFbemIl5/S5tljmg==} + cpu: [x64] + os: [freebsd] + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.12.2': + resolution: {integrity: sha512-vZTDvdSISZjJx66OzJqtsOhzifbqRjbmI1Mnu49fQDwog5GtDI4QidRiEAYbZCRj9C8YZEW+3ZjqsyS9GR4k2A==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm-musleabihf@1.12.2': + resolution: {integrity: sha512-BiPI+IrIlwcW4nLLMM21+B1dFPzd55yAVgVGrdgDjNef+ch03GdxrcyaIz8X9SsQirh/kCQ7mviyWlMxdh2D7g==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-gnu@1.12.2': + resolution: {integrity: sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-arm64-musl@1.12.2': + resolution: {integrity: sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@unrs/resolver-binding-linux-loong64-gnu@1.12.2': + resolution: {integrity: sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-loong64-musl@1.12.2': + resolution: {integrity: sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew==} + cpu: [loong64] + os: [linux] + libc: [musl] + + '@unrs/resolver-binding-linux-ppc64-gnu@1.12.2': + resolution: {integrity: sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-riscv64-gnu@1.12.2': + resolution: {integrity: sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-riscv64-musl@1.12.2': + resolution: {integrity: sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@unrs/resolver-binding-linux-s390x-gnu@1.12.2': + resolution: {integrity: sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-x64-gnu@1.12.2': + resolution: {integrity: sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@unrs/resolver-binding-linux-x64-musl@1.12.2': + resolution: {integrity: sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@unrs/resolver-binding-openharmony-arm64@1.12.2': + resolution: {integrity: sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ==} + cpu: [arm64] + os: [openharmony] + + '@unrs/resolver-binding-wasm32-wasi@1.12.2': + resolution: {integrity: sha512-tYFDIkMxSflfEc/h92ZWNsZlHSwgimbNHSO3PL2JWQHfCuC2q316jMyYU9TIWZsFK2bQwyK5VAdYgn8ygPj69A==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@unrs/resolver-binding-win32-arm64-msvc@1.12.2': + resolution: {integrity: sha512-qzNyg3xL0VPQmCaUh+N5jSitce6k+uCBfMDesWRnlULOZaqUkaJ0ybdT+UqlAWJoQjuqfIU/0Ptx9bteN4D82g==} + cpu: [arm64] + os: [win32] + + '@unrs/resolver-binding-win32-ia32-msvc@1.12.2': + resolution: {integrity: sha512-WD9sY00OfpHVGfsnHZoA8jVT+esS/Bg8z8jzxp5BnDCjjwsuKsPQrzswwpFy4J1AUJbXPRfkpcX0mXrzeXW79g==} + cpu: [ia32] + os: [win32] + + '@unrs/resolver-binding-win32-x64-msvc@1.12.2': + resolution: {integrity: sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA==} + cpu: [x64] + os: [win32] + '@vercel/nft@1.11.0': resolution: {integrity: sha512-m1QFg+U+3yPOnP1xSYJ73UIRxLOXdts1JOhiOiyPYqEsALgrXFFINvgUaD6R6iNvaBFAjHllBCbkfx4FuOdpaA==} engines: {node: '>=20'} @@ -5544,11 +5800,8 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 - '@vitest/expect@4.1.9': - resolution: {integrity: sha512-vl/rYsUKcBr3SnQn166+XR5ZQcgMx3DQhFWdfli/cWpLnLUmbxZvyrJZotLFUryib+LtArYMSTJ5RbQ57ZqrlA==} - - '@vitest/mocker@4.1.9': - resolution: {integrity: sha512-EVkXzBjrPGM+cK8/ANWgBrkUCfJfb38/EfTSO8h7pWvKkyPkpWxvR7BkD2MyItMF62C97zAEoqdpUixwR/e+Rw==} + '@vitest/mocker@5.0.0': + resolution: {integrity: sha512-66PGTMIiVJP3t4a5yxU9qPtf7MdTBs8jmToMvy+HVflB3Yy13WJZTtPePdvU+wjRV02SKK5doLbSA6o9pwOmiA==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -5558,20 +5811,8 @@ packages: vite: optional: true - '@vitest/pretty-format@4.1.9': - resolution: {integrity: sha512-s0iufns3iIFitdgm+YR7g1whCAaGtXz459VS9/PqyKDEEFgYIhsHOQmXgIgDuYCt7DeQmiZT0Qe2OA2p4ZPu5A==} - - '@vitest/runner@4.1.9': - resolution: {integrity: sha512-KXLMDtc7oe70+3mJfGrPUWPesswH+3sTxAMAMl8DG7I8IUQT4XW718dY5ID3vPUcmlu27CcKfY4P3h3I29SLJg==} - - '@vitest/snapshot@4.1.9': - resolution: {integrity: sha512-Jc7RKGNBo8Z28WYIm0Niej4xdSPByRf6mU58VpHQkd6Zh05rlnA+twjbK5HyeIGHxrzsc3mJgS43uM0CZKzaIA==} - - '@vitest/spy@4.1.9': - resolution: {integrity: sha512-fHpsS6mIi+PiEW+vcRVOMkX1oSaPKne3VOclSFICPcGOmfKgXPU5iAah+wcNcj2xPrCCmfq99IDGf+EojhhvhA==} - - '@vitest/utils@4.1.9': - resolution: {integrity: sha512-A51o8ymO5PpqlWNnBP9ZHPXDIpuMtTLlGSjN7la4US+LJzoUMyhwjA5QXlm39JexgwHKW4Xjs8Z2d3dLCXOeuA==} + '@vitest/spy@5.0.0': + resolution: {integrity: sha512-uy+luWBAPw9XfthoHi5AkfHUnuPYEESjl0p/r+meoBnU8bxg5GDQ3Ey8MjcJ6sqahkL4PFyrvfMJJBw7LbU06g==} '@volar/kit@2.4.28': resolution: {integrity: sha512-cKX4vK9dtZvDRaAzeoUdaAJEew6IdxHNCRrdp5Kvcl6zZOqb6jTOfk3kXkIkG3T7oTFXguEMt5+9ptyqYR84Pg==} @@ -5674,11 +5915,6 @@ packages: resolution: {integrity: sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==} engines: {node: '>=0.4.0'} - acorn@8.17.0: - resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} - engines: {node: '>=0.4.0'} - hasBin: true - acorn@8.18.0: resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==} engines: {node: '>=0.4.0'} @@ -5917,14 +6153,28 @@ packages: peerDependencies: '@babel/core': ^7.8.0 + babel-jest@30.5.1: + resolution: {integrity: sha512-ge1xUVZS91ml09YRMgRGgeKJ4YJpcOiuwteAxFBYLugQyp7cRw+hHej6Ho0vPjvLrjq60bb7JPHH9LAMA1/krA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + '@babel/core': ^7.11.0 || ^8.0.0-0 + babel-plugin-istanbul@6.1.1: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} + babel-plugin-istanbul@8.0.0: + resolution: {integrity: sha512-18wCskrN3DgbuBmp1gr7LBGT8xdz5xhQQqFvFhVxbkl8VBCrMKQ2YtqBWtUal1Zrc1HTuX0011+Brjw78TCFkg==} + engines: {node: '>=18'} + babel-plugin-jest-hoist@29.6.3: resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + babel-plugin-jest-hoist@30.5.0: + resolution: {integrity: sha512-gtGo1B+u14jrZQv6TdSWIWkTqclboo7Qn+dFAGUOIuXLFuJKAdg3U5MIWzZnW4vfUb4dX9skmAMiby86e/SF4A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + babel-plugin-polyfill-corejs2@0.4.17: resolution: {integrity: sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==} peerDependencies: @@ -5946,8 +6196,8 @@ packages: babel-plugin-react-native-web@0.21.2: resolution: {integrity: sha512-SPD0J6qjJn8231i0HZhlAGH6NORe+QvRSQM2mwQEzJ2Fb3E4ruWTiiicPlHjmeWShDXLcvoorOCXjeR7k/lyWA==} - babel-plugin-syntax-hermes-parser@0.33.3: - resolution: {integrity: sha512-/Z9xYdaJ1lC0pT9do6TqCqhOSLfZ5Ot8D5za1p+feEfWYupCOfGbhhEXN9r2ZgJtDNUNRw/Z+T2CvAGKBqtqWA==} + babel-plugin-syntax-hermes-parser@0.36.0: + resolution: {integrity: sha512-LhD0xdoedDw7ansQgXbB2DADLZIK/LRXuWNBPuVzMc5S2WK5GyT89tCM+cQzxFGO0mGyLK6D5TrVOJJzAoDy8Q==} babel-plugin-syntax-hermes-parser@0.36.1: resolution: {integrity: sha512-ycduwJbvdvIMmVvlAZqGggS+pm5Eu4Bk9pcV9Sm2Z4PJNRVsKkv0g7vHj+LeuC1gHTeF67sJXFOq61IlqCa2hA==} @@ -5981,6 +6231,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + babel-preset-jest@30.5.0: + resolution: {integrity: sha512-ZGPn5ClP4lBDpuOK8W1yQIOy359HmbnZv3suucAlIe+SEE9yDsxV4S2PjSbH2Vc97U+WmzYD7vw3kr8NsQ/i6w==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + peerDependencies: + '@babel/core': ^7.11.0 || ^8.0.0-beta.1 || ^8.0.0 + bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -6243,6 +6499,9 @@ packages: brace-expansion@1.1.18: resolution: {integrity: sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==} + brace-expansion@2.1.4: + resolution: {integrity: sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==} + brace-expansion@5.0.9: resolution: {integrity: sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==} engines: {node: 20 || >=22} @@ -6437,9 +6696,6 @@ packages: citty@0.2.2: resolution: {integrity: sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==} - cjs-module-lexer@1.4.3: - resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} - cjs-module-lexer@2.2.1: resolution: {integrity: sha512-Ca8swihM+/4yKecYHY52kgJd300hi2lADU/a1RxNTRe+RJ9jvqQlESpbz9DnG9mowez8qwXHB8qYdIUw9e+F5Q==} @@ -6710,11 +6966,6 @@ packages: resolution: {integrity: sha512-IBWsY8xznyQrcHn8h4bC8/4ErNke5elzgG8GcqF4RFPw6aHkWWRc7Tgw6upjaTX/CT/yQgqYENkxYsTYN+hW2g==} engines: {node: '>=18'} - create-jest@29.7.0: - resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - cron-parser@4.9.0: resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} engines: {node: '>=12.0.0'} @@ -7318,6 +7569,9 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + ecdsa-sig-formatter@1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} @@ -7344,6 +7598,9 @@ packages: emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + empathic@2.0.1: resolution: {integrity: sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q==} engines: {node: '>=14'} @@ -7441,9 +7698,6 @@ packages: es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} - es-module-lexer@2.3.0: - resolution: {integrity: sha512-KLdwQm2NvGLDkQDCGvmiQrhkd0JbMzXthwQAUgWjQuQdBLFa3eiBP5arXZyA+f8x+x7OXgud6bq2rxjGtHV2tw==} - es-module-lexer@2.3.2: resolution: {integrity: sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==} @@ -7564,8 +7818,8 @@ packages: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} - exit@0.1.2: - resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + exit-x@0.2.2: + resolution: {integrity: sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==} engines: {node: '>= 0.8.0'} expand-template@2.0.3: @@ -7580,6 +7834,10 @@ packages: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + expect@30.5.1: + resolution: {integrity: sha512-m8YrYgvKe9+9gEnWEuKz+qCGfHqkrff7PPfyDnOFkjsfYRKqiYyOxDFMFieCGAuhtk/VNm63tvNgKZVzVy+Hvg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + expo-application@57.0.2: resolution: {integrity: sha512-q31YwcXyymviAmdrtDfAg3Dld4VMxLCNAfgMHip7vZpPX4lzF/AfwsywqBJUAjQnJknzaNAkzqvMVjO5XmKYDA==} peerDependencies: @@ -8005,6 +8263,10 @@ packages: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + form-data@4.0.6: resolution: {integrity: sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==} engines: {node: '>= 6'} @@ -8144,6 +8406,11 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} + glob@10.5.0: + resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + hasBin: true + glob@13.0.6: resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} engines: {node: 18 || 20 || >=22} @@ -8244,11 +8511,8 @@ packages: hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} - hermes-compiler@250829098.0.10: - resolution: {integrity: sha512-TcRlZ0/TlyfJqquRFAWoyElVNnkdYRi/sEp4/Qy8/GYxjg8j2cS9D4MjuaQ+qimkmLN7AmO+44IznRf06mAr0w==} - - hermes-estree@0.33.3: - resolution: {integrity: sha512-6kzYZHCk8Fy1Uc+t3HGYyJn3OL4aeqKLTyina4UFtWl8I0kSL7OmKThaiX+Uh2f8nGw3mo4Ifxg0M5Zk3/Oeqg==} + hermes-compiler@250829098.0.17: + resolution: {integrity: sha512-qG1PXzTEtriF6oQLZF3vyHhSMxOdW5h2TqqLri0rdpstPustd2fSvRZQMVAPdlhgFwBfYnj3OUZtiO6LjYsEFw==} hermes-estree@0.35.0: resolution: {integrity: sha512-xVx5Opwy8Oo1I5yGpVRhCvWL/iV3M+ylksSKVNlxxD90cpDpR/AR1jLYqK8HWihm065a6UI3HeyAmYzwS8NOOg==} @@ -8259,9 +8523,6 @@ packages: hermes-estree@0.36.1: resolution: {integrity: sha512-guv1nQ6IJ7S83NRFPWc3SA7IBZrdNC9kapwOq6uXvF4wP+sDCgjzQbKPCoyYmoyZRzztF/n/c36l/rccCZSiCw==} - hermes-parser@0.33.3: - resolution: {integrity: sha512-Yg3HgaG4CqgyowtYjX/FsnPAuZdHOqSMtnbpylbptsQ9nwwSKsy6uRWcGO5RK0EqiX12q8HvDWKgeAVajRO5DA==} - hermes-parser@0.35.0: resolution: {integrity: sha512-9JLjeHxBx8T4CAsydZR49PNZUaix+WpQJwu9p2010lu+7Kwl6D/7wYFFJxoz+aXkaaClp9Zfg6W6/zVlSJORaA==} @@ -8703,25 +8964,28 @@ packages: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} - istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} engines: {node: '>=10'} istanbul-reports@3.2.0: resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} - jest-changed-files@29.7.0: - resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jest-circus@29.7.0: - resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-changed-files@30.5.1: + resolution: {integrity: sha512-0+bvMM/ENhDI29Z8q1r4HxiDIi4G5tnBmSw4esfPQoj9q8Nik7KIyuxHkTVnnniJQf05SxpGaKDQ+4h28ynGPg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-cli@29.7.0: - resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-circus@30.5.1: + resolution: {integrity: sha512-NgliezXQ6yznqR4W5Gqw++0cZSbBZlF0NknNIAE5VmSJKWOtmWJmWnBq3TSkUOVBTPrT7FGGhVdA8DLWnxo2Sw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-cli@30.5.1: + resolution: {integrity: sha512-uwNYepWgaNBCplm42fCIUZTf/tIEHIy5AYvx7eL1BrwIgyjPt+2poouR23UO2yopIP+kV8oZFHfv+l4pg/8prQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -8729,15 +8993,18 @@ packages: node-notifier: optional: true - jest-config@29.7.0: - resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-config@30.5.1: + resolution: {integrity: sha512-L8PKM2X/ngG8PxfLMqglKGZjylPgw84bVPUlMY9W/o76TnLqPWrmQgsaT0HrheGdRtpGE5FbmREA0Kvb+Qx5gQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: '@types/node': '*' + esbuild-register: '>=3.4.0' ts-node: '>=9.0.0' peerDependenciesMeta: '@types/node': optional: true + esbuild-register: + optional: true ts-node: optional: true @@ -8749,13 +9016,17 @@ packages: resolution: {integrity: sha512-CRpFK0RtLriVDGcPPAnR6HMVI8bSR2jnUIgralhauzYQZIb4RH9AtEInTuQr65LmmGggGcRT6HIASxwqsVsmlA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-docblock@29.7.0: - resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-diff@30.5.1: + resolution: {integrity: sha512-e3cNNMpv8Kh20MjjphTXs+3Vz7DQyLM1nft7KJhnh46atFhjVJRa+0Hq0beywuwsACtMQUBihQkFl8zxb7gt1Q==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-each@29.7.0: - resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-docblock@30.5.0: + resolution: {integrity: sha512-NwDqcxtoZi33RhuW+zJS/RVA3rmheQ8BnwpYZuc/Eruaz6seQb7+aoCeDZu/3X7W2XmD8DbSo9Pn72DbKsBFYw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-each@30.5.1: + resolution: {integrity: sha512-S1af0TU4v1EZ/AUlkFs/sxf/5KGsbAT9kRgdyoMX/x72y7C8ZEgETE5o1TPnbKRnrbprc5FR/moYLfdRmqEjsQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-environment-jsdom@29.7.0: resolution: {integrity: sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==} @@ -8770,11 +9041,15 @@ packages: resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-expo@56.0.5: - resolution: {integrity: sha512-dlGKNy21OKFZ5ynNmKMS5eI1zzaNmOLvwX+rEt7PVXfPKuQ1VJLy6YOKZVCuh8vhSm27VGTa/HX3OjyGJ1FP1g==} + jest-environment-node@30.5.1: + resolution: {integrity: sha512-LrPj3sPMjsQoOB3jrb8p/sa+XkSFNKo60TTsyc+EB2kxQJHgbwElpXnx1yX25fdFn5958FIObRtcLSHyV8VIAw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-expo@57.0.5: + resolution: {integrity: sha512-U08fwjaDBwnnbKnZcOA0WQbHfKqOWTCGku+IdCaekrLZmfbbZr3P1WqEsXHo6ntidQ3DmW+TT6G1aOp+ChYfKA==} hasBin: true peerDependencies: - '@react-native/jest-preset': ^0.85.0 + '@react-native/jest-preset': ^0.86.3 expo: '*' react-native: '*' react-server-dom-webpack: ~19.0.4 || ~19.1.5 || ~19.2.4 @@ -8792,9 +9067,13 @@ packages: resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-leak-detector@29.7.0: - resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-haste-map@30.5.1: + resolution: {integrity: sha512-VIFgt67jW480YDxKfEv9IYQKrFpYt7bOCMn3VsnjK7AK9qo7p6acpnA1DHwsVOULE3dTaYew/6JaTD/d0VDHoQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-leak-detector@30.5.1: + resolution: {integrity: sha512-gt4GT2aWgEoCNTcBe4rqS74xTIUJxi+UD9SNSu9aOk5LmTEd6fS5KSTmAKAfitCCktQHNN+upUuL6EkBfFbMDQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-matcher-utils@29.7.0: resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} @@ -8804,55 +9083,74 @@ packages: resolution: {integrity: sha512-zvYfX5CaeEkFrrLS9suWe9rvJrm9J1Iv3ua8kIBv9GEPzcnsfBf0bob37la7s67fs0nlBC3EuvkOLnXQKxtx4A==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-message-util@29.7.0: + jest-matcher-utils@30.5.1: + resolution: {integrity: sha512-aroZVqwOz/wC2y6pC+obgFWKV9viaQWQTTSB6W5H55+egtUczIfXR/rxExTv92xD/ADYwpqaYfVWx1aqwKg7FA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-message-util@29.7.0: resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-message-util@30.5.1: + resolution: {integrity: sha512-UdQlLdd9wL/Ys7xRErckqwD6wPlSZYueosSWuHc1r2ztGLwlgPvtSJq2+BPEgaEY13WLvfFbmhTj8pba0Sd1jg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-mock@29.7.0: resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-pnp-resolver@1.2.3: - resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} - engines: {node: '>=6'} - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true + jest-mock@30.5.1: + resolution: {integrity: sha512-9fVjc3leUpGID2/by/LU4Dvdcp7PFh9LlxS3QRWK3ABm+KtvEVsG/AEGeLY3gKOZsjkBxyfwGltoAVlW7dygHg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-regex-util@29.6.3: resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-resolve-dependencies@29.7.0: - resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-regex-util@30.5.0: + resolution: {integrity: sha512-Mg0WK7A6xRHLSA1udJ8y9f3lM0uUhFTBnLKzwPmqB9AylvpleJ6BLemR8K9dK27DY+cesDryoA7yLZCAHsPG1A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-resolve@29.7.0: - resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-resolve-dependencies@30.5.1: + resolution: {integrity: sha512-JKpXGONDcTaunrNVn8KCl6qAnwl06jIkvv70lhq0Ze47lsPx9sH5HoeEUiXX6iFGnliHN/qpIbQ0l38wrVmXaw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-runner@29.7.0: - resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-resolve@30.5.1: + resolution: {integrity: sha512-wprhLejRtwN6h8ZgaqC0eYjGJ1uMdGPT/+b3eFncbG4NWuuP9QL+vWwRinu9waw7hkOLcpMJGVJAMgBwsPssMQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-runtime@29.7.0: - resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-runner@30.5.1: + resolution: {integrity: sha512-FPlQE4+mwnFxXmpPrSi836KV2ZzvK1g6/nPCT8o5BcoDUUNJQeHo1/Qdkoe/QeoL4M7OeJpbnGUhYKhC1VMdaQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-runtime@30.5.1: + resolution: {integrity: sha512-UB88+NRkK2Tw/OqV7dofYcyiUGrVZtD41k/N0xQOs9fG//57XHK7JLWG52HD1UYpUAhjK4xm6DBvFX3yWudsMA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-snapshot@29.7.0: resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-snapshot@30.5.1: + resolution: {integrity: sha512-cNWFdSb5xuDGl8hKkAZJ3YtI/PzHpAPFV+HUXWIOG8rMhpDTLVbvAc2d2wRicoYw2wGsJGLaurJT6BLC97bLXQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-util@29.7.0: resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-util@30.5.1: + resolution: {integrity: sha512-yKuxmNy2rSbTXw+3SIPanJo+nV4/BS1p26v44IYBFMsswSQySfMMcPHErnOncda7i9HEz0q605rIhSTBVgrZTg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-validate@29.7.0: resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-validate@30.5.1: + resolution: {integrity: sha512-i/buJ56wTpxihE93hQYNMfdOThS87+HGvLZzZJmU4xggPcdTYQq051iwALLCHp3q+SkCGH+EFejQZz5EbBSkkg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-watch-select-projects@2.0.0: resolution: {integrity: sha512-j00nW4dXc2NiCW6znXgFLF9g8PJ0zP25cpQ1xRro/HU2GBfZQFZD0SoXnAlaoKkIY4MlfTMkKGbNXFpvCdjl1w==} @@ -8866,13 +9164,21 @@ packages: resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-watcher@30.5.1: + resolution: {integrity: sha512-+FHJ7C+S7b3ySfhA1aFmoa6TztsnwZVv84ycPRn0tVN93np2EU4b8C/KadqA3l6igdjgLBTnUotab9ER0HLG8A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + jest-worker@29.7.0: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest@29.7.0: - resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-worker@30.5.1: + resolution: {integrity: sha512-Cbxh5v7AoLuFRmFJSM4/aHdQ68rjXvUWr716EE0Dh3I7T+T/3FgFKhOERGXHcU2Meftq9+9zxPM3TSNyI9D+HA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest@30.5.1: + resolution: {integrity: sha512-3qrR8+ZXFnn7y0H2yjWQNkGGBLBY4zTRoTMAq9zJcgwLLtlyonfsCLviIXK9xuE2KgIyM+M36AFcoK2DgFR36w==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -9452,118 +9758,60 @@ packages: resolution: {integrity: sha512-2WbHILKMiJUzfdjmGOQOqU1bWi9//gqiclc/tkk/AIsrrVw3efhZ1uhkOwMTxUEPOzqoo091H0olLmVZH5FHGQ==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-babel-transformer@0.84.6: - resolution: {integrity: sha512-B1ozl6KxFHbQjXZ2U8WiTPWXylqiD3V4EXyV5r0fqETOrqIrJlBvbVTD82UxIN+B3Vpe4l8G1tb15ocd2RyOQA==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-cache-key@0.84.5: resolution: {integrity: sha512-3dPB2TnvGjjf0/9O7AXVQURKXuQNauTZE7WpTGTlR017Gh/B5y0m/2wcqxfveUguHSpu89KhVxCAlr2k/H7uhQ==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-cache-key@0.84.6: - resolution: {integrity: sha512-6tyXt1BZ/3U183XV48oif7Nm65TE+pTo0Vs31u4FxMgqiYQR/SiSr3RoXn3pmy4pd280ZmLmct0x3jZpu0pV4A==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-cache@0.84.5: resolution: {integrity: sha512-WHS0n2OxQqtwEjSeQFPePNrMvEFhmQcUQM9cRJMHByWoi/GMWFBEWOf7hVkAM/0KRutAXNbDlSu/cZB6CyxgQQ==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-cache@0.84.6: - resolution: {integrity: sha512-KBJVpb02oKNO+jlWQ1Aax7cd11YP0MClDaMgx6C4MhyZ9g95J/dC1Bo6sCzXaU9L9h/w5cQfT5zDkGW5sOj99A==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-config@0.84.5: resolution: {integrity: sha512-zie+uN6oohscowi2S7ByU+wUw6CrT4ZxW9uAbONOObSxx86RGmnIAmjXHLkfmcdYoY7jzOPEbqcI6oeVmqyBQA==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-config@0.84.6: - resolution: {integrity: sha512-cD2mLEofcuV26kxSV4hfV1Pbuh6igdUhYQriO8ZVeJ7HyZfq4/wqHV0gSR7fEO8NUp9odr60/Kzm5YakmghWwQ==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-core@0.84.5: resolution: {integrity: sha512-xwm605hCi5Y6eJTTb8ZWo6pkUcoBEIyiQOfkZh5GwtDwUrP9SNhTQZhzJHrBCwwxlf3Ptl/pxWJgQ1rsNYMnrA==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-core@0.84.6: - resolution: {integrity: sha512-ZqYskM8+f3PFMosBDJd8DLqRvT1ltRGhWL/ZfTpBvf4SoadO30VVrdhAoHFVGz3G1CJpWa3fgZH7nnnX/ybllA==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-file-map@0.84.5: resolution: {integrity: sha512-mlm/JL8toSbSc2akpKIGmzvrVRSCgZ5vkbycI34oMLoOnLGuLyC8WTyVJ6P0hZG/usDaGwZSl/s9BCRriqjGJA==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-file-map@0.84.6: - resolution: {integrity: sha512-ov9VywWBsHPt54Zc7/DxWvqjTwxuZvhfeyHg8ZAMGKtf2PcH1wS3EnoBH7In53Rspk/eXVWAO5+avxunPn081w==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-minify-terser@0.84.5: resolution: {integrity: sha512-BJoFwCEDsYnagPqarayInv2+diCDNDdLlaof/p6s9w4gh+gc9HXYM+pDvsKGKKUumpZswNF3Z/ftTMqKl/5IBg==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-minify-terser@0.84.6: - resolution: {integrity: sha512-SqhB/Kxrw0XfyW0k8mEscqX/CQopm6Fp3EpdSIPzvKfGgQp9bTMahg9PAdVsXUmIWwErbmFw1VqB+VFBOKksUw==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-resolver@0.84.5: resolution: {integrity: sha512-VSSnepg1k6LyCwtb6eirWdAWlpKwBG8Rdtsr1mU38rMelFyWgh3/QuMSiZIZAIjwg/fsa8GhW5/FO54CAUPCEA==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-resolver@0.84.6: - resolution: {integrity: sha512-PplpGc/OCLxgKeLNsLQO/VHsYDIvkcGGr3zNT7UanHCGRqhxKv245o+naV8cRI4/pcLqyc+9j+J0AJbT3Kp5Sg==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-runtime@0.84.5: resolution: {integrity: sha512-U1m2+d1Pr+JO2/iVXBB2OfXXityz7tqwIorxfrT15IEgaHvpJBq/OHiqnOWPKJbUl3JcxjcdviZZOKk85oK4Qg==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-runtime@0.84.6: - resolution: {integrity: sha512-47EYO/DOai0PA3GoAyDpyXOgHNMwbl/Z9dQlQineDLHkpD42xOwMrIx1crT0+n6F+aGoEyxZmeFwfMzaIqVqKQ==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-source-map@0.84.5: resolution: {integrity: sha512-2BtV5L9uPc49F13Gn5wiP6bX/EncqzqTIk2VL/0F/96Vo0YEOjluT/qktQjFODfqGFsucwnh5mPEAl/2jVEfeg==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-source-map@0.84.6: - resolution: {integrity: sha512-4p/EplRbgNxhdqA6kAj1AmIq9qqYXYSAjgxuZ73rYA+p037xDDrxK8CyDKNfbn1k6aMuVt8LV0fpt7NHUTKiZw==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-symbolicate@0.84.5: resolution: {integrity: sha512-rQ40zYDAkaWBN9yvjUuAD0ZpzBMZSoKyGYXnb5JrfbKjun7fTvfoLHL3KXFYenBTYZkQtlp4cKSCv/1utxFyOw==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} hasBin: true - metro-symbolicate@0.84.6: - resolution: {integrity: sha512-wJFyyF5ysbVyoYVWGL6GwVMiNnGllwDU2gF096376fl0fc8IFUlADSyNlswj31K9og2sOilXe/FdyWFPczPUYg==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - hasBin: true - metro-transform-plugins@0.84.5: resolution: {integrity: sha512-+InaSVGaOyt0DyRo4Y/zIdPI6CZwnbNho5LAL23tgmuGwv7fyfkF7kKfPjZcfxXBcoYdTLLFnCfCH/dHSiCqNg==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-transform-plugins@0.84.6: - resolution: {integrity: sha512-pROPMFaj25Y9+3LlLqpBRz/7B/2YPnfEQz/z3juYxkh3FGQ+3c/Qh4E+khPSTdwTw0M6LitLYHMqaHMbQmuBJw==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-transform-worker@0.84.5: resolution: {integrity: sha512-ui1Z8x4s5RL36gMmKLaMMO7O9NNDHNdthEZSCDQHAau3JcAsTaFOK6I+2q4I/kW5u8hSEjJk9L45TXSVJw6g1A==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro-transform-worker@0.84.6: - resolution: {integrity: sha512-xLTVrOENaHR9DiuhnHS+zcle0rKsCy2CpXSIx7xD+zhJs+qVRNUyV7Z1zIt/0P/d0cSGVx846R+dIjHEudhcww==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - metro@0.84.5: resolution: {integrity: sha512-r1liLkyFZMVSEMNjU1CJU5pRzs3NdkxHqXS60O25c0rCIqAR+cGk7rPydw/g0WAIKVXojIBIF45yYBPagJGcgw==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} hasBin: true - metro@0.84.6: - resolution: {integrity: sha512-ty/tx/imE5Ph2gvPU788Ckim6RAC2tyZxLz2hWRgC9U7/fGKV7qY/slADy0qHPEw9cpUgc4BfmV3oUsYwm7oeg==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - hasBin: true - micromark-util-character@2.1.1: resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} @@ -9635,6 +9883,10 @@ packages: minimatch@3.1.5: resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + minimatch@9.0.9: + resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} + engines: {node: '>=16 || 14 >=14.17'} + minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -9713,6 +9965,11 @@ packages: napi-build-utils@2.0.0: resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} + napi-postinstall@0.3.4: + resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + hasBin: true + nativewind@4.2.6: resolution: {integrity: sha512-kLPRH3Yh/hhIFufXzUZDe39fuK471GwaPBCqYNgcRygILr+obV+wFfDmG+zaJnniVUFFQzYOTCEldem6XktZ+A==} engines: {node: '>=16'} @@ -9793,6 +10050,9 @@ packages: resolution: {integrity: sha512-W5ZNO5KRPB5TkYmGVD9F6YqhsglXJzE6etpbmT+f6EQElhiX/UTG551cnsRGvLG3fyZEg9HwaDmNmj5nwJ4z9g==} engines: {node: '>=10'} + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} @@ -9904,10 +10164,6 @@ packages: resolution: {integrity: sha512-aH9RkoZc7w/90HBamFxTw8ZLFr05wXS+iOnvmrgo53Ep8Pyrm5FieQSaPIVROkfFVQISeD/zo92fes26TOwe+A==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - ob1@0.84.6: - resolution: {integrity: sha512-+s+6zjd0X68hfAcn92NsEPXnSYOF3O7exw/Fj4UfRTB+UL+Tdjdkzu5/4WquXlzqgvNm8FWuuW6/0Yd8S2rYxw==} - engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -9935,10 +10191,6 @@ packages: resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} engines: {node: '>= 0.4'} - obug@2.1.3: - resolution: {integrity: sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==} - engines: {node: '>=12.20.0'} - obug@2.1.4: resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==} engines: {node: '>=12.20.0'} @@ -10126,6 +10378,9 @@ packages: peerDependencies: quickjs-wasi: ^0.0.1 + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + package-manager-detector@1.8.0: resolution: {integrity: sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==} @@ -10201,6 +10456,10 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + path-scurry@2.0.2: resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} engines: {node: 18 || 20 || >=22} @@ -10584,6 +10843,10 @@ packages: resolution: {integrity: sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + pretty-format@30.5.1: + resolution: {integrity: sha512-byhRAPguVKMQIj4kjJwJ5lAskVhfuiSdiYl/aLTWpgkGEmic2jYhJh1yE9ih8Ox44Xg9ccCT11/S6QrzSJuNrg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + prismjs@1.30.0: resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} engines: {node: '>=6'} @@ -10644,8 +10907,8 @@ packages: resolution: {integrity: sha512-Hy5eMQshOEMil4JUUx03h5pw1HYkYCso1RG/gcpPlFSd4cYPOcopxcXEAxpLPOkOPJb9LIJtwxuj66bSdvknFg==} engines: {node: '>=22.12.0'} - pure-rand@6.1.0: - resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + pure-rand@7.0.1: + resolution: {integrity: sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==} query-selector-shadow-dom@1.0.1: resolution: {integrity: sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==} @@ -10695,6 +10958,11 @@ packages: peerDependencies: react: ^19.2.3 + react-dom@19.2.8: + resolution: {integrity: sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==} + peerDependencies: + react: ^19.2.8 + react-email@6.9.3: resolution: {integrity: sha512-z2YOtq5EDNeMMz8uuZtVxmtB43nIkoPWEr8Heajkljm2clKlfE8oODtI6Me2NunmqXWaYfpv4aEFOr4ZiLmk+g==} engines: {node: '>=20.0.0'} @@ -10754,24 +11022,24 @@ packages: react: '*' react-native: '*' - react-native-reanimated@4.3.1: - resolution: {integrity: sha512-KhGsS0YkCA+gusgyzlf9hnqzVPIR398KTpqXyqq/+yYJJPAvyEEPKcxlB0xtOOXSMrR2A9uRKVARVQhZwrOh+Q==} + react-native-reanimated@4.6.0: + resolution: {integrity: sha512-9vbQmok5BPX2J3RLPFt2UnwmK2QQoMDPDi0VB4a9JWIiEc55pdzvwEsdH91V/JXKNErqM6a9fElTBMc/1cbtBA==} peerDependencies: react: '*' - react-native: 0.81 - 0.85 - react-native-worklets: 0.8.x + react-native: 0.83 - 0.87 + react-native-worklets: 0.12.x - react-native-safe-area-context@5.7.0: - resolution: {integrity: sha512-/9/MtQz8ODphjsLdZ+GZAIcC/RtoqW9EeShf7Uvnfgm/pzYrJ75y3PV/J1wuAV1T5Dye5ygq4EAW20RoBq0ABQ==} + react-native-safe-area-context@5.9.1: + resolution: {integrity: sha512-Zpx9Iwg6VhgNarWFpcIM61xK2lUbSfSXemQUmcvOVRpux49lJsUompY1S3E5jKUJbLq233qEpj28DgmXVsgZMQ==} peerDependencies: react: '*' react-native: '*' - react-native-screens@4.25.2: - resolution: {integrity: sha512-1Nj1fusFd+rIMKU/qC9yGKVG+3ofh11d3OdBQKL1iVvQfKvcB8vhvTGQf2TkfxW3bamxN+hCZIXmNuU0mRkyDg==} + react-native-screens@4.27.0: + resolution: {integrity: sha512-IUukKYilhKhdJqGh59BmxrAjgIO84CaOkdowEY20+RmapOAFpqS//xOIcq2iqDQ4xVoxuwCHGWhY/Tbz6lTblA==} peerDependencies: react: '*' - react-native: '>=0.82.0' + react-native: '*' react-native-web@0.21.2: resolution: {integrity: sha512-SO2t9/17zM4iEnFvlu2DA9jqNbzNhoUP+AItkoCOyFmDMOhUnBBznBDCYN92fGdfAkfQlWzPoez6+zLxFNsZEg==} @@ -10779,20 +11047,20 @@ packages: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - react-native-worklets@0.8.3: - resolution: {integrity: sha512-oCBJROyLU7yG/1R8s0INMflygTH71bx+5XcYkH0CM938TlhSoVbiunE1WVW5FZa51vwYqfLie/IXMX2s1Kh3eg==} + react-native-worklets@0.12.1: + resolution: {integrity: sha512-/u7B+Akrox32IQUi6+0OHwWAfBC/A5LVdt000RL8OKB4L1pHTvIDwVyMP6Nw7ybuuoQYS8PLlpmxTE1Ce7TqWg==} peerDependencies: '@babel/core': '*' '@react-native/metro-config': '*' react: '*' - react-native: 0.81 - 0.85 + react-native: 0.83 - 0.87 - react-native@0.85.3: - resolution: {integrity: sha512-HN/fGC+3nZVcDNcw7gfbM/DuqZAvI9Mz+/SxuhODaua4JY0BPzhfTzWXRyTR4mRgMHmShTPpH2PYMTxvZrsdZA==} + react-native@0.86.3: + resolution: {integrity: sha512-JR5s3bM9ezud+Mw24GlNXNfthqPIKwrQgPPJcam+L97t2sKjjEavhCzBn+fyqZZRcM5+XlhYxpTxVkK7e1n38Q==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} hasBin: true peerDependencies: - '@react-native/jest-preset': 0.85.3 + '@react-native/jest-preset': 0.86.3 '@types/react': ^19.1.1 react: ^19.2.3 peerDependenciesMeta: @@ -10801,6 +11069,12 @@ packages: '@types/react': optional: true + react-reconciler@0.33.0: + resolution: {integrity: sha512-KetWRytFv1epdpJc3J4G75I4WrplZE5jOL7Yq0p34+OVOKF4Se7WrdIdVC45XsSSmUTlht2FM/fM1FZb1mfQeA==} + engines: {node: '>=0.10.0'} + peerDependencies: + react: ^19.2.0 + react-refresh@0.14.2: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} @@ -10848,6 +11122,10 @@ packages: resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==} engines: {node: '>=0.10.0'} + react@19.2.8: + resolution: {integrity: sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==} + engines: {node: '>=0.10.0'} + read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} @@ -10994,10 +11272,6 @@ packages: resolve-workspace-root@2.0.1: resolution: {integrity: sha512-nR23LHAvaI6aHtMg6RWoaHpdR4D881Nydkzi2CixINyg9T00KgaJdJI6Vwty+Ps8WLxZHuxsS0BseWjxSA4C+w==} - resolve.exports@2.0.3: - resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} - engines: {node: '>=10'} - resolve@1.22.12: resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} engines: {node: '>= 0.4'} @@ -11331,9 +11605,6 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - source-map-support@0.5.13: - resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} - source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} @@ -11436,9 +11707,6 @@ packages: resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} engines: {node: '>= 0.8'} - std-env@4.1.0: - resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==} - std-env@4.2.0: resolution: {integrity: sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==} @@ -11480,6 +11748,10 @@ packages: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + string-width@7.2.0: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} @@ -11607,6 +11879,10 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + synckit@0.11.13: + resolution: {integrity: sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==} + engines: {node: ^14.18.0 || >=16.0.0} + tagged-tag@1.0.0: resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} engines: {node: '>=20'} @@ -11659,6 +11935,15 @@ packages: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} + test-exclude@7.0.2: + resolution: {integrity: sha512-u9E6A+ZDYdp7a4WnarkXPZOx8Ilz46+kby6p1yZ8zsGTz9gYa6FIS7lj2oezzNKmtdyyJNNmmXDppga5GB7kSw==} + engines: {node: '>=18'} + + test-renderer@1.2.0: + resolution: {integrity: sha512-JYiEGbgBGtmHAWX8Kf99gGRL1HtjcRVHLrmJNTZL4vFs9XrnWcuL45Iszw/pO4094+JR7havSrN+ds6YTOpSQA==} + peerDependencies: + react: ^19.0.0 + text-decoder@1.2.7: resolution: {integrity: sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==} @@ -11681,15 +11966,16 @@ packages: tiny-inflate@1.0.3: resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} - tinybench@2.9.0: - resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + tinybench@6.1.4: + resolution: {integrity: sha512-9APumHG7r4yOk4X4WlkmE71aZcv1gvin1czO3OQ1U9iJcFA5Ja/ygyb0vPOVHTthFozUYs8CLoLUlM8grb2lTQ==} + engines: {node: '>=20.0.0'} tinyclip@0.1.15: resolution: {integrity: sha512-uo33abH+Ays0xYaDysoBt494Hb3hsEczMpcC0MwFl773pazORx4fmvKhclhR1wonUbB6vvpRsvVMwnhfqeMc+A==} engines: {node: ^16.14.0 || >= 17.3.0} - tinyexec@1.2.4: - resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==} + tinyexec@1.3.0: + resolution: {integrity: sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==} engines: {node: '>=18'} tinyexec@1.3.1: @@ -11708,10 +11994,6 @@ packages: resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} engines: {node: ^20.0.0 || >=22.0.0} - tinyrainbow@3.1.0: - resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} - engines: {node: '>=14.0.0'} - tldts-core@7.4.11: resolution: {integrity: sha512-CW3WN2rIIE/Of21mulhgnGOwoDyEFNygyIBOONSdyAuSATgMMUCpLeUlB+E8sAwA5xRV9hYPl+kyZ9citHCaKg==} @@ -12022,6 +12304,9 @@ packages: webpack: optional: true + unrs-resolver@1.12.2: + resolution: {integrity: sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==} + unstorage@1.17.5: resolution: {integrity: sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==} peerDependencies: @@ -12353,23 +12638,23 @@ packages: vite: optional: true - vitest@4.1.9: - resolution: {integrity: sha512-nE3/LEyc0z87uHYLZebqCUOaJr2hdtuPp7BQ4BosVFnfltxgAvMG08NyrSGlPpOUWvR27c5flSmYFTNr78L9GQ==} - engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} + vitest@5.0.0: + resolution: {integrity: sha512-gpsMNoRhMjMktVxPtstOH4/PJuPyovVaMDr4oDilXaGH1EcqM2OE96SoHT2VIQ6fTGtTjqmHDrEu2X9RQiXf8Q==} + engines: {node: ^22.12.0 || ^24.0.0 || >=26.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 - '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.1.9 - '@vitest/browser-preview': 4.1.9 - '@vitest/browser-webdriverio': 4.1.9 - '@vitest/coverage-istanbul': 4.1.9 - '@vitest/coverage-v8': 4.1.9 - '@vitest/ui': 4.1.9 + '@types/node': ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 5.0.0 + '@vitest/browser-preview': 5.0.0 + '@vitest/browser-webdriverio': ^5.0.0-beta.5 || >=5.0.0 + '@vitest/coverage-istanbul': 5.0.0 + '@vitest/coverage-v8': 5.0.0 + '@vitest/ui': 5.0.0 happy-dom: '*' jsdom: '*' - vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + vite: ^6.4.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: '@edge-runtime/vm': optional: true @@ -12616,6 +12901,10 @@ packages: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + wrap-ansi@9.0.2: resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} engines: {node: '>=18'} @@ -12627,6 +12916,10 @@ packages: resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + write-file-atomic@5.0.1: + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ws@7.5.13: resolution: {integrity: sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA==} engines: {node: '>=8.3.0'} @@ -12928,13 +13221,13 @@ snapshots: astro: 7.3.1(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@netlify/blobs@10.7.13)(@types/node@24.13.2)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.23.0)(postgres@3.4.9)))(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0) es-module-lexer: 2.3.2 - '@astrojs/netlify@8.2.5(@types/node@24.13.2)(astro@7.3.1(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@netlify/blobs@10.7.13)(@types/node@24.13.2)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.23.0)(postgres@3.4.9)))(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0))(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.23.0)(postgres@3.4.9)))(jiti@2.7.0)(rollup@4.62.2)(srvx@0.11.22)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)': + '@astrojs/netlify@8.2.5(@parcel/watcher@2.6.0)(@types/node@24.13.2)(astro@7.3.1(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@netlify/blobs@10.7.13)(@types/node@24.13.2)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.23.0)(postgres@3.4.9)))(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0))(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.23.0)(postgres@3.4.9)))(jiti@2.7.0)(rollup@4.62.2)(srvx@0.11.22)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)': dependencies: '@astrojs/internal-helpers': 0.11.0 '@astrojs/underscore-redirects': 1.0.4 '@netlify/blobs': 10.7.13 '@netlify/functions': 5.3.0 - '@netlify/vite-plugin': 2.12.9(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.23.0)(postgres@3.4.9)))(rollup@4.62.2)(srvx@0.11.22)(vite@8.2.2(@types/node@24.13.2)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)) + '@netlify/vite-plugin': 2.12.9(@parcel/watcher@2.6.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.23.0)(postgres@3.4.9)))(rollup@4.62.2)(srvx@0.11.22)(vite@8.2.2(@types/node@24.13.2)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)) '@vercel/nft': 1.11.0(rollup@4.62.2) astro: 7.3.1(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@netlify/blobs@10.7.13)(@types/node@24.13.2)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.23.0)(postgres@3.4.9)))(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0) esbuild: 0.28.2 @@ -13631,7 +13924,7 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} - '@better-auth/cli@1.4.21(@better-fetch/fetch@1.1.21)(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@tanstack/react-start@1.168.50(crossws@0.4.8(srvx@0.11.20))(esbuild@0.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rolldown@1.2.7)(rollup@4.62.2)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)))(better-call@1.1.8(zod@4.4.3))(drizzle-kit@0.31.10)(jose@6.2.12)(kysely@0.29.5)(magicast@0.5.4)(nanostores@1.5.3)(postgres@3.4.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vitest@4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(jsdom@20.0.3)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)))': + '@better-auth/cli@1.4.21(@better-fetch/fetch@1.1.21)(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@tanstack/react-start@1.168.50(crossws@0.4.8(srvx@0.11.20))(esbuild@0.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rolldown@1.2.7)(rollup@4.62.2)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)))(better-call@1.1.8(zod@4.4.3))(drizzle-kit@0.31.10)(jose@6.2.12)(kysely@0.29.5)(magicast@0.5.4)(nanostores@1.5.3)(postgres@3.4.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vitest@5.0.0(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(jsdom@20.0.3)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)))': dependencies: '@babel/core': 7.29.7 '@babel/preset-react': 7.29.7(@babel/core@7.29.7) @@ -13643,7 +13936,7 @@ snapshots: '@mrleebo/prisma-ast': 0.13.1 '@prisma/client': 5.22.0 '@types/pg': 8.20.0 - better-auth: 1.4.21(@prisma/client@5.22.0)(@tanstack/react-start@1.168.50(crossws@0.4.8(srvx@0.11.20))(esbuild@0.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rolldown@1.2.7)(rollup@4.62.2)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)))(better-sqlite3@12.11.1)(drizzle-kit@0.31.10)(drizzle-orm@0.41.0(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.22.0)(postgres@3.4.9))(pg@8.22.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vitest@4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(jsdom@20.0.3)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0))) + better-auth: 1.4.21(@prisma/client@5.22.0)(@tanstack/react-start@1.168.50(crossws@0.4.8(srvx@0.11.20))(esbuild@0.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rolldown@1.2.7)(rollup@4.62.2)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)))(better-sqlite3@12.11.1)(drizzle-kit@0.31.10)(drizzle-orm@0.41.0(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.22.0)(postgres@3.4.9))(pg@8.22.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vitest@5.0.0(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(jsdom@20.0.3)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0))) better-sqlite3: 12.11.1 c12: 3.3.4(magicast@0.5.4) chalk: 5.6.2 @@ -13940,12 +14233,23 @@ snapshots: '@emmetio/stream-reader@2.2.0': {} + '@emnapi/core@1.10.0': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true + '@emnapi/core@1.11.1': dependencies: '@emnapi/wasi-threads': 1.2.2 tslib: 2.8.1 optional: true + '@emnapi/runtime@1.10.0': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.11.1': dependencies: tslib: 2.8.1 @@ -13956,6 +14260,11 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/wasi-threads@1.2.1': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/wasi-threads@1.2.2': dependencies: tslib: 2.8.1 @@ -14278,7 +14587,7 @@ snapshots: '@expo-google-fonts/material-symbols@0.4.45': {} - '@expo/cli@57.0.22(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-constants@57.0.17)(expo-font@57.0.3)(expo-router@57.0.19)(expo@57.0.20)(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3)': + '@expo/cli@57.0.22(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-constants@57.0.17)(expo-font@57.0.3)(expo-router@57.0.19)(expo@57.0.20)(react-dom@19.2.8(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3)': dependencies: '@expo/code-signing-certificates': 0.0.6 '@expo/config': 57.0.9(typescript@6.0.3) @@ -14288,7 +14597,7 @@ snapshots: '@expo/image-utils': 0.11.5(typescript@6.0.3) '@expo/inline-modules': 0.1.7(typescript@6.0.3) '@expo/json-file': 11.0.1 - '@expo/log-box': 57.0.4(@expo/dom-webview@56.0.6)(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) + '@expo/log-box': 57.0.4(@expo/dom-webview@56.0.6)(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) '@expo/metro': 56.0.2 '@expo/metro-config': 57.0.12(expo@57.0.20)(typescript@6.0.3) '@expo/metro-file-map': 57.0.2 @@ -14297,7 +14606,7 @@ snapshots: '@expo/plist': 0.8.1 '@expo/prebuild-config': 57.0.15(typescript@6.0.3) '@expo/require-utils': 57.0.5(typescript@6.0.3) - '@expo/router-server': 57.0.9(@expo/metro-runtime@57.0.15)(expo-constants@57.0.17)(expo-font@57.0.3)(expo-router@57.0.19)(expo-server@57.0.3)(expo@57.0.20)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@expo/router-server': 57.0.9(@expo/metro-runtime@57.0.15)(expo-constants@57.0.17)(expo-font@57.0.3)(expo-router@57.0.19)(expo-server@57.0.3)(expo@57.0.20)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@expo/schema-utils': 57.0.2 '@expo/spawn-async': 1.8.0 '@expo/ws-tunnel': 2.0.0(ws@8.21.3) @@ -14314,7 +14623,7 @@ snapshots: connect: 3.7.0 debug: 4.4.3 dnssd-advertise: 1.1.6 - expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.8(react@19.2.8))(react-native-web@0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3) expo-server: 57.0.3 fetch-nodeshim: 0.4.10 getenv: 2.0.0 @@ -14341,8 +14650,8 @@ snapshots: ws: 8.21.3 zod: 3.25.76 optionalDependencies: - expo-router: 57.0.19(16f7296de013c3d4a93c1733f9fcfb8f) - react-native: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) + expo-router: 57.0.19(e35e5e20434eb6ba82cd6cc8e8e72f51) + react-native: 0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8) transitivePeerDependencies: - '@expo/dom-webview' - '@expo/metro-runtime' @@ -14404,18 +14713,18 @@ snapshots: transitivePeerDependencies: - supports-color - '@expo/devtools@57.0.1(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)': + '@expo/devtools@57.0.1(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)': dependencies: chalk: 4.1.2 optionalDependencies: - react: 19.2.3 - react-native: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) + react: 19.2.8 + react-native: 0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8) - '@expo/dom-webview@56.0.6(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)': + '@expo/dom-webview@56.0.6(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)': dependencies: - expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) - react: 19.2.3 - react-native: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) + expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.8(react@19.2.8))(react-native-web@0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3) + react: 19.2.8 + react-native: 0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8) '@expo/env@2.4.3': dependencies: @@ -14476,13 +14785,13 @@ snapshots: - supports-color - typescript - '@expo/log-box@57.0.4(@expo/dom-webview@56.0.6)(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)': + '@expo/log-box@57.0.4(@expo/dom-webview@56.0.6)(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)': dependencies: - '@expo/dom-webview': 56.0.6(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) + '@expo/dom-webview': 56.0.6(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) anser: 1.4.10 - expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) - react: 19.2.3 - react-native: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) + expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.8(react@19.2.8))(react-native-web@0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3) + react: 19.2.8 + react-native: 0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8) stacktrace-parser: 0.1.11 '@expo/metro-config@57.0.12(expo@57.0.20)(typescript@6.0.3)': @@ -14511,7 +14820,7 @@ snapshots: postcss: 8.5.28 resolve-from: 5.0.0 optionalDependencies: - expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.8(react@19.2.8))(react-native-web@0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3) transitivePeerDependencies: - bufferutil - supports-color @@ -14529,18 +14838,18 @@ snapshots: transitivePeerDependencies: - supports-color - '@expo/metro-runtime@57.0.15(@expo/log-box@57.0.4)(expo@57.0.20)(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)': + '@expo/metro-runtime@57.0.15(@expo/log-box@57.0.4)(expo@57.0.20)(react-dom@19.2.8(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)': dependencies: - '@expo/log-box': 57.0.4(@expo/dom-webview@56.0.6)(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) + '@expo/log-box': 57.0.4(@expo/dom-webview@56.0.6)(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) anser: 1.4.10 - expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.8(react@19.2.8))(react-native-web@0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3) pretty-format: 29.7.0 - react: 19.2.3 - react-native: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) + react: 19.2.8 + react-native: 0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8) stacktrace-parser: 0.1.11 whatwg-fetch: 3.6.20 optionalDependencies: - react-dom: 19.2.3(react@19.2.3) + react-dom: 19.2.8(react@19.2.8) '@expo/metro@56.0.2': dependencies: @@ -14608,18 +14917,18 @@ snapshots: transitivePeerDependencies: - supports-color - '@expo/router-server@57.0.9(@expo/metro-runtime@57.0.15)(expo-constants@57.0.17)(expo-font@57.0.3)(expo-router@57.0.19)(expo-server@57.0.3)(expo@57.0.20)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@expo/router-server@57.0.9(@expo/metro-runtime@57.0.15)(expo-constants@57.0.17)(expo-font@57.0.3)(expo-router@57.0.19)(expo-server@57.0.3)(expo@57.0.20)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: debug: 4.4.3 - expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) - expo-constants: 57.0.17(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3)) - expo-font: 57.0.3(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) + expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.8(react@19.2.8))(react-native-web@0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3) + expo-constants: 57.0.17(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8)) + expo-font: 57.0.3(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) expo-server: 57.0.3 - react: 19.2.3 + react: 19.2.8 optionalDependencies: - '@expo/metro-runtime': 57.0.15(@expo/log-box@57.0.4)(expo@57.0.20)(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) - expo-router: 57.0.19(16f7296de013c3d4a93c1733f9fcfb8f) - react-dom: 19.2.3(react@19.2.3) + '@expo/metro-runtime': 57.0.15(@expo/log-box@57.0.4)(expo@57.0.20)(react-dom@19.2.8(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) + expo-router: 57.0.19(e35e5e20434eb6ba82cd6cc8e8e72f51) + react-dom: 19.2.8(react@19.2.8) transitivePeerDependencies: - supports-color @@ -14633,26 +14942,26 @@ snapshots: '@expo/sudo-prompt@9.3.2': {} - '@expo/ui@57.0.16(@babel/core@7.29.7)(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(expo@57.0.20)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)': + '@expo/ui@57.0.16(@babel/core@7.29.7)(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(expo@57.0.20)(react-dom@19.2.8(react@19.2.8))(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)': dependencies: - expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) - react: 19.2.3 - react-native: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) + expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.8(react@19.2.8))(react-native-web@0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3) + react: 19.2.8 + react-native: 0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8) sf-symbols-typescript: 2.2.0 - vaul: 1.1.2(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + vaul: 1.1.2(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) optionalDependencies: '@babel/core': 7.29.7 - react-dom: 19.2.3(react@19.2.3) - react-native-worklets: 0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) + react-dom: 19.2.8(react@19.2.8) + react-native-worklets: 0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) transitivePeerDependencies: - '@types/react' - '@types/react-dom' - '@expo/vector-icons@15.1.1(expo-font@57.0.3)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)': + '@expo/vector-icons@15.1.1(expo-font@57.0.3)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)': dependencies: - expo-font: 57.0.3(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) - react: 19.2.3 - react-native: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) + expo-font: 57.0.3(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) + react: 19.2.8 + react-native: 0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8) '@expo/ws-tunnel@2.0.0(ws@8.21.3)': dependencies: @@ -15064,6 +15373,15 @@ snapshots: optionalDependencies: '@types/node': 26.4.1 + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.2.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + '@isaacs/fs-minipass@4.0.1': dependencies: minipass: 7.1.3 @@ -15083,44 +15401,54 @@ snapshots: '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 - '@types/node': 26.1.0 + '@types/node': 26.4.1 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.7.0': + '@jest/console@30.5.1': dependencies: - '@jest/console': 29.7.0 - '@jest/reporters': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 26.1.0 + '@jest/types': 30.5.1 + '@types/node': 26.4.1 + chalk: 4.1.2 + jest-message-util: 30.5.1 + jest-util: 30.5.1 + slash: 3.0.0 + + '@jest/core@30.5.1': + dependencies: + '@jest/console': 30.5.1 + '@jest/pattern': 30.5.0 + '@jest/reporters': 30.5.1 + '@jest/test-result': 30.5.1 + '@jest/transform': 30.5.1 + '@jest/types': 30.5.1 + '@types/node': 26.4.1 ansi-escapes: 4.3.2 chalk: 4.1.2 - ci-info: 3.9.0 - exit: 0.1.2 + ci-info: 4.4.0 + exit-x: 0.2.2 + fast-json-stable-stringify: 2.1.0 graceful-fs: 4.2.11 - jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@26.1.0) - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-resolve-dependencies: 29.7.0 - jest-runner: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - jest-watcher: 29.7.0 - micromatch: 4.0.8 - pretty-format: 29.7.0 + jest-changed-files: 30.5.1 + jest-config: 30.5.1(@types/node@26.4.1) + jest-haste-map: 30.5.1 + jest-message-util: 30.5.1 + jest-regex-util: 30.5.0 + jest-resolve: 30.5.1 + jest-resolve-dependencies: 30.5.1 + jest-runner: 30.5.1 + jest-runtime: 30.5.1 + jest-snapshot: 30.5.1 + jest-util: 30.5.1 + jest-validate: 30.5.1 + jest-watcher: 30.5.1 + pretty-format: 30.5.1 slash: 3.0.0 - strip-ansi: 6.0.1 transitivePeerDependencies: - babel-plugin-macros + - esbuild-register - supports-color - ts-node @@ -15130,17 +15458,30 @@ snapshots: '@jest/diff-sequences@30.4.0': {} + '@jest/diff-sequences@30.5.0': {} + '@jest/environment@29.7.0': dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 26.1.0 + '@types/node': 26.4.1 jest-mock: 29.7.0 + '@jest/environment@30.5.1': + dependencies: + '@jest/fake-timers': 30.5.1 + '@jest/types': 30.5.1 + '@types/node': 26.4.1 + jest-mock: 30.5.1 + '@jest/expect-utils@29.7.0': dependencies: jest-get-type: 29.6.3 + '@jest/expect-utils@30.5.1': + dependencies: + '@jest/get-type': 30.5.0 + '@jest/expect@29.7.0': dependencies: expect: 29.7.0 @@ -15148,17 +15489,35 @@ snapshots: transitivePeerDependencies: - supports-color + '@jest/expect@30.5.1': + dependencies: + expect: 30.5.1 + jest-snapshot: 30.5.1 + transitivePeerDependencies: + - supports-color + '@jest/fake-timers@29.7.0': dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 26.1.0 + '@types/node': 26.4.1 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 + '@jest/fake-timers@30.5.1': + dependencies: + '@jest/types': 30.5.1 + '@sinonjs/fake-timers': 15.4.0 + '@types/node': 26.4.1 + jest-message-util: 30.5.1 + jest-mock: 30.5.1 + jest-util: 30.5.1 + '@jest/get-type@30.1.0': {} + '@jest/get-type@30.5.0': {} + '@jest/globals@29.7.0': dependencies: '@jest/environment': 29.7.0 @@ -15168,31 +15527,44 @@ snapshots: transitivePeerDependencies: - supports-color - '@jest/reporters@29.7.0': + '@jest/globals@30.5.1': + dependencies: + '@jest/environment': 30.5.1 + '@jest/expect': 30.5.1 + '@jest/types': 30.5.1 + jest-mock: 30.5.1 + transitivePeerDependencies: + - supports-color + + '@jest/pattern@30.5.0': + dependencies: + '@types/node': 26.4.1 + jest-regex-util: 30.5.0 + + '@jest/reporters@30.5.1': dependencies: '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 + '@jest/console': 30.5.1 + '@jest/test-result': 30.5.1 + '@jest/transform': 30.5.1 + '@jest/types': 30.5.1 '@jridgewell/trace-mapping': 0.3.31 - '@types/node': 26.1.0 + '@types/node': 26.4.1 chalk: 4.1.2 collect-v8-coverage: 1.0.3 - exit: 0.1.2 - glob: 7.2.3 + exit-x: 0.2.2 + glob: 13.0.6 graceful-fs: 4.2.11 istanbul-lib-coverage: 3.2.2 istanbul-lib-instrument: 6.0.3 istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 + istanbul-lib-source-maps: 5.0.6 istanbul-reports: 3.2.0 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - jest-worker: 29.7.0 + jest-message-util: 30.5.1 + jest-util: 30.5.1 + jest-worker: 30.5.1 slash: 3.0.0 string-length: 4.0.2 - strip-ansi: 6.0.1 v8-to-istanbul: 9.3.0 transitivePeerDependencies: - supports-color @@ -15205,10 +15577,22 @@ snapshots: dependencies: '@sinclair/typebox': 0.34.49 - '@jest/source-map@29.6.3': + '@jest/schemas@30.5.0': + dependencies: + '@sinclair/typebox': 0.34.49 + + '@jest/snapshot-utils@30.5.1': + dependencies: + '@jest/types': 30.5.1 + chalk: 4.1.2 + graceful-fs: 4.2.11 + natural-compare: 1.4.0 + + '@jest/source-map@30.5.0': dependencies: '@jridgewell/trace-mapping': 0.3.31 callsites: 3.1.0 + convert-source-map: 2.0.0 graceful-fs: 4.2.11 '@jest/test-result@29.7.0': @@ -15218,11 +15602,18 @@ snapshots: '@types/istanbul-lib-coverage': 2.0.6 collect-v8-coverage: 1.0.3 - '@jest/test-sequencer@29.7.0': + '@jest/test-result@30.5.1': dependencies: - '@jest/test-result': 29.7.0 + '@jest/console': 30.5.1 + '@jest/types': 30.5.1 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.3 + + '@jest/test-sequencer@30.5.1': + dependencies: + '@jest/test-result': 30.5.1 graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 + jest-haste-map: 30.5.1 slash: 3.0.0 '@jest/transform@29.7.0': @@ -15245,12 +15636,41 @@ snapshots: transitivePeerDependencies: - supports-color + '@jest/transform@30.5.1': + dependencies: + '@babel/core': 7.29.7 + '@jest/types': 30.5.1 + '@jridgewell/trace-mapping': 0.3.31 + babel-plugin-istanbul: 8.0.0 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 30.5.1 + jest-regex-util: 30.5.0 + jest-util: 30.5.1 + pirates: 4.0.7 + slash: 3.0.0 + write-file-atomic: 5.0.1 + transitivePeerDependencies: + - supports-color + '@jest/types@29.6.3': dependencies: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 26.1.0 + '@types/node': 26.4.1 + '@types/yargs': 17.0.35 + chalk: 4.1.2 + + '@jest/types@30.5.1': + dependencies: + '@jest/pattern': 30.5.0 + '@jest/schemas': 30.5.0 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 26.4.1 '@types/yargs': 17.0.35 chalk: 4.1.2 @@ -15271,8 +15691,6 @@ snapshots: '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 - '@jridgewell/sourcemap-codec@1.5.5': {} - '@jridgewell/sourcemap-codec@1.6.0': {} '@jridgewell/trace-mapping@0.3.31': @@ -15314,6 +15732,13 @@ snapshots: '@tybys/wasm-util': 0.10.3 optional: true + '@napi-rs/wasm-runtime@1.2.3(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.3 + optional: true + '@napi-rs/wasm-runtime@1.2.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': dependencies: '@emnapi/core': 1.11.1 @@ -15450,7 +15875,7 @@ snapshots: parse-gitignore: 2.0.0 semver: 7.8.5 - '@netlify/dev@4.18.13(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.23.0)(postgres@3.4.9)))(rollup@4.62.2)(srvx@0.11.22)': + '@netlify/dev@4.18.13(@parcel/watcher@2.6.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.23.0)(postgres@3.4.9)))(rollup@4.62.2)(srvx@0.11.22)': dependencies: '@netlify/ai': 0.4.4 '@netlify/blobs': 10.7.13 @@ -15460,7 +15885,7 @@ snapshots: '@netlify/edge-functions-dev': 1.0.24 '@netlify/functions-dev': 1.3.5(rollup@4.62.2) '@netlify/headers': 2.1.13 - '@netlify/images': 1.3.12(@netlify/blobs@10.7.13)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.23.0)(postgres@3.4.9)))(srvx@0.11.22) + '@netlify/images': 1.3.12(@netlify/blobs@10.7.13)(@parcel/watcher@2.6.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.23.0)(postgres@3.4.9)))(srvx@0.11.22) '@netlify/redirects': 3.1.15 '@netlify/runtime': 4.1.29 '@netlify/static': 3.1.12 @@ -15493,7 +15918,7 @@ snapshots: - supports-color - uploadthing - '@netlify/dev@5.0.5(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.22.0)(postgres@3.4.9)))(rollup@4.62.2)(srvx@0.11.20)': + '@netlify/dev@5.0.5(@parcel/watcher@2.6.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.22.0)(postgres@3.4.9)))(rollup@4.62.2)(srvx@0.11.20)': dependencies: '@netlify/ai': 1.0.1 '@netlify/blobs': 11.0.3 @@ -15503,7 +15928,7 @@ snapshots: '@netlify/edge-functions-dev': 2.0.1 '@netlify/functions-dev': 2.0.5(rollup@4.62.2) '@netlify/headers': 3.0.1 - '@netlify/images': 2.0.1(@netlify/blobs@11.0.3)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.22.0)(postgres@3.4.9)))(srvx@0.11.20) + '@netlify/images': 2.0.1(@netlify/blobs@11.0.3)(@parcel/watcher@2.6.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.22.0)(postgres@3.4.9)))(srvx@0.11.20) '@netlify/redirects': 4.0.2 '@netlify/runtime': 5.0.3 '@netlify/static': 4.0.0 @@ -15679,9 +16104,9 @@ snapshots: dependencies: '@netlify/headers-parser': 10.1.1 - '@netlify/images@1.3.12(@netlify/blobs@10.7.13)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.23.0)(postgres@3.4.9)))(srvx@0.11.22)': + '@netlify/images@1.3.12(@netlify/blobs@10.7.13)(@parcel/watcher@2.6.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.23.0)(postgres@3.4.9)))(srvx@0.11.22)': dependencies: - ipx: 3.1.1(@netlify/blobs@10.7.13)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.23.0)(postgres@3.4.9)))(srvx@0.11.22) + ipx: 3.1.1(@netlify/blobs@10.7.13)(@parcel/watcher@2.6.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.23.0)(postgres@3.4.9)))(srvx@0.11.22) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -15705,9 +16130,9 @@ snapshots: - srvx - uploadthing - '@netlify/images@2.0.1(@netlify/blobs@11.0.3)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.22.0)(postgres@3.4.9)))(srvx@0.11.20)': + '@netlify/images@2.0.1(@netlify/blobs@11.0.3)(@parcel/watcher@2.6.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.22.0)(postgres@3.4.9)))(srvx@0.11.20)': dependencies: - ipx: 3.1.1(@netlify/blobs@11.0.3)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.22.0)(postgres@3.4.9)))(srvx@0.11.20) + ipx: 3.1.1(@netlify/blobs@11.0.3)(@parcel/watcher@2.6.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.22.0)(postgres@3.4.9)))(srvx@0.11.20) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -15819,9 +16244,9 @@ snapshots: '@netlify/types@3.0.0': {} - '@netlify/vite-plugin-tanstack-start@1.3.19(@tanstack/react-start@1.168.50(crossws@0.4.8(srvx@0.11.20))(esbuild@0.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rolldown@1.2.7)(rollup@4.62.2)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)))(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.22.0)(postgres@3.4.9)))(rollup@4.62.2)(srvx@0.11.20)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0))': + '@netlify/vite-plugin-tanstack-start@1.3.19(@parcel/watcher@2.6.0)(@tanstack/react-start@1.168.50(crossws@0.4.8(srvx@0.11.20))(esbuild@0.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rolldown@1.2.7)(rollup@4.62.2)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)))(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.22.0)(postgres@3.4.9)))(rollup@4.62.2)(srvx@0.11.20)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0))': dependencies: - '@netlify/vite-plugin': 3.0.1(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.22.0)(postgres@3.4.9)))(rollup@4.62.2)(srvx@0.11.20)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)) + '@netlify/vite-plugin': 3.0.1(@parcel/watcher@2.6.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.22.0)(postgres@3.4.9)))(rollup@4.62.2)(srvx@0.11.20)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)) vite: 7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0) optionalDependencies: '@tanstack/react-start': 1.168.50(crossws@0.4.8(srvx@0.11.20))(esbuild@0.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rolldown@1.2.7)(rollup@4.62.2)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)) @@ -15854,9 +16279,9 @@ snapshots: - supports-color - uploadthing - '@netlify/vite-plugin@2.12.9(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.23.0)(postgres@3.4.9)))(rollup@4.62.2)(srvx@0.11.22)(vite@8.2.2(@types/node@24.13.2)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0))': + '@netlify/vite-plugin@2.12.9(@parcel/watcher@2.6.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.23.0)(postgres@3.4.9)))(rollup@4.62.2)(srvx@0.11.22)(vite@8.2.2(@types/node@24.13.2)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0))': dependencies: - '@netlify/dev': 4.18.13(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.23.0)(postgres@3.4.9)))(rollup@4.62.2)(srvx@0.11.22) + '@netlify/dev': 4.18.13(@parcel/watcher@2.6.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.23.0)(postgres@3.4.9)))(rollup@4.62.2)(srvx@0.11.22) '@netlify/dev-utils': 4.4.7 dedent: 1.7.2 vite: 8.2.2(@types/node@24.13.2)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0) @@ -15889,9 +16314,9 @@ snapshots: - supports-color - uploadthing - '@netlify/vite-plugin@3.0.1(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.22.0)(postgres@3.4.9)))(rollup@4.62.2)(srvx@0.11.20)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0))': + '@netlify/vite-plugin@3.0.1(@parcel/watcher@2.6.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.22.0)(postgres@3.4.9)))(rollup@4.62.2)(srvx@0.11.20)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0))': dependencies: - '@netlify/dev': 5.0.5(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.22.0)(postgres@3.4.9)))(rollup@4.62.2)(srvx@0.11.20) + '@netlify/dev': 5.0.5(@parcel/watcher@2.6.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.22.0)(postgres@3.4.9)))(rollup@4.62.2)(srvx@0.11.20) '@netlify/dev-utils': 6.0.1 dedent: 1.7.2 vite: 7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0) @@ -16338,11 +16763,67 @@ snapshots: '@oxlint/binding-win32-x64-msvc@1.81.0': optional: true + '@parcel/watcher-android-arm64@2.6.0': + optional: true + + '@parcel/watcher-darwin-arm64@2.6.0': + optional: true + + '@parcel/watcher-darwin-x64@2.6.0': + optional: true + + '@parcel/watcher-freebsd-x64@2.6.0': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.6.0': + optional: true + + '@parcel/watcher-linux-arm-musl@2.6.0': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.6.0': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.6.0': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.6.0': + optional: true + + '@parcel/watcher-linux-x64-musl@2.6.0': + optional: true + '@parcel/watcher-wasm@2.6.0': dependencies: is-glob: 4.0.3 picomatch: 4.0.7 + '@parcel/watcher-win32-arm64@2.6.0': + optional: true + + '@parcel/watcher-win32-x64@2.6.0': + optional: true + + '@parcel/watcher@2.6.0': + dependencies: + detect-libc: 2.1.2 + is-glob: 4.0.3 + node-addon-api: 7.1.1 + picomatch: 4.0.7 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.6.0 + '@parcel/watcher-darwin-arm64': 2.6.0 + '@parcel/watcher-darwin-x64': 2.6.0 + '@parcel/watcher-freebsd-x64': 2.6.0 + '@parcel/watcher-linux-arm-glibc': 2.6.0 + '@parcel/watcher-linux-arm-musl': 2.6.0 + '@parcel/watcher-linux-arm64-glibc': 2.6.0 + '@parcel/watcher-linux-arm64-musl': 2.6.0 + '@parcel/watcher-linux-x64-glibc': 2.6.0 + '@parcel/watcher-linux-x64-musl': 2.6.0 + '@parcel/watcher-win32-arm64': 2.6.0 + '@parcel/watcher-win32-x64': 2.6.0 + '@paulirish/trace_engine@0.0.65': dependencies: legacy-javascript: 0.0.1 @@ -16362,6 +16843,11 @@ snapshots: '@phun-ky/typeof@2.0.3': {} + '@pkgjs/parseargs@0.11.0': + optional: true + + '@pkgr/core@0.3.6': {} + '@playwright/test@1.63.0': dependencies: playwright: 1.63.0 @@ -16388,197 +16874,197 @@ snapshots: '@radix-ui/primitive@1.1.7': {} - '@radix-ui/react-collection@1.1.15(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@radix-ui/react-collection@1.1.15(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: - '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.3) - '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.2.3) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-slot': 1.3.3(@types/react@19.2.18)(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.8) + '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.2.8) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-slot': 1.3.3(@types/react@19.2.18)(react@19.2.8) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) optionalDependencies: '@types/react': 19.2.18 '@types/react-dom': 19.2.7(@types/react@19.2.18) - '@radix-ui/react-compose-refs@1.1.5(@types/react@19.2.18)(react@19.2.3)': + '@radix-ui/react-compose-refs@1.1.5(@types/react@19.2.18)(react@19.2.8)': dependencies: - react: 19.2.3 + react: 19.2.8 optionalDependencies: '@types/react': 19.2.18 - '@radix-ui/react-context@1.2.2(@types/react@19.2.18)(react@19.2.3)': + '@radix-ui/react-context@1.2.2(@types/react@19.2.18)(react@19.2.8)': dependencies: - react: 19.2.3 + react: 19.2.8 optionalDependencies: '@types/react': 19.2.18 - '@radix-ui/react-dialog@1.1.23(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@radix-ui/react-dialog@1.1.23(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: '@radix-ui/primitive': 1.1.7 - '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.3) - '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.2.3) - '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-focus-guards': 1.1.6(@types/react@19.2.18)(react@19.2.3) - '@radix-ui/react-focus-scope': 1.1.16(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-id': 1.1.4(@types/react@19.2.18)(react@19.2.3) - '@radix-ui/react-portal': 1.1.17(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-slot': 1.3.3(@types/react@19.2.18)(react@19.2.3) - '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.18)(react@19.2.3) - '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.2.3) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.8) + '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.2.8) + '@radix-ui/react-dismissable-layer': 1.1.19(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-focus-guards': 1.1.6(@types/react@19.2.18)(react@19.2.8) + '@radix-ui/react-focus-scope': 1.1.16(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-id': 1.1.4(@types/react@19.2.18)(react@19.2.8) + '@radix-ui/react-portal': 1.1.17(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-slot': 1.3.3(@types/react@19.2.18)(react@19.2.8) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.18)(react@19.2.8) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.2.8) aria-hidden: 1.2.6 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - react-remove-scroll: 2.7.2(@types/react@19.2.18)(react@19.2.3) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + react-remove-scroll: 2.7.2(@types/react@19.2.18)(react@19.2.8) optionalDependencies: '@types/react': 19.2.18 '@types/react-dom': 19.2.7(@types/react@19.2.18) - '@radix-ui/react-direction@1.1.4(@types/react@19.2.18)(react@19.2.3)': + '@radix-ui/react-direction@1.1.4(@types/react@19.2.18)(react@19.2.8)': dependencies: - react: 19.2.3 + react: 19.2.8 optionalDependencies: '@types/react': 19.2.18 - '@radix-ui/react-dismissable-layer@1.1.19(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@radix-ui/react-dismissable-layer@1.1.19(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: '@radix-ui/primitive': 1.1.7 - '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.3) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.18)(react@19.2.3) - '@radix-ui/react-use-effect-event': 0.0.5(@types/react@19.2.18)(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.8) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.18)(react@19.2.8) + '@radix-ui/react-use-effect-event': 0.0.5(@types/react@19.2.18)(react@19.2.8) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) optionalDependencies: '@types/react': 19.2.18 '@types/react-dom': 19.2.7(@types/react@19.2.18) - '@radix-ui/react-focus-guards@1.1.6(@types/react@19.2.18)(react@19.2.3)': + '@radix-ui/react-focus-guards@1.1.6(@types/react@19.2.18)(react@19.2.8)': dependencies: - react: 19.2.3 + react: 19.2.8 optionalDependencies: '@types/react': 19.2.18 - '@radix-ui/react-focus-scope@1.1.16(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@radix-ui/react-focus-scope@1.1.16(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: - '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.3) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.18)(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.8) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.18)(react@19.2.8) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) optionalDependencies: '@types/react': 19.2.18 '@types/react-dom': 19.2.7(@types/react@19.2.18) - '@radix-ui/react-id@1.1.4(@types/react@19.2.18)(react@19.2.3)': + '@radix-ui/react-id@1.1.4(@types/react@19.2.18)(react@19.2.8)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.2.3) - react: 19.2.3 + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.2.8) + react: 19.2.8 optionalDependencies: '@types/react': 19.2.18 - '@radix-ui/react-portal@1.1.17(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@radix-ui/react-portal@1.1.17(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.2.8) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) optionalDependencies: '@types/react': 19.2.18 '@types/react-dom': 19.2.7(@types/react@19.2.18) - '@radix-ui/react-presence@1.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@radix-ui/react-presence@1.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.2.8) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) optionalDependencies: '@types/react': 19.2.18 '@types/react-dom': 19.2.7(@types/react@19.2.18) - '@radix-ui/react-primitive@2.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@radix-ui/react-primitive@2.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: - '@radix-ui/react-slot': 1.3.3(@types/react@19.2.18)(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + '@radix-ui/react-slot': 1.3.3(@types/react@19.2.18)(react@19.2.8) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) optionalDependencies: '@types/react': 19.2.18 '@types/react-dom': 19.2.7(@types/react@19.2.18) - '@radix-ui/react-roving-focus@1.1.19(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@radix-ui/react-roving-focus@1.1.19(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: '@radix-ui/primitive': 1.1.7 - '@radix-ui/react-collection': 1.1.15(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.3) - '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.2.3) - '@radix-ui/react-direction': 1.1.4(@types/react@19.2.18)(react@19.2.3) - '@radix-ui/react-id': 1.1.4(@types/react@19.2.18)(react@19.2.3) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.18)(react@19.2.3) - '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.18)(react@19.2.3) - '@radix-ui/react-use-is-hydrated': 0.1.3(@types/react@19.2.18)(react@19.2.3) - '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + '@radix-ui/react-collection': 1.1.15(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.8) + '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.2.8) + '@radix-ui/react-direction': 1.1.4(@types/react@19.2.18)(react@19.2.8) + '@radix-ui/react-id': 1.1.4(@types/react@19.2.18)(react@19.2.8) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-use-callback-ref': 1.1.4(@types/react@19.2.18)(react@19.2.8) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.18)(react@19.2.8) + '@radix-ui/react-use-is-hydrated': 0.1.3(@types/react@19.2.18)(react@19.2.8) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.2.8) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) optionalDependencies: '@types/react': 19.2.18 '@types/react-dom': 19.2.7(@types/react@19.2.18) - '@radix-ui/react-slot@1.3.3(@types/react@19.2.18)(react@19.2.3)': + '@radix-ui/react-slot@1.3.3(@types/react@19.2.18)(react@19.2.8)': dependencies: - '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.3) - react: 19.2.3 + '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.18)(react@19.2.8) + react: 19.2.8 optionalDependencies: '@types/react': 19.2.18 - '@radix-ui/react-tabs@1.1.21(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@radix-ui/react-tabs@1.1.21(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: '@radix-ui/primitive': 1.1.7 - '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.2.3) - '@radix-ui/react-direction': 1.1.4(@types/react@19.2.18)(react@19.2.3) - '@radix-ui/react-id': 1.1.4(@types/react@19.2.18)(react@19.2.3) - '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-roving-focus': 1.1.19(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.18)(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + '@radix-ui/react-context': 1.2.2(@types/react@19.2.18)(react@19.2.8) + '@radix-ui/react-direction': 1.1.4(@types/react@19.2.18)(react@19.2.8) + '@radix-ui/react-id': 1.1.4(@types/react@19.2.18)(react@19.2.8) + '@radix-ui/react-presence': 1.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-primitive': 2.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-roving-focus': 1.1.19(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-use-controllable-state': 1.2.6(@types/react@19.2.18)(react@19.2.8) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) optionalDependencies: '@types/react': 19.2.18 '@types/react-dom': 19.2.7(@types/react@19.2.18) - '@radix-ui/react-use-callback-ref@1.1.4(@types/react@19.2.18)(react@19.2.3)': + '@radix-ui/react-use-callback-ref@1.1.4(@types/react@19.2.18)(react@19.2.8)': dependencies: - react: 19.2.3 + react: 19.2.8 optionalDependencies: '@types/react': 19.2.18 - '@radix-ui/react-use-controllable-state@1.2.6(@types/react@19.2.18)(react@19.2.3)': + '@radix-ui/react-use-controllable-state@1.2.6(@types/react@19.2.18)(react@19.2.8)': dependencies: '@radix-ui/primitive': 1.1.7 - '@radix-ui/react-use-effect-event': 0.0.5(@types/react@19.2.18)(react@19.2.3) - '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.2.3) - react: 19.2.3 + '@radix-ui/react-use-effect-event': 0.0.5(@types/react@19.2.18)(react@19.2.8) + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.2.8) + react: 19.2.8 optionalDependencies: '@types/react': 19.2.18 - '@radix-ui/react-use-effect-event@0.0.5(@types/react@19.2.18)(react@19.2.3)': + '@radix-ui/react-use-effect-event@0.0.5(@types/react@19.2.18)(react@19.2.8)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.2.3) - react: 19.2.3 + '@radix-ui/react-use-layout-effect': 1.1.4(@types/react@19.2.18)(react@19.2.8) + react: 19.2.8 optionalDependencies: '@types/react': 19.2.18 - '@radix-ui/react-use-is-hydrated@0.1.3(@types/react@19.2.18)(react@19.2.3)': + '@radix-ui/react-use-is-hydrated@0.1.3(@types/react@19.2.18)(react@19.2.8)': dependencies: - react: 19.2.3 + react: 19.2.8 optionalDependencies: '@types/react': 19.2.18 - '@radix-ui/react-use-layout-effect@1.1.4(@types/react@19.2.18)(react@19.2.3)': + '@radix-ui/react-use-layout-effect@1.1.4(@types/react@19.2.18)(react@19.2.8)': dependencies: - react: 19.2.3 + react: 19.2.8 optionalDependencies: '@types/react': 19.2.18 @@ -16715,25 +17201,17 @@ snapshots: dependencies: react: 19.2.3 - '@react-native-async-storage/async-storage@2.2.0(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))': + '@react-native-async-storage/async-storage@2.2.0(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))': dependencies: merge-options: 3.0.4 - react-native: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) + react-native: 0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8) - '@react-native-masked-view/masked-view@0.3.2(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)': + '@react-native-masked-view/masked-view@0.3.2(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)': dependencies: - react: 19.2.3 - react-native: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) - - '@react-native/assets-registry@0.85.3': {} + react: 19.2.8 + react-native: 0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8) - '@react-native/babel-plugin-codegen@0.85.3(@babel/core@7.29.7)': - dependencies: - '@babel/traverse': 7.29.8 - '@react-native/codegen': 0.85.3(@babel/core@7.29.7) - transitivePeerDependencies: - - '@babel/core' - - supports-color + '@react-native/assets-registry@0.86.3': {} '@react-native/babel-plugin-codegen@0.86.3(@babel/core@7.29.7)': dependencies: @@ -16743,7 +17221,7 @@ snapshots: - '@babel/core' - supports-color - '@react-native/babel-preset@0.85.3(@babel/core@7.29.7)': + '@react-native/babel-preset@0.86.3(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 '@babel/plugin-proposal-export-default-from': 7.29.7(@babel/core@7.29.7) @@ -16774,23 +17252,13 @@ snapshots: '@babel/plugin-transform-runtime': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.7) - '@react-native/babel-plugin-codegen': 0.85.3(@babel/core@7.29.7) - babel-plugin-syntax-hermes-parser: 0.33.3 + '@react-native/babel-plugin-codegen': 0.86.3(@babel/core@7.29.7) + babel-plugin-syntax-hermes-parser: 0.36.0 babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.29.7) react-refresh: 0.14.2 transitivePeerDependencies: - supports-color - '@react-native/codegen@0.85.3(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/parser': 7.29.8 - hermes-parser: 0.33.3 - invariant: 2.2.4 - nullthrows: 1.1.1 - tinyglobby: 0.2.17 - yargs: 17.7.3 - '@react-native/codegen@0.86.3(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 @@ -16801,9 +17269,9 @@ snapshots: tinyglobby: 0.2.17 yargs: 17.7.3 - '@react-native/community-cli-plugin@0.85.3(@react-native/metro-config@0.85.3(@babel/core@7.29.7))': + '@react-native/community-cli-plugin@0.86.3(@react-native/metro-config@0.86.3(@babel/core@7.29.7))': dependencies: - '@react-native/dev-middleware': 0.85.3 + '@react-native/dev-middleware': 0.86.3 debug: 4.4.3 invariant: 2.2.4 metro: 0.84.5 @@ -16811,24 +17279,14 @@ snapshots: metro-core: 0.84.5 semver: 7.8.5 optionalDependencies: - '@react-native/metro-config': 0.85.3(@babel/core@7.29.7) + '@react-native/metro-config': 0.86.3(@babel/core@7.29.7) transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@react-native/debugger-frontend@0.85.3': {} - '@react-native/debugger-frontend@0.86.3': {} - '@react-native/debugger-shell@0.85.3': - dependencies: - cross-spawn: 7.0.6 - debug: 4.4.3 - fb-dotslash: 0.5.8 - transitivePeerDependencies: - - supports-color - '@react-native/debugger-shell@0.86.3': dependencies: cross-spawn: 7.0.6 @@ -16837,25 +17295,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@react-native/dev-middleware@0.85.3': - dependencies: - '@isaacs/ttlcache': 1.4.1 - '@react-native/debugger-frontend': 0.85.3 - '@react-native/debugger-shell': 0.85.3 - chrome-launcher: 0.15.2 - chromium-edge-launcher: 0.3.0 - connect: 3.7.0 - debug: 4.4.3 - invariant: 2.2.4 - nullthrows: 1.1.1 - open: 7.4.2 - serve-static: 1.16.3 - ws: 7.5.13 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - '@react-native/dev-middleware@0.86.3': dependencies: '@isaacs/ttlcache': 1.4.1 @@ -16875,37 +17314,37 @@ snapshots: - supports-color - utf-8-validate - '@react-native/gradle-plugin@0.85.3': {} + '@react-native/gradle-plugin@0.86.3': {} - '@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3)': + '@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8)': dependencies: '@jest/create-cache-key-function': 29.7.0 - '@react-native/js-polyfills': 0.85.3 + '@react-native/js-polyfills': 0.86.3 babel-jest: 29.7.0(@babel/core@7.29.7) jest-environment-node: 29.7.0 - react: 19.2.3 + react: 19.2.8 regenerator-runtime: 0.13.11 transitivePeerDependencies: - '@babel/core' - supports-color - '@react-native/js-polyfills@0.85.3': {} + '@react-native/js-polyfills@0.86.3': {} - '@react-native/metro-babel-transformer@0.85.3(@babel/core@7.29.7)': + '@react-native/metro-babel-transformer@0.86.3(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@react-native/babel-preset': 0.85.3(@babel/core@7.29.7) - hermes-parser: 0.33.3 + '@react-native/babel-preset': 0.86.3(@babel/core@7.29.7) + hermes-parser: 0.36.0 nullthrows: 1.1.1 transitivePeerDependencies: - supports-color - '@react-native/metro-config@0.85.3(@babel/core@7.29.7)': + '@react-native/metro-config@0.86.3(@babel/core@7.29.7)': dependencies: - '@react-native/js-polyfills': 0.85.3 - '@react-native/metro-babel-transformer': 0.85.3(@babel/core@7.29.7) - metro-config: 0.84.6 - metro-runtime: 0.84.6 + '@react-native/js-polyfills': 0.86.3 + '@react-native/metro-babel-transformer': 0.86.3(@babel/core@7.29.7) + metro-config: 0.84.5 + metro-runtime: 0.84.5 transitivePeerDependencies: - '@babel/core' - bufferutil @@ -16914,16 +17353,14 @@ snapshots: '@react-native/normalize-colors@0.74.89': {} - '@react-native/normalize-colors@0.85.3': {} - '@react-native/normalize-colors@0.86.3': {} - '@react-native/virtualized-lists@0.85.3(@types/react@19.2.18)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)': + '@react-native/virtualized-lists@0.86.3(@types/react@19.2.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)': dependencies: invariant: 2.2.4 nullthrows: 1.1.1 - react: 19.2.3 - react-native: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) + react: 19.2.8 + react-native: 0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8) optionalDependencies: '@types/react': 19.2.18 @@ -17290,6 +17727,10 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.1 + '@sinonjs/fake-timers@15.4.0': + dependencies: + '@sinonjs/commons': 3.0.1 + '@so-ric/colorspace@1.1.6': dependencies: color: 5.0.3 @@ -17630,17 +18071,17 @@ snapshots: '@tanstack/virtual-file-routes@1.162.0': {} - '@testing-library/react-native@13.3.3(jest@29.7.0(@types/node@26.1.0))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react-test-renderer@19.2.3(react@19.2.3))(react@19.2.3)': + '@testing-library/react-native@14.0.1(jest@30.5.1(@types/node@26.4.1))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(test-renderer@1.2.0(@types/react@19.2.18)(react@19.2.8))': dependencies: jest-matcher-utils: 30.4.1 picocolors: 1.1.1 pretty-format: 30.4.1 - react: 19.2.3 - react-native: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) - react-test-renderer: 19.2.3(react@19.2.3) + react: 19.2.8 + react-native: 0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8) redent: 3.0.0 + test-renderer: 1.2.0(@types/react@19.2.18)(react@19.2.8) optionalDependencies: - jest: 29.7.0(@types/node@26.1.0) + jest: 30.5.1(@types/node@26.4.1) '@tootallnate/once@2.0.1': {} @@ -17754,14 +18195,14 @@ snapshots: dependencies: '@types/istanbul-lib-report': 3.0.3 - '@types/jest@29.5.14': + '@types/jest@30.0.0': dependencies: - expect: 29.7.0 - pretty-format: 29.7.0 + expect: 30.5.1 + pretty-format: 30.4.1 '@types/jsdom@20.0.1': dependencies: - '@types/node': 26.1.0 + '@types/node': 26.4.1 '@types/tough-cookie': 4.0.5 parse5: 7.3.0 @@ -17777,10 +18218,6 @@ snapshots: dependencies: undici-types: 7.18.2 - '@types/node@26.1.0': - dependencies: - undici-types: 8.3.0 - '@types/node@26.4.1': dependencies: undici-types: 8.3.0 @@ -17801,6 +18238,10 @@ snapshots: dependencies: '@types/react': 19.2.18 + '@types/react-reconciler@0.33.0(@types/react@19.2.18)': + dependencies: + '@types/react': 19.2.18 + '@types/react-test-renderer@19.1.0': dependencies: '@types/react': 19.2.18 @@ -17938,6 +18379,76 @@ snapshots: '@ungap/structured-clone@1.4.0': {} + '@unrs/resolver-binding-android-arm-eabi@1.12.2': + optional: true + + '@unrs/resolver-binding-android-arm64@1.12.2': + optional: true + + '@unrs/resolver-binding-darwin-arm64@1.12.2': + optional: true + + '@unrs/resolver-binding-darwin-x64@1.12.2': + optional: true + + '@unrs/resolver-binding-freebsd-x64@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-arm-musleabihf@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-arm64-gnu@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-arm64-musl@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-loong64-gnu@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-loong64-musl@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-ppc64-gnu@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-riscv64-gnu@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-riscv64-musl@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-s390x-gnu@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-x64-gnu@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-x64-musl@1.12.2': + optional: true + + '@unrs/resolver-binding-openharmony-arm64@1.12.2': + optional: true + + '@unrs/resolver-binding-wasm32-wasi@1.12.2': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.2.3(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + optional: true + + '@unrs/resolver-binding-win32-arm64-msvc@1.12.2': + optional: true + + '@unrs/resolver-binding-win32-ia32-msvc@1.12.2': + optional: true + + '@unrs/resolver-binding-win32-x64-msvc@1.12.2': + optional: true + '@vercel/nft@1.11.0(rollup@4.62.2)': dependencies: '@mapbox/node-pre-gyp': 2.0.3 @@ -18000,62 +18511,34 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitest/expect@4.1.9': - dependencies: - '@standard-schema/spec': 1.1.0 - '@types/chai': 5.2.3 - '@vitest/spy': 4.1.9 - '@vitest/utils': 4.1.9 - chai: 6.2.2 - tinyrainbow: 3.1.0 - - '@vitest/mocker@4.1.9(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0))': + '@vitest/mocker@5.0.0(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0))': dependencies: - '@vitest/spy': 4.1.9 + '@jridgewell/trace-mapping': 0.3.31 + '@vitest/spy': 5.0.0 estree-walker: 3.0.3 - magic-string: 0.30.21 + magic-string: 1.2.3 optionalDependencies: vite: 7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0) - '@vitest/mocker@4.1.9(vite@8.2.2(@types/node@24.13.2)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0))': + '@vitest/mocker@5.0.0(vite@8.2.2(@types/node@24.13.2)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0))': dependencies: - '@vitest/spy': 4.1.9 + '@jridgewell/trace-mapping': 0.3.31 + '@vitest/spy': 5.0.0 estree-walker: 3.0.3 - magic-string: 0.30.21 + magic-string: 1.2.3 optionalDependencies: vite: 8.2.2(@types/node@24.13.2)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0) - '@vitest/mocker@4.1.9(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0))': + '@vitest/mocker@5.0.0(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0))': dependencies: - '@vitest/spy': 4.1.9 + '@jridgewell/trace-mapping': 0.3.31 + '@vitest/spy': 5.0.0 estree-walker: 3.0.3 - magic-string: 0.30.21 + magic-string: 1.2.3 optionalDependencies: vite: 8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0) - '@vitest/pretty-format@4.1.9': - dependencies: - tinyrainbow: 3.1.0 - - '@vitest/runner@4.1.9': - dependencies: - '@vitest/utils': 4.1.9 - pathe: 2.0.3 - - '@vitest/snapshot@4.1.9': - dependencies: - '@vitest/pretty-format': 4.1.9 - '@vitest/utils': 4.1.9 - magic-string: 0.30.21 - pathe: 2.0.3 - - '@vitest/spy@4.1.9': {} - - '@vitest/utils@4.1.9': - dependencies: - '@vitest/pretty-format': 4.1.9 - convert-source-map: 2.0.0 - tinyrainbow: 3.1.0 + '@vitest/spy@5.0.0': {} '@volar/kit@2.4.28(typescript@5.9.3)': dependencies: @@ -18203,8 +18686,6 @@ snapshots: dependencies: acorn: 8.18.0 - acorn@8.17.0: {} - acorn@8.18.0: {} agent-base@6.0.2: @@ -18514,6 +18995,19 @@ snapshots: transitivePeerDependencies: - supports-color + babel-jest@30.5.1(@babel/core@7.29.7): + dependencies: + '@babel/core': 7.29.7 + '@jest/transform': 30.5.1 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 8.0.0 + babel-preset-jest: 30.5.0(@babel/core@7.29.7) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + babel-plugin-istanbul@6.1.1: dependencies: '@babel/helper-plugin-utils': 7.29.7 @@ -18524,6 +19018,16 @@ snapshots: transitivePeerDependencies: - supports-color + babel-plugin-istanbul@8.0.0: + dependencies: + '@babel/helper-plugin-utils': 7.29.7 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.6 + istanbul-lib-instrument: 6.0.3 + test-exclude: 7.0.2 + transitivePeerDependencies: + - supports-color + babel-plugin-jest-hoist@29.6.3: dependencies: '@babel/template': 7.29.7 @@ -18531,6 +19035,10 @@ snapshots: '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.28.0 + babel-plugin-jest-hoist@30.5.0: + dependencies: + '@types/babel__core': 7.20.5 + babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.29.7): dependencies: '@babel/compat-data': 7.29.7 @@ -18561,9 +19069,9 @@ snapshots: babel-plugin-react-native-web@0.21.2: {} - babel-plugin-syntax-hermes-parser@0.33.3: + babel-plugin-syntax-hermes-parser@0.36.0: dependencies: - hermes-parser: 0.33.3 + hermes-parser: 0.36.0 babel-plugin-syntax-hermes-parser@0.36.1: dependencies: @@ -18641,7 +19149,7 @@ snapshots: react-refresh: 0.14.2 optionalDependencies: '@babel/runtime': 7.29.7 - expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.8(react@19.2.8))(react-native-web@0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3) transitivePeerDependencies: - '@babel/core' - supports-color @@ -18693,7 +19201,7 @@ snapshots: react-refresh: 0.18.0 optionalDependencies: '@babel/runtime': 7.29.7 - expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.8(react@19.2.8))(react-native-web@0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3) transitivePeerDependencies: - '@babel/core' - supports-color @@ -18704,6 +19212,12 @@ snapshots: babel-plugin-jest-hoist: 29.6.3 babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.7) + babel-preset-jest@30.5.0(@babel/core@7.29.7): + dependencies: + '@babel/core': 7.29.7 + babel-plugin-jest-hoist: 30.5.0 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.7) + bail@2.0.2: {} balanced-match@1.0.2: {} @@ -18762,7 +19276,7 @@ snapshots: jsonpointer: 5.0.1 leven: 3.1.0 - better-auth@1.4.21(@prisma/client@5.22.0)(@tanstack/react-start@1.168.50(crossws@0.4.8(srvx@0.11.20))(esbuild@0.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rolldown@1.2.7)(rollup@4.62.2)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)))(better-sqlite3@12.11.1)(drizzle-kit@0.31.10)(drizzle-orm@0.41.0(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.22.0)(postgres@3.4.9))(pg@8.22.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vitest@4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(jsdom@20.0.3)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0))): + better-auth@1.4.21(@prisma/client@5.22.0)(@tanstack/react-start@1.168.50(crossws@0.4.8(srvx@0.11.20))(esbuild@0.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rolldown@1.2.7)(rollup@4.62.2)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)))(better-sqlite3@12.11.1)(drizzle-kit@0.31.10)(drizzle-orm@0.41.0(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.22.0)(postgres@3.4.9))(pg@8.22.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vitest@5.0.0(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(jsdom@20.0.3)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0))): dependencies: '@better-auth/core': 1.4.21(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@4.4.3))(jose@6.2.12)(kysely@0.28.17)(nanostores@1.5.3) '@better-auth/telemetry': 1.4.21(@better-auth/core@1.4.21(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@4.4.3))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3)) @@ -18785,9 +19299,9 @@ snapshots: pg: 8.22.0 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) - vitest: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(jsdom@20.0.3)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)) + vitest: 5.0.0(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(jsdom@20.0.3)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)) - better-auth@1.7.3(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@tanstack/react-start@1.168.50(crossws@0.4.8(srvx@0.11.20))(esbuild@0.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rolldown@1.2.7)(rollup@4.62.2)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)))(better-sqlite3@12.11.1)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.22.0)(postgres@3.4.9))(pg@8.22.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vitest@4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(jsdom@20.0.3)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0))): + better-auth@1.7.3(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@tanstack/react-start@1.168.50(crossws@0.4.8(srvx@0.11.20))(esbuild@0.28.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rolldown@1.2.7)(rollup@4.62.2)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)))(better-sqlite3@12.11.1)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.22.0)(postgres@3.4.9))(pg@8.22.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vitest@5.0.0(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(jsdom@20.0.3)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0))): dependencies: '@better-auth/core': 1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.5.4))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3) '@better-auth/drizzle-adapter': 1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.1.21)(@opentelemetry/api@1.9.1)(better-call@1.1.8(zod@4.4.3))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.22.0)(postgres@3.4.9)) @@ -18815,7 +19329,7 @@ snapshots: pg: 8.22.0 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) - vitest: 4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(jsdom@20.0.3)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)) + vitest: 5.0.0(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(jsdom@20.0.3)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)) transitivePeerDependencies: - '@cloudflare/workers-types' - '@opentelemetry/api' @@ -18889,6 +19403,10 @@ snapshots: balanced-match: 1.0.2 concat-map: 0.0.1 + brace-expansion@2.1.4: + dependencies: + balanced-match: 1.0.2 + brace-expansion@5.0.9: dependencies: balanced-match: 4.0.4 @@ -19109,8 +19627,6 @@ snapshots: citty@0.2.2: {} - cjs-module-lexer@1.4.3: {} - cjs-module-lexer@2.2.1: {} cli-cursor@2.1.0: @@ -19380,21 +19896,6 @@ snapshots: crc-32: 1.2.2 readable-stream: 4.7.0 - create-jest@29.7.0(@types/node@26.1.0): - dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@26.1.0) - jest-util: 29.7.0 - prompts: 2.4.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - cron-parser@4.9.0: dependencies: luxon: 3.7.2 @@ -19803,6 +20304,8 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 + eastasianwidth@0.2.0: {} + ecdsa-sig-formatter@1.0.11: dependencies: safe-buffer: 5.2.1 @@ -19824,6 +20327,8 @@ snapshots: emoji-regex@8.0.0: {} + emoji-regex@9.2.2: {} + empathic@2.0.1: {} enabled@2.0.0: {} @@ -19961,8 +20466,6 @@ snapshots: es-module-lexer@1.7.0: {} - es-module-lexer@2.3.0: {} - es-module-lexer@2.3.2: {} es-object-atoms@1.1.2: @@ -20175,7 +20678,7 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 - exit@0.1.2: {} + exit-x@0.2.2: {} expand-template@2.0.3: {} @@ -20189,126 +20692,135 @@ snapshots: jest-message-util: 29.7.0 jest-util: 29.7.0 + expect@30.5.1: + dependencies: + '@jest/expect-utils': 30.5.1 + '@jest/get-type': 30.5.0 + jest-matcher-utils: 30.5.1 + jest-message-util: 30.5.1 + jest-mock: 30.5.1 + jest-util: 30.5.1 + expo-application@57.0.2(expo@57.0.20): dependencies: - expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.8(react@19.2.8))(react-native-web@0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3) - expo-asset@57.0.16(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3): + expo-asset@57.0.16(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3): dependencies: '@expo/image-utils': 0.11.5(typescript@6.0.3) - expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) - expo-constants: 57.0.17(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3)) - react: 19.2.3 - react-native: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) + expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.8(react@19.2.8))(react-native-web@0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3) + expo-constants: 57.0.17(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8)) + react: 19.2.8 + react-native: 0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8) transitivePeerDependencies: - supports-color - typescript - expo-constants@57.0.17(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3)): + expo-constants@57.0.17(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8)): dependencies: '@expo/env': 2.4.3 - expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) - react-native: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) + expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.8(react@19.2.8))(react-native-web@0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3) + react-native: 0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8) transitivePeerDependencies: - supports-color expo-crypto@57.0.2(expo@57.0.20): dependencies: - expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.8(react@19.2.8))(react-native-web@0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3) - expo-dev-client@57.0.18(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3)): + expo-dev-client@57.0.18(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8)): dependencies: - expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) - expo-dev-launcher: 57.0.19(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3)) - expo-dev-menu: 57.0.18(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3)) + expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.8(react@19.2.8))(react-native-web@0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3) + expo-dev-launcher: 57.0.19(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8)) + expo-dev-menu: 57.0.18(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8)) expo-dev-menu-interface: 57.0.0(expo@57.0.20) expo-manifests: 57.0.1(expo@57.0.20) expo-updates-interface: 57.0.1(expo@57.0.20) transitivePeerDependencies: - react-native - expo-dev-launcher@57.0.19(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3)): + expo-dev-launcher@57.0.19(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8)): dependencies: '@expo/schema-utils': 57.0.2 - expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) - expo-dev-menu: 57.0.18(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3)) + expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.8(react@19.2.8))(react-native-web@0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3) + expo-dev-menu: 57.0.18(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8)) expo-manifests: 57.0.1(expo@57.0.20) - react-native: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) + react-native: 0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8) expo-dev-menu-interface@57.0.0(expo@57.0.20): dependencies: - expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.8(react@19.2.8))(react-native-web@0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3) - expo-dev-menu@57.0.18(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3)): + expo-dev-menu@57.0.18(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8)): dependencies: - expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.8(react@19.2.8))(react-native-web@0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3) expo-dev-menu-interface: 57.0.0(expo@57.0.20) - react-native: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) + react-native: 0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8) expo-device@57.0.1(expo@57.0.20): dependencies: - expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.8(react@19.2.8))(react-native-web@0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3) ua-parser-js: 0.7.41 expo-eas-client@57.0.3: {} - expo-file-system@57.0.6(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3)): + expo-file-system@57.0.6(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8)): dependencies: - expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) - react-native: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) + expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.8(react@19.2.8))(react-native-web@0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3) + react-native: 0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8) - expo-font@57.0.3(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3): + expo-font@57.0.3(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8): dependencies: - expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.8(react@19.2.8))(react-native-web@0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3) fontfaceobserver: 2.3.0 - react: 19.2.3 - react-native: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) + react: 19.2.8 + react-native: 0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8) - expo-glass-effect@57.0.1(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3): + expo-glass-effect@57.0.1(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8): dependencies: - expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) - react: 19.2.3 - react-native: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) + expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.8(react@19.2.8))(react-native-web@0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3) + react: 19.2.8 + react-native: 0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8) expo-haptics@57.0.2(expo@57.0.20): dependencies: - expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.8(react@19.2.8))(react-native-web@0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3) - expo-image@57.0.4(expo@57.0.20)(react-native-web@0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3): + expo-image@57.0.4(expo@57.0.20)(react-native-web@0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8): dependencies: - expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) - react: 19.2.3 - react-native: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) + expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.8(react@19.2.8))(react-native-web@0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3) + react: 19.2.8 + react-native: 0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8) sf-symbols-typescript: 2.2.0 optionalDependencies: - react-native-web: 0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + react-native-web: 0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) expo-json-utils@57.0.1: {} - expo-keep-awake@57.0.1(expo@57.0.20)(react@19.2.3): + expo-keep-awake@57.0.1(expo@57.0.20)(react@19.2.8): dependencies: - expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) - react: 19.2.3 + expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.8(react@19.2.8))(react-native-web@0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3) + react: 19.2.8 - expo-linking@57.0.9(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3): + expo-linking@57.0.9(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8): dependencies: - expo-constants: 57.0.17(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3)) + expo-constants: 57.0.17(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8)) invariant: 2.2.4 - react: 19.2.3 - react-native: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) + react: 19.2.8 + react-native: 0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8) transitivePeerDependencies: - expo - supports-color - expo-localization@57.0.1(expo@57.0.20)(react@19.2.3): + expo-localization@57.0.1(expo@57.0.20)(react@19.2.8): dependencies: - expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) - react: 19.2.3 + expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.8(react@19.2.8))(react-native-web@0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3) + react: 19.2.8 rtl-detect: 1.1.2 expo-manifests@57.0.1(expo@57.0.20): dependencies: - expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.8(react@19.2.8))(react-native-web@0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3) expo-json-utils: 57.0.1 expo-modules-autolinking@57.0.12(typescript@6.0.3): @@ -20321,61 +20833,61 @@ snapshots: - supports-color - typescript - expo-modules-core@57.0.16(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3): + expo-modules-core@57.0.16(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8): dependencies: '@expo/expo-modules-macros-plugin': 0.6.1 - expo-modules-jsi: 57.0.8(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3)) + expo-modules-jsi: 57.0.8(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8)) invariant: 2.2.4 - react: 19.2.3 - react-native: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) + react: 19.2.8 + react-native: 0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8) optionalDependencies: - react-native-worklets: 0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) + react-native-worklets: 0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) - expo-modules-jsi@57.0.8(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3)): + expo-modules-jsi@57.0.8(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8)): dependencies: - react-native: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) + react-native: 0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8) - expo-router@57.0.19(16f7296de013c3d4a93c1733f9fcfb8f): + expo-router@57.0.19(e35e5e20434eb6ba82cd6cc8e8e72f51): dependencies: - '@expo/log-box': 57.0.4(@expo/dom-webview@56.0.6)(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) - '@expo/metro-runtime': 57.0.15(@expo/log-box@57.0.4)(expo@57.0.20)(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) + '@expo/log-box': 57.0.4(@expo/dom-webview@56.0.6)(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) + '@expo/metro-runtime': 57.0.15(@expo/log-box@57.0.4)(expo@57.0.20)(react-dom@19.2.8(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) '@expo/schema-utils': 57.0.2 - '@expo/ui': 57.0.16(@babel/core@7.29.7)(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(expo@57.0.20)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) - '@radix-ui/react-slot': 1.3.3(@types/react@19.2.18)(react@19.2.3) - '@radix-ui/react-tabs': 1.1.21(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@react-native-masked-view/masked-view': 0.3.2(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) + '@expo/ui': 57.0.16(@babel/core@7.29.7)(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(expo@57.0.20)(react-dom@19.2.8(react@19.2.8))(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) + '@radix-ui/react-slot': 1.3.3(@types/react@19.2.18)(react@19.2.8) + '@radix-ui/react-tabs': 1.1.21(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@react-native-masked-view/masked-view': 0.3.2(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) client-only: 0.0.1 color: 4.2.3 debug: 4.4.3 escape-string-regexp: 4.0.0 - expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) - expo-constants: 57.0.17(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3)) - expo-glass-effect: 57.0.1(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) - expo-linking: 57.0.9(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) + expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.8(react@19.2.8))(react-native-web@0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3) + expo-constants: 57.0.17(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8)) + expo-glass-effect: 57.0.1(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) + expo-linking: 57.0.9(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) expo-server: 57.0.3 - expo-symbols: 57.0.2(expo-font@57.0.3)(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) + expo-symbols: 57.0.2(expo-font@57.0.3)(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) fast-deep-equal: 3.1.3 invariant: 2.2.4 nanoid: 3.3.18 query-string: 7.1.3 - react: 19.2.3 + react: 19.2.8 react-fast-compare: 3.2.2 react-is: 19.2.8 - react-native: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) - react-native-drawer-layout: 4.2.10(456a38f2a1c7dc6b4f8696531aa746f7) - react-native-safe-area-context: 5.7.0(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) - react-native-screens: 4.25.2(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) + react-native: 0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8) + react-native-drawer-layout: 4.2.10(654c91a891bbc8c7d043c1e7d26714c1) + react-native-safe-area-context: 5.9.1(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) + react-native-screens: 4.27.0(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) server-only: 0.0.1 sf-symbols-typescript: 2.2.0 shallowequal: 1.1.0 standard-navigation: 0.0.5 - vaul: 1.1.2(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + vaul: 1.1.2(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) optionalDependencies: - '@testing-library/react-native': 13.3.3(jest@29.7.0(@types/node@26.1.0))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react-test-renderer@19.2.3(react@19.2.3))(react@19.2.3) - react-dom: 19.2.3(react@19.2.3) - react-native-gesture-handler: 3.2.1(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) - react-native-reanimated: 4.3.1(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) - react-native-web: 0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@testing-library/react-native': 14.0.1(jest@30.5.1(@types/node@26.4.1))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(test-renderer@1.2.0(@types/react@19.2.18)(react@19.2.8)) + react-dom: 19.2.8(react@19.2.8) + react-native-gesture-handler: 3.2.1(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) + react-native-reanimated: 4.6.0(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) + react-native-web: 0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) transitivePeerDependencies: - '@babel/core' - '@types/react' @@ -20386,14 +20898,14 @@ snapshots: expo-server@57.0.3: {} - expo-sharing@57.0.18(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3): + expo-sharing@57.0.18(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3): dependencies: '@expo/config-plugins': 57.0.9(typescript@6.0.3) '@expo/config-types': 57.0.2 '@expo/plist': 0.8.1 - expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) - react: 19.2.3 - react-native: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) + expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.8(react@19.2.8))(react-native-web@0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3) + react: 19.2.8 + react-native: 0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8) transitivePeerDependencies: - supports-color - typescript @@ -20402,50 +20914,50 @@ snapshots: dependencies: '@expo/config-plugins': 57.0.9(typescript@6.0.3) '@expo/image-utils': 0.11.5(typescript@6.0.3) - expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.8(react@19.2.8))(react-native-web@0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3) xml2js: 0.6.0 transitivePeerDependencies: - supports-color - typescript - expo-status-bar@57.0.1(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3): + expo-status-bar@57.0.1(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8): dependencies: - expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) - react: 19.2.3 - react-native: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) + expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.8(react@19.2.8))(react-native-web@0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3) + react: 19.2.8 + react-native: 0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8) - expo-store-review@57.0.2(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3)): + expo-store-review@57.0.2(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8)): dependencies: - expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) - react-native: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) + expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.8(react@19.2.8))(react-native-web@0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3) + react-native: 0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8) expo-structured-headers@57.0.0: {} - expo-symbols@57.0.2(expo-font@57.0.3)(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3): + expo-symbols@57.0.2(expo-font@57.0.3)(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8): dependencies: '@expo-google-fonts/material-symbols': 0.4.45 - expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) - expo-font: 57.0.3(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) - react: 19.2.3 - react-native: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) + expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.8(react@19.2.8))(react-native-web@0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3) + expo-font: 57.0.3(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) + react: 19.2.8 + react-native: 0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8) sf-symbols-typescript: 2.2.0 - expo-system-ui@57.0.3(expo@57.0.20)(react-native-web@0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3)): + expo-system-ui@57.0.3(expo@57.0.20)(react-native-web@0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8)): dependencies: '@react-native/normalize-colors': 0.86.3 debug: 4.4.3 - expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) - react-native: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) + expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.8(react@19.2.8))(react-native-web@0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3) + react-native: 0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8) optionalDependencies: - react-native-web: 0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + react-native-web: 0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) transitivePeerDependencies: - supports-color expo-updates-interface@57.0.1(expo@57.0.20): dependencies: - expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.8(react@19.2.8))(react-native-web@0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3) - expo-updates@57.0.21(expo-dev-client@57.0.18(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3)))(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3): + expo-updates@57.0.21(expo-dev-client@57.0.18(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8)))(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8): dependencies: '@expo/code-signing-certificates': 0.0.6 '@expo/plist': 0.8.1 @@ -20453,7 +20965,7 @@ snapshots: arg: 4.1.3 chalk: 4.1.2 debug: 4.4.3 - expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.8(react@19.2.8))(react-native-web@0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3) expo-eas-client: 57.0.3 expo-manifests: 57.0.1(expo@57.0.20) expo-structured-headers: 57.0.0 @@ -20462,45 +20974,45 @@ snapshots: glob: 13.0.6 ignore: 5.3.2 nullthrows: 1.1.1 - react: 19.2.3 - react-native: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) + react: 19.2.8 + react-native: 0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8) resolve-from: 5.0.0 optionalDependencies: - expo-dev-client: 57.0.18(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3)) + expo-dev-client: 57.0.18(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8)) transitivePeerDependencies: - supports-color - expo@57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3): + expo@57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.8(react@19.2.8))(react-native-web@0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3): dependencies: '@babel/runtime': 7.29.7 - '@expo/cli': 57.0.22(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-constants@57.0.17)(expo-font@57.0.3)(expo-router@57.0.19)(expo@57.0.20)(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + '@expo/cli': 57.0.22(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-constants@57.0.17)(expo-font@57.0.3)(expo-router@57.0.19)(expo@57.0.20)(react-dom@19.2.8(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3) '@expo/config': 57.0.9(typescript@6.0.3) '@expo/config-plugins': 57.0.9(typescript@6.0.3) - '@expo/devtools': 57.0.1(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) + '@expo/devtools': 57.0.1(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) '@expo/fingerprint': 0.20.12 '@expo/local-build-cache-provider': 57.0.8(typescript@6.0.3) - '@expo/log-box': 57.0.4(@expo/dom-webview@56.0.6)(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) + '@expo/log-box': 57.0.4(@expo/dom-webview@56.0.6)(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) '@expo/metro': 56.0.2 '@expo/metro-config': 57.0.12(expo@57.0.20)(typescript@6.0.3) '@ungap/structured-clone': 1.4.0 babel-preset-expo: 57.0.10(@babel/core@7.29.7)(@babel/runtime@7.29.7)(expo@57.0.20)(react-refresh@0.14.2) - expo-asset: 57.0.16(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) - expo-constants: 57.0.17(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3)) - expo-file-system: 57.0.6(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3)) - expo-font: 57.0.3(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) - expo-keep-awake: 57.0.1(expo@57.0.20)(react@19.2.3) + expo-asset: 57.0.16(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3) + expo-constants: 57.0.17(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8)) + expo-file-system: 57.0.6(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8)) + expo-font: 57.0.3(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) + expo-keep-awake: 57.0.1(expo@57.0.20)(react@19.2.8) expo-modules-autolinking: 57.0.12(typescript@6.0.3) - expo-modules-core: 57.0.16(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) + expo-modules-core: 57.0.16(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) pretty-format: 29.7.0 - react: 19.2.3 - react-native: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) + react: 19.2.8 + react-native: 0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8) react-refresh: 0.14.2 whatwg-url-minimum: 0.1.2 optionalDependencies: - '@expo/dom-webview': 56.0.6(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) - '@expo/metro-runtime': 57.0.15(@expo/log-box@57.0.4)(expo@57.0.20)(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) - react-dom: 19.2.3(react@19.2.3) - react-native-web: 0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@expo/dom-webview': 56.0.6(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) + '@expo/metro-runtime': 57.0.15(@expo/log-box@57.0.4)(expo@57.0.20)(react-dom@19.2.8(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) + react-dom: 19.2.8(react@19.2.8) + react-native-web: 0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) transitivePeerDependencies: - '@babel/core' - bufferutil @@ -20596,6 +21108,10 @@ snapshots: optionalDependencies: picomatch: 4.0.5 + fdir@6.5.0(picomatch@4.0.7): + optionalDependencies: + picomatch: 4.0.7 + fecha@4.2.3: {} fetch-blob@3.2.0: @@ -20676,6 +21192,11 @@ snapshots: dependencies: is-callable: 1.2.7 + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + form-data@4.0.6: dependencies: asynckit: 0.4.0 @@ -20818,6 +21339,15 @@ snapshots: dependencies: is-glob: 4.0.3 + glob@10.5.0: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.9 + minipass: 7.1.3 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + glob@13.0.6: dependencies: minimatch: 10.2.6 @@ -20931,9 +21461,7 @@ snapshots: dependencies: '@types/hast': 3.0.5 - hermes-compiler@250829098.0.10: {} - - hermes-estree@0.33.3: {} + hermes-compiler@250829098.0.17: {} hermes-estree@0.35.0: {} @@ -20941,10 +21469,6 @@ snapshots: hermes-estree@0.36.1: {} - hermes-parser@0.33.3: - dependencies: - hermes-estree: 0.33.3 - hermes-parser@0.35.0: dependencies: hermes-estree: 0.35.0 @@ -21135,7 +21659,7 @@ snapshots: ip-address@10.2.0: {} - ipx@3.1.1(@netlify/blobs@10.7.13)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.23.0)(postgres@3.4.9)))(srvx@0.11.22): + ipx@3.1.1(@netlify/blobs@10.7.13)(@parcel/watcher@2.6.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.23.0)(postgres@3.4.9)))(srvx@0.11.22): dependencies: '@fastify/accept-negotiator': 2.1.0 citty: 0.1.6 @@ -21145,7 +21669,7 @@ snapshots: etag: 1.8.1 h3: 1.15.11 image-meta: 0.2.2 - listhen: 1.10.1(srvx@0.11.22) + listhen: 1.10.1(@parcel/watcher@2.6.0)(srvx@0.11.22) ofetch: 1.5.1 pathe: 2.0.3 sharp: 0.34.5 @@ -21176,7 +21700,7 @@ snapshots: - srvx - uploadthing - ipx@3.1.1(@netlify/blobs@11.0.3)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.22.0)(postgres@3.4.9)))(srvx@0.11.20): + ipx@3.1.1(@netlify/blobs@11.0.3)(@parcel/watcher@2.6.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.22.0)(postgres@3.4.9)))(srvx@0.11.20): dependencies: '@fastify/accept-negotiator': 2.1.0 citty: 0.1.6 @@ -21186,7 +21710,7 @@ snapshots: etag: 1.8.1 h3: 1.15.11 image-meta: 0.2.2 - listhen: 1.10.1(srvx@0.11.20) + listhen: 1.10.1(@parcel/watcher@2.6.0)(srvx@0.11.20) ofetch: 1.5.1 pathe: 2.0.3 sharp: 0.34.5 @@ -21441,11 +21965,11 @@ snapshots: make-dir: 4.0.0 supports-color: 7.2.0 - istanbul-lib-source-maps@4.0.1: + istanbul-lib-source-maps@5.0.6: dependencies: + '@jridgewell/trace-mapping': 0.3.31 debug: 4.4.3 istanbul-lib-coverage: 3.2.2 - source-map: 0.6.1 transitivePeerDependencies: - supports-color @@ -21454,83 +21978,90 @@ snapshots: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 - jest-changed-files@29.7.0: + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jest-changed-files@30.5.1: dependencies: execa: 5.1.1 - jest-util: 29.7.0 + jest-util: 30.5.1 p-limit: 3.1.0 - jest-circus@29.7.0: + jest-circus@30.5.1: dependencies: - '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 + '@jest/environment': 30.5.1 + '@jest/expect': 30.5.1 + '@jest/test-result': 30.5.1 + '@jest/types': 30.5.1 '@types/node': 26.4.1 chalk: 4.1.2 co: 4.6.0 dedent: 1.7.2 is-generator-fn: 2.1.0 - jest-each: 29.7.0 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 + jest-each: 30.5.1 + jest-matcher-utils: 30.5.1 + jest-message-util: 30.5.1 + jest-runtime: 30.5.1 + jest-snapshot: 30.5.1 + jest-util: 30.5.1 p-limit: 3.1.0 - pretty-format: 29.7.0 - pure-rand: 6.1.0 + pretty-format: 30.5.1 + pure-rand: 7.0.1 slash: 3.0.0 stack-utils: 2.0.6 transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@26.1.0): + jest-cli@30.5.1(@types/node@26.4.1): dependencies: - '@jest/core': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 + '@jest/core': 30.5.1 + '@jest/test-result': 30.5.1 + '@jest/types': 30.5.1 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@26.1.0) - exit: 0.1.2 + exit-x: 0.2.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@26.1.0) - jest-util: 29.7.0 - jest-validate: 29.7.0 + jest-config: 30.5.1(@types/node@26.4.1) + jest-util: 30.5.1 + jest-validate: 30.5.1 yargs: 17.7.3 transitivePeerDependencies: - '@types/node' - babel-plugin-macros + - esbuild-register - supports-color - ts-node - jest-config@29.7.0(@types/node@26.1.0): + jest-config@30.5.1(@types/node@26.4.1): dependencies: '@babel/core': 7.29.7 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.29.7) + '@jest/get-type': 30.5.0 + '@jest/pattern': 30.5.0 + '@jest/test-sequencer': 30.5.1 + '@jest/types': 30.5.1 + babel-jest: 30.5.1(@babel/core@7.29.7) chalk: 4.1.2 - ci-info: 3.9.0 + ci-info: 4.4.0 deepmerge: 4.3.1 - glob: 7.2.3 + glob: 13.0.6 graceful-fs: 4.2.11 - jest-circus: 29.7.0 - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.8 + jest-circus: 30.5.1 + jest-docblock: 30.5.0 + jest-environment-node: 30.5.1 + jest-regex-util: 30.5.0 + jest-resolve: 30.5.1 + jest-runner: 30.5.1 + jest-util: 30.5.1 + jest-validate: 30.5.1 parse-json: 5.2.0 - pretty-format: 29.7.0 + pretty-format: 30.5.1 slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 26.1.0 + '@types/node': 26.4.1 transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -21549,17 +22080,24 @@ snapshots: chalk: 4.1.2 pretty-format: 30.4.1 - jest-docblock@29.7.0: + jest-diff@30.5.1: + dependencies: + '@jest/diff-sequences': 30.5.0 + '@jest/get-type': 30.5.0 + chalk: 4.1.2 + pretty-format: 30.5.1 + + jest-docblock@30.5.0: dependencies: detect-newline: 3.1.0 - jest-each@29.7.0: + jest-each@30.5.1: dependencies: - '@jest/types': 29.6.3 + '@jest/get-type': 30.5.0 + '@jest/types': 30.5.1 chalk: 4.1.2 - jest-get-type: 29.6.3 - jest-util: 29.7.0 - pretty-format: 29.7.0 + jest-util: 30.5.1 + pretty-format: 30.5.1 jest-environment-jsdom@29.7.0: dependencies: @@ -21567,7 +22105,7 @@ snapshots: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 '@types/jsdom': 20.0.1 - '@types/node': 26.1.0 + '@types/node': 26.4.1 jest-mock: 29.7.0 jest-util: 29.7.0 jsdom: 20.0.3 @@ -21585,24 +22123,34 @@ snapshots: jest-mock: 29.7.0 jest-util: 29.7.0 - jest-expo@56.0.5(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(expo@57.0.20)(jest@29.7.0(@types/node@26.1.0))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3): + jest-environment-node@30.5.1: + dependencies: + '@jest/environment': 30.5.1 + '@jest/fake-timers': 30.5.1 + '@jest/types': 30.5.1 + '@types/node': 26.4.1 + jest-mock: 30.5.1 + jest-util: 30.5.1 + jest-validate: 30.5.1 + + jest-expo@57.0.5(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(expo@57.0.20)(jest@30.5.1(@types/node@26.4.1))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8): dependencies: '@jest/create-cache-key-function': 29.7.0 '@jest/globals': 29.7.0 - '@react-native/jest-preset': 0.85.3(@babel/core@7.29.7)(react@19.2.3) + '@react-native/jest-preset': 0.86.3(@babel/core@7.29.7)(react@19.2.8) babel-jest: 29.7.0(@babel/core@7.29.7) jest-environment-jsdom: 29.7.0 jest-snapshot: 29.7.0 jest-watch-select-projects: 2.0.0 - jest-watch-typeahead: 2.2.1(jest@29.7.0(@types/node@26.1.0)) + jest-watch-typeahead: 2.2.1(jest@30.5.1(@types/node@26.4.1)) json5: 2.2.3 lodash: 4.18.1 - react-native: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) - react-test-renderer: 19.2.3(react@19.2.3) + react-native: 0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8) + react-test-renderer: 19.2.3(react@19.2.8) server-only: 0.0.1 stacktrace-js: 2.0.2 optionalDependencies: - expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.3(react@19.2.3))(react-native-web@0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)(typescript@6.0.3) + expo: 57.0.20(@babel/core@7.29.7)(@expo/dom-webview@56.0.6)(@expo/metro-runtime@57.0.15)(expo-router@57.0.19)(react-dom@19.2.8(react@19.2.8))(react-native-web@0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)(typescript@6.0.3) transitivePeerDependencies: - '@babel/core' - bufferutil @@ -21618,7 +22166,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 26.1.0 + '@types/node': 26.4.1 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -21630,10 +22178,24 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - jest-leak-detector@29.7.0: + jest-haste-map@30.5.1: dependencies: - jest-get-type: 29.6.3 - pretty-format: 29.7.0 + '@jest/types': 30.5.1 + '@parcel/watcher': 2.6.0 + '@types/node': 26.4.1 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + fdir: 6.5.0(picomatch@4.0.7) + graceful-fs: 4.2.11 + jest-regex-util: 30.5.0 + jest-util: 30.5.1 + jest-worker: 30.5.1 + picomatch: 4.0.7 + + jest-leak-detector@30.5.1: + dependencies: + '@jest/get-type': 30.5.0 + pretty-format: 30.5.1 jest-matcher-utils@29.7.0: dependencies: @@ -21649,6 +22211,13 @@ snapshots: jest-diff: 30.4.1 pretty-format: 30.4.1 + jest-matcher-utils@30.5.1: + dependencies: + '@jest/get-type': 30.5.0 + chalk: 4.1.2 + jest-diff: 30.5.1 + pretty-format: 30.5.1 + jest-message-util@29.7.0: dependencies: '@babel/code-frame': 7.29.7 @@ -21661,85 +22230,103 @@ snapshots: slash: 3.0.0 stack-utils: 2.0.6 + jest-message-util@30.5.1: + dependencies: + '@babel/code-frame': 7.29.7 + '@jest/types': 30.5.1 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-util: 30.5.1 + picomatch: 4.0.7 + pretty-format: 30.5.1 + slash: 3.0.0 + stack-utils: 2.0.6 + jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 26.1.0 + '@types/node': 26.4.1 jest-util: 29.7.0 - jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): - optionalDependencies: - jest-resolve: 29.7.0 + jest-mock@30.5.1: + dependencies: + '@jest/expect-utils': 30.5.1 + '@jest/types': 30.5.1 + '@types/node': 26.4.1 + jest-util: 30.5.1 jest-regex-util@29.6.3: {} - jest-resolve-dependencies@29.7.0: + jest-regex-util@30.5.0: {} + + jest-resolve-dependencies@30.5.1: dependencies: - jest-regex-util: 29.6.3 - jest-snapshot: 29.7.0 + jest-regex-util: 30.5.0 + jest-snapshot: 30.5.1 transitivePeerDependencies: - supports-color - jest-resolve@29.7.0: + jest-resolve@30.5.1: dependencies: chalk: 4.1.2 graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) - jest-util: 29.7.0 - jest-validate: 29.7.0 - resolve: 1.22.12 - resolve.exports: 2.0.3 + jest-haste-map: 30.5.1 + jest-util: 30.5.1 + jest-validate: 30.5.1 slash: 3.0.0 + unrs-resolver: 1.12.2 - jest-runner@29.7.0: + jest-runner@30.5.1: dependencies: - '@jest/console': 29.7.0 - '@jest/environment': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 26.1.0 + '@jest/console': 30.5.1 + '@jest/environment': 30.5.1 + '@jest/source-map': 30.5.0 + '@jest/test-result': 30.5.1 + '@jest/transform': 30.5.1 + '@jest/types': 30.5.1 + '@types/node': 26.4.1 chalk: 4.1.2 emittery: 0.13.1 + exit-x: 0.2.2 graceful-fs: 4.2.11 - jest-docblock: 29.7.0 - jest-environment-node: 29.7.0 - jest-haste-map: 29.7.0 - jest-leak-detector: 29.7.0 - jest-message-util: 29.7.0 - jest-resolve: 29.7.0 - jest-runtime: 29.7.0 - jest-util: 29.7.0 - jest-watcher: 29.7.0 - jest-worker: 29.7.0 + jest-docblock: 30.5.0 + jest-environment-node: 30.5.1 + jest-haste-map: 30.5.1 + jest-leak-detector: 30.5.1 + jest-message-util: 30.5.1 + jest-resolve: 30.5.1 + jest-runtime: 30.5.1 + jest-util: 30.5.1 + jest-watcher: 30.5.1 + jest-worker: 30.5.1 p-limit: 3.1.0 - source-map-support: 0.5.13 transitivePeerDependencies: - supports-color - jest-runtime@29.7.0: + jest-runtime@30.5.1: dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/globals': 29.7.0 - '@jest/source-map': 29.6.3 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 26.1.0 + '@jest/environment': 30.5.1 + '@jest/fake-timers': 30.5.1 + '@jest/globals': 30.5.1 + '@jest/source-map': 30.5.0 + '@jest/test-result': 30.5.1 + '@jest/transform': 30.5.1 + '@jest/types': 30.5.1 + '@types/node': 26.4.1 chalk: 4.1.2 - cjs-module-lexer: 1.4.3 + cjs-module-lexer: 2.2.1 collect-v8-coverage: 1.0.3 - glob: 7.2.3 + es-module-lexer: 2.3.2 + glob: 13.0.6 graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 + jest-haste-map: 30.5.1 + jest-message-util: 30.5.1 + jest-mock: 30.5.1 + jest-regex-util: 30.5.0 + jest-resolve: 30.5.1 + jest-snapshot: 30.5.1 + jest-util: 30.5.1 slash: 3.0.0 strip-bom: 4.0.0 transitivePeerDependencies: @@ -21770,15 +22357,50 @@ snapshots: transitivePeerDependencies: - supports-color + jest-snapshot@30.5.1: + dependencies: + '@babel/core': 7.29.7 + '@babel/generator': 7.29.8 + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7) + '@babel/types': 7.29.8 + '@jest/expect-utils': 30.5.1 + '@jest/get-type': 30.5.0 + '@jest/snapshot-utils': 30.5.1 + '@jest/transform': 30.5.1 + '@jest/types': 30.5.1 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.7) + chalk: 4.1.2 + expect: 30.5.1 + graceful-fs: 4.2.11 + jest-diff: 30.5.1 + jest-matcher-utils: 30.5.1 + jest-message-util: 30.5.1 + jest-util: 30.5.1 + pretty-format: 30.5.1 + semver: 7.8.5 + synckit: 0.11.13 + transitivePeerDependencies: + - supports-color + jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 26.1.0 + '@types/node': 26.4.1 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 picomatch: 2.3.2 + jest-util@30.5.1: + dependencies: + '@jest/types': 30.5.1 + '@types/node': 26.4.1 + chalk: 4.1.2 + ci-info: 4.4.0 + graceful-fs: 4.2.11 + picomatch: 4.0.7 + jest-validate@29.7.0: dependencies: '@jest/types': 29.6.3 @@ -21788,17 +22410,26 @@ snapshots: leven: 3.1.0 pretty-format: 29.7.0 + jest-validate@30.5.1: + dependencies: + '@jest/get-type': 30.5.0 + '@jest/types': 30.5.1 + camelcase: 6.3.0 + chalk: 4.1.2 + leven: 3.1.0 + pretty-format: 30.5.1 + jest-watch-select-projects@2.0.0: dependencies: ansi-escapes: 4.3.2 chalk: 3.0.0 prompts: 2.4.2 - jest-watch-typeahead@2.2.1(jest@29.7.0(@types/node@26.1.0)): + jest-watch-typeahead@2.2.1(jest@30.5.1(@types/node@26.4.1)): dependencies: ansi-escapes: 6.2.1 chalk: 4.1.2 - jest: 29.7.0(@types/node@26.1.0) + jest: 30.5.1(@types/node@26.4.1) jest-regex-util: 29.6.3 jest-watcher: 29.7.0 slash: 5.1.0 @@ -21809,13 +22440,24 @@ snapshots: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 26.1.0 + '@types/node': 26.4.1 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 jest-util: 29.7.0 string-length: 4.0.2 + jest-watcher@30.5.1: + dependencies: + '@jest/test-result': 30.5.1 + '@jest/types': 30.5.1 + '@types/node': 26.4.1 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 30.5.1 + string-length: 4.0.2 + jest-worker@29.7.0: dependencies: '@types/node': 26.4.1 @@ -21823,15 +22465,24 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@26.1.0): + jest-worker@30.5.1: dependencies: - '@jest/core': 29.7.0 - '@jest/types': 29.6.3 + '@types/node': 26.4.1 + '@ungap/structured-clone': 1.4.0 + jest-util: 30.5.1 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jest@30.5.1(@types/node@26.4.1): + dependencies: + '@jest/core': 30.5.1 + '@jest/types': 30.5.1 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@26.1.0) + jest-cli: 30.5.1(@types/node@26.4.1) transitivePeerDependencies: - '@types/node' - babel-plugin-macros + - esbuild-register - supports-color - ts-node @@ -21869,7 +22520,7 @@ snapshots: jsdom@20.0.3: dependencies: abab: 2.0.6 - acorn: 8.17.0 + acorn: 8.18.0 acorn-globals: 7.0.1 cssom: 0.5.0 cssstyle: 2.3.0 @@ -22195,7 +22846,7 @@ snapshots: transitivePeerDependencies: - supports-color - listhen@1.10.1(srvx@0.11.20): + listhen@1.10.1(@parcel/watcher@2.6.0)(srvx@0.11.20): dependencies: '@parcel/watcher-wasm': 2.6.0 citty: 0.2.2 @@ -22213,10 +22864,12 @@ snapshots: ufo: 1.6.4 untun: 0.2.2 uqr: 0.1.3 + optionalDependencies: + '@parcel/watcher': 2.6.0 transitivePeerDependencies: - srvx - listhen@1.10.1(srvx@0.11.22): + listhen@1.10.1(@parcel/watcher@2.6.0)(srvx@0.11.22): dependencies: '@parcel/watcher-wasm': 2.6.0 citty: 0.2.2 @@ -22234,6 +22887,8 @@ snapshots: ufo: 1.6.4 untun: 0.2.2 uqr: 0.1.3 + optionalDependencies: + '@parcel/watcher': 2.6.0 transitivePeerDependencies: - srvx @@ -22334,7 +22989,7 @@ snapshots: magic-string@0.30.21: dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 magic-string@1.2.3: dependencies: @@ -22402,24 +23057,10 @@ snapshots: transitivePeerDependencies: - supports-color - metro-babel-transformer@0.84.6: - dependencies: - '@babel/core': 7.29.7 - flow-enums-runtime: 0.0.6 - hermes-parser: 0.35.0 - metro-cache-key: 0.84.6 - nullthrows: 1.1.1 - transitivePeerDependencies: - - supports-color - metro-cache-key@0.84.5: dependencies: flow-enums-runtime: 0.0.6 - metro-cache-key@0.84.6: - dependencies: - flow-enums-runtime: 0.0.6 - metro-cache@0.84.5: dependencies: exponential-backoff: 3.1.3 @@ -22429,15 +23070,6 @@ snapshots: transitivePeerDependencies: - supports-color - metro-cache@0.84.6: - dependencies: - exponential-backoff: 3.1.3 - flow-enums-runtime: 0.0.6 - https-proxy-agent: 7.0.6 - metro-core: 0.84.6 - transitivePeerDependencies: - - supports-color - metro-config@0.84.5: dependencies: connect: 3.7.0 @@ -22453,33 +23085,12 @@ snapshots: - supports-color - utf-8-validate - metro-config@0.84.6: - dependencies: - connect: 3.7.0 - flow-enums-runtime: 0.0.6 - jest-validate: 29.7.0 - metro: 0.84.6 - metro-cache: 0.84.6 - metro-core: 0.84.6 - metro-runtime: 0.84.6 - yaml: 2.9.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - metro-core@0.84.5: dependencies: flow-enums-runtime: 0.0.6 lodash.throttle: 4.1.1 metro-resolver: 0.84.5 - metro-core@0.84.6: - dependencies: - flow-enums-runtime: 0.0.6 - lodash.throttle: 4.1.1 - metro-resolver: 0.84.6 - metro-file-map@0.84.5: dependencies: debug: 4.4.3 @@ -22494,48 +23105,20 @@ snapshots: transitivePeerDependencies: - supports-color - metro-file-map@0.84.6: - dependencies: - debug: 4.4.3 - fb-watchman: 2.0.2 - flow-enums-runtime: 0.0.6 - graceful-fs: 4.2.11 - invariant: 2.2.4 - jest-worker: 29.7.0 - micromatch: 4.0.8 - nullthrows: 1.1.1 - walker: 1.0.8 - transitivePeerDependencies: - - supports-color - metro-minify-terser@0.84.5: dependencies: flow-enums-runtime: 0.0.6 terser: 5.51.2 - metro-minify-terser@0.84.6: - dependencies: - flow-enums-runtime: 0.0.6 - terser: 5.51.2 - metro-resolver@0.84.5: dependencies: flow-enums-runtime: 0.0.6 - metro-resolver@0.84.6: - dependencies: - flow-enums-runtime: 0.0.6 - metro-runtime@0.84.5: dependencies: '@babel/runtime': 7.29.7 flow-enums-runtime: 0.0.6 - metro-runtime@0.84.6: - dependencies: - '@babel/runtime': 7.29.7 - flow-enums-runtime: 0.0.6 - metro-source-map@0.84.5: dependencies: '@babel/traverse': 7.29.8 @@ -22550,20 +23133,6 @@ snapshots: transitivePeerDependencies: - supports-color - metro-source-map@0.84.6: - dependencies: - '@babel/traverse': 7.29.8 - '@babel/types': 7.29.8 - flow-enums-runtime: 0.0.6 - invariant: 2.2.4 - metro-symbolicate: 0.84.6 - nullthrows: 1.1.1 - ob1: 0.84.6 - source-map: 0.5.7 - vlq: 1.0.1 - transitivePeerDependencies: - - supports-color - metro-symbolicate@0.84.5: dependencies: flow-enums-runtime: 0.0.6 @@ -22575,17 +23144,6 @@ snapshots: transitivePeerDependencies: - supports-color - metro-symbolicate@0.84.6: - dependencies: - flow-enums-runtime: 0.0.6 - invariant: 2.2.4 - metro-source-map: 0.84.6 - nullthrows: 1.1.1 - source-map: 0.5.7 - vlq: 1.0.1 - transitivePeerDependencies: - - supports-color - metro-transform-plugins@0.84.5: dependencies: '@babel/core': 7.29.7 @@ -22597,17 +23155,6 @@ snapshots: transitivePeerDependencies: - supports-color - metro-transform-plugins@0.84.6: - dependencies: - '@babel/core': 7.29.7 - '@babel/generator': 7.29.8 - '@babel/template': 7.29.7 - '@babel/traverse': 7.29.8 - flow-enums-runtime: 0.0.6 - nullthrows: 1.1.1 - transitivePeerDependencies: - - supports-color - metro-transform-worker@0.84.5: dependencies: '@babel/core': 7.29.7 @@ -22628,26 +23175,6 @@ snapshots: - supports-color - utf-8-validate - metro-transform-worker@0.84.6: - dependencies: - '@babel/core': 7.29.7 - '@babel/generator': 7.29.8 - '@babel/parser': 7.29.8 - '@babel/types': 7.29.8 - flow-enums-runtime: 0.0.6 - metro: 0.84.6 - metro-babel-transformer: 0.84.6 - metro-cache: 0.84.6 - metro-cache-key: 0.84.6 - metro-minify-terser: 0.84.6 - metro-source-map: 0.84.6 - metro-transform-plugins: 0.84.6 - nullthrows: 1.1.1 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - metro@0.84.5: dependencies: '@babel/code-frame': 7.29.7 @@ -22693,51 +23220,6 @@ snapshots: - supports-color - utf-8-validate - metro@0.84.6: - dependencies: - '@babel/code-frame': 7.29.7 - '@babel/core': 7.29.7 - '@babel/generator': 7.29.8 - '@babel/parser': 7.29.8 - '@babel/template': 7.29.7 - '@babel/traverse': 7.29.8 - '@babel/types': 7.29.8 - accepts: 2.0.0 - ci-info: 2.0.0 - connect: 3.7.0 - debug: 4.4.3 - error-stack-parser: 2.1.4 - flow-enums-runtime: 0.0.6 - graceful-fs: 4.2.11 - hermes-parser: 0.35.0 - invariant: 2.2.4 - jest-worker: 29.7.0 - jsc-safe-url: 0.2.4 - lodash.throttle: 4.1.1 - metro-babel-transformer: 0.84.6 - metro-cache: 0.84.6 - metro-cache-key: 0.84.6 - metro-config: 0.84.6 - metro-core: 0.84.6 - metro-file-map: 0.84.6 - metro-resolver: 0.84.6 - metro-runtime: 0.84.6 - metro-source-map: 0.84.6 - metro-symbolicate: 0.84.6 - metro-transform-plugins: 0.84.6 - metro-transform-worker: 0.84.6 - mime-types: 3.0.2 - nullthrows: 1.1.1 - serialize-error: 2.1.0 - source-map: 0.5.7 - throat: 5.0.0 - ws: 7.5.13 - yargs: 17.7.3 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - micromark-util-character@2.1.1: dependencies: micromark-util-symbol: 2.0.1 @@ -22794,6 +23276,10 @@ snapshots: dependencies: brace-expansion: 1.1.18 + minimatch@9.0.9: + dependencies: + brace-expansion: 2.1.4 + minimist@1.2.8: {} minipass@7.1.3: {} @@ -22845,11 +23331,13 @@ snapshots: napi-build-utils@2.0.0: {} - nativewind@4.2.6(1df2f4422cbbe12c9a5134b979f353ff): + napi-postinstall@0.3.4: {} + + nativewind@4.2.6(04ea67d64433bb4fe6d83655c1150d1d): dependencies: comment-json: 4.6.2 debug: 4.4.3 - react-native-css-interop: 0.2.6(1df2f4422cbbe12c9a5134b979f353ff) + react-native-css-interop: 0.2.6(04ea67d64433bb4fe6d83655c1150d1d) tailwindcss: 3.4.19(tsx@4.23.13)(yaml@2.9.0) transitivePeerDependencies: - react @@ -22945,6 +23433,8 @@ snapshots: dependencies: semver: 7.8.5 + node-addon-api@7.1.1: {} + node-domexception@1.0.0: {} node-exports-info@1.6.2: @@ -23049,10 +23539,6 @@ snapshots: dependencies: flow-enums-runtime: 0.0.6 - ob1@0.84.6: - dependencies: - flow-enums-runtime: 0.0.6 - object-assign@4.1.1: {} object-hash@3.0.0: {} @@ -23079,8 +23565,6 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.2 - obug@2.1.3: {} - obug@2.1.4: {} ocache@0.1.5: @@ -23326,6 +23810,8 @@ snapshots: netmask: 2.1.1 quickjs-wasi: 0.0.1 + package-json-from-dist@1.0.1: {} + package-manager-detector@1.8.0: {} pako@0.2.9: {} @@ -23395,6 +23881,11 @@ snapshots: path-parse@1.0.7: {} + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.3 + path-scurry@2.0.2: dependencies: lru-cache: 11.5.2 @@ -23605,17 +24096,17 @@ snapshots: transitivePeerDependencies: - preact-render-to-string - posthog-react-native@4.67.0(@react-native-async-storage/async-storage@2.2.0(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3)))(expo-application@57.0.2(expo@57.0.20))(expo-device@57.0.1(expo@57.0.20))(expo-file-system@57.0.6(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3)))(expo-localization@57.0.1(expo@57.0.20)(react@19.2.3))(react-native-safe-area-context@5.7.0(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3)): + posthog-react-native@4.67.0(@react-native-async-storage/async-storage@2.2.0(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8)))(expo-application@57.0.2(expo@57.0.20))(expo-device@57.0.1(expo@57.0.20))(expo-file-system@57.0.6(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8)))(expo-localization@57.0.1(expo@57.0.20)(react@19.2.8))(react-native-safe-area-context@5.9.1(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8)): dependencies: '@posthog/core': 1.50.5 '@posthog/types': 1.409.0 optionalDependencies: - '@react-native-async-storage/async-storage': 2.2.0(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3)) + '@react-native-async-storage/async-storage': 2.2.0(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8)) expo-application: 57.0.2(expo@57.0.20) expo-device: 57.0.1(expo@57.0.20) - expo-file-system: 57.0.6(expo@57.0.20)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3)) - expo-localization: 57.0.1(expo@57.0.20)(react@19.2.3) - react-native-safe-area-context: 5.7.0(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) + expo-file-system: 57.0.6(expo@57.0.20)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8)) + expo-localization: 57.0.1(expo@57.0.20)(react@19.2.8) + react-native-safe-area-context: 5.9.1(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) powershell-utils@0.1.0: {} @@ -23687,6 +24178,13 @@ snapshots: react-is-18: react-is@18.3.1 react-is-19: react-is@19.2.8 + pretty-format@30.5.1: + dependencies: + '@jest/react-is-18': react-is@18.3.1 + '@jest/react-is-19': react-is@19.2.8 + '@jest/schemas': 30.5.0 + ansi-styles: 5.2.0 + prismjs@1.30.0: {} proc-log@4.2.0: {} @@ -23756,7 +24254,7 @@ snapshots: - utf-8-validate - yauzl - pure-rand@6.1.0: {} + pure-rand@7.0.1: {} query-selector-shadow-dom@1.0.1: {} @@ -23811,6 +24309,11 @@ snapshots: react: 19.2.3 scheduler: 0.27.0 + react-dom@19.2.8(react@19.2.8): + dependencies: + react: 19.2.8 + scheduler: 0.27.0 + react-email@6.9.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: '@babel/parser': 7.29.2 @@ -23844,73 +24347,73 @@ snapshots: react-fast-compare@3.2.2: {} - react-freeze@1.0.4(react@19.2.3): + react-freeze@1.0.4(react@19.2.8): dependencies: - react: 19.2.3 + react: 19.2.8 react-is@18.3.1: {} react-is@19.2.8: {} - react-native-css-interop@0.2.6(1df2f4422cbbe12c9a5134b979f353ff): + react-native-css-interop@0.2.6(04ea67d64433bb4fe6d83655c1150d1d): dependencies: '@babel/helper-module-imports': 7.29.7 '@babel/traverse': 7.29.8 '@babel/types': 7.29.8 debug: 4.4.3 lightningcss: 1.27.0 - react: 19.2.3 - react-native: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) - react-native-reanimated: 4.3.1(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) + react: 19.2.8 + react-native: 0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8) + react-native-reanimated: 4.6.0(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) semver: 7.8.5 tailwindcss: 3.4.19(tsx@4.23.13)(yaml@2.9.0) optionalDependencies: - react-native-safe-area-context: 5.7.0(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) + react-native-safe-area-context: 5.9.1(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) transitivePeerDependencies: - supports-color - react-native-drawer-layout@4.2.10(456a38f2a1c7dc6b4f8696531aa746f7): + react-native-drawer-layout@4.2.10(654c91a891bbc8c7d043c1e7d26714c1): dependencies: color: 4.2.3 - react: 19.2.3 - react-native: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) - react-native-gesture-handler: 3.2.1(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) - react-native-reanimated: 4.3.1(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) - use-latest-callback: 0.2.6(react@19.2.3) + react: 19.2.8 + react-native: 0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8) + react-native-gesture-handler: 3.2.1(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) + react-native-reanimated: 4.6.0(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) + use-latest-callback: 0.2.6(react@19.2.8) - react-native-gesture-handler@3.2.1(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3): + react-native-gesture-handler@3.2.1(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8): dependencies: '@types/react-test-renderer': 19.1.0 invariant: 2.2.4 - react: 19.2.3 - react-native: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) + react: 19.2.8 + react-native: 0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8) - react-native-is-edge-to-edge@1.3.1(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3): + react-native-is-edge-to-edge@1.3.1(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8): dependencies: - react: 19.2.3 - react-native: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) + react: 19.2.8 + react-native: 0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8) - react-native-reanimated@4.3.1(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3): + react-native-reanimated@4.6.0(react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8): dependencies: - react: 19.2.3 - react-native: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) - react-native-is-edge-to-edge: 1.3.1(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) - react-native-worklets: 0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) + react: 19.2.8 + react-native: 0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8) + react-native-is-edge-to-edge: 1.3.1(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) + react-native-worklets: 0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) semver: 7.8.5 - react-native-safe-area-context@5.7.0(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3): + react-native-safe-area-context@5.9.1(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8): dependencies: - react: 19.2.3 - react-native: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) + react: 19.2.8 + react-native: 0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8) - react-native-screens@4.25.2(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3): + react-native-screens@4.27.0(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8): dependencies: - react: 19.2.3 - react-freeze: 1.0.4(react@19.2.3) - react-native: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) + react: 19.2.8 + react-freeze: 1.0.4(react@19.2.8) + react-native: 0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8) warn-once: 0.1.1 - react-native-web@0.21.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + react-native-web@0.21.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8): dependencies: '@babel/runtime': 7.29.7 '@react-native/normalize-colors': 0.74.89 @@ -23919,15 +24422,16 @@ snapshots: memoize-one: 6.0.0 nullthrows: 1.1.1 postcss-value-parser: 4.2.0 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) styleq: 0.1.3 transitivePeerDependencies: - encoding - react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3): + react-native-worklets@0.12.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8): dependencies: '@babel/core': 7.29.7 + '@babel/generator': 7.29.8 '@babel/plugin-transform-arrow-functions': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-class-properties': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-classes': 7.29.7(@babel/core@7.29.7) @@ -23937,31 +24441,33 @@ snapshots: '@babel/plugin-transform-template-literals': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.7) '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7) - '@react-native/metro-config': 0.85.3(@babel/core@7.29.7) + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 + '@react-native/metro-config': 0.86.3(@babel/core@7.29.7) convert-source-map: 2.0.0 - react: 19.2.3 - react-native: 0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3) + react: 19.2.8 + react-native: 0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8) semver: 7.8.5 transitivePeerDependencies: - supports-color - react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3): + react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8): dependencies: - '@react-native/assets-registry': 0.85.3 - '@react-native/codegen': 0.85.3(@babel/core@7.29.7) - '@react-native/community-cli-plugin': 0.85.3(@react-native/metro-config@0.85.3(@babel/core@7.29.7)) - '@react-native/gradle-plugin': 0.85.3 - '@react-native/js-polyfills': 0.85.3 - '@react-native/normalize-colors': 0.85.3 - '@react-native/virtualized-lists': 0.85.3(@types/react@19.2.18)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/jest-preset@0.85.3(@babel/core@7.29.7)(react@19.2.3))(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.3))(react@19.2.3) + '@react-native/assets-registry': 0.86.3 + '@react-native/codegen': 0.86.3(@babel/core@7.29.7) + '@react-native/community-cli-plugin': 0.86.3(@react-native/metro-config@0.86.3(@babel/core@7.29.7)) + '@react-native/gradle-plugin': 0.86.3 + '@react-native/js-polyfills': 0.86.3 + '@react-native/normalize-colors': 0.86.3 + '@react-native/virtualized-lists': 0.86.3(@types/react@19.2.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/jest-preset@0.86.3(@babel/core@7.29.7)(react@19.2.8))(@react-native/metro-config@0.86.3(@babel/core@7.29.7))(@types/react@19.2.18)(react@19.2.8))(react@19.2.8) abort-controller: 3.0.0 anser: 1.4.10 ansi-regex: 5.0.1 - babel-plugin-syntax-hermes-parser: 0.33.3 + babel-plugin-syntax-hermes-parser: 0.36.0 base64-js: 1.5.1 commander: 12.1.0 flow-enums-runtime: 0.0.6 - hermes-compiler: 250829098.0.10 + hermes-compiler: 250829098.0.17 invariant: 2.2.4 memoize-one: 5.2.1 metro-runtime: 0.84.5 @@ -23969,7 +24475,7 @@ snapshots: nullthrows: 1.1.1 pretty-format: 29.7.0 promise: 8.3.0 - react: 19.2.3 + react: 19.2.8 react-devtools-core: 6.1.5 react-refresh: 0.14.2 regenerator-runtime: 0.13.11 @@ -23981,7 +24487,7 @@ snapshots: ws: 7.5.13 yargs: 17.7.3 optionalDependencies: - '@react-native/jest-preset': 0.85.3(@babel/core@7.29.7)(react@19.2.3) + '@react-native/jest-preset': 0.86.3(@babel/core@7.29.7)(react@19.2.8) '@types/react': 19.2.18 transitivePeerDependencies: - '@babel/core' @@ -23991,45 +24497,52 @@ snapshots: - supports-color - utf-8-validate + react-reconciler@0.33.0(react@19.2.8): + dependencies: + react: 19.2.8 + scheduler: 0.27.0 + react-refresh@0.14.2: {} react-refresh@0.18.0: {} - react-remove-scroll-bar@2.3.8(@types/react@19.2.18)(react@19.2.3): + react-remove-scroll-bar@2.3.8(@types/react@19.2.18)(react@19.2.8): dependencies: - react: 19.2.3 - react-style-singleton: 2.2.3(@types/react@19.2.18)(react@19.2.3) + react: 19.2.8 + react-style-singleton: 2.2.3(@types/react@19.2.18)(react@19.2.8) tslib: 2.8.1 optionalDependencies: '@types/react': 19.2.18 - react-remove-scroll@2.7.2(@types/react@19.2.18)(react@19.2.3): + react-remove-scroll@2.7.2(@types/react@19.2.18)(react@19.2.8): dependencies: - react: 19.2.3 - react-remove-scroll-bar: 2.3.8(@types/react@19.2.18)(react@19.2.3) - react-style-singleton: 2.2.3(@types/react@19.2.18)(react@19.2.3) + react: 19.2.8 + react-remove-scroll-bar: 2.3.8(@types/react@19.2.18)(react@19.2.8) + react-style-singleton: 2.2.3(@types/react@19.2.18)(react@19.2.8) tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@19.2.18)(react@19.2.3) - use-sidecar: 1.1.3(@types/react@19.2.18)(react@19.2.3) + use-callback-ref: 1.3.3(@types/react@19.2.18)(react@19.2.8) + use-sidecar: 1.1.3(@types/react@19.2.18)(react@19.2.8) optionalDependencies: '@types/react': 19.2.18 - react-style-singleton@2.2.3(@types/react@19.2.18)(react@19.2.3): + react-style-singleton@2.2.3(@types/react@19.2.18)(react@19.2.8): dependencies: get-nonce: 1.0.1 - react: 19.2.3 + react: 19.2.8 tslib: 2.8.1 optionalDependencies: '@types/react': 19.2.18 - react-test-renderer@19.2.3(react@19.2.3): + react-test-renderer@19.2.3(react@19.2.8): dependencies: - react: 19.2.3 + react: 19.2.8 react-is: 19.2.8 scheduler: 0.27.0 react@19.2.3: {} + react@19.2.8: {} + read-cache@1.0.0: dependencies: pify: 2.3.0 @@ -24226,8 +24739,6 @@ snapshots: resolve-workspace-root@2.0.1: {} - resolve.exports@2.0.3: {} - resolve@1.22.12: dependencies: es-errors: 1.3.0 @@ -24739,11 +25250,6 @@ snapshots: source-map-js@1.2.1: {} - source-map-support@0.5.13: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 @@ -24831,8 +25337,6 @@ snapshots: statuses@2.0.2: {} - std-env@4.1.0: {} - std-env@4.2.0: {} stdin-discarder@0.3.2: {} @@ -24882,6 +25386,12 @@ snapshots: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.2.0 + string-width@7.2.0: dependencies: emoji-regex: 10.6.0 @@ -25024,6 +25534,10 @@ snapshots: symbol-tree@3.2.4: {} + synckit@0.11.13: + dependencies: + '@pkgr/core': 0.3.6 + tagged-tag@1.0.0: {} tailwind-merge@3.6.0: {} @@ -25121,6 +25635,20 @@ snapshots: glob: 7.2.3 minimatch: 3.1.5 + test-exclude@7.0.2: + dependencies: + '@istanbuljs/schema': 0.1.6 + glob: 10.5.0 + minimatch: 10.2.6 + + test-renderer@1.2.0(@types/react@19.2.18)(react@19.2.8): + dependencies: + '@types/react-reconciler': 0.33.0(@types/react@19.2.18) + react: 19.2.8 + react-reconciler: 0.33.0(react@19.2.8) + transitivePeerDependencies: + - '@types/react' + text-decoder@1.2.7: dependencies: b4a: 1.8.1 @@ -25143,11 +25671,11 @@ snapshots: tiny-inflate@1.0.3: {} - tinybench@2.9.0: {} + tinybench@6.1.4: {} tinyclip@0.1.15: {} - tinyexec@1.2.4: {} + tinyexec@1.3.0: {} tinyexec@1.3.1: {} @@ -25163,8 +25691,6 @@ snapshots: tinypool@2.1.0: {} - tinyrainbow@3.1.0: {} - tldts-core@7.4.11: {} tldts-icann@7.4.11: @@ -25449,6 +25975,33 @@ snapshots: rollup: 4.62.2 vite: 7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0) + unrs-resolver@1.12.2: + dependencies: + napi-postinstall: 0.3.4 + optionalDependencies: + '@unrs/resolver-binding-android-arm-eabi': 1.12.2 + '@unrs/resolver-binding-android-arm64': 1.12.2 + '@unrs/resolver-binding-darwin-arm64': 1.12.2 + '@unrs/resolver-binding-darwin-x64': 1.12.2 + '@unrs/resolver-binding-freebsd-x64': 1.12.2 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.12.2 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.12.2 + '@unrs/resolver-binding-linux-arm64-gnu': 1.12.2 + '@unrs/resolver-binding-linux-arm64-musl': 1.12.2 + '@unrs/resolver-binding-linux-loong64-gnu': 1.12.2 + '@unrs/resolver-binding-linux-loong64-musl': 1.12.2 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.12.2 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.12.2 + '@unrs/resolver-binding-linux-riscv64-musl': 1.12.2 + '@unrs/resolver-binding-linux-s390x-gnu': 1.12.2 + '@unrs/resolver-binding-linux-x64-gnu': 1.12.2 + '@unrs/resolver-binding-linux-x64-musl': 1.12.2 + '@unrs/resolver-binding-openharmony-arm64': 1.12.2 + '@unrs/resolver-binding-wasm32-wasi': 1.12.2 + '@unrs/resolver-binding-win32-arm64-msvc': 1.12.2 + '@unrs/resolver-binding-win32-ia32-msvc': 1.12.2 + '@unrs/resolver-binding-win32-x64-msvc': 1.12.2 + unstorage@1.17.5(@netlify/blobs@10.7.13)(db0@0.3.4(@electric-sql/pglite@0.5.8)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@prisma/client@5.22.0)(@types/pg@8.20.0)(better-sqlite3@12.11.1)(kysely@0.29.5)(pg@8.23.0)(postgres@3.4.9))): dependencies: anymatch: 3.1.3 @@ -25506,21 +26059,21 @@ snapshots: urlpattern-polyfill@8.0.2: {} - use-callback-ref@1.3.3(@types/react@19.2.18)(react@19.2.3): + use-callback-ref@1.3.3(@types/react@19.2.18)(react@19.2.8): dependencies: - react: 19.2.3 + react: 19.2.8 tslib: 2.8.1 optionalDependencies: '@types/react': 19.2.18 - use-latest-callback@0.2.6(react@19.2.3): + use-latest-callback@0.2.6(react@19.2.8): dependencies: - react: 19.2.3 + react: 19.2.8 - use-sidecar@1.1.3(@types/react@19.2.18)(react@19.2.3): + use-sidecar@1.1.3(@types/react@19.2.18)(react@19.2.8): dependencies: detect-node-es: 1.1.0 - react: 19.2.3 + react: 19.2.8 tslib: 2.8.1 optionalDependencies: '@types/react': 19.2.18 @@ -25554,11 +26107,11 @@ snapshots: vary@1.1.2: {} - vaul@1.1.2(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + vaul@1.1.2(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8): dependencies: - '@radix-ui/react-dialog': 1.1.23(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) + '@radix-ui/react-dialog': 1.1.23(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) transitivePeerDependencies: - '@types/react' - '@types/react-dom' @@ -25640,26 +26193,20 @@ snapshots: optionalDependencies: vite: 8.2.2(@types/node@24.13.2)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0) - vitest@4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(jsdom@20.0.3)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)): + vitest@5.0.0(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(jsdom@20.0.3)(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)): dependencies: - '@vitest/expect': 4.1.9 - '@vitest/mocker': 4.1.9(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)) - '@vitest/pretty-format': 4.1.9 - '@vitest/runner': 4.1.9 - '@vitest/snapshot': 4.1.9 - '@vitest/spy': 4.1.9 - '@vitest/utils': 4.1.9 - es-module-lexer: 2.3.0 + '@types/chai': 5.2.3 + '@vitest/mocker': 5.0.0(vite@7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)) + chai: 6.2.2 + es-module-lexer: 2.3.2 expect-type: 1.4.0 - magic-string: 0.30.21 - obug: 2.1.3 - pathe: 2.0.3 - picomatch: 4.0.5 - std-env: 4.1.0 - tinybench: 2.9.0 - tinyexec: 1.2.4 + magic-string: 1.2.3 + obug: 2.1.4 + picomatch: 4.0.7 + std-env: 4.2.0 + tinybench: 6.1.4 + tinyexec: 1.3.0 tinyglobby: 0.2.17 - tinyrainbow: 3.1.0 vite: 7.3.6(@types/node@24.13.2)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: @@ -25669,26 +26216,20 @@ snapshots: transitivePeerDependencies: - msw - vitest@4.1.9(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(jsdom@20.0.3)(vite@8.2.2(@types/node@24.13.2)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)): + vitest@5.0.0(@opentelemetry/api@1.9.1)(@types/node@24.13.2)(jsdom@20.0.3)(vite@8.2.2(@types/node@24.13.2)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)): dependencies: - '@vitest/expect': 4.1.9 - '@vitest/mocker': 4.1.9(vite@8.2.2(@types/node@24.13.2)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)) - '@vitest/pretty-format': 4.1.9 - '@vitest/runner': 4.1.9 - '@vitest/snapshot': 4.1.9 - '@vitest/spy': 4.1.9 - '@vitest/utils': 4.1.9 - es-module-lexer: 2.3.0 + '@types/chai': 5.2.3 + '@vitest/mocker': 5.0.0(vite@8.2.2(@types/node@24.13.2)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)) + chai: 6.2.2 + es-module-lexer: 2.3.2 expect-type: 1.4.0 - magic-string: 0.30.21 - obug: 2.1.3 - pathe: 2.0.3 - picomatch: 4.0.5 - std-env: 4.1.0 - tinybench: 2.9.0 - tinyexec: 1.2.4 + magic-string: 1.2.3 + obug: 2.1.4 + picomatch: 4.0.7 + std-env: 4.2.0 + tinybench: 6.1.4 + tinyexec: 1.3.0 tinyglobby: 0.2.17 - tinyrainbow: 3.1.0 vite: 8.2.2(@types/node@24.13.2)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: @@ -25698,26 +26239,20 @@ snapshots: transitivePeerDependencies: - msw - vitest@4.1.9(@opentelemetry/api@1.9.1)(@types/node@26.4.1)(jsdom@20.0.3)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)): + vitest@5.0.0(@opentelemetry/api@1.9.1)(@types/node@26.4.1)(jsdom@20.0.3)(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)): dependencies: - '@vitest/expect': 4.1.9 - '@vitest/mocker': 4.1.9(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)) - '@vitest/pretty-format': 4.1.9 - '@vitest/runner': 4.1.9 - '@vitest/snapshot': 4.1.9 - '@vitest/spy': 4.1.9 - '@vitest/utils': 4.1.9 - es-module-lexer: 2.3.0 + '@types/chai': 5.2.3 + '@vitest/mocker': 5.0.0(vite@8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0)) + chai: 6.2.2 + es-module-lexer: 2.3.2 expect-type: 1.4.0 - magic-string: 0.30.21 - obug: 2.1.3 - pathe: 2.0.3 - picomatch: 4.0.5 - std-env: 4.1.0 - tinybench: 2.9.0 - tinyexec: 1.2.4 + magic-string: 1.2.3 + obug: 2.1.4 + picomatch: 4.0.7 + std-env: 4.2.0 + tinybench: 6.1.4 + tinyexec: 1.3.0 tinyglobby: 0.2.17 - tinyrainbow: 3.1.0 vite: 8.2.2(@types/node@26.4.1)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.2)(tsx@4.23.13)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: @@ -25975,6 +26510,12 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.2.0 + wrap-ansi@9.0.2: dependencies: ansi-styles: 6.2.3 @@ -25988,6 +26529,11 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 3.0.7 + write-file-atomic@5.0.1: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.1.0 + ws@7.5.13: {} ws@8.21.3: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 6c953dab..dad1176e 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -22,7 +22,7 @@ catalog: # Pinned exact: TS 7 (native compiler) must stay in lockstep with # oxlint-tsgolint's paired version (see root package.json). typescript: 7.0.2 - vitest: ^4.0.15 + vitest: ^5.0.0 tsup: ^8.5.1 # env validation (Standard Schema based — see each package's keys.ts) From 748e248f651dac309186f3a1a938a5a298d34278 Mon Sep 17 00:00:00 2001 From: acharlop Date: Wed, 9 Sep 2026 22:01:37 +0200 Subject: [PATCH 06/17] test(mobile): scope the slow-suite timeout, stop the StatusBar spy reading stale calls Two fixes on top of the jest 30 / RNTL 14 migration. settings-modal.test.tsx outgrew jest's default 5s PER-TEST budget on GitHub's 4-vCPU runners: the file took 12.4s end-to-end there on main and 19.6s after the bump, enough for its first test (which also pays NativeWind's one-off style-registry init) to cross 5s and fail CI while running in 1.8s locally. Nothing hangs, it's wall-clock contention with the website's vitest run, so raise the budget with jest.setTimeout(20_000) in that one file rather than globally in jest.config.js -- a genuinely stuck test anywhere else should still fail fast on the 5s default. share-modal.test.tsx's expo-status-bar spy is module-level and nothing clears mocks between tests, so lastStatusBarStyle() read calls accumulated across the ten earlier renders in the file: had the sheet stopped rendering a , .at(-1) would have returned a stale call and both issue #173 tests would have gone green on the regression. Clear the spy per test and throw when it has no calls. Verified by deleting the from share-modal.tsx: both tests now fail with ' was never rendered'. --- .../src/__tests__/settings-modal.test.tsx | 10 +++++++++ .../mobile/src/__tests__/share-modal.test.tsx | 22 +++++++++++++++++-- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/apps/mobile/src/__tests__/settings-modal.test.tsx b/apps/mobile/src/__tests__/settings-modal.test.tsx index 522a35a8..0b2419c9 100644 --- a/apps/mobile/src/__tests__/settings-modal.test.tsx +++ b/apps/mobile/src/__tests__/settings-modal.test.tsx @@ -37,6 +37,16 @@ import React from 'react' import {act, fireEvent, render, screen, waitFor} from '@testing-library/react-native' +// Jest's default is 5s PER TEST, which this file alone outgrew on CI's 4-vCPU +// runners: its first `render()` also pays NativeWind's one-off style-registry +// init, and jest runs its workers alongside the website's vitest run in the +// same `turbo run test`. The whole file took 12.4s there before the jest 30 / +// @testing-library/react-native 14 bump and 19.6s after it — enough for that +// first test to cross 5s and fail CI, while the file runs in 1.8s locally. +// Nothing hangs; it's wall-clock contention. Scoped to this file so a +// genuinely stuck test elsewhere still fails fast on the 5s default. +jest.setTimeout(20_000) + jest.mock('react-native-safe-area-context', () => ({ useSafeAreaInsets: () => ({top: 0, bottom: 0, left: 0, right: 0}), })) diff --git a/apps/mobile/src/__tests__/share-modal.test.tsx b/apps/mobile/src/__tests__/share-modal.test.tsx index c0769fd3..a13ef3d8 100644 --- a/apps/mobile/src/__tests__/share-modal.test.tsx +++ b/apps/mobile/src/__tests__/share-modal.test.tsx @@ -55,8 +55,19 @@ jest.mock('react-native-safe-area-context', () => ({ // so spy on the props it's rendered with instead. jest.mock('expo-status-bar', () => ({StatusBar: jest.fn(() => null)})) -/** The `style` of the most recently rendered ``. */ -const lastStatusBarStyle = () => jest.mocked(StatusBar).mock.calls.at(-1)?.[0].style +/** + * The `style` the `` under test was rendered with. + * + * The mock is module-level, so its calls accumulate across every test in this + * file — the describe below clears them per test, and this throws rather than + * return `undefined`, so a `ShareModal` that stopped rendering a `` + * fails here instead of silently reading some earlier test's call. + */ +const lastStatusBarStyle = () => { + const {calls} = jest.mocked(StatusBar).mock + if (calls.length === 0) throw new Error(' was never rendered') + return calls.at(-1)?.[0].style +} const mockDownloadAndShareImage = jest.fn() jest.mock('@/lib/share-image', () => ({ @@ -255,6 +266,13 @@ describe('ShareModal', () => { // flip as every other themed sheet (see settings-modal.test.tsx's own // StatusBar-override coverage). describe('ShareModal — StatusBar override (issue #173)', () => { + // Ten earlier tests in this file also render ``, and nothing in + // jest.config.js/jest.setup.ts clears mocks between tests, so without this + // `lastStatusBarStyle()` would be reading a pile of accumulated calls. + beforeEach(() => { + jest.mocked(StatusBar).mockClear() + }) + it('shows light (white) status-bar icons when the resolved scheme is dark', async () => { await act(() => colorScheme.set('dark')) await render( {}} onClose={() => {}} />) From 7c7709c92b5b50986e84eeb53cf8a071aee49838 Mon Sep 17 00:00:00 2001 From: acharlop Date: Thu, 10 Sep 2026 10:30:54 +0200 Subject: [PATCH 07/17] chore(mobile): finish the NativeWind 5 migration review items MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Review follow-ups on #297. Eight findings, no behaviour change beyond the line-height fix. - Line height: v5 parses a `leading-*` step as em, not rem. `text-sm leading-5` was 1.25rem/0.875rem = 1.4286em, which is already text-sm's own line height, so the class is dropped outright. `text-xl leading-8` was 2rem/1.25rem = 1.6em, which the integer-only `@utility leading-*` override cannot express — `leading-6` (1.5em = 26.25px) is the nearest step. Covered by new assertions on the resolved `lineHeight`, of which there were none anywhere before. - New `src/__tests__/color-scheme.test.ts`: the `?? 'dark'` fallback for a platform with no OS preference, and re-asserting a manual override after an OS appearance flip. - The per-suite `afterEach(() => setColorScheme('system'))` reset moves to `jest.setup.ts` beside the StyleCollection injection; five copies deleted. - Test-only class names no longer ship: `src/global.css` gains `@source not './__tests__/**'`, and jest compiles a `jest.global.css` wrapper that adds them back. Shipped stylesheet drops from 24,770 to 20,845 bytes (175 -> 147 selectors). - The lightningcss pin gets a removal condition, cross-referenced between `pnpm-workspace.yaml` and `apps/mobile/package.json`. - `theme-css.ts` records why `.oxfmtrc.json` ignores the generated `theme.css`. - `babel.config.js`'s account of the Metro resolver corrected: Metro rewrites broadly, Babel is the narrower tool. - `docs/design/163-light-mode/proposal.md` no longer points at `colorScheme.set()` or `tailwind.config.ts`, both deleted by this PR. Refs #297 --- apps/mobile/babel.config.js | 21 ++- apps/mobile/jest.global-setup.js | 6 +- apps/mobile/jest.global.css | 11 ++ apps/mobile/jest.setup.ts | 13 ++ apps/mobile/package.json | 1 + .../mobile/src/__tests__/color-scheme.test.ts | 133 ++++++++++++++++++ apps/mobile/src/__tests__/player-bar.test.tsx | 7 - .../src/__tests__/question-text.test.tsx | 4 - .../mobile/src/__tests__/share-modal.test.tsx | 7 - .../src/__tests__/tailwind-theme.test.tsx | 40 +++++- .../__tests__/theme-settings-page.test.tsx | 16 ++- apps/mobile/src/app/index.tsx | 6 +- .../src/components/theme-settings-page.tsx | 2 +- apps/mobile/src/global.css | 13 +- docs/design/163-light-mode/proposal.md | 41 +++--- packages/tokens/src/theme-css.ts | 7 + pnpm-workspace.yaml | 10 ++ 17 files changed, 284 insertions(+), 54 deletions(-) create mode 100644 apps/mobile/jest.global.css create mode 100644 apps/mobile/src/__tests__/color-scheme.test.ts diff --git a/apps/mobile/babel.config.js b/apps/mobile/babel.config.js index fea48111..121c356a 100644 --- a/apps/mobile/babel.config.js +++ b/apps/mobile/babel.config.js @@ -12,13 +12,20 @@ module.exports = function (api) { // can't inject it — add it explicitly for the test transform only. plugins: isTest ? ['babel-plugin-react-compiler'] : [], // NativeWind v5 makes `className` work by swapping `react-native` for - // `react-native-css/components`. On device that swap is done by the Metro - // resolver (see metro.config.js), which only rewrites the app's own modules. - // Jest has no Metro, so there the rewrite has to happen in Babel — but the - // Babel transform also runs over react-native's own internals, and rewriting - // *those* deadlocks the jest-expo Image mock (react-native's LogBox imports - // Image, which would resolve back into the half-initialised mock). Scoping - // the preset to src/ keeps the rewrite where Metro would have applied it. + // `react-native-css/components`. On device the Metro resolver does that swap + // (see metro.config.js), and it does it broadly: for every origin module it + // resolves, node_modules included, and for `react-native-safe-area-context` + // and deep `react-native/Libraries/**` imports as well as bare + // `react-native`. Only react-native-css's own files and react-native's index + // itself are exempt. + // + // Jest has no Metro, so there the rewrite has to happen in Babel, which is a + // narrower tool: it only rewrites `react-native` and `react-native/` + // specifiers, never safe-area-context. It is also unscoped by default, and + // rewriting react-native's own internals deadlocks the jest-expo Image mock + // (react-native's LogBox imports Image, which would resolve back into the + // half-initialised mock). So the preset is limited to src/ — deliberately + // less than Metro rewrites, but enough for the `className` props under test. overrides: isTest ? [{test: path.join(__dirname, 'src'), presets: ['nativewind/babel']}] : [], } } diff --git a/apps/mobile/jest.global-setup.js b/apps/mobile/jest.global-setup.js index 9467b9e0..0dc335af 100644 --- a/apps/mobile/jest.global-setup.js +++ b/apps/mobile/jest.global-setup.js @@ -5,6 +5,10 @@ const path = require('node:path') * Compiles the app's real src/global.css once, before the suite runs, and caches * the result for jest.setup.ts to inject into every test. * + * The entry point is jest.global.css rather than src/global.css itself: that + * wrapper is the shipped entry plus one extra `@source` for src/__tests__, + * whose assertion-only class names the shipped stylesheet deliberately excludes. + * * This is the exact pipeline Metro runs on device (react-native-css's Metro * transformer: PostCSS/Tailwind → `compile()` → `StyleCollection.inject()`), so * the styles the tests assert on are the styles the app ships — including the @@ -22,7 +26,7 @@ module.exports = async () => { const tailwindcss = require('@tailwindcss/postcss') const {compile} = require('react-native-css/compiler') - const input = path.join(__dirname, 'src/global.css') + const input = path.join(__dirname, 'jest.global.css') const {css} = await postcss([tailwindcss()]).process(fs.readFileSync(input, 'utf8'), { from: input, }) diff --git a/apps/mobile/jest.global.css b/apps/mobile/jest.global.css new file mode 100644 index 00000000..2294bb2d --- /dev/null +++ b/apps/mobile/jest.global.css @@ -0,0 +1,11 @@ +/* + * Test-only Tailwind entry point: the stylesheet the app ships, plus the class + * names that only ever appear in `src/__tests__`. + * + * `src/global.css` deliberately does not scan the test suite (see the `@source + * not` there) so ~40 assertion-only utilities stay out of the shipped bundle. + * The tests still have to resolve them, so jest.global-setup.js compiles this + * file instead — same imports, same theme, same compiler, one extra `@source`. + */ +@import './src/global.css'; +@source './src/__tests__/**/*.{ts,tsx}'; diff --git a/apps/mobile/jest.setup.ts b/apps/mobile/jest.setup.ts index 7a9e3a3e..02c653c0 100644 --- a/apps/mobile/jest.setup.ts +++ b/apps/mobile/jest.setup.ts @@ -6,8 +6,11 @@ import 'react-native-gesture-handler/jestSetup' import {readFileSync} from 'node:fs' +import {act} from '@testing-library/react-native' import {StyleCollection} from 'react-native-css/native' +import {setColorScheme} from '@/lib/color-scheme' + // oxlint-disable-next-line typescript/no-unsafe-type-assertion -- globalSetup is CJS-only, so its one exported constant has to be require()d and re-typed here. const {STYLESHEET_PATH} = require('./jest.global-setup.js') as {STYLESHEET_PATH: string} @@ -25,3 +28,13 @@ beforeEach(() => { // oxlint-disable-next-line typescript/no-unsafe-type-assertion -- JSON round-trip of the compiler's own output. StyleCollection.inject(stylesheet as Parameters[0]) }) + +/** + * The resolved colour scheme is a process-wide observable, and the Theme setting + * that drives it is a module-level variable — so a test that renders in Light + * would otherwise hand Light to whatever runs next. Reset it here rather than in + * each suite that touches it: the leak is silent (a `dark:` class simply + * resolves to the wrong colour) and it can strike any suite, not only the ones + * that opted into a reset. + */ +afterEach(() => act(() => setColorScheme('system'))) diff --git a/apps/mobile/package.json b/apps/mobile/package.json index 1a123bb6..81cdcc38 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -67,6 +67,7 @@ "react-native-worklets": "0.8.3", "zod": "catalog:" }, + "//lightningcss": "A peer dependency of react-native-css, not something this app imports — it is listed (and pinned) only so the peer resolves. The exact version is in lockstep with the '@expo/metro-config>lightningcss' override in pnpm-workspace.yaml; that comment carries the reason for the pin and the condition for removing both. Bump the two together or not at all.", "devDependencies": { "@babel/plugin-transform-react-jsx": "^7.29.7", "@tailwindcss/postcss": "^4.3.3", diff --git a/apps/mobile/src/__tests__/color-scheme.test.ts b/apps/mobile/src/__tests__/color-scheme.test.ts new file mode 100644 index 00000000..18d09cd1 --- /dev/null +++ b/apps/mobile/src/__tests__/color-scheme.test.ts @@ -0,0 +1,133 @@ +/** + * src/lib/color-scheme.ts — the module that turns the stored Theme (a Display + * setting, CONTEXT.md) into the light/dark value every `dark:` class and every + * JS-level colour conditional reads. + * + * Two of its behaviours are invisible until they break in someone's hands: + * + * - the `?? 'dark'` fallback for a platform that reports no OS preference at + * all, without which `dark:` and its light-mode counterpart would *both* + * miss and the app would render unstyled; + * - re-asserting a manual override after an OS appearance flip. react-native-css + * registers its own `Appearance` listener that mirrors the OS value straight + * into the observable, so a phone that switches to Dark at sunset would + * silently drag a player who chose Light along with it. + * + * Both happen at *import* time — the module seeds the observable and registers + * its listener as it loads — so each case gets its own module registry. + */ +import {Appearance} from 'react-native' +import type {colorScheme} from 'react-native-css' + +import type {getColorScheme, setColorScheme} from '@/lib/color-scheme' + +type Api = {getColorScheme: typeof getColorScheme; setColorScheme: typeof setColorScheme} +type Observable = typeof colorScheme +type OsScheme = 'light' | 'dark' | null + +/** A fresh copy of the module, loaded against a stubbed OS preference. */ +const load = (initialOsScheme: OsScheme) => { + let os = initialOsScheme + let api!: Api + let observable!: Observable + const osListeners: (() => void)[] = [] + + const stubOsPreference = (appearance: typeof Appearance) => { + jest.spyOn(appearance, 'getColorScheme').mockImplementation(() => os) + jest.spyOn(appearance, 'addChangeListener').mockImplementation((listener) => { + // 'unspecified' is how the change event spells "no OS preference"; the + // getter above spells the same thing null. + osListeners.push(() => listener({colorScheme: os ?? 'unspecified'})) + return {remove: () => undefined} + }) + } + + // Synchronous requires, not `await import()`: only a synchronous require lands + // in the registry isolateModules swaps in, and the stub has to go on between + // requiring react-native and requiring the module that reads it on the way up. + jest.isolateModules(() => { + stubOsPreference(jest.requireActual<{Appearance: typeof Appearance}>('react-native').Appearance) + observable = jest.requireActual<{colorScheme: Observable}>('react-native-css').colorScheme + api = jest.requireActual('@/lib/color-scheme') + }) + + // The same stub again, on this file's own registry. `react-native`'s index is + // a lazy-getter object — `Appearance` re-`require`s the module on every + // property access, through whichever registry is live at that moment — so + // color-scheme.ts reads the isolated copy while it is being imported and this + // one for every call afterwards. Stubbing only the first leaves it reading the + // host's real (null) preference from the second assertion onwards. + stubOsPreference(Appearance) + + /** + * One OS-level appearance flip, in the order the device produces it: + * react-native-css's own listener mirrors the new value into the observable + * first (it was registered first, when it was imported), then ours runs. + */ + const flipOsTo = (next: 'light' | 'dark') => { + os = next + observable.set(next) + for (const listener of osListeners) listener() + } + + return {...api, observable, flipOsTo} +} + +afterEach(() => jest.restoreAllMocks()) + +describe('color-scheme — resolving the OS preference', () => { + it('follows the OS while the setting is System', () => { + const {getColorScheme} = load('light') + expect(getColorScheme()).toBe('light') + }) + + it('falls back to dark when the OS reports no preference', () => { + const {getColorScheme, observable} = load(null) + + expect(getColorScheme()).toBe('dark') + // Seeded, not merely computed: `dark:` compares against the observable's + // own value, so leaving it null would make every variant miss. + expect(observable.get()).toBe('dark') + }) + + it('follows the OS across a flip while the setting is System', () => { + const {getColorScheme, flipOsTo} = load('light') + + flipOsTo('dark') + + expect(getColorScheme()).toBe('dark') + }) +}) + +describe('color-scheme — manual overrides', () => { + it('overrides the OS preference', () => { + const {getColorScheme, setColorScheme} = load('dark') + + setColorScheme('light') + + expect(getColorScheme()).toBe('light') + }) + + it('re-asserts the override after an OS appearance flip', () => { + const {getColorScheme, setColorScheme, observable, flipOsTo} = load('light') + setColorScheme('light') + + // Sunset: the phone switches itself to Dark. react-native-css writes that + // into the observable; our listener has to write the override back. + flipOsTo('dark') + + expect(getColorScheme()).toBe('light') + expect(observable.get()).toBe('light') + }) + + it('hands control back to the OS when the setting returns to System', () => { + const {getColorScheme, setColorScheme, flipOsTo} = load('light') + setColorScheme('dark') + + setColorScheme('system') + expect(getColorScheme()).toBe('light') + + flipOsTo('dark') + expect(getColorScheme()).toBe('dark') + }) +}) diff --git a/apps/mobile/src/__tests__/player-bar.test.tsx b/apps/mobile/src/__tests__/player-bar.test.tsx index 6adcf77d..fab15de3 100644 --- a/apps/mobile/src/__tests__/player-bar.test.tsx +++ b/apps/mobile/src/__tests__/player-bar.test.tsx @@ -25,13 +25,6 @@ jest.mock('react-native-safe-area-context', () => ({ useSafeAreaInsets: () => ({top: 0, bottom: 0, left: 0, right: 0}), })) -afterEach(() => { - // The resolved colour scheme is a global observable — reset it so a test that - // sets it doesn't bleed into whichever test runs next (mirrors - // settings-modal.test.tsx). - act(() => setColorScheme('system')) -}) - // PressableScale drives its press animation through react-native-reanimated / // react-native-worklets, whose native module isn't available under plain // jest-expo (unrelated to this test — see pressable-scale.tsx). Swap it for a diff --git a/apps/mobile/src/__tests__/question-text.test.tsx b/apps/mobile/src/__tests__/question-text.test.tsx index 8d6c9155..6663b128 100644 --- a/apps/mobile/src/__tests__/question-text.test.tsx +++ b/apps/mobile/src/__tests__/question-text.test.tsx @@ -127,10 +127,6 @@ describe('QuestionText — themedText (issue #173, final)', () => { const question = 'What matters to you right now?' const secondaryText = '¿Qué te importa ahora mismo?' - // The resolved colour scheme is a global observable — reset it so a test that - // sets it doesn't bleed into whichever test runs next. - afterEach(() => act(() => setColorScheme('system'))) - it('defaults to hardcoded white — card surfaces (Pick a Card) omit themedText', () => { render( ({ import {ShareModal} from '../components/share-modal' -afterEach(() => { - // The resolved colour scheme is a global observable — reset it so a test that - // sets it doesn't bleed into whichever test runs next (mirrors - // settings-modal.test.tsx). - act(() => setColorScheme('system')) -}) - const PROPS = { questionText: 'What is your favorite memory?', shareUrl: 'https://whocards.cc/play?lang=en&q=q-1', diff --git a/apps/mobile/src/__tests__/tailwind-theme.test.tsx b/apps/mobile/src/__tests__/tailwind-theme.test.tsx index cd3e0881..9a8acba7 100644 --- a/apps/mobile/src/__tests__/tailwind-theme.test.tsx +++ b/apps/mobile/src/__tests__/tailwind-theme.test.tsx @@ -133,6 +133,42 @@ describe('Tailwind theme — fonts', () => { }) }) +/** + * Line height — the one silently breaking change in the NativeWind v5 upgrade. + * + * v4 emitted `leading-` as a `rem` length (`leading-8` = 2rem = 28px). v5's + * `nativewind/theme` overrides the utility to a *unitless* value, which + * react-native-css multiplies by the element's own font size — so the same + * `leading-8` is now 2em, which is 35px at `text-xl`. Nothing throws when that + * changes; the text just gets taller. These are the cases that would catch it. + * + * The migration recipe is "divide the old value by the font size": v4's + * `text-xl leading-8` is 2rem ÷ 1.25rem = 1.6em, and each v5 step is 0.25em, so + * the exact equivalent would be `leading-6.4` — which the override can't + * express (it takes integers only). `leading-6` (1.5em = 26.25px) is the + * nearest step, and what src/app/index.tsx's tagline now uses. + */ +const lineHeightOf = (className: string) => { + render() + return resolvedStyle(screen.getByTestId('line')).lineHeight +} + +describe('Tailwind theme — line height', () => { + it('gives each text size its own line height, in px', () => { + // text-sm is 0.875rem/1.25rem — so its *default* line height is exactly + // what v4's `text-sm leading-5` pinned, which is why theme-settings-page.tsx + // could drop the class outright rather than restate it as an em ratio. + expect(lineHeightOf('text-sm')).toBe(rem('1.25rem')) + expect(lineHeightOf('text-xl')).toBe(rem('1.75rem')) + }) + + it('parses a leading-* step as 0.25em, not 0.25rem', () => { + // Against text-xl's 1.25rem (17.5px) font size. + expect(lineHeightOf('text-xl leading-6')).toBe(1.5 * rem('1.25rem')) + expect(lineHeightOf('text-xl leading-8')).toBe(2 * rem('1.25rem')) + }) +}) + describe('Tailwind theme — modifiers', () => { it('applies the /NN opacity modifier to a token colour', () => { expect(styleFor('bg-primary-dark/25').backgroundColor).toBe( @@ -148,8 +184,4 @@ describe('Tailwind theme — modifiers', () => { act(() => setColorScheme('dark')) expect(styleFor('bg-canvasLight dark:bg-darkest').backgroundColor).toBe(colors.darkest) }) - - // The resolved colour scheme is a global observable — reset it so a test that - // sets it doesn't bleed into whichever test runs next. - afterEach(() => act(() => setColorScheme('system'))) }) diff --git a/apps/mobile/src/__tests__/theme-settings-page.test.tsx b/apps/mobile/src/__tests__/theme-settings-page.test.tsx index 8b4448ab..166c8c9f 100644 --- a/apps/mobile/src/__tests__/theme-settings-page.test.tsx +++ b/apps/mobile/src/__tests__/theme-settings-page.test.tsx @@ -13,7 +13,7 @@ import {act, fireEvent, render, screen} from '@testing-library/react-native' import {colors} from '@whocards/tokens' import {setColorScheme} from '@/lib/color-scheme' -import {resolvedStyle} from '@/test-utils/resolved-style' +import {rem, resolvedStyle} from '@/test-utils/resolved-style' jest.mock('react-native-safe-area-context', () => ({ useSafeAreaInsets: () => ({top: 0, bottom: 0, left: 0, right: 0}), @@ -45,6 +45,18 @@ describe('ThemeSettingsPage — options (issue #189, third pass)', () => { expect(onSelect).toHaveBeenCalledWith('light') }) + it('keeps the explanatory copy at its pre-NativeWind-5 line height', async () => { + // This copy used to carry `leading-5` on top of `text-sm`. NativeWind v5 + // reads a leading-* step as em rather than rem, which would have squashed + // 1.25rem (17.5px) to 1.4285…em × 12.25px (15.3px) — so the class was + // dropped. text-sm's own line height was already exactly 1.25rem, so this + // is the value the class was pinning all along; assert it, because nothing + // about the rendered output says the class is gone on purpose. + renderPage() + const copy = await screen.findByText(/Matches your device by default/) + expect(resolvedStyle(copy).lineHeight).toBe(rem('1.25rem')) + }) + it('reports the back arrow press via onBack', async () => { const onBack = jest.fn() renderPage('system', undefined, onBack) @@ -61,8 +73,6 @@ describe('ThemeSettingsPage — options (issue #189, third pass)', () => { const background = (label: string) => resolvedStyle(screen.getByLabelText(label)).backgroundColor describe('ThemeSettingsPage — selected segment styling', () => { - afterEach(() => act(() => setColorScheme('system'))) - it('fills the selected segment with white on light, leaving the others bare', async () => { act(() => setColorScheme('light')) renderPage('dark') diff --git a/apps/mobile/src/app/index.tsx b/apps/mobile/src/app/index.tsx index f214dcb0..16060164 100644 --- a/apps/mobile/src/app/index.tsx +++ b/apps/mobile/src/app/index.tsx @@ -157,7 +157,11 @@ export default function LandingScreen() { Change your world,{'\n'}one conversation at a time. diff --git a/apps/mobile/src/components/theme-settings-page.tsx b/apps/mobile/src/components/theme-settings-page.tsx index 31745d8b..e8fb7016 100644 --- a/apps/mobile/src/components/theme-settings-page.tsx +++ b/apps/mobile/src/components/theme-settings-page.tsx @@ -64,7 +64,7 @@ export const ThemeSettingsPage = ({current, onSelect, onBack}: ThemeSettingsPage ) })} - + Matches your device by default. Presentation only — it never changes which Card is drawn or your progress. diff --git a/apps/mobile/src/global.css b/apps/mobile/src/global.css index 12affad6..0bcfee9f 100644 --- a/apps/mobile/src/global.css +++ b/apps/mobile/src/global.css @@ -20,8 +20,19 @@ */ @import '@whocards/tokens/theme.css'; -/* Replaces Tailwind v3's `content: ['./src/**‍/*.{ts,tsx}']`. */ +/* + * Replaces Tailwind v3's `content: ['./src/**‍/*.{ts,tsx}']`. + * + * `__tests__` is excluded: Tailwind emits a utility for every class name it + * sees literally in a scanned file, and tailwind-theme.test.tsx names ~40 of + * them (one per design token) purely to assert they resolve. Scanning it would + * compile all of those into the stylesheet the app ships. The test pipeline + * needs them, so jest.global-setup.js compiles ../jest.global.css instead — + * this file plus the tests — and tailwind-theme.test.tsx fails loudly if that + * re-inclusion ever stops working. + */ @source './**/*.{ts,tsx}'; +@source not './__tests__/**'; :root { /* diff --git a/docs/design/163-light-mode/proposal.md b/docs/design/163-light-mode/proposal.md index 6c0912cd..c6d15e4f 100644 --- a/docs/design/163-light-mode/proposal.md +++ b/docs/design/163-light-mode/proposal.md @@ -316,7 +316,8 @@ Dark — not a plain two-way toggle. remembered" — not a Game, and not a decision that lives in the play engine. - Persisted device-locally via `lib/theme-store.ts` (mirrors `lib/game-store.ts`'s pattern: a global `whocards-theme` AsyncStorage key, in-memory cache, default fallback), read on boot in - `_layout.tsx` and applied via NativeWind's `colorScheme.set()`. + `_layout.tsx` and applied via `setColorScheme()` (`lib/color-scheme.ts` — originally NativeWind's + own `colorScheme.set()`; see [§ Theming mechanism](#theming-mechanism)). **Where it lives:** a new **"Theme"** chip, styled identically to the existing "Game: Global Game" quiet outline chip on the Library screen, opening a page-sheet in the same house style as @@ -330,24 +331,28 @@ see [§ Overlapping in-flight work](#overlapping-in-flight-work-and-how-it-was-r ## Theming mechanism -**NativeWind's built-in `dark:` variant + `colorScheme` API** — no new theming library, no -Tailwind config changes needed. - -- `apps/mobile/tailwind.config.ts` needed no changes: NativeWind v4 wires the `dark:` class - variant to a runtime `colorScheme` observable automatically. Out of the box, with nothing - called, it already follows `Appearance` (confirmed by reading - `react-native-css-interop`'s `appearance-observables.js` — `systemColorScheme` tracks - `Appearance.getColorScheme()` and `colorScheme.get()` falls back to it whenever no explicit - override has been set). "System-follow" is the _default_ behavior, not something this - implementation had to build. -- `colorScheme.set('light' | 'dark' | 'system')` (imperative, from `'nativewind'`) sets or clears - a manual override. `useColorScheme()` (also from `'nativewind'`) returns the live resolved - `{colorScheme: 'light' | 'dark'}` for the rare JS-level conditional (an `Ionicons` `color` prop, - a `StatusBar` `style`, picking which `Image` source to `require`) that can't be expressed as a - `dark:` class. +**NativeWind's built-in `dark:` variant + a colour-scheme observable** — no new theming library, +no Tailwind config changes needed. + +- ~~`apps/mobile/tailwind.config.ts` needed no changes~~ _(historical: there is no + `tailwind.config.ts` any more — the NativeWind v5 / Tailwind v4 upgrade moved the theme into + CSS, `apps/mobile/src/global.css`, generated from `@whocards/tokens`.)_ NativeWind wires the + `dark:` class variant to a runtime colour-scheme observable automatically, and out of the box, + with nothing called, it already follows `Appearance`. "System-follow" is the _default_ + behavior, not something this implementation had to build. +- ~~`colorScheme.set('light' | 'dark' | 'system')` (imperative, from `'nativewind'`)~~ + _(historical: v5 dropped that export. The underlying `react-native-css` observable is + two-valued — light or dark, seeded from `Appearance` — so "system" became the app's job, and + `apps/mobile/src/lib/color-scheme.ts` is now the one module that owns it.)_ + `setColorScheme('light' | 'dark' | 'system')` sets or clears the manual override, and + `useColorScheme()` (both from `@/lib/color-scheme`) returns the live resolved + `'light' | 'dark'` for the rare JS-level conditional (an `Ionicons` `color` prop, a `StatusBar` + `style`, picking which `Image` source to `require`) that can't be expressed as a `dark:` class. + Deliberately _not_ `Appearance.setColorScheme()`: that overrides what `Appearance` reports, so + once used the real OS preference is unreadable and "System" could never resolve back to it. - `apps/mobile/src/hooks/use-theme-setting.ts` is the one new piece of glue: on mount, reads - `getStoredTheme()` and calls `colorScheme.set()` with it; exposes a `select(next)` that updates - the colorScheme, persists it, and fires the `theme_changed` observability event. + `getStoredTheme()` and calls `setColorScheme()` with it; exposes a `select(next)` that updates + the colour scheme, persists it, and fires the `theme_changed` observability event. - **Status bar handling, deliberately NOT made globally theme-aware:** `_layout.tsx`'s root `` default is untouched. Play and Pick a Card are _always_ dark (amendment 2) and need light status-bar icons regardless of the Theme setting — if the root diff --git a/packages/tokens/src/theme-css.ts b/packages/tokens/src/theme-css.ts index 8007b197..3383dbd4 100644 --- a/packages/tokens/src/theme-css.ts +++ b/packages/tokens/src/theme-css.ts @@ -9,6 +9,13 @@ * committed next to them and imported by both apps. `theme-css.test.ts` fails * if the committed file ever drifts from this renderer. * + * That drift check is byte-exact, which is why `.oxfmtrc.json` lists + * `packages/tokens/theme.css` under `ignorePatterns`: oxfmt rewraps the five + * long `--font-*` declarations this renderer emits on one line each, and a + * formatted `theme.css` can never equal `renderThemeCss()` again — the check + * would fail on a clean checkout and stay failing. Formatting the *generated* + * file is meaningless anyway; format this renderer instead, and regenerate. + * * Keep in sync with the Tailwind v4 theme namespaces: * https://tailwindcss.com/docs/theme#theme-variable-namespaces */ diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 8bdb1ef2..98f3217f 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -50,6 +50,16 @@ catalog: # Metro build (and the jest globalSetup that mirrors it) would fail. 1.30.1 is # the version NativeWind's v5 migration guide pins. Scoped to @expo/metro-config # so @tailwindcss/node keeps its own exact 1.32.0 for the website build. +# +# Removable once a lightningcss release deserializes visitor specifiers again, +# or once react-native-css stops routing through @expo/metro-config's copy. The +# check is cheap and local: delete this entry, reinstall, and run +# `pnpm --filter mobile test` — jest's globalSetup drives the same +# PostCSS/Tailwind → lightningcss path Metro does, so it throws the same +# deserialize error if the bug is still there. Unpin it together with the +# matching `lightningcss` devDependency in apps/mobile/package.json (see the +# `//lightningcss` note there) — that one satisfies react-native-css's peer +# range, and the two versions have to stay identical. overrides: '@expo/metro-config>lightningcss': 1.30.1 From ed0dc6e67444b1d2d5035577ce4ac213b8abbd05 Mon Sep 17 00:00:00 2001 From: acharlop Date: Thu, 10 Sep 2026 10:39:31 +0200 Subject: [PATCH 08/17] test(mobile): UI snapshots recorded pre-upgrade, replayed against RN 0.86.3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Evidence that this upgrade did not change what a player sees, on the JS side. Two suites cover the three screens (Library, player, root layout) and the interactive surfaces (Settings sheet + its four pages, Share sheet, player bar): 19 snapshots in a pixel-only format — host component type, the FLATTENED resolved style one property per line, rendered text, and the accessibility props that have a presentational effect. Function props, refs, testIDs and every RN-internal prop are dropped, so a release that renames its internals doesn't churn the suite and train everyone to run `jest -u` without reading the diff. Both baselines were RECORDED ON origin/main (RN 0.85.3 / jest 29 / RNTL 13) in a scratch checkout and then replayed, untouched, here under RN 0.86.3 / jest 30 / RNTL 14. All 19 pass byte-for-byte; the only edit to either .snap is its first line, Jest's own file-format guide-link marker, which jest 30 refuses to read in jest 29's form. The test files avoid the RNTL 13/14 differences deliberately (awaited `render`/`fireEvent`, no `UNSAFE_*` queries) so the same file runs on both toolchains. What this cannot see: the native side. Yoga's layout maths, text shaping and shadow rasterisation are invisible to a JS-side render, so a clean run says the JS render is unchanged, not that the screen is. That still needs the Maestro pass on a device — hence `pnpm -F mobile ui-diff`, which captures the store screenshot flow on one ref and compares it frame-for-frame with another. Also here: `src/test-utils/ui-snapshot.ts` (the serializer, with `flattenStyle` as the single place a style gets resolved for tests) and `src/test-utils/reanimated-mock.ts` (a settled, synchronous reanimated, since the real package's Worklets native half can't initialize under jest-expo). Refs #295 --- apps/mobile/.gitignore | 5 + apps/mobile/.maestro/README.md | 54 ++ apps/mobile/package.json | 1 + apps/mobile/scripts/ui-diff.sh | 204 +++++ .../ui-snapshot-screens.test.tsx.snap | 496 ++++++++++ .../ui-snapshot-surfaces.test.tsx.snap | 864 ++++++++++++++++++ .../__tests__/ui-snapshot-screens.test.tsx | 292 ++++++ .../__tests__/ui-snapshot-surfaces.test.tsx | 215 +++++ apps/mobile/src/test-utils/reanimated-mock.ts | 154 ++++ apps/mobile/src/test-utils/ui-snapshot.ts | 175 ++++ 10 files changed, 2460 insertions(+) create mode 100755 apps/mobile/scripts/ui-diff.sh create mode 100644 apps/mobile/src/__tests__/__snapshots__/ui-snapshot-screens.test.tsx.snap create mode 100644 apps/mobile/src/__tests__/__snapshots__/ui-snapshot-surfaces.test.tsx.snap create mode 100644 apps/mobile/src/__tests__/ui-snapshot-screens.test.tsx create mode 100644 apps/mobile/src/__tests__/ui-snapshot-surfaces.test.tsx create mode 100644 apps/mobile/src/test-utils/reanimated-mock.ts create mode 100644 apps/mobile/src/test-utils/ui-snapshot.ts diff --git a/apps/mobile/.gitignore b/apps/mobile/.gitignore index 93355211..d2fd5af3 100644 --- a/apps/mobile/.gitignore +++ b/apps/mobile/.gitignore @@ -50,3 +50,8 @@ example # generated store-listing screenshots (regenerate with `pnpm -F mobile screenshots`) store-assets/ + +# before/after upgrade captures (`pnpm -F mobile ui-diff capture