Spaces:
Running
on
Zero
Running
on
Zero
File size: 5,364 Bytes
8824f88 a7f5e8b 60e16da b507d58 60e16da 94c9a27 60e16da 94c9a27 60e16da b507d58 60e16da 8824f88 60e16da |
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 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 |
#!/usr/bin/env python
import gradio as gr
# CSS perso pour :
# 1) Le fond pastel
# 2) La barre de navigation
# 3) Les nuages + positionnement
custom_css = """
/* Fond pastel sur toute la page */
html, body {
margin: 0; padding: 0;
height: 100%;
background: linear-gradient(135deg, #FDE2E2, #E2ECFD) !important;
font-family: 'Arial', sans-serif;
}
/* Barre de navigation */
.nav-bar {
display: flex;
align-items: center;
justify-content: space-between;
padding: 0.5rem 2rem;
background-color: #fbe8d3; /* Couleur très légère pour la barre */
}
.nav-left, .nav-right {
display: flex;
align-items: center;
}
.nav-logo {
font-size: 1.5rem;
font-weight: bold;
margin-right: 2rem;
}
.nav-links a {
margin-right: 1.5rem;
text-decoration: none;
color: #8c5b3e;
font-weight: 500;
}
.nav-links a:hover {
text-decoration: underline;
}
/* Conteneur principal au centre (pour le robot + nuages) */
.main-container {
position: relative;
width: 100%;
max-width: 600px;
height: 600px;
margin: 1rem auto;
text-align: center;
}
/* Style de l'icône robot */
.robot-icon {
width: 80px;
margin: 1rem auto;
}
/* Texte sous le robot */
.title-consent {
font-size: 1.2rem;
font-weight: bold;
margin-bottom: 0.3rem;
}
.subtitle-consent {
font-size: 0.9rem;
color: #333;
margin-bottom: 1.2rem;
}
/* Positionnement et style des nuages */
.cloud {
position: absolute;
width: 130px;
padding: 0.5rem;
background: #fff;
border-radius: 50px;
box-shadow: 0 2px 4px rgba(0,0,0,0.2);
cursor: pointer;
transition: transform 0.2s;
text-align: center;
font-size: 0.9rem;
}
.cloud:hover {
transform: scale(1.05);
}
/* 5 nuages : positionnés autour du centre */
.cloud1 { top: 5%; left: 40%; }
.cloud2 { top: 30%; left: 10%; }
.cloud3 { top: 30%; right: 10%; }
.cloud4 { bottom: 10%; left: 20%; }
.cloud5 { bottom: 10%; right: 20%; }
/* Pied de page ou zone pour le chat */
.footer-chat {
margin-top: 2rem;
}
/* Couleur du texte dans la zone markdown */
.markdown-prose {
color: #000 !important;
}
"""
# HTML pour la barre de navigation
nav_bar_html = """
<div class="nav-bar">
<div class="nav-left">
<div class="nav-logo">LÉLI</div>
</div>
<div class="nav-right nav-links">
<a href="#">Pourquoi ?</a>
<a href="#">Discute avec Léli</a>
<a href="#">Contacts utiles</a>
</div>
</div>
"""
# HTML pour la zone centrale (robot + nuages).
# onclick="cloudClicked('xxxx')" => appelle une fonction JS
main_html = """
<div class="main-container">
<!-- Robot icône -->
<img src="https://cdn-icons-png.flaticon.com/512/6188/6188530.png" class="robot-icon" alt="Robot" />
<!-- Titre et sous-titre -->
<div class="title-consent">LE CONSENTEMENT</div>
<div class="subtitle-consent">Clique sur un nuage pour en découvrir le contenu</div>
<!-- Nuages -->
<div class="cloud cloud1" onclick="cloudClicked('Ce que c’est')">Ce que c'est</div>
<div class="cloud cloud2" onclick="cloudClicked('Ce que ce n’est pas')">Ce que ce n’est pas</div>
<div class="cloud cloud3" onclick="cloudClicked('Les risques si tu ne le respectes pas')">Les risques si tu ne le respectes pas</div>
<div class="cloud cloud4" onclick="cloudClicked('Mise en situation')">Mise en situation</div>
<div class="cloud cloud5" onclick="cloudClicked('Comment faire en pratique')">Comment faire en pratique</div>
</div>
<script>
function cloudClicked(message) {
// Sélectionner la zone de texte du chat (Placeholder: "Type a message...")
let textBox = document.querySelector('textarea[placeholder="Type a message..."]');
if (textBox) {
textBox.value = message;
// Facultatif : automatiquement "envoyer" le message ?
// On peut simuler un Enter, etc. Mais souvent on laisse l'utilisateur cliquer "Send".
}
}
</script>
"""
def dummy_chatbot(user_input, history):
"""
Exemple de fonction simple pour répondre dans le chat.
- user_input: question de l’utilisateur
- history: historique [(user_msg, bot_msg), ...]
"""
history = history or []
# Pour l’exemple : on se contente de renvoyer un message "Réponse".
# À remplacer par votre propre logique, ou un modèle HF.
bot_message = f"Voici un contenu sur : {user_input}"
history.append((user_input, bot_message))
return history
with gr.Blocks(css=custom_css) as demo:
# La barre de navigation
gr.HTML(nav_bar_html)
# La zone "robot + nuages"
gr.HTML(main_html)
# Le chatbot en bas
with gr.Box(elem_id="footer-chat"):
chatbot = gr.Chatbot()
msg = gr.Textbox(
label="Pose ta question à Léli",
placeholder="Type a message...",
show_label=False
)
submit_btn = gr.Button("Send")
def respond(user_input, chat_history):
return dummy_chatbot(user_input, chat_history)
submit_btn.click(
fn=respond,
inputs=[msg, chatbot],
outputs=chatbot
)
# Optional: envoyer au "Enter" direct
msg.submit(
fn=respond,
inputs=[msg, chatbot],
outputs=chatbot
)
if __name__ == "__main__":
demo.launch()
|