File size: 5,435 Bytes
d64466a 98acb26 d64466a 98acb26 d64466a 98acb26 d64466a 98acb26 d64466a 98acb26 5f0bbae 98acb26 d64466a 98acb26 d64466a 98acb26 d64466a ce9a842 98acb26 d64466a ce9a842 ed50e5b ce9a842 ed50e5b 98acb26 ed50e5b ce9a842 ed50e5b 98acb26 ce9a842 ed50e5b 98acb26 ce9a842 d64466a ce9a842 |
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>
<p style=\"text-align:center; color:#555;\">MIT License & Created Team: https://discord.gg/openfreeai</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="#5865F2") # Discord neon blue
label_color = gr.ColorPicker(label="Label Color", value="#99AAFF")
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) with neon/vibrant colors
examples = [
["Discord", "Join our community", "#5865F2", "#99AAFF", "discord", "white", "for-the-badge", "https://discord.gg/openfreeai"],
["X.com", "Follow us", "#1DA1F2", "#00CFFF", "X", "white", "for-the-badge", "https://x.com/openfree_ai"],
["Collections","Explore", "#FFB300", "#FFF176", "huggingface","black","for-the-badge","https://huggingface.co/collections/VIDraft/best-open-ai-services-68057e6e312880ea92abaf4c"],
["GitHub", "Star us", "#0A0A0A", "#39FF14", "github", "white", "for-the-badge", "https://github.com/openfreeai"],
["YouTube", "Watch now", "#E50000", "#FF5E5E", "youtube", "white", "for-the-badge", "https://www.youtube.com/@AITechTree"],
["Facebook","Like us", "#1877F2", "#6FAFFF", "facebook", "white", "for-the-badge", "https://www.facebook.com/profile.php?id=61575353674679"],
["Instagram","Follow", "#E4405F", "#FF77A9", "instagram", "white", "for-the-badge", "https://www.instagram.com/openfree_ai/"],
["Threads", "Join the convo", "#000000", "#FF00FF", "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() |