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 ? (
+
+ ) : (
+
+ )}
+
+ );
+}