diff --git a/.gitignore b/.gitignore index bab2e5c..b3341aa 100644 --- a/.gitignore +++ b/.gitignore @@ -36,5 +36,4 @@ Pipfile.lock *.envrc .env -File/ Qr/ diff --git a/Comunicados.json b/Comunicados.json new file mode 100644 index 0000000..ce9bca0 --- /dev/null +++ b/Comunicados.json @@ -0,0 +1,26 @@ +[ + { + "titulo": "Nueva Actualización", + "autor": "@Nioy - Developer", + "texto": "Mejor formato, ajuste de la forma visual de la web y corrección de errores menores.", + "fecha": "2025-04-20T00:00:00Z" + }, + { + "titulo": "Nueva Actualización", + "autor": "@Nioy - Developer", + "texto": "En esta actualización, presentamos un nuevo apartado diseñado para mantener informada a nuestra comunidad sobre actualizaciones, reclamos y la incorporación de nuevos miembros a nuestro equipo de desarrollo.", + "fecha": "2025-04-02T00:00:00Z" + }, + { + "titulo": "Aviso Importante", + "autor": "@Admin - Support", + "texto": "Hemos implementado mejoras en la sección de publicaciones de la comunidad, así como un nuevo apartado de sugerencias para que los usuarios puedan contribuir con ideas para optimizar la plataforma.", + "fecha": "2025-04-05T00:00:00Z" + }, + { + "titulo": "Nuevo Logo de Favicon y Compartir", + "autor": "@Admin - Support", + "texto": "Hemos agregado un nuevo logo como favicon para la web y una imagen representativa para mostrar al compartir la web en redes sociales. Ahora, la experiencia visual es más coherente y atractiva.", + "fecha": "2025-04-05T00:00:00Z" + } +] diff --git a/Funciones/Qr_Generator.py b/Funciones/Qr_Generator.py deleted file mode 100644 index b27f4ce..0000000 --- a/Funciones/Qr_Generator.py +++ /dev/null @@ -1,30 +0,0 @@ -import qrcode as qr -import socket as sok -from PIL import Image - -def Generar_QR(): - # Obtenemos la dirección IP de la máquina - hostname = sok.gethostname() - Ip = sok.gethostbyname(hostname) - - Urls = "http://" + Ip + ":5000/" - - New_QR = qr.QRCode(version=1, box_size=100, border=0) - New_QR.add_data(Urls) - New_QR.make(fit=True) - - img = New_QR.make_image(fill='black', back_color='white') - - logo = Image.open("./static/Logo/icono.png") - - imgW, imgH = img.size - Logo_size = imgW // 4 - logo = logo.resize((Logo_size, Logo_size)) - - logo_x = (imgW - Logo_size) // 2 - logo_y = (imgH - Logo_size) // 2 - - img.paste(logo,(logo_x,logo_y), logo) - - img.save('./static/QR/Qr.png') - diff --git a/Procfile b/Procfile new file mode 100644 index 0000000..8001d1a --- /dev/null +++ b/Procfile @@ -0,0 +1 @@ +web: gunicorn app:app \ No newline at end of file diff --git a/app.py b/app.py index 1042639..410a6b2 100644 --- a/app.py +++ b/app.py @@ -1,89 +1,207 @@ -from flask import Flask, redirect, render_template, send_file, request -from Funciones import Qr_Generator +from flask import Flask, redirect, render_template, send_file, request, jsonify, session from Funciones import Show_File as Show_File -from flask_socketio import SocketIO, send +from flask_socketio import SocketIO import os -import webbrowser -import socket as sok +import json +import secrets Files_Carpet = './static/File/' - app = Flask(__name__) -app.config['SECRET_KEY'] = 'secret' +app.secret_key = secrets.token_hex(16) socketio = SocketIO(app) -Qr_Generator.Generar_QR() +REACTIONS_FILE = 'reactions.json' + +USER_REACTIONS_FILE = 'user_reactions.json' + +def init_reactions(): + if not os.path.exists(REACTIONS_FILE): + with open(REACTIONS_FILE, 'w') as f: + json.dump({}, f) + + + with open(REACTIONS_FILE, 'r') as f: + try: + return json.load(f) + except json.JSONDecodeError: + return {} + +def init_user_reactions(): + if not os.path.exists(USER_REACTIONS_FILE): + with open(USER_REACTIONS_FILE, 'w') as f: + json.dump({}, f) + + + with open(USER_REACTIONS_FILE, 'r') as f: + try: + return json.load(f) + except json.JSONDecodeError: + return {} + + +def save_reactions(reactions_data): + with open(REACTIONS_FILE, 'w') as f: + json.dump(reactions_data, f) + + +def save_user_reactions(user_reactions_data): + with open(USER_REACTIONS_FILE, 'w') as f: + json.dump(user_reactions_data, f) + +@app.route('/login') +def Login(): + return render_template('Login.html') @app.route('/') def index(): + + if 'user_id' not in session: + session['user_id'] = secrets.token_hex(8) + File = Show_File.Show_File() + reactions = init_reactions() + user_reactions = init_user_reactions() + user_id = session['user_id'] + + for file in File: + file_id = file['nombre'] + if file_id in reactions: + file['likes'] = reactions[file_id].get('likes', 0) + file['dislikes'] = reactions[file_id].get('dislikes', 0) + file['love'] = reactions[file_id].get('love', 0) + file['laugh'] = reactions[file_id].get('laugh', 0) + + file['user_reacted'] = False + file['user_reaction'] = None + + if user_id in user_reactions and file_id in user_reactions[user_id]: + file['user_reacted'] = True + file['user_reaction'] = user_reactions[user_id][file_id] + else: + file['likes'] = 0 + file['dislikes'] = 0 + file['love'] = 0 + file['laugh'] = 0 + file['user_reacted'] = False + file['user_reaction'] = None + + # Calcula el total de reacciones + file['total_reacciones'] = file['likes'] + file['dislikes'] + file['love'] + file['laugh'] + + # Ordenar la lista por total de reacciones (de mayor a menor) + File.sort(key=lambda f: f['total_reacciones'], reverse=True) + return render_template('index.html', File=File) + +@app.route('/react//', methods=['POST']) +def react_to_file(file_name, reaction_type): + if request.method == 'POST': + + if 'user_id' not in session: + session['user_id'] = secrets.token_hex(8) + + user_id = session['user_id'] + reactions = init_reactions() + user_reactions = init_user_reactions() + + + if file_name not in reactions: + reactions[file_name] = {'likes': 0, 'dislikes': 0, 'love': 0, 'laugh': 0} + + + valid_reactions = ['likes', 'dislikes', 'love', 'laugh'] + if reaction_type not in valid_reactions: + return jsonify({"error": "Invalid reaction type"}), 400 + + + if user_id in user_reactions and file_name in user_reactions[user_id]: + old_reaction = user_reactions[user_id][file_name] + if old_reaction == reaction_type: + + reactions[file_name][reaction_type] -= 1 + del user_reactions[user_id][file_name] + if not user_reactions[user_id]: + del user_reactions[user_id] + else: + + reactions[file_name][old_reaction] -= 1 + reactions[file_name][reaction_type] += 1 + user_reactions[user_id][file_name] = reaction_type + else: + + reactions[file_name][reaction_type] += 1 + if user_id not in user_reactions: + user_reactions[user_id] = {} + user_reactions[user_id][file_name] = reaction_type + + save_reactions(reactions) + save_user_reactions(user_reactions) + + + response_data = reactions[file_name].copy() + if user_id in user_reactions and file_name in user_reactions[user_id]: + response_data['user_reaction'] = user_reactions[user_id][file_name] + else: + response_data['user_reaction'] = None + + return jsonify(response_data) + @app.route('/descarga/', methods=['GET']) def Descarga(File=''): if request.method == 'GET': try: Base_Ruta = os.path.dirname(__file__) Url_File = os.path.join(Base_Ruta, 'static/File', File) - + # Verificaciones de seguridad if not os.path.exists(Url_File): return "Archivo no encontrado", 404 - + if not os.path.isfile(Url_File): return "No es un archivo válido", 400 - + # Enviar archivo para descarga return send_file(Url_File, as_attachment=True, download_name=File) - + except Exception as e: - # Loguear error + print(f"Error al descargar archivo: {e}") return "Error al procesar la descarga", 500 else: # Si no es GET, redirigir de vuelta a la página principal return redirect('/') - @app.route('/update') def UpDate(): return render_template('Up_Data.html') -@app.route('/qrgenerator') -def QR_Generador(): - return render_template('Qr_Generator.html') - -@app.route('/qr') -def qr(): - Qr_Generator.Generar_QR() - return redirect('/qrgenerator') - @app.route('/upload', methods=['POST']) def update(): - if request.method == 'POST': - f = request.files['file'] - f.save(Files_Carpet+ f.filename) - return redirect('/update') - -def abrir_navegador(): - # Obtenemos la dirección IP de la máquina - hostname = sok.gethostname() - Ip = sok.gethostbyname(hostname) - - Urls = "http://" + Ip + ":5000/" - webbrowser.open(Urls) - -#abrir_navegador() - -@app.route('/chat') -def chat(): - return render_template('Chat.html') - -@socketio.on('message') -def Message(msg): - print('message' + msg) - send(msg, broadcast = True) + if request.method == 'POST': + # Obtener el archivo y el título desde el formulario + f = request.files['file'] + title = request.form['title'] # El título proporcionado en el formulario + + # Renombrar el archivo con el título y mantener su extensión original + file_extension = f.filename.split('.')[-1] # Obtener la extensión del archivo + new_filename = f"{title}.{file_extension}" # Renombrar el archivo + + # Guardar el archivo con el nuevo nombre + f.save(Files_Carpet + new_filename) + + return redirect('/') + +@app.route('/comunicados') +def Comunicados(): + with open('Comunicados.json', 'r') as file: + comunicados = json.load(file) + return render_template('Comunicados.html', comunicados=comunicados) + +@app.errorhandler(404) +def pagina_no_encontrada(error): + return render_template('404.html') if __name__ == '__main__': - Qr_Generator.Generar_QR() - socketio.run(app) \ No newline at end of file + socketio.run(app, host='0.0.0.0', port=5000, debug=True) + diff --git a/reactions.json b/reactions.json new file mode 100644 index 0000000..faa486c --- /dev/null +++ b/reactions.json @@ -0,0 +1 @@ +{"Metas.jpg": {"likes": 0, "dislikes": 0, "love": 100000, "laugh": 0}} \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index c18ecf9..717aa2c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,5 @@ qrcode==8.0 Flask==3.1.0 Werkzeug==3.1.3 -Flask-SocketIO==5.5.1 \ No newline at end of file +Flask-SocketIO==5.5.1 +gunicorn==21.2.0 \ No newline at end of file diff --git a/runtime.txt b/runtime.txt new file mode 100644 index 0000000..4b44813 --- /dev/null +++ b/runtime.txt @@ -0,0 +1 @@ +python-3.11.1 diff --git a/static/File/Logo_Gris.png b/static/File/Logo_Gris.png new file mode 100644 index 0000000..02ec370 Binary files /dev/null and b/static/File/Logo_Gris.png differ diff --git a/static/File/Logo_Rojo.png b/static/File/Logo_Rojo.png new file mode 100644 index 0000000..b0cf906 Binary files /dev/null and b/static/File/Logo_Rojo.png differ diff --git a/static/File/Logo_blanco.png b/static/File/Logo_blanco.png new file mode 100644 index 0000000..a9cad7a Binary files /dev/null and b/static/File/Logo_blanco.png differ diff --git a/static/File/Logo_negro.png b/static/File/Logo_negro.png new file mode 100644 index 0000000..470d7aa Binary files /dev/null and b/static/File/Logo_negro.png differ diff --git a/static/Logo/Freec.png b/static/Logo/Freec.png new file mode 100644 index 0000000..da27e6f Binary files /dev/null and b/static/Logo/Freec.png differ diff --git a/static/Logo/Logo.jpeg b/static/Logo/Logo.jpeg deleted file mode 100644 index 4720c3b..0000000 Binary files a/static/Logo/Logo.jpeg and /dev/null differ diff --git a/static/Logo/Logo.png b/static/Logo/Logo.png new file mode 100644 index 0000000..864630b Binary files /dev/null and b/static/Logo/Logo.png differ diff --git a/static/QR/Qr.png b/static/QR/Qr.png deleted file mode 100644 index 1716929..0000000 Binary files a/static/QR/Qr.png and /dev/null differ diff --git a/static/css/componentes.css b/static/css/componentes.css index f1284da..fbe7bec 100644 --- a/static/css/componentes.css +++ b/static/css/componentes.css @@ -1,38 +1,9 @@ -.Generator-QR { - width: 100%; - height: 70vh; - display: flex; - justify-content: center; - align-items: start; - gap: 20px; - background-color: #f5f5f5; - transition: background-color 0.3s ease; -} - -.Generator-QR img { - width: 100%; - height: 100%; - object-fit: contain; - animation: fadeIn 0.5s ease-out; -} - -@keyframes fadeIn { - from { opacity: 0; transform: scale(0.95); } - to { opacity: 1; transform: scale(1); } -} - .Container { width: 450px; height: 90%; - box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); - padding: 10px; - border-radius: 10px; - background-color: #ffffff; - transition: transform 0.3s ease; -} - -.Container:hover { - transform: translateY(-5px); + border: 1px solid #e0e0e0; + padding: 15px; + border-radius: 8px; } .Boton_Url { @@ -41,21 +12,20 @@ display: flex; justify-content: center; align-items: center; - background-color: #000000; - color: #ffffff; - font-size: 20px; + background-color: #f5f5f5; + color: #333333; + font-size: 16px; font-weight: 500; - border-radius: 10px; + border-radius: 4px; cursor: pointer; - padding: 30px; + padding: 20px; text-decoration: none; margin: 0 auto; - transition: background-color 0.3s ease, transform 0.2s ease; + border: 1px solid #e0e0e0; } .Boton_Url:hover { - background-color: #333333; - transform: scale(1.05); + background-color: #eeeeee; } .Text { @@ -65,10 +35,10 @@ flex-direction: column; justify-content: center; align-items: start; - font-size: 20px; + font-size: 16px; font-weight: 500; margin-top: 20px; - color: #000000; + color: #333333; } .List-Files { @@ -80,50 +50,44 @@ align-items: center; flex-direction: row; margin-bottom: 30px; - gap: 50px; + gap: 30px; } .File { - width: 500px; - height: 500px; + width: 400px; + height: 400px; display: flex; justify-content: space-between; align-items: center; flex-direction: column; margin-top: 5px; - border-radius: 10px; - padding: 10px; background-color: #ffffff; - color: #000000; - font-size: 20px; + color: #333333; + font-size: 16px; font-weight: 500; cursor: pointer; text-decoration: none; - transition: box-shadow 0.3s ease, transform 0.3s ease; - gap: 10px; - border: 1px solid #d3d3d3; -} - -.File:hover { - box-shadow: 0 6px 12px rgba(0, 0, 0, 0.1); - transform: translateY(-10px); + border: 1px solid #000000; + border-radius: 10px; } .File picture { - width: 90%; - height: 70%; + width: 100%; + height: 60%; overflow: hidden; } -.File video { +.File img{ width: 100%; height: 100%; - display: block; - transition: transform 0.3s ease; + object-fit: contain; + margin-top: 10px; } -.File:hover video { - transform: scale(1.05); +.File video { + width: 100%; + height: 100%; + display: block; } .Icono_Documento { @@ -139,9 +103,11 @@ max-width: 90%; min-width: 25%; font-size: medium; - font-family: 'Inter', sans-serif; - margin-left: 20px; + font-family: sans-serif; + font-weight: 800; color: #000000; + margin: 29px; + text-align: start; } .File a { @@ -152,23 +118,17 @@ display: flex; justify-content: center; align-items: center; - background-color: #f5f5f5; - color: #000000; - font-size: 20px; + background-color: #000000; + color: #ffffff; + font-size: 16px; font-weight: 500; - border-radius: 10px; + border-radius: 7px; cursor: pointer; padding: 25px; text-decoration: none; - border: 1px solid #d3d3d3; gap: 10px; margin-right: 20px; - transition: background-color 0.3s ease, transform 0.2s ease; -} - -.File a:hover { - background-color: #e0e0e0; - transform: scale(1.05); + border: 1px solid; } .File .Des { @@ -180,164 +140,119 @@ text-overflow: ellipsis; overflow: hidden; white-space: nowrap; - font-size: 19px; - color: #000000; - transition: color 0.3s ease; -} - -.File:hover h1 { - color: #666666; + font-size: 18px; + color: #333333; } +/* Contenedor del formulario */ .UpData { - margin-top: 20vh; - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; - max-width: 600px; - min-width: 300px; - width: 100%; - height: 300px; - border-radius: 20px; - box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); - background-color: #ffffff; /* Fondo blanco */ - transition: transform 0.3s ease; + max-width: 90%; + width: 90%; + min-width: 450px; + margin: 20px; padding: 30px; + background-color: white; + border: 1px solid rgb(187, 187, 187); + border-radius: 10px; } -.UpData:hover { - transform: translateY(-5px); -} - +/* Estilos para etiquetas */ .Up { - display: flex; - justify-content: center; - align-items: center; - background-color: #333333; /* Fondo gris oscuro */ - color: #ffffff; + display: block; + margin-bottom: 20px; + font-size: 14px; font-weight: 500; - border-radius: 5px; - cursor: pointer; - padding: 15px 30px; - text-decoration: none; - transition: background-color 0.3s ease, transform 0.2s ease; - width: 100%; - margin-bottom: 15px; - text-align: center; + color: #000000; } +/* Estilos para inputs de texto */ +input[type="text"] { + width: 100%; + padding: 12px; + margin-top: 8px; + border: 1px solid #b8b8b8; + border-radius: 6px; + font-size: 14px; + box-sizing: border-box; + transition: border-color 0.3s; +} -.Up:hover { - background-color: #555555; /* Gris más claro */ - transform: scale(1.05); +input[type="text"]:focus { + border-color: #3498db; + outline: none; + box-shadow: 0 0 0 2px rgba(52, 152, 219, 0.1); } -.Des { - background-color: #000000; /* Fondo negro */ - color: #ffffff; - border: none; - padding: 10px 20px; - font-size: 16px; - border-radius: 5px; - cursor: pointer; - transition: background-color 0.3s ease, transform 0.2s ease; +/* Estilos para input de archivo */ +.UpInput { + display: block; width: 100%; + margin-top: 8px; + padding: 10px 0; + font-size: 14px; } -.Des:hover { - background-color: #444444; /* Gris oscuro */ - transform: scale(1.05); +/* Personalización del botón de archivo */ +input[type="file"] { + cursor: pointer; } - -.Message { - width: 90%; - height: 80vh; - overflow-y: scroll; +input[type="file"]::-webkit-file-upload-button { + background-color: #f1f1f1; + border: none; + padding: 8px 12px; + border-radius: 4px; + color: #555; + font-size: 14px; + transition: background 0.3s; + cursor: pointer; } -.Message li { - display: flex; - flex-direction: column; - max-width: 90%; - font-size: 30px; - min-width: 30px; - padding: 20px; - list-style: none; - background-color: #f5f5f5; - border-radius: 20px; - overflow: hidden; - word-wrap: break-word; - white-space: normal; - margin-top: 50px; - color: #000000; - animation: slideIn 0.5s ease-out; +input[type="file"]::-webkit-file-upload-button:hover { + background-color: #e0e0e0; } -@keyframes slideIn { - from { - opacity: 0; - transform: translateY(20px); - } - to { - opacity: 1; - transform: translateY(0); - } -} -.Sends { - width: 100%; - display: flex; - justify-content: center; - align-items: center; - margin-bottom: 30px; +/* Estilos de enfoque para accesibilidad */ +input:focus { + outline: none; } -.Sends input { - width: 70%; - height: 60px; - border: 1px solid #d3d3d3; - border-radius: 5px; - padding: 5px; - transition: box-shadow 0.3s ease; - font-size: 30px; -} -.Sends input:focus { +.Des:focus { outline: none; - box-shadow: 0 0 5px rgba(0, 0, 0, 0.2); } -.Sends button { - height: 60px; - width: 20%; +.Des { background-color: #000000; color: #ffffff; border: none; - border-radius: 5px; + padding: 10px 20px; + font-size: 16px; + border-radius: 7px; cursor: pointer; - transition: background-color 0.3s ease, transform 0.2s ease; -} + color: white; + padding: 12px 20px; + font-size: 16px; + font-weight: 600; + border: none; + border-radius: 8px; + cursor: pointer; + width: 200px; + transition: background-color 0.3s ease, transform 0.3s ease; + margin-top: 15px; -.Sends button:hover { - background-color: #333333; - transform: scale(1.1); } + @media screen and (max-width: 768px){ .Container{ width: 100%; height: 100%; } - .Generator-QR{ - flex-direction: column; - width: 100%; - height: 100%; - justify-content: center; - align-items: center; - margin-bottom: 40px; + .Botones-grip{ + display: none; } .Text{ @@ -382,8 +297,152 @@ } .UpData input{ font-size: 10px; - } } +.Comunicados-container{ + background-color: none; +} + +.Comunicados{ + width: 90%; + height: auto; + margin: 20px auto; + display: flex; + flex-direction: column; + margin-bottom: 300px; +} + +.Comunicados-card{ + width: 100%; + height: auto; + min-height: 20vh; + max-height: 70vh; + border: 1px solid; + padding: 10px; + display: flex; + flex-direction: column; + margin-top: 20px; + border-radius: 10px; + background-color: white; +} + +.Comunicados-info{ + display: flex; + align-items: center; + gap: 30px; +} + +.Comunicados-card span{ + font-size: 35px; +} + +.Comunicados-card p{ + font-size: 25; + text-wrap: wrap; +} + +.barra{ + width: 90%; + height: 1px; + border-radius: 10px; + background-color: #000000; + margin: 10px auto; +} + +.file-actions { + display: flex; + flex-direction: column; + align-items: flex-start; + margin-top: 8px; + margin-bottom: 15px; + gap: 8px; + } + + .reaction-buttons { + display: flex; + gap: 8px; + flex-wrap: wrap; + justify-content: flex-start; + } + + .reaction-btn { + display: flex; + align-items: flex-start; + gap: 5px; + padding: 5px 10px; + border: none; + border-radius: 20px; + background-color: white; + cursor: pointer; + transition: all 0.2s ease; + box-shadow: 0 2px 4px rgba(0,0,0,0.05); + } + + .reaction-btn:hover { + transform: translateY(-2px); + box-shadow: 0 4px 8px rgba(0,0,0,0.1); + } + + .like-btn:hover { + background-color: #e3f2fd; + border-color: #2196f3; + } + + .dislike-btn:hover { + background-color: #e3f2fd; + border-color: #2196f3; + } + + .love-btn:hover { + background-color: #e3f2fd; + border-color: #2196f3; + } + + .laugh-btn:hover { + background-color: #e3f2fd; + border-color: #2196f3; + } + + .emoji { + font-size: 18px; + line-height: 1; + } + + + @keyframes pulse { + 0% { + transform: scale(1); + } + 50% { + transform: scale(1.2); + } + 100% { + transform: scale(1); + } + } + + .pulse-animation { + animation: pulse 0.5s; + } + + + .Texto { + margin: 8px 0; + font-weight: 500; + text-align: center; + } + @media (max-width: 768px) { + .reaction-buttons { + width: 100%; + } + + .reaction-btn { + padding: 6px 12px; + } + + .emoji { + font-size: 16px; + } + } \ No newline at end of file diff --git a/static/css/global.css b/static/css/global.css index c5cde56..9c38d79 100644 --- a/static/css/global.css +++ b/static/css/global.css @@ -1,35 +1,41 @@ -*{ - margin: 0; - padding: 0; +* { box-sizing: border-box; transition: all 0.3s; + font-family: 'Inter', 'Helvetica Neue', sans-serif; + color: #333; + line-height: 1.6; + margin: 0; + padding: 0; } -::-webkit-scrollbar{ + +::-webkit-scrollbar { width: 1px; } -@view-transition{ +@view-transition { navigation: auto; } -main{ +main { width: 100%; min-height: 80vh; + height: auto; display: flex; justify-content: start; align-items: center; flex-direction: column; } -.header{ +.header { width: 100%; display: flex; justify-content: center; flex-direction: column; margin-bottom: 30px; + border-bottom: 1px solid #e0e0e0; } -.menu{ +.menu { width: 100%; height: 50px; display: flex; @@ -38,33 +44,96 @@ main{ padding: 0 20px; } -.menu ul{ +.menu ul { display: flex; justify-content: end; width: 50%; list-style: none; } -.menu li{ +.menu li { display: inline; list-style: none; margin: 10px; } -.menu a{ +.menu a { width: 100%; height: 100%; - color: #000000; + color: #333333; text-decoration: none; margin: 0 10px; - font-size: 20px; - animation: aparecer; - animation-timeline: view(60% auto); + font-size: 16px; } -.hr_barra{ - width: 90%; - height: 1px; - background-color: #000000; +.menu a:hover { + color: #666666; +} + +.Botones-grip { + width: 95%; + height: 40px; + display: flex; + justify-content: end; + align-items: center; margin: 0 auto; + margin-bottom: 20px; +} + +.Botones-grip button { + width: 40px; + height: 40px; + margin: 10px; + border: 1px solid #e0e0e0; + cursor: pointer; + border-radius: 4px; + padding: 5px; + background-color: transparent; +} + +.Botones-grip button:hover { + background-color: #eeeeee; } + +.hr_barra { + width: 100%; + height: 1px; + background-color: #e0e0e0; +} + +.footer { + margin-top: 10px; + color: #000000; + padding: 30px 0 20px; + font-family: Arial, sans-serif; + text-align: start; + } + + .footer-container { + max-width: 1200px; + margin: 0 auto; + padding: 0 20px; + } + + .logo { + font-size: 28px; + font-weight: bold; + margin-bottom: 10px; + color: #3498db; + } + + .tagline { + font-size: 16px; + margin-bottom: 20px; + } + + .footer-bottom { + padding-top: 15px; + margin-top: 15px; + font-size: 14px; + margin-left: 20px; + } + +.reaction-buttons{ + margin-top: 20px; +} \ No newline at end of file diff --git a/templates/404.html b/templates/404.html new file mode 100644 index 0000000..e80e757 --- /dev/null +++ b/templates/404.html @@ -0,0 +1,23 @@ + + + + + + 404 - ERROR + + + + 404 +

Esta ruta no existe en la web.

+ + \ No newline at end of file diff --git a/templates/Chat.html b/templates/Chat.html deleted file mode 100644 index 2b1c007..0000000 --- a/templates/Chat.html +++ /dev/null @@ -1,33 +0,0 @@ -{% extends "layout.html" %} -{% block content %} - - -
-
    -
    - -
    - - -
    - - - - - - -{% endblock %} \ No newline at end of file diff --git a/templates/Comunicados.html b/templates/Comunicados.html new file mode 100644 index 0000000..bc9bae2 --- /dev/null +++ b/templates/Comunicados.html @@ -0,0 +1,35 @@ +{% extends "layout.html" %} +{% block content %} + + + + +
    + +
    +
    + Contacto + @Admin - Support +
    +

    Si quieres contactarnos puedes hacerlos por nuestro Correo nioycontactoservice@gmail.com

    +
    + +
    + {% for comunicado in comunicados %} +
    +
    + {{ comunicado.titulo }} + {{ comunicado.autor }} +
    +

    {{ comunicado.texto }}

    + + {{ comunicado.fecha }} + + +
    + {% endfor %} +
    + +
    + +{% endblock %} \ No newline at end of file diff --git a/templates/Login.html b/templates/Login.html new file mode 100644 index 0000000..5d730d3 --- /dev/null +++ b/templates/Login.html @@ -0,0 +1,78 @@ + + + + + + Login - FreeC + + + + + + + + + \ No newline at end of file diff --git a/templates/Qr_Generator.html b/templates/Qr_Generator.html deleted file mode 100644 index 34bb5a8..0000000 --- a/templates/Qr_Generator.html +++ /dev/null @@ -1,19 +0,0 @@ -{% extends "layout.html" %} -{% block content %} -
    -
    - QR -
    - -
    -

    No olvides que tienes que estar conectados a las misma red.

    -

    Escanea el código para poder entrar a la web desde otro dispositivo.

    -
    -
    - - - - -{% endblock %} \ No newline at end of file diff --git a/templates/Up_Data.html b/templates/Up_Data.html index 1133bc9..6583e8b 100644 --- a/templates/Up_Data.html +++ b/templates/Up_Data.html @@ -1,11 +1,6 @@ {% extends "layout.html" %} {% block content %} -
    - - -
    + + {% endblock %} diff --git a/templates/index.html b/templates/index.html index 70814e9..df7baca 100644 --- a/templates/index.html +++ b/templates/index.html @@ -1,12 +1,33 @@ {% extends "layout.html" %} {% block content %} -
    +
    + + + + + +
    + +
    +
    + +
    {% for File in File %} +
    + {{ File.nombre }} +
    {% if File.tipo in ["jpg", "jpeg", "png", "gif"] %} - {{ File.nombre }} + {{ File.nombre }} {% elif File.tipo == "mp4" %} @@ -14,36 +35,28 @@ - {% elif File.tipo in ["pdf", "rar", "zip"] %} - - - - {% elif File.tipo in ["aac", "wav", "mp4","flac","ogg","aiff"] %} - - - {% elif File.tipo in ["py", "js", "html", "css", "txt", "java", "jav", "exe"] %} - - Código - {% endif %} - {{ File.nombre }} - - - Descargar - +
    +
    + + + + +
    +
    {% endfor %}
    diff --git a/templates/layout.html b/templates/layout.html index f96e98c..c3aa3fa 100644 --- a/templates/layout.html +++ b/templates/layout.html @@ -1,19 +1,45 @@ - - - - - - - NetDrop - Nombre provisional + + + + + + + + + + + + + + + FREE - Comparte sin censura y sin restricciones + + + + + + + + + + + + + + + + + + @@ -25,8 +51,24 @@
    -
    - Sin Pie de pagina. -
    +
    + + + +
    + + + \ No newline at end of file diff --git a/user_reactions.json b/user_reactions.json new file mode 100644 index 0000000..654732c --- /dev/null +++ b/user_reactions.json @@ -0,0 +1 @@ +{"84ec73111b8ead5b": {"qwert.jpg": "likes", "2.jpg": "likes", "S.jpg": "likes"}, "c35298a367ac06c1": {"..png": "love", "27 sin t\u00edtulo_20250331224532.png": "dislikes", "Quien es pawehca.png": "dislikes", "hola": "likes", "voz.m4a": "laugh", "pawecha.png": "love"}, "bcf5e1be204402fc": {"pawecha.png": "likes"}, "0015d5b9de469d32": {"Logo.png": "likes"}} \ No newline at end of file