cambio en footer, soluciones y carousel

This commit is contained in:
David Itehua Xalamihua 2025-05-18 17:33:54 -06:00
parent 2956937c64
commit 934aed1d52
18 changed files with 1198 additions and 293 deletions

View File

@ -1,4 +1,4 @@
# Descargar y mover el repositorio
## Descargar y mover el repositorio
```bash
cd ~
git clone gitea@192.168.10.40:dix/formha.git
@ -6,12 +6,12 @@ sudo mv formha/ /var/www
cd /var/www/formha/
```
# Entrar en modo Dios
## Entrar en modo Dios
```bash
sudo su
```
# Crear el ambiente virtual
## Crear el ambiente virtual
```bash
python3 -m venv .venv
source .venv/bin/activate
@ -19,13 +19,13 @@ pip install -r requirements.txt
deactivate
```
# Salimos del modo Dios
## Salimos del modo Dios
```bash
exit
```
# Añade las variables de entorno del proyecto al archivo envars
- si tienes problemas con las variables de entorno deberás de comentarlas y reiniciar apache, una vez reiniciado deberas descomentar las variables de entorno y volver a reiniciar apache
## Añade las variables de entorno del proyecto al archivo **envars**
tienes problemas con las variables de entorno deberás de comentarlas y reiniciar apache, una vez reiniciado deberás descomentar las variables de entorno y volver a reiniciar apache
```bash
sudo nano /etc/apache2/envvars
```
@ -46,19 +46,27 @@ export forma_db='{
#/////////////////////////////////////
```
# Movemos el archivo de configuración a Apache (solo se hace 1 vez)
## SI TE DA ERROR PRIMERO DESACTIVA APACHE EL PROBLEMA ES LAS VARIABLES DE ENTORNO
sudo systemctl stop apache2
## Movemos el archivo de configuración a Apache (solo se hace 1 vez)
### SI TE DA ERROR PRIMERO DESACTIVA APACHE EL PROBLEMA ES LAS VARIABLES DE ENTORNO
```bash
sudo systemctl stop apache2
sudo mv formha.conf /etc/apache2/sites-available/
cd /etc/apache2/sites-available/
sudo a2ensite formha.conf
```
## Reiniciar apache
```bash
sudo systemctl reload apache2
sudo systemctl restart apache2
```
# IMPORTANTE
- Debes de dar permisos a la ruta de archivos UPLOAD (solo se ejecuta una vez)
```bash
sudo chown -R www-data:www-data /var/www/uploads/formha
sudo chmod -R 755 /var/www/uploads/formha
```

View File

@ -54,7 +54,7 @@ class Carousel(FlaskForm):
]
)
bg_color = StringField('Color de fondo del texto: ', widget=ColorInput(), validators=[DataRequired()])
bg_color = StringField('Color de fondo: ', widget=ColorInput(), validators=[DataRequired()])
txt_color = StringField('Color del texto: ', widget=ColorInput(), validators=[DataRequired()])

35
main.py
View File

@ -33,7 +33,7 @@ if 'microsoft' in platform.uname().release.lower():
folder_upload = os.path.join(os.getcwd(), "static", "uploads")
elif platform.system() == "Linux":
folder_upload = "/var/www/formha/static/uploads/"
folder_upload = "/var/www/uploads/formha"
@ -183,7 +183,7 @@ def solutions():
return render_template(v['solutions'], active_page='solutions')
@app.route('/methodology')
@cache.cached(timeout=43200)
# @cache.cached(timeout=43200)
def methodology():
return render_template(v['methodology'], active_page='methodology')
@ -419,13 +419,32 @@ def recover_pswd():
recipients=[emailPswdReco] # Asegúrate que es una lista
)
# msg.html = render_template( 'email/recover_pswd.html', temp_password=new_tmp_pswd )
msg.html = """
<h1>Nueva contraseña temporal:</h1>
<p><strong>Contraseña:</strong> {}</p>
<p><strong>Una vez iniciada tu sesión debes de cambiar la contraseña a una nueva que puedas recordar</strong></p>
""".format(new_tmp_pswd)
msg.html = f"""
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Recuperación de contraseña</title>
</head>
<body style="font-family: Arial, sans-serif; background-color: #f4f4f4; padding: 20px;">
<div style="max-width: 600px; margin: auto; background-color: white; padding: 30px; border-radius: 10px; box-shadow: 0 0 10px rgba(0,0,0,0.1);">
<h2 style="color: #2c3e50;">🔒 Recuperación de contraseña</h2>
<p>Hola,</p>
<p>Hemos recibido una solicitud para restablecer tu contraseña. A continuación te proporcionamos una contraseña temporal que podrás usar para iniciar sesión:</p>
<p style="font-size: 18px;"><strong>🔑 Contraseña temporal:</strong> <span style="color: #e74c3c;">{new_tmp_pswd}</span></p>
<p><strong>Importante:</strong> Una vez que inicies sesión, te recomendamos cambiar tu contraseña por una que solo conozcas y puedas recordar fácilmente.</p>
<hr>
<p style="font-size: 12px; color: #888;">Este es un mensaje automático, por favor no respondas a este correo.</p>
</div>
</body>
</html>
"""
dbUsers.update_pswd(pswd=hashed_new_pswd, email=emailPswdReco)

View File

@ -55,6 +55,7 @@
height: 100vh;
object-fit: cover;
}
main { min-height: 80dvh; }
}
/* --------- Responsivo (ajustes si necesitas) ---------- */
@ -68,6 +69,8 @@
.carousel-caption.centered .caption-content h2 {
font-size: 1.5rem;
}
main { min-height: 80dvh; }
}
/* Tablets */
@ -75,14 +78,24 @@
.carousel-caption.centered .caption-content h2 {
font-size: 2rem;
}
main { min-height: 80dvh; }
}
/* Laptops */
@media (min-width: 1024px) and (max-width: 1439px) {
/* ajustes opcionales */
main { min-height: 80dvh; }
}
/* Pantallas grandes */
@media (min-width: 1440px) {
/* ajustes opcionales */
main { min-height: 80dvh; }
}

View File

@ -163,7 +163,7 @@ main {
main {
background-size: 50% auto; /* 30% del ancho del contenedor */
height: 80vh;
min-height: 70dvh;
}
}

View File

@ -1,13 +1,21 @@
.container{
& p {
font-size: 1.5rem;
}
}
main {
place-items: center;
}
#random-img {
width: 70%;
height: auto;
background-color: #fff;
border-radius: 12px;
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.15);
padding: 1rem;
}
/* Smartphones (hasta 767px) */
@media (max-width: 767px) {
/* main{ background-color: black; } */

View File

@ -1,6 +1,12 @@
import { simpleNotification } from '../../z_comps/notify.js';
// valida los archivos que se cargan en el formulario
// solo permite jpg, jpeg, png, mp4
// y los archivos que no son de imagen se eliminan
// y se muestra un mensaje de error
let form = document.querySelector("form");
let img = document.getElementById("img");

View File

@ -0,0 +1,99 @@
new DataTable('#tblCarousel', {
responsive: {
details: {
type: 'column',
renderer: function (api, rowIdx, columns) {
const data = $.map(columns, function (col) {
// Excluir columnas ocultas con títulos no deseados
if (
col.hidden &&
!(
col.title.includes("ID") ||
col.title === 'Acciones'
)
) {
return `
<tr data-dt-row="${col.rowIndex}" data-dt-column="${col.columnIndex}">
<td style="padding-left: 1rem; font-weight: 600; min-width: 120px;">${col.title}:</td>
<td style="padding-left: 1rem;">${col.data}</td>
</tr>
`;
}
return '';
}).join('');
return data
? $('<table style="width:100%"/>').append(`<tbody>${data}</tbody>`)
: false;
}
}
},
autoWidth: false,
dom: '<"top"lf>rt<"bottom"ip>',
language: {
search: "Buscar:",
lengthMenu: "Mostrar _MENU_ registros",
info: "Mostrando _START_ a _END_ de _TOTAL_ registros",
infoEmpty: "Mostrando 0 a 0 de 0 registros",
infoFiltered: "(filtrado de _MAX_ registros totales)",
paginate: {
first: "Primero",
last: "Último",
next: "Siguiente",
previous: "Anterior"
}
},
initComplete: function () {
const api = this.api();
// Agregar filtros a columnas que lo permiten
api.columns().every(function () {
const column = this;
const header = $(column.header());
const title = header.text().trim();
if (
!(
title.includes("ID") ||
title === 'New Tab' ||
title === 'Acciones'
)
) {
const input = $('<input type="text" class="form-control form-control-sm" placeholder="Filtrar..."/>')
.appendTo(header.empty()) // Vaciar el th antes de agregar input
.on('keyup change', function () {
if (column.search() !== this.value) {
column.search(this.value).draw();
}
});
input.css('width', '100%');
}
});
// Ajustes al redimensionar ventana
$(window).on('resize', function () {
$('.dataTables_scrollHeadInner, .dataTables_scrollHeadInner table').css('width', '100%');
});
},
drawCallback: function () {
// Asegurar ancho correcto si hay columnas ocultas
if (this.api().responsive.hasHidden()) {
$('.dataTables_scrollHeadInner, .dataTables_scrollHeadInner table').css('width', '100%');
}
},
columnDefs: [
{ responsivePriority: 1, targets: 0 }, // ID
{ responsivePriority: 2, targets: -1 }, // Acciones
{ responsivePriority: 3, targets: 2 }, // Archivo
{ width: '80px', targets: 0 }, // Ancho para ID
{ width: '120px', targets: -1 } // Ancho para Acciones
]
});

View File

@ -0,0 +1,80 @@
import { simpleNotification } from '../../z_comps/notify.js';
function delete_file(e) {
let btn = $(this);
let postId = btn.data('id');
let url = `${window.location.origin}/user/carousel/delete-slide/${postId}`;
fetch(url, {
method: 'DELETE',
headers: {
'Authorization': 'Bearer ' + localStorage.getItem('token_ai') // o tu token JWT
}
})
.then(res => res.json())
.then(data => {
if (data.msg) {
console.log(data.msg);
let btn = document.querySelector(`[data-id="${postId}"]`);
let row = $(btn).closest('tr'); // usa jQuery para compatibilidad con DataTables
let table = $('#tblCarousel').DataTable(); // obtiene instancia
table.row(row).remove().draw(); // elimina la fila y redibuja la tabla
simpleNotification("Eliminación exitosa", `${data.msg}`, "success");
// eliminar el tr del slide si quieres: btn.closest('tr').remove();
} else {
console.error('Error:', data.error);
}
})
.catch(err => console.error('Error en fetch:', err));
}
// https://htmlguyllc.github.io/jConfirm/
$(function(){
$('.delete-btn').jConfirm({
//false|array: if provided, this will override the default confirm/deny buttons (see below for an example)
btns: false,
//string: question displayed to the user
question: '¿Deseas continuar con la eliminación?',
//string: confirm button text
confirm_text: 'Sí',
//string: deny button text
deny_text: 'No',
//boolean: if true, when the confirm button is clicked the user will be redirected to the button's href location
// follow_href: true,
//boolean: if true and follow_href is true, the href will be opened in a new window
open_new_tab: false,
//boolean: if true, the tooltip will be hidden if you click outside of it
hide_on_click: true,
//string ('auto','top','bottom','left','right'): preferred location of the tooltip (defaults to auto if no space)
position: 'auto',
//boolean: if true, the deny button will be shown
show_deny_btn: true,
//string ('black', 'white', 'bootstrap-4', 'bootstrap-4-white')
theme: 'bootstrap-4',
//string ('tiny', 'small', 'medium', 'large')
size: 'medium',
//boolean: show the tooltip immediately on instantiation
show_now: false,
//string: class(es) to add to the tooltip
'class': ''
}).on('confirm', delete_file)
.on('deny', function(e){
var btn = $(this);
//do something on deny
}).on('jc-show', function(e, tooltip){
// console.log("el tooltip es visible");
//do something when tooltip is shown
//tooltip dom element is passed as the second parameter
}).on('jc-hide', function(e){
//do something when tooltip is hidden
});
});

View File

@ -94,9 +94,9 @@
/* Estilos personalizados para el footer */
.footer {
background-color: var(--navbar-footer-color);
background-color: var(--navbar-footer-color) !important;
font-size: var(--font-size-formha);
color: white;
color: white !important;
padding: 3rem 0;
& .img-cont{
@ -104,6 +104,11 @@
background-color: white;
border-radius: 10px;
}
& i, a {
color: white !important;
}
}
.footer h5 {

View File

@ -0,0 +1,219 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 604 601">
<!-- Generator: Adobe Illustrator 29.5.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 137) -->
<defs>
<style>
.st0, .st1 {
font-family: Montserrat-Regular, Montserrat;
}
.st0, .st2 {
letter-spacing: -.02em;
}
.st3 {
font-size: 15px;
}
.st3, .st4, .st5, .st6, .st7, .st8, .st9 {
fill: #fff;
}
.st4 {
font-family: LeagueSpartan-Bold, 'SYDRR E+ League Spartan';
font-size: 31.11px;
}
.st4, .st10, .st7, .st2 {
font-weight: 700;
}
.st11, .st12 {
fill: #423585;
}
.st13, .st14 {
fill: #8fb73b;
}
.st15, .st16 {
fill: #5a9ad5;
}
.st17 {
isolation: isolate;
}
.st18 {
stroke: #8fb73b;
}
.st18, .st19, .st20 {
fill: none;
stroke-width: 2px;
}
.st18, .st6, .st20 {
stroke-miterlimit: 10;
}
.st19 {
stroke: #fff;
stroke-linecap: round;
stroke-linejoin: round;
}
.st12 {
mix-blend-mode: overlay;
opacity: .2;
}
.st16, .st14 {
font-family: Montserrat-SemiBold, Montserrat;
font-size: 10.37px;
font-weight: 600;
}
.st10, .st2 {
font-family: Montserrat-Bold, Montserrat;
}
.st6 {
stroke: #413585;
}
.st21 {
letter-spacing: -.04em;
}
.st7 {
font-family: Montserrat-ExtraBold, Montserrat;
font-size: 39.05px;
}
.st8 {
font-size: 7px;
}
.st20 {
stroke: #5a9ad5;
}
.st9 {
font-size: 8px;
}
</style>
</defs>
<g class="st17">
<g id="BACKGROUND">
<rect class="st11" y="-3" width="604" height="604"/>
</g>
<g id="OBJECTS">
<text class="st14" transform="translate(402.19 366.08)"><tspan x="0" y="0">EXPERIENCIA DE SERVICIO</tspan></text>
<text class="st9" transform="translate(396.03 379.28)"><tspan class="st1"><tspan x="0" y="0">Acompañamos cada paso del proyecto, </tspan></tspan><tspan class="st21"><tspan class="st1" x="-20" y="9.33">asegurando una experiencia </tspan><tspan class="st10" x="87.63" y="9.33">cercana, ágil y efectiva.</tspan></tspan></text>
<text class="st14" transform="translate(391.29 506.1)"><tspan x="0" y="0">SOSTENIBILIDAD DEL CAMBIO </tspan></text>
<text class="st9" transform="translate(389.67 519.29)"><tspan class="st10" x="0" y="0">Reforzamos capacidades</tspan><tspan class="st1" x="104.69" y="0" xml:space="preserve"> internas para que el </tspan><tspan class="st1"><tspan x="28.65" y="9.33">valor se mantenga a largo plazo,</tspan></tspan><tspan class="st1"><tspan x="48.87" y="18.67" xml:space="preserve"> más allá del proyecto.</tspan></tspan></text>
<text class="st14" transform="translate(420.89 218.81)"><tspan x="0" y="0">ANÁLISIS DE DATOS</tspan></text>
<text class="st8" transform="translate(386.84 231.26)"><tspan class="st1"><tspan x="0" y="0" xml:space="preserve">Identificamos información clave para entender las </tspan></tspan><tspan class="st10" x="7.14" y="10">metas, retos y oportunidades</tspan><tspan class="st1" x="114.68" y="10" xml:space="preserve"> de tu empresa.</tspan></text>
<text class="st7" transform="translate(143.39 73.95)"><tspan x="0" y="0">METODOLOGÍA</tspan></text>
<text class="st3" transform="translate(103.37 118.12)"><tspan class="st1"><tspan x="0" y="0">Implementamos soluciones con el enfoque humano, </tspan></tspan><tspan class="st10"><tspan x="114.04" y="16">técnico y estratégico.</tspan></tspan></text>
<text class="st16" transform="translate(77.25 292.45)"><tspan x="0" y="0">PERSONALIZACIÓN</tspan></text>
<text class="st16" transform="translate(104.86 430.39)"><tspan x="0" y="0">IMPACTO</tspan></text>
<g>
<path class="st13" d="M257.15,197.03h44.82v70.53h-44.82c-18.77,0-34-15.23-34-34v-2.53c0-18.77,15.23-34,34-34Z"/>
<path class="st12" d="M237.92,260.93c5.79,4.16,12.86,6.62,20.49,6.62h43.56v-70.53h-.14l-63.91,63.91Z"/>
<text class="st4" transform="translate(248.04 244.39)"><tspan x="0" y="0">01</tspan></text>
<path class="st18" d="M257.9,188.73c-24.34,0-44.08,19.73-44.08,44.08s19.73,44.08,44.08,44.08"/>
<g>
<line class="st18" x1="317.53" y1="231.25" x2="352.73" y2="231.25"/>
<polygon class="st13" points="348.8 236.44 351 231.25 348.8 226.07 361.09 231.25 348.8 236.44"/>
</g>
</g>
<g>
<path class="st13" d="M257.15,338.08h44.82v70.53h-44.82c-18.77,0-34-15.23-34-34v-2.53c0-18.77,15.23-34,34-34Z"/>
<path class="st12" d="M237.92,401.99c5.79,4.16,12.86,6.62,20.49,6.62h43.56v-70.53h-.14l-63.91,63.91Z"/>
<text class="st4" transform="translate(243.89 385.44)"><tspan x="0" y="0">03</tspan></text>
<path class="st18" d="M258.93,329.78c-24.34,0-44.08,19.73-44.08,44.08s19.73,44.08,44.08,44.08"/>
<g>
<line class="st18" x1="317.53" y1="374.38" x2="352.73" y2="374.38"/>
<polygon class="st13" points="348.8 379.57 351 374.38 348.8 369.2 361.09 374.38 348.8 379.57"/>
</g>
</g>
<g>
<path class="st13" d="M257.15,479.13h44.82v70.53h-44.82c-18.77,0-34-15.23-34-34v-2.53c0-18.77,15.23-34,34-34Z"/>
<path class="st12" d="M237.92,543.04c5.79,4.16,12.86,6.62,20.49,6.62h43.56v-70.53h-.14l-63.91,63.91Z"/>
<text class="st4" transform="translate(243.89 526.5)"><tspan x="0" y="0">05</tspan></text>
<path class="st18" d="M257.9,470.84c-24.34,0-44.08,19.73-44.08,44.08s19.73,44.08,44.08,44.08"/>
<g>
<line class="st18" x1="317.53" y1="514.4" x2="352.73" y2="514.4"/>
<polygon class="st13" points="348.8 519.58 351 514.4 348.8 509.21 361.09 514.4 348.8 519.58"/>
</g>
</g>
<g>
<path class="st15" d="M335.97,408.61h44.82v70.53h-44.82c-18.77,0-34-15.23-34-34v-2.53c0-18.77,15.23-34,34-34Z" transform="translate(682.77 887.74) rotate(180)"/>
<path class="st12" d="M366.59,415.63l-63.51,63.5h42.45c19.39,0,35.26-15.87,35.26-35.26h0c0-11.52-5.6-21.8-14.21-28.24Z"/>
<text class="st4" transform="translate(316.49 455.97)"><tspan x="0" y="0">04</tspan></text>
<path class="st20" d="M345.53,399.27c24.34,0,44.08,19.73,44.08,44.08s-19.73,44.08-44.08,44.08"/>
<g>
<line class="st20" x1="285.38" y1="444.91" x2="252.79" y2="444.91"/>
<polygon class="st15" points="256.72 439.72 254.52 444.91 256.72 450.09 244.43 444.91 256.72 439.72"/>
</g>
</g>
<g>
<path class="st15" d="M335.97,267.55h44.82v70.53h-44.82c-18.77,0-34-15.23-34-34v-2.53c0-18.77,15.23-34,34-34Z" transform="translate(682.77 605.63) rotate(180)"/>
<path class="st12" d="M366.59,274.58l-63.51,63.51h42.45c19.39,0,35.26-15.87,35.26-35.26h0c0-11.52-5.6-21.8-14.21-28.24Z"/>
<text class="st4" transform="translate(315.46 314.92)"><tspan x="0" y="0">02</tspan></text>
<path class="st20" d="M345.53,259.26c24.34,0,44.08,19.73,44.08,44.08s-19.73,44.08-44.08,44.08"/>
<g>
<line class="st20" x1="282.77" y1="303.85" x2="250.18" y2="303.85"/>
<polygon class="st15" points="254.11 298.67 251.91 303.85 254.11 309.04 241.82 303.85 254.11 298.67"/>
</g>
</g>
<text class="st9" transform="translate(58.77 306)"><tspan class="st1"><tspan x="0" y="0">Diseñamos estrategías a la medida, </tspan></tspan><tspan class="st0" x="-7.42" y="9.33">utilizando</tspan><tspan class="st2" x="30.73" y="9.33" xml:space="preserve"> metodologías especializadas</tspan><tspan class="st10" x="149.3" y="9.33"> </tspan><tspan class="st1"><tspan x="13.35" y="18.67">y herramientas tecnológicas.</tspan></tspan></text>
<text class="st9" transform="translate(59.74 443)"><tspan class="st1" x="0" y="0">Medimos</tspan><tspan class="st10" x="37.46" y="0" xml:space="preserve"> resultados con métricas </tspan><tspan class="st10" x="9.44" y="9.33">claras</tspan><tspan class="st1" x="34.15" y="9.33" xml:space="preserve"> para asegurar que cada </tspan><tspan class="st0"><tspan x="-1.16" y="18.67">intervención tenga efectos tangibles.</tspan></tspan></text>
<g>
<g>
<path class="st6" d="M436.4,347.41v-3.2c0-4.42,4.2-8.01,9.37-8.01h9.24c5.18,0,9.37,3.59,9.37,8.01v3.2"/>
<path class="st6" d="M458.52,324.27c0,4.49-3.64,9.57-8.13,9.57s-8.13-5.08-8.13-9.57,3.64-8.13,8.13-8.13,8.13,3.64,8.13,8.13Z"/>
</g>
<g>
<path class="st6" d="M486.37,347.41v-3.2c0-4.42,4.2-8.01,9.37-8.01h9.24c5.18,0,9.37,3.59,9.37,8.01v3.2"/>
<path class="st6" d="M508.49,324.27c0,4.49-3.64,9.57-8.13,9.57s-8.13-5.08-8.13-9.57,3.64-8.13,8.13-8.13,8.13,3.64,8.13,8.13Z"/>
</g>
<g>
<path class="st6" d="M461.38,331.78v-3.2c0-4.42,4.2-8.01,9.37-8.01h9.24c5.18,0,9.37,3.59,9.37,8.01v3.2"/>
<path class="st6" d="M483.51,308.63c0,4.49-3.64,9.57-8.13,9.57s-8.13-5.08-8.13-9.57,3.64-8.13,8.13-8.13,8.13,3.64,8.13,8.13Z"/>
</g>
</g>
<g>
<path class="st6" d="M134.38,231.99c0,1.82-1.48,3.3-3.3,3.3v6.59h6.59c0-1.82,1.48-3.3,3.3-3.3s3.3,1.48,3.3,3.3h6.59v-6.59c1.82,0,3.3-1.48,3.3-3.3s-1.48-3.3-3.3-3.3v-6.59h-6.59c0-1.82-1.48-3.3-3.3-3.3s-3.3,1.48-3.3,3.3h-6.59v6.59c1.82,0,3.3,1.48,3.3,3.3Z"/>
<path class="st6" d="M107.45,241.51c0,1.82-1.48,3.3-3.3,3.3v6.59h6.59c0-1.82,1.48-3.3,3.3-3.3s3.3,1.48,3.3,3.3h6.59v-6.59c1.82,0,3.3-1.48,3.3-3.3s-1.48-3.3-3.3-3.3v-6.59h-6.59c0-1.82-1.48-3.3-3.3-3.3s-3.3,1.48-3.3,3.3h-6.59v6.59c1.82,0,3.3,1.48,3.3,3.3Z"/>
<path class="st6" d="M120.64,261.29c0,1.82,1.48,3.3,3.3,3.3v6.59h6.59c0-1.82,1.48-3.3,3.3-3.3s3.3,1.48,3.3,3.3h6.59v-6.59c1.82,0,3.3-1.48,3.3-3.3s-1.48-3.3-3.3-3.3v-6.59h-6.59c0-1.82-1.48-3.3-3.3-3.3s-3.3,1.48-3.3,3.3h-6.59v6.59c-1.82,0-3.3,1.48-3.3,3.3Z"/>
<path class="st6" d="M107.45,261.29c0,1.82-1.48,3.3-3.3,3.3v6.59h6.59c0-1.82,1.48-3.3,3.3-3.3s3.3,1.48,3.3,3.3h6.59v-6.59c-1.82,0-3.3-1.48-3.3-3.3s1.48-3.3,3.3-3.3v-6.59h-6.59c0-1.82-1.48-3.3-3.3-3.3s-3.3,1.48-3.3,3.3h-6.59v6.59c1.82,0,3.3,1.48,3.3,3.3Z"/>
</g>
<g>
<g>
<rect class="st5" x="99.72" y="391.6" width="14.13" height="14.13" rx="1.32" ry="1.32"/>
<rect class="st5" x="114.53" y="384.53" width="14.13" height="21.2" rx="1.32" ry="1.32"/>
<rect class="st5" x="129.34" y="377.46" width="14.13" height="28.27" rx="1.32" ry="1.32"/>
<rect class="st5" x="144.15" y="370.39" width="14.13" height="35.34" rx="1.32" ry="1.32"/>
</g>
<g>
<path class="st5" d="M134.4,360.49l8.76.86c.32.03.48.39.3.65l-5.13,7.15c-.19.26-.58.22-.71-.07l-3.63-8.02c-.13-.29.1-.61.42-.58Z"/>
<line class="st19" x1="136.22" y1="364.88" x2="109.54" y2="376.97"/>
</g>
</g>
<g>
<rect class="st5" x="445.12" y="187.82" width="14.14" height="14.13" rx="1.32" ry="1.32"/>
<rect class="st5" x="459.93" y="180.75" width="14.13" height="21.2" rx="1.32" ry="1.32"/>
<rect class="st5" x="474.74" y="173.68" width="14.13" height="28.27" rx="1.32" ry="1.32"/>
<rect class="st5" x="489.55" y="166.61" width="14.13" height="35.34" rx="1.32" ry="1.32"/>
</g>
<path class="st6" d="M453.54,466.78c-.06-.62-.08-1.25-.08-1.87,0-2.76.54-5.44,1.61-7.96,1.03-2.43,2.5-4.62,4.38-6.5,1.88-1.88,4.06-3.35,6.5-4.38,2.23-.94,4.58-1.47,7-1.59v-4.33l8.09,6.53-8.09,6.53v-4.3c-3.94.24-7.58,1.87-10.37,4.66-3.03,3.03-4.69,7.05-4.69,11.33,0,.49.02.98.07,1.47l.09,1-4.4.4-.09-1Z"/>
<path class="st6" d="M473.9,487.36c-1.78,0-3.56-.24-5.3-.7-2.56-.69-4.93-1.84-7.04-3.44-1.93-1.46-3.57-3.23-4.87-5.27l-3.75,2.16,1.61-10.27,9.7,3.75-3.73,2.15c2.15,3.27,5.4,5.62,9.23,6.65,1.37.37,2.77.55,4.17.55,2.78,0,5.54-.75,7.98-2.15.42-.24.84-.51,1.24-.79l.82-.57,2.55,3.61-.82.58c-.51.36-1.04.7-1.58,1.01-2.39,1.38-4.98,2.25-7.69,2.59-.84.1-1.68.16-2.52.16Z"/>
<path class="st6" d="M486.5,469.93l3.73,2.15c1.76-3.5,2.17-7.49,1.15-11.31-1.11-4.13-3.76-7.59-7.46-9.73-.42-.24-.86-.47-1.31-.68l-.91-.42,1.86-4.01.91.42c.56.26,1.12.55,1.66.86,2.39,1.38,4.44,3.19,6.09,5.37,1.59,2.11,2.75,4.48,3.44,7.04.69,2.56.87,5.19.54,7.82-.3,2.4-1.01,4.7-2.13,6.86l3.75,2.16-9.7,3.74-1.61-10.27Z"/>
<path class="st5" d="M481.58,472.55c-2.87,2.05-6.27,1.63-7.72.83.08-2.71,1-4.16,2.7-5.76,1.1-1.03,5.97-4.59,6.18-6.37-.72,1.38-2.42,2.39-3.81,3.37-1.39.98-2.82,1.95-3.96,3.21-1.14,1.26-1.98,3.1-1.96,4.8-1.26-2.6-.43-6.49,1.81-8.68,2.41-2.36,6.17-3.08,8.29-5.72,4.11,5.47,3.53,10.68-1.53,14.3Z"/>
<path class="st5" d="M472.6,473.52c-1.32.39-3.47.39-5.32-.94-3.95-2.82-4.4-6.89-1.19-11.16,1.62,2.02,4.48,2.59,6.36,4.36-.3.65-.53,1.35-.68,2.07-.02.11-.04.22-.06.33-.73-.65-1.55-1.22-2.36-1.78-1.09-.77-2.41-1.55-2.98-2.63.16,1.39,3.96,4.16,4.82,4.97.14.13.27.26.4.39-.09,1.36.15,2.65.65,3.75.11.24.24.46.35.63Z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 13 KiB

View File

@ -0,0 +1,228 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 604 601">
<!-- Generator: Adobe Illustrator 29.5.0, SVG Export Plug-In . SVG Version: 2.1.0 Build 137) -->
<defs>
<style>
.st0, .st1 {
font-family: Montserrat-Regular, Montserrat;
}
.st0, .st2 {
letter-spacing: -.02em;
}
.st3, .st4, .st5 {
fill: #5a9ad5;
}
.st3, .st6 {
font-size: 8px;
}
.st7 {
font-family: LeagueSpartan-Bold, 'SYDRR E+ League Spartan';
font-size: 31.11px;
}
.st7, .st8, .st9, .st10, .st11, .st12 {
fill: #fff;
}
.st7, .st13, .st14 {
font-weight: 700;
}
.st15, .st16, .st6, .st17 {
fill: #8fb73b;
}
.st16 {
font-size: 7px;
}
.st18 {
isolation: isolate;
}
.st8 {
stroke-width: .75px;
}
.st8, .st19, .st10, .st11, .st12, .st20 {
stroke-miterlimit: 10;
}
.st8, .st19, .st12 {
stroke: #8fb73b;
}
.st19, .st21, .st20 {
fill: none;
stroke-width: 2px;
}
.st22 {
mix-blend-mode: overlay;
opacity: .2;
}
.st22, .st23, .st14 {
fill: #423585;
}
.st23 {
font-size: 15px;
}
.st10, .st21, .st20 {
stroke: #5a9ad5;
}
.st5, .st17 {
font-family: Montserrat-SemiBold, Montserrat;
font-size: 10.37px;
font-weight: 600;
}
.st13 {
font-family: Montserrat-Bold, Montserrat;
}
.st11 {
stroke: #413585;
}
.st21 {
stroke-linecap: round;
stroke-linejoin: round;
}
.st14 {
font-family: Montserrat-ExtraBold, Montserrat;
font-size: 39.05px;
}
.st24 {
letter-spacing: -.04em;
}
</style>
</defs>
<g class="st18">
<g id="OBJECTS">
<text class="st17" transform="translate(402.19 366.08)"><tspan x="0" y="0">EXPERIENCIA DE SERVICIO</tspan></text>
<text class="st6" transform="translate(396.03 379.28)"><tspan class="st1"><tspan x="0" y="0">Acompañamos cada paso del proyecto, </tspan></tspan><tspan class="st24"><tspan class="st1" x="-20" y="9.33">asegurando una experiencia </tspan><tspan class="st13" x="87.63" y="9.33">cercana, ágil y efectiva.</tspan></tspan></text>
<text class="st17" transform="translate(391.29 506.1)"><tspan x="0" y="0">SOSTENIBILIDAD DEL CAMBIO </tspan></text>
<text class="st6" transform="translate(389.67 519.29)"><tspan class="st13" x="0" y="0">Reforzamos capacidades</tspan><tspan class="st1" x="104.69" y="0" xml:space="preserve"> internas para que el </tspan><tspan class="st1"><tspan x="28.65" y="9.33">valor se mantenga a largo plazo, </tspan></tspan><tspan class="st1"><tspan x="49.92" y="18.67">más allá del proyecto.</tspan></tspan></text>
<text class="st17" transform="translate(420.89 218.81)"><tspan x="0" y="0">ANÁLISIS DE DATOS</tspan></text>
<text class="st16" transform="translate(386.84 231.26)"><tspan class="st1"><tspan x="0" y="0" xml:space="preserve">Identificamos información clave para entender las </tspan></tspan><tspan class="st13" x="7.14" y="10">metas, retos y oportunidades</tspan><tspan class="st1" x="114.68" y="10" xml:space="preserve"> de tu empresa.</tspan></text>
<text class="st14" transform="translate(143.39 73.95)"><tspan x="0" y="0">METODOLOGÍA</tspan></text>
<text class="st23" transform="translate(103.37 118.12)"><tspan class="st1"><tspan x="0" y="0">Implementamos soluciones con el enfoque humano, </tspan></tspan><tspan class="st13"><tspan x="114.04" y="16">técnico y estratégico.</tspan></tspan></text>
<text class="st5" transform="translate(77.25 292.45)"><tspan x="0" y="0">PERSONALIZACIÓN</tspan></text>
<text class="st5" transform="translate(104.86 430.39)"><tspan x="0" y="0">IMPACTO</tspan></text>
<g>
<path class="st15" d="M257.15,197.03h44.82v70.53h-44.82c-18.77,0-34-15.23-34-34v-2.53c0-18.77,15.23-34,34-34Z"/>
<path class="st22" d="M237.92,260.93c5.79,4.16,12.86,6.62,20.49,6.62h43.56v-70.53h-.14l-63.91,63.91Z"/>
<text class="st7" transform="translate(248.04 244.39)"><tspan x="0" y="0">01</tspan></text>
<path class="st19" d="M257.9,188.73c-24.34,0-44.08,19.73-44.08,44.08s19.73,44.08,44.08,44.08"/>
<g>
<line class="st19" x1="317.53" y1="231.25" x2="352.73" y2="231.25"/>
<polygon class="st15" points="348.8 236.44 351 231.25 348.8 226.07 361.09 231.25 348.8 236.44"/>
</g>
</g>
<g>
<path class="st15" d="M257.15,338.08h44.82v70.53h-44.82c-18.77,0-34-15.23-34-34v-2.53c0-18.77,15.23-34,34-34Z"/>
<path class="st22" d="M237.92,401.99c5.79,4.16,12.86,6.62,20.49,6.62h43.56v-70.53h-.14l-63.91,63.91Z"/>
<text class="st7" transform="translate(243.89 385.44)"><tspan x="0" y="0">03</tspan></text>
<path class="st19" d="M258.93,329.78c-24.34,0-44.08,19.73-44.08,44.08s19.73,44.08,44.08,44.08"/>
<g>
<line class="st19" x1="317.53" y1="374.38" x2="352.73" y2="374.38"/>
<polygon class="st15" points="348.8 379.57 351 374.38 348.8 369.2 361.09 374.38 348.8 379.57"/>
</g>
</g>
<g>
<path class="st15" d="M257.15,479.13h44.82v70.53h-44.82c-18.77,0-34-15.23-34-34v-2.53c0-18.77,15.23-34,34-34Z"/>
<path class="st22" d="M237.92,543.04c5.79,4.16,12.86,6.62,20.49,6.62h43.56v-70.53h-.14l-63.91,63.91Z"/>
<text class="st7" transform="translate(243.89 526.5)"><tspan x="0" y="0">05</tspan></text>
<path class="st19" d="M257.9,470.84c-24.34,0-44.08,19.73-44.08,44.08s19.73,44.08,44.08,44.08"/>
<g>
<line class="st19" x1="317.53" y1="514.4" x2="352.73" y2="514.4"/>
<polygon class="st15" points="348.8 519.58 351 514.4 348.8 509.21 361.09 514.4 348.8 519.58"/>
</g>
</g>
<g>
<path class="st4" d="M335.97,408.61h44.82v70.53h-44.82c-18.77,0-34-15.23-34-34v-2.53c0-18.77,15.23-34,34-34Z" transform="translate(682.77 887.74) rotate(180)"/>
<path class="st22" d="M366.59,415.63l-63.51,63.5h42.45c19.39,0,35.26-15.87,35.26-35.26h0c0-11.52-5.6-21.8-14.21-28.24Z"/>
<text class="st7" transform="translate(316.49 455.97)"><tspan x="0" y="0">04</tspan></text>
<path class="st20" d="M345.53,399.27c24.34,0,44.08,19.73,44.08,44.08s-19.73,44.08-44.08,44.08"/>
<g>
<line class="st20" x1="285.38" y1="444.91" x2="252.79" y2="444.91"/>
<polygon class="st4" points="256.72 439.72 254.52 444.91 256.72 450.09 244.43 444.91 256.72 439.72"/>
</g>
</g>
<g>
<path class="st4" d="M335.97,267.55h44.82v70.53h-44.82c-18.77,0-34-15.23-34-34v-2.53c0-18.77,15.23-34,34-34Z" transform="translate(682.77 605.63) rotate(180)"/>
<path class="st22" d="M366.59,274.58l-63.51,63.51h42.45c19.39,0,35.26-15.87,35.26-35.26h0c0-11.52-5.6-21.8-14.21-28.24Z"/>
<text class="st7" transform="translate(315.46 314.92)"><tspan x="0" y="0">02</tspan></text>
<path class="st20" d="M345.53,259.26c24.34,0,44.08,19.73,44.08,44.08s-19.73,44.08-44.08,44.08"/>
<g>
<line class="st20" x1="282.77" y1="303.85" x2="250.18" y2="303.85"/>
<polygon class="st4" points="254.11 298.67 251.91 303.85 254.11 309.04 241.82 303.85 254.11 298.67"/>
</g>
</g>
<text class="st3" transform="translate(58.77 306)"><tspan class="st1"><tspan x="0" y="0">Diseñamos estrategías a la medida, </tspan></tspan><tspan class="st2"><tspan class="st1" x="-7.34" y="9.33">utilizando </tspan><tspan class="st13" x="32.75" y="9.33">metodologías especializadas </tspan></tspan><tspan class="st1"><tspan x="13.35" y="18.67">y herramientas tecnológicas.</tspan></tspan></text>
<text class="st3" transform="translate(59.82 443)"><tspan class="st1" x="0" y="0">Medimos </tspan><tspan class="st13" x="39.56" y="0">resultados con métricas </tspan><tspan class="st13" x="9.36" y="9.33">claras</tspan><tspan class="st1" x="34.06" y="9.33" xml:space="preserve"> para asegurar que cada </tspan><tspan class="st0"><tspan x="-1.25" y="18.67">intervención tenga efectos tangibles.</tspan></tspan></text>
<g>
<g>
<path class="st12" d="M436.4,347.41v-3.2c0-4.42,4.2-8.01,9.37-8.01h9.24c5.18,0,9.37,3.59,9.37,8.01v3.2"/>
<path class="st12" d="M458.52,324.27c0,4.49-3.64,9.57-8.13,9.57s-8.13-5.08-8.13-9.57,3.64-8.13,8.13-8.13,8.13,3.64,8.13,8.13Z"/>
</g>
<g>
<path class="st12" d="M486.37,347.41v-3.2c0-4.42,4.2-8.01,9.37-8.01h9.24c5.18,0,9.37,3.59,9.37,8.01v3.2"/>
<path class="st12" d="M508.49,324.27c0,4.49-3.64,9.57-8.13,9.57s-8.13-5.08-8.13-9.57,3.64-8.13,8.13-8.13,8.13,3.64,8.13,8.13Z"/>
</g>
<g>
<path class="st12" d="M461.38,331.78v-3.2c0-4.42,4.2-8.01,9.37-8.01h9.24c5.18,0,9.37,3.59,9.37,8.01v3.2"/>
<path class="st12" d="M483.51,308.63c0,4.49-3.64,9.57-8.13,9.57s-8.13-5.08-8.13-9.57,3.64-8.13,8.13-8.13,8.13,3.64,8.13,8.13Z"/>
</g>
</g>
<g>
<path class="st10" d="M134.38,231.99c0,1.82-1.48,3.3-3.3,3.3v6.59h6.59c0-1.82,1.48-3.3,3.3-3.3s3.3,1.48,3.3,3.3h6.59v-6.59c1.82,0,3.3-1.48,3.3-3.3s-1.48-3.3-3.3-3.3v-6.59h-6.59c0-1.82-1.48-3.3-3.3-3.3s-3.3,1.48-3.3,3.3h-6.59v6.59c1.82,0,3.3,1.48,3.3,3.3Z"/>
<path class="st10" d="M107.45,241.51c0,1.82-1.48,3.3-3.3,3.3v6.59h6.59c0-1.82,1.48-3.3,3.3-3.3s3.3,1.48,3.3,3.3h6.59v-6.59c1.82,0,3.3-1.48,3.3-3.3s-1.48-3.3-3.3-3.3v-6.59h-6.59c0-1.82-1.48-3.3-3.3-3.3s-3.3,1.48-3.3,3.3h-6.59v6.59c1.82,0,3.3,1.48,3.3,3.3Z"/>
<path class="st10" d="M120.64,261.29c0,1.82,1.48,3.3,3.3,3.3v6.59h6.59c0-1.82,1.48-3.3,3.3-3.3s3.3,1.48,3.3,3.3h6.59v-6.59c1.82,0,3.3-1.48,3.3-3.3s-1.48-3.3-3.3-3.3v-6.59h-6.59c0-1.82-1.48-3.3-3.3-3.3s-3.3,1.48-3.3,3.3h-6.59v6.59c-1.82,0-3.3,1.48-3.3,3.3Z"/>
<path class="st10" d="M107.45,261.29c0,1.82-1.48,3.3-3.3,3.3v6.59h6.59c0-1.82,1.48-3.3,3.3-3.3s3.3,1.48,3.3,3.3h6.59v-6.59c-1.82,0-3.3-1.48-3.3-3.3s1.48-3.3,3.3-3.3v-6.59h-6.59c0-1.82-1.48-3.3-3.3-3.3s-3.3,1.48-3.3,3.3h-6.59v6.59c1.82,0,3.3,1.48,3.3,3.3Z"/>
</g>
<g>
<g>
<rect class="st10" x="99.72" y="391.6" width="14.13" height="14.13" rx="1.32" ry="1.32"/>
<rect class="st10" x="114.53" y="384.53" width="14.13" height="21.2" rx="1.32" ry="1.32"/>
<rect class="st10" x="129.34" y="377.46" width="14.13" height="28.27" rx="1.32" ry="1.32"/>
<rect class="st10" x="144.15" y="370.39" width="14.13" height="35.34" rx="1.32" ry="1.32"/>
</g>
<g>
<path class="st4" d="M134.4,360.49l8.76.86c.32.03.48.39.3.65l-5.13,7.15c-.19.26-.58.22-.71-.07l-3.63-8.02c-.13-.29.1-.61.42-.58Z"/>
<line class="st21" x1="136.22" y1="364.88" x2="109.54" y2="376.97"/>
</g>
</g>
<g>
<rect class="st12" x="445.12" y="187.82" width="14.14" height="14.13" rx="1.32" ry="1.32"/>
<rect class="st12" x="459.93" y="180.75" width="14.13" height="21.2" rx="1.32" ry="1.32"/>
<rect class="st12" x="474.74" y="173.68" width="14.13" height="28.27" rx="1.32" ry="1.32"/>
<rect class="st12" x="489.55" y="166.61" width="14.13" height="35.34" rx="1.32" ry="1.32"/>
</g>
<path class="st11" d="M473.9,487.36c-1.78,0-3.56-.24-5.3-.7-2.56-.69-4.93-1.84-7.04-3.44-1.93-1.46-3.57-3.23-4.87-5.27l-3.75,2.16,1.61-10.27,9.7,3.75-3.73,2.15c2.15,3.27,5.4,5.62,9.23,6.65,1.37.37,2.77.55,4.17.55,2.78,0,5.54-.75,7.98-2.15.42-.24.84-.51,1.24-.79l.82-.57,2.55,3.61-.82.58c-.51.36-1.04.7-1.58,1.01-2.39,1.38-4.98,2.25-7.69,2.59-.84.1-1.68.16-2.52.16Z"/>
<g>
<path class="st8" d="M453.54,466.84c-.06-.62-.08-1.25-.08-1.87,0-2.76.54-5.44,1.61-7.96,1.03-2.43,2.5-4.62,4.38-6.5,1.88-1.88,4.06-3.35,6.5-4.38,2.23-.94,4.58-1.47,7-1.59v-4.33l8.09,6.53-8.09,6.53v-4.3c-3.94.24-7.58,1.87-10.37,4.66-3.03,3.03-4.69,7.05-4.69,11.33,0,.49.02.98.07,1.47l.09,1-4.4.4-.09-1Z"/>
<path class="st8" d="M473.9,487.41c-1.78,0-3.56-.24-5.3-.7-2.56-.69-4.93-1.84-7.04-3.44-1.93-1.46-3.57-3.23-4.87-5.27l-3.75,2.16,1.61-10.27,9.7,3.75-3.73,2.15c2.15,3.27,5.4,5.62,9.23,6.65,1.37.37,2.77.55,4.17.55,2.78,0,5.54-.75,7.98-2.15.42-.24.84-.51,1.24-.79l.82-.57,2.55,3.61-.82.58c-.51.36-1.04.7-1.58,1.01-2.39,1.38-4.98,2.25-7.69,2.59-.84.1-1.68.16-2.52.16Z"/>
<path class="st8" d="M486.5,469.98l3.73,2.15c1.76-3.5,2.17-7.49,1.15-11.31-1.11-4.13-3.76-7.59-7.46-9.73-.42-.24-.86-.47-1.31-.68l-.91-.42,1.86-4.01.91.42c.56.26,1.12.55,1.66.86,2.39,1.38,4.44,3.19,6.09,5.37,1.59,2.11,2.75,4.48,3.44,7.04.69,2.56.87,5.19.54,7.82-.3,2.4-1.01,4.7-2.13,6.86l3.75,2.16-9.7,3.74-1.61-10.27Z"/>
<g>
<path class="st9" d="M481.58,472.61c-2.87,2.05-6.27,1.63-7.72.83.08-2.71,1-4.16,2.7-5.76,1.1-1.03,5.97-4.59,6.18-6.37-.72,1.38-2.42,2.39-3.81,3.37-1.39.98-2.82,1.95-3.96,3.21-1.14,1.26-1.98,3.1-1.96,4.8-1.26-2.6-.43-6.49,1.81-8.68,2.41-2.36,6.17-3.08,8.29-5.72,4.11,5.47,3.53,10.68-1.53,14.3Z"/>
<path class="st15" d="M481.45,472.39c-1.26.88-2.73,1.39-4.27,1.45-1.07.04-2.24-.1-3.2-.62l.12.22c.04-1.29.3-2.55.98-3.66.53-.86,1.25-1.6,2.01-2.25,1.5-1.28,3.09-2.48,4.45-3.92.57-.6,1.31-1.37,1.43-2.23.04-.26-.31-.47-.46-.19-.61,1.13-1.71,1.89-2.74,2.6-1.1.76-2.21,1.51-3.26,2.34-2.05,1.62-3.76,3.84-3.76,6.57l.47-.13c-1.06-2.24-.54-5.07.74-7.1,1.39-2.2,3.83-3.2,6.01-4.42,1.22-.69,2.41-1.48,3.3-2.57l-.39-.05c1.32,1.77,2.43,3.82,2.65,6.05.19,1.9-.33,3.75-1.43,5.31-.72,1.02-1.65,1.87-2.66,2.6-.26.19,0,.62.25.43,1.75-1.26,3.25-2.89,3.96-4.96s.48-4.1-.26-6.01c-.51-1.32-1.24-2.54-2.08-3.66-.09-.12-.28-.19-.39-.05-1.73,2.12-4.42,2.97-6.64,4.42-1.09.71-2.05,1.57-2.75,2.68s-1.11,2.31-1.28,3.57c-.18,1.37-.05,2.78.54,4.03.11.23.47.11.47-.13,0-1.32.47-2.61,1.18-3.71s1.82-2.06,2.91-2.87,2.12-1.49,3.18-2.24c.93-.67,1.87-1.41,2.42-2.43l-.46-.19c-.11.77-.77,1.44-1.27,1.98-.74.79-1.56,1.52-2.39,2.22-1.46,1.24-3.08,2.36-4.13,4-.76,1.2-1.05,2.59-1.1,3.99,0,.08.05.18.12.22,1.04.56,2.29.73,3.45.68,1.62-.06,3.19-.59,4.52-1.52.26-.18.01-.62-.25-.43Z"/>
</g>
<g>
<path class="st9" d="M472.6,473.58c-1.32.39-3.47.39-5.32-.94-3.95-2.82-4.4-6.89-1.19-11.16,1.62,2.02,4.48,2.59,6.36,4.36-.3.65-.53,1.34-.68,2.07-.02.11-.04.22-.06.33-.73-.65-1.55-1.22-2.36-1.78-1.09-.77-2.41-1.55-2.98-2.63.16,1.39,3.96,4.16,4.82,4.97.14.13.27.26.4.39-.09,1.36.15,2.65.65,3.75.11.24.24.46.35.63Z"/>
<path class="st15" d="M472.53,473.34c-1.03.3-2.15.29-3.19,0-1.27-.34-2.36-1.12-3.26-2.05-1.53-1.58-2.2-3.7-1.69-5.86.33-1.4,1.05-2.68,1.91-3.82l-.39.05c1.68,2.05,4.46,2.6,6.36,4.36l-.04-.3c-.36.79-.62,1.61-.77,2.46l.42-.11c-.91-.8-1.92-1.49-2.91-2.17-.88-.6-1.86-1.23-2.38-2.19-.15-.27-.49-.07-.46.19.07.51.44.96.76,1.35.47.56,1,1.06,1.54,1.54.98.87,2.07,1.64,2.99,2.59l-.07-.18c-.09,1.55.19,3.19,1.04,4.51.17.27.61.02.43-.25-.62-.96-.92-2.12-.98-3.25-.02-.3,0-.59,0-.89s-.18-.41-.38-.6c-.18-.17-.36-.32-.54-.48-1.12-.93-2.27-1.83-3.28-2.89-.4-.42-.94-.96-1.02-1.57l-.46.19c.52.96,1.45,1.6,2.32,2.21,1.04.72,2.1,1.42,3.05,2.26.13.11.38.09.42-.11.14-.81.38-1.59.72-2.34.05-.1.05-.22-.04-.3-1.9-1.76-4.7-2.32-6.36-4.36-.11-.14-.31-.06-.39.05-1.5,2-2.59,4.52-1.99,7.05.26,1.11.85,2.12,1.6,2.98.88,1,2.01,1.86,3.27,2.3s2.65.5,3.91.13c.31-.09.18-.57-.13-.48Z"/>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -10,6 +10,8 @@
{% block body %}
<div id="carouselExampleCaptions" class="carousel slide" data-bs-ride="carousel" data-aos="fade-left" data-aos-delay="300" data-aos-duration="800">
<div class="carousel-indicators">
<!-- {# inicio card item slide #} -->

View File

@ -10,57 +10,23 @@
{% block body %}
<div class="container py-5" data-aos="fade-up" data-aos-delay="0" data-aos-duration="800">
<h2 class="text-center mb-4">Nuestra Metodología</h2>
<p class="text-center text-muted mb-5">Implementamos soluciones con enfoque humano, técnico y estratégico.</p>
<div class="row g-4">
<div class="col-md-6">
<div class="card shadow-sm h-100" style="border: 2px solid#90b83b;">
<div class="card-body">
<h5 class="card-title" style="color: #90b83b;"><i class="bi bi-bar-chart-line me-2"></i> ANÁLISIS DE DATOS</h5>
<p class="card-text">Identificamos información clave para entender las metas, retos y oportunidades estratégicas de tu empresa.</p>
</div>
</div>
</div>
<img id="random-img" alt="Imagen aleatoria" data-aos="fade-up" data-aos-delay="0" data-aos-duration="800">
<div class="col-md-6">
<div class="card shadow-sm h-100" style="border: 2px solid#8c1f5a;">
<div class="card-body">
<h5 class="card-title" style="color: #8c1f5a;"><i class="bi bi-sliders me-2"></i> PERSONALIZACIÓN</h5>
<p class="card-text">Diseñamos estrategias a la medida, utilizando metodologías especializadas y herramientas tecnológicas.</p>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card shadow-sm h-100" style="border: 2px solid#5d9dd1;">
<div class="card-body">
<h5 class="card-title" style="color: #5d9dd1;"><i class="bi bi-people me-2"></i> EXPERIENCIA DE SERVICIO</h5>
<p class="card-text">Acompañamos cada paso del proyecto, asegurando una experiencia cercana, ágil y efectiva.</p>
</div>
</div>
</div>
<script>
document.addEventListener("DOMContentLoaded", () => {
const images = [
"{{ url_for('static', filename='y_img/methodology/m-01.svg') }}",
"{{ url_for('static', filename='y_img/methodology/m-02.svg') }}"
];
const randomIndex = Math.floor(Math.random() * images.length);
document.getElementById("random-img").src = images[randomIndex];
});
</script>
<div class="col-md-6">
<div class="card shadow-sm h-100" style="border: 2px solid#002e72;">
<div class="card-body">
<h5 class="card-title" style="color: #002e72;"><i class="bi bi-graph-up-arrow me-2"></i> IMPACTO</h5>
<p class="card-text">Medimos resultados con métricas claras para asegurar que cada intervención tenga efectos tangibles.</p>
</div>
</div>
</div>
<div class="col-md-12">
<div class="card shadow-sm h-100" style="border: 2px solid#707272;">
<div class="card-body">
<h5 class="card-title" style="color: #707272;"><i class="bi bi-arrow-repeat me-2"></i> SOSTENIBILIDAD DEL CAMBIO</h5>
<p class="card-text">Reforzamos capacidades internas para que el valor se mantenga a largo plazo, más allá del proyecto.</p>
</div>
</div>
</div>
</div>
</div>
{% endblock body %}

View File

@ -11,11 +11,6 @@
{% block body %}
<!-- https://codepen.io/componentity/embed/RwajNdW?height=500&theme-id=dark&default-tab=result&user=componentity&slug-hash=RwajNdW&pen-title=Blog%20Card%20Section%20Bootstrap%20-%202nd&name=cp_embed_1 -->
<!-- https://codepen.io/anon/embed/dgmjKK?height=602&theme-id=dark&slug-hash=dgmjKK&default-tab=result&animations=run&editable=&embed-version=2&user=anon&name=cp_embed_23 -->
<!-- https://bootstrapbrain.com/component/bootstrap-5-blog-card/#code -->
<!-- <div class="col-md-12"> -->
<style>
.fade-out {
opacity: 0;
@ -23,6 +18,75 @@
}
</style>
<style>
@media (max-width: 576px) {
#card-container {
justify-content: center;
}
}
</style>
<style>
/* Smartphones (hasta 767px) */
@media (max-width: 767px) {
/* main{ background-color: black; } */
main {
min-height: 80dvh;
}
}
/* Tablets (768px - 1023px) */
@media (min-width: 768px) and (max-width: 1023px) {
/* main{ background-color: pink; } */
main {
min-height: 80dvh;
}
}
/* Laptops (1024px - 1439px) monitores resulición baja */
@media (min-width: 1024px) and (max-width: 1439px) {
/* main{ background-color: purple; } */
main {
min-height: 80dvh;
}
}
/* PCs de escritorio (1440px - 1919px) macbook */
@media (min-width: 1440px) and (max-width: 1919px) {
/* main{ background-color: greenyellow; } */
main {
min-height: 80dvh;
}
}
/* Pantallas Ultrawide (1920px en adelante) */
@media (min-width: 1920px) {
/* main{ background-color: red; } */
main {
min-height: 80dvh;
}
}
</style>
<div class="container">
@ -54,11 +118,11 @@
</nav>
{% endif %}
<!-- {# f pagination #} -->
<div class="row row-cols-1 row-cols-sm-2 row-cols-md-3 row-cols-lg-4 g-4" id="card-container">
<div class="row row-cols-1 row-cols-sm-2 row-cols-md-3 row-cols-lg-4 g-4" id="card-container" data-aos="zoom-out-left" data-aos-delay="0" data-aos-duration="800" data-aos-easing="ease-in-out">
{% for ele in data %}
<div class="col card-wrapper" data-id="{{ele[0]}}" data-aos="zoom-out-left" data-aos-delay="{{loop.index * 100 }}"
data-aos-duration="800" data-aos-easing="ease-in-out">
<div class="col card-wrapper" data-id="{{ele[0]}}">
<div class="card h-100">
<img src="{{ (ele[5] if ele[5] is not none else url_for('static', filename='y_img/other/no_img.png'))|safe }}"

View File

@ -13,6 +13,9 @@
{% block body %}
<style>
/* estilos del carousel */
@media screen and (orientation: landscape) {
@ -77,35 +80,236 @@
</style>
<style>
/* Smartphones (hasta 767px) */
@media (max-width: 767px) {
/* main{ background-color: black; } */
#myTabContent{
min-height: 80dvh;
}
}
/* Tablets (768px - 1023px) */
@media (min-width: 768px) and (max-width: 1023px) {
/* main{ background-color: pink; } */
#myTabContent{
min-height: 80dvh;
}
}
/* Laptops (1024px - 1439px) monitores resulición baja */
@media (min-width: 1024px) and (max-width: 1439px) {
/* main{ background-color: purple; } */
#myTabContent{
min-height: 80dvh;
}
}
/* PCs de escritorio (1440px - 1919px) macbook */
@media (min-width: 1440px) and (max-width: 1919px) {
/* main{ background-color: greenyellow; } */
#myTabContent{
min-height: 80dvh;
}
}
/* Pantallas Ultrawide (1920px en adelante) */
@media (min-width: 1920px) {
/* main{ background-color: red; } */
#myTabContent{
min-height: 80dvh;
}
}
</style>
<style>
/* Estilo responsive para móviles */
@media screen and (max-width: 768px) {
#tblCarousel {
width: 100%;
margin: 0;
padding: 0;
}
#tblCarousel_wrapper {
padding: 0 !important;
margin: 0 -0.5rem; /* Compensa el padding de las celdas */
}
#tblCarousel thead {
display: none;
}
#tblCarousel tbody {
display: block;
width: 100%;
}
#tblCarousel tr {
display: block;
width: calc(100% - 2rem); /* Resta el padding horizontal */
margin: 0.5rem 1rem 1rem;
padding: 1rem;
border: 1px solid #ddd;
border-radius: 0.75rem;
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);
background-color: white;
box-sizing: border-box;
}
#tblCarousel td {
display: block;
width: 100%;
position: relative;
padding: 0.75rem 1rem 0.75rem 7.5rem; /* Más espacio para etiquetas */
border: none;
border-bottom: 1px solid #eee;
text-align: left;
word-break: break-word;
box-sizing: border-box;
min-height: 3rem;
}
#tblCarousel td::before {
content: attr(data-label);
position: absolute;
top: 0.75rem;
left: 1rem;
width: 6rem; /* Ancho fijo para etiquetas */
font-weight: 600;
color: #444;
font-size: 0.85rem;
white-space: normal;
overflow: hidden;
text-overflow: ellipsis;
}
#tblCarousel td:last-child {
border-bottom: none;
padding-bottom: 0;
}
.field_btns {
display: flex;
justify-content: flex-start;
flex-wrap: wrap;
gap: 0.5rem;
margin-top: 0.5rem;
}
.field_btns a {
flex: 0 1 calc(50% - 0.5rem); /* Dos botones por fila */
min-width: 0;
text-align: center;
padding: 0.375rem 0.5rem;
}
/* Manejo específico de columnas con contenido largo */
#tblCarousel td[data-label="Archivo"],
#tblCarousel td[data-label="Texto"] {
white-space: normal;
max-height: none;
overflow: visible;
}
/* Ajuste para filas con menos contenido */
#tblCarousel td[data-label="ID"],
#tblCarousel td[data-label="New Tab"] {
min-height: 2.5rem;
}
}
</style>
<style>
/* formulario */
/* Ajustes para móviles */
@media (max-width: 576px) {
.form-control-color {
width: 3rem;
height: 3rem;
}
.input-group-text {
font-size: 0.8rem;
padding: 0.375rem 0.5rem;
}
.btn-lg {
padding: 0.5rem 1rem;
font-size: 1rem;
}
}
/* Mejora para los contadores de caracteres */
.form-text {
text-align: right;
font-size: 0.8rem;
}
/* Estilo para los inputs de color */
.input-group .form-control-color {
flex: 0 0 auto;
width: 3.5rem;
}
</style>
<ul class="nav nav-tabs" id="myTab" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link active" id="home-tab" data-bs-toggle="tab" data-bs-target="#home" type="button" role="tab" aria-controls="home" aria-selected="true"><i class="bi bi-file-earmark-slides-fill"></i> Slides</button>
<button class="nav-link active" id="home-tab" data-bs-toggle="tab" data-bs-target="#home" type="button" role="tab"
aria-controls="home" aria-selected="true"><i class="bi bi-file-earmark-slides-fill"></i> Slides</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="profile-tab" data-bs-toggle="tab" data-bs-target="#profile" type="button" role="tab" aria-controls="profile" aria-selected="false"><i class="bi bi-database-fill-up"></i> Añadir Slide</button>
<button class="nav-link" id="profile-tab" data-bs-toggle="tab" data-bs-target="#profile" type="button" role="tab"
aria-controls="profile" aria-selected="false"><i class="bi bi-database-fill-up"></i> Añadir Slide</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="contact-tab" data-bs-toggle="tab" data-bs-target="#contact" type="button" role="tab" aria-controls="contact" aria-selected="false"><i class="bi bi-play-circle-fill"></i> Carousel</button>
<button class="nav-link" id="contact-tab" data-bs-toggle="tab" data-bs-target="#contact" type="button" role="tab"
aria-controls="contact" aria-selected="false"><i class="bi bi-play-circle-fill"></i> Carousel</button>
</li>
</ul>
<div class="tab-content" id="myTabContent">
<div class="tab-pane fade show active" id="home" role="tabpanel" aria-labelledby="home-tab">
<div class="tab-pane fade show active table-responsive" id="home" role="tabpanel" aria-labelledby="home-tab">
<!-- {# --------------------------------------------------------------- #} -->
<!-- {# i tabla slides #} -->
<table id="tblCarousel" class="table table-striped" style="width:100%">
<table id="tblCarousel" class="table table-striped display responsive nowrap" style="width:100%">
<thead>
<th>ID</th>
<th>Creado</th>
<th>Archivo</th>
<th>New Tab</th>
<th>Texto</th>
<th>Acciones</th>
<tr>
<th>ID</th>
<th>Creado</th>
<th>Archivo</th>
<th>New Tab</th>
<th>Texto</th>
<th>Acciones</th>
</tr>
</thead>
<tbody>
{% for ele in data %}
@ -131,67 +335,136 @@
</tr>
{% endfor %}
</tbody>
</table>
<!-- {# f tabla slides #} -->
<!-- {# --------------------------------------------------------------- #} -->
</div>
<div class="tab-pane fade" id="profile" role="tabpanel" aria-labelledby="profile-tab">
<!-- {# --------------------------------------------------------------- #} -->
<!-- {# i form add slide #} -->
<!-- {# inicio form #} -->
<div class="form-container" data-aos="fade-down" data-aos-delay="0" data-aos-duration="800"
<!-- {# inicio form #} -->
<div class="form-container" data-aos="fade-down" data-aos-delay="0" data-aos-duration="800"
data-aos-easing="ease-in-out">
<div class="form-header">
<h2>Agregar Slide</h2>
</div>
<form method="POST" action="{{ url_for('carousel') }}" enctype="multipart/form-data" class="login-form">
{{ form.hidden_tag() }}
<!-- {# input imagen #} -->
<div class="form-row">
{{ form.img.label() }}
{{ form.img( class_="form-control" ) }}
</div>
<form method="POST" action="{{ url_for('carousel') }}" enctype="multipart/form-data" class="needs-validation" novalidate>
{{ form.hidden_tag() }}
<!-- Fila 1: Campos de imagen y colores -->
<div class="row">
<!-- Input imagen - Ocupa todo el ancho en móviles, mitad en pantallas medianas/grandes -->
<div class="col-12 col-md-6 mb-3">
{{ form.img.label(class="form-label fw-bold") }}
{{ form.img(class="form-control") }}
<div class="invalid-feedback">
Por favor selecciona un archivo válido.
</div>
<small class="form-text text-muted">
Formatos soportados: JPG, PNG, GIF, MP4 (max 5MB)
</small>
</div>
<!-- bg color picker - Apila en móviles, 2 por fila en pantallas medianas/grandes -->
<div class="col-6 col-md-3 mb-3">
{{ form.bg_color.label(class="form-label fw-bold") }}
<div class="input-group">
{{ form.bg_color(type="color", class="form-control form-control-color", value="#ffffff") }}
<span class="input-group-text">{{ form.bg_color.data }}</span>
</div>
</div>
<!-- txt color picker -->
<div class="col-6 col-md-3 mb-3">
{{ form.txt_color.label(class="form-label fw-bold") }}
<div class="input-group">
{{ form.txt_color(type="color", class="form-control form-control-color", value="#000000") }}
<span class="input-group-text">{{ form.txt_color.data }}</span>
</div>
</div>
</div>
<!-- Fila 2: Campos de texto y URL -->
<div class="row">
<!-- txt - Ocupa todo el ancho en móviles, 2/3 en pantallas medianas/grandes -->
<div class="col-12 col-md-8 mb-3">
{{ form.txt.label(class="form-label fw-bold") }}
{{ form.txt(class="form-control", maxlength="350", rows="3", placeholder="Texto que aparecerá en el slide") }}
<div class="form-text">
<span id="txt-counter">0</span>/350 caracteres
</div>
</div>
<!-- url - Ocupa todo el ancho en móviles, 1/3 en pantallas medianas/grandes -->
<div class="col-12 col-md-4 mb-3">
{{ form.url.label(class="form-label fw-bold") }}
{{ form.url(class="form-control", maxlength="250", placeholder="https://ejemplo.com") }}
<div class="form-text">
<span id="url-counter">0</span>/250 caracteres
</div>
</div>
</div>
<!-- Switch para new tab -->
<div class="row mb-4">
<div class="col-12">
<div class="form-check form-switch">
{{ form.isNewTab(class="form-check-input", type="checkbox", role="switch") }}
{{ form.isNewTab.label(class="form-check-label fw-bold") }}
</div>
</div>
</div>
<!-- Botón de submit -->
<div class="d-grid gap-2 d-md-flex justify-content-md-end">
<button type="submit" class="btn btn-primary btn-lg">
<i class="bi bi-database-fill-up me-2"></i>Guardar Slide
</button>
</div>
</form>
<!-- JavaScript para contadores de caracteres -->
<script>
document.addEventListener('DOMContentLoaded', function() {
// Contador para el campo de texto
const txtField = document.querySelector('#{{ form.txt.id }}');
const txtCounter = document.querySelector('#txt-counter');
txtField.addEventListener('input', function() {
txtCounter.textContent = this.value.length;
});
// Contador para el campo URL
const urlField = document.querySelector('#{{ form.url.id }}');
const urlCounter = document.querySelector('#url-counter');
urlField.addEventListener('input', function() {
urlCounter.textContent = this.value.length;
});
// Validación del formulario
const forms = document.querySelectorAll('.needs-validation');
Array.from(forms).forEach(form => {
form.addEventListener('submit', event => {
if (!form.checkValidity()) {
event.preventDefault();
event.stopPropagation();
}
form.classList.add('was-validated');
}, false);
});
});
</script>
<!-- {# bg color picker #} -->
<div class="form-row">
{{ form.bg_color.label() }}
{{ form.bg_color( type="color", class_="form-control form-control-color", value="") }}
</div>
<!-- {# txt color picker #} -->
<div class="form-row">
{{ form.txt_color.label() }}
{{ form.txt_color( type="color", class_="form-control form-control-color", value="" ) }}
</div>
<!-- {# txt #} -->
<div class="form-row">
{{ form.txt.label() }}
{{ form.txt( class_="form-control" ) }}
</div>
<!-- {# url #} -->
<div class="form-row">
{{ form.url.label() }}
{{ form.url( class_="form-control" ) }}
</div>
<!-- {# isNewTab #} -->
<div class="form-check form-switch">
<div class="form-row">
{{ form.isNewTab( class_="form-check-input", type="checkbox" ) }}
{{ form.isNewTab.label() }}
</div>
</div>
<button type="submit" class="btn btn-primary">
<i class="bi bi-database-fill-up"></i> Enviar Datos
</button>
</form>
</div>
<!-- {# final form #} -->
<!-- {# f form add slide #} -->
@ -201,7 +474,8 @@
<div class="tab-pane fade" id="contact" role="tabpanel" aria-labelledby="contact-tab">
<!-- {# --------------------------------------------------------------- #} -->
<!-- {# i carousel #} -->
<div id="carouselExampleCaptions" class="carousel slide" data-bs-ride="carousel">
<div id="carouselExampleCaptions" class="carousel slide" data-bs-ride="carousel" data-bs-touch="true">
<!-- <div id="carouselExampleCaptions" class="carousel slide" data-bs-ride="carousel"> -->
<div class="carousel-indicators">
{% for s in data %}
<button type="button" data-bs-target="#carouselExampleCaptions" data-bs-slide-to="{{ loop.index0 }}"
@ -224,7 +498,7 @@
<div class="carousel-caption centered">
<div class="caption-content" style="background-color: {{ s[2] }}; color: {{ s[3] }};">
<h2>{{ s[4] }}</h2>
{% if s[6] is not none %}
{% if s[6] is not none %}
<a href="{{ s[6] }}" type="button" class="btn btn-success" target="_blank">ver más</a>
{% endif %}
</div>
@ -233,11 +507,13 @@
{% endfor %}
<!-- {# fin card item slide #} -->
</div>
<button class="carousel-control-prev" type="button" data-bs-target="#carouselExampleCaptions" data-bs-slide="prev">
<button class="carousel-control-prev" type="button" data-bs-target="#carouselExampleCaptions"
data-bs-slide="prev">
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
<span class="visually-hidden">Previous</span>
</button>
<button class="carousel-control-next" type="button" data-bs-target="#carouselExampleCaptions" data-bs-slide="next">
<button class="carousel-control-next" type="button" data-bs-target="#carouselExampleCaptions"
data-bs-slide="next">
<span class="carousel-control-next-icon" aria-hidden="true"></span>
<span class="visually-hidden">Next</span>
</button>
@ -248,10 +524,6 @@
</div>
{% endblock body %}
{% block js %}
@ -267,117 +539,6 @@
<script src="https://htmlguyllc.github.io/jConfirm/jConfirm.min.js"></script>
<script>
function delete_file(e) {
let btn = $(this);
let postId = btn.data('id');
let url = `${window.location.origin}/user/carousel/delete-slide/${postId}`;
fetch(url, {
method: 'DELETE',
headers: {
'Authorization': 'Bearer ' + localStorage.getItem('token_ai') // o tu token JWT
}
})
.then(res => res.json())
.then(data => {
if (data.msg) {
console.log(data.msg);
let btn = document.querySelector(`[data-id="${postId}"]`);
let row = $(btn).closest('tr'); // usa jQuery para compatibilidad con DataTables
let table = $('#tblCarousel').DataTable(); // obtiene instancia
table.row(row).remove().draw(); // elimina la fila y redibuja la tabla
// eliminar el tr del slide si quieres: btn.closest('tr').remove();
} else {
console.error('Error:', data.error);
}
})
.catch(err => console.error('Error en fetch:', err));
}
// https://htmlguyllc.github.io/jConfirm/
$(function(){
$('.delete-btn').jConfirm({
//false|array: if provided, this will override the default confirm/deny buttons (see below for an example)
btns: false,
//string: question displayed to the user
question: '¿Deseas continuar con la eliminación?',
//string: confirm button text
confirm_text: 'Sí',
//string: deny button text
deny_text: 'No',
//boolean: if true, when the confirm button is clicked the user will be redirected to the button's href location
// follow_href: true,
//boolean: if true and follow_href is true, the href will be opened in a new window
open_new_tab: false,
//boolean: if true, the tooltip will be hidden if you click outside of it
hide_on_click: true,
//string ('auto','top','bottom','left','right'): preferred location of the tooltip (defaults to auto if no space)
position: 'auto',
//boolean: if true, the deny button will be shown
show_deny_btn: true,
//string ('black', 'white', 'bootstrap-4', 'bootstrap-4-white')
theme: 'bootstrap-4',
//string ('tiny', 'small', 'medium', 'large')
size: 'medium',
//boolean: show the tooltip immediately on instantiation
show_now: false,
//string: class(es) to add to the tooltip
'class': ''
}).on('confirm', delete_file)
.on('deny', function(e){
var btn = $(this);
//do something on deny
}).on('jc-show', function(e, tooltip){
// console.log("el tooltip es visible");
//do something when tooltip is shown
//tooltip dom element is passed as the second parameter
}).on('jc-hide', function(e){
//do something when tooltip is hidden
});
});
</script>
<script>
new DataTable('#tblCarousel', {
initComplete: function() {
// Agrega campos de filtro para cada columna
this.api().columns().every(function() {
let column = this;
let header = $(column.header());
let title = header.text().trim();
// Excluir la columna "Estatus" del filtro
if (!(title.includes("ID") || title === 'New Tab' || title === 'Acciones')) {
console.log(title);
// Crea input de filtro
header.append('<div class="filter"><input type="text" class="form-control" placeholder="'+title+'" /></div>');
// Aplica el filtro al escribir
$('input', header)
.on('keyup change', function() {
if (column.search() !== this.value) {
column.search(this.value).draw();
}
});
}
});
}
});
</script>
<!-- {# if flash #} -->
@ -389,7 +550,9 @@
<!-- {# validador archivos extensión #} -->
<script type="module" src="{{ url_for('static', filename='h_tmp_user/i_carousel_form/carousel_form.js') }}"></script>
<script type="module" src="{{ url_for('static', filename='h_tmp_user/i_carousel_form/delete_slide.js') }}"></script>
<script src="{{ url_for('static', filename='h_tmp_user/i_carousel_form/datatable_carousel.js') }}"></script>
{% endblock js %}

View File

@ -1,36 +1,61 @@
<!-- Footer -->
<footer class="footer">
<div class="container">
<div class="row">
<!-- Columna 1: Contacto -->
<div class="col-md-4 mb-4 mb-md-0 text-center">
<h5>Contacto</h5>
<ul class="list-unstyled">
<li class="mb-2"><i class="bi bi-geo-alt-fill me-2"></i> CDMX, México</li>
<li class="mb-2"><i class="bi bi-telephone-fill me-2"></i> +52 xxxx xxxx</li>
<!-- <li class="mb-2"><i class="bi bi-envelope-fill me-2"></i> email@formha.com</li> -->
</ul>
</div>
<footer class="footer">
<div class="container">
<div class="row gy-4 text-center text-md-start">
<!-- Copyright -->
<div class="col-md-4 mb-4 mb-md-0 text-center">
<div class="img-cont">
<img src="{{ url_for( 'static', filename='y_img/logos/formha_blanco_vertical.png' ) }}" alt="Escudo FORMHä" height="150">
</div>
<p>&copy; 2025, Todos los derechos reservados.</p>
</div>
<!-- Columna 1: Mapa -->
<div class="col-md-3">
<h5>Ubicación</h5>
<iframe
src="https://www.google.com/maps/embed?pb=!1m17!1m12!1m3!1d470.72746206114255!2d-99.11244015806791!3d19.29020556180476!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m2!1m1!2zMTnCsDE3JzI0LjYiTiA5OcKwMDYnNDQuNiJX!5e0!3m2!1ses-419!2smx!4v1747189055133!5m2!1ses-419!2smx"
width="100%"
height="200"
style="border:0; border-radius: 0.5rem;"
allowfullscreen=""
loading="lazy"
referrerpolicy="no-referrer-when-downgrade">
</iframe>
</div>
<!-- Columna 3: Redes Sociales -->
<div class="col-md-4 mb-4 mb-md-0 text-center">
<h5>Síguenos</h5>
<div class="social-icons mb-4">
<a href="#" class="text-white"><i class="bi bi-facebook"></i></a>
<a href="#" class="text-white"><i class="bi bi-twitter-x"></i></a>
<a href="#" class="text-white"><i class="bi bi-instagram"></i></a>
<a href="#" class="text-white"><i class="bi bi-linkedin"></i></a>
<a href="#" class="text-white"><i class="bi bi-youtube"></i></a>
</div>
<!-- Columna 2: Contacto -->
<div class="col-md-3">
<h5>Contacto</h5>
<ul class="list-unstyled">
<li class="mb-2">
<i class="bi bi-geo-alt-fill me-2"></i>
<a href="https://maps.app.goo.gl/VMCcHh1SJ7eqXcAA8" target="_blank">
Blvd. Adolfo Ruíz Cortines 2467<br>C.P. 16035, CDMX, México
</a>
</li>
<li class="mb-2"><i class="bi bi-telephone-fill me-2"></i> +52 xxxx xxxx</li>
<!-- <li class="mb-2"><i class="bi bi-envelope-fill me-2"></i> email@formha.com</li> -->
</ul>
</div>
<!-- Columna 3: Logo -->
<div class="col-md-3 d-flex flex-column align-items-center text-center">
<div class="img-cont mb-3">
<img src="{{ url_for('static', filename='y_img/logos/formha_blanco_vertical.png') }}" alt="Escudo FORMHä" height="100">
</div>
<small>&copy; 2025 FORMHä. Todos los derechos reservados.</small>
</div>
<!-- Columna 4: Redes Sociales -->
<div class="col-md-3">
<h5>Síguenos</h5>
<div class="social-icons">
<a href="https://www.facebook.com/formha.mx/" target="_blank"><i class="bi bi-facebook"></i></a>
<a href="https://x.com/formhamx" target="_blank"><i class="bi bi-twitter-x"></i></a>
<a href="https://www.instagram.com/formha.mx" target="_blank"><i class="bi bi-instagram"></i></a>
<a href="https://www.linkedin.com/company/formha-mx/" target="_blank"><i class="bi bi-linkedin"></i></a>
<a href="#" target="_blank"><i class="bi bi-youtube"></i></a>
</div>
</div>
</div>
</footer>
<hr class="my-4 border-secondary">
<div class="text-center small">
Desarrollado con ❤️ por FORMHä
</div>
</div>
</footer>