(false);
+ const { isDarkMode } = useUserSettingsContext();
return (
onClick?.()}
+ // eslint-disable-next-line @typescript-eslint/no-misused-promises, @typescript-eslint/prefer-optional-chain, @typescript-eslint/no-unnecessary-condition
+ onClick={() => onClick && onClick()}
onMouseEnter={() => setHovered(true)}
onMouseLeave={() => setHovered(false)}
>
diff --git a/frontend/lib/components/ui/SearchBar/SearchBar.module.scss b/frontend/lib/components/ui/SearchBar/SearchBar.module.scss
index cb361ecef..88d98bee8 100644
--- a/frontend/lib/components/ui/SearchBar/SearchBar.module.scss
+++ b/frontend/lib/components/ui/SearchBar/SearchBar.module.scss
@@ -1,4 +1,4 @@
-@use "@/styles/Colors.module.scss";
+@use "@/styles/BoxShadow.module.scss";
@use "@/styles/IconSizes.module.scss";
@use "@/styles/Radius.module.scss";
@use "@/styles/Spacings.module.scss";
@@ -7,11 +7,11 @@
display: flex;
flex-direction: column;
gap: Spacings.$spacing03;
- background-color: Colors.$white;
+ background-color: var(--background-0);
border-radius: Radius.$big;
- border: 1px solid Colors.$lighter-grey;
+ border: 1px solid var(--border-0);
overflow: hidden;
- box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.25);
+ box-shadow: BoxShadow.$large;
.editor_wrapper {
display: flex;
@@ -26,11 +26,11 @@
.search_icon {
width: IconSizes.$big;
height: IconSizes.$big;
- color: Colors.$accent;
+ color: var(--accent);
cursor: pointer;
&.disabled {
- color: Colors.$black;
+ color: var(--text-3);
pointer-events: none;
opacity: 0.2;
}
diff --git a/frontend/lib/components/ui/SingleSelector/SingleSelector.module.scss b/frontend/lib/components/ui/SingleSelector/SingleSelector.module.scss
index 3c86980a0..3358e56e9 100644
--- a/frontend/lib/components/ui/SingleSelector/SingleSelector.module.scss
+++ b/frontend/lib/components/ui/SingleSelector/SingleSelector.module.scss
@@ -1,4 +1,3 @@
-@use "@/styles/Colors.module.scss";
@use "@/styles/IconSizes.module.scss";
@use "@/styles/Radius.module.scss";
@use "@/styles/Spacings.module.scss";
@@ -9,12 +8,12 @@
display: flex;
flex-direction: column;
position: relative;
- background-color: Colors.$white;
+ background-color: var(--background-0);
.first_line_wrapper {
display: flex;
justify-content: space-between;
- border: 1px solid Colors.$normal-grey;
+ border: 1px solid var(--border-2);
border-radius: Radius.$big;
align-items: center;
cursor: pointer;
@@ -37,14 +36,14 @@
.label {
@include Typography.EllipsisOverflow;
- background-color: Colors.$primary-light;
+ background-color: var(--background-special-1);
border-radius: Radius.$normal;
padding-inline: Spacings.$spacing05;
padding-block: Spacings.$spacing02;
white-space: nowrap;
&.not_set {
- color: Colors.$normal-grey;
+ color: var(--text-1);
background-color: transparent;
padding-inline: 0;
}
@@ -67,10 +66,10 @@
.options {
position: absolute;
- background-color: Colors.$white;
+ background-color: var(--background-0);
width: 100%;
top: 100%;
- border: 1px solid Colors.$normal-grey;
+ border: 1px solid var(--border-2);
border-top: none;
border-radius: 0 0 Radius.$big Radius.$big;
overflow: hidden;
@@ -88,7 +87,7 @@
&:hover {
.option_name {
- background-color: Colors.$primary-lightest;
+ background-color: var(--background-special-1);
}
}
@@ -98,7 +97,7 @@
.option_name {
@include Typography.EllipsisOverflow;
- border: 1px solid Colors.$lightest-black;
+ border: 1px solid var(--border-1);
border-radius: Radius.$small;
padding-inline: Spacings.$spacing05;
padding-block: Spacings.$spacing02;
diff --git a/frontend/lib/components/ui/Tabs/Tabs.module.scss b/frontend/lib/components/ui/Tabs/Tabs.module.scss
index 760d048e2..98a32474d 100644
--- a/frontend/lib/components/ui/Tabs/Tabs.module.scss
+++ b/frontend/lib/components/ui/Tabs/Tabs.module.scss
@@ -1,4 +1,3 @@
-@use "@/styles/Colors.module.scss";
@use "@/styles/Radius.module.scss";
@use "@/styles/ScreenSizes.module.scss";
@use "@/styles/Spacings.module.scss";
@@ -12,25 +11,25 @@
align-items: center;
justify-content: center;
flex: 1;
- border-bottom: 2px solid Colors.$lightest-grey;
+ border-bottom: 2px solid var(--border-0);
padding-block: Spacings.$spacing03;
cursor: pointer;
box-sizing: border-box;
gap: Spacings.$spacing03;
&.selected {
- border-bottom-color: Colors.$primary;
- color: Colors.$primary;
- background-color: Colors.$lightest-grey;
+ border-bottom-color: var(--primary-0);
+ color: var(--primary-0);
+ background-color: var(--background-2);
}
&:hover {
- color: Colors.$primary;
+ color: var(--primary-0);
}
&.disabled {
pointer-events: none;
- color: Colors.$normal-grey;
+ color: var(--text-1);
}
@media (max-width: ScreenSizes.$small) {
diff --git a/frontend/lib/components/ui/Tag/Tag.module.scss b/frontend/lib/components/ui/Tag/Tag.module.scss
index 052eeb9dc..0d8a15fef 100644
--- a/frontend/lib/components/ui/Tag/Tag.module.scss
+++ b/frontend/lib/components/ui/Tag/Tag.module.scss
@@ -1,4 +1,3 @@
-@use "@/styles/Colors.module.scss";
@use "@/styles/Radius.module.scss";
@use "@/styles/Spacings.module.scss";
@use "@/styles/Typography.module.scss";
@@ -11,10 +10,10 @@
font-size: Typography.$tiny;
&.primary {
- background-color: Colors.$primary-light;
+ background-color: var(--primary-1);
}
&.gold {
- background-color: Colors.$gold;
+ background-color: var(--gold);
}
}
diff --git a/frontend/lib/components/ui/TextAreaInput/TextAreaInput.module.scss b/frontend/lib/components/ui/TextAreaInput/TextAreaInput.module.scss
index 806d152f3..cb34fbcc7 100644
--- a/frontend/lib/components/ui/TextAreaInput/TextAreaInput.module.scss
+++ b/frontend/lib/components/ui/TextAreaInput/TextAreaInput.module.scss
@@ -1,17 +1,16 @@
-@use "@/styles/Colors.module.scss";
@use "@/styles/Radius.module.scss";
@use "@/styles/Spacings.module.scss";
.text_area_input_container {
display: flex;
- border: 1px solid Colors.$lighter-grey;
+ border: 1px solid var(--border-0);
gap: Spacings.$spacing03;
padding-block: Spacings.$spacing02;
padding-inline: Spacings.$spacing03;
border-radius: Radius.$big;
align-items: center;
width: 100%;
- background-color: Colors.$white;
+ background-color: var(--background-0);
&.simple {
border: none;
@@ -30,10 +29,11 @@
}
.text_area_input {
- caret-color: Colors.$accent;
+ caret-color: var(--accent);
border: none;
flex: 1;
resize: none;
+ background-color: transparent;
&:focus {
box-shadow: none;
diff --git a/frontend/lib/components/ui/TextButton/TextButton.module.scss b/frontend/lib/components/ui/TextButton/TextButton.module.scss
index cc9deedb4..e63539b18 100644
--- a/frontend/lib/components/ui/TextButton/TextButton.module.scss
+++ b/frontend/lib/components/ui/TextButton/TextButton.module.scss
@@ -1,4 +1,3 @@
-@use "@/styles/Colors.module.scss";
@use "@/styles/Spacings.module.scss";
.text_button_wrapper {
@@ -10,17 +9,17 @@
}
.black {
- color: Colors.$black;
+ color: var(--text-3);
&.hovered {
- color: Colors.$primary;
+ color: var(--primary-0);
}
}
.dangerous {
- color: Colors.$dangerous;
+ color: var(--dangerous);
&.hovered {
- color: Colors.$dangerous-dark;
+ color: var(--dangerous)-dark;
}
}
diff --git a/frontend/lib/components/ui/TextInput/TextInput.module.scss b/frontend/lib/components/ui/TextInput/TextInput.module.scss
index 8bc667bfd..59b969656 100644
--- a/frontend/lib/components/ui/TextInput/TextInput.module.scss
+++ b/frontend/lib/components/ui/TextInput/TextInput.module.scss
@@ -1,17 +1,16 @@
-@use "@/styles/Colors.module.scss";
@use "@/styles/Radius.module.scss";
@use "@/styles/Spacings.module.scss";
.text_input_container {
display: flex;
- border: 1px solid Colors.$lighter-grey;
+ border: 1px solid var(--border-0);
gap: Spacings.$spacing03;
padding-block: Spacings.$spacing02;
padding-inline: Spacings.$spacing03;
border-radius: Radius.$big;
align-items: center;
width: 100%;
- background-color: Colors.$white;
+ background-color: var(--background-0);
&.simple {
border: none;
@@ -30,7 +29,7 @@
}
.text_input {
- caret-color: Colors.$accent;
+ caret-color: var(--accent);
border: none;
flex: 1;
background-color: transparent;
diff --git a/frontend/lib/components/ui/Tooltip/Tooltip.module.scss b/frontend/lib/components/ui/Tooltip/Tooltip.module.scss
index de95790f2..af48defa9 100644
--- a/frontend/lib/components/ui/Tooltip/Tooltip.module.scss
+++ b/frontend/lib/components/ui/Tooltip/Tooltip.module.scss
@@ -1,4 +1,3 @@
-@use "@/styles/Colors.module.scss";
@use "@/styles/Radius.module.scss";
@use "@/styles/Spacings.module.scss";
@use "@/styles/Typography.module.scss";
@@ -6,7 +5,7 @@
.tooltip_content_wrapper {
z-index: ZIndexes.$tooltip;
- background-color: Colors.$lightest-black;
+ background-color: var(--background-3);
padding: Spacings.$spacing03;
border-radius: Radius.$normal;
font-size: Typography.$small;
diff --git a/frontend/lib/context/UserSettingsProvider/User-settings.provider.tsx b/frontend/lib/context/UserSettingsProvider/User-settings.provider.tsx
new file mode 100644
index 000000000..d0798f154
--- /dev/null
+++ b/frontend/lib/context/UserSettingsProvider/User-settings.provider.tsx
@@ -0,0 +1,76 @@
+import { createContext, useEffect, useState } from "react";
+
+import { parseBoolean } from "@/lib/helpers/parseBoolean";
+
+type UserSettingsContextType = {
+ isDarkMode: boolean;
+ setIsDarkMode: React.Dispatch>;
+};
+
+export const UserSettingsContext = createContext<
+ UserSettingsContextType | undefined
+>(undefined);
+
+export const UserSettingsProvider = ({
+ children,
+}: {
+ children: React.ReactNode;
+}): JSX.Element => {
+ const [isDarkMode, setIsDarkMode] = useState(() => {
+ if (typeof window !== "undefined") {
+ const localIsDarkMode = localStorage.getItem("isDarkMode");
+
+ return parseBoolean(localIsDarkMode);
+ }
+
+ return false;
+ });
+
+ useEffect(() => {
+ if (typeof window !== "undefined") {
+ const prefersDarkMode = window.matchMedia(
+ "(prefers-color-scheme: dark)"
+ ).matches;
+ const localIsDarkMode = localStorage.getItem("isDarkMode");
+ const newState =
+ localIsDarkMode !== null
+ ? parseBoolean(localIsDarkMode)
+ : prefersDarkMode;
+ setIsDarkMode(newState);
+ newState
+ ? document.body.classList.add("dark_mode")
+ : document.body.classList.remove("dark_mode");
+
+ const mediaQueryList = window.matchMedia("(prefers-color-scheme: dark)");
+ const listener = (event: MediaQueryListEvent) => {
+ const updatedState = event.matches;
+ setIsDarkMode(updatedState);
+ localStorage.setItem("isDarkMode", JSON.stringify(updatedState));
+ };
+ mediaQueryList.addEventListener("change", listener);
+
+ return () => {
+ mediaQueryList.removeEventListener("change", listener);
+ };
+ }
+ }, []);
+
+ useEffect(() => {
+ isDarkMode
+ ? document.body.classList.add("dark_mode")
+ : document.body.classList.remove("dark_mode");
+
+ localStorage.setItem("isDarkMode", JSON.stringify(isDarkMode));
+ }, [isDarkMode]);
+
+ return (
+
+ {children}
+
+ );
+};
diff --git a/frontend/lib/context/UserSettingsProvider/hooks/useUserSettingsContext.tsx b/frontend/lib/context/UserSettingsProvider/hooks/useUserSettingsContext.tsx
new file mode 100644
index 000000000..bf1386917
--- /dev/null
+++ b/frontend/lib/context/UserSettingsProvider/hooks/useUserSettingsContext.tsx
@@ -0,0 +1,15 @@
+import { useContext } from "react";
+
+import { UserSettingsContext } from "../User-settings.provider";
+
+// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
+export const useUserSettingsContext = () => {
+ const context = useContext(UserSettingsContext);
+ if (context === undefined) {
+ throw new Error(
+ "useUserSettingsContext must be used within a UserSettingsProvider"
+ );
+ }
+
+ return context;
+};
diff --git a/frontend/lib/helpers/iconList.ts b/frontend/lib/helpers/iconList.ts
index be706fee0..85581b796 100644
--- a/frontend/lib/helpers/iconList.ts
+++ b/frontend/lib/helpers/iconList.ts
@@ -14,10 +14,12 @@ import {
FaGithub,
FaKey,
FaLinkedin,
+ FaMoon,
FaRegFileAlt,
FaRegKeyboard,
FaRegStar,
FaRegUserCircle,
+ FaSun,
FaTwitter,
FaUnlock,
} from "react-icons/fa";
@@ -100,6 +102,7 @@ export const iconList: { [name: string]: IconType } = {
linkedin: FaLinkedin,
loader: AiOutlineLoading3Quarters,
logout: IoMdLogOut,
+ moon: FaMoon,
options: SlOptions,
paragraph: BsTextParagraph,
prompt: FaRegKeyboard,
@@ -110,6 +113,7 @@ export const iconList: { [name: string]: IconType } = {
share: IoShareSocial,
software: CgSoftwareDownload,
star: FaRegStar,
+ sun: FaSun,
twitter: FaTwitter,
unlock: FaUnlock,
upload: FiUpload,
diff --git a/frontend/lib/helpers/parseBoolean.ts b/frontend/lib/helpers/parseBoolean.ts
new file mode 100644
index 000000000..e76ca877c
--- /dev/null
+++ b/frontend/lib/helpers/parseBoolean.ts
@@ -0,0 +1,7 @@
+export const parseBoolean = (value: string | null): boolean => {
+ if (value === null) {
+ return false;
+ }
+
+ return value.toLowerCase() === "true";
+};
diff --git a/frontend/public/default_brain_image.png b/frontend/public/default_brain_image.png
new file mode 100644
index 0000000000000000000000000000000000000000..9f682cdef646afb4c6762acc9234772c406a927e
GIT binary patch
literal 5259
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