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 (
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."
);
};
/* ── 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 === '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.
);
};
/* ── 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 (