from typing import Iterable from gradio.themes.soft import Soft from gradio.themes.utils import colors, fonts, sizes from gradio.themes import Color class FVoiceTheme(Soft): """Subclase personalizada del tema base - Siempre modo oscuro""" def __init__( self, *, primary_hue: colors.Color | str = Color( c50="#0E000F", # Más oscuro para elementos claros c100="#150016", # Oscuro c200="#29104A", # Púrpura oscuro c300="#29104A", # Púrpura oscuro c400="#522C5D", # Púrpura medio c500="#764ba2", # Púrpura claro c600="#29104A", # Púrpura oscuro c700="#0E000F", # Muy oscuro c800="#150016", # Oscuro c900="#522C5D", # Púrpura medio c950="#0E000F" # Muy oscuro ), secondary_hue: colors.Color | str = Color( c50="#0E000F", # Oscuro para elementos secundarios c100="#150016", # Oscuro c200="#29104A", # Púrpura oscuro c300="#522C5D", # Púrpura medio c400="#764ba2", # Púrpura claro c500="#E3B6B1", # Rosa suave c600="#FFE3D8", # Rosa claro c700="#29104A", # Púrpura oscuro c800="#150016", # Oscuro c900="#0E000F", # Muy oscuro c950="#0E000F" # Muy oscuro ), neutral_hue: colors.Color | str = Color( c50="#0E000F", # Fondo muy oscuro c100="#150016", # Fondo oscuro c200="#29104A", # Elementos de interfaz oscuros c300="#522C5D", # Bordes oscuros c400="#764ba2", # Elementos interactivos c500="#E3B6B1", # Texto secundario c600="#FFE3D8", # Texto principal c700="#29104A", # Elementos oscuros c800="#150016", # Fondo de inputs c900="#0E000F", # Fondo principal c950="#0E000F" # Fondo más oscuro ), spacing_size: sizes.Size | str = sizes.spacing_md, radius_size: sizes.Size | str = sizes.radius_md, text_size: sizes.Size | str = sizes.text_lg, font: fonts.Font | str | Iterable[fonts.Font | str] = ( fonts.GoogleFont("Quicksand"), "ui-sans-serif", "sans-serif", ), font_mono: fonts.Font | str | Iterable[fonts.Font | str] = ( fonts.GoogleFont("IBM Plex Mono"), "ui-monospace", "monospace", ), ): super().__init__( primary_hue=primary_hue, secondary_hue=secondary_hue, neutral_hue=neutral_hue, spacing_size=spacing_size, radius_size=radius_size, text_size=text_size, font=font, font_mono=font_mono, ) def set_theme(self, *args, **kwargs): """Fuerza el tema a mantenerse siempre oscuro""" theme = super().set_theme(*args, **kwargs) # Forzar variables CSS para modo oscuro theme = theme.set( # Fondos principales background_fill_primary="*neutral_900", background_fill_secondary="*neutral_800", # Fondos de componentes block_background_fill="*neutral_800", input_background_fill="*neutral_800", input_background_fill_focus="*neutral_700", input_background_fill_hover="*neutral_750", # Texto body_text_color="*neutral_600", body_text_color_subdued="*neutral_500", block_title_text_color="*neutral_600", block_label_text_color="*neutral_600", # Bordes border_color_primary="*neutral_700", border_color_accent="*primary_400", input_border_color="*neutral_700", input_border_color_focus="*primary_400", # Botones button_primary_background_fill="*primary_600", button_primary_background_fill_hover="*primary_500", button_primary_text_color="*neutral_100", button_secondary_background_fill="*neutral_700", button_secondary_background_fill_hover="*neutral_600", button_secondary_text_color="*neutral_300", ) return theme