Added theme toggle
+Added dark-mode and light-mode component icons +Added ThemeToggle in the toolbar +Added ThemeManager and ThemeContext
This commit is contained in:
parent
0d2580f23e
commit
285c5b04e8
@ -10,12 +10,14 @@ import DistanceMeterContext from '../contexts/DistanceMeterContext';
|
||||
import {GradientsManager} from "./GradientsManager";
|
||||
import SideMenuContext from '../contexts/SideMenuContext';
|
||||
import SceneryManager from './SceneryManager';
|
||||
import ThemeManager from './ThemeManager';
|
||||
|
||||
function App() {
|
||||
const [sideMenuOpen, setSideMenuOpen] = useState(false);
|
||||
const [distancePoints, setDistancePoints] = useState(null);
|
||||
|
||||
return (
|
||||
<ThemeManager>
|
||||
<SettingsManager>
|
||||
<SceneryManager>
|
||||
<GradientsManager>
|
||||
@ -27,6 +29,7 @@ function App() {
|
||||
</GradientsManager>
|
||||
</SceneryManager>
|
||||
</SettingsManager>
|
||||
</ThemeManager>
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
20
src/components/ThemeManager.js
Normal file
20
src/components/ThemeManager.js
Normal file
@ -0,0 +1,20 @@
|
||||
import { useState } from "react";
|
||||
import ThemeContext from "../contexts/ThemeContext";
|
||||
|
||||
export default function ThemeManager(props) {
|
||||
const [ lightMode, setLightMode ] = useState(false);
|
||||
|
||||
if(lightMode === true) {
|
||||
document.body.classList.add('light-mode');
|
||||
} else {
|
||||
document.body.classList.remove('light-mode');
|
||||
}
|
||||
|
||||
return (
|
||||
<ThemeContext.Provider value={{
|
||||
lightMode, setLightMode
|
||||
}}>
|
||||
{ props.children }
|
||||
</ThemeContext.Provider>
|
||||
);
|
||||
}
|
||||
19
src/components/toolbar/ThemeToggle.js
Normal file
19
src/components/toolbar/ThemeToggle.js
Normal file
@ -0,0 +1,19 @@
|
||||
import { useContext } from 'react';
|
||||
import { LightModeIcon, DarkModeIcon } from '../../icons';
|
||||
import ThemeContext from '../../contexts/ThemeContext';
|
||||
|
||||
export default function ThemeToggle() {
|
||||
const { setLightMode, lightMode } = useContext(ThemeContext);
|
||||
|
||||
const toggleLightMode = () => {
|
||||
setLightMode((prev) => !prev);
|
||||
}
|
||||
|
||||
return (
|
||||
<div className='theme-toggle'>
|
||||
<button onClick={toggleLightMode} className='invis-button'>
|
||||
{lightMode ? <LightModeIcon /> : <DarkModeIcon />}
|
||||
</button>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@ -54,10 +54,12 @@
|
||||
width: 2rem;
|
||||
}
|
||||
|
||||
.theme-toggle g,
|
||||
.side-menu-toggle g {
|
||||
stroke: #aaa;
|
||||
}
|
||||
|
||||
.theme-toggle:hover g,
|
||||
.side-menu-toggle:hover g {
|
||||
stroke: #fff;
|
||||
}
|
||||
|
||||
@ -4,6 +4,7 @@ import CustomFileSelect from './CustomFileSelect';
|
||||
import SideMenuToggle from './SideMenuToggle';
|
||||
import SceneryList from './SceneryList';
|
||||
import ElectrificationStepMode from './ElectrificationStepMode';
|
||||
import ThemeToggle from './ThemeToggle';
|
||||
|
||||
export default function Toolbar() {
|
||||
return (
|
||||
@ -14,6 +15,7 @@ export default function Toolbar() {
|
||||
<CustomFileSelect />
|
||||
<ElectrificationStepMode />
|
||||
<div className='toolbar-spacer'></div>
|
||||
<ThemeToggle />
|
||||
<SideMenuToggle />
|
||||
</div>
|
||||
<div className='loading-indicator-cont'>
|
||||
|
||||
4
src/contexts/ThemeContext.js
Normal file
4
src/contexts/ThemeContext.js
Normal file
@ -0,0 +1,4 @@
|
||||
import { createContext } from 'react';
|
||||
|
||||
const ThemeContext = createContext();
|
||||
export default ThemeContext;
|
||||
@ -1,4 +1,6 @@
|
||||
/* Toolbar Icons */
|
||||
export { DarkModeIcon } from "./toolbar/dark-mode";
|
||||
export { LightModeIcon } from "./toolbar/light-mode";
|
||||
export { SideMenuIcon } from "./toolbar/side-menu";
|
||||
|
||||
/* TrackHoverInfo Icons */
|
||||
|
||||
7
src/icons/toolbar/dark-mode.js
Normal file
7
src/icons/toolbar/dark-mode.js
Normal file
@ -0,0 +1,7 @@
|
||||
export const DarkModeIcon = ({color = '#aaa', strokeWidth = 9}) => (
|
||||
<svg version="1.1" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
|
||||
<g fill="none" stroke={color} strokeLinecap="round" strokeLinejoin="round" strokeWidth={strokeWidth}>
|
||||
<path d="m52.52 19c-17.021 0.12272-30.775 13.978-30.775 31 1.6e-4 17.109 13.891 31 31 31 10.113 3.5e-5 19.594-4.936 25.394-13.221 0.46456-0.66594-0.01618-1.5787-0.82812-1.5723-0.06911 5.69e-4 -0.13791-7.4e-5 -0.20703 0h-2e-3c-16.027-0.0012-28.998-12.973-28.998-29-5.3e-5 -5.951 1.831-11.758 5.2441-16.633 0.41109-0.63002-0.01926-1.5353-0.82807-1.5742z" />
|
||||
</g>
|
||||
</svg>
|
||||
);
|
||||
18
src/icons/toolbar/light-mode.js
Normal file
18
src/icons/toolbar/light-mode.js
Normal file
@ -0,0 +1,18 @@
|
||||
export const LightModeIcon = ({color = '#aaa', strokeWidth = 10}) => (
|
||||
<svg version="1.1" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
|
||||
<g stroke={color} fill="none">
|
||||
<circle cx="50" cy="50" r="14" strokeWidth={strokeWidth * 0.8} />
|
||||
<g strokeLinecap="round" strokeWidth={strokeWidth} >
|
||||
<path d="m14 50h7"/>
|
||||
<path d="m79 50h7"/>
|
||||
<path d="m24.544 75.456 4.9497-4.9497"/>
|
||||
<path d="m70.506 29.494 4.9497-4.9497"/>
|
||||
<path d="m50 86v-7"/>
|
||||
<path d="m50 21v-7"/>
|
||||
<path d="m75.456 75.456-4.9497-4.9497"/>
|
||||
<path d="m29.494 29.494-4.9497-4.9497"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
);
|
||||
Loading…
Reference in New Issue
Block a user