From 29080fa851a72943affd26a5db5d5bc5621ab5b5 Mon Sep 17 00:00:00 2001 From: Andy Clemenko Date: Fri, 13 Mar 2026 18:43:50 -0400 Subject: [PATCH] Fontsize PR for Issue #429 (#430) * adding font size * removing trash * moving font menu * chore: revert port change in compose --------- Co-authored-by: Henry --- .gitignore | 2 + apps/web/src/components/FontSizeSelector.tsx | 32 +++++++++++ apps/web/src/pages/_app.tsx | 29 +++++----- apps/web/src/providers/font-size.tsx | 57 +++++++++++++++++++ apps/web/src/styles/globals.css | 4 ++ .../src/views/settings/AccountSettings.tsx | 11 ++++ 6 files changed, 122 insertions(+), 13 deletions(-) create mode 100644 apps/web/src/components/FontSizeSelector.tsx create mode 100644 apps/web/src/providers/font-size.tsx 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`}