| | import { createTheme, type ThemeOptions } from '@mui/material/styles'; |
| |
|
| | |
| | const sharedTypography: ThemeOptions['typography'] = { |
| | fontFamily: 'Inter, system-ui, -apple-system, "Segoe UI", Roboto, Arial, sans-serif', |
| | fontSize: 15, |
| | button: { |
| | fontFamily: 'Inter, system-ui, -apple-system, "Segoe UI", Roboto, Arial, sans-serif', |
| | textTransform: 'none' as const, |
| | fontWeight: 600, |
| | }, |
| | }; |
| |
|
| | const sharedComponents: ThemeOptions['components'] = { |
| | MuiButton: { |
| | styleOverrides: { |
| | root: { |
| | borderRadius: '10px', |
| | fontWeight: 600, |
| | transition: 'transform 0.06s ease, background 0.12s ease, box-shadow 0.12s ease', |
| | '&:hover': { transform: 'translateY(-1px)' }, |
| | }, |
| | }, |
| | }, |
| | MuiPaper: { |
| | styleOverrides: { |
| | root: { backgroundImage: 'none' }, |
| | }, |
| | }, |
| | }; |
| |
|
| | const sharedShape: ThemeOptions['shape'] = { borderRadius: 12 }; |
| |
|
| | |
| | const darkVars = { |
| | '--bg': '#0B0D10', |
| | '--panel': '#0F1316', |
| | '--surface': '#121416', |
| | '--text': '#E6EEF8', |
| | '--muted-text': '#98A0AA', |
| | '--accent-yellow': '#FF9D00', |
| | '--accent-yellow-weak': 'rgba(255,157,0,0.08)', |
| | '--accent-green': '#2FCC71', |
| | '--accent-red': '#E05A4F', |
| | '--shadow-1': '0 6px 18px rgba(2,6,12,0.55)', |
| | '--radius-lg': '20px', |
| | '--radius-md': '12px', |
| | '--focus': '0 0 0 3px rgba(255,157,0,0.12)', |
| | '--border': 'rgba(255,255,255,0.03)', |
| | '--border-hover': 'rgba(255,255,255,0.1)', |
| | '--code-bg': 'rgba(0,0,0,0.5)', |
| | '--tool-bg': 'rgba(0,0,0,0.3)', |
| | '--tool-border': 'rgba(255,255,255,0.05)', |
| | '--hover-bg': 'rgba(255,255,255,0.05)', |
| | '--composer-bg': 'rgba(255,255,255,0.01)', |
| | '--msg-gradient': 'linear-gradient(180deg, rgba(255,255,255,0.015), transparent)', |
| | '--body-gradient': 'linear-gradient(180deg, #0B0D10, #090B0D)', |
| | '--scrollbar-thumb': '#30363D', |
| | '--success-icon': '#FDB022', |
| | '--error-icon': '#F87171', |
| | '--clickable-text': 'rgba(255, 255, 255, 0.9)', |
| | '--clickable-underline': 'rgba(255,255,255,0.3)', |
| | '--code-panel-bg': '#0A0B0C', |
| | '--tab-active-bg': 'rgba(255,255,255,0.08)', |
| | '--tab-active-border': 'rgba(255,255,255,0.1)', |
| | '--tab-hover-bg': 'rgba(255,255,255,0.05)', |
| | '--tab-close-hover': 'rgba(255,255,255,0.1)', |
| | '--plan-bg': 'rgba(0,0,0,0.2)', |
| | } as const; |
| |
|
| | |
| | const lightVars = { |
| | '--bg': '#FFFFFF', |
| | '--panel': '#F7F8FA', |
| | '--surface': '#F0F1F3', |
| | '--text': '#1A1A2E', |
| | '--muted-text': '#6B7280', |
| | '--accent-yellow': '#FF9D00', |
| | '--accent-yellow-weak': 'rgba(255,157,0,0.08)', |
| | '--accent-green': '#16A34A', |
| | '--accent-red': '#DC2626', |
| | '--shadow-1': '0 4px 12px rgba(0,0,0,0.08)', |
| | '--radius-lg': '20px', |
| | '--radius-md': '12px', |
| | '--focus': '0 0 0 3px rgba(255,157,0,0.15)', |
| | '--border': 'rgba(0,0,0,0.08)', |
| | '--border-hover': 'rgba(0,0,0,0.15)', |
| | '--code-bg': 'rgba(0,0,0,0.04)', |
| | '--tool-bg': 'rgba(0,0,0,0.03)', |
| | '--tool-border': 'rgba(0,0,0,0.08)', |
| | '--hover-bg': 'rgba(0,0,0,0.04)', |
| | '--composer-bg': 'rgba(0,0,0,0.02)', |
| | '--msg-gradient': 'linear-gradient(180deg, rgba(0,0,0,0.01), transparent)', |
| | '--body-gradient': 'linear-gradient(180deg, #FFFFFF, #F7F8FA)', |
| | '--scrollbar-thumb': '#C4C8CC', |
| | '--success-icon': '#FF9D00', |
| | '--error-icon': '#DC2626', |
| | '--clickable-text': 'rgba(0, 0, 0, 0.85)', |
| | '--clickable-underline': 'rgba(0,0,0,0.25)', |
| | '--code-panel-bg': '#F5F6F8', |
| | '--tab-active-bg': 'rgba(0,0,0,0.06)', |
| | '--tab-active-border': 'rgba(0,0,0,0.1)', |
| | '--tab-hover-bg': 'rgba(0,0,0,0.04)', |
| | '--tab-close-hover': 'rgba(0,0,0,0.08)', |
| | '--plan-bg': 'rgba(0,0,0,0.03)', |
| | } as const; |
| |
|
| | |
| | function makeCssBaseline(vars: Record<string, string>) { |
| | return { |
| | styleOverrides: { |
| | ':root': vars, |
| | body: { |
| | background: 'var(--body-gradient)', |
| | color: 'var(--text)', |
| | scrollbarWidth: 'thin' as const, |
| | '&::-webkit-scrollbar': { width: '8px', height: '8px' }, |
| | '&::-webkit-scrollbar-thumb': { |
| | backgroundColor: 'var(--scrollbar-thumb)', |
| | borderRadius: '2px', |
| | }, |
| | '&::-webkit-scrollbar-track': { backgroundColor: 'transparent' }, |
| | }, |
| | 'code, pre': { |
| | fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Monaco, "Roboto Mono", monospace', |
| | }, |
| | '.brand-logo': { |
| | position: 'relative' as const, |
| | padding: '6px', |
| | borderRadius: '8px', |
| | '&::after': { |
| | content: '""', |
| | position: 'absolute' as const, |
| | inset: '-6px', |
| | borderRadius: '10px', |
| | background: 'var(--accent-yellow-weak)', |
| | zIndex: -1, |
| | pointerEvents: 'none' as const, |
| | }, |
| | }, |
| | }, |
| | }; |
| | } |
| |
|
| | function makeDrawer() { |
| | return { |
| | styleOverrides: { |
| | paper: { |
| | backgroundColor: 'var(--panel)', |
| | borderRight: '1px solid var(--border)', |
| | }, |
| | }, |
| | }; |
| | } |
| |
|
| | function makeTextField() { |
| | return { |
| | styleOverrides: { |
| | root: { |
| | '& .MuiOutlinedInput-root': { |
| | borderRadius: 'var(--radius-md)', |
| | '& fieldset': { borderColor: 'var(--border)' }, |
| | '&:hover fieldset': { borderColor: 'var(--border-hover)' }, |
| | '&.Mui-focused fieldset': { |
| | borderColor: 'var(--accent-yellow)', |
| | borderWidth: '1px', |
| | boxShadow: 'var(--focus)', |
| | }, |
| | }, |
| | }, |
| | }, |
| | }; |
| | } |
| |
|
| | |
| | export const darkTheme = createTheme({ |
| | palette: { |
| | mode: 'dark', |
| | primary: { main: '#FF9D00', light: '#FFB740', dark: '#E08C00', contrastText: '#fff' }, |
| | secondary: { main: '#FF9D00' }, |
| | background: { default: '#0B0D10', paper: '#0F1316' }, |
| | text: { primary: '#E6EEF8', secondary: '#98A0AA' }, |
| | divider: 'rgba(255,255,255,0.03)', |
| | success: { main: '#2FCC71' }, |
| | error: { main: '#E05A4F' }, |
| | warning: { main: '#FF9D00' }, |
| | info: { main: '#58A6FF' }, |
| | }, |
| | typography: sharedTypography, |
| | components: { |
| | ...sharedComponents, |
| | MuiCssBaseline: makeCssBaseline(darkVars), |
| | MuiDrawer: makeDrawer(), |
| | MuiTextField: makeTextField(), |
| | }, |
| | shape: sharedShape, |
| | }); |
| |
|
| | export const lightTheme = createTheme({ |
| | palette: { |
| | mode: 'light', |
| | primary: { main: '#FF9D00', light: '#FFB740', dark: '#E08C00', contrastText: '#fff' }, |
| | secondary: { main: '#E08C00' }, |
| | background: { default: '#FFFFFF', paper: '#F7F8FA' }, |
| | text: { primary: '#1A1A2E', secondary: '#6B7280' }, |
| | divider: 'rgba(0,0,0,0.08)', |
| | success: { main: '#16A34A' }, |
| | error: { main: '#DC2626' }, |
| | warning: { main: '#FF9D00' }, |
| | info: { main: '#2563EB' }, |
| | }, |
| | typography: sharedTypography, |
| | components: { |
| | ...sharedComponents, |
| | MuiCssBaseline: makeCssBaseline(lightVars), |
| | MuiDrawer: makeDrawer(), |
| | MuiTextField: makeTextField(), |
| | }, |
| | shape: sharedShape, |
| | }); |
| |
|
| | |
| | export default darkTheme; |
| |
|