* adding font size * removing trash * moving font menu * chore: revert port change in compose --------- Co-authored-by: Henry <henry_ball@hotmail.co.uk>
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -54,3 +54,5 @@ i18n.cache
|
|||||||
|
|
||||||
# pgdata
|
# pgdata
|
||||||
/apps/web/pgdata
|
/apps/web/pgdata
|
||||||
|
|
||||||
|
.claude
|
||||||
32
apps/web/src/components/FontSizeSelector.tsx
Normal file
32
apps/web/src/components/FontSizeSelector.tsx
Normal file
@@ -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 (
|
||||||
|
<div className="relative">
|
||||||
|
<HiOutlineAdjustmentsHorizontal className="pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-gray-400" />
|
||||||
|
<select
|
||||||
|
id="font-size-select"
|
||||||
|
value={fontSize}
|
||||||
|
onChange={(e) => setFontSize(e.target.value as FontSize)}
|
||||||
|
className="block w-full max-w-[180px] rounded-lg border-0 bg-light-50 pl-10 text-sm shadow-sm ring-1 ring-inset ring-light-300 focus:ring-2 focus:ring-inset focus:ring-light-400 dark:bg-dark-50 dark:text-dark-1000 dark:ring-dark-300 dark:focus:ring-dark-500"
|
||||||
|
>
|
||||||
|
{fontSizeOptions.map((opt) => (
|
||||||
|
<option key={opt.value} value={opt.value}>
|
||||||
|
{opt.label()}
|
||||||
|
</option>
|
||||||
|
))}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -12,6 +12,7 @@ import posthog from "posthog-js";
|
|||||||
import { PostHogProvider } from "posthog-js/react";
|
import { PostHogProvider } from "posthog-js/react";
|
||||||
import { useEffect } from "react";
|
import { useEffect } from "react";
|
||||||
|
|
||||||
|
import { FontSizeProvider } from "~/providers/font-size";
|
||||||
import { KeyboardShortcutProvider } from "~/providers/keyboard-shortcuts";
|
import { KeyboardShortcutProvider } from "~/providers/keyboard-shortcuts";
|
||||||
import { LinguiProviderWrapper } from "~/providers/lingui";
|
import { LinguiProviderWrapper } from "~/providers/lingui";
|
||||||
import { ModalProvider } from "~/providers/modal";
|
import { ModalProvider } from "~/providers/modal";
|
||||||
@@ -83,19 +84,21 @@ const MyApp: AppType = ({ Component, pageProps }: AppPropsWithLayout) => {
|
|||||||
<main className="font-sans">
|
<main className="font-sans">
|
||||||
<KeyboardShortcutProvider>
|
<KeyboardShortcutProvider>
|
||||||
<LinguiProviderWrapper>
|
<LinguiProviderWrapper>
|
||||||
<ThemeProvider attribute="class" defaultTheme="system" enableSystem>
|
<FontSizeProvider>
|
||||||
<ModalProvider>
|
<ThemeProvider attribute="class" defaultTheme="system" enableSystem>
|
||||||
<PopupProvider>
|
<ModalProvider>
|
||||||
{posthogKey ? (
|
<PopupProvider>
|
||||||
<PostHogProvider client={posthog}>
|
{posthogKey ? (
|
||||||
{getLayout(<Component {...pageProps} />)}
|
<PostHogProvider client={posthog}>
|
||||||
</PostHogProvider>
|
{getLayout(<Component {...pageProps} />)}
|
||||||
) : (
|
</PostHogProvider>
|
||||||
getLayout(<Component {...pageProps} />)
|
) : (
|
||||||
)}
|
getLayout(<Component {...pageProps} />)
|
||||||
</PopupProvider>
|
)}
|
||||||
</ModalProvider>
|
</PopupProvider>
|
||||||
</ThemeProvider>
|
</ModalProvider>
|
||||||
|
</ThemeProvider>
|
||||||
|
</FontSizeProvider>
|
||||||
</LinguiProviderWrapper>
|
</LinguiProviderWrapper>
|
||||||
</KeyboardShortcutProvider>
|
</KeyboardShortcutProvider>
|
||||||
</main>
|
</main>
|
||||||
|
|||||||
57
apps/web/src/providers/font-size.tsx
Normal file
57
apps/web/src/providers/font-size.tsx
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
import React, {
|
||||||
|
createContext,
|
||||||
|
useContext,
|
||||||
|
useEffect,
|
||||||
|
useState,
|
||||||
|
type ReactNode,
|
||||||
|
} from "react";
|
||||||
|
|
||||||
|
export type FontSize = "small" | "medium" | "large";
|
||||||
|
|
||||||
|
const fontSizeMap: Record<FontSize, string> = {
|
||||||
|
small: "14px",
|
||||||
|
medium: "16px",
|
||||||
|
large: "18px",
|
||||||
|
};
|
||||||
|
|
||||||
|
interface FontSizeContextProps {
|
||||||
|
fontSize: FontSize;
|
||||||
|
setFontSize: (size: FontSize) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
const FontSizeContext = createContext<FontSizeContextProps | undefined>(
|
||||||
|
undefined,
|
||||||
|
);
|
||||||
|
|
||||||
|
export const FontSizeProvider: React.FC<{ children: ReactNode }> = ({
|
||||||
|
children,
|
||||||
|
}) => {
|
||||||
|
const [fontSize, setFontSizeState] = useState<FontSize>("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 (
|
||||||
|
<FontSizeContext.Provider value={{ fontSize, setFontSize }}>
|
||||||
|
{children}
|
||||||
|
</FontSizeContext.Provider>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const useFontSize = (): FontSizeContextProps => {
|
||||||
|
const context = useContext(FontSizeContext);
|
||||||
|
if (!context) {
|
||||||
|
throw new Error("useFontSize must be used within a FontSizeProvider");
|
||||||
|
}
|
||||||
|
return context;
|
||||||
|
};
|
||||||
@@ -2,6 +2,10 @@
|
|||||||
@tailwind components;
|
@tailwind components;
|
||||||
@tailwind utilities;
|
@tailwind utilities;
|
||||||
|
|
||||||
|
html {
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
[contenteditable="true"]:empty:before {
|
[contenteditable="true"]:empty:before {
|
||||||
content: attr(placeholder);
|
content: attr(placeholder);
|
||||||
display: block;
|
display: block;
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import { env } from "next-runtime-env";
|
|||||||
|
|
||||||
import Button from "~/components/Button";
|
import Button from "~/components/Button";
|
||||||
import FeedbackModal from "~/components/FeedbackModal";
|
import FeedbackModal from "~/components/FeedbackModal";
|
||||||
|
import { FontSizeSelector } from "~/components/FontSizeSelector";
|
||||||
import { LanguageSelector } from "~/components/LanguageSelector";
|
import { LanguageSelector } from "~/components/LanguageSelector";
|
||||||
import Modal from "~/components/modal";
|
import Modal from "~/components/modal";
|
||||||
import { NewWorkspaceForm } from "~/components/NewWorkspaceForm";
|
import { NewWorkspaceForm } from "~/components/NewWorkspaceForm";
|
||||||
@@ -54,6 +55,16 @@ export default function AccountSettings() {
|
|||||||
<LanguageSelector />
|
<LanguageSelector />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div className="mb-8 border-t border-light-300 dark:border-dark-300">
|
||||||
|
<h2 className="mb-4 mt-8 text-[14px] font-bold text-neutral-900 dark:text-dark-1000">
|
||||||
|
{t`Font size`}
|
||||||
|
</h2>
|
||||||
|
<p className="mb-8 text-sm text-neutral-500 dark:text-dark-900">
|
||||||
|
{t`Change the application font size.`}
|
||||||
|
</p>
|
||||||
|
<FontSizeSelector />
|
||||||
|
</div>
|
||||||
|
|
||||||
<div className="mb-8 border-t border-light-300 dark:border-dark-300">
|
<div className="mb-8 border-t border-light-300 dark:border-dark-300">
|
||||||
<h2 className="mb-4 mt-8 text-[14px] font-bold text-neutral-900 dark:text-dark-1000">
|
<h2 className="mb-4 mt-8 text-[14px] font-bold text-neutral-900 dark:text-dark-1000">
|
||||||
{t`Delete account`}
|
{t`Delete account`}
|
||||||
|
|||||||
Reference in New Issue
Block a user