import gradio as gr from gradio_creditspanel import CreditsPanel import os # Create dummy license files os.makedirs("LICENSES", exist_ok=True) if not os.path.exists("LICENSES/Apache.txt"): with open("LICENSES/Apache.txt", "w") as f: f.write("Apache License\nVersion 2.0, January 2004\nhttp://www.apache.org/licenses/...") if not os.path.exists("LICENSES/MIT.txt"): with open("LICENSES/MIT.txt", "w") as f: f.write("MIT License\nCopyright (c) 2025 Author\nPermission is hereby granted...") # Create assets directory for logo os.makedirs("assets", exist_ok=True) if not os.path.exists("./assets/logo.webp"): print("Warning: ./assets/logo.webp not found. Creating placeholder. Replace with a valid WebP image.") with open("./assets/logo.webp", "w") as f: f.write("Placeholder WebP logo") else: print("Logo found at ./assets/logo.webp") credits_list = [ {"title": "Project Manager", "name": "Emma Thompson"}, {"title": "Lead Developer", "name": "John Doe"}, {"title": "Senior Backend Engineer", "name": "Michael Chen"}, {"title": "Frontend Developer", "name": "Sarah Johnson"}, {"title": "UI/UX Designer", "name": "Jane Smith"}, {"title": "Database Architect", "name": "Alex Ray"}, {"title": "DevOps Engineer", "name": "Liam Patel"}, {"title": "Quality Assurance Lead", "name": "Sam Wilson"}, {"title": "Test Automation Engineer", "name": "Olivia Brown"}, {"title": "Security Analyst", "name": "David Kim"}, {"title": "Data Scientist", "name": "Sophie Martinez"}, {"title": "Machine Learning Engineer", "name": "Ethan Lee"}, {"title": "API Developer", "name": "Isabella Garcia"}, {"title": "Technical Writer", "name": "Noah Davis"}, {"title": "Scrum Master", "name": "Ava Rodriguez"}, {"title": "Cloud Infrastructure Engineer", "name": "Lucas Nguyen"}, {"title": "Mobile Developer", "name": "Mia Hernandez"}, {"title": "Performance Engineer", "name": "James Taylor"}, {"title": "Component Concept", "name": "Your Name"}, {"title": "Support Engineer", "name": "Charlotte Moore"} ] license_paths = { "Gradio Framework": "./LICENSES/Apache.txt", "This Component": "./LICENSES/MIT.txt" } DEFAULT_SPEEDS = { "scroll": 40.0, "starwars": 80.0, "matrix": 40.0 } def update_panel( effect: str, speed: float, sidebar_position: str, show_logo: bool, show_licenses: bool, logo_position: str, logo_sizing: str, logo_width: int | str | None, logo_height: int | str | None, scroll_background_color: str | None, scroll_title_color: str | None, scroll_name_color: str | None ): print(f"Updating panel: effect={effect}, speed={speed}, sidebar_position={sidebar_position}, show_logo={show_logo}, show_licenses={show_licenses}, logo_position={logo_position}, logo_sizing={logo_sizing}, logo_width={logo_width}, logo_height={logo_height}") return gr.update( visible=True, effect=effect, speed=speed, sidebar_position=sidebar_position, show_logo=show_logo, show_licenses=show_licenses, logo_position=logo_position, logo_sizing=logo_sizing, logo_width=logo_width, logo_height=logo_height, scroll_background_color=scroll_background_color, scroll_title_color=scroll_title_color, scroll_name_color=scroll_name_color, value=credits_list # value={ # "credits": credits_list, # "licenses": license_paths, # "effect": effect, # "speed": speed, # "sidebar_position": sidebar_position, # "logo_path": "./assets/logo.webp", # Handled by Gradio's file serving # "show_logo": show_logo, # "show_licenses": show_licenses, # "logo_position": logo_position, # "logo_sizing": logo_sizing, # "logo_width": logo_width, # "logo_height": logo_height, # "scroll_background_color": scroll_background_color, # "scroll_title_color": scroll_title_color, # "scroll_name_color": scroll_name_color # } ) def update_speed_on_effect_change(effect: str): """Update speed_slider to default speed when effect changes.""" return DEFAULT_SPEEDS.get(effect, 40.0) with gr.Blocks(theme=gr.themes.Ocean(), title="CreditsPanel Demo", css="") as demo: gr.Markdown( """ # Interactive CreditsPanel Demo Use the sidebar controls to customize the credits panel. """ ) with gr.Sidebar(position="right"): effect_radio = gr.Radio( ["scroll", "starwars", "matrix"], label="Animation Effect", value="scroll", info="Select the visual style for the credits." ) speed_slider = gr.Slider( minimum=5.0, maximum=100.0, step=1.0, value=DEFAULT_SPEEDS["scroll"], label="Animation Speed (seconds)", info="Duration of the animation cycle." ) sidebar_position_radio = gr.Radio( ["right", "bottom"], label="Sidebar Position", value="right", info="Place the licenses sidebar on the right or bottom." ) show_logo_checkbox = gr.Checkbox( label="Show Logo", value=True, info="Toggle the logo panel." ) show_licenses_checkbox = gr.Checkbox( label="Show Licenses", value=True, info="Toggle the licenses sidebar." ) logo_position_radio = gr.Radio( ["center", "left", "right"], label="Logo Position", value="center", info="Position of the logo in the panel." ) logo_sizing_radio = gr.Radio( ["stretch", "crop", "resize"], label="Logo Sizing", value="resize", info="How the logo fits in the panel." ) logo_width_input = gr.Textbox( label="Logo Width (px or CSS)", value="200px", info="Width of the logo (e.g., '200px' or '50%')." ) logo_height_input = gr.Textbox( label="Logo Height (px or CSS)", value="100px", info="Height of the logo (e.g., '100px' or '10%')." ) scroll_background_color = gr.ColorPicker( label="Scroll Background Color", value="#000000", info="Background color for ScrollEffect." ) scroll_title_color = gr.ColorPicker( label="Scroll Title Color", value="#FFFFFF", info="Color for title text in ScrollEffect." ) scroll_name_color = gr.ColorPicker( label="Scroll Name Color", value="#FFFFFF", info="Color for name text in ScrollEffect." ) panel = CreditsPanel( credits=credits_list, licenses=license_paths, effect="scroll", height=500, speed=DEFAULT_SPEEDS["scroll"], sidebar_position="right", logo_path="./assets/logo.webp", # Handled by Gradio's file serving show_logo=True, show_licenses=True, logo_position="center", logo_sizing="resize", logo_width="200px", logo_height="100px", scroll_background_color="#000000", scroll_title_color="#FFFFFF", scroll_name_color="#FFFFFF", visible=True ) inputs = [ effect_radio, speed_slider, sidebar_position_radio, show_logo_checkbox, show_licenses_checkbox, logo_position_radio, logo_sizing_radio, logo_width_input, logo_height_input, scroll_background_color, scroll_title_color, scroll_name_color ] # Update speed when effect changes effect_radio.change( fn=update_speed_on_effect_change, inputs=effect_radio, outputs=speed_slider ) # Update panel for all inputs for input_component in inputs: input_component.change( fn=update_panel, inputs=inputs, outputs=panel ) if __name__ == "__main__": demo.launch(debug=True, share=False)