from typing import Dict class StyleConstants: # Цветовая схема COLORS = { 'primary': '#7E57C2', # Основной цвет 'secondary': '#B39DDB', # Вторичный цвет 'accent': '#536DFE', # Акцентный цвет 'success': '#66BB6A', # Цвет успеха 'warning': '#FFA726', # Цвет предупреждения 'error': '#EF5350', # Цвет ошибки # Светлая тема 'light': { 'background': 'qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #FFFFFF, stop:1 #F5F5F5)', 'surface': '#FFFFFF', 'text': '#212121', 'text_secondary': '#757575', 'border': '#E0E0E0', 'hover': '#F5F5F5', 'pressed': '#EEEEEE' }, # Темная тема 'dark': { 'background': 'qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #1A1A1A, stop:1 #2D2D2D)', 'surface': '#2D2D2D', 'text': '#FFFFFF', 'text_secondary': '#B0B0B0', 'border': '#404040', 'hover': '#353535', 'pressed': '#404040' } } # Размеры и отступы (в пикселях) SPACING = { 'xxs': 4, 'xs': 8, 'sm': 12, 'md': 16, 'lg': 24, 'xl': 32, 'xxl': 48 } # Радиусы скругления (в пикселях) RADIUS = { 'sm': 4, 'md': 8, 'lg': 12, 'xl': 16, 'pill': 9999 } # Тени SHADOWS = { 'sm': '0 2px 4px rgba(0,0,0,0.1)', 'md': '0 4px 8px rgba(0,0,0,0.1)', 'lg': '0 8px 16px rgba(0,0,0,0.1)' } # Анимации ANIMATIONS = { 'duration': { 'fast': 150, 'normal': 250, 'slow': 350 }, 'easing': 'cubic-bezier(0.4, 0, 0.2, 1)' } # Шрифты FONTS = { 'family': { 'primary': 'Inter', 'secondary': 'Roboto' }, 'size': { 'xs': '12px', 'sm': '14px', 'md': '16px', 'lg': '18px', 'xl': '24px', 'xxl': '32px' }, 'weight': { 'regular': '400', 'medium': '500', 'semibold': '600', 'bold': '700' } } @classmethod def get_base_styles(cls, theme: str = 'light') -> str: """Возвращает базовые стили для приложения""" colors = cls.COLORS[theme] return f""" /* Основные стили */ QMainWindow {{ background: {colors['background']}; }} QWidget {{ color: {colors['text']}; font-family: {cls.FONTS['family']['primary']}; font-size: {cls.FONTS['size']['md']}; }} /* Кнопки */ QPushButton {{ background-color: {cls.COLORS['primary']}; color: white; border: none; border-radius: {cls.RADIUS['md']}px; padding: {cls.SPACING['sm']}px {cls.SPACING['md']}px; font-weight: {cls.FONTS['weight']['medium']}; }} QPushButton:hover {{ background-color: {cls.COLORS['secondary']}; }} QPushButton:pressed {{ background-color: {cls.COLORS['accent']}; }} /* Поля ввода */ QLineEdit, QTextEdit {{ background-color: {colors['surface']}; color: {colors['text']}; border: 1px solid {colors['border']}; border-radius: {cls.RADIUS['md']}px; padding: {cls.SPACING['sm']}px; selection-background-color: {cls.COLORS['secondary']}; }} QLineEdit:focus, QTextEdit:focus {{ border-color: {cls.COLORS['primary']}; }} /* Выпадающие списки */ QComboBox {{ background-color: {colors['surface']}; color: {colors['text']}; border: 1px solid {colors['border']}; border-radius: {cls.RADIUS['md']}px; padding: {cls.SPACING['sm']}px; }} QComboBox:hover {{ border-color: {cls.COLORS['primary']}; }} /* Полосы прокрутки */ QScrollBar:vertical {{ background-color: {colors['surface']}; width: 12px; margin: 0; }} QScrollBar::handle:vertical {{ background-color: {cls.COLORS['secondary']}; min-height: 20px; border-radius: {cls.RADIUS['sm']}px; }} QScrollBar:horizontal {{ background-color: {colors['surface']}; height: 12px; margin: 0; }} QScrollBar::handle:horizontal {{ background-color: {cls.COLORS['secondary']}; min-width: 20px; border-radius: {cls.RADIUS['sm']}px; }} """