authorgravatar for julius0216@outlook.comJulius Marminge <julius0216@outlook.com> 2026-06-16 16:22:18-07:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-06-16 16:22:18-07:00
logc2ca9de33ab88d3a5f15530d41b9fe866e5c812f
tree9787b17457239598588680362e868474b5442740
parent60b546cf0111f0a041e9fbac025f4c904961ad75
signature Signed by PGP key B5690EEEBB952194

Add file preview comments and task toggles (#3115)


30 files changed, 2585 insertions(+), 333 deletions(-)

apps/mobile/src/features/review/reviewCommentSelection.test.ts+64
...@@ -78,4 +78,68 @@ describe("review comment serialization", () => {...@@ -78,4 +78,68 @@ describe("review comment serialization", () => {
78 );78 );
79 expect(segments[2]).toEqual(expect.objectContaining({ kind: "text", text: "\nAfter" }));79 expect(segments[2]).toEqual(expect.objectContaining({ kind: "text", text: "\nAfter" }));
80 });80 });
81
82 it("parses source-language review comments created by the web file viewer", () => {
83 const [segment] = parseReviewCommentMessageSegments(
84 [
85 '<review_comment sectionId="file:docs/plan.md" sectionTitle="File comment" filePath="docs/plan.md" startIndex="0" endIndex="1" rangeLabel="L1 to L2">',
86 "Clarify this.",
87 "```md",
88 "# Plan",
89 "- Step one",
90 "```",
91 "</review_comment>",
92 ].join("\n"),
93 );
94
95 expect(segment).toEqual(
96 expect.objectContaining({
97 kind: "review-comment",
98 comment: expect.objectContaining({
99 filePath: "docs/plan.md",
100 fenceLanguage: "md",
101 diff: "# Plan\n- Step one",
102 }),
103 }),
104 );
105 });
106
107 it("keeps fenced examples in comment prose separate from the context fence", () => {
108 const [segment] = parseReviewCommentMessageSegments(
109 [
110 '<review_comment sectionId="section-1" sectionTitle="Working tree" filePath="src/app.ts" startIndex="0" endIndex="0" rangeLabel="+1">',
111 "Try this:",
112 "```ts",
113 "const value = 1;",
114 "```",
115 "Then retry.",
116 "```diff",
117 "@@ -0,0 +1,1 @@",
118 "+one",
119 "```",
120 "</review_comment>",
121 ].join("\n"),
122 );
123
124 expect(segment).toEqual(
125 expect.objectContaining({
126 kind: "review-comment",
127 comment: expect.objectContaining({
128 text: ["Try this:", "```ts", "const value = 1;", "```", "Then retry."].join("\n"),
129 diff: "@@ -0,0 +1,1 @@\n+one",
130 }),
131 }),
132 );
133 });
134
135 it("round-trips greater-than signs in review attributes", () => {
136 const serialized = formatReviewCommentContext(
137 { ...makeTarget(), sectionTitle: "Changes > 5" },
138 "Check this.",
139 );
140 const [comment] = parseReviewInlineComments(serialized);
141
142 expect(serialized).toContain('sectionTitle="Changes &gt; 5"');
143 expect(comment?.sectionTitle).toBe("Changes > 5");
144 });
81});145});
apps/mobile/src/features/review/reviewCommentSelection.ts+34-15
...@@ -21,6 +21,7 @@ export interface ReviewInlineComment {...@@ -21,6 +21,7 @@ export interface ReviewInlineComment {
21 readonly rangeLabel: string;21 readonly rangeLabel: string;
22 readonly text: string;22 readonly text: string;
23 readonly diff: string;23 readonly diff: string;
24 readonly fenceLanguage?: string;
24}25}
2526
26export type ReviewCommentMessageSegment =27export type ReviewCommentMessageSegment =
...@@ -38,6 +39,7 @@ let currentTarget: ReviewCommentTarget | null = null;...@@ -38,6 +39,7 @@ let currentTarget: ReviewCommentTarget | null = null;
38const listeners = new Set<() => void>();39const listeners = new Set<() => void>();
39const REVIEW_COMMENT_BLOCK_PATTERN = /<review_comment\b([^>]*)>\s*([\s\S]*?)<\/review_comment>/g;40const REVIEW_COMMENT_BLOCK_PATTERN = /<review_comment\b([^>]*)>\s*([\s\S]*?)<\/review_comment>/g;
40const REVIEW_COMMENT_ATTRIBUTE_PATTERN = /([a-zA-Z][a-zA-Z0-9_-]*)="([^"]*)"/g;41const REVIEW_COMMENT_ATTRIBUTE_PATTERN = /([a-zA-Z][a-zA-Z0-9_-]*)="([^"]*)"/g;
42const REVIEW_COMMENT_FENCE_PATTERN = /(`{3,})([^\s`]*)[^\n]*\n([\s\S]*?)\n\1/g;
4143
42function emitChange() {44function emitChange() {
43 listeners.forEach((listener) => listener());45 listeners.forEach((listener) => listener());
...@@ -170,12 +172,17 @@ function formatReviewSelectedDiff(target: ReviewCommentTarget): string {...@@ -170,12 +172,17 @@ function formatReviewSelectedDiff(target: ReviewCommentTarget): string {
170}172}
171173
172function escapeReviewCommentAttribute(value: string): string {174function escapeReviewCommentAttribute(value: string): string {
173 return value.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;");175 return value
176 .replace(/&/g, "&amp;")
177 .replace(/"/g, "&quot;")
178 .replace(/</g, "&lt;")
179 .replace(/>/g, "&gt;");
174}180}
175181
176function unescapeReviewCommentAttribute(value: string): string {182function unescapeReviewCommentAttribute(value: string): string {
177 return value183 return value
178 .replace(/&lt;/g, "<")184 .replace(/&lt;/g, "<")
185 .replace(/&gt;/g, ">")
179 .replace(/&quot;/g, '"')186 .replace(/&quot;/g, '"')
180 .replace(/&amp;/g, "&");187 .replace(/&amp;/g, "&");
181}188}
...@@ -195,15 +202,19 @@ function readNonNegativeInteger(value: string | undefined): number | null {...@@ -195,15 +202,19 @@ function readNonNegativeInteger(value: string | undefined): number | null {
195 return Number(value);202 return Number(value);
196}203}
197204
198function extractReviewCommentText(rawBody: string): string {205function extractReviewCommentBody(rawBody: string): {
199 const fenceIndex = rawBody.indexOf("```diff");206 text: string;
200 const commentBody = fenceIndex >= 0 ? rawBody.slice(0, fenceIndex) : rawBody;207 language: string;
201 return commentBody.trim();208 contents: string;
202}209} {
203210 const matches = Array.from(rawBody.matchAll(REVIEW_COMMENT_FENCE_PATTERN));
204function extractReviewCommentDiff(rawBody: string): string {211 const match = matches.at(-1);
205 const match = rawBody.match(/```diff\s*\n([\s\S]*?)\n```/);212 const fenceIndex = match?.index;
206 return match?.[1]?.trim() ?? "";213 return {
214 text: rawBody.slice(0, fenceIndex ?? rawBody.length).trim(),
215 language: match?.[2]?.trim() || "diff",
216 contents: match?.[3] ?? "",
217 };
207}218}
208219
209function parseReviewInlineComment(220function parseReviewInlineComment(
...@@ -219,6 +230,7 @@ function parseReviewInlineComment(...@@ -219,6 +230,7 @@ function parseReviewInlineComment(
219 if (!filePath || !sectionId || startIndex === null || endIndex === null) {230 if (!filePath || !sectionId || startIndex === null || endIndex === null) {
220 return null;231 return null;
221 }232 }
233 const body = extractReviewCommentBody(rawBody);
222234
223 return {235 return {
224 id: `review-comment:${index}:${sectionId}:${filePath}:${startIndex}:${endIndex}`,236 id: `review-comment:${index}:${sectionId}:${filePath}:${startIndex}:${endIndex}`,
...@@ -228,13 +240,20 @@ function parseReviewInlineComment(...@@ -228,13 +240,20 @@ function parseReviewInlineComment(
228 startIndex: Math.min(startIndex, endIndex),240 startIndex: Math.min(startIndex, endIndex),
229 endIndex: Math.max(startIndex, endIndex),241 endIndex: Math.max(startIndex, endIndex),
230 rangeLabel: attributes.rangeLabel?.trim() || "line",242 rangeLabel: attributes.rangeLabel?.trim() || "line",
231 text: extractReviewCommentText(rawBody),243 text: body.text,
232 diff: extractReviewCommentDiff(rawBody),244 diff: body.contents,
245 fenceLanguage: body.language,
233 };246 };
234}247}
235248
236export function formatReviewCommentContext(target: ReviewCommentTarget, comment: string): string {249export function formatReviewCommentContext(target: ReviewCommentTarget, comment: string): string {
237 const rangeLabel = formatReviewSelectedRangeLabel(target);250 const rangeLabel = formatReviewSelectedRangeLabel(target);
251 const diff = formatReviewSelectedDiff(target);
252 const longestBacktickRun = Math.max(
253 0,
254 ...Array.from(diff.matchAll(/`+/g), (match) => match[0].length),
255 );
256 const fence = "`".repeat(Math.max(3, longestBacktickRun + 1));
238 return [257 return [
239 [258 [
240 "<review_comment",259 "<review_comment",
...@@ -247,9 +266,9 @@ export function formatReviewCommentContext(target: ReviewCommentTarget, comment:...@@ -247,9 +266,9 @@ export function formatReviewCommentContext(target: ReviewCommentTarget, comment:
247 ">",266 ">",
248 ].join(""),267 ].join(""),
249 comment.trim(),268 comment.trim(),
250 "```diff",269 `${fence}diff`,
251 formatReviewSelectedDiff(target),270 diff,
252 "```",271 fence,
253 "</review_comment>",272 "</review_comment>",
254 ].join("\n");273 ].join("\n");
255}274}
apps/mobile/src/features/threads/ThreadFeed.tsx+3
...@@ -1193,6 +1193,9 @@ const ReviewCommentCard = memo(function ReviewCommentCard(props: {...@@ -1193,6 +1193,9 @@ const ReviewCommentCard = memo(function ReviewCommentCard(props: {
1193});1193});
11941194
1195function buildReviewCommentPatch(comment: ReviewInlineComment): string {1195function buildReviewCommentPatch(comment: ReviewInlineComment): string {
1196 if ((comment.fenceLanguage ?? "diff") !== "diff") {
1197 return "";
1198 }
1196 const diff = comment.diff.trim();1199 const diff = comment.diff.trim();
1197 if (!diff) {1200 if (!diff) {
1198 return "";1201 return "";
apps/web/src/components/ChatMarkdown.browser.tsx+20
...@@ -69,6 +69,26 @@ describe("ChatMarkdown", () => {...@@ -69,6 +69,26 @@ describe("ChatMarkdown", () => {
69 document.body.innerHTML = "";69 document.body.innerHTML = "";
70 });70 });
7171
72 it("makes task-list checkboxes interactive when a change handler is provided", async () => {
73 const onTaskListChange = vi.fn();
74 const screen = await render(
75 <ChatMarkdown
76 text={"- [ ] Ship it"}
77 cwd="/repo/project"
78 onTaskListChange={onTaskListChange}
79 />,
80 );
81
82 try {
83 const checkbox = page.getByRole("checkbox", { name: "Toggle task" });
84 await expect.element(checkbox).not.toBeDisabled();
85 await checkbox.click();
86 expect(onTaskListChange).toHaveBeenCalledWith({ markerOffset: 2, checked: true });
87 } finally {
88 await screen.unmount();
89 }
90 });
91
72 it("rewrites file uri hrefs into direct paths before rendering", async () => {92 it("rewrites file uri hrefs into direct paths before rendering", async () => {
73 const filePath =93 const filePath =
74 "/Users/yashsingh/p/sco/claude-code-extract/src/utils/permissions/PermissionRule.ts";94 "/Users/yashsingh/p/sco/claude-code-extract/src/utils/permissions/PermissionRule.ts";
apps/web/src/components/ChatMarkdown.tsx+53-2
...@@ -91,6 +91,7 @@ interface ChatMarkdownProps {...@@ -91,6 +91,7 @@ interface ChatMarkdownProps {
91 text: string;91 text: string;
92 cwd: string | undefined;92 cwd: string | undefined;
93 threadRef?: ScopedThreadRef | undefined;93 threadRef?: ScopedThreadRef | undefined;
94 onTaskListChange?: ((input: { markerOffset: number; checked: boolean }) => void) | undefined;
94 isStreaming?: boolean;95 isStreaming?: boolean;
95 skills?: ReadonlyArray<Pick<ServerProviderSkill, "name" | "displayName">>;96 skills?: ReadonlyArray<Pick<ServerProviderSkill, "name" | "displayName">>;
96 className?: string;97 className?: string;
...@@ -108,6 +109,17 @@ const highlightedCodeCache = new LRUCache<string>(...@@ -108,6 +109,17 @@ const highlightedCodeCache = new LRUCache<string>(
108 MAX_HIGHLIGHT_CACHE_MEMORY_BYTES,109 MAX_HIGHLIGHT_CACHE_MEMORY_BYTES,
109);110);
110const highlighterPromiseCache = new Map<string, Promise<DiffsHighlighter>>();111const highlighterPromiseCache = new Map<string, Promise<DiffsHighlighter>>();
112
113function findTaskListMarkerOffset(markdown: string, listItemStart: number): number | null {
114 const firstLineEnd = markdown.indexOf("\n", listItemStart);
115 const firstLine = markdown.slice(
116 listItemStart,
117 firstLineEnd === -1 ? markdown.length : firstLineEnd,
118 );
119 const match = firstLine.match(/^(?:\s*(?:[-+*]|\d+[.)])\s+)(\[[ xX]\])/);
120 if (!match?.[1]) return null;
121 return listItemStart + firstLine.indexOf(match[1]);
122}
111const CHAT_MARKDOWN_SANITIZE_SCHEMA = {123const CHAT_MARKDOWN_SANITIZE_SCHEMA = {
112 ...defaultSchema,124 ...defaultSchema,
113 attributes: {125 attributes: {
...@@ -1170,6 +1182,7 @@ function ChatMarkdown({...@@ -1170,6 +1182,7 @@ function ChatMarkdown({
1170 text,1182 text,
1171 cwd,1183 cwd,
1172 threadRef,1184 threadRef,
1185 onTaskListChange,
1173 isStreaming = false,1186 isStreaming = false,
1174 skills = EMPTY_MARKDOWN_SKILLS,1187 skills = EMPTY_MARKDOWN_SKILLS,
1175 className,1188 className,
...@@ -1215,8 +1228,44 @@ function ChatMarkdown({...@@ -1215,8 +1228,44 @@ function ChatMarkdown({
1215 p({ node: _node, children, ...props }) {1228 p({ node: _node, children, ...props }) {
1216 return <p {...props}>{renderSkillInlineMarkdownChildren(children, skills)}</p>;1229 return <p {...props}>{renderSkillInlineMarkdownChildren(children, skills)}</p>;
1217 },1230 },
1218 li({ node: _node, children, ...props }) {1231 li({ node, children, ...props }) {
1219 return <li {...props}>{renderSkillInlineMarkdownChildren(children, skills)}</li>;1232 const listItemStart = node?.position?.start.offset;
1233 const markerOffset =
1234 typeof listItemStart === "number" ? findTaskListMarkerOffset(text, listItemStart) : null;
1235 return (
1236 <li {...props} data-task-marker-offset={markerOffset ?? undefined}>
1237 {renderSkillInlineMarkdownChildren(children, skills)}
1238 </li>
1239 );
1240 },
1241 input({ node: _node, type, checked, disabled: _disabled, ...props }) {
1242 if (type !== "checkbox" || !onTaskListChange) {
1243 return (
1244 <input
1245 {...props}
1246 type={type}
1247 checked={checked}
1248 disabled={_disabled}
1249 readOnly={type === "checkbox"}
1250 />
1251 );
1252 }
1253 return (
1254 <input
1255 {...props}
1256 type="checkbox"
1257 name="markdown-task"
1258 aria-label="Toggle task"
1259 checked={checked}
1260 onChange={(event) => {
1261 const markerOffset = Number(
1262 event.currentTarget.closest("li")?.dataset.taskMarkerOffset,
1263 );
1264 if (!Number.isSafeInteger(markerOffset)) return;
1265 onTaskListChange({ markerOffset, checked: event.currentTarget.checked });
1266 }}
1267 />
1268 );
1220 },1269 },
1221 a({ node, href, children, ...props }) {1270 a({ node, href, children, ...props }) {
1222 const normalizedHref = href ? normalizeMarkdownLinkHrefKey(href) : "";1271 const normalizedHref = href ? normalizeMarkdownLinkHrefKey(href) : "";
...@@ -1330,9 +1379,11 @@ function ChatMarkdown({...@@ -1330,9 +1379,11 @@ function ChatMarkdown({
1330 fileLinkParentSuffixByPath,1379 fileLinkParentSuffixByPath,
1331 isStreaming,1380 isStreaming,
1332 markdownFileLinkMetaByHref,1381 markdownFileLinkMetaByHref,
1382 onTaskListChange,
1333 threadRef,1383 threadRef,
1334 resolvedTheme,1384 resolvedTheme,
1335 skills,1385 skills,
1386 text,
1336 ],1387 ],
1337 );1388 );
13381389
apps/web/src/components/ChatView.tsx+28-5
...@@ -164,6 +164,7 @@ import {...@@ -164,6 +164,7 @@ import {
164 formatElementContextLabel,164 formatElementContextLabel,
165} from "../lib/elementContext";165} from "../lib/elementContext";
166import { appendPreviewAnnotationPrompt } from "../lib/previewAnnotation";166import { appendPreviewAnnotationPrompt } from "../lib/previewAnnotation";
167import { appendReviewCommentsToPrompt, type ReviewCommentContext } from "../reviewCommentContext";
167import { ChatComposer, type ChatComposerHandle } from "./chat/ChatComposer";168import { ChatComposer, type ChatComposerHandle } from "./chat/ChatComposer";
168import { ExpandedImageDialog } from "./chat/ExpandedImageDialog";169import { ExpandedImageDialog } from "./chat/ExpandedImageDialog";
169import { PullRequestThreadDialog } from "./PullRequestThreadDialog";170import { PullRequestThreadDialog } from "./PullRequestThreadDialog";
...@@ -1119,6 +1120,7 @@ function ChatViewContent(props: ChatViewProps) {...@@ -1119,6 +1120,7 @@ function ChatViewContent(props: ChatViewProps) {
1119 const setComposerDraftPreviewAnnotations = useComposerDraftStore(1120 const setComposerDraftPreviewAnnotations = useComposerDraftStore(
1120 (store) => store.setPreviewAnnotations,1121 (store) => store.setPreviewAnnotations,
1121 );1122 );
1123 const setComposerDraftReviewComments = useComposerDraftStore((store) => store.setReviewComments);
1122 const setComposerDraftModelSelection = useComposerDraftStore((store) => store.setModelSelection);1124 const setComposerDraftModelSelection = useComposerDraftStore((store) => store.setModelSelection);
1123 const setComposerDraftRuntimeMode = useComposerDraftStore((store) => store.setRuntimeMode);1125 const setComposerDraftRuntimeMode = useComposerDraftStore((store) => store.setRuntimeMode);
1124 const setComposerDraftInteractionMode = useComposerDraftStore(1126 const setComposerDraftInteractionMode = useComposerDraftStore(
...@@ -3636,6 +3638,7 @@ function ChatViewContent(props: ChatViewProps) {...@@ -3636,6 +3638,7 @@ function ChatViewContent(props: ChatViewProps) {
3636 terminalContexts: composerTerminalContexts,3638 terminalContexts: composerTerminalContexts,
3637 elementContexts: composerElementContexts,3639 elementContexts: composerElementContexts,
3638 previewAnnotations: composerPreviewAnnotations,3640 previewAnnotations: composerPreviewAnnotations,
3641 reviewComments: composerReviewComments,
3639 selectedProvider: ctxSelectedProvider,3642 selectedProvider: ctxSelectedProvider,
3640 selectedModel: ctxSelectedModel,3643 selectedModel: ctxSelectedModel,
3641 selectedProviderModels: ctxSelectedProviderModels,3644 selectedProviderModels: ctxSelectedProviderModels,
...@@ -3652,7 +3655,10 @@ function ChatViewContent(props: ChatViewProps) {...@@ -3652,7 +3655,10 @@ function ChatViewContent(props: ChatViewProps) {
3652 prompt: promptForSend,3655 prompt: promptForSend,
3653 imageCount: composerImages.length,3656 imageCount: composerImages.length,
3654 terminalContexts: composerTerminalContexts,3657 terminalContexts: composerTerminalContexts,
3655 elementContextCount: composerElementContexts.length + composerPreviewAnnotations.length,3658 elementContextCount:
3659 composerElementContexts.length +
3660 composerPreviewAnnotations.length +
3661 composerReviewComments.length,
3656 });3662 });
3657 if (showPlanFollowUpPrompt && activeProposedPlan) {3663 if (showPlanFollowUpPrompt && activeProposedPlan) {
3658 const followUp = resolvePlanFollowUpSubmission({3664 const followUp = resolvePlanFollowUpSubmission({
...@@ -3672,7 +3678,8 @@ function ChatViewContent(props: ChatViewProps) {...@@ -3672,7 +3678,8 @@ function ChatViewContent(props: ChatViewProps) {
3672 composerImages.length === 0 &&3678 composerImages.length === 0 &&
3673 sendableComposerTerminalContexts.length === 0 &&3679 sendableComposerTerminalContexts.length === 0 &&
3674 composerElementContexts.length === 0 &&3680 composerElementContexts.length === 0 &&
3675 composerPreviewAnnotations.length === 03681 composerPreviewAnnotations.length === 0 &&
3682 composerReviewComments.length === 0
3676 ? parseStandaloneComposerSlashCommand(trimmed)3683 ? parseStandaloneComposerSlashCommand(trimmed)
3677 : null;3684 : null;
3678 if (standaloneSlashCommand) {3685 if (standaloneSlashCommand) {
...@@ -3722,14 +3729,19 @@ function ChatViewContent(props: ChatViewProps) {...@@ -3722,14 +3729,19 @@ function ChatViewContent(props: ChatViewProps) {
3722 const composerTerminalContextsSnapshot = [...sendableComposerTerminalContexts];3729 const composerTerminalContextsSnapshot = [...sendableComposerTerminalContexts];
3723 const composerElementContextsSnapshot = [...composerElementContexts];3730 const composerElementContextsSnapshot = [...composerElementContexts];
3724 const composerPreviewAnnotationsSnapshot = [...composerPreviewAnnotations];3731 const composerPreviewAnnotationsSnapshot = [...composerPreviewAnnotations];
3732 const composerReviewCommentsSnapshot: ReviewCommentContext[] = [...composerReviewComments];
3725 const messageTextWithContexts = appendElementContextsToPrompt(3733 const messageTextWithContexts = appendElementContextsToPrompt(
3726 appendTerminalContextsToPrompt(promptForSend, composerTerminalContextsSnapshot),3734 appendTerminalContextsToPrompt(promptForSend, composerTerminalContextsSnapshot),
3727 composerElementContextsSnapshot,3735 composerElementContextsSnapshot,
3728 );3736 );
3729 const messageTextForSend = composerPreviewAnnotationsSnapshot.reduce(3737 const messageTextWithPreviewAnnotations = composerPreviewAnnotationsSnapshot.reduce(
3730 (text, annotation) => appendPreviewAnnotationPrompt(text, annotation),3738 (text, annotation) => appendPreviewAnnotationPrompt(text, annotation),
3731 messageTextWithContexts,3739 messageTextWithContexts,
3732 );3740 );
3741 const messageTextForSend = appendReviewCommentsToPrompt(
3742 messageTextWithPreviewAnnotations,
3743 composerReviewCommentsSnapshot,
3744 );
3733 const messageIdForSend = newMessageId();3745 const messageIdForSend = newMessageId();
3734 const messageCreatedAt = new Date().toISOString();3746 const messageCreatedAt = new Date().toISOString();
3735 const outgoingMessageText = formatOutgoingPrompt({3747 const outgoingMessageText = formatOutgoingPrompt({
...@@ -3899,6 +3911,8 @@ function ChatViewContent(props: ChatViewProps) {...@@ -3899,6 +3911,8 @@ function ChatViewContent(props: ChatViewProps) {
3899 composerTerminalContextsRef.current.length === 0 &&3911 composerTerminalContextsRef.current.length === 0 &&
3900 composerElementContextsRef.current.length === 0 &&3912 composerElementContextsRef.current.length === 0 &&
3901 (useComposerDraftStore.getState().getComposerDraft(composerDraftTarget)?.previewAnnotations3913 (useComposerDraftStore.getState().getComposerDraft(composerDraftTarget)?.previewAnnotations
3914 .length ?? 0) === 0 &&
3915 (useComposerDraftStore.getState().getComposerDraft(composerDraftTarget)?.reviewComments
3902 .length ?? 0) === 03916 .length ?? 0) === 0
3903 ) {3917 ) {
3904 setOptimisticUserMessages((existing) => {3918 setOptimisticUserMessages((existing) => {
...@@ -3919,6 +3933,7 @@ function ChatViewContent(props: ChatViewProps) {...@@ -3919,6 +3933,7 @@ function ChatViewContent(props: ChatViewProps) {
3919 setComposerDraftTerminalContexts(composerDraftTarget, composerTerminalContextsSnapshot);3933 setComposerDraftTerminalContexts(composerDraftTarget, composerTerminalContextsSnapshot);
3920 setComposerDraftElementContexts(composerDraftTarget, composerElementContextsSnapshot);3934 setComposerDraftElementContexts(composerDraftTarget, composerElementContextsSnapshot);
3921 setComposerDraftPreviewAnnotations(composerDraftTarget, composerPreviewAnnotationsSnapshot);3935 setComposerDraftPreviewAnnotations(composerDraftTarget, composerPreviewAnnotationsSnapshot);
3936 setComposerDraftReviewComments(composerDraftTarget, composerReviewCommentsSnapshot);
3922 composerRef.current?.resetCursorState({3937 composerRef.current?.resetCursorState({
3923 cursor: collapseExpandedComposerCursor(promptForSend, promptForSend.length),3938 cursor: collapseExpandedComposerCursor(promptForSend, promptForSend.length),
3924 prompt: promptForSend,3939 prompt: promptForSend,
...@@ -4874,7 +4889,7 @@ function ChatViewContent(props: ChatViewProps) {...@@ -4874,7 +4889,7 @@ function ChatViewContent(props: ChatViewProps) {
4874 />4889 />
4875 ) : activeRightPanelSurface?.kind === "diff" ? (4890 ) : activeRightPanelSurface?.kind === "diff" ? (
4876 <Suspense fallback={null}>4891 <Suspense fallback={null}>
4877 <DiffPanel mode="embedded" />4892 <DiffPanel mode="embedded" composerDraftTarget={composerDraftTarget} />
4878 </Suspense>4893 </Suspense>
4879 ) : (activeRightPanelSurface?.kind === "files" ||4894 ) : (activeRightPanelSurface?.kind === "files" ||
4880 activeRightPanelSurface?.kind === "file") &&4895 activeRightPanelSurface?.kind === "file") &&
...@@ -4886,6 +4901,10 @@ function ChatViewContent(props: ChatViewProps) {...@@ -4886,6 +4901,10 @@ function ChatViewContent(props: ChatViewProps) {
4886 environmentId={activeProject.environmentId}4901 environmentId={activeProject.environmentId}
4887 cwd={activeWorkspaceRoot}4902 cwd={activeWorkspaceRoot}
4888 projectName={activeProject.name}4903 projectName={activeProject.name}
4904 threadRef={activeThreadRef}
4905 composerDraftTarget={composerDraftTarget}
4906 keybindings={keybindings}
4907 availableEditors={availableEditors}
4889 relativePath={4908 relativePath={
4890 activeRightPanelSurface.kind === "file"4909 activeRightPanelSurface.kind === "file"
4891 ? activeRightPanelSurface.relativePath4910 ? activeRightPanelSurface.relativePath
...@@ -4948,7 +4967,7 @@ function ChatViewContent(props: ChatViewProps) {...@@ -4948,7 +4967,7 @@ function ChatViewContent(props: ChatViewProps) {
4948 />4967 />
4949 ) : activeRightPanelSurface?.kind === "diff" ? (4968 ) : activeRightPanelSurface?.kind === "diff" ? (
4950 <Suspense fallback={null}>4969 <Suspense fallback={null}>
4951 <DiffPanel mode="embedded" />4970 <DiffPanel mode="embedded" composerDraftTarget={composerDraftTarget} />
4952 </Suspense>4971 </Suspense>
4953 ) : activeRightPanelSurface?.kind === "plan" ? (4972 ) : activeRightPanelSurface?.kind === "plan" ? (
4954 <PlanSidebar4973 <PlanSidebar
...@@ -4973,6 +4992,10 @@ function ChatViewContent(props: ChatViewProps) {...@@ -4973,6 +4992,10 @@ function ChatViewContent(props: ChatViewProps) {
4973 environmentId={activeProject.environmentId}4992 environmentId={activeProject.environmentId}
4974 cwd={activeWorkspaceRoot}4993 cwd={activeWorkspaceRoot}
4975 projectName={activeProject.name}4994 projectName={activeProject.name}
4995 threadRef={activeThreadRef}
4996 composerDraftTarget={composerDraftTarget}
4997 keybindings={keybindings}
4998 availableEditors={availableEditors}
4976 relativePath={4999 relativePath={
4977 activeRightPanelSurface.kind === "file"5000 activeRightPanelSurface.kind === "file"
4978 ? activeRightPanelSurface.relativePath5001 ? activeRightPanelSurface.relativePath
apps/web/src/components/DiffPanel.tsx+15-4
...@@ -1,7 +1,7 @@...@@ -1,7 +1,7 @@
1import { FileDiff, Virtualizer } from "@pierre/diffs/react";1import { Virtualizer } from "@pierre/diffs/react";
2import { useNavigate, useParams, useSearch } from "@tanstack/react-router";2import { useNavigate, useParams, useSearch } from "@tanstack/react-router";
3import { scopeThreadRef } from "@t3tools/client-runtime";3import { scopeThreadRef } from "@t3tools/client-runtime";
4import type { TurnId } from "@t3tools/contracts";4import type { ScopedThreadRef, TurnId } from "@t3tools/contracts";
5import {5import {
6 ChevronDownIcon,6 ChevronDownIcon,
7 ChevronLeftIcon,7 ChevronLeftIcon,
...@@ -20,6 +20,7 @@ import {...@@ -20,6 +20,7 @@ import {
20 useState,20 useState,
21} from "react";21} from "react";
22import { openInPreferredEditor } from "../editorPreferences";22import { openInPreferredEditor } from "../editorPreferences";
23import { type DraftId } from "../composerDraftStore";
23import { useCheckpointDiff } from "~/lib/checkpointDiffState";24import { useCheckpointDiff } from "~/lib/checkpointDiffState";
24import { useVcsStatus } from "~/lib/vcsStatusState";25import { useVcsStatus } from "~/lib/vcsStatusState";
25import { cn } from "~/lib/utils";26import { cn } from "~/lib/utils";
...@@ -41,6 +42,7 @@ import { buildThreadRouteParams, resolveThreadRouteRef } from "../threadRoutes";...@@ -41,6 +42,7 @@ import { buildThreadRouteParams, resolveThreadRouteRef } from "../threadRoutes";
41import { useSettings } from "../hooks/useSettings";42import { useSettings } from "../hooks/useSettings";
42import { formatShortTimestamp } from "../timestampFormat";43import { formatShortTimestamp } from "../timestampFormat";
43import { DiffPanelLoadingState, DiffPanelShell, type DiffPanelMode } from "./DiffPanelShell";44import { DiffPanelLoadingState, DiffPanelShell, type DiffPanelMode } from "./DiffPanelShell";
45import { AnnotatableFileDiff } from "./diffs/AnnotatableFileDiff";
44import { ToggleGroup, Toggle } from "./ui/toggle-group";46import { ToggleGroup, Toggle } from "./ui/toggle-group";
45import { Tooltip, TooltipPopup, TooltipTrigger } from "./ui/tooltip";47import { Tooltip, TooltipPopup, TooltipTrigger } from "./ui/tooltip";
4648
...@@ -147,11 +149,12 @@ const DIFF_PANEL_UNSAFE_CSS = `...@@ -147,11 +149,12 @@ const DIFF_PANEL_UNSAFE_CSS = `
147149
148interface DiffPanelProps {150interface DiffPanelProps {
149 mode?: DiffPanelMode;151 mode?: DiffPanelMode;
152 composerDraftTarget: ScopedThreadRef | DraftId;
150}153}
151154
152export { DiffWorkerPoolProvider } from "./DiffWorkerPoolProvider";155export { DiffWorkerPoolProvider } from "./DiffWorkerPoolProvider";
153156
154export default function DiffPanel({ mode = "inline" }: DiffPanelProps) {157export default function DiffPanel({ mode = "inline", composerDraftTarget }: DiffPanelProps) {
155 const navigate = useNavigate();158 const navigate = useNavigate();
156 const { resolvedTheme } = useTheme();159 const { resolvedTheme } = useTheme();
157 const settings = useSettings();160 const settings = useSettings();
...@@ -218,6 +221,10 @@ export default function DiffPanel({ mode = "inline" }: DiffPanelProps) {...@@ -218,6 +221,10 @@ export default function DiffPanel({ mode = "inline" }: DiffPanelProps) {
218 const selectedCheckpointTurnCount =221 const selectedCheckpointTurnCount =
219 selectedTurn &&222 selectedTurn &&
220 (selectedTurn.checkpointTurnCount ?? inferredCheckpointTurnCountByTurnId[selectedTurn.turnId]);223 (selectedTurn.checkpointTurnCount ?? inferredCheckpointTurnCountByTurnId[selectedTurn.turnId]);
224 const reviewSectionId = selectedTurn ? `turn:${selectedTurn.turnId}` : "conversation";
225 const reviewSectionTitle = selectedTurn
226 ? `Turn ${selectedCheckpointTurnCount ?? "?"}`
227 : "All turns";
221 const selectedCheckpointRange = useMemo(228 const selectedCheckpointRange = useMemo(
222 () =>229 () =>
223 typeof selectedCheckpointTurnCount === "number"230 typeof selectedCheckpointTurnCount === "number"
...@@ -673,8 +680,12 @@ export default function DiffPanel({ mode = "inline" }: DiffPanelProps) {...@@ -673,8 +680,12 @@ export default function DiffPanel({ mode = "inline" }: DiffPanelProps) {
673 openDiffFile(filePath);680 openDiffFile(filePath);
674 }}681 }}
675 >682 >
676 <FileDiff683 <AnnotatableFileDiff
677 fileDiff={fileDiff}684 fileDiff={fileDiff}
685 filePath={filePath}
686 sectionId={reviewSectionId}
687 sectionTitle={reviewSectionTitle}
688 composerDraftTarget={composerDraftTarget}
678 renderHeaderPrefix={() => (689 renderHeaderPrefix={() => (
679 <Tooltip>690 <Tooltip>
680 <TooltipTrigger691 <TooltipTrigger
apps/web/src/components/chat/ChatComposer.tsx+27-1
...@@ -56,6 +56,7 @@ import {...@@ -56,6 +56,7 @@ import {
56import { useComposerPathSearch } from "../../lib/composerPathSearchState";56import { useComposerPathSearch } from "../../lib/composerPathSearchState";
57import { type ElementContextDraft } from "../../lib/elementContext";57import { type ElementContextDraft } from "../../lib/elementContext";
58import { ComposerPendingElementContexts } from "./ComposerPendingElementContexts";58import { ComposerPendingElementContexts } from "./ComposerPendingElementContexts";
59import { ComposerPendingReviewComments } from "./ComposerPendingReviewComments";
59import { ComposerPreviewAnnotationCards } from "./ComposerPreviewAnnotationCards";60import { ComposerPreviewAnnotationCards } from "./ComposerPreviewAnnotationCards";
60import {61import {
61 shouldUseCompactComposerPrimaryActions,62 shouldUseCompactComposerPrimaryActions,
...@@ -117,6 +118,7 @@ import {...@@ -117,6 +118,7 @@ import {
117import { formatProviderSkillDisplayName } from "../../providerSkillPresentation";118import { formatProviderSkillDisplayName } from "../../providerSkillPresentation";
118import { searchProviderSkills } from "../../providerSkillSearch";119import { searchProviderSkills } from "../../providerSkillSearch";
119import { useMediaQuery } from "../../hooks/useMediaQuery";120import { useMediaQuery } from "../../hooks/useMediaQuery";
121import type { ReviewCommentContext } from "../../reviewCommentContext";
120122
121const IMAGE_SIZE_LIMIT_LABEL = `${Math.round(PROVIDER_SEND_TURN_MAX_IMAGE_BYTES / (1024 * 1024))}MB`;123const IMAGE_SIZE_LIMIT_LABEL = `${Math.round(PROVIDER_SEND_TURN_MAX_IMAGE_BYTES / (1024 * 1024))}MB`;
122124
...@@ -406,6 +408,7 @@ export interface ChatComposerHandle {...@@ -406,6 +408,7 @@ export interface ChatComposerHandle {
406 terminalContexts: TerminalContextDraft[];408 terminalContexts: TerminalContextDraft[];
407 elementContexts: ElementContextDraft[];409 elementContexts: ElementContextDraft[];
408 previewAnnotations: PreviewAnnotationPayload[];410 previewAnnotations: PreviewAnnotationPayload[];
411 reviewComments: ReviewCommentContext[];
409 selectedPromptEffort: string | null;412 selectedPromptEffort: string | null;
410 selectedModelOptionsForDispatch: unknown;413 selectedModelOptionsForDispatch: unknown;
411 selectedModelSelection: ModelSelection;414 selectedModelSelection: ModelSelection;
...@@ -615,6 +618,7 @@ export const ChatComposer = memo(function ChatComposer(props: ChatComposerProps)...@@ -615,6 +618,7 @@ export const ChatComposer = memo(function ChatComposer(props: ChatComposerProps)
615 const composerTerminalContexts = composerDraft.terminalContexts;618 const composerTerminalContexts = composerDraft.terminalContexts;
616 const composerElementContexts = composerDraft.elementContexts;619 const composerElementContexts = composerDraft.elementContexts;
617 const composerPreviewAnnotations = composerDraft.previewAnnotations;620 const composerPreviewAnnotations = composerDraft.previewAnnotations;
621 const composerReviewComments = composerDraft.reviewComments;
618 const nonPersistedComposerImageIds = composerDraft.nonPersistedImageIds;622 const nonPersistedComposerImageIds = composerDraft.nonPersistedImageIds;
619623
620 const setComposerDraftPrompt = useComposerDraftStore((store) => store.setPrompt);624 const setComposerDraftPrompt = useComposerDraftStore((store) => store.setPrompt);
...@@ -636,6 +640,9 @@ export const ChatComposer = memo(function ChatComposer(props: ChatComposerProps)...@@ -636,6 +640,9 @@ export const ChatComposer = memo(function ChatComposer(props: ChatComposerProps)
636 const removeComposerDraftPreviewAnnotation = useComposerDraftStore(640 const removeComposerDraftPreviewAnnotation = useComposerDraftStore(
637 (store) => store.removePreviewAnnotation,641 (store) => store.removePreviewAnnotation,
638 );642 );
643 const removeComposerDraftReviewComment = useComposerDraftStore(
644 (store) => store.removeReviewComment,
645 );
639 const clearComposerDraftPersistedAttachments = useComposerDraftStore(646 const clearComposerDraftPersistedAttachments = useComposerDraftStore(
640 (store) => store.clearPersistedAttachments,647 (store) => store.clearPersistedAttachments,
641 );648 );
...@@ -896,12 +903,16 @@ export const ChatComposer = memo(function ChatComposer(props: ChatComposerProps)...@@ -896,12 +903,16 @@ export const ChatComposer = memo(function ChatComposer(props: ChatComposerProps)
896 prompt,903 prompt,
897 imageCount: composerImages.length,904 imageCount: composerImages.length,
898 terminalContexts: composerTerminalContexts,905 terminalContexts: composerTerminalContexts,
899 elementContextCount: composerElementContexts.length + composerPreviewAnnotations.length,906 elementContextCount:
907 composerElementContexts.length +
908 composerPreviewAnnotations.length +
909 composerReviewComments.length,
900 }),910 }),
901 [911 [
902 composerElementContexts.length,912 composerElementContexts.length,
903 composerImages.length,913 composerImages.length,
904 composerPreviewAnnotations.length,914 composerPreviewAnnotations.length,
915 composerReviewComments.length,
905 composerTerminalContexts,916 composerTerminalContexts,
906 prompt,917 prompt,
907 ],918 ],
...@@ -1998,6 +2009,7 @@ export const ChatComposer = memo(function ChatComposer(props: ChatComposerProps)...@@ -1998,6 +2009,7 @@ export const ChatComposer = memo(function ChatComposer(props: ChatComposerProps)
1998 terminalContexts: composerTerminalContextsRef.current,2009 terminalContexts: composerTerminalContextsRef.current,
1999 elementContexts: composerElementContextsRef.current,2010 elementContexts: composerElementContextsRef.current,
2000 previewAnnotations: composerPreviewAnnotations,2011 previewAnnotations: composerPreviewAnnotations,
2012 reviewComments: composerReviewComments,
2001 selectedPromptEffort,2013 selectedPromptEffort,
2002 selectedModelOptionsForDispatch,2014 selectedModelOptionsForDispatch,
2003 selectedModelSelection,2015 selectedModelSelection,
...@@ -2017,6 +2029,7 @@ export const ChatComposer = memo(function ChatComposer(props: ChatComposerProps)...@@ -2017,6 +2029,7 @@ export const ChatComposer = memo(function ChatComposer(props: ChatComposerProps)
2017 composerTerminalContextsRef,2029 composerTerminalContextsRef,
2018 composerElementContextsRef,2030 composerElementContextsRef,
2019 composerPreviewAnnotations,2031 composerPreviewAnnotations,
2032 composerReviewComments,
2020 isConnecting,2033 isConnecting,
2021 isComposerApprovalState,2034 isComposerApprovalState,
2022 pendingUserInputs.length,2035 pendingUserInputs.length,
...@@ -2272,6 +2285,19 @@ export const ChatComposer = memo(function ChatComposer(props: ChatComposerProps)...@@ -2272,6 +2285,19 @@ export const ChatComposer = memo(function ChatComposer(props: ChatComposerProps)
2272 />2285 />
2273 )}2286 )}
22742287
2288 {!isComposerCollapsedMobile &&
2289 !isComposerApprovalState &&
2290 pendingUserInputs.length === 0 &&
2291 composerReviewComments.length > 0 && (
2292 <ComposerPendingReviewComments
2293 comments={composerReviewComments}
2294 onRemove={(commentId) =>
2295 removeComposerDraftReviewComment(composerDraftTarget, commentId)
2296 }
2297 className="mb-3"
2298 />
2299 )}
2300
2275 {!isComposerCollapsedMobile &&2301 {!isComposerCollapsedMobile &&
2276 !isComposerApprovalState &&2302 !isComposerApprovalState &&
2277 pendingUserInputs.length === 0 &&2303 pendingUserInputs.length === 0 &&
apps/web/src/components/chat/ComposerPendingReviewComments.browser.tsx created+41
...@@ -0,0 +1,41 @@
1import "../../index.css";
2
3import { afterEach, describe, expect, it, vi } from "vite-plus/test";
4import { page } from "vite-plus/test/browser";
5import { render } from "vitest-browser-react";
6
7import { ComposerPendingReviewComments } from "./ComposerPendingReviewComments";
8
9describe("ComposerPendingReviewComments", () => {
10 afterEach(() => {
11 document.body.innerHTML = "";
12 });
13
14 it("renders a removable file comment pill", async () => {
15 const onRemove = vi.fn();
16 const screen = await render(
17 <ComposerPendingReviewComments
18 comments={[
19 {
20 id: "comment-1",
21 sectionId: "file:src/app.ts",
22 sectionTitle: "File comment",
23 filePath: "src/app.ts",
24 startIndex: 1,
25 endIndex: 2,
26 rangeLabel: "L2 to L3",
27 text: "Keep this configurable.",
28 diff: "@@ -2,2 +2,2 @@\n two\n three",
29 },
30 ]}
31 onRemove={onRemove}
32 />,
33 );
34
35 await expect.element(page.getByText("src/app.ts L2 to L3")).toBeVisible();
36 await page.getByRole("button", { name: "Remove comment on src/app.ts L2 to L3" }).click();
37 expect(onRemove).toHaveBeenCalledWith("comment-1");
38
39 await screen.unmount();
40 });
41});
apps/web/src/components/chat/ComposerPendingReviewComments.tsx created+60
...@@ -0,0 +1,60 @@
1import { MessageCircle, X } from "lucide-react";
2
3import {
4 COMPOSER_INLINE_CHIP_CLASS_NAME,
5 COMPOSER_INLINE_CHIP_DISMISS_BUTTON_CLASS_NAME,
6 COMPOSER_INLINE_CHIP_ICON_CLASS_NAME,
7 COMPOSER_INLINE_CHIP_LABEL_CLASS_NAME,
8} from "../composerInlineChip";
9import { Tooltip, TooltipPopup, TooltipTrigger } from "../ui/tooltip";
10import type { ReviewCommentContext } from "~/reviewCommentContext";
11import { cn } from "~/lib/utils";
12
13interface ComposerPendingReviewCommentsProps {
14 comments: ReadonlyArray<ReviewCommentContext>;
15 onRemove: (commentId: string) => void;
16 className?: string;
17}
18
19export function ComposerPendingReviewComments({
20 comments,
21 onRemove,
22 className,
23}: ComposerPendingReviewCommentsProps) {
24 if (comments.length === 0) return null;
25
26 return (
27 <div className={cn("flex flex-wrap gap-1.5", className)}>
28 {comments.map((comment) => {
29 const label = `${comment.filePath} ${comment.rangeLabel}`;
30 return (
31 <Tooltip key={comment.id}>
32 <TooltipTrigger
33 render={
34 <span className={cn(COMPOSER_INLINE_CHIP_CLASS_NAME, "pr-1")}>
35 <MessageCircle className={cn(COMPOSER_INLINE_CHIP_ICON_CLASS_NAME, "size-3.5")} />
36 <span className={COMPOSER_INLINE_CHIP_LABEL_CLASS_NAME}>{label}</span>
37 <button
38 type="button"
39 aria-label={`Remove comment on ${label}`}
40 className={COMPOSER_INLINE_CHIP_DISMISS_BUTTON_CLASS_NAME}
41 onClick={(event) => {
42 event.preventDefault();
43 event.stopPropagation();
44 onRemove(comment.id);
45 }}
46 >
47 <X className="size-3" aria-hidden />
48 </button>
49 </span>
50 }
51 />
52 <TooltipPopup side="top" className="max-w-96 whitespace-pre-wrap leading-tight">
53 {comment.text}
54 </TooltipPopup>
55 </Tooltip>
56 );
57 })}
58 </div>
59 );
60}
apps/web/src/components/chat/MessagesTimeline.test.tsx+36
...@@ -296,6 +296,42 @@ describe("MessagesTimeline", () => {...@@ -296,6 +296,42 @@ describe("MessagesTimeline", () => {
296 expect(markup).not.toContain("&lt;/review_comment&gt;");296 expect(markup).not.toContain("&lt;/review_comment&gt;");
297 });297 });
298298
299 it("renders file review comments as source code instead of diffs", async () => {
300 const { MessagesTimeline } = await import("./MessagesTimeline");
301 const markup = renderToStaticMarkup(
302 <MessagesTimeline
303 {...buildProps()}
304 timelineEntries={[
305 {
306 id: "entry-1",
307 kind: "message",
308 createdAt: "2026-03-17T19:12:28.000Z",
309 message: {
310 id: MessageId.make("message-source-comment"),
311 role: "user",
312 text: [
313 '<review_comment sectionId="file:docs/plan.md" sectionTitle="File comment" filePath="docs/plan.md" startIndex="0" endIndex="1" rangeLabel="L1 to L2">',
314 "Clarify this.",
315 "```md",
316 "# Plan",
317 "- Step one",
318 "```",
319 "</review_comment>",
320 ].join("\n"),
321 createdAt: "2026-03-17T19:12:28.000Z",
322 streaming: false,
323 },
324 },
325 ]}
326 />,
327 );
328
329 expect(markup).toContain("plan.md");
330 expect(markup).toContain("Clarify this.");
331 expect(markup).toContain("# Plan");
332 expect(markup).not.toContain('data-testid="file-diff"');
333 });
334
299 it("renders a failure marker for failed tool lifecycle entries", async () => {335 it("renders a failure marker for failed tool lifecycle entries", async () => {
300 const { MessagesTimeline } = await import("./MessagesTimeline");336 const { MessagesTimeline } = await import("./MessagesTimeline");
301 const markup = renderToStaticMarkup(337 const markup = renderToStaticMarkup(
apps/web/src/components/chat/MessagesTimeline.tsx+11
...@@ -102,6 +102,7 @@ import { SkillInlineText } from "./SkillInlineText";...@@ -102,6 +102,7 @@ import { SkillInlineText } from "./SkillInlineText";
102import { formatWorkspaceRelativePath } from "../../filePathDisplay";102import { formatWorkspaceRelativePath } from "../../filePathDisplay";
103import {103import {
104 buildReviewCommentRenderablePatch,104 buildReviewCommentRenderablePatch,
105 formatReviewCommentFence,
105 parseReviewCommentMessageSegments,106 parseReviewCommentMessageSegments,
106 type ReviewCommentContext,107 type ReviewCommentContext,
107} from "../../reviewCommentContext";108} from "../../reviewCommentContext";
...@@ -1270,6 +1271,7 @@ const UserMessageBody = memo(function UserMessageBody(props: {...@@ -1270,6 +1271,7 @@ const UserMessageBody = memo(function UserMessageBody(props: {
12701271
1271function UserMessageReviewCommentCard({ comment }: { comment: ReviewCommentContext }) {1272function UserMessageReviewCommentCard({ comment }: { comment: ReviewCommentContext }) {
1272 const ctx = use(TimelineRowCtx);1273 const ctx = use(TimelineRowCtx);
1274 const fenceLanguage = comment.fenceLanguage ?? "diff";
1273 const renderablePatch = getRenderablePatch(1275 const renderablePatch = getRenderablePatch(
1274 buildReviewCommentRenderablePatch(comment),1276 buildReviewCommentRenderablePatch(comment),
1275 `review-comment:${comment.id}`,1277 `review-comment:${comment.id}`,
...@@ -1290,6 +1292,15 @@ function UserMessageReviewCommentCard({ comment }: { comment: ReviewCommentConte...@@ -1290,6 +1292,15 @@ function UserMessageReviewCommentCard({ comment }: { comment: ReviewCommentConte
1290 <SkillInlineText text={comment.text} skills={ctx.skills} />1292 <SkillInlineText text={comment.text} skills={ctx.skills} />
1291 </div>1293 </div>
1292 )}1294 )}
1295 {fenceLanguage !== "diff" && comment.diff.trim().length > 0 && (
1296 <ChatMarkdown
1297 text={formatReviewCommentFence(fenceLanguage, comment.diff)}
1298 cwd={ctx.markdownCwd}
1299 threadRef={ctx.threadRef ?? undefined}
1300 skills={ctx.skills}
1301 className="text-foreground"
1302 />
1303 )}
1293 {renderablePatch?.kind === "files" &&1304 {renderablePatch?.kind === "files" &&
1294 renderablePatch.files.map((fileDiff) => (1305 renderablePatch.files.map((fileDiff) => (
1295 <FileDiff1306 <FileDiff
apps/web/src/components/chat/OpenInPicker.tsx+25-5
...@@ -154,10 +154,14 @@ export const OpenInPicker = memo(function OpenInPicker({...@@ -154,10 +154,14 @@ export const OpenInPicker = memo(function OpenInPicker({
154 keybindings,154 keybindings,
155 availableEditors,155 availableEditors,
156 openInCwd,156 openInCwd,
157 compact = false,
158 enableShortcut = true,
157}: {159}: {
158 keybindings: ResolvedKeybindingsConfig;160 keybindings: ResolvedKeybindingsConfig;
159 availableEditors: ReadonlyArray<EditorId>;161 availableEditors: ReadonlyArray<EditorId>;
160 openInCwd: string | null;162 openInCwd: string | null;
163 compact?: boolean;
164 enableShortcut?: boolean;
161}) {165}) {
162 const [preferredEditor, setPreferredEditor] = usePreferredEditor(availableEditors);166 const [preferredEditor, setPreferredEditor] = usePreferredEditor(availableEditors);
163 const options = useMemo(167 const options = useMemo(
...@@ -184,6 +188,7 @@ export const OpenInPicker = memo(function OpenInPicker({...@@ -184,6 +188,7 @@ export const OpenInPicker = memo(function OpenInPicker({
184 );188 );
185189
186 useEffect(() => {190 useEffect(() => {
191 if (!enableShortcut) return;
187 const handler = (e: globalThis.KeyboardEvent) => {192 const handler = (e: globalThis.KeyboardEvent) => {
188 const api = readLocalApi();193 const api = readLocalApi();
189 if (!isOpenFavoriteEditorShortcut(e, keybindings)) return;194 if (!isOpenFavoriteEditorShortcut(e, keybindings)) return;
...@@ -195,24 +200,39 @@ export const OpenInPicker = memo(function OpenInPicker({...@@ -195,24 +200,39 @@ export const OpenInPicker = memo(function OpenInPicker({
195 };200 };
196 window.addEventListener("keydown", handler);201 window.addEventListener("keydown", handler);
197 return () => window.removeEventListener("keydown", handler);202 return () => window.removeEventListener("keydown", handler);
198 }, [preferredEditor, keybindings, openInCwd]);203 }, [enableShortcut, preferredEditor, keybindings, openInCwd]);
199204
200 return (205 return (
201 <Group aria-label="Subscription actions">206 <Group aria-label="Open in editor">
202 <Button207 <Button
208 aria-label={compact ? "Open file in preferred editor" : undefined}
203 size="xs"209 size="xs"
204 variant="outline"210 variant="outline"
205 disabled={!preferredEditor || !openInCwd}211 disabled={!preferredEditor || !openInCwd}
206 onClick={() => openInEditor(preferredEditor)}212 onClick={() => openInEditor(preferredEditor)}
207 >213 >
208 {primaryOption?.Icon && <primaryOption.Icon aria-hidden="true" className="size-3.5" />}214 {primaryOption?.Icon && <primaryOption.Icon aria-hidden="true" className="size-3.5" />}
209 <span className="sr-only @3xl/header-actions:not-sr-only @3xl/header-actions:ml-0.5">215 <span
216 className={
217 compact
218 ? "sr-only"
219 : "sr-only @3xl/header-actions:not-sr-only @3xl/header-actions:ml-0.5"
220 }
221 >
210 Open222 Open
211 </span>223 </span>
212 </Button>224 </Button>
213 <GroupSeparator className="hidden @3xl/header-actions:block" />225 <GroupSeparator {...(!compact ? { className: "hidden @3xl/header-actions:block" } : {})} />
214 <Menu>226 <Menu>
215 <MenuTrigger render={<Button aria-label="Copy options" size="icon-xs" variant="outline" />}>227 <MenuTrigger
228 render={
229 <Button
230 aria-label={compact ? "Choose editor" : "Copy options"}
231 size="icon-xs"
232 variant="outline"
233 />
234 }
235 >
216 <ChevronDownIcon aria-hidden="true" className="size-4" />236 <ChevronDownIcon aria-hidden="true" className="size-4" />
217 </MenuTrigger>237 </MenuTrigger>
218 <MenuPopup align="end">238 <MenuPopup align="end">
apps/web/src/components/diffs/AnnotatableFileDiff.browser.tsx created+122
...@@ -0,0 +1,122 @@
1import "../../index.css";
2
3import { parsePatchFiles } from "@pierre/diffs/utils/parsePatchFiles";
4import { scopeThreadRef } from "@t3tools/client-runtime";
5import { EnvironmentId, ThreadId } from "@t3tools/contracts";
6import { afterEach, describe, expect, it, vi } from "vite-plus/test";
7import { page } from "vite-plus/test/browser";
8import { render } from "vitest-browser-react";
9
10import { useComposerDraftStore } from "~/composerDraftStore";
11
12import { AnnotatableFileDiff } from "./AnnotatableFileDiff";
13
14function dispatchPointer(target: EventTarget, type: string, pointerId: number): void {
15 target.dispatchEvent(
16 new PointerEvent(type, {
17 bubbles: true,
18 cancelable: true,
19 composed: true,
20 pointerId,
21 pointerType: "mouse",
22 }),
23 );
24}
25
26const threadRef = scopeThreadRef(EnvironmentId.make("local"), ThreadId.make("thread-1"));
27
28function TestDiff() {
29 const fileDiff = parsePatchFiles(
30 [
31 "diff --git a/src/app.ts b/src/app.ts",
32 "--- a/src/app.ts",
33 "+++ b/src/app.ts",
34 "@@ -1,3 +1,3 @@",
35 " one",
36 "-two",
37 "+TWO",
38 " three",
39 ].join("\n"),
40 "annotatable-file-diff-test",
41 )[0]!.files[0]!;
42
43 return (
44 <AnnotatableFileDiff
45 fileDiff={fileDiff}
46 filePath="src/app.ts"
47 sectionId="turn:2"
48 sectionTitle="Turn 2"
49 composerDraftTarget={threadRef}
50 renderHeaderPrefix={() => null}
51 options={{
52 diffStyle: "unified",
53 lineDiffType: "none",
54 themeType: "light",
55 }}
56 />
57 );
58}
59
60async function getRenderedDiff() {
61 return vi.waitFor(() => {
62 const element = document.querySelector<HTMLElement>("diffs-container");
63 expect(element?.shadowRoot).not.toBeNull();
64 return element!;
65 });
66}
67
68describe("annotatable Pierre file diff", () => {
69 afterEach(() => {
70 document.body.innerHTML = "";
71 useComposerDraftStore.getState().setReviewComments(threadRef, []);
72 });
73
74 it("creates a local annotation from the gutter and attaches it to the composer", async () => {
75 let screen = await render(<TestDiff />);
76
77 try {
78 const diff = await getRenderedDiff();
79 const addedLineNumber = await vi.waitFor(() => {
80 const elements = Array.from(
81 diff.shadowRoot?.querySelectorAll<HTMLElement>('[data-column-number="2"]') ?? [],
82 );
83 const element = elements.at(-1) ?? null;
84 expect(element).not.toBeNull();
85 return element!;
86 });
87
88 dispatchPointer(addedLineNumber, "pointerdown", 1);
89 dispatchPointer(addedLineNumber, "pointerup", 1);
90
91 const textarea = page.getByRole("textbox", { name: "Comment on lines +2" });
92 await expect.element(textarea).toBeVisible();
93 await textarea.fill("Use the compatible value.");
94 await page.getByRole("button", { name: "Comment" }).click();
95
96 await vi.waitFor(() => {
97 expect(
98 useComposerDraftStore.getState().getComposerDraft(threadRef)?.reviewComments,
99 ).toEqual([
100 expect.objectContaining({
101 sectionId: "turn:2",
102 filePath: "src/app.ts",
103 rangeLabel: "+2",
104 text: "Use the compatible value.",
105 diff: "@@ -0,0 +2,1 @@\n+TWO",
106 }),
107 ]);
108 });
109 expect(document.querySelector("[data-file-comment-annotation]")?.textContent).toContain(
110 "Use the compatible value.",
111 );
112
113 await screen.unmount();
114 screen = await render(<TestDiff />);
115 await expect
116 .element(page.getByText("Use the compatible value.", { exact: true }))
117 .toBeVisible();
118 } finally {
119 await screen.unmount();
120 }
121 });
122});
apps/web/src/components/diffs/AnnotatableFileDiff.tsx created+239
...@@ -0,0 +1,239 @@
1import type {
2 AnnotationSide,
3 DiffLineAnnotation,
4 FileDiffMetadata,
5 SelectedLineRange,
6} from "@pierre/diffs";
7import { FileDiff, type FileDiffProps } from "@pierre/diffs/react";
8import type { ScopedThreadRef } from "@t3tools/contracts";
9import { useCallback, useMemo, useState, type ReactNode } from "react";
10
11import { type DraftId, useComposerDraftStore } from "~/composerDraftStore";
12import {
13 buildDiffReviewComment,
14 restoreDiffReviewCommentRange,
15 type ReviewCommentContext,
16} from "~/reviewCommentContext";
17
18import { LocalCommentAnnotation } from "../files/LocalCommentAnnotation";
19import { nextFileCommentId } from "../files/fileCommentAnnotations";
20
21interface DiffCommentAnnotationEntry {
22 id: string;
23 kind: "draft" | "comment";
24 range: SelectedLineRange;
25 rangeLabel: string;
26 text: string;
27}
28
29interface DiffCommentAnnotationGroup {
30 entries: DiffCommentAnnotationEntry[];
31}
32
33type DiffCommentLineAnnotation = DiffLineAnnotation<DiffCommentAnnotationGroup>;
34const EMPTY_REVIEW_COMMENTS: ReadonlyArray<ReviewCommentContext> = [];
35
36function annotationSide(range: SelectedLineRange): AnnotationSide {
37 return (range.endSide ?? range.side) === "deletions" ? "deletions" : "additions";
38}
39
40function appendAnnotationEntry(
41 annotations: ReadonlyArray<DiffCommentLineAnnotation>,
42 range: SelectedLineRange,
43 entry: DiffCommentAnnotationEntry,
44): DiffCommentLineAnnotation[] {
45 const side = annotationSide(range);
46 const annotationIndex = annotations.findIndex(
47 (annotation) => annotation.side === side && annotation.lineNumber === range.end,
48 );
49 if (annotationIndex < 0) {
50 return [
51 ...annotations,
52 {
53 side,
54 lineNumber: range.end,
55 metadata: { entries: [entry] },
56 },
57 ];
58 }
59 return annotations.map((annotation, index) =>
60 index === annotationIndex
61 ? {
62 ...annotation,
63 metadata: { entries: [...annotation.metadata.entries, entry] },
64 }
65 : annotation,
66 );
67}
68
69interface AnnotatableFileDiffProps {
70 fileDiff: FileDiffMetadata;
71 filePath: string;
72 sectionId: string;
73 sectionTitle: string;
74 composerDraftTarget: ScopedThreadRef | DraftId;
75 options: FileDiffProps<DiffCommentAnnotationGroup>["options"];
76 renderHeaderPrefix: (fileDiff: FileDiffMetadata) => ReactNode;
77}
78
79export function AnnotatableFileDiff({
80 fileDiff,
81 filePath,
82 sectionId,
83 sectionTitle,
84 composerDraftTarget,
85 options,
86 renderHeaderPrefix,
87}: AnnotatableFileDiffProps) {
88 const addReviewComment = useComposerDraftStore((store) => store.addReviewComment);
89 const removeReviewComment = useComposerDraftStore((store) => store.removeReviewComment);
90 const reviewComments = useComposerDraftStore(
91 (store) => store.getComposerDraft(composerDraftTarget)?.reviewComments ?? EMPTY_REVIEW_COMMENTS,
92 );
93 const [selectedRange, setSelectedRange] = useState<SelectedLineRange | null>(null);
94 const [draftAnnotation, setDraftAnnotation] = useState<DiffCommentLineAnnotation | null>(null);
95 const persistedAnnotations = useMemo(
96 () =>
97 reviewComments
98 .filter(
99 (comment) =>
100 comment.sectionId === sectionId &&
101 comment.filePath === filePath &&
102 (comment.fenceLanguage ?? "diff") === "diff",
103 )
104 .reduce<DiffCommentLineAnnotation[]>((annotations, comment) => {
105 const range = restoreDiffReviewCommentRange(fileDiff, comment);
106 if (!range) return annotations;
107 return appendAnnotationEntry(annotations, range, {
108 id: comment.id,
109 kind: "comment",
110 range,
111 rangeLabel: comment.rangeLabel,
112 text: comment.text,
113 });
114 }, []),
115 [fileDiff, filePath, reviewComments, sectionId],
116 );
117 const lineAnnotations = useMemo(
118 () => (draftAnnotation ? [...persistedAnnotations, draftAnnotation] : persistedAnnotations),
119 [draftAnnotation, persistedAnnotations],
120 );
121
122 const removeAnnotationEntry = useCallback(
123 (entryId: string) => {
124 setSelectedRange(null);
125 if (
126 draftAnnotation?.metadata.entries.some(
127 (entry) => entry.id === entryId && entry.kind === "draft",
128 )
129 ) {
130 setDraftAnnotation(null);
131 return;
132 }
133 removeReviewComment(composerDraftTarget, entryId);
134 },
135 [composerDraftTarget, draftAnnotation, removeReviewComment],
136 );
137
138 const submitAnnotationEntry = useCallback(
139 (entryId: string, text: string) => {
140 const entry = draftAnnotation?.metadata.entries.find((candidate) => candidate.id === entryId);
141 if (!entry) return;
142
143 const comment = buildDiffReviewComment({
144 id: entry.id,
145 sectionId,
146 sectionTitle,
147 filePath,
148 fileDiff,
149 range: entry.range,
150 text,
151 });
152 if (comment) {
153 addReviewComment(composerDraftTarget, comment);
154 }
155 setSelectedRange(null);
156 setDraftAnnotation(null);
157 },
158 [
159 addReviewComment,
160 composerDraftTarget,
161 fileDiff,
162 filePath,
163 draftAnnotation,
164 sectionId,
165 sectionTitle,
166 ],
167 );
168
169 const beginComment = useCallback(
170 (range: SelectedLineRange) => {
171 const id = nextFileCommentId();
172 const comment = buildDiffReviewComment({
173 id,
174 sectionId,
175 sectionTitle,
176 filePath,
177 fileDiff,
178 range,
179 text: "",
180 });
181 if (!comment) return;
182
183 const draftEntry: DiffCommentAnnotationEntry = {
184 id,
185 kind: "draft",
186 range,
187 rangeLabel: comment.rangeLabel,
188 text: "",
189 };
190 setDraftAnnotation({
191 side: annotationSide(range),
192 lineNumber: range.end,
193 metadata: { entries: [draftEntry] },
194 });
195 },
196 [fileDiff, filePath, sectionId, sectionTitle],
197 );
198
199 const hasOpenCommentForm = draftAnnotation !== null;
200 const handleLineSelectionEnd = useCallback(
201 (range: SelectedLineRange | null) => {
202 setSelectedRange(range);
203 if (range) beginComment(range);
204 },
205 [beginComment],
206 );
207
208 return (
209 <FileDiff<DiffCommentAnnotationGroup>
210 fileDiff={fileDiff}
211 renderHeaderPrefix={renderHeaderPrefix}
212 options={{
213 ...options,
214 enableGutterUtility: !hasOpenCommentForm,
215 enableLineSelection: !hasOpenCommentForm,
216 onGutterUtilityClick: setSelectedRange,
217 onLineSelectionChange: setSelectedRange,
218 onLineSelectionEnd: handleLineSelectionEnd,
219 }}
220 selectedLines={selectedRange}
221 lineAnnotations={lineAnnotations}
222 renderAnnotation={(annotation) => (
223 <div className="py-1">
224 {annotation.metadata.entries.map((entry) => (
225 <LocalCommentAnnotation
226 key={entry.id}
227 kind={entry.kind}
228 rangeLabel={entry.rangeLabel}
229 text={entry.text}
230 onCancel={() => removeAnnotationEntry(entry.id)}
231 onComment={(text) => submitAnnotationEntry(entry.id, text)}
232 onDelete={() => removeAnnotationEntry(entry.id)}
233 />
234 ))}
235 </div>
236 )}
237 />
238 );
239}
apps/web/src/components/files/FilePreviewPanel.browser.tsx created+168
...@@ -0,0 +1,168 @@
1import "../../index.css";
2
3import type { LineAnnotation, SelectedLineRange } from "@pierre/diffs";
4import { Editor } from "@pierre/diffs/editor";
5import { EditorProvider, File } from "@pierre/diffs/react";
6import { afterEach, describe, expect, it, vi } from "vite-plus/test";
7import { page } from "vite-plus/test/browser";
8import { render } from "vitest-browser-react";
9import { useEffect, useMemo, useRef, useState } from "react";
10
11import { installFileEditorDismissal } from "./fileEditorDismissal";
12
13interface AnnotationMetadata {
14 label: string;
15}
16
17function dispatchPointer(target: EventTarget, type: string, pointerId: number): void {
18 target.dispatchEvent(
19 new PointerEvent(type, {
20 bubbles: true,
21 cancelable: true,
22 composed: true,
23 pointerId,
24 pointerType: "mouse",
25 }),
26 );
27}
28
29function EditableAnnotatedFile() {
30 const [selectedLines, setSelectedLines] = useState<SelectedLineRange | null>(null);
31 const [lineAnnotations, setLineAnnotations] = useState<LineAnnotation<AnnotationMetadata>[]>([]);
32 const rootRef = useRef<HTMLDivElement>(null);
33 const editor = useMemo(() => new Editor<AnnotationMetadata>(), []);
34
35 useEffect(() => () => editor.cleanUp(), [editor]);
36 useEffect(() => {
37 const root = rootRef.current;
38 if (!root) return;
39 return installFileEditorDismissal({
40 root,
41 editor,
42 isBlocked: () => false,
43 onDismiss: () => setSelectedLines(null),
44 });
45 }, [editor]);
46
47 return (
48 <>
49 <div ref={rootRef}>
50 <EditorProvider editor={editor}>
51 <File<AnnotationMetadata>
52 file={{ name: "example.ts", contents: "one\ntwo\nthree\n" }}
53 options={{
54 disableFileHeader: true,
55 enableGutterUtility: true,
56 enableLineSelection: true,
57 onGutterUtilityClick: setSelectedLines,
58 onLineSelectionChange: setSelectedLines,
59 onLineSelectionEnd: (range) => {
60 setSelectedLines(range);
61 if (range) {
62 setLineAnnotations([
63 {
64 lineNumber: Math.max(range.start, range.end),
65 metadata: { label: `${range.start}:${range.end}` },
66 },
67 ]);
68 }
69 },
70 }}
71 selectedLines={selectedLines}
72 lineAnnotations={lineAnnotations}
73 renderAnnotation={(annotation) => (
74 <div data-test-file-annotation contentEditable={false}>
75 {annotation.metadata.label}
76 </div>
77 )}
78 disableWorkerPool
79 contentEditable
80 />
81 </EditorProvider>
82 </div>
83 <button type="button">Outside file</button>
84 </>
85 );
86}
87
88async function getEditableFile() {
89 const file = await vi.waitFor(() => {
90 const element = document.querySelector<HTMLElement>("diffs-container");
91 expect(element?.shadowRoot).not.toBeNull();
92 return element!;
93 });
94 const content = await vi.waitFor(() => {
95 const element = file?.shadowRoot?.querySelector<HTMLElement>("[data-content]") ?? null;
96 expect(element).not.toBeNull();
97 return element!;
98 });
99 return { file, content };
100}
101
102describe("editable Pierre file annotations", () => {
103 afterEach(() => {
104 document.body.innerHTML = "";
105 });
106
107 it("keeps gutter selection and annotations enabled while the file is editable", async () => {
108 const screen = await render(<EditableAnnotatedFile />);
109
110 try {
111 const { file, content } = await getEditableFile();
112 const secondLineNumber = await vi.waitFor(() => {
113 const element =
114 file?.shadowRoot?.querySelector<HTMLElement>('[data-column-number="2"]') ?? null;
115 expect(element).not.toBeNull();
116 return element;
117 });
118 await vi.waitFor(() => {
119 expect(
120 file?.shadowRoot?.querySelector("pre")?.hasAttribute("data-interactive-line-numbers"),
121 ).toBe(true);
122 });
123
124 dispatchPointer(secondLineNumber!, "pointerdown", 1);
125 dispatchPointer(secondLineNumber!, "pointerup", 1);
126
127 await vi.waitFor(() => {
128 expect(document.querySelector("[data-test-file-annotation]")?.textContent).toBe("2:2");
129 });
130
131 expect(content.contentEditable).toBe("true");
132 expect(content.getAttribute("role")).toBe("textbox");
133 } finally {
134 await screen.unmount();
135 }
136 });
137
138 it("dismisses editor focus and selection with outside click or Escape", async () => {
139 const screen = await render(<EditableAnnotatedFile />);
140
141 try {
142 const { file, content } = await getEditableFile();
143 content.focus();
144 expect(file?.shadowRoot?.activeElement).toBe(content);
145
146 await page.getByRole("button", { name: "Outside file" }).click();
147 await vi.waitFor(() => {
148 expect(file?.shadowRoot?.activeElement).not.toBe(content);
149 });
150
151 content.focus();
152 expect(file?.shadowRoot?.activeElement).toBe(content);
153 content.dispatchEvent(
154 new KeyboardEvent("keydown", {
155 key: "Escape",
156 bubbles: true,
157 cancelable: true,
158 composed: true,
159 }),
160 );
161 await vi.waitFor(() => {
162 expect(file?.shadowRoot?.activeElement).not.toBe(content);
163 });
164 } finally {
165 await screen.unmount();
166 }
167 });
168});
apps/web/src/components/files/FilePreviewPanel.test.ts created+82
...@@ -0,0 +1,82 @@
1import { describe, expect, it } from "vite-plus/test";
2
3import {
4 formatFileCommentRange,
5 normalizeFileCommentRange,
6 remapFileCommentAnnotations,
7} from "./fileCommentAnnotations";
8import { isMarkdownPreviewFile, setMarkdownTaskChecked } from "./filePreviewMode";
9
10describe("file comment annotations", () => {
11 it("normalizes and formats selected line ranges", () => {
12 expect(normalizeFileCommentRange({ start: 16, end: 7 })).toEqual({
13 startLine: 7,
14 endLine: 16,
15 });
16 expect(formatFileCommentRange(7, 7)).toBe("L7");
17 expect(formatFileCommentRange(7, 16)).toBe("L7 to L16");
18 });
19
20 it("keeps an annotation range attached when Pierre remaps its anchor line", () => {
21 expect(
22 remapFileCommentAnnotations([
23 {
24 lineNumber: 20,
25 metadata: {
26 entries: [
27 {
28 id: "comment-1",
29 kind: "comment",
30 startLine: 7,
31 endLine: 16,
32 text: "Keep this guarded.",
33 },
34 ],
35 },
36 },
37 ]),
38 ).toEqual([
39 {
40 lineNumber: 20,
41 metadata: {
42 entries: [
43 {
44 id: "comment-1",
45 kind: "comment",
46 startLine: 11,
47 endLine: 20,
48 text: "Keep this guarded.",
49 },
50 ],
51 },
52 },
53 ]);
54 });
55});
56
57describe("isMarkdownPreviewFile", () => {
58 it("recognizes markdown and MDX files case-insensitively", () => {
59 expect(isMarkdownPreviewFile("README.md")).toBe(true);
60 expect(isMarkdownPreviewFile("docs/guide.MDX")).toBe(true);
61 });
62
63 it("does not treat other text files as markdown", () => {
64 expect(isMarkdownPreviewFile("docs/guide.txt")).toBe(false);
65 expect(isMarkdownPreviewFile("docs/markdown.ts")).toBe(false);
66 });
67});
68
69describe("setMarkdownTaskChecked", () => {
70 const markdown = "- [ ] First\n- [x] Second\n";
71
72 it("checks and unchecks the task marker at the supplied offset", () => {
73 expect(setMarkdownTaskChecked(markdown, 2, true)).toBe("- [x] First\n- [x] Second\n");
74 expect(setMarkdownTaskChecked(markdown, 14, false)).toBe("- [ ] First\n- [ ] Second\n");
75 expect(setMarkdownTaskChecked("1. [X] Ordered\n", 3, false)).toBe("1. [ ] Ordered\n");
76 });
77
78 it("leaves the document unchanged for a stale or invalid marker offset", () => {
79 expect(setMarkdownTaskChecked(markdown, 0, true)).toBe(markdown);
80 expect(setMarkdownTaskChecked(markdown, 200, true)).toBe(markdown);
81 });
82});
apps/web/src/components/files/FilePreviewPanel.tsx+371-36
...@@ -1,23 +1,51 @@...@@ -1,23 +1,51 @@
1import type { EnvironmentId } from "@t3tools/contracts";1import type {
2 EditorId,
3 EnvironmentId,
4 ResolvedKeybindingsConfig,
5 ScopedThreadRef,
6} from "@t3tools/contracts";
7import type { SelectedLineRange } from "@pierre/diffs";
2import { Editor } from "@pierre/diffs/editor";8import { Editor } from "@pierre/diffs/editor";
3import { EditorProvider, File, Virtualizer } from "@pierre/diffs/react";9import { EditorProvider, File, Virtualizer } from "@pierre/diffs/react";
4import { ChevronRight, FolderTree, LoaderCircle } from "lucide-react";10import { ChevronRight, Code2, Eye, FolderTree, Globe2, LoaderCircle } from "lucide-react";
5import { useEffect, useMemo, useRef, useState } from "react";11import { useCallback, useEffect, useMemo, useRef, useState } from "react";
612
13import { isBrowserPreviewFile, openFileInPreview } from "~/browser/openFileInPreview";
14import ChatMarkdown from "~/components/ChatMarkdown";
15import { OpenInPicker } from "~/components/chat/OpenInPicker";
7import { ensureEnvironmentApi } from "~/environmentApi";16import { ensureEnvironmentApi } from "~/environmentApi";
17import { usePrimaryEnvironmentId } from "~/environments/primary/context";
8import { useTheme } from "~/hooks/useTheme";18import { useTheme } from "~/hooks/useTheme";
9import { resolveDiffThemeName } from "~/lib/diffRendering";19import { resolveDiffThemeName } from "~/lib/diffRendering";
10import { cn } from "~/lib/utils";20import { cn } from "~/lib/utils";
21import { isPreviewSupportedInRuntime } from "~/previewStateStore";
22import { resolvePathLinkTarget } from "~/terminal-links";
11import { ScrollArea } from "~/components/ui/scroll-area";23import { ScrollArea } from "~/components/ui/scroll-area";
12import { Toggle } from "~/components/ui/toggle";24import { Toggle } from "~/components/ui/toggle";
13import { Tooltip, TooltipPopup, TooltipTrigger } from "~/components/ui/tooltip";25import { Tooltip, TooltipPopup, TooltipTrigger } from "~/components/ui/tooltip";
26import { stackedThreadToast, toastManager } from "~/components/ui/toast";
27import { type DraftId, useComposerDraftStore } from "~/composerDraftStore";
28import { buildFileReviewComment } from "~/reviewCommentContext";
1429
15import FileBrowserPanel from "./FileBrowserPanel";30import FileBrowserPanel from "./FileBrowserPanel";
31import {
32 type FileCommentAnnotationEntry,
33 type FileCommentAnnotationGroup,
34 type FileCommentLineAnnotation,
35 formatFileCommentRange,
36 nextFileCommentId,
37 normalizeFileCommentRange,
38 remapFileCommentAnnotations,
39} from "./fileCommentAnnotations";
40import { installFileEditorDismissal } from "./fileEditorDismissal";
41import { LocalCommentAnnotation } from "./LocalCommentAnnotation";
16import { projectFileCacheKey } from "./fileContentRevision";42import { projectFileCacheKey } from "./fileContentRevision";
17import { fileBreadcrumbs } from "./filePath";43import { fileBreadcrumbs } from "./filePath";
44import { isMarkdownPreviewFile, setMarkdownTaskChecked } from "./filePreviewMode";
18import { FileSaveCoordinator } from "./fileSaveCoordinator";45import { FileSaveCoordinator } from "./fileSaveCoordinator";
19import {46import {
20 confirmProjectFileQueryData,47 confirmProjectFileQueryData,
48 getOptimisticProjectFileQueryData,
21 setProjectFileQueryData,49 setProjectFileQueryData,
22 useProjectFileQuery,50 useProjectFileQuery,
23} from "./projectFilesQueryState";51} from "./projectFilesQueryState";
...@@ -27,6 +55,10 @@ interface FilePreviewPanelProps {...@@ -27,6 +55,10 @@ interface FilePreviewPanelProps {
27 cwd: string;55 cwd: string;
28 projectName: string;56 projectName: string;
29 relativePath: string | null;57 relativePath: string | null;
58 threadRef: ScopedThreadRef;
59 composerDraftTarget: ScopedThreadRef | DraftId;
60 keybindings: ResolvedKeybindingsConfig;
61 availableEditors: ReadonlyArray<EditorId>;
30 onOpenFile: (relativePath: string) => void;62 onOpenFile: (relativePath: string) => void;
31 onPendingChange: (relativePath: string, pending: boolean) => void;63 onPendingChange: (relativePath: string, pending: boolean) => void;
32}64}
...@@ -38,20 +70,22 @@ interface EditableFileSurfaceProps {...@@ -38,20 +70,22 @@ interface EditableFileSurfaceProps {
38 environmentId: EnvironmentId;70 environmentId: EnvironmentId;
39 cwd: string;71 cwd: string;
40 relativePath: string;72 relativePath: string;
73 composerDraftTarget: ScopedThreadRef | DraftId;
41 contents: string;74 contents: string;
42 resolvedTheme: "light" | "dark";75 resolvedTheme: "light" | "dark";
43 onPendingChange: (relativePath: string, pending: boolean) => void;76 onPendingChange: (relativePath: string, pending: boolean) => void;
44}77}
4578
46function EditableFileSurface({79function useFileSaveCoordinator({
47 environmentId,80 environmentId,
48 cwd,81 cwd,
49 relativePath,82 relativePath,
50 contents,
51 resolvedTheme,
52 onPendingChange,83 onPendingChange,
53}: EditableFileSurfaceProps) {84}: Pick<
54 const saveCoordinator = useMemo(85 EditableFileSurfaceProps,
86 "environmentId" | "cwd" | "relativePath" | "onPendingChange"
87>): FileSaveCoordinator {
88 const coordinator = useMemo(
55 () =>89 () =>
56 new FileSaveCoordinator({90 new FileSaveCoordinator({
57 debounceMs: FILE_SAVE_DEBOUNCE_MS,91 debounceMs: FILE_SAVE_DEBOUNCE_MS,
...@@ -69,54 +103,270 @@ function EditableFileSurface({...@@ -69,54 +103,270 @@ function EditableFileSurface({
69 }),103 }),
70 [cwd, environmentId, onPendingChange, relativePath],104 [cwd, environmentId, onPendingChange, relativePath],
71 );105 );
106
107 useEffect(() => () => coordinator.dispose(), [coordinator]);
108 return coordinator;
109}
110
111function EditableFileSurface({
112 environmentId,
113 cwd,
114 relativePath,
115 composerDraftTarget,
116 contents,
117 resolvedTheme,
118 onPendingChange,
119}: EditableFileSurfaceProps) {
120 const addReviewComment = useComposerDraftStore((store) => store.addReviewComment);
121 const removeReviewComment = useComposerDraftStore((store) => store.removeReviewComment);
122 const [lineAnnotations, setLineAnnotations] = useState<FileCommentLineAnnotation[]>([]);
123 const [selectedRange, setSelectedRange] = useState<SelectedLineRange | null>(null);
124 const surfaceRef = useRef<HTMLDivElement>(null);
125 const saveCoordinator = useFileSaveCoordinator({
126 environmentId,
127 cwd,
128 relativePath,
129 onPendingChange,
130 });
72 const editor = useMemo(131 const editor = useMemo(
73 () =>132 () =>
74 new Editor({133 new Editor<FileCommentAnnotationGroup>({
75 onChange: (file) => {134 onChange: (file, nextLineAnnotations) => {
76 setProjectFileQueryData(environmentId, cwd, relativePath, file.contents);135 setProjectFileQueryData(environmentId, cwd, relativePath, file.contents);
77 saveCoordinator.change(file.contents);136 saveCoordinator.change(file.contents);
137 if (nextLineAnnotations) {
138 const remapped = remapFileCommentAnnotations(
139 nextLineAnnotations as FileCommentLineAnnotation[],
140 );
141 setLineAnnotations(remapped);
142 for (const annotation of remapped) {
143 for (const entry of annotation.metadata.entries) {
144 if (entry.kind !== "comment") continue;
145 addReviewComment(
146 composerDraftTarget,
147 buildFileReviewComment({
148 id: entry.id,
149 filePath: relativePath,
150 startLine: entry.startLine,
151 endLine: entry.endLine,
152 text: entry.text,
153 contents: file.contents,
154 }),
155 );
156 }
157 }
158 }
78 },159 },
79 }),160 }),
80 [cwd, environmentId, relativePath, saveCoordinator],161 [addReviewComment, composerDraftTarget, cwd, environmentId, relativePath, saveCoordinator],
81 );162 );
82163
83 useEffect(164 useEffect(
84 () => () => {165 () => () => {
85 editor.cleanUp();166 editor.cleanUp();
86 saveCoordinator.dispose();
87 },167 },
88 [editor, saveCoordinator],168 [editor],
169 );
170
171 const removeAnnotationEntry = useCallback(
172 (entryId: string) => {
173 setSelectedRange(null);
174 removeReviewComment(composerDraftTarget, entryId);
175 setLineAnnotations((current) => {
176 return current.flatMap((annotation) => {
177 const entries = annotation.metadata.entries.filter((entry) => entry.id !== entryId);
178 return entries.length > 0 ? [{ ...annotation, metadata: { entries } }] : [];
179 });
180 });
181 },
182 [composerDraftTarget, removeReviewComment],
183 );
184
185 const submitAnnotationEntry = useCallback(
186 (entryId: string, text: string) => {
187 setSelectedRange(null);
188 const entry = lineAnnotations
189 .flatMap((annotation) => annotation.metadata.entries)
190 .find((candidate) => candidate.id === entryId);
191 if (entry) {
192 addReviewComment(
193 composerDraftTarget,
194 buildFileReviewComment({
195 id: entry.id,
196 filePath: relativePath,
197 startLine: entry.startLine,
198 endLine: entry.endLine,
199 text,
200 contents,
201 }),
202 );
203 }
204 setLineAnnotations((current) =>
205 current.map((annotation) => ({
206 ...annotation,
207 metadata: {
208 entries: annotation.metadata.entries.map((annotationEntry) =>
209 annotationEntry.id === entryId
210 ? { ...annotationEntry, kind: "comment", text }
211 : annotationEntry,
212 ),
213 },
214 })),
215 );
216 },
217 [addReviewComment, composerDraftTarget, contents, lineAnnotations, relativePath],
218 );
219
220 const beginComment = useCallback((range: SelectedLineRange) => {
221 const { startLine, endLine } = normalizeFileCommentRange(range);
222 const draftEntry: FileCommentAnnotationEntry = {
223 id: nextFileCommentId(),
224 kind: "draft",
225 startLine,
226 endLine,
227 text: "",
228 };
229 setLineAnnotations((current) => {
230 const withoutDraft = current.flatMap((annotation) => {
231 const entries = annotation.metadata.entries.filter((entry) => entry.kind !== "draft");
232 return entries.length > 0 ? [{ ...annotation, metadata: { entries } }] : [];
233 });
234 const existingIndex = withoutDraft.findIndex(
235 (annotation) => annotation.lineNumber === endLine,
236 );
237 if (existingIndex < 0) {
238 return [
239 ...withoutDraft,
240 {
241 lineNumber: endLine,
242 metadata: { entries: [draftEntry] },
243 },
244 ];
245 }
246 return withoutDraft.map((annotation, index) =>
247 index === existingIndex
248 ? {
249 ...annotation,
250 metadata: { entries: [...annotation.metadata.entries, draftEntry] },
251 }
252 : annotation,
253 );
254 });
255 }, []);
256 const hasOpenCommentForm = lineAnnotations.some((annotation) =>
257 annotation.metadata.entries.some((entry) => entry.kind === "draft"),
258 );
259 useEffect(() => {
260 const root = surfaceRef.current;
261 if (!root) return;
262 return installFileEditorDismissal({
263 root,
264 editor,
265 isBlocked: () => hasOpenCommentForm,
266 onDismiss: () => setSelectedRange(null),
267 });
268 }, [editor, hasOpenCommentForm]);
269 const handleLineSelectionEnd = useCallback(
270 (range: SelectedLineRange | null) => {
271 setSelectedRange(range);
272 if (range) {
273 beginComment(range);
274 }
275 },
276 [beginComment],
89 );277 );
90278
91 return (279 return (
92 <EditorProvider editor={editor}>280 <EditorProvider editor={editor}>
93 <Virtualizer281 <div ref={surfaceRef} className="flex min-h-0 flex-1">
94 className="file-preview-virtualizer min-h-0 flex-1 overflow-auto"282 <Virtualizer
95 config={{283 className="file-preview-virtualizer min-h-0 flex-1 overflow-auto"
96 overscrollSize: 600,284 config={{
97 intersectionObserverMargin: 1200,285 overscrollSize: 600,
98 }}286 intersectionObserverMargin: 1200,
99 >
100 <File
101 file={{
102 name: relativePath,
103 contents,
104 cacheKey: projectFileCacheKey(cwd, relativePath, contents),
105 }}287 }}
106 options={{288 >
107 disableFileHeader: true,289 <File<FileCommentAnnotationGroup>
108 overflow: "scroll",290 file={{
109 theme: resolveDiffThemeName(resolvedTheme),291 name: relativePath,
110 themeType: resolvedTheme,292 contents,
111 }}293 cacheKey: projectFileCacheKey(cwd, relativePath, contents),
112 className="min-h-full"294 }}
113 contentEditable295 options={{
114 />296 disableFileHeader: true,
115 </Virtualizer>297 enableGutterUtility: !hasOpenCommentForm,
298 enableLineSelection: !hasOpenCommentForm,
299 onGutterUtilityClick: setSelectedRange,
300 onLineSelectionChange: setSelectedRange,
301 onLineSelectionEnd: handleLineSelectionEnd,
302 overflow: "scroll",
303 theme: resolveDiffThemeName(resolvedTheme),
304 themeType: resolvedTheme,
305 }}
306 selectedLines={selectedRange}
307 lineAnnotations={lineAnnotations}
308 renderAnnotation={(annotation) => (
309 <div className="py-1">
310 {annotation.metadata.entries.map((entry) => (
311 <LocalCommentAnnotation
312 key={entry.id}
313 kind={entry.kind}
314 rangeLabel={formatFileCommentRange(entry.startLine, entry.endLine)}
315 text={entry.text}
316 onCancel={() => removeAnnotationEntry(entry.id)}
317 onComment={(text) => submitAnnotationEntry(entry.id, text)}
318 onDelete={() => removeAnnotationEntry(entry.id)}
319 />
320 ))}
321 </div>
322 )}
323 className="min-h-full"
324 contentEditable
325 />
326 </Virtualizer>
327 </div>
116 </EditorProvider>328 </EditorProvider>
117 );329 );
118}330}
119331
332function RenderedMarkdownSurface({
333 environmentId,
334 cwd,
335 relativePath,
336 contents,
337 threadRef,
338 onPendingChange,
339}: Omit<EditableFileSurfaceProps, "resolvedTheme" | "composerDraftTarget"> & {
340 threadRef: ScopedThreadRef;
341}) {
342 const saveCoordinator = useFileSaveCoordinator({
343 environmentId,
344 cwd,
345 relativePath,
346 onPendingChange,
347 });
348
349 return (
350 <ScrollArea className="min-h-0 flex-1">
351 <ChatMarkdown
352 text={contents}
353 cwd={cwd}
354 threadRef={threadRef}
355 className="mx-auto max-w-4xl px-6 py-5"
356 onTaskListChange={({ markerOffset, checked }) => {
357 const currentContents =
358 getOptimisticProjectFileQueryData(environmentId, cwd, relativePath)?.contents ??
359 contents;
360 const nextContents = setMarkdownTaskChecked(currentContents, markerOffset, checked);
361 if (nextContents === currentContents) return;
362 setProjectFileQueryData(environmentId, cwd, relativePath, nextContents);
363 saveCoordinator.change(nextContents);
364 }}
365 />
366 </ScrollArea>
367 );
368}
369
120function initialExplorerOpen(): boolean {370function initialExplorerOpen(): boolean {
121 try {371 try {
122 return window.localStorage.getItem(FILE_EXPLORER_STORAGE_KEY) !== "false";372 return window.localStorage.getItem(FILE_EXPLORER_STORAGE_KEY) !== "false";
...@@ -130,13 +380,24 @@ export default function FilePreviewPanel({...@@ -130,13 +380,24 @@ export default function FilePreviewPanel({
130 cwd,380 cwd,
131 projectName,381 projectName,
132 relativePath,382 relativePath,
383 threadRef,
384 composerDraftTarget,
385 keybindings,
386 availableEditors,
133 onOpenFile,387 onOpenFile,
134 onPendingChange,388 onPendingChange,
135}: FilePreviewPanelProps) {389}: FilePreviewPanelProps) {
136 const { resolvedTheme } = useTheme();390 const { resolvedTheme } = useTheme();
391 const primaryEnvironmentId = usePrimaryEnvironmentId();
137 const file = useProjectFileQuery(environmentId, cwd, relativePath);392 const file = useProjectFileQuery(environmentId, cwd, relativePath);
138 const [explorerOpen, setExplorerOpen] = useState(initialExplorerOpen);393 const [explorerOpen, setExplorerOpen] = useState(initialExplorerOpen);
394 const [renderedMarkdownPath, setRenderedMarkdownPath] = useState<string | null>(null);
139 const breadcrumbRef = useRef<HTMLDivElement>(null);395 const breadcrumbRef = useRef<HTMLDivElement>(null);
396 const isMarkdown = relativePath ? isMarkdownPreviewFile(relativePath) : false;
397 const renderMarkdown = isMarkdown && renderedMarkdownPath === relativePath;
398 const canOpenInBrowser =
399 relativePath !== null && isPreviewSupportedInRuntime() && isBrowserPreviewFile(relativePath);
400 const absolutePath = relativePath ? resolvePathLinkTarget(relativePath, cwd) : null;
140 const breadcrumbs = useMemo(401 const breadcrumbs = useMemo(
141 () => (relativePath ? fileBreadcrumbs(projectName, relativePath) : []),402 () => (relativePath ? fileBreadcrumbs(projectName, relativePath) : []),
142 [projectName, relativePath],403 [projectName, relativePath],
...@@ -159,6 +420,19 @@ export default function FilePreviewPanel({...@@ -159,6 +420,19 @@ export default function FilePreviewPanel({
159 });420 });
160 };421 };
161422
423 const handleOpenInBrowser = () => {
424 if (!absolutePath) return;
425 void openFileInPreview(threadRef, absolutePath).catch((error) => {
426 toastManager.add(
427 stackedThreadToast({
428 type: "error",
429 title: "Unable to open file in browser",
430 description: error instanceof Error ? error.message : "An error occurred.",
431 }),
432 );
433 });
434 };
435
162 return (436 return (
163 <div className="flex min-h-0 flex-1 flex-col overflow-hidden bg-background">437 <div className="flex min-h-0 flex-1 flex-col overflow-hidden bg-background">
164 {relativePath ? (438 {relativePath ? (
...@@ -195,6 +469,57 @@ export default function FilePreviewPanel({...@@ -195,6 +469,57 @@ export default function FilePreviewPanel({
195 ))}469 ))}
196 </div>470 </div>
197 </ScrollArea>471 </ScrollArea>
472 {absolutePath && environmentId === primaryEnvironmentId ? (
473 <OpenInPicker
474 keybindings={keybindings}
475 availableEditors={availableEditors}
476 openInCwd={absolutePath}
477 compact
478 enableShortcut={false}
479 />
480 ) : null}
481 {isMarkdown ? (
482 <Tooltip>
483 <TooltipTrigger
484 render={
485 <Toggle
486 className="shrink-0"
487 pressed={renderMarkdown}
488 onPressedChange={(pressed) =>
489 setRenderedMarkdownPath(pressed ? relativePath : null)
490 }
491 aria-label={renderMarkdown ? "Show markdown source" : "Show rendered markdown"}
492 variant="ghost"
493 size="sm"
494 >
495 {renderMarkdown ? <Code2 className="size-3.5" /> : <Eye className="size-3.5" />}
496 </Toggle>
497 }
498 />
499 <TooltipPopup>
500 {renderMarkdown ? "Show markdown source" : "Show rendered markdown"}
501 </TooltipPopup>
502 </Tooltip>
503 ) : null}
504 {canOpenInBrowser ? (
505 <Tooltip>
506 <TooltipTrigger
507 render={
508 <Toggle
509 className="shrink-0"
510 pressed={false}
511 onPressedChange={handleOpenInBrowser}
512 aria-label="Open file in preview browser"
513 variant="ghost"
514 size="sm"
515 >
516 <Globe2 className="size-3.5" />
517 </Toggle>
518 }
519 />
520 <TooltipPopup>Open file in preview browser</TooltipPopup>
521 </Tooltip>
522 ) : null}
198 <Tooltip>523 <Tooltip>
199 <TooltipTrigger524 <TooltipTrigger
200 render={525 render={
...@@ -237,7 +562,16 @@ export default function FilePreviewPanel({...@@ -237,7 +562,16 @@ export default function FilePreviewPanel({
237 <LoaderCircle className="size-5 animate-spin" />562 <LoaderCircle className="size-5 animate-spin" />
238 </div>563 </div>
239 ) : relativePath && file.data ? (564 ) : relativePath && file.data ? (
240 file.data.truncated ? (565 isMarkdown && renderMarkdown ? (
566 <RenderedMarkdownSurface
567 environmentId={environmentId}
568 cwd={cwd}
569 relativePath={relativePath}
570 threadRef={threadRef}
571 contents={file.data.contents}
572 onPendingChange={onPendingChange}
573 />
574 ) : file.data.truncated ? (
241 <Virtualizer575 <Virtualizer
242 key={`${relativePath}:${resolvedTheme}:${file.data.byteLength}`}576 key={`${relativePath}:${resolvedTheme}:${file.data.byteLength}`}
243 className="file-preview-virtualizer min-h-0 flex-1 overflow-auto"577 className="file-preview-virtualizer min-h-0 flex-1 overflow-auto"
...@@ -267,6 +601,7 @@ export default function FilePreviewPanel({...@@ -267,6 +601,7 @@ export default function FilePreviewPanel({
267 environmentId={environmentId}601 environmentId={environmentId}
268 cwd={cwd}602 cwd={cwd}
269 relativePath={relativePath}603 relativePath={relativePath}
604 composerDraftTarget={composerDraftTarget}
270 contents={file.data.contents}605 contents={file.data.contents}
271 resolvedTheme={resolvedTheme}606 resolvedTheme={resolvedTheme}
272 onPendingChange={onPendingChange}607 onPendingChange={onPendingChange}
apps/web/src/components/files/LocalCommentAnnotation.tsx created+90
...@@ -0,0 +1,90 @@
1import { MessageCircle, Trash2 } from "lucide-react";
2import { useState } from "react";
3
4import { Button } from "~/components/ui/button";
5import { Textarea } from "~/components/ui/textarea";
6
7interface LocalCommentAnnotationProps {
8 kind: "draft" | "comment";
9 rangeLabel: string;
10 text: string;
11 onCancel: () => void;
12 onComment: (text: string) => void;
13 onDelete: () => void;
14}
15
16export function LocalCommentAnnotation({
17 kind,
18 rangeLabel,
19 text: savedText,
20 onCancel,
21 onComment,
22 onDelete,
23}: LocalCommentAnnotationProps) {
24 const [text, setText] = useState("");
25
26 if (kind === "comment") {
27 return (
28 <div
29 data-file-comment-annotation
30 className="mx-3 my-2 rounded-xl border border-border/70 bg-background p-3 shadow-sm"
31 contentEditable={false}
32 onPointerDown={(event) => event.stopPropagation()}
33 >
34 <div className="flex items-center gap-2">
35 <MessageCircle className="size-4 text-muted-foreground" />
36 <span className="text-xs font-medium">Local comment</span>
37 <span className="ml-auto text-[11px] text-muted-foreground">{rangeLabel}</span>
38 <Button variant="ghost" size="icon-xs" aria-label="Delete comment" onClick={onDelete}>
39 <Trash2 className="size-3.5" />
40 </Button>
41 </div>
42 <p className="mt-2 whitespace-pre-wrap text-sm leading-relaxed text-foreground">
43 {savedText}
44 </p>
45 </div>
46 );
47 }
48
49 return (
50 <div
51 data-file-comment-annotation
52 className="mx-3 my-2 rounded-xl border border-border/70 bg-background p-3 shadow-lg"
53 contentEditable={false}
54 onPointerDown={(event) => event.stopPropagation()}
55 >
56 <div className="flex items-center gap-2">
57 <MessageCircle className="size-4 text-muted-foreground" />
58 <span className="text-sm font-medium">Local comment</span>
59 </div>
60 <div className="mt-1 text-xs text-muted-foreground">Comment on lines {rangeLabel}</div>
61 <Textarea
62 autoFocus
63 className="mt-3"
64 size="sm"
65 value={text}
66 placeholder="Request change"
67 aria-label={`Comment on lines ${rangeLabel}`}
68 onChange={(event) => setText(event.target.value)}
69 onKeyDown={(event) => {
70 if (event.key === "Escape") {
71 event.preventDefault();
72 onCancel();
73 }
74 if ((event.metaKey || event.ctrlKey) && event.key === "Enter" && text.trim()) {
75 event.preventDefault();
76 onComment(text.trim());
77 }
78 }}
79 />
80 <div className="mt-3 flex justify-end gap-2">
81 <Button variant="ghost" size="sm" onClick={onCancel}>
82 Cancel
83 </Button>
84 <Button size="sm" disabled={!text.trim()} onClick={() => onComment(text.trim())}>
85 Comment
86 </Button>
87 </div>
88 </div>
89 );
90}
apps/web/src/components/files/fileCommentAnnotations.ts created+54
...@@ -0,0 +1,54 @@
1import type { LineAnnotation, SelectedLineRange } from "@pierre/diffs";
2
3export interface FileCommentAnnotationEntry {
4 id: string;
5 kind: "draft" | "comment";
6 startLine: number;
7 endLine: number;
8 text: string;
9}
10
11export interface FileCommentAnnotationGroup {
12 entries: FileCommentAnnotationEntry[];
13}
14
15export type FileCommentLineAnnotation = LineAnnotation<FileCommentAnnotationGroup>;
16
17let fileCommentSequence = 0;
18
19export function nextFileCommentId(): string {
20 fileCommentSequence += 1;
21 return `file-comment-${Date.now()}-${fileCommentSequence}`;
22}
23
24export function normalizeFileCommentRange(range: SelectedLineRange): {
25 startLine: number;
26 endLine: number;
27} {
28 return {
29 startLine: Math.min(range.start, range.end),
30 endLine: Math.max(range.start, range.end),
31 };
32}
33
34export function formatFileCommentRange(startLine: number, endLine: number): string {
35 return startLine === endLine ? `L${startLine}` : `L${startLine} to L${endLine}`;
36}
37
38export function remapFileCommentAnnotations(
39 annotations: ReadonlyArray<FileCommentLineAnnotation>,
40): FileCommentLineAnnotation[] {
41 return annotations.map((annotation) => ({
42 ...annotation,
43 metadata: {
44 entries: annotation.metadata.entries.map((entry) => {
45 const lineCount = entry.endLine - entry.startLine;
46 return {
47 ...entry,
48 endLine: annotation.lineNumber,
49 startLine: Math.max(1, annotation.lineNumber - lineCount),
50 };
51 }),
52 },
53 }));
54}
apps/web/src/components/files/fileEditorDismissal.ts created+53
...@@ -0,0 +1,53 @@
1interface FileEditorDismissalOptions {
2 root: HTMLElement;
3 editor: {
4 setSelections: (selections: []) => void;
5 };
6 isBlocked: () => boolean;
7 onDismiss: () => void;
8}
9
10function dismissFileEditorInteraction({
11 root,
12 editor,
13 onDismiss,
14}: Pick<FileEditorDismissalOptions, "root" | "editor" | "onDismiss">): void {
15 onDismiss();
16 editor.setSelections([]);
17
18 const file = root.querySelector<HTMLElement>("diffs-container");
19 const activeElement = file?.shadowRoot?.activeElement;
20 if (activeElement instanceof HTMLElement) {
21 activeElement.blur();
22 }
23}
24
25function isFileEditorFocused(root: HTMLElement): boolean {
26 const file = root.querySelector<HTMLElement>("diffs-container");
27 return file?.shadowRoot?.activeElement?.hasAttribute("data-content") === true;
28}
29
30export function installFileEditorDismissal({
31 root,
32 editor,
33 isBlocked,
34 onDismiss,
35}: FileEditorDismissalOptions): () => void {
36 const handlePointerDown = (event: PointerEvent) => {
37 if (isBlocked() || event.composedPath().includes(root)) return;
38 dismissFileEditorInteraction({ root, editor, onDismiss });
39 };
40 const handleKeyDown = (event: KeyboardEvent) => {
41 if (event.key !== "Escape" || isBlocked() || !isFileEditorFocused(root)) return;
42 event.preventDefault();
43 event.stopImmediatePropagation();
44 dismissFileEditorInteraction({ root, editor, onDismiss });
45 };
46
47 document.addEventListener("pointerdown", handlePointerDown, true);
48 document.addEventListener("keydown", handleKeyDown, true);
49 return () => {
50 document.removeEventListener("pointerdown", handlePointerDown, true);
51 document.removeEventListener("keydown", handleKeyDown, true);
52 };
53}
apps/web/src/components/files/filePreviewMode.ts created+18
...@@ -0,0 +1,18 @@
1export const isMarkdownPreviewFile = (path: string): boolean => /\.(?:md|mdx)$/i.test(path);
2
3export function setMarkdownTaskChecked(
4 markdown: string,
5 markerOffset: number,
6 checked: boolean,
7): string {
8 if (
9 markerOffset < 0 ||
10 markdown[markerOffset] !== "[" ||
11 !/[ xX]/.test(markdown[markerOffset + 1] ?? "") ||
12 markdown[markerOffset + 2] !== "]"
13 ) {
14 return markdown;
15 }
16
17 return `${markdown.slice(0, markerOffset + 1)}${checked ? "x" : " "}${markdown.slice(markerOffset + 2)}`;
18}
apps/web/src/components/files/projectFilesQueryState.test.ts+5
...@@ -19,6 +19,7 @@ import {...@@ -19,6 +19,7 @@ import {
19 confirmProjectFileQueryData,19 confirmProjectFileQueryData,
20 getProjectEntriesQueryAtom,20 getProjectEntriesQueryAtom,
21 getProjectFileQueryAtom,21 getProjectFileQueryAtom,
22 getOptimisticProjectFileQueryData,
22 resolveProjectFileQueryData,23 resolveProjectFileQueryData,
23 setProjectFileQueryData,24 setProjectFileQueryData,
24} from "./projectFilesQueryState";25} from "./projectFilesQueryState";
...@@ -104,6 +105,10 @@ describe("project files queries", () => {...@@ -104,6 +105,10 @@ describe("project files queries", () => {
104 setProjectFileQueryData(environmentId, "/repo", "convex.json", '{"nodeVersion":"220"}');105 setProjectFileQueryData(environmentId, "/repo", "convex.json", '{"nodeVersion":"220"}');
105 setProjectFileQueryData(environmentId, "/repo", "convex.json", '{"nodeVersion":"22"}');106 setProjectFileQueryData(environmentId, "/repo", "convex.json", '{"nodeVersion":"22"}');
106107
108 expect(getOptimisticProjectFileQueryData(environmentId, "/repo", "convex.json")?.contents).toBe(
109 '{"nodeVersion":"22"}',
110 );
111
107 expect(112 expect(
108 confirmProjectFileQueryData(environmentId, "/repo", "convex.json", '{"nodeVersion":"220"}'),113 confirmProjectFileQueryData(environmentId, "/repo", "convex.json", '{"nodeVersion":"220"}'),
109 ).toBe(false);114 ).toBe(false);
apps/web/src/components/files/projectFilesQueryState.ts+8
...@@ -121,6 +121,14 @@ export function setProjectFileQueryData(...@@ -121,6 +121,14 @@ export function setProjectFileQueryData(
121 });121 });
122}122}
123123
124export function getOptimisticProjectFileQueryData(
125 environmentId: EnvironmentId,
126 cwd: string,
127 relativePath: string,
128): ProjectReadFileResult | null {
129 return optimisticProjectFiles.get(fileKey(environmentId, cwd, relativePath))?.data ?? null;
130}
131
124export function confirmProjectFileQueryData(132export function confirmProjectFileQueryData(
125 environmentId: EnvironmentId,133 environmentId: EnvironmentId,
126 cwd: string,134 cwd: string,
apps/web/src/composerDraftStore.test.ts+63
...@@ -615,6 +615,69 @@ describe("composerDraftStore element contexts", () => {...@@ -615,6 +615,69 @@ describe("composerDraftStore element contexts", () => {
615 });615 });
616});616});
617617
618describe("composerDraftStore review comments", () => {
619 const threadId = ThreadId.make("thread-review-comment");
620 const threadRef = scopeThreadRef(TEST_ENVIRONMENT_ID, threadId);
621 const comment = {
622 id: "comment-1",
623 sectionId: "file:src/app.ts",
624 sectionTitle: "File comment",
625 filePath: "src/app.ts",
626 startIndex: 1,
627 endIndex: 2,
628 rangeLabel: "L2 to L3",
629 text: "Keep this configurable.",
630 diff: "@@ -2,2 +2,2 @@\n two\n three",
631 } as const;
632
633 beforeEach(() => {
634 resetComposerDraftStore();
635 });
636
637 it("upserts and removes review comments by id", () => {
638 const store = useComposerDraftStore.getState();
639 store.addReviewComment(threadRef, comment);
640 store.addReviewComment(threadRef, { ...comment, text: "Updated comment." });
641
642 expect(draftFor(threadId, TEST_ENVIRONMENT_ID)?.reviewComments).toEqual([
643 { ...comment, text: "Updated comment." },
644 ]);
645
646 store.removeReviewComment(threadRef, comment.id);
647 expect(draftFor(threadId, TEST_ENVIRONMENT_ID)).toBeUndefined();
648 });
649
650 it("persists review comments and clears them with composer content", () => {
651 const store = useComposerDraftStore.getState();
652 store.addReviewComment(threadRef, comment);
653 const persistApi = useComposerDraftStore.persist as unknown as {
654 getOptions: () => {
655 partialize: (state: ReturnType<typeof useComposerDraftStore.getState>) => unknown;
656 };
657 };
658 const persisted = persistApi.getOptions().partialize(useComposerDraftStore.getState()) as {
659 draftsByThreadKey?: Record<string, { reviewComments?: Array<Record<string, unknown>> }>;
660 };
661
662 expect(
663 persisted.draftsByThreadKey?.[threadKeyFor(threadId, TEST_ENVIRONMENT_ID)]
664 ?.reviewComments?.[0],
665 ).toMatchObject(comment);
666
667 store.clearComposerContent(threadRef);
668 expect(draftFor(threadId, TEST_ENVIRONMENT_ID)).toBeUndefined();
669 });
670
671 it("stores review comments against a new-thread draft id", () => {
672 const draftId = DraftId.make("draft-review-comment");
673 useComposerDraftStore.getState().addReviewComment(draftId, comment);
674
675 expect(useComposerDraftStore.getState().getComposerDraft(draftId)?.reviewComments).toEqual([
676 comment,
677 ]);
678 });
679});
680
618describe("composerDraftStore project draft thread mapping", () => {681describe("composerDraftStore project draft thread mapping", () => {
619 const projectId = ProjectId.make("project-a");682 const projectId = ProjectId.make("project-a");
620 const otherProjectId = ProjectId.make("project-b");683 const otherProjectId = ProjectId.make("project-b");
apps/web/src/composerDraftStore.ts+78-1
...@@ -50,11 +50,13 @@ import { useShallow } from "zustand/react/shallow";...@@ -50,11 +50,13 @@ import { useShallow } from "zustand/react/shallow";
50import { createDebouncedStorage, createMemoryStorage } from "./lib/storage";50import { createDebouncedStorage, createMemoryStorage } from "./lib/storage";
51import { getDefaultServerModel } from "./providerModels";51import { getDefaultServerModel } from "./providerModels";
52import { UnifiedSettings } from "@t3tools/contracts/settings";52import { UnifiedSettings } from "@t3tools/contracts/settings";
53import { ReviewCommentContextSchema, type ReviewCommentContext } from "./reviewCommentContext";
53const isRuntimeMode = Schema.is(RuntimeMode);54const isRuntimeMode = Schema.is(RuntimeMode);
54const isProviderDriverKind = Schema.is(ProviderDriverKind);55const isProviderDriverKind = Schema.is(ProviderDriverKind);
56const isReviewCommentContext = Schema.is(ReviewCommentContextSchema);
5557
56export const COMPOSER_DRAFT_STORAGE_KEY = "t3code:composer-drafts:v1";58export const COMPOSER_DRAFT_STORAGE_KEY = "t3code:composer-drafts:v1";
57const COMPOSER_DRAFT_STORAGE_VERSION = 7;59const COMPOSER_DRAFT_STORAGE_VERSION = 8;
58const DraftThreadEnvModeSchema = Schema.Literals(["local", "worktree"]);60const DraftThreadEnvModeSchema = Schema.Literals(["local", "worktree"]);
59export type DraftThreadEnvMode = typeof DraftThreadEnvModeSchema.Type;61export type DraftThreadEnvMode = typeof DraftThreadEnvModeSchema.Type;
6062
...@@ -128,6 +130,7 @@ const PersistedComposerThreadDraftState = Schema.Struct({...@@ -128,6 +130,7 @@ const PersistedComposerThreadDraftState = Schema.Struct({
128 terminalContexts: Schema.optionalKey(Schema.Array(PersistedTerminalContextDraft)),130 terminalContexts: Schema.optionalKey(Schema.Array(PersistedTerminalContextDraft)),
129 elementContexts: Schema.optionalKey(Schema.Array(PersistedElementContextDraft)),131 elementContexts: Schema.optionalKey(Schema.Array(PersistedElementContextDraft)),
130 previewAnnotations: Schema.optionalKey(Schema.Array(PreviewAnnotationPayloadSchema)),132 previewAnnotations: Schema.optionalKey(Schema.Array(PreviewAnnotationPayloadSchema)),
133 reviewComments: Schema.optionalKey(Schema.Array(ReviewCommentContextSchema)),
131 // Keyed by `ProviderInstanceId` (open branded slug) so custom provider134 // Keyed by `ProviderInstanceId` (open branded slug) so custom provider
132 // instances (e.g. `codex_personal`) round-trip alongside the built-in135 // instances (e.g. `codex_personal`) round-trip alongside the built-in
133 // `codex` / `claudeAgent` / ... entries. Every prior `ProviderDriverKind`136 // `codex` / `claudeAgent` / ... entries. Every prior `ProviderDriverKind`
...@@ -256,6 +259,7 @@ export interface ComposerThreadDraftState {...@@ -256,6 +259,7 @@ export interface ComposerThreadDraftState {
256 */259 */
257 elementContexts: ElementContextDraft[];260 elementContexts: ElementContextDraft[];
258 previewAnnotations: PreviewAnnotationPayload[];261 previewAnnotations: PreviewAnnotationPayload[];
262 reviewComments: ReviewCommentContext[];
259 /**263 /**
260 * Per-instance model selection. Keyed by `ProviderInstanceId` (open264 * Per-instance model selection. Keyed by `ProviderInstanceId` (open
261 * branded slug) so a default `codex` instance and a user-authored265 * branded slug) so a default `codex` instance and a user-authored
...@@ -464,6 +468,12 @@ interface ComposerDraftStoreState {...@@ -464,6 +468,12 @@ interface ComposerDraftStoreState {
464 annotations: ReadonlyArray<PreviewAnnotationPayload>,468 annotations: ReadonlyArray<PreviewAnnotationPayload>,
465 ) => void;469 ) => void;
466 removePreviewAnnotation: (threadRef: ComposerThreadTarget, annotationId: string) => void;470 removePreviewAnnotation: (threadRef: ComposerThreadTarget, annotationId: string) => void;
471 addReviewComment: (threadRef: ComposerThreadTarget, comment: ReviewCommentContext) => void;
472 setReviewComments: (
473 threadRef: ComposerThreadTarget,
474 comments: ReadonlyArray<ReviewCommentContext>,
475 ) => void;
476 removeReviewComment: (threadRef: ComposerThreadTarget, commentId: string) => void;
467 clearPersistedAttachments: (threadRef: ComposerThreadTarget) => void;477 clearPersistedAttachments: (threadRef: ComposerThreadTarget) => void;
468 syncPersistedAttachments: (478 syncPersistedAttachments: (
469 threadRef: ComposerThreadTarget,479 threadRef: ComposerThreadTarget,
...@@ -541,11 +551,13 @@ const EMPTY_PERSISTED_ATTACHMENTS: PersistedComposerImageAttachment[] = [];...@@ -541,11 +551,13 @@ const EMPTY_PERSISTED_ATTACHMENTS: PersistedComposerImageAttachment[] = [];
541const EMPTY_TERMINAL_CONTEXTS: TerminalContextDraft[] = [];551const EMPTY_TERMINAL_CONTEXTS: TerminalContextDraft[] = [];
542const EMPTY_ELEMENT_CONTEXTS: ElementContextDraft[] = [];552const EMPTY_ELEMENT_CONTEXTS: ElementContextDraft[] = [];
543const EMPTY_PREVIEW_ANNOTATIONS: PreviewAnnotationPayload[] = [];553const EMPTY_PREVIEW_ANNOTATIONS: PreviewAnnotationPayload[] = [];
554const EMPTY_REVIEW_COMMENTS: ReviewCommentContext[] = [];
544Object.freeze(EMPTY_IMAGES);555Object.freeze(EMPTY_IMAGES);
545Object.freeze(EMPTY_IDS);556Object.freeze(EMPTY_IDS);
546Object.freeze(EMPTY_PERSISTED_ATTACHMENTS);557Object.freeze(EMPTY_PERSISTED_ATTACHMENTS);
547Object.freeze(EMPTY_ELEMENT_CONTEXTS);558Object.freeze(EMPTY_ELEMENT_CONTEXTS);
548Object.freeze(EMPTY_PREVIEW_ANNOTATIONS);559Object.freeze(EMPTY_PREVIEW_ANNOTATIONS);
560Object.freeze(EMPTY_REVIEW_COMMENTS);
549const EMPTY_MODEL_SELECTION_BY_PROVIDER: Partial<Record<ProviderDriverKind, ModelSelection>> =561const EMPTY_MODEL_SELECTION_BY_PROVIDER: Partial<Record<ProviderDriverKind, ModelSelection>> =
550 Object.freeze({});562 Object.freeze({});
551const EMPTY_COMPOSER_DRAFT_MODEL_STATE = Object.freeze<ComposerDraftModelState>({563const EMPTY_COMPOSER_DRAFT_MODEL_STATE = Object.freeze<ComposerDraftModelState>({
...@@ -561,6 +573,7 @@ const EMPTY_THREAD_DRAFT = Object.freeze<ComposerThreadDraftState>({...@@ -561,6 +573,7 @@ const EMPTY_THREAD_DRAFT = Object.freeze<ComposerThreadDraftState>({
561 terminalContexts: EMPTY_TERMINAL_CONTEXTS,573 terminalContexts: EMPTY_TERMINAL_CONTEXTS,
562 elementContexts: EMPTY_ELEMENT_CONTEXTS,574 elementContexts: EMPTY_ELEMENT_CONTEXTS,
563 previewAnnotations: EMPTY_PREVIEW_ANNOTATIONS,575 previewAnnotations: EMPTY_PREVIEW_ANNOTATIONS,
576 reviewComments: EMPTY_REVIEW_COMMENTS,
564 modelSelectionByProvider: EMPTY_MODEL_SELECTION_BY_PROVIDER,577 modelSelectionByProvider: EMPTY_MODEL_SELECTION_BY_PROVIDER,
565 activeProvider: null,578 activeProvider: null,
566 runtimeMode: null,579 runtimeMode: null,
...@@ -582,6 +595,7 @@ export function createEmptyThreadDraft(): ComposerThreadDraftState {...@@ -582,6 +595,7 @@ export function createEmptyThreadDraft(): ComposerThreadDraftState {
582 terminalContexts: [],595 terminalContexts: [],
583 elementContexts: [],596 elementContexts: [],
584 previewAnnotations: [],597 previewAnnotations: [],
598 reviewComments: [],
585 modelSelectionByProvider: {},599 modelSelectionByProvider: {},
586 activeProvider: null,600 activeProvider: null,
587 runtimeMode: null,601 runtimeMode: null,
...@@ -654,6 +668,7 @@ function shouldRemoveDraft(draft: ComposerThreadDraftState): boolean {...@@ -654,6 +668,7 @@ function shouldRemoveDraft(draft: ComposerThreadDraftState): boolean {
654 draft.terminalContexts.length === 0 &&668 draft.terminalContexts.length === 0 &&
655 draft.elementContexts.length === 0 &&669 draft.elementContexts.length === 0 &&
656 draft.previewAnnotations.length === 0 &&670 draft.previewAnnotations.length === 0 &&
671 draft.reviewComments.length === 0 &&
657 Object.keys(draft.modelSelectionByProvider).length === 0 &&672 Object.keys(draft.modelSelectionByProvider).length === 0 &&
658 draft.activeProvider === null &&673 draft.activeProvider === null &&
659 draft.runtimeMode === null &&674 draft.runtimeMode === null &&
...@@ -1624,6 +1639,9 @@ function normalizePersistedDraftsByThreadId(...@@ -1624,6 +1639,9 @@ function normalizePersistedDraftsByThreadId(
1624 return normalized ? [normalized] : [];1639 return normalized ? [normalized] : [];
1625 })1640 })
1626 : [];1641 : [];
1642 const reviewComments = Array.isArray(draftCandidate.reviewComments)
1643 ? draftCandidate.reviewComments.filter(isReviewCommentContext)
1644 : [];
1627 const runtimeMode = isRuntimeMode(draftCandidate.runtimeMode)1645 const runtimeMode = isRuntimeMode(draftCandidate.runtimeMode)
1628 ? draftCandidate.runtimeMode1646 ? draftCandidate.runtimeMode
1629 : null;1647 : null;
...@@ -1688,6 +1706,7 @@ function normalizePersistedDraftsByThreadId(...@@ -1688,6 +1706,7 @@ function normalizePersistedDraftsByThreadId(
1688 attachments.length === 0 &&1706 attachments.length === 0 &&
1689 terminalContexts.length === 0 &&1707 terminalContexts.length === 0 &&
1690 elementContexts.length === 0 &&1708 elementContexts.length === 0 &&
1709 reviewComments.length === 0 &&
1691 !hasModelData &&1710 !hasModelData &&
1692 !runtimeMode &&1711 !runtimeMode &&
1693 !interactionMode1712 !interactionMode
...@@ -1711,6 +1730,7 @@ function normalizePersistedDraftsByThreadId(...@@ -1711,6 +1730,7 @@ function normalizePersistedDraftsByThreadId(
1711 attachments,1730 attachments,
1712 ...(terminalContexts.length > 0 ? { terminalContexts } : {}),1731 ...(terminalContexts.length > 0 ? { terminalContexts } : {}),
1713 ...(elementContexts.length > 0 ? { elementContexts } : {}),1732 ...(elementContexts.length > 0 ? { elementContexts } : {}),
1733 ...(reviewComments.length > 0 ? { reviewComments } : {}),
1714 ...(hasModelData1734 ...(hasModelData
1715 ? {1735 ? {
1716 modelSelectionByProvider: compactModelSelectionByProvider(modelSelectionByProvider),1736 modelSelectionByProvider: compactModelSelectionByProvider(modelSelectionByProvider),
...@@ -1795,6 +1815,7 @@ function partializeComposerDraftStoreState(...@@ -1795,6 +1815,7 @@ function partializeComposerDraftStoreState(
1795 draft.terminalContexts.length === 0 &&1815 draft.terminalContexts.length === 0 &&
1796 draft.elementContexts.length === 0 &&1816 draft.elementContexts.length === 0 &&
1797 draft.previewAnnotations.length === 0 &&1817 draft.previewAnnotations.length === 0 &&
1818 draft.reviewComments.length === 0 &&
1798 !hasModelData &&1819 !hasModelData &&
1799 draft.runtimeMode === null &&1820 draft.runtimeMode === null &&
1800 draft.interactionMode === null1821 draft.interactionMode === null
...@@ -1841,6 +1862,11 @@ function partializeComposerDraftStoreState(...@@ -1841,6 +1862,11 @@ function partializeComposerDraftStoreState(
1841 ),1862 ),
1842 }1863 }
1843 : {}),1864 : {}),
1865 ...(draft.reviewComments.length > 0
1866 ? {
1867 reviewComments: draft.reviewComments.map((comment) => ({ ...comment })),
1868 }
1869 : {}),
1844 ...(hasModelData1870 ...(hasModelData
1845 ? {1871 ? {
1846 modelSelectionByProvider: compactModelSelectionByProvider(1872 modelSelectionByProvider: compactModelSelectionByProvider(
...@@ -2083,6 +2109,7 @@ function toHydratedThreadDraft(...@@ -2083,6 +2109,7 @@ function toHydratedThreadDraft(
2083 })) ?? [],2109 })) ?? [],
2084 previewAnnotations:2110 previewAnnotations:
2085 persistedDraft.previewAnnotations?.map((annotation) => ({ ...annotation })) ?? [],2111 persistedDraft.previewAnnotations?.map((annotation) => ({ ...annotation })) ?? [],
2112 reviewComments: persistedDraft.reviewComments?.map((comment) => ({ ...comment })) ?? [],
2086 modelSelectionByProvider,2113 modelSelectionByProvider,
2087 activeProvider,2114 activeProvider,
2088 runtimeMode: persistedDraft.runtimeMode ?? null,2115 runtimeMode: persistedDraft.runtimeMode ?? null,
...@@ -3148,6 +3175,55 @@ const composerDraftStore = create<ComposerDraftStoreState>()(...@@ -3148,6 +3175,55 @@ const composerDraftStore = create<ComposerDraftStoreState>()(
3148 return { draftsByThreadKey: nextDraftsByThreadKey };3175 return { draftsByThreadKey: nextDraftsByThreadKey };
3149 });3176 });
3150 },3177 },
3178 addReviewComment: (threadRef, comment) => {
3179 const threadKey = resolveComposerDraftKey(get(), threadRef);
3180 if (!threadKey || !isReviewCommentContext(comment)) return;
3181 set((state) => {
3182 const existing = state.draftsByThreadKey[threadKey] ?? createEmptyThreadDraft();
3183 const reviewComments = existing.reviewComments.filter(
3184 (entry) => entry.id !== comment.id,
3185 );
3186 return {
3187 draftsByThreadKey: {
3188 ...state.draftsByThreadKey,
3189 [threadKey]: {
3190 ...existing,
3191 reviewComments: [...reviewComments, { ...comment }],
3192 },
3193 },
3194 };
3195 });
3196 },
3197 setReviewComments: (threadRef, comments) => {
3198 const threadKey = resolveComposerDraftKey(get(), threadRef);
3199 if (!threadKey) return;
3200 const reviewComments = comments
3201 .filter(isReviewCommentContext)
3202 .map((comment) => ({ ...comment }));
3203 set((state) => {
3204 const existing = state.draftsByThreadKey[threadKey] ?? createEmptyThreadDraft();
3205 const nextDraft = { ...existing, reviewComments };
3206 const nextDraftsByThreadKey = { ...state.draftsByThreadKey };
3207 if (shouldRemoveDraft(nextDraft)) delete nextDraftsByThreadKey[threadKey];
3208 else nextDraftsByThreadKey[threadKey] = nextDraft;
3209 return { draftsByThreadKey: nextDraftsByThreadKey };
3210 });
3211 },
3212 removeReviewComment: (threadRef, commentId) => {
3213 const threadKey = resolveComposerDraftKey(get(), threadRef);
3214 if (!threadKey || !commentId) return;
3215 set((state) => {
3216 const current = state.draftsByThreadKey[threadKey];
3217 if (!current) return state;
3218 const reviewComments = current.reviewComments.filter((entry) => entry.id !== commentId);
3219 if (reviewComments.length === current.reviewComments.length) return state;
3220 const nextDraft = { ...current, reviewComments };
3221 const nextDraftsByThreadKey = { ...state.draftsByThreadKey };
3222 if (shouldRemoveDraft(nextDraft)) delete nextDraftsByThreadKey[threadKey];
3223 else nextDraftsByThreadKey[threadKey] = nextDraft;
3224 return { draftsByThreadKey: nextDraftsByThreadKey };
3225 });
3226 },
3151 clearPersistedAttachments: (threadRef) => {3227 clearPersistedAttachments: (threadRef) => {
3152 const threadKey = resolveComposerDraftKey(get(), threadRef) ?? "";3228 const threadKey = resolveComposerDraftKey(get(), threadRef) ?? "";
3153 if (threadKey.length === 0) {3229 if (threadKey.length === 0) {
...@@ -3222,6 +3298,7 @@ const composerDraftStore = create<ComposerDraftStoreState>()(...@@ -3222,6 +3298,7 @@ const composerDraftStore = create<ComposerDraftStoreState>()(
3222 terminalContexts: [],3298 terminalContexts: [],
3223 elementContexts: [],3299 elementContexts: [],
3224 previewAnnotations: [],3300 previewAnnotations: [],
3301 reviewComments: [],
3225 };3302 };
3226 const nextDraftsByThreadKey = { ...state.draftsByThreadKey };3303 const nextDraftsByThreadKey = { ...state.draftsByThreadKey };
3227 if (shouldRemoveDraft(nextDraft)) {3304 if (shouldRemoveDraft(nextDraft)) {
apps/web/src/reviewCommentContext.test.ts+198
...@@ -1,8 +1,15 @@...@@ -1,8 +1,15 @@
1import { parsePatchFiles } from "@pierre/diffs/utils/parsePatchFiles";
1import { describe, expect, it } from "vite-plus/test";2import { describe, expect, it } from "vite-plus/test";
23
3import {4import {
5 appendReviewCommentsToPrompt,
6 buildDiffReviewComment,
7 buildFileReviewComment,
4 buildReviewCommentRenderablePatch,8 buildReviewCommentRenderablePatch,
9 formatReviewCommentContext,
10 inferReviewCommentFenceLanguage,
5 parseReviewCommentMessageSegments,11 parseReviewCommentMessageSegments,
12 restoreDiffReviewCommentRange,
6} from "./reviewCommentContext";13} from "./reviewCommentContext";
714
8describe("review comment context parsing", () => {15describe("review comment context parsing", () => {
...@@ -74,4 +81,195 @@ describe("review comment context parsing", () => {...@@ -74,4 +81,195 @@ describe("review comment context parsing", () => {
74 ].join("\n"),81 ].join("\n"),
75 );82 );
76 });83 });
84
85 it("formats editable file comments with the mobile review-comment contract", () => {
86 const comment = buildFileReviewComment({
87 id: "comment-1",
88 filePath: "src/app.ts",
89 startLine: 2,
90 endLine: 3,
91 text: "Keep this configurable.",
92 contents: ["one", "two", "three", "four"].join("\n"),
93 });
94 const prompt = appendReviewCommentsToPrompt("Please update this.", [comment]);
95 const segments = parseReviewCommentMessageSegments(prompt);
96
97 expect(segments).toHaveLength(2);
98 expect(segments[1]).toEqual(
99 expect.objectContaining({
100 kind: "review-comment",
101 comment: expect.objectContaining({
102 filePath: "src/app.ts",
103 startIndex: 1,
104 endIndex: 2,
105 rangeLabel: "L2 to L3",
106 text: "Keep this configurable.",
107 diff: "two\nthree",
108 fenceLanguage: "ts",
109 }),
110 }),
111 );
112 expect(prompt).toContain("```ts\ntwo\nthree\n```");
113 });
114
115 it("formats mixed diff-side selections with the mobile review-comment contract", () => {
116 const [fileDiff] = parsePatchFiles(
117 [
118 "diff --git a/src/app.ts b/src/app.ts",
119 "--- a/src/app.ts",
120 "+++ b/src/app.ts",
121 "@@ -1,4 +1,4 @@",
122 " one",
123 "-two",
124 "+TWO",
125 " three",
126 " four",
127 ].join("\n"),
128 "review-comment-test",
129 )[0]!.files;
130
131 const comment = buildDiffReviewComment({
132 id: "comment-2",
133 sectionId: "turn:2",
134 sectionTitle: "Turn 2",
135 filePath: "src/app.ts",
136 fileDiff: fileDiff!,
137 range: {
138 start: 2,
139 side: "deletions",
140 end: 2,
141 endSide: "additions",
142 },
143 text: "Keep this compatible.",
144 });
145
146 expect(comment).toEqual(
147 expect.objectContaining({
148 sectionId: "turn:2",
149 sectionTitle: "Turn 2",
150 filePath: "src/app.ts",
151 startIndex: 1,
152 endIndex: 2,
153 rangeLabel: "2",
154 text: "Keep this compatible.",
155 diff: "@@ -2,1 +2,1 @@\n-two\n+TWO",
156 fenceLanguage: "diff",
157 }),
158 );
159 });
160
161 it("uses file extensions for source comments and preserves nested markdown fences", () => {
162 expect(inferReviewCommentFenceLanguage("docs/plan.md")).toBe("md");
163 expect(inferReviewCommentFenceLanguage("src/view.tsx")).toBe("tsx");
164
165 const serialized = formatReviewCommentContext({
166 id: "comment-3",
167 sectionId: "file:docs/plan.md",
168 sectionTitle: "File comment",
169 filePath: "docs/plan.md",
170 startIndex: 0,
171 endIndex: 2,
172 rangeLabel: "L1 to L3",
173 text: "Update this example.",
174 diff: ["# Example", "```ts", "const value = 1;", "```"].join("\n"),
175 fenceLanguage: "md",
176 });
177 const [segment] = parseReviewCommentMessageSegments(serialized);
178
179 expect(serialized).toContain("````md");
180 expect(segment).toEqual(
181 expect.objectContaining({
182 kind: "review-comment",
183 comment: expect.objectContaining({
184 fenceLanguage: "md",
185 diff: ["# Example", "```ts", "const value = 1;", "```"].join("\n"),
186 }),
187 }),
188 );
189 });
190
191 it("round-trips greater-than signs in attributes", () => {
192 const serialized = formatReviewCommentContext({
193 id: "comment-4",
194 sectionId: "turn:4",
195 sectionTitle: "Changes > 5",
196 filePath: "src/app.ts",
197 startIndex: 0,
198 endIndex: 0,
199 rangeLabel: "+1",
200 text: "Check this.",
201 diff: "@@ -0,0 +1,1 @@\n+one",
202 fenceLanguage: "diff",
203 });
204 const [segment] = parseReviewCommentMessageSegments(serialized);
205
206 expect(serialized).toContain('sectionTitle="Changes &gt; 5"');
207 expect(segment).toEqual(
208 expect.objectContaining({
209 kind: "review-comment",
210 comment: expect.objectContaining({ sectionTitle: "Changes > 5" }),
211 }),
212 );
213 });
214
215 it("keeps fenced examples in comment text separate from the final context fence", () => {
216 const text = ["Try this:", "```ts", "const value = 1;", "```", "Then retry."].join("\n");
217 const serialized = formatReviewCommentContext({
218 id: "comment-5",
219 sectionId: "turn:5",
220 sectionTitle: "Turn 5",
221 filePath: "src/app.ts",
222 startIndex: 0,
223 endIndex: 0,
224 rangeLabel: "+1",
225 text,
226 diff: "@@ -0,0 +1,1 @@\n+one",
227 fenceLanguage: "diff",
228 });
229 const [segment] = parseReviewCommentMessageSegments(serialized);
230
231 expect(segment).toEqual(
232 expect.objectContaining({
233 kind: "review-comment",
234 comment: expect.objectContaining({
235 text,
236 diff: "@@ -0,0 +1,1 @@\n+one",
237 fenceLanguage: "diff",
238 }),
239 }),
240 );
241 });
242
243 it("restores Pierre line selections from persisted diff comment row indexes", () => {
244 const fileDiff = parsePatchFiles(
245 [
246 "diff --git a/src/app.ts b/src/app.ts",
247 "--- a/src/app.ts",
248 "+++ b/src/app.ts",
249 "@@ -1,3 +1,3 @@",
250 " one",
251 "-two",
252 "+TWO",
253 " three",
254 ].join("\n"),
255 "restore-review-comment-range",
256 )[0]!.files[0]!;
257 const comment = buildDiffReviewComment({
258 id: "comment-6",
259 sectionId: "turn:6",
260 sectionTitle: "Turn 6",
261 filePath: "src/app.ts",
262 fileDiff,
263 range: { start: 2, side: "deletions", end: 2, endSide: "additions" },
264 text: "Keep both sides.",
265 });
266
267 expect(comment).not.toBeNull();
268 expect(restoreDiffReviewCommentRange(fileDiff, comment!)).toEqual({
269 start: 2,
270 side: "deletions",
271 end: 2,
272 endSide: "additions",
273 });
274 });
77});275});
apps/web/src/reviewCommentContext.ts+316-11
...@@ -1,3 +1,19 @@...@@ -1,3 +1,19 @@
1import type { FileDiffMetadata, SelectedLineRange, SelectionSide } from "@pierre/diffs";
2import * as Schema from "effect/Schema";
3
4export const ReviewCommentContextSchema = Schema.Struct({
5 id: Schema.String,
6 sectionId: Schema.String,
7 sectionTitle: Schema.String,
8 filePath: Schema.String,
9 startIndex: Schema.Number,
10 endIndex: Schema.Number,
11 rangeLabel: Schema.String,
12 text: Schema.String,
13 diff: Schema.String,
14 fenceLanguage: Schema.optional(Schema.String),
15});
16
1export interface ReviewCommentContext {17export interface ReviewCommentContext {
2 readonly id: string;18 readonly id: string;
3 readonly sectionId: string;19 readonly sectionId: string;
...@@ -8,6 +24,14 @@ export interface ReviewCommentContext {...@@ -8,6 +24,14 @@ export interface ReviewCommentContext {
8 readonly rangeLabel: string;24 readonly rangeLabel: string;
9 readonly text: string;25 readonly text: string;
10 readonly diff: string;26 readonly diff: string;
27 readonly fenceLanguage?: string | undefined;
28}
29
30interface DiffReviewLine {
31 readonly change: "context" | "add" | "delete";
32 readonly oldLineNumber: number | null;
33 readonly newLineNumber: number | null;
34 readonly content: string;
11}35}
1236
13export type ReviewCommentMessageSegment =37export type ReviewCommentMessageSegment =
...@@ -23,11 +47,20 @@ export type ReviewCommentMessageSegment =...@@ -23,11 +47,20 @@ export type ReviewCommentMessageSegment =
2347
24const REVIEW_COMMENT_BLOCK_PATTERN = /<review_comment\b([^>]*)>\s*([\s\S]*?)<\/review_comment>/g;48const REVIEW_COMMENT_BLOCK_PATTERN = /<review_comment\b([^>]*)>\s*([\s\S]*?)<\/review_comment>/g;
25const REVIEW_COMMENT_ATTRIBUTE_PATTERN = /([a-zA-Z][a-zA-Z0-9_-]*)="([^"]*)"/g;49const REVIEW_COMMENT_ATTRIBUTE_PATTERN = /([a-zA-Z][a-zA-Z0-9_-]*)="([^"]*)"/g;
26const REVIEW_COMMENT_DIFF_FENCE_PATTERN = /```diff\s*\n([\s\S]*?)\n```/;50const REVIEW_COMMENT_FENCE_PATTERN = /(`{3,})([^\s`]*)[^\n]*\n([\s\S]*?)\n\1/g;
51
52function escapeReviewCommentAttribute(value: string): string {
53 return value
54 .replace(/&/g, "&amp;")
55 .replace(/"/g, "&quot;")
56 .replace(/</g, "&lt;")
57 .replace(/>/g, "&gt;");
58}
2759
28function unescapeReviewCommentAttribute(value: string): string {60function unescapeReviewCommentAttribute(value: string): string {
29 return value61 return value
30 .replace(/&lt;/g, "<")62 .replace(/&lt;/g, "<")
63 .replace(/&gt;/g, ">")
31 .replace(/&quot;/g, '"')64 .replace(/&quot;/g, '"')
32 .replace(/&amp;/g, "&");65 .replace(/&amp;/g, "&");
33}66}
...@@ -47,14 +80,19 @@ function readNonNegativeInteger(value: string | undefined): number | null {...@@ -47,14 +80,19 @@ function readNonNegativeInteger(value: string | undefined): number | null {
47 return Number(value);80 return Number(value);
48}81}
4982
50function extractReviewCommentText(rawBody: string): string {83function extractReviewCommentBody(rawBody: string): {
51 const fenceIndex = rawBody.indexOf("```diff");84 text: string;
52 const commentBody = fenceIndex >= 0 ? rawBody.slice(0, fenceIndex) : rawBody;85 language: string;
53 return commentBody.trim();86 contents: string;
54}87} {
5588 const matches = Array.from(rawBody.matchAll(REVIEW_COMMENT_FENCE_PATTERN));
56function extractReviewCommentDiff(rawBody: string): string {89 const match = matches.at(-1);
57 return rawBody.match(REVIEW_COMMENT_DIFF_FENCE_PATTERN)?.[1]?.trim() ?? "";90 const fenceIndex = match?.index;
91 return {
92 text: rawBody.slice(0, fenceIndex ?? rawBody.length).trim(),
93 language: match?.[2]?.trim() || "diff",
94 contents: match?.[3] ?? "",
95 };
58}96}
5997
60function parseReviewCommentContext(98function parseReviewCommentContext(
...@@ -70,6 +108,7 @@ function parseReviewCommentContext(...@@ -70,6 +108,7 @@ function parseReviewCommentContext(
70 if (!filePath || !sectionId || startIndex === null || endIndex === null) {108 if (!filePath || !sectionId || startIndex === null || endIndex === null) {
71 return null;109 return null;
72 }110 }
111 const body = extractReviewCommentBody(rawBody);
73112
74 return {113 return {
75 id: `review-comment:${index}:${sectionId}:${filePath}:${startIndex}:${endIndex}`,114 id: `review-comment:${index}:${sectionId}:${filePath}:${startIndex}:${endIndex}`,
...@@ -79,8 +118,9 @@ function parseReviewCommentContext(...@@ -79,8 +118,9 @@ function parseReviewCommentContext(
79 startIndex: Math.min(startIndex, endIndex),118 startIndex: Math.min(startIndex, endIndex),
80 endIndex: Math.max(startIndex, endIndex),119 endIndex: Math.max(startIndex, endIndex),
81 rangeLabel: attributes.rangeLabel?.trim() || "line",120 rangeLabel: attributes.rangeLabel?.trim() || "line",
82 text: extractReviewCommentText(rawBody),121 text: body.text,
83 diff: extractReviewCommentDiff(rawBody),122 diff: body.contents,
123 fenceLanguage: body.language,
84 };124 };
85}125}
86126
...@@ -135,7 +175,272 @@ export function hasReviewCommentMessageSegments(value: string): boolean {...@@ -135,7 +175,272 @@ export function hasReviewCommentMessageSegments(value: string): boolean {
135 );175 );
136}176}
137177
178export function formatReviewCommentFence(language: string, contents: string): string {
179 const longestBacktickRun = Math.max(
180 0,
181 ...Array.from(contents.matchAll(/`+/g), (match) => match[0].length),
182 );
183 const fence = "`".repeat(Math.max(3, longestBacktickRun + 1));
184 return [`${fence}${language}`, contents.trimEnd(), fence].join("\n");
185}
186
187export function formatReviewCommentContext(comment: ReviewCommentContext): string {
188 return [
189 [
190 "<review_comment",
191 ` sectionId="${escapeReviewCommentAttribute(comment.sectionId)}"`,
192 ` sectionTitle="${escapeReviewCommentAttribute(comment.sectionTitle)}"`,
193 ` filePath="${escapeReviewCommentAttribute(comment.filePath)}"`,
194 ` startIndex="${comment.startIndex}"`,
195 ` endIndex="${comment.endIndex}"`,
196 ` rangeLabel="${escapeReviewCommentAttribute(comment.rangeLabel)}"`,
197 ">",
198 ].join(""),
199 comment.text.trim(),
200 formatReviewCommentFence(comment.fenceLanguage ?? "diff", comment.diff),
201 "</review_comment>",
202 ].join("\n");
203}
204
205export function appendReviewCommentsToPrompt(
206 prompt: string,
207 comments: ReadonlyArray<ReviewCommentContext>,
208): string {
209 const blocks = comments.map(formatReviewCommentContext);
210 if (blocks.length === 0) return prompt;
211 const trimmedPrompt = prompt.trim();
212 return trimmedPrompt.length > 0
213 ? `${trimmedPrompt}\n\n${blocks.join("\n\n")}`
214 : blocks.join("\n\n");
215}
216
217export function buildFileReviewComment(input: {
218 id: string;
219 filePath: string;
220 startLine: number;
221 endLine: number;
222 text: string;
223 contents: string;
224}): ReviewCommentContext {
225 const startLine = Math.max(1, Math.min(input.startLine, input.endLine));
226 const endLine = Math.max(startLine, Math.max(input.startLine, input.endLine));
227 const selectedLines = input.contents.split("\n").slice(startLine - 1, endLine);
228 return {
229 id: input.id,
230 sectionId: `file:${input.filePath}`,
231 sectionTitle: "File comment",
232 filePath: input.filePath,
233 startIndex: startLine - 1,
234 endIndex: endLine - 1,
235 rangeLabel: startLine === endLine ? `L${startLine}` : `L${startLine} to L${endLine}`,
236 text: input.text.trim(),
237 diff: selectedLines.join("\n"),
238 fenceLanguage: inferReviewCommentFenceLanguage(input.filePath),
239 };
240}
241
242export function inferReviewCommentFenceLanguage(filePath: string): string {
243 const normalizedPath = filePath.replaceAll("\\", "/");
244 const fileName = normalizedPath.slice(normalizedPath.lastIndexOf("/") + 1).toLowerCase();
245 const extensionIndex = fileName.lastIndexOf(".");
246 if (extensionIndex > 0 && extensionIndex < fileName.length - 1) {
247 return fileName.slice(extensionIndex + 1);
248 }
249 if (fileName.startsWith(".") && fileName.length > 1) {
250 return fileName.slice(1);
251 }
252 return "text";
253}
254
255function stripTrailingNewline(value: string): string {
256 return value.endsWith("\n") ? value.slice(0, -1) : value;
257}
258
259function buildDiffReviewLines(fileDiff: FileDiffMetadata): ReadonlyArray<DiffReviewLine> {
260 const rows: DiffReviewLine[] = [];
261
262 for (const hunk of fileDiff.hunks) {
263 let oldLineNumber = hunk.deletionStart;
264 let newLineNumber = hunk.additionStart;
265 let deletionLineIndex = hunk.deletionLineIndex;
266 let additionLineIndex = hunk.additionLineIndex;
267
268 for (const segment of hunk.hunkContent) {
269 if (segment.type === "context") {
270 for (let index = 0; index < segment.lines; index += 1) {
271 rows.push({
272 change: "context",
273 oldLineNumber,
274 newLineNumber,
275 content: stripTrailingNewline(
276 fileDiff.additionLines[additionLineIndex] ??
277 fileDiff.deletionLines[deletionLineIndex] ??
278 "",
279 ),
280 });
281 oldLineNumber += 1;
282 newLineNumber += 1;
283 deletionLineIndex += 1;
284 additionLineIndex += 1;
285 }
286 continue;
287 }
288
289 for (let index = 0; index < segment.deletions; index += 1) {
290 rows.push({
291 change: "delete",
292 oldLineNumber,
293 newLineNumber: null,
294 content: stripTrailingNewline(fileDiff.deletionLines[deletionLineIndex] ?? ""),
295 });
296 oldLineNumber += 1;
297 deletionLineIndex += 1;
298 }
299
300 for (let index = 0; index < segment.additions; index += 1) {
301 rows.push({
302 change: "add",
303 oldLineNumber: null,
304 newLineNumber,
305 content: stripTrailingNewline(fileDiff.additionLines[additionLineIndex] ?? ""),
306 });
307 newLineNumber += 1;
308 additionLineIndex += 1;
309 }
310 }
311 }
312
313 return rows;
314}
315
316function getDiffReviewSelectionPoint(
317 line: DiffReviewLine,
318): { lineNumber: number; side: SelectionSide } | null {
319 if (line.change === "delete" && line.oldLineNumber !== null) {
320 return { lineNumber: line.oldLineNumber, side: "deletions" };
321 }
322 if (line.newLineNumber !== null) {
323 return { lineNumber: line.newLineNumber, side: "additions" };
324 }
325 if (line.oldLineNumber !== null) {
326 return { lineNumber: line.oldLineNumber, side: "deletions" };
327 }
328 return null;
329}
330
331export function restoreDiffReviewCommentRange(
332 fileDiff: FileDiffMetadata,
333 comment: ReviewCommentContext,
334): SelectedLineRange | null {
335 const lines = buildDiffReviewLines(fileDiff);
336 const startLine = lines[comment.startIndex];
337 const endLine = lines[comment.endIndex];
338 if (!startLine || !endLine) return null;
339 const start = getDiffReviewSelectionPoint(startLine);
340 const end = getDiffReviewSelectionPoint(endLine);
341 if (!start || !end) return null;
342 return {
343 start: start.lineNumber,
344 side: start.side,
345 end: end.lineNumber,
346 endSide: end.side,
347 };
348}
349
350function findDiffReviewLineIndex(
351 lines: ReadonlyArray<DiffReviewLine>,
352 lineNumber: number,
353 side: SelectionSide | undefined,
354): number {
355 const preferredKey = side === "deletions" ? "oldLineNumber" : "newLineNumber";
356 const preferredIndex = lines.findIndex((line) => line[preferredKey] === lineNumber);
357 if (preferredIndex >= 0) return preferredIndex;
358 const fallbackKey = preferredKey === "oldLineNumber" ? "newLineNumber" : "oldLineNumber";
359 return lines.findIndex((line) => line[fallbackKey] === lineNumber);
360}
361
362function getDiffRange(
363 lines: ReadonlyArray<DiffReviewLine>,
364 key: "oldLineNumber" | "newLineNumber",
365): { start: number; count: number } {
366 const numberedLines = lines.filter((line) => line[key] !== null);
367 return {
368 start: numberedLines[0]?.[key] ?? 0,
369 count: numberedLines.length,
370 };
371}
372
373function getDiffChangeMarker(change: DiffReviewLine["change"]): string {
374 if (change === "add") return "+";
375 if (change === "delete") return "-";
376 return " ";
377}
378
379function formatDiffReviewRangeLabel(lines: ReadonlyArray<DiffReviewLine>): string {
380 const firstLine = lines[0];
381 const lastLine = lines.at(-1);
382 if (!firstLine || !lastLine) return "line";
383 const firstNumber = firstLine.newLineNumber ?? firstLine.oldLineNumber;
384 const lastNumber = lastLine.newLineNumber ?? lastLine.oldLineNumber;
385 if (firstNumber === null || lastNumber === null) {
386 return lines.length === 1 ? "line" : `${lines.length} lines`;
387 }
388
389 const firstMarker = getDiffChangeMarker(firstLine.change).trim();
390 const marker =
391 firstMarker.length > 0 && lines.every((line) => line.change === firstLine.change)
392 ? firstMarker
393 : "";
394 return firstNumber === lastNumber
395 ? `${marker}${firstNumber}`
396 : `${marker}${firstNumber} to ${marker}${lastNumber}`;
397}
398
399export function buildDiffReviewComment(input: {
400 id: string;
401 sectionId: string;
402 sectionTitle: string;
403 filePath: string;
404 fileDiff: FileDiffMetadata;
405 range: SelectedLineRange;
406 text: string;
407}): ReviewCommentContext | null {
408 const lines = buildDiffReviewLines(input.fileDiff);
409 const startIndex = findDiffReviewLineIndex(lines, input.range.start, input.range.side);
410 const endIndex = findDiffReviewLineIndex(
411 lines,
412 input.range.end,
413 input.range.endSide ?? input.range.side,
414 );
415 if (startIndex < 0 || endIndex < 0) return null;
416
417 const normalizedStartIndex = Math.min(startIndex, endIndex);
418 const normalizedEndIndex = Math.max(startIndex, endIndex);
419 const selectedLines = lines.slice(normalizedStartIndex, normalizedEndIndex + 1);
420 const oldRange = getDiffRange(selectedLines, "oldLineNumber");
421 const newRange = getDiffRange(selectedLines, "newLineNumber");
422
423 return {
424 id: input.id,
425 sectionId: input.sectionId,
426 sectionTitle: input.sectionTitle,
427 filePath: input.filePath,
428 startIndex: normalizedStartIndex,
429 endIndex: normalizedEndIndex,
430 rangeLabel: formatDiffReviewRangeLabel(selectedLines),
431 text: input.text.trim(),
432 diff: [
433 `@@ -${oldRange.start},${oldRange.count} +${newRange.start},${newRange.count} @@`,
434 ...selectedLines.map((line) => `${getDiffChangeMarker(line.change)}${line.content}`),
435 ].join("\n"),
436 fenceLanguage: "diff",
437 };
438}
439
138export function buildReviewCommentRenderablePatch(comment: ReviewCommentContext): string {440export function buildReviewCommentRenderablePatch(comment: ReviewCommentContext): string {
441 if ((comment.fenceLanguage ?? "diff") !== "diff") {
442 return "";
443 }
139 const diff = comment.diff.trim();444 const diff = comment.diff.trim();
140 if (diff.length === 0) {445 if (diff.length === 0) {
141 return "";446 return "";
patches/@pierre%2Fdiffs@1.3.0-beta.4.patch+50-2
...@@ -1,8 +1,56 @@...@@ -1,8 +1,56 @@
1diff --git a/dist/editor/editor.js b/dist/editor/editor.js
2index 4346c77a4e43a98c8524ea5186559fdee7433174..bb2a7ecd1d7f497916a5f220215d5191b095575b 100644
3--- a/dist/editor/editor.js
4+++ b/dist/editor/editor.js
5@@ -77,16 +77,13 @@ var Editor = class {
6 this.#options = options;
7 }
8 edit(component) {
9- const { useTokenTransformer, enableGutterUtility, enableLineSelection, expandUnchanged, diffStyle, lineHoverHighlight,...rest } = component.options;
10- if (useTokenTransformer !== true || enableGutterUtility === true || enableLineSelection === true || expandUnchanged !== true && Object.hasOwn(component, "fileDiff") || diffStyle === "unified" || lineHoverHighlight !== "disabled") {
11+ const { useTokenTransformer, expandUnchanged, diffStyle,...rest } = component.options;
12+ if (useTokenTransformer !== true || expandUnchanged !== true && Object.hasOwn(component, "fileDiff") || diffStyle === "unified") {
13 component.setOptions({
14 ...rest,
15 useTokenTransformer: true,
16- enableGutterUtility: false,
17- enableLineSelection: false,
18 expandUnchanged: true,
19- diffStyle: "split",
20- lineHoverHighlight: "disabled"
21+ diffStyle: "split"
22 });
23 component.rerender();
24 }
25@@ -481,6 +478,7 @@ var Editor = class {
26 return lineNumber - 1;
27 };
28 this.#editorEventDisposes.push(addEventListener(gutterEl, "pointerdown", (e) => {
29+ if (this.#fileInstance?.options.enableLineSelection === true) return;
30 const textDocument = this.#textDocument;
31 const lineIndex = resolveEditableLine(resolveGutterTarget(e.composedPath()[0]));
32 if (lineIndex === void 0 || textDocument === void 0) return;
33diff --git a/dist/react/utils/useFileInstance.js b/dist/react/utils/useFileInstance.js
34index cb8e2026fb5d7a19f489c0a2402efbcb7dff3322..510fad6364d4a2214c7dd65fe2b114f1cce0c815 100644
35--- a/dist/react/utils/useFileInstance.js
36+++ b/dist/react/utils/useFileInstance.js
37@@ -92,10 +92,7 @@ function mergeFileOptions({ options, controlledSelection, contentEditable, hasCu
38 };
39 if (needsEditorOptions) merged = {
40 ...merged,
41- useTokenTransformer: true,
42- enableGutterUtility: false,
43- enableLineSelection: false,
44- lineHoverHighlight: "disabled"
45+ useTokenTransformer: true
46 };
47 return merged;
48 }
1diff --git a/package.json b/package.json49diff --git a/package.json b/package.json
2index b18c94f3f7b40bdb15084ab7cabcb19dd29c61f7..ab96ac589d368e806ef45480283d6e0fa199117f 10064450index cff9c6b2a955e7568f44279a5b706da164c4f142..3d1f25f8bd1be682549677718d9ed8433872c854 100644
3--- a/package.json51--- a/package.json
4+++ b/package.json52+++ b/package.json
5@@ -51,6 +51,18 @@53@@ -55,6 +55,18 @@
6 "./worker/worker-portable.js": {54 "./worker/worker-portable.js": {
7 "types": "./dist/worker/worker-portable.d.ts",55 "types": "./dist/worker/worker-portable.d.ts",
8 "import": "./dist/worker/worker-portable.js"56 "import": "./dist/worker/worker-portable.js"
pnpm-lock.yaml+253-251
...@@ -70,7 +70,7 @@ patchedDependencies:...@@ -70,7 +70,7 @@ patchedDependencies:
70 hash: 2b16019ce7ab61aec6478dd02f79ef468cc1d5c51e9d00764f7d2ab8167210c870 hash: 2b16019ce7ab61aec6478dd02f79ef468cc1d5c51e9d00764f7d2ab8167210c8
71 path: patches/@ff-labs__fff-node@0.9.4.patch71 path: patches/@ff-labs__fff-node@0.9.4.patch
72 '@pierre/diffs@1.3.0-beta.4':72 '@pierre/diffs@1.3.0-beta.4':
73 hash: f5d41705ce94bbafc731d92e9cb1671db710df046dd135cb894e3e3e9164a75b73 hash: 0befe84f4202720eeab6fa684d8761a5c0cc7046b58cf2c0b804ad2baa7ce631
74 path: patches/@pierre%2Fdiffs@1.3.0-beta.4.patch74 path: patches/@pierre%2Fdiffs@1.3.0-beta.4.patch
75 effect@4.0.0-beta.78:75 effect@4.0.0-beta.78:
76 hash: c502bc684210b707dfceb87d8fe6ad6843395af6e19cfc02cd65854898bde2c576 hash: c502bc684210b707dfceb87d8fe6ad6843395af6e19cfc02cd65854898bde2c5
...@@ -177,10 +177,10 @@ importers:...@@ -177,10 +177,10 @@ importers:
177 dependencies:177 dependencies:
178 '@callstack/liquid-glass':178 '@callstack/liquid-glass':
179 specifier: ^0.7.1179 specifier: ^0.7.1
180 version: 0.7.1(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)180 version: 0.7.1(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
181 '@clerk/expo':181 '@clerk/expo':
182 specifier: ^3.4.1182 specifier: ^3.4.1
183 version: 3.4.1(expo-auth-session@56.0.13(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(expo-constants@56.0.16)(expo-crypto@56.0.4(expo@56.0.8))(expo-secure-store@56.0.4(expo@56.0.8))(expo-web-browser@56.0.5(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)))(expo@56.0.8)(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)183 version: 3.4.1(expo-auth-session@56.0.13(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(expo-constants@56.0.16)(expo-crypto@56.0.4(expo@56.0.8))(expo-secure-store@56.0.4(expo@56.0.8))(expo-web-browser@56.0.5(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)))(expo@56.0.8)(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
184 '@effect/atom-react':184 '@effect/atom-react':
185 specifier: 4.0.0-beta.78185 specifier: 4.0.0-beta.78
186 version: 4.0.0-beta.78(effect@4.0.0-beta.78(patch_hash=c502bc684210b707dfceb87d8fe6ad6843395af6e19cfc02cd65854898bde2c5))(react@19.2.3)(scheduler@0.27.0)186 version: 4.0.0-beta.78(effect@4.0.0-beta.78(patch_hash=c502bc684210b707dfceb87d8fe6ad6843395af6e19cfc02cd65854898bde2c5))(react@19.2.3)(scheduler@0.27.0)
...@@ -189,10 +189,10 @@ importers:...@@ -189,10 +189,10 @@ importers:
189 version: 0.4.2189 version: 0.4.2
190 '@expo/ui':190 '@expo/ui':
191 specifier: ~56.0.8191 specifier: ~56.0.8
192 version: 56.0.15(ab3f255d102c60ba0fd2bbe4e47ba584)192 version: 56.0.15(961c4aa6f32829b318e3c87ef20ad401)
193 '@legendapp/list':193 '@legendapp/list':
194 specifier: 3.0.0-beta.44194 specifier: 3.0.0-beta.44
195 version: 3.0.0-beta.44(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)195 version: 3.0.0-beta.44(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
196 '@noble/curves':196 '@noble/curves':
197 specifier: 'catalog:'197 specifier: 'catalog:'
198 version: 1.9.1198 version: 1.9.1
...@@ -201,10 +201,10 @@ importers:...@@ -201,10 +201,10 @@ importers:
201 version: 1.8.0201 version: 1.8.0
202 '@pierre/diffs':202 '@pierre/diffs':
203 specifier: 'catalog:'203 specifier: 'catalog:'
204 version: 1.3.0-beta.4(patch_hash=f5d41705ce94bbafc731d92e9cb1671db710df046dd135cb894e3e3e9164a75b)(@shikijs/themes@3.23.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)204 version: 1.3.0-beta.4(patch_hash=0befe84f4202720eeab6fa684d8761a5c0cc7046b58cf2c0b804ad2baa7ce631)(@shikijs/themes@3.23.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
205 '@react-native-menu/menu':205 '@react-native-menu/menu':
206 specifier: ^2.0.0206 specifier: ^2.0.0
207 version: 2.0.0(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)207 version: 2.0.0(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
208 '@shikijs/core':208 '@shikijs/core':
209 specifier: 3.23.0209 specifier: 3.23.0
210 version: 3.23.0210 version: 3.23.0
...@@ -225,7 +225,7 @@ importers:...@@ -225,7 +225,7 @@ importers:
225 version: link:../../packages/contracts225 version: link:../../packages/contracts
226 '@t3tools/mobile-markdown-text':226 '@t3tools/mobile-markdown-text':
227 specifier: file:./modules/t3-markdown-text227 specifier: file:./modules/t3-markdown-text
228 version: file:apps/mobile/modules/t3-markdown-text(e909ee9a8f7fbe234da80c739fca4984)228 version: file:apps/mobile/modules/t3-markdown-text(f0ff241d48c23db461fff5d47e450578)
229 '@t3tools/mobile-review-diff-native':229 '@t3tools/mobile-review-diff-native':
230 specifier: file:./modules/t3-review-diff230 specifier: file:./modules/t3-review-diff
231 version: file:apps/mobile/modules/t3-review-diff231 version: file:apps/mobile/modules/t3-review-diff
...@@ -246,40 +246,40 @@ importers:...@@ -246,40 +246,40 @@ importers:
246 version: 4.0.0-beta.78(patch_hash=c502bc684210b707dfceb87d8fe6ad6843395af6e19cfc02cd65854898bde2c5)246 version: 4.0.0-beta.78(patch_hash=c502bc684210b707dfceb87d8fe6ad6843395af6e19cfc02cd65854898bde2c5)
247 expo:247 expo:
248 specifier: ^56.0.0248 specifier: ^56.0.0
249 version: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)249 version: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)
250 expo-asset:250 expo-asset:
251 specifier: ~56.0.15251 specifier: ~56.0.15
252 version: 56.0.15(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)252 version: 56.0.15(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)
253 expo-auth-session:253 expo-auth-session:
254 specifier: ~56.0.12254 specifier: ~56.0.12
255 version: 56.0.13(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)255 version: 56.0.13(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
256 expo-build-properties:256 expo-build-properties:
257 specifier: ~56.0.15257 specifier: ~56.0.15
258 version: 56.0.16(expo@56.0.8)258 version: 56.0.16(expo@56.0.8)
259 expo-camera:259 expo-camera:
260 specifier: ~56.0.7260 specifier: ~56.0.7
261 version: 56.0.7(@types/emscripten@1.41.5)(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)261 version: 56.0.7(@types/emscripten@1.41.5)(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
262 expo-clipboard:262 expo-clipboard:
263 specifier: ~56.0.3263 specifier: ~56.0.3
264 version: 56.0.3(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)264 version: 56.0.3(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
265 expo-constants:265 expo-constants:
266 specifier: ~56.0.16266 specifier: ~56.0.16
267 version: 56.0.16(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))267 version: 56.0.16(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
268 expo-crypto:268 expo-crypto:
269 specifier: ~56.0.4269 specifier: ~56.0.4
270 version: 56.0.4(expo@56.0.8)270 version: 56.0.4(expo@56.0.8)
271 expo-dev-client:271 expo-dev-client:
272 specifier: ~56.0.16272 specifier: ~56.0.16
273 version: 56.0.18(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))273 version: 56.0.18(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
274 expo-file-system:274 expo-file-system:
275 specifier: ~56.0.7275 specifier: ~56.0.7
276 version: 56.0.7(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))276 version: 56.0.7(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
277 expo-font:277 expo-font:
278 specifier: ~56.0.5278 specifier: ~56.0.5
279 version: 56.0.5(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)279 version: 56.0.5(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
280 expo-glass-effect:280 expo-glass-effect:
281 specifier: ~56.0.4281 specifier: ~56.0.4
282 version: 56.0.4(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)282 version: 56.0.4(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
283 expo-haptics:283 expo-haptics:
284 specifier: ~56.0.3284 specifier: ~56.0.3
285 version: 56.0.3(expo@56.0.8)285 version: 56.0.3(expo@56.0.8)
...@@ -288,16 +288,16 @@ importers:...@@ -288,16 +288,16 @@ importers:
288 version: 56.0.15(expo@56.0.8)288 version: 56.0.15(expo@56.0.8)
289 expo-linking:289 expo-linking:
290 specifier: ~56.0.12290 specifier: ~56.0.12
291 version: 56.0.13(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)291 version: 56.0.13(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
292 expo-notifications:292 expo-notifications:
293 specifier: ~56.0.14293 specifier: ~56.0.14
294 version: 56.0.15(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)294 version: 56.0.15(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)
295 expo-paste-input:295 expo-paste-input:
296 specifier: ^0.1.15296 specifier: ^0.1.15
297 version: 0.1.15(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)297 version: 0.1.15(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
298 expo-router:298 expo-router:
299 specifier: ~56.2.7299 specifier: ~56.2.7
300 version: 56.2.8(c021de11d02907bd585610408f5252e8)300 version: 56.2.8(5bfdf39b8f760e4dc2d5c3acffc97310)
301 expo-secure-store:301 expo-secure-store:
302 specifier: ~56.0.4302 specifier: ~56.0.4
303 version: 56.0.4(expo@56.0.8)303 version: 56.0.4(expo@56.0.8)
...@@ -306,16 +306,16 @@ importers:...@@ -306,16 +306,16 @@ importers:
306 version: 56.0.10(expo@56.0.8)(typescript@6.0.3)306 version: 56.0.10(expo@56.0.8)(typescript@6.0.3)
307 expo-symbols:307 expo-symbols:
308 specifier: ~56.0.5308 specifier: ~56.0.5
309 version: 56.0.5(expo-font@56.0.5)(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)309 version: 56.0.5(expo-font@56.0.5)(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
310 expo-updates:310 expo-updates:
311 specifier: ~56.0.17311 specifier: ~56.0.17
312 version: 56.0.17(expo-dev-client@56.0.18(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)))(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)312 version: 56.0.17(expo-dev-client@56.0.18(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)))(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
313 expo-web-browser:313 expo-web-browser:
314 specifier: ~56.0.5314 specifier: ~56.0.5
315 version: 56.0.5(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))315 version: 56.0.5(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
316 expo-widgets:316 expo-widgets:
317 specifier: ~56.0.15317 specifier: ~56.0.15
318 version: 56.0.16(ab3f255d102c60ba0fd2bbe4e47ba584)318 version: 56.0.16(961c4aa6f32829b318e3c87ef20ad401)
319 punycode:319 punycode:
320 specifier: ^2.3.1320 specifier: ^2.3.1
321 version: 2.3.1321 version: 2.3.1
...@@ -327,40 +327,40 @@ importers:...@@ -327,40 +327,40 @@ importers:
327 version: 19.2.3(react@19.2.3)327 version: 19.2.3(react@19.2.3)
328 react-native:328 react-native:
329 specifier: 0.85.3329 specifier: 0.85.3
330 version: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)330 version: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
331 react-native-gesture-handler:331 react-native-gesture-handler:
332 specifier: ~2.31.1332 specifier: ~2.31.1
333 version: 2.31.2(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)333 version: 2.31.2(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
334 react-native-image-viewing:334 react-native-image-viewing:
335 specifier: ^0.2.2335 specifier: ^0.2.2
336 version: 0.2.2(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)336 version: 0.2.2(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
337 react-native-keyboard-controller:337 react-native-keyboard-controller:
338 specifier: 1.21.6338 specifier: 1.21.6
339 version: 1.21.6(react-native-reanimated@4.3.1(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)339 version: 1.21.6(react-native-reanimated@4.3.1(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
340 react-native-nitro-markdown:340 react-native-nitro-markdown:
341 specifier: ^0.5.0341 specifier: ^0.5.0
342 version: 0.5.8(react-native-nitro-modules@0.35.9(patch_hash=825622aae63a8fb5b904f3c77908a0e216261d727ea171709f2c0b6088422675)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native-svg@15.15.4(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)342 version: 0.5.8(react-native-nitro-modules@0.35.9(patch_hash=825622aae63a8fb5b904f3c77908a0e216261d727ea171709f2c0b6088422675)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native-svg@15.15.4(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
343 react-native-nitro-modules:343 react-native-nitro-modules:
344 specifier: ^0.35.4344 specifier: ^0.35.4
345 version: 0.35.9(patch_hash=825622aae63a8fb5b904f3c77908a0e216261d727ea171709f2c0b6088422675)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)345 version: 0.35.9(patch_hash=825622aae63a8fb5b904f3c77908a0e216261d727ea171709f2c0b6088422675)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
346 react-native-reanimated:346 react-native-reanimated:
347 specifier: 4.3.1347 specifier: 4.3.1
348 version: 4.3.1(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)348 version: 4.3.1(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
349 react-native-safe-area-context:349 react-native-safe-area-context:
350 specifier: ~5.7.0350 specifier: ~5.7.0
351 version: 5.7.0(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)351 version: 5.7.0(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
352 react-native-screens:352 react-native-screens:
353 specifier: 4.25.2353 specifier: 4.25.2
354 version: 4.25.2(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)354 version: 4.25.2(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
355 react-native-shiki-engine:355 react-native-shiki-engine:
356 specifier: ^0.3.9356 specifier: ^0.3.9
357 version: 0.3.10(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)357 version: 0.3.10(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
358 react-native-svg:358 react-native-svg:
359 specifier: 15.15.4359 specifier: 15.15.4
360 version: 15.15.4(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)360 version: 15.15.4(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
361 react-native-worklets:361 react-native-worklets:
362 specifier: 0.8.3362 specifier: 0.8.3
363 version: 0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)363 version: 0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
364 shiki:364 shiki:
365 specifier: 3.23.0365 specifier: 3.23.0
366 version: 3.23.0366 version: 3.23.0
...@@ -369,7 +369,7 @@ importers:...@@ -369,7 +369,7 @@ importers:
369 version: 3.6.0369 version: 3.6.0
370 uniwind:370 uniwind:
371 specifier: ^1.6.2371 specifier: ^1.6.2
372 version: 1.7.0(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(tailwindcss@4.3.0)372 version: 1.7.0(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(tailwindcss@4.3.0)
373 devDependencies:373 devDependencies:
374 '@effect/vitest':374 '@effect/vitest':
375 specifier: 4.0.0-beta.78375 specifier: 4.0.0-beta.78
...@@ -415,7 +415,7 @@ importers:...@@ -415,7 +415,7 @@ importers:
415 version: 1.15.13415 version: 1.15.13
416 '@pierre/diffs':416 '@pierre/diffs':
417 specifier: 'catalog:'417 specifier: 'catalog:'
418 version: 1.3.0-beta.4(patch_hash=f5d41705ce94bbafc731d92e9cb1671db710df046dd135cb894e3e3e9164a75b)(@shikijs/themes@4.1.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)418 version: 1.3.0-beta.4(patch_hash=0befe84f4202720eeab6fa684d8761a5c0cc7046b58cf2c0b804ad2baa7ce631)(@shikijs/themes@4.1.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
419 effect:419 effect:
420 specifier: 4.0.0-beta.78420 specifier: 4.0.0-beta.78
421 version: 4.0.0-beta.78(patch_hash=c502bc684210b707dfceb87d8fe6ad6843395af6e19cfc02cd65854898bde2c5)421 version: 4.0.0-beta.78(patch_hash=c502bc684210b707dfceb87d8fe6ad6843395af6e19cfc02cd65854898bde2c5)
...@@ -497,7 +497,7 @@ importers:...@@ -497,7 +497,7 @@ importers:
497 version: 0.41.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(yjs@13.6.31)497 version: 0.41.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(yjs@13.6.31)
498 '@pierre/diffs':498 '@pierre/diffs':
499 specifier: 'catalog:'499 specifier: 'catalog:'
500 version: 1.3.0-beta.4(patch_hash=f5d41705ce94bbafc731d92e9cb1671db710df046dd135cb894e3e3e9164a75b)(@shikijs/themes@4.1.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)500 version: 1.3.0-beta.4(patch_hash=0befe84f4202720eeab6fa684d8761a5c0cc7046b58cf2c0b804ad2baa7ce631)(@shikijs/themes@4.1.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
501 '@pierre/trees':501 '@pierre/trees':
502 specifier: 1.0.0-beta.4502 specifier: 1.0.0-beta.4
503 version: 1.0.0-beta.4(react-dom@19.2.6(react@19.2.6))(react@19.2.6)503 version: 1.0.0-beta.4(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
...@@ -10819,10 +10819,10 @@ snapshots:...@@ -10819,10 +10819,10 @@ snapshots:
10819 optionalDependencies:10819 optionalDependencies:
10820 '@types/react': 19.2.1610820 '@types/react': 19.2.16
1082110821
10822 '@callstack/liquid-glass@0.7.1(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)':10822 '@callstack/liquid-glass@0.7.1(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)':
10823 dependencies:10823 dependencies:
10824 react: 19.2.310824 react: 19.2.3
10825 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)10825 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
1082610826
10827 '@capsizecss/unpack@4.0.0':10827 '@capsizecss/unpack@4.0.0':
10828 dependencies:10828 dependencies:
...@@ -10894,23 +10894,23 @@ snapshots:...@@ -10894,23 +10894,23 @@ snapshots:
10894 - react10894 - react
10895 - react-dom10895 - react-dom
1089610896
10897 '@clerk/expo@3.4.1(expo-auth-session@56.0.13(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(expo-constants@56.0.16)(expo-crypto@56.0.4(expo@56.0.8))(expo-secure-store@56.0.4(expo@56.0.8))(expo-web-browser@56.0.5(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)))(expo@56.0.8)(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)':10897 '@clerk/expo@3.4.1(expo-auth-session@56.0.13(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(expo-constants@56.0.16)(expo-crypto@56.0.4(expo@56.0.8))(expo-secure-store@56.0.4(expo@56.0.8))(expo-web-browser@56.0.5(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)))(expo@56.0.8)(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)':
10898 dependencies:10898 dependencies:
10899 '@clerk/clerk-js': 6.16.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)10899 '@clerk/clerk-js': 6.16.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
10900 '@clerk/react': 6.9.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)10900 '@clerk/react': 6.9.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
10901 '@clerk/shared': 4.17.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)10901 '@clerk/shared': 4.17.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
10902 base-64: 1.0.010902 base-64: 1.0.0
10903 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)10903 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)
10904 react: 19.2.310904 react: 19.2.3
10905 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)10905 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
10906 react-native-url-polyfill: 2.0.0(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))10906 react-native-url-polyfill: 2.0.0(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
10907 tslib: 2.8.110907 tslib: 2.8.1
10908 optionalDependencies:10908 optionalDependencies:
10909 expo-auth-session: 56.0.13(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)10909 expo-auth-session: 56.0.13(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
10910 expo-constants: 56.0.16(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))10910 expo-constants: 56.0.16(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
10911 expo-crypto: 56.0.4(expo@56.0.8)10911 expo-crypto: 56.0.4(expo@56.0.8)
10912 expo-secure-store: 56.0.4(expo@56.0.8)10912 expo-secure-store: 56.0.4(expo@56.0.8)
10913 expo-web-browser: 56.0.5(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))10913 expo-web-browser: 56.0.5(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
10914 react-dom: 19.2.3(react@19.2.3)10914 react-dom: 19.2.3(react@19.2.3)
1091510915
10916 '@clerk/react@6.9.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':10916 '@clerk/react@6.9.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
...@@ -11477,7 +11477,7 @@ snapshots:...@@ -11477,7 +11477,7 @@ snapshots:
1147711477
11478 '@expo-google-fonts/material-symbols@0.4.38': {}11478 '@expo-google-fonts/material-symbols@0.4.38': {}
1147911479
11480 '@expo/cli@56.1.13(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-constants@56.0.16)(expo-font@56.0.5)(expo-router@56.2.8)(expo@56.0.8)(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)':11480 '@expo/cli@56.1.13(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-constants@56.0.16)(expo-font@56.0.5)(expo-router@56.2.8)(expo@56.0.8)(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)':
11481 dependencies:11481 dependencies:
11482 '@expo/code-signing-certificates': 0.0.611482 '@expo/code-signing-certificates': 0.0.6
11483 '@expo/config': 56.0.9(typescript@6.0.3)11483 '@expo/config': 56.0.9(typescript@6.0.3)
...@@ -11487,7 +11487,7 @@ snapshots:...@@ -11487,7 +11487,7 @@ snapshots:
11487 '@expo/image-utils': 0.10.1(typescript@6.0.3)11487 '@expo/image-utils': 0.10.1(typescript@6.0.3)
11488 '@expo/inline-modules': 0.0.10(typescript@6.0.3)11488 '@expo/inline-modules': 0.0.10(typescript@6.0.3)
11489 '@expo/json-file': 10.2.011489 '@expo/json-file': 10.2.0
11490 '@expo/log-box': 56.0.12(@expo/dom-webview@56.0.5)(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)11490 '@expo/log-box': 56.0.12(@expo/dom-webview@56.0.5)(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
11491 '@expo/metro': 56.0.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)11491 '@expo/metro': 56.0.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)
11492 '@expo/metro-config': 56.0.13(patch_hash=8cb08b5bb7051ed9d2dbe46a2c293c5a1e17f1bd6ddf30de27909e18c921ff46)(bufferutil@4.1.0)(expo@56.0.8)(typescript@6.0.3)(utf-8-validate@6.0.6)11492 '@expo/metro-config': 56.0.13(patch_hash=8cb08b5bb7051ed9d2dbe46a2c293c5a1e17f1bd6ddf30de27909e18c921ff46)(bufferutil@4.1.0)(expo@56.0.8)(typescript@6.0.3)(utf-8-validate@6.0.6)
11493 '@expo/metro-file-map': 56.0.311493 '@expo/metro-file-map': 56.0.3
...@@ -11512,7 +11512,7 @@ snapshots:...@@ -11512,7 +11512,7 @@ snapshots:
11512 connect: 3.7.011512 connect: 3.7.0
11513 debug: 4.4.311513 debug: 4.4.3
11514 dnssd-advertise: 1.1.411514 dnssd-advertise: 1.1.4
11515 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)11515 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)
11516 expo-server: 56.0.411516 expo-server: 56.0.4
11517 fetch-nodeshim: 0.4.1011517 fetch-nodeshim: 0.4.10
11518 getenv: 2.0.011518 getenv: 2.0.0
...@@ -11538,8 +11538,8 @@ snapshots:...@@ -11538,8 +11538,8 @@ snapshots:
11538 ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)11538 ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)
11539 zod: 3.25.7611539 zod: 3.25.76
11540 optionalDependencies:11540 optionalDependencies:
11541 expo-router: 56.2.8(c021de11d02907bd585610408f5252e8)11541 expo-router: 56.2.8(5bfdf39b8f760e4dc2d5c3acffc97310)
11542 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)11542 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
11543 transitivePeerDependencies:11543 transitivePeerDependencies:
11544 - '@expo/dom-webview'11544 - '@expo/dom-webview'
11545 - '@expo/metro-runtime'11545 - '@expo/metro-runtime'
...@@ -11601,18 +11601,18 @@ snapshots:...@@ -11601,18 +11601,18 @@ snapshots:
11601 transitivePeerDependencies:11601 transitivePeerDependencies:
11602 - supports-color11602 - supports-color
1160311603
11604 '@expo/devtools@56.0.2(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)':11604 '@expo/devtools@56.0.2(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)':
11605 dependencies:11605 dependencies:
11606 chalk: 4.1.211606 chalk: 4.1.2
11607 optionalDependencies:11607 optionalDependencies:
11608 react: 19.2.311608 react: 19.2.3
11609 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)11609 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
1161011610
11611 '@expo/dom-webview@56.0.5(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)':11611 '@expo/dom-webview@56.0.5(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)':
11612 dependencies:11612 dependencies:
11613 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)11613 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)
11614 react: 19.2.311614 react: 19.2.3
11615 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)11615 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
1161611616
11617 '@expo/env@2.3.0':11617 '@expo/env@2.3.0':
11618 dependencies:11618 dependencies:
...@@ -11673,13 +11673,13 @@ snapshots:...@@ -11673,13 +11673,13 @@ snapshots:
11673 - supports-color11673 - supports-color
11674 - typescript11674 - typescript
1167511675
11676 '@expo/log-box@56.0.12(@expo/dom-webview@56.0.5)(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)':11676 '@expo/log-box@56.0.12(@expo/dom-webview@56.0.5)(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)':
11677 dependencies:11677 dependencies:
11678 '@expo/dom-webview': 56.0.5(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)11678 '@expo/dom-webview': 56.0.5(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
11679 anser: 1.4.1011679 anser: 1.4.10
11680 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)11680 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)
11681 react: 19.2.311681 react: 19.2.3
11682 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)11682 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
11683 stacktrace-parser: 0.1.1111683 stacktrace-parser: 0.1.11
1168411684
11685 '@expo/metro-config@56.0.13(patch_hash=8cb08b5bb7051ed9d2dbe46a2c293c5a1e17f1bd6ddf30de27909e18c921ff46)(bufferutil@4.1.0)(expo@56.0.8)(typescript@6.0.3)(utf-8-validate@6.0.6)':11685 '@expo/metro-config@56.0.13(patch_hash=8cb08b5bb7051ed9d2dbe46a2c293c5a1e17f1bd6ddf30de27909e18c921ff46)(bufferutil@4.1.0)(expo@56.0.8)(typescript@6.0.3)(utf-8-validate@6.0.6)':
...@@ -11709,7 +11709,7 @@ snapshots:...@@ -11709,7 +11709,7 @@ snapshots:
11709 postcss: 8.5.1511709 postcss: 8.5.15
11710 resolve-from: 5.0.011710 resolve-from: 5.0.0
11711 optionalDependencies:11711 optionalDependencies:
11712 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)11712 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)
11713 transitivePeerDependencies:11713 transitivePeerDependencies:
11714 - bufferutil11714 - bufferutil
11715 - supports-color11715 - supports-color
...@@ -11727,14 +11727,14 @@ snapshots:...@@ -11727,14 +11727,14 @@ snapshots:
11727 transitivePeerDependencies:11727 transitivePeerDependencies:
11728 - supports-color11728 - supports-color
1172911729
11730 '@expo/metro-runtime@56.0.13(@expo/log-box@56.0.12)(expo@56.0.8)(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)':11730 '@expo/metro-runtime@56.0.13(@expo/log-box@56.0.12)(expo@56.0.8)(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)':
11731 dependencies:11731 dependencies:
11732 '@expo/log-box': 56.0.12(@expo/dom-webview@56.0.5)(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)11732 '@expo/log-box': 56.0.12(@expo/dom-webview@56.0.5)(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
11733 anser: 1.4.1011733 anser: 1.4.10
11734 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)11734 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)
11735 pretty-format: 29.7.011735 pretty-format: 29.7.0
11736 react: 19.2.311736 react: 19.2.3
11737 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)11737 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
11738 stacktrace-parser: 0.1.1111738 stacktrace-parser: 0.1.11
11739 whatwg-fetch: 3.6.2011739 whatwg-fetch: 3.6.20
11740 optionalDependencies:11740 optionalDependencies:
...@@ -11809,14 +11809,14 @@ snapshots:...@@ -11809,14 +11809,14 @@ snapshots:
11809 '@expo/router-server@56.0.12(@expo/metro-runtime@56.0.13)(expo-constants@56.0.16)(expo-font@56.0.5)(expo-router@56.2.8)(expo-server@56.0.4)(expo@56.0.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':11809 '@expo/router-server@56.0.12(@expo/metro-runtime@56.0.13)(expo-constants@56.0.16)(expo-font@56.0.5)(expo-router@56.2.8)(expo-server@56.0.4)(expo@56.0.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
11810 dependencies:11810 dependencies:
11811 debug: 4.4.311811 debug: 4.4.3
11812 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)11812 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)
11813 expo-constants: 56.0.16(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))11813 expo-constants: 56.0.16(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
11814 expo-font: 56.0.5(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)11814 expo-font: 56.0.5(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
11815 expo-server: 56.0.411815 expo-server: 56.0.4
11816 react: 19.2.311816 react: 19.2.3
11817 optionalDependencies:11817 optionalDependencies:
11818 '@expo/metro-runtime': 56.0.13(@expo/log-box@56.0.12)(expo@56.0.8)(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)11818 '@expo/metro-runtime': 56.0.13(@expo/log-box@56.0.12)(expo@56.0.8)(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
11819 expo-router: 56.2.8(c021de11d02907bd585610408f5252e8)11819 expo-router: 56.2.8(5bfdf39b8f760e4dc2d5c3acffc97310)
11820 react-dom: 19.2.3(react@19.2.3)11820 react-dom: 19.2.3(react@19.2.3)
11821 transitivePeerDependencies:11821 transitivePeerDependencies:
11822 - supports-color11822 - supports-color
...@@ -11831,18 +11831,18 @@ snapshots:...@@ -11831,18 +11831,18 @@ snapshots:
1183111831
11832 '@expo/sudo-prompt@9.3.2': {}11832 '@expo/sudo-prompt@9.3.2': {}
1183311833
11834 '@expo/ui@56.0.15(ab3f255d102c60ba0fd2bbe4e47ba584)':11834 '@expo/ui@56.0.15(961c4aa6f32829b318e3c87ef20ad401)':
11835 dependencies:11835 dependencies:
11836 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)11836 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)
11837 react: 19.2.311837 react: 19.2.3
11838 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)11838 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
11839 sf-symbols-typescript: 2.2.011839 sf-symbols-typescript: 2.2.0
11840 vaul: 1.1.2(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)11840 vaul: 1.1.2(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
11841 optionalDependencies:11841 optionalDependencies:
11842 '@babel/core': 7.29.711842 '@babel/core': 7.29.7
11843 react-dom: 19.2.3(react@19.2.3)11843 react-dom: 19.2.3(react@19.2.3)
11844 react-native-reanimated: 4.3.1(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)11844 react-native-reanimated: 4.3.1(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
11845 react-native-worklets: 0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)11845 react-native-worklets: 0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
11846 transitivePeerDependencies:11846 transitivePeerDependencies:
11847 - '@types/react'11847 - '@types/react'
11848 - '@types/react-dom'11848 - '@types/react-dom'
...@@ -12103,13 +12103,13 @@ snapshots:...@@ -12103,13 +12103,13 @@ snapshots:
12103 dependencies:12103 dependencies:
12104 jsbi: 4.3.212104 jsbi: 4.3.2
1210512105
12106 '@legendapp/list@3.0.0-beta.44(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)':12106 '@legendapp/list@3.0.0-beta.44(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)':
12107 dependencies:12107 dependencies:
12108 react: 19.2.312108 react: 19.2.3
12109 use-sync-external-store: 1.6.0(react@19.2.3)12109 use-sync-external-store: 1.6.0(react@19.2.3)
12110 optionalDependencies:12110 optionalDependencies:
12111 react-dom: 19.2.3(react@19.2.3)12111 react-dom: 19.2.3(react@19.2.3)
12112 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)12112 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
1211312113
12114 '@legendapp/list@3.0.0-beta.44(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':12114 '@legendapp/list@3.0.0-beta.44(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
12115 dependencies:12115 dependencies:
...@@ -12656,7 +12656,7 @@ snapshots:...@@ -12656,7 +12656,7 @@ snapshots:
1265612656
12657 '@oxlint/plugins@1.68.0': {}12657 '@oxlint/plugins@1.68.0': {}
1265812658
12659 '@pierre/diffs@1.3.0-beta.4(patch_hash=f5d41705ce94bbafc731d92e9cb1671db710df046dd135cb894e3e3e9164a75b)(@shikijs/themes@3.23.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':12659 '@pierre/diffs@1.3.0-beta.4(patch_hash=0befe84f4202720eeab6fa684d8761a5c0cc7046b58cf2c0b804ad2baa7ce631)(@shikijs/themes@3.23.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
12660 dependencies:12660 dependencies:
12661 '@pierre/theme': 1.0.312661 '@pierre/theme': 1.0.3
12662 '@pierre/theming': 0.0.1(@pierre/theme@1.0.3)(@shikijs/themes@3.23.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(shiki@3.23.0)12662 '@pierre/theming': 0.0.1(@pierre/theme@1.0.3)(@shikijs/themes@3.23.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(shiki@3.23.0)
...@@ -12670,7 +12670,7 @@ snapshots:...@@ -12670,7 +12670,7 @@ snapshots:
12670 transitivePeerDependencies:12670 transitivePeerDependencies:
12671 - '@shikijs/themes'12671 - '@shikijs/themes'
1267212672
12673 '@pierre/diffs@1.3.0-beta.4(patch_hash=f5d41705ce94bbafc731d92e9cb1671db710df046dd135cb894e3e3e9164a75b)(@shikijs/themes@4.1.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':12673 '@pierre/diffs@1.3.0-beta.4(patch_hash=0befe84f4202720eeab6fa684d8761a5c0cc7046b58cf2c0b804ad2baa7ce631)(@shikijs/themes@4.1.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
12674 dependencies:12674 dependencies:
12675 '@pierre/theme': 1.0.312675 '@pierre/theme': 1.0.3
12676 '@pierre/theming': 0.0.1(@pierre/theme@1.0.3)(@shikijs/themes@4.1.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(shiki@3.23.0)12676 '@pierre/theming': 0.0.1(@pierre/theme@1.0.3)(@shikijs/themes@4.1.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(shiki@3.23.0)
...@@ -12932,15 +12932,15 @@ snapshots:...@@ -12932,15 +12932,15 @@ snapshots:
12932 prompts: 2.4.212932 prompts: 2.4.2
12933 tinyexec: 1.2.412933 tinyexec: 1.2.4
1293412934
12935 '@react-native-masked-view/masked-view@0.3.2(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)':12935 '@react-native-masked-view/masked-view@0.3.2(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)':
12936 dependencies:12936 dependencies:
12937 react: 19.2.312937 react: 19.2.3
12938 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)12938 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
1293912939
12940 '@react-native-menu/menu@2.0.0(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)':12940 '@react-native-menu/menu@2.0.0(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)':
12941 dependencies:12941 dependencies:
12942 react: 19.2.312942 react: 19.2.3
12943 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)12943 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
1294412944
12945 '@react-native/assets-registry@0.85.3': {}12945 '@react-native/assets-registry@0.85.3': {}
1294612946
...@@ -13000,7 +13000,7 @@ snapshots:...@@ -13000,7 +13000,7 @@ snapshots:
13000 tinyglobby: 0.2.1713000 tinyglobby: 0.2.17
13001 yargs: 17.7.213001 yargs: 17.7.2
1300213002
13003 '@react-native/community-cli-plugin@0.85.3(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(bufferutil@4.1.0)(utf-8-validate@6.0.6)':13003 '@react-native/community-cli-plugin@0.85.3(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(bufferutil@4.1.0)(utf-8-validate@6.0.6)':
13004 dependencies:13004 dependencies:
13005 '@react-native/dev-middleware': 0.85.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)13005 '@react-native/dev-middleware': 0.85.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)
13006 debug: 4.4.313006 debug: 4.4.3
...@@ -13010,7 +13010,7 @@ snapshots:...@@ -13010,7 +13010,7 @@ snapshots:
13010 metro-core: 0.84.413010 metro-core: 0.84.4
13011 semver: 7.8.113011 semver: 7.8.1
13012 optionalDependencies:13012 optionalDependencies:
13013 '@react-native/metro-config': 0.85.3(@babel/core@7.29.7)13013 '@react-native/metro-config': 0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6)
13014 transitivePeerDependencies:13014 transitivePeerDependencies:
13015 - bufferutil13015 - bufferutil
13016 - supports-color13016 - supports-color
...@@ -13058,7 +13058,7 @@ snapshots:...@@ -13058,7 +13058,7 @@ snapshots:
13058 transitivePeerDependencies:13058 transitivePeerDependencies:
13059 - supports-color13059 - supports-color
1306013060
13061 '@react-native/metro-config@0.85.3(@babel/core@7.29.7)':13061 '@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6)':
13062 dependencies:13062 dependencies:
13063 '@react-native/js-polyfills': 0.85.313063 '@react-native/js-polyfills': 0.85.3
13064 '@react-native/metro-babel-transformer': 0.85.3(@babel/core@7.29.7)13064 '@react-native/metro-babel-transformer': 0.85.3(@babel/core@7.29.7)
...@@ -13066,16 +13066,18 @@ snapshots:...@@ -13066,16 +13066,18 @@ snapshots:
13066 metro-runtime: 0.84.413066 metro-runtime: 0.84.4
13067 transitivePeerDependencies:13067 transitivePeerDependencies:
13068 - '@babel/core'13068 - '@babel/core'
13069 - bufferutil
13069 - supports-color13070 - supports-color
13071 - utf-8-validate
1307013072
13071 '@react-native/normalize-colors@0.85.3': {}13073 '@react-native/normalize-colors@0.85.3': {}
1307213074
13073 '@react-native/virtualized-lists@0.85.3(@types/react@19.2.16)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)':13075 '@react-native/virtualized-lists@0.85.3(@types/react@19.2.16)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)':
13074 dependencies:13076 dependencies:
13075 invariant: 2.2.413077 invariant: 2.2.4
13076 nullthrows: 1.1.113078 nullthrows: 1.1.1
13077 react: 19.2.313079 react: 19.2.3
13078 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)13080 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
13079 optionalDependencies:13081 optionalDependencies:
13080 '@types/react': 19.2.1613082 '@types/react': 19.2.16
1308113083
...@@ -13481,15 +13483,15 @@ snapshots:...@@ -13481,15 +13483,15 @@ snapshots:
13481 dependencies:13483 dependencies:
13482 defer-to-connect: 2.0.113484 defer-to-connect: 2.0.1
1348313485
13484 '@t3tools/mobile-markdown-text@file:apps/mobile/modules/t3-markdown-text(e909ee9a8f7fbe234da80c739fca4984)':13486 '@t3tools/mobile-markdown-text@file:apps/mobile/modules/t3-markdown-text(f0ff241d48c23db461fff5d47e450578)':
13485 dependencies:13487 dependencies:
13486 expo-asset: 56.0.15(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)13488 expo-asset: 56.0.15(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)
13487 expo-clipboard: 56.0.3(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)13489 expo-clipboard: 56.0.3(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
13488 expo-haptics: 56.0.3(expo@56.0.8)13490 expo-haptics: 56.0.3(expo@56.0.8)
13489 expo-symbols: 56.0.5(expo-font@56.0.5)(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)13491 expo-symbols: 56.0.5(expo-font@56.0.5)(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
13490 react: 19.2.313492 react: 19.2.3
13491 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)13493 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
13492 react-native-nitro-markdown: 0.5.8(react-native-nitro-modules@0.35.9(patch_hash=825622aae63a8fb5b904f3c77908a0e216261d727ea171709f2c0b6088422675)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native-svg@15.15.4(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)13494 react-native-nitro-markdown: 0.5.8(react-native-nitro-modules@0.35.9(patch_hash=825622aae63a8fb5b904f3c77908a0e216261d727ea171709f2c0b6088422675)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native-svg@15.15.4(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
1349313495
13494 '@t3tools/mobile-review-diff-native@file:apps/mobile/modules/t3-review-diff': {}13496 '@t3tools/mobile-review-diff-native@file:apps/mobile/modules/t3-review-diff': {}
1349513497
...@@ -14606,8 +14608,8 @@ snapshots:...@@ -14606,8 +14608,8 @@ snapshots:
14606 react-refresh: 0.14.214608 react-refresh: 0.14.2
14607 optionalDependencies:14609 optionalDependencies:
14608 '@babel/runtime': 7.29.714610 '@babel/runtime': 7.29.7
14609 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)14611 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)
14610 expo-widgets: 56.0.16(ab3f255d102c60ba0fd2bbe4e47ba584)14612 expo-widgets: 56.0.16(961c4aa6f32829b318e3c87ef20ad401)
14611 transitivePeerDependencies:14613 transitivePeerDependencies:
14612 - '@babel/core'14614 - '@babel/core'
14613 - supports-color14615 - supports-color
...@@ -15480,29 +15482,29 @@ snapshots:...@@ -15480,29 +15482,29 @@ snapshots:
1548015482
15481 expo-application@56.0.3(expo@56.0.8):15483 expo-application@56.0.3(expo@56.0.8):
15482 dependencies:15484 dependencies:
15483 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)15485 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)
1548415486
15485 expo-asset@56.0.15(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3):15487 expo-asset@56.0.15(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3):
15486 dependencies:15488 dependencies:
15487 '@expo/image-utils': 0.10.1(typescript@6.0.3)15489 '@expo/image-utils': 0.10.1(typescript@6.0.3)
15488 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)15490 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)
15489 expo-constants: 56.0.16(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))15491 expo-constants: 56.0.16(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
15490 react: 19.2.315492 react: 19.2.3
15491 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)15493 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
15492 transitivePeerDependencies:15494 transitivePeerDependencies:
15493 - supports-color15495 - supports-color
15494 - typescript15496 - typescript
1549515497
15496 expo-auth-session@56.0.13(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):15498 expo-auth-session@56.0.13(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
15497 dependencies:15499 dependencies:
15498 expo-application: 56.0.3(expo@56.0.8)15500 expo-application: 56.0.3(expo@56.0.8)
15499 expo-constants: 56.0.16(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))15501 expo-constants: 56.0.16(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
15500 expo-crypto: 56.0.4(expo@56.0.8)15502 expo-crypto: 56.0.4(expo@56.0.8)
15501 expo-linking: 56.0.13(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)15503 expo-linking: 56.0.13(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
15502 expo-web-browser: 56.0.5(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))15504 expo-web-browser: 56.0.5(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
15503 invariant: 2.2.415505 invariant: 2.2.4
15504 react: 19.2.315506 react: 19.2.3
15505 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)15507 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
15506 transitivePeerDependencies:15508 transitivePeerDependencies:
15507 - expo15509 - expo
15508 - supports-color15510 - supports-color
...@@ -15510,119 +15512,119 @@ snapshots:...@@ -15510,119 +15512,119 @@ snapshots:
15510 expo-build-properties@56.0.16(expo@56.0.8):15512 expo-build-properties@56.0.16(expo@56.0.8):
15511 dependencies:15513 dependencies:
15512 '@expo/schema-utils': 56.0.115514 '@expo/schema-utils': 56.0.1
15513 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)15515 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)
15514 resolve-from: 5.0.015516 resolve-from: 5.0.0
15515 semver: 7.8.115517 semver: 7.8.1
1551615518
15517 expo-camera@56.0.7(@types/emscripten@1.41.5)(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):15519 expo-camera@56.0.7(@types/emscripten@1.41.5)(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
15518 dependencies:15520 dependencies:
15519 barcode-detector: 3.2.0(@types/emscripten@1.41.5)15521 barcode-detector: 3.2.0(@types/emscripten@1.41.5)
15520 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)15522 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)
15521 react: 19.2.315523 react: 19.2.3
15522 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)15524 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
15523 transitivePeerDependencies:15525 transitivePeerDependencies:
15524 - '@types/emscripten'15526 - '@types/emscripten'
1552515527
15526 expo-clipboard@56.0.3(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):15528 expo-clipboard@56.0.3(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
15527 dependencies:15529 dependencies:
15528 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)15530 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)
15529 react: 19.2.315531 react: 19.2.3
15530 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)15532 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
1553115533
15532 expo-constants@56.0.16(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)):15534 expo-constants@56.0.16(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)):
15533 dependencies:15535 dependencies:
15534 '@expo/env': 2.3.015536 '@expo/env': 2.3.0
15535 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)15537 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)
15536 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)15538 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
15537 transitivePeerDependencies:15539 transitivePeerDependencies:
15538 - supports-color15540 - supports-color
1553915541
15540 expo-crypto@56.0.4(expo@56.0.8):15542 expo-crypto@56.0.4(expo@56.0.8):
15541 dependencies:15543 dependencies:
15542 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)15544 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)
1554315545
15544 expo-dev-client@56.0.18(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)):15546 expo-dev-client@56.0.18(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)):
15545 dependencies:15547 dependencies:
15546 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)15548 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)
15547 expo-dev-launcher: 56.0.18(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))15549 expo-dev-launcher: 56.0.18(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
15548 expo-dev-menu: 56.0.16(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))15550 expo-dev-menu: 56.0.16(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
15549 expo-dev-menu-interface: 56.0.1(expo@56.0.8)15551 expo-dev-menu-interface: 56.0.1(expo@56.0.8)
15550 expo-manifests: 56.0.4(expo@56.0.8)15552 expo-manifests: 56.0.4(expo@56.0.8)
15551 expo-updates-interface: 56.0.2(expo@56.0.8)15553 expo-updates-interface: 56.0.2(expo@56.0.8)
15552 transitivePeerDependencies:15554 transitivePeerDependencies:
15553 - react-native15555 - react-native
1555415556
15555 expo-dev-launcher@56.0.18(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)):15557 expo-dev-launcher@56.0.18(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)):
15556 dependencies:15558 dependencies:
15557 '@expo/schema-utils': 56.0.115559 '@expo/schema-utils': 56.0.1
15558 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)15560 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)
15559 expo-dev-menu: 56.0.16(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))15561 expo-dev-menu: 56.0.16(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
15560 expo-manifests: 56.0.4(expo@56.0.8)15562 expo-manifests: 56.0.4(expo@56.0.8)
15561 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)15563 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
1556215564
15563 expo-dev-menu-interface@56.0.1(expo@56.0.8):15565 expo-dev-menu-interface@56.0.1(expo@56.0.8):
15564 dependencies:15566 dependencies:
15565 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)15567 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)
1556615568
15567 expo-dev-menu@56.0.16(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)):15569 expo-dev-menu@56.0.16(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)):
15568 dependencies:15570 dependencies:
15569 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)15571 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)
15570 expo-dev-menu-interface: 56.0.1(expo@56.0.8)15572 expo-dev-menu-interface: 56.0.1(expo@56.0.8)
15571 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)15573 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
1557215574
15573 expo-eas-client@56.0.1: {}15575 expo-eas-client@56.0.1: {}
1557415576
15575 expo-file-system@56.0.7(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)):15577 expo-file-system@56.0.7(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)):
15576 dependencies:15578 dependencies:
15577 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)15579 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)
15578 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)15580 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
1557915581
15580 expo-font@56.0.5(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):15582 expo-font@56.0.5(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
15581 dependencies:15583 dependencies:
15582 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)15584 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)
15583 fontfaceobserver: 2.3.015585 fontfaceobserver: 2.3.0
15584 react: 19.2.315586 react: 19.2.3
15585 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)15587 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
1558615588
15587 expo-glass-effect@56.0.4(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):15589 expo-glass-effect@56.0.4(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
15588 dependencies:15590 dependencies:
15589 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)15591 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)
15590 react: 19.2.315592 react: 19.2.3
15591 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)15593 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
1559215594
15593 expo-haptics@56.0.3(expo@56.0.8):15595 expo-haptics@56.0.3(expo@56.0.8):
15594 dependencies:15596 dependencies:
15595 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)15597 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)
1559615598
15597 expo-image-loader@56.0.3(expo@56.0.8):15599 expo-image-loader@56.0.3(expo@56.0.8):
15598 dependencies:15600 dependencies:
15599 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)15601 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)
1560015602
15601 expo-image-picker@56.0.15(expo@56.0.8):15603 expo-image-picker@56.0.15(expo@56.0.8):
15602 dependencies:15604 dependencies:
15603 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)15605 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)
15604 expo-image-loader: 56.0.3(expo@56.0.8)15606 expo-image-loader: 56.0.3(expo@56.0.8)
1560515607
15606 expo-json-utils@56.0.0: {}15608 expo-json-utils@56.0.0: {}
1560715609
15608 expo-keep-awake@56.0.3(expo@56.0.8)(react@19.2.3):15610 expo-keep-awake@56.0.3(expo@56.0.8)(react@19.2.3):
15609 dependencies:15611 dependencies:
15610 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)15612 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)
15611 react: 19.2.315613 react: 19.2.3
1561215614
15613 expo-linking@56.0.13(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):15615 expo-linking@56.0.13(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
15614 dependencies:15616 dependencies:
15615 expo-constants: 56.0.16(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))15617 expo-constants: 56.0.16(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
15616 invariant: 2.2.415618 invariant: 2.2.4
15617 react: 19.2.315619 react: 19.2.3
15618 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)15620 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
15619 transitivePeerDependencies:15621 transitivePeerDependencies:
15620 - expo15622 - expo
15621 - supports-color15623 - supports-color
1562215624
15623 expo-manifests@56.0.4(expo@56.0.8):15625 expo-manifests@56.0.4(expo@56.0.8):
15624 dependencies:15626 dependencies:
15625 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)15627 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)
15626 expo-json-utils: 56.0.015628 expo-json-utils: 56.0.0
1562715629
15628 expo-modules-autolinking@56.0.14(typescript@6.0.3):15630 expo-modules-autolinking@56.0.14(typescript@6.0.3):
...@@ -15635,61 +15637,61 @@ snapshots:...@@ -15635,61 +15637,61 @@ snapshots:
15635 - supports-color15637 - supports-color
15636 - typescript15638 - typescript
1563715639
15638 expo-modules-core@56.0.14(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):15640 expo-modules-core@56.0.14(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
15639 dependencies:15641 dependencies:
15640 '@expo/expo-modules-macros-plugin': 0.0.915642 '@expo/expo-modules-macros-plugin': 0.0.9
15641 expo-modules-jsi: 56.0.7(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))15643 expo-modules-jsi: 56.0.7(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
15642 invariant: 2.2.415644 invariant: 2.2.4
15643 react: 19.2.315645 react: 19.2.3
15644 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)15646 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
15645 optionalDependencies:15647 optionalDependencies:
15646 react-native-worklets: 0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)15648 react-native-worklets: 0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
1564715649
15648 expo-modules-jsi@56.0.7(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)):15650 expo-modules-jsi@56.0.7(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)):
15649 dependencies:15651 dependencies:
15650 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)15652 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
1565115653
15652 expo-notifications@56.0.15(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3):15654 expo-notifications@56.0.15(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3):
15653 dependencies:15655 dependencies:
15654 '@expo/image-utils': 0.10.1(typescript@6.0.3)15656 '@expo/image-utils': 0.10.1(typescript@6.0.3)
15655 abort-controller: 3.0.015657 abort-controller: 3.0.0
15656 badgin: 1.2.315658 badgin: 1.2.3
15657 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)15659 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)
15658 expo-application: 56.0.3(expo@56.0.8)15660 expo-application: 56.0.3(expo@56.0.8)
15659 expo-constants: 56.0.16(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))15661 expo-constants: 56.0.16(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
15660 react: 19.2.315662 react: 19.2.3
15661 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)15663 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
15662 transitivePeerDependencies:15664 transitivePeerDependencies:
15663 - supports-color15665 - supports-color
15664 - typescript15666 - typescript
1566515667
15666 expo-paste-input@0.1.15(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):15668 expo-paste-input@0.1.15(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
15667 dependencies:15669 dependencies:
15668 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)15670 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)
15669 react: 19.2.315671 react: 19.2.3
15670 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)15672 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
1567115673
15672 expo-router@56.2.8(c021de11d02907bd585610408f5252e8):15674 expo-router@56.2.8(5bfdf39b8f760e4dc2d5c3acffc97310):
15673 dependencies:15675 dependencies:
15674 '@expo/log-box': 56.0.12(@expo/dom-webview@56.0.5)(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)15676 '@expo/log-box': 56.0.12(@expo/dom-webview@56.0.5)(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
15675 '@expo/metro-runtime': 56.0.13(@expo/log-box@56.0.12)(expo@56.0.8)(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)15677 '@expo/metro-runtime': 56.0.13(@expo/log-box@56.0.12)(expo@56.0.8)(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
15676 '@expo/schema-utils': 56.0.115678 '@expo/schema-utils': 56.0.1
15677 '@expo/ui': 56.0.15(ab3f255d102c60ba0fd2bbe4e47ba584)15679 '@expo/ui': 56.0.15(961c4aa6f32829b318e3c87ef20ad401)
15678 '@radix-ui/react-slot': 1.2.4(@types/react@19.2.16)(react@19.2.3)15680 '@radix-ui/react-slot': 1.2.4(@types/react@19.2.16)(react@19.2.3)
15679 '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)15681 '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
15680 '@react-native-masked-view/masked-view': 0.3.2(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)15682 '@react-native-masked-view/masked-view': 0.3.2(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
15681 '@testing-library/jest-dom': 6.9.115683 '@testing-library/jest-dom': 6.9.1
15682 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1)15684 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1)
15683 client-only: 0.0.115685 client-only: 0.0.1
15684 color: 4.2.315686 color: 4.2.3
15685 debug: 4.4.315687 debug: 4.4.3
15686 escape-string-regexp: 4.0.015688 escape-string-regexp: 4.0.0
15687 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)15689 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)
15688 expo-constants: 56.0.16(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))15690 expo-constants: 56.0.16(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
15689 expo-glass-effect: 56.0.4(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)15691 expo-glass-effect: 56.0.4(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
15690 expo-linking: 56.0.13(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)15692 expo-linking: 56.0.13(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
15691 expo-server: 56.0.415693 expo-server: 56.0.4
15692 expo-symbols: 56.0.5(expo-font@56.0.5)(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)15694 expo-symbols: 56.0.5(expo-font@56.0.5)(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
15693 fast-deep-equal: 3.1.315695 fast-deep-equal: 3.1.3
15694 invariant: 2.2.415696 invariant: 2.2.4
15695 nanoid: 3.3.1215697 nanoid: 3.3.12
...@@ -15697,18 +15699,18 @@ snapshots:...@@ -15697,18 +15699,18 @@ snapshots:
15697 react: 19.2.315699 react: 19.2.3
15698 react-fast-compare: 3.2.215700 react-fast-compare: 3.2.2
15699 react-is: 19.2.715701 react-is: 19.2.7
15700 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)15702 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
15701 react-native-drawer-layout: 4.2.4(react-native-gesture-handler@2.31.2(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native-reanimated@4.3.1(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)15703 react-native-drawer-layout: 4.2.4(0e9729601f58a7a7ae26c76fe6017455)
15702 react-native-safe-area-context: 5.7.0(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)15704 react-native-safe-area-context: 5.7.0(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
15703 react-native-screens: 4.25.2(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)15705 react-native-screens: 4.25.2(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
15704 server-only: 0.0.115706 server-only: 0.0.1
15705 sf-symbols-typescript: 2.2.015707 sf-symbols-typescript: 2.2.0
15706 shallowequal: 1.1.015708 shallowequal: 1.1.0
15707 vaul: 1.1.2(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)15709 vaul: 1.1.2(@types/react-dom@19.2.3(@types/react@19.2.16))(@types/react@19.2.16)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
15708 optionalDependencies:15710 optionalDependencies:
15709 react-dom: 19.2.3(react@19.2.3)15711 react-dom: 19.2.3(react@19.2.3)
15710 react-native-gesture-handler: 2.31.2(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)15712 react-native-gesture-handler: 2.31.2(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
15711 react-native-reanimated: 4.3.1(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)15713 react-native-reanimated: 4.3.1(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
15712 transitivePeerDependencies:15714 transitivePeerDependencies:
15713 - '@babel/core'15715 - '@babel/core'
15714 - '@testing-library/dom'15716 - '@testing-library/dom'
...@@ -15720,7 +15722,7 @@ snapshots:...@@ -15720,7 +15722,7 @@ snapshots:
1572015722
15721 expo-secure-store@56.0.4(expo@56.0.8):15723 expo-secure-store@56.0.4(expo@56.0.8):
15722 dependencies:15724 dependencies:
15723 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)15725 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)
1572415726
15725 expo-server@56.0.4: {}15727 expo-server@56.0.4: {}
1572615728
...@@ -15728,7 +15730,7 @@ snapshots:...@@ -15728,7 +15730,7 @@ snapshots:
15728 dependencies:15730 dependencies:
15729 '@expo/config-plugins': 56.0.8(typescript@6.0.3)15731 '@expo/config-plugins': 56.0.8(typescript@6.0.3)
15730 '@expo/image-utils': 0.10.1(typescript@6.0.3)15732 '@expo/image-utils': 0.10.1(typescript@6.0.3)
15731 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)15733 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)
15732 xml2js: 0.6.015734 xml2js: 0.6.0
15733 transitivePeerDependencies:15735 transitivePeerDependencies:
15734 - supports-color15736 - supports-color
...@@ -15736,20 +15738,20 @@ snapshots:...@@ -15736,20 +15738,20 @@ snapshots:
1573615738
15737 expo-structured-headers@56.0.0: {}15739 expo-structured-headers@56.0.0: {}
1573815740
15739 expo-symbols@56.0.5(expo-font@56.0.5)(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):15741 expo-symbols@56.0.5(expo-font@56.0.5)(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
15740 dependencies:15742 dependencies:
15741 '@expo-google-fonts/material-symbols': 0.4.3815743 '@expo-google-fonts/material-symbols': 0.4.38
15742 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)15744 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)
15743 expo-font: 56.0.5(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)15745 expo-font: 56.0.5(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
15744 react: 19.2.315746 react: 19.2.3
15745 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)15747 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
15746 sf-symbols-typescript: 2.2.015748 sf-symbols-typescript: 2.2.0
1574715749
15748 expo-updates-interface@56.0.2(expo@56.0.8):15750 expo-updates-interface@56.0.2(expo@56.0.8):
15749 dependencies:15751 dependencies:
15750 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)15752 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)
1575115753
15752 expo-updates@56.0.17(expo-dev-client@56.0.18(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)))(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):15754 expo-updates@56.0.17(expo-dev-client@56.0.18(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)))(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
15753 dependencies:15755 dependencies:
15754 '@expo/code-signing-certificates': 0.0.615756 '@expo/code-signing-certificates': 0.0.6
15755 '@expo/plist': 0.7.015757 '@expo/plist': 0.7.0
...@@ -15757,7 +15759,7 @@ snapshots:...@@ -15757,7 +15759,7 @@ snapshots:
15757 arg: 4.1.315759 arg: 4.1.3
15758 chalk: 4.1.215760 chalk: 4.1.2
15759 debug: 4.4.315761 debug: 4.4.3
15760 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)15762 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)
15761 expo-eas-client: 56.0.115763 expo-eas-client: 56.0.1
15762 expo-manifests: 56.0.4(expo@56.0.8)15764 expo-manifests: 56.0.4(expo@56.0.8)
15763 expo-structured-headers: 56.0.015765 expo-structured-headers: 56.0.0
...@@ -15767,25 +15769,25 @@ snapshots:...@@ -15767,25 +15769,25 @@ snapshots:
15767 ignore: 5.3.215769 ignore: 5.3.2
15768 nullthrows: 1.1.115770 nullthrows: 1.1.1
15769 react: 19.2.315771 react: 19.2.3
15770 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)15772 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
15771 resolve-from: 5.0.015773 resolve-from: 5.0.0
15772 optionalDependencies:15774 optionalDependencies:
15773 expo-dev-client: 56.0.18(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))15775 expo-dev-client: 56.0.18(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
15774 transitivePeerDependencies:15776 transitivePeerDependencies:
15775 - supports-color15777 - supports-color
1577615778
15777 expo-web-browser@56.0.5(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)):15779 expo-web-browser@56.0.5(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)):
15778 dependencies:15780 dependencies:
15779 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)15781 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)
15780 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)15782 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
1578115783
15782 expo-widgets@56.0.16(ab3f255d102c60ba0fd2bbe4e47ba584):15784 expo-widgets@56.0.16(961c4aa6f32829b318e3c87ef20ad401):
15783 dependencies:15785 dependencies:
15784 '@expo/plist': 0.7.015786 '@expo/plist': 0.7.0
15785 '@expo/ui': 56.0.15(ab3f255d102c60ba0fd2bbe4e47ba584)15787 '@expo/ui': 56.0.15(961c4aa6f32829b318e3c87ef20ad401)
15786 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)15788 expo: 56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)
15787 react: 19.2.315789 react: 19.2.3
15788 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)15790 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
15789 transitivePeerDependencies:15791 transitivePeerDependencies:
15790 - '@babel/core'15792 - '@babel/core'
15791 - '@types/react'15793 - '@types/react'
...@@ -15794,35 +15796,35 @@ snapshots:...@@ -15794,35 +15796,35 @@ snapshots:
15794 - react-native-reanimated15796 - react-native-reanimated
15795 - react-native-worklets15797 - react-native-worklets
1579615798
15797 expo@56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6):15799 expo@56.0.8(@babel/core@7.29.7)(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-router@56.2.8)(expo-widgets@56.0.16)(react-dom@19.2.3(react@19.2.3))(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6):
15798 dependencies:15800 dependencies:
15799 '@babel/runtime': 7.29.715801 '@babel/runtime': 7.29.7
15800 '@expo/cli': 56.1.13(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-constants@56.0.16)(expo-font@56.0.5)(expo-router@56.2.8)(expo@56.0.8)(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)15802 '@expo/cli': 56.1.13(@expo/dom-webview@56.0.5)(@expo/metro-runtime@56.0.13)(bufferutil@4.1.0)(expo-constants@56.0.16)(expo-font@56.0.5)(expo-router@56.2.8)(expo@56.0.8)(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)(utf-8-validate@6.0.6)
15801 '@expo/config': 56.0.9(typescript@6.0.3)15803 '@expo/config': 56.0.9(typescript@6.0.3)
15802 '@expo/config-plugins': 56.0.8(typescript@6.0.3)15804 '@expo/config-plugins': 56.0.8(typescript@6.0.3)
15803 '@expo/devtools': 56.0.2(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)15805 '@expo/devtools': 56.0.2(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
15804 '@expo/fingerprint': 0.19.315806 '@expo/fingerprint': 0.19.3
15805 '@expo/local-build-cache-provider': 56.0.8(typescript@6.0.3)15807 '@expo/local-build-cache-provider': 56.0.8(typescript@6.0.3)
15806 '@expo/log-box': 56.0.12(@expo/dom-webview@56.0.5)(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)15808 '@expo/log-box': 56.0.12(@expo/dom-webview@56.0.5)(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
15807 '@expo/metro': 56.0.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)15809 '@expo/metro': 56.0.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)
15808 '@expo/metro-config': 56.0.13(patch_hash=8cb08b5bb7051ed9d2dbe46a2c293c5a1e17f1bd6ddf30de27909e18c921ff46)(bufferutil@4.1.0)(expo@56.0.8)(typescript@6.0.3)(utf-8-validate@6.0.6)15810 '@expo/metro-config': 56.0.13(patch_hash=8cb08b5bb7051ed9d2dbe46a2c293c5a1e17f1bd6ddf30de27909e18c921ff46)(bufferutil@4.1.0)(expo@56.0.8)(typescript@6.0.3)(utf-8-validate@6.0.6)
15809 '@ungap/structured-clone': 1.3.115811 '@ungap/structured-clone': 1.3.1
15810 babel-preset-expo: 56.0.14(@babel/core@7.29.7)(@babel/runtime@7.29.7)(expo-widgets@56.0.16)(expo@56.0.8)(react-refresh@0.14.2)15812 babel-preset-expo: 56.0.14(@babel/core@7.29.7)(@babel/runtime@7.29.7)(expo-widgets@56.0.16)(expo@56.0.8)(react-refresh@0.14.2)
15811 expo-asset: 56.0.15(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)15813 expo-asset: 56.0.15(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3)
15812 expo-constants: 56.0.16(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))15814 expo-constants: 56.0.16(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
15813 expo-file-system: 56.0.7(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))15815 expo-file-system: 56.0.7(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))
15814 expo-font: 56.0.5(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)15816 expo-font: 56.0.5(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
15815 expo-keep-awake: 56.0.3(expo@56.0.8)(react@19.2.3)15817 expo-keep-awake: 56.0.3(expo@56.0.8)(react@19.2.3)
15816 expo-modules-autolinking: 56.0.14(typescript@6.0.3)15818 expo-modules-autolinking: 56.0.14(typescript@6.0.3)
15817 expo-modules-core: 56.0.14(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)15819 expo-modules-core: 56.0.14(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
15818 pretty-format: 29.7.015820 pretty-format: 29.7.0
15819 react: 19.2.315821 react: 19.2.3
15820 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)15822 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
15821 react-refresh: 0.14.215823 react-refresh: 0.14.2
15822 whatwg-url-minimum: 0.1.215824 whatwg-url-minimum: 0.1.2
15823 optionalDependencies:15825 optionalDependencies:
15824 '@expo/dom-webview': 56.0.5(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)15826 '@expo/dom-webview': 56.0.5(expo@56.0.8)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
15825 '@expo/metro-runtime': 56.0.13(@expo/log-box@56.0.12)(expo@56.0.8)(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)15827 '@expo/metro-runtime': 56.0.13(@expo/log-box@56.0.12)(expo@56.0.8)(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
15826 react-dom: 19.2.3(react@19.2.3)15828 react-dom: 19.2.3(react@19.2.3)
15827 transitivePeerDependencies:15829 transitivePeerDependencies:
15828 - '@babel/core'15830 - '@babel/core'
...@@ -18221,95 +18223,95 @@ snapshots:...@@ -18221,95 +18223,95 @@ snapshots:
18221 transitivePeerDependencies:18223 transitivePeerDependencies:
18222 - supports-color18224 - supports-color
1822318225
18224 react-native-drawer-layout@4.2.4(react-native-gesture-handler@2.31.2(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native-reanimated@4.3.1(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):18226 react-native-drawer-layout@4.2.4(0e9729601f58a7a7ae26c76fe6017455):
18225 dependencies:18227 dependencies:
18226 color: 4.2.318228 color: 4.2.3
18227 react: 19.2.318229 react: 19.2.3
18228 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)18230 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
18229 react-native-gesture-handler: 2.31.2(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)18231 react-native-gesture-handler: 2.31.2(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
18230 react-native-reanimated: 4.3.1(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)18232 react-native-reanimated: 4.3.1(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
18231 use-latest-callback: 0.2.6(react@19.2.3)18233 use-latest-callback: 0.2.6(react@19.2.3)
1823218234
18233 react-native-gesture-handler@2.31.2(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):18235 react-native-gesture-handler@2.31.2(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
18234 dependencies:18236 dependencies:
18235 '@egjs/hammerjs': 2.0.1718237 '@egjs/hammerjs': 2.0.17
18236 '@types/react-test-renderer': 19.1.018238 '@types/react-test-renderer': 19.1.0
18237 hoist-non-react-statics: 3.3.218239 hoist-non-react-statics: 3.3.2
18238 invariant: 2.2.418240 invariant: 2.2.4
18239 react: 19.2.318241 react: 19.2.3
18240 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)18242 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
1824118243
18242 react-native-image-viewing@0.2.2(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):18244 react-native-image-viewing@0.2.2(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
18243 dependencies:18245 dependencies:
18244 react: 19.2.318246 react: 19.2.3
18245 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)18247 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
1824618248
18247 react-native-is-edge-to-edge@1.3.1(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):18249 react-native-is-edge-to-edge@1.3.1(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
18248 dependencies:18250 dependencies:
18249 react: 19.2.318251 react: 19.2.3
18250 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)18252 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
1825118253
18252 react-native-keyboard-controller@1.21.6(react-native-reanimated@4.3.1(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):18254 react-native-keyboard-controller@1.21.6(react-native-reanimated@4.3.1(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
18253 dependencies:18255 dependencies:
18254 react: 19.2.318256 react: 19.2.3
18255 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)18257 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
18256 react-native-is-edge-to-edge: 1.3.1(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)18258 react-native-is-edge-to-edge: 1.3.1(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
18257 react-native-reanimated: 4.3.1(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)18259 react-native-reanimated: 4.3.1(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
1825818260
18259 react-native-nitro-markdown@0.5.8(react-native-nitro-modules@0.35.9(patch_hash=825622aae63a8fb5b904f3c77908a0e216261d727ea171709f2c0b6088422675)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native-svg@15.15.4(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):18261 react-native-nitro-markdown@0.5.8(react-native-nitro-modules@0.35.9(patch_hash=825622aae63a8fb5b904f3c77908a0e216261d727ea171709f2c0b6088422675)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native-svg@15.15.4(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
18260 dependencies:18262 dependencies:
18261 react: 19.2.318263 react: 19.2.3
18262 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)18264 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
18263 react-native-nitro-modules: 0.35.9(patch_hash=825622aae63a8fb5b904f3c77908a0e216261d727ea171709f2c0b6088422675)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)18265 react-native-nitro-modules: 0.35.9(patch_hash=825622aae63a8fb5b904f3c77908a0e216261d727ea171709f2c0b6088422675)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
18264 optionalDependencies:18266 optionalDependencies:
18265 react-native-svg: 15.15.4(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)18267 react-native-svg: 15.15.4(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
1826618268
18267 react-native-nitro-modules@0.35.9(patch_hash=825622aae63a8fb5b904f3c77908a0e216261d727ea171709f2c0b6088422675)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):18269 react-native-nitro-modules@0.35.9(patch_hash=825622aae63a8fb5b904f3c77908a0e216261d727ea171709f2c0b6088422675)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
18268 dependencies:18270 dependencies:
18269 react: 19.2.318271 react: 19.2.3
18270 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)18272 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
1827118273
18272 react-native-reanimated@4.3.1(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):18274 react-native-reanimated@4.3.1(react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
18273 dependencies:18275 dependencies:
18274 react: 19.2.318276 react: 19.2.3
18275 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)18277 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
18276 react-native-is-edge-to-edge: 1.3.1(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)18278 react-native-is-edge-to-edge: 1.3.1(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
18277 react-native-worklets: 0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)18279 react-native-worklets: 0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
18278 semver: 7.8.118280 semver: 7.8.1
1827918281
18280 react-native-safe-area-context@5.7.0(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):18282 react-native-safe-area-context@5.7.0(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
18281 dependencies:18283 dependencies:
18282 react: 19.2.318284 react: 19.2.3
18283 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)18285 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
1828418286
18285 react-native-screens@4.25.2(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):18287 react-native-screens@4.25.2(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
18286 dependencies:18288 dependencies:
18287 react: 19.2.318289 react: 19.2.3
18288 react-freeze: 1.0.4(react@19.2.3)18290 react-freeze: 1.0.4(react@19.2.3)
18289 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)18291 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
18290 warn-once: 0.1.118292 warn-once: 0.1.1
1829118293
18292 react-native-shiki-engine@0.3.10(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):18294 react-native-shiki-engine@0.3.10(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
18293 dependencies:18295 dependencies:
18294 '@shikijs/types': 3.23.018296 '@shikijs/types': 3.23.0
18295 '@shikijs/vscode-textmate': 10.0.218297 '@shikijs/vscode-textmate': 10.0.2
18296 react: 19.2.318298 react: 19.2.3
18297 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)18299 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
1829818300
18299 react-native-svg@15.15.4(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):18301 react-native-svg@15.15.4(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
18300 dependencies:18302 dependencies:
18301 css-select: 5.2.218303 css-select: 5.2.2
18302 css-tree: 1.1.318304 css-tree: 1.1.3
18303 react: 19.2.318305 react: 19.2.3
18304 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)18306 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
18305 warn-once: 0.1.118307 warn-once: 0.1.1
1830618308
18307 react-native-url-polyfill@2.0.0(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)):18309 react-native-url-polyfill@2.0.0(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)):
18308 dependencies:18310 dependencies:
18309 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)18311 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
18310 whatwg-url-without-unicode: 8.0.0-318312 whatwg-url-without-unicode: 8.0.0-3
1831118313
18312 react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):18314 react-native-worklets@0.8.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3):
18313 dependencies:18315 dependencies:
18314 '@babel/core': 7.29.718316 '@babel/core': 7.29.7
18315 '@babel/plugin-transform-arrow-functions': 7.29.7(@babel/core@7.29.7)18317 '@babel/plugin-transform-arrow-functions': 7.29.7(@babel/core@7.29.7)
...@@ -18321,23 +18323,23 @@ snapshots:...@@ -18321,23 +18323,23 @@ snapshots:
18321 '@babel/plugin-transform-template-literals': 7.29.7(@babel/core@7.29.7)18323 '@babel/plugin-transform-template-literals': 7.29.7(@babel/core@7.29.7)
18322 '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.7)18324 '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.7)
18323 '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7)18325 '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7)
18324 '@react-native/metro-config': 0.85.3(@babel/core@7.29.7)18326 '@react-native/metro-config': 0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6)
18325 convert-source-map: 2.0.018327 convert-source-map: 2.0.0
18326 react: 19.2.318328 react: 19.2.3
18327 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)18329 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
18328 semver: 7.8.118330 semver: 7.8.1
18329 transitivePeerDependencies:18331 transitivePeerDependencies:
18330 - supports-color18332 - supports-color
1833118333
18332 react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6):18334 react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6):
18333 dependencies:18335 dependencies:
18334 '@react-native/assets-registry': 0.85.318336 '@react-native/assets-registry': 0.85.3
18335 '@react-native/codegen': 0.85.3(@babel/core@7.29.7)18337 '@react-native/codegen': 0.85.3(@babel/core@7.29.7)
18336 '@react-native/community-cli-plugin': 0.85.3(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(bufferutil@4.1.0)(utf-8-validate@6.0.6)18338 '@react-native/community-cli-plugin': 0.85.3(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(bufferutil@4.1.0)(utf-8-validate@6.0.6)
18337 '@react-native/gradle-plugin': 0.85.318339 '@react-native/gradle-plugin': 0.85.3
18338 '@react-native/js-polyfills': 0.85.318340 '@react-native/js-polyfills': 0.85.3
18339 '@react-native/normalize-colors': 0.85.318341 '@react-native/normalize-colors': 0.85.3
18340 '@react-native/virtualized-lists': 0.85.3(@types/react@19.2.16)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)18342 '@react-native/virtualized-lists': 0.85.3(@types/react@19.2.16)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)
18341 abort-controller: 3.0.018343 abort-controller: 3.0.0
18342 anser: 1.4.1018344 anser: 1.4.10
18343 ansi-regex: 5.0.118345 ansi-regex: 5.0.1
...@@ -19370,14 +19372,14 @@ snapshots:...@@ -19370,14 +19372,14 @@ snapshots:
1937019372
19371 universalify@2.0.1: {}19373 universalify@2.0.1: {}
1937219374
19373 uniwind@1.7.0(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(tailwindcss@4.3.0):19375 uniwind@1.7.0(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6))(react@19.2.3)(tailwindcss@4.3.0):
19374 dependencies:19376 dependencies:
19375 '@tailwindcss/node': 4.2.119377 '@tailwindcss/node': 4.2.1
19376 '@tailwindcss/oxide': 4.2.119378 '@tailwindcss/oxide': 4.2.1
19377 culori: 4.0.219379 culori: 4.0.2
19378 lightningcss: 1.30.119380 lightningcss: 1.30.1
19379 react: 19.2.319381 react: 19.2.3
19380 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)19382 react-native: 0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.3)(utf-8-validate@6.0.6)
19381 tailwindcss: 4.3.019383 tailwindcss: 4.3.0
1938219384
19383 unpipe@1.0.0: {}19385 unpipe@1.0.0: {}