from __future__ import annotations from typing import Iterable import gradio as gr from gradio.themes.soft import Soft from gradio.themes.utils import colors, fonts, sizes import time class SoftBlue(Soft): def __init__( self, *, primary_hue: colors.Color | str = colors.cyan, secondary_hue: colors.Color | str = colors.indigo, neutral_hue: colors.Color | str = colors.sky, 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, ) # html font style accepts a string heading or body and returns the style for that element, should follow styles in class with exception that heading is +2 pts and bold def html_font_style(self, element: str) -> str: if element == "heading": return f"font-family: {self.font_mono}; font-size: {self.text_sm}; font-weight: bold;" elif element == "body": return f"font-family: {self.font_mono}; font-size: {self.text_sm};" elif element == "mono": return f"font-family: {self.font_mono}; font-size: {self.text_sm};" else: raise ValueError( f"Element must be one of 'heading', 'body', or 'mono', not {element}" )