From fe6e6a06d62fd4ee4c9a7e5a2dc020bae5fd1bc2 Mon Sep 17 00:00:00 2001 From: NIOY <166043734+NioyJadelkaFp@users.noreply.github.com> Date: Tue, 1 Apr 2025 13:47:21 -0300 Subject: [PATCH 01/60] mejoras css --- app.py | 2 +- static/css/componentes.css | 191 +++++++++++++++---------------------- static/css/global.css | 67 +++++++++---- templates/Up_Data.html | 2 +- templates/index.html | 41 +++++++- templates/layout.html | 2 + 6 files changed, 171 insertions(+), 134 deletions(-) diff --git a/app.py b/app.py index 1042639..ad73442 100644 --- a/app.py +++ b/app.py @@ -86,4 +86,4 @@ def Message(msg): if __name__ == '__main__': Qr_Generator.Generar_QR() - socketio.run(app) \ No newline at end of file + socketio.run(app,host='0.0.0.0', debug=True) \ No newline at end of file diff --git a/static/css/componentes.css b/static/css/componentes.css index f1284da..551c344 100644 --- a/static/css/componentes.css +++ b/static/css/componentes.css @@ -5,8 +5,7 @@ justify-content: center; align-items: start; gap: 20px; - background-color: #f5f5f5; - transition: background-color 0.3s ease; + background-color: #ffffff; } .Generator-QR img { @@ -17,22 +16,17 @@ } @keyframes fadeIn { - from { opacity: 0; transform: scale(0.95); } - to { opacity: 1; transform: scale(1); } + from { opacity: 0; } + to { opacity: 1; } } .Container { width: 450px; height: 90%; - box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); - padding: 10px; - border-radius: 10px; + border: 1px solid #e0e0e0; + padding: 15px; + border-radius: 8px; background-color: #ffffff; - transition: transform 0.3s ease; -} - -.Container:hover { - transform: translateY(-5px); } .Boton_Url { @@ -41,21 +35,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 +58,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,7 +73,7 @@ align-items: center; flex-direction: row; margin-bottom: 30px; - gap: 50px; + gap: 30px; } .File { @@ -91,39 +84,30 @@ align-items: center; flex-direction: column; margin-top: 5px; - border-radius: 10px; + border-radius: 4px; 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 #e0e0e0; } .File picture { width: 90%; - height: 70%; + height: 60%; overflow: hidden; + border-radius: 4px; + border: 1px solid #f0f0f0; } .File video { width: 100%; height: 100%; display: block; - transition: transform 0.3s ease; -} - -.File:hover video { - transform: scale(1.05); } .Icono_Documento { @@ -139,9 +123,9 @@ max-width: 90%; min-width: 25%; font-size: medium; - font-family: 'Inter', sans-serif; + font-family: sans-serif; margin-left: 20px; - color: #000000; + color: #333333; } .File a { @@ -153,22 +137,20 @@ justify-content: center; align-items: center; background-color: #f5f5f5; - color: #000000; - font-size: 20px; + color: #333333; + font-size: 16px; font-weight: 500; - border-radius: 10px; + border-radius: 4px; 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; + border: 1px solid #e0e0e0; } .File a:hover { - background-color: #e0e0e0; - transform: scale(1.05); + background-color: #eeeeee; } .File .Des { @@ -180,13 +162,8 @@ 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; } .UpData { @@ -199,58 +176,57 @@ 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; - padding: 30px; -} - -.UpData:hover { - transform: translateY(-5px); + border-radius: 4px; + background-color: #ffffff; + border: 1px solid #e0e0e0; + padding: 20px; } .Up { display: flex; justify-content: center; align-items: center; - background-color: #333333; /* Fondo gris oscuro */ - color: #ffffff; + background-color: #f5f5f5; + flex-direction: column; + color: #333333; font-weight: 500; - border-radius: 5px; + border-radius: 4px; cursor: pointer; - padding: 15px 30px; + padding: 15px 20px; text-decoration: none; - transition: background-color 0.3s ease, transform 0.2s ease; width: 100%; margin-bottom: 15px; text-align: center; + border: 1px solid #e0e0e0; } +.UpInput{ + height: auto; + border-radius: 10px; + background-color: white; + padding: 30px; + margin-top: 10px; +} .Up:hover { - background-color: #555555; /* Gris más claro */ - transform: scale(1.05); + background-color: #eeeeee; } .Des { - background-color: #000000; /* Fondo negro */ - color: #ffffff; - border: none; + background-color: #f5f5f5; + color: #333333; + border: 1px solid #e0e0e0; padding: 10px 20px; font-size: 16px; - border-radius: 5px; + border-radius: 4px; cursor: pointer; - transition: background-color 0.3s ease, transform 0.2s ease; width: 100%; } .Des:hover { - background-color: #444444; /* Gris oscuro */ - transform: scale(1.05); + background-color: #eeeeee; } - .Message { width: 90%; height: 80vh; @@ -261,29 +237,18 @@ display: flex; flex-direction: column; max-width: 90%; - font-size: 30px; + font-size: 18px; min-width: 30px; padding: 20px; list-style: none; - background-color: #f5f5f5; - border-radius: 20px; + background-color: #ffffff; + border-radius: 4px; overflow: hidden; word-wrap: break-word; white-space: normal; - margin-top: 50px; - color: #000000; - animation: slideIn 0.5s ease-out; -} - -@keyframes slideIn { - from { - opacity: 0; - transform: translateY(20px); - } - to { - opacity: 1; - transform: translateY(0); - } + margin-top: 30px; + color: #333333; + border: 1px solid #e0e0e0; } .Sends { @@ -296,33 +261,32 @@ .Sends input { width: 70%; - height: 60px; - border: 1px solid #d3d3d3; - border-radius: 5px; - padding: 5px; - transition: box-shadow 0.3s ease; - font-size: 30px; + height: 50px; + border: 1px solid #e0e0e0; + border-radius: 4px; + padding: 5px 10px; + font-size: 16px; + background-color: #ffffff; } .Sends input:focus { outline: none; - box-shadow: 0 0 5px rgba(0, 0, 0, 0.2); + border-color: #d0d0d0; } .Sends button { - height: 60px; + height: 50px; width: 20%; - background-color: #000000; - color: #ffffff; - border: none; - border-radius: 5px; + background-color: #f5f5f5; + color: #333333; + border: 1px solid #e0e0e0; + border-radius: 4px; cursor: pointer; - transition: background-color 0.3s ease, transform 0.2s ease; + margin-left: 10px; } .Sends button:hover { - background-color: #333333; - transform: scale(1.1); + background-color: #eeeeee; } @media screen and (max-width: 768px){ @@ -382,8 +346,5 @@ } .UpData input{ font-size: 10px; - } -} - - +} \ No newline at end of file diff --git a/static/css/global.css b/static/css/global.css index c5cde56..30d010f 100644 --- a/static/css/global.css +++ b/static/css/global.css @@ -1,18 +1,25 @@ -*{ +* { margin: 0; padding: 0; box-sizing: border-box; transition: all 0.3s; } -::-webkit-scrollbar{ + +::-webkit-scrollbar { width: 1px; } -@view-transition{ +body { + background-color: #fafafa; + font-family: sans-serif; + color: #333333; +} + +@view-transition { navigation: auto; } -main{ +main { width: 100%; min-height: 80vh; display: flex; @@ -21,15 +28,16 @@ main{ 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 +46,60 @@ 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; +} + +.menu a:hover { + color: #666666; } -.hr_barra{ +.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: 90%; height: 1px; - background-color: #000000; + background-color: #e0e0e0; margin: 0 auto; -} +} \ No newline at end of file diff --git a/templates/Up_Data.html b/templates/Up_Data.html index 1133bc9..930d286 100644 --- a/templates/Up_Data.html +++ b/templates/Up_Data.html @@ -3,7 +3,7 @@
diff --git a/templates/index.html b/templates/index.html index 70814e9..9ba9d64 100644 --- a/templates/index.html +++ b/templates/index.html @@ -1,7 +1,18 @@ {% extends "layout.html" %} {% block content %} -
+
+ + +
+ +
{% for File in File %}
{% if File.tipo in ["jpg", "jpeg", "png", "gif"] %} @@ -47,4 +58,32 @@ } + + {% endblock %} diff --git a/templates/layout.html b/templates/layout.html index f96e98c..44cf800 100644 --- a/templates/layout.html +++ b/templates/layout.html @@ -28,5 +28,7 @@
Sin Pie de pagina.
+ + \ No newline at end of file From 5f27810a987fe0cf1e4b0a21fbabe1c55ce1d9b5 Mon Sep 17 00:00:00 2001 From: NIOY <166043734+NioyJadelkaFp@users.noreply.github.com> Date: Tue, 1 Apr 2025 13:48:53 -0300 Subject: [PATCH 02/60] Uhs --- app.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app.py b/app.py index ad73442..1e66007 100644 --- a/app.py +++ b/app.py @@ -86,4 +86,6 @@ def Message(msg): if __name__ == '__main__': Qr_Generator.Generar_QR() - socketio.run(app,host='0.0.0.0', debug=True) \ No newline at end of file + socketio.run(app) + + #,host='0.0.0.0', debug=True) \ No newline at end of file From 255de5b4307cd8a629518d7439beeaff9671af02 Mon Sep 17 00:00:00 2001 From: NIOY <166043734+NioyJadelkaFp@users.noreply.github.com> Date: Tue, 1 Apr 2025 13:55:59 -0300 Subject: [PATCH 03/60] Footer --- app.py | 2 +- static/css/global.css | 34 +++++++++++++++++++++++++++++++++- templates/layout.html | 17 ++++++++++++++--- 3 files changed, 48 insertions(+), 5 deletions(-) diff --git a/app.py b/app.py index 1e66007..37b34c1 100644 --- a/app.py +++ b/app.py @@ -88,4 +88,4 @@ def Message(msg): Qr_Generator.Generar_QR() socketio.run(app) - #,host='0.0.0.0', debug=True) \ No newline at end of file + #,host='0.0.0.0', debug=True \ No newline at end of file diff --git a/static/css/global.css b/static/css/global.css index 30d010f..2a4d1fe 100644 --- a/static/css/global.css +++ b/static/css/global.css @@ -102,4 +102,36 @@ main { height: 1px; background-color: #e0e0e0; margin: 0 auto; -} \ No newline at end of file +} + +.footer { + 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; + } \ No newline at end of file diff --git a/templates/layout.html b/templates/layout.html index 44cf800..4594e63 100644 --- a/templates/layout.html +++ b/templates/layout.html @@ -25,9 +25,20 @@
-
- Sin Pie de pagina. -
+
+ + + +
+ From 3fdcd708f9d52bb7d7ebe1760fdb16e57ad00eb0 Mon Sep 17 00:00:00 2001 From: NIOY <166043734+NioyJadelkaFp@users.noreply.github.com> Date: Tue, 1 Apr 2025 13:58:20 -0300 Subject: [PATCH 04/60] Footer UPdate --- templates/layout.html | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/templates/layout.html b/templates/layout.html index 4594e63..6105d79 100644 --- a/templates/layout.html +++ b/templates/layout.html @@ -28,9 +28,12 @@
From e3b336505c087b7282b84364f97342f6075aa93c Mon Sep 17 00:00:00 2001 From: NIOY <166043734+NioyJadelkaFp@users.noreply.github.com> Date: Tue, 1 Apr 2025 14:02:48 -0300 Subject: [PATCH 05/60] Ceo mejorado --- templates/layout.html | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/templates/layout.html b/templates/layout.html index 6105d79..1058fd7 100644 --- a/templates/layout.html +++ b/templates/layout.html @@ -3,11 +3,24 @@ + + + + + + + + + + + + + - - NetDrop - Nombre provisional + NetDrop - Comparte sin censura y sin restricciones +
From 302910ce638f4716f9ada9d7d60fc7e2d4a4ca71 Mon Sep 17 00:00:00 2001 From: NIOY <166043734+NioyJadelkaFp@users.noreply.github.com> Date: Tue, 1 Apr 2025 14:16:38 -0300 Subject: [PATCH 06/60] INA FREE --- app.py | 2 +- static/Logo/Logo.jfif | Bin 0 -> 56537 bytes templates/layout.html | 21 +++++++++++---------- 3 files changed, 12 insertions(+), 11 deletions(-) create mode 100644 static/Logo/Logo.jfif diff --git a/app.py b/app.py index 37b34c1..a00c97d 100644 --- a/app.py +++ b/app.py @@ -86,6 +86,6 @@ def Message(msg): if __name__ == '__main__': Qr_Generator.Generar_QR() - socketio.run(app) + socketio.run(app,host='0.0.0.0', debug=True) #,host='0.0.0.0', debug=True \ No newline at end of file diff --git a/static/Logo/Logo.jfif b/static/Logo/Logo.jfif new file mode 100644 index 0000000000000000000000000000000000000000..dc82dfb2df2d7125c35b4ebfd24a17d07221edb6 GIT binary patch literal 56537 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
  • Yn1b4GtI>dH`> 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 ic>aC#KNoUH8|cxqSD7R7 - - + + - + - + - + - + - - NetDrop - Comparte sin censura y sin restricciones + + INA FREE - Comparte sin censura y sin restricciones + @@ -40,7 +41,7 @@

    From 2fdc9f1b785168217ddc583142b84249193fb99b Mon Sep 17 00:00:00 2001 From: NIOY <166043734+NioyJadelkaFp@users.noreply.github.com> Date: Tue, 1 Apr 2025 14:23:58 -0300 Subject: [PATCH 07/60] Subir con texto --- app.py | 21 +++++++++++---------- templates/Chat.html | 26 -------------------------- templates/Up_Data.html | 8 +++++++- 3 files changed, 18 insertions(+), 37 deletions(-) diff --git a/app.py b/app.py index a00c97d..3a99290 100644 --- a/app.py +++ b/app.py @@ -49,20 +49,21 @@ def Descarga(File=''): 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) + # 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('/update') def abrir_navegador(): diff --git a/templates/Chat.html b/templates/Chat.html index 2b1c007..28dcc4d 100644 --- a/templates/Chat.html +++ b/templates/Chat.html @@ -2,32 +2,6 @@ {% block content %} -
    -
      -
      - -
      - - -
      - - - - {% endblock %} \ No newline at end of file diff --git a/templates/Up_Data.html b/templates/Up_Data.html index 930d286..c977f6d 100644 --- a/templates/Up_Data.html +++ b/templates/Up_Data.html @@ -1,11 +1,17 @@ {% extends "layout.html" %} {% block content %} +

      Sube tu archivo

      +
      + {% endblock %} From 32da44368fb2dc03727a3c7db43abaeccbd050fe Mon Sep 17 00:00:00 2001 From: NIOY <166043734+NioyJadelkaFp@users.noreply.github.com> Date: Tue, 1 Apr 2025 14:29:41 -0300 Subject: [PATCH 08/60] Nombre de subida --- app.py | 92 -------------------------------------- static/css/componentes.css | 59 ++++++++++++++++++------ templates/Up_Data.html | 4 +- 3 files changed, 47 insertions(+), 108 deletions(-) delete mode 100644 app.py diff --git a/app.py b/app.py deleted file mode 100644 index 3a99290..0000000 --- a/app.py +++ /dev/null @@ -1,92 +0,0 @@ -from flask import Flask, redirect, render_template, send_file, request -from Funciones import Qr_Generator -from Funciones import Show_File as Show_File -from flask_socketio import SocketIO, send -import os -import webbrowser -import socket as sok - -Files_Carpet = './static/File/' - -app = Flask(__name__) -app.config['SECRET_KEY'] = 'secret' -socketio = SocketIO(app) - -Qr_Generator.Generar_QR() - -@app.route('/') -def index(): - File = Show_File.Show_File() - return render_template('index.html', File=File) - -@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('/upload', methods=['POST']) -def update(): - 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('/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 __name__ == '__main__': - Qr_Generator.Generar_QR() - socketio.run(app,host='0.0.0.0', debug=True) - - #,host='0.0.0.0', debug=True \ No newline at end of file diff --git a/static/css/componentes.css b/static/css/componentes.css index 551c344..dad1852 100644 --- a/static/css/componentes.css +++ b/static/css/componentes.css @@ -175,11 +175,12 @@ max-width: 600px; min-width: 300px; width: 100%; - height: 300px; - border-radius: 4px; + height: auto; + border-radius: 10px; background-color: #ffffff; border: 1px solid #e0e0e0; - padding: 20px; + padding: 30px; + box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.1); } .Up { @@ -189,29 +190,59 @@ background-color: #f5f5f5; flex-direction: column; color: #333333; - font-weight: 500; - border-radius: 4px; + font-weight: 600; + border-radius: 8px; cursor: pointer; - padding: 15px 20px; + padding: 20px 25px; text-decoration: none; width: 100%; - margin-bottom: 15px; + margin-bottom: 20px; text-align: center; border: 1px solid #e0e0e0; + transition: background-color 0.3s ease, transform 0.3s ease; } -.UpInput{ +.UpInput { height: auto; - border-radius: 10px; - background-color: white; - padding: 30px; - margin-top: 10px; + border-radius: 12px; + background-color: #f8f8f8; + padding: 15px 20px; + margin-top: 15px; + width: 100%; + border: 1px solid #e0e0e0; + transition: border-color 0.3s ease; } -.Up:hover { - background-color: #eeeeee; + +.UpInput:focus { + outline: none; + border-color: #007bff; +} + +.Des { + background-color: #007bff; + color: white; + padding: 12px 20px; + font-size: 16px; + font-weight: 600; + border: none; + border-radius: 8px; + cursor: pointer; + width: 100%; + transition: background-color 0.3s ease, transform 0.3s ease; + margin-top: 15px; } +.Des:hover { + background-color: #0056b3; + transform: scale(1.05); /* Efecto de hover para agrandar ligeramente el botón */ +} + +.Des:focus { + outline: none; +} + + .Des { background-color: #f5f5f5; color: #333333; diff --git a/templates/Up_Data.html b/templates/Up_Data.html index c977f6d..882acfc 100644 --- a/templates/Up_Data.html +++ b/templates/Up_Data.html @@ -1,10 +1,10 @@ {% extends "layout.html" %} {% block content %} -

      Sube tu archivo

      +
    • + + + +
      - + +
      diff --git a/templates/index.html b/templates/index.html index eba6d20..6a88796 100644 --- a/templates/index.html +++ b/templates/index.html @@ -1,67 +1,10 @@ {% extends "layout.html" %} {% block content %} - - - - - -
      -
      -

      🚨 Advertencia 🚨

      -

      No está permitido subir contenido sexual o sin el consentimiento de la persona.

      -

      Este sitio está siendo moderado en todo momento.

      - -
      + - -
      + + + +
      + {% endfor %}
      @@ -82,6 +107,50 @@ // Realizar la descarga window.location.href = '/descarga/' + fileName; } + + // Function to handle emoji reactions + function reactToFile(fileName, reaction) { + event.preventDefault(); + + // Send the reaction to the server + fetch(`/react/${fileName}/${reaction}`, { + method: 'POST', + }) + .then(response => response.json()) + .then(data => { + // Update the reaction counts on the page + const fileElement = event.target.closest('.File'); + + // Update all reaction counts + const reactionTypes = ['likes', 'dislikes', 'love', 'laugh']; + reactionTypes.forEach(reactionType => { + const countElement = fileElement.querySelector(`.${reactionType}-count`); + if (countElement) { + countElement.textContent = data[reactionType]; + } + }); + + // Clear previous active states + const allButtons = fileElement.querySelectorAll('.reaction-btn'); + allButtons.forEach(button => button.classList.remove('active')); + + // Add active state to current reaction if user has reacted + if (data.user_reaction) { + const activeButton = fileElement.querySelector(`.${data.user_reaction}-btn`); + if (activeButton) { + activeButton.classList.add('active'); + } + } + + // Add a pulse animation + const button = event.target.closest('.reaction-btn'); + button.classList.add('pulse-animation'); + setTimeout(() => { + button.classList.remove('pulse-animation'); + }, 500); + }) + .catch(error => console.error('Error:', error)); + } + + + - -{% endblock %} +{% endblock %} \ No newline at end of file diff --git a/user_reactions.json b/user_reactions.json new file mode 100644 index 0000000..68d4b10 --- /dev/null +++ b/user_reactions.json @@ -0,0 +1 @@ +{"84ec73111b8ead5b": {"qwert.jpg": "likes", "2.jpg": "likes", "S.jpg": "likes"}} \ No newline at end of file From f342b5ec3e07edd6abc3261f94f0167f901cf49a Mon Sep 17 00:00:00 2001 From: NIOY <166043734+NioyJadelkaFp@users.noreply.github.com> Date: Thu, 3 Apr 2025 10:35:29 -0300 Subject: [PATCH 42/60] Mejoras --- app.py | 2 +- reactions.json | 2 +- static/css/global.css | 6 +- templates/Login.html | 78 +++++++++++++++++++ templates/Up_Data.html | 8 +- templates/index.html | 173 +++-------------------------------------- user_reactions.json | 2 +- 7 files changed, 104 insertions(+), 167 deletions(-) create mode 100644 templates/Login.html diff --git a/app.py b/app.py index 1c30db5..268d137 100644 --- a/app.py +++ b/app.py @@ -194,5 +194,5 @@ def pagina_no_encontrada(error): return render_template('404.html') if __name__ == '__main__': - socketio.run(app, debug=True) + socketio.run(app, host='0.0.0.0', debug=True) # app.run(host='0.0.0.0', debug=True) \ No newline at end of file diff --git a/reactions.json b/reactions.json index 1d45f03..6f9cb3f 100644 --- a/reactions.json +++ b/reactions.json @@ -1 +1 @@ -{"qwert.jpg": {"likes": 1, "dislikes": 0, "love": 0, "laugh": 0}, "S.jpg": {"likes": 1, "dislikes": 0, "love": 0, "laugh": -1}, "2.jpg": {"likes": 1, "dislikes": 0, "love": 0, "laugh": 0}} \ No newline at end of file +{"qwert.jpg": {"likes": 1, "dislikes": 0, "love": 0, "laugh": 0}, "S.jpg": {"likes": 1, "dislikes": 0, "love": 0, "laugh": -1}, "2.jpg": {"likes": 1, "dislikes": 0, "love": 0, "laugh": 0}, "..png": {"likes": 0, "dislikes": 0, "love": 1, "laugh": 0}, "27 sin t\u00edtulo_20250331224532.png": {"likes": 0, "dislikes": 1, "love": 0, "laugh": 0}, "Quien es pawehca.png": {"likes": 0, "dislikes": 1, "love": 0, "laugh": 0}, "hola": {"likes": 1, "dislikes": 0, "love": 0, "laugh": 0}, "voz.m4a": {"likes": 0, "dislikes": 0, "love": 0, "laugh": 1}, "pawecha.png": {"likes": 1, "dislikes": 0, "love": 1, "laugh": 0}} \ No newline at end of file diff --git a/static/css/global.css b/static/css/global.css index d223327..a6a3056 100644 --- a/static/css/global.css +++ b/static/css/global.css @@ -132,4 +132,8 @@ main { margin-top: 15px; font-size: 14px; margin-left: 20px; - } \ No newline at end of file + } + +.reaction-buttons{ + margin-top: 20px; +} \ 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/Up_Data.html b/templates/Up_Data.html index 1274b94..574d0f9 100644 --- a/templates/Up_Data.html +++ b/templates/Up_Data.html @@ -10,7 +10,11 @@
      -