From c9ea0b456e821e5ca88401d79cbe0777f425a061 Mon Sep 17 00:00:00 2001 From: Asher Cohen Date: Wed, 29 Jul 2026 11:28:34 -0700 Subject: [PATCH 1/7] feat(reports): add decision synthesis Keep report interpretation server-owned so web, mobile, and shared snapshots present the same evidence and caveats.\n\nRefs #2171 --- .../2026-07-29-decision-oriented-reports.md | 70 +++++ packages/mobile/app/reports.test.tsx | 16 + packages/mobile/app/reports.tsx | 113 +++---- .../ReportDecisionSynthesis.stories.tsx | 45 +++ .../ReportDecisionSynthesis.test.tsx | 37 +++ .../components/ReportDecisionSynthesis.tsx | 48 +++ .../monthly-report-repository.test.ts | 5 +- .../repositories/monthly-report-repository.ts | 12 +- .../report-decision-synthesis.test.ts | 203 +++++++++++++ .../repositories/report-decision-synthesis.ts | 275 ++++++++++++++++++ .../weekly-report-repository.test.ts | 3 +- .../repositories/weekly-report-repository.ts | 12 +- .../server/src/routers/health-report.test.ts | 16 + packages/server/src/types.ts | 1 + .../MonthlyReportContent.stories.tsx | 16 + .../components/MonthlyReportContent.test.tsx | 10 +- .../src/components/MonthlyReportContent.tsx | 2 + .../ReportDecisionSynthesis.stories.tsx | 45 +++ .../ReportDecisionSynthesis.test.tsx | 31 ++ .../components/ReportDecisionSynthesis.tsx | 32 ++ .../components/WeeklyReportCard.stories.tsx | 19 ++ .../src/components/WeeklyReportCard.test.tsx | 11 + .../web/src/components/WeeklyReportCard.tsx | 168 +++++------ .../web/src/routes/health-report.test.tsx | 37 ++- packages/web/src/routes/health-report.tsx | 24 +- packages/web/src/routes/monthly-report.tsx | 2 +- packages/web/src/routes/weekly-report.tsx | 2 +- 27 files changed, 1112 insertions(+), 143 deletions(-) create mode 100644 docs/superpowers/plans/2026-07-29-decision-oriented-reports.md create mode 100644 packages/mobile/components/ReportDecisionSynthesis.stories.tsx create mode 100644 packages/mobile/components/ReportDecisionSynthesis.test.tsx create mode 100644 packages/mobile/components/ReportDecisionSynthesis.tsx create mode 100644 packages/server/src/repositories/report-decision-synthesis.test.ts create mode 100644 packages/server/src/repositories/report-decision-synthesis.ts create mode 100644 packages/web/src/components/ReportDecisionSynthesis.stories.tsx create mode 100644 packages/web/src/components/ReportDecisionSynthesis.test.tsx create mode 100644 packages/web/src/components/ReportDecisionSynthesis.tsx diff --git a/docs/superpowers/plans/2026-07-29-decision-oriented-reports.md b/docs/superpowers/plans/2026-07-29-decision-oriented-reports.md new file mode 100644 index 0000000000..8449949d0e --- /dev/null +++ b/docs/superpowers/plans/2026-07-29-decision-oriented-reports.md @@ -0,0 +1,70 @@ +# Decision-Oriented Reports TDD Plan + +**Goal:** Make weekly and monthly reports explain what the available data supports doing next instead of only repeating dashboard metrics. + +**Behavior:** The server adds a deterministic decision synthesis to every non-empty weekly and monthly report. The synthesis covers what changed, descriptive associations, what appears to have worked, one next experiment, and evidence limitations or missing data. Web, iOS, and new shared-report snapshots render the same server-owned synthesis without recomputing health meaning. + +**Scope:** Use the period summaries already returned by the report repositories. Keep the existing metric snapshots and sharing flow, avoid causal claims or a new analytics query, and preserve compatibility with shared snapshots created before the synthesis field existed. + +**Related issue:** [#2171](https://github.com/Asherlc/dofek/issues/2171) + +--- + +## Current Evidence + +- `WeeklyReportRepository` and `MonthlyReportRepository` return current and historical metric aggregates but no decision synthesis. +- `WeeklyReportCard`, `MonthlyReportContent`, and the iOS reports screen render metric grids independently. +- Shared reports persist the same server response as JSON; the web shared-report route validates old snapshots at runtime. + +## Test Strategy + +- Unit: prove the server synthesizer handles improvements, trade-offs, missing sleep/recovery data, and insufficient history without causal wording. +- Repository: prove empty reports have no synthesis and non-empty weekly/monthly reports attach server-generated synthesis. +- Web: prove both report components render all five synthesis sections and old shared snapshots still parse. +- Mobile: prove the reports screen renders the same server-provided synthesis and performs no client calculation. + +## File Structure + +- Create `packages/server/src/repositories/report-decision-synthesis.ts` and its colocated test for the shared server domain model. +- Modify weekly/monthly report repositories and tests to attach synthesis. +- Create web and mobile report-synthesis components with colocated tests and stories. +- Modify weekly/monthly web report components, the shared-report parser, and the mobile reports screen to render the server response. + +## Tasks + +### Task 1: Add Failing Server Tests + +- [ ] Add unit cases for changed metrics, descriptive co-movement, positive evidence, next-step copy, observed-period context, and missing-data limitations. +- [ ] Add repository assertions for synthesis presence and absence. +- [ ] Run `rtk pnpm exec vitest run packages/server/src/repositories/report-decision-synthesis.test.ts packages/server/src/repositories/weekly-report-repository.test.ts packages/server/src/repositories/monthly-report-repository.test.ts`. +- [ ] Confirm the tests fail because the synthesis contract does not exist. + +### Task 2: Implement the Server Synthesis + +- [ ] Add the minimum shared synthesis type and deterministic weekly/monthly builders. +- [ ] Attach the result after repository metrics have been computed. +- [ ] Run the focused server tests and confirm they pass. + +### Task 3: Add Failing Client Tests + +- [ ] Require all five server-provided sections on web weekly/monthly reports and iOS. +- [ ] Require shared-report parsing to accept both new synthesis snapshots and legacy snapshots without the field. +- [ ] Run `rtk pnpm exec vitest run packages/web/src/components/ReportDecisionSynthesis.test.tsx packages/web/src/components/WeeklyReportCard.test.tsx packages/web/src/components/MonthlyReportContent.test.tsx packages/web/src/routes/health-report.test.tsx --project web`. +- [ ] Run `rtk pnpm exec vitest run packages/mobile/components/ReportDecisionSynthesis.test.tsx packages/mobile/app/reports.test.tsx --project mobile`. +- [ ] Confirm the tests fail because the synthesis is not rendered. + +### Task 4: Implement Web and iOS Parity + +- [ ] Add small render-only synthesis components and representative stories. +- [ ] Render the server payload on weekly, monthly, mobile, and newly shared reports. +- [ ] Keep legacy shared reports readable without generating decisions on the client. +- [ ] Run the focused web/mobile tests and confirm they pass. + +### Task 5: Final Verification + +- [ ] Run `rtk pnpm lint`. +- [ ] Run `rtk pnpm tsc --noEmit`. +- [ ] Run `rtk pnpm --dir packages/server tsc --noEmit`. +- [ ] Run `rtk pnpm --dir packages/web tsc --noEmit`. +- [ ] Run `rtk pnpm test`. +- [ ] Build both Storybook catalogs if the focused checks pass. diff --git a/packages/mobile/app/reports.test.tsx b/packages/mobile/app/reports.test.tsx index 413b28cab6..3d641c438e 100644 --- a/packages/mobile/app/reports.test.tsx +++ b/packages/mobile/app/reports.test.tsx @@ -35,6 +35,13 @@ vi.mock("../lib/trpc", () => ({ avgHrv: 48, }, history: [], + decisionSupport: { + whatChanged: ["Weekly training increased."], + likelyAssociations: ["Training and sleep moved together."], + whatWorked: ["Sleep stayed consistent."], + whatToTryNext: ["Repeat the routine next week."], + confidenceAndMissingData: ["Confidence is limited."], + }, }, isLoading: false, error: null, @@ -63,6 +70,13 @@ vi.mock("../lib/trpc", () => ({ avgSleepTrend: null, }, history: [], + decisionSupport: { + whatChanged: ["Monthly training increased."], + likelyAssociations: ["Training and sleep moved together."], + whatWorked: ["Sleep stayed consistent."], + whatToTryNext: ["Repeat the routine next month."], + confidenceAndMissingData: ["Confidence is limited."], + }, }, isLoading: false, error: monthlyQueryControl.showError @@ -103,6 +117,8 @@ describe("ReportsScreen", () => { expect(screen.getAllByText("Average Heart Rate Variability (HRV)")).toHaveLength(2); expect(screen.getByRole("button", { name: "Share weekly report" })).toBeTruthy(); expect(screen.getByRole("button", { name: "Share monthly report" })).toBeTruthy(); + expect(screen.getByText("Weekly training increased.")).toBeTruthy(); + expect(screen.getByText("Monthly training increased.")).toBeTruthy(); expect(mockWeeklyReportQuery).toHaveBeenCalledWith( { weeks: 12, endDate: "2026-07-24" }, { retry: false }, diff --git a/packages/mobile/app/reports.tsx b/packages/mobile/app/reports.tsx index 9c3cfdecae..ea0fae9a2f 100644 --- a/packages/mobile/app/reports.tsx +++ b/packages/mobile/app/reports.tsx @@ -8,6 +8,7 @@ import { ScrollView, StyleSheet, Text, View } from "react-native"; import { Card } from "../components/Card"; import { HealthReportShareButton } from "../components/HealthReportShareButton"; import { getQueryErrorMessage, QueryStatePanel } from "../components/QueryStatePanel"; +import { ReportDecisionSynthesis } from "../components/ReportDecisionSynthesis"; import { trpc } from "../lib/trpc"; import { useTodayQueryDate } from "../lib/useTodayQueryDate"; import { colors, spacing } from "../theme"; @@ -34,7 +35,7 @@ export default function ReportsScreen() { Health Reports - Create shareable snapshots from the health data calculated by Dofek. + See what changed, what the data suggests, and what to compare next. @@ -52,33 +53,38 @@ export default function ReportsScreen() { ) : weeklyReport.isLoading ? ( ) : weeklyReport.data?.current ? ( - - - Week of {formatDateShort(weeklyReport.data.current.weekStart)} - - - - - 0 - ? formatDurationMinutes(weeklyReport.data.current.avgSleepMinutes) - : "Not tracked" - } - /> - - - + <> + {weeklyReport.data.decisionSupport ? ( + + ) : null} + + + Week of {formatDateShort(weeklyReport.data.current.weekStart)} + + + + + 0 + ? formatDurationMinutes(weeklyReport.data.current.avgSleepMinutes) + : "Not tracked" + } + /> + + + + ) : ( )} @@ -96,29 +102,34 @@ export default function ReportsScreen() { ) : monthlyReport.isLoading ? ( ) : monthlyReport.data?.current ? ( - - - {formatMonthYear(monthlyReport.data.current.monthStart)} - - - - - - - - + <> + {monthlyReport.data.decisionSupport ? ( + + ) : null} + + + {formatMonthYear(monthlyReport.data.current.monthStart)} + + + + + + + + + ) : ( )} diff --git a/packages/mobile/components/ReportDecisionSynthesis.stories.tsx b/packages/mobile/components/ReportDecisionSynthesis.stories.tsx new file mode 100644 index 0000000000..a7094a7b5a --- /dev/null +++ b/packages/mobile/components/ReportDecisionSynthesis.stories.tsx @@ -0,0 +1,45 @@ +import type { Meta, StoryObj } from "@storybook/react-native"; +import { ReportDecisionSynthesis } from "./ReportDecisionSynthesis"; + +const synthesis = { + whatChanged: [ + "Training was 6 hours, 50% more than the previous week.", + "Average nightly sleep was 7 hours, 30 minutes less than the previous week.", + ], + likelyAssociations: [ + "Higher training coincided with less sleep and lower heart rate variability this week. This is a descriptive association, not evidence that one change caused another.", + ], + whatWorked: [ + "You completed 4 activities; no recovery improvement is clear in the available weekly metrics.", + ], + whatToTryNext: [ + "Keep training near 6 hours and protect the sleep schedule next week, then compare sleep and recovery again before increasing volume.", + ], + confidenceAndMissingData: [ + "Confidence is limited because only 2 weekly periods are available.", + "These period averages can show co-movement, but they cannot establish cause and effect.", + ], +}; + +const meta = { + title: "Reports/ReportDecisionSynthesis", + component: ReportDecisionSynthesis, + args: { synthesis }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const MissingData: Story = { + args: { + synthesis: { + ...synthesis, + confidenceAndMissingData: [ + ...synthesis.confidenceAndMissingData, + "Missing current-period data: sleep and heart rate variability.", + ], + }, + }, +}; diff --git a/packages/mobile/components/ReportDecisionSynthesis.test.tsx b/packages/mobile/components/ReportDecisionSynthesis.test.tsx new file mode 100644 index 0000000000..16b634f30c --- /dev/null +++ b/packages/mobile/components/ReportDecisionSynthesis.test.tsx @@ -0,0 +1,37 @@ +/** @vitest-environment jsdom */ +import { render, screen } from "@testing-library/react"; +import { describe, expect, it, vi } from "vitest"; +import { ReportDecisionSynthesis } from "./ReportDecisionSynthesis"; + +vi.mock("../theme", () => ({ + colors: new Proxy({}, { get: () => "#71717a" }), + radius: { xl: 16 }, + spacing: { xs: 4, sm: 8, md: 16, lg: 24, xl: 32 }, +})); + +describe("ReportDecisionSynthesis", () => { + it("renders every server-provided decision section without interpreting values", () => { + render( + , + ); + + expect(screen.getByText("What changed")).toBeTruthy(); + expect(screen.getByText("Likely associations")).toBeTruthy(); + expect(screen.getByText("What worked")).toBeTruthy(); + expect(screen.getByText("What to try next")).toBeTruthy(); + expect(screen.getByText("Confidence and missing data")).toBeTruthy(); + expect(screen.getByText("Training increased while sleep decreased.")).toBeTruthy(); + expect(screen.getByText("Missing current-period data: resting heart rate.")).toBeTruthy(); + }); +}); diff --git a/packages/mobile/components/ReportDecisionSynthesis.tsx b/packages/mobile/components/ReportDecisionSynthesis.tsx new file mode 100644 index 0000000000..3897b00c0b --- /dev/null +++ b/packages/mobile/components/ReportDecisionSynthesis.tsx @@ -0,0 +1,48 @@ +import type { ReportDecisionSynthesis as ReportDecisionSynthesisData } from "dofek-server/types"; +import { StyleSheet, Text, View } from "react-native"; +import { colors, spacing } from "../theme"; +import { Card } from "./Card"; + +const sections: { + key: keyof ReportDecisionSynthesisData; + title: string; +}[] = [ + { key: "whatChanged", title: "What changed" }, + { key: "likelyAssociations", title: "Likely associations" }, + { key: "whatWorked", title: "What worked" }, + { key: "whatToTryNext", title: "What to try next" }, + { key: "confidenceAndMissingData", title: "Confidence and missing data" }, +]; + +export function ReportDecisionSynthesis({ synthesis }: { synthesis: ReportDecisionSynthesisData }) { + return ( + + {sections.map((section) => ( + + {section.title} + {synthesis[section.key].map((item) => ( + + {item} + + ))} + + ))} + + ); +} + +const styles = StyleSheet.create({ + section: { + gap: spacing.xs, + }, + heading: { + color: colors.text, + fontSize: 14, + fontWeight: "600", + }, + body: { + color: colors.textSecondary, + fontSize: 14, + lineHeight: 20, + }, +}); diff --git a/packages/server/src/repositories/monthly-report-repository.test.ts b/packages/server/src/repositories/monthly-report-repository.test.ts index b84ad40a6a..955a18cc35 100644 --- a/packages/server/src/repositories/monthly-report-repository.test.ts +++ b/packages/server/src/repositories/monthly-report-repository.test.ts @@ -123,7 +123,7 @@ describe("MonthlyReportRepository", () => { it("returns null current and empty history for empty rows", async () => { const { repo } = makeRepository([]); const result = await repo.getReport(6); - expect(result).toEqual({ current: null, history: [] }); + expect(result).toEqual({ current: null, history: [], decisionSupport: null }); }); it("binds the requested user and month window", async () => { @@ -145,6 +145,9 @@ describe("MonthlyReportRepository", () => { expect(result.current?.trainingHoursTrend).toBeNull(); expect(result.current?.avgSleepTrend).toBeNull(); expect(result.history).toEqual([]); + expect(result.decisionSupport?.whatChanged).toEqual([ + "This is the first observed month, so month-over-month changes are not available yet.", + ]); }); it("returns multiple months with trends computed correctly", async () => { diff --git a/packages/server/src/repositories/monthly-report-repository.ts b/packages/server/src/repositories/monthly-report-repository.ts index 98da92476b..9399ca16d3 100644 --- a/packages/server/src/repositories/monthly-report-repository.ts +++ b/packages/server/src/repositories/monthly-report-repository.ts @@ -1,6 +1,10 @@ import { z } from "zod"; import { dateStringSchema } from "../lib/typed-sql.ts"; import type { ActivitySensorStore } from "./activity-repository.ts"; +import { + buildMonthlyDecisionSynthesis, + type ReportDecisionSynthesis, +} from "./report-decision-synthesis.ts"; // --------------------------------------------------------------------------- // Types // --------------------------------------------------------------------------- @@ -22,6 +26,8 @@ export interface MonthSummary { export interface MonthlyReportResult { current: MonthSummary | null; history: MonthSummary[]; + /** Server-owned interpretation rendered identically by every client. */ + decisionSupport: ReportDecisionSynthesis | null; } // --------------------------------------------------------------------------- @@ -214,6 +220,10 @@ export class MonthlyReportRepository { const current = summaries.length > 0 ? (summaries[summaries.length - 1] ?? null) : null; const history = summaries.slice(0, -1); - return { current, history }; + return { + current, + history, + decisionSupport: current ? buildMonthlyDecisionSynthesis(current, history) : null, + }; } } diff --git a/packages/server/src/repositories/report-decision-synthesis.test.ts b/packages/server/src/repositories/report-decision-synthesis.test.ts new file mode 100644 index 0000000000..001ea0b868 --- /dev/null +++ b/packages/server/src/repositories/report-decision-synthesis.test.ts @@ -0,0 +1,203 @@ +import { describe, expect, it } from "vitest"; +import { + buildMonthlyDecisionSynthesis, + buildWeeklyDecisionSynthesis, +} from "./report-decision-synthesis.ts"; + +describe("buildWeeklyDecisionSynthesis", () => { + it("turns current-versus-previous metrics into decision support without a causal claim", () => { + const synthesis = buildWeeklyDecisionSynthesis( + { + weekStart: "2026-07-20", + trainingHours: 6, + activityCount: 4, + avgDailyLoad: 80, + avgSleepMinutes: 420, + sleepPerformancePct: 95, + avgReadiness: 0, + avgRestingHr: 55, + avgHrv: 48, + }, + [ + { + weekStart: "2026-07-13", + trainingHours: 4, + activityCount: 3, + avgDailyLoad: 60, + avgSleepMinutes: 450, + sleepPerformancePct: 102, + avgReadiness: 0, + avgRestingHr: 54, + avgHrv: 52, + }, + ], + ); + + expect(synthesis.whatChanged).toEqual([ + "Training was 6 hours, 50% more than the previous week.", + "Average nightly sleep was 7 hours, 30 minutes less than the previous week.", + ]); + expect(synthesis.likelyAssociations).toEqual([ + "Higher training coincided with less sleep and lower heart rate variability this week. This is a descriptive association, not evidence that one change caused another.", + ]); + expect(synthesis.whatWorked).toEqual([ + "You completed 4 activities; no recovery improvement is clear in the available weekly metrics.", + ]); + expect(synthesis.whatToTryNext).toEqual([ + "Keep training near 6 hours and protect the sleep schedule next week, then compare sleep and recovery again before increasing volume.", + ]); + expect(synthesis.confidenceAndMissingData).toEqual([ + "Confidence is limited because only 2 weekly periods are available.", + "These period averages can show co-movement, but they cannot establish cause and effect.", + ]); + }); + + it("names missing recovery data and avoids inventing an association", () => { + const synthesis = buildWeeklyDecisionSynthesis( + { + weekStart: "2026-07-20", + trainingHours: 2, + activityCount: 1, + avgDailyLoad: 20, + avgSleepMinutes: 0, + sleepPerformancePct: 0, + avgReadiness: 0, + avgRestingHr: null, + avgHrv: null, + }, + [], + ); + + expect(synthesis.likelyAssociations).toEqual([ + "No training-and-recovery association can be assessed yet because there is no comparison week with tracked sleep and recovery.", + ]); + expect(synthesis.whatToTryNext).toEqual([ + "Track sleep and recovery through the next week so the report can compare training with recovery.", + ]); + expect(synthesis.confidenceAndMissingData).toContain( + "Missing current-period data: sleep, resting heart rate, and heart rate variability.", + ); + }); + + it("recognizes a sustained routine without labeling a neutral direction as good or bad", () => { + const synthesis = buildWeeklyDecisionSynthesis( + { + weekStart: "2026-07-20", + trainingHours: 4, + activityCount: 3, + avgDailyLoad: 60, + avgSleepMinutes: 455, + sleepPerformancePct: 101, + avgReadiness: 0, + avgRestingHr: 53, + avgHrv: 54, + }, + [ + { + weekStart: "2026-07-13", + trainingHours: 4, + activityCount: 3, + avgDailyLoad: 60, + avgSleepMinutes: 450, + sleepPerformancePct: 100, + avgReadiness: 0, + avgRestingHr: 54, + avgHrv: 52, + }, + { + weekStart: "2026-07-06", + trainingHours: 3.5, + activityCount: 3, + avgDailyLoad: 55, + avgSleepMinutes: 445, + sleepPerformancePct: 99, + avgReadiness: 0, + avgRestingHr: 54, + avgHrv: 51, + }, + { + weekStart: "2026-06-29", + trainingHours: 4, + activityCount: 4, + avgDailyLoad: 58, + avgSleepMinutes: 450, + sleepPerformancePct: 100, + avgReadiness: 0, + avgRestingHr: 55, + avgHrv: 50, + }, + ], + ); + + expect(synthesis.whatWorked).toEqual([ + "Training volume stayed steady while sleep, resting heart rate, and heart rate variability were stable or improved.", + ]); + expect(synthesis.confidenceAndMissingData[0]).toBe( + "Confidence is moderate because 4 weekly periods are available and the current period includes sleep and recovery data.", + ); + }); +}); + +describe("buildMonthlyDecisionSynthesis", () => { + it("synthesizes monthly trade-offs from server-computed trends", () => { + const synthesis = buildMonthlyDecisionSynthesis( + { + monthStart: "2026-07-01", + trainingHours: 24, + activityCount: 12, + avgDailyStrain: 8, + avgSleepMinutes: 420, + avgRestingHr: 56, + avgHrv: 45, + trainingHoursTrend: 20, + avgSleepTrend: -6.7, + }, + [ + { + monthStart: "2026-06-01", + trainingHours: 20, + activityCount: 10, + avgDailyStrain: 7, + avgSleepMinutes: 450, + avgRestingHr: 54, + avgHrv: 50, + trainingHoursTrend: null, + avgSleepTrend: null, + }, + ], + ); + + expect(synthesis.whatChanged).toEqual([ + "Training was 24 hours, 20% more than the previous month.", + "Average nightly sleep was 7 hours, 6.7% less than the previous month.", + ]); + expect(synthesis.likelyAssociations[0]).toContain( + "Higher training coincided with less sleep and lower heart rate variability this month.", + ); + expect(synthesis.whatToTryNext[0]).toContain("Keep training near 24 hours"); + }); + + it("reports unavailable monthly comparisons and missing metrics", () => { + const synthesis = buildMonthlyDecisionSynthesis( + { + monthStart: "2026-07-01", + trainingHours: 0, + activityCount: 0, + avgDailyStrain: 0, + avgSleepMinutes: 0, + avgRestingHr: null, + avgHrv: null, + trainingHoursTrend: null, + avgSleepTrend: null, + }, + [], + ); + + expect(synthesis.whatChanged).toEqual([ + "This is the first observed month, so month-over-month changes are not available yet.", + ]); + expect(synthesis.confidenceAndMissingData).toContain( + "Missing current-period data: sleep, resting heart rate, and heart rate variability.", + ); + }); +}); diff --git a/packages/server/src/repositories/report-decision-synthesis.ts b/packages/server/src/repositories/report-decision-synthesis.ts new file mode 100644 index 0000000000..114baab77f --- /dev/null +++ b/packages/server/src/repositories/report-decision-synthesis.ts @@ -0,0 +1,275 @@ +export interface ReportDecisionSynthesis { + whatChanged: string[]; + likelyAssociations: string[]; + whatWorked: string[]; + whatToTryNext: string[]; + confidenceAndMissingData: string[]; +} + +interface WeeklyDecisionPeriod { + trainingHours: number; + activityCount: number; + avgSleepMinutes: number; + avgRestingHr: number | null; + avgHrv: number | null; +} + +interface MonthlyDecisionPeriod extends WeeklyDecisionPeriod { + trainingHoursTrend: number | null; + avgSleepTrend: number | null; +} + +type PeriodKind = "week" | "month"; + +function formatNumber(value: number, maximumFractionDigits = 1): string { + return new Intl.NumberFormat("en-US", { maximumFractionDigits }).format(value); +} + +function formatHours(hours: number): string { + const value = formatNumber(hours); + return `${value} ${hours === 1 ? "hour" : "hours"}`; +} + +function formatDuration(minutes: number): string { + const roundedMinutes = Math.round(minutes); + const hours = Math.floor(roundedMinutes / 60); + const remainder = roundedMinutes % 60; + const parts: string[] = []; + if (hours > 0) parts.push(`${hours} ${hours === 1 ? "hour" : "hours"}`); + if (remainder > 0) parts.push(`${remainder} ${remainder === 1 ? "minute" : "minutes"}`); + return parts.length > 0 ? parts.join(" ") : "0 minutes"; +} + +function relativeChange(current: number, previous: number): number | null { + if (previous <= 0) return null; + return Math.round(((current - previous) / previous) * 1_000) / 10; +} + +function describeTrainingChange( + current: number, + previous: number, + kind: PeriodKind, + suppliedTrend?: number | null, +): string { + const change = suppliedTrend ?? relativeChange(current, previous); + if (change == null) { + return current > 0 + ? `Training was ${formatHours(current)}, up from no recorded training in the previous ${kind}.` + : `No training was recorded in either the current or previous ${kind}.`; + } + if (change === 0) { + return `Training held steady at ${formatHours(current)} versus the previous ${kind}.`; + } + return `Training was ${formatHours(current)}, ${formatNumber(Math.abs(change))}% ${ + change > 0 ? "more" : "less" + } than the previous ${kind}.`; +} + +function describeWeeklySleepChange(current: number, previous: number): string { + if (current <= 0 || previous <= 0) { + return "A week-over-week sleep change is unavailable because sleep was not tracked in both weeks."; + } + const difference = Math.round(current - previous); + if (difference === 0) { + return `Average nightly sleep held steady at ${formatDuration(current)}.`; + } + return `Average nightly sleep was ${formatDuration(current)}, ${formatDuration( + Math.abs(difference), + )} ${difference > 0 ? "more" : "less"} than the previous week.`; +} + +function describeMonthlySleepChange(current: number, trend: number | null): string { + if (current <= 0 || trend == null) { + return "A month-over-month sleep change is unavailable because sleep was not tracked in both months."; + } + if (trend === 0) { + return `Average nightly sleep held steady at ${formatDuration(current)}.`; + } + return `Average nightly sleep was ${formatDuration(current)}, ${formatNumber( + Math.abs(trend), + )}% ${trend > 0 ? "more" : "less"} than the previous month.`; +} + +function comparisonDirection(current: number, previous: number): "higher" | "lower" | "steady" { + if (current > previous) return "higher"; + if (current < previous) return "lower"; + return "steady"; +} + +function buildAssociation( + current: WeeklyDecisionPeriod, + previous: WeeklyDecisionPeriod | undefined, + kind: PeriodKind, +): string { + if ( + !previous || + current.avgSleepMinutes <= 0 || + previous.avgSleepMinutes <= 0 || + current.avgHrv == null || + previous.avgHrv == null + ) { + return `No training-and-recovery association can be assessed yet because there is no comparison ${kind} with tracked sleep and recovery.`; + } + + const training = comparisonDirection(current.trainingHours, previous.trainingHours); + const sleep = comparisonDirection(current.avgSleepMinutes, previous.avgSleepMinutes); + const heartRateVariability = comparisonDirection(current.avgHrv, previous.avgHrv); + + if (training === "steady") { + return `With training volume steady, sleep was ${sleep} and heart rate variability was ${heartRateVariability} this ${kind}. This is a descriptive association, not evidence that one change caused another.`; + } + + return `${training === "higher" ? "Higher" : "Lower"} training coincided with ${ + sleep === "higher" ? "more" : sleep === "lower" ? "less" : "steady" + } sleep and ${ + heartRateVariability === "higher" + ? "higher" + : heartRateVariability === "lower" + ? "lower" + : "steady" + } heart rate variability this ${kind}. This is a descriptive association, not evidence that one change caused another.`; +} + +function buildWhatWorked( + current: WeeklyDecisionPeriod, + previous: WeeklyDecisionPeriod | undefined, + kind: PeriodKind, +): string { + if (!previous) { + return "There is not enough history yet to identify a repeatable positive pattern."; + } + + const trainingSteady = Math.abs(current.trainingHours - previous.trainingHours) < 0.1; + const sleepDidNotFall = + current.avgSleepMinutes > 0 && + previous.avgSleepMinutes > 0 && + current.avgSleepMinutes >= previous.avgSleepMinutes; + const restingHeartRateDidNotRise = + current.avgRestingHr != null && + previous.avgRestingHr != null && + current.avgRestingHr <= previous.avgRestingHr; + const heartRateVariabilityDidNotFall = + current.avgHrv != null && previous.avgHrv != null && current.avgHrv >= previous.avgHrv; + + if ( + trainingSteady && + sleepDidNotFall && + restingHeartRateDidNotRise && + heartRateVariabilityDidNotFall + ) { + return "Training volume stayed steady while sleep, resting heart rate, and heart rate variability were stable or improved."; + } + + if (sleepDidNotFall && heartRateVariabilityDidNotFall) { + return `You completed ${current.activityCount} ${ + current.activityCount === 1 ? "activity" : "activities" + } while sleep and heart rate variability were stable or improved.`; + } + + return `You completed ${current.activityCount} ${ + current.activityCount === 1 ? "activity" : "activities" + }; no recovery improvement is clear in the available ${kind}ly metrics.`; +} + +function missingData(current: WeeklyDecisionPeriod): string[] { + const missing: string[] = []; + if (current.avgSleepMinutes <= 0) missing.push("sleep"); + if (current.avgRestingHr == null) missing.push("resting heart rate"); + if (current.avgHrv == null) missing.push("heart rate variability"); + return missing; +} + +function joinList(items: string[]): string { + if (items.length === 1) return items[0] ?? ""; + if (items.length === 2) return `${items[0]} and ${items[1]}`; + return `${items.slice(0, -1).join(", ")}, and ${items.at(-1)}`; +} + +function confidenceAndMissingData( + current: WeeklyDecisionPeriod, + periodCount: number, + kind: PeriodKind, +): string[] { + const missing = missingData(current); + const periodLabel = `${kind}ly periods`; + const confidence = + periodCount >= 4 && missing.length === 0 + ? `Confidence is moderate because ${periodCount} ${periodLabel} are available and the current period includes sleep and recovery data.` + : `Confidence is ${periodCount === 1 ? "low" : "limited"} because only ${periodCount} ${periodLabel.slice( + 0, + -1, + )}${periodCount === 1 ? "" : "s"} ${periodCount === 1 ? "is" : "are"} available.`; + const result = [ + confidence, + "These period averages can show co-movement, but they cannot establish cause and effect.", + ]; + if (missing.length > 0) { + result.push(`Missing current-period data: ${joinList(missing)}.`); + } + return result; +} + +function buildNextStep( + current: WeeklyDecisionPeriod, + previous: WeeklyDecisionPeriod | undefined, + kind: PeriodKind, +): string { + if (missingData(current).length > 0) { + return `Track sleep and recovery through the next ${kind} so the report can compare training with recovery.`; + } + if (!previous) { + return `Repeat or deliberately adjust one part of the routine next ${kind}, then compare it with this baseline.`; + } + if ( + current.trainingHours > previous.trainingHours && + current.avgSleepMinutes < previous.avgSleepMinutes + ) { + return `Keep training near ${formatHours( + current.trainingHours, + )} and protect the sleep schedule next ${kind}, then compare sleep and recovery again before increasing volume.`; + } + return `Keep one major input steady next ${kind}—training volume or sleep schedule—so the following comparison is easier to interpret.`; +} + +export function buildWeeklyDecisionSynthesis( + current: WeeklyDecisionPeriod, + history: WeeklyDecisionPeriod[], +): ReportDecisionSynthesis { + const previous = history.at(-1); + return { + whatChanged: previous + ? [ + describeTrainingChange(current.trainingHours, previous.trainingHours, "week"), + describeWeeklySleepChange(current.avgSleepMinutes, previous.avgSleepMinutes), + ] + : ["This is the first observed week, so week-over-week changes are not available yet."], + likelyAssociations: [buildAssociation(current, previous, "week")], + whatWorked: [buildWhatWorked(current, previous, "week")], + whatToTryNext: [buildNextStep(current, previous, "week")], + confidenceAndMissingData: confidenceAndMissingData(current, history.length + 1, "week"), + }; +} + +export function buildMonthlyDecisionSynthesis( + current: MonthlyDecisionPeriod, + history: MonthlyDecisionPeriod[], +): ReportDecisionSynthesis { + const previous = history.at(-1); + return { + whatChanged: previous + ? [ + describeTrainingChange( + current.trainingHours, + previous.trainingHours, + "month", + current.trainingHoursTrend, + ), + describeMonthlySleepChange(current.avgSleepMinutes, current.avgSleepTrend), + ] + : ["This is the first observed month, so month-over-month changes are not available yet."], + likelyAssociations: [buildAssociation(current, previous, "month")], + whatWorked: [buildWhatWorked(current, previous, "month")], + whatToTryNext: [buildNextStep(current, previous, "month")], + confidenceAndMissingData: confidenceAndMissingData(current, history.length + 1, "month"), + }; +} diff --git a/packages/server/src/repositories/weekly-report-repository.test.ts b/packages/server/src/repositories/weekly-report-repository.test.ts index 234943f24e..a407c4d405 100644 --- a/packages/server/src/repositories/weekly-report-repository.test.ts +++ b/packages/server/src/repositories/weekly-report-repository.test.ts @@ -157,7 +157,7 @@ describe("WeeklyReportRepository", () => { it("returns null current and empty history for empty rows", async () => { const { repo } = makeRepository([]); const result = await repo.getReport(4, "2026-03-28"); - expect(result).toEqual({ current: null, history: [] }); + expect(result).toEqual({ current: null, history: [], decisionSupport: null }); }); it("returns single week as current with no history", async () => { @@ -179,6 +179,7 @@ describe("WeeklyReportRepository", () => { expect(result.history).toHaveLength(2); expect(result.history[0]?.weekStart).toBe("2026-03-09"); expect(result.history[1]?.weekStart).toBe("2026-03-16"); + expect(result.decisionSupport?.whatChanged).toHaveLength(2); }); it("trims to the requested number of weeks", async () => { diff --git a/packages/server/src/repositories/weekly-report-repository.ts b/packages/server/src/repositories/weekly-report-repository.ts index e3c77dcf04..ac4518e357 100644 --- a/packages/server/src/repositories/weekly-report-repository.ts +++ b/packages/server/src/repositories/weekly-report-repository.ts @@ -2,6 +2,10 @@ import { z } from "zod"; import { dateWindowStartString } from "../lib/date-window.ts"; import { dateStringSchema } from "../lib/typed-sql.ts"; import type { ActivitySensorStore } from "./activity-repository.ts"; +import { + buildWeeklyDecisionSynthesis, + type ReportDecisionSynthesis, +} from "./report-decision-synthesis.ts"; // --------------------------------------------------------------------------- // Types @@ -33,6 +37,8 @@ export interface WeeklyReportResult { current: WeekSummary | null; /** Previous weeks for comparison */ history: WeekSummary[]; + /** Server-owned interpretation rendered identically by every client. */ + decisionSupport: ReportDecisionSynthesis | null; } // --------------------------------------------------------------------------- @@ -243,6 +249,10 @@ export class WeeklyReportRepository { const current = cutoffWeeks.length > 0 ? (cutoffWeeks[cutoffWeeks.length - 1] ?? null) : null; const history = cutoffWeeks.slice(0, -1); - return { current, history }; + return { + current, + history, + decisionSupport: current ? buildWeeklyDecisionSynthesis(current, history) : null, + }; } } diff --git a/packages/server/src/routers/health-report.test.ts b/packages/server/src/routers/health-report.test.ts index 8ba4f4d67e..19086d0f35 100644 --- a/packages/server/src/routers/health-report.test.ts +++ b/packages/server/src/routers/health-report.test.ts @@ -91,6 +91,14 @@ describe("healthReportRouter", () => { avgHrv: 45.3, }, history: [], + decisionSupport: expect.objectContaining({ + whatChanged: [ + "This is the first observed week, so week-over-week changes are not available yet.", + ], + whatToTryNext: [ + "Repeat or deliberately adjust one part of the routine next week, then compare it with this baseline.", + ], + }), }, null, ); @@ -145,6 +153,14 @@ describe("healthReportRouter", () => { avgSleepTrend: null, }, history: [], + decisionSupport: expect.objectContaining({ + whatChanged: [ + "This is the first observed month, so month-over-month changes are not available yet.", + ], + whatToTryNext: [ + "Repeat or deliberately adjust one part of the routine next month, then compare it with this baseline.", + ], + }), }, 30, ); diff --git a/packages/server/src/types.ts b/packages/server/src/types.ts index 52ab7fba15..aa01466bbd 100644 --- a/packages/server/src/types.ts +++ b/packages/server/src/types.ts @@ -19,6 +19,7 @@ export type { ClimbingSessionSummaryRow, ClimbingVolumeByGradeRow, } from "./repositories/climbing-repository.ts"; +export type { ReportDecisionSynthesis } from "./repositories/report-decision-synthesis.ts"; // Training router types export type { HrZoneRow, diff --git a/packages/web/src/components/MonthlyReportContent.stories.tsx b/packages/web/src/components/MonthlyReportContent.stories.tsx index 1f4c274861..eda3f1a4e9 100644 --- a/packages/web/src/components/MonthlyReportContent.stories.tsx +++ b/packages/web/src/components/MonthlyReportContent.stories.tsx @@ -18,6 +18,22 @@ const meta = { avgSleepTrend: -2, }, history: [], + decisionSupport: { + whatChanged: [ + "This is the first observed month, so month-over-month changes are not available yet.", + ], + likelyAssociations: [ + "No training-and-recovery association can be assessed yet because there is no comparison month with tracked sleep and recovery.", + ], + whatWorked: ["There is not enough history yet to identify a repeatable positive pattern."], + whatToTryNext: [ + "Repeat or deliberately adjust one part of the routine next month, then compare it with this baseline.", + ], + confidenceAndMissingData: [ + "Confidence is low because only 1 monthly period is available.", + "These period averages can show co-movement, but they cannot establish cause and effect.", + ], + }, }, }, } satisfies Meta; diff --git a/packages/web/src/components/MonthlyReportContent.test.tsx b/packages/web/src/components/MonthlyReportContent.test.tsx index 11c9f9c7bf..3123571cee 100644 --- a/packages/web/src/components/MonthlyReportContent.test.tsx +++ b/packages/web/src/components/MonthlyReportContent.test.tsx @@ -34,6 +34,13 @@ describe("MonthlyReportContent", () => { avgSleepTrend: null, }, ], + decisionSupport: { + whatChanged: ["Monthly training increased."], + likelyAssociations: ["Training and sleep moved together."], + whatWorked: ["Sleep stayed consistent."], + whatToTryNext: ["Repeat the routine next month."], + confidenceAndMissingData: ["Confidence is limited."], + }, }} />, ); @@ -44,13 +51,14 @@ describe("MonthlyReportContent", () => { expect(screen.getByText("June 2026")).toBeTruthy(); expect(screen.getByText("+10.0%")).toBeTruthy(); expect(screen.getByText("-2.0%")).toBeTruthy(); + expect(screen.getByText("Monthly training increased.")).toBeTruthy(); const neutralTrendColor = `rgb(${Number.parseInt(textColors.secondary.slice(1, 3), 16)}, ${Number.parseInt(textColors.secondary.slice(3, 5), 16)}, ${Number.parseInt(textColors.secondary.slice(5, 7), 16)})`; expect(screen.getByText("+10.0%").style.color).toBe(neutralTrendColor); expect(screen.getByText("-2.0%").style.color).toBe(neutralTrendColor); }); it("renders the empty state", () => { - render(); + render(); expect(screen.getByText("Not enough data for a monthly report yet.")).toBeTruthy(); }); diff --git a/packages/web/src/components/MonthlyReportContent.tsx b/packages/web/src/components/MonthlyReportContent.tsx index 29a4c32387..0f0e070515 100644 --- a/packages/web/src/components/MonthlyReportContent.tsx +++ b/packages/web/src/components/MonthlyReportContent.tsx @@ -1,6 +1,7 @@ import { formatDurationMinutes, formatHRV, formatMonthYear } from "@dofek/format/format"; import { textColors } from "@dofek/scoring/colors"; import type { MonthlyReportResult, MonthSummary } from "dofek-server/types"; +import { ReportDecisionSynthesis } from "./ReportDecisionSynthesis.tsx"; export function MonthlyReportContent({ data }: { data: MonthlyReportResult | undefined }) { if (!data || (!data.current && data.history.length === 0)) { @@ -13,6 +14,7 @@ export function MonthlyReportContent({ data }: { data: MonthlyReportResult | und return (
+ {data.decisionSupport && } {data.current && (

Current Month

diff --git a/packages/web/src/components/ReportDecisionSynthesis.stories.tsx b/packages/web/src/components/ReportDecisionSynthesis.stories.tsx new file mode 100644 index 0000000000..e74dc76e80 --- /dev/null +++ b/packages/web/src/components/ReportDecisionSynthesis.stories.tsx @@ -0,0 +1,45 @@ +import type { Meta, StoryObj } from "@storybook/react-vite"; +import { ReportDecisionSynthesis } from "./ReportDecisionSynthesis.tsx"; + +const synthesis = { + whatChanged: [ + "Training was 6 hours, 50% more than the previous week.", + "Average nightly sleep was 7 hours, 30 minutes less than the previous week.", + ], + likelyAssociations: [ + "Higher training coincided with less sleep and lower heart rate variability this week. This is a descriptive association, not evidence that one change caused another.", + ], + whatWorked: [ + "You completed 4 activities; no recovery improvement is clear in the available weekly metrics.", + ], + whatToTryNext: [ + "Keep training near 6 hours and protect the sleep schedule next week, then compare sleep and recovery again before increasing volume.", + ], + confidenceAndMissingData: [ + "Confidence is limited because only 2 weekly periods are available.", + "These period averages can show co-movement, but they cannot establish cause and effect.", + ], +}; + +const meta = { + title: "Reports/ReportDecisionSynthesis", + component: ReportDecisionSynthesis, + args: { synthesis }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const Default: Story = {}; + +export const MissingData: Story = { + args: { + synthesis: { + ...synthesis, + confidenceAndMissingData: [ + ...synthesis.confidenceAndMissingData, + "Missing current-period data: sleep and heart rate variability.", + ], + }, + }, +}; diff --git a/packages/web/src/components/ReportDecisionSynthesis.test.tsx b/packages/web/src/components/ReportDecisionSynthesis.test.tsx new file mode 100644 index 0000000000..167e9220bf --- /dev/null +++ b/packages/web/src/components/ReportDecisionSynthesis.test.tsx @@ -0,0 +1,31 @@ +/** @vitest-environment jsdom */ +import { render, screen } from "@testing-library/react"; +import { describe, expect, it } from "vitest"; +import { ReportDecisionSynthesis } from "./ReportDecisionSynthesis.tsx"; + +describe("ReportDecisionSynthesis", () => { + it("renders every server-provided decision section without interpreting values", () => { + render( + , + ); + + expect(screen.getByRole("heading", { name: "What changed" })).toBeTruthy(); + expect(screen.getByRole("heading", { name: "Likely associations" })).toBeTruthy(); + expect(screen.getByRole("heading", { name: "What worked" })).toBeTruthy(); + expect(screen.getByRole("heading", { name: "What to try next" })).toBeTruthy(); + expect(screen.getByRole("heading", { name: "Confidence and missing data" })).toBeTruthy(); + expect(screen.getByText("Training increased while sleep decreased.")).toBeTruthy(); + expect(screen.getByText("Missing current-period data: resting heart rate.")).toBeTruthy(); + }); +}); diff --git a/packages/web/src/components/ReportDecisionSynthesis.tsx b/packages/web/src/components/ReportDecisionSynthesis.tsx new file mode 100644 index 0000000000..2a20583fab --- /dev/null +++ b/packages/web/src/components/ReportDecisionSynthesis.tsx @@ -0,0 +1,32 @@ +import type { ReportDecisionSynthesis as ReportDecisionSynthesisData } from "dofek-server/types"; + +const sections: { + key: keyof ReportDecisionSynthesisData; + title: string; +}[] = [ + { key: "whatChanged", title: "What changed" }, + { key: "likelyAssociations", title: "Likely associations" }, + { key: "whatWorked", title: "What worked" }, + { key: "whatToTryNext", title: "What to try next" }, + { key: "confidenceAndMissingData", title: "Confidence and missing data" }, +]; + +export function ReportDecisionSynthesis({ synthesis }: { synthesis: ReportDecisionSynthesisData }) { + return ( +
+

Decision summary

+
+ {sections.map((section) => ( +
+

{section.title}

+
    + {synthesis[section.key].map((item) => ( +
  • {item}
  • + ))} +
+
+ ))} +
+
+ ); +} diff --git a/packages/web/src/components/WeeklyReportCard.stories.tsx b/packages/web/src/components/WeeklyReportCard.stories.tsx index 718347f7b4..ebf9e3da51 100644 --- a/packages/web/src/components/WeeklyReportCard.stories.tsx +++ b/packages/web/src/components/WeeklyReportCard.stories.tsx @@ -31,6 +31,25 @@ const meta = { avgReadiness: 72, }, ], + decisionSupport: { + whatChanged: [ + "Training was 8.5 hours, 13.3% more than the previous week.", + "Average nightly sleep was 7 hours 30 minutes, 20 minutes more than the previous week.", + ], + likelyAssociations: [ + "Higher training coincided with more sleep and higher heart rate variability this week. This is a descriptive association, not evidence that one change caused another.", + ], + whatWorked: [ + "You completed 6 activities while sleep and heart rate variability were stable or improved.", + ], + whatToTryNext: [ + "Keep one major input steady next week—training volume or sleep schedule—so the following comparison is easier to interpret.", + ], + confidenceAndMissingData: [ + "Confidence is limited because only 2 weekly periods are available.", + "These period averages can show co-movement, but they cannot establish cause and effect.", + ], + }, }, }, } satisfies Meta; diff --git a/packages/web/src/components/WeeklyReportCard.test.tsx b/packages/web/src/components/WeeklyReportCard.test.tsx index 03ea17337b..6eab92f473 100644 --- a/packages/web/src/components/WeeklyReportCard.test.tsx +++ b/packages/web/src/components/WeeklyReportCard.test.tsx @@ -20,12 +20,20 @@ describe("WeeklyReportCard", () => { avgHrv: null, }, history: [], + decisionSupport: { + whatChanged: ["Weekly training increased."], + likelyAssociations: ["Training and sleep moved together."], + whatWorked: ["Sleep stayed consistent."], + whatToTryNext: ["Repeat the routine next week."], + confidenceAndMissingData: ["Confidence is limited."], + }, }} />, ); expect(screen.getByText("Sleep not tracked")).toBeTruthy(); expect(screen.getByText("Not tracked")).toBeTruthy(); + expect(screen.getByText("Weekly training increased.")).toBeTruthy(); }); it("shows no-training status instead of optimal when the week has no activities", () => { @@ -44,6 +52,7 @@ describe("WeeklyReportCard", () => { avgHrv: 52, }, history: [], + decisionSupport: null, }} />, ); @@ -67,6 +76,7 @@ describe("WeeklyReportCard", () => { avgHrv: 52, }, history: [], + decisionSupport: null, }} />, ); @@ -102,6 +112,7 @@ describe("WeeklyReportCard", () => { avgHrv: null, }, ], + decisionSupport: null, }} />, ); diff --git a/packages/web/src/components/WeeklyReportCard.tsx b/packages/web/src/components/WeeklyReportCard.tsx index 1c7ff0d910..77e58491e7 100644 --- a/packages/web/src/components/WeeklyReportCard.tsx +++ b/packages/web/src/components/WeeklyReportCard.tsx @@ -2,6 +2,7 @@ import { formatDateShort, formatDurationMinutes, formatHRV } from "@dofek/format import { sleepPerformanceColor } from "@dofek/scoring/scoring"; import type { WeeklyReportResult } from "dofek-server/types"; import { ChartLoadingSkeleton } from "./LoadingSkeleton.tsx"; +import { ReportDecisionSynthesis } from "./ReportDecisionSynthesis.tsx"; interface WeeklyReportCardProps { data: WeeklyReportResult | undefined; @@ -27,93 +28,98 @@ export function WeeklyReportCard({ data, loading }: WeeklyReportCardProps) { const prevWeek = history.length > 0 ? history[history.length - 1] : null; return ( -
-
-
-

Weekly Performance

-

Week of {formatDateShort(current.weekStart)}

-
- {!sleepWasTracked ? ( -
- Sleep not tracked -
- ) : !hasTraining ? ( -
- No training +
+ {data.decisionSupport && } +
+
+
+

Weekly Performance

+

Week of {formatDateShort(current.weekStart)}

- ) : null} -
+ {!sleepWasTracked ? ( +
+ Sleep not tracked +
+ ) : !hasTraining ? ( +
+ No training +
+ ) : null} +
-
- - - {current.sleepPerformancePct}% of avg - - ) : ( - "Track sleep to compare weeks" - ) - } - prevValue={ - prevWeek && prevWeek.avgSleepMinutes > 0 - ? formatDurationMinutes(prevWeek.avgSleepMinutes) - : undefined - } - /> - - -
+
+ + + {current.sleepPerformancePct}% of avg + + ) : ( + "Track sleep to compare weeks" + ) + } + prevValue={ + prevWeek && prevWeek.avgSleepMinutes > 0 + ? formatDurationMinutes(prevWeek.avgSleepMinutes) + : undefined + } + /> + + +
- {/* Neutral recent-week activity history */} - {history.length > 0 && ( -
-

Recent weeks

-
- {history.slice(-8).map((week) => { - const weekHasTraining = week.activityCount > 0 || week.trainingHours > 0; - return ( + {/* Neutral recent-week activity history */} + {history.length > 0 && ( +
+

Recent weeks

+
+ {history.slice(-8).map((week) => { + const weekHasTraining = week.activityCount > 0 || week.trainingHours > 0; + return ( +
+ ); + })} + {hasTraining ? ( +
+ ) : (
- ); - })} - {hasTraining ? ( -
- ) : ( -
- )} + )} +
-
- )} + )} +
); } diff --git a/packages/web/src/routes/health-report.test.tsx b/packages/web/src/routes/health-report.test.tsx index c24cadcdcb..a2acd5071c 100644 --- a/packages/web/src/routes/health-report.test.tsx +++ b/packages/web/src/routes/health-report.test.tsx @@ -41,8 +41,17 @@ vi.mock("../components/PageLayout.tsx", () => ({ })); vi.mock("../components/WeeklyReportCard.tsx", () => ({ - WeeklyReportCard: ({ data }: { data?: { current: { weekStart: string } | null } }) => ( -
Weekly snapshot {data?.current?.weekStart}
+ WeeklyReportCard: ({ + data, + }: { + data?: { + current: { weekStart: string } | null; + decisionSupport?: { whatChanged: string[] } | null; + }; + }) => ( +
+ Weekly snapshot {data?.current?.weekStart} {data?.decisionSupport?.whatChanged[0]} +
), })); @@ -140,6 +149,30 @@ describe("health report route", () => { expect(screen.getByText("Weekly snapshot 2026-07-19")).toBeTruthy(); }); + it("renders decision support stored in a new shared report snapshot", () => { + mockGetShared.mockReturnValue({ + data: { + ...weeklyReport, + reportData: { + ...weeklyReport.reportData, + decisionSupport: { + whatChanged: ["Weekly training increased."], + likelyAssociations: ["Training and sleep moved together."], + whatWorked: ["Sleep stayed consistent."], + whatToTryNext: ["Repeat the routine next week."], + confidenceAndMissingData: ["Confidence is limited."], + }, + }, + }, + error: null, + isLoading: false, + }); + + renderRoute("new-shared-token"); + + expect(screen.getByText(/Weekly training increased/)).toBeTruthy(); + }); + it("renders a valid monthly shared report", () => { mockGetShared.mockReturnValue({ data: { diff --git a/packages/web/src/routes/health-report.tsx b/packages/web/src/routes/health-report.tsx index 98d615995d..b4af0dbf6d 100644 --- a/packages/web/src/routes/health-report.tsx +++ b/packages/web/src/routes/health-report.tsx @@ -47,9 +47,18 @@ const weekSummarySchema = z.object({ avgHrv: z.number().nullable(), }); +const reportDecisionSynthesisSchema = z.object({ + whatChanged: z.array(z.string()), + likelyAssociations: z.array(z.string()), + whatWorked: z.array(z.string()), + whatToTryNext: z.array(z.string()), + confidenceAndMissingData: z.array(z.string()), +}); + const weeklyReportSchema = z.object({ current: weekSummarySchema.nullable(), history: z.array(weekSummarySchema), + decisionSupport: reportDecisionSynthesisSchema.nullable().optional(), }); const monthSummarySchema = z.object({ @@ -67,6 +76,7 @@ const monthSummarySchema = z.object({ const monthlyReportSchema = z.object({ current: monthSummarySchema.nullable(), history: z.array(monthSummarySchema), + decisionSupport: reportDecisionSynthesisSchema.nullable().optional(), }); const REPORT_PAGE_SIZE = 20; @@ -123,7 +133,12 @@ function SharedHealthReport({ token }: { token: string }) { if (parsedReport.success) { return ( - + ); } @@ -134,7 +149,12 @@ function SharedHealthReport({ token }: { token: string }) { if (parsedReport.success) { return ( - + ); } diff --git a/packages/web/src/routes/monthly-report.tsx b/packages/web/src/routes/monthly-report.tsx index f8ced643d0..a538240772 100644 --- a/packages/web/src/routes/monthly-report.tsx +++ b/packages/web/src/routes/monthly-report.tsx @@ -19,7 +19,7 @@ function MonthlyReportPage() { return ( Date: Wed, 29 Jul 2026 11:47:14 -0700 Subject: [PATCH 2/7] fix(reports): harden decision output Use display-rounded pluralization and occurrence-aware React keys, and document the canonical sandbox verification path.\n\nRefs #2171 --- .../2026-07-29-decision-oriented-reports.md | 17 ++++++------ .../ReportDecisionSynthesis.test.tsx | 24 +++++++++++++++++ .../components/ReportDecisionSynthesis.tsx | 15 ++++++++--- .../report-decision-synthesis.test.ts | 25 ++++++++++++++++++ .../repositories/report-decision-synthesis.ts | 5 ++-- .../ReportDecisionSynthesis.test.tsx | 26 ++++++++++++++++++- .../components/ReportDecisionSynthesis.tsx | 13 ++++++++-- 7 files changed, 109 insertions(+), 16 deletions(-) diff --git a/docs/superpowers/plans/2026-07-29-decision-oriented-reports.md b/docs/superpowers/plans/2026-07-29-decision-oriented-reports.md index 8449949d0e..be928869e4 100644 --- a/docs/superpowers/plans/2026-07-29-decision-oriented-reports.md +++ b/docs/superpowers/plans/2026-07-29-decision-oriented-reports.md @@ -36,7 +36,7 @@ - [ ] Add unit cases for changed metrics, descriptive co-movement, positive evidence, next-step copy, observed-period context, and missing-data limitations. - [ ] Add repository assertions for synthesis presence and absence. -- [ ] Run `rtk pnpm exec vitest run packages/server/src/repositories/report-decision-synthesis.test.ts packages/server/src/repositories/weekly-report-repository.test.ts packages/server/src/repositories/monthly-report-repository.test.ts`. +- [ ] Run `pnpm exec vitest run packages/server/src/repositories/report-decision-synthesis.test.ts packages/server/src/repositories/weekly-report-repository.test.ts packages/server/src/repositories/monthly-report-repository.test.ts`. - [ ] Confirm the tests fail because the synthesis contract does not exist. ### Task 2: Implement the Server Synthesis @@ -49,8 +49,8 @@ - [ ] Require all five server-provided sections on web weekly/monthly reports and iOS. - [ ] Require shared-report parsing to accept both new synthesis snapshots and legacy snapshots without the field. -- [ ] Run `rtk pnpm exec vitest run packages/web/src/components/ReportDecisionSynthesis.test.tsx packages/web/src/components/WeeklyReportCard.test.tsx packages/web/src/components/MonthlyReportContent.test.tsx packages/web/src/routes/health-report.test.tsx --project web`. -- [ ] Run `rtk pnpm exec vitest run packages/mobile/components/ReportDecisionSynthesis.test.tsx packages/mobile/app/reports.test.tsx --project mobile`. +- [ ] Run `pnpm exec vitest run packages/web/src/components/ReportDecisionSynthesis.test.tsx packages/web/src/components/WeeklyReportCard.test.tsx packages/web/src/components/MonthlyReportContent.test.tsx packages/web/src/routes/health-report.test.tsx --project unit`. +- [ ] Run `pnpm exec vitest run packages/mobile/components/ReportDecisionSynthesis.test.tsx packages/mobile/app/reports.test.tsx --project mobile`. - [ ] Confirm the tests fail because the synthesis is not rendered. ### Task 4: Implement Web and iOS Parity @@ -62,9 +62,10 @@ ### Task 5: Final Verification -- [ ] Run `rtk pnpm lint`. -- [ ] Run `rtk pnpm tsc --noEmit`. -- [ ] Run `rtk pnpm --dir packages/server tsc --noEmit`. -- [ ] Run `rtk pnpm --dir packages/web tsc --noEmit`. -- [ ] Run `rtk pnpm test`. +- [ ] In Codex cloud, initialize with `SANDBOX=1 mise run cloud:init` and run the complete Docker-free verification entrypoint with `mise run test:sandbox`. +- [ ] Outside the Codex cloud sandbox, run `pnpm lint`. +- [ ] Run `pnpm typecheck`. +- [ ] Run `pnpm --dir packages/server typecheck`. +- [ ] Run `pnpm --dir packages/web typecheck`. +- [ ] Run `pnpm test`. - [ ] Build both Storybook catalogs if the focused checks pass. diff --git a/packages/mobile/components/ReportDecisionSynthesis.test.tsx b/packages/mobile/components/ReportDecisionSynthesis.test.tsx index 16b634f30c..17bbe2d50b 100644 --- a/packages/mobile/components/ReportDecisionSynthesis.test.tsx +++ b/packages/mobile/components/ReportDecisionSynthesis.test.tsx @@ -34,4 +34,28 @@ describe("ReportDecisionSynthesis", () => { expect(screen.getByText("Training increased while sleep decreased.")).toBeTruthy(); expect(screen.getByText("Missing current-period data: resting heart rate.")).toBeTruthy(); }); + + it("renders repeated server strings without duplicate React keys", () => { + const consoleError = vi.spyOn(console, "error").mockImplementation(() => undefined); + + render( + , + ); + + expect(screen.getAllByText("Repeated evidence.")).toHaveLength(2); + expect( + consoleError.mock.calls.some( + ([message]) => typeof message === "string" && message.includes("same key"), + ), + ).toBe(false); + consoleError.mockRestore(); + }); }); diff --git a/packages/mobile/components/ReportDecisionSynthesis.tsx b/packages/mobile/components/ReportDecisionSynthesis.tsx index 3897b00c0b..fbd041e7f8 100644 --- a/packages/mobile/components/ReportDecisionSynthesis.tsx +++ b/packages/mobile/components/ReportDecisionSynthesis.tsx @@ -14,15 +14,24 @@ const sections: { { key: "confidenceAndMissingData", title: "Confidence and missing data" }, ]; +function keyedItems(items: string[]): { key: string; text: string }[] { + const occurrences = new Map(); + return items.map((text) => { + const occurrence = occurrences.get(text) ?? 0; + occurrences.set(text, occurrence + 1); + return { key: JSON.stringify([text, occurrence]), text }; + }); +} + export function ReportDecisionSynthesis({ synthesis }: { synthesis: ReportDecisionSynthesisData }) { return ( {sections.map((section) => ( {section.title} - {synthesis[section.key].map((item) => ( - - {item} + {keyedItems(synthesis[section.key]).map((item) => ( + + {item.text} ))} diff --git a/packages/server/src/repositories/report-decision-synthesis.test.ts b/packages/server/src/repositories/report-decision-synthesis.test.ts index 001ea0b868..427162e436 100644 --- a/packages/server/src/repositories/report-decision-synthesis.test.ts +++ b/packages/server/src/repositories/report-decision-synthesis.test.ts @@ -79,6 +79,31 @@ describe("buildWeeklyDecisionSynthesis", () => { ); }); + it("pluralizes hours from the displayed rounded value", () => { + const synthesis = buildWeeklyDecisionSynthesis( + { + trainingHours: 0.96, + activityCount: 1, + avgSleepMinutes: 420, + avgRestingHr: 55, + avgHrv: 48, + }, + [ + { + trainingHours: 0, + activityCount: 0, + avgSleepMinutes: 420, + avgRestingHr: 55, + avgHrv: 48, + }, + ], + ); + + expect(synthesis.whatChanged[0]).toBe( + "Training was 1 hour, up from no recorded training in the previous week.", + ); + }); + it("recognizes a sustained routine without labeling a neutral direction as good or bad", () => { const synthesis = buildWeeklyDecisionSynthesis( { diff --git a/packages/server/src/repositories/report-decision-synthesis.ts b/packages/server/src/repositories/report-decision-synthesis.ts index 114baab77f..d3e86847d2 100644 --- a/packages/server/src/repositories/report-decision-synthesis.ts +++ b/packages/server/src/repositories/report-decision-synthesis.ts @@ -26,8 +26,9 @@ function formatNumber(value: number, maximumFractionDigits = 1): string { } function formatHours(hours: number): string { - const value = formatNumber(hours); - return `${value} ${hours === 1 ? "hour" : "hours"}`; + const roundedHours = Math.round(hours * 10) / 10; + const value = formatNumber(roundedHours); + return `${value} ${roundedHours === 1 ? "hour" : "hours"}`; } function formatDuration(minutes: number): string { diff --git a/packages/web/src/components/ReportDecisionSynthesis.test.tsx b/packages/web/src/components/ReportDecisionSynthesis.test.tsx index 167e9220bf..46ceb1c41b 100644 --- a/packages/web/src/components/ReportDecisionSynthesis.test.tsx +++ b/packages/web/src/components/ReportDecisionSynthesis.test.tsx @@ -1,6 +1,6 @@ /** @vitest-environment jsdom */ import { render, screen } from "@testing-library/react"; -import { describe, expect, it } from "vitest"; +import { describe, expect, it, vi } from "vitest"; import { ReportDecisionSynthesis } from "./ReportDecisionSynthesis.tsx"; describe("ReportDecisionSynthesis", () => { @@ -28,4 +28,28 @@ describe("ReportDecisionSynthesis", () => { expect(screen.getByText("Training increased while sleep decreased.")).toBeTruthy(); expect(screen.getByText("Missing current-period data: resting heart rate.")).toBeTruthy(); }); + + it("renders repeated server strings without duplicate React keys", () => { + const consoleError = vi.spyOn(console, "error").mockImplementation(() => undefined); + + render( + , + ); + + expect(screen.getAllByText("Repeated evidence.")).toHaveLength(2); + expect( + consoleError.mock.calls.some( + ([message]) => typeof message === "string" && message.includes("same key"), + ), + ).toBe(false); + consoleError.mockRestore(); + }); }); diff --git a/packages/web/src/components/ReportDecisionSynthesis.tsx b/packages/web/src/components/ReportDecisionSynthesis.tsx index 2a20583fab..787e103a45 100644 --- a/packages/web/src/components/ReportDecisionSynthesis.tsx +++ b/packages/web/src/components/ReportDecisionSynthesis.tsx @@ -11,6 +11,15 @@ const sections: { { key: "confidenceAndMissingData", title: "Confidence and missing data" }, ]; +function keyedItems(items: string[]): { key: string; text: string }[] { + const occurrences = new Map(); + return items.map((text) => { + const occurrence = occurrences.get(text) ?? 0; + occurrences.set(text, occurrence + 1); + return { key: JSON.stringify([text, occurrence]), text }; + }); +} + export function ReportDecisionSynthesis({ synthesis }: { synthesis: ReportDecisionSynthesisData }) { return (
@@ -20,8 +29,8 @@ export function ReportDecisionSynthesis({ synthesis }: { synthesis: ReportDecisi

{section.title}

    - {synthesis[section.key].map((item) => ( -
  • {item}
  • + {keyedItems(synthesis[section.key]).map((item) => ( +
  • {item.text}
  • ))}
From cb5a7c025da162f50d69efdf73a230df36da6219 Mon Sep 17 00:00:00 2001 From: Asher Cohen Date: Wed, 29 Jul 2026 12:17:22 -0700 Subject: [PATCH 3/7] test(reports): cover synthesis branches Exercise decision boundaries and missing-data combinations through the public builders so Stryker verifies the intended behavior. --- .../report-decision-synthesis.test.ts | 395 ++++++++++++++++++ .../repositories/report-decision-synthesis.ts | 6 +- 2 files changed, 397 insertions(+), 4 deletions(-) diff --git a/packages/server/src/repositories/report-decision-synthesis.test.ts b/packages/server/src/repositories/report-decision-synthesis.test.ts index 427162e436..ff3968b7b6 100644 --- a/packages/server/src/repositories/report-decision-synthesis.test.ts +++ b/packages/server/src/repositories/report-decision-synthesis.test.ts @@ -4,6 +4,29 @@ import { buildWeeklyDecisionSynthesis, } from "./report-decision-synthesis.ts"; +type WeeklyPeriod = Parameters[0]; +type MonthlyPeriod = Parameters[0]; + +function weeklyPeriod(overrides: Partial = {}): WeeklyPeriod { + return { + trainingHours: 4, + activityCount: 3, + avgSleepMinutes: 420, + avgRestingHr: 55, + avgHrv: 50, + ...overrides, + }; +} + +function monthlyPeriod(overrides: Partial = {}): MonthlyPeriod { + return { + ...weeklyPeriod(), + trainingHoursTrend: 0, + avgSleepTrend: 0, + ...overrides, + }; +} + describe("buildWeeklyDecisionSynthesis", () => { it("turns current-versus-previous metrics into decision support without a causal claim", () => { const synthesis = buildWeeklyDecisionSynthesis( @@ -104,6 +127,299 @@ describe("buildWeeklyDecisionSynthesis", () => { ); }); + it("formats fractional, grouped, and lower training values at display precision", () => { + const synthesis = buildWeeklyDecisionSynthesis( + weeklyPeriod({ trainingHours: 1_234.56, avgSleepMinutes: 61 }), + [weeklyPeriod({ trainingHours: 2_000, avgSleepMinutes: 1 })], + ); + + expect(synthesis.whatChanged).toEqual([ + "Training was 1,234.6 hours, 38.3% less than the previous week.", + "Average nightly sleep was 1 hour 1 minute, 1 hour more than the previous week.", + ]); + }); + + it("distinguishes no training from unchanged training", () => { + expect( + buildWeeklyDecisionSynthesis(weeklyPeriod({ trainingHours: 0 }), [ + weeklyPeriod({ trainingHours: 0 }), + ]).whatChanged[0], + ).toBe("No training was recorded in either the current or previous week."); + + expect(buildWeeklyDecisionSynthesis(weeklyPeriod(), [weeklyPeriod()]).whatChanged).toEqual([ + "Training held steady at 4 hours versus the previous week.", + "Average nightly sleep held steady at 7 hours.", + ]); + }); + + it("requires sleep tracking in each compared week", () => { + expect( + buildWeeklyDecisionSynthesis(weeklyPeriod({ avgSleepMinutes: 0 }), [weeklyPeriod()]) + .whatChanged[1], + ).toBe( + "A week-over-week sleep change is unavailable because sleep was not tracked in both weeks.", + ); + expect( + buildWeeklyDecisionSynthesis(weeklyPeriod(), [weeklyPeriod({ avgSleepMinutes: 0 })]) + .whatChanged[1], + ).toBe( + "A week-over-week sleep change is unavailable because sleep was not tracked in both weeks.", + ); + }); + + it("describes lower training alongside improved recovery without implying cause", () => { + const synthesis = buildWeeklyDecisionSynthesis( + weeklyPeriod({ trainingHours: 3, avgSleepMinutes: 480, avgHrv: 55 }), + [weeklyPeriod({ trainingHours: 4, avgSleepMinutes: 420, avgHrv: 50 })], + ); + + expect(synthesis.likelyAssociations).toEqual([ + "Lower training coincided with more sleep and higher heart rate variability this week. This is a descriptive association, not evidence that one change caused another.", + ]); + }); + + it("describes steady training and recovery directions explicitly", () => { + const synthesis = buildWeeklyDecisionSynthesis(weeklyPeriod(), [weeklyPeriod()]); + + expect(synthesis.likelyAssociations).toEqual([ + "With training volume steady, sleep was steady and heart rate variability was steady this week. This is a descriptive association, not evidence that one change caused another.", + ]); + }); + + it("describes steady recovery when training changes", () => { + const synthesis = buildWeeklyDecisionSynthesis(weeklyPeriod({ trainingHours: 5 }), [ + weeklyPeriod(), + ]); + + expect(synthesis.likelyAssociations).toEqual([ + "Higher training coincided with steady sleep and steady heart rate variability this week. This is a descriptive association, not evidence that one change caused another.", + ]); + }); + + it("does not assess associations when either comparison period lacks recovery data", () => { + const unavailable = + "No training-and-recovery association can be assessed yet because there is no comparison week with tracked sleep and recovery."; + + expect( + buildWeeklyDecisionSynthesis(weeklyPeriod({ avgHrv: null }), [weeklyPeriod()]) + .likelyAssociations[0], + ).toBe(unavailable); + expect( + buildWeeklyDecisionSynthesis(weeklyPeriod(), [weeklyPeriod({ avgSleepMinutes: 0 })]) + .likelyAssociations[0], + ).toBe(unavailable); + expect( + buildWeeklyDecisionSynthesis(weeklyPeriod(), [weeklyPeriod({ avgHrv: null })]) + .likelyAssociations[0], + ).toBe(unavailable); + expect( + buildWeeklyDecisionSynthesis(weeklyPeriod({ avgSleepMinutes: 0 }), [weeklyPeriod()]) + .likelyAssociations[0], + ).toBe(unavailable); + }); + + it("recognizes recovery stability when training volume changes", () => { + const synthesis = buildWeeklyDecisionSynthesis( + weeklyPeriod({ + trainingHours: 5, + activityCount: 1, + avgSleepMinutes: 430, + avgRestingHr: 60, + avgHrv: 55, + }), + [weeklyPeriod()], + ); + + expect(synthesis.whatWorked).toEqual([ + "You completed 1 activity while sleep and heart rate variability were stable or improved.", + ]); + }); + + it("requires less than a tenth of an hour to classify training as steady", () => { + const synthesis = buildWeeklyDecisionSynthesis(weeklyPeriod({ trainingHours: 0.1 }), [ + weeklyPeriod({ trainingHours: 0 }), + ]); + + expect(synthesis.whatWorked).toEqual([ + "You completed 3 activities while sleep and heart rate variability were stable or improved.", + ]); + }); + + it("requires each stable recovery metric for the complete positive pattern", () => { + expect(buildWeeklyDecisionSynthesis(weeklyPeriod(), [weeklyPeriod()]).whatWorked).toEqual([ + "Training volume stayed steady while sleep, resting heart rate, and heart rate variability were stable or improved.", + ]); + expect( + buildWeeklyDecisionSynthesis(weeklyPeriod({ avgRestingHr: 0 }), [ + weeklyPeriod({ avgRestingHr: null }), + ]).whatWorked, + ).toEqual([ + "You completed 3 activities while sleep and heart rate variability were stable or improved.", + ]); + expect( + buildWeeklyDecisionSynthesis(weeklyPeriod({ avgHrv: null }), [weeklyPeriod({ avgHrv: 0 })]) + .whatWorked, + ).toEqual([ + "You completed 3 activities; no recovery improvement is clear in the available weekly metrics.", + ]); + }); + + it("reports when no recovery improvement is clear", () => { + const synthesis = buildWeeklyDecisionSynthesis( + weeklyPeriod({ trainingHours: 5, activityCount: 1, avgSleepMinutes: 410, avgHrv: 45 }), + [weeklyPeriod()], + ); + + expect(synthesis.whatWorked).toEqual([ + "You completed 1 activity; no recovery improvement is clear in the available weekly metrics.", + ]); + }); + + it.each([ + { + name: "changed training", + current: { trainingHours: 5 }, + previous: {}, + expected: + "You completed 3 activities while sleep and heart rate variability were stable or improved.", + }, + { + name: "less sleep", + current: { avgSleepMinutes: 410 }, + previous: {}, + expected: + "You completed 3 activities; no recovery improvement is clear in the available weekly metrics.", + }, + { + name: "higher resting heart rate", + current: { avgRestingHr: 56 }, + previous: {}, + expected: + "You completed 3 activities while sleep and heart rate variability were stable or improved.", + }, + { + name: "lower heart rate variability", + current: { avgHrv: 49 }, + previous: {}, + expected: + "You completed 3 activities; no recovery improvement is clear in the available weekly metrics.", + }, + { + name: "missing current sleep", + current: { avgSleepMinutes: 0 }, + previous: {}, + expected: + "You completed 3 activities; no recovery improvement is clear in the available weekly metrics.", + }, + { + name: "missing previous sleep", + current: {}, + previous: { avgSleepMinutes: 0 }, + expected: + "You completed 3 activities; no recovery improvement is clear in the available weekly metrics.", + }, + { + name: "missing current resting heart rate", + current: { avgRestingHr: null }, + previous: {}, + expected: + "You completed 3 activities while sleep and heart rate variability were stable or improved.", + }, + { + name: "missing previous resting heart rate", + current: {}, + previous: { avgRestingHr: null }, + expected: + "You completed 3 activities while sleep and heart rate variability were stable or improved.", + }, + { + name: "missing current heart rate variability", + current: { avgHrv: null }, + previous: {}, + expected: + "You completed 3 activities; no recovery improvement is clear in the available weekly metrics.", + }, + { + name: "missing previous heart rate variability", + current: {}, + previous: { avgHrv: null }, + expected: + "You completed 3 activities; no recovery improvement is clear in the available weekly metrics.", + }, + { + name: "lower sleep with stable heart rate variability", + current: { avgSleepMinutes: 410 }, + previous: { avgSleepMinutes: 420 }, + expected: + "You completed 3 activities; no recovery improvement is clear in the available weekly metrics.", + }, + ])("requires every positive-pattern input when $name", ({ current, previous, expected }) => { + const synthesis = buildWeeklyDecisionSynthesis(weeklyPeriod(current), [weeklyPeriod(previous)]); + + expect(synthesis.whatWorked).toEqual([expected]); + }); + + it("lists one or two missing recovery metrics with correct grammar", () => { + expect( + buildWeeklyDecisionSynthesis(weeklyPeriod({ avgSleepMinutes: 0 }), [weeklyPeriod()]) + .confidenceAndMissingData, + ).toContain("Missing current-period data: sleep."); + expect( + buildWeeklyDecisionSynthesis(weeklyPeriod({ avgRestingHr: null, avgHrv: null }), [ + weeklyPeriod(), + ]).confidenceAndMissingData, + ).toContain("Missing current-period data: resting heart rate and heart rate variability."); + }); + + it("does not report moderate confidence when current recovery data is missing", () => { + const synthesis = buildWeeklyDecisionSynthesis(weeklyPeriod({ avgHrv: null }), [ + weeklyPeriod(), + weeklyPeriod(), + weeklyPeriod(), + ]); + + expect(synthesis.confidenceAndMissingData[0]).toBe( + "Confidence is limited because only 4 weekly periods are available.", + ); + }); + + it("describes a complete first period as a low-confidence baseline", () => { + const synthesis = buildWeeklyDecisionSynthesis(weeklyPeriod(), []); + + expect(synthesis).toEqual({ + whatChanged: [ + "This is the first observed week, so week-over-week changes are not available yet.", + ], + likelyAssociations: [ + "No training-and-recovery association can be assessed yet because there is no comparison week with tracked sleep and recovery.", + ], + whatWorked: ["There is not enough history yet to identify a repeatable positive pattern."], + whatToTryNext: [ + "Repeat or deliberately adjust one part of the routine next week, then compare it with this baseline.", + ], + confidenceAndMissingData: [ + "Confidence is low because only 1 weekly period is available.", + "These period averages can show co-movement, but they cannot establish cause and effect.", + ], + }); + }); + + it("requires both higher training and lower sleep before recommending volume restraint", () => { + const defaultStep = + "Keep one major input steady next week—training volume or sleep schedule—so the following comparison is easier to interpret."; + + expect( + buildWeeklyDecisionSynthesis(weeklyPeriod({ trainingHours: 5 }), [ + weeklyPeriod({ trainingHours: 4 }), + ]).whatToTryNext[0], + ).toBe(defaultStep); + expect( + buildWeeklyDecisionSynthesis(weeklyPeriod({ avgSleepMinutes: 410 }), [ + weeklyPeriod({ avgSleepMinutes: 420 }), + ]).whatToTryNext[0], + ).toBe(defaultStep); + }); + it("recognizes a sustained routine without labeling a neutral direction as good or bad", () => { const synthesis = buildWeeklyDecisionSynthesis( { @@ -225,4 +541,83 @@ describe("buildMonthlyDecisionSynthesis", () => { "Missing current-period data: sleep, resting heart rate, and heart rate variability.", ); }); + + it("uses month-specific wording for a complete first period", () => { + const synthesis = buildMonthlyDecisionSynthesis(monthlyPeriod(), []); + + expect(synthesis).toEqual({ + whatChanged: [ + "This is the first observed month, so month-over-month changes are not available yet.", + ], + likelyAssociations: [ + "No training-and-recovery association can be assessed yet because there is no comparison month with tracked sleep and recovery.", + ], + whatWorked: ["There is not enough history yet to identify a repeatable positive pattern."], + whatToTryNext: [ + "Repeat or deliberately adjust one part of the routine next month, then compare it with this baseline.", + ], + confidenceAndMissingData: [ + "Confidence is low because only 1 monthly period is available.", + "These period averages can show co-movement, but they cannot establish cause and effect.", + ], + }); + }); + + it("distinguishes stable monthly trends from unavailable sleep comparisons", () => { + expect(buildMonthlyDecisionSynthesis(monthlyPeriod(), [monthlyPeriod()]).whatChanged).toEqual([ + "Training held steady at 4 hours versus the previous month.", + "Average nightly sleep held steady at 7 hours.", + ]); + + expect( + buildMonthlyDecisionSynthesis(monthlyPeriod({ avgSleepTrend: null }), [monthlyPeriod()]) + .whatChanged[1], + ).toBe( + "A month-over-month sleep change is unavailable because sleep was not tracked in both months.", + ); + expect( + buildMonthlyDecisionSynthesis(monthlyPeriod({ avgSleepMinutes: 0, avgSleepTrend: 10 }), [ + monthlyPeriod(), + ]).whatChanged[1], + ).toBe( + "A month-over-month sleep change is unavailable because sleep was not tracked in both months.", + ); + }); + + it("formats positive monthly sleep and training trends", () => { + const synthesis = buildMonthlyDecisionSynthesis( + monthlyPeriod({ trainingHours: 5, trainingHoursTrend: 25, avgSleepTrend: 10 }), + [monthlyPeriod()], + ); + + expect(synthesis.whatChanged).toEqual([ + "Training was 5 hours, 25% more than the previous month.", + "Average nightly sleep was 7 hours, 10% more than the previous month.", + ]); + }); + + it("rounds supplied monthly trends to one decimal place", () => { + const synthesis = buildMonthlyDecisionSynthesis( + monthlyPeriod({ trainingHours: 5, trainingHoursTrend: 12.34, avgSleepTrend: 12.34 }), + [monthlyPeriod()], + ); + + expect(synthesis.whatChanged).toEqual([ + "Training was 5 hours, 12.3% more than the previous month.", + "Average nightly sleep was 7 hours, 12.3% more than the previous month.", + ]); + }); + + it("uses every observed month when reporting moderate confidence", () => { + const synthesis = buildMonthlyDecisionSynthesis(monthlyPeriod(), [ + monthlyPeriod(), + monthlyPeriod(), + monthlyPeriod(), + ]); + + expect(synthesis.confidenceAndMissingData).toEqual([ + "Confidence is moderate because 4 monthly periods are available and the current period includes sleep and recovery data.", + "These period averages can show co-movement, but they cannot establish cause and effect.", + ]); + }); }); diff --git a/packages/server/src/repositories/report-decision-synthesis.ts b/packages/server/src/repositories/report-decision-synthesis.ts index d3e86847d2..a7173fd749 100644 --- a/packages/server/src/repositories/report-decision-synthesis.ts +++ b/packages/server/src/repositories/report-decision-synthesis.ts @@ -38,7 +38,7 @@ function formatDuration(minutes: number): string { const parts: string[] = []; if (hours > 0) parts.push(`${hours} ${hours === 1 ? "hour" : "hours"}`); if (remainder > 0) parts.push(`${remainder} ${remainder === 1 ? "minute" : "minutes"}`); - return parts.length > 0 ? parts.join(" ") : "0 minutes"; + return parts.join(" "); } function relativeChange(current: number, previous: number): number | null { @@ -142,9 +142,7 @@ function buildWhatWorked( const trainingSteady = Math.abs(current.trainingHours - previous.trainingHours) < 0.1; const sleepDidNotFall = - current.avgSleepMinutes > 0 && - previous.avgSleepMinutes > 0 && - current.avgSleepMinutes >= previous.avgSleepMinutes; + previous.avgSleepMinutes > 0 && current.avgSleepMinutes >= previous.avgSleepMinutes; const restingHeartRateDidNotRise = current.avgRestingHr != null && previous.avgRestingHr != null && From 955396037cf27cee4df02adfa813d2c3813d8801 Mon Sep 17 00:00:00 2001 From: Asher Cohen Date: Wed, 29 Jul 2026 12:41:14 -0700 Subject: [PATCH 4/7] test(reports): update integration contract Expect the server-owned decision support field in empty weekly and monthly report responses. --- .../repositories/monthly-report-repository.integration.test.ts | 2 +- .../repositories/weekly-report-repository.integration.test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/server/src/repositories/monthly-report-repository.integration.test.ts b/packages/server/src/repositories/monthly-report-repository.integration.test.ts index 8d255a8e6b..73d01ec39a 100644 --- a/packages/server/src/repositories/monthly-report-repository.integration.test.ts +++ b/packages/server/src/repositories/monthly-report-repository.integration.test.ts @@ -177,6 +177,6 @@ describe("MonthlyReportRepository ClickHouse read models", () => { it("returns the no-data result for an empty user", async () => { const report = await new MonthlyReportRepository(emptyUserId, sensorStore).getReport(12); - expect(report).toEqual({ current: null, history: [] }); + expect(report).toEqual({ current: null, history: [], decisionSupport: null }); }); }); diff --git a/packages/server/src/repositories/weekly-report-repository.integration.test.ts b/packages/server/src/repositories/weekly-report-repository.integration.test.ts index 8edbcd3e9b..9d39cbfc7a 100644 --- a/packages/server/src/repositories/weekly-report-repository.integration.test.ts +++ b/packages/server/src/repositories/weekly-report-repository.integration.test.ts @@ -276,7 +276,7 @@ describe("WeeklyReportRepository ClickHouse read models", () => { it("returns the no-data result for an empty user", async () => { const report = await new WeeklyReportRepository(emptyUserId, sensorStore).getReport(1, endDate); - expect(report).toEqual({ current: null, history: [] }); + expect(report).toEqual({ current: null, history: [], decisionSupport: null }); }); it("uses the serving-model health-day boundary for non-UTC requests", async () => { From 3ab7620b99a1b711908b3aa75adf2e7e3e41ded7 Mon Sep 17 00:00:00 2001 From: Asher Cohen Date: Wed, 29 Jul 2026 12:55:56 -0700 Subject: [PATCH 5/7] chore(mobile): align Expo dependencies Update the SDK 57 compatibility set and release-age policy entries required by Expo dependency validation. --- packages/mobile/package.json | 24 +- pnpm-lock.yaml | 436 +++++++++++++++++------------------ pnpm-workspace.yaml | 17 ++ 3 files changed, 247 insertions(+), 230 deletions(-) diff --git a/packages/mobile/package.json b/packages/mobile/package.json index 4216e24f0c..fd9b4a9a57 100644 --- a/packages/mobile/package.json +++ b/packages/mobile/package.json @@ -38,7 +38,7 @@ "@dofek/stats": "workspace:*", "@dofek/training": "workspace:*", "@dofek/zones": "workspace:*", - "@expo/metro-runtime": "57.0.7", + "@expo/metro-runtime": "57.0.8", "@expo/vector-icons": "15.1.1", "@formatjs/intl-getcanonicallocales": "3.2.11", "@formatjs/intl-locale": "5.3.9", @@ -61,33 +61,33 @@ "dofek-server": "workspace:*", "expo": "57.0.8", "expo-apple-authentication": "57.0.1", - "expo-build-properties": "57.0.7", + "expo-build-properties": "57.0.8", "expo-camera": "57.0.3", - "expo-dev-client": "57.0.9", + "expo-dev-client": "57.0.10", "expo-document-picker": "57.0.1", "expo-file-system": "57.0.1", "expo-haptics": "57.0.1", "expo-linking": "57.0.4", - "expo-location": "57.0.6", - "expo-modules-core": "57.0.7", - "expo-notifications": "57.0.7", - "expo-router": "57.0.8", + "expo-location": "57.0.7", + "expo-modules-core": "57.0.8", + "expo-notifications": "57.0.8", + "expo-router": "57.0.9", "expo-secure-store": "57.0.1", - "expo-sharing": "57.0.7", + "expo-sharing": "57.0.8", "expo-splash-screen": "57.0.5", - "expo-task-manager": "57.0.6", - "expo-updates": "57.0.10", + "expo-task-manager": "57.0.7", + "expo-updates": "57.0.11", "expo-web-browser": "57.0.2", "react": "19.2.3", "react-native": "0.86.0", "react-native-body-highlighter": "3.2.0", "react-native-gesture-handler": "2.32.0", "react-native-maps": "1.27.2", - "react-native-reanimated": "4.5.0", + "react-native-reanimated": "4.5.1", "react-native-safe-area-context": "5.7.0", "react-native-screens": "4.26.2", "react-native-svg": "15.15.4", - "react-native-worklets": "0.10.0", + "react-native-worklets": "0.10.1", "zod": "4.4.3" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3241a7705b..8fee5813c1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -389,8 +389,8 @@ importers: specifier: workspace:* version: link:../zones '@expo/metro-runtime': - specifier: 57.0.7 - version: 57.0.7(@expo/log-box@57.0.1)(expo@57.0.8)(react-dom@19.2.3)(react-native@0.86.0)(react@19.2.3) + specifier: 57.0.8 + version: 57.0.8(@expo/log-box@57.0.2)(expo@57.0.8)(react-dom@19.2.3)(react-native@0.86.0)(react@19.2.3) '@expo/vector-icons': specifier: 15.1.1 version: 15.1.1(expo-font@57.0.1)(react-native@0.86.0)(react@19.2.3) @@ -453,19 +453,19 @@ importers: version: link:../server expo: specifier: 57.0.8 - version: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.7)(expo-router@57.0.8)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + version: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) expo-apple-authentication: specifier: 57.0.1 version: 57.0.1(expo@57.0.8)(react-native@0.86.0)(react@19.2.3) expo-build-properties: - specifier: 57.0.7 - version: 57.0.7(expo@57.0.8) + specifier: 57.0.8 + version: 57.0.8(expo@57.0.8) expo-camera: specifier: 57.0.3 version: 57.0.3(@types/emscripten@1.41.5)(expo@57.0.8)(react-native-web@0.21.2)(react-native@0.86.0)(react@19.2.3) expo-dev-client: - specifier: 57.0.9 - version: 57.0.9(expo@57.0.8)(react-native@0.86.0) + specifier: 57.0.10 + version: 57.0.10(expo@57.0.8)(react-native@0.86.0) expo-document-picker: specifier: 57.0.1 version: 57.0.1(expo@57.0.8) @@ -479,32 +479,32 @@ importers: specifier: 57.0.4 version: 57.0.4(expo@57.0.8)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2) expo-location: - specifier: 57.0.6 - version: 57.0.6(expo@57.0.8)(supports-color@10.2.2)(typescript@6.0.3) - expo-modules-core: specifier: 57.0.7 - version: 57.0.7(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3) + version: 57.0.7(expo@57.0.8)(supports-color@10.2.2)(typescript@6.0.3) + expo-modules-core: + specifier: 57.0.8 + version: 57.0.8(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3) expo-notifications: - specifier: 57.0.7 - version: 57.0.7(expo@57.0.8)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) - expo-router: specifier: 57.0.8 - version: 57.0.8(@babel/core@7.29.7)(@expo/log-box@57.0.1)(@expo/metro-runtime@57.0.7)(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3)(@types/react@19.2.14)(expo-constants@57.0.7)(expo-font@57.0.1)(expo-linking@57.0.4)(expo@57.0.8)(react-dom@19.2.3)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.0)(react-native-safe-area-context@5.7.0)(react-native-screens@4.26.2)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2) + version: 57.0.8(expo@57.0.8)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo-router: + specifier: 57.0.9 + version: 57.0.9(@babel/core@7.29.7)(@expo/log-box@57.0.2)(@expo/metro-runtime@57.0.8)(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3)(@types/react@19.2.14)(expo-constants@57.0.8)(expo-font@57.0.1)(expo-linking@57.0.4)(expo@57.0.8)(react-dom@19.2.3)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.1)(react-native-safe-area-context@5.7.0)(react-native-screens@4.26.2)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2) expo-secure-store: specifier: 57.0.1 version: 57.0.1(expo@57.0.8) expo-sharing: - specifier: 57.0.7 - version: 57.0.7(expo@57.0.8)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + specifier: 57.0.8 + version: 57.0.8(expo@57.0.8)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) expo-splash-screen: specifier: 57.0.5 version: 57.0.5(expo@57.0.8)(supports-color@10.2.2)(typescript@6.0.3) expo-task-manager: - specifier: 57.0.6 - version: 57.0.6(expo@57.0.8)(react-native@0.86.0) + specifier: 57.0.7 + version: 57.0.7(expo@57.0.8)(react-native@0.86.0) expo-updates: - specifier: 57.0.10 - version: 57.0.10(expo-dev-client@57.0.9)(expo@57.0.8)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2) + specifier: 57.0.11 + version: 57.0.11(expo-dev-client@57.0.10)(expo@57.0.8)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2) expo-web-browser: specifier: 57.0.2 version: 57.0.2(expo@57.0.8)(react-native@0.86.0) @@ -524,8 +524,8 @@ importers: specifier: 1.27.2 version: 1.27.2(react-native-web@0.21.2)(react-native@0.86.0)(react@19.2.3) react-native-reanimated: - specifier: 4.5.0 - version: 4.5.0(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3) + specifier: 4.5.1 + version: 4.5.1(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3) react-native-safe-area-context: specifier: 5.7.0 version: 5.7.0(react-native@0.86.0)(react@19.2.3) @@ -536,8 +536,8 @@ importers: specifier: 15.15.4 version: 15.15.4(react-native@0.86.0)(react@19.2.3) react-native-worklets: - specifier: 0.10.0 - version: 0.10.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2) + specifier: 0.10.1 + version: 0.10.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2) zod: specifier: 4.4.3 version: 4.4.3 @@ -550,7 +550,7 @@ importers: version: 10.5.3(@gorhom/bottom-sheet@5.2.8)(@react-native-community/datetimepicker@9.1.0)(@react-native-community/slider@5.1.2)(@types/react-dom@19.2.3)(@types/react@19.2.14)(react-dom@19.2.3)(react-native@0.86.0)(react@19.2.3)(storybook@10.5.4)(supports-color@10.2.2)(typescript@6.0.3) '@storybook/react-native': specifier: 10.5.3 - version: 10.5.3(@gorhom/bottom-sheet@5.2.8)(@types/react-dom@19.2.3)(@types/react@19.2.14)(esbuild@0.28.1)(react-dom@19.2.3)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.0)(react-native-safe-area-context@5.7.0)(react-native-svg@15.15.4)(react-native@0.86.0)(react@19.2.3)(storybook@10.5.4)(supports-color@10.2.2)(typescript@6.0.3) + version: 10.5.3(@gorhom/bottom-sheet@5.2.8)(@types/react-dom@19.2.3)(@types/react@19.2.14)(esbuild@0.28.1)(react-dom@19.2.3)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.1)(react-native-safe-area-context@5.7.0)(react-native-svg@15.15.4)(react-native@0.86.0)(react@19.2.3)(storybook@10.5.4)(supports-color@10.2.2)(typescript@6.0.3) '@storybook/react-native-web-vite': specifier: 10.5.4 version: 10.5.4(@types/react-dom@19.2.3)(@types/react@19.2.14)(esbuild@0.28.1)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native@0.86.0)(react@19.2.3)(rollup@4.62.2)(storybook@10.5.4)(supports-color@10.2.2)(typescript@6.0.3)(vite@8.0.16) @@ -583,7 +583,7 @@ importers: dependencies: expo-modules-core: specifier: '>=2.0.0' - version: 57.0.7(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3) + version: 57.0.7(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3) packages/nutrition: dependencies: @@ -1568,12 +1568,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-arrow-functions@7.27.1': - resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-arrow-functions@7.29.7': resolution: {integrity: sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ==} engines: {node: '>=6.9.0'} @@ -1910,12 +1904,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-shorthand-properties@7.27.1': - resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-shorthand-properties@7.29.7': resolution: {integrity: sha512-I+WYbGBAiCn7nA6xBrlgPH+MB7HWb4u8pv5S0Pv7OtwNvIFvCCb24YlttKEeUFVurfBCEaOTnuhlqsb7f0Z5Dg==} engines: {node: '>=6.9.0'} @@ -1934,12 +1922,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-template-literals@7.27.1': - resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-template-literals@7.29.7': resolution: {integrity: sha512-NCSEJ4sLFU2gqAub45HYh4fus2yQ36rr6ei6vpU7NdoJqCpxvEG8E6eJpscGyXP3VHD2Ny+fSXr04k1hoUrFqA==} engines: {node: '>=6.9.0'} @@ -2736,6 +2718,14 @@ packages: react: 19.2.3 react-native: '*' + '@expo/log-box@57.0.2': + resolution: {integrity: sha512-ZsFyfIR7YCbQAdVLzuTUmMHofZC7ZS9ywYCJNPlLc78x59cI8GwXFEIVbRjjC0uJERpNtXx/tsNNnkhexXlzMw==} + peerDependencies: + '@expo/dom-webview': 55.0.5 + expo: '*' + react: 19.2.3 + react-native: '*' + '@expo/metro-config@57.0.7': resolution: {integrity: sha512-bVfEkg4zF1cA62OqAdYXmFOooJ6TB/I+REi7Se6Ct+PbSC+89TwSqWXnYx34L08eIs4z+1ilgbATakTZpgefmQ==} peerDependencies: @@ -2747,10 +2737,10 @@ packages: '@expo/metro-file-map@57.0.1': resolution: {integrity: sha512-8JXfVstZN7QnP4NianZZnlTVboOWR0sG8trUDNajOjnbGlPln29vponXM84tY+3tAHapz5/TxE53L0ixUwqPtA==} - '@expo/metro-runtime@57.0.7': - resolution: {integrity: sha512-95UeoN/YsLellvskKsFGN9vKBwNc5k70ysO3skqfL3VusWlYIiYmPY+MpEWNz8A8W2CjLg9AKwZKAGrFj6znQg==} + '@expo/metro-runtime@57.0.8': + resolution: {integrity: sha512-RrdehKXNtWpnm8nNs1QFhS0IauyMKR/nSQiry6dcUJs2T5EH8gYDMcMegUt9yI41K4nO3W8tr3O0xd/GZFObXQ==} peerDependencies: - '@expo/log-box': ^57.0.1 + '@expo/log-box': ^57.0.2 expo: '*' react: 19.2.3 react-dom: 19.2.3 @@ -2821,8 +2811,8 @@ packages: '@expo/sudo-prompt@9.3.2': resolution: {integrity: sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==} - '@expo/ui@57.0.7': - resolution: {integrity: sha512-WqRVabl8VpHf3+YLHVjUy7PMIuXXI6DG88Vgmavro7Nd8Ks13h9sEJH/RLSCaJE2daVnqzEKY1v797BibuY9aw==} + '@expo/ui@57.0.8': + resolution: {integrity: sha512-aR17CRM45k4JyFahX4Xn2b6ti3aiddC4SAzvsm3iUCVacQA6tGmClu012rYNeVXhJ96csX2o7EEymfzYqgJNxw==} peerDependencies: '@babel/core': '*' expo: '*' @@ -4710,12 +4700,15 @@ packages: '@oslojs/asn1@1.0.0': resolution: {integrity: sha512-zw/wn0sj0j0QKbIXfIlnEcTviaCzYOY3V5rAyjR6YtOByFtJiT574+8p9Wlach0lZH9fddD4yb9laEAIl4vXQA==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. '@oslojs/binary@1.0.0': resolution: {integrity: sha512-9RCU6OwXU6p67H4NODbuxv2S3eenuQ4/WFLrsq+K/k682xrznH5EVWA7N4VFk9VYVcbFtKqur5YQQZc0ySGhsQ==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. '@oslojs/crypto@1.0.1': resolution: {integrity: sha512-7n08G8nWjAr/Yu3vu9zzrd0L9XnrJfpMioQcvCMxBIiF5orECHe5/3J0jmXRVvgfqMm/+4oxlQ+Sq39COYLcNQ==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. '@oslojs/encoding@0.4.1': resolution: {integrity: sha512-hkjo6MuIK/kQR5CrGNdAPZhS01ZCXuWDRJ187zh6qqF2+yMHZpD9fAYpX8q2bOO6Ryhl3XpCT6kUX76N8hhm4Q==} @@ -4725,6 +4718,7 @@ packages: '@oslojs/jwt@0.2.0': resolution: {integrity: sha512-bLE7BtHrURedCn4Mco3ma9L4Y1GR2SMBuIvjWr7rmQ4/W/4Jy70TIAgZ+0nIlk0xHz1vNP8x8DCns45Sb2XRbg==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. '@oxc-parser/binding-android-arm-eabi@0.127.0': resolution: {integrity: sha512-0LC7ye4hvqbIKxAzThzvswgHLFu2AURKzYLeSVvLdu2TBOYWQDmHnTqPLeA597BcUCxiLqLsS4CJ5uoI5WYWCQ==} @@ -5339,15 +5333,6 @@ packages: '@types/react': optional: true - '@radix-ui/react-slot@1.2.4': - resolution: {integrity: sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==} - peerDependencies: - '@types/react': '*' - react: 19.2.3 - peerDependenciesMeta: - '@types/react': - optional: true - '@radix-ui/react-slot@1.3.3': resolution: {integrity: sha512-qx7oqnYbxnK9kYI9m317qmFmEgo6ywqWvbTogdj7cL9p3/yx4M48p7Rnw5z3H890cL/ow/EeWJsuTykeZVXP5Q==} peerDependencies: @@ -8846,6 +8831,7 @@ packages: arctic@3.7.0: resolution: {integrity: sha512-ZMQ+f6VazDgUJOd+qNV+H7GohNSYal1mVjm5kEaZfE2Ifb7Ss70w+Q7xpJC87qZDkMZIXYf0pTIYZA0OPasSbw==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. are-we-there-yet@2.0.0: resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} @@ -10671,8 +10657,8 @@ packages: react: 19.2.3 react-native: '*' - expo-build-properties@57.0.7: - resolution: {integrity: sha512-yo/2rp7tmWdmwHa2cA2EgOQNKmihNivTAiB9Dcg2s20b4g+QasGDyq4aOmwifUaLjK9bIRUs4D4xX5HzjSL1Hw==} + expo-build-properties@57.0.8: + resolution: {integrity: sha512-6/SDeqKLKaF8MRfLZ3JhiiDN0y5uXtyefhWRZ42ZX03QVZ8Fw4dnbdTSHpsBvbKNIluYk5bP/zosdwkbeeNd9A==} peerDependencies: expo: '*' @@ -10693,13 +10679,19 @@ packages: expo: '*' react-native: '*' - expo-dev-client@57.0.9: - resolution: {integrity: sha512-DDqinc0EHMsqDUqkfad6c3pc5vr2oCxwAojSGVSBZe5paRIPgQTEWA+x76Qel13F1LO2LSG+DLs5W1vk3JwUow==} + expo-constants@57.0.8: + resolution: {integrity: sha512-ts+B7E5076BtkblrKGy7+Sm/R2obHfTwqhmYQVYbWRtilv3+C/xNwHZhyNEnAvzM/JjKqx7UdaITUBYaeFreZw==} + peerDependencies: + expo: '*' + react-native: '*' + + expo-dev-client@57.0.10: + resolution: {integrity: sha512-aY6PVbD1R+XwIcrOucRnB/yJfB6qVHIHqgRV6F8LwOzo7DwZaa/ixs+O2itHH7BNbUiwkS8tFjtbzJ4vDx/ulw==} peerDependencies: expo: '*' - expo-dev-launcher@57.0.9: - resolution: {integrity: sha512-f2LhS6FaQBKACSNQ1opPR7bg6ehAJnrDuEkewqINJkTDryhGY7Y6P21uoXWJzEc9IFJAjUKan8A8AOztibGtMQ==} + expo-dev-launcher@57.0.10: + resolution: {integrity: sha512-LfGfiKDBzVgCXbIozbyzPU7yLdOtvmuH2U9jJbLEmkJxoExOy8NiFJoL8U+I/pYw3tj4I3GVkVOtZtItDFGn8Q==} peerDependencies: expo: '*' react-native: '*' @@ -10709,8 +10701,8 @@ packages: peerDependencies: expo: '*' - expo-dev-menu@57.0.9: - resolution: {integrity: sha512-OGU3Apwx1fr8HDUD9F66tk/CuxiIhYkHci4837vX7ZckS6yI/yL6gvcmgqvNCoE4pDV9demjaGEZmSJ2xTrUhg==} + expo-dev-menu@57.0.10: + resolution: {integrity: sha512-y9S8J2MfqEO1T6daH3HNsjR7S4TcLf3CpSvNAwSzj5x6wmJoMYEvxWkzKy7Ep1R21EFBeSET1sZ1mFCCCYjgBw==} peerDependencies: expo: '*' react-native: '*' @@ -10763,8 +10755,8 @@ packages: react: 19.2.3 react-native: '*' - expo-location@57.0.6: - resolution: {integrity: sha512-V9lcReOI9AANg9ITECzrTXUBW0lXjMaeWrf1zMDaJ+KeLkdkbIulEaDAuoj5PR5OZzAau7B8XAR54Z0JQnFBmw==} + expo-location@57.0.7: + resolution: {integrity: sha512-HPsS6Sse8GgMv9QiENXUEp9awl0O6iX0mFKJkxsHtC1HiouDXKCDlSnW66/E6U1ykwZ2M9ymJnZLRpWu0ua+/g==} peerDependencies: expo: '*' @@ -10787,26 +10779,36 @@ packages: react-native-worklets: optional: true + expo-modules-core@57.0.8: + resolution: {integrity: sha512-ZUU943Oso3B8jFggC+2+LOk8oa+im66IQlleYay6WP5iexbdF2fqpgC4BcYsN4xhCkDKh7KDINSt1FlcxyRRjQ==} + peerDependencies: + react: 19.2.3 + react-native: '*' + react-native-worklets: ^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0 + peerDependenciesMeta: + react-native-worklets: + optional: true + expo-modules-jsi@57.0.4: resolution: {integrity: sha512-vt7FyqUqqFXiRVnBqYD7y+GSPTgeua5Ocoy0+SYt+RSHkZEA2Fyop7If3g1TYDzQObYybPRo7TG2Rle1XLaWFw==} peerDependencies: react-native: '*' - expo-notifications@57.0.7: - resolution: {integrity: sha512-77cqQ1E3B8RQ7FadKSl+bOeSzUfbMhbjMxklqQffXIHx1dILrRELFhq5/UkBW66r+F58KtGEMlw0atPVY2qJyQ==} + expo-notifications@57.0.8: + resolution: {integrity: sha512-9pTNFMB9vk7MmULRSq7SD2nBRXhIh7IYAOSAFzFIYna6csJKdzeuKikjuUwP5KZYwxejoaN2BYBBqdLKaUpT/w==} peerDependencies: expo: '*' react: 19.2.3 react-native: '*' - expo-router@57.0.8: - resolution: {integrity: sha512-xAyTnZl597G9/r17GOuyTy6VlhjYCVmgzgmP00bhZ9b+VstPl3tTrOOhSFagVpeln47nKp7x7vgkANNheCv4eQ==} + expo-router@57.0.9: + resolution: {integrity: sha512-jPBwHmKmBfzCLUuKgFf+I/UhFkxvS3J2WF5MQKcuupC8XzQPBAqdzbxmcPIDY3VIVabHw7WnhwzsROWA74t1LA==} peerDependencies: - '@expo/log-box': ^57.0.1 - '@expo/metro-runtime': ^57.0.7 + '@expo/log-box': ^57.0.2 + '@expo/metro-runtime': ^57.0.8 '@testing-library/react-native': '>= 13.2.0' expo: '*' - expo-constants: ^57.0.7 + expo-constants: ^57.0.8 expo-linking: ^57.0.4 react: 19.2.3 react-dom: 19.2.3 @@ -10840,8 +10842,8 @@ packages: resolution: {integrity: sha512-sBfVDH6dmKVHZxqUxbfkzS00PZELMZt1IpnHKxcOTMZtR/t7CtRAFrbXcisG+EyzeqHSVDacZT+1tbYfZt5D8w==} engines: {node: '>=20.16.0'} - expo-sharing@57.0.7: - resolution: {integrity: sha512-mGP4yEvBJzNScGSBLOqAZMuGbxqTF9R8Fr1vh/50M4mvkObXAXMQvVZm1WnjD/2RFQrqo87z+K1TtcqEcHzs7g==} + expo-sharing@57.0.8: + resolution: {integrity: sha512-ZjiA09iJjzveachyBlbIijSH++fiacdvuenxb/gsdW21V3SUSxMQd+krPmafnhnMus5aBqpP0TXCBfBJN+0Bfg==} peerDependencies: expo: '*' react: 19.2.3 @@ -10863,8 +10865,8 @@ packages: react: 19.2.3 react-native: '*' - expo-task-manager@57.0.6: - resolution: {integrity: sha512-nD6tvC3HNzjpOJir3Q8QDNOMtKrY2f1ik+fmKcOl7i/o822AEgGr7HpmDF/kpCQYGchdqBrodmkKcYwb9gxliQ==} + expo-task-manager@57.0.7: + resolution: {integrity: sha512-ePnBVrkntuxV0XPKhMlJoMyqMH4K3OGrUfqajf/3UzVjfTB2ARmR3ExtB996EAtrsAQ8fREvZrdhbBAnDSiRAg==} peerDependencies: expo: '*' react-native: '*' @@ -10874,8 +10876,8 @@ packages: peerDependencies: expo: '*' - expo-updates@57.0.10: - resolution: {integrity: sha512-1j6wIrF7rFAnfiiMxaSfaA6nV5oOeJnAIpquQDpQ70Jd9hKGt9PPDtf0iByiz+AM+PgNbKFpGYuk13sGI+kd1g==} + expo-updates@57.0.11: + resolution: {integrity: sha512-V8m+bVHvyUXggjmhxt/t4yyj6oDfdAN0kdx0nAt9p2i7xGci6lkzfWzcwsNUE0ZmStHR4ZyzQVFR1U0vP7C/7g==} hasBin: true peerDependencies: expo: '*' @@ -13062,11 +13064,6 @@ packages: nan@2.28.0: resolution: {integrity: sha512-fTsDz99OTq2sVePhGdp4qQhggZFtKr64ZNVyVajRKtMOkJxYekplBh577PiJB12v/D3s2E5cGtOI45LWp6rnLQ==} - nanoid@3.3.15: - resolution: {integrity: sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - nanoid@3.3.16: resolution: {integrity: sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -14143,8 +14140,8 @@ packages: '@react-native-community/datetimepicker': '>=6.7.0' react-native: '>=0.65.0' - react-native-reanimated@4.5.0: - resolution: {integrity: sha512-+iPfvK34PKKYP/p/4TaBliFkbfvjGDIvXuiiaxvISP5ip7sWegvlacwU/uAV6zNDSSmX0tDyER7PurPMKGDipA==} + react-native-reanimated@4.5.1: + resolution: {integrity: sha512-RnMvtDuR+68ig864gAvZCOdZehqhC5rFmMo0kn+ARfgVSTvFeF6IFLBVgMPUu0KwihaapEyW24WRi6nEyy1kSA==} peerDependencies: react: 19.2.3 react-native: 0.83 - 0.86 @@ -14179,8 +14176,8 @@ packages: react: 19.2.3 react-dom: 19.2.3 - react-native-worklets@0.10.0: - resolution: {integrity: sha512-JhE6IxDf6iabC0qu3+TAKA4v9RlluXmoIngPQX7/QUByf75lfrsHZ6/dQhyjEWnp1EEQiwzz8Cpew140ZcewDw==} + react-native-worklets@0.10.1: + resolution: {integrity: sha512-62mRM19bDpfpdI8HLkEErcdOsrAPDtE9lA/sw+5lLRpzBHNhxaoj9QyY2KjXqUmirelxkX4zuPGTC3VdA0feJA==} peerDependencies: '@babel/core': '*' '@react-native/metro-config': '*' @@ -17315,11 +17312,6 @@ snapshots: '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7(supports-color@10.2.2) - '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-arrow-functions@7.29.7(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7(supports-color@10.2.2) @@ -17701,11 +17693,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7(supports-color@10.2.2) - '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-shorthand-properties@7.29.7(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7(supports-color@10.2.2) @@ -17724,11 +17711,6 @@ snapshots: '@babel/core': 7.29.7(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7(supports-color@10.2.2) - '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-template-literals@7.29.7(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7(supports-color@10.2.2) @@ -17903,7 +17885,7 @@ snapshots: '@expo/image-utils': 0.11.1(supports-color@10.2.2)(typescript@6.0.3) '@react-native/normalize-colors': 0.79.7 debug: 4.4.3(supports-color@10.2.2) - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.7)(expo-router@57.0.8)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) glob: 10.5.0 transitivePeerDependencies: - supports-color @@ -18457,7 +18439,7 @@ snapshots: '@expo-google-fonts/material-symbols@0.4.38': {} - '@expo/cli@57.0.10(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.7)(expo-constants@57.0.7)(expo-font@57.0.1)(expo-router@57.0.8)(expo@57.0.8)(react-dom@19.2.3)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3)': + '@expo/cli@57.0.10(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-constants@57.0.7)(expo-font@57.0.1)(expo-router@57.0.9)(expo@57.0.8)(react-dom@19.2.3)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3)': dependencies: '@expo/code-signing-certificates': 0.0.6 '@expo/config': 57.0.6(supports-color@10.2.2)(typescript@6.0.3) @@ -18476,7 +18458,7 @@ snapshots: '@expo/plist': 0.8.1(patch_hash=2e81ea41c32856973b677ca39a3f7f4a53b550dc5093fddfaa1abd120b800e2e) '@expo/prebuild-config': 57.0.9(supports-color@10.2.2)(typescript@6.0.3) '@expo/require-utils': 57.0.4(supports-color@10.2.2)(typescript@6.0.3) - '@expo/router-server': 57.0.4(@expo/metro-runtime@57.0.7)(expo-constants@57.0.7)(expo-font@57.0.1)(expo-router@57.0.8)(expo-server@57.0.1)(expo@57.0.8)(react-dom@19.2.3)(react@19.2.3)(supports-color@10.2.2) + '@expo/router-server': 57.0.4(@expo/metro-runtime@57.0.8)(expo-constants@57.0.7)(expo-font@57.0.1)(expo-router@57.0.9)(expo-server@57.0.1)(expo@57.0.8)(react-dom@19.2.3)(react@19.2.3)(supports-color@10.2.2) '@expo/schema-utils': 57.0.2 '@expo/spawn-async': 1.8.0 '@expo/ws-tunnel': 2.0.0(ws@8.21.0) @@ -18493,7 +18475,7 @@ snapshots: connect: 3.7.0(supports-color@10.2.2) debug: 4.4.3(supports-color@10.2.2) dnssd-advertise: 1.1.6 - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.7)(expo-router@57.0.8)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) expo-server: 57.0.1 fetch-nodeshim: 0.4.10 getenv: 2.0.0 @@ -18519,7 +18501,7 @@ snapshots: ws: 8.21.0 zod: 3.25.76 optionalDependencies: - expo-router: 57.0.8(@babel/core@7.29.7)(@expo/log-box@57.0.1)(@expo/metro-runtime@57.0.7)(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3)(@types/react@19.2.14)(expo-constants@57.0.7)(expo-font@57.0.1)(expo-linking@57.0.4)(expo@57.0.8)(react-dom@19.2.3)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.0)(react-native-safe-area-context@5.7.0)(react-native-screens@4.26.2)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2) + expo-router: 57.0.9(@babel/core@7.29.7)(@expo/log-box@57.0.2)(@expo/metro-runtime@57.0.8)(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3)(@types/react@19.2.14)(expo-constants@57.0.8)(expo-font@57.0.1)(expo-linking@57.0.4)(expo@57.0.8)(react-dom@19.2.3)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.1)(react-native-safe-area-context@5.7.0)(react-native-screens@4.26.2)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2) react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) transitivePeerDependencies: - '@expo/dom-webview' @@ -18591,7 +18573,7 @@ snapshots: '@expo/dom-webview@55.0.5(expo@57.0.8)(react-native@0.86.0)(react@19.2.3)': dependencies: - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.7)(expo-router@57.0.8)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) react: 19.2.3 react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) @@ -18671,7 +18653,16 @@ snapshots: dependencies: '@expo/dom-webview': 55.0.5(expo@57.0.8)(react-native@0.86.0)(react@19.2.3) anser: 1.4.10 - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.7)(expo-router@57.0.8)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + react: 19.2.3 + react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + stacktrace-parser: 0.1.11 + + '@expo/log-box@57.0.2(@expo/dom-webview@55.0.5)(expo@57.0.8)(react-native@0.86.0)(react@19.2.3)': + dependencies: + '@expo/dom-webview': 55.0.5(expo@57.0.8)(react-native@0.86.0)(react@19.2.3) + anser: 1.4.10 + expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) react: 19.2.3 react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) stacktrace-parser: 0.1.11 @@ -18702,7 +18693,7 @@ snapshots: postcss: 8.5.23 resolve-from: 5.0.0 optionalDependencies: - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.7)(expo-router@57.0.8)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) transitivePeerDependencies: - bufferutil - supports-color @@ -18720,11 +18711,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@expo/metro-runtime@57.0.7(@expo/log-box@57.0.1)(expo@57.0.8)(react-dom@19.2.3)(react-native@0.86.0)(react@19.2.3)': + '@expo/metro-runtime@57.0.8(@expo/log-box@57.0.2)(expo@57.0.8)(react-dom@19.2.3)(react-native@0.86.0)(react@19.2.3)': dependencies: - '@expo/log-box': 57.0.1(@expo/dom-webview@55.0.5)(expo@57.0.8)(react-native@0.86.0)(react@19.2.3) + '@expo/log-box': 57.0.2(@expo/dom-webview@55.0.5)(expo@57.0.8)(react-native@0.86.0)(react@19.2.3) anser: 1.4.10 - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.7)(expo-router@57.0.8)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) pretty-format: 29.7.0 react: 19.2.3 react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) @@ -18805,17 +18796,17 @@ snapshots: transitivePeerDependencies: - supports-color - '@expo/router-server@57.0.4(@expo/metro-runtime@57.0.7)(expo-constants@57.0.7)(expo-font@57.0.1)(expo-router@57.0.8)(expo-server@57.0.1)(expo@57.0.8)(react-dom@19.2.3)(react@19.2.3)(supports-color@10.2.2)': + '@expo/router-server@57.0.4(@expo/metro-runtime@57.0.8)(expo-constants@57.0.7)(expo-font@57.0.1)(expo-router@57.0.9)(expo-server@57.0.1)(expo@57.0.8)(react-dom@19.2.3)(react@19.2.3)(supports-color@10.2.2)': dependencies: debug: 4.4.3(supports-color@10.2.2) - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.7)(expo-router@57.0.8)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) expo-constants: 57.0.7(expo@57.0.8)(react-native@0.86.0)(supports-color@10.2.2) expo-font: 57.0.1(expo@57.0.8)(react-native@0.86.0)(react@19.2.3) expo-server: 57.0.1 react: 19.2.3 optionalDependencies: - '@expo/metro-runtime': 57.0.7(@expo/log-box@57.0.1)(expo@57.0.8)(react-dom@19.2.3)(react-native@0.86.0)(react@19.2.3) - expo-router: 57.0.8(@babel/core@7.29.7)(@expo/log-box@57.0.1)(@expo/metro-runtime@57.0.7)(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3)(@types/react@19.2.14)(expo-constants@57.0.7)(expo-font@57.0.1)(expo-linking@57.0.4)(expo@57.0.8)(react-dom@19.2.3)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.0)(react-native-safe-area-context@5.7.0)(react-native-screens@4.26.2)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2) + '@expo/metro-runtime': 57.0.8(@expo/log-box@57.0.2)(expo@57.0.8)(react-dom@19.2.3)(react-native@0.86.0)(react@19.2.3) + expo-router: 57.0.9(@babel/core@7.29.7)(@expo/log-box@57.0.2)(@expo/metro-runtime@57.0.8)(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3)(@types/react@19.2.14)(expo-constants@57.0.8)(expo-font@57.0.1)(expo-linking@57.0.4)(expo@57.0.8)(react-dom@19.2.3)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.1)(react-native-safe-area-context@5.7.0)(react-native-screens@4.26.2)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2) react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: - supports-color @@ -18830,9 +18821,9 @@ snapshots: '@expo/sudo-prompt@9.3.2': {} - '@expo/ui@57.0.7(@babel/core@7.29.7)(@types/react-dom@19.2.3)(@types/react@19.2.14)(expo@57.0.8)(react-dom@19.2.3)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)': + '@expo/ui@57.0.8(@babel/core@7.29.7)(@types/react-dom@19.2.3)(@types/react@19.2.14)(expo@57.0.8)(react-dom@19.2.3)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)': dependencies: - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.7)(expo-router@57.0.8)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) react: 19.2.3 react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) sf-symbols-typescript: 2.2.0 @@ -18840,7 +18831,7 @@ snapshots: optionalDependencies: '@babel/core': 7.29.7(supports-color@10.2.2) react-dom: 19.2.3(react@19.2.3) - react-native-worklets: 0.10.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2) + react-native-worklets: 0.10.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2) transitivePeerDependencies: - '@types/react' - '@types/react-dom' @@ -18910,14 +18901,14 @@ snapshots: '@garmin/fitsdk@21.208.0': {} - '@gorhom/bottom-sheet@5.2.8(@types/react@19.2.14)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.0)(react-native@0.86.0)(react@19.2.3)': + '@gorhom/bottom-sheet@5.2.8(@types/react@19.2.14)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.1)(react-native@0.86.0)(react@19.2.3)': dependencies: '@gorhom/portal': 1.0.14(react-native@0.86.0)(react@19.2.3) invariant: 2.2.4 react: 19.2.3 react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) react-native-gesture-handler: 2.32.0(react-native@0.86.0)(react@19.2.3) - react-native-reanimated: 4.5.0(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3) + react-native-reanimated: 4.5.1(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3) optionalDependencies: '@types/react': 19.2.14 @@ -21528,13 +21519,6 @@ snapshots: optionalDependencies: '@types/react': 19.2.14 - '@radix-ui/react-slot@1.2.4(@types/react@19.2.14)(react@19.2.3)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.3) - react: 19.2.3 - optionalDependencies: - '@types/react': 19.2.14 - '@radix-ui/react-slot@1.3.3(@types/react@19.2.14)(react@19.2.3)': dependencies: '@radix-ui/react-compose-refs': 1.1.5(@types/react@19.2.14)(react@19.2.3) @@ -21624,7 +21608,7 @@ snapshots: react: 19.2.3 react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) optionalDependencies: - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.7)(expo-router@57.0.8)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) '@react-native-community/slider@5.1.2': {} @@ -22279,7 +22263,7 @@ snapshots: react: 19.2.3 react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) optionalDependencies: - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.7)(expo-router@57.0.8)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) transitivePeerDependencies: - '@expo/env' - dotenv @@ -24637,7 +24621,7 @@ snapshots: storybook: 10.5.4(@types/react@19.2.14)(prettier@3.9.5)(react-dom@19.2.3)(react@19.2.3) tinycolor2: 1.6.0 optionalDependencies: - '@gorhom/bottom-sheet': 5.2.8(@types/react@19.2.14)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.0)(react-native@0.86.0)(react@19.2.3) + '@gorhom/bottom-sheet': 5.2.8(@types/react@19.2.14)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.1)(react-native@0.86.0)(react@19.2.3) transitivePeerDependencies: - '@types/react' - '@types/react-dom' @@ -24715,9 +24699,9 @@ snapshots: - supports-color - typescript - '@storybook/react-native-ui@10.5.3(@gorhom/bottom-sheet@5.2.8)(@types/react-dom@19.2.3)(@types/react@19.2.14)(react-dom@19.2.3)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.0)(react-native-safe-area-context@5.7.0)(react-native-svg@15.15.4)(react-native@0.86.0)(react@19.2.3)(storybook@10.5.4)(supports-color@10.2.2)(typescript@6.0.3)': + '@storybook/react-native-ui@10.5.3(@gorhom/bottom-sheet@5.2.8)(@types/react-dom@19.2.3)(@types/react@19.2.14)(react-dom@19.2.3)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.1)(react-native-safe-area-context@5.7.0)(react-native-svg@15.15.4)(react-native@0.86.0)(react@19.2.3)(storybook@10.5.4)(supports-color@10.2.2)(typescript@6.0.3)': dependencies: - '@gorhom/bottom-sheet': 5.2.8(@types/react@19.2.14)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.0)(react-native@0.86.0)(react@19.2.3) + '@gorhom/bottom-sheet': 5.2.8(@types/react@19.2.14)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.1)(react-native@0.86.0)(react@19.2.3) '@gorhom/portal': 1.0.14(react-native@0.86.0)(react@19.2.3) '@nozbe/microfuzz': 1.0.0 '@storybook/react': 10.5.4(@types/react-dom@19.2.3)(@types/react@19.2.14)(react-dom@19.2.3)(react@19.2.3)(storybook@10.5.4)(supports-color@10.2.2)(typescript@6.0.3) @@ -24727,7 +24711,7 @@ snapshots: react: 19.2.3 react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) react-native-gesture-handler: 2.32.0(react-native@0.86.0)(react@19.2.3) - react-native-reanimated: 4.5.0(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3) + react-native-reanimated: 4.5.1(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3) react-native-safe-area-context: 5.7.0(react-native@0.86.0)(react@19.2.3) react-native-svg: 15.15.4(react-native@0.86.0)(react@19.2.3) storybook: 10.5.4(@types/react@19.2.14)(prettier@3.9.5)(react-dom@19.2.3)(react@19.2.3) @@ -24760,12 +24744,12 @@ snapshots: - typescript - webpack - '@storybook/react-native@10.5.3(@gorhom/bottom-sheet@5.2.8)(@types/react-dom@19.2.3)(@types/react@19.2.14)(esbuild@0.28.1)(react-dom@19.2.3)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.0)(react-native-safe-area-context@5.7.0)(react-native-svg@15.15.4)(react-native@0.86.0)(react@19.2.3)(storybook@10.5.4)(supports-color@10.2.2)(typescript@6.0.3)': + '@storybook/react-native@10.5.3(@gorhom/bottom-sheet@5.2.8)(@types/react-dom@19.2.3)(@types/react@19.2.14)(esbuild@0.28.1)(react-dom@19.2.3)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.1)(react-native-safe-area-context@5.7.0)(react-native-svg@15.15.4)(react-native@0.86.0)(react@19.2.3)(storybook@10.5.4)(supports-color@10.2.2)(typescript@6.0.3)': dependencies: '@storybook/mcp': 0.8.0(typescript@6.0.3) '@storybook/react': 10.5.4(@types/react-dom@19.2.3)(@types/react@19.2.14)(react-dom@19.2.3)(react@19.2.3)(storybook@10.5.4)(supports-color@10.2.2)(typescript@6.0.3) '@storybook/react-native-theming': 10.5.3(react-native@0.86.0)(react@19.2.3) - '@storybook/react-native-ui': 10.5.3(@gorhom/bottom-sheet@5.2.8)(@types/react-dom@19.2.3)(@types/react@19.2.14)(react-dom@19.2.3)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.0)(react-native-safe-area-context@5.7.0)(react-native-svg@15.15.4)(react-native@0.86.0)(react@19.2.3)(storybook@10.5.4)(supports-color@10.2.2)(typescript@6.0.3) + '@storybook/react-native-ui': 10.5.3(@gorhom/bottom-sheet@5.2.8)(@types/react-dom@19.2.3)(@types/react@19.2.14)(react-dom@19.2.3)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.1)(react-native-safe-area-context@5.7.0)(react-native-svg@15.15.4)(react-native@0.86.0)(react@19.2.3)(storybook@10.5.4)(supports-color@10.2.2)(typescript@6.0.3) '@storybook/react-native-ui-common': 10.5.3(@types/react-dom@19.2.3)(@types/react@19.2.14)(react-dom@19.2.3)(react-native@0.86.0)(react@19.2.3)(storybook@10.5.4)(supports-color@10.2.2)(typescript@6.0.3) '@tmcp/adapter-valibot': 0.1.6(tmcp@1.19.4)(valibot@1.4.2) '@tmcp/transport-http': 0.8.6(tmcp@1.19.4) @@ -24784,9 +24768,9 @@ snapshots: valibot: 1.4.2(typescript@6.0.3) ws: 8.21.0 optionalDependencies: - '@gorhom/bottom-sheet': 5.2.8(@types/react@19.2.14)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.0)(react-native@0.86.0)(react@19.2.3) + '@gorhom/bottom-sheet': 5.2.8(@types/react@19.2.14)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.1)(react-native@0.86.0)(react@19.2.3) react-native-gesture-handler: 2.32.0(react-native@0.86.0)(react@19.2.3) - react-native-reanimated: 4.5.0(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3) + react-native-reanimated: 4.5.1(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3) transitivePeerDependencies: - '@tmcp/auth' - '@types/react' @@ -26145,7 +26129,7 @@ snapshots: react-refresh: 0.14.2 optionalDependencies: '@babel/runtime': 7.29.7 - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.7)(expo-router@57.0.8)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) transitivePeerDependencies: - '@babel/core' - supports-color @@ -27630,7 +27614,7 @@ snapshots: data-view-byte-offset: 1.0.1 es-define-property: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 es-set-tostringtag: 2.1.0 es-to-primitive: 1.3.4 function.prototype.name: 1.2.0 @@ -27933,18 +27917,18 @@ snapshots: expo-apple-authentication@57.0.1(expo@57.0.8)(react-native@0.86.0)(react@19.2.3): dependencies: - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.7)(expo-router@57.0.8)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) react: 19.2.3 react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) expo-application@57.0.2(expo@57.0.8): dependencies: - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.7)(expo-router@57.0.8)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) expo-asset@57.0.7(expo@57.0.8)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3): dependencies: '@expo/image-utils': 0.11.4(supports-color@10.2.2)(typescript@6.0.3) - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.7)(expo-router@57.0.8)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) expo-constants: 57.0.7(expo@57.0.8)(react-native@0.86.0)(supports-color@10.2.2) react: 19.2.3 react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) @@ -27952,17 +27936,17 @@ snapshots: - supports-color - typescript - expo-build-properties@57.0.7(expo@57.0.8): + expo-build-properties@57.0.8(expo@57.0.8): dependencies: '@expo/schema-utils': 57.0.2 - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.7)(expo-router@57.0.8)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) resolve-from: 5.0.0 semver: 7.8.5 expo-camera@57.0.3(@types/emscripten@1.41.5)(expo@57.0.8)(react-native-web@0.21.2)(react-native@0.86.0)(react@19.2.3): dependencies: barcode-detector: 3.1.3(@types/emscripten@1.41.5) - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.7)(expo-router@57.0.8)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) react: 19.2.3 react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) optionalDependencies: @@ -27973,73 +27957,81 @@ snapshots: expo-constants@57.0.7(expo@57.0.8)(react-native@0.86.0)(supports-color@10.2.2): dependencies: '@expo/env': 2.4.2(supports-color@10.2.2) - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.7)(expo-router@57.0.8)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + transitivePeerDependencies: + - supports-color + + expo-constants@57.0.8(expo@57.0.8)(react-native@0.86.0)(supports-color@10.2.2): + dependencies: + '@expo/env': 2.4.2(supports-color@10.2.2) + expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) transitivePeerDependencies: - supports-color - expo-dev-client@57.0.9(expo@57.0.8)(react-native@0.86.0): + expo-dev-client@57.0.10(expo@57.0.8)(react-native@0.86.0): dependencies: - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.7)(expo-router@57.0.8)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) - expo-dev-launcher: 57.0.9(expo@57.0.8)(react-native@0.86.0) - expo-dev-menu: 57.0.9(expo@57.0.8)(react-native@0.86.0) + expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo-dev-launcher: 57.0.10(expo@57.0.8)(react-native@0.86.0) + expo-dev-menu: 57.0.10(expo@57.0.8)(react-native@0.86.0) expo-dev-menu-interface: 57.0.0(expo@57.0.8) expo-manifests: 57.0.1(expo@57.0.8) expo-updates-interface: 57.0.1(expo@57.0.8) transitivePeerDependencies: - react-native - expo-dev-launcher@57.0.9(expo@57.0.8)(react-native@0.86.0): + expo-dev-launcher@57.0.10(expo@57.0.8)(react-native@0.86.0): dependencies: '@expo/schema-utils': 57.0.2 - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.7)(expo-router@57.0.8)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) - expo-dev-menu: 57.0.9(expo@57.0.8)(react-native@0.86.0) + expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo-dev-menu: 57.0.10(expo@57.0.8)(react-native@0.86.0) expo-manifests: 57.0.1(expo@57.0.8) react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) expo-dev-menu-interface@57.0.0(expo@57.0.8): dependencies: - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.7)(expo-router@57.0.8)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) - expo-dev-menu@57.0.9(expo@57.0.8)(react-native@0.86.0): + expo-dev-menu@57.0.10(expo@57.0.8)(react-native@0.86.0): dependencies: - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.7)(expo-router@57.0.8)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) expo-dev-menu-interface: 57.0.0(expo@57.0.8) react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) expo-document-picker@57.0.1(expo@57.0.8): dependencies: - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.7)(expo-router@57.0.8)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) expo-eas-client@57.0.1: {} expo-file-system@57.0.1(expo@57.0.8)(react-native@0.86.0): dependencies: - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.7)(expo-router@57.0.8)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) expo-font@57.0.1(expo@57.0.8)(react-native@0.86.0)(react@19.2.3): dependencies: - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.7)(expo-router@57.0.8)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) fontfaceobserver: 2.3.0 react: 19.2.3 react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) expo-glass-effect@57.0.1(expo@57.0.8)(react-native@0.86.0)(react@19.2.3): dependencies: - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.7)(expo-router@57.0.8)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) react: 19.2.3 react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) expo-haptics@57.0.1(expo@57.0.8): dependencies: - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.7)(expo-router@57.0.8)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) expo-json-utils@57.0.1: {} expo-keep-awake@57.0.1(expo@57.0.8)(react@19.2.3): dependencies: - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.7)(expo-router@57.0.8)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) react: 19.2.3 expo-linking@57.0.4(expo@57.0.8)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2): @@ -28052,17 +28044,17 @@ snapshots: - expo - supports-color - expo-location@57.0.6(expo@57.0.8)(supports-color@10.2.2)(typescript@6.0.3): + expo-location@57.0.7(expo@57.0.8)(supports-color@10.2.2)(typescript@6.0.3): dependencies: '@expo/image-utils': 0.11.4(supports-color@10.2.2)(typescript@6.0.3) - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.7)(expo-router@57.0.8)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) transitivePeerDependencies: - supports-color - typescript expo-manifests@57.0.1(expo@57.0.8): dependencies: - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.7)(expo-router@57.0.8)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) expo-json-utils: 57.0.1 expo-modules-autolinking@57.0.9(supports-color@10.2.2)(typescript@6.0.3): @@ -28075,7 +28067,17 @@ snapshots: - supports-color - typescript - expo-modules-core@57.0.7(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3): + expo-modules-core@57.0.7(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3): + dependencies: + '@expo/expo-modules-macros-plugin': 0.6.1 + expo-modules-jsi: 57.0.4(react-native@0.86.0) + invariant: 2.2.4 + react: 19.2.3 + react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + optionalDependencies: + react-native-worklets: 0.10.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2) + + expo-modules-core@57.0.8(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3): dependencies: '@expo/expo-modules-macros-plugin': 0.6.1 expo-modules-jsi: 57.0.4(react-native@0.86.0) @@ -28083,33 +28085,33 @@ snapshots: react: 19.2.3 react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) optionalDependencies: - react-native-worklets: 0.10.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2) + react-native-worklets: 0.10.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2) expo-modules-jsi@57.0.4(react-native@0.86.0): dependencies: react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) - expo-notifications@57.0.7(expo@57.0.8)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3): + expo-notifications@57.0.8(expo@57.0.8)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3): dependencies: '@expo/image-utils': 0.11.4(supports-color@10.2.2)(typescript@6.0.3) abort-controller: 3.0.0 badgin: 1.2.3 - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.7)(expo-router@57.0.8)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) expo-application: 57.0.2(expo@57.0.8) - expo-constants: 57.0.7(expo@57.0.8)(react-native@0.86.0)(supports-color@10.2.2) + expo-constants: 57.0.8(expo@57.0.8)(react-native@0.86.0)(supports-color@10.2.2) react: 19.2.3 react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) transitivePeerDependencies: - supports-color - typescript - expo-router@57.0.8(@babel/core@7.29.7)(@expo/log-box@57.0.1)(@expo/metro-runtime@57.0.7)(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3)(@types/react@19.2.14)(expo-constants@57.0.7)(expo-font@57.0.1)(expo-linking@57.0.4)(expo@57.0.8)(react-dom@19.2.3)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.0)(react-native-safe-area-context@5.7.0)(react-native-screens@4.26.2)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2): + expo-router@57.0.9(@babel/core@7.29.7)(@expo/log-box@57.0.2)(@expo/metro-runtime@57.0.8)(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3)(@types/react@19.2.14)(expo-constants@57.0.8)(expo-font@57.0.1)(expo-linking@57.0.4)(expo@57.0.8)(react-dom@19.2.3)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.1)(react-native-safe-area-context@5.7.0)(react-native-screens@4.26.2)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2): dependencies: - '@expo/log-box': 57.0.1(@expo/dom-webview@55.0.5)(expo@57.0.8)(react-native@0.86.0)(react@19.2.3) - '@expo/metro-runtime': 57.0.7(@expo/log-box@57.0.1)(expo@57.0.8)(react-dom@19.2.3)(react-native@0.86.0)(react@19.2.3) + '@expo/log-box': 57.0.2(@expo/dom-webview@55.0.5)(expo@57.0.8)(react-native@0.86.0)(react@19.2.3) + '@expo/metro-runtime': 57.0.8(@expo/log-box@57.0.2)(expo@57.0.8)(react-dom@19.2.3)(react-native@0.86.0)(react@19.2.3) '@expo/schema-utils': 57.0.2 - '@expo/ui': 57.0.7(@babel/core@7.29.7)(@types/react-dom@19.2.3)(@types/react@19.2.14)(expo@57.0.8)(react-dom@19.2.3)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3) - '@radix-ui/react-slot': 1.2.4(@types/react@19.2.14)(react@19.2.3) + '@expo/ui': 57.0.8(@babel/core@7.29.7)(@types/react-dom@19.2.3)(@types/react@19.2.14)(expo@57.0.8)(react-dom@19.2.3)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3) + '@radix-ui/react-slot': 1.3.3(@types/react@19.2.14)(react@19.2.3) '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.3)(@types/react@19.2.14)(react-dom@19.2.3)(react@19.2.3) '@react-native-masked-view/masked-view': 0.3.2(react-native@0.86.0)(react@19.2.3) '@testing-library/jest-dom': 6.9.1 @@ -28118,21 +28120,21 @@ snapshots: color: 4.2.3 debug: 4.4.3(supports-color@10.2.2) escape-string-regexp: 4.0.0 - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.7)(expo-router@57.0.8)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) - expo-constants: 57.0.7(expo@57.0.8)(react-native@0.86.0)(supports-color@10.2.2) + expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo-constants: 57.0.8(expo@57.0.8)(react-native@0.86.0)(supports-color@10.2.2) expo-glass-effect: 57.0.1(expo@57.0.8)(react-native@0.86.0)(react@19.2.3) expo-linking: 57.0.4(expo@57.0.8)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2) expo-server: 57.0.1 expo-symbols: 57.0.1(expo-font@57.0.1)(expo@57.0.8)(react-native@0.86.0)(react@19.2.3) fast-deep-equal: 3.1.3 invariant: 2.2.4 - nanoid: 3.3.15 + nanoid: 3.3.16 query-string: 7.1.3 react: 19.2.3 react-fast-compare: 3.2.2 react-is: 19.2.6 react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) - react-native-drawer-layout: 4.2.5(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.0)(react-native@0.86.0)(react@19.2.3) + react-native-drawer-layout: 4.2.5(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.1)(react-native@0.86.0)(react@19.2.3) react-native-safe-area-context: 5.7.0(react-native@0.86.0)(react@19.2.3) react-native-screens: 4.26.2(react-native@0.86.0)(react@19.2.3) server-only: 0.0.1 @@ -28143,7 +28145,7 @@ snapshots: optionalDependencies: react-dom: 19.2.3(react@19.2.3) react-native-gesture-handler: 2.32.0(react-native@0.86.0)(react@19.2.3) - react-native-reanimated: 4.5.0(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3) + react-native-reanimated: 4.5.1(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3) react-native-web: 0.21.2(encoding@0.1.13)(react-dom@19.2.3)(react@19.2.3) transitivePeerDependencies: - '@babel/core' @@ -28156,16 +28158,16 @@ snapshots: expo-secure-store@57.0.1(expo@57.0.8): dependencies: - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.7)(expo-router@57.0.8)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) expo-server@57.0.1: {} - expo-sharing@57.0.7(expo@57.0.8)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3): + expo-sharing@57.0.8(expo@57.0.8)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3): dependencies: '@expo/config-plugins': 57.0.6(supports-color@10.2.2)(typescript@6.0.3) '@expo/config-types': 57.0.2 '@expo/plist': 0.8.1(patch_hash=2e81ea41c32856973b677ca39a3f7f4a53b550dc5093fddfaa1abd120b800e2e) - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.7)(expo-router@57.0.8)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) react: 19.2.3 react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) transitivePeerDependencies: @@ -28176,7 +28178,7 @@ snapshots: dependencies: '@expo/config-plugins': 57.0.6(supports-color@10.2.2)(typescript@6.0.3) '@expo/image-utils': 0.11.4(supports-color@10.2.2)(typescript@6.0.3) - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.7)(expo-router@57.0.8)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) xml2js: 0.6.0 transitivePeerDependencies: - supports-color @@ -28187,23 +28189,23 @@ snapshots: expo-symbols@57.0.1(expo-font@57.0.1)(expo@57.0.8)(react-native@0.86.0)(react@19.2.3): dependencies: '@expo-google-fonts/material-symbols': 0.4.38 - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.7)(expo-router@57.0.8)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) expo-font: 57.0.1(expo@57.0.8)(react-native@0.86.0)(react@19.2.3) react: 19.2.3 react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) sf-symbols-typescript: 2.2.0 - expo-task-manager@57.0.6(expo@57.0.8)(react-native@0.86.0): + expo-task-manager@57.0.7(expo@57.0.8)(react-native@0.86.0): dependencies: - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.7)(expo-router@57.0.8)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) unimodules-app-loader: 57.0.1 expo-updates-interface@57.0.1(expo@57.0.8): dependencies: - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.7)(expo-router@57.0.8)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) - expo-updates@57.0.10(expo-dev-client@57.0.9)(expo@57.0.8)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2): + expo-updates@57.0.11(expo-dev-client@57.0.10)(expo@57.0.8)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2): dependencies: '@expo/code-signing-certificates': 0.0.6 '@expo/plist': 0.8.1(patch_hash=2e81ea41c32856973b677ca39a3f7f4a53b550dc5093fddfaa1abd120b800e2e) @@ -28211,7 +28213,7 @@ snapshots: arg: 4.1.3 chalk: 4.1.2 debug: 4.4.3(supports-color@10.2.2) - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.7)(expo-router@57.0.8)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) expo-eas-client: 57.0.1 expo-manifests: 57.0.1(expo@57.0.8) expo-structured-headers: 57.0.0 @@ -28224,19 +28226,19 @@ snapshots: react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) resolve-from: 5.0.0 optionalDependencies: - expo-dev-client: 57.0.9(expo@57.0.8)(react-native@0.86.0) + expo-dev-client: 57.0.10(expo@57.0.8)(react-native@0.86.0) transitivePeerDependencies: - supports-color expo-web-browser@57.0.2(expo@57.0.8)(react-native@0.86.0): dependencies: - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.7)(expo-router@57.0.8)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) - expo@57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.7)(expo-router@57.0.8)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3): + expo@57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3): dependencies: '@babel/runtime': 7.29.7 - '@expo/cli': 57.0.10(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.7)(expo-constants@57.0.7)(expo-font@57.0.1)(expo-router@57.0.8)(expo@57.0.8)(react-dom@19.2.3)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + '@expo/cli': 57.0.10(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-constants@57.0.7)(expo-font@57.0.1)(expo-router@57.0.9)(expo@57.0.8)(react-dom@19.2.3)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) '@expo/config': 57.0.6(supports-color@10.2.2)(typescript@6.0.3) '@expo/config-plugins': 57.0.6(supports-color@10.2.2)(typescript@6.0.3) '@expo/devtools': 57.0.1(react-native@0.86.0)(react@19.2.3) @@ -28253,7 +28255,7 @@ snapshots: expo-font: 57.0.1(expo@57.0.8)(react-native@0.86.0)(react@19.2.3) expo-keep-awake: 57.0.1(expo@57.0.8)(react@19.2.3) expo-modules-autolinking: 57.0.9(supports-color@10.2.2)(typescript@6.0.3) - expo-modules-core: 57.0.7(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3) + expo-modules-core: 57.0.7(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3) pretty-format: 29.7.0 react: 19.2.3 react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) @@ -28261,7 +28263,7 @@ snapshots: whatwg-url-minimum: 0.1.2 optionalDependencies: '@expo/dom-webview': 55.0.5(expo@57.0.8)(react-native@0.86.0)(react@19.2.3) - '@expo/metro-runtime': 57.0.7(@expo/log-box@57.0.1)(expo@57.0.8)(react-dom@19.2.3)(react-native@0.86.0)(react@19.2.3) + '@expo/metro-runtime': 57.0.8(@expo/log-box@57.0.2)(expo@57.0.8)(react-dom@19.2.3)(react-native@0.86.0)(react@19.2.3) react-dom: 19.2.3(react@19.2.3) react-native-web: 0.21.2(encoding@0.1.13)(react-dom@19.2.3)(react@19.2.3) transitivePeerDependencies: @@ -30817,8 +30819,6 @@ snapshots: nan@2.28.0: optional: true - nanoid@3.3.15: {} - nanoid@3.3.16: {} nanospinner@1.2.2: @@ -31285,7 +31285,7 @@ snapshots: call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 has-symbols: 1.1.0 object-keys: 1.1.1 @@ -32140,13 +32140,13 @@ snapshots: react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) react-native-svg: 15.15.4(react-native@0.86.0)(react@19.2.3) - react-native-drawer-layout@4.2.5(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.0)(react-native@0.86.0)(react@19.2.3): + react-native-drawer-layout@4.2.5(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.1)(react-native@0.86.0)(react@19.2.3): dependencies: color: 4.2.3 react: 19.2.3 react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) react-native-gesture-handler: 2.32.0(react-native@0.86.0)(react@19.2.3) - react-native-reanimated: 4.5.0(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3) + react-native-reanimated: 4.5.1(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3) use-latest-callback: 0.2.6(react@19.2.3) react-native-gesture-handler@2.32.0(react-native@0.86.0)(react@19.2.3): @@ -32177,13 +32177,13 @@ snapshots: prop-types: 15.8.1 react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) - react-native-reanimated@4.5.0(react-native-worklets@0.10.0)(react-native@0.86.0)(react@19.2.3): + react-native-reanimated@4.5.1(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3): dependencies: react: 19.2.3 react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) react-native-is-edge-to-edge: 1.3.1(react-native@0.86.0)(react@19.2.3) - react-native-worklets: 0.10.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2) - semver: 7.8.0 + react-native-worklets: 0.10.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2) + semver: 7.8.5 react-native-safe-area-context@5.7.0(react-native@0.86.0)(react@19.2.3): dependencies: @@ -32225,16 +32225,16 @@ snapshots: transitivePeerDependencies: - encoding - react-native-worklets@0.10.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2): + react-native-worklets@0.10.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2): dependencies: '@babel/core': 7.29.7(supports-color@10.2.2) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.29.7) + '@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)(supports-color@10.2.2) '@babel/plugin-transform-classes': 7.29.7(@babel/core@7.29.7)(supports-color@10.2.2) '@babel/plugin-transform-nullish-coalescing-operator': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.29.7)(supports-color@10.2.2) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.29.7) + '@babel/plugin-transform-shorthand-properties': 7.29.7(@babel/core@7.29.7) + '@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.28.5(@babel/core@7.29.7)(supports-color@10.2.2) '@babel/types': 7.29.7 @@ -32454,7 +32454,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.24.2 es-errors: 1.3.0 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 get-intrinsic: 1.3.0 get-proto: 1.0.1 which-builtin-type: 1.2.1 @@ -32874,7 +32874,7 @@ snapshots: dependencies: dunder-proto: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 setimmediate@1.0.5: {} @@ -33399,7 +33399,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.24.2 es-errors: 1.3.0 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 get-intrinsic: 1.3.0 gopd: 1.2.0 has-symbols: 1.1.0 @@ -33430,7 +33430,7 @@ snapshots: dependencies: call-bind: 1.0.9 define-properties: 1.2.1 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 string_decoder@1.1.1: dependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 2d8cf5df05..6cc34d2fdd 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -87,3 +87,20 @@ allowBuilds: protobufjs: false sharp: true ssh2: false + +minimumReleaseAgeExclude: + - '@expo/log-box@57.0.2' + - '@expo/metro-runtime@57.0.8' + - '@expo/ui@57.0.8' + - expo-build-properties@57.0.8 + - expo-constants@57.0.8 + - expo-dev-client@57.0.10 + - expo-dev-launcher@57.0.10 + - expo-dev-menu@57.0.10 + - expo-location@57.0.7 + - expo-modules-core@57.0.8 + - expo-notifications@57.0.8 + - expo-router@57.0.9 + - expo-sharing@57.0.8 + - expo-task-manager@57.0.7 + - expo-updates@57.0.11 From 05a1093bc0e2f5a86571b9ec6bbe41256dda6f20 Mon Sep 17 00:00:00 2001 From: Asher Cohen Date: Wed, 29 Jul 2026 13:29:17 -0700 Subject: [PATCH 6/7] fix(reports): address review findings --- .../2026-07-29-decision-oriented-reports.md | 12 ++--- packages/format/package.json | 1 + .../src/report-decision-synthesis.test.ts | 24 ++++++++++ .../format/src/report-decision-synthesis.ts | 18 ++++++++ packages/mobile/app/reports.test.tsx | 44 +++++++++++++------ .../components/ReportDecisionSynthesis.tsx | 28 +++--------- .../report-decision-synthesis.test.ts | 14 +++++- .../repositories/report-decision-synthesis.ts | 12 ++--- .../ReportDecisionSynthesis.stories.tsx | 12 +++++ .../components/ReportDecisionSynthesis.tsx | 28 +++--------- .../web/src/routes/health-report.test.tsx | 24 ++++++++++ packages/web/src/routes/health-report.tsx | 11 ++--- 12 files changed, 152 insertions(+), 76 deletions(-) create mode 100644 packages/format/src/report-decision-synthesis.test.ts create mode 100644 packages/format/src/report-decision-synthesis.ts diff --git a/docs/superpowers/plans/2026-07-29-decision-oriented-reports.md b/docs/superpowers/plans/2026-07-29-decision-oriented-reports.md index be928869e4..c2e63769e2 100644 --- a/docs/superpowers/plans/2026-07-29-decision-oriented-reports.md +++ b/docs/superpowers/plans/2026-07-29-decision-oriented-reports.md @@ -2,7 +2,7 @@ **Goal:** Make weekly and monthly reports explain what the available data supports doing next instead of only repeating dashboard metrics. -**Behavior:** The server adds a deterministic decision synthesis to every non-empty weekly and monthly report. The synthesis covers what changed, descriptive associations, what appears to have worked, one next experiment, and evidence limitations or missing data. Web, iOS, and new shared-report snapshots render the same server-owned synthesis without recomputing health meaning. +**Behavior:** The server adds a deterministic decision synthesis to every non-empty weekly and monthly report. The synthesis covers what changed, descriptive associations, what appears to have worked, one next experiment, and evidence limitations or missing data. Web, mobile, and new shared-report snapshots render the same server-owned synthesis without recomputing health meaning. **Scope:** Use the period summaries already returned by the report repositories. Keep the existing metric snapshots and sharing flow, avoid causal claims or a new analytics query, and preserve compatibility with shared snapshots created before the synthesis field existed. @@ -13,7 +13,7 @@ ## Current Evidence - `WeeklyReportRepository` and `MonthlyReportRepository` return current and historical metric aggregates but no decision synthesis. -- `WeeklyReportCard`, `MonthlyReportContent`, and the iOS reports screen render metric grids independently. +- `WeeklyReportCard`, `MonthlyReportContent`, and the mobile reports screen render metric grids independently. - Shared reports persist the same server response as JSON; the web shared-report route validates old snapshots at runtime. ## Test Strategy @@ -27,8 +27,8 @@ - Create `packages/server/src/repositories/report-decision-synthesis.ts` and its colocated test for the shared server domain model. - Modify weekly/monthly report repositories and tests to attach synthesis. -- Create web and mobile report-synthesis components with colocated tests and stories. -- Modify weekly/monthly web report components, the shared-report parser, and the mobile reports screen to render the server response. +- Create `packages/web/src/components/ReportDecisionSynthesis.tsx` and `packages/mobile/components/ReportDecisionSynthesis.tsx` with colocated tests and representative stories. +- Modify the weekly/monthly web report components, `packages/web/src/routes/health-report.tsx`, and `packages/mobile/app/reports.tsx` to render the server response. ## Tasks @@ -47,13 +47,13 @@ ### Task 3: Add Failing Client Tests -- [ ] Require all five server-provided sections on web weekly/monthly reports and iOS. +- [ ] Require all five server-provided sections on web weekly/monthly reports and mobile. - [ ] Require shared-report parsing to accept both new synthesis snapshots and legacy snapshots without the field. - [ ] Run `pnpm exec vitest run packages/web/src/components/ReportDecisionSynthesis.test.tsx packages/web/src/components/WeeklyReportCard.test.tsx packages/web/src/components/MonthlyReportContent.test.tsx packages/web/src/routes/health-report.test.tsx --project unit`. - [ ] Run `pnpm exec vitest run packages/mobile/components/ReportDecisionSynthesis.test.tsx packages/mobile/app/reports.test.tsx --project mobile`. - [ ] Confirm the tests fail because the synthesis is not rendered. -### Task 4: Implement Web and iOS Parity +### Task 4: Implement Web and Mobile Parity - [ ] Add small render-only synthesis components and representative stories. - [ ] Render the server payload on weekly, monthly, mobile, and newly shared reports. diff --git a/packages/format/package.json b/packages/format/package.json index 0f8e702fa2..6134310550 100644 --- a/packages/format/package.json +++ b/packages/format/package.json @@ -10,6 +10,7 @@ "./medication-dose-events": "./src/medication-dose-events.ts", "./medication-reminders": "./src/medication-reminders.ts", "./record-local-time": "./src/record-local-time.ts", + "./report-decision-synthesis": "./src/report-decision-synthesis.ts", "./supplement-dose-events": "./src/supplement-dose-events.ts", "./units": "./src/units.ts" }, diff --git a/packages/format/src/report-decision-synthesis.test.ts b/packages/format/src/report-decision-synthesis.test.ts new file mode 100644 index 0000000000..55cfde5bd4 --- /dev/null +++ b/packages/format/src/report-decision-synthesis.test.ts @@ -0,0 +1,24 @@ +import { describe, expect, it } from "vitest"; +import { + keyedDecisionSynthesisItems, + reportDecisionSynthesisSections, +} from "./report-decision-synthesis.ts"; + +describe("report decision synthesis formatting", () => { + it("defines the shared section order and titles", () => { + expect(reportDecisionSynthesisSections).toEqual([ + { key: "whatChanged", title: "What changed" }, + { key: "likelyAssociations", title: "Likely associations" }, + { key: "whatWorked", title: "What worked" }, + { key: "whatToTryNext", title: "What to try next" }, + { key: "confidenceAndMissingData", title: "Confidence and missing data" }, + ]); + }); + + it("assigns stable occurrence-aware keys to repeated narrative items", () => { + expect(keyedDecisionSynthesisItems(["Repeated evidence.", "Repeated evidence."])).toEqual([ + { key: '["Repeated evidence.",0]', text: "Repeated evidence." }, + { key: '["Repeated evidence.",1]', text: "Repeated evidence." }, + ]); + }); +}); diff --git a/packages/format/src/report-decision-synthesis.ts b/packages/format/src/report-decision-synthesis.ts new file mode 100644 index 0000000000..b50c66f0ca --- /dev/null +++ b/packages/format/src/report-decision-synthesis.ts @@ -0,0 +1,18 @@ +export const reportDecisionSynthesisSections = [ + { key: "whatChanged", title: "What changed" }, + { key: "likelyAssociations", title: "Likely associations" }, + { key: "whatWorked", title: "What worked" }, + { key: "whatToTryNext", title: "What to try next" }, + { key: "confidenceAndMissingData", title: "Confidence and missing data" }, +] as const; + +export function keyedDecisionSynthesisItems( + items: readonly string[], +): { key: string; text: string }[] { + const occurrences = new Map(); + return items.map((text) => { + const occurrence = occurrences.get(text) ?? 0; + occurrences.set(text, occurrence + 1); + return { key: JSON.stringify([text, occurrence]), text }; + }); +} diff --git a/packages/mobile/app/reports.test.tsx b/packages/mobile/app/reports.test.tsx index 3d641c438e..413df2bf74 100644 --- a/packages/mobile/app/reports.test.tsx +++ b/packages/mobile/app/reports.test.tsx @@ -5,6 +5,7 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; const monthlyQueryControl = vi.hoisted(() => ({ showError: false, preserveData: false, + showDecisionSupport: true, })); const mockWeeklyReportQuery = vi.hoisted(() => vi.fn()); const mockMonthlyReportQuery = vi.hoisted(() => vi.fn()); @@ -35,13 +36,15 @@ vi.mock("../lib/trpc", () => ({ avgHrv: 48, }, history: [], - decisionSupport: { - whatChanged: ["Weekly training increased."], - likelyAssociations: ["Training and sleep moved together."], - whatWorked: ["Sleep stayed consistent."], - whatToTryNext: ["Repeat the routine next week."], - confidenceAndMissingData: ["Confidence is limited."], - }, + decisionSupport: monthlyQueryControl.showDecisionSupport + ? { + whatChanged: ["Weekly training increased."], + likelyAssociations: ["Training and sleep moved together."], + whatWorked: ["Sleep stayed consistent."], + whatToTryNext: ["Repeat the routine next week."], + confidenceAndMissingData: ["Confidence is limited."], + } + : null, }, isLoading: false, error: null, @@ -70,13 +73,15 @@ vi.mock("../lib/trpc", () => ({ avgSleepTrend: null, }, history: [], - decisionSupport: { - whatChanged: ["Monthly training increased."], - likelyAssociations: ["Training and sleep moved together."], - whatWorked: ["Sleep stayed consistent."], - whatToTryNext: ["Repeat the routine next month."], - confidenceAndMissingData: ["Confidence is limited."], - }, + decisionSupport: monthlyQueryControl.showDecisionSupport + ? { + whatChanged: ["Monthly training increased."], + likelyAssociations: ["Training and sleep moved together."], + whatWorked: ["Sleep stayed consistent."], + whatToTryNext: ["Repeat the routine next month."], + confidenceAndMissingData: ["Confidence is limited."], + } + : null, }, isLoading: false, error: monthlyQueryControl.showError @@ -103,6 +108,7 @@ describe("ReportsScreen", () => { beforeEach(() => { monthlyQueryControl.showError = false; monthlyQueryControl.preserveData = false; + monthlyQueryControl.showDecisionSupport = true; mockWeeklyReportQuery.mockClear(); mockMonthlyReportQuery.mockClear(); }); @@ -136,6 +142,16 @@ describe("ReportsScreen", () => { expect(screen.queryByText("Not enough monthly data to create a report.")).toBeNull(); }); + it("renders report metrics without a decision summary when synthesis is unavailable", async () => { + monthlyQueryControl.showDecisionSupport = false; + const { default: ReportsScreen } = await import("./reports"); + + render(); + + expect(screen.queryByText("Decision summary")).toBeNull(); + expect(screen.getAllByText("Average Heart Rate Variability (HRV)")).toHaveLength(2); + }); + it("keeps cached monthly report data visible during a background failure", async () => { monthlyQueryControl.showError = true; monthlyQueryControl.preserveData = true; diff --git a/packages/mobile/components/ReportDecisionSynthesis.tsx b/packages/mobile/components/ReportDecisionSynthesis.tsx index fbd041e7f8..27542bae2d 100644 --- a/packages/mobile/components/ReportDecisionSynthesis.tsx +++ b/packages/mobile/components/ReportDecisionSynthesis.tsx @@ -1,35 +1,19 @@ +import { + keyedDecisionSynthesisItems, + reportDecisionSynthesisSections, +} from "@dofek/format/report-decision-synthesis"; import type { ReportDecisionSynthesis as ReportDecisionSynthesisData } from "dofek-server/types"; import { StyleSheet, Text, View } from "react-native"; import { colors, spacing } from "../theme"; import { Card } from "./Card"; -const sections: { - key: keyof ReportDecisionSynthesisData; - title: string; -}[] = [ - { key: "whatChanged", title: "What changed" }, - { key: "likelyAssociations", title: "Likely associations" }, - { key: "whatWorked", title: "What worked" }, - { key: "whatToTryNext", title: "What to try next" }, - { key: "confidenceAndMissingData", title: "Confidence and missing data" }, -]; - -function keyedItems(items: string[]): { key: string; text: string }[] { - const occurrences = new Map(); - return items.map((text) => { - const occurrence = occurrences.get(text) ?? 0; - occurrences.set(text, occurrence + 1); - return { key: JSON.stringify([text, occurrence]), text }; - }); -} - export function ReportDecisionSynthesis({ synthesis }: { synthesis: ReportDecisionSynthesisData }) { return ( - {sections.map((section) => ( + {reportDecisionSynthesisSections.map((section) => ( {section.title} - {keyedItems(synthesis[section.key]).map((item) => ( + {keyedDecisionSynthesisItems(synthesis[section.key]).map((item) => ( {item.text} diff --git a/packages/server/src/repositories/report-decision-synthesis.test.ts b/packages/server/src/repositories/report-decision-synthesis.test.ts index ff3968b7b6..94c605d19b 100644 --- a/packages/server/src/repositories/report-decision-synthesis.test.ts +++ b/packages/server/src/repositories/report-decision-synthesis.test.ts @@ -127,6 +127,16 @@ describe("buildWeeklyDecisionSynthesis", () => { ); }); + it("renders positive sub-minute sleep values without an empty duration", () => { + const synthesis = buildWeeklyDecisionSynthesis(weeklyPeriod({ avgSleepMinutes: 0.4 }), [ + weeklyPeriod({ avgSleepMinutes: 1.4 }), + ]); + + expect(synthesis.whatChanged[1]).toBe( + "Average nightly sleep was 0 minutes, 1 minute less than the previous week.", + ); + }); + it("formats fractional, grouped, and lower training values at display precision", () => { const synthesis = buildWeeklyDecisionSynthesis( weeklyPeriod({ trainingHours: 1_234.56, avgSleepMinutes: 61 }), @@ -371,7 +381,7 @@ describe("buildWeeklyDecisionSynthesis", () => { ).toContain("Missing current-period data: resting heart rate and heart rate variability."); }); - it("does not report moderate confidence when current recovery data is missing", () => { + it("names missing recovery data as the confidence limit when history is sufficient", () => { const synthesis = buildWeeklyDecisionSynthesis(weeklyPeriod({ avgHrv: null }), [ weeklyPeriod(), weeklyPeriod(), @@ -379,7 +389,7 @@ describe("buildWeeklyDecisionSynthesis", () => { ]); expect(synthesis.confidenceAndMissingData[0]).toBe( - "Confidence is limited because only 4 weekly periods are available.", + "Confidence is limited because current-period recovery data is incomplete.", ); }); diff --git a/packages/server/src/repositories/report-decision-synthesis.ts b/packages/server/src/repositories/report-decision-synthesis.ts index a7173fd749..6f7406bb37 100644 --- a/packages/server/src/repositories/report-decision-synthesis.ts +++ b/packages/server/src/repositories/report-decision-synthesis.ts @@ -38,7 +38,7 @@ function formatDuration(minutes: number): string { const parts: string[] = []; if (hours > 0) parts.push(`${hours} ${hours === 1 ? "hour" : "hours"}`); if (remainder > 0) parts.push(`${remainder} ${remainder === 1 ? "minute" : "minutes"}`); - return parts.join(" "); + return parts.length === 0 ? "0 minutes" : parts.join(" "); } function relativeChange(current: number, previous: number): number | null { @@ -194,10 +194,12 @@ function confidenceAndMissingData( const confidence = periodCount >= 4 && missing.length === 0 ? `Confidence is moderate because ${periodCount} ${periodLabel} are available and the current period includes sleep and recovery data.` - : `Confidence is ${periodCount === 1 ? "low" : "limited"} because only ${periodCount} ${periodLabel.slice( - 0, - -1, - )}${periodCount === 1 ? "" : "s"} ${periodCount === 1 ? "is" : "are"} available.`; + : periodCount >= 4 + ? "Confidence is limited because current-period recovery data is incomplete." + : `Confidence is ${periodCount === 1 ? "low" : "limited"} because only ${periodCount} ${periodLabel.slice( + 0, + -1, + )}${periodCount === 1 ? "" : "s"} ${periodCount === 1 ? "is" : "are"} available.`; const result = [ confidence, "These period averages can show co-movement, but they cannot establish cause and effect.", diff --git a/packages/web/src/components/ReportDecisionSynthesis.stories.tsx b/packages/web/src/components/ReportDecisionSynthesis.stories.tsx index e74dc76e80..2307518f3d 100644 --- a/packages/web/src/components/ReportDecisionSynthesis.stories.tsx +++ b/packages/web/src/components/ReportDecisionSynthesis.stories.tsx @@ -43,3 +43,15 @@ export const MissingData: Story = { }, }, }; + +export const Empty: Story = { + args: { + synthesis: { + whatChanged: [], + likelyAssociations: [], + whatWorked: [], + whatToTryNext: [], + confidenceAndMissingData: [], + }, + }, +}; diff --git a/packages/web/src/components/ReportDecisionSynthesis.tsx b/packages/web/src/components/ReportDecisionSynthesis.tsx index 787e103a45..12e137d77a 100644 --- a/packages/web/src/components/ReportDecisionSynthesis.tsx +++ b/packages/web/src/components/ReportDecisionSynthesis.tsx @@ -1,35 +1,19 @@ +import { + keyedDecisionSynthesisItems, + reportDecisionSynthesisSections, +} from "@dofek/format/report-decision-synthesis"; import type { ReportDecisionSynthesis as ReportDecisionSynthesisData } from "dofek-server/types"; -const sections: { - key: keyof ReportDecisionSynthesisData; - title: string; -}[] = [ - { key: "whatChanged", title: "What changed" }, - { key: "likelyAssociations", title: "Likely associations" }, - { key: "whatWorked", title: "What worked" }, - { key: "whatToTryNext", title: "What to try next" }, - { key: "confidenceAndMissingData", title: "Confidence and missing data" }, -]; - -function keyedItems(items: string[]): { key: string; text: string }[] { - const occurrences = new Map(); - return items.map((text) => { - const occurrence = occurrences.get(text) ?? 0; - occurrences.set(text, occurrence + 1); - return { key: JSON.stringify([text, occurrence]), text }; - }); -} - export function ReportDecisionSynthesis({ synthesis }: { synthesis: ReportDecisionSynthesisData }) { return (

Decision summary

- {sections.map((section) => ( + {reportDecisionSynthesisSections.map((section) => (

{section.title}

    - {keyedItems(synthesis[section.key]).map((item) => ( + {keyedDecisionSynthesisItems(synthesis[section.key]).map((item) => (
  • {item.text}
  • ))}
diff --git a/packages/web/src/routes/health-report.test.tsx b/packages/web/src/routes/health-report.test.tsx index a2acd5071c..17871bd6ce 100644 --- a/packages/web/src/routes/health-report.test.tsx +++ b/packages/web/src/routes/health-report.test.tsx @@ -265,6 +265,30 @@ describe("health report route", () => { expect(screen.getByText("This shared report contains invalid data.")).toBeTruthy(); }); + it("rejects blank decision-support narratives in persisted report data", () => { + mockGetShared.mockReturnValue({ + data: { + ...weeklyReport, + reportData: { + ...weeklyReport.reportData, + decisionSupport: { + whatChanged: [" "], + likelyAssociations: [], + whatWorked: [], + whatToTryNext: [], + confidenceAndMissingData: [], + }, + }, + }, + error: null, + isLoading: false, + }); + + renderRoute("shared-token"); + + expect(screen.getByText("This shared report contains invalid data.")).toBeTruthy(); + }); + it("keeps owner management without a token on the authenticated query", () => { mockMyReports.mockReturnValue({ data: [], diff --git a/packages/web/src/routes/health-report.tsx b/packages/web/src/routes/health-report.tsx index b4af0dbf6d..9eb7697233 100644 --- a/packages/web/src/routes/health-report.tsx +++ b/packages/web/src/routes/health-report.tsx @@ -47,12 +47,13 @@ const weekSummarySchema = z.object({ avgHrv: z.number().nullable(), }); +const decisionSupportItemSchema = z.string().trim().min(1); const reportDecisionSynthesisSchema = z.object({ - whatChanged: z.array(z.string()), - likelyAssociations: z.array(z.string()), - whatWorked: z.array(z.string()), - whatToTryNext: z.array(z.string()), - confidenceAndMissingData: z.array(z.string()), + whatChanged: z.array(decisionSupportItemSchema), + likelyAssociations: z.array(decisionSupportItemSchema), + whatWorked: z.array(decisionSupportItemSchema), + whatToTryNext: z.array(decisionSupportItemSchema), + confidenceAndMissingData: z.array(decisionSupportItemSchema), }); const weeklyReportSchema = z.object({ From f979ed1636713ec7aaf58ac7b3a716a85d0c4d6a Mon Sep 17 00:00:00 2001 From: Asher Cohen Date: Wed, 29 Jul 2026 13:37:27 -0700 Subject: [PATCH 7/7] chore(mobile): sync Expo SDK dependencies --- packages/mobile/package.json | 4 +- pnpm-lock.yaml | 871 ++++++++++++++++------------------- pnpm-workspace.yaml | 7 + 3 files changed, 404 insertions(+), 478 deletions(-) diff --git a/packages/mobile/package.json b/packages/mobile/package.json index fd9b4a9a57..8fc3297773 100644 --- a/packages/mobile/package.json +++ b/packages/mobile/package.json @@ -59,7 +59,7 @@ "@trpc/client": "11.18.0", "@trpc/react-query": "11.18.0", "dofek-server": "workspace:*", - "expo": "57.0.8", + "expo": "57.0.9", "expo-apple-authentication": "57.0.1", "expo-build-properties": "57.0.8", "expo-camera": "57.0.3", @@ -79,7 +79,7 @@ "expo-updates": "57.0.11", "expo-web-browser": "57.0.2", "react": "19.2.3", - "react-native": "0.86.0", + "react-native": "0.86.2", "react-native-body-highlighter": "3.2.0", "react-native-gesture-handler": "2.32.0", "react-native-maps": "1.27.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8fee5813c1..2956131227 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -357,7 +357,7 @@ importers: dependencies: '@bacons/apple-targets': specifier: 4.0.7 - version: 4.0.7(expo@57.0.8)(supports-color@10.2.2)(typescript@6.0.3) + version: 4.0.7(expo@57.0.9)(supports-color@10.2.2)(typescript@6.0.3) '@dofek/auth': specifier: workspace:* version: link:../auth @@ -390,10 +390,10 @@ importers: version: link:../zones '@expo/metro-runtime': specifier: 57.0.8 - version: 57.0.8(@expo/log-box@57.0.2)(expo@57.0.8)(react-dom@19.2.3)(react-native@0.86.0)(react@19.2.3) + version: 57.0.8(@expo/log-box@57.0.2)(expo@57.0.9)(react-dom@19.2.3)(react-native@0.86.2)(react@19.2.3) '@expo/vector-icons': specifier: 15.1.1 - version: 15.1.1(expo-font@57.0.1)(react-native@0.86.0)(react@19.2.3) + version: 15.1.1(expo-font@57.0.1)(react-native@0.86.2)(react@19.2.3) '@formatjs/intl-getcanonicallocales': specifier: 3.2.11 version: 3.2.11 @@ -423,16 +423,16 @@ importers: version: 1.41.1 '@react-native-async-storage/async-storage': specifier: 2.2.0 - version: 2.2.0(react-native@0.86.0) + version: 2.2.0(react-native@0.86.2) '@react-native-community/datetimepicker': specifier: 9.1.0 - version: 9.1.0(expo@57.0.8)(react-native@0.86.0)(react@19.2.3) + version: 9.1.0(expo@57.0.9)(react-native@0.86.2)(react@19.2.3) '@sentry/cli': specifier: 3.6.0 version: 3.6.0 '@sentry/react-native': specifier: 8.11.1 - version: 8.11.1(@expo/env@2.4.2)(dotenv@16.6.1)(expo@57.0.8)(react-native@0.86.0)(react@19.2.3) + version: 8.11.1(@expo/env@2.4.2)(dotenv@16.6.1)(expo@57.0.9)(react-native@0.86.2)(react@19.2.3) '@tanstack/query-async-storage-persister': specifier: 5.101.2 version: 5.101.2 @@ -452,108 +452,108 @@ importers: specifier: workspace:* version: link:../server expo: - specifier: 57.0.8 - version: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + specifier: 57.0.9 + version: 57.0.9(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) expo-apple-authentication: specifier: 57.0.1 - version: 57.0.1(expo@57.0.8)(react-native@0.86.0)(react@19.2.3) + version: 57.0.1(expo@57.0.9)(react-native@0.86.2)(react@19.2.3) expo-build-properties: specifier: 57.0.8 - version: 57.0.8(expo@57.0.8) + version: 57.0.8(expo@57.0.9) expo-camera: specifier: 57.0.3 - version: 57.0.3(@types/emscripten@1.41.5)(expo@57.0.8)(react-native-web@0.21.2)(react-native@0.86.0)(react@19.2.3) + version: 57.0.3(@types/emscripten@1.41.5)(expo@57.0.9)(react-native-web@0.21.2)(react-native@0.86.2)(react@19.2.3) expo-dev-client: specifier: 57.0.10 - version: 57.0.10(expo@57.0.8)(react-native@0.86.0) + version: 57.0.10(expo@57.0.9)(react-native@0.86.2) expo-document-picker: specifier: 57.0.1 - version: 57.0.1(expo@57.0.8) + version: 57.0.1(expo@57.0.9) expo-file-system: specifier: 57.0.1 - version: 57.0.1(expo@57.0.8)(react-native@0.86.0) + version: 57.0.1(expo@57.0.9)(react-native@0.86.2) expo-haptics: specifier: 57.0.1 - version: 57.0.1(expo@57.0.8) + version: 57.0.1(expo@57.0.9) expo-linking: specifier: 57.0.4 - version: 57.0.4(expo@57.0.8)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2) + version: 57.0.4(expo@57.0.9)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2) expo-location: specifier: 57.0.7 - version: 57.0.7(expo@57.0.8)(supports-color@10.2.2)(typescript@6.0.3) + version: 57.0.7(expo@57.0.9)(supports-color@10.2.2)(typescript@6.0.3) expo-modules-core: specifier: 57.0.8 - version: 57.0.8(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3) + version: 57.0.8(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3) expo-notifications: specifier: 57.0.8 - version: 57.0.8(expo@57.0.8)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + version: 57.0.8(expo@57.0.9)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) expo-router: specifier: 57.0.9 - version: 57.0.9(@babel/core@7.29.7)(@expo/log-box@57.0.2)(@expo/metro-runtime@57.0.8)(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3)(@types/react@19.2.14)(expo-constants@57.0.8)(expo-font@57.0.1)(expo-linking@57.0.4)(expo@57.0.8)(react-dom@19.2.3)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.1)(react-native-safe-area-context@5.7.0)(react-native-screens@4.26.2)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2) + version: 57.0.9(@babel/core@7.29.7)(@expo/log-box@57.0.2)(@expo/metro-runtime@57.0.8)(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3)(@types/react@19.2.14)(expo-constants@57.0.8)(expo-font@57.0.1)(expo-linking@57.0.4)(expo@57.0.9)(react-dom@19.2.3)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.1)(react-native-safe-area-context@5.7.0)(react-native-screens@4.26.2)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2) expo-secure-store: specifier: 57.0.1 - version: 57.0.1(expo@57.0.8) + version: 57.0.1(expo@57.0.9) expo-sharing: specifier: 57.0.8 - version: 57.0.8(expo@57.0.8)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + version: 57.0.8(expo@57.0.9)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) expo-splash-screen: specifier: 57.0.5 - version: 57.0.5(expo@57.0.8)(supports-color@10.2.2)(typescript@6.0.3) + version: 57.0.5(expo@57.0.9)(supports-color@10.2.2)(typescript@6.0.3) expo-task-manager: specifier: 57.0.7 - version: 57.0.7(expo@57.0.8)(react-native@0.86.0) + version: 57.0.7(expo@57.0.9)(react-native@0.86.2) expo-updates: specifier: 57.0.11 - version: 57.0.11(expo-dev-client@57.0.10)(expo@57.0.8)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2) + version: 57.0.11(expo-dev-client@57.0.10)(expo@57.0.9)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2) expo-web-browser: specifier: 57.0.2 - version: 57.0.2(expo@57.0.8)(react-native@0.86.0) + version: 57.0.2(expo@57.0.9)(react-native@0.86.2) react: specifier: 19.2.3 version: 19.2.3 react-native: - specifier: 0.86.0 - version: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + specifier: 0.86.2 + version: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) react-native-body-highlighter: specifier: 3.2.0 - version: 3.2.0(react-native@0.86.0)(react@19.2.3) + version: 3.2.0(react-native@0.86.2)(react@19.2.3) react-native-gesture-handler: specifier: 2.32.0 - version: 2.32.0(react-native@0.86.0)(react@19.2.3) + version: 2.32.0(react-native@0.86.2)(react@19.2.3) react-native-maps: specifier: 1.27.2 - version: 1.27.2(react-native-web@0.21.2)(react-native@0.86.0)(react@19.2.3) + version: 1.27.2(react-native-web@0.21.2)(react-native@0.86.2)(react@19.2.3) react-native-reanimated: specifier: 4.5.1 - version: 4.5.1(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3) + version: 4.5.1(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3) react-native-safe-area-context: specifier: 5.7.0 - version: 5.7.0(react-native@0.86.0)(react@19.2.3) + version: 5.7.0(react-native@0.86.2)(react@19.2.3) react-native-screens: specifier: 4.26.2 - version: 4.26.2(react-native@0.86.0)(react@19.2.3) + version: 4.26.2(react-native@0.86.2)(react@19.2.3) react-native-svg: specifier: 15.15.4 - version: 15.15.4(react-native@0.86.0)(react@19.2.3) + version: 15.15.4(react-native@0.86.2)(react@19.2.3) react-native-worklets: specifier: 0.10.1 - version: 0.10.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2) + version: 0.10.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2) zod: specifier: 4.4.3 version: 4.4.3 devDependencies: '@storybook/addon-ondevice-actions': specifier: 10.5.3 - version: 10.5.3(react-native@0.86.0)(react@19.2.3)(storybook@10.5.4) + version: 10.5.3(react-native@0.86.2)(react@19.2.3)(storybook@10.5.4) '@storybook/addon-ondevice-controls': specifier: 10.5.3 - version: 10.5.3(@gorhom/bottom-sheet@5.2.8)(@react-native-community/datetimepicker@9.1.0)(@react-native-community/slider@5.1.2)(@types/react-dom@19.2.3)(@types/react@19.2.14)(react-dom@19.2.3)(react-native@0.86.0)(react@19.2.3)(storybook@10.5.4)(supports-color@10.2.2)(typescript@6.0.3) + version: 10.5.3(@gorhom/bottom-sheet@5.2.8)(@react-native-community/datetimepicker@9.1.0)(@react-native-community/slider@5.1.2)(@types/react-dom@19.2.3)(@types/react@19.2.14)(react-dom@19.2.3)(react-native@0.86.2)(react@19.2.3)(storybook@10.5.4)(supports-color@10.2.2)(typescript@6.0.3) '@storybook/react-native': specifier: 10.5.3 - version: 10.5.3(@gorhom/bottom-sheet@5.2.8)(@types/react-dom@19.2.3)(@types/react@19.2.14)(esbuild@0.28.1)(react-dom@19.2.3)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.1)(react-native-safe-area-context@5.7.0)(react-native-svg@15.15.4)(react-native@0.86.0)(react@19.2.3)(storybook@10.5.4)(supports-color@10.2.2)(typescript@6.0.3) + version: 10.5.3(@gorhom/bottom-sheet@5.2.8)(@types/react-dom@19.2.3)(@types/react@19.2.14)(esbuild@0.28.1)(react-dom@19.2.3)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.1)(react-native-safe-area-context@5.7.0)(react-native-svg@15.15.4)(react-native@0.86.2)(react@19.2.3)(storybook@10.5.4)(supports-color@10.2.2)(typescript@6.0.3) '@storybook/react-native-web-vite': specifier: 10.5.4 - version: 10.5.4(@types/react-dom@19.2.3)(@types/react@19.2.14)(esbuild@0.28.1)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native@0.86.0)(react@19.2.3)(rollup@4.62.2)(storybook@10.5.4)(supports-color@10.2.2)(typescript@6.0.3)(vite@8.0.16) + version: 10.5.4(@types/react-dom@19.2.3)(@types/react@19.2.14)(esbuild@0.28.1)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native@0.86.2)(react@19.2.3)(rollup@4.62.2)(storybook@10.5.4)(supports-color@10.2.2)(typescript@6.0.3)(vite@8.0.16) '@testing-library/react': specifier: 16.3.2 version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3)(@types/react@19.2.14)(react-dom@19.2.3)(react@19.2.3) @@ -583,7 +583,7 @@ importers: dependencies: expo-modules-core: specifier: '>=2.0.0' - version: 57.0.7(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3) + version: 57.0.7(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3) packages/nutrition: dependencies: @@ -1604,12 +1604,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-static-block@7.28.6': - resolution: {integrity: sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 - '@babel/plugin-transform-class-static-block@7.29.7': resolution: {integrity: sha512-kibJgmEdX2iMwsHY2tSZNDgj8PwIlCQz7FK9KuGKO8zsuoUwSEhoNnNVp/emKWrbY4HeO6kkXfdMqRKKKXBm2A==} engines: {node: '>=6.9.0'} @@ -1676,12 +1670,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-export-namespace-from@7.27.1': - resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-export-namespace-from@7.29.7': resolution: {integrity: sha512-24B2nOy2TeJSMheqwPD4DDQOV/elLSIlKxjZt4i05H5AgdPdWR3n18HnNrcJ+j76WJd9gbwb9jPjNYUy6RautA==} engines: {node: '>=6.9.0'} @@ -1718,12 +1706,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-logical-assignment-operators@7.28.6': - resolution: {integrity: sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-logical-assignment-operators@7.29.7': resolution: {integrity: sha512-A0H91hh6W8MFRkp5TqJmMr39jzGD1A1E1Ysiv2O06Sfbhkapm+XyIzxWCEh5kqwOZ1/8QZ0dY3SeQ7XBqfJd5Q==} engines: {node: '>=6.9.0'} @@ -1784,12 +1766,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-rest-spread@7.28.6': - resolution: {integrity: sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-rest-spread@7.29.7': resolution: {integrity: sha512-Ld98jn4c0smUywL57m7SgsHq3OpThOa6LqZJif3G6jYOovPleoFhVrBJ1WegRApSFB2wu4+RelAj9AC9G08Z4A==} engines: {node: '>=6.9.0'} @@ -1814,12 +1790,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-parameters@7.27.7': - resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-parameters@7.29.7': resolution: {integrity: sha512-ZDOBqV/qLYJI0YElr8DcENEyARsFQeESqWXH6gZlghYXuPPjvweuDhP4VyEi4BlUBlLRFZVjxoZDMjxhLW766g==} engines: {node: '>=6.9.0'} @@ -2638,8 +2608,8 @@ packages: '@expo-google-fonts/material-symbols@0.4.38': resolution: {integrity: sha512-IJkBtN1o8u9BW5fvSii1MyHPQ7Q0HxbWcVBvOrOzgMLpVtZw7R2w94wBTVR7kZwv3w1JNTESMmLA5Sqn1+Z36A==} - '@expo/cli@57.0.10': - resolution: {integrity: sha512-mP+B9ZrTnRE94bxPM/kCVKPyuVuOTRvvsqbXVxdXtrAfOfF94YIZLGUtw/151cGFtdUPbsBsJ9gW02LhU+QMZA==} + '@expo/cli@57.0.11': + resolution: {integrity: sha512-ENXCwRyL8Q9qbabUmm0L6w9kXTmdGotW7eDEEWmUDXLPux+nEzNDqw0MzWQ5K3ZsXS51QmUJZg5yETB+6SnNRg==} hasBin: true peerDependencies: expo: '*' @@ -2701,22 +2671,14 @@ packages: '@expo/image-utils@0.11.4': resolution: {integrity: sha512-pn/4770DIEOcYZr484uazuwg20FX/qaDkeMRF6J+oxejynDmEmO8wLsCudaNShFE0BhyKGQTYrs2rsRhqrqESw==} - '@expo/inline-modules@0.1.3': - resolution: {integrity: sha512-eHSxWYfgq65mP3Qz8PclVjUkSrDIlGl3va9U7PMcTpGItOvee/i0ZzGinH5A25oARR5ouD64eESBKwtT/CwdHg==} + '@expo/inline-modules@0.1.4': + resolution: {integrity: sha512-8bPSCm//dv8raYfrQ4x79rCX52vMw0QzmnYYl4eSOAvEbGvDPPRGGdbrhZZ7oihU+hI1sZNS5kYEgqODgFwfsw==} '@expo/json-file@11.0.1': resolution: {integrity: sha512-zxHWj4MKKMAL29ZQSY/Fssx4Thluk40JmuGNaeS078wy/NhlFhnVi+rHHunulE3xJAJ0CM73m8VK2+GkF9eRwQ==} - '@expo/local-build-cache-provider@57.0.4': - resolution: {integrity: sha512-B/cI73shkLSYBYuFyh+zCbS+WhqJgawWPW4MPdMiNLJKv9RmV4dv1FGjsidiIiG2k4kYKerBDLK4bLbC7qERQQ==} - - '@expo/log-box@57.0.1': - resolution: {integrity: sha512-fuVNHhOerdRWtpq27gD6JTSVYESsfRu+SMdrNCWxW+gFnusS6dGKfx3lKGBZ4ZkMNiLWn8maBHo39YKzJNXFYQ==} - peerDependencies: - '@expo/dom-webview': 55.0.5 - expo: '*' - react: 19.2.3 - react-native: '*' + '@expo/local-build-cache-provider@57.0.5': + resolution: {integrity: sha512-OwiNC0Uxu67TOH7TEQ94GLa4oNzNfbbItKGdy3QMfX+hCSZv2VvjcjRo5vttMHfXCnXa9KZIu3GBS9pvtDHWhA==} '@expo/log-box@57.0.2': resolution: {integrity: sha512-ZsFyfIR7YCbQAdVLzuTUmMHofZC7ZS9ywYCJNPlLc78x59cI8GwXFEIVbRjjC0uJERpNtXx/tsNNnkhexXlzMw==} @@ -2765,8 +2727,8 @@ packages: '@expo/plist@0.8.1': resolution: {integrity: sha512-3gTReGIUm0oRaMClsAJYxBnVPCl6fVpsl8HS+DTVxDhW4GyVyxg9E/Znm3BvcHtUJ51RJJI14pC1wvrNilCRHw==} - '@expo/prebuild-config@57.0.9': - resolution: {integrity: sha512-8g7RoXFvO/dxvLzRE/bvphzDL4bfV0w3/4Aj6DfwvgymZ1ULz5gW2x0js94opZRoZvWw4SolH6/74hLlZT3rAA==} + '@expo/prebuild-config@57.0.10': + resolution: {integrity: sha512-myrS5NolFAQWD8g7QuqkettnkyJx3GRl603N6rlmqAMxmO5EU7sZu4EX2EsIKkva8QtpX84B0E17PsM9xXMsTQ==} '@expo/require-utils@57.0.4': resolution: {integrity: sha512-e7xbg/9BTQcsZE/oErafZXtI7kh5IgfasLJ97J5sFSzX2cA74pDvdlhW1KHVSaDkQyQv6h1LSLhsY7dEeOk7hw==} @@ -5454,66 +5416,66 @@ packages: react: 19.2.3 react-native: '>=0.57' - '@react-native/assets-registry@0.86.0': - resolution: {integrity: sha512-nIaXbm2jX1OTYp0qbviJ3O6KZivoE8z3BnhUQ2LsqfZSWRoOK/n1qsiAr6oALiNKWnXY3j2KPwtYORnZzp8xew==} + '@react-native/assets-registry@0.86.2': + resolution: {integrity: sha512-vcX/mBjWAVnWofu7KecotquI2unZ/tITwA7OGdq/mdY/zmGXIEvYhfEYyOQij/LRqi9WAL+iizInTBWnxDhK/Q==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - '@react-native/babel-plugin-codegen@0.86.0': - resolution: {integrity: sha512-qdsABWNW7uTll90l4Vh03gjeyu3WVDi2CyiiyvYGMRDcoYbjbQi6df3BMAm9lQI2yslZ1T14LlDDAsgTwNxplA==} + '@react-native/babel-plugin-codegen@0.86.2': + resolution: {integrity: sha512-NNDZqOlNbH5SzgPks1jFDYH3234Rpa5e/nhZymxhIiBH3NcE3uD+rGj/HWXhH7nHF2ToGK6XbUpqy7nmJPeh+g==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - '@react-native/babel-preset@0.86.0': - resolution: {integrity: sha512-bYQcWiPySNvF4dns9Ls9gMmwgq66ohvM9Fwc/Kn8r85t66UNHxch3p1QwPiSorDelFauZwJbgo9+ReibTgvpbA==} + '@react-native/babel-preset@0.86.2': + resolution: {integrity: sha512-4XKEJ6jKW9lXMB1O5o47gBoGgolde1fbX13gLW/erlcn+1ky+MHHo5UjuM3RWGdPJHIvIzekDDumSUHhB9x5iQ==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} peerDependencies: '@babel/core': '*' - '@react-native/codegen@0.86.0': - resolution: {integrity: sha512-uTs9DBo3+/lUqinsGZK0FKJRBVClrwMXoZToaDxE1Q2SL2e55vs2GwyZfIKzPl5uJnbu4PfFMIp0/mLXLWUMuA==} + '@react-native/codegen@0.86.2': + resolution: {integrity: sha512-xKkudsahUJ1n//55g4fXk5BStVqqmZlz8HQveL45ZxcfDnwvhuYe2GymksQANFsSN+slvrarjrfq8kIxJzbceA==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} peerDependencies: '@babel/core': '*' - '@react-native/community-cli-plugin@0.86.0': - resolution: {integrity: sha512-Jv8p1ebEPfTzs8gmrjsdT2XMXFfeAg45Pman+XPLFGaSeGAZkutRFRyX9Cs9aGTSOyIA9YPJ6vDNb1ayTf1FKQ==} + '@react-native/community-cli-plugin@0.86.2': + resolution: {integrity: sha512-YHXNKoM6Y/HjREySZ5arET2xgiHgg67r1MdwJB//MPJAJ0Xc5g0u6UHxY9VzsHO3Y07dre6s0BinYwjt1SEWvQ==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} peerDependencies: '@react-native-community/cli': '*' - '@react-native/metro-config': 0.86.0 + '@react-native/metro-config': 0.86.2 peerDependenciesMeta: '@react-native-community/cli': optional: true '@react-native/metro-config': optional: true - '@react-native/debugger-frontend@0.86.0': - resolution: {integrity: sha512-7Mb3nDfyJeys+ELF75Ageu7VKERlnIMoO+aNPoXqTXvz+b41L6l2CqMyLpDHxkBSlenij6gEepPNgaIyWHbJZw==} + '@react-native/debugger-frontend@0.86.2': + resolution: {integrity: sha512-KGS1aV5F6cIqpnoIUhLBXyVzy1oAj8jBFGau6vX4Vy0HXRJN7p+68RU7x6NuyraHvQcR14ccMGT5TkFuNjQ4gA==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - '@react-native/debugger-shell@0.86.0': - resolution: {integrity: sha512-Y0zEkZzLz8ou6o/VLml1A31X/rMgc6DRjwxwzPMa94qRTMY070WeBCNTITQo4kKTBAUgbxh07oXPQqp0Tpja8w==} + '@react-native/debugger-shell@0.86.2': + resolution: {integrity: sha512-/TaVJ2+gGajZPJGrFaObUQmHmlaxAlfmOPZicl6pNKDUjzSgFMpcLkdTOExvb+USYTVdGX1XwxXyvjQdUO2bvg==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - '@react-native/dev-middleware@0.86.0': - resolution: {integrity: sha512-20pTO6yTybmvXvro520H6C7jydIQnLKOl5qFtVEcHSdFrY63r3OGei+Rx9bILgSRmH6jgnfEcijcMx7pwWuQtw==} + '@react-native/dev-middleware@0.86.2': + resolution: {integrity: sha512-B7L0vKvg+IcEElT7Vpqh1xj5yJAqWUegjbP+bQRaorJMAYnv11GkliTnZV2AdTDfZQJWgOEx8i8LGkHkUg7bnA==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - '@react-native/gradle-plugin@0.86.0': - resolution: {integrity: sha512-a1RcfaEDqWExCGfCwadIxt4l8FvKYgFqeMf2uzeKyAOnb+vTGNIeCvifFL2MqvgaeYxlER437HbMIajGcuJ1pQ==} + '@react-native/gradle-plugin@0.86.2': + resolution: {integrity: sha512-2F6x14NcHMpVmfTTFKfMkpV5dZedZrLiv6PE+c3vgnesV2bjleUBydr4U+NI8VkI7OwW71L0A5qQ76I9LCrfoQ==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - '@react-native/js-polyfills@0.86.0': - resolution: {integrity: sha512-zYy/Cjd1VTnZ2iCNaG9bDF9C3l2ntESiPRscjIlI5FKugu6aeTwsDSv1aI8Bc4Kp3vEdoVg+UQhLAhE4svREaQ==} + '@react-native/js-polyfills@0.86.2': + resolution: {integrity: sha512-bIwNcGBaQ74shB5z1mRkxOpjikimuwsnOCEkZSzL67Z1FTyK1ObpENfyd2QvcvVW9Cjl+tHuw9ynpBnb2jPoJQ==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} - '@react-native/metro-babel-transformer@0.86.0': - resolution: {integrity: sha512-SjKej3E5qIahqo/G+rSOrmJUQM44RyKtWtO+VfmKAAMoJWkBFomM22hTLKCIS5cdbIAJ9COAmU+KAi2wVSO0wQ==} + '@react-native/metro-babel-transformer@0.86.2': + resolution: {integrity: sha512-mX1wgLErdb2hDgXJr9zM9SWLe+ZteZTFTwRWGOQ53yEJwc9DVSnxdTlAtVdMeOj2ntycKh0R8jYdat2Am43cwQ==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} peerDependencies: '@babel/core': '*' - '@react-native/metro-config@0.86.0': - resolution: {integrity: sha512-7v+xbTeEci9ZcQ/Z1OqI4RXcqN69wSMDYL5BAMvOReZ7U04+aDQ0/SQhClYPn6x2/RxM4WzMKSAuNyLKqvYVtw==} + '@react-native/metro-config@0.86.2': + resolution: {integrity: sha512-hJno256j+MS0b3JD1aD3ouTGZVacKNVBuXL2atMQQ8BZ060vl1ptnZ83y569aDW+/rgFSOcqn6ydKeSz4uUKQQ==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} '@react-native/normalize-colors@0.74.89': @@ -5522,16 +5484,16 @@ packages: '@react-native/normalize-colors@0.79.7': resolution: {integrity: sha512-RrvewhdanEWhlyrHNWGXGZCc6MY0JGpNgRzA8y6OomDz0JmlnlIsbBHbNpPnIrt9Jh2KaV10KTscD1Ry8xU9gQ==} - '@react-native/normalize-colors@0.86.0': - resolution: {integrity: sha512-kG0wfCGghUKlfxkJyyHCDVutWVYWK7/DG58ojA/4v9EfulgF+osuSQmlbNb3rcKX58qutm7JcldSeVLgGFha9g==} + '@react-native/normalize-colors@0.86.2': + resolution: {integrity: sha512-EzPFc9Y6lzYOWeso2almwXI7f8+qReHxWvT+algsOczb2UhWXIWXDoSvkdwoSfiwwmGt/ijJgKJoeHlzPkLwRg==} - '@react-native/virtualized-lists@0.86.0': - resolution: {integrity: sha512-4/ZLXdf/OSpPDVO0AsQ1SJdRIzt5t9BNQ46QwGgxvX7/cirYR5k8KXctNGGgW8lQo2gZChEfY2zFCZg9nM/jiw==} + '@react-native/virtualized-lists@0.86.2': + resolution: {integrity: sha512-uO0J72gh3EvE+1/GHRk18QRyBDTRHRB0AraAfojsRjbT7VMuJwKrZYaKGshavoaEud6aw00ZB9/8mTMIKjjcAw==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} peerDependencies: '@types/react': ^19.2.0 react: 19.2.3 - react-native: 0.86.0 + react-native: 0.86.2 peerDependenciesMeta: '@types/react': optional: true @@ -9015,12 +8977,12 @@ packages: babel-polyfill@6.26.0: resolution: {integrity: sha512-F2rZGQnAdaHWQ8YAoeRbukc7HS9QgdgeyJ0rQDd485v9opwuPvjpPFcOOT/WmkKTdgy9ESgSPXDcTNpzrGr6iQ==} - babel-preset-expo@57.0.4: - resolution: {integrity: sha512-EkFcNoE23HVzQT6ZNXs/adN8+G7rqEAF6tQn6LpRPYa1YY7wmX5GxhJF0kaYMNtBndNrMTN4+0rYE17VG13KFg==} + babel-preset-expo@57.0.5: + resolution: {integrity: sha512-sz9ZBTiUAlu5P9VORVNKoeAaY2qKFQRC6eQV5Y8aMkqcorvXKEv97UeCkFMLmMBEPKA+QeWImREKkX9/H21WQA==} peerDependencies: '@babel/runtime': ^7.20.0 expo: '*' - expo-widgets: ^57.0.6 + expo-widgets: ^57.0.7 react-refresh: '>=0.14.0 <1.0.0' peerDependenciesMeta: '@babel/runtime': @@ -10650,8 +10612,8 @@ packages: peerDependencies: expo: '*' - expo-asset@57.0.7: - resolution: {integrity: sha512-TA6MRQq1HL0N6KGvNMzL6djdH5tGJ/eHPIhML+6bVu52mnXldmup2swdvP37zDnvoMUUXRVGsvwVHFmvhCbW6Q==} + expo-asset@57.0.8: + resolution: {integrity: sha512-sGocG+Wd2WcZ1KjKyB2LfUZXzrBM0VHEATGcpJKF9T3HM56M/sMbH73vv+n85u5Zr0FkJjEbV1DWhGPimCR1QQ==} peerDependencies: expo: '*' react: 19.2.3 @@ -10894,8 +10856,8 @@ packages: expo: '*' react-native: '*' - expo@57.0.8: - resolution: {integrity: sha512-0IxxoPZbT54IH4fHL5NihkvED9HBVQx3uNdPvyv8pFUHWJ81RdFjL0aJys1IB7hbo09KTz4xW4I2aWVOXKAcJQ==} + expo@57.0.9: + resolution: {integrity: sha512-NDEvnU+vjRdMbtOyDC25OSok9/E97al97pyx+bMphQgNRGAED0D7oF8ha7oGYsLE+7jFzpPADVM9S60dGbpHIA==} hasBin: true peerDependencies: '@expo/dom-webview': 55.0.5 @@ -11538,8 +11500,8 @@ packages: headers-polyfill@4.0.3: resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==} - hermes-compiler@250829098.0.14: - resolution: {integrity: sha512-5meXwsZxgiqFaJjNzwjzI9IyUkuGGBisu+z9BvQWmGVpjH6nz11hgqkyxe4dl8UAdyIV4lTbz91+Dlnjz0VxqA==} + hermes-compiler@250829098.0.16: + resolution: {integrity: sha512-xsgzk+mUyvt9t1nUbF8USBlYxajTUtPJhVZ86q85s/SEoMKCF+52YZcudb0ENSnV3T3lV9mgB3s6R7+pH90zgw==} hermes-estree@0.35.0: resolution: {integrity: sha512-xVx5Opwy8Oo1I5yGpVRhCvWL/iV3M+ylksSKVNlxxD90cpDpR/AR1jLYqK8HWihm065a6UI3HeyAmYzwS8NOOg==} @@ -14184,12 +14146,12 @@ packages: react: 19.2.3 react-native: 0.83 - 0.86 - react-native@0.86.0: - resolution: {integrity: sha512-17ALh/dd6AO4pgOVmOO5Axll5PbErEo3XFyLokyzW6usyi+OShIEPwUW26wLPlhVifgSOIfECCH0WN+0IqtJ1w==} + react-native@0.86.2: + resolution: {integrity: sha512-zbJXGZpwfZGA79Z9ob6Atvfx4nAQL8yJBa35s58E4Oo+khPykfQP2sTeumkKbjwajFYfVayg8pj7Il9nIfTk7A==} engines: {node: ^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0} hasBin: true peerDependencies: - '@react-native/jest-preset': 0.86.0 + '@react-native/jest-preset': 0.86.2 '@types/react': ^19.1.1 react: 19.2.3 peerDependenciesMeta: @@ -17353,14 +17315,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-static-block@7.28.6(@babel/core@7.29.7)(supports-color@10.2.2)': - dependencies: - '@babel/core': 7.29.7(supports-color@10.2.2) - '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7)(supports-color@10.2.2) - '@babel/helper-plugin-utils': 7.29.7 - transitivePeerDependencies: - - supports-color - '@babel/plugin-transform-class-static-block@7.29.7(@babel/core@7.29.7)(supports-color@10.2.2)': dependencies: '@babel/core': 7.29.7(supports-color@10.2.2) @@ -17438,11 +17392,6 @@ snapshots: '@babel/core': 7.29.7(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7(supports-color@10.2.2) - '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-export-namespace-from@7.29.7(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7(supports-color@10.2.2) @@ -17481,11 +17430,6 @@ snapshots: '@babel/core': 7.29.7(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-logical-assignment-operators@7.28.6(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7(supports-color@10.2.2) - '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-logical-assignment-operators@7.29.7(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7(supports-color@10.2.2) @@ -17551,17 +17495,6 @@ snapshots: '@babel/core': 7.29.7(supports-color@10.2.2) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-object-rest-spread@7.28.6(@babel/core@7.29.7)(supports-color@10.2.2)': - dependencies: - '@babel/core': 7.29.7(supports-color@10.2.2) - '@babel/helper-compilation-targets': 7.29.7 - '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.7)(supports-color@10.2.2) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.29.7) - '@babel/traverse': 7.29.7(supports-color@10.2.2) - transitivePeerDependencies: - - supports-color - '@babel/plugin-transform-object-rest-spread@7.29.7(@babel/core@7.29.7)(supports-color@10.2.2)': dependencies: '@babel/core': 7.29.7(supports-color@10.2.2) @@ -17594,11 +17527,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7(supports-color@10.2.2) - '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-parameters@7.29.7(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7(supports-color@10.2.2) @@ -17879,13 +17807,13 @@ snapshots: '@babel/helper-string-parser': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 - '@bacons/apple-targets@4.0.7(expo@57.0.8)(supports-color@10.2.2)(typescript@6.0.3)': + '@bacons/apple-targets@4.0.7(expo@57.0.9)(supports-color@10.2.2)(typescript@6.0.3)': dependencies: '@bacons/xcode': 1.0.0-alpha.32(supports-color@10.2.2) '@expo/image-utils': 0.11.1(supports-color@10.2.2)(typescript@6.0.3) '@react-native/normalize-colors': 0.79.7 debug: 4.4.3(supports-color@10.2.2) - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.9(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) glob: 10.5.0 transitivePeerDependencies: - supports-color @@ -18439,7 +18367,7 @@ snapshots: '@expo-google-fonts/material-symbols@0.4.38': {} - '@expo/cli@57.0.10(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-constants@57.0.7)(expo-font@57.0.1)(expo-router@57.0.9)(expo@57.0.8)(react-dom@19.2.3)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3)': + '@expo/cli@57.0.11(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-constants@57.0.8)(expo-font@57.0.1)(expo-router@57.0.9)(expo@57.0.9)(react-dom@19.2.3)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3)': dependencies: '@expo/code-signing-certificates': 0.0.6 '@expo/config': 57.0.6(supports-color@10.2.2)(typescript@6.0.3) @@ -18447,23 +18375,23 @@ snapshots: '@expo/devcert': 1.2.1(supports-color@10.2.2) '@expo/env': 2.4.2(supports-color@10.2.2) '@expo/image-utils': 0.11.4(supports-color@10.2.2)(typescript@6.0.3) - '@expo/inline-modules': 0.1.3(supports-color@10.2.2)(typescript@6.0.3) + '@expo/inline-modules': 0.1.4(supports-color@10.2.2)(typescript@6.0.3) '@expo/json-file': 11.0.1 - '@expo/log-box': 57.0.1(@expo/dom-webview@55.0.5)(expo@57.0.8)(react-native@0.86.0)(react@19.2.3) + '@expo/log-box': 57.0.2(@expo/dom-webview@55.0.5)(expo@57.0.9)(react-native@0.86.2)(react@19.2.3) '@expo/metro': 56.0.0(supports-color@10.2.2) - '@expo/metro-config': 57.0.7(expo@57.0.8)(supports-color@10.2.2)(typescript@6.0.3) + '@expo/metro-config': 57.0.7(expo@57.0.9)(supports-color@10.2.2)(typescript@6.0.3) '@expo/metro-file-map': 57.0.1(supports-color@10.2.2) '@expo/osascript': 2.7.1 '@expo/package-manager': 1.13.1 '@expo/plist': 0.8.1(patch_hash=2e81ea41c32856973b677ca39a3f7f4a53b550dc5093fddfaa1abd120b800e2e) - '@expo/prebuild-config': 57.0.9(supports-color@10.2.2)(typescript@6.0.3) + '@expo/prebuild-config': 57.0.10(supports-color@10.2.2)(typescript@6.0.3) '@expo/require-utils': 57.0.4(supports-color@10.2.2)(typescript@6.0.3) - '@expo/router-server': 57.0.4(@expo/metro-runtime@57.0.8)(expo-constants@57.0.7)(expo-font@57.0.1)(expo-router@57.0.9)(expo-server@57.0.1)(expo@57.0.8)(react-dom@19.2.3)(react@19.2.3)(supports-color@10.2.2) + '@expo/router-server': 57.0.4(@expo/metro-runtime@57.0.8)(expo-constants@57.0.8)(expo-font@57.0.1)(expo-router@57.0.9)(expo-server@57.0.1)(expo@57.0.9)(react-dom@19.2.3)(react@19.2.3)(supports-color@10.2.2) '@expo/schema-utils': 57.0.2 '@expo/spawn-async': 1.8.0 '@expo/ws-tunnel': 2.0.0(ws@8.21.0) '@expo/xcpretty': 4.4.4 - '@react-native/dev-middleware': 0.86.0(supports-color@10.2.2) + '@react-native/dev-middleware': 0.86.2(supports-color@10.2.2) accepts: 1.3.8 agent-cli-detector: 0.1.2 arg: 5.0.2 @@ -18475,7 +18403,7 @@ snapshots: connect: 3.7.0(supports-color@10.2.2) debug: 4.4.3(supports-color@10.2.2) dnssd-advertise: 1.1.6 - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.9(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) expo-server: 57.0.1 fetch-nodeshim: 0.4.10 getenv: 2.0.0 @@ -18501,8 +18429,8 @@ snapshots: ws: 8.21.0 zod: 3.25.76 optionalDependencies: - expo-router: 57.0.9(@babel/core@7.29.7)(@expo/log-box@57.0.2)(@expo/metro-runtime@57.0.8)(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3)(@types/react@19.2.14)(expo-constants@57.0.8)(expo-font@57.0.1)(expo-linking@57.0.4)(expo@57.0.8)(react-dom@19.2.3)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.1)(react-native-safe-area-context@5.7.0)(react-native-screens@4.26.2)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2) - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + expo-router: 57.0.9(@babel/core@7.29.7)(@expo/log-box@57.0.2)(@expo/metro-runtime@57.0.8)(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3)(@types/react@19.2.14)(expo-constants@57.0.8)(expo-font@57.0.1)(expo-linking@57.0.4)(expo@57.0.9)(react-dom@19.2.3)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.1)(react-native-safe-area-context@5.7.0)(react-native-screens@4.26.2)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) transitivePeerDependencies: - '@expo/dom-webview' - '@expo/metro-runtime' @@ -18564,18 +18492,18 @@ snapshots: transitivePeerDependencies: - supports-color - '@expo/devtools@57.0.1(react-native@0.86.0)(react@19.2.3)': + '@expo/devtools@57.0.1(react-native@0.86.2)(react@19.2.3)': dependencies: chalk: 4.1.2 optionalDependencies: react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) - '@expo/dom-webview@55.0.5(expo@57.0.8)(react-native@0.86.0)(react@19.2.3)': + '@expo/dom-webview@55.0.5(expo@57.0.9)(react-native@0.86.2)(react@19.2.3)': dependencies: - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.9(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) '@expo/env@2.4.2(supports-color@10.2.2)': dependencies: @@ -18629,7 +18557,7 @@ snapshots: - supports-color - typescript - '@expo/inline-modules@0.1.3(supports-color@10.2.2)(typescript@6.0.3)': + '@expo/inline-modules@0.1.4(supports-color@10.2.2)(typescript@6.0.3)': dependencies: '@expo/config-plugins': 57.0.6(supports-color@10.2.2)(typescript@6.0.3) transitivePeerDependencies: @@ -18641,7 +18569,7 @@ snapshots: '@babel/code-frame': 7.29.7 json5: 2.2.3 - '@expo/local-build-cache-provider@57.0.4(supports-color@10.2.2)(typescript@6.0.3)': + '@expo/local-build-cache-provider@57.0.5(supports-color@10.2.2)(typescript@6.0.3)': dependencies: '@expo/config': 57.0.6(supports-color@10.2.2)(typescript@6.0.3) chalk: 4.1.2 @@ -18649,25 +18577,16 @@ snapshots: - supports-color - typescript - '@expo/log-box@57.0.1(@expo/dom-webview@55.0.5)(expo@57.0.8)(react-native@0.86.0)(react@19.2.3)': - dependencies: - '@expo/dom-webview': 55.0.5(expo@57.0.8)(react-native@0.86.0)(react@19.2.3) - anser: 1.4.10 - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) - react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) - stacktrace-parser: 0.1.11 - - '@expo/log-box@57.0.2(@expo/dom-webview@55.0.5)(expo@57.0.8)(react-native@0.86.0)(react@19.2.3)': + '@expo/log-box@57.0.2(@expo/dom-webview@55.0.5)(expo@57.0.9)(react-native@0.86.2)(react@19.2.3)': dependencies: - '@expo/dom-webview': 55.0.5(expo@57.0.8)(react-native@0.86.0)(react@19.2.3) + '@expo/dom-webview': 55.0.5(expo@57.0.9)(react-native@0.86.2)(react@19.2.3) anser: 1.4.10 - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.9(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) stacktrace-parser: 0.1.11 - '@expo/metro-config@57.0.7(expo@57.0.8)(supports-color@10.2.2)(typescript@6.0.3)': + '@expo/metro-config@57.0.7(expo@57.0.9)(supports-color@10.2.2)(typescript@6.0.3)': dependencies: '@babel/code-frame': 7.29.7 '@babel/core': 7.29.7(supports-color@10.2.2) @@ -18693,7 +18612,7 @@ snapshots: postcss: 8.5.23 resolve-from: 5.0.0 optionalDependencies: - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.9(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) transitivePeerDependencies: - bufferutil - supports-color @@ -18711,14 +18630,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@expo/metro-runtime@57.0.8(@expo/log-box@57.0.2)(expo@57.0.8)(react-dom@19.2.3)(react-native@0.86.0)(react@19.2.3)': + '@expo/metro-runtime@57.0.8(@expo/log-box@57.0.2)(expo@57.0.9)(react-dom@19.2.3)(react-native@0.86.2)(react@19.2.3)': dependencies: - '@expo/log-box': 57.0.2(@expo/dom-webview@55.0.5)(expo@57.0.8)(react-native@0.86.0)(react@19.2.3) + '@expo/log-box': 57.0.2(@expo/dom-webview@55.0.5)(expo@57.0.9)(react-native@0.86.2)(react@19.2.3) anser: 1.4.10 - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.9(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) pretty-format: 29.7.0 react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) stacktrace-parser: 0.1.11 whatwg-fetch: 3.6.20 optionalDependencies: @@ -18770,14 +18689,14 @@ snapshots: base64-js: 1.5.1 xmlbuilder: 15.1.1 - '@expo/prebuild-config@57.0.9(supports-color@10.2.2)(typescript@6.0.3)': + '@expo/prebuild-config@57.0.10(supports-color@10.2.2)(typescript@6.0.3)': dependencies: '@expo/config': 57.0.6(supports-color@10.2.2)(typescript@6.0.3) '@expo/config-plugins': 57.0.6(supports-color@10.2.2)(typescript@6.0.3) '@expo/config-types': 57.0.2 '@expo/image-utils': 0.11.4(supports-color@10.2.2)(typescript@6.0.3) '@expo/json-file': 11.0.1 - '@react-native/normalize-colors': 0.86.0 + '@react-native/normalize-colors': 0.86.2 debug: 4.4.3(supports-color@10.2.2) expo-modules-autolinking: 57.0.9(supports-color@10.2.2)(typescript@6.0.3) resolve-from: 5.0.0 @@ -18796,17 +18715,17 @@ snapshots: transitivePeerDependencies: - supports-color - '@expo/router-server@57.0.4(@expo/metro-runtime@57.0.8)(expo-constants@57.0.7)(expo-font@57.0.1)(expo-router@57.0.9)(expo-server@57.0.1)(expo@57.0.8)(react-dom@19.2.3)(react@19.2.3)(supports-color@10.2.2)': + '@expo/router-server@57.0.4(@expo/metro-runtime@57.0.8)(expo-constants@57.0.8)(expo-font@57.0.1)(expo-router@57.0.9)(expo-server@57.0.1)(expo@57.0.9)(react-dom@19.2.3)(react@19.2.3)(supports-color@10.2.2)': dependencies: debug: 4.4.3(supports-color@10.2.2) - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) - expo-constants: 57.0.7(expo@57.0.8)(react-native@0.86.0)(supports-color@10.2.2) - expo-font: 57.0.1(expo@57.0.8)(react-native@0.86.0)(react@19.2.3) + expo: 57.0.9(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo-constants: 57.0.8(expo@57.0.9)(react-native@0.86.2)(supports-color@10.2.2) + expo-font: 57.0.1(expo@57.0.9)(react-native@0.86.2)(react@19.2.3) expo-server: 57.0.1 react: 19.2.3 optionalDependencies: - '@expo/metro-runtime': 57.0.8(@expo/log-box@57.0.2)(expo@57.0.8)(react-dom@19.2.3)(react-native@0.86.0)(react@19.2.3) - expo-router: 57.0.9(@babel/core@7.29.7)(@expo/log-box@57.0.2)(@expo/metro-runtime@57.0.8)(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3)(@types/react@19.2.14)(expo-constants@57.0.8)(expo-font@57.0.1)(expo-linking@57.0.4)(expo@57.0.8)(react-dom@19.2.3)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.1)(react-native-safe-area-context@5.7.0)(react-native-screens@4.26.2)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2) + '@expo/metro-runtime': 57.0.8(@expo/log-box@57.0.2)(expo@57.0.9)(react-dom@19.2.3)(react-native@0.86.2)(react@19.2.3) + expo-router: 57.0.9(@babel/core@7.29.7)(@expo/log-box@57.0.2)(@expo/metro-runtime@57.0.8)(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3)(@types/react@19.2.14)(expo-constants@57.0.8)(expo-font@57.0.1)(expo-linking@57.0.4)(expo@57.0.9)(react-dom@19.2.3)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.1)(react-native-safe-area-context@5.7.0)(react-native-screens@4.26.2)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2) react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: - supports-color @@ -18821,26 +18740,26 @@ snapshots: '@expo/sudo-prompt@9.3.2': {} - '@expo/ui@57.0.8(@babel/core@7.29.7)(@types/react-dom@19.2.3)(@types/react@19.2.14)(expo@57.0.8)(react-dom@19.2.3)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)': + '@expo/ui@57.0.8(@babel/core@7.29.7)(@types/react-dom@19.2.3)(@types/react@19.2.14)(expo@57.0.9)(react-dom@19.2.3)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)': dependencies: - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.9(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) sf-symbols-typescript: 2.2.0 vaul: 1.1.2(@types/react-dom@19.2.3)(@types/react@19.2.14)(react-dom@19.2.3)(react@19.2.3) optionalDependencies: '@babel/core': 7.29.7(supports-color@10.2.2) react-dom: 19.2.3(react@19.2.3) - react-native-worklets: 0.10.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2) + react-native-worklets: 0.10.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2) transitivePeerDependencies: - '@types/react' - '@types/react-dom' - '@expo/vector-icons@15.1.1(expo-font@57.0.1)(react-native@0.86.0)(react@19.2.3)': + '@expo/vector-icons@15.1.1(expo-font@57.0.1)(react-native@0.86.2)(react@19.2.3)': dependencies: - expo-font: 57.0.1(expo@57.0.8)(react-native@0.86.0)(react@19.2.3) + expo-font: 57.0.1(expo@57.0.9)(react-native@0.86.2)(react@19.2.3) react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) '@expo/ws-tunnel@2.0.0(ws@8.21.0)': dependencies: @@ -18901,22 +18820,22 @@ snapshots: '@garmin/fitsdk@21.208.0': {} - '@gorhom/bottom-sheet@5.2.8(@types/react@19.2.14)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.1)(react-native@0.86.0)(react@19.2.3)': + '@gorhom/bottom-sheet@5.2.8(@types/react@19.2.14)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.1)(react-native@0.86.2)(react@19.2.3)': dependencies: - '@gorhom/portal': 1.0.14(react-native@0.86.0)(react@19.2.3) + '@gorhom/portal': 1.0.14(react-native@0.86.2)(react@19.2.3) invariant: 2.2.4 react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) - react-native-gesture-handler: 2.32.0(react-native@0.86.0)(react@19.2.3) - react-native-reanimated: 4.5.1(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native-gesture-handler: 2.32.0(react-native@0.86.2)(react@19.2.3) + react-native-reanimated: 4.5.1(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3) optionalDependencies: '@types/react': 19.2.14 - '@gorhom/portal@1.0.14(react-native@0.86.0)(react@19.2.3)': + '@gorhom/portal@1.0.14(react-native@0.86.2)(react@19.2.3)': dependencies: nanoid: 3.3.16 react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) '@grpc/grpc-js@1.14.4': dependencies: @@ -21597,37 +21516,37 @@ snapshots: optionalDependencies: '@types/react': 19.2.14 - '@react-native-async-storage/async-storage@2.2.0(react-native@0.86.0)': + '@react-native-async-storage/async-storage@2.2.0(react-native@0.86.2)': dependencies: merge-options: 3.0.4 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) - '@react-native-community/datetimepicker@9.1.0(expo@57.0.8)(react-native@0.86.0)(react@19.2.3)': + '@react-native-community/datetimepicker@9.1.0(expo@57.0.9)(react-native@0.86.2)(react@19.2.3)': dependencies: invariant: 2.2.4 react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) optionalDependencies: - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.9(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) '@react-native-community/slider@5.1.2': {} - '@react-native-masked-view/masked-view@0.3.2(react-native@0.86.0)(react@19.2.3)': + '@react-native-masked-view/masked-view@0.3.2(react-native@0.86.2)(react@19.2.3)': dependencies: react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) - '@react-native/assets-registry@0.86.0': {} + '@react-native/assets-registry@0.86.2': {} - '@react-native/babel-plugin-codegen@0.86.0(@babel/core@7.29.7)(supports-color@10.2.2)': + '@react-native/babel-plugin-codegen@0.86.2(@babel/core@7.29.7)(supports-color@10.2.2)': dependencies: '@babel/traverse': 7.29.7(supports-color@10.2.2) - '@react-native/codegen': 0.86.0(@babel/core@7.29.7) + '@react-native/codegen': 0.86.2(@babel/core@7.29.7) transitivePeerDependencies: - '@babel/core' - supports-color - '@react-native/babel-preset@0.86.0(@babel/core@7.29.7)(supports-color@10.2.2)': + '@react-native/babel-preset@0.86.2(@babel/core@7.29.7)(supports-color@10.2.2)': dependencies: '@babel/core': 7.29.7(supports-color@10.2.2) '@babel/plugin-proposal-export-default-from': 7.29.7(@babel/core@7.29.7) @@ -21658,14 +21577,14 @@ snapshots: '@babel/plugin-transform-runtime': 7.29.7(@babel/core@7.29.7)(supports-color@10.2.2) '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7)(supports-color@10.2.2) '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.7) - '@react-native/babel-plugin-codegen': 0.86.0(@babel/core@7.29.7)(supports-color@10.2.2) + '@react-native/babel-plugin-codegen': 0.86.2(@babel/core@7.29.7)(supports-color@10.2.2) 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.86.0(@babel/core@7.29.7)': + '@react-native/codegen@0.86.2(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7(supports-color@10.2.2) '@babel/parser': 7.29.7 @@ -21675,9 +21594,9 @@ snapshots: tinyglobby: 0.2.17 yargs: 17.7.3 - '@react-native/community-cli-plugin@0.86.0(@react-native/metro-config@0.86.0)(supports-color@10.2.2)': + '@react-native/community-cli-plugin@0.86.2(@react-native/metro-config@0.86.2)(supports-color@10.2.2)': dependencies: - '@react-native/dev-middleware': 0.86.0(supports-color@10.2.2) + '@react-native/dev-middleware': 0.86.2(supports-color@10.2.2) debug: 4.4.3(supports-color@10.2.2) invariant: 2.2.4 metro: 0.84.4(supports-color@10.2.2) @@ -21685,15 +21604,15 @@ snapshots: metro-core: 0.84.4 semver: 7.8.5 optionalDependencies: - '@react-native/metro-config': 0.86.0(@babel/core@7.29.7)(supports-color@10.2.2) + '@react-native/metro-config': 0.86.2(@babel/core@7.29.7)(supports-color@10.2.2) transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@react-native/debugger-frontend@0.86.0': {} + '@react-native/debugger-frontend@0.86.2': {} - '@react-native/debugger-shell@0.86.0(supports-color@10.2.2)': + '@react-native/debugger-shell@0.86.2(supports-color@10.2.2)': dependencies: cross-spawn: 7.0.6 debug: 4.4.3(supports-color@10.2.2) @@ -21701,11 +21620,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@react-native/dev-middleware@0.86.0(supports-color@10.2.2)': + '@react-native/dev-middleware@0.86.2(supports-color@10.2.2)': dependencies: '@isaacs/ttlcache': 1.4.1 - '@react-native/debugger-frontend': 0.86.0 - '@react-native/debugger-shell': 0.86.0(supports-color@10.2.2) + '@react-native/debugger-frontend': 0.86.2 + '@react-native/debugger-shell': 0.86.2(supports-color@10.2.2) chrome-launcher: 0.15.2(supports-color@10.2.2) chromium-edge-launcher: 0.3.0(supports-color@10.2.2) connect: 3.7.0(supports-color@10.2.2) @@ -21720,23 +21639,23 @@ snapshots: - supports-color - utf-8-validate - '@react-native/gradle-plugin@0.86.0': {} + '@react-native/gradle-plugin@0.86.2': {} - '@react-native/js-polyfills@0.86.0': {} + '@react-native/js-polyfills@0.86.2': {} - '@react-native/metro-babel-transformer@0.86.0(@babel/core@7.29.7)(supports-color@10.2.2)': + '@react-native/metro-babel-transformer@0.86.2(@babel/core@7.29.7)(supports-color@10.2.2)': dependencies: '@babel/core': 7.29.7(supports-color@10.2.2) - '@react-native/babel-preset': 0.86.0(@babel/core@7.29.7)(supports-color@10.2.2) + '@react-native/babel-preset': 0.86.2(@babel/core@7.29.7)(supports-color@10.2.2) hermes-parser: 0.36.0 nullthrows: 1.1.1 transitivePeerDependencies: - supports-color - '@react-native/metro-config@0.86.0(@babel/core@7.29.7)(supports-color@10.2.2)': + '@react-native/metro-config@0.86.2(@babel/core@7.29.7)(supports-color@10.2.2)': dependencies: - '@react-native/js-polyfills': 0.86.0 - '@react-native/metro-babel-transformer': 0.86.0(@babel/core@7.29.7)(supports-color@10.2.2) + '@react-native/js-polyfills': 0.86.2 + '@react-native/metro-babel-transformer': 0.86.2(@babel/core@7.29.7)(supports-color@10.2.2) metro-config: 0.84.4(supports-color@10.2.2) metro-runtime: 0.84.4 transitivePeerDependencies: @@ -21749,14 +21668,14 @@ snapshots: '@react-native/normalize-colors@0.79.7': {} - '@react-native/normalize-colors@0.86.0': {} + '@react-native/normalize-colors@0.86.2': {} - '@react-native/virtualized-lists@0.86.0(@types/react@19.2.14)(react-native@0.86.0)(react@19.2.3)': + '@react-native/virtualized-lists@0.86.2(@types/react@19.2.14)(react-native@0.86.2)(react@19.2.3)': dependencies: invariant: 2.2.4 nullthrows: 1.1.1 react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) optionalDependencies: '@types/react': 19.2.14 @@ -22251,7 +22170,7 @@ snapshots: '@opentelemetry/semantic-conventions': 1.41.1 '@sentry/core': 10.45.0 - '@sentry/react-native@8.11.1(@expo/env@2.4.2)(dotenv@16.6.1)(expo@57.0.8)(react-native@0.86.0)(react@19.2.3)': + '@sentry/react-native@8.11.1(@expo/env@2.4.2)(dotenv@16.6.1)(expo@57.0.9)(react-native@0.86.2)(react@19.2.3)': dependencies: '@sentry/babel-plugin-component-annotate': 5.2.1 '@sentry/browser': 10.51.0 @@ -22261,9 +22180,9 @@ snapshots: '@sentry/react': 10.51.0(react@19.2.3) '@sentry/types': 10.51.0 react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) optionalDependencies: - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.9(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) transitivePeerDependencies: - '@expo/env' - dotenv @@ -24599,29 +24518,29 @@ snapshots: axe-core: 4.11.4 storybook: 10.5.4(@types/react@19.2.14)(prettier@3.9.5)(react-dom@19.2.3)(react@19.2.3) - '@storybook/addon-ondevice-actions@10.5.3(react-native@0.86.0)(react@19.2.3)(storybook@10.5.4)': + '@storybook/addon-ondevice-actions@10.5.3(react-native@0.86.2)(react@19.2.3)(storybook@10.5.4)': dependencies: - '@storybook/react-native-theming': 10.5.3(react-native@0.86.0)(react@19.2.3) + '@storybook/react-native-theming': 10.5.3(react-native@0.86.2)(react@19.2.3) fast-deep-equal: 3.1.3 react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) storybook: 10.5.4(@types/react@19.2.14)(prettier@3.9.5)(react-dom@19.2.3)(react@19.2.3) - '@storybook/addon-ondevice-controls@10.5.3(@gorhom/bottom-sheet@5.2.8)(@react-native-community/datetimepicker@9.1.0)(@react-native-community/slider@5.1.2)(@types/react-dom@19.2.3)(@types/react@19.2.14)(react-dom@19.2.3)(react-native@0.86.0)(react@19.2.3)(storybook@10.5.4)(supports-color@10.2.2)(typescript@6.0.3)': + '@storybook/addon-ondevice-controls@10.5.3(@gorhom/bottom-sheet@5.2.8)(@react-native-community/datetimepicker@9.1.0)(@react-native-community/slider@5.1.2)(@types/react-dom@19.2.3)(@types/react@19.2.14)(react-dom@19.2.3)(react-native@0.86.2)(react@19.2.3)(storybook@10.5.4)(supports-color@10.2.2)(typescript@6.0.3)': dependencies: - '@gorhom/portal': 1.0.14(react-native@0.86.0)(react@19.2.3) - '@react-native-community/datetimepicker': 9.1.0(expo@57.0.8)(react-native@0.86.0)(react@19.2.3) + '@gorhom/portal': 1.0.14(react-native@0.86.2)(react@19.2.3) + '@react-native-community/datetimepicker': 9.1.0(expo@57.0.9)(react-native@0.86.2)(react@19.2.3) '@react-native-community/slider': 5.1.2 - '@storybook/react-native-theming': 10.5.3(react-native@0.86.0)(react@19.2.3) - '@storybook/react-native-ui-common': 10.5.3(@types/react-dom@19.2.3)(@types/react@19.2.14)(react-dom@19.2.3)(react-native@0.86.0)(react@19.2.3)(storybook@10.5.4)(supports-color@10.2.2)(typescript@6.0.3) + '@storybook/react-native-theming': 10.5.3(react-native@0.86.2)(react@19.2.3) + '@storybook/react-native-ui-common': 10.5.3(@types/react-dom@19.2.3)(@types/react@19.2.14)(react-dom@19.2.3)(react-native@0.86.2)(react@19.2.3)(storybook@10.5.4)(supports-color@10.2.2)(typescript@6.0.3) polished: 4.3.1 react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) - react-native-modal-datetime-picker: 18.0.0(@react-native-community/datetimepicker@9.1.0)(react-native@0.86.0) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native-modal-datetime-picker: 18.0.0(@react-native-community/datetimepicker@9.1.0)(react-native@0.86.2) storybook: 10.5.4(@types/react@19.2.14)(prettier@3.9.5)(react-dom@19.2.3)(react@19.2.3) tinycolor2: 1.6.0 optionalDependencies: - '@gorhom/bottom-sheet': 5.2.8(@types/react@19.2.14)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.1)(react-native@0.86.0)(react@19.2.3) + '@gorhom/bottom-sheet': 5.2.8(@types/react@19.2.14)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.1)(react-native@0.86.2)(react@19.2.3) transitivePeerDependencies: - '@types/react' - '@types/react-dom' @@ -24675,21 +24594,21 @@ snapshots: '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@storybook/react-native-theming@10.5.3(react-native@0.86.0)(react@19.2.3)': + '@storybook/react-native-theming@10.5.3(react-native@0.86.2)(react@19.2.3)': dependencies: polished: 4.3.1 react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) - '@storybook/react-native-ui-common@10.5.3(@types/react-dom@19.2.3)(@types/react@19.2.14)(react-dom@19.2.3)(react-native@0.86.0)(react@19.2.3)(storybook@10.5.4)(supports-color@10.2.2)(typescript@6.0.3)': + '@storybook/react-native-ui-common@10.5.3(@types/react-dom@19.2.3)(@types/react@19.2.14)(react-dom@19.2.3)(react-native@0.86.2)(react@19.2.3)(storybook@10.5.4)(supports-color@10.2.2)(typescript@6.0.3)': dependencies: '@nozbe/microfuzz': 1.0.0 '@storybook/react': 10.5.4(@types/react-dom@19.2.3)(@types/react@19.2.14)(react-dom@19.2.3)(react@19.2.3)(storybook@10.5.4)(supports-color@10.2.2)(typescript@6.0.3) - '@storybook/react-native-theming': 10.5.3(react-native@0.86.0)(react@19.2.3) + '@storybook/react-native-theming': 10.5.3(react-native@0.86.2)(react@19.2.3) es-toolkit: 1.50.0 memoizerific: 1.11.3 react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) storybook: 10.5.4(@types/react@19.2.14)(prettier@3.9.5)(react-dom@19.2.3)(react@19.2.3) ts-dedent: 2.3.0 transitivePeerDependencies: @@ -24699,21 +24618,21 @@ snapshots: - supports-color - typescript - '@storybook/react-native-ui@10.5.3(@gorhom/bottom-sheet@5.2.8)(@types/react-dom@19.2.3)(@types/react@19.2.14)(react-dom@19.2.3)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.1)(react-native-safe-area-context@5.7.0)(react-native-svg@15.15.4)(react-native@0.86.0)(react@19.2.3)(storybook@10.5.4)(supports-color@10.2.2)(typescript@6.0.3)': + '@storybook/react-native-ui@10.5.3(@gorhom/bottom-sheet@5.2.8)(@types/react-dom@19.2.3)(@types/react@19.2.14)(react-dom@19.2.3)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.1)(react-native-safe-area-context@5.7.0)(react-native-svg@15.15.4)(react-native@0.86.2)(react@19.2.3)(storybook@10.5.4)(supports-color@10.2.2)(typescript@6.0.3)': dependencies: - '@gorhom/bottom-sheet': 5.2.8(@types/react@19.2.14)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.1)(react-native@0.86.0)(react@19.2.3) - '@gorhom/portal': 1.0.14(react-native@0.86.0)(react@19.2.3) + '@gorhom/bottom-sheet': 5.2.8(@types/react@19.2.14)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.1)(react-native@0.86.2)(react@19.2.3) + '@gorhom/portal': 1.0.14(react-native@0.86.2)(react@19.2.3) '@nozbe/microfuzz': 1.0.0 '@storybook/react': 10.5.4(@types/react-dom@19.2.3)(@types/react@19.2.14)(react-dom@19.2.3)(react@19.2.3)(storybook@10.5.4)(supports-color@10.2.2)(typescript@6.0.3) - '@storybook/react-native-theming': 10.5.3(react-native@0.86.0)(react@19.2.3) - '@storybook/react-native-ui-common': 10.5.3(@types/react-dom@19.2.3)(@types/react@19.2.14)(react-dom@19.2.3)(react-native@0.86.0)(react@19.2.3)(storybook@10.5.4)(supports-color@10.2.2)(typescript@6.0.3) + '@storybook/react-native-theming': 10.5.3(react-native@0.86.2)(react@19.2.3) + '@storybook/react-native-ui-common': 10.5.3(@types/react-dom@19.2.3)(@types/react@19.2.14)(react-dom@19.2.3)(react-native@0.86.2)(react@19.2.3)(storybook@10.5.4)(supports-color@10.2.2)(typescript@6.0.3) polished: 4.3.1 react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) - react-native-gesture-handler: 2.32.0(react-native@0.86.0)(react@19.2.3) - react-native-reanimated: 4.5.1(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3) - react-native-safe-area-context: 5.7.0(react-native@0.86.0)(react@19.2.3) - react-native-svg: 15.15.4(react-native@0.86.0)(react@19.2.3) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native-gesture-handler: 2.32.0(react-native@0.86.2)(react@19.2.3) + react-native-reanimated: 4.5.1(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3) + react-native-safe-area-context: 5.7.0(react-native@0.86.2)(react@19.2.3) + react-native-svg: 15.15.4(react-native@0.86.2)(react@19.2.3) storybook: 10.5.4(@types/react@19.2.14)(prettier@3.9.5)(react-dom@19.2.3)(react@19.2.3) transitivePeerDependencies: - '@types/react' @@ -24722,14 +24641,14 @@ snapshots: - supports-color - typescript - '@storybook/react-native-web-vite@10.5.4(@types/react-dom@19.2.3)(@types/react@19.2.14)(esbuild@0.28.1)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native@0.86.0)(react@19.2.3)(rollup@4.62.2)(storybook@10.5.4)(supports-color@10.2.2)(typescript@6.0.3)(vite@8.0.16)': + '@storybook/react-native-web-vite@10.5.4(@types/react-dom@19.2.3)(@types/react@19.2.14)(esbuild@0.28.1)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native@0.86.2)(react@19.2.3)(rollup@4.62.2)(storybook@10.5.4)(supports-color@10.2.2)(typescript@6.0.3)(vite@8.0.16)': dependencies: '@storybook/builder-vite': 10.5.4(esbuild@0.28.1)(rollup@4.62.2)(storybook@10.5.4)(vite@8.0.16) '@storybook/react': 10.5.4(@types/react-dom@19.2.3)(@types/react@19.2.14)(react-dom@19.2.3)(react@19.2.3)(storybook@10.5.4)(supports-color@10.2.2)(typescript@6.0.3) '@storybook/react-vite': 10.5.4(@types/react-dom@19.2.3)(@types/react@19.2.14)(esbuild@0.28.1)(react-dom@19.2.3)(react@19.2.3)(rollup@4.62.2)(storybook@10.5.4)(supports-color@10.2.2)(typescript@6.0.3)(vite@8.0.16) react: 19.2.3 react-dom: 19.2.3(react@19.2.3) - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) react-native-web: 0.21.2(encoding@0.1.13)(react-dom@19.2.3)(react@19.2.3) storybook: 10.5.4(@types/react@19.2.14)(prettier@3.9.5)(react-dom@19.2.3)(react@19.2.3) vite: 8.0.16(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.47.1)(tsx@4.23.1)(yaml@2.9.0) @@ -24744,13 +24663,13 @@ snapshots: - typescript - webpack - '@storybook/react-native@10.5.3(@gorhom/bottom-sheet@5.2.8)(@types/react-dom@19.2.3)(@types/react@19.2.14)(esbuild@0.28.1)(react-dom@19.2.3)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.1)(react-native-safe-area-context@5.7.0)(react-native-svg@15.15.4)(react-native@0.86.0)(react@19.2.3)(storybook@10.5.4)(supports-color@10.2.2)(typescript@6.0.3)': + '@storybook/react-native@10.5.3(@gorhom/bottom-sheet@5.2.8)(@types/react-dom@19.2.3)(@types/react@19.2.14)(esbuild@0.28.1)(react-dom@19.2.3)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.1)(react-native-safe-area-context@5.7.0)(react-native-svg@15.15.4)(react-native@0.86.2)(react@19.2.3)(storybook@10.5.4)(supports-color@10.2.2)(typescript@6.0.3)': dependencies: '@storybook/mcp': 0.8.0(typescript@6.0.3) '@storybook/react': 10.5.4(@types/react-dom@19.2.3)(@types/react@19.2.14)(react-dom@19.2.3)(react@19.2.3)(storybook@10.5.4)(supports-color@10.2.2)(typescript@6.0.3) - '@storybook/react-native-theming': 10.5.3(react-native@0.86.0)(react@19.2.3) - '@storybook/react-native-ui': 10.5.3(@gorhom/bottom-sheet@5.2.8)(@types/react-dom@19.2.3)(@types/react@19.2.14)(react-dom@19.2.3)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.1)(react-native-safe-area-context@5.7.0)(react-native-svg@15.15.4)(react-native@0.86.0)(react@19.2.3)(storybook@10.5.4)(supports-color@10.2.2)(typescript@6.0.3) - '@storybook/react-native-ui-common': 10.5.3(@types/react-dom@19.2.3)(@types/react@19.2.14)(react-dom@19.2.3)(react-native@0.86.0)(react@19.2.3)(storybook@10.5.4)(supports-color@10.2.2)(typescript@6.0.3) + '@storybook/react-native-theming': 10.5.3(react-native@0.86.2)(react@19.2.3) + '@storybook/react-native-ui': 10.5.3(@gorhom/bottom-sheet@5.2.8)(@types/react-dom@19.2.3)(@types/react@19.2.14)(react-dom@19.2.3)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.1)(react-native-safe-area-context@5.7.0)(react-native-svg@15.15.4)(react-native@0.86.2)(react@19.2.3)(storybook@10.5.4)(supports-color@10.2.2)(typescript@6.0.3) + '@storybook/react-native-ui-common': 10.5.3(@types/react-dom@19.2.3)(@types/react@19.2.14)(react-dom@19.2.3)(react-native@0.86.2)(react@19.2.3)(storybook@10.5.4)(supports-color@10.2.2)(typescript@6.0.3) '@tmcp/adapter-valibot': 0.1.6(tmcp@1.19.4)(valibot@1.4.2) '@tmcp/transport-http': 0.8.6(tmcp@1.19.4) commander: 14.0.3 @@ -24759,18 +24678,18 @@ snapshots: esbuild-register: 3.6.0(esbuild@0.28.1)(supports-color@10.2.2) glob: 13.0.6 react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) - react-native-safe-area-context: 5.7.0(react-native@0.86.0)(react@19.2.3) - react-native-url-polyfill: 3.0.0(react-native@0.86.0) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native-safe-area-context: 5.7.0(react-native@0.86.2)(react@19.2.3) + react-native-url-polyfill: 3.0.0(react-native@0.86.2) setimmediate: 1.0.5 storybook: 10.5.4(@types/react@19.2.14)(prettier@3.9.5)(react-dom@19.2.3)(react@19.2.3) tmcp: 1.19.4(typescript@6.0.3) valibot: 1.4.2(typescript@6.0.3) ws: 8.21.0 optionalDependencies: - '@gorhom/bottom-sheet': 5.2.8(@types/react@19.2.14)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.1)(react-native@0.86.0)(react@19.2.3) - react-native-gesture-handler: 2.32.0(react-native@0.86.0)(react@19.2.3) - react-native-reanimated: 4.5.1(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3) + '@gorhom/bottom-sheet': 5.2.8(@types/react@19.2.14)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.1)(react-native@0.86.2)(react@19.2.3) + react-native-gesture-handler: 2.32.0(react-native@0.86.2)(react@19.2.3) + react-native-reanimated: 4.5.1(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3) transitivePeerDependencies: - '@tmcp/auth' - '@types/react' @@ -26082,7 +26001,7 @@ snapshots: core-js: 2.6.12 regenerator-runtime: 0.10.5 - babel-preset-expo@57.0.4(@babel/core@7.29.7)(@babel/runtime@7.29.7)(expo@57.0.8)(react-refresh@0.14.2)(supports-color@10.2.2): + babel-preset-expo@57.0.5(@babel/core@7.29.7)(@babel/runtime@7.29.7)(expo@57.0.9)(react-refresh@0.14.2)(supports-color@10.2.2): dependencies: '@babel/generator': 7.29.7 '@babel/helper-module-imports': 7.29.7(supports-color@10.2.2) @@ -26096,20 +26015,20 @@ snapshots: '@babel/plugin-transform-async-to-generator': 7.29.7(@babel/core@7.29.7)(supports-color@10.2.2) '@babel/plugin-transform-block-scoping': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-class-properties': 7.29.7(@babel/core@7.29.7)(supports-color@10.2.2) - '@babel/plugin-transform-class-static-block': 7.28.6(@babel/core@7.29.7)(supports-color@10.2.2) + '@babel/plugin-transform-class-static-block': 7.29.7(@babel/core@7.29.7)(supports-color@10.2.2) '@babel/plugin-transform-classes': 7.29.7(@babel/core@7.29.7)(supports-color@10.2.2) '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.7)(supports-color@10.2.2) - '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.29.7) + '@babel/plugin-transform-export-namespace-from': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-flow-strip-types': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-for-of': 7.29.7(@babel/core@7.29.7)(supports-color@10.2.2) - '@babel/plugin-transform-logical-assignment-operators': 7.28.6(@babel/core@7.29.7) + '@babel/plugin-transform-logical-assignment-operators': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7)(supports-color@10.2.2) '@babel/plugin-transform-named-capturing-groups-regex': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-nullish-coalescing-operator': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-object-rest-spread': 7.28.6(@babel/core@7.29.7)(supports-color@10.2.2) + '@babel/plugin-transform-object-rest-spread': 7.29.7(@babel/core@7.29.7)(supports-color@10.2.2) '@babel/plugin-transform-optional-catch-binding': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.29.7)(supports-color@10.2.2) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.29.7) + '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-private-methods': 7.29.7(@babel/core@7.29.7)(supports-color@10.2.2) '@babel/plugin-transform-private-property-in-object': 7.29.7(@babel/core@7.29.7)(supports-color@10.2.2) '@babel/plugin-transform-react-display-name': 7.29.7(@babel/core@7.29.7) @@ -26120,7 +26039,7 @@ snapshots: '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7)(supports-color@10.2.2) '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.7) '@babel/preset-typescript': 7.28.5(@babel/core@7.29.7)(supports-color@10.2.2) - '@react-native/babel-plugin-codegen': 0.86.0(@babel/core@7.29.7)(supports-color@10.2.2) + '@react-native/babel-plugin-codegen': 0.86.2(@babel/core@7.29.7)(supports-color@10.2.2) babel-plugin-react-compiler: 1.0.0 babel-plugin-react-native-web: 0.21.2 babel-plugin-syntax-hermes-parser: 0.36.1 @@ -26129,7 +26048,7 @@ snapshots: react-refresh: 0.14.2 optionalDependencies: '@babel/runtime': 7.29.7 - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.9(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) transitivePeerDependencies: - '@babel/core' - supports-color @@ -27915,146 +27834,146 @@ snapshots: expect-type@1.4.0: {} - expo-apple-authentication@57.0.1(expo@57.0.8)(react-native@0.86.0)(react@19.2.3): + expo-apple-authentication@57.0.1(expo@57.0.9)(react-native@0.86.2)(react@19.2.3): dependencies: - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.9(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) - expo-application@57.0.2(expo@57.0.8): + expo-application@57.0.2(expo@57.0.9): dependencies: - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.9(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) - expo-asset@57.0.7(expo@57.0.8)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3): + expo-asset@57.0.8(expo@57.0.9)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3): dependencies: '@expo/image-utils': 0.11.4(supports-color@10.2.2)(typescript@6.0.3) - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) - expo-constants: 57.0.7(expo@57.0.8)(react-native@0.86.0)(supports-color@10.2.2) + expo: 57.0.9(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo-constants: 57.0.8(expo@57.0.9)(react-native@0.86.2)(supports-color@10.2.2) react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) transitivePeerDependencies: - supports-color - typescript - expo-build-properties@57.0.8(expo@57.0.8): + expo-build-properties@57.0.8(expo@57.0.9): dependencies: '@expo/schema-utils': 57.0.2 - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.9(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) resolve-from: 5.0.0 semver: 7.8.5 - expo-camera@57.0.3(@types/emscripten@1.41.5)(expo@57.0.8)(react-native-web@0.21.2)(react-native@0.86.0)(react@19.2.3): + expo-camera@57.0.3(@types/emscripten@1.41.5)(expo@57.0.9)(react-native-web@0.21.2)(react-native@0.86.2)(react@19.2.3): dependencies: barcode-detector: 3.1.3(@types/emscripten@1.41.5) - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.9(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) optionalDependencies: react-native-web: 0.21.2(encoding@0.1.13)(react-dom@19.2.3)(react@19.2.3) transitivePeerDependencies: - '@types/emscripten' - expo-constants@57.0.7(expo@57.0.8)(react-native@0.86.0)(supports-color@10.2.2): + expo-constants@57.0.7(expo@57.0.9)(react-native@0.86.2)(supports-color@10.2.2): dependencies: '@expo/env': 2.4.2(supports-color@10.2.2) - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + expo: 57.0.9(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) transitivePeerDependencies: - supports-color - expo-constants@57.0.8(expo@57.0.8)(react-native@0.86.0)(supports-color@10.2.2): + expo-constants@57.0.8(expo@57.0.9)(react-native@0.86.2)(supports-color@10.2.2): dependencies: '@expo/env': 2.4.2(supports-color@10.2.2) - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + expo: 57.0.9(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) transitivePeerDependencies: - supports-color - expo-dev-client@57.0.10(expo@57.0.8)(react-native@0.86.0): + expo-dev-client@57.0.10(expo@57.0.9)(react-native@0.86.2): dependencies: - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) - expo-dev-launcher: 57.0.10(expo@57.0.8)(react-native@0.86.0) - expo-dev-menu: 57.0.10(expo@57.0.8)(react-native@0.86.0) - expo-dev-menu-interface: 57.0.0(expo@57.0.8) - expo-manifests: 57.0.1(expo@57.0.8) - expo-updates-interface: 57.0.1(expo@57.0.8) + expo: 57.0.9(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo-dev-launcher: 57.0.10(expo@57.0.9)(react-native@0.86.2) + expo-dev-menu: 57.0.10(expo@57.0.9)(react-native@0.86.2) + expo-dev-menu-interface: 57.0.0(expo@57.0.9) + expo-manifests: 57.0.1(expo@57.0.9) + expo-updates-interface: 57.0.1(expo@57.0.9) transitivePeerDependencies: - react-native - expo-dev-launcher@57.0.10(expo@57.0.8)(react-native@0.86.0): + expo-dev-launcher@57.0.10(expo@57.0.9)(react-native@0.86.2): dependencies: '@expo/schema-utils': 57.0.2 - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) - expo-dev-menu: 57.0.10(expo@57.0.8)(react-native@0.86.0) - expo-manifests: 57.0.1(expo@57.0.8) - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + expo: 57.0.9(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo-dev-menu: 57.0.10(expo@57.0.9)(react-native@0.86.2) + expo-manifests: 57.0.1(expo@57.0.9) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) - expo-dev-menu-interface@57.0.0(expo@57.0.8): + expo-dev-menu-interface@57.0.0(expo@57.0.9): dependencies: - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.9(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) - expo-dev-menu@57.0.10(expo@57.0.8)(react-native@0.86.0): + expo-dev-menu@57.0.10(expo@57.0.9)(react-native@0.86.2): dependencies: - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) - expo-dev-menu-interface: 57.0.0(expo@57.0.8) - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + expo: 57.0.9(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo-dev-menu-interface: 57.0.0(expo@57.0.9) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) - expo-document-picker@57.0.1(expo@57.0.8): + expo-document-picker@57.0.1(expo@57.0.9): dependencies: - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.9(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) expo-eas-client@57.0.1: {} - expo-file-system@57.0.1(expo@57.0.8)(react-native@0.86.0): + expo-file-system@57.0.1(expo@57.0.9)(react-native@0.86.2): dependencies: - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + expo: 57.0.9(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) - expo-font@57.0.1(expo@57.0.8)(react-native@0.86.0)(react@19.2.3): + expo-font@57.0.1(expo@57.0.9)(react-native@0.86.2)(react@19.2.3): dependencies: - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.9(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) fontfaceobserver: 2.3.0 react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) - expo-glass-effect@57.0.1(expo@57.0.8)(react-native@0.86.0)(react@19.2.3): + expo-glass-effect@57.0.1(expo@57.0.9)(react-native@0.86.2)(react@19.2.3): dependencies: - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.9(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) - expo-haptics@57.0.1(expo@57.0.8): + expo-haptics@57.0.1(expo@57.0.9): dependencies: - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.9(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) expo-json-utils@57.0.1: {} - expo-keep-awake@57.0.1(expo@57.0.8)(react@19.2.3): + expo-keep-awake@57.0.1(expo@57.0.9)(react@19.2.3): dependencies: - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.9(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) react: 19.2.3 - expo-linking@57.0.4(expo@57.0.8)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2): + expo-linking@57.0.4(expo@57.0.9)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2): dependencies: - expo-constants: 57.0.7(expo@57.0.8)(react-native@0.86.0)(supports-color@10.2.2) + expo-constants: 57.0.7(expo@57.0.9)(react-native@0.86.2)(supports-color@10.2.2) invariant: 2.2.4 react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) transitivePeerDependencies: - expo - supports-color - expo-location@57.0.7(expo@57.0.8)(supports-color@10.2.2)(typescript@6.0.3): + expo-location@57.0.7(expo@57.0.9)(supports-color@10.2.2)(typescript@6.0.3): dependencies: '@expo/image-utils': 0.11.4(supports-color@10.2.2)(typescript@6.0.3) - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.9(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) transitivePeerDependencies: - supports-color - typescript - expo-manifests@57.0.1(expo@57.0.8): + expo-manifests@57.0.1(expo@57.0.9): dependencies: - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.9(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) expo-json-utils: 57.0.1 expo-modules-autolinking@57.0.9(supports-color@10.2.2)(typescript@6.0.3): @@ -28067,65 +27986,65 @@ snapshots: - supports-color - typescript - expo-modules-core@57.0.7(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3): + expo-modules-core@57.0.7(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3): dependencies: '@expo/expo-modules-macros-plugin': 0.6.1 - expo-modules-jsi: 57.0.4(react-native@0.86.0) + expo-modules-jsi: 57.0.4(react-native@0.86.2) invariant: 2.2.4 react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) optionalDependencies: - react-native-worklets: 0.10.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2) + react-native-worklets: 0.10.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2) - expo-modules-core@57.0.8(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3): + expo-modules-core@57.0.8(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3): dependencies: '@expo/expo-modules-macros-plugin': 0.6.1 - expo-modules-jsi: 57.0.4(react-native@0.86.0) + expo-modules-jsi: 57.0.4(react-native@0.86.2) invariant: 2.2.4 react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) optionalDependencies: - react-native-worklets: 0.10.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2) + react-native-worklets: 0.10.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2) - expo-modules-jsi@57.0.4(react-native@0.86.0): + expo-modules-jsi@57.0.4(react-native@0.86.2): dependencies: - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) - expo-notifications@57.0.8(expo@57.0.8)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3): + expo-notifications@57.0.8(expo@57.0.9)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3): dependencies: '@expo/image-utils': 0.11.4(supports-color@10.2.2)(typescript@6.0.3) abort-controller: 3.0.0 badgin: 1.2.3 - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) - expo-application: 57.0.2(expo@57.0.8) - expo-constants: 57.0.8(expo@57.0.8)(react-native@0.86.0)(supports-color@10.2.2) + expo: 57.0.9(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo-application: 57.0.2(expo@57.0.9) + expo-constants: 57.0.8(expo@57.0.9)(react-native@0.86.2)(supports-color@10.2.2) react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) transitivePeerDependencies: - supports-color - typescript - expo-router@57.0.9(@babel/core@7.29.7)(@expo/log-box@57.0.2)(@expo/metro-runtime@57.0.8)(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3)(@types/react@19.2.14)(expo-constants@57.0.8)(expo-font@57.0.1)(expo-linking@57.0.4)(expo@57.0.8)(react-dom@19.2.3)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.1)(react-native-safe-area-context@5.7.0)(react-native-screens@4.26.2)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2): + expo-router@57.0.9(@babel/core@7.29.7)(@expo/log-box@57.0.2)(@expo/metro-runtime@57.0.8)(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3)(@types/react@19.2.14)(expo-constants@57.0.8)(expo-font@57.0.1)(expo-linking@57.0.4)(expo@57.0.9)(react-dom@19.2.3)(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.1)(react-native-safe-area-context@5.7.0)(react-native-screens@4.26.2)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2): dependencies: - '@expo/log-box': 57.0.2(@expo/dom-webview@55.0.5)(expo@57.0.8)(react-native@0.86.0)(react@19.2.3) - '@expo/metro-runtime': 57.0.8(@expo/log-box@57.0.2)(expo@57.0.8)(react-dom@19.2.3)(react-native@0.86.0)(react@19.2.3) + '@expo/log-box': 57.0.2(@expo/dom-webview@55.0.5)(expo@57.0.9)(react-native@0.86.2)(react@19.2.3) + '@expo/metro-runtime': 57.0.8(@expo/log-box@57.0.2)(expo@57.0.9)(react-dom@19.2.3)(react-native@0.86.2)(react@19.2.3) '@expo/schema-utils': 57.0.2 - '@expo/ui': 57.0.8(@babel/core@7.29.7)(@types/react-dom@19.2.3)(@types/react@19.2.14)(expo@57.0.8)(react-dom@19.2.3)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3) + '@expo/ui': 57.0.8(@babel/core@7.29.7)(@types/react-dom@19.2.3)(@types/react@19.2.14)(expo@57.0.9)(react-dom@19.2.3)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3) '@radix-ui/react-slot': 1.3.3(@types/react@19.2.14)(react@19.2.3) '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.3)(@types/react@19.2.14)(react-dom@19.2.3)(react@19.2.3) - '@react-native-masked-view/masked-view': 0.3.2(react-native@0.86.0)(react@19.2.3) + '@react-native-masked-view/masked-view': 0.3.2(react-native@0.86.2)(react@19.2.3) '@testing-library/jest-dom': 6.9.1 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) client-only: 0.0.1 color: 4.2.3 debug: 4.4.3(supports-color@10.2.2) escape-string-regexp: 4.0.0 - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) - expo-constants: 57.0.8(expo@57.0.8)(react-native@0.86.0)(supports-color@10.2.2) - expo-glass-effect: 57.0.1(expo@57.0.8)(react-native@0.86.0)(react@19.2.3) - expo-linking: 57.0.4(expo@57.0.8)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2) + expo: 57.0.9(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo-constants: 57.0.8(expo@57.0.9)(react-native@0.86.2)(supports-color@10.2.2) + expo-glass-effect: 57.0.1(expo@57.0.9)(react-native@0.86.2)(react@19.2.3) + expo-linking: 57.0.4(expo@57.0.9)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2) expo-server: 57.0.1 - expo-symbols: 57.0.1(expo-font@57.0.1)(expo@57.0.8)(react-native@0.86.0)(react@19.2.3) + expo-symbols: 57.0.1(expo-font@57.0.1)(expo@57.0.9)(react-native@0.86.2)(react@19.2.3) fast-deep-equal: 3.1.3 invariant: 2.2.4 nanoid: 3.3.16 @@ -28133,10 +28052,10 @@ snapshots: react: 19.2.3 react-fast-compare: 3.2.2 react-is: 19.2.6 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) - react-native-drawer-layout: 4.2.5(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.1)(react-native@0.86.0)(react@19.2.3) - react-native-safe-area-context: 5.7.0(react-native@0.86.0)(react@19.2.3) - react-native-screens: 4.26.2(react-native@0.86.0)(react@19.2.3) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native-drawer-layout: 4.2.5(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.1)(react-native@0.86.2)(react@19.2.3) + react-native-safe-area-context: 5.7.0(react-native@0.86.2)(react@19.2.3) + react-native-screens: 4.26.2(react-native@0.86.2)(react@19.2.3) server-only: 0.0.1 sf-symbols-typescript: 2.2.0 shallowequal: 1.1.0 @@ -28144,8 +28063,8 @@ snapshots: vaul: 1.1.2(@types/react-dom@19.2.3)(@types/react@19.2.14)(react-dom@19.2.3)(react@19.2.3) optionalDependencies: react-dom: 19.2.3(react@19.2.3) - react-native-gesture-handler: 2.32.0(react-native@0.86.0)(react@19.2.3) - react-native-reanimated: 4.5.1(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3) + react-native-gesture-handler: 2.32.0(react-native@0.86.2)(react@19.2.3) + react-native-reanimated: 4.5.1(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3) react-native-web: 0.21.2(encoding@0.1.13)(react-dom@19.2.3)(react@19.2.3) transitivePeerDependencies: - '@babel/core' @@ -28156,29 +28075,29 @@ snapshots: - react-native-worklets - supports-color - expo-secure-store@57.0.1(expo@57.0.8): + expo-secure-store@57.0.1(expo@57.0.9): dependencies: - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.9(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) expo-server@57.0.1: {} - expo-sharing@57.0.8(expo@57.0.8)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3): + expo-sharing@57.0.8(expo@57.0.9)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3): dependencies: '@expo/config-plugins': 57.0.6(supports-color@10.2.2)(typescript@6.0.3) '@expo/config-types': 57.0.2 '@expo/plist': 0.8.1(patch_hash=2e81ea41c32856973b677ca39a3f7f4a53b550dc5093fddfaa1abd120b800e2e) - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.9(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) transitivePeerDependencies: - supports-color - typescript - expo-splash-screen@57.0.5(expo@57.0.8)(supports-color@10.2.2)(typescript@6.0.3): + expo-splash-screen@57.0.5(expo@57.0.9)(supports-color@10.2.2)(typescript@6.0.3): dependencies: '@expo/config-plugins': 57.0.6(supports-color@10.2.2)(typescript@6.0.3) '@expo/image-utils': 0.11.4(supports-color@10.2.2)(typescript@6.0.3) - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.9(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) xml2js: 0.6.0 transitivePeerDependencies: - supports-color @@ -28186,26 +28105,26 @@ snapshots: expo-structured-headers@57.0.0: {} - expo-symbols@57.0.1(expo-font@57.0.1)(expo@57.0.8)(react-native@0.86.0)(react@19.2.3): + expo-symbols@57.0.1(expo-font@57.0.1)(expo@57.0.9)(react-native@0.86.2)(react@19.2.3): dependencies: '@expo-google-fonts/material-symbols': 0.4.38 - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) - expo-font: 57.0.1(expo@57.0.8)(react-native@0.86.0)(react@19.2.3) + expo: 57.0.9(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo-font: 57.0.1(expo@57.0.9)(react-native@0.86.2)(react@19.2.3) react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) sf-symbols-typescript: 2.2.0 - expo-task-manager@57.0.7(expo@57.0.8)(react-native@0.86.0): + expo-task-manager@57.0.7(expo@57.0.9)(react-native@0.86.2): dependencies: - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + expo: 57.0.9(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) unimodules-app-loader: 57.0.1 - expo-updates-interface@57.0.1(expo@57.0.8): + expo-updates-interface@57.0.1(expo@57.0.9): dependencies: - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.9(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) - expo-updates@57.0.11(expo-dev-client@57.0.10)(expo@57.0.8)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2): + expo-updates@57.0.11(expo-dev-client@57.0.10)(expo@57.0.9)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2): dependencies: '@expo/code-signing-certificates': 0.0.6 '@expo/plist': 0.8.1(patch_hash=2e81ea41c32856973b677ca39a3f7f4a53b550dc5093fddfaa1abd120b800e2e) @@ -28213,57 +28132,57 @@ snapshots: arg: 4.1.3 chalk: 4.1.2 debug: 4.4.3(supports-color@10.2.2) - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo: 57.0.9(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) expo-eas-client: 57.0.1 - expo-manifests: 57.0.1(expo@57.0.8) + expo-manifests: 57.0.1(expo@57.0.9) expo-structured-headers: 57.0.0 - expo-updates-interface: 57.0.1(expo@57.0.8) + expo-updates-interface: 57.0.1(expo@57.0.9) getenv: 2.0.0 glob: 13.0.6 ignore: 5.3.2 nullthrows: 1.1.1 react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) resolve-from: 5.0.0 optionalDependencies: - expo-dev-client: 57.0.10(expo@57.0.8)(react-native@0.86.0) + expo-dev-client: 57.0.10(expo@57.0.9)(react-native@0.86.2) transitivePeerDependencies: - supports-color - expo-web-browser@57.0.2(expo@57.0.8)(react-native@0.86.0): + expo-web-browser@57.0.2(expo@57.0.9)(react-native@0.86.2): dependencies: - expo: 57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + expo: 57.0.9(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) - expo@57.0.8(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3): + expo@57.0.9(@babel/core@7.29.7)(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-router@57.0.9)(react-dom@19.2.3)(react-native-web@0.21.2)(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3): dependencies: '@babel/runtime': 7.29.7 - '@expo/cli': 57.0.10(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-constants@57.0.7)(expo-font@57.0.1)(expo-router@57.0.9)(expo@57.0.8)(react-dom@19.2.3)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + '@expo/cli': 57.0.11(@expo/dom-webview@55.0.5)(@expo/metro-runtime@57.0.8)(expo-constants@57.0.8)(expo-font@57.0.1)(expo-router@57.0.9)(expo@57.0.9)(react-dom@19.2.3)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) '@expo/config': 57.0.6(supports-color@10.2.2)(typescript@6.0.3) '@expo/config-plugins': 57.0.6(supports-color@10.2.2)(typescript@6.0.3) - '@expo/devtools': 57.0.1(react-native@0.86.0)(react@19.2.3) + '@expo/devtools': 57.0.1(react-native@0.86.2)(react@19.2.3) '@expo/fingerprint': 0.20.6(supports-color@10.2.2) - '@expo/local-build-cache-provider': 57.0.4(supports-color@10.2.2)(typescript@6.0.3) - '@expo/log-box': 57.0.1(@expo/dom-webview@55.0.5)(expo@57.0.8)(react-native@0.86.0)(react@19.2.3) + '@expo/local-build-cache-provider': 57.0.5(supports-color@10.2.2)(typescript@6.0.3) + '@expo/log-box': 57.0.2(@expo/dom-webview@55.0.5)(expo@57.0.9)(react-native@0.86.2)(react@19.2.3) '@expo/metro': 56.0.0(supports-color@10.2.2) - '@expo/metro-config': 57.0.7(expo@57.0.8)(supports-color@10.2.2)(typescript@6.0.3) + '@expo/metro-config': 57.0.7(expo@57.0.9)(supports-color@10.2.2)(typescript@6.0.3) '@ungap/structured-clone': 1.3.1 - babel-preset-expo: 57.0.4(@babel/core@7.29.7)(@babel/runtime@7.29.7)(expo@57.0.8)(react-refresh@0.14.2)(supports-color@10.2.2) - expo-asset: 57.0.7(expo@57.0.8)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) - expo-constants: 57.0.7(expo@57.0.8)(react-native@0.86.0)(supports-color@10.2.2) - expo-file-system: 57.0.1(expo@57.0.8)(react-native@0.86.0) - expo-font: 57.0.1(expo@57.0.8)(react-native@0.86.0)(react@19.2.3) - expo-keep-awake: 57.0.1(expo@57.0.8)(react@19.2.3) + babel-preset-expo: 57.0.5(@babel/core@7.29.7)(@babel/runtime@7.29.7)(expo@57.0.9)(react-refresh@0.14.2)(supports-color@10.2.2) + expo-asset: 57.0.8(expo@57.0.9)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2)(typescript@6.0.3) + expo-constants: 57.0.8(expo@57.0.9)(react-native@0.86.2)(supports-color@10.2.2) + expo-file-system: 57.0.1(expo@57.0.9)(react-native@0.86.2) + expo-font: 57.0.1(expo@57.0.9)(react-native@0.86.2)(react@19.2.3) + expo-keep-awake: 57.0.1(expo@57.0.9)(react@19.2.3) expo-modules-autolinking: 57.0.9(supports-color@10.2.2)(typescript@6.0.3) - expo-modules-core: 57.0.7(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3) + expo-modules-core: 57.0.8(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3) pretty-format: 29.7.0 react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) react-refresh: 0.14.2 whatwg-url-minimum: 0.1.2 optionalDependencies: - '@expo/dom-webview': 55.0.5(expo@57.0.8)(react-native@0.86.0)(react@19.2.3) - '@expo/metro-runtime': 57.0.8(@expo/log-box@57.0.2)(expo@57.0.8)(react-dom@19.2.3)(react-native@0.86.0)(react@19.2.3) + '@expo/dom-webview': 55.0.5(expo@57.0.9)(react-native@0.86.2)(react@19.2.3) + '@expo/metro-runtime': 57.0.8(@expo/log-box@57.0.2)(expo@57.0.9)(react-dom@19.2.3)(react-native@0.86.2)(react@19.2.3) react-dom: 19.2.3(react@19.2.3) react-native-web: 0.21.2(encoding@0.1.13)(react-dom@19.2.3)(react@19.2.3) transitivePeerDependencies: @@ -29011,7 +28930,7 @@ snapshots: headers-polyfill@4.0.3: {} - hermes-compiler@250829098.0.14: {} + hermes-compiler@250829098.0.16: {} hermes-estree@0.35.0: {} @@ -32134,80 +32053,80 @@ snapshots: react-is@19.2.6: {} - react-native-body-highlighter@3.2.0(react-native@0.86.0)(react@19.2.3): + react-native-body-highlighter@3.2.0(react-native@0.86.2)(react@19.2.3): dependencies: react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) - react-native-svg: 15.15.4(react-native@0.86.0)(react@19.2.3) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native-svg: 15.15.4(react-native@0.86.2)(react@19.2.3) - react-native-drawer-layout@4.2.5(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.1)(react-native@0.86.0)(react@19.2.3): + react-native-drawer-layout@4.2.5(react-native-gesture-handler@2.32.0)(react-native-reanimated@4.5.1)(react-native@0.86.2)(react@19.2.3): dependencies: color: 4.2.3 react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) - react-native-gesture-handler: 2.32.0(react-native@0.86.0)(react@19.2.3) - react-native-reanimated: 4.5.1(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native-gesture-handler: 2.32.0(react-native@0.86.2)(react@19.2.3) + react-native-reanimated: 4.5.1(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3) use-latest-callback: 0.2.6(react@19.2.3) - react-native-gesture-handler@2.32.0(react-native@0.86.0)(react@19.2.3): + react-native-gesture-handler@2.32.0(react-native@0.86.2)(react@19.2.3): dependencies: '@egjs/hammerjs': 2.0.17 '@types/react-test-renderer': 19.1.0 hoist-non-react-statics: 3.3.2 invariant: 2.2.4 react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) - react-native-is-edge-to-edge@1.3.1(react-native@0.86.0)(react@19.2.3): + react-native-is-edge-to-edge@1.3.1(react-native@0.86.2)(react@19.2.3): dependencies: react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) - react-native-maps@1.27.2(react-native-web@0.21.2)(react-native@0.86.0)(react@19.2.3): + react-native-maps@1.27.2(react-native-web@0.21.2)(react-native@0.86.2)(react@19.2.3): dependencies: '@types/geojson': 7946.0.16 react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) optionalDependencies: react-native-web: 0.21.2(encoding@0.1.13)(react-dom@19.2.3)(react@19.2.3) - react-native-modal-datetime-picker@18.0.0(@react-native-community/datetimepicker@9.1.0)(react-native@0.86.0): + react-native-modal-datetime-picker@18.0.0(@react-native-community/datetimepicker@9.1.0)(react-native@0.86.2): dependencies: - '@react-native-community/datetimepicker': 9.1.0(expo@57.0.8)(react-native@0.86.0)(react@19.2.3) + '@react-native-community/datetimepicker': 9.1.0(expo@57.0.9)(react-native@0.86.2)(react@19.2.3) prop-types: 15.8.1 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) - react-native-reanimated@4.5.1(react-native-worklets@0.10.1)(react-native@0.86.0)(react@19.2.3): + react-native-reanimated@4.5.1(react-native-worklets@0.10.1)(react-native@0.86.2)(react@19.2.3): dependencies: react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) - react-native-is-edge-to-edge: 1.3.1(react-native@0.86.0)(react@19.2.3) - react-native-worklets: 0.10.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native-is-edge-to-edge: 1.3.1(react-native@0.86.2)(react@19.2.3) + react-native-worklets: 0.10.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2) semver: 7.8.5 - react-native-safe-area-context@5.7.0(react-native@0.86.0)(react@19.2.3): + react-native-safe-area-context@5.7.0(react-native@0.86.2)(react@19.2.3): dependencies: react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) - react-native-screens@4.26.2(react-native@0.86.0)(react@19.2.3): + react-native-screens@4.26.2(react-native@0.86.2)(react@19.2.3): dependencies: react: 19.2.3 react-freeze: 1.0.4(react@19.2.3) - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) warn-once: 0.1.1 - react-native-svg@15.15.4(react-native@0.86.0)(react@19.2.3): + react-native-svg@15.15.4(react-native@0.86.2)(react@19.2.3): dependencies: css-select: 5.2.2 css-tree: 1.1.3 react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) warn-once: 0.1.1 - react-native-url-polyfill@3.0.0(react-native@0.86.0): + react-native-url-polyfill@3.0.0(react-native@0.86.2): dependencies: - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) whatwg-url-without-unicode: 8.0.0-3 react-native-web@0.21.2(encoding@0.1.13)(react-dom@19.2.3)(react@19.2.3): @@ -32225,7 +32144,7 @@ snapshots: transitivePeerDependencies: - encoding - react-native-worklets@0.10.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(react-native@0.86.0)(react@19.2.3)(supports-color@10.2.2): + react-native-worklets@0.10.1(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(react-native@0.86.2)(react@19.2.3)(supports-color@10.2.2): dependencies: '@babel/core': 7.29.7(supports-color@10.2.2) '@babel/plugin-transform-arrow-functions': 7.29.7(@babel/core@7.29.7) @@ -32238,23 +32157,23 @@ snapshots: '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.7) '@babel/preset-typescript': 7.28.5(@babel/core@7.29.7)(supports-color@10.2.2) '@babel/types': 7.29.7 - '@react-native/metro-config': 0.86.0(@babel/core@7.29.7)(supports-color@10.2.2) + '@react-native/metro-config': 0.86.2(@babel/core@7.29.7)(supports-color@10.2.2) convert-source-map: 2.0.0 react: 19.2.3 - react-native: 0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) + react-native: 0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2) semver: 7.8.5 transitivePeerDependencies: - supports-color - react-native@0.86.0(@babel/core@7.29.7)(@react-native/metro-config@0.86.0)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2): + react-native@0.86.2(@babel/core@7.29.7)(@react-native/metro-config@0.86.2)(@types/react@19.2.14)(react@19.2.3)(supports-color@10.2.2): dependencies: - '@react-native/assets-registry': 0.86.0 - '@react-native/codegen': 0.86.0(@babel/core@7.29.7) - '@react-native/community-cli-plugin': 0.86.0(@react-native/metro-config@0.86.0)(supports-color@10.2.2) - '@react-native/gradle-plugin': 0.86.0 - '@react-native/js-polyfills': 0.86.0 - '@react-native/normalize-colors': 0.86.0 - '@react-native/virtualized-lists': 0.86.0(@types/react@19.2.14)(react-native@0.86.0)(react@19.2.3) + '@react-native/assets-registry': 0.86.2 + '@react-native/codegen': 0.86.2(@babel/core@7.29.7) + '@react-native/community-cli-plugin': 0.86.2(@react-native/metro-config@0.86.2)(supports-color@10.2.2) + '@react-native/gradle-plugin': 0.86.2 + '@react-native/js-polyfills': 0.86.2 + '@react-native/normalize-colors': 0.86.2 + '@react-native/virtualized-lists': 0.86.2(@types/react@19.2.14)(react-native@0.86.2)(react@19.2.3) abort-controller: 3.0.0 anser: 1.4.10 ansi-regex: 5.0.1 @@ -32262,7 +32181,7 @@ snapshots: base64-js: 1.5.1 commander: 12.1.0 flow-enums-runtime: 0.0.6 - hermes-compiler: 250829098.0.14 + hermes-compiler: 250829098.0.16 invariant: 2.2.4 memoize-one: 5.2.1 metro-runtime: 0.84.4 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 6cc34d2fdd..1a8bd287f7 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -89,9 +89,16 @@ allowBuilds: ssh2: false minimumReleaseAgeExclude: + - '@expo/cli@57.0.11' + - '@expo/inline-modules@0.1.4' + - '@expo/local-build-cache-provider@57.0.5' - '@expo/log-box@57.0.2' - '@expo/metro-runtime@57.0.8' + - '@expo/prebuild-config@57.0.10' - '@expo/ui@57.0.8' + - babel-preset-expo@57.0.5 + - expo@57.0.9 + - expo-asset@57.0.8 - expo-build-properties@57.0.8 - expo-constants@57.0.8 - expo-dev-client@57.0.10