1import { useCallback } from "react";
2
3import {
4 MAX_TERMINAL_FONT_SIZE,
5 MIN_TERMINAL_FONT_SIZE,
6 TERMINAL_FONT_SIZE_STEP,
7} from "../../../../lib/appearancePreferences";
8import { SettingsSection } from "../../components/SettingsSection";
9import { SettingsSwitchRow } from "../../components/SettingsSwitchRow";
10import { useAppearancePreferences } from "../AppearancePreferencesProvider";
11import {
12 AppearancePreviewSeparator,
13 TerminalAppearancePreview,
14} from "../components/AppearancePreviews";
15import { FontSizeSliderRow } from "../components/FontSizeSliderRow";
16
17export function TerminalAppearanceSection() {
18 const { isReady, appearance, setTerminalFontSize } = useAppearancePreferences();
19 const custom = appearance.isTerminalFontSizeCustom;
20
21 const handleToggleCustom = useCallback(
22 (enabled: boolean) => {
23 setTerminalFontSize(enabled ? appearance.terminalFontSize : null);
24 },
25 [appearance.terminalFontSize, setTerminalFontSize],
26 );
27
28 return (
29 <SettingsSection title="Terminal">
30 <TerminalAppearancePreview fontSize={appearance.terminalFontSize} />
31 <AppearancePreviewSeparator />
32 <SettingsSwitchRow
33 disabled={!isReady}
34 icon="terminal"
35 label="Custom font size"
36 onValueChange={handleToggleCustom}
37 value={custom}
38 />
39 {custom ? (
40 <FontSizeSliderRow
41 disabled={!isReady}
42 icon="textformat.size"
43 label="Font size"
44 max={MAX_TERMINAL_FONT_SIZE}
45 min={MIN_TERMINAL_FONT_SIZE}
46 onChange={setTerminalFontSize}
47 step={TERMINAL_FONT_SIZE_STEP}
48 value={appearance.terminalFontSize}
49 valueLabel={`${appearance.terminalFontSize.toFixed(1)} pt`}
50 />
51 ) : null}
52 </SettingsSection>
53 );
54}