Spaces:
Paused
Paused
Update app.py
Browse files
app.py
CHANGED
|
@@ -571,7 +571,7 @@ def get_share_links(app_url="https://howmuchfeed.com"):
|
|
| 571 |
|
| 572 |
|
| 573 |
# ============================================================
|
| 574 |
-
# FEED CALCULATION -
|
| 575 |
# ============================================================
|
| 576 |
|
| 577 |
def calculate_feed(birds, weeks, days, bag_size, price_per_bag, email, country_code, breed, request: gr.Request):
|
|
@@ -645,7 +645,7 @@ def calculate_feed(birds, weeks, days, bag_size, price_per_bag, email, country_c
|
|
| 645 |
# Generate share links
|
| 646 |
share_links = get_share_links()
|
| 647 |
|
| 648 |
-
# Output HTML -
|
| 649 |
starter_bags_display = f"{starter_bags:.1f}"
|
| 650 |
finisher_bags_display = f"{finisher_bags:.1f}"
|
| 651 |
|
|
@@ -654,93 +654,93 @@ def calculate_feed(birds, weeks, days, bag_size, price_per_bag, email, country_c
|
|
| 654 |
age_text += f" + {days} day{'s' if days != 1 else ''}"
|
| 655 |
|
| 656 |
html = f"""
|
| 657 |
-
<div style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; font-size:
|
| 658 |
|
| 659 |
<!-- Quick Answer -->
|
| 660 |
-
<div style="background: #f0fdf4; border: 1px solid #bbf7d0; border-radius:
|
| 661 |
-
<div style="font-size:
|
| 662 |
-
<div style="font-size:
|
| 663 |
-
You need <span style="background: #166534; color: white; border-radius:
|
| 664 |
to raise <strong>{birds:,}</strong> {breed} broilers from day-old to <strong>{age_text} ({total_days} days)</strong>
|
| 665 |
</div>
|
| 666 |
-
<div style="margin-top:
|
| 667 |
-
Buy <span style="background: #1e40af; color: white; border-radius:
|
| 668 |
</div>
|
| 669 |
-
<div style="margin-top:
|
| 670 |
-
<span>π
|
| 671 |
-
<span>π
|
| 672 |
-
<span>π·οΈ
|
| 673 |
</div>
|
| 674 |
-
<div style="margin-top:
|
| 675 |
-
<span style="background: {breed_color}; color: white; padding: 2px
|
| 676 |
-
<span style="background: #6b7280; color: white; padding: 2px
|
| 677 |
</div>
|
| 678 |
</div>
|
| 679 |
|
| 680 |
<!-- Feed Breakdown -->
|
| 681 |
-
<div style="margin-bottom:
|
| 682 |
-
<div style="font-size:
|
| 683 |
-
<table style="width: 100%; border-collapse: collapse; font-size:
|
| 684 |
<tr style="border-bottom: 1px solid #e5e7eb;">
|
| 685 |
-
<td style="padding:
|
| 686 |
-
<td style="padding:
|
| 687 |
-
<td style="padding:
|
| 688 |
</tr>
|
| 689 |
<tr style="border-bottom: 1px solid #e5e7eb;">
|
| 690 |
-
<td style="padding:
|
| 691 |
-
<td style="padding:
|
| 692 |
-
<td style="padding:
|
| 693 |
</tr>
|
| 694 |
<tr>
|
| 695 |
-
<td style="padding:
|
| 696 |
-
<td style="padding:
|
| 697 |
-
<td style="padding:
|
| 698 |
</tr>
|
| 699 |
</table>
|
| 700 |
</div>
|
| 701 |
|
| 702 |
<!-- Feed Cost -->
|
| 703 |
-
<div style="background: #eff6ff; border: 1px solid #bfdbfe; border-radius:
|
| 704 |
-
<div style="font-size:
|
| 705 |
-
<div style="display: flex; align-items: baseline; gap:
|
| 706 |
-
<span style="
|
| 707 |
-
<span style="background: #1e40af; color: white; border-radius:
|
| 708 |
-
<span style="
|
| 709 |
</div>
|
| 710 |
-
<div style="font-size:
|
| 711 |
{currency_symbol}{total_cost:,.0f}
|
| 712 |
</div>
|
| 713 |
</div>
|
| 714 |
|
| 715 |
<!-- Expected Performance -->
|
| 716 |
-
<div style="border-top: 1px solid #e5e7eb; padding-top:
|
| 717 |
-
<div style="font-size:
|
| 718 |
-
<div style="display: flex; gap:
|
| 719 |
-
<div>Body weight
|
| 720 |
-
<div>Flock
|
| 721 |
</div>
|
| 722 |
</div>
|
| 723 |
|
| 724 |
<!-- Share Results -->
|
| 725 |
-
<div style="border-top: 1px solid #e5e7eb; padding-top:
|
| 726 |
-
<div style="font-size:
|
| 727 |
-
<div style="display: flex; gap:
|
| 728 |
<a href="{share_links['whatsapp']}" target="_blank" style="text-decoration: none;">
|
| 729 |
-
<button style="background: #25D366; color: white; padding:
|
| 730 |
</a>
|
| 731 |
<a href="{share_links['email']}" target="_blank" style="text-decoration: none;">
|
| 732 |
-
<button style="background: #ea4335; color: white; padding:
|
| 733 |
</a>
|
| 734 |
<a href="{share_links['facebook']}" target="_blank" style="text-decoration: none;">
|
| 735 |
-
<button style="background: #1877f2; color: white; padding:
|
| 736 |
</a>
|
| 737 |
<a href="{share_links['twitter']}" target="_blank" style="text-decoration: none;">
|
| 738 |
-
<button style="background: #000000; color: white; padding:
|
| 739 |
</a>
|
| 740 |
</div>
|
| 741 |
</div>
|
| 742 |
|
| 743 |
-
<div style="margin-top:
|
| 744 |
Estimate based on {breed} benchmark. Actual results may vary.
|
| 745 |
</div>
|
| 746 |
</div>
|
|
@@ -960,38 +960,99 @@ def export_calculations_wrapper():
|
|
| 960 |
|
| 961 |
|
| 962 |
# ============================================================
|
| 963 |
-
# CSS
|
| 964 |
# ============================================================
|
| 965 |
|
| 966 |
CSS = """
|
| 967 |
-
|
| 968 |
-
.gradio-container {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 969 |
|
| 970 |
-
|
| 971 |
-
.
|
| 972 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 973 |
|
| 974 |
.answer-box {
|
| 975 |
-
background: white;
|
| 976 |
-
border-radius:
|
| 977 |
-
padding:
|
| 978 |
-
border: 1px solid #e5e7eb;
|
| 979 |
-
box-shadow: 0 1px 3px rgba(0,0,0,0.05);
|
|
|
|
| 980 |
}
|
| 981 |
|
| 982 |
.email-box {
|
| 983 |
-
border: 2px solid #d9e7d2;
|
| 984 |
-
border-radius:
|
| 985 |
-
padding:
|
| 986 |
-
background: #fbfdf9;
|
| 987 |
}
|
| 988 |
|
| 989 |
-
button { min-height:
|
|
|
|
| 990 |
.admin-login {
|
| 991 |
-
border: 2px solid #d97706;
|
| 992 |
-
border-radius:
|
| 993 |
-
padding:
|
| 994 |
-
background: #fffbeb;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 995 |
}
|
| 996 |
"""
|
| 997 |
|
|
@@ -999,7 +1060,7 @@ button { min-height: 48px !important; }
|
|
| 999 |
# UI
|
| 1000 |
# ============================================================
|
| 1001 |
|
| 1002 |
-
with gr.Blocks(title=APP_NAME) as demo:
|
| 1003 |
|
| 1004 |
gr.HTML("""
|
| 1005 |
<div class="main-title">
|
|
@@ -1011,7 +1072,7 @@ with gr.Blocks(title=APP_NAME) as demo:
|
|
| 1011 |
with gr.Row(equal_height=True):
|
| 1012 |
|
| 1013 |
# LEFT COLUMN: INPUTS
|
| 1014 |
-
with gr.Column(scale=1, min_width=
|
| 1015 |
|
| 1016 |
with gr.Group():
|
| 1017 |
gr.Markdown("## π Breed & Birds")
|
|
@@ -1030,7 +1091,7 @@ with gr.Blocks(title=APP_NAME) as demo:
|
|
| 1030 |
allow_custom_value=True,
|
| 1031 |
)
|
| 1032 |
|
| 1033 |
-
gr.Markdown("## π
Expected Age
|
| 1034 |
|
| 1035 |
with gr.Row():
|
| 1036 |
weeks = gr.Dropdown(
|
|
@@ -1058,7 +1119,7 @@ with gr.Blocks(title=APP_NAME) as demo:
|
|
| 1058 |
minimum=0,
|
| 1059 |
)
|
| 1060 |
|
| 1061 |
-
gr.Markdown("## π Country
|
| 1062 |
|
| 1063 |
detected_country = detect_country_from_env() or "NG"
|
| 1064 |
country_choices = ["Auto-Detect"] + [code for code, _ in COUNTRY_LIST]
|
|
@@ -1090,14 +1151,14 @@ with gr.Blocks(title=APP_NAME) as demo:
|
|
| 1090 |
save_status = gr.Markdown("")
|
| 1091 |
|
| 1092 |
# RIGHT COLUMN: RESULTS
|
| 1093 |
-
with gr.Column(scale=1, min_width=
|
| 1094 |
gr.Markdown("## π― Quick Answer")
|
| 1095 |
result = gr.HTML(
|
| 1096 |
value="""
|
| 1097 |
-
<div style="font-size:
|
| 1098 |
-
<div style="font-size:
|
| 1099 |
<div>Select your breed, enter details and click <strong>Calculate</strong></div>
|
| 1100 |
-
<div style="font-size:
|
| 1101 |
</div>
|
| 1102 |
""",
|
| 1103 |
elem_classes=["answer-box"],
|
|
|
|
| 571 |
|
| 572 |
|
| 573 |
# ============================================================
|
| 574 |
+
# FEED CALCULATION - MOBILE-FRIENDLY
|
| 575 |
# ============================================================
|
| 576 |
|
| 577 |
def calculate_feed(birds, weeks, days, bag_size, price_per_bag, email, country_code, breed, request: gr.Request):
|
|
|
|
| 645 |
# Generate share links
|
| 646 |
share_links = get_share_links()
|
| 647 |
|
| 648 |
+
# Output HTML - MOBILE-FRIENDLY
|
| 649 |
starter_bags_display = f"{starter_bags:.1f}"
|
| 650 |
finisher_bags_display = f"{finisher_bags:.1f}"
|
| 651 |
|
|
|
|
| 654 |
age_text += f" + {days} day{'s' if days != 1 else ''}"
|
| 655 |
|
| 656 |
html = f"""
|
| 657 |
+
<div style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; font-size: 15px; line-height: 1.5; color: #1a1a1a; background: white; border-radius: 12px; padding: 16px;">
|
| 658 |
|
| 659 |
<!-- Quick Answer -->
|
| 660 |
+
<div style="background: #f0fdf4; border: 1px solid #bbf7d0; border-radius: 10px; padding: 14px 16px; margin-bottom: 16px;">
|
| 661 |
+
<div style="font-size: 12px; font-weight: 700; color: #16a34a; text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 4px;">Here Is Your Result</div>
|
| 662 |
+
<div style="font-size: 16px; font-weight: 700; color: #166534;">
|
| 663 |
+
You need <span style="background: #166534; color: white; border-radius: 6px; padding: 2px 12px; font-size: 20px;">{total_bags:.1f}</span> bags of {bag_size} kg poultry feed<br>
|
| 664 |
to raise <strong>{birds:,}</strong> {breed} broilers from day-old to <strong>{age_text} ({total_days} days)</strong>
|
| 665 |
</div>
|
| 666 |
+
<div style="margin-top: 6px; font-size: 16px; font-weight: 700; color: #1e40af;">
|
| 667 |
+
Buy <span style="background: #1e40af; color: white; border-radius: 6px; padding: 2px 12px; font-size: 18px;">{rounded_bags}</span> bags to make sure you have enough feed.
|
| 668 |
</div>
|
| 669 |
+
<div style="margin-top: 6px; display: flex; gap: 10px; flex-wrap: wrap; font-size: 13px; color: #4b5563;">
|
| 670 |
+
<span>π <strong>{birds:,}</strong></span>
|
| 671 |
+
<span>π
<strong>{age_text}</strong></span>
|
| 672 |
+
<span>π·οΈ <strong>{breed}</strong></span>
|
| 673 |
</div>
|
| 674 |
+
<div style="margin-top: 6px; display: flex; gap: 6px; font-size: 12px;">
|
| 675 |
+
<span style="background: {breed_color}; color: white; padding: 2px 10px; border-radius: 10px; font-weight: 600;">{breed}</span>
|
| 676 |
+
<span style="background: #6b7280; color: white; padding: 2px 10px; border-radius: 10px; font-weight: 600;">{country_name}</span>
|
| 677 |
</div>
|
| 678 |
</div>
|
| 679 |
|
| 680 |
<!-- Feed Breakdown -->
|
| 681 |
+
<div style="margin-bottom: 14px;">
|
| 682 |
+
<div style="font-size: 12px; font-weight: 700; color: #6b7280; text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 6px;">Feed Breakdown</div>
|
| 683 |
+
<table style="width: 100%; border-collapse: collapse; font-size: 14px;">
|
| 684 |
<tr style="border-bottom: 1px solid #e5e7eb;">
|
| 685 |
+
<td style="padding: 6px 4px;"><strong>Starter</strong></td>
|
| 686 |
+
<td style="padding: 6px 4px; text-align: right;">{starter_kg:,.1f} kg</td>
|
| 687 |
+
<td style="padding: 6px 4px; text-align: right; font-weight: 700; color: #1e293b;">{starter_bags_display} bags</td>
|
| 688 |
</tr>
|
| 689 |
<tr style="border-bottom: 1px solid #e5e7eb;">
|
| 690 |
+
<td style="padding: 6px 4px;"><strong>Finisher</strong></td>
|
| 691 |
+
<td style="padding: 6px 4px; text-align: right;">{finisher_kg:,.1f} kg</td>
|
| 692 |
+
<td style="padding: 6px 4px; text-align: right; font-weight: 700; color: #1e293b;">{finisher_bags_display} bags</td>
|
| 693 |
</tr>
|
| 694 |
<tr>
|
| 695 |
+
<td style="padding: 6px 4px; font-weight: 700;">TOTAL</td>
|
| 696 |
+
<td style="padding: 6px 4px; text-align: right; font-weight: 700;">{total_feed_kg:,.1f} kg</td>
|
| 697 |
+
<td style="padding: 6px 4px; text-align: right; font-weight: 700; font-size: 16px; color: #166534;">{total_bags:.1f} bags</td>
|
| 698 |
</tr>
|
| 699 |
</table>
|
| 700 |
</div>
|
| 701 |
|
| 702 |
<!-- Feed Cost -->
|
| 703 |
+
<div style="background: #eff6ff; border: 1px solid #bfdbfe; border-radius: 10px; padding: 12px 16px; margin-bottom: 14px;">
|
| 704 |
+
<div style="font-size: 12px; font-weight: 700; color: #6b7280; text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 2px;">Feed Cost Estimate</div>
|
| 705 |
+
<div style="display: flex; align-items: baseline; gap: 6px; flex-wrap: wrap; font-size: 14px;">
|
| 706 |
+
<span style="color: #4b5563;">Approx</span>
|
| 707 |
+
<span style="background: #1e40af; color: white; border-radius: 6px; padding: 2px 12px; font-size: 18px; font-weight: 700;">{rounded_bags} bags</span>
|
| 708 |
+
<span style="color: #4b5563;">Γ {currency_symbol}{price_per_bag:,.0f}</span>
|
| 709 |
</div>
|
| 710 |
+
<div style="font-size: 24px; font-weight: 800; color: #1e40af; margin-top: 2px;">
|
| 711 |
{currency_symbol}{total_cost:,.0f}
|
| 712 |
</div>
|
| 713 |
</div>
|
| 714 |
|
| 715 |
<!-- Expected Performance -->
|
| 716 |
+
<div style="border-top: 1px solid #e5e7eb; padding-top: 12px; margin-bottom: 14px;">
|
| 717 |
+
<div style="font-size: 12px; font-weight: 700; color: #6b7280; text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 4px;">Expected Performance</div>
|
| 718 |
+
<div style="display: flex; gap: 16px; flex-wrap: wrap; font-size: 14px;">
|
| 719 |
+
<div>Body weight: <span style="font-weight: 700;">{expected_weight:.3f} kg</span></div>
|
| 720 |
+
<div>Flock weight: <span style="font-weight: 700;">{flock_weight:,.1f} kg</span></div>
|
| 721 |
</div>
|
| 722 |
</div>
|
| 723 |
|
| 724 |
<!-- Share Results -->
|
| 725 |
+
<div style="border-top: 1px solid #e5e7eb; padding-top: 12px;">
|
| 726 |
+
<div style="font-size: 12px; font-weight: 700; color: #6b7280; text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 6px;">Share Results</div>
|
| 727 |
+
<div style="display: flex; gap: 8px; flex-wrap: wrap;">
|
| 728 |
<a href="{share_links['whatsapp']}" target="_blank" style="text-decoration: none;">
|
| 729 |
+
<button style="background: #25D366; color: white; padding: 6px 14px; border: none; border-radius: 6px; cursor: pointer; font-size: 13px; font-weight: 600;">WhatsApp</button>
|
| 730 |
</a>
|
| 731 |
<a href="{share_links['email']}" target="_blank" style="text-decoration: none;">
|
| 732 |
+
<button style="background: #ea4335; color: white; padding: 6px 14px; border: none; border-radius: 6px; cursor: pointer; font-size: 13px; font-weight: 600;">Email</button>
|
| 733 |
</a>
|
| 734 |
<a href="{share_links['facebook']}" target="_blank" style="text-decoration: none;">
|
| 735 |
+
<button style="background: #1877f2; color: white; padding: 6px 14px; border: none; border-radius: 6px; cursor: pointer; font-size: 13px; font-weight: 600;">Facebook</button>
|
| 736 |
</a>
|
| 737 |
<a href="{share_links['twitter']}" target="_blank" style="text-decoration: none;">
|
| 738 |
+
<button style="background: #000000; color: white; padding: 6px 14px; border: none; border-radius: 6px; cursor: pointer; font-size: 13px; font-weight: 600;">Twitter/X</button>
|
| 739 |
</a>
|
| 740 |
</div>
|
| 741 |
</div>
|
| 742 |
|
| 743 |
+
<div style="margin-top: 12px; font-size: 11px; color: #9ca3af; border-top: 1px solid #f3f4f6; padding-top: 8px;">
|
| 744 |
Estimate based on {breed} benchmark. Actual results may vary.
|
| 745 |
</div>
|
| 746 |
</div>
|
|
|
|
| 960 |
|
| 961 |
|
| 962 |
# ============================================================
|
| 963 |
+
# MOBILE-FRIENDLY CSS
|
| 964 |
# ============================================================
|
| 965 |
|
| 966 |
CSS = """
|
| 967 |
+
/* Force light theme */
|
| 968 |
+
.gradio-container {
|
| 969 |
+
max-width: 100% !important;
|
| 970 |
+
padding: 8px !important;
|
| 971 |
+
}
|
| 972 |
+
|
| 973 |
+
body {
|
| 974 |
+
background: #f6f8f4 !important;
|
| 975 |
+
color: #1a1a1a !important;
|
| 976 |
+
}
|
| 977 |
|
| 978 |
+
/* Fix dark mode issues */
|
| 979 |
+
.dark .gradio-container {
|
| 980 |
+
background: #f6f8f4 !important;
|
| 981 |
+
color: #1a1a1a !important;
|
| 982 |
+
}
|
| 983 |
+
|
| 984 |
+
.main-title {
|
| 985 |
+
text-align: center;
|
| 986 |
+
padding: 10px 5px 5px 5px;
|
| 987 |
+
}
|
| 988 |
+
.main-title h1 {
|
| 989 |
+
font-size: 24px;
|
| 990 |
+
margin-bottom: 2px;
|
| 991 |
+
}
|
| 992 |
+
.main-title p {
|
| 993 |
+
font-size: 14px;
|
| 994 |
+
color: #555;
|
| 995 |
+
}
|
| 996 |
|
| 997 |
.answer-box {
|
| 998 |
+
background: white !important;
|
| 999 |
+
border-radius: 12px !important;
|
| 1000 |
+
padding: 12px 14px !important;
|
| 1001 |
+
border: 1px solid #e5e7eb !important;
|
| 1002 |
+
box-shadow: 0 1px 3px rgba(0,0,0,0.05) !important;
|
| 1003 |
+
min-height: 200px !important;
|
| 1004 |
}
|
| 1005 |
|
| 1006 |
.email-box {
|
| 1007 |
+
border: 2px solid #d9e7d2 !important;
|
| 1008 |
+
border-radius: 10px !important;
|
| 1009 |
+
padding: 8px !important;
|
| 1010 |
+
background: #fbfdf9 !important;
|
| 1011 |
}
|
| 1012 |
|
| 1013 |
+
button { min-height: 44px !important; }
|
| 1014 |
+
|
| 1015 |
.admin-login {
|
| 1016 |
+
border: 2px solid #d97706 !important;
|
| 1017 |
+
border-radius: 10px !important;
|
| 1018 |
+
padding: 12px !important;
|
| 1019 |
+
background: #fffbeb !important;
|
| 1020 |
+
}
|
| 1021 |
+
|
| 1022 |
+
/* Force all text to be readable */
|
| 1023 |
+
label, span, p, div, h1, h2, h3, h4 {
|
| 1024 |
+
color: #1a1a1a !important;
|
| 1025 |
+
}
|
| 1026 |
+
|
| 1027 |
+
/* Fix dropdown text */
|
| 1028 |
+
select, input, textarea {
|
| 1029 |
+
color: #1a1a1a !important;
|
| 1030 |
+
background: white !important;
|
| 1031 |
+
}
|
| 1032 |
+
|
| 1033 |
+
/* Fix table text */
|
| 1034 |
+
table td, table th {
|
| 1035 |
+
color: #1a1a1a !important;
|
| 1036 |
+
}
|
| 1037 |
+
|
| 1038 |
+
/* Force white background on all containers */
|
| 1039 |
+
.gradio-container, .gradio-row, .gradio-column, .gradio-group {
|
| 1040 |
+
background: transparent !important;
|
| 1041 |
+
}
|
| 1042 |
+
|
| 1043 |
+
/* Mobile specific */
|
| 1044 |
+
@media screen and (max-width: 768px) {
|
| 1045 |
+
.gradio-container {
|
| 1046 |
+
padding: 4px !important;
|
| 1047 |
+
}
|
| 1048 |
+
|
| 1049 |
+
.main-title h1 {
|
| 1050 |
+
font-size: 20px !important;
|
| 1051 |
+
}
|
| 1052 |
+
|
| 1053 |
+
.answer-box {
|
| 1054 |
+
padding: 8px 10px !important;
|
| 1055 |
+
}
|
| 1056 |
}
|
| 1057 |
"""
|
| 1058 |
|
|
|
|
| 1060 |
# UI
|
| 1061 |
# ============================================================
|
| 1062 |
|
| 1063 |
+
with gr.Blocks(title=APP_NAME, css=CSS) as demo:
|
| 1064 |
|
| 1065 |
gr.HTML("""
|
| 1066 |
<div class="main-title">
|
|
|
|
| 1072 |
with gr.Row(equal_height=True):
|
| 1073 |
|
| 1074 |
# LEFT COLUMN: INPUTS
|
| 1075 |
+
with gr.Column(scale=1, min_width=300):
|
| 1076 |
|
| 1077 |
with gr.Group():
|
| 1078 |
gr.Markdown("## π Breed & Birds")
|
|
|
|
| 1091 |
allow_custom_value=True,
|
| 1092 |
)
|
| 1093 |
|
| 1094 |
+
gr.Markdown("## π
Expected Age")
|
| 1095 |
|
| 1096 |
with gr.Row():
|
| 1097 |
weeks = gr.Dropdown(
|
|
|
|
| 1119 |
minimum=0,
|
| 1120 |
)
|
| 1121 |
|
| 1122 |
+
gr.Markdown("## π Country")
|
| 1123 |
|
| 1124 |
detected_country = detect_country_from_env() or "NG"
|
| 1125 |
country_choices = ["Auto-Detect"] + [code for code, _ in COUNTRY_LIST]
|
|
|
|
| 1151 |
save_status = gr.Markdown("")
|
| 1152 |
|
| 1153 |
# RIGHT COLUMN: RESULTS
|
| 1154 |
+
with gr.Column(scale=1, min_width=300):
|
| 1155 |
gr.Markdown("## π― Quick Answer")
|
| 1156 |
result = gr.HTML(
|
| 1157 |
value="""
|
| 1158 |
+
<div style="font-size: 14px; color: #9ca3af; text-align: center; padding: 30px 10px; background: white; border-radius: 12px;">
|
| 1159 |
+
<div style="font-size: 40px; margin-bottom: 10px;">π</div>
|
| 1160 |
<div>Select your breed, enter details and click <strong>Calculate</strong></div>
|
| 1161 |
+
<div style="font-size: 13px; margin-top: 6px;">Your feed estimate will appear here</div>
|
| 1162 |
</div>
|
| 1163 |
""",
|
| 1164 |
elem_classes=["answer-box"],
|