diff --git a/apps/web/.vscode/launch.json b/apps/web/.vscode/launch.json index edfc0b065..ce988ee09 100644 --- a/apps/web/.vscode/launch.json +++ b/apps/web/.vscode/launch.json @@ -13,7 +13,7 @@ "url": "http://localhost:3000", "webRoot": "${workspaceFolder}", "env": { "DISPLAY": ":0" }, - "runtimeExecutable": "/usr/bin/brave-beta", + "runtimeExecutable": "/usr/bin/brave-browser", "runtimeArgs": ["--remote-debugging-port=9222"] } ] diff --git a/apps/web/src/components/icons/index.js b/apps/web/src/components/icons/index.js index 1e6f15870..a84f79252 100644 --- a/apps/web/src/components/icons/index.js +++ b/apps/web/src/components/icons/index.js @@ -21,13 +21,14 @@ function createIcon(name, rotate = false) { return function (props) { return ( @@ -39,6 +40,7 @@ export const Plus = createIcon(Icons.mdiPlus); export const Minus = createIcon(Icons.mdiMinus); export const Notebook = createIcon(Icons.mdiBookOutline); export const ArrowLeft = createIcon(Icons.mdiArrowLeft); +export const ArrowRight = createIcon(Icons.mdiArrowRight); export const Move = createIcon(Icons.mdiBookPlusMultipleOutline); export const Topic = createIcon(Icons.mdiFormatTitle); export const Alert = createIcon(Icons.mdiAlert); @@ -69,6 +71,7 @@ export const AddToNotebook = createIcon(Icons.mdiBookPlusMultipleOutline); /** Properties Icons */ export const ChevronLeft = createIcon(Icons.mdiChevronLeft); +export const ChevronRight = createIcon(Icons.mdiChevronRight); export const Close = createIcon(Icons.mdiClose); export const Tag = createIcon(Icons.mdiTagTextOutline); export const Pin = createIcon(Icons.mdiPinOutline); @@ -94,3 +97,6 @@ export const Success = createIcon(Icons.mdiCheckCircle); export const Error = createIcon(Icons.mdiAlertCircle); export const Warn = createIcon(Icons.mdiAlert); export const Info = createIcon(Icons.mdiInformation); + +export const ToggleUnchecked = createIcon(Icons.mdiToggleSwitchOff); +export const ToggleChecked = createIcon(Icons.mdiToggleSwitch); diff --git a/apps/web/src/stores/theme-store.js b/apps/web/src/stores/theme-store.js index 375134703..ac18a2030 100644 --- a/apps/web/src/stores/theme-store.js +++ b/apps/web/src/stores/theme-store.js @@ -5,6 +5,7 @@ import Config from "../utils/config"; class ThemeStore extends BaseStore { theme = Config.get("theme", "light"); accent = Config.get("accent", "#0560ff"); + preferSystemTheme = Config.get("preferSystemTheme", false); setTheme = (theme) => { this.set((state) => (state.theme = theme)); @@ -20,6 +21,16 @@ class ThemeStore extends BaseStore { this.set((state) => (state.accent = accent)); Config.set("accent", accent); }; + + setPreferSystemTheme = (preferSystemTheme) => { + this.set((state) => (state.preferSystemTheme = preferSystemTheme)); + Config.set("preferSystemTheme", preferSystemTheme); + }; + + togglePreferSystemTheme = () => { + const preferSystemTheme = this.get().preferSystemTheme; + this.setPreferSystemTheme(!preferSystemTheme); + }; } /** diff --git a/apps/web/src/theme/colorscheme/static.js b/apps/web/src/theme/colorscheme/static.js index b68524496..e66f192d7 100644 --- a/apps/web/src/theme/colorscheme/static.js +++ b/apps/web/src/theme/colorscheme/static.js @@ -5,7 +5,7 @@ class StaticColorSchemeFactory { return { shade: hexToRGB(accent, 0.1), dimPrimary: hexToRGB(accent, 0.7), - fontTertiary: "gray", + fontTertiary: "#5b5b5b", transparent: "transparent", static: "white", error: "#E53935", diff --git a/apps/web/src/theme/variants/text.js b/apps/web/src/theme/variants/text.js index b62c4ed18..4760c5ac8 100644 --- a/apps/web/src/theme/variants/text.js +++ b/apps/web/src/theme/variants/text.js @@ -58,7 +58,11 @@ class Body { class SubBody { constructor() { - return { variant: "text.default", fontSize: "subBody" }; + return { + variant: "text.default", + fontSize: "subBody", + color: "fontTertiary", + }; } } diff --git a/apps/web/src/utils/use-system-theme.js b/apps/web/src/utils/use-system-theme.js new file mode 100644 index 000000000..75207a8f4 --- /dev/null +++ b/apps/web/src/utils/use-system-theme.js @@ -0,0 +1,3 @@ +import useMediaQuery from "./use-media-query"; + +export default () => useMediaQuery("(prefers-color-scheme: dark)"); diff --git a/apps/web/src/views/settings.js b/apps/web/src/views/settings.js index a642ef0b2..420d92eac 100644 --- a/apps/web/src/views/settings.js +++ b/apps/web/src/views/settings.js @@ -1,4 +1,4 @@ -import React from "react"; +import React, { useState, useEffect } from "react"; import { Box, Button, Flex, Text } from "rebass"; import * as Icon from "../components/icons"; import { useStore as useUserStore } from "../stores/user-store"; @@ -7,10 +7,17 @@ import AccentItem from "../components/accent-item"; import accents from "../theme/accents"; import { showLogInDialog } from "../components/dialogs/logindialog"; import { upgrade } from "../common/upgrade"; +import useSystemTheme from "../utils/use-system-theme"; function Settings(props) { const theme = useThemeStore((store) => store.theme); const toggleNightMode = useThemeStore((store) => store.toggleNightMode); + const setTheme = useThemeStore((store) => store.setTheme); + + const preferSystemTheme = useThemeStore((store) => store.preferSystemTheme); + const togglePreferSystemTheme = useThemeStore( + (store) => store.togglePreferSystemTheme + ); const user = useUserStore((store) => store.user); const isLoggedIn = useUserStore((store) => store.isLoggedIn); const isTrial = useUserStore( @@ -18,8 +25,14 @@ function Settings(props) { ); const logout = useUserStore((store) => store.logout); + const isSystemThemeDark = useSystemTheme(); + useEffect(() => { + if (!preferSystemTheme) return; + setTheme(isSystemThemeDark ? "dark" : "light"); + }, [preferSystemTheme, isSystemThemeDark, setTheme]); + return ( - + {isLoggedIn && ( Account Settings @@ -48,12 +61,12 @@ function Settings(props) { variant="columnCenter" bg="primary" mr={2} - size={40} + size={35} sx={{ borderRadius: 80, }} > - + {isLoggedIn ? ( @@ -64,14 +77,14 @@ function Settings(props) { ) : ( <> You are not logged in - - Login to sync your data + + Login to sync your notes )} - {isLoggedIn && ( + {isLoggedIn ? ( {!isTrial ? "Pro" : "Trial"} + ) : ( + )} @@ -95,47 +110,74 @@ function Settings(props) { Logout )} - + Appearance - + - - {accents.map((color) => ( - - ))} - - toggleNightMode()} - py={2} - > - - Dark Mode - - {theme === "dark" ? : } - - - + {accents.map((color) => ( + + ))} + + + + + + {"Backup & Restore"} + + + + + + + Other {["Terms of Service", "Privacy Policy", "About"].map((title) => ( @@ -156,3 +198,35 @@ function Settings(props) { } export default Settings; + +function TextWithTip({ text, tip, sx }) { + return ( + + {text} + + {tip} + + + ); +} + +function ToggleItem(props) { + const { title, onTip, offTip, isToggled, onToggled, onlyIf } = props; + + if (onlyIf === false) return null; + return ( + + + {isToggled ? ( + + ) : ( + + )} + + ); +}