import gradio as gr def adjust_brightness(hex_color: str, percentage: int) -> str: # Convert hex color to RGB hex_color = hex_color.lstrip('#') r, g, b = tuple(int(hex_color[i:i+2], 16) for i in (0, 2, 4)) # Calculate the adjustment factor factor = percentage / 100 if factor > 0: # Eclaircir (ajouter du blanc) r = int(r + (255 - r) * factor) g = int(g + (255 - g) * factor) b = int(b + (255 - b) * factor) else: # Assombrir (ajouter du noir) r = int(r * (1 + factor)) g = int(g * (1 + factor)) b = int(b * (1 + factor)) # Ensure RGB values are within the valid range r = min(max(0, r), 255) g = min(max(0, g), 255) b = min(max(0, b), 255) # Convert RGB back to hex return f'#{r:02x}{g:02x}{b:02x}' def compute(primary_color, secondary_color, neutral_color): primary_shades = [adjust_brightness(primary_color, p) for p in [90, 75, 50, 25, 10, 0, -10, -25, -50, -75, -90]] secondary_shades = [adjust_brightness(secondary_color, p) for p in [90, 75, 50, 25, 10, 0, -10, -25, -50, -75, -90]] neutral_shades = [adjust_brightness(neutral_color, p) for p in [90, 75, 50, 25, 10, 0, -10, -25, -50, -75, -90]] css = f""" :root, .dark {{ --primary-50: {primary_shades[0]} !important; --primary-100: {primary_shades[1]} !important; --primary-200: {primary_shades[2]} !important; --primary-300: {primary_shades[3]} !important; --primary-400: {primary_shades[4]} !important; --primary-500: {primary_shades[5]} !important; --primary-600: {primary_shades[6]} !important; --primary-700: {primary_shades[7]} !important; --primary-800: {primary_shades[8]} !important; --primary-900: {primary_shades[9]} !important; --primary-950: {primary_shades[10]} !important; --secondary-50: {secondary_shades[0]} !important; --secondary-100: {secondary_shades[1]} !important; --secondary-200: {secondary_shades[2]} !important; --secondary-300: {secondary_shades[3]} !important; --secondary-400: {secondary_shades[4]} !important; --secondary-500: {secondary_shades[5]} !important; --secondary-600: {secondary_shades[6]} !important; --secondary-700: {secondary_shades[7]} !important; --secondary-800: {secondary_shades[8]} !important; --secondary-900: {secondary_shades[9]} !important; --secondary-950: {secondary_shades[10]} !important; --neutral-50: {neutral_shades[0]} !important; --neutral-100: {neutral_shades[1]} !important; --neutral-200: {neutral_shades[2]} !important; --neutral-300: {neutral_shades[3]} !important; --neutral-400: {neutral_shades[4]} !important; --neutral-500: {neutral_shades[5]} !important; --neutral-600: {neutral_shades[6]} !important; --neutral-700: {neutral_shades[7]} !important; --neutral-800: {neutral_shades[8]} !important; --neutral-900: {neutral_shades[9]} !important; --neutral-950: {neutral_shades[10]} !important; }} """ return css with gr.Blocks() as demo: primary_color_input = gr.ColorPicker(label="Primary color", value=None, elem_id="primary_color_input") secondary_color_input = gr.ColorPicker(label="Secondary color", value=None, elem_id="secondary_color_input") neutral_color_input = gr.ColorPicker(label="Neutral color", value=None, elem_id="neutral_color_input") css_output = gr.Code(label="Custom css", lines=10, language="css") def update_css(primary_color, secondary_color, neutral_color): if primary_color is None or secondary_color is None or neutral_color is None: primary_color = primary_color if primary_color is not None else "#3d3d3d" secondary_color = secondary_color if secondary_color is not None else "#4f4f4f" neutral_color = neutral_color if neutral_color is not None else "#454545" new_css = compute(primary_color, secondary_color, neutral_color) js_code = f""" """ return new_css, gr.HTML(js_code) primary_color_input.change(fn=update_css, inputs=[primary_color_input, secondary_color_input, neutral_color_input], outputs=[css_output, gr.HTML()]) secondary_color_input.change(fn=update_css, inputs=[primary_color_input, secondary_color_input, neutral_color_input], outputs=[css_output, gr.HTML()]) neutral_color_input.change(fn=update_css, inputs=[primary_color_input, secondary_color_input, neutral_color_input], outputs=[css_output, gr.HTML()]) gr.Interface( fn=update_css, inputs=[primary_color_input, secondary_color_input, neutral_color_input], outputs=[css_output, gr.HTML()], examples=[ ["#f97316", "#3b82f6", "#6b7280"], ["#e84393", "#6c5ce7", "#b2bec3"], ["#38ada9", "#60a3bc", "#3c6382"] ] ) if __name__ == "__main__": demo.launch()