altitudes = {
const container = html`<div style="
display: flex;
gap: 20px;
align-items: center;
justify-content: center;
width: 100%;
max-width: 900px;
background-color: white;
"></div>`;
const chartContainer = html`<div style="
width: 60%;
min-width: 700px;
"></div>`;
const infoContainer = html`<div style="
width: 30%;
min-width: 250px;
border: 1px solid #ccc;
border-radius: 8px;
background: white;
box-shadow: 2px 2px 10px rgba(0,0,0,0.2);
padding: 10px;
font-family: 'Inter', sans-serif;
"></div>`;
container.append(chartContainer, infoContainer);
const width = 700;
const height = 500;
const margin = { top: 40, right: 30, bottom: 50, left: 60 };
const svg = d3.select(chartContainer).append("svg")
.attr("width", width)
.attr("height", height)
.attr("viewBox", [0, 0, width, height]);
const xScale = d3.scaleBand()
.domain(dataClima.map(d => d.Lugar))
.range([margin.left, width - margin.right - 50])
.padding(0.4);
const yScale = d3.scaleLinear()
.domain([0, d3.max(dataClima, d => d["Altitud (msnm)"])])
.nice()
.range([height - margin.bottom, margin.top]);
svg.append("g")
.attr("transform", `translate(0,${height - margin.bottom})`)
.call(d3.axisBottom(xScale));
svg.append("g")
.attr("transform", `translate(${margin.left},0)`)
.call(d3.axisLeft(yScale));
const selectedPoint = dataClima[0];
let selectedLugar = selectedPoint.Lugar;
const imageElement = d3.select(infoContainer).append("img")
.attr("width", "100%")
.style("object-fit", "contain")
.style("display", "none")
.style("margin-bottom", "5px");
const textElement = d3.select(infoContainer).append("div")
.style("font-size", "14px")
.style("line-height", "1.4");
function updateCard(lugar) {
const selectedData = dataClima.find(d => d.Lugar === lugar);
if (!selectedData) return;
const matchingImages = dataPerros.filter(p => p.lugar === lugar);
const imageUrl = matchingImages.length > 0 ? matchingImages[0].url : null;
const obra = matchingImages.length > 0 ? matchingImages[0].obras : "Sin imagen registrada";
const autor = matchingImages.length > 0 ? matchingImages[0].autor : "";
const fecha = matchingImages.length > 0 ? matchingImages[0].fecha : "";
const fuente = matchingImages.length > 0 ? matchingImages[0].fuente : "";
textElement.html(`
<strong>${selectedData.Lugar}</strong><br>
Altitud: ${selectedData["Altitud (msnm)"]} msnm<br>
Clima: ${selectedData.Clima}<br>
<hr>
<strong>Obra:</strong> ${obra} <br>
<strong>Autor:</strong> ${autor} <br>
<strong>Fecha:</strong> ${fecha} <br>
<strong>Fuente:</strong> ${fuente} <br>
`);
if (imageUrl) {
imageElement.attr("src", imageUrl).style("display", "block");
} else {
imageElement.style("display", "none");
}
}
updateCard(selectedLugar);
svg.selectAll("circle")
.data(dataClima)
.enter()
.append("circle")
.attr("cx", d => xScale(d.Lugar) + xScale.bandwidth() / 2)
.attr("cy", d => yScale(d["Altitud (msnm)"]))
.attr("r", 6)
.attr("fill", d => (d.Lugar === selectedLugar ? "orange" : "steelblue"))
.style("cursor", "pointer")
.on("mouseover", function(event, d) {
d3.select(this).transition().duration(200).attr("r", 8);
})
.on("mouseout", function(event, d) {
d3.select(this).transition().duration(200).attr("r", 6);
})
.on("click", function(event, d) {
console.log(`🟢 Click en: ${d.Lugar}`);
selectedLugar = d.Lugar;
updateCard(selectedLugar);
svg.selectAll("circle")
.attr("fill", p => (p.Lugar === selectedLugar ? "orange" : "steelblue"));
});
return container;
}