progamatic dark mode

This commit is contained in:
Víctor Losada Hernández
2026-08-28 00:01:42 +02:00
parent 0dd6ddf33c
commit 1133dff5ce
5 changed files with 28 additions and 3 deletions
+5 -1
View File
@@ -1,4 +1,4 @@
/* eslint max-lines: ["error", { "max": 405 }] */ /* eslint max-lines: ["error", { "max": 410 }] */
import './codeEditor.less'; import './codeEditor.less';
import React, { useEffect, useRef, forwardRef, useImperativeHandle } from 'react'; import React, { useEffect, useRef, forwardRef, useImperativeHandle } from 'react';
@@ -88,6 +88,7 @@ const CodeEditor = forwardRef(
onChange = ()=>{}, onChange = ()=>{},
onCursorChange = ()=>{}, onCursorChange = ()=>{},
onViewChange = ()=>{}, onViewChange = ()=>{},
onThemeChange = ()=>{},
editorTheme = 'default', editorTheme = 'default',
style, style,
renderer, renderer,
@@ -308,6 +309,9 @@ const CodeEditor = forwardRef(
view.dispatch({ view.dispatch({
effects : themeCompartment.reconfigure(themeExtension), effects : themeCompartment.reconfigure(themeExtension),
}); });
const isDark = view.state.facet(EditorView.darkTheme);
onThemeChange(isDark);
}, [editorTheme, tab]); }, [editorTheme, tab]);
useEffect(()=>{ useEffect(()=>{
+7 -2
View File
@@ -2,6 +2,7 @@
import './editor.less'; import './editor.less';
import React, { useState, useRef, useEffect, forwardRef, useImperativeHandle } from 'react'; import React, { useState, useRef, useEffect, forwardRef, useImperativeHandle } from 'react';
import dedent from 'dedent'; import dedent from 'dedent';
import { EditorView } from '@codemirror/view';
import CodeEditor from '@components/codeEditor/codeEditor.jsx'; import CodeEditor from '@components/codeEditor/codeEditor.jsx';
import SnippetBar from './snippetbar/snippetbar.jsx'; import SnippetBar from './snippetbar/snippetbar.jsx';
@@ -72,6 +73,7 @@ const Editor = forwardRef(
const [currentEditorTheme, setEditorTheme] = useState(editorTheme); const [currentEditorTheme, setEditorTheme] = useState(editorTheme);
const [view, setView] = useState('text'); // 'text', 'style', 'meta', 'snippet' const [view, setView] = useState('text'); // 'text', 'style', 'meta', 'snippet'
const [snippetBarHeight, setSnippetBarHeight] = useState(26); const [snippetBarHeight, setSnippetBarHeight] = useState(26);
const [isDark, setIsDark] = useState(false);
const editor = useRef(null); const editor = useRef(null);
const codeEditor = useRef(null); const codeEditor = useRef(null);
@@ -225,6 +227,7 @@ const Editor = forwardRef(
onCursorChange={(page)=>updateCurrentCursorPage(page)} onCursorChange={(page)=>updateCurrentCursorPage(page)}
onViewChange={(page)=>updateCurrentViewPage(page)} onViewChange={(page)=>updateCurrentViewPage(page)}
editorTheme={currentEditorTheme} editorTheme={currentEditorTheme}
onThemeChange={setIsDark}
renderer={brew.renderer} renderer={brew.renderer}
style={{ height: `calc(100% - ${snippetBarHeight}px)` }} style={{ height: `calc(100% - ${snippetBarHeight}px)` }}
/> />
@@ -243,6 +246,7 @@ const Editor = forwardRef(
value={brew.style ?? DEFAULT_STYLE_TEXT} value={brew.style ?? DEFAULT_STYLE_TEXT}
onChange={onBrewChange('style')} onChange={onBrewChange('style')}
editorTheme={currentEditorTheme} editorTheme={currentEditorTheme}
onThemeChange={setIsDark}
renderer={brew.renderer} renderer={brew.renderer}
style={{ height: `calc(100% - ${snippetBarHeight}px)` }} style={{ height: `calc(100% - ${snippetBarHeight}px)` }}
/> />
@@ -265,6 +269,7 @@ const Editor = forwardRef(
onChange={onBrewChange('snippets')} onChange={onBrewChange('snippets')}
enableFolding={true} enableFolding={true}
editorTheme={currentEditorTheme} editorTheme={currentEditorTheme}
onThemeChange={setIsDark}
renderer={brew.renderer} renderer={brew.renderer}
style={{ height: `calc(100% - 25px)` }} style={{ height: `calc(100% - 25px)` }}
/> />
@@ -274,7 +279,7 @@ const Editor = forwardRef(
if(isMeta()) { if(isMeta()) {
return ( return (
<> <>
<CodeEditor key='codeEditor' view={view} style={{ display: 'none' }} /> <CodeEditor key='codeEditor' editorTheme={currentEditorTheme} onThemeChange={setIsDark} view={view} style={{ display: 'none' }} />
<MetadataEditor <MetadataEditor
metadata={brew} metadata={brew}
themeBundle={themeBundle} themeBundle={themeBundle}
@@ -306,7 +311,7 @@ const Editor = forwardRef(
})); }));
return ( return (
<div className='editor' ref={editor}> <div className={`editor${isDark ? ' darkMode' : ''}`} ref={editor}>
<SnippetBar <SnippetBar
brew={brew} brew={brew}
view={view} view={view}
@@ -378,3 +378,18 @@
} }
} }
} }
.editor.darkMode .metadataEditor {
background-color: #555;
background-image: @backgroundImageAltDark;
color:#ddd;
h2 {
color:@blueLight;
border-color: @blue;
}
input, textarea, select {
background-color:#ddd;
}
}
+1
View File
@@ -3,6 +3,7 @@
@frameBorderImage : url('/assets/frameBorder.png'); @frameBorderImage : url('/assets/frameBorder.png');
@backgroundImage : url('/assets/parchmentBackground.jpg'); @backgroundImage : url('/assets/parchmentBackground.jpg');
@backgroundImageAlt : url('/assets/fluffy_background.png'); @backgroundImageAlt : url('/assets/fluffy_background.png');
@backgroundImageAltDark : url('/assets/fluffy_background_dark.png');
@redTriangleImage : url('/assets/redTriangle.png'); @redTriangleImage : url('/assets/redTriangle.png');
@monsterBorderImageLegacy : url('/assets/monsterBorderLegacy.png'); @monsterBorderImageLegacy : url('/assets/monsterBorderLegacy.png');
@noteBorderImage : url('/assets/noteBorder.png'); @noteBorderImage : url('/assets/noteBorder.png');
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 MiB