From 28fc3ab0fb2b29954a120f3f7302ce9c69dcf973 Mon Sep 17 00:00:00 2001 From: DIKER0K Date: Sun, 14 Dec 2025 22:25:01 +0500 Subject: [PATCH] add theme provider --- src/renderer/index.tsx | 11 ++- src/theme/themes.ts | 173 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 183 insertions(+), 1 deletion(-) create mode 100644 src/theme/themes.ts diff --git a/src/renderer/index.tsx b/src/renderer/index.tsx index 8864218..e18b0c2 100644 --- a/src/renderer/index.tsx +++ b/src/renderer/index.tsx @@ -1,9 +1,18 @@ import { createRoot } from 'react-dom/client'; import App from './App'; +import { ThemeProvider, CssBaseline } from '@mui/material'; +import { defaultTheme } from '../theme/themes'; // <-- поправь путь, если themes.ts лежит в другом месте + const container = document.getElementById('root') as HTMLElement; const root = createRoot(container); -root.render(); + +root.render( + + + + , +); // calling IPC exposed from preload script window.electron?.ipcRenderer.once('ipc-example', (arg) => { diff --git a/src/theme/themes.ts b/src/theme/themes.ts new file mode 100644 index 0000000..f64a55a --- /dev/null +++ b/src/theme/themes.ts @@ -0,0 +1,173 @@ +import { createTheme, SxProps, Theme } from '@mui/material/styles'; + +declare module '@mui/material/styles' { + interface Theme { + launcher: { + fonts: { + default: string; + }; + + topbar: { + firstBox: { + background: string; + backdropFilter: string; + boxShadow: string; + }; + backButton: { + transition: string; + '&:hover': { + transform: string; + }; + }; + tabsBox: { + borderColor: string; + }; + tabs: SxProps; + tabBase: SxProps; + tabActive: SxProps; + menuPaper: SxProps; + menuDivider: SxProps; + menuItem: SxProps; + menuUsername: SxProps; + logoutButton: SxProps; + windowControlIcon: { + color: string; + }; + windowControlButton: SxProps; + }; + }; + } + + interface ThemeOptions { + launcher?: Theme['launcher']; + } +} + +export const defaultTheme = createTheme({ + palette: { + mode: 'dark', + primary: { main: '#F27121' }, + secondary: { main: '#E940CD' }, + text: { + primary: '#FFFFFF', + secondary: 'rgba(255,255,255,0.7)', + }, + }, + + launcher: { + fonts: { + default: 'Benzin-Bold', + }, + + topbar: { + firstBox: { + background: + 'linear-gradient(71deg, rgba(242,113,33,0.18) 0%, rgba(233,64,205,0.14) 70%, rgba(138,35,135,0.16) 100%)', + backdropFilter: 'blur(10px)', + boxShadow: '0 8px 30px rgba(0,0,0,0.35)', + }, + backButton: { + transition: 'transform 0.3s ease', + '&:hover': { + transform: 'scale(1.2)', + }, + }, + tabsBox: { + borderColor: 'transparent', + }, + tabs: { + // один градиент на весь Tabs + '--tabs-grad': + 'linear-gradient(90deg, #F27121 0%, #E940CD 50%, #8A2387 100%)', + + // активный текст показывает “срез” общего градиента + '& .MuiTab-root.Mui-selected': { + color: 'transparent', + backgroundImage: 'var(--tabs-grad)', + backgroundRepeat: 'no-repeat', + backgroundSize: 'var(--tabs-w) 100%', + backgroundPosition: 'calc(-1 * var(--active-x)) 0', + WebkitBackgroundClip: 'text', + backgroundClip: 'text', + }, + + // подчёркивание тоже из того же “единого” градиента + '& .MuiTabs-indicator': { + height: '2px', + backgroundImage: 'var(--tabs-grad)', + backgroundRepeat: 'no-repeat', + backgroundSize: 'var(--tabs-w) 100%', + backgroundPosition: 'calc(-1 * var(--active-x)) 0', + }, + }, + tabBase: (theme: Theme) => ({ + color: 'white', + fontFamily: theme.launcher.fonts.default, + transition: 'all 0.3s ease', + '&:hover': { + color: 'rgb(170, 170, 170)', + }, + }), + tabActive: { + color: 'transparent', + WebkitTextFillColor: 'transparent', + backgroundImage: 'var(--tabs-grad)', + backgroundRepeat: 'no-repeat', + backgroundSize: 'var(--tabs-w) 100%', + backgroundPosition: 'calc(-1 * var(--active-x)) 0', + WebkitBackgroundClip: 'text', + backgroundClip: 'text', + }, + menuPaper: { + color: 'white', + bgcolor: 'rgba(0,0,0,0.82)', + backdropFilter: 'blur(10px)', + border: '1px solid rgba(233,64,205,0.25)', + boxShadow: '0 18px 40px rgba(0,0,0,0.55)', + }, + + menuDivider: { + borderColor: 'rgba(255,255,255,0.08)', + }, + + menuItem: (theme: Theme) => ({ + fontFamily: theme.launcher.fonts.default, + '&:hover': { + bgcolor: 'rgba(255,77,77,0.15)', + }, + }), + + menuUsername: (theme: Theme) => ({ + fontFamily: theme.launcher.fonts.default, + color: theme.palette.text.primary, + }), + + logoutButton: (theme: Theme) => ({ + fontFamily: theme.launcher.fonts.default, + background: + 'linear-gradient(71deg, #F27121 0%, #E940CD 70%, #8A2387 100%)', + color: theme.palette.text.primary, + border: 'none', + transition: 'transform 0.3s ease', + '&:hover': { + background: + 'linear-gradient(71deg, #F27121 0%, #E940CD 70%, #8A2387 100%)', + transform: 'scale(1.01)', + boxShadow: '0 4px 15px rgba(242, 113, 33, 0.4)', + }, + boxShadow: '0 2px 8px rgba(0, 0, 0, 0.3)', + }), + + windowControlIcon: { + color: 'white', + }, + + windowControlButton: { + // тут только “визуал”, размеры оставим в TopBar + '&:hover': { + bgcolor: 'rgba(255,255,255,0.06)', + }, + }, + }, + }, +});