authorgravatar for maria@kuuro.netmaria <maria@kuuro.net> 2026-10-04 22:37:15-03:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-10-04 22:37:15-03:00
logbc2748241776066c532f3312a26f1756d9740f9c
treee7507bb323a020ca9eb61ba61b4e9d2cbbdc0e20
parent801ca76ed6a5b9d5d6a40f6c1ba231d9ffb3757e
signature Signed by PGP key B5690EEEBB952194

perf(web): validate monospace fonts when selected (#15642)


1 files changed, 13 insertions(+), 2 deletions(-)

apps/web/src/components/settings/FontFamilyPicker.tsx+13-2
...@@ -12,6 +12,7 @@ import {...@@ -12,6 +12,7 @@ import {
12 ComboboxTrigger,12 ComboboxTrigger,
13} from "../ui/combobox";13} from "../ui/combobox";
14import { SelectButton } from "../ui/select";14import { SelectButton } from "../ui/select";
15import { stackedThreadToast, toastManager } from "../ui/toast";
1516
16const DEFAULT_FONT_VALUE = "__default__";17const DEFAULT_FONT_VALUE = "__default__";
1718
...@@ -141,8 +142,8 @@ export function FontFamilyPicker({...@@ -141,8 +142,8 @@ export function FontFamilyPicker({
141142
142 const families = useMemo(() => {143 const families = useMemo(() => {
143 if (enumeration.status !== "granted") return [];144 if (enumeration.status !== "granted") return [];
144 return requireMonospace ? enumeration.families.filter(isMonospaceFamily) : enumeration.families;145 return enumeration.families;
145 }, [enumeration, requireMonospace]);146 }, [enumeration]);
146147
147 const items = useMemo(() => {148 const items = useMemo(() => {
148 const trimmedQuery = query.trim().toLowerCase();149 const trimmedQuery = query.trim().toLowerCase();
...@@ -160,6 +161,16 @@ export function FontFamilyPicker({...@@ -160,6 +161,16 @@ export function FontFamilyPicker({
160161
161 const handlePick = (value: string) => {162 const handlePick = (value: string) => {
162 setOpen(false);163 setOpen(false);
164 if (value !== DEFAULT_FONT_VALUE && requireMonospace && !isMonospaceFamily(value)) {
165 toastManager.add(
166 stackedThreadToast({
167 type: "error",
168 title: `"${value}" isn't monospace`,
169 description: "Code and terminal need a fixed-width font, so the current font was kept.",
170 }),
171 );
172 return;
173 }
163 onSelect(value === DEFAULT_FONT_VALUE ? "" : value);174 onSelect(value === DEFAULT_FONT_VALUE ? "" : value);
164 };175 };
165176