diff --git a/src/pages/constants.ts b/src/pages/constants.ts new file mode 100644 index 0000000..a09f3f5 --- /dev/null +++ b/src/pages/constants.ts @@ -0,0 +1 @@ +export const SPONSORS_EMAIL = 'sponsors@2026.es.pycon.org'; \ No newline at end of file diff --git a/src/pages/index.astro b/src/pages/index.astro index 8b1aca9..287ef4b 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -1,6 +1,7 @@ --- import Layout from '../layouts/Layout.astro' import '@fontsource-variable/jetbrains-mono' +import { SPONSORS_EMAIL } from './constants' --- @@ -8,13 +9,20 @@ import '@fontsource-variable/jetbrains-mono'

- PYCON ES 2026 +

-

- > Initialising system..._ +

+ + Initialising system... +

+ +
@@ -46,10 +71,11 @@ import '@fontsource-variable/jetbrains-mono' let interval: number | null = null const runMatrixEffect = (element: HTMLElement) => { - let iteration = 0 + const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches + if (prefersReducedMotion) return + let iteration = 0 clearInterval(interval as number) - const originalText = element.dataset.value || '' interval = window.setInterval(() => { @@ -72,44 +98,58 @@ import '@fontsource-variable/jetbrains-mono' } const init = () => { + const matrixText = document.getElementById('matrix-text') const h1 = document.querySelector('h1') const subtitle = document.querySelector('#subtitle') const actions = document.querySelector('#actions') - if (h1) { - runMatrixEffect(h1) - h1.onmouseover = () => runMatrixEffect(h1) + if (matrixText && h1) { + runMatrixEffect(matrixText) + h1.onmouseover = () => runMatrixEffect(matrixText) } if (subtitle) { setTimeout(() => { subtitle.textContent = 'Sede UB Barcelona | 6-8 Nov 2026' + const container = document.getElementById('subtitle-container') + if (container) { + container.setAttribute('aria-busy', 'false') + } if (actions) { actions.classList.remove('opacity-0') } }, 1500) } - //COPY MAIL + // COPY MAIL LOGIC const sponsorBtn = document.getElementById('sponsor-btn') - const sponsorText = document.getElementById('sponsor-text') + const copyConfirmation = document.getElementById('copy-confirmation') + const email = sponsorBtn?.dataset.email as string - if (sponsorBtn && sponsorText) { + if (sponsorBtn && copyConfirmation && email) { sponsorBtn.onclick = async () => { try { - await navigator.clipboard.writeText('sponsors@2026.es.pycon.org') - const originalText = sponsorText.innerText - sponsorText.innerText = '[ EMAIL COPIED! ]' + await navigator.clipboard.writeText(email) + + // Hide button, show confirmation + sponsorBtn.classList.add('hidden') + copyConfirmation.classList.remove('hidden') + copyConfirmation.focus() + setTimeout(() => { - sponsorText.innerText = originalText + // Hide confirmation, show button and restore focus + copyConfirmation.classList.add('hidden') + sponsorBtn.classList.remove('hidden') + sponsorBtn.focus() }, 2000) } catch (err) { console.error('Failed to copy', err) - window.location.href = 'mailto:sponsors@2026.es.pycon.org' + window.location.href = `mailto:${email}` } } } } + //not needed now document.addEventListener('astro:page-load', init) init()