calculatortest2 / app.py
akhaliq's picture
akhaliq HF Staff
Update app.py from anycoder
a6a478a verified
import gradio as gr
def calculator(num1, operation, num2):
if operation == "add":
return num1 + num2
elif operation == "subtract":
return num1 - num2
elif operation == "multiply":
return num1 * num2
elif operation == "divide":
if num2 == 0:
raise gr.Error("Cannot divide by zero!")
return num1 / num2
# Custom CSS for modern, mobile-friendly design
custom_css = """
/* Mobile-first responsive design */
.gradio-container {
max-width: 500px !important;
margin: 0 auto !important;
padding: 1rem !important;
}
/* Header styling */
.header-section {
text-align: center;
margin-bottom: 2rem;
}
.header-section h1 {
font-size: 2.5rem;
font-weight: 700;
margin-bottom: 0.5rem;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.header-link {
font-size: 0.875rem;
opacity: 0.7;
margin-top: 0.25rem;
}
/* Calculator card */
.calculator-card {
background: rgba(255, 255, 255, 0.05);
border-radius: 1.5rem;
padding: 1.5rem;
backdrop-filter: blur(10px);
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
}
/* Input styling */
.input-group {
margin-bottom: 1rem;
}
/* Operation buttons */
.operation-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 0.75rem;
margin: 1.5rem 0;
}
/* Result display */
.result-display {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
border-radius: 1rem;
padding: 1.5rem;
text-align: center;
margin: 1.5rem 0;
min-height: 80px;
display: flex;
align-items: center;
justify-content: center;
}
.result-display .output-class {
font-size: 2rem !important;
font-weight: 700 !important;
color: white !important;
}
/* Button styling */
.calculate-btn {
width: 100%;
padding: 1rem !important;
font-size: 1.125rem !important;
font-weight: 600 !important;
border-radius: 0.75rem !important;
margin: 1rem 0 !important;
}
/* Examples section */
.examples-section {
margin-top: 2rem;
padding-top: 2rem;
border-top: 1px solid rgba(255, 255, 255, 0.1);
}
/* Mobile responsiveness */
@media (max-width: 640px) {
.header-section h1 {
font-size: 2rem;
}
.calculator-card {
padding: 1rem;
}
.result-display .output-class {
font-size: 1.5rem !important;
}
}
/* Smooth transitions */
* {
transition: all 0.2s ease-in-out;
}
"""
with gr.Blocks(fill_height=True) as demo:
# Header
with gr.Row(elem_classes="header-section"):
gr.Markdown(
"""
# 🧮 Calculator
[Built with anycoder](https://huggingface.co/spaces/akhaliq/anycoder)
""",
elem_classes="header-link"
)
# Main calculator interface
with gr.Column(elem_classes="calculator-card"):
# Input numbers
num1 = gr.Number(
label="First Number",
placeholder="0",
value=0,
elem_classes="input-group"
)
# Operation selector - using radio for clarity
operation = gr.Radio(
choices=["add", "subtract", "multiply", "divide"],
value="add",
label="Operation",
elem_classes="input-group"
)
num2 = gr.Number(
label="Second Number",
placeholder="0",
value=0,
elem_classes="input-group"
)
# Calculate button
submit_btn = gr.Button(
"Calculate",
variant="primary",
size="lg",
elem_classes="calculate-btn"
)
# Result display
result = gr.Number(
label="Result",
interactive=False,
elem_classes="result-display"
)
# Examples section
with gr.Column(elem_classes="examples-section"):
gr.Markdown("### Quick Examples")
gr.Examples(
examples=[
[45, "add", 3],
[100, "subtract", 25],
[12, "multiply", 8],
[144, "divide", 12],
],
inputs=[num1, operation, num2],
outputs=[result],
fn=calculator,
cache_examples=False
)
# Event handlers
submit_btn.click(
fn=calculator,
inputs=[num1, operation, num2],
outputs=[result],
api_visibility="public"
)
# Allow Enter key to calculate
num2.submit(
fn=calculator,
inputs=[num1, operation, num2],
outputs=[result]
)
if __name__ == "__main__":
demo.launch(
theme=gr.themes.Soft(
primary_hue="violet",
secondary_hue="purple",
neutral_hue="slate",
font=gr.themes.GoogleFont("Inter"),
text_size="lg",
spacing_size="md",
radius_size="lg"
).set(
button_primary_background_fill="linear-gradient(135deg, #667eea 0%, #764ba2 100%)",
button_primary_background_fill_hover="linear-gradient(135deg, #764ba2 0%, #667eea 100%)",
block_title_text_weight="600",
block_border_width="0px",
input_background_fill="rgba(255, 255, 255, 0.05)",
),
css=custom_css,
footer_links=[
{"label": "Built with anycoder", "url": "https://huggingface.co/spaces/akhaliq/anycoder"}
]
)