diff --git a/src/components/App.scss b/src/components/App.scss index d9ae29716a9c48f1b31efa0310634e50e1c048cc..0a513f62060cd3529f67811d220e436d279a44d0 100644 --- a/src/components/App.scss +++ b/src/components/App.scss @@ -15,6 +15,19 @@ code { monospace; } + +:root { + --primary-color: #{$gray-100}; + --font-color: #{$black}; + --bg-color: #{$white}; +} + +[data-theme="dark"] { + --primary-color: #{$gray-900}; + --font-color: #{$white}; + --bg-color: #{$black}; +} + .btn-primary.focus, .btn-primary:focus { color: #000; @@ -25,8 +38,8 @@ code { .btn-primary { margin-bottom: 0.625rem; - color: #000; - background: #f6f8fa; + color: var(--font-color); + background: var(--primary-color); font-size: 1.05rem; letter-spacing: 0; border-width: 0rem; diff --git a/src/components/App.tsx b/src/components/App.tsx index b64314321c1cdb8dc963dc0339de83f437fe1f8b..e15d87e03589e0c49685407e06562ef1e2fe2068 100644 --- a/src/components/App.tsx +++ b/src/components/App.tsx @@ -6,7 +6,7 @@ import { faBookOpen, faHome, faCalendarWeek, - faChalkboardTeacher + faChalkboardTeacher, } from "@fortawesome/free-solid-svg-icons"; import StandardView from "./pages/StandardView"; import { Switch, Route } from "react-router-dom"; @@ -28,14 +28,19 @@ class App extends React.Component<{}, AppState> { toggledLeft: false, toggledRight: false, showSettings: false, - fileView: localStorage.getItem("fileView") || "card" + fileView: localStorage.getItem("fileView") || "card", }; } componentDidMount() { - document.documentElement.style.fontSize = `${localStorage.getItem( - "interfaceSize" - ) || "90"}%`; + document.documentElement.style.fontSize = `${ + localStorage.getItem("interfaceSize") || "90" + }%`; + + const currentTheme = localStorage.getItem("theme"); + if (currentTheme) { + document.documentElement.setAttribute("data-theme", currentTheme); + } window.addEventListener("resize", () => { if (window.innerWidth !== this.width) { @@ -49,22 +54,22 @@ class App extends React.Component<{}, AppState> { toggleLeftBar() { if (window.innerWidth <= 1024) { this.setState({ - toggledRight: false + toggledRight: false, }); } - this.setState(state => ({ - toggledLeft: !state.toggledLeft + this.setState((state) => ({ + toggledLeft: !state.toggledLeft, })); } toggleRightBar() { if (window.innerWidth <= 1024) { this.setState({ - toggledLeft: false + toggledLeft: false, }); } - this.setState(state => ({ - toggledRight: !state.toggledRight + this.setState((state) => ({ + toggledRight: !state.toggledRight, })); } @@ -72,12 +77,12 @@ class App extends React.Component<{}, AppState> { if (window.innerWidth <= 1024) { this.setState({ toggledLeft: false, - toggledRight: false + toggledRight: false, }); } else { this.setState({ toggledLeft: true, - toggledRight: true + toggledRight: true, }); } } @@ -92,7 +97,7 @@ class App extends React.Component<{}, AppState> { { name: "Dashboard", path: "/dashboard", icon: faHome }, { name: "Modules", path: "/modules", icon: faChalkboardTeacher }, { name: "Timeline", path: "/timeline", icon: faCalendarWeek }, - { name: "Exams", path: "/exams", icon: faBookOpen } + { name: "Exams", path: "/exams", icon: faBookOpen }, ]; return ( @@ -113,11 +118,11 @@ class App extends React.Component<{}, AppState> { <Route path="/"> <TopBar pages={horizontalBarPages} - onFavIconClick={e => { + onFavIconClick={(e) => { e.preventDefault(); this.toggleLeftBar(); }} - onUserIconClick={e => { + onUserIconClick={(e) => { e.preventDefault(); this.toggleRightBar(); }} @@ -127,7 +132,7 @@ class App extends React.Component<{}, AppState> { onSettingsClick={() => this.setState({ showSettings: true })} toggledLeft={this.state.toggledLeft} toggledRight={this.state.toggledRight} - onOverlayClick={e => { + onOverlayClick={(e) => { e.preventDefault(); this.setState({ toggledLeft: false, toggledRight: false }); }} diff --git a/src/components/atoms/FileListItem/index.tsx b/src/components/atoms/FileListItem/index.tsx index eb636245af220ffb58c3bba8f71986b37c26306e..4b37b91f92a91725eb0dac7ba58ac2006b4d0b15 100644 --- a/src/components/atoms/FileListItem/index.tsx +++ b/src/components/atoms/FileListItem/index.tsx @@ -3,7 +3,6 @@ import styles from "./style.module.scss"; import classNames from "classnames"; import Row from "react-bootstrap/esm/Row"; -import Col from "react-bootstrap/esm/Col"; import Badge from "react-bootstrap/Badge"; import { IconDefinition } from "@fortawesome/free-regular-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; diff --git a/src/components/pages/SettingsModal/index.tsx b/src/components/pages/SettingsModal/index.tsx index bf475e27c2523ce454e3105cae6e86100f209fce..b96ee1dea4a9a4210fad2097d28644fbf142a80c 100644 --- a/src/components/pages/SettingsModal/index.tsx +++ b/src/components/pages/SettingsModal/index.tsx @@ -22,13 +22,15 @@ const SettingsModal: React.FC<Props> = ({ onHide, fileView, onCardViewClick, - onListViewClick + onListViewClick, }) => { const [interfaceSize, setInterfaceSize] = useLocalStorage( "interfaceSize", "90" ); + const [theme, setTheme] = useLocalStorage("theme", "light"); + return ( <Modal style={{ zIndex: "10000" }} @@ -59,7 +61,7 @@ const SettingsModal: React.FC<Props> = ({ <Form.Control className={styles.inputBar} value={interfaceSize} - onChange={e => setInterfaceSize(e.target.value)} + onChange={(e) => setInterfaceSize(e.target.value)} onBlur={() => (document.documentElement.style.fontSize = `${interfaceSize}%`) } @@ -67,6 +69,34 @@ const SettingsModal: React.FC<Props> = ({ </Col> </Form.Group> + <Form.Group style={{ alignItems: "center" }}> + <Form.Label>Theme</Form.Label> + <ButtonGroup style={{ float: "right" }}> + <Button + className={styles.modalToggleButton} + active={theme === "light"} + onClick={() => { + document.documentElement.setAttribute("data-theme", "light"); + setTheme("light"); + }} + variant="secondary" + > + Light + </Button> + <Button + className={styles.modalToggleButton} + active={theme === "dark"} + onClick={() => { + document.documentElement.setAttribute("data-theme", "dark"); + setTheme("dark"); + }} + variant="secondary" + > + Dark + </Button> + </ButtonGroup> + </Form.Group> + <Form.Group style={{ alignItems: "center" }}> <Form.Label>File View</Form.Label> <ButtonGroup style={{ float: "right" }}>