{"version":3,"file":"CodeType.dhOY--nF.mjs","names":["useRef","useState"],"sources":["https:/framerusercontent.com/modules/HPz4vK2Dt88L9B76RgwR/udWCCgidjnApnrHEWE3U/CodeType.js"],"sourcesContent":["import{jsx as _jsx}from\"react/jsx-runtime\";import{forwardRef,useEffect,useRef,useState}from\"react\";import{useIsStaticRenderer}from\"framer\";// Entrada tipo escritura para textos de Framer (override).\n// No toca el DOM del texto: la parte aún no escrita se oculta con la CSS Custom Highlight API\n// (::highlight con color transparente), así el ancho y los saltos de línea nunca cambian.\n// Sin soporte para Highlight, el texto entra con un fundido simple.\nconst HL=\"ct-hidden\";const CSS=`::highlight(${HL}) { color: transparent; }`;function mergeRefs(a,b){return el=>{for(const r of[a,b]){if(typeof r===\"function\")r(el);else if(r)r.current=el;}};}function injectCss(){if(typeof document===\"undefined\"||document.getElementById(\"ct-css\"))return;const s=document.createElement(\"style\");s.id=\"ct-css\";s.textContent=CSS;document.head.appendChild(s);}// Un solo Highlight compartido: cada texto agrega y quita su propio rango\nfunction sharedHighlight(){const reg=window.CSS&&window.CSS.highlights;const H=window.Highlight;if(!reg||!H)return null;let h=reg.get(HL);if(!h){h=new H;reg.set(HL,h);}return h;}function fadeIn(el,delay,done){el.style.transition=\"opacity .6s ease \"+delay+\"ms\";requestAnimationFrame(()=>el.style.opacity=\"1\");const t=window.setTimeout(done,delay+650);return()=>clearTimeout(t);}function typeIn(el,delay,msPerChar,minMs,done,onHead){const hl=sharedHighlight();if(!hl)return fadeIn(el,delay,done);const walker=document.createTreeWalker(el,NodeFilter.SHOW_TEXT);const nodes=[];while(walker.nextNode()){const t=walker.currentNode;if(t.data.length)nodes.push(t);}const last=nodes[nodes.length-1];if(!last)return fadeIn(el,0,done);const total=nodes.reduce((n,t)=>n+t.data.length,0);// textos cortos (p. ej. \"Hablemos\") no se escriben de golpe: duran al menos minMs\nconst ms=Math.max(msPerChar,minMs/total);const range=document.createRange();const setHead=h=>{if(onHead)onHead(h,total);let i=0;while(i<nodes.length-1&&h>=nodes[i].data.length){h-=nodes[i].data.length;i++;}range.setStart(nodes[i],Math.min(h,nodes[i].data.length));range.setEnd(last,last.data.length);};setHead(0);hl.add(range);el.style.opacity=\"1\";let start=0;let timer=0;const finish=()=>{hl.delete(range);if(onHead)onHead(total,total);done();};const step=()=>{const h=Math.floor((performance.now()-start)/ms);if(h>=total)return finish();setHead(h);timer=window.setTimeout(step,32);};const kick=window.setTimeout(()=>{start=performance.now();step();},delay);return()=>{clearTimeout(kick);clearTimeout(timer);hl.delete(range);};}// Rotación del final del texto: la frase actual se borra hacia atrás y la siguiente se escribe\n// con la misma escritura de la entrada. El texto se cambia en el mismo nodo y la altura se\n// reserva con la frase más alta, así nada de abajo salta.\nconst HOLD=1600;const ERASE_MS=16;const NOOP={begin:()=>{},entry:()=>{},stop:()=>{}};// subrayado de la frase que rota: 1px en el color del texto (fg), una línea por palabra\nconst LINE_COLOR=\"var(--token-e2a4b0f4-e715-4139-b4d5-350a57582dba, currentColor)\";// halo del color del fondo alrededor de las letras: la línea va detrás del texto y el halo la\n// interrumpe con un pequeño aire donde cruza los descendentes (p, g, j, y), como skip-ink\nconst PAGE_BG=\"var(--token-3edd97f2-8cdb-47c9-9df8-f7fc89c9a0c4, #F5F5F7)\";const HALO=[[2,0],[-2,0],[0,2],[1.5,1.5],[-1.5,1.5],[1,-1],[-1,-1]].map(([x,y])=>`${PAGE_BG} ${x}px ${y}px 0`).join(\", \");const LINE_PX=1;// distancia bajo la línea base, en em: cerca de la base, cruza los descendentes (p, g, j)\nconst LINE_DROP=.13;// cada frase se mantiene unida: espacios duros y sin corte tras el guion, así en móvil baja\n// completa a la línea siguiente en vez de partirse (\"user / experience\", \"data- / driven\")\nconst unbreakable=p=>p.replace(/ /g,\"\\xa0\").replace(/-/g,\"-⁠\");// en teléfono: \"Designer especializado en\" fijo en la línea 2 y la frase abre la línea 3\nconst PHONE_LINE=\"Designer especializado en\";function rotateTail(el,raw,msPerChar){const walker=document.createTreeWalker(el,NodeFilter.SHOW_TEXT);let last=null;while(walker.nextNode()){const t=walker.currentNode;if(t.data.length)last=t;}if(!last||!last.parentNode||raw.length<2)return NOOP;const node=last;const original=node.data;let idx=raw.findIndex(p=>original.endsWith(p));if(idx<0)return NOOP;const rawPrefix=original.slice(0,original.length-raw[idx].length);const phrases=raw.map(unbreakable);// la palabra justo antes de la frase (\"en\") viaja siempre con ella\nconst withTail=rawPrefix.replace(/ $/,\"\\xa0\");// variantes para teléfono, en orden de preferencia:\n// 1) \"Designer especializado en\" unido y la frase siempre en la línea siguiente\n// 2) \"Designer especializado\" unido y \"en\" viaja con la frase\nconst glue=(s,g)=>s.split(g).join(g.replace(/ /g,\"\\xa0\"));const phoneLine=glue(rawPrefix,PHONE_LINE);const phoneTail=glue(withTail,PHONE_LINE.replace(/ \\S+$/,\"\"));// las variantes solo cambian espacios por espacios duros: el largo es el mismo\nlet prefix=withTail;// Lo que falta por escribir va en un span transparente justo después del texto: ocupa su\n// lugar (los cortes de línea no cambian) pero no se ve. Antes se ocultaba con la Highlight\n// API, pero Safari en iPhone no repinta un rango registrado cuando cambia de tamaño (el\n// texto quedaba invisible) y agregarlo/quitarlo en cada ciclo lo hacía parpadear.\nconst rest=document.createElement(\"span\");rest.setAttribute(\"aria-hidden\",\"true\");rest.style.color=\"transparent\";rest.style.textShadow=\"none\";node.parentNode.insertBefore(rest,node.nextSibling);let shown=phrases[idx].length;const write=k=>{const p=phrases[idx];shown=Math.max(0,Math.min(k,p.length));node.data=prefix+p.slice(0,shown);rest.textContent=p.slice(shown);};write(shown);// corte de línea normal (sin balance): así la primera parte del título no se reacomoda\n// al cambiar la frase final; solo cambia la última línea\nconst wrapped=[el,...Array.from(el.querySelectorAll(\"*\"))];for(const w of wrapped)w.style.setProperty(\"text-wrap\",\"wrap\");// altura reservada: la mayor entre todas las frases al ancho actual\nconst overflows=()=>wrapped.some(w=>w.scrollWidth>w.clientWidth+1);// la primera letra de la frase cae en una línea más abajo que el final del prefijo\nconst probe=document.createRange();const charTop=i=>{probe.setStart(node,i);probe.setEnd(node,i+1);return probe.getBoundingClientRect().top;};const phraseOnNewLine=()=>charTop(prefix.length)>charTop(prefix.length-2)+1;let cachedMetrics=null;const reserve=()=>{const keep=shown;el.style.minHeight=\"\";rest.textContent=\"\";// en teléfono prueba las variantes; si una no cabe (pantalla angosta) o la frase no\n// queda sola en su línea, pasa a la siguiente antes que recortar o saltar\nprefix=withTail;if(window.innerWidth<768){for(const cand of[phoneLine,phoneTail]){prefix=cand;const own=cand===phoneLine;const ok=phrases.every(p=>{node.data=cand+p;return!overflows()&&(!own||phraseOnNewLine());});if(ok)break;prefix=withTail;}}cachedMetrics=null;let max=0;for(const p of phrases){node.data=prefix+p;max=Math.max(max,el.getBoundingClientRect().height);}el.style.minHeight=max+\"px\";write(keep);if(lines)drawLine();};let rw=0;const onResize=()=>{cancelAnimationFrame(rw);rw=requestAnimationFrame(reserve);};window.addEventListener(\"resize\",onResize);let visible=true;const io=new IntersectionObserver(([e])=>visible=e.isIntersecting);io.observe(el);// subrayado de la frase que rota: una línea propia (no text-decoration) que mide el tramo\n// visible, así crece al escribir y se recoge al borrar, igual que el texto\nif(getComputedStyle(el).position===\"static\")el.style.position=\"relative\";// Framer recorta el texto (overflow hidden) justo en la última línea: sin esto la línea,\n// que cae bajo los descendentes, queda cortada y no se ve\nconst prevOverflow=el.style.overflow;el.style.overflow=\"visible\";// contexto propio para poner las líneas detrás del texto (z-index -1) sin irse bajo la página\nconst prevIsolation=el.style.isolation;el.style.isolation=\"isolate\";const textEl=node.parentElement||el;const prevShadow=textEl.style.textShadow;textEl.style.textShadow=HALO;// una línea por palabra: se corta en los espacios y cada tramo mide solo lo ya escrito\nconst lines=[];const lineAt=i=>{if(!lines[i]){const l=document.createElement(\"span\");l.setAttribute(\"aria-hidden\",\"true\");l.style.cssText=`position:absolute;left:0;top:0;z-index:-1;width:0;height:${LINE_PX}px;background:${LINE_COLOR};pointer-events:none`;el.appendChild(l);lines[i]=l;}return lines[i];};// descendente de la fuente: el rect del texto termina ahí, la línea base está justo encima\nconst metrics=()=>{if(cachedMetrics)return cachedMetrics;const cs=getComputedStyle(textEl);const size=parseFloat(cs.fontSize)||16;let descent=size*.22;try{const ctx=document.createElement(\"canvas\").getContext(\"2d\");if(ctx){ctx.font=`${cs.fontStyle} ${cs.fontWeight} ${cs.fontSize} ${cs.fontFamily}`;const d=ctx.measureText(\"Hg\").fontBoundingBoxDescent;if(d>0)descent=d;}}catch(e){}cachedMetrics={size,descent};return cachedMetrics;};const isGap=c=>c===\" \"||c===\"\\xa0\";const seen=document.createRange();// dibuja las líneas bajo lo ya escrito de la frase (lo que está en el nodo de texto), o solo\n// hasta \"limit\" letras durante la entrada\nconst drawLine=limit=>{let typed=node.data.slice(prefix.length);if(limit!==undefined)typed=typed.slice(0,Math.max(0,limit));const box=el.getBoundingClientRect();const{size,descent}=metrics();let n=0;let i=0;while(i<typed.length){if(isGap(typed[i])){i++;continue;}let j=i;while(j<typed.length&&!isGap(typed[j]))j++;seen.setStart(node,prefix.length+i);seen.setEnd(node,prefix.length+j);const r=seen.getBoundingClientRect();const y=r.bottom-descent+size*LINE_DROP;const l=lineAt(n++);l.style.width=r.width+\"px\";l.style.transform=`translate(${r.left-box.left}px, ${Math.round(y-box.top)}px)`;i=j;}for(;n<lines.length;n++)lines[n].style.width=\"0px\";};reserve();let timer=0;const run=(from,to,ms,next)=>{const start=performance.now();const step=()=>{const n=Math.floor((performance.now()-start)/ms);const k=from>to?Math.max(to,from-n):Math.min(to,from+n);write(k);drawLine();if(k===to)return next();timer=window.setTimeout(step,32);};step();};const hold=()=>{timer=window.setTimeout(()=>{// fuera de pantalla o en otra pestaña: espera sin rotar\nif(!visible||document.hidden)return hold();run(phrases[idx].length,0,ERASE_MS,()=>{idx=(idx+1)%phrases.length;write(0);run(0,phrases[idx].length,msPerChar,hold);});},HOLD);};return{begin:hold,// durante la entrada (que sí usa la Highlight API sobre el texto completo): h es cuántas\n// letras del texto ya se escribieron; las líneas siguen solo esa parte de la frase\nentry:(h,total)=>drawLine(h-(total-node.data.length)-prefix.length),stop:()=>{for(const l of lines)l.remove();rest.remove();el.style.overflow=prevOverflow;el.style.isolation=prevIsolation;textEl.style.textShadow=prevShadow;clearTimeout(timer);cancelAnimationFrame(rw);window.removeEventListener(\"resize\",onResize);io.disconnect();node.data=original;el.style.minHeight=\"\";for(const w of wrapped)w.style.removeProperty(\"text-wrap\");}};}function makeTyped(Component,delay,msPerChar,minMs,phrases){return /*#__PURE__*/forwardRef(function CodeTyped(props,ref){const own=useRef(null);const isStatic=useIsStaticRenderer();const[ready,setReady]=useState(false);useEffect(()=>{const el=own.current;// sin nodo (el ref no llegó) nunca dejamos el texto oculto\nif(!el||isStatic){setReady(true);return;}const reduced=window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;if(reduced){setReady(true);return;}injectCss();let stop;// la rotación se prepara antes de la entrada (altura y cortes fijos) y arranca al terminar\nlet rot=NOOP;if(phrases){try{rot=rotateTail(el,phrases,msPerChar);}catch(e){}}const typed=()=>{setReady(true);rot.begin();};try{stop=typeIn(el,delay,msPerChar,minMs,typed,rot.entry);}catch(e){el.style.opacity=\"1\";setReady(true);}return()=>{if(stop)stop();rot.stop();el.style.opacity=\"1\";};},[isStatic]);const style=isStatic||ready?props.style:{...props.style,opacity:0};return /*#__PURE__*/_jsx(Component,{...props,style:style,ref:mergeRefs(own,ref)});});}// Frases que rotan al final del título (la primera debe ser con la que termina el texto en Framer)\nconst TITLE_PHRASES=[\"experiencia de usuario\",\"sistemas de dise\\xf1o\",\"dise\\xf1o basado en datos\",\"dise\\xf1o a c\\xf3digo con IA\"];/** Título: escribe primero y luego rota el final entre las frases. */export function withCodeTitle(Component){return makeTyped(Component,250,24,700,TITLE_PHRASES);}/** Bajada: empieza cuando el título va por la mitad, más rápido. */export function withCodeLead(Component){return makeTyped(Component,1100,5,500);}\nexport const __FramerMetadata__ = {\"exports\":{\"withCodeLead\":{\"type\":\"reactHoc\",\"name\":\"withCodeLead\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withCodeTitle\":{\"type\":\"reactHoc\",\"name\":\"withCodeTitle\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./CodeType.map"],"mappings":"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"}