redesigner / app.py
victor's picture
victor HF Staff
Enhance redesign function documentation and examples; clarify user instructions for targeted redesign approaches
3395169
import gradio as gr
import requests
import os
import re
SYSTEM_PROMPT = """You are an expert UI/UX designer specializing in redesigning HTML components with TailwindCSS. Transform the input HTML into a cleaner, more modern version with focus on spacing and layout precision.
Core Design Philosophy:
- SPACING FIRST: Prioritize proper spacing over complex styling
- PRESERVE EXISTING: Maintain the original color scheme and fonts when they exist
- SIMPLE & CLEAN: Focus on clean, minimal designs rather than overly decorative ones
- FLEXIBLE LAYOUTS: Use flexbox with proper flex properties for better control
Spacing & Layout Rules:
- Use consistent spacing scales: p-4, p-6, p-8 for padding; m-4, m-6, m-8 for margins
- Apply gap-4, gap-6, or gap-8 for flex/grid container spacing
- Use space-y-4, space-y-6 for vertical stacking
- Add flex-none to elements that should NOT stretch (buttons, labels, icons, fixed-width items)
- Use flex-1 or flex-auto only for elements that should grow/stretch
- Prefer specific widths (w-32, w-48, w-64) over arbitrary values
Color & Typography Preservation:
- ANALYZE the input HTML for existing color schemes (bg-*, text-*, border-*)
- REUSE those exact color classes in the redesigned version
- If input uses blue-500, continue using blue-* variants throughout
- If input has specific font classes (font-medium, text-lg), maintain that typography scale
- MANDATORY: ALWAYS add text-balance class to ALL titles and headings (h1, h2, h3, h4, h5, h6, and any element with large text like text-xl, text-2xl, etc.) for better text wrapping and visual balance
- Only introduce new colors if the original has none or uses basic colors
Dark Mode Support:
- DETECT dark mode classes in input (dark:*, bg-gray-900, text-white, etc.)
- If input HAS dark mode classes, PRESERVE and EXTEND them in the redesign
- If input has dark:bg-gray-800, continue using dark:* variants throughout
- If input has NO dark mode classes, DO NOT add any dark mode styling
- Maintain the same dark mode approach as the original (toggle-based or system-based)
Design Enhancement Guidelines:
- Improve visual hierarchy with better spacing, not more colors
- Add subtle shadows (shadow-sm, shadow-md) for depth
- Use rounded corners appropriately (rounded-lg, rounded-xl)
- Add hover states with opacity or subtle color shifts
- Implement focus states with ring utilities
- Use border utilities for clean separation
- Apply proper contrast ratios for accessibility
Layout Techniques:
- Use flex with gap instead of space-x/space-y when possible
- Apply justify-between, justify-center, items-center for alignment
- Use flex-none for buttons, icons, and fixed elements
- Apply max-w-* for content width constraints
- Use grid for complex layouts, flex for simple ones
Responsive Design Rules:
- ALWAYS ensure mobile-first responsive design
- Use responsive breakpoints: sm:, md:, lg:, xl: appropriately
- Stack elements vertically on mobile, arrange horizontally on larger screens
- Apply responsive padding: p-4 sm:p-6 lg:p-8
- Use responsive text sizes: text-sm md:text-base lg:text-lg
- Implement responsive flexbox: flex-col md:flex-row
- Add responsive gaps: gap-4 md:gap-6 lg:gap-8
- Ensure buttons and inputs are touch-friendly on mobile (min-h-10, p-3)
- Use responsive widths: w-full md:w-auto or w-full md:w-1/2
- Apply responsive margins: mt-4 md:mt-0 for layout adjustments
Technical Requirements:
- Return ONLY the redesigned HTML code
- PRESERVE ALL FUNCTIONALITY: Keep every link (href), image (src), form action, onclick, etc.
- MAINTAIN ALL ATTRIBUTES: Preserve all IDs, classes, data-*, aria-*, name, value, placeholder, etc.
- KEEP ALL CONTENT: Preserve all text content, alt texts, button labels exactly as provided
- DO NOT REMOVE: Never remove links, images, inputs, buttons, or any functional elements
- DO NOT CHANGE: Keep all URLs, image sources, form targets, and JavaScript references unchanged
- ENHANCE ONLY STYLING: Only modify TailwindCSS classes for visual improvements
- PRESERVE STRUCTURE: Maintain the same HTML element hierarchy and nesting
Critical Preservation Rules:
- If input has <a href="...">Link</a>, output must have identical href and link text
- If input has <img src="..." alt="...">, output must preserve exact src and alt
- If input has form inputs with name/value/placeholder, keep them exactly the same
- If input has buttons with onclick or type attributes, preserve them completely
- If input has any data attributes (data-*), maintain them unchanged
- All original text content must remain identical
- MANDATORY TEXT-BALANCE RULE: Every heading (h1-h6) and large text element (text-xl, text-2xl, text-3xl, etc.) MUST include the text-balance class
Framework-Specific Preservation (React/Vue/Svelte/Angular):
- REACT: Preserve all JSX syntax: {variable}, {function()}, className, onClick, onChange, etc.
- VUE: Preserve all Vue directives: v-if, v-for, v-model, @click, :class, {{interpolation}}, etc.
- SVELTE: Preserve all Svelte syntax: {#if}, {#each}, on:click, bind:value, {variable}, etc.
- ANGULAR: Preserve all Angular syntax: *ngIf, *ngFor, (click), [class], {{interpolation}}, etc.
- ALPINE.JS: Preserve all Alpine directives: x-data, x-show, x-if, @click, :class, etc.
- HTMX: Preserve all HTMX attributes: hx-get, hx-post, hx-target, hx-swap, etc.
- Keep all curly braces, template literals, and dynamic expressions unchanged
- Maintain all event handlers and binding syntax exactly as provided
Focus on creating clean, spacious, and well-proportioned designs that feel premium through proper spacing rather than complex styling, while ensuring zero functional changes."""
def extract_html_from_response(response_text):
"""Extract HTML code from model response"""
# Try to find HTML within code blocks first
html_pattern = r"```(?:html)?\s*(.*?)```"
matches = re.findall(html_pattern, response_text, re.DOTALL | re.IGNORECASE)
if matches:
return matches[0].strip()
# If no code blocks but response contains HTML tags, return the whole response
if re.search(r"<[^>]+>", response_text):
return response_text.strip()
# If no HTML found, return error
raise ValueError("No HTML content found in the response")
def redesign_html(html_input: str, user_prompt: str = "") -> str:
"""
Redesign HTML+TailwindCSS code with improved spacing, responsive design, and modern aesthetics.
This tool takes existing HTML with TailwindCSS classes and transforms it into a cleaner,
more modern version with better spacing, responsive design, and improved user experience.
IMPORTANT: This tool should only be used when users explicitly request to "redesign" HTML code.
Users must say "redesign" or similar intent for this tool to be activated.
Args:
html_input (str): The HTML code with TailwindCSS classes to be redesigned.
Can include React/Vue/Svelte/Angular syntax which will be preserved.
user_prompt (str, optional): Custom instructions for the redesign process.
Examples: "make it more colorful", "add animations",
"make it minimal", "improve mobile layout".
If empty, uses default redesign approach.
Returns:
str: The redesigned HTML code with improved TailwindCSS styling, preserving all
functionality, links, images, and framework-specific syntax.
Features:
- Preserves all functionality (links, images, forms, JavaScript)
- Maintains framework syntax (React JSX, Vue directives, etc.)
- Improves spacing and responsive design
- Preserves existing color schemes and fonts
- Adds proper flex-none for non-stretching elements
- Ensures mobile-first responsive design
- Supports dark mode when present in input
- Accepts custom user instructions for targeted redesign approaches
"""
# Check if HF_TOKEN is set
hf_token = os.getenv("HF_TOKEN")
if not hf_token:
return "Error: HF_TOKEN environment variable not set. Please set your HuggingFace token."
# Prepare the API request
url = "https://router.huggingface.co/sambanova/v1/chat/completions"
headers = {
"Authorization": f"Bearer {hf_token}",
"Content-Type": "application/json",
}
# Build messages with system prompt and user prompt
user_content = html_input
if user_prompt.strip():
user_content = f"User instructions: {user_prompt.strip()}\n\nHTML to redesign:\n{html_input}"
messages = [
{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": user_content},
]
data = {
"messages": messages,
"model": "DeepSeek-V3-0324",
"stream": False,
"temperature": 0.8,
}
try:
response = requests.post(url, headers=headers, json=data, timeout=30)
response.raise_for_status()
result = response.json()
response_content = result["choices"][0]["message"]["content"]
# Extract HTML from the response
try:
html_content = extract_html_from_response(response_content)
return html_content
except ValueError as e:
return f"Error: {str(e)}. Response was: {response_content[:200]}..."
except requests.exceptions.RequestException as e:
return f"Error: Failed to connect to API - {str(e)}"
except KeyError as e:
return f"Error: Unexpected API response format - {str(e)}"
except Exception as e:
return f"Error: {str(e)}"
# Custom CSS for better HTML code display
custom_css = """
<style>
/* Better formatting for HTML code display */
.message-wrap .prose {
max-width: none !important;
}
.message-wrap pre {
white-space: pre-wrap !important;
word-break: break-all !important;
background: #1e1e1e !important;
color: #d4d4d4 !important;
padding: 16px !important;
border-radius: 8px !important;
border: 1px solid #333 !important;
font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace !important;
font-size: 14px !important;
line-height: 1.5 !important;
}
</style>
"""
# Create Gradio interface
demo = gr.Interface(
fn=redesign_html,
inputs=[
gr.Textbox(
label="Custom Instructions (Optional)",
placeholder="Enter specific instructions for the redesign (e.g., 'make it more colorful', 'add animations', 'make it minimal')...",
lines=2,
value="",
),
gr.Textbox(
label="HTML Input",
placeholder="Paste your HTML+TailwindCSS code here...",
lines=10,
value='<div class="p-4 border"><h1 class="text-xl">Welcome</h1><p>This is a basic card</p><button class="bg-blue-500 text-white px-4 py-2">Click me</button></div>',
),
],
outputs=gr.Code(language="html", label="Redesigned HTML"),
title="Redesigner (MCP Server)",
description="""
**MCP Server Tool for HTML Redesigning**
This is an MCP (Model Context Protocol) server that provides HTML redesign capabilities to LLMs.
**Powered by DeepSeek-V3-0324** - An advanced model specifically excellent at UI/UX design tasks.
**IMPORTANT FOR LLM USAGE:** This tool should only be activated when users explicitly request to "redesign" HTML code.
Users must use the word "redesign" or similar intent (e.g., "improve the design", "make it look better") for this tool to be used.
**Features:**
- Improves HTML+TailwindCSS with better spacing and responsive design
- Preserves all functionality (links, images, forms, JavaScript)
- Maintains framework syntax (React, Vue, Svelte, Angular)
- Supports dark mode when present in input
- Mobile-first responsive design implementation
- Custom user instructions for targeted redesign approaches
**Usage:** LLMs can use this tool when users ask to redesign HTML code by providing the HTML as input.
""",
examples=[
[
"Make it more modern and colorful",
'<div class="p-4 border"><h1 class="text-xl">Welcome</h1><p>This is a basic card</p><button class="bg-blue-500 text-white px-4 py-2">Click me</button></div>',
],
[
"Add subtle animations and improve spacing",
'<form class="space-y-4"><input type="email" placeholder="Email" class="border p-2 w-full"><input type="password" placeholder="Password" class="border p-2 w-full"><button type="submit" class="bg-green-500 text-white p-2">Login</button></form>',
],
[
"",
'<nav class="flex justify-between p-4 bg-gray-100"><div class="font-bold">Logo</div><ul class="flex space-x-4"><li><a href="#" class="text-blue-500">Home</a></li><li><a href="#" class="text-blue-500">About</a></li></ul></nav>',
],
],
css=custom_css,
)
if __name__ == "__main__":
demo.launch(mcp_server=True)