class EfficiencyChart extends HTMLElement {
connectedCallback() {
const initialEfficiency = parseFloat(this.getAttribute('initial-efficiency')) || 95;
const yearsToShow = parseInt(this.getAttribute('years-to-show')) || 25;
const annualDegradation = parseFloat(this.getAttribute('annual-degradation')) || 0.5;
this.attachShadow({ mode: 'open' });
this.shadowRoot.innerHTML = `
`;
// Generate chart data
const data = Array.from({ length: yearsToShow + 1 }, (_, year) => {
const efficiency = Math.max(
initialEfficiency - year * annualDegradation,
80
);
const warranty = year <= 10 ? 90 : 80;
return {
year: `Ano ${year}`,
efficiency,
warranty,
};
});
// Initialize chart
setTimeout(() => {
const chartContainer = this.shadowRoot.getElementById('chart');
if (chartContainer) {
const chart = new Recharts.AreaChart({
width: chartContainer.clientWidth,
height: 300,
data,
margin: { top: 10, right: 30, left: 0, bottom: 0 },
});
chart.append(new Recharts.CartesianGrid({ strokeDasharray: '3 3', vertical: false }));
chart.append(new Recharts.XAxis({
dataKey: 'year',
tickFormatter: (value) => value.slice(4)
}));
chart.append(new Recharts.YAxis({
domain: [75, 100],
tickFormatter: (value) => `${value}%`
}));
chart.append(new Recharts.Tooltip());
// Warranty area
chart.append(new Recharts.Area({
dataKey: 'warranty',
type: 'natural',
stroke: '#9ca3af',
fill: '#f3f4f6',
strokeWidth: 2
}));
// Efficiency area
chart.append(new Recharts.Area({
dataKey: 'efficiency',
type: 'natural',
stroke: '#3b82f6',
fill: '#93c5fd',
strokeWidth: 2
}));
chartContainer.appendChild(chart);
}
}, 0);
}
}
customElements.define('efficiency-chart', EfficiencyChart);