From 92aa3552e6810246342026be50d9646efdbad36f Mon Sep 17 00:00:00 2001 From: Blankeos Date: Thu, 13 Mar 2025 01:50:22 +0800 Subject: [PATCH 1/2] feat: Added codemirror but with bugs. --- bun.lockb | Bin 163036 -> 169588 bytes package.json | 4 + pages/index/+Page.tsx | 215 +++++++++++++++++++++++++++++++++++++----- 3 files changed, 193 insertions(+), 26 deletions(-) diff --git a/bun.lockb b/bun.lockb index 049946dbf4d744dee61fe7fed78cf08fed0ca7ed..e4870c87ad000d7185ceea717eabc30afa76ab46 100755 GIT binary patch delta 30004 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 p2|44936l2~=Qh&KO1z$rYM{{!jAmrMWv delta 25867 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 NTW3RQj#}RC{{cM(^6&rv diff --git a/package.json b/package.json index da5efb7..ad209f1 100644 --- a/package.json +++ b/package.json @@ -27,8 +27,12 @@ "vite": "^6.2.0" }, "dependencies": { + "@codemirror/state": "^6.5.2", + "@codemirror/view": "^6.36.4", + "@shopify/lang-jsonc": "^1.0.1", "@tailwindcss/vite": "^4.0.9", "bagon-hooks": "^0.0.4", + "codemirror": "^6.0.1", "hono": "^4.7.2", "jsonc-parser": "^3.3.1", "solid-js": "^1.9.5", diff --git a/pages/index/+Page.tsx b/pages/index/+Page.tsx index 0d9b225..f15bf3a 100644 --- a/pages/index/+Page.tsx +++ b/pages/index/+Page.tsx @@ -1,14 +1,21 @@ import { convertVSCodeToZedSnippets } from "@/utils/convert-vscode-to-zed-snippets"; import { debounce } from "@/utils/debounce"; -import { createEffect, createSignal, For, Show } from "solid-js"; +import { createEffect, createSignal, For, Match, onCleanup, onMount, Show, Switch } from "solid-js"; import { useMetadata } from "vike-metadata-solid"; import { IconGitHub, IconVSCode, IconZed } from "@/assets"; import { useClipboard, useLocalStorage } from "bagon-hooks"; +// CodeMirror imports +import { EditorState } from "@codemirror/state"; +import { EditorView } from "@codemirror/view"; +import { jsonc } from "@shopify/lang-jsonc"; +import { basicSetup } from "codemirror"; + export default function Page() { useMetadata({}); + const [mounted, setMounted] = createSignal(false); const [vsCodeSnippet, setVSCodeSnippet] = useLocalStorage({ key: "vscode-snippet-input", defaultValue: "", @@ -30,6 +37,14 @@ export default function Page() { timeout: 1000, }); + // References for CodeMirror elements + let vsCodeEditorContainer: HTMLDivElement | undefined; + let zedEditorContainer: HTMLDivElement | undefined; + + // References for editor views + let vsCodeEditorView: EditorView | undefined; + let zedEditorView: EditorView | undefined; + const debouncedConvert = debounce((snippetText: string) => { try { const converted = convertVSCodeToZedSnippets(snippetText); @@ -40,17 +55,161 @@ export default function Page() { })) ); setHasError(false); + + // Update zed editor content if initialized + if (zedEditorView && convertedSnippets().length > 0) { + updateZedEditor(); + } } catch (error) { console.error("Failed to convert snippet:", error); setHasError(true); } }, 500); - createEffect(() => { - debouncedConvert(vsCodeSnippet()); + // Theme extension for CodeMirror + const createThemeExtension = (isDark: boolean) => { + return EditorView.theme({ + "&": { + height: "100%", + fontSize: "12px", + }, + ".cm-content": { + fontFamily: "monospace", + caretColor: isDark ? "#fff" : "#000", + }, + ".cm-gutters": { + backgroundColor: isDark ? "#1f2937" : "#f3f4f6", + color: isDark ? "#9ca3af" : "#6b7280", + border: "none", + }, + ".cm-scroller": { + overflow: "auto", + height: "100%", + }, + ".cm-line": { + padding: "0 4px", + }, + "&.cm-focused .cm-cursor": { + borderLeftColor: isDark ? "#fff" : "#000", + }, + "&.cm-focused .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection": { + backgroundColor: isDark ? "rgba(255, 255, 255, 0.1)" : "rgba(0, 0, 0, 0.1)", + }, + ".cm-activeLine": { + backgroundColor: isDark ? "rgba(255, 255, 255, 0.05)" : "rgba(0, 0, 0, 0.05)", + }, + }); + }; + + // Initialize VSCode editor + const initVSCodeEditor = () => { + if (!vsCodeEditorContainer) return; + + vsCodeEditorView = new EditorView({ + state: EditorState.create({ + doc: vsCodeSnippet(), + extensions: [ + basicSetup, + jsonc(), + createThemeExtension(isDarkMode()), + EditorView.updateListener.of((update) => { + if (update.docChanged) { + const newValue = update.state.doc.toString(); + setVSCodeSnippet(newValue); + debouncedConvert(newValue); + } + }), + ], + }), + parent: vsCodeEditorContainer, + }); + }; + + // Initialize Zed editor + const initZedEditor = () => { + if (!zedEditorContainer || convertedSnippets().length === 0) return; + + zedEditorView = new EditorView({ + state: EditorState.create({ + doc: convertedSnippets()[activeTab()].content, + extensions: [ + basicSetup, + jsonc(), + createThemeExtension(isDarkMode()), + EditorState.readOnly.of(true), + ], + }), + parent: zedEditorContainer, + }); + }; + + // Update Zed editor content when tab changes or content changes + const updateZedEditor = () => { + if (!zedEditorView || convertedSnippets().length === 0) return; + + const newState = EditorState.create({ + doc: convertedSnippets()[activeTab()].content, + extensions: [ + basicSetup, + jsonc(), + createThemeExtension(isDarkMode()), + EditorState.readOnly.of(true), + ], + }); + + zedEditorView.setState(newState); + }; + + onMount(() => { + if (typeof window !== "undefined") { + initVSCodeEditor(); + if (convertedSnippets().length > 0) { + initZedEditor(); + } + debouncedConvert(vsCodeSnippet()); + } + setMounted(true); + }); + + onCleanup(() => { + vsCodeEditorView?.destroy(); + zedEditorView?.destroy(); }); createEffect(() => { + // Update theme when dark mode changes + if (vsCodeEditorView) { + const newState = EditorState.create({ + doc: vsCodeEditorView.state.doc, + extensions: [ + basicSetup, + jsonc(), + createThemeExtension(isDarkMode()), + EditorView.updateListener.of((update) => { + if (update.docChanged) { + const newValue = update.state.doc.toString(); + setVSCodeSnippet(newValue); + debouncedConvert(newValue); + } + }), + ], + }); + vsCodeEditorView.setState(newState); + } + + if (zedEditorView && convertedSnippets().length > 0) { + const newState = EditorState.create({ + doc: convertedSnippets()[activeTab()].content, + extensions: [ + basicSetup, + jsonc(), + createThemeExtension(isDarkMode()), + EditorState.readOnly.of(true), + ], + }); + zedEditorView.setState(newState); + } + if (isDarkMode()) { document.documentElement.classList.add("dark"); } else { @@ -58,6 +217,21 @@ export default function Page() { } }); + // Handle tab changes + createEffect(() => { + const tab = activeTab(); + if (convertedSnippets().length > 0 && zedEditorView) { + updateZedEditor(); + } + }); + + createEffect(() => { + // If convertedSnippets changes and we have no Zed editor yet, initialize it + if (convertedSnippets().length > 0 && !zedEditorView && zedEditorContainer) { + initZedEditor(); + } + }); + const toggleDarkMode = () => { setIsDarkMode(!isDarkMode()); }; @@ -86,18 +260,11 @@ export default function Page() {

VSCode Snippet

-