1
0
forked from orson/bachemap

style changes, fixed login flow and modals

This commit is contained in:
Orson 2025-03-07 15:55:11 -06:00
parent ffcbaff534
commit 3a903736e4
13 changed files with 502 additions and 198 deletions

66
app.py
View File

@ -244,31 +244,55 @@ def create_app(config=Config):
@app.route('/leaderboard') @app.route('/leaderboard')
def leaderboard(): def leaderboard():
leaders = mongo.db.pins.aggregate([ pipeline = [
{"$group": {"_id": "$added_by", "count": {"$sum": 1}}}, {"$group": {"_id": "$added_by", "count": {"$sum": 1}}},
{"$sort": {"count": -1}}, {"$sort": {"count": -1}},
{"$limit": 10}, {"$limit": 10},
{"$lookup": { ]
"from": "users",
"localField": "_id", # Convert the aggregation result to a list
"foreignField": "_id", leaders_by_id = list(mongo.db.pins.aggregate(pipeline))
"as": "user_info"
}}, # Create a list to store the final results
{"$unwind": "$user_info"}, cleaned_leaders = []
{"$project": {"_id": 0, "username": "$user_info.username", "count": 1}}
]) # Process each leader
#print(list(leaders)) for leader in leaders_by_id:
cleaned_leaders=list() user_id = leader["_id"]
print(cleaned_leaders) count = leader["count"]
for leader in list(leaders):
leader["username"] = leader["username"][0]+"***"+leader["username"][-1] # Find the corresponding user
cleaned_leaders.append(leader) try:
if current_user.is_authenticated: user = mongo.db.users.find_one({"_id": ObjectId(user_id)})
username = current_user.username if user and "username" in user:
else: username = user["username"]
username = None if len(username) >= 2:
cleaned_username = username[0] + "***" + username[-1]
else:
cleaned_username = username
cleaned_leaders.append({"username": cleaned_username, "count": count})
except Exception as e:
print(f"Error processing user_id {user_id}: {e}")
continue
print('THIS IS THE LEADERBOARD', cleaned_leaders)
# Get stats using aggregation pipeline
# Count total users
total_users_result = list(mongo.db.users.aggregate([
{"$count": "total"}
]))
total_users = total_users_result[0]["total"] if total_users_result else 0
return render_template('leaderboard.html', leaders=cleaned_leaders, username=username) # Count unique users who have added pins
active_users_result = list(mongo.db.pins.aggregate([
{"$group": {"_id": None, "active_users": {"$addToSet": "$added_by"}}},
{"$project": {"active_count": {"$size": "$active_users"}}}
]))
active_users = active_users_result[0]["active_count"] if active_users_result else 0
# Calculate percentage (handle case where total_users might be 0)
active_percentage = round((active_users / total_users) * 100, 1) if total_users > 0 else 0
return render_template('leaderboard.html', leaders=cleaned_leaders, percentage = active_percentage)
return app return app

View File

@ -0,0 +1,14 @@
<svg width="200" height="200" xmlns="http://www.w3.org/2000/svg">
<!-- Map pin -->
<circle cx="100" cy="40" r="12" fill="#4A90E2"/>
<path d="M50,55 Q60,45 70,55 Q80,65 90,55" stroke="#888" stroke-width="3" fill="none" stroke-linecap="round"/>
<path d="M100,45 L105,60 L95,60 Z" fill="#fff"/>
<!-- Pothole shape -->
<ellipse cx="100" cy="90" rx="40" ry="10" fill="#bbb" stroke="#777" stroke-width="2" />
<!-- Typography -->
<text x="100" y="130" font-family="Montserrat, sans-serif" font-size="16" fill="#333" text-anchor="middle">
Bachemapa
</text>
</svg>

After

Width:  |  Height:  |  Size: 580 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 KiB

BIN
static/images/bg-trees.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 159 KiB

BIN
static/images/favico.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 240 KiB

View File

@ -1,175 +1,322 @@
:root {
/* Color palette */
--primary-color: rgba(202, 216, 3, 0.9);
--secondary-color: green;
--accent-color: rgb(255, 136, 0);
--background-color: rgb(205, 243, 148);
--text-color: #333;
--shadow-color: rgba(0, 0, 0, 0.2);
/* Spacing */
--spacing-sm: 0.5rem;
--spacing-md: 1rem;
--spacing-lg: 1.5rem;
}
/* Base styles */
body, html { body, html {
font-family: Arial, sans-serif; font-family: 'Segoe UI', Arial, sans-serif;
margin: 0; margin: 0;
padding: 0px; padding: 0;
overflow: hidden; overflow: hidden;
height: 100%; height: 100%;
width: 100%; width: 100%;
color: var(--text-color);
}
::selection {
background-color: var(--accent-color);
color: white;
} }
h1 { h1 {
text-align: center; text-align: center;
position: relative;
} }
section#pinner-modal form { h1::after {
max-width: 400px; content: '';
margin: 0 auto; display: block;
padding: 20px; width: 50px;
border: 1px solid #ccc; height: 3px;
border-radius: 5px; background-color: var(--accent-color);
background-color: rgba(202, 216, 3, 0.7); margin: 8px auto;
font-size: 100%; border-radius: 2px;
}
form p {
margin: 10px 0;
} }
/* Layout */
#map { #map {
width: 100%; width: 100%;
height: 100vh; height: 100vh;
margin: 0 0;
position: relative; position: relative;
} }
main { main {
margin:0; margin: 0;
padding:0; padding: 0;
position: absolute; position: absolute;
top: 0; top: 0;
left: 0; left: 0;
}
.info {
padding: 1rem;
padding-bottom: 6rem;
}
div#qrgen img {
padding-left: 0;
padding-right: 0;
margin-left: auto;
margin-right: auto;
display: block;
}
section#pinner-modal {
position: absolute;
top: 7vh;
left: 0rem;
color: white;
padding: 1rem;
text-align: left;
transition: bottom 0.5s ease;
box-shadow: 0px -4px 15px rgba(0, 0, 0, 0.2);
z-index: 999;
display: flex;
flex-shrink: 1;
}
section.pinner-modal.active {
bottom: 0;
background-color: rgba(202, 216, 3, 0.7);
}
section.pinner-modal form {
background-color: rgba(202, 216, 3, 0.7);
}
nav {
position:absolute;
top:0;
left: 0;
right: 0;
background-color: rgba(202, 216, 3, 0.7);
padding: 5px;
z-index: 1000;
font-size: 100%;
overflow: hidden;
padding-right: 0.1rem;
}
nav ul {
flex-wrap: wrap;
}
nav ul li {
padding-top: 0;
padding-bottom: 0;
flex:1 1 auto;
}
.leaflet-marker-icon {
background-color: transparent !important;
border: rgba(0, 0, 0, 0);
padding: 0;
margin: 0;
}
.marker-cluster {
background-color: greenyellow !important;
border-radius: 100px;
}
.fa, .far, .fas {
color:black;
text-shadow: -1px 0 rgb(255, 136, 0), 0 1px rgb(255, 136, 0), 1px 0 rgb(255, 136, 0), 0 -1px rgb(255, 136, 0);
margin-left: -10px;
margin-top: -10px;
font-size: 1.5rem;
filter:drop-shadow(0 0 0.2rem orange);
}
path-derping {
fill:orangered;
stroke: orangered;
stroke-width:1px;
stroke-dasharray: 2,2;
stroke-linejoin: round;
}
.flashes {
position: relative;
display: flex;
z-index: 1001;
border-radius: 20px;
background-color: rgba(202, 216, 3, 0.7);
top: 8%;
padding: 1rem;
border: black;
border-width: 1px;
-webkit-animation: cssAnimation 7s forwards;
animation: cssAnimation 7s forwards;
}
@keyframes cssAnimation {
0% {opacity: 1;}
90% {opacity: 1;}
100% {opacity: 0;}
}
@-webkit-keyframes cssAnimation {
0% {opacity: 1;}
90% {opacity: 1;}
100% {opacity: 0;}
}
#pinner-top {
background-color: green;
}
input#submit {
background-color: green;
}
button a {
color: black;
}
main {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
height: 100vh;
width: 100vw;
z-index: 5;
}
footer {
position: fixed;
bottom: 0;
max-height: 10vh;
text-align: left;
align-content: left;
font-size: 0.8rem;
background-color:rgba(202, 216, 3, 0.7);
width: 100%;
border-top: 1px solid greenyellow;
padding-left: 15%;
padding-right:15%;
z-index: 15;
}
article {
position: fixed;
top: 12%; /* Space for nav */
bottom: 10%; /* Space for footer */
left: 50%;
transform: translateX(-50%);
text-align: center;
z-index: 10;
max-height: calc(100vh - 90px); /* Adjust based on nav and footer heights */
overflow-y: auto;
width: 80%;
display: block;
flex-direction: column;
justify-content: center;
}
.info {
padding: var(--spacing-md);
padding-bottom: 6rem;
background-color: rgba(255, 255, 255, 0.85);
border-radius: 8px;
box-shadow: 0 4px 12px var(--shadow-color);
}
/* Navigation */
nav {
position: absolute;
top: 0;
left: 0;
right: 0;
padding-left: 10vw;
padding-right:10vw;
background-color: rgba(189, 216, 3, 0.24);
/* padding: var(--spacing-sm); */
z-index: 1000;
font-size: 100%;
overflow: hidden;
box-shadow: 0 2px 10px var(--shadow-color);
backdrop-filter: blur(5px);
}
nav ul {
display: flex;
flex-wrap: wrap;
gap: var(--spacing-sm);
padding: 0 var(--spacing-sm);
}
nav ul li {
padding: 0;
flex: 1 1 auto;
list-style: none;
}
/* Buttons */
button {
transition: all 0.3s ease;
position: relative;
overflow: hidden;
background-color: var(--accent-color);
}
button::after {
content: '';
position: absolute;
height: 100%;
width: 100%;
top: 0;
left: -100%;
background: linear-gradient(90deg, transparent, rgba(255,255,255,0.3), transparent);
transition: left 0.5s ease;
}
button:hover::after {
left: 100%;
}
#pinner-top {
background-color: var(--secondary-color);
color: white;
border-radius: 4px;
}
button a {
color: white;
text-decoration: none;
}
/* Form elements */
input, select, textarea {
border: 1px solid #ddd;
border-radius: 4px;
padding: 8px;
transition: border 0.3s ease;
width: 100%;
}
input:focus, select:focus, textarea:focus {
outline: none;
border-color: var(--accent-color);
box-shadow: 0 0 0 2px rgba(255, 136, 0, 0.2);
}
input#submit {
background-color: var(--secondary-color);
color: white;
font-weight: bold;
cursor: pointer;
padding: 10px;
}
input#submit:hover {
background-color: #008800;
transform: translateY(-2px);
} }
#lng, #lat { #lng, #lat {
font-size: 0.8rem; font-size: 0.8rem;
background-color: grey; background-color: grey;
color: white;
border-radius: 3px;
padding: 4px 8px;
}
/* Modal */
section#pinner-modal {
position: absolute;
top: 10vh;
left:10%;
color: var(--text-color);
padding: var(--spacing-md);
text-align: left;
animation: fadeIn 0.5s forwards;
box-shadow: 0 4px 20px var(--shadow-color);
z-index: 999;
display: flex;
flex-shrink: 1;
border-radius: 8px;
max-height: 80vh;
overflow-y: auto;
background-color: rgba(189, 216, 3, 0.24);
backdrop-filter: blur(5px);
}
section#pinner-modal form {
max-width: 400px;
margin: 0 auto;
padding: var(--spacing-md);
border-radius: 8px;
background-color: var(--primary-color);
font-size: 100%;
}
section#pinner-modal::-webkit-scrollbar {
width: 8px;
}
section#pinner-modal::-webkit-scrollbar-thumb {
background-color: var(--accent-color);
border-radius: 10px;
}
/* Map elements */
.leaflet-marker-icon {
background-color: transparent !important;
border: none;
padding: 0;
margin: 0;
transition: transform 0.3s ease;
}
.leaflet-marker-icon:hover {
transform: scale(1.2);
}
.marker-cluster {
background-color: greenyellow !important;
border-radius: 100px;
box-shadow: 0 0 10px rgba(172, 255, 47, 0.7);
animation: pulse 2s infinite;
}
.fa, .far, .fas {
color: black;
text-shadow: -1px 0 var(--accent-color), 0 1px var(--accent-color),
1px 0 var(--accent-color), 0 -1px var(--accent-color);
margin-left: -10px;
margin-top: -10px;
font-size: 1.5rem;
filter: drop-shadow(0 0 0.2rem var(--accent-color));
}
/* Notifications */
.flashes {
position: relative;
display: flex;
z-index: 1001;
border-radius: 20px;
background-color: rgba(189, 216, 3, 0.6);
top: 8%;
padding: var(--spacing-md);
border: 2px solid rgba(0, 0, 0, 0.1);
box-shadow: 0 4px 15px var(--shadow-color);
animation: fadeOut 15s forwards;
}
/* Animations */
@keyframes fadeOut {
0% { opacity: 1; transform: translateY(0); }
90% { opacity: 1; transform: translateY(0); }
100% { opacity: 0; transform: translateY(-20px); }
}
@keyframes fadeIn {
0% { opacity: 0; transform: translateY(0); }
90% { opacity: 1; transform: translateY(0); }
}
@keyframes pulse {
0% { transform: scale(1); }
50% { transform: scale(1.05); }
100% { transform: scale(1); }
}
/* Media queries for responsiveness */
@media (max-width: 768px) {
section#pinner-modal {
width: 90%;
left: 5%;
right: 5%;
}
img#logo {
max-height: 5vh;
}
nav {
height: 10vh;
}
nav ul {
justify-content: center;
}
} }

View File

@ -1,6 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html data-theme="light" lang="es" style="background-color: rgb(205, 243, 148); color: black;"> <html data-theme="light" lang="es" style="background-color: rgb(205, 243, 148); color: black;">
<head> <head>
<!-- BASE !-->
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<title>Bachemapa - Mapa interactivo de baches y otras cosas</title> <title>Bachemapa - Mapa interactivo de baches y otras cosas</title>
@ -47,13 +48,26 @@
<body class="" style="color: black;"> <body class="" style="color: black;">
<nav style="height: auto;"> <nav style="height: auto;">
<ul> <ul>
<a href="/"><li><h3 style="margin-bottom: 0;">Bachemapa</h3></li></a> <a href="/">
<li style="display: flex; align-items: center;">
<img id="logo" src="{{ url_for('static', filename='images/bachemapalogo.png') }}" alt="Bachemapa Logo" style="height: 10vh; margin-right: 10px;">
<h3 style="margin-bottom: 0;"><span style="color: #4a8522;">Bache</span><span style="color: #fa8721;">mapa</span></h3>
</li>
</a>
</ul>
<ul>
<div id="login-placeholder">
</div>
</ul> </ul>
<ul> <ul>
{% if current_user.is_authenticated %}
<li><button id="pinner-top">Agregar</button></li> <li><button id="pinner-top">Agregar</button></li>
<li><button><a href="/logout">Cerrar Sesión</a></button></li>
{% else %}
<li><button><a href="/thelogin">Iniciar Sesión</a></button></li>
{% endif %}
<li><button><a href="/quienes">Somos</a></button></li> <li><button><a href="/quienes">Somos</a></button></li>
{% if current_user.is_authenticated %} {% if current_user.is_authenticated %}
<li><button><a href="/dashboard">Perfil</a></button></li> <li><button><a href="/dashboard">Perfil</a></button></li>
@ -78,12 +92,14 @@
<section id="pinner-modal" style="" hidden="true"> <section id="pinner-modal" style="" hidden="true">
{% if current_user.is_authenticated %} {% if current_user.is_authenticated %}
{% include 'add_pin.html' %} {% include 'add_pin.html' %}
</section>
{% else %} {% else %}
<div class="flashes"> <div class="flashes">
<h3>Seguramente quieres hacer <a href="{{ url_for('thelogin') }}">login</a></h3> <h3>Seguramente quieres hacer <a href="{{ url_for('thelogin') }}">login</a></h3>
</div> </div>
{% endif %}
</section> </section>
{% endif %}
</main> </main>
</body> </body>

View File

@ -7,7 +7,7 @@
overflow-y: scroll; overflow-y: scroll;
} }
</style> </style>
<div style="padding-top: 30px;"> <div class="container-fluid" style="padding-top: 30px; max-width: 75vw; background-color: rgba(189, 216, 3, 0.9)">
<h3>Hola <span style="color: darkgreen;">{{current_user.username}}</span></h3> <h3>Hola <span style="color: darkgreen;">{{current_user.username}}</span></h3>
<p>Aquí puedes ver los pines que has agregado y consultar tu enlace/QR de invitación. Cada vez que recargas esta página, tu enlace de invitacón cambia y el anterior se vuelve inválido.</p> <p>Aquí puedes ver los pines que has agregado y consultar tu enlace/QR de invitación. Cada vez que recargas esta página, tu enlace de invitacón cambia y el anterior se vuelve inválido.</p>
<div class="grid" style="padding-bottom: 2rem;"> <div class="grid" style="padding-bottom: 2rem;">

View File

@ -1 +1,3 @@
<footer style="position: fixed;bottom: 0px;text-align: center;align-content: center; background-color:rgba(202, 216, 3, 0.7); width: 100%; border-top: 1px; border-color: greenyellow">Desarrollado por Kernel Panic Room, dominio patrocinado por el programa RSE de <a href="https://qro.mx">Qro.mx</a>. Si tienes dudas, comentarios, recomendaciones o quieres reportar un error, únete a nuestro canal de Telegram <a href="https://t.me/bachemapa">aquí</a></footer> <footer>
<p>Desarrollado por Kernel Panic Room, dominio patrocinado por el programa RSE de <a href="https://qro.mx">Qro.mx</a>. Si tienes dudas, comentarios, recomendaciones o quieres reportar un error, únete a nuestro canal de Telegram <a href="https://t.me/bachemapa">aquí</a></p>
</footer>

View File

@ -1,19 +1,69 @@
{% extends 'secondbase.html' %} {% extends 'secondbase.html' %}
{% block content %} {% block content %}
<div class="container grid" style="background-color: rgba(189, 216, 3, 0.8); padding:2rem">
<h2>Aquí puedes consultar quiénes están contribuyendo. Por cuestiones de privacidad, los nombres están modificados, pero si sabes, sabes</h2> <h2>Aquí puedes consultar quiénes están contribuyendo. Por cuestiones de privacidad, los nombres están modificados, pero si sabes, sabes</h2>
<table> </div>
<thead> <div class="container grid" style="background-color: rgba(189, 216, 3, 0.8); padding:2rem">
<tr> <table>
<th scope="col">Mapista</th> <thead>
<th scope="col">Marcador</th> <tr>
</tr> <th scope="col">Mapista</th>
</thead> <th scope="col">Marcador</th>
<tbody> </tr>
{% for leader in leaders %} </thead>
<th scope="row">{{leader.username}}</th> <tbody>
<th scope="row">{{leader.count}}</th> {% for leader in leaders %}
{% endfor %} <tr>
</tbody> <td scope="row">{{leader.username}}</td>
</table> <td scope="row">{{leader.count}}</td>
</tr>
{% endfor %}
</tbody>
</table>
<div>
<h3>Porcentaje de usuarios activos</h3>
<div class="chart-container" style="position: relative; height:300px; width:300px; margin: 0 auto;">
<canvas id="activeUsersChart"></canvas>
</div>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
const ctx = document.getElementById('activeUsersChart').getContext('2d');
const activePercentage = {{ percentage }};
const inactivePercentage = 100 - activePercentage;
new Chart(ctx, {
type: 'pie',
data: {
labels: ['Usuarios Activos', 'Usuarios Inactivos'],
datasets: [{
data: [activePercentage, inactivePercentage],
backgroundColor: [
'green',
'blue'
],
borderColor: [
'rgba(75, 192, 192, 1)',
'rgba(201, 203, 207, 1)'
],
borderWidth: 1
}]
},
options: {
responsive: true,
plugins: {
legend: {
position: 'top',
},
title: {
display: true,
text: 'Distribución de Usuarios Activos'
}
}
}
});
});
</script>
</div>
</div>
{% endblock %} {% endblock %}

View File

@ -1,19 +1,52 @@
{% extends 'secondbase.html' %} {% extends 'secondbase.html' %}
{% block content %} {% block content %}
<div class="container" style="display: flex; justify-content: center; align-items: center; min-width: 40vw; flex-direction: column;">
<style> <style>
form { form {
max-width: 80vw;
padding: 40px; padding: 40px;
} }
.flash-message {
position: fixed;
top: 20vh;
left: 50%;
transform: translateX(-50%);
background-color: #f44336;
color: white;
padding: 15px;
border-radius: 4px;
z-index: 100;
text-align: center;
box-shadow: 0 4px 8px rgba(0,0,0,0.2);
max-width: 80%;
}
</style> </style>
{% if messages %}
<div id="flash-message" class="flash-message">
{{ messages }}
</div>
<script>
setTimeout(function() {
var flashMessage = document.getElementById('flash-message');
if (flashMessage) {
flashMessage.style.display = 'none';
}
}, 3000);
</script>
{% endif %}
<form method="post" enctype="multipart/form-data" style="background-color: rgb(205, 243, 148);"> <form method="post" enctype="multipart/form-data" style="background-color: rgb(205, 243, 148);">
{{ form.csrf_token }} {{ form.csrf_token }}
{{ form.hidden_tag() }} {{ form.hidden_tag() }}
{{ form.username.label }}<br> {{ form.username.label }}
{{ form.username() }} {{ form.username() }}
{{ form.pwd.label }} {{ form.pwd.label }}
{{ form.pwd() }} {{ form.pwd() }}
<p>{{ form.submit() }}</p> <p>{{ form.submit() }}</p>
</form> </form>
</div>
{% endblock %} {% endblock %}

View File

@ -1,7 +1,7 @@
{% extends 'secondbase.html' %} {% extends 'secondbase.html' %}
{% block content %} {% block content %}
<div class="info" style=""> <article class="info" style="">
<h4>Somos civiles y voluntari@s</h4> <h4>Somos civiles y voluntari@s</h4>
<p>Esta página es un servicio comunitario desarrollado por el hackspace Kernel Panic Room, con un (maravilloso) dominio patrocinado por el programa de RSE de <a href="https://qro.mx">Qro.mx</a>.</p> <p>Esta página es un servicio comunitario desarrollado por el hackspace Kernel Panic Room, con un (maravilloso) dominio patrocinado por el programa de RSE de <a href="https://qro.mx">Qro.mx</a>.</p>
<p>Nuestro objetivo es construir un puente entre la ciudadanía y las autoridades estatales y municipales para poder recabar, catalogar y visibilizar los problemas infraestructurales de nuestra entidad, con el fin de facilitar que se solucionen.</p> <p>Nuestro objetivo es construir un puente entre la ciudadanía y las autoridades estatales y municipales para poder recabar, catalogar y visibilizar los problemas infraestructurales de nuestra entidad, con el fin de facilitar que se solucionen.</p>
@ -13,5 +13,5 @@
<p>Nos volveremos a ver, amigo José Luis, y rodaremos juntos de nuevo. Esperamos que te estés riendo desde las alturas de tu vuelo.</p> <p>Nos volveremos a ver, amigo José Luis, y rodaremos juntos de nuevo. Esperamos que te estés riendo desde las alturas de tu vuelo.</p>
<img src="{{url_for('static', filename='images/ramos.jpg')}}"> <img src="{{url_for('static', filename='images/ramos.jpg')}}">
</div> </article>
{% endblock %} {% endblock %}

View File

@ -1,12 +1,12 @@
<!DOCTYPE html> <!DOCTYPE html>
<html data-theme="light" lang="es" style="background-color: rgb(205, 243, 148); color: black; overflow-y:scroll"> <html data-theme="light" lang="es" style="background-color: rgb(205, 243, 148); color: black; height: 100%;">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<title>Mapa interactivo de baches y otras cosas</title> <title>Mapa interactivo de baches y otras cosas</title>
<link rel="stylesheet" href="{{ url_for('static', filename='pico.amber.css') }}"> <link rel="stylesheet" href="{{ url_for('static', filename='pico.amber.css') }}">
<link rel="icon" type="image/png" href="{{ url_for('static', filename='favico.ico') }}">
<link rel="stylesheet" href="{{ url_for('static', filename='styles.css') }}"> <link rel="stylesheet" href="{{ url_for('static', filename='styles.css') }}">
<meta name="description" content="Bachemapa es una plataforma dedicada a documentar y reportar problemas con el desarrollo urbano en Querétaro, México. Encuentra y aporta información actualizada sobre baches, deficiencias en infraestructura y más."> <meta name="description" content="Bachemapa es una plataforma dedicada a documentar y reportar problemas con el desarrollo urbano en Querétaro, México. Encuentra y aporta información actualizada sobre baches, deficiencias en infraestructura y más.">
@ -32,18 +32,24 @@
<link rel="canonical" href="https://baches.qro.mx"> <link rel="canonical" href="https://baches.qro.mx">
<!-- Versión pública 0.1 --> <!-- Versión pública 0.1 -->
</head> </head>
<body style="color: black;"> <body style="color: black; height: 100%; margin: 0;">
<nav style="height: auto; align-items:center"> <nav style="height: auto;">
<ul> <ul>
<a href="/"><li><h3 style="margin-bottom: 0;">Bachemapa</h3></li></a> <a href="/">
<li style="display: flex; align-items: center;">
<img id="logo" src="{{ url_for('static', filename='images/bachemapalogo.png') }}" alt="Bachemapa Logo" style="height: 10vh; margin-right: 10px;">
<h3 style="margin-bottom: 0;"><span style="color: #4a8522;">Bache</span><span style="color: #fa8721;">mapa</span></h3>
</li>
</a>
</ul> </ul>
<ul> <ul>
<li><button id="pinner-top"><a href="/">Al mapa</a></button></li>
<li><button id="pinner-top" ><a href="/">Al mapa</a></button></li>
<li><button><a href="/quienes">Somos</a></button></li> <li><button><a href="/quienes">Somos</a></button></li>
{% if current_user.is_authenticated %} {% if current_user.is_authenticated %}
<li><button style="background-color: rgb(241, 165, 0);"><a href="/logout">Salir</a></button></li> <li><button><a href="/dashboard">Perfil</a></button></li>
{% endif %} {% endif %}
</ul> </ul>
</nav> </nav>
@ -58,7 +64,7 @@
</div> </div>
{% endif %} {% endif %}
{% endwith %} {% endwith %}
<main class="container-fluid" style="display:block; margin-top:100px;"> <main class="container-fluid" style="display:block; margin-top:100px; height: calc(100vh - 100px); overflow-y: auto;">
{% block content %} {% block content %}
@ -67,5 +73,17 @@
</main> </main>
</body> </body>
{% include 'footer.html' %} {% include 'footer.html' %}
<style>
html, body {
height: 100%;
margin: 0;
padding: 0;
}
body {
background-image: url("{{ url_for('static', filename='images/bg-trees.jpg') }}");
background-size: cover;
}
</style>
</html> </html>