/** * @file SettingsPage.jsx * @description Page for user settings: font size controls for all UI categories. * Settings persist to localStorage via FontSettingsContext. */ import React from "react"; import { useNavigate } from "react-router-dom"; import { useFontSettings, FONT_CATEGORIES } from "../context/FontSettingsContext"; import { Panel } from "../components/UI/Panel"; import { Button } from "../components/UI/Button"; const PRESETS = [ { label: "Мелкий", scales: { table: 0.85, card: 0.85, nav: 0.85, heading: 0.85, body: 0.85, small: 0.85 } }, { label: "Стандарт", scales: { table: 1.0, card: 1.0, nav: 1.0, heading: 1.0, body: 1.0, small: 1.0 } }, { label: "Крупный", scales: { table: 1.15, card: 1.15, nav: 1.15, heading: 1.2, body: 1.15, small: 1.1 } }, { label: "Очень крупный", scales: { table: 1.3, card: 1.3, nav: 1.25, heading: 1.4, body: 1.3, small: 1.2 } }, ]; const Slider = ({ category, value, onChange }) => { const pct = ((value - category.min) / (category.max - category.min)) * 100; return (
{category.label}

{category.description}

{Math.round(value * 100)}%
onChange(parseFloat(e.target.value))} className="fs-slider flex-1" style={{ background: `linear-gradient(to right, var(--color-accent) 0%, var(--color-accent) ${pct}%, var(--color-border) ${pct}%, var(--color-border) 100%)`, }} aria-label={category.label} /> {value.toFixed(2)}×
); }; export const SettingsPage = () => { const { settings, updateCategory, resetAll, categories } = useFontSettings(); const navigate = useNavigate(); const applyPreset = (scales) => { for (const [key, scale] of Object.entries(scales)) { updateCategory(key, scale); } }; // Check if current settings match a preset const activePreset = PRESETS.findIndex((p) => Object.entries(p.scales).every(([k, v]) => Math.abs((settings[k] ?? 1.0) - v) < 0.001) ); return (
{/* Header */}

Настройки

Настройки интерфейса

{/* Presets */}

Быстрые пресеты

{PRESETS.map((preset, i) => ( ))}
{/* Font size sliders */}

Размеры шрифтов

{categories.map((cat) => ( updateCategory(cat.key, v)} /> ))}
{/* Preview */}

Предпросмотр

Заголовок секции

Пункт меню Вкладка
Дата Статус
02.07.2026 В работе

Текст в карточке — описание доставки или заказа.

Основной текст интерфейса.

мелкая подпись · временная отметка

Настройки сохраняются на этом устройстве

); }; export default SettingsPage;