From 71d40d3a3f3637ed3c5d06068611094fd1c1ab78 Mon Sep 17 00:00:00 2001 From: eleith Date: Sun, 4 Oct 2026 09:43:09 -0700 Subject: [PATCH 1/2] [web] derive editor colors from configured Shiki themes --- .changeset/configured-editor-theme.md | 5 + apps/web/scripts/build-theme.js | 5 +- .../components/editor/MarkdownEditor.svelte | 15 +- .../src/lib/components/editor/create-theme.ts | 71 -------- .../components/editor/themes/configured.css | 110 +++++++++++++ .../editor/themes/configured.test.ts | 152 ++++++++++++++++++ .../components/editor/themes/configured.ts | 21 +++ .../components/editor/themes/gruvbox-dark.ts | 73 --------- .../components/editor/themes/gruvbox-light.ts | 73 --------- .../asset/editor/[...asset]/+page.svelte | 25 +-- packages/web/docs/config.md | 2 +- packages/web/theme/README.md | 21 +++ packages/web/theme/package.json | 8 +- packages/web/theme/src/editor.test.ts | 144 +++++++++++++++++ packages/web/theme/src/editor.ts | 117 ++++++++++++++ packages/web/theme/src/theme.test.ts | 2 +- pnpm-lock.yaml | 3 + 17 files changed, 596 insertions(+), 251 deletions(-) create mode 100644 .changeset/configured-editor-theme.md delete mode 100644 apps/web/src/lib/components/editor/create-theme.ts create mode 100644 apps/web/src/lib/components/editor/themes/configured.css create mode 100644 apps/web/src/lib/components/editor/themes/configured.test.ts create mode 100644 apps/web/src/lib/components/editor/themes/configured.ts delete mode 100644 apps/web/src/lib/components/editor/themes/gruvbox-dark.ts delete mode 100644 apps/web/src/lib/components/editor/themes/gruvbox-light.ts create mode 100644 packages/web/theme/src/editor.test.ts create mode 100644 packages/web/theme/src/editor.ts diff --git a/.changeset/configured-editor-theme.md b/.changeset/configured-editor-theme.md new file mode 100644 index 00000000..d9b5abfe --- /dev/null +++ b/.changeset/configured-editor-theme.md @@ -0,0 +1,5 @@ +--- +"@luzzle/web": patch +--- + +Use the configured Shiki light/dark themes for source and asset editor palettes instead of fixed Gruvbox colors. Keep native CodeMirror highlighting and editing behavior, with a bounded Markdown/YAML color mapping and no Shiki tokenizer in the browser. diff --git a/apps/web/scripts/build-theme.js b/apps/web/scripts/build-theme.js index a4be50d0..3e3cb977 100644 --- a/apps/web/scripts/build-theme.js +++ b/apps/web/scripts/build-theme.js @@ -1,4 +1,5 @@ import { generateThemeCss } from '@luzzle/web.theme' +import { generateEditorThemeCss } from '@luzzle/web.theme/editor' import { loadConfig } from '@luzzle/web.config' import path from 'path' import { existsSync } from 'fs' @@ -23,7 +24,9 @@ if (isEntrypoint) { try { const configPath = resolveConfigPath(process.argv[2]) const config = loadConfig(configPath) - process.stdout.write(generateThemeCss(config)) + const themeCss = generateThemeCss(config) + const editorCss = await generateEditorThemeCss(config.theme.markdown.code) + process.stdout.write(themeCss + editorCss) } catch (err) { console.error(err instanceof Error ? err.message : err) process.exit(1) diff --git a/apps/web/src/lib/components/editor/MarkdownEditor.svelte b/apps/web/src/lib/components/editor/MarkdownEditor.svelte index 50209728..15a50b54 100644 --- a/apps/web/src/lib/components/editor/MarkdownEditor.svelte +++ b/apps/web/src/lib/components/editor/MarkdownEditor.svelte @@ -2,8 +2,7 @@ import { onMount, onDestroy } from 'svelte' import { EditorView } from 'codemirror' import { EditorState, Compartment } from '@codemirror/state' - import { gruvboxDark, gruvboxDarkBg } from './themes/gruvbox-dark' - import { gruvboxLight, gruvboxLightBg } from './themes/gruvbox-light' + import { configuredTheme } from './themes/configured' import { createEditorExtensions } from './config' import { createLSPExtension, destroyLSPClient } from './lsp' import { luzzleFieldEditor } from './extensions/luzzleFieldEditor' @@ -41,11 +40,7 @@ function updateTheme() { const { isDark } = readTheme() - const themeExtension = isDark ? gruvboxDark : gruvboxLight - - if (editorContainer) { - editorContainer.style.backgroundColor = isDark ? gruvboxDarkBg : gruvboxLightBg - } + const themeExtension = configuredTheme(isDark ? 'dark' : 'light') view.dispatch({ effects: themeConfig.reconfigure(themeExtension) @@ -54,7 +49,7 @@ onMount(() => { const { isDark } = readTheme() - const initialTheme = isDark ? gruvboxDark : gruvboxLight + const initialTheme = configuredTheme(isDark ? 'dark' : 'light') const extensions = createEditorExtensions({ themeConfig, @@ -174,6 +169,7 @@