1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
import { z } from "zod";
import { ZReaderFontFamily, zReaderFontFamilySchema } from "./users";
export const READER_DEFAULTS = {
fontSize: 18,
lineHeight: 1.6,
fontFamily: "serif" as const,
} as const;
export const READER_FONT_FAMILIES: Record<ZReaderFontFamily, string> = {
serif: "ui-serif, Georgia, Cambria, serif",
sans: "ui-sans-serif, system-ui, sans-serif",
mono: "ui-monospace, Menlo, Monaco, monospace",
} as const;
// Setting constraints for UI controls
export const READER_SETTING_CONSTRAINTS = {
fontSize: { min: 12, max: 24, step: 1 },
lineHeight: { min: 1.2, max: 2.5, step: 0.1 },
} as const;
// Formatting functions for display
export function formatFontSize(value: number): string {
return `${value}px`;
}
export function formatLineHeight(value: number): string {
return value.toFixed(1);
}
export function formatFontFamily(
value: ZReaderFontFamily,
t?: (key: string) => string,
): string {
if (t) {
return t(`settings.info.reader_settings.${value}`);
}
// Fallback labels when no translation function provided
switch (value) {
case "serif":
return "Serif";
case "sans":
return "Sans Serif";
case "mono":
return "Monospace";
}
}
export const zReaderSettings = z.object({
fontSize: z.number().int().min(12).max(24),
lineHeight: z.number().min(1.2).max(2.5),
fontFamily: zReaderFontFamilySchema,
});
export type ReaderSettings = z.infer<typeof zReaderSettings>;
export const zReaderSettingsPartial = zReaderSettings.partial();
export type ReaderSettingsPartial = z.infer<typeof zReaderSettingsPartial>;
|