|
import streamlit as st |
|
|
|
def apply_styles(): |
|
return """ |
|
<style> |
|
/* Remove top margin and reduce other margins */ |
|
.main .block-container { |
|
padding-top: 1rem !important; |
|
margin-top: 0 !important; |
|
max-width: 95% !important; |
|
} |
|
|
|
h1, h3 { |
|
text-align: center; |
|
margin-top: 0.5rem !important; |
|
margin-bottom: 0.5rem !important; |
|
} |
|
|
|
.stButton > button { |
|
background-color: #FFD700 !important; |
|
color: black !important; |
|
border: 1px solid black !important; |
|
font-weight: bold !important; |
|
width: 80% !important; |
|
margin-left: 10% !important; |
|
} |
|
|
|
[data-testid="stDownloadButton"] { |
|
text-align: center; |
|
display: flex; |
|
justify-content: center; |
|
margin-top: 5px; |
|
width: 90%; |
|
margin-left: auto; |
|
margin-right: auto; |
|
} |
|
|
|
[data-testid="stDownloadButton"] button { |
|
width: 100%; |
|
border-radius: 5px; |
|
height: 3em; |
|
background: linear-gradient(to right, #00D100, #009900); |
|
color: white; |
|
font-weight: bold; |
|
transition: all 0.3s ease; |
|
border: none; |
|
text-transform: uppercase; |
|
letter-spacing: 1px; |
|
} |
|
|
|
[data-testid="stDownloadButton"] button:hover { |
|
background: linear-gradient(to right, #00C000, #008800); |
|
transform: translateY(-2px); |
|
box-shadow: 0 4px 8px rgba(0,0,0,0.1); |
|
} |
|
|
|
.stButton > button:hover { |
|
transform: translateY(-2px); |
|
box-shadow: 0 4px 8px rgba(0,0,0,0.1); |
|
transition: all 0.3s ease; |
|
} |
|
|
|
/* Hide the hamburger menu and Streamlit footer */ |
|
#MainMenu {visibility: hidden;} |
|
footer {visibility: hidden;} |
|
|
|
/* Creative Concept Styling */ |
|
.concept-title { |
|
font-size: 1.5rem; |
|
font-weight: bold; |
|
color: #2c3e50; |
|
margin-top: 2rem; |
|
padding: 0.5rem; |
|
border-bottom: 2px solid #3498db; |
|
} |
|
|
|
.section-header { |
|
font-size: 1.2rem; |
|
font-weight: bold; |
|
color: #3498db; |
|
margin-top: 1rem; |
|
margin-bottom: 0.5rem; |
|
} |
|
|
|
.analogy { |
|
color: #e74c3c; |
|
font-weight: bold; |
|
} |
|
|
|
.creative-concepts { |
|
background-color: #f8f9fa; |
|
padding: 1.5rem; |
|
border-radius: 10px; |
|
box-shadow: 0 4px 6px rgba(0,0,0,0.1); |
|
margin-bottom: 1.5rem; |
|
} |
|
</style> |
|
""" |
|
st.markdown(""" |
|
<style> |
|
.stTextArea > label { |
|
font-size: 1.2rem; |
|
font-weight: bold; |
|
color: #2c3e50; |
|
} |
|
|
|
.stSelectbox > label { |
|
font-size: 1.2rem; |
|
font-weight: bold; |
|
color: #2c3e50; |
|
} |
|
|
|
.stSlider > label { |
|
font-size: 1.2rem; |
|
font-weight: bold; |
|
color: #2c3e50; |
|
} |
|
|
|
.stButton > button { |
|
background-color: #2c3e50; |
|
color: white; |
|
padding: 0.5rem 2rem; |
|
font-size: 1.1rem; |
|
font-weight: bold; |
|
border-radius: 5px; |
|
} |
|
|
|
.stButton > button:hover { |
|
background-color: #34495e; |
|
} |
|
|
|
h1 { |
|
color: #2c3e50; |
|
font-size: 2.5rem; |
|
margin-bottom: 1rem; |
|
} |
|
|
|
h3 { |
|
color: #34495e; |
|
font-size: 1.3rem; |
|
font-weight: normal; |
|
margin-bottom: 2rem; |
|
} |
|
|
|
.stMarkdown { |
|
font-size: 1.1rem; |
|
} |
|
|
|
.element-container { |
|
margin-bottom: 1rem; |
|
} |
|
</style> |
|
""", unsafe_allow_html=True) |
|
|
|
def format_creative_response(response_text): |
|
"""Format the creative response with custom styling""" |
|
if not response_text or response_text.startswith("Error") or response_text.startswith("Debes"): |
|
return response_text |
|
|
|
|
|
sections = [] |
|
current_concept = {"title": "", "content": []} |
|
current_section = None |
|
|
|
for line in response_text.split('\n'): |
|
line = line.strip() |
|
if not line: |
|
continue |
|
|
|
if line.startswith("CONCEPTO CREATIVO"): |
|
|
|
if current_concept["title"]: |
|
sections.append(current_concept) |
|
current_concept = {"title": line, "content": []} |
|
current_section = None |
|
elif line.startswith("Concepto:"): |
|
current_section = "concept" |
|
current_concept["content"].append({"type": current_section, "header": line, "text": ""}) |
|
elif line.startswith("Creatividad:"): |
|
current_section = "creativity" |
|
current_concept["content"].append({"type": current_section, "header": line, "text": ""}) |
|
elif line.startswith("Ejemplo de Titular:"): |
|
current_section = "headline" |
|
current_concept["content"].append({"type": current_section, "header": line, "text": ""}) |
|
elif current_section: |
|
|
|
current_concept["content"][-1]["text"] = line |
|
|
|
|
|
if current_concept["title"]: |
|
sections.append(current_concept) |
|
|
|
|
|
html = "" |
|
for concept in sections: |
|
html += f'<div class="creative-concept-card">' |
|
html += f'<div class="concept-title">{concept["title"]}</div>' |
|
|
|
for item in concept["content"]: |
|
html += f'<div class="concept-section">' |
|
html += f'<div class="section-header">{item["header"]}</div>' |
|
|
|
|
|
if item["type"] == "creativity" and "es como" in item["text"] and "porque" in item["text"]: |
|
import re |
|
analogy_pattern = r'([^\.]+es como [^\.]+porque [^\.]+)' |
|
styled_text = re.sub(analogy_pattern, r'<span class="analogy">\1</span>', item["text"]) |
|
html += f'<div class="section-content">{styled_text}</div>' |
|
else: |
|
html += f'<div class="section-content">{item["text"]}</div>' |
|
|
|
html += '</div>' |
|
|
|
html += '</div>' |
|
|
|
|
|
css = """ |
|
<style> |
|
.creative-concept-card { |
|
background-color: #f8f9fa; |
|
padding: 1.5rem; |
|
border-radius: 10px; |
|
box-shadow: 0 4px 6px rgba(0,0,0,0.1); |
|
margin-bottom: 2rem; |
|
margin-top: 0.5rem; /* Reduced top margin */ |
|
} |
|
|
|
.concept-title { |
|
font-size: 1.5rem; |
|
font-weight: bold; |
|
color: #2c3e50; |
|
padding-bottom: 0.5rem; |
|
border-bottom: 2px solid #3498db; |
|
margin-bottom: 1.5rem; |
|
margin-top: 0; /* Remove top margin from title */ |
|
} |
|
|
|
/* Additional style to reduce space at the top of the output area */ |
|
.stMarkdown { |
|
margin-top: 0 !important; |
|
padding-top: 0 !important; |
|
} |
|
|
|
/* Ensure the first concept has minimal top margin */ |
|
.creative-concept-card:first-child { |
|
margin-top: 0; |
|
} |
|
|
|
.concept-section { |
|
margin-bottom: 1.5rem; |
|
} |
|
|
|
.section-header { |
|
font-size: 1.2rem; |
|
font-weight: bold; |
|
color: #3498db; |
|
margin-bottom: 0.5rem; |
|
} |
|
|
|
.section-content { |
|
font-size: 1.1rem; |
|
line-height: 1.5; |
|
} |
|
|
|
.analogy { |
|
color: #e74c3c; |
|
font-weight: bold; |
|
} |
|
</style> |
|
""" |
|
|
|
return css + html |
|
|
|
def format_story_output(story_text): |
|
return f""" |
|
<div class="story-output"> |
|
{story_text} |
|
</div> |
|
""" |