Jmx0OyFET0NUWVBFIGh0bWwmZ3Q7CiZsdDtodG1sIGxhbmc9JnF1b3Q7ZXMmcXVvdDsmZ3Q7CiZsdDtoZWFkJmd0OwombHQ7bWV0YSBjaGFyc2V0PSZxdW90O1VURi04JnF1b3Q7Jmd0OwombHQ7bWV0YSBuYW1lPSZxdW90O3ZpZXdwb3J0JnF1b3Q7IGNvbnRlbnQ9JnF1b3Q7d2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCZxdW90OyZndDsKJmx0O3RpdGxlJmd0O01hcGEgQ29uY2VwdHVhbCAmbWRhc2g7IERvY3RyaW5hIGRlbCBQZWNhZG8mbHQ7L3RpdGxlJmd0OwombHQ7c3R5bGUmZ3Q7CiAgYm9keSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwOwogICAgY29sb3I6ICNmZmY7CiAgICBmb250LWZhbWlseTogJ1NlZ29lIFVJJywgc2Fucy1zZXJpZjsKICAgIG1hcmdpbjogMDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgfQogIGgxIHsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIG1hcmdpbi10b3A6IDIwcHg7CiAgICBmb250LXNpemU6IDJlbTsKICAgIGNvbG9yOiAjZmZmOwogIH0KICAjbWluZG1hcCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgaGVpZ2h0OiA4MHZoOwogIH0KICAubm9kZSB7CiAgICBvcGFjaXR5OiAwOwogICAgdHJhbnNpdGlvbjogb3BhY2l0eSAxcyBlYXNlLWluOwogIH0KICBmb290ZXIgewogICAgcG9zaXRpb246IGZpeGVkOwogICAgcmlnaHQ6IDE1cHg7CiAgICBib3R0b206IDEwcHg7CiAgICBmb250LXNpemU6IDAuOWVtOwogICAgY29sb3I6ICNhYWE7CiAgfQogIGJ1dHRvbiB7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICBsZWZ0OiAxNXB4OwogICAgYm90dG9tOiAxMHB4OwogICAgYmFja2dyb3VuZDogIzQ0NDsKICAgIGNvbG9yOiAjZmZmOwogICAgYm9yZGVyOiBub25lOwogICAgcGFkZGluZzogOHB4IDEycHg7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgfQogIGJ1dHRvbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiAjNjY2OwogIH0KJmx0Oy9zdHlsZSZndDsKJmx0Oy9oZWFkJmd0OwombHQ7Ym9keSZndDsKJmx0O2gxJmd0O01hcGEgQ29uY2VwdHVhbCAmbWRhc2g7IERvY3RyaW5hIGRlbCBQZWNhZG8mbHQ7L2gxJmd0OwombHQ7ZGl2IGlkPSZxdW90O21pbmRtYXAmcXVvdDsmZ3Q7Jmx0Oy9kaXYmZ3Q7CiZsdDtmb290ZXImZ3Q7RWxhYm9yYWRvIHBvciBDQVZBTCZsdDsvZm9vdGVyJmd0OwombHQ7YnV0dG9uIG9uY2xpY2s9JnF1b3Q7cmVzdGFydEFuaW1hdGlvbigpJnF1b3Q7Jmd0O1JlaW5pY2lhciBBbmltYWNpJm9hY3V0ZTtuJmx0Oy9idXR0b24mZ3Q7CgombHQ7YXVkaW8gaWQ9JnF1b3Q7bXVzaWMmcXVvdDsgYXV0b3BsYXkgbG9vcCB2b2x1bWU9JnF1b3Q7MC4xJnF1b3Q7Jmd0OwogICZsdDtzb3VyY2Ugc3JjPSZxdW90O2h0dHBzOi8vYy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4ueS5jb20vYXVkaW8vMjAyMi8wMy8xNS9hdWRpb19iZGIyNmU2ODkyLm1wMyZxdW90OyB0eXBlPSZxdW90O2F1ZGlvL21wZWcmcXVvdDsmZ3Q7CiZsdDsvYXVkaW8mZ3Q7CgombHQ7c2NyaXB0IHNyYz0mcXVvdDtodHRwczovL2MuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLnIubmV0L25wbS9kM0A3JnF1b3Q7Jmd0OyZsdDsvc2NyaXB0Jmd0OwombHQ7c2NyaXB0Jmd0Owpjb25zdCBkYXRhID0gewogIG5hbWU6ICZxdW90O0RvY3RyaW5hIGRlbCBQZWNhZG8mcXVvdDssCiAgY2hpbGRyZW46IFsKICAgIHsKICAgICAgbmFtZTogJnF1b3Q7TmF0dXJhbGV6YSBkZWwgUGVjYWRvJnF1b3Q7LAogICAgICBjaGlsZHJlbjogWwogICAgICAgIHsgbmFtZTogJnF1b3Q7T2ZlbnNhIGNvbnRyYSBEaW9zJnF1b3Q7IH0sCiAgICAgICAgeyBuYW1lOiAmcXVvdDtSb21wZSBsYSBjb211bmkmb2FjdXRlO24gY29uICZFYWN1dGU7bCZxdW90OyB9LAogICAgICAgIHsgbmFtZTogJnF1b3Q7UHJvdmllbmUgZGUgbGEgbGliZXJ0YWQgbWFsIHVzYWRhJnF1b3Q7IH0KICAgICAgXQogICAgfSwKICAgIHsKICAgICAgbmFtZTogJnF1b3Q7Q29uc2VjdWVuY2lhcyBkZWwgUGVjYWRvJnF1b3Q7LAogICAgICBjaGlsZHJlbjogWwogICAgICAgIHsgbmFtZTogJnF1b3Q7U2VwYXJhY2kmb2FjdXRlO24gZXNwaXJpdHVhbCZxdW90OyB9LAogICAgICAgIHsgbmFtZTogJnF1b3Q7RGVzb3JkZW4gbW9yYWwgeSBzb2NpYWwmcXVvdDsgfSwKICAgICAgICB7IG5hbWU6ICZxdW90O05lY2VzaWRhZCBkZSByZWRlbmNpJm9hY3V0ZTtuJnF1b3Q7IH0KICAgICAgXQogICAgfSwKICAgIHsKICAgICAgbmFtZTogJnF1b3Q7VGlwb3MgZGUgUGVjYWRvJnF1b3Q7LAogICAgICBjaGlsZHJlbjogWwogICAgICAgIHsKICAgICAgICAgIG5hbWU6ICZxdW90O09yaWdpbmFsJnF1b3Q7LAogICAgICAgICAgY2hpbGRyZW46IFsKICAgICAgICAgICAgeyBuYW1lOiAmcXVvdDtUcmFuc21pdGlkbyBkZXNkZSBBZCZhYWN1dGU7biZxdW90OyB9LAogICAgICAgICAgICB7IG5hbWU6ICZxdW90O0hlcmlkYSBlbiBsYSBuYXR1cmFsZXphIGh1bWFuYSZxdW90OyB9CiAgICAgICAgICBdCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICBuYW1lOiAmcXVvdDtQZXJzb25hbCZxdW90OywKICAgICAgICAgIGNoaWxkcmVuOiBbCiAgICAgICAgICAgIHsgbmFtZTogJnF1b3Q7QWN0b3MgbGlicmVzIHkgY29uc2NpZW50ZXMmcXVvdDsgfSwKICAgICAgICAgICAgeyBuYW1lOiAmcXVvdDtQdWVkZSBzZXIgbW9ydGFsIG8gdmVuaWFsJnF1b3Q7IH0KICAgICAgICAgIF0KICAgICAgICB9CiAgICAgIF0KICAgIH0sCiAgICB7CiAgICAgIG5hbWU6ICZxdW90O1N1cGVyYWNpJm9hY3V0ZTtuIGRlbCBQZWNhZG8mcXVvdDssCiAgICAgIGNoaWxkcmVuOiBbCiAgICAgICAgeyBuYW1lOiAmcXVvdDtBcnJlcGVudGltaWVudG8gc2luY2VybyZxdW90OyB9LAogICAgICAgIHsgbmFtZTogJnF1b3Q7Q29uZmVzaSZvYWN1dGU7biB5IHBlcmQmb2FjdXRlO24gZGl2aW5vJnF1b3Q7IH0sCiAgICAgICAgeyBuYW1lOiAmcXVvdDtWaWRhIGRlIGdyYWNpYSB5IGNvbnZlcnNpJm9hY3V0ZTtuIGNvbnRpbnVhJnF1b3Q7IH0KICAgICAgXQogICAgfQogIF0KfTsKCmNvbnN0IHdpZHRoID0gd2luZG93LmlubmVyV2lkdGg7CmNvbnN0IGhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodCAtIDEwMDsKCmNvbnN0IHN2ZyA9IGQzLnNlbGVjdCgmcXVvdDsjbWluZG1hcCZxdW90OykKICAuYXBwZW5kKCZxdW90O3N2ZyZxdW90OykKICAuYXR0cigmcXVvdDt3aWR0aCZxdW90Oywgd2lkdGgpCiAgLmF0dHIoJnF1b3Q7aGVpZ2h0JnF1b3Q7LCBoZWlnaHQpOwoKY29uc3QgZyA9IHN2Zy5hcHBlbmQoJnF1b3Q7ZyZxdW90OykuYXR0cigmcXVvdDt0cmFuc2Zvcm0mcXVvdDssICZxdW90O3RyYW5zbGF0ZSgmcXVvdDsgKyB3aWR0aC8yICsgJnF1b3Q7LCZxdW90OyArIGhlaWdodC8yICsgJnF1b3Q7KSZxdW90Oyk7Cgpjb25zdCB0cmVlID0gZDMudHJlZSgpLnNpemUoWzIgKiBNYXRoLlBJLCAzMDBdKTsKY29uc3Qgcm9vdCA9IGQzLmhpZXJhcmNoeShkYXRhKTsKdHJlZShyb290KTsKCmNvbnN0IGNvbG9yID0gZDMuc2NhbGVPcmRpbmFsKGQzLnNjaGVtZUNhdGVnb3J5MTApOwoKY29uc3QgbGluayA9IGcuYXBwZW5kKCZxdW90O2cmcXVvdDspCiAgLnNlbGVjdEFsbCgmcXVvdDtwYXRoJnF1b3Q7KQogIC5kYXRhKHJvb3QubGlua3MoKSkKICAuam9pbigmcXVvdDtwYXRoJnF1b3Q7KQogIC5hdHRyKCZxdW90O2ZpbGwmcXVvdDssICZxdW90O25vbmUmcXVvdDspCiAgLmF0dHIoJnF1b3Q7c3Ryb2tlJnF1b3Q7LCAmcXVvdDsjODg4JnF1b3Q7KQogIC5hdHRyKCZxdW90O3N0cm9rZS13aWR0aCZxdW90OywgMS41KQogIC5hdHRyKCZxdW90O2QmcXVvdDssIGQzLmxpbmtSYWRpYWwoKQogICAgLmFuZ2xlKGQgPSZndDsgZC54KQogICAgLnJhZGl1cyhkID0mZ3Q7IGQueSkKICApOwoKY29uc3Qgbm9kZSA9IGcuYXBwZW5kKCZxdW90O2cmcXVvdDspCiAgLnNlbGVjdEFsbCgmcXVvdDtjaXJjbGUmcXVvdDspCiAgLmRhdGEocm9vdC5kZXNjZW5kYW50cygpKQogIC5qb2luKCZxdW90O2NpcmNsZSZxdW90OykKICAuYXR0cigmcXVvdDtjbGFzcyZxdW90OywgJnF1b3Q7bm9kZSZxdW90OykKICAuYXR0cigmcXVvdDt0cmFuc2Zvcm0mcXVvdDssIGQgPSZndDsgYAogICAgcm90YXRlKCR7ZC54ICogMTgwIC8gTWF0aC5QSSAtIDkwfSkKICAgIHRyYW5zbGF0ZSgke2QueX0sMCkKICBgKQogIC5hdHRyKCZxdW90O3ImcXVvdDssIDUpCiAgLmF0dHIoJnF1b3Q7ZmlsbCZxdW90OywgZCA9Jmd0OyBjb2xvcihkLmRlcHRoKSk7Cgpjb25zdCB0ZXh0ID0gZy5hcHBlbmQoJnF1b3Q7ZyZxdW90OykKICAuc2VsZWN0QWxsKCZxdW90O3RleHQmcXVvdDspCiAgLmRhdGEocm9vdC5kZXNjZW5kYW50cygpKQogIC5qb2luKCZxdW90O3RleHQmcXVvdDspCiAgLmF0dHIoJnF1b3Q7Y2xhc3MmcXVvdDssICZxdW90O25vZGUmcXVvdDspCiAgLmF0dHIoJnF1b3Q7dHJhbnNmb3JtJnF1b3Q7LCBkID0mZ3Q7IGAKICAgIHJvdGF0ZSgke2QueCAqIDE4MCAvIE1hdGguUEkgLSA5MH0pCiAgICB0cmFuc2xhdGUoJHtkLnl9LDApCiAgICByb3RhdGUoJHtkLnggJmd0Oz0gTWF0aC5QSSA/IDE4MCA6IDB9KQogIGApCiAgLmF0dHIoJnF1b3Q7ZHkmcXVvdDssICZxdW90OzAuMzFlbSZxdW90OykKICAuYXR0cigmcXVvdDt4JnF1b3Q7LCBkID0mZ3Q7IGQueCAmbHQ7IE1hdGguUEkgPT09ICFkLmNoaWxkcmVuID8gOCA6IC04KQogIC5hdHRyKCZxdW90O3RleHQtYW5jaG9yJnF1b3Q7LCBkID0mZ3Q7IGQueCAmbHQ7IE1hdGguUEkgPT09ICFkLmNoaWxkcmVuID8gJnF1b3Q7c3RhcnQmcXVvdDsgOiAmcXVvdDtlbmQmcXVvdDspCiAgLmF0dHIoJnF1b3Q7ZmlsbCZxdW90OywgJnF1b3Q7I2ZmZiZxdW90OykKICAudGV4dChkID0mZ3Q7IGQuZGF0YS5uYW1lKTsKCmxldCBkZWxheSA9IDA7CmQzLnNlbGVjdEFsbCgmcXVvdDsubm9kZSZxdW90OykKICAudHJhbnNpdGlvbigpCiAgLmRlbGF5KChkLGkpID0mZ3Q7IGkgKiAzMDApCiAgLmR1cmF0aW9uKDEwMDApCiAgLnN0eWxlKCZxdW90O29wYWNpdHkmcXVvdDssIDEpOwoKZnVuY3Rpb24gcmVzdGFydEFuaW1hdGlvbigpIHsKICBkMy5zZWxlY3RBbGwoJnF1b3Q7Lm5vZGUmcXVvdDspLnN0eWxlKCZxdW90O29wYWNpdHkmcXVvdDssIDApOwogIGQzLnNlbGVjdEFsbCgmcXVvdDsubm9kZSZxdW90OykKICAgIC50cmFuc2l0aW9uKCkKICAgIC5kZWxheSgoZCxpKSA9Jmd0OyBpICogMzAwKQogICAgLmR1cmF0aW9uKDEwMDApCiAgICAuc3R5bGUoJnF1b3Q7b3BhY2l0eSZxdW90OywgMSk7Cn0KJmx0Oy9zY3JpcHQmZ3Q7CiZsdDsvYm9keSZndDsKJmx0Oy9odG1sJmd0Ow==
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Mapa Conceptual — Doctrina del Pecado</title>
<style>
body {
background-color: #000;
color: #fff;
font-family: 'Segoe UI', sans-serif;
margin: 0;
overflow: hidden;
}
h1 {
text-align: center;
margin-top: 20px;
font-size: 2em;
color: #fff;
}
#mindmap {
display: flex;
justify-content: center;
align-items: center;
height: 80vh;
}
.node {
opacity: 0;
transition: opacity 1s ease-in;
}
footer {
position: fixed;
right: 15px;
bottom: 10px;
font-size: 0.9em;
color: #aaa;
}
button {
position: fixed;
left: 15px;
bottom: 10px;
background: #444;
color: #fff;
border: none;
padding: 8px 12px;
border-radius: 6px;
cursor: pointer;
}
button:hover {
background: #666;
}
</style>
</head>
<body>
<h1>Mapa Conceptual — Doctrina del Pecado</h1>
<div id="mindmap"></div>
<footer>Elaborado por CAVAL</footer>
<button onclick="restartAnimation()">Reiniciar Animación</button>
<audio id="music" autoplay loop volume="0.1">
<source src="https://c...content-available-to-author-only...y.com/audio/2022/03/15/audio_bdb26e6892.mp3" type="audio/mpeg">
</audio>
<script src="https://c...content-available-to-author-only...r.net/npm/d3@7"></script>
<script>
const data = {
name: "Doctrina del Pecado",
children: [
{
name: "Naturaleza del Pecado",
children: [
{ name: "Ofensa contra Dios" },
{ name: "Rompe la comunión con Él" },
{ name: "Proviene de la libertad mal usada" }
]
},
{
name: "Consecuencias del Pecado",
children: [
{ name: "Separación espiritual" },
{ name: "Desorden moral y social" },
{ name: "Necesidad de redención" }
]
},
{
name: "Tipos de Pecado",
children: [
{
name: "Original",
children: [
{ name: "Transmitido desde Adán" },
{ name: "Herida en la naturaleza humana" }
]
},
{
name: "Personal",
children: [
{ name: "Actos libres y conscientes" },
{ name: "Puede ser mortal o venial" }
]
}
]
},
{
name: "Superación del Pecado",
children: [
{ name: "Arrepentimiento sincero" },
{ name: "Confesión y perdón divino" },
{ name: "Vida de gracia y conversión continua" }
]
}
]
};
const width = window.innerWidth;
const height = window.innerHeight - 100;
const svg = d3.select("#mindmap")
.append("svg")
.attr("width", width)
.attr("height", height);
const g = svg.append("g").attr("transform", "translate(" + width/2 + "," + height/2 + ")");
const tree = d3.tree().size([2 * Math.PI, 300]);
const root = d3.hierarchy(data);
tree(root);
const color = d3.scaleOrdinal(d3.schemeCategory10);
const link = g.append("g")
.selectAll("path")
.data(root.links())
.join("path")
.attr("fill", "none")
.attr("stroke", "#888")
.attr("stroke-width", 1.5)
.attr("d", d3.linkRadial()
.angle(d => d.x)
.radius(d => d.y)
);
const node = g.append("g")
.selectAll("circle")
.data(root.descendants())
.join("circle")
.attr("class", "node")
.attr("transform", d => `
rotate(${d.x * 180 / Math.PI - 90})
translate(${d.y},0)
`)
.attr("r", 5)
.attr("fill", d => color(d.depth));
const text = g.append("g")
.selectAll("text")
.data(root.descendants())
.join("text")
.attr("class", "node")
.attr("transform", d => `
rotate(${d.x * 180 / Math.PI - 90})
translate(${d.y},0)
rotate(${d.x >= Math.PI ? 180 : 0})
`)
.attr("dy", "0.31em")
.attr("x", d => d.x < Math.PI === !d.children ? 8 : -8)
.attr("text-anchor", d => d.x < Math.PI === !d.children ? "start" : "end")
.attr("fill", "#fff")
.text(d => d.data.name);
let delay = 0;
d3.selectAll(".node")
.transition()
.delay((d,i) => i * 300)
.duration(1000)
.style("opacity", 1);
function restartAnimation() {
d3.selectAll(".node").style("opacity", 0);
d3.selectAll(".node")
.transition()
.delay((d,i) => i * 300)
.duration(1000)
.style("opacity", 1);
}
</script>
</body>
</html>