diff options
author | 2022-08-12 19:54:46 +0200 | |
---|---|---|
committer | 2022-08-12 19:54:46 +0200 | |
commit | d22c3b0c257f5daf5b401988a35ab9ce981a2341 (patch) | |
tree | 0a661c927c37b52197326d1c05e211daf9bd19e5 /subprojects/frontend/src/theme | |
parent | fix(language): rule parsing test (diff) | |
download | refinery-d22c3b0c257f5daf5b401988a35ab9ce981a2341.tar.gz refinery-d22c3b0c257f5daf5b401988a35ab9ce981a2341.tar.zst refinery-d22c3b0c257f5daf5b401988a35ab9ce981a2341.zip |
refactor(frontend): move from Webpack to Vite
Also overhaulds the building and linting for frontend assets.
Diffstat (limited to 'subprojects/frontend/src/theme')
-rw-r--r-- | subprojects/frontend/src/theme/EditorTheme.ts | 46 | ||||
-rw-r--r-- | subprojects/frontend/src/theme/ThemeProvider.tsx | 61 | ||||
-rw-r--r-- | subprojects/frontend/src/theme/ThemeStore.ts | 64 |
3 files changed, 71 insertions, 100 deletions
diff --git a/subprojects/frontend/src/theme/EditorTheme.ts b/subprojects/frontend/src/theme/EditorTheme.ts index 294192fa..a16b4c3b 100644 --- a/subprojects/frontend/src/theme/EditorTheme.ts +++ b/subprojects/frontend/src/theme/EditorTheme.ts | |||
@@ -1,47 +1,7 @@ | |||
1 | import type { PaletteMode } from '@mui/material'; | 1 | enum EditorTheme { |
2 | |||
3 | import cssVariables from '../themeVariables.module.scss'; | ||
4 | |||
5 | export enum EditorTheme { | ||
6 | Light, | 2 | Light, |
7 | Dark, | 3 | Dark, |
4 | Default = EditorTheme.Dark, | ||
8 | } | 5 | } |
9 | 6 | ||
10 | export class EditorThemeData { | 7 | export default EditorTheme; |
11 | className: string; | ||
12 | |||
13 | paletteMode: PaletteMode; | ||
14 | |||
15 | toggleDarkMode: EditorTheme; | ||
16 | |||
17 | foreground!: string; | ||
18 | |||
19 | foregroundHighlight!: string; | ||
20 | |||
21 | background!: string; | ||
22 | |||
23 | primary!: string; | ||
24 | |||
25 | secondary!: string; | ||
26 | |||
27 | constructor(className: string, paletteMode: PaletteMode, toggleDarkMode: EditorTheme) { | ||
28 | this.className = className; | ||
29 | this.paletteMode = paletteMode; | ||
30 | this.toggleDarkMode = toggleDarkMode; | ||
31 | Reflect.ownKeys(this).forEach((key) => { | ||
32 | if (!Reflect.get(this, key)) { | ||
33 | const cssKey = `${this.className}--${key.toString()}`; | ||
34 | if (cssKey in cssVariables) { | ||
35 | Reflect.set(this, key, cssVariables[cssKey]); | ||
36 | } | ||
37 | } | ||
38 | }); | ||
39 | } | ||
40 | } | ||
41 | |||
42 | export const DEFAULT_THEME = EditorTheme.Dark; | ||
43 | |||
44 | export const EDITOR_THEMES: { [key in EditorTheme]: EditorThemeData } = { | ||
45 | [EditorTheme.Light]: new EditorThemeData('light', 'light', EditorTheme.Dark), | ||
46 | [EditorTheme.Dark]: new EditorThemeData('dark', 'dark', EditorTheme.Light), | ||
47 | }; | ||
diff --git a/subprojects/frontend/src/theme/ThemeProvider.tsx b/subprojects/frontend/src/theme/ThemeProvider.tsx index c6194c69..cf18e21c 100644 --- a/subprojects/frontend/src/theme/ThemeProvider.tsx +++ b/subprojects/frontend/src/theme/ThemeProvider.tsx | |||
@@ -1,15 +1,62 @@ | |||
1 | import { | ||
2 | createTheme, | ||
3 | responsiveFontSizes, | ||
4 | type ThemeOptions, | ||
5 | ThemeProvider as MaterialUiThemeProvider, | ||
6 | } from '@mui/material/styles'; | ||
1 | import { observer } from 'mobx-react-lite'; | 7 | import { observer } from 'mobx-react-lite'; |
2 | import { ThemeProvider as MaterialUiThemeProvider } from '@mui/material/styles'; | ||
3 | import React, { type ReactNode } from 'react'; | 8 | import React, { type ReactNode } from 'react'; |
4 | 9 | ||
5 | import { useRootStore } from '../RootStore'; | 10 | import { useRootStore } from '../RootStore'; |
6 | 11 | ||
7 | export const ThemeProvider: React.FC<{ children: ReactNode }> = observer(({ children }) => { | 12 | import EditorTheme from './EditorTheme'; |
8 | const { themeStore } = useRootStore(); | 13 | |
14 | function getMUIThemeOptions(currentTheme: EditorTheme): ThemeOptions { | ||
15 | switch (currentTheme) { | ||
16 | case EditorTheme.Light: | ||
17 | return { | ||
18 | palette: { | ||
19 | primary: { | ||
20 | main: '#56b6c2', | ||
21 | }, | ||
22 | }, | ||
23 | }; | ||
24 | case EditorTheme.Dark: | ||
25 | return { | ||
26 | palette: { | ||
27 | primary: { | ||
28 | main: '#56b6c2', | ||
29 | }, | ||
30 | }, | ||
31 | }; | ||
32 | default: | ||
33 | throw new Error(`Unknown theme: ${currentTheme}`); | ||
34 | } | ||
35 | } | ||
36 | |||
37 | function ThemeProvider({ children }: { children?: ReactNode }) { | ||
38 | const { | ||
39 | themeStore: { currentTheme, darkMode }, | ||
40 | } = useRootStore(); | ||
41 | |||
42 | const themeOptions = getMUIThemeOptions(currentTheme); | ||
43 | const theme = responsiveFontSizes( | ||
44 | createTheme({ | ||
45 | ...themeOptions, | ||
46 | palette: { | ||
47 | mode: darkMode ? 'dark' : 'light', | ||
48 | ...(themeOptions.palette ?? {}), | ||
49 | }, | ||
50 | }), | ||
51 | ); | ||
9 | 52 | ||
10 | return ( | 53 | return ( |
11 | <MaterialUiThemeProvider theme={themeStore.materialUiTheme}> | 54 | <MaterialUiThemeProvider theme={theme}>{children}</MaterialUiThemeProvider> |
12 | {children} | ||
13 | </MaterialUiThemeProvider> | ||
14 | ); | 55 | ); |
15 | }); | 56 | } |
57 | |||
58 | ThemeProvider.defaultProps = { | ||
59 | children: undefined, | ||
60 | }; | ||
61 | |||
62 | export default observer(ThemeProvider); | ||
diff --git a/subprojects/frontend/src/theme/ThemeStore.ts b/subprojects/frontend/src/theme/ThemeStore.ts index ffaf6dde..ded1f29a 100644 --- a/subprojects/frontend/src/theme/ThemeStore.ts +++ b/subprojects/frontend/src/theme/ThemeStore.ts | |||
@@ -1,64 +1,28 @@ | |||
1 | import { makeAutoObservable } from 'mobx'; | 1 | import { makeAutoObservable } from 'mobx'; |
2 | import { | ||
3 | Theme, | ||
4 | createTheme, | ||
5 | responsiveFontSizes, | ||
6 | } from '@mui/material/styles'; | ||
7 | 2 | ||
8 | import { | 3 | import EditorTheme from './EditorTheme'; |
9 | EditorTheme, | ||
10 | EditorThemeData, | ||
11 | DEFAULT_THEME, | ||
12 | EDITOR_THEMES, | ||
13 | } from './EditorTheme'; | ||
14 | 4 | ||
15 | export class ThemeStore { | 5 | export default class ThemeStore { |
16 | currentTheme: EditorTheme = DEFAULT_THEME; | 6 | currentTheme: EditorTheme = EditorTheme.Default; |
17 | 7 | ||
18 | constructor() { | 8 | constructor() { |
19 | makeAutoObservable(this); | 9 | makeAutoObservable(this); |
20 | } | 10 | } |
21 | 11 | ||
22 | toggleDarkMode(): void { | 12 | toggleDarkMode(): void { |
23 | this.currentTheme = this.currentThemeData.toggleDarkMode; | 13 | switch (this.currentTheme) { |
24 | } | 14 | case EditorTheme.Light: |
25 | 15 | this.currentTheme = EditorTheme.Dark; | |
26 | private get currentThemeData(): EditorThemeData { | 16 | break; |
27 | return EDITOR_THEMES[this.currentTheme]; | 17 | case EditorTheme.Dark: |
28 | } | 18 | this.currentTheme = EditorTheme.Light; |
29 | 19 | break; | |
30 | get materialUiTheme(): Theme { | 20 | default: |
31 | const themeData = this.currentThemeData; | 21 | throw new Error(`Unknown theme: ${this.currentTheme}`); |
32 | const materialUiTheme = createTheme({ | 22 | } |
33 | palette: { | ||
34 | mode: themeData.paletteMode, | ||
35 | background: { | ||
36 | default: themeData.background, | ||
37 | paper: themeData.background, | ||
38 | }, | ||
39 | primary: { | ||
40 | main: themeData.primary, | ||
41 | }, | ||
42 | secondary: { | ||
43 | main: themeData.secondary, | ||
44 | }, | ||
45 | error: { | ||
46 | main: themeData.secondary, | ||
47 | }, | ||
48 | text: { | ||
49 | primary: themeData.foregroundHighlight, | ||
50 | secondary: themeData.foreground, | ||
51 | }, | ||
52 | }, | ||
53 | }); | ||
54 | return responsiveFontSizes(materialUiTheme); | ||
55 | } | 23 | } |
56 | 24 | ||
57 | get darkMode(): boolean { | 25 | get darkMode(): boolean { |
58 | return this.currentThemeData.paletteMode === 'dark'; | 26 | return this.currentTheme === EditorTheme.Dark; |
59 | } | ||
60 | |||
61 | get className(): string { | ||
62 | return this.currentThemeData.className; | ||
63 | } | 27 | } |
64 | } | 28 | } |