authorgravatar for jakeleventhal@me.comJake Leventhal <jakeleventhal@me.com> 2026-07-29 13:06:39-04:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-07-29 19:06:39+02:00
logfc28abf24b034502402cba1fedf5fa38658ee2e8
tree63b6c0043d848dae8e8dd2ce0b3f9667fc3c5737
parent85a89868703530e03c5e79797c7b952c684bd222
signature Signed by PGP key B5690EEEBB952194

Fix editable file focus and live syntax highlighting (#3979)


7 files changed, 178 insertions(+), 103 deletions(-)

apps/web/src/components/files/FilePreviewPanel.tsx+13-5
...@@ -7,7 +7,7 @@ import type {...@@ -7,7 +7,7 @@ import type {
7import { isWorkspaceImagePreviewPath } from "@t3tools/shared/filePreview";7import { isWorkspaceImagePreviewPath } from "@t3tools/shared/filePreview";
8import { VirtualizedFile, type SelectedLineRange } from "@pierre/diffs";8import { VirtualizedFile, type SelectedLineRange } from "@pierre/diffs";
9import { Editor } from "@pierre/diffs/editor";9import { Editor } from "@pierre/diffs/editor";
10import { EditorProvider, File, type FileOptions, Virtualizer } from "@pierre/diffs/react";10import { EditProvider, File, type FileOptions, Virtualizer } from "@pierre/diffs/react";
11import {11import {
12 isAtomCommandInterrupted,12 isAtomCommandInterrupted,
13 squashAtomCommandFailure,13 squashAtomCommandFailure,
...@@ -52,7 +52,7 @@ import {...@@ -52,7 +52,7 @@ import {
52} from "./fileCommentAnnotations";52} from "./fileCommentAnnotations";
53import { installFileEditorDismissal } from "./fileEditorDismissal";53import { installFileEditorDismissal } from "./fileEditorDismissal";
54import { LocalCommentAnnotation } from "./LocalCommentAnnotation";54import { LocalCommentAnnotation } from "./LocalCommentAnnotation";
55import { projectFileCacheKey } from "./fileContentRevision";55import { projectFileCacheKey, projectFileEditorCacheKey } from "./fileContentRevision";
56import { fileBreadcrumbs } from "./filePath";56import { fileBreadcrumbs } from "./filePath";
57import { isMarkdownPreviewFile, setMarkdownTaskChecked } from "./filePreviewMode";57import { isMarkdownPreviewFile, setMarkdownTaskChecked } from "./filePreviewMode";
58import { FileSaveCoordinator } from "./fileSaveCoordinator";58import { FileSaveCoordinator } from "./fileSaveCoordinator";
...@@ -364,6 +364,8 @@ function EditableFileSurface({...@@ -364,6 +364,8 @@ function EditableFileSurface({
364 const editor = useMemo(364 const editor = useMemo(
365 () =>365 () =>
366 new Editor<FileCommentAnnotationGroup>({366 new Editor<FileCommentAnnotationGroup>({
367 persistState: true,
368 persistStateStorage: "inMemory",
367 onChange: (file, nextLineAnnotations) => {369 onChange: (file, nextLineAnnotations) => {
368 setProjectFileQueryData(environmentId, cwd, relativePath, file.contents);370 setProjectFileQueryData(environmentId, cwd, relativePath, file.contents);
369 saveCoordinator.change(file.contents);371 saveCoordinator.change(file.contents);
...@@ -536,7 +538,7 @@ function EditableFileSurface({...@@ -536,7 +538,7 @@ function EditableFileSurface({
536 );538 );
537539
538 return (540 return (
539 <EditorProvider editor={editor}>541 <EditProvider editor={editor}>
540 <div ref={surfaceRef} className="flex min-h-0 flex-1">542 <div ref={surfaceRef} className="flex min-h-0 flex-1">
541 <Virtualizer543 <Virtualizer
542 className="file-preview-virtualizer min-h-0 flex-1 overflow-auto"544 className="file-preview-virtualizer min-h-0 flex-1 overflow-auto"
...@@ -549,7 +551,13 @@ function EditableFileSurface({...@@ -549,7 +551,13 @@ function EditableFileSurface({
549 file={{551 file={{
550 name: relativePath,552 name: relativePath,
551 contents,553 contents,
552 cacheKey: projectFileCacheKey(cwd, relativePath, contents),554 cacheKey: projectFileEditorCacheKey(
555 environmentId,
556 cwd,
557 relativePath,
558 contents,
559 editor.getFile(),
560 ),
553 }}561 }}
554 options={{562 options={{
555 disableFileHeader: true,563 disableFileHeader: true,
...@@ -586,7 +594,7 @@ function EditableFileSurface({...@@ -586,7 +594,7 @@ function EditableFileSurface({
586 />594 />
587 </Virtualizer>595 </Virtualizer>
588 </div>596 </div>
589 </EditorProvider>597 </EditProvider>
590 );598 );
591}599}
592600
apps/web/src/components/files/fileContentRevision.test.ts+28-1
...@@ -1,6 +1,10 @@...@@ -1,6 +1,10 @@
1import { describe, expect, it } from "vite-plus/test";1import { describe, expect, it } from "vite-plus/test";
22
3import { fileContentRevision, projectFileCacheKey } from "./fileContentRevision";3import {
4 fileContentRevision,
5 projectFileCacheKey,
6 projectFileEditorCacheKey,
7} from "./fileContentRevision";
48
5describe("fileContentRevision", () => {9describe("fileContentRevision", () => {
6 it("changes for same-length edits", () => {10 it("changes for same-length edits", () => {
...@@ -12,4 +16,27 @@ describe("fileContentRevision", () => {...@@ -12,4 +16,27 @@ describe("fileContentRevision", () => {
12 projectFileCacheKey("/repo", "file.json", "contents"),16 projectFileCacheKey("/repo", "file.json", "contents"),
13 );17 );
14 });18 });
19
20 it("keeps editor identity stable for locally edited contents", () => {
21 const cacheKey = projectFileEditorCacheKey("local", "/repo", "file.json", "after", undefined);
22
23 expect(
24 projectFileEditorCacheKey("local", "/repo", "file.json", "after edit", {
25 cacheKey,
26 contents: "after edit",
27 }),
28 ).toBe(cacheKey);
29 });
30
31 it("rotates editor identity for external contents and environments", () => {
32 const cacheKey = projectFileEditorCacheKey("local", "/repo", "file.json", "before", undefined);
33 const editorFile = { cacheKey, contents: "before" };
34
35 expect(
36 projectFileEditorCacheKey("local", "/repo", "file.json", "external edit", editorFile),
37 ).not.toBe(cacheKey);
38 expect(projectFileEditorCacheKey("remote", "/repo", "file.json", "before", undefined)).not.toBe(
39 cacheKey,
40 );
41 });
15});42});
apps/web/src/components/files/fileContentRevision.ts+18
...@@ -10,3 +10,21 @@ export function fileContentRevision(contents: string): string {...@@ -10,3 +10,21 @@ export function fileContentRevision(contents: string): string {
10export function projectFileCacheKey(cwd: string, relativePath: string, contents: string): string {10export function projectFileCacheKey(cwd: string, relativePath: string, contents: string): string {
11 return `${cwd}:${relativePath}:${fileContentRevision(contents)}`;11 return `${cwd}:${relativePath}:${fileContentRevision(contents)}`;
12}12}
13
14interface EditorFileIdentity {
15 readonly cacheKey?: string;
16 readonly contents: string;
17}
18
19export function projectFileEditorCacheKey(
20 environmentId: string,
21 cwd: string,
22 relativePath: string,
23 contents: string,
24 editorFile: EditorFileIdentity | undefined,
25): string {
26 if (editorFile?.contents === contents && editorFile.cacheKey) {
27 return editorFile.cacheKey;
28 }
29 return `editor:${environmentId}:${projectFileCacheKey(cwd, relativePath, contents)}`;
30}
patches/@pierre%2Fdiffs@1.3.0-beta.10.patch created+85
...@@ -0,0 +1,85 @@
1diff --git a/dist/editor/editor.js b/dist/editor/editor.js
2index ff78e2a..f9df318 100644
3--- a/dist/editor/editor.js
4+++ b/dist/editor/editor.js
5@@ -146,14 +146,11 @@ var Editor = class {
6 const file = fileInstance.__getCurrentFile?.();
7 if (file !== void 0) requirePersistedCacheKey(file);
8 }
9- const { useTokenTransformer, enableGutterUtility, enableLineSelection, lineHoverHighlight = "disabled", ...rest } = fileInstance.options;
10- if (useTokenTransformer !== true || enableGutterUtility === true || enableLineSelection === true || lineHoverHighlight !== "disabled") {
11+ const { useTokenTransformer, ...rest } = fileInstance.options;
12+ if (useTokenTransformer !== true) {
13 fileInstance.setOptions({
14 ...rest,
15- useTokenTransformer: true,
16- enableGutterUtility: false,
17- enableLineSelection: false,
18- lineHoverHighlight: "disabled"
19+ useTokenTransformer: true
20 });
21 fileInstance.rerender();
22 }
23@@ -908,6 +905,7 @@ var Editor = class {
24 return lineNumber - 1;
25 };
26 this.#editorEventDisposes.push(addEventListener(gutterEl, "pointerdown", (e) => {
27+ if (this.#fileInstance?.options.enableLineSelection === true) return;
28 const gutterRow = resolveGutterTarget(e.composedPath()[0]);
29 if (gutterRow?.dataset.lineType === "change-deletion") {
30 const code = gutterRow.closest("[data-code]");
31@@ -1522,6 +1520,7 @@ var Editor = class {
32 if (gutterEl !== void 0) gutterEl.style.gridRow = "span " + gridRow;
33 }
34 fileInstance.updateRenderCache(dirtyLines, tokenizer.themeType, !didLineCountChange, didLineCountChange);
35+ if (fileInstance.file !== void 0) fileInstance.file.contents = textDocument.getText();
36 if (didLineCountChange) fileInstance.applyDocumentChange(textDocument, newLineAnnotations, shouldUpdateBuffer);
37 if (this.#isDiff && (this.#diffSyle === "unified" || didLineCountChange)) this.#resetCache();
38 if (newLineAnnotations !== void 0) {
39@@ -1788,6 +1787,7 @@ var Editor = class {
40 }
41 }
42 #setSelectedLinesSafe(range, lineNumberOnly = false) {
43+ if (this.#fileInstance?.options.controlledSelection === true) return;
44 try {
45 this.#fileInstance?.setSelectedLines(range, {
46 notify: false,
47diff --git a/dist/react/utils/useFileInstance.js b/dist/react/utils/useFileInstance.js
48index e9f62f5..af82a46 100644
49--- a/dist/react/utils/useFileInstance.js
50+++ b/dist/react/utils/useFileInstance.js
51@@ -91,10 +91,7 @@ function mergeFileOptions({ options, controlledSelection, contentEditable, hasCu
52 };
53 if (needsEditorOptions) merged = {
54 ...merged,
55- useTokenTransformer: true,
56- enableGutterUtility: false,
57- enableLineSelection: false,
58- lineHoverHighlight: "disabled"
59+ useTokenTransformer: true
60 };
61 return merged;
62 }
63diff --git a/package.json b/package.json
64index ff61c90..1e170e5 100644
65--- a/package.json
66+++ b/package.json
67@@ -55,6 +55,18 @@
68 "./worker/worker-portable.js": {
69 "types": "./dist/worker/worker-portable.d.ts",
70 "import": "./dist/worker/worker-portable.js"
71+ },
72+ "./types": {
73+ "types": "./dist/types.d.ts",
74+ "import": "./dist/types.js"
75+ },
76+ "./utils/getFiletypeFromFileName": {
77+ "types": "./dist/utils/getFiletypeFromFileName.d.ts",
78+ "import": "./dist/utils/getFiletypeFromFileName.js"
79+ },
80+ "./utils/parsePatchFiles": {
81+ "types": "./dist/utils/parsePatchFiles.d.ts",
82+ "import": "./dist/utils/parsePatchFiles.js"
83 }
84 },
85 "publishConfig": {
patches/@pierre%2Fdiffs@1.3.0-beta.5.patch deleted-69
...@@ -1,69 +0,0 @@
1diff --git a/dist/editor/editor.js b/dist/editor/editor.js
2index e8013fc6eb6f243a6c912facf3fc0319ac66a8d0..80c82df4cdeb828bd331f5ec2f443d216bedc304 100644
3--- a/dist/editor/editor.js
4+++ b/dist/editor/editor.js
5@@ -77,15 +77,12 @@ var Editor = class {
6 this.#options = options;
7 }
8 edit(component) {
9- const { useTokenTransformer, enableGutterUtility, enableLineSelection, expandUnchanged, diffStyle, lineHoverHighlight,...rest } = component.options;
10+ const { useTokenTransformer, expandUnchanged, diffStyle,...rest } = component.options;
11 const isDiff = component.type === "file-diff";
12- if (useTokenTransformer !== true || enableGutterUtility === true || enableLineSelection === true || lineHoverHighlight !== "disabled" || expandUnchanged !== true && isDiff || diffStyle === "unified" && isDiff) {
13+ if (useTokenTransformer !== true || expandUnchanged !== true && isDiff || diffStyle === "unified" && isDiff) {
14 component.setOptions({
15 ...rest,
16 useTokenTransformer: true,
17- enableGutterUtility: false,
18- enableLineSelection: false,
19- lineHoverHighlight: "disabled",
20 expandUnchanged: true,
21 diffStyle: "split"
22 });
23@@ -511,6 +508,7 @@ var Editor = class {
24 return lineNumber - 1;
25 };
26 this.#editorEventDisposes.push(addEventListener(gutterEl, "pointerdown", (e) => {
27+ if (this.#fileInstance?.options.enableLineSelection === true) return;
28 const textDocument = this.#textDocument;
29 const lineIndex = resolveEditableLine(resolveGutterTarget(e.composedPath()[0]));
30 if (lineIndex === void 0 || textDocument === void 0) return;
31diff --git a/dist/react/utils/useFileInstance.js b/dist/react/utils/useFileInstance.js
32index cb8e2026fb5d7a19f489c0a2402efbcb7dff3322..510fad6364d4a2214c7dd65fe2b114f1cce0c815 100644
33--- a/dist/react/utils/useFileInstance.js
34+++ b/dist/react/utils/useFileInstance.js
35@@ -92,10 +92,7 @@ function mergeFileOptions({ options, controlledSelection, contentEditable, hasCu
36 };
37 if (needsEditorOptions) merged = {
38 ...merged,
39- useTokenTransformer: true,
40- enableGutterUtility: false,
41- enableLineSelection: false,
42- lineHoverHighlight: "disabled"
43+ useTokenTransformer: true
44 };
45 return merged;
46 }
47diff --git a/package.json b/package.json
48index d1558633de87044b7aa96cff09443db11f163cec..c0b16f0a0bec6fba2026f24f38b2c0a8fa06af7c 100644
49--- a/package.json
50+++ b/package.json
51@@ -55,6 +55,18 @@
52 "./worker/worker-portable.js": {
53 "types": "./dist/worker/worker-portable.d.ts",
54 "import": "./dist/worker/worker-portable.js"
55+ },
56+ "./types": {
57+ "types": "./dist/types.d.ts",
58+ "import": "./dist/types.js"
59+ },
60+ "./utils/getFiletypeFromFileName": {
61+ "types": "./dist/utils/getFiletypeFromFileName.d.ts",
62+ "import": "./dist/utils/getFiletypeFromFileName.js"
63+ },
64+ "./utils/parsePatchFiles": {
65+ "types": "./dist/utils/parsePatchFiles.d.ts",
66+ "import": "./dist/utils/parsePatchFiles.js"
67 }
68 },
69 "publishConfig": {
pnpm-lock.yaml+32-26
...@@ -19,8 +19,8 @@ catalogs:...@@ -19,8 +19,8 @@ catalogs:
19 specifier: 1.8.019 specifier: 1.8.0
20 version: 1.8.020 version: 1.8.0
21 '@pierre/diffs':21 '@pierre/diffs':
22 specifier: 1.3.0-beta.522 specifier: 1.3.0-beta.10
23 version: 1.3.0-beta.523 version: 1.3.0-beta.10
24 '@typescript/native-preview':24 '@typescript/native-preview':
25 specifier: 7.0.0-dev.20260604.125 specifier: 7.0.0-dev.20260604.1
26 version: 7.0.0-dev.20260604.126 version: 7.0.0-dev.20260604.1
...@@ -75,7 +75,7 @@ patchedDependencies:...@@ -75,7 +75,7 @@ patchedDependencies:
75 '@expo/metro-config@56.0.14': 8cb08b5bb7051ed9d2dbe46a2c293c5a1e17f1bd6ddf30de27909e18c921ff4675 '@expo/metro-config@56.0.14': 8cb08b5bb7051ed9d2dbe46a2c293c5a1e17f1bd6ddf30de27909e18c921ff46
76 '@ff-labs/fff-node@0.9.4': 2b16019ce7ab61aec6478dd02f79ef468cc1d5c51e9d00764f7d2ab8167210c876 '@ff-labs/fff-node@0.9.4': 2b16019ce7ab61aec6478dd02f79ef468cc1d5c51e9d00764f7d2ab8167210c8
77 '@legendapp/list@3.2.0': 9203ec3db86574a31e157a265cefd8997b259cc420a0c4c61c580c80ed8cf78d77 '@legendapp/list@3.2.0': 9203ec3db86574a31e157a265cefd8997b259cc420a0c4c61c580c80ed8cf78d
78 '@pierre/diffs@1.3.0-beta.5': 7cb6da88544119adda056b2f46f43956f99326227732da0b345081e285a6c53a78 '@pierre/diffs@1.3.0-beta.10': 7ef7cb0cbabb17c15cdb137554068b36f15f6f5265e73fb51452aa3380db91aa
79 '@react-native-menu/menu@2.0.0': 5ea3ae4bf1d9baf5443b65c269bb09621c27a68d556f713778f37b1e8d46aaae79 '@react-native-menu/menu@2.0.0': 5ea3ae4bf1d9baf5443b65c269bb09621c27a68d556f713778f37b1e8d46aaae
80 '@react-navigation/native-stack@7.17.6': c7fc101b78d434904425e5a24c22fb0042298dec6f807250486e784f3c71727380 '@react-navigation/native-stack@7.17.6': c7fc101b78d434904425e5a24c22fb0042298dec6f807250486e784f3c717273
81 effect@4.0.0-beta.102: 71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d48881 effect@4.0.0-beta.102: 71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488
...@@ -222,7 +222,7 @@ importers:...@@ -222,7 +222,7 @@ importers:
222 version: 1.8.0222 version: 1.8.0
223 '@pierre/diffs':223 '@pierre/diffs':
224 specifier: 'catalog:'224 specifier: 'catalog:'
225 version: 1.3.0-beta.5(patch_hash=7cb6da88544119adda056b2f46f43956f99326227732da0b345081e285a6c53a)(@shikijs/themes@4.2.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)225 version: 1.3.0-beta.10(patch_hash=7ef7cb0cbabb17c15cdb137554068b36f15f6f5265e73fb51452aa3380db91aa)(@shikijs/themes@4.2.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
226 '@react-native-menu/menu':226 '@react-native-menu/menu':
227 specifier: ^2.0.0227 specifier: ^2.0.0
228 version: 2.0.0(patch_hash=5ea3ae4bf1d9baf5443b65c269bb09621c27a68d556f713778f37b1e8d46aaae)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-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)228 version: 2.0.0(patch_hash=5ea3ae4bf1d9baf5443b65c269bb09621c27a68d556f713778f37b1e8d46aaae)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-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)
...@@ -466,7 +466,7 @@ importers:...@@ -466,7 +466,7 @@ importers:
466 version: 1.15.13466 version: 1.15.13
467 '@pierre/diffs':467 '@pierre/diffs':
468 specifier: 'catalog:'468 specifier: 'catalog:'
469 version: 1.3.0-beta.5(patch_hash=7cb6da88544119adda056b2f46f43956f99326227732da0b345081e285a6c53a)(@shikijs/themes@4.3.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)469 version: 1.3.0-beta.10(patch_hash=7ef7cb0cbabb17c15cdb137554068b36f15f6f5265e73fb51452aa3380db91aa)(@shikijs/themes@4.3.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
470 effect:470 effect:
471 specifier: 4.0.0-beta.102471 specifier: 4.0.0-beta.102
472 version: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)472 version: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)
...@@ -551,7 +551,7 @@ importers:...@@ -551,7 +551,7 @@ importers:
551 version: 0.41.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(yjs@13.6.31)551 version: 0.41.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(yjs@13.6.31)
552 '@pierre/diffs':552 '@pierre/diffs':
553 specifier: 'catalog:'553 specifier: 'catalog:'
554 version: 1.3.0-beta.5(patch_hash=7cb6da88544119adda056b2f46f43956f99326227732da0b345081e285a6c53a)(@shikijs/themes@4.3.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)554 version: 1.3.0-beta.10(patch_hash=7ef7cb0cbabb17c15cdb137554068b36f15f6f5265e73fb51452aa3380db91aa)(@shikijs/themes@4.3.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
555 '@pierre/trees':555 '@pierre/trees':
556 specifier: 1.0.0-beta.4556 specifier: 1.0.0-beta.4
557 version: 1.0.0-beta.4(react-dom@19.2.6(react@19.2.6))(react@19.2.6)557 version: 1.0.0-beta.4(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
...@@ -3584,20 +3584,20 @@ packages:...@@ -3584,20 +3584,20 @@ packages:
3584 resolution: {integrity: sha512-ODOov0sGMJMf3jPonOkgGqPknTsu+DdQ7kD++gz8aI+aFMOMHFbWAA2taqXXVTdP+OTOQR/znGvSpmkeI0WTYQ==}3584 resolution: {integrity: sha512-ODOov0sGMJMf3jPonOkgGqPknTsu+DdQ7kD++gz8aI+aFMOMHFbWAA2taqXXVTdP+OTOQR/znGvSpmkeI0WTYQ==}
3585 engines: {node: '>=14.18.0'}3585 engines: {node: '>=14.18.0'}
35863586
3587 '@pierre/diffs@1.3.0-beta.5':3587 '@pierre/diffs@1.3.0-beta.10':
3588 resolution: {integrity: sha512-d7449IY6Phcg9LCRLbPxhsxn6Bv4KoaP/vPyZtGu2uR1SFsSJPQcRoPf8lzyobNGKD0GZGuhgHW5LrOlilFo7w==}3588 resolution: {integrity: sha512-efyFM9GRfI6WkmHJP0CnZBopuM8yCwGqIKbZHoe1D5PV15VDkr7Vpi8EZt40AYrN1km//utQtYhHDSwt2KwjSg==}
3589 peerDependencies:3589 peerDependencies:
3590 react: ^18.3.1 || ^19.0.03590 react: ^18.3.1 || ^19.0.0
3591 react-dom: ^18.3.1 || ^19.0.03591 react-dom: ^18.3.1 || ^19.0.0
35923592
3593 '@pierre/theme@1.0.3':3593 '@pierre/theme@1.1.0':
3594 resolution: {integrity: sha512-sWHv11TMoqKxKDgTIk5VbhQjdPhs8DCcBxbjh3mRlS3YOM/OcrWoGX6MM8eBGn9cUu3M46Py0JnxsG2nJaFTuA==}3594 resolution: {integrity: sha512-GC2OWTAfTIIWWYhPCygwG8t2EtePQkRfON4MI2rwIkJylmiyqIttJID2dCL8sUD8cNdEvYkEyfEHHKMeCiDLoQ==}
3595 engines: {vscode: ^1.0.0}3595 engines: {vscode: ^1.0.0}
35963596
3597 '@pierre/theming@0.0.1':3597 '@pierre/theming@0.0.2':
3598 resolution: {integrity: sha512-1thlEtJbqdyLzc1ZS2KQa1q7FzDGHT4dTEdKHoyQjOMeWWOmbVG5/ndEfOKfAb5Fzkz8cNJrOjFLiZoDH/A03A==}3598 resolution: {integrity: sha512-QM1M4stXfnzfaE8I8YbjXSApV8c+2dBsXJj8eYg9WTpBR/cTmCZIcfGnN4p13iRrYu2Br/R/OJfEL7uR8Qjctw==}
3599 peerDependencies:3599 peerDependencies:
3600 '@pierre/theme': ^1.0.03600 '@pierre/theme': ^1.1.0
3601 '@shikijs/themes': ^3.0.0 || ^4.0.03601 '@shikijs/themes': ^3.0.0 || ^4.0.0
3602 react: ^18.3.1 || ^19.0.03602 react: ^18.3.1 || ^19.0.0
3603 react-dom: ^18.3.1 || ^19.0.03603 react-dom: ^18.3.1 || ^19.0.0
...@@ -6104,6 +6104,10 @@ packages:...@@ -6104,6 +6104,10 @@ packages:
6104 resolution: {integrity: sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==}6104 resolution: {integrity: sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==}
6105 engines: {node: '>=0.3.1'}6105 engines: {node: '>=0.3.1'}
61066106
6107 diff@9.0.0:
6108 resolution: {integrity: sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw==}
6109 engines: {node: '>=0.3.1'}
6110
6107 dir-compare@4.2.0:6111 dir-compare@4.2.0:
6108 resolution: {integrity: sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==}6112 resolution: {integrity: sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==}
61096113
...@@ -13569,12 +13573,12 @@ snapshots:...@@ -13569,12 +13573,12 @@ snapshots:
13569 tslib: 2.8.113573 tslib: 2.8.1
13570 webcrypto-core: 1.9.213574 webcrypto-core: 1.9.2
1357113575
13572 '@pierre/diffs@1.3.0-beta.5(patch_hash=7cb6da88544119adda056b2f46f43956f99326227732da0b345081e285a6c53a)(@shikijs/themes@4.2.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':13576 '@pierre/diffs@1.3.0-beta.10(patch_hash=7ef7cb0cbabb17c15cdb137554068b36f15f6f5265e73fb51452aa3380db91aa)(@shikijs/themes@4.2.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
13573 dependencies:13577 dependencies:
13574 '@pierre/theme': 1.0.313578 '@pierre/theme': 1.1.0
13575 '@pierre/theming': 0.0.1(@pierre/theme@1.0.3)(@shikijs/themes@4.2.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(shiki@4.2.0)13579 '@pierre/theming': 0.0.2(@pierre/theme@1.1.0)(@shikijs/themes@4.2.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(shiki@4.2.0)
13576 '@shikijs/transformers': 4.2.013580 '@shikijs/transformers': 4.2.0
13577 diff: 8.0.313581 diff: 9.0.0
13578 hast-util-to-html: 9.0.513582 hast-util-to-html: 9.0.5
13579 lru_map: 0.4.113583 lru_map: 0.4.1
13580 react: 19.2.313584 react: 19.2.3
...@@ -13583,12 +13587,12 @@ snapshots:...@@ -13583,12 +13587,12 @@ snapshots:
13583 transitivePeerDependencies:13587 transitivePeerDependencies:
13584 - '@shikijs/themes'13588 - '@shikijs/themes'
1358513589
13586 '@pierre/diffs@1.3.0-beta.5(patch_hash=7cb6da88544119adda056b2f46f43956f99326227732da0b345081e285a6c53a)(@shikijs/themes@4.3.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':13590 '@pierre/diffs@1.3.0-beta.10(patch_hash=7ef7cb0cbabb17c15cdb137554068b36f15f6f5265e73fb51452aa3380db91aa)(@shikijs/themes@4.3.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)':
13587 dependencies:13591 dependencies:
13588 '@pierre/theme': 1.0.313592 '@pierre/theme': 1.1.0
13589 '@pierre/theming': 0.0.1(@pierre/theme@1.0.3)(@shikijs/themes@4.3.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(shiki@4.2.0)13593 '@pierre/theming': 0.0.2(@pierre/theme@1.1.0)(@shikijs/themes@4.3.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(shiki@4.2.0)
13590 '@shikijs/transformers': 4.2.013594 '@shikijs/transformers': 4.2.0
13591 diff: 8.0.313595 diff: 9.0.0
13592 hast-util-to-html: 9.0.513596 hast-util-to-html: 9.0.5
13593 lru_map: 0.4.113597 lru_map: 0.4.1
13594 react: 19.2.613598 react: 19.2.6
...@@ -13597,19 +13601,19 @@ snapshots:...@@ -13597,19 +13601,19 @@ snapshots:
13597 transitivePeerDependencies:13601 transitivePeerDependencies:
13598 - '@shikijs/themes'13602 - '@shikijs/themes'
1359913603
13600 '@pierre/theme@1.0.3': {}13604 '@pierre/theme@1.1.0': {}
1360113605
13602 '@pierre/theming@0.0.1(@pierre/theme@1.0.3)(@shikijs/themes@4.2.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(shiki@4.2.0)':13606 '@pierre/theming@0.0.2(@pierre/theme@1.1.0)(@shikijs/themes@4.2.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(shiki@4.2.0)':
13603 optionalDependencies:13607 optionalDependencies:
13604 '@pierre/theme': 1.0.313608 '@pierre/theme': 1.1.0
13605 '@shikijs/themes': 4.2.013609 '@shikijs/themes': 4.2.0
13606 react: 19.2.313610 react: 19.2.3
13607 react-dom: 19.2.3(react@19.2.3)13611 react-dom: 19.2.3(react@19.2.3)
13608 shiki: 4.2.013612 shiki: 4.2.0
1360913613
13610 '@pierre/theming@0.0.1(@pierre/theme@1.0.3)(@shikijs/themes@4.3.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(shiki@4.2.0)':13614 '@pierre/theming@0.0.2(@pierre/theme@1.1.0)(@shikijs/themes@4.3.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(shiki@4.2.0)':
13611 optionalDependencies:13615 optionalDependencies:
13612 '@pierre/theme': 1.0.313616 '@pierre/theme': 1.1.0
13613 '@shikijs/themes': 4.3.013617 '@shikijs/themes': 4.3.0
13614 react: 19.2.613618 react: 19.2.6
13615 react-dom: 19.2.6(react@19.2.6)13619 react-dom: 19.2.6(react@19.2.6)
...@@ -16379,6 +16383,8 @@ snapshots:...@@ -16379,6 +16383,8 @@ snapshots:
1637916383
16380 diff@8.0.3: {}16384 diff@8.0.3: {}
1638116385
16386 diff@9.0.0: {}
16387
16382 dir-compare@4.2.0:16388 dir-compare@4.2.0:
16383 dependencies:16389 dependencies:
16384 minimatch: 3.1.516390 minimatch: 3.1.5
pnpm-workspace.yaml+2-2
...@@ -41,7 +41,7 @@ catalog:...@@ -41,7 +41,7 @@ catalog:
41 "@effect/vitest": 4.0.0-beta.10241 "@effect/vitest": 4.0.0-beta.102
42 "@noble/curves": 1.9.142 "@noble/curves": 1.9.1
43 "@noble/hashes": 1.8.043 "@noble/hashes": 1.8.0
44 "@pierre/diffs": 1.3.0-beta.544 "@pierre/diffs": 1.3.0-beta.10
45 "@types/node": 24.12.445 "@types/node": 24.12.4
46 "@typescript/native-preview": 7.0.0-dev.20260604.146 "@typescript/native-preview": 7.0.0-dev.20260604.1
47 effect: 4.0.0-beta.10247 effect: 4.0.0-beta.102
...@@ -128,7 +128,7 @@ patchedDependencies:...@@ -128,7 +128,7 @@ patchedDependencies:
128 "@expo/metro-config@56.0.14": patches/@expo%2Fmetro-config@56.0.14.patch128 "@expo/metro-config@56.0.14": patches/@expo%2Fmetro-config@56.0.14.patch
129 "@ff-labs/fff-node@0.9.4": patches/@ff-labs__fff-node@0.9.4.patch129 "@ff-labs/fff-node@0.9.4": patches/@ff-labs__fff-node@0.9.4.patch
130 "@legendapp/list@3.2.0": patches/@legendapp__list@3.2.0.patch130 "@legendapp/list@3.2.0": patches/@legendapp__list@3.2.0.patch
131 "@pierre/diffs@1.3.0-beta.5": patches/@pierre%2Fdiffs@1.3.0-beta.5.patch131 "@pierre/diffs@1.3.0-beta.10": patches/@pierre%2Fdiffs@1.3.0-beta.10.patch
132 "@react-native-menu/menu@2.0.0": patches/@react-native-menu__menu@2.0.0.patch132 "@react-native-menu/menu@2.0.0": patches/@react-native-menu__menu@2.0.0.patch
133 "@react-navigation/native-stack@7.17.6": patches/@react-navigation%2Fnative-stack@7.17.6.patch133 "@react-navigation/native-stack@7.17.6": patches/@react-navigation%2Fnative-stack@7.17.6.patch
134 effect@4.0.0-beta.102: patches/effect@4.0.0-beta.102.patch134 effect@4.0.0-beta.102: patches/effect@4.0.0-beta.102.patch