// Nothing here is in the catalog. `shapeFrom` and `strokeFrom` take an outline of
// your own and pack it with the same engine the 39 built-in shapes use, so a logo,
// a product silhouette or a national symbol needs no release from us.

// A paw print: one pad and four toes, drawn as five subpaths in a 0-100 box.
// Every subpath is wound the same way, so they union into one shape. Wind one the
// other way (flip an arc's sweep flag) and it would cut a hole instead.
var PAW =
  'M 26 71 A 24 21 0 1 1 74 71 A 24 21 0 1 1 26 71 Z ' +
  'M 10 48 A 9.5 12 -35 1 1 27 36 A 9.5 12 -35 1 1 10 48 Z ' +
  'M 29 33 A 10 12.5 -12 1 1 48 29 A 10 12.5 -12 1 1 29 33 Z ' +
  'M 52 29 A 10 12.5 12 1 1 71 33 A 10 12.5 12 1 1 52 29 Z ' +
  'M 73 36 A 9.5 12 35 1 1 90 48 A 9.5 12 35 1 1 73 36 Z'

var paw = ApexUnitShapes.shapeFrom(PAW, {
  name: 'paw',
  // The count below which the toes stop reading as toes. Ask for fewer and the
  // chart says so in the console rather than drawing mush.
  minUnits: 180,
})

// A ridge line: for a thing with no interior, give a CENTRELINE and a width
// instead of drawing both sides of it by hand. `order: 'cols'` makes the season
// bands run along the walk rather than slicing it.
var ridge = ApexUnitShapes.strokeFrom(
  'M 6 76 L 24 44 L 40 60 L 58 22 L 74 46 L 94 30',
  {
    name: 'ridge',
    width: 12,
    order: 'cols',
  },
)

// No outline at all, and no import either: `positions` is just a function of the
// marks and the plot rectangle, so a rule that computes places is a shape too.
// This is the sunflower spiral - each mark one golden angle round from the last,
// its distance from the centre following the square root of its index so the
// density stays even.
function sunflower(objects, rect) {
  var cx = rect.x + rect.width / 2
  var cy = rect.y + rect.height / 2
  var span = Math.min(rect.width, rect.height) / 2 - 6
  var golden = Math.PI * (3 - Math.sqrt(5))
  return objects.map(function (o, i) {
    var t = Math.sqrt((i + 0.5) / objects.length)
    var angle = i * golden
    return {
      id: o.id,
      x: cx + Math.cos(angle) * span * t,
      y: cy + Math.sin(angle) * span * t,
    }
  })
}

var options = {
  series: [1840, 1260, 220, 140],
  chart: {
    type: 'unit',
    height: 430,
    animations: {
      enabled: true,
      speed: 900,
    },
  },
  labels: ['Dogs', 'Cats', 'Rabbits', 'Others'],
  colors: ['#008FFB', '#00A96E', '#C98A00', '#E8264F'],
  plotOptions: {
    unit: {
      layout: 'custom',
      // Defined in the head script from path data, not imported from the catalog.
      positions: paw,
      transition: 'flow',
      unitValue: 5,
      clusterLabels: {
        show: false,
      },
    },
  },
  legend: {
    position: 'bottom',
  },
}

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

var options1 = {
  series: [4200, 6800, 3100, 900],
  chart: {
    type: 'unit',
    height: 380,
    animations: {
      enabled: true,
      speed: 900,
    },
  },
  labels: ['Spring', 'Summer', 'Autumn', 'Winter'],
  colors: ['#00A96E', '#7CB342', '#C98A00', '#0EB8C4'],
  plotOptions: {
    unit: {
      layout: 'custom',
      // A centreline plus a width, also from the head script.
      positions: ridge,
      transition: 'flow',
      unitValue: 24,
      clusterLabels: {
        show: false,
      },
    },
  },
  legend: {
    position: 'bottom',
  },
}

var chart1 = new ApexCharts(document.querySelector('#chart2'), options1)
chart1.render()

var options2 = {
  series: [520, 300, 120, 60],
  chart: {
    type: 'unit',
    height: 430,
    animations: {
      enabled: true,
      speed: 900,
    },
  },
  labels: ['Weekend', 'Day pass', 'Camping', 'Crew'],
  colors: ['#008FFB', '#00A96E', '#C98A00', '#E8264F'],
  plotOptions: {
    unit: {
      layout: 'custom',
      // A function, not a shape object: this chart imports nothing from the kit.
      positions: sunflower,
      transition: 'flow',
      clusterLabels: {
        show: false,
      },
    },
  },
  legend: {
    position: 'bottom',
  },
}

var chart2 = new ApexCharts(document.querySelector('#chart3'), options2)
chart2.render()
Bring Your Own Shape - JavaScript Unit Charts | ApexCharts.js | ApexCharts.js