From 41a5e2c43059882ed1ee0caf1587722a91ff5310 Mon Sep 17 00:00:00 2001 From: Eduardo Casarero Date: Sun, 24 Aug 2025 23:55:42 -0300 Subject: [PATCH 1/2] feat: add keynotaitor --- keynote/index.html | 63 +++++++ keynote/main.js | 431 +++++++++++++++++++++++++++++++++++++++++++++ keynote/styles.css | 308 ++++++++++++++++++++++++++++++++ 3 files changed, 802 insertions(+) create mode 100644 keynote/index.html create mode 100644 keynote/main.js create mode 100644 keynote/styles.css diff --git a/keynote/index.html b/keynote/index.html new file mode 100644 index 0000000..45ccc33 --- /dev/null +++ b/keynote/index.html @@ -0,0 +1,63 @@ + + + + + + + Pitchear.la + + + + + +
+
+ +

馃摙 The Freestyler

+

#AdminBirras 馃嵑

+

隆Un juego en el que podes ser keynote speaker!

+
+ +
+
+

- - - - - - - - - - - -

+
+
+ +
+ + + + + +
+ +
+

驴C贸mo se juega?

+
    +
  1. Apret谩 en "Generar keynote"
  2. +
  3. Se te ocurrio una idea de charla. Ten茅s 22 segundos. 隆Cont谩la!
  4. +
  5. El resto dice si se para y aplaude o no
  6. +
+
+ + +
+ + + + + \ No newline at end of file diff --git a/keynote/main.js b/keynote/main.js new file mode 100644 index 0000000..3320589 --- /dev/null +++ b/keynote/main.js @@ -0,0 +1,431 @@ +const titleFormats = [ + "The Future of {topic}: {adjective} {noun}", + "{verb} {noun}: {adjective} {topic}", + "Keynote: {adjective} {topic} for {noun}", + "Panel: {topic} and {noun}", + "Spotlight on {adjective} {topic}", + "How to {verb} {topic}", + "{adjective} {topic}: {noun} Insights", + "{topic} in the Age of {noun}", + "{verb} the {adjective} {topic}", + "{topic} {year}: {adjective} {noun}", + "{adjective} {noun}: {verb} {topic}", + "{topic} for {adjective} {noun}", + "{verb} {topic}: {noun} Revolution" +]; + +const topics = [ + "AI", + "Quantum Computing", + "Cloud", + "Data Science", + "Cybersecurity", + "Digital Transformation", + "Innovation", + "Leadership", + "Sustainability", + "Diversity & Inclusion", + "Edge Computing", + "Web3", + "Open Source", + "Automation", + "Resilience", + "Ethics", + "Human-Centered Design", + "Collaboration", + "Growth", + "Creativity", + "Trust", + "Empowerment", + "Strategy", + "Change", + "Opportunity", + "Progress", + "Community", + "Talent", + "Purpose", + "Impact", + "Future", + "Mindset", + // Added technology topics + "Blockchain", + "Internet of Things", + "Machine Learning", + "Robotics", + "Virtual Reality", + "Augmented Reality", + "5G", + "Big Data", + "DevOps", + "Digital Twins", + "Smart Cities", + "Fintech", + "HealthTech", + "EdTech", + "Green Tech", + "Bioinformatics", + "Cloud Native", + "Digital Ethics", + "Privacy", + "Digital Inclusion", + // Added philanthropy topics + "Social Impact", + "Nonprofits", + "Charity", + "Volunteering", + "Corporate Social Responsibility", + "Giving", + "Social Innovation", + "Impact Investing", + "Community Development", + "Education Access", + "Healthcare Access", + "Environmental Stewardship", + "Global Citizenship", + "Humanitarian Aid", + "Social Entrepreneurship" +]; + +const adjectives = [ + "Transformative", + "Inclusive", + "Global", + "Intelligent", + "Adaptive", + "Autonomous", + "Ethical", + "Disruptive", + "Resilient", + "Sustainable", + "Creative", + "Empowering", + "Innovative", + "Smart", + "Digital", + "NextGen", + "Visionary", + "Open", + "Human", + "Secure", + "Agile", + "Strategic", + "Collaborative", + "Future-ready", + "Breakthrough", + "Elevated" +]; + +const nouns = [ + // English nouns + "Leadership", + "Transformation", + "Innovation", + "Resilience", + "Empowerment", + "Diversity", + "Inclusion", + "Sustainability", + "Growth", + "Collaboration", + "Strategy", + "Vision", + "Change", + "Opportunity", + "Challenge", + "Success", + "Progress", + "Evolution", + "Breakthrough", + "Synergy", + "Community", + "Talent", + "Purpose", + "Impact", + "Ethics", + "Trust", + "Creativity", + "Inspiration", + "Mindset", + "Experience", + "Journey", + "Revolution", + "Wave", + "Shift", + "Sprint", + "Lab", + "Track", + "Series", + "Pulse", + // Spanish (Argentine) nouns + "Liderazgo", + "Transformaci贸n", + "Innovaci贸n", + "Resiliencia", + "Empoderamiento", + "Diversidad", + "Inclusi贸n", + "Sustentabilidad", + "Crecimiento", + "Colaboraci贸n", + "Estrategia", + "Visi贸n", + "Cambio", + "Oportunidad", + "Desaf铆o", + "脡xito", + "Progreso", + "Evoluci贸n", + "Avance", + "Sinergia", + "Comunidad", + "Talento", + "Prop贸sito", + "Impacto", + "脡tica", + "Confianza", + "Creatividad", + "Inspiraci贸n", + "Mentalidad", + "Experiencia", + "Recorrido", + "Revoluci贸n", + "Ola", + "Cambio", + "Sprint", + "Laboratorio", + "Pista", + "Serie", + "Pulso" +]; + +const verbs = [ + // English verbs + "Empowering", + "Transforming", + "Reinventing", + "Scaling", + "Connecting", + "Securing", + "Adapting", + "Elevating", + "Disrupting", + "Innovating", + "Leading", + "Building", + "Creating", + "Unlocking", + "Driving", + "Enabling", + "Fostering", + "Accelerating", + "Redefining", + "Designing", + "Navigating", + "Orchestrating", + "Inspiring", + "Motivating", + "Facilitating", + "Optimizing", + "Empathizing", + "Collaborating", + "Integrating", + "Simplifying", + "Expanding", + "Enhancing", + "Supporting", + "Guiding", + "Challenging", + "Shaping", + "Sustaining", + "Bridging", + "Exploring", + "Adopting", + "Leveraging", + "Championing", + "Cultivating", + "Pioneering", + "Revolutionizing", + "Modernizing", + "Personalizing", + "Customizing", + "Analyzing", + "Measuring", + "Connecting", + // Spanish (Argentine) verbs + "Empoderando", + "Transformando", + "Reinventando", + "Escalando", + "Conectando", + "Asegurando", + "Adaptando", + "Elevando", + "Disrumpiendo", + "Innovando", + "Liderando", + "Construyendo", + "Creando", + "Desbloqueando", + "Impulsando", + "Habilitando", + "Fomentando", + "Acelerando", + "Redefiniendo", + "Dise帽ando", + "Navegando", + "Orquestando", + "Inspirando", + "Motivando", + "Facilitando", + "Optimizando", + "Empatizando", + "Colaborando", + "Integrando", + "Simplificando", + "Expandiendo", + "Mejorando", + "Apoyando", + "Guiando", + "Desafiando", + "Formando", + "Sosteniendo", + "Uniendo", + "Explorando", + "Adoptando", + "Aprovechando", + "Promoviendo", + "Cultivando", + "Pionereando", + "Revolucionando", + "Modernizando", + "Personalizando", + "Customizando", + "Analizando", + "Midiendo" +]; + +const years = ["2025", "2026", "2027", "2030", "2035", "2040"]; + +// DOM elements +const generateBtn = document.getElementById('generate-btn'); +const startupNameEl = document.getElementById('keynote-name'); +const timerDisplay = document.getElementById('timer-display'); +const countdownNumber = document.getElementById('countdown-number'); +const gameOverDisplay = document.getElementById('game-over'); + +// Game state +let gameState = 'ready'; // 'ready', 'pitching', 'finished' +let countdownInterval; +let currentStartupName = ''; +let usedNames = new Set(); + +// Utility functions + +const getRandomElement = (array) => array[Math.floor(Math.random() * array.length)]; + +function fillFormat(format) { + return format + .replace(/{topic}/g, getRandomElement(topics)) + .replace(/{adjective}/g, getRandomElement(adjectives)) + .replace(/{noun}/g, getRandomElement(nouns)) + .replace(/{verb}/g, getRandomElement(verbs)) + .replace(/{year}/g, getRandomElement(years)); +} + +const capitalizeFirst = (str) => { + return str.charAt(0).toUpperCase() + str.slice(1); +}; + +const generateUniqueKeynoteTitle = () => { + let attempts = 0; + let title; + do { + const format = getRandomElement(titleFormats); + title = fillFormat(format); + attempts++; + if (attempts > 100) { + usedNames.clear(); + break; + } + } while (usedNames.has(title)); + usedNames.add(title); + return title; +}; + +const displayKeynoteTitle = (title) => { + startupNameEl.innerHTML = `

${title}

`; + startupNameEl.classList.add('active', 'fade-in'); + setTimeout(() => { + startupNameEl.classList.remove('fade-in'); + }, 500); +}; + +const resetDisplay = () => { + startupNameEl.innerHTML = '

- - - - -

'; + startupNameEl.classList.remove('active'); + timerDisplay.classList.add('hidden'); + gameOverDisplay.classList.add('hidden'); + generateBtn.disabled = false; + generateBtn.textContent = 'Generar T铆tulo'; +}; + +const startCountdown = () => { + let timeLeft = 22; + countdownNumber.textContent = timeLeft; + timerDisplay.classList.remove('hidden'); + + const timerCircle = document.querySelector('.timer-circle'); + timerCircle.classList.add('pulse'); + + countdownInterval = setInterval(() => { + timeLeft--; + countdownNumber.textContent = timeLeft; + + // Add urgency animation in last 10 seconds + if (timeLeft <= 10) { + timerCircle.style.background = 'linear-gradient(45deg, #ff4757, #ff6b6b)'; + } + + // Add final countdown animation in last 5 seconds + if (timeLeft <= 5) { + timerCircle.classList.add('pulse'); + countdownNumber.style.color = '#ff4757'; + } + + if (timeLeft <= 0) { + clearInterval(countdownInterval); + endGame(); + } + }, 1000); +}; + +const endGame = () => { + gameState = 'finished'; + timerDisplay.classList.add('hidden'); + gameOverDisplay.classList.remove('hidden'); + generateBtn.disabled = false; + generateBtn.textContent = 'Generar nueva startup'; + + // Reset timer circle styles + const timerCircle = document.querySelector('.timer-circle'); + timerCircle.classList.remove('pulse'); + timerCircle.style.background = 'linear-gradient(45deg, #ff6b6b, #ff8e8e)'; + countdownNumber.style.color = '#ff6b6b'; +}; + +const startGame = () => { + if (gameState === 'ready' || gameState === 'finished') { + resetDisplay(); + currentStartupName = generateUniqueKeynoteTitle(); + displayKeynoteTitle(currentStartupName); + gameState = 'pitching'; + generateBtn.disabled = true; + generateBtn.textContent = 'Pitching...'; + setTimeout(() => { + startCountdown(); + }, 1000); + } +}; + +// Event listeners +generateBtn.addEventListener('click', startGame); diff --git a/keynote/styles.css b/keynote/styles.css new file mode 100644 index 0000000..c37722b --- /dev/null +++ b/keynote/styles.css @@ -0,0 +1,308 @@ +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap'); + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: 'Inter', sans-serif; + background: black; + min-height: 100vh; + color: #333; + line-height: 1.6; +} + +.main-container { + max-width: 500px; + margin: 0 auto; + padding: 20px; + min-height: 100vh; + display: flex; + flex-direction: column; + justify-content: space-between; +} + +/* Header */ +.header { + text-align: center; + margin-bottom: 30px; +} + +h1 { + font-size: 2.5rem; + font-weight: 700; + color: white; + text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3); + margin-bottom: 10px; +} + +h2 { + color: rgba(255, 255, 255, 0.8); + font-size: 1.5rem; + font-weight: 600; + margin-bottom: 5px; +} + +h3 { + color: rgba(255, 255, 255, 0.9); + font-size: 1.1rem; + font-weight: 400; +} + +.logo { + width: 7em; + height: auto; + margin-bottom: 20px; + display: block; + margin-left: auto; + margin-right: auto; +} + +/* Startup Display */ +.keynote-display { + display: flex; + justify-content: center; +} + +.keynote-name { + background: white; + border-radius: 20px; + padding: 25px 20px; + box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2); + min-width: 300px; + text-align: center; + transition: all 0.3s ease; + border: 3px solid transparent; +} + +.keynote-name.active { + border-color: #00d4ff; + box-shadow: 0 10px 30px rgba(0, 212, 255, 0.3); + transform: scale(1.05); +} + +.keynote-name p { + font-size: 1.8rem; + font-weight: 600; + color: #333; + margin: 0; +} + +/* Game Controls */ +.game-controls { + text-align: center; + margin: 40px 0; +} + +.generate-button { + background: linear-gradient(45deg, #ff6b6b, #ff8e8e); + color: white; + border: none; + padding: 18px 36px; + font-size: 1.2rem; + font-weight: 600; + border-radius: 50px; + cursor: pointer; + box-shadow: 0 8px 25px rgba(255, 107, 107, 0.3); + transition: all 0.3s ease; + font-family: inherit; +} + +.generate-button:hover { + transform: translateY(-2px); + box-shadow: 0 12px 35px rgba(255, 107, 107, 0.4); +} + +.generate-button:active { + transform: translateY(0); +} + +.generate-button:disabled { + background: #ccc; + cursor: not-allowed; + transform: none; + box-shadow: none; +} + +/* Timer */ +.timer-display { + margin-top: 30px; +} + +.timer-circle { + width: 120px; + height: 120px; + border-radius: 50%; + background: linear-gradient(45deg, #ff6b6b, #ff8e8e); + display: flex; + align-items: center; + justify-content: center; + margin: 0 auto 15px; + box-shadow: 0 8px 25px rgba(255, 107, 107, 0.3); + position: relative; + overflow: hidden; +} + +.timer-circle::before { + content: ''; + position: absolute; + top: 5px; + left: 5px; + right: 5px; + bottom: 5px; + background: white; + border-radius: 50%; + z-index: 1; +} + +#countdown-number { + font-size: 2.5rem; + font-weight: 700; + color: #ff6b6b; + z-index: 2; + position: relative; +} + +.timer-label { + color: white; + font-size: 1.2rem; + font-weight: 600; + text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.3); +} + +/* Game Over */ +.game-over h2 { + color: white; + font-size: 2.5rem; + font-weight: 700; + margin-bottom: 10px; + text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3); +} + +.game-over p { + color: rgba(255, 255, 255, 0.9); + font-size: 1.2rem; +} + +/* Instructions */ +.instructions { + background: rgba(255, 255, 255, 0.95); + border-radius: 15px; + padding: 25px; + margin: 30px 0; + box-shadow: 0 8px 25px rgba(0, 0, 0, 0.1); +} + +.instructions h3 { + color: #333; + font-size: 1.3rem; + font-weight: 600; + margin-bottom: 15px; + text-align: center; +} + +.instructions ol { + padding-left: 20px; +} + +.instructions li { + margin-bottom: 8px; + color: #555; +} + +.instructions strong { + font-weight: 600; +} + +/* Footer */ +.footer { + text-align: center; + margin-top: auto; + padding-top: 20px; +} + +.footer p, +.footer p a { + color: rgba(255, 255, 255, 0.8); + font-size: 0.9rem; +} + +/* Utility Classes */ +.hidden { + display: none; +} + +/* Responsive */ +@media (max-width: 480px) { + .main-container { + padding: 15px; + } + + h1 { + font-size: 2rem; + } + + .startup-name { + min-width: 250px; + padding: 20px 15px; + } + + .startup-name p { + font-size: 1.5rem; + } + + .generate-button { + padding: 15px 30px; + font-size: 1.1rem; + } + + .timer-circle { + width: 100px; + height: 100px; + } + + #countdown-number { + font-size: 2rem; + } + + .instructions { + padding: 20px; + } +} + +/* Animations */ +@keyframes pulse { + 0% { + transform: scale(1); + } + + 50% { + transform: scale(1.05); + } + + 100% { + transform: scale(1); + } +} + +.timer-circle.pulse { + animation: pulse 1s infinite; +} + +@keyframes fadeIn { + from { + opacity: 0; + transform: translateY(20px); + } + + to { + opacity: 1; + transform: translateY(0); + } +} + +.startup-name.fade-in { + animation: fadeIn 0.5s ease; +} \ No newline at end of file From e01b8e3153be334ab9efa248d9e25ddeb669af5d Mon Sep 17 00:00:00 2001 From: Eduardo Casarero Date: Sun, 24 Aug 2025 23:57:31 -0300 Subject: [PATCH 2/2] fix: html title --- keynote/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keynote/index.html b/keynote/index.html index 45ccc33..49320c8 100644 --- a/keynote/index.html +++ b/keynote/index.html @@ -4,7 +4,7 @@ - Pitchear.la + Freestylear.la