File size: 5,076 Bytes
d64466a 98acb26 d64466a 98acb26 d64466a 98acb26 d64466a 98acb26 d64466a 98acb26 d64466a 98acb26 d64466a 98acb26 d64466a 98acb26 d64466a 98acb26 ed50e5b 98acb26 ed50e5b 98acb26 ed50e5b 98acb26 ed50e5b 98acb26 ed50e5b 98acb26 d64466a |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
import urllib.parse
import gradio as gr
# ---------------------------
# Badge URL generation
# ---------------------------
def generate_static_badge(label, message, color, label_color, logo, logo_color, style, link):
base = "https://img.shields.io/static/v1"
params = []
if label:
params.append(f"label={urllib.parse.quote(label, safe='')}")
if message:
params.append(f"message={urllib.parse.quote(message, safe='')}")
if color:
params.append(f"color={urllib.parse.quote(color, safe='')}")
if label_color:
params.append(f"labelColor={urllib.parse.quote(label_color, safe='')}")
if logo:
params.append(f"logo={urllib.parse.quote(logo, safe='')}")
if logo_color:
params.append(f"logoColor={urllib.parse.quote(logo_color, safe='')}")
if style:
params.append(f"style={urllib.parse.quote(style, safe='')}")
badge_url = base + ("?" + "&".join(params) if params else "")
if link:
html_code = f'<a href="{link}" target="_blank"><img src="{badge_url}" alt="badge"></a>'
else:
html_code = f'<img src="{badge_url}" alt="badge">'
badge_preview = f"""
<div style='padding:20px; background: #fefefe; border-radius: 12px; display: flex; justify-content: center;'>
{html_code}
</div>
"""
return html_code, badge_preview
# ---------------------------
# Gradio UI
# ---------------------------
with gr.Blocks(theme=gr.themes.Default()) as demo:
# Custom pastel CSS
gr.HTML("""
<style>
body { background: #f7f9fc; }
.gradio-container { background: #ffffff; border-radius: 16px; padding: 20px; }
.gr-button { background: #a8dadc !important; color: #1d3557 !important; }
.gr-textbox, .gr-select, .gr-color { background: #e8f6f3 !important; }
h1 { color: #457b9d; }
h3 { color: #6d6875; }
</style>
""")
gr.HTML("""
<h1 style=\"text-align:center; margin-bottom:0.2em;\">🎨 BadgeCraft</h1>
<p style=\"text-align:center; color:#555;\">Create colorful shields.io badges with live preview and HTML snippet.</p>
""")
# Output components
with gr.Row():
out_code = gr.Code(label="HTML Snippet", language="html")
out_preview = gr.HTML(label="Badge Preview")
# Input components with Discord defaults
with gr.Row():
label = gr.Textbox(label="Label", placeholder="e.g. build", value="Discord")
message = gr.Textbox(label="Message", placeholder="e.g. passing", value="Join our community")
logo = gr.Textbox(label="Logo", placeholder="e.g. github", value="discord")
with gr.Row():
color = gr.ColorPicker(label="Color", value="#7289DA")
label_color = gr.ColorPicker(label="Label Color", value="#99AAB5")
logo_color = gr.ColorPicker(label="Logo Color", value="white")
style = gr.Dropdown(label="Style", choices=["flat","flat-square","plastic","for-the-badge","social"], value="for-the-badge")
link = gr.Textbox(label="Link (URL)", placeholder="https://example.com", value="https://discord.gg/openfreeai")
# Example presets (click to autofill)
examples = [
["Discord","Join our community","#7289DA","#99AAB5","discord","white","for-the-badge","https://discord.gg/openfreeai"],
["X.com","Follow us","#1DA1F2","#A8D0E6","X","white","for-the-badge","https://x.com/openfree_ai"],
["Collections","Explore","#F9A826","#FBF3A1","huggingface","black","for-the-badge","https://huggingface.co./collections/VIDraft/best-open-ai-services-68057e6e312880ea92abaf4c"],
["GitHub","Star us","#181717","#B0B0B0","github","white","for-the-badge","https://github.com/openfreeai"],
["YouTube","Watch now","#FF0000","#FFA3A3","youtube","white","for-the-badge","https://www.youtube.com/@AITechTree"],
["Facebook","Like us","#1877F2","#A3C4F0","facebook","white","for-the-badge","https://www.facebook.com/profile.php?id=61575353674679"],
["Instagram","Follow","#E4405F","#F5A3B1","instagram","white","for-the-badge","https://www.instagram.com/openfree_ai/"],
["Threads","Join the convo","#000000","#CCCCCC","threads","white","for-the-badge","https://www.threads.net/@openfree_ai"],
]
gr.HTML("<h3 style='text-align:center; margin-top:20px;'>✨ Examples (click to autofill)</h3>")
gr.Examples(
examples=examples,
inputs=[label,message,color,label_color,logo,logo_color,style,link],
outputs=[out_code,out_preview],
fn=generate_static_badge,
cache_examples=False,
run_on_click=True
)
# On-load default preview
demo.load(
fn=generate_static_badge,
inputs=[label,message,color,label_color,logo,logo_color,style,link],
outputs=[out_code,out_preview]
)
# Live update on change
for inp in [label,message,color,label_color,logo,logo_color,style,link]:
inp.change(fn=generate_static_badge, inputs=[label,message,color,label_color,logo,logo_color,style,link], outputs=[out_code,out_preview])
if __name__ == "__main__":
demo.launch()
|