mirror of
https://github.com/grafana/grafana.git
synced 2025-01-01 11:47:05 -06:00
Grafana-UI: Create Grafana themes for Monaco (#33716)
* Grafana-UI: Update monaco theme to use Grafana colours * _variables changes * comment where the colour names come from
This commit is contained in:
parent
c5241aa610
commit
f121e3a281
@ -1,15 +1,17 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
import { withTheme2 } from '../../themes';
|
||||||
|
import { Themeable2 } from '../../types';
|
||||||
import { selectors } from '@grafana/e2e-selectors';
|
import { selectors } from '@grafana/e2e-selectors';
|
||||||
import { withTheme } from '../../themes';
|
import { GrafanaTheme2 } from '@grafana/data';
|
||||||
import { Themeable } from '../../types';
|
|
||||||
import { Monaco, MonacoEditor as MonacoEditorType, CodeEditorProps, MonacoOptions } from './types';
|
import { Monaco, MonacoEditor as MonacoEditorType, CodeEditorProps, MonacoOptions } from './types';
|
||||||
import { registerSuggestions } from './suggestions';
|
import { registerSuggestions } from './suggestions';
|
||||||
import MonacoEditor, { loader as monacoEditorLoader } from '@monaco-editor/react';
|
import MonacoEditor, { loader as monacoEditorLoader } from '@monaco-editor/react';
|
||||||
|
|
||||||
import type * as monacoType from 'monaco-editor/esm/vs/editor/editor.api';
|
import type * as monacoType from 'monaco-editor/esm/vs/editor/editor.api';
|
||||||
|
import defineThemes from './theme';
|
||||||
|
import { css } from '@emotion/css';
|
||||||
|
|
||||||
type Props = CodeEditorProps & Themeable;
|
type Props = CodeEditorProps & Themeable2;
|
||||||
|
|
||||||
let initalized = false;
|
let initalized = false;
|
||||||
function initMonoco() {
|
function initMonoco() {
|
||||||
@ -71,7 +73,8 @@ class UnthemedCodeEditor extends React.PureComponent<Props> {
|
|||||||
|
|
||||||
handleBeforeMount = (monaco: Monaco) => {
|
handleBeforeMount = (monaco: Monaco) => {
|
||||||
this.monaco = monaco;
|
this.monaco = monaco;
|
||||||
const { language, getSuggestions } = this.props;
|
const { language, theme, getSuggestions } = this.props;
|
||||||
|
defineThemes(monaco, theme);
|
||||||
|
|
||||||
if (getSuggestions) {
|
if (getSuggestions) {
|
||||||
this.completionCancel = registerSuggestions(monaco, language, getSuggestions);
|
this.completionCancel = registerSuggestions(monaco, language, getSuggestions);
|
||||||
@ -99,6 +102,8 @@ class UnthemedCodeEditor extends React.PureComponent<Props> {
|
|||||||
const value = this.props.value ?? '';
|
const value = this.props.value ?? '';
|
||||||
const longText = value.length > 100;
|
const longText = value.length > 100;
|
||||||
|
|
||||||
|
const styles = getStyles(theme);
|
||||||
|
|
||||||
const options: MonacoOptions = {
|
const options: MonacoOptions = {
|
||||||
wordWrap: 'off',
|
wordWrap: 'off',
|
||||||
tabSize: 2,
|
tabSize: 2,
|
||||||
@ -112,26 +117,29 @@ class UnthemedCodeEditor extends React.PureComponent<Props> {
|
|||||||
|
|
||||||
readOnly,
|
readOnly,
|
||||||
lineNumbersMinChars: 4,
|
lineNumbersMinChars: 4,
|
||||||
lineDecorationsWidth: 0,
|
lineDecorationsWidth: 1 * theme.spacing.gridSize,
|
||||||
overviewRulerBorder: false,
|
overviewRulerBorder: false,
|
||||||
automaticLayout: true,
|
automaticLayout: true,
|
||||||
|
padding: {
|
||||||
|
top: 0.5 * theme.spacing.gridSize,
|
||||||
|
bottom: 0.5 * theme.spacing.gridSize,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!showLineNumbers) {
|
if (!showLineNumbers) {
|
||||||
options.glyphMargin = false;
|
options.glyphMargin = false;
|
||||||
options.folding = false;
|
options.folding = false;
|
||||||
options.lineNumbers = 'off';
|
options.lineNumbers = 'off';
|
||||||
options.lineDecorationsWidth = 5; // left margin when not showing line numbers
|
|
||||||
options.lineNumbersMinChars = 0;
|
options.lineNumbersMinChars = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div onBlur={this.onBlur} aria-label={selectors.components.CodeEditor.container}>
|
<div className={styles.container} onBlur={this.onBlur} aria-label={selectors.components.CodeEditor.container}>
|
||||||
<MonacoEditor
|
<MonacoEditor
|
||||||
width={width}
|
width={width}
|
||||||
height={height}
|
height={height}
|
||||||
language={language}
|
language={language}
|
||||||
theme={theme.isDark ? 'vs-dark' : 'vs-light'}
|
theme={theme.isDark ? 'grafana-dark' : 'grafana-light'}
|
||||||
value={value}
|
value={value}
|
||||||
options={{
|
options={{
|
||||||
...options,
|
...options,
|
||||||
@ -145,4 +153,13 @@ class UnthemedCodeEditor extends React.PureComponent<Props> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default withTheme(UnthemedCodeEditor);
|
export default withTheme2(UnthemedCodeEditor);
|
||||||
|
|
||||||
|
const getStyles = (theme: GrafanaTheme2) => {
|
||||||
|
return {
|
||||||
|
container: css`
|
||||||
|
border-radius: ${theme.shape.borderRadius()};
|
||||||
|
border: 1px solid ${theme.components.input.borderColor};
|
||||||
|
`,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
24
packages/grafana-ui/src/components/Monaco/theme.ts
Normal file
24
packages/grafana-ui/src/components/Monaco/theme.ts
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
import { GrafanaTheme2 } from '@grafana/data';
|
||||||
|
import { Monaco } from './types';
|
||||||
|
|
||||||
|
export default function defineThemes(monaco: Monaco, theme: GrafanaTheme2) {
|
||||||
|
// color tokens are defined here https://github.com/microsoft/vscode/blob/main/src/vs/platform/theme/common/colorRegistry.ts#L174
|
||||||
|
const colors = {
|
||||||
|
'editor.background': theme.components.input.background,
|
||||||
|
'minimap.background': theme.colors.background.secondary,
|
||||||
|
};
|
||||||
|
|
||||||
|
monaco.editor.defineTheme('grafana-dark', {
|
||||||
|
base: 'vs-dark',
|
||||||
|
inherit: true,
|
||||||
|
colors: colors,
|
||||||
|
rules: [],
|
||||||
|
});
|
||||||
|
|
||||||
|
monaco.editor.defineTheme('grafana-light', {
|
||||||
|
base: 'vs',
|
||||||
|
inherit: true,
|
||||||
|
colors: colors,
|
||||||
|
rules: [],
|
||||||
|
});
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user