@@ -559,7 +552,7 @@ class SourceCodeRenderer extends React.Component<
- {this.getCodeEditor()}
+ {this.getCodeEditor(theme)}
{isPreviewerAvailable && showPreview && this.getPreviewer()}
diff --git a/src/plugins/terminal/terminal.tsx b/src/plugins/terminal/terminal.tsx
index 4de5cd6c..d0c0e087 100644
--- a/src/plugins/terminal/terminal.tsx
+++ b/src/plugins/terminal/terminal.tsx
@@ -23,17 +23,17 @@ class TerminalKeybindings extends React.Component<{ termWrap: any; lineid: strin
}
registerKeybindings() {
- let keybindManager = GlobalModel.keybindManager;
- let domain = "line-" + this.props.lineid;
- let termWrap = this.props.termWrap;
+ const keybindManager = GlobalModel.keybindManager;
+ const domain = "line-" + this.props.lineid;
+ const termWrap = this.props.termWrap;
keybindManager.registerKeybinding("plugin", domain, "terminal:copy", (waveEvent) => {
- let termWrap = this.props.termWrap;
- let sel = termWrap.terminal.getSelection();
+ const termWrap = this.props.termWrap;
+ const sel = termWrap.terminal.getSelection();
navigator.clipboard.writeText(sel);
return true;
});
keybindManager.registerKeybinding("plugin", domain, "terminal:paste", (waveEvent) => {
- let p = navigator.clipboard.readText();
+ const p = navigator.clipboard.readText();
p.then((text) => {
termWrap.dataHandler?.(text, termWrap);
});
@@ -105,7 +105,7 @@ class TerminalRenderer extends React.Component<
}
getSnapshotBeforeUpdate(prevProps, prevState): { height: number } {
- let elem = this.elemRef.current;
+ const elem = this.elemRef.current;
if (elem == null) {
return { height: 0 };
}
@@ -116,9 +116,8 @@ class TerminalRenderer extends React.Component<
if (this.props.onHeightChange == null) {
return;
}
- let { line } = this.props;
let curHeight = 0;
- let elem = this.elemRef.current;
+ const elem = this.elemRef.current;
if (elem != null) {
curHeight = elem.offsetHeight;
}
@@ -133,12 +132,12 @@ class TerminalRenderer extends React.Component<
}
checkLoad(): void {
- let { line, staticRender, visible, collapsed } = this.props;
+ let { staticRender, visible, collapsed } = this.props;
if (staticRender) {
return;
}
- let vis = visible && visible.get() && !collapsed;
- let curVis = this.termLoaded.get();
+ const vis = visible?.get() && !collapsed;
+ const curVis = this.termLoaded.get();
if (vis && !curVis) {
this.loadTerminal();
} else if (!vis && curVis) {
@@ -147,13 +146,12 @@ class TerminalRenderer extends React.Component<
}
loadTerminal(): void {
- let { screen, line } = this.props;
- let model = GlobalModel;
- let cmd = screen.getCmd(line);
+ const { screen, line } = this.props;
+ const cmd = screen.getCmd(line);
if (cmd == null) {
return;
}
- let termElem = this.termRef.current;
+ const termElem = this.termRef.current;
if (termElem == null) {
console.log("cannot load terminal, no term elem found", line);
return;
@@ -163,11 +161,11 @@ class TerminalRenderer extends React.Component<
}
unloadTerminal(unmount: boolean): void {
- let { screen, line } = this.props;
+ const { screen, line } = this.props;
screen.unloadRenderer(line.lineid);
if (!unmount) {
mobx.action(() => this.termLoaded.set(false))();
- let termElem = this.termRef.current;
+ const termElem = this.termRef.current;
if (termElem != null) {
termElem.replaceChildren();
}
@@ -176,22 +174,21 @@ class TerminalRenderer extends React.Component<
@boundMethod
clickTermBlock(e: any) {
- let { screen, line } = this.props;
- let model = GlobalModel;
- let termWrap = screen.getTermWrap(line.lineid);
+ const { screen, line } = this.props;
+ const termWrap = screen.getTermWrap(line.lineid);
if (termWrap != null) {
termWrap.giveFocus();
}
}
render() {
- let { screen, line, width, staticRender, visible, collapsed } = this.props;
- let isPhysicalFocused = mobx
+ const { screen, line, width, collapsed } = this.props;
+ const isPhysicalFocused = mobx
.computed(() => screen.getIsFocused(line.linenum), {
name: "computed-getIsFocused",
})
.get();
- let isFocused = mobx
+ const isFocused = mobx
.computed(
() => {
let screenFocusType = screen.getFocusType();
@@ -200,15 +197,15 @@ class TerminalRenderer extends React.Component<
{ name: "computed-isFocused" }
)
.get();
- let cmd = screen.getCmd(line); // will not be null
- let usedRows = screen.getUsedRows(lineutil.getRendererContext(line), line, cmd, width);
+ const cmd = screen.getCmd(line); // will not be null
+ const usedRows = screen.getUsedRows(lineutil.getRendererContext(line), line, cmd, width);
let termHeight = termHeightFromRows(usedRows, GlobalModel.getTermFontSize(), cmd.getTermMaxRows());
if (usedRows === 0) {
termHeight = 0;
}
- let termLoaded = this.termLoaded.get();
- let lineid = line.lineid;
- let termWrap = screen.getTermWrap(lineid);
+ const termLoaded = this.termLoaded.get();
+ const lineid = line.lineid;
+ const termWrap = screen.getTermWrap(lineid);
return (
= mobx.IObservableValue;
type OArr = mobx.IObservableArray;
@@ -563,7 +564,7 @@ declare global {
type FeOptsType = {
termfontsize: number;
termfontfamily: string;
- theme: string;
+ theme: NativeThemeSource;
};
type ConfirmFlagsType = {
@@ -898,6 +899,10 @@ declare global {
getAuthKey: () => string;
getWaveSrvStatus: () => boolean;
getInitialTermFontFamily: () => string;
+ getShouldUseDarkColors: () => boolean;
+ getNativeThemeSource: () => NativeThemeSource;
+ setNativeThemeSource: (source: NativeThemeSource) => void;
+ onNativeThemeUpdated: (callback: () => void) => void;
restartWaveSrv: () => boolean;
reloadWindow: () => void;
openExternalLink: (url: string) => void;
diff --git a/src/util/themeutil.ts b/src/util/themeutil.ts
deleted file mode 100644
index 1c622248..00000000
--- a/src/util/themeutil.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-function loadTheme(theme: string) {
- const linkTag: any = document.getElementById("theme-stylesheet");
- if (theme === "dark") {
- linkTag.href = "public/themes/default.css";
- } else {
- linkTag.href = `public/themes/${theme}.css`;
- }
-}
-
-export { loadTheme };
diff --git a/wavesrv/pkg/cmdrunner/cmdrunner.go b/wavesrv/pkg/cmdrunner/cmdrunner.go
index 5d8f410e..d57a6e1f 100644
--- a/wavesrv/pkg/cmdrunner/cmdrunner.go
+++ b/wavesrv/pkg/cmdrunner/cmdrunner.go
@@ -104,7 +104,7 @@ var RemoteColorNames = []string{"red", "green", "yellow", "blue", "magenta", "cy
var RemoteSetArgs = []string{"alias", "connectmode", "key", "password", "autoinstall", "color"}
var ConfirmFlags = []string{"hideshellprompt"}
var SidebarNames = []string{"main"}
-var ThemeNames = []string{"light", "dark"}
+var ThemeSources = []string{"light", "dark", "system"}
var ScreenCmds = []string{"run", "comment", "cd", "cr", "clear", "sw", "reset", "signal", "chat"}
var NoHistCmds = []string{"_compgen", "line", "history", "_killserver"}
@@ -5529,20 +5529,20 @@ func ClientSetCommand(ctx context.Context, pk *scpacket.FeCommandPacketType) (sc
}
varsUpdated = append(varsUpdated, "termfontfamily")
}
- if themeStr, found := pk.Kwargs["theme"]; found {
- newTheme := themeStr
+ if themeSourceStr, found := pk.Kwargs["theme"]; found {
+ newThemeSource := themeSourceStr
found := false
- for _, theme := range ThemeNames {
- if newTheme == theme {
+ for _, theme := range ThemeSources {
+ if newThemeSource == theme {
found = true
break
}
}
if !found {
- return nil, fmt.Errorf("invalid theme name")
+ return nil, fmt.Errorf("invalid theme source")
}
feOpts := clientData.FeOpts
- feOpts.Theme = newTheme
+ feOpts.Theme = newThemeSource
err = sstore.UpdateClientFeOpts(ctx, feOpts)
if err != nil {
return nil, fmt.Errorf("error updating client feopts: %v", err)