diff --git a/.gitignore b/.gitignore
index c3321fea..b282cf3c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -54,3 +54,5 @@ i18n.cache
# pgdata
/apps/web/pgdata
+
+.claude
\ No newline at end of file
diff --git a/apps/web/src/components/FontSizeSelector.tsx b/apps/web/src/components/FontSizeSelector.tsx
new file mode 100644
index 00000000..9478ef41
--- /dev/null
+++ b/apps/web/src/components/FontSizeSelector.tsx
@@ -0,0 +1,32 @@
+import { t } from "@lingui/core/macro";
+import { HiOutlineAdjustmentsHorizontal } from "react-icons/hi2";
+
+import { useFontSize, type FontSize } from "~/providers/font-size";
+
+const fontSizeOptions: { value: FontSize; label: () => string }[] = [
+ { value: "small", label: () => t`Small` },
+ { value: "medium", label: () => t`Medium` },
+ { value: "large", label: () => t`Large` },
+];
+
+export function FontSizeSelector() {
+ const { fontSize, setFontSize } = useFontSize();
+
+ return (
+
+
+
+
+ );
+}
diff --git a/apps/web/src/pages/_app.tsx b/apps/web/src/pages/_app.tsx
index 7379cd8e..eb570325 100644
--- a/apps/web/src/pages/_app.tsx
+++ b/apps/web/src/pages/_app.tsx
@@ -12,6 +12,7 @@ import posthog from "posthog-js";
import { PostHogProvider } from "posthog-js/react";
import { useEffect } from "react";
+import { FontSizeProvider } from "~/providers/font-size";
import { KeyboardShortcutProvider } from "~/providers/keyboard-shortcuts";
import { LinguiProviderWrapper } from "~/providers/lingui";
import { ModalProvider } from "~/providers/modal";
@@ -83,19 +84,21 @@ const MyApp: AppType = ({ Component, pageProps }: AppPropsWithLayout) => {
-
-
-
- {posthogKey ? (
-
- {getLayout()}
-
- ) : (
- getLayout()
- )}
-
-
-
+
+
+
+
+ {posthogKey ? (
+
+ {getLayout()}
+
+ ) : (
+ getLayout()
+ )}
+
+
+
+
diff --git a/apps/web/src/providers/font-size.tsx b/apps/web/src/providers/font-size.tsx
new file mode 100644
index 00000000..577e2e6a
--- /dev/null
+++ b/apps/web/src/providers/font-size.tsx
@@ -0,0 +1,57 @@
+import React, {
+ createContext,
+ useContext,
+ useEffect,
+ useState,
+ type ReactNode,
+} from "react";
+
+export type FontSize = "small" | "medium" | "large";
+
+const fontSizeMap: Record = {
+ small: "14px",
+ medium: "16px",
+ large: "18px",
+};
+
+interface FontSizeContextProps {
+ fontSize: FontSize;
+ setFontSize: (size: FontSize) => void;
+}
+
+const FontSizeContext = createContext(
+ undefined,
+);
+
+export const FontSizeProvider: React.FC<{ children: ReactNode }> = ({
+ children,
+}) => {
+ const [fontSize, setFontSizeState] = useState("medium");
+
+ const setFontSize = (size: FontSize) => {
+ document.documentElement.style.fontSize = fontSizeMap[size];
+ localStorage.setItem("fontSize", size);
+ setFontSizeState(size);
+ };
+
+ useEffect(() => {
+ const stored = localStorage.getItem("fontSize") as FontSize | null;
+ const size = stored && fontSizeMap[stored] ? stored : "medium";
+ document.documentElement.style.fontSize = fontSizeMap[size];
+ setFontSizeState(size);
+ }, []);
+
+ return (
+
+ {children}
+
+ );
+};
+
+export const useFontSize = (): FontSizeContextProps => {
+ const context = useContext(FontSizeContext);
+ if (!context) {
+ throw new Error("useFontSize must be used within a FontSizeProvider");
+ }
+ return context;
+};
diff --git a/apps/web/src/styles/globals.css b/apps/web/src/styles/globals.css
index eb0cf1cc..b517bd1b 100644
--- a/apps/web/src/styles/globals.css
+++ b/apps/web/src/styles/globals.css
@@ -2,6 +2,10 @@
@tailwind components;
@tailwind utilities;
+html {
+ font-size: 14px;
+}
+
[contenteditable="true"]:empty:before {
content: attr(placeholder);
display: block;
diff --git a/apps/web/src/views/settings/AccountSettings.tsx b/apps/web/src/views/settings/AccountSettings.tsx
index e28abb76..c91ebf21 100644
--- a/apps/web/src/views/settings/AccountSettings.tsx
+++ b/apps/web/src/views/settings/AccountSettings.tsx
@@ -3,6 +3,7 @@ import { env } from "next-runtime-env";
import Button from "~/components/Button";
import FeedbackModal from "~/components/FeedbackModal";
+import { FontSizeSelector } from "~/components/FontSizeSelector";
import { LanguageSelector } from "~/components/LanguageSelector";
import Modal from "~/components/modal";
import { NewWorkspaceForm } from "~/components/NewWorkspaceForm";
@@ -54,6 +55,16 @@ export default function AccountSettings() {
+
+
+ {t`Font size`}
+
+
+ {t`Change the application font size.`}
+
+
+
+
{t`Delete account`}