/* ═══════════════════════════════════════════════════════════ ERREVEKA — rvk-main.js (versión Elementor) Todos los getElementById / querySelector usan prefijo rvk- Las clases del body usan prefijo rvk-modal-open / rvk-cx ═══════════════════════════════════════════════════════════ */ /* ═══════════════════════════════════════════════════════════ 1. TRADUCCIONES ═══════════════════════════════════════════════════════════ */ const LANG = { en: { avail: 'Available for work', 'nav.menu': 'Menu', 'hero.eyebrow': 'Industrial Design · UC Chile — Santiago · Graduating 2027', 'hero.bio': 'Exploring the intersection between design, and emerging technologies. Creating solutions that connect people with place, idea, and technology.', 'hero.meta': 'Santiago
Chile

UC Chile
Class of 2027', scroll: 'Scroll', 'work.lbl': 'Selected Work', 'about.eyebrow': 'About', 'about.body': "I'm a design student at Universidad Católica de Chile exploring the intersection between design, and emerging technologies — creating solutions that connect people with place, idea, and technology.

My work spans from modular airport installations and hotel furniture to bicycle accessories and metro station interventions, always in close collaboration with municipalities and international partners.", 'about.cta': 'Connect on LinkedIn', 'stat.projects': 'Projects designed', 'stat.partners': 'Institutional partners', 'stat.cohort': 'Plan ₿ cohort', 'stat.grad': 'Graduation year', 'planb.eyebrow': 'Plan ₿ Network', 'planb.subtitle': 'Summer School 2024 — Lugano, Switzerland', 'planb.desc': "Selected as one of 21 students out of 130 participants to attend the Plan ₿ Summer School 2024 in Lugano, Switzerland. Completed 102 hours of intensive coursework on Bitcoin's economic principles, business models, and global impact. Developed a Bitcoin marketing strategy for satsback in collaboration with Jesé and Lucía.", 'planb.badge': '1 of 21 selected from 130 applicants', 'contact.h': "Get in
touch", 'contact.cta': 'Linkedin →', 'footer.copy': '© 2027 Erreveka — Raimundo Valenzuela K.', 'cat.0': 'Spatial Design · Installation', 'cat.1': 'Furniture · Industrial Design', 'cat.2': 'Product Design · Branding', 'cat.3': 'Spatial Design · Lighting', 'cat.4': 'Craft · Branding', 'cat.5': '3D Design · Education', 'card.view': 'View ↗', 'modal.close': 'Close', 'lbl.role': 'Role', 'lbl.team': 'Team', 'lbl.partner': 'Partner', }, es: { avail: 'Disponible para trabajar', 'nav.menu': 'Menú', 'hero.eyebrow': 'Diseño Industrial · UC Chile — Santiago · Egreso 2027', 'hero.bio': 'Explorando la intersección entre el diseño y las tecnologías emergentes. Creando soluciones que conectan personas con lugar, idea y tecnología.', 'hero.meta': 'Santiago
Chile

UC Chile
Promoción 2027', scroll: 'Deslizar', 'work.lbl': 'Trabajo Seleccionado', 'about.eyebrow': 'Sobre mí', 'about.body': "Soy estudiante de diseño en la Universidad Católica de Chile, explorando la intersección entre el diseño y las tecnologías emergentes, creando soluciones que conectan personas con lugar, idea y tecnología.

Mi trabajo abarca desde instalaciones modulares en aeropuertos y mobiliario hotelero hasta accesorios para bicicletas e intervenciones en estaciones de metro, siempre en estrecha colaboración con municipios y socios internacionales.", 'about.cta': 'Conectar en LinkedIn', 'stat.projects': 'Proyectos diseñados', 'stat.partners': 'Socios institucionales', 'stat.cohort': 'Cohorte Plan ₿', 'stat.grad': 'Año de egreso', 'planb.eyebrow': 'Plan ₿ Network', 'planb.subtitle': 'Escuela de Verano 2024 — Lugano, Suiza', 'planb.desc': 'Seleccionado como uno de 21 estudiantes entre 130 participantes para asistir a la Escuela de Verano Plan ₿ 2024 en Lugano, Suiza. Completé 102 horas de formación intensiva sobre los principios económicos de Bitcoin, modelos de negocio e impacto global. Desarrollé una estrategia de marketing Bitcoin para satsback en colaboración con Jesé y Lucía.', 'planb.badge': '1 de 21 seleccionados de 130 postulantes', 'contact.eyebrow':'Contáctame', 'contact.h': 'Construyamos algo
juntos', 'contact.cta': 'Enviar mensaje →', 'footer.copy': '© 2027 Erreveka — Raimundo Valenzuela K.', 'cat.0': 'Diseño Espacial · Instalación', 'cat.1': 'Mobiliario · Diseño Industrial', 'cat.2': 'Diseño de Producto · Branding', 'cat.3': 'Diseño Espacial · Iluminación', 'cat.4': 'Artesanía · Branding', 'cat.5': 'Diseño 3D · Educación', 'card.view': 'Ver ↗', 'modal.close': 'Cerrar', 'lbl.role': 'Rol', 'lbl.team': 'Equipo', 'lbl.partner': 'Colaboración', }, }; let currentLang = (localStorage.getItem('rvk-lang') || navigator.language || 'en').slice(0, 2).toLowerCase(); if (!LANG[currentLang]) currentLang = 'en'; function applyLang(lang) { currentLang = lang; localStorage.setItem('rvk-lang', lang); document.documentElement.lang = lang; const T = LANG[lang]; document.querySelectorAll('[data-i18n]').forEach(el => { const k = el.dataset.i18n; if (T[k] !== undefined) el.textContent = T[k]; }); document.querySelectorAll('[data-i18n-html]').forEach(el => { const k = el.dataset.i18nHtml; if (T[k] !== undefined) el.innerHTML = T[k]; }); const langBtnEl = document.querySelector('#rvk-lang-btn'); if (langBtnEl) langBtnEl.childNodes[0].textContent = lang.toUpperCase() + ' '; document.querySelectorAll('.rvk-lang-opt').forEach(o => o.classList.toggle('active', o.dataset.lang === lang)); if (openProjectIdx >= 0 && document.getElementById('rvk-proj-modal').classList.contains('open')) { renderModalInfo(openProjectIdx); } } /* ═══════════════════════════════════════════════════════════ 2. DATOS DE PROYECTOS ═══════════════════════════════════════════════════════════ */ const PROJECTS = [ /* ── PROYECTO 0: MITA ── */ { name: 'MITA', cat: { en: 'Spatial Design · Installation', es: 'Diseño Espacial · Instalación' }, year: '2025 — AMB Airport, Santiago', desc: { en: "As part of a design research project, we worked with Santiago's Arturo Merino Benítez International Airport, Chile's main air terminal. During the process, we noticed something simple but important: this airport moves millions of people, but says very little about where they've arrived. It's efficient, modern, but culturally neutral. It works—but it doesn't connect.\n\nThat's where MITA comes in. It's a modular installation that combines mirrors and images of Chilean landscapes to turn empty corridors into something more alive. The idea is not just to show Chile, but to let people see themselves in it.\n\nWe tested small interventions in high-traffic areas: altered signs, symbolic actions, and reflective surfaces. What really worked were cultural and unexpected stimuli—elements that break the automatic flow and invite people to stop, look, and remember.\n\nMITA is a way to shift the experience of arrival. To turn movement into meaning. It starts at Santiago's airport, but it could live anywhere people land.", es: "Como parte de un proyecto de investigación en diseño, trabajamos con el Aeropuerto Internacional Arturo Merino Benítez de Santiago, el principal terminal aéreo de Chile. Durante el proceso, notamos algo simple pero importante: este aeropuerto mueve a millones de personas, pero dice muy poco sobre el lugar donde han llegado. Es eficiente, moderno, pero culturalmente neutro. Funciona, pero no conecta.\n\nAhí es donde entra MITA. Es una instalación modular que combina espejos e imágenes de paisajes chilenos para convertir los pasillos vacíos en algo más vivo. La idea no es solo mostrar Chile, sino permitir que las personas se vean a sí mismas en él.\n\nProbamos pequeñas intervenciones en zonas de alto tráfico: señales alteradas, acciones simbólicas y superficies reflectivas. Lo que realmente funcionó fueron los estímulos culturales e inesperados—elementos que rompen el flujo automático e invitan a detenerse, mirar y recordar.\n\nMITA es una forma de transformar la experiencia de llegada. De convertir el movimiento en significado. Comienza en el aeropuerto de Santiago, pero podría vivir en cualquier lugar donde la gente aterrice.", }, role: 'Research & Prototyping', team: 'Pedro, Diego, Benjamin, Juliana, Itzel', partner: null, tools: ['Autodesk Fusion', 'Blender', 'Figma'], media: [ { type: 'video', src: 'https://erreveka.com/wp-content/uploads/2025/08/Mita-Animation.mp4', thumb: 'https://erreveka.com/wp-content/uploads/2025/06/MITA.jpg' }, { type: 'img', src: 'https://erreveka.com/wp-content/uploads/2025/06/MITA.jpg' }, { type: 'img', src: 'https://erreveka.com/wp-content/uploads/2025/09/AFICHES_LAB_4-3.jpg' }, { type: 'img', src: 'https://erreveka.com/wp-content/uploads/2025/09/AFICHES_LAB_4-2.jpg' }, ], }, /* ── PROYECTO 1: MILÓ CHAIR ── */ { name: 'Miló Chair', cat: { en: 'Furniture · Industrial Design', es: 'Mobiliario · Diseño Industrial' }, year: '2025 — Steel, Oak, Sunbrella, ABS', desc: { en: "Miló is a lounge chair designed for hotel environments, conceived as a space for rest after long journeys or as a support for meetings and conversations. The project takes inspiration from the Micol lamp by Cristiano Mino, translating its concepts of tension, visual weight, and material balance into furniture design.\n\nThe chair integrates four main materials: steel for structural stability, oak wood for warmth and support, Sunbrella textile in tension for ergonomic comfort, and ABS plastic in the rear legs, bent to achieve the rigidity required to sustain human weight.\n\nThis distinctive use of materials and construction logic sets Miló apart from conventional lounge chairs, offering a robust yet refined presence that merges comfort, durability, and identity.", es: "Miló es una silla lounge diseñada para entornos hoteleros, concebida como un espacio de descanso tras largos viajes o como soporte para reuniones y conversaciones. El proyecto toma inspiración de la lámpara Micol de Cristiano Mino, traduciendo sus conceptos de tensión, peso visual y equilibrio material al diseño de mobiliario.\n\nLa silla integra cuatro materiales principales: acero para la estabilidad estructural, madera de roble para la calidez y el soporte, textil Sunbrella en tensión para el confort ergonómico, y plástico ABS en las patas traseras, doblado para lograr la rigidez necesaria que sostiene el peso humano.\n\nEste uso distintivo de materiales y lógica constructiva distingue a Miló de las sillas lounge convencionales, ofreciendo una presencia robusta pero refinada que fusiona confort, durabilidad e identidad.", }, role: 'Solo — Research, Prototyping, Rendering', team: null, partner: null, tools: ['Autodesk Fusion', 'Blender', 'Illustrator'], media: [ { type: 'video', src: 'https://erreveka.com/wp-content/uploads/2025/10/Milo_Animation.mp4', thumb: 'https://erreveka.com/wp-content/uploads/2025/09/MiloChair1.jpg' }, { type: 'img', src: 'https://erreveka.com/wp-content/uploads/2025/05/Render-Portafolio-Comp.jpg' }, { type: 'img', src: 'https://erreveka.com/wp-content/uploads/2025/09/MiloChair1.jpg' }, { type: 'img', src: 'https://erreveka.com/wp-content/uploads/2025/09/MiloChair2.jpg' }, { type: 'img', src: 'https://erreveka.com/wp-content/uploads/2025/09/MiloChair3.jpg' }, { type: 'img', src: 'https://erreveka.com/wp-content/uploads/2025/09/MiloChair4.jpg' }, { type: 'img', src: 'https://erreveka.com/wp-content/uploads/2025/09/MiloChair5.jpg' }, ], }, /* ── PROYECTO 2: TOLEN TOLEN ── */ { name: 'Tolen Tolen', cat: { en: 'Product Design · Branding', es: 'Diseño de Producto · Branding' }, year: '2024 — Peñalolén, Santiago', desc: { en: "In collaboration with the Municipality of Peñalolén in Santiago, Chile, we worked with local recyclers to solve a basic but important challenge: recognition. Every day, these workers move through the city, yet they often go unnoticed.\n\nOur solution was an auditory identifier — a sound that signals not only a vehicle, but the person using it.\n\nThe object is simple: a cowbell with a metal sphere inside, that can be temporarily attached to the recycler's bicycle. As the cart moves, the bell vibrates and creates sound — no electricity or extra effort required. Its purpose is practical, but its effect is social. It transforms routine movement into a moment of connection, encouraging neighbors to notice and respond.\n\nThis small intervention reflects a bigger idea: how design can bring visibility to people who are often invisible. Here, sound becomes identity, and identity becomes connection.", es: "En colaboración con la Municipalidad de Peñalolén en Santiago, Chile, trabajamos con recicladores locales para resolver un desafío básico pero importante: el reconocimiento. Cada día, estos trabajadores recorren la ciudad, pero a menudo pasan desapercibidos.\n\nNuestra solución fue un identificador auditivo — un sonido que señala no solo un vehículo, sino a la persona que lo usa.\n\nEl objeto es simple: una campanilla con una esfera de metal en su interior, que se puede atar temporalmente a la bicicleta del reciclador. Al moverse el carro, la campana vibra y crea sonido — sin electricidad ni esfuerzo adicional. Su propósito es práctico, pero su efecto es social. Transforma el movimiento rutinario en un momento de conexión, animando a los vecinos a notar y responder.\n\nEsta pequeña intervención refleja una idea más grande: cómo el diseño puede dar visibilidad a personas que a menudo son invisibles. Aquí, el sonido se convierte en identidad, y la identidad en conexión.", }, role: 'Prototyping & Logo', team: 'Diego, Julie, Benjamin', partner: 'Peñalolén Municipality', tools: ['Autodesk Fusion', 'Illustrator', 'Figma'], media: [ { type: 'img', src: 'https://erreveka.com/wp-content/uploads/2025/10/Tolen-IMG-2.jpg' }, { type: 'img', src: 'https://erreveka.com/wp-content/uploads/2025/10/Afiche-1.jpg' }, { type: 'img', src: 'https://erreveka.com/wp-content/uploads/2025/10/Afiche-2.jpg' }, { type: 'img', src: 'https://erreveka.com/wp-content/uploads/2025/10/infografia.jpg' }, { type: 'yt', src: 'wTOsGohdRwA', thumb: 'https://img.youtube.com/vi/wTOsGohdRwA/hqdefault.jpg' }, ], }, /* ── PROYECTO 3: TRIP THRU LIGHT ── */ { name: 'Trip Thru Light', cat: { en: 'Spatial Design · Lighting', es: 'Diseño Espacial · Iluminación' }, year: '2025 — Observatorio Metro Station, El Bosque', desc: { en: "Trip Through the Light was developed in collaboration with the Municipality of El Bosque as part of a project exploring the cultural and historical identity of the Observatorio Metro Station. Inspired by the area's astronomical heritage, the proposal sought to reconnect the station with the legacy of the observatory that once gave the place its name.\n\nThrough light, color, and spatial interventions, the project transforms the daily commute into an immersive journey through the cosmos. By combining science communication with experiential design, Trip Through the Light invites visitors to rediscover astronomy as part of the community's collective memory.", es: "Trip Through the Light fue desarrollado en colaboración con la Municipalidad de El Bosque como parte de un proyecto que explora la identidad cultural e histórica de la Estación de Metro Observatorio. Inspirado en el patrimonio astronómico del área, la propuesta buscó reconectar la estación con el legado del observatorio que una vez dio nombre al lugar.\n\nA través de la luz, el color y las intervenciones espaciales, el proyecto transforma el viaje diario en un recorrido inmersivo por el cosmos. Combinando la comunicación científica con el diseño experiencial, Trip Through the Light invita a los visitantes a redescubrir la astronomía como parte de la memoria colectiva de la comunidad.", }, role: 'Research, Prototyping, 3D, Rendering', team: 'Asunción, Emilia, Connie, Sofía', partner: 'El Bosque Municipality', tools: ['Blender', 'Twinmotion', 'Figma', 'Photoshop'], media: [ { type: 'img', src: 'https://erreveka.com/wp-content/uploads/2026/05/Render-con-reflejos.jpeg' }, { type: 'img', src: 'https://erreveka.com/wp-content/uploads/2026/03/Image29.webp' }, { type: 'img', src: 'https://erreveka.com/wp-content/uploads/2026/03/Image15.webp' }, { type: 'img', src: 'https://erreveka.com/wp-content/uploads/2026/03/Image13.webp' }, { type: 'img', src: 'https://erreveka.com/wp-content/uploads/2026/03/fp2.webp' }, ], }, /* ── PROYECTO 4: SOUVENIR ERÓNICO ── */ { name: 'Souvenir Erónico', cat: { en: 'Craft · Branding', es: 'Artesanía · Branding' }, year: '2024 — Chile', desc: { en: "In collaboration with The Pew Charitable Trusts, we were invited to design a souvenir inspired by Chile's national parks, that could represent the country's natural heritage while raising awareness about its conservation.\n\nMy project, Erónico, is a heat-transfer embroidery that can be ironed onto any textile. Each design portrays an endangered Chilean species — such as the Kingfisher, the River Otter, or the Alerce tree — drawn in fragmented lines that reflect their gradual disappearance. Alongside each image appears an ironic phrase, hinting at the human behaviors and contradictions that have led to their decline.\n\nErónico turns the act of wearing or using a textile into a subtle statement. It's not just a souvenir, it's a reminder that humor can also reveal loss, and that every vanished species leaves an empty space in our shared story.", es: "En colaboración con The Pew Charitable Trusts, fuimos invitados a diseñar un souvenir inspirado en los parques nacionales de Chile, que pudiera representar el patrimonio natural del país mientras concientiza sobre su conservación.\n\nMi proyecto, Erónico, es un bordado por transferencia térmica que puede plancharse sobre cualquier textil. Cada diseño retrata una especie chilena en peligro de extinción — como el Martín Pescador, la Nutria de Río o el Alerce — dibujada en líneas fragmentadas que reflejan su desaparición gradual. Junto a cada imagen aparece una frase irónica, insinuando los comportamientos y contradicciones humanas que han llevado a su declive.\n\nErónico convierte el acto de usar un textil en una declaración sutil. No es solo un souvenir, es un recordatorio de que el humor también puede revelar la pérdida, y que cada especie desaparecida deja un espacio vacío en nuestra historia compartida.", }, role: 'Solo — Research, Prototyping, Branding', team: null, partner: 'The Pew Charitable Trusts', tools: ['Illustrator', 'Photoshop'], media: [ { type: 'img', src: 'https://erreveka.com/wp-content/uploads/2025/10/Souvenir1.jpg' }, { type: 'img', src: 'https://erreveka.com/wp-content/uploads/2025/10/Souvenir2.jpg' }, { type: 'img', src: 'https://erreveka.com/wp-content/uploads/2025/10/Souvenir3.jpg' }, ], }, /* ── PROYECTO 5: BLOX SPACE ── */ { name: 'Blox Space', cat: { en: '3D Design · Education', es: 'Diseño 3D · Educación' }, year: '2025 — Italy', desc: { en: "Educational modules for Blox Space in Italy, designed to be versatile and configurable — allowing different arrangements according to the needs of the space. Developed through detailed 3D modeling and close collaboration with the Italian team.", es: "Módulos educativos para Blox Space en Italia, diseñados para ser versátiles y configurables — permitiendo diferentes disposiciones según las necesidades del espacio. Desarrollados mediante modelado 3D detallado y estrecha colaboración con el equipo italiano.", }, role: '3D Development & Design', team: null, partner: 'Blox Space (Italy)', tools: ['Autodesk Fusion', 'Blender', 'Miro'], media: [ { type: 'img', src: 'https://erreveka.com/wp-content/uploads/2026/06/1778233452028.jpg' }, { type: 'img', src: 'https://erreveka.com/wp-content/uploads/2026/06/1778139609389.jpg' }, { type: 'img', src: 'https://erreveka.com/wp-content/uploads/2026/03/Turin-3.jpg' }, ], }, ]; /* ═══════════════════════════════════════════════════════════ 3. LOADER ═══════════════════════════════════════════════════════════ */ let prog = 0; const pctEl = document.getElementById('rvk-ld-pct'); const loaderEl = document.getElementById('rvk-loader'); const ldTick = setInterval(() => { prog = Math.min(prog + Math.random() * 18, 99); pctEl.textContent = Math.floor(prog) + '%'; }, 80); window.addEventListener('load', () => { clearInterval(ldTick); pctEl.textContent = '100%'; setTimeout(() => loaderEl.classList.add('out'), 800); }); /* ═══════════════════════════════════════════════════════════ 4. CURSOR PERSONALIZADO ═══════════════════════════════════════════════════════════ */ const dot = document.getElementById('rvk-c-dot'); const ring = document.getElementById('rvk-c-ring'); let mx = 0, my = 0, rx = 0, ry = 0; document.addEventListener('mousemove', e => { mx = e.clientX; my = e.clientY; dot.style.left = mx + 'px'; dot.style.top = my + 'px'; }); (function lerpRing() { rx += (mx - rx) * 0.12; ry += (my - ry) * 0.12; ring.style.left = rx + 'px'; ring.style.top = ry + 'px'; requestAnimationFrame(lerpRing); })(); document.querySelectorAll('a, button, .rvk-proj-card, .rvk-tool-tag, .rvk-rvk-slide, .rvk-rvk-prev, .rvk-rvk-next, .rvk-planb-arr, .rvk-planb-dot').forEach(el => { el.addEventListener('mouseenter', () => document.body.classList.add('rvk-cx')); el.addEventListener('mouseleave', () => document.body.classList.remove('rvk-cx')); }); /* ═══════════════════════════════════════════════════════════ 5. BARRA DE PROGRESO (scroll) ═══════════════════════════════════════════════════════════ */ const bar = document.getElementById('rvk-progress'); window.addEventListener('scroll', () => { bar.style.transform = 'scaleX(' + (window.scrollY / (document.body.scrollHeight - window.innerHeight)) + ')'; }, { passive: true }); /* ═══════════════════════════════════════════════════════════ 6. PARALAJE — texto fantasma contacto ═══════════════════════════════════════════════════════════ */ const ghost = document.getElementById('rvk-c-ghost'); window.addEventListener('scroll', () => { const r = ghost.parentElement.getBoundingClientRect(); if (r.bottom > 0 && r.top < window.innerHeight) { ghost.style.transform = 'translateX(' + (((window.innerHeight - r.top) / (window.innerHeight + r.height)) - .5) * -60 + 'px)'; } }, { passive: true }); /* ═══════════════════════════════════════════════════════════ 7. SCROLL REVEAL ═══════════════════════════════════════════════════════════ */ const revObs = new IntersectionObserver( es => es.forEach(e => { if (e.isIntersecting) e.target.classList.add('in'); }), { threshold: 0.1 } ); document.querySelectorAll('.rvk-rev').forEach(el => revObs.observe(el)); /* ═══════════════════════════════════════════════════════════ 8. CARRUSEL PLAN ₿ (mini-reel) ═══════════════════════════════════════════════════════════ */ const planbSlides = Array.from(document.querySelectorAll('.rvk-planb-slide')); const planbDots = Array.from(document.querySelectorAll('.rvk-planb-dot')); let planbCur = 0; let planbTimer = null; function showPlanbSlide(n) { planbSlides[planbCur].classList.remove('active'); planbDots[planbCur].classList.remove('active'); planbCur = ((n % planbSlides.length) + planbSlides.length) % planbSlides.length; planbSlides[planbCur].classList.add('active'); planbDots[planbCur].classList.add('active'); const iframe = planbSlides[planbCur].querySelector('iframe[data-src]'); if (iframe) { iframe.src = iframe.dataset.src; iframe.removeAttribute('data-src'); } } function resetPlanbTimer() { clearInterval(planbTimer); planbTimer = setInterval(() => showPlanbSlide(planbCur + 1), 4500); } (function initPlanbYT() { const iframe = planbSlides[0].querySelector('iframe[data-src]'); if (iframe) { iframe.src = iframe.dataset.src; iframe.removeAttribute('data-src'); } })(); document.getElementById('rvk-planb-prev').addEventListener('click', () => { showPlanbSlide(planbCur - 1); resetPlanbTimer(); }); document.getElementById('rvk-planb-next').addEventListener('click', () => { showPlanbSlide(planbCur + 1); resetPlanbTimer(); }); planbDots.forEach((d, i) => d.addEventListener('click', () => { showPlanbSlide(i); resetPlanbTimer(); })); resetPlanbTimer(); /* ═══════════════════════════════════════════════════════════ 9. FONDO AMBIENTE (ambient background) ═══════════════════════════════════════════════════════════ */ const carAmbA = document.getElementById('rvk-car-amb-a'); const carAmbB = document.getElementById('rvk-car-amb-b'); let ambActive = 'a'; let lastAmbOrigIdx = -1; function ambBg(item) { if (item.type === 'img') return `url('${item.src}')`; if (item.type === 'video') return item.thumb ? `url('${item.thumb}')` : 'none'; if (item.type === 'yt') return `url('${item.thumb}')`; return 'none'; } function updateAmb(item) { const bg = ambBg(item); if (ambActive === 'a') { carAmbB.style.backgroundImage = bg; carAmbA.style.opacity = '0'; carAmbB.style.opacity = '1'; ambActive = 'b'; } else { carAmbA.style.backgroundImage = bg; carAmbB.style.opacity = '0'; carAmbA.style.opacity = '1'; ambActive = 'a'; } } function resetAmb() { carAmbA.style.opacity = '0'; carAmbB.style.opacity = '0'; } /* ═══════════════════════════════════════════════════════════ 10. CARRUSEL RVK (dentro del modal) ═══════════════════════════════════════════════════════════ */ const DRAG_THRESHOLD = 8; const COPIES = 5; const TRANSITION_DUR = '380ms cubic-bezier(.22,.61,.36,1)'; let rvkMedia = []; let rvkCount = 0; let rvkCurrentOrig = 0; let rvkDestroyFns = []; function debounce(fn, delay) { var t; return function () { clearTimeout(t); t = setTimeout(fn, delay || 120); }; } function buildRvkSlide(item) { const slide = document.createElement('div'); slide.className = 'rvk-rvk-slide'; if (item.type === 'video') { const vid = document.createElement('video'); vid.src = item.src; vid.muted = true; vid.loop = true; vid.playsInline = true; slide.appendChild(vid); } else if (item.type === 'yt') { const fr = document.createElement('iframe'); fr.dataset.src = `https://www.youtube.com/embed/${item.src}?autoplay=1&mute=1&loop=1&playlist=${item.src}&rel=0&modestbranding=1`; fr.allow = 'autoplay; encrypted-media; fullscreen'; fr.allowFullscreen = true; slide.appendChild(fr); } else { const img = document.createElement('img'); img.src = item.src; img.alt = ''; img.draggable = false; img.loading = 'lazy'; slide.appendChild(img); } return slide; } function renderDots(n, origIdx) { const el = document.getElementById('rvk-car-dots'); el.innerHTML = ''; for (let i = 0; i < n; i++) { const btn = document.createElement('button'); btn.className = 'rvk-car-dot' + (i === origIdx ? ' active' : ''); btn.dataset.i = i; el.appendChild(btn); } } function updateCounter(origIdx, n) { const pad = v => String(v + 1).padStart(2, '0'); const el = document.getElementById('rvk-modal-topbar-counter'); if (el) el.textContent = `${pad(origIdx)} / ${pad(n - 1)}`; } function initRvkCarousel() { const carousel = document.getElementById('rvk-rvk-car'); const track = document.getElementById('rvk-rvk-track'); const dotsEl = document.getElementById('rvk-car-dots'); const btnPrev = document.getElementById('rvk-rvk-prev'); const btnNext = document.getElementById('rvk-rvk-next'); rvkDestroyFns.forEach(fn => fn()); rvkDestroyFns = []; track.innerHTML = ''; track.style.transition = 'none'; track.style.transform = 'translate3d(0,0,0)'; carousel.classList.remove('is-dragging'); rvkCount = rvkMedia.length; if (!rvkCount) return; const originals = rvkMedia.map(buildRvkSlide); originals.forEach(s => track.appendChild(s)); for (let c = 1; c < COPIES; c++) originals.forEach(s => track.appendChild(s.cloneNode(true))); const slides = Array.from(track.children); let tx = 0, viewportW = 0, centers = []; let isDown = false, dragStarted = false; let startX = 0, prevX = 0, startTx = 0; let currentIndex = 0, focusRaf = null; function applyTransform(animate) { track.style.transition = animate ? `transform ${TRANSITION_DUR}` : 'none'; track.style.transform = `translate3d(${tx}px,0,0)`; } function computeCenters() { if (!slides.length) return; const savedTf = track.style.transform, savedTr = track.style.transition; track.style.transition = 'none'; track.style.transform = 'translate3d(0,0,0)'; viewportW = carousel.getBoundingClientRect().width || 0; const baseLeft = track.getBoundingClientRect().left; centers = slides.map(s => { const r = s.getBoundingClientRect(); return (r.left - baseLeft) + r.width / 2; }); track.style.transform = savedTf; track.style.transition = savedTr; } function viewportCenter() { return -tx + viewportW / 2; } function nearestIndex() { if (!centers.length) return 0; const vc = viewportCenter(); let best = 0, bestDist = Infinity; centers.forEach((c, i) => { const d = Math.abs(c - vc); if (d < bestDist) { bestDist = d; best = i; } }); return best; } function loadYouTubeIfNeeded(slide) { if (!slide) return; const fr = slide.querySelector('iframe[data-src]'); if (fr) { fr.src = fr.dataset.src; fr.removeAttribute('data-src'); } } function updateFocus() { if (!slides.length || !centers.length) return; slides.forEach(s => s.classList.remove('is-center', 'is-near')); const idx = nearestIndex(); const origIdx = idx % rvkCount; currentIndex = idx; rvkCurrentOrig = origIdx; if (slides[idx]) slides[idx].classList.add('is-center'); if (slides[idx - 1]) slides[idx - 1].classList.add('is-near'); if (slides[idx + 1]) slides[idx + 1].classList.add('is-near'); loadYouTubeIfNeeded(slides[idx]); slides.forEach((s, i) => { const v = s.querySelector('video'); if (!v) return; if (i === idx) v.play().catch(() => {}); else v.pause(); }); if (origIdx !== lastAmbOrigIdx) { lastAmbOrigIdx = origIdx; updateAmb(rvkMedia[origIdx]); } renderDots(rvkCount, origIdx); updateCounter(origIdx, rvkCount); dotsEl.querySelectorAll('.rvk-car-dot').forEach(d => { d.addEventListener('click', () => { const t = +d.dataset.i; if (t === origIdx) return; alignToIndex(t + rvkCount * Math.floor(COPIES / 2), true); }); }); } function scheduleFocus() { if (focusRaf) return; focusRaf = requestAnimationFrame(() => { focusRaf = null; updateFocus(); }); } function alignToIndex(idx, animate) { if (!centers.length) return; idx = Math.max(0, Math.min(centers.length - 1, idx)); currentIndex = idx; tx = -(centers[idx] - viewportW / 2); applyTransform(animate); scheduleFocus(); } function wrapIfNeeded() { const idx = nearestIndex(); const copy = Math.floor(idx / rvkCount); const mid = Math.floor(COPIES / 2); if (copy < 1 || copy >= COPIES - 1) { requestAnimationFrame(() => alignToIndex((idx % rvkCount) + rvkCount * mid, false)); } } function snap() { if (!centers.length) return; alignToIndex(nearestIndex(), true); } function onDown(x) { isDown = true; dragStarted = false; startX = x; prevX = x; startTx = tx; carousel.classList.add('is-dragging'); track.style.transition = 'none'; } function onMove(x) { if (!isDown) return; const delta = x - prevX; prevX = x; if (!dragStarted && Math.abs(x - startX) < DRAG_THRESHOLD) return; dragStarted = true; tx += delta; applyTransform(false); scheduleFocus(); } function onUp() { if (!isDown) return; isDown = false; carousel.classList.remove('is-dragging'); if (!dragStarted) { tx = startTx; applyTransform(false); scheduleFocus(); return; } snap(); } const onMouseMove = e => onMove(e.clientX); const onMouseUp = () => onUp(); const onMouseLeave = () => { if (isDown) onUp(); }; track.addEventListener('mousedown', e => onDown(e.clientX)); window.addEventListener('mousemove', onMouseMove); window.addEventListener('mouseup', onMouseUp); window.addEventListener('mouseleave', onMouseLeave); track.addEventListener('touchstart', e => { if (e.touches.length) onDown(e.touches[0].clientX); }, { passive: true }); track.addEventListener('touchmove', e => { if (e.touches.length) onMove(e.touches[0].clientX); }, { passive: true }); track.addEventListener('touchend', onUp, { passive: true }); track.addEventListener('touchcancel', onUp, { passive: true }); track.querySelectorAll('img,video,iframe').forEach(el => el.addEventListener('dragstart', e => e.preventDefault())); track.addEventListener('transitionend', e => { if (e.target === track && e.propertyName === 'transform') wrapIfNeeded(); }); function goTo(delta) { if (!centers.length) return; alignToIndex(Math.max(0, Math.min(centers.length - 1, nearestIndex() + delta)), true); } const onPrev = () => goTo(-1), onNext = () => goTo(+1); btnPrev.addEventListener('click', onPrev); btnNext.addEventListener('click', onNext); const ro = new ResizeObserver(debounce(() => { computeCenters(); alignToIndex(currentIndex, false); })); ro.observe(carousel); const recalc = debounce(() => { computeCenters(); alignToIndex(currentIndex, false); }, 80); slides.forEach(sl => { const img = sl.querySelector('img'), vid = sl.querySelector('video'); if (img) { if (img.complete && img.naturalWidth > 0) recalc(); else { img.addEventListener('load', recalc); img.addEventListener('error', recalc); } } if (vid) vid.addEventListener('loadedmetadata', recalc); }); requestAnimationFrame(() => { computeCenters(); if (centers.length) alignToIndex(rvkCount * Math.floor(COPIES / 2), false); if (document.readyState !== 'complete') { window.addEventListener('load', () => { computeCenters(); alignToIndex(currentIndex, false); }, { once: true }); } }); rvkDestroyFns.push(() => { window.removeEventListener('mousemove', onMouseMove); window.removeEventListener('mouseup', onMouseUp); window.removeEventListener('mouseleave', onMouseLeave); btnPrev.removeEventListener('click', onPrev); btnNext.removeEventListener('click', onNext); ro.disconnect(); }); } /* ═══════════════════════════════════════════════════════════ 11. MODAL DE PROYECTOS ═══════════════════════════════════════════════════════════ */ const modal = document.getElementById('rvk-proj-modal'); const modalClose = document.getElementById('rvk-modal-close'); let openProjectIdx = -1; function renderModalInfo(idx) { const p = PROJECTS[idx]; const T = LANG[currentLang]; const cat = p.cat[currentLang] || p.cat.en; const desc = p.desc[currentLang] || p.desc.en; document.getElementById('rvk-modal-topbar-cat').textContent = cat; document.getElementById('rvk-modal-name').textContent = p.name; document.getElementById('rvk-modal-year-cat').innerHTML = `${p.year}
${cat}`; document.getElementById('rvk-modal-desc').innerHTML = desc.split('\n\n').map(par => `

${par}

`).join(''); const metas = [ { label: T['lbl.role'], val: p.role }, p.team ? { label: T['lbl.team'], val: p.team } : null, p.partner ? { label: T['lbl.partner'], val: p.partner } : null, ].filter(Boolean); document.getElementById('rvk-modal-meta-row').innerHTML = metas.map(m => `
${m.label}
${m.val}
` ).join(''); document.getElementById('rvk-modal-tools').innerHTML = p.tools.map(t => `${t}`).join(''); } function openModal(idx) { openProjectIdx = idx; const p = PROJECTS[idx]; rvkMedia = p.media; lastAmbOrigIdx = -1; const bg = ambBg(p.media[0]); carAmbA.style.backgroundImage = bg; carAmbA.style.opacity = '1'; carAmbB.style.opacity = '0'; ambActive = 'a'; renderModalInfo(idx); initRvkCarousel(); modal.classList.add('open'); document.body.classList.add('rvk-modal-open'); } function closeModal() { modal.classList.remove('open'); document.body.classList.remove('rvk-modal-open'); openProjectIdx = -1; rvkDestroyFns.forEach(fn => fn()); rvkDestroyFns = []; const track = document.getElementById('rvk-rvk-track'); track.querySelectorAll('video').forEach(v => { v.pause(); v.removeAttribute('src'); v.load(); }); track.querySelectorAll('iframe').forEach(f => { f.src = ''; }); setTimeout(() => { resetAmb(); track.innerHTML = ''; }, 400); } document.querySelectorAll('.rvk-proj-card').forEach(c => c.addEventListener('click', () => openModal(+c.dataset.index)) ); modal.addEventListener('click', e => { if (e.target === modal) closeModal(); }); modalClose.addEventListener('click', closeModal); document.addEventListener('keydown', e => { if (!modal.classList.contains('open')) return; if (e.key === 'Escape') closeModal(); }); /* ═══════════════════════════════════════════════════════════ 12. SELECTOR DE IDIOMA ═══════════════════════════════════════════════════════════ */ const langWrap = document.getElementById('rvk-lang-wrap'); const langBtn = document.getElementById('rvk-lang-btn'); const langMenu = document.getElementById('rvk-lang-menu'); langBtn.addEventListener('click', e => { e.stopPropagation(); langWrap.classList.toggle('open'); }); document.addEventListener('click', () => langWrap.classList.remove('open')); langMenu.addEventListener('click', e => e.stopPropagation()); document.querySelectorAll('.rvk-lang-opt').forEach(btn => { btn.addEventListener('click', () => { applyLang(btn.dataset.lang); langWrap.classList.remove('open'); }); }); /* ═══════════════════════════════════════════════════════════ 13. BOTÓN CTA MAGNÉTICO ═══════════════════════════════════════════════════════════ */ const magBtn = document.getElementById('rvk-mag-btn'); magBtn.addEventListener('mousemove', e => { const r = magBtn.getBoundingClientRect(); magBtn.style.transition = 'background .25s ease, transform .1s ease'; magBtn.style.transform = `translate(${(e.clientX - r.left - r.width / 2) * .3}px,${(e.clientY - r.top - r.height / 2) * .3}px)`; }); magBtn.addEventListener('mouseleave', () => { magBtn.style.transition = 'background .25s ease, transform .55s cubic-bezier(.4,0,.2,1)'; magBtn.style.transform = ''; }); /* ── Aplica el idioma detectado al cargar ── */ applyLang(currentLang);
Erreveka — Portfolio

Design Student — Universidad Católica de Chile
Plan ₿ Network Graduate · Santiago, Chile

2026

Portfolio / Design & Innovation

RAIMUNDO
Valenzuela
Kerestegian

Exploring the intersection between industrial design, spatial thinking, and emerging technologies. Creating solutions that connect people with place, idea, and technology.

01
MITA
2025
02
Miló Chair
2025
03
Tolen Tolen
2024
04
Trip Thru Light
2025
05
Souvenir
2024
06
Blox Space
2025
Autodesk Fusion Blender Figma Twinmotion Adobe CC 3D Modeling UX Research Prototyping Bitcoin Branding Spatial Design

MITA

FusionBlenderFigma
2025
Research & Prototyping
Pedro, Diego, Benjamin, Juliana, Itzel
AMB Airport, Santiago

Working with Santiago's Arturo Merino Benítez Airport, we noticed this airport moves millions of people but says very little about where they've arrived. MITA is a modular installation combining mirrors and Chilean landscapes to turn empty corridors into something more alive.

Animation
Render
Poster A
Poster B
MITA

Miló Chair

FusionBlenderIllustrator
2025
Solo — Research, Prototyping, Rendering
Steel · Oak · Sunbrella · ABS
Hotel lounge environments

Miló is a lounge chair for hotel environments, inspired by the Micol lamp by Cristiano Mino. It translates tension, visual weight, and material balance into furniture—steel, oak, Sunbrella textile, and bent ABS plastic.

Animation
Miló 1
Miló 2
Miló 3
Miló 4
Miló 5

TOLEN TOLEN

FusionIllustratorFigma
2024
Prototyping & Logo
Peñalolén Municipality
Diego, Julie, Benjamin

In collaboration with the Municipality of Peñalolén, we worked with local recyclers to solve a basic challenge: recognition. A cowbell that attaches to bicycles, creating sound through movement—no electricity needed. Sound becomes identity, and identity becomes connection.

Tolen Tolen
Photo
Tolen obj
Poster 1
Poster 2
Infographic
YouTube

TRIP THRU the Light

BlenderTwinmotionFigmaPhotoshop
2025
Research, Prototyping, 3D, Rendering
El Bosque Municipality
Asunción, Emilia, Connie, Sofía

Developed with the Municipality of El Bosque, exploring the identity of the Observatorio Metro Station. Through light, color, and spatial interventions, the daily commute becomes an immersive journey through the cosmos.

Trip render
Photo
Render
Trip 2
Trip 3
Trip 4
Trip 5

Souvenir Erónico

IllustratorPhotoshop
2024
Solo — Research, Prototyping, Branding
The Pew Charitable Trusts

In collaboration with The Pew Charitable Trusts. Erónico is a heat-transfer embroidery portraying endangered Chilean species in fragmented lines. Each image carries an ironic phrase revealing the human contradictions behind extinction.

Souvenir
Photo
Souvenir
Detail
Applied

Blox Space

FusionBlenderMiro
2025
3D Development & Design
Blox Space
Blox Space ↗

As part of a design team, I participated in the development of educational modules for a company in Italy. These modules were designed to be versatile and configurable, allowing them to be arranged in different ways according to the needs of the space.

Blox Space render 1
Photo
Render 1
Render 2
Turin
Plan ₿ Network Graduate · 2024

PLAN ₿
NETWORK

Selected as one of 21 students out of 130 participants to attend the Plan ₿ Summer School 2024 in Lugano, Switzerland. Completed 102 hours of intensive coursework on Bitcoin's economic principles, business models, and global impact. Developed a Bitcoin marketing strategy for satsback in collaboration with Jesé and Lucía.

View Plan ₿ Biz School course ↗
Plan B Summer School
Diploma selfie
Plan B diploma

06 — Get in touch

Let's build something together.