class InteractiveChart extends HTMLElement { connectedCallback() { this.attachShadow({ mode: 'open' }); this.shadowRoot.innerHTML = `

Area Chart - Interactive

Showing total visitors for the last 3 months

`; this.initializeChart(); } initializeChart() { const chartData = [ { date: "2024-04-01", desktop: 222, mobile: 150 }, { date: "2024-04-02", desktop: 97, mobile: 180 }, // ... (rest of the data from the React component) { date: "2024-06-30", desktop: 446, mobile: 400 } ]; const timeRangeSelect = this.shadowRoot.getElementById('timeRange'); timeRangeSelect.addEventListener('change', () => { this.updateChart(chartData, timeRangeSelect.value); }); this.updateChart(chartData, '90d'); } updateChart(data, timeRange) { const filteredData = data.filter((item) => { const date = new Date(item.date); const referenceDate = new Date("2024-06-30"); let daysToSubtract = 90; if (timeRange === "30d") { daysToSubtract = 30; } else if (timeRange === "7d") { daysToSubtract = 7; } const startDate = new Date(referenceDate); startDate.setDate(startDate.getDate() - daysToSubtract); return date >= startDate; }); const chartContainer = this.shadowRoot.getElementById('chart'); chartContainer.innerHTML = ''; const chart = new Recharts.AreaChart({ width: chartContainer.clientWidth, height: 300, data: filteredData, 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: 'date', tickFormatter: (value) => { const date = new Date(value); return date.toLocaleDateString('en-US', { month: 'short', day: 'numeric' }); } })); chart.append(new Recharts.YAxis()); chart.append(new Recharts.Tooltip()); // Desktop area chart.append(new Recharts.Area({ dataKey: 'desktop', type: 'natural', stroke: '#3b82f6', fill: '#93c5fd', strokeWidth: 2 })); // Mobile area chart.append(new Recharts.Area({ dataKey: 'mobile', type: 'natural', stroke: '#10b981', fill: '#6ee7b7', strokeWidth: 2 })); chartContainer.appendChild(chart); } } customElements.define('interactive-chart', InteractiveChart);