poll-sort.js 838 B

123456789101112131415161718192021222324252627282930313233343536
  1. import * as d3 from 'd3';
  2. export default () => {
  3. // defaults
  4. const options = {
  5. width: 475,
  6. height: 500,
  7. radius: 10
  8. };
  9. // start
  10. const poll = selection => {
  11. const xScale = d3.scaleLinear().domain([ 0, 100 ]).range([ 0, options.width ]);
  12. const minWidth = options.radius;
  13. const maxWidth = options.width - options.radius;
  14. const circles = selection.selectAll('circle');
  15. circles.transition()
  16. .duration(2000)
  17. .delay((d, i) => (i * 2))
  18. .attr('cx', d => (d.x = Math.max(minWidth, Math.min(maxWidth, xScale(d.cumul - Math.random() * d.score)))))
  19. .on('end', (d, i) => {
  20. if (circles.size() === i + 1) options.setData({ continue: true });
  21. });
  22. };
  23. // "setter"
  24. poll.options = input => {
  25. Object.assign(options, input);
  26. return poll;
  27. };
  28. return poll;
  29. };