const { useState, useEffect, useRef } = React; /* ── Utility: SVG annular sector path ─────────────── */ function sectorPath(cx, cy, r1, r2, startDeg, endDeg) { const rad = d => (d - 90) * Math.PI / 180; const s = rad(startDeg), e = rad(endDeg); const large = (endDeg - startDeg) > 180 ? 1 : 0; const p = (r, a) => [cx + r * Math.cos(a), cy + r * Math.sin(a)]; const [x1,y1] = p(r2,s), [x2,y2] = p(r2,e), [x3,y3] = p(r1,e), [x4,y4] = p(r1,s); return `M${x1},${y1} A${r2},${r2},0,${large},1,${x2},${y2} L${x3},${y3} A${r1},${r1},0,${large},0,${x4},${y4} Z`; } function labelPos(cx, cy, r, startDeg, endDeg) { const mid = (startDeg + endDeg) / 2; const rad = (mid - 90) * Math.PI / 180; return [cx + r * Math.cos(rad), cy + r * Math.sin(rad)]; } /* ── 1. RUEDA DE EMOCIONES ────────────────────────── */ const EMOTIONS = [ { name: 'Alegría', color: '#E8C847', light: '#F5E89A', desc: 'La alegría es una respuesta emocional ante algo que evaluamos como positivo o satisfactorio. Va desde el placer suave hasta la euforia.', sub: ['Serenidad', 'Júbilo', 'Éxtasis'], tags: ['Conexión', 'Logro', 'Amor'], coping: 'Saborea el momento conscientemente. No la aceleres. Compártela.', }, { name: 'Confianza', color: '#7BAE9F', light: '#B8D9D2', desc: 'Sensación de seguridad hacia uno mismo o hacia los demás. Base del vínculo y de la autoestima sana.', sub: ['Aceptación', 'Admiración', 'Confianza plena'], tags: ['Vínculo', 'Seguridad', 'Identidad'], coping: 'Refuerza con evidencias reales. Confiar se entrena con pequeñas acciones.', }, { name: 'Miedo', color: '#5CA09A', light: '#A4CEC9', desc: 'El miedo es una señal de alerta. Es útil cuando la amenaza es real, problemático cuando el cerebro genera falsas alarmas.', sub: ['Aprensión', 'Susto', 'Terror'], tags: ['Amenaza', 'Incertidumbre', 'Ansiedad'], coping: 'Nombra el miedo. Pregúntate: ¿es real o probable? Respira despacio.', }, { name: 'Sorpresa', color: '#7496B8', light: '#B0C8DE', desc: 'Estado breve de orientación hacia algo inesperado. Puede ir seguida de emociones positivas o negativas.', sub: ['Distracción', 'Asombro', 'Desconcierto'], tags: ['Novedad', 'Cambio', 'Atención'], coping: 'Pausa antes de reaccionar. La sorpresa es neutra, tú decides qué sigue.', }, { name: 'Tristeza', color: '#7882C0', light: '#B4BAE0', desc: 'Respuesta natural ante una pérdida, real o simbólica. Es una emoción sana que necesita espacio y tiempo.', sub: ['Melancolía', 'Pena', 'Duelo'], tags: ['Pérdida', 'Duelo', 'Reflexión'], coping: 'No huyas de ella. Permite que fluya. Pide acompañamiento si la necesitas.', }, { name: 'Asco', color: '#9B78B8', light: '#CABFDE', desc: 'El asco protege de amenazas físicas o morales. En contextos sociales, puede estar relacionado con valores o traumas.', sub: ['Hastío', 'Rechazo', 'Repulsión'], tags: ['Valores', 'Límites', 'Protección'], coping: 'Observa qué valor está siendo violado. El asco a menudo protege algo importante.', }, { name: 'Ira', color: '#C07878', light: '#DEB4B4', desc: 'La ira señala una injusticia o una necesidad no cubierta. No es mala en sí; su gestión es lo que importa.', sub: ['Irritación', 'Enfado', 'Rabia'], tags: ['Injusticia', 'Límites', 'Energía'], coping: 'Baja la activación primero. Luego identifica la necesidad detrás.', }, { name: 'Anticipación', color: '#C4956A', light: '#E0C4A0', desc: 'Orientación hacia el futuro. Puede ser motivadora o convertirse en ansiedad anticipatoria cuando se vuelve excesiva.', sub: ['Interés', 'Expectativa', 'Vigilancia'], tags: ['Futuro', 'Motivación', 'Planes'], coping: 'Distingue anticipar de preocuparte. Enfócate en lo que puedes hacer hoy.', }, ]; const EmotionWheel = () => { const [selected, setSelected] = useState(null); const cx = 170, cy = 170, r1 = 60, r2 = 120, r3 = 155; const each = 360 / 8; return (
{/* Center circle */} ¿Qué sientes? {EMOTIONS.map((em, i) => { const s = i * each, e = s + each; const isSel = selected === i; const [lx, ly] = labelPos(cx, cy, (r1 + r2) / 2, s, e); const [lx2, ly2] = labelPos(cx, cy, r2 + 18, s, e); return ( setSelected(isSel ? null : i)} style={{ cursor:'pointer' }}> {/* Main sector */} {/* Outer dot */} {/* Label inside sector */} {em.name} ); })}

Toca un sector para explorar la emoción

{/* Info panel */}
{selected === null ? (

Explora tus emociones

Cada sector representa una emoción primaria según el modelo de Robert Plutchik. Toca cualquiera para ver qué significa, qué la activa y cómo gestionarla.

"Nombrar una emoción reduce su intensidad en el cerebro. No es magia, es neurociencia."

) : (() => { const em = EMOTIONS[selected]; return (
{em.name}

{em.desc}

Intensidades
{em.sub.map(s => ( {s} ))}
Aparece cuando...
{em.tags.map(t => ( {t} ))}
Qué puedes hacer

{em.coping}

); })()}
); }; /* ── 2. CICLO DE LA ANSIEDAD ──────────────────────── */ const CYCLE_NODES = [ { id:'trigger', label:'Detonante', angle:270, color:'#C07878', desc:'Una situación real o imaginada activa el sistema de alarma. Puede ser un pensamiento, una imagen, un recuerdo o algo externo.' }, { id:'thoughts', label:'Pensamientos automáticos', angle:342, color:'#C4956A', desc:'El cerebro genera interpretaciones rápidas: "No puedo con esto", "Va a salir mal". Estos pensamientos son automáticos, no elegidos.' }, { id:'body', label:'Activación física', angle:54, color:'#7496B8', desc:'El cuerpo responde: corazón acelerado, tensión muscular, dificultad respiratoria, sudor. Es el modo lucha-huida activado.' }, { id:'avoidance', label:'Conducta de evitación', angle:126, color:'#9B78B8', desc:'Para aliviar el malestar, evitamos la situación. Esto funciona a corto plazo pero enseña al cerebro que el peligro era real.' }, { id:'relief', label:'Alivio temporal', angle:198, color:'#7BAE9F', desc:'La evitación reduce la ansiedad momentáneamente. El problema es que refuerza el ciclo y la ansiedad regresa más intensa.' }, ]; const AnxietyCycle = () => { const [selected, setSelected] = useState(null); const [mode, setMode] = useState('cycle'); // 'cycle' | 'break' const cx = 160, cy = 160, r = 110; const breakPoints = { thoughts: 'Cuestiona el pensamiento: ¿qué evidencias tengo? ¿Es catastrófico?', body: 'Respira diafragmáticamente. 4s inhala, 7s aguanta, 8s exhala.', avoidance: 'Exposición gradual: acércate poco a poco a lo que evitas.', }; return (
{/* Mode toggle */}
{[['cycle','El ciclo'],['break','Cómo romperlo']].map(([m,l]) => ( ))}
{/* Circular arrow path hint */} {CYCLE_NODES.map((node, i) => { const rad = (node.angle - 90) * Math.PI / 180; const nx = cx + r * Math.cos(rad); const ny = cy + r * Math.sin(rad); // Arrow to next node const next = CYCLE_NODES[(i + 1) % CYCLE_NODES.length]; const nrad = (next.angle - 90) * Math.PI / 180; const nnx = cx + r * Math.cos(nrad); const nny = cy + r * Math.sin(nrad); const midAngle = (node.angle + next.angle) / 2; const mrad = (midAngle - 90) * Math.PI / 180; const mx = cx + (r + 0) * Math.cos(mrad); const my = cy + (r + 0) * Math.sin(mrad); const isSel = selected === node.id; const isBreakable = mode === 'break' && breakPoints[node.id]; return ( {/* Arrow */} {/* Node */} setSelected(isSel ? null : node.id)} /> {/* Break indicator */} {isBreakable && ( )} setSelected(isSel ? null : node.id)} > {node.label.split(' ').map((w, wi) => ( 1 ? -6 : 0) : 12}>{w} ))} ); })} {/* Center label */} Ciclo de la ansiedad

Toca cada nodo para entenderlo

{/* Info panel */}
{!selected ? (

{mode === 'cycle' ? 'Cómo funciona la ansiedad' : 'Los puntos de ruptura'}

{mode === 'cycle' ? 'La ansiedad no aparece de la nada. Sigue un ciclo predecible que se retroalimenta. Entenderlo es el primer paso para manejarlo.' : 'Puedes interrumpir el ciclo en varios puntos. Los nodos marcados tienen una intervención específica. Toca uno para ver cómo.'}

{mode === 'break' && (

La clave: no tienes que romper el ciclo entero. Con interrumpirlo en un punto es suficiente.

)}
) : (() => { const node = CYCLE_NODES.find(n => n.id === selected); return (
{node.label}

{node.desc}

{mode === 'break' && breakPoints[node.id] && (
Intervención

{breakPoints[node.id]}

)}
); })()}
); }; /* ── 3. MAPA DE ESTILOS DE APEGO ──────────────────── */ const ATTACHMENT = [ { id:'secure', label:'Seguro', pos:[0,0], color:'#7BAE9F', bg:'rgba(123,174,159,0.12)', desc:'Comodidad con la intimidad y la autonomía. Confianza en los demás y en uno mismo. No teme el abandono ni la dependencia.', traits:['Confía sin idealizar','Comunica sus necesidades','Tolera la separación','Relaciones estables'], path:'Base habitual en infancias con cuidadores consistentes y atentos.', }, { id:'anxious', label:'Ansioso / Preocupado', pos:[0,1], color:'#C4956A', bg:'rgba(196,149,106,0.1)', desc:'Alta necesidad de cercanía y miedo intenso al abandono. Tendencia a la hipervigilancia emocional en las relaciones.', traits:['Miedo al abandono','Busca validación constante','Celos e hipervigilancia','Dificultad con la soledad'], path:'Suele desarrollarse con cuidadores inconsistentes (a veces presentes, a veces ausentes).', }, { id:'avoidant', label:'Evitativo / Alejado', pos:[1,0], color:'#7496B8', bg:'rgba(116,150,184,0.1)', desc:'Incomodidad con la intimidad. Valora la independencia extrema. Tiende a suprimir las emociones y desconectarse afectivamente.', traits:['Evita la intimidad','Autosuficiencia extrema','Supresión emocional','Distancia en conflictos'], path:'Frecuente con cuidadores fríos, desdeñosos o que no validaban emociones.', }, { id:'disorganized', label:'Desorganizado / Temeroso', pos:[1,1], color:'#9B78B8', bg:'rgba(155,120,184,0.1)', desc:'Conflicto entre el deseo de cercanía y el miedo a ella. Comportamiento impredecible. A menudo relacionado con experiencias de trauma.', traits:['Desea y teme intimidad','Relaciones caóticas','Dificultad para regular emociones','Desconfianza profunda'], path:'Asociado a cuidadores que eran fuente de tanto miedo como consuelo.', }, ]; const AttachmentMap = () => { const [selected, setSelected] = useState(null); const sel = selected ? ATTACHMENT.find(a => a.id === selected) : null; return (
{/* Axes labels */}
{/* Axis labels */}
Ansiedad alta
Ansiedad baja
Evitación baja
Evitación alta
{/* Grid */}
{/* Top-left: Ansioso (high anxiety, low avoidance) */} {/* Top-right: Desorganizado (high anxiety, high avoidance) */} {/* Bottom-left: Seguro (low anxiety, low avoidance) */} {/* Bottom-right: Evitativo (low anxiety, high avoidance) */} {[ ATTACHMENT[1], // Ansioso (top-left) ATTACHMENT[3], // Desorganizado (top-right) ATTACHMENT[0], // Seguro (bottom-left) ATTACHMENT[2], // Evitativo (bottom-right) ].map((att) => { const isSel = selected === att.id; return (
setSelected(isSel ? null : att.id)} style={{ background: isSel ? att.color : att.bg, border: `2px solid ${isSel ? att.color : 'transparent'}`, borderRadius:10, display:'flex', alignItems:'center', justifyContent:'center', cursor:'pointer', transition:'all 0.25s ease', transform: isSel ? 'scale(1.02)' : 'scale(1)', padding:12, boxShadow: isSel ? `0 4px 20px ${att.color}44` : 'none', }} > {att.label}
); })}
{/* Center crosshair */}

Toca un cuadrante para explorar el estilo

{/* Info panel */}
{!sel ? (

Los 4 estilos de apego

La teoría del apego de Bowlby explica cómo las experiencias tempranas moldean la forma en que nos relacionamos de adultos.

Ningún estilo es una condena. El apego puede evolucionar con trabajo personal y relaciones reparadoras.

) : (
{sel.label}

{sel.desc}

Características
    {sel.traits.map(t => (
  • {t}
  • ))}
Origen frecuente

{sel.path}

)}
); }; Object.assign(window, { EmotionWheel, AnxietyCycle, AttachmentMap });