// Each dot is one seat. Parties sit left to right as contiguous wedges of the
// hemicycle; the same 315 seats recolour in place as the result changes, so you
// watch the majority form. Shared by the vanilla-js, React and Vue builds.
var PARTIES = [
  'Progressives',
  'Conservatives',
  'Greens',
  'Liberals',
  'Centre',
  'Independents',
]
var MAJORITY = 158 // of 315 seats

var RESULTS = {
  2019: [82, 78, 45, 40, 38, 32], // fragmented: no single majority
  2023: [60, 162, 30, 28, 20, 15], // the Conservatives sweep to a majority
}

// Leading party + whether anyone cleared the majority line, for the readout.
function readoutFor(year) {
  var seats = RESULTS[year]
  var topIdx = 0
  for (var i = 1; i < seats.length; i++) {
    if (seats[i] > seats[topIdx]) topIdx = i
  }
  var top = seats[topIdx]
  var verdict =
    top >= MAJORITY
      ? '<b>' +
        PARTIES[topIdx] +
        '</b> hold an outright majority (' +
        top +
        ' of 315).'
      : 'No majority: <b>' +
        PARTIES[topIdx] +
        '</b> lead with ' +
        top +
        ' of 315, short of ' +
        MAJORITY +
        '.'
  return year + ': ' + verdict
}

var options = {
  series: [82, 78, 45, 40, 38, 32],
  chart: {
    id: 'parliament',
    type: 'unit',
    height: 440,
    animations: {
      enabled: true,
      speed: 800,
    },
  },
  labels: [
    'Progressives',
    'Conservatives',
    'Greens',
    'Liberals',
    'Centre',
    'Independents',
  ],
  colors: ['#E3000F', '#1E6FD9', '#3DA35D', '#F0A202', '#17A2B8', '#6C757D'],
  legend: {
    position: 'bottom',
  },
  plotOptions: {
    unit: {
      layout: 'arc',
      arc: {
        innerRadiusRatio: 0.35,
      },
      tooltip: {
        // Party name + its seat total for the hovered seat.
        formatter: function (o) {
          return '<b>' + o.seriesName + '</b><br/>' + o.count + ' seats'
        },
      },
    },
  },
}

var chart = new ApexCharts(document.querySelector('#chart'), options)
chart.render()

// RESULTS, PARTIES and readoutFor live in the shared head script.
var readout = document.querySelector('#readout')
var btn2019 = document.querySelector('#btn2019')
var btn2023 = document.querySelector('#btn2023')

function show(year, btn) {
  btn2019.classList.toggle('active', btn === btn2019)
  btn2023.classList.toggle('active', btn === btn2023)
  readout.innerHTML = readoutFor(year)
  chart.updateSeries(RESULTS[year])
}

btn2019.addEventListener('click', function () {
  show(2019, btn2019)
})
btn2023.addEventListener('click', function () {
  show(2023, btn2023)
})
readout.innerHTML = readoutFor(2019)
Parliament - JavaScript Unit Charts | ApexCharts.js | ApexCharts.js