Hackathon: publicar resultados del día 1 con imagen
Reemplaza la convocatoria y el formulario de inscripción por los resultados del primer día (4 tickets, 2 pull requests) e incorpora la imagen del evento.
This commit is contained in:
1 parent
ebe133f73c
commit
996ae4e9c6
2 files changed
+34
-152
No files matched your search
+34
-152
@@ -300,7 +300,7 @@
|
||||
.hack-copy h2 { font-size: clamp(1.8rem, 3.6vw, 2.7rem); margin-bottom: 14px; }
|
||||
.hack-copy h2 .grad-text { background: linear-gradient(120deg, #fff 10%, #c6f3e6 50%, #d9cdfb 95%); background-size: 220% 220%; -webkit-background-clip: text; background-clip: text; color: transparent; animation: gradShift 7s ease infinite; }
|
||||
.hack-copy > p { color: rgba(255,255,255,.85); font-size: 1.02rem; max-width: 520px; }
|
||||
.hack-dates { display: inline-flex; align-items: center; gap: 10px; margin: 90px 0; font-weight: 700; font-size: 1.235rem; }
|
||||
.hack-dates { display: inline-flex; align-items: center; gap: 10px; margin: 18px 0 26px; font-weight: 700; font-size: 1.235rem; }
|
||||
.hack-dates svg { width: 18px; height: 18px; color: var(--mint); }
|
||||
.countdown { display: flex; gap: 12px; margin: 0 0 30px; flex-wrap: wrap; }
|
||||
.cd-unit {
|
||||
@@ -322,6 +322,15 @@
|
||||
.hack-target svg { width: 22px; height: 22px; flex: 0 0 22px; color: var(--mint); margin-top: 2px; }
|
||||
.hack-target h4 { font-size: 1rem; margin-bottom: 5px; }
|
||||
.hack-target p { font-size: .84rem; color: rgba(255,255,255,.78); }
|
||||
.hack-stats { display: flex; gap: 14px; flex-wrap: wrap; margin: 0 0 6px; }
|
||||
.hack-stat {
|
||||
background: rgba(255,255,255,.1); border: 1px solid rgba(255,255,255,.18); border-radius: 14px;
|
||||
padding: 14px 20px; min-width: 112px; text-align: center; backdrop-filter: blur(6px);
|
||||
}
|
||||
.hack-stat strong { font-family: 'Sora'; font-size: 1.7rem; display: block; line-height: 1; }
|
||||
.hack-stat span { font-size: .66rem; text-transform: uppercase; letter-spacing: .1em; color: rgba(255,255,255,.75); }
|
||||
.hack-figure { border-radius: 20px; overflow: hidden; border: 1px solid rgba(255,255,255,.18); box-shadow: 0 26px 50px rgba(0,0,0,.32); }
|
||||
.hack-figure img { display: block; width: 100%; height: auto; }
|
||||
|
||||
.hack-form { background: #fff; color: var(--ink); border-radius: 22px; padding: 30px; box-shadow: 0 30px 60px rgba(0,0,0,.32); }
|
||||
.hack-form h3 { font-size: 1.25rem; margin-bottom: 6px; }
|
||||
@@ -582,94 +591,52 @@
|
||||
<div class="hack-inner">
|
||||
<div class="hack-grid">
|
||||
<div class="hack-copy">
|
||||
<span class="hack-badge"><span class="dot"></span> Online · Internacional · Gratis</span>
|
||||
<h2>Hackathon de <span class="grad-text">Internacionalización</span> para Paraguay</h2>
|
||||
<span class="hack-badge"><span class="dot"></span> Hackathon · Día 1</span>
|
||||
<h2>Primer día del <span class="grad-text">Hackathon</span> de Internacionalización</h2>
|
||||
<p>
|
||||
Dos jornadas online para llevar la localización paraguaya de Odoo al siguiente nivel.
|
||||
Sumate a desarrollar, testear, documentar o traducir junto a la comunidad.
|
||||
Arrancamos el hackathon de la localización paraguaya. Un día de trabajo en equipo:
|
||||
revisamos los módulos, abrimos las primeras propuestas y dejamos la base para lo
|
||||
que viene. Gracias a todos los que se sumaron.
|
||||
</p>
|
||||
<div class="hack-dates">
|
||||
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="4" width="18" height="18" rx="2"/><path d="M16 2v4M8 2v4M3 10h18"/></svg>
|
||||
12 y 14 de noviembre de 2026
|
||||
12 de noviembre de 2026
|
||||
</div>
|
||||
|
||||
<div class="countdown" id="countdown" aria-label="Cuenta regresiva al hackathon">
|
||||
<div class="cd-unit"><strong id="cd-days">--</strong><span>Días</span></div>
|
||||
<div class="cd-unit"><strong id="cd-hours">--</strong><span>Horas</span></div>
|
||||
<div class="cd-unit"><strong id="cd-mins">--</strong><span>Min</span></div>
|
||||
<div class="cd-unit"><strong id="cd-secs">--</strong><span>Seg</span></div>
|
||||
<div class="hack-stats">
|
||||
<div class="hack-stat"><strong>4</strong><span>Tickets</span></div>
|
||||
<div class="hack-stat"><strong>2</strong><span>Pull requests</span></div>
|
||||
<div class="hack-stat"><strong>1</strong><span>Comunidad</span></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="hack-form">
|
||||
<form id="hack-form" novalidate>
|
||||
<h3>Inscribite al hackathon</h3>
|
||||
<p>Dejanos tus datos y te avisamos antes del evento. Cupos abiertos para todos los niveles.</p>
|
||||
|
||||
<div class="field" id="f-name">
|
||||
<label for="name">Nombre completo</label>
|
||||
<input type="text" id="name" name="name" placeholder="Tu nombre" autocomplete="name" required />
|
||||
<span class="err">Ingresá tu nombre.</span>
|
||||
</div>
|
||||
|
||||
<div class="field" id="f-github">
|
||||
<label for="github">Usuario de GitHub</label>
|
||||
<input type="text" id="github" name="github" placeholder="@tu-usuario" autocomplete="off" required />
|
||||
<span class="err">Ingresá tu usuario de GitHub.</span>
|
||||
</div>
|
||||
|
||||
<div class="field" id="f-email">
|
||||
<label for="email">Email</label>
|
||||
<input type="email" id="email" name="email" placeholder="tu@email.com" autocomplete="email" required />
|
||||
<span class="err">Ingresá un email válido.</span>
|
||||
</div>
|
||||
|
||||
<div class="field" id="f-desc">
|
||||
<label for="desc">Contanos brevemente cómo podés aportar</label>
|
||||
<textarea id="desc" name="desc" placeholder="Ej.: puedo migrar módulos a Odoo 19, escribir tests o traducir cadenas al español de Paraguay." required></textarea>
|
||||
<span class="err">Contanos brevemente tu aporte.</span>
|
||||
</div>
|
||||
|
||||
<button type="submit" class="btn btn-primary" id="hack-submit">
|
||||
Quiero inscribirme
|
||||
<svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14M13 6l6 6-6 6"/></svg>
|
||||
</button>
|
||||
<p class="form-error" id="form-error">No pudimos enviar tu inscripción. Revisá tu conexión e intentá de nuevo.</p>
|
||||
<p class="form-note">Tus datos solo se usan para coordinar el hackathon.</p>
|
||||
</form>
|
||||
|
||||
<div class="form-success" id="form-success" role="status" aria-live="polite">
|
||||
<div class="ok">
|
||||
<svg viewBox="0 0 24 24" width="30" height="30" fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"><path d="m5 13 4 4L19 7"/></svg>
|
||||
</div>
|
||||
<h3>¡Inscripción recibida!</h3>
|
||||
<p>Gracias, <strong id="success-name">colega</strong>. Te vamos a contactar por email con los detalles del hackathon del 12 y 14 de noviembre de 2026.</p>
|
||||
</div>
|
||||
<div class="hack-figure">
|
||||
<img src="img/py_first_day.png" alt="Primer día del Hackathon de Internacionalización de OCA Paraguay" loading="lazy" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="hack-goals">
|
||||
<h3>Nuestros Objetivos</h3>
|
||||
<h3>Lo que nos llevamos del día 1</h3>
|
||||
<div class="hack-targets">
|
||||
<div class="hack-target">
|
||||
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 11l3 3L22 4"/><path d="M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"/></svg>
|
||||
<div>
|
||||
<h4>4 tickets abiertos</h4>
|
||||
<p>Problemas y mejoras de la localización identificados y documentados para trabajarlos.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="hack-target">
|
||||
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 2v6h-6"/><path d="M3 12a9 9 0 0 1 15-6.7L21 8"/><path d="M3 22v-6h6"/><path d="M21 12a9 9 0 0 1-15 6.7L3 16"/></svg>
|
||||
<div>
|
||||
<h4>Actualización de módulos a Odoo 19 y 20</h4>
|
||||
<p>Consolidar la rama 19.0 y avanzar hacia las versiones más recientes del ERP.</p>
|
||||
<h4>2 pull requests</h4>
|
||||
<p>Primeras propuestas de código enviadas para revisión de la comunidad.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="hack-target">
|
||||
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 2v20M2 12h20"/><circle cx="12" cy="12" r="9"/></svg>
|
||||
<div>
|
||||
<h4>Nuevas funcionalidades (Feature add)</h4>
|
||||
<p>Incorporar features que la comunidad paraguaya necesita en su día a día.</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="hack-target">
|
||||
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 11l3 3L22 4"/><path d="M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"/></svg>
|
||||
<div>
|
||||
<h4>Testing y documentación</h4>
|
||||
<p>Pruebas, cobertura y guías claras para que más gente adopte Odoo en Paraguay.</p>
|
||||
<h4>Aprendimos mucho</h4>
|
||||
<p>Un día de aprendizaje compartido: entre todos entendimos mejor cómo llevar Odoo adelante en Paraguay.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -977,91 +944,6 @@
|
||||
cards.forEach(c => { c.style.transform = ''; });
|
||||
});
|
||||
}
|
||||
|
||||
// Hackathon countdown (12 Nov 2026)
|
||||
const target = new Date('2026-11-12T00:00:00').getTime();
|
||||
const cd = {
|
||||
days: document.getElementById('cd-days'),
|
||||
hours: document.getElementById('cd-hours'),
|
||||
mins: document.getElementById('cd-mins'),
|
||||
secs: document.getElementById('cd-secs')
|
||||
};
|
||||
const pad = (n) => String(n).padStart(2, '0');
|
||||
const tickCountdown = () => {
|
||||
const diff = target - Date.now();
|
||||
if (diff <= 0) {
|
||||
cd.days.textContent = cd.hours.textContent = cd.mins.textContent = cd.secs.textContent = '00';
|
||||
return;
|
||||
}
|
||||
cd.days.textContent = Math.floor(diff / 86400000);
|
||||
cd.hours.textContent = pad(Math.floor(diff / 3600000) % 24);
|
||||
cd.mins.textContent = pad(Math.floor(diff / 60000) % 60);
|
||||
cd.secs.textContent = pad(Math.floor(diff / 1000) % 60);
|
||||
};
|
||||
if (cd.days) { tickCountdown(); setInterval(tickCountdown, 1000); }
|
||||
|
||||
// Hackathon signup form
|
||||
const form = document.getElementById('hack-form');
|
||||
if (form) {
|
||||
const WEBHOOK_URL = 'https://n8n.odoo4projects.com/webhook/OCA/hackathon';
|
||||
const btn = document.getElementById('hack-submit');
|
||||
const errorEl = document.getElementById('form-error');
|
||||
const setInvalid = (id, bad) => document.getElementById(id).classList.toggle('invalid', bad);
|
||||
|
||||
form.addEventListener('submit', async (ev) => {
|
||||
ev.preventDefault();
|
||||
errorEl.classList.remove('show');
|
||||
const name = form.querySelector('#name').value.trim();
|
||||
const github = form.querySelector('#github').value.trim();
|
||||
const email = form.querySelector('#email').value.trim();
|
||||
const desc = form.querySelector('#desc').value.trim();
|
||||
const emailOk = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
|
||||
|
||||
setInvalid('f-name', !name);
|
||||
setInvalid('f-github', !github);
|
||||
setInvalid('f-email', !emailOk);
|
||||
setInvalid('f-desc', !desc);
|
||||
|
||||
if (!name || !github || !emailOk || !desc) {
|
||||
const firstBad = form.querySelector('.field.invalid input, .field.invalid textarea');
|
||||
if (firstBad) firstBad.focus();
|
||||
return;
|
||||
}
|
||||
|
||||
const original = btn.innerHTML;
|
||||
btn.disabled = true;
|
||||
btn.textContent = 'Enviando…';
|
||||
|
||||
try {
|
||||
const res = await fetch(WEBHOOK_URL, {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({
|
||||
name: name,
|
||||
github: github,
|
||||
email: email,
|
||||
description: desc,
|
||||
event: 'hackathon-oca-py-2026',
|
||||
source: window.location.href
|
||||
})
|
||||
});
|
||||
if (!res.ok) throw new Error('HTTP ' + res.status);
|
||||
|
||||
document.getElementById('success-name').textContent = name.split(' ')[0];
|
||||
form.style.display = 'none';
|
||||
document.getElementById('form-success').classList.add('show');
|
||||
} catch (err) {
|
||||
console.error('Error al enviar la inscripción:', err);
|
||||
btn.disabled = false;
|
||||
btn.innerHTML = original;
|
||||
errorEl.classList.add('show');
|
||||
}
|
||||
});
|
||||
|
||||
form.querySelectorAll('input, textarea').forEach(el => {
|
||||
el.addEventListener('input', () => el.closest('.field')?.classList.remove('invalid'));
|
||||
});
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
Reference in new issue
Block a user