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 {
77import { isWorkspaceImagePreviewPath } from "@t3tools/shared/filePreview";
88import { VirtualizedFile, type SelectedLineRange } from "@pierre/diffs";
99import { 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";
1111import {
1212 isAtomCommandInterrupted,
1313 squashAtomCommandFailure,
......@@ -52,7 +52,7 @@ import {
5252} from "./fileCommentAnnotations";
5353import { installFileEditorDismissal } from "./fileEditorDismissal";
5454import { LocalCommentAnnotation } from "./LocalCommentAnnotation";
55import { projectFileCacheKey } from "./fileContentRevision";
55import { projectFileCacheKey, projectFileEditorCacheKey } from "./fileContentRevision";
5656import { fileBreadcrumbs } from "./filePath";
5757import { isMarkdownPreviewFile, setMarkdownTaskChecked } from "./filePreviewMode";
5858import { FileSaveCoordinator } from "./fileSaveCoordinator";
......@@ -364,6 +364,8 @@ function EditableFileSurface({
364364 const editor = useMemo(
365365 () =>
366366 new Editor<FileCommentAnnotationGroup>({
367 persistState: true,
368 persistStateStorage: "inMemory",
367369 onChange: (file, nextLineAnnotations) => {
368370 setProjectFileQueryData(environmentId, cwd, relativePath, file.contents);
369371 saveCoordinator.change(file.contents);
......@@ -536,7 +538,7 @@ function EditableFileSurface({
536538 );
537539
538540 return (
539 <EditorProvider editor={editor}>
541 <EditProvider editor={editor}>
540542 <div ref={surfaceRef} className="flex min-h-0 flex-1">
541543 <Virtualizer
542544 className="file-preview-virtualizer min-h-0 flex-1 overflow-auto"
......@@ -549,7 +551,13 @@ function EditableFileSurface({
549551 file={{
550552 name: relativePath,
551553 contents,
552 cacheKey: projectFileCacheKey(cwd, relativePath, contents),
554 cacheKey: projectFileEditorCacheKey(
555 environmentId,
556 cwd,
557 relativePath,
558 contents,
559 editor.getFile(),
560 ),
553561 }}
554562 options={{
555563 disableFileHeader: true,
......@@ -586,7 +594,7 @@ function EditableFileSurface({
586594 />
587595 </Virtualizer>
588596 </div>
589 </EditorProvider>
597 </EditProvider>
590598 );
591599}
592600
apps/web/src/components/files/fileContentRevision.test.ts+28-1
......@@ -1,6 +1,10 @@
11import { describe, expect, it } from "vite-plus/test";
22
3import { fileContentRevision, projectFileCacheKey } from "./fileContentRevision";
3import {
4 fileContentRevision,
5 projectFileCacheKey,
6 projectFileEditorCacheKey,
7} from "./fileContentRevision";
48
59describe("fileContentRevision", () => {
610 it("changes for same-length edits", () => {
......@@ -12,4 +16,27 @@ describe("fileContentRevision", () => {
1216 projectFileCacheKey("/repo", "file.json", "contents"),
1317 );
1418 });
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 });
1542});
apps/web/src/components/files/fileContentRevision.ts+18
......@@ -10,3 +10,21 @@ export function fileContentRevision(contents: string): string {
1010export function projectFileCacheKey(cwd: string, relativePath: string, contents: string): string {
1111 return `${cwd}:${relativePath}:${fileContentRevision(contents)}`;
1212}
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:
1919 specifier: 1.8.0
2020 version: 1.8.0
2121 '@pierre/diffs':
22 specifier: 1.3.0-beta.5
23 version: 1.3.0-beta.5
22 specifier: 1.3.0-beta.10
23 version: 1.3.0-beta.10
2424 '@typescript/native-preview':
2525 specifier: 7.0.0-dev.20260604.1
2626 version: 7.0.0-dev.20260604.1
......@@ -75,7 +75,7 @@ patchedDependencies:
7575 '@expo/metro-config@56.0.14': 8cb08b5bb7051ed9d2dbe46a2c293c5a1e17f1bd6ddf30de27909e18c921ff46
7676 '@ff-labs/fff-node@0.9.4': 2b16019ce7ab61aec6478dd02f79ef468cc1d5c51e9d00764f7d2ab8167210c8
7777 '@legendapp/list@3.2.0': 9203ec3db86574a31e157a265cefd8997b259cc420a0c4c61c580c80ed8cf78d
78 '@pierre/diffs@1.3.0-beta.5': 7cb6da88544119adda056b2f46f43956f99326227732da0b345081e285a6c53a
78 '@pierre/diffs@1.3.0-beta.10': 7ef7cb0cbabb17c15cdb137554068b36f15f6f5265e73fb51452aa3380db91aa
7979 '@react-native-menu/menu@2.0.0': 5ea3ae4bf1d9baf5443b65c269bb09621c27a68d556f713778f37b1e8d46aaae
8080 '@react-navigation/native-stack@7.17.6': c7fc101b78d434904425e5a24c22fb0042298dec6f807250486e784f3c717273
8181 effect@4.0.0-beta.102: 71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488
......@@ -222,7 +222,7 @@ importers:
222222 version: 1.8.0
223223 '@pierre/diffs':
224224 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)
226226 '@react-native-menu/menu':
227227 specifier: ^2.0.0
228228 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:
466466 version: 1.15.13
467467 '@pierre/diffs':
468468 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)
470470 effect:
471471 specifier: 4.0.0-beta.102
472472 version: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)
......@@ -551,7 +551,7 @@ importers:
551551 version: 0.41.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(yjs@13.6.31)
552552 '@pierre/diffs':
553553 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)
555555 '@pierre/trees':
556556 specifier: 1.0.0-beta.4
557557 version: 1.0.0-beta.4(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
......@@ -3584,20 +3584,20 @@ packages:
35843584 resolution: {integrity: sha512-ODOov0sGMJMf3jPonOkgGqPknTsu+DdQ7kD++gz8aI+aFMOMHFbWAA2taqXXVTdP+OTOQR/znGvSpmkeI0WTYQ==}
35853585 engines: {node: '>=14.18.0'}
35863586
3587 '@pierre/diffs@1.3.0-beta.5':
3588 resolution: {integrity: sha512-d7449IY6Phcg9LCRLbPxhsxn6Bv4KoaP/vPyZtGu2uR1SFsSJPQcRoPf8lzyobNGKD0GZGuhgHW5LrOlilFo7w==}
3587 '@pierre/diffs@1.3.0-beta.10':
3588 resolution: {integrity: sha512-efyFM9GRfI6WkmHJP0CnZBopuM8yCwGqIKbZHoe1D5PV15VDkr7Vpi8EZt40AYrN1km//utQtYhHDSwt2KwjSg==}
35893589 peerDependencies:
35903590 react: ^18.3.1 || ^19.0.0
35913591 react-dom: ^18.3.1 || ^19.0.0
35923592
3593 '@pierre/theme@1.0.3':
3594 resolution: {integrity: sha512-sWHv11TMoqKxKDgTIk5VbhQjdPhs8DCcBxbjh3mRlS3YOM/OcrWoGX6MM8eBGn9cUu3M46Py0JnxsG2nJaFTuA==}
3593 '@pierre/theme@1.1.0':
3594 resolution: {integrity: sha512-GC2OWTAfTIIWWYhPCygwG8t2EtePQkRfON4MI2rwIkJylmiyqIttJID2dCL8sUD8cNdEvYkEyfEHHKMeCiDLoQ==}
35953595 engines: {vscode: ^1.0.0}
35963596
3597 '@pierre/theming@0.0.1':
3598 resolution: {integrity: sha512-1thlEtJbqdyLzc1ZS2KQa1q7FzDGHT4dTEdKHoyQjOMeWWOmbVG5/ndEfOKfAb5Fzkz8cNJrOjFLiZoDH/A03A==}
3597 '@pierre/theming@0.0.2':
3598 resolution: {integrity: sha512-QM1M4stXfnzfaE8I8YbjXSApV8c+2dBsXJj8eYg9WTpBR/cTmCZIcfGnN4p13iRrYu2Br/R/OJfEL7uR8Qjctw==}
35993599 peerDependencies:
3600 '@pierre/theme': ^1.0.0
3600 '@pierre/theme': ^1.1.0
36013601 '@shikijs/themes': ^3.0.0 || ^4.0.0
36023602 react: ^18.3.1 || ^19.0.0
36033603 react-dom: ^18.3.1 || ^19.0.0
......@@ -6104,6 +6104,10 @@ packages:
61046104 resolution: {integrity: sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==}
61056105 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
61076111 dir-compare@4.2.0:
61086112 resolution: {integrity: sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==}
61096113
......@@ -13569,12 +13573,12 @@ snapshots:
1356913573 tslib: 2.8.1
1357013574 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)':
1357313577 dependencies:
13574 '@pierre/theme': 1.0.3
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)
13578 '@pierre/theme': 1.1.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)
1357613580 '@shikijs/transformers': 4.2.0
13577 diff: 8.0.3
13581 diff: 9.0.0
1357813582 hast-util-to-html: 9.0.5
1357913583 lru_map: 0.4.1
1358013584 react: 19.2.3
......@@ -13583,12 +13587,12 @@ snapshots:
1358313587 transitivePeerDependencies:
1358413588 - '@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)':
1358713591 dependencies:
13588 '@pierre/theme': 1.0.3
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)
13592 '@pierre/theme': 1.1.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)
1359013594 '@shikijs/transformers': 4.2.0
13591 diff: 8.0.3
13595 diff: 9.0.0
1359213596 hast-util-to-html: 9.0.5
1359313597 lru_map: 0.4.1
1359413598 react: 19.2.6
......@@ -13597,19 +13601,19 @@ snapshots:
1359713601 transitivePeerDependencies:
1359813602 - '@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)':
1360313607 optionalDependencies:
13604 '@pierre/theme': 1.0.3
13608 '@pierre/theme': 1.1.0
1360513609 '@shikijs/themes': 4.2.0
1360613610 react: 19.2.3
1360713611 react-dom: 19.2.3(react@19.2.3)
1360813612 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)':
1361113615 optionalDependencies:
13612 '@pierre/theme': 1.0.3
13616 '@pierre/theme': 1.1.0
1361313617 '@shikijs/themes': 4.3.0
1361413618 react: 19.2.6
1361513619 react-dom: 19.2.6(react@19.2.6)
......@@ -16379,6 +16383,8 @@ snapshots:
1637916383
1638016384 diff@8.0.3: {}
1638116385
16386 diff@9.0.0: {}
16387
1638216388 dir-compare@4.2.0:
1638316389 dependencies:
1638416390 minimatch: 3.1.5
pnpm-workspace.yaml+2-2
......@@ -41,7 +41,7 @@ catalog:
4141 "@effect/vitest": 4.0.0-beta.102
4242 "@noble/curves": 1.9.1
4343 "@noble/hashes": 1.8.0
44 "@pierre/diffs": 1.3.0-beta.5
44 "@pierre/diffs": 1.3.0-beta.10
4545 "@types/node": 24.12.4
4646 "@typescript/native-preview": 7.0.0-dev.20260604.1
4747 effect: 4.0.0-beta.102
......@@ -128,7 +128,7 @@ patchedDependencies:
128128 "@expo/metro-config@56.0.14": patches/@expo%2Fmetro-config@56.0.14.patch
129129 "@ff-labs/fff-node@0.9.4": patches/@ff-labs__fff-node@0.9.4.patch
130130 "@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.patch
131 "@pierre/diffs@1.3.0-beta.10": patches/@pierre%2Fdiffs@1.3.0-beta.10.patch
132132 "@react-native-menu/menu@2.0.0": patches/@react-native-menu__menu@2.0.0.patch
133133 "@react-navigation/native-stack@7.17.6": patches/@react-navigation%2Fnative-stack@7.17.6.patch
134134 effect@4.0.0-beta.102: patches/effect@4.0.0-beta.102.patch