Files
api-copp/web-react/src/theme/themes.ts
jze9 eac61923f4 feat(web): React-фронтенд вместо Flet + fix restore rmtree на bind-mount
web-react/: SPA Vite+React+TS, nginx раздаёт статику и проксирует /api на api:8000 по локалке. docker-compose: web(Flet)->web-react на :80. transfer_crud.backup_restore: чистим содержимое data/radar вместо rmtree точки монтирования (EBUSY).
2026-06-02 13:56:44 +00:00

59 lines
2.1 KiB
TypeScript

// Темы и палитра. Перенос из web/theme_manager.py (THEMES) и web/designer.py (colors).
// Каждая тема переопределяет только фоновые цвета; остальная палитра общая.
export interface Theme {
id: string;
name: string;
background: string;
surface: string;
surfaceAlt: string;
}
export const THEMES: Theme[] = [
{ id: "default", name: "ЦОПП (оранжевая)", background: "#F4F6F8", surface: "#FFFFFF", surfaceAlt: "#E4E8ED" },
{ id: "warm", name: "Тёплая", background: "#FFF3E6", surface: "#FFFFFF", surfaceAlt: "#FFD9B3" },
{ id: "blue", name: "Синяя", background: "#E3F2FD", surface: "#FFFFFF", surfaceAlt: "#B8D9F5" },
{ id: "green", name: "Зелёная", background: "#EDF7E7", surface: "#FFFFFF", surfaceAlt: "#BEE3B0" },
{ id: "dark", name: "Тёмная", background: "#1E2A3A", surface: "#2D3F54", surfaceAlt: "#3D5068" },
];
export const DEFAULT_THEME_ID = "default";
// Постоянная палитра (web/designer.py: class colors)
export const PALETTE = {
primary: "#F85A40",
primaryDark: "#D94530",
primaryLight: "#FFEAB7",
accent: "#FFC845",
accentLime: "#FFC845",
secondaryLight: "#FFEAB7",
info: "#007FBD",
infoDark: "#006AA3",
infoLight: "#D9F1F4",
success: "#85C446",
successLight: "#C0DE9E",
textPrimary: "#1E2A3A",
textSecondary: "#5A6779",
textOnPrimary: "#FFFFFF",
border: "#DDE3EA",
};
// Масштаб (web/theme_manager.py)
export const SCALE_MIN = 0.8;
export const SCALE_MAX = 2.5;
export const SCALE_STEP = 0.1;
export const SCALE_DEFAULT = 1.3;
// Автоопределение по ширине экрана
export const MOBILE_BREAKPOINT = 600;
export const SCALE_MOBILE = 1.0;
export const SCALE_DESKTOP = 1.5;
export function getTheme(id: string | null | undefined): Theme {
return THEMES.find((t) => t.id === id) ?? THEMES[0];
}
export function autoScale(): number {
if (typeof window === "undefined") return SCALE_DEFAULT;
return window.innerWidth < MOBILE_BREAKPOINT ? SCALE_MOBILE : SCALE_DESKTOP;
}