1 | import d3 from 'd3';
|
2 |
|
3 | export default (schemes, useScheme, changeAssetScheme) => {
|
4 | function _select(n) {
|
5 | palettes.each(function(d, i) {
|
6 | d3.select(this.parentNode)
|
7 | .classed('selected', () => i === n)
|
8 | })
|
9 |
|
10 | palettes
|
11 | .transition()
|
12 | .ease('bounce')
|
13 | .duration(500)
|
14 | .attr('height', (d, i) => i === n ? 0 : 48);
|
15 |
|
16 | [d3.select('body'), d3.select('html')].forEach((el) => {
|
17 | el.transition()
|
18 | .ease('sin-in-out')
|
19 | .duration(600)
|
20 | .style('background', schemes[n].background)
|
21 | })
|
22 | }
|
23 | function _useScheme(n) {
|
24 | _select(n);
|
25 | useScheme(n);
|
26 | changeAssetScheme(n);
|
27 | }
|
28 |
|
29 | const paletteDiv = d3.select('.palette-wrap')
|
30 | .selectAll('.palette')
|
31 | .data(schemes)
|
32 | .enter()
|
33 | .append('div')
|
34 | .classed('scheme-icon', true)
|
35 |
|
36 | paletteDiv.append('span')
|
37 | .classed('scheme-text', true)
|
38 | .text(d => d.name)
|
39 |
|
40 | const palettes = paletteDiv
|
41 | .append('svg')
|
42 | .style('display', 'inline-block')
|
43 | .classed('palette', true)
|
44 | .on('click', (d, i) => _useScheme(i))
|
45 |
|
46 | palettes.append('rect')
|
47 | .attr('width', 23)
|
48 | .attr('height', 48)
|
49 | .style('fill', d => d.background)
|
50 |
|
51 | palettes.selectAll('.color')
|
52 | .data(d => d.all)
|
53 | .enter()
|
54 | .append('rect')
|
55 | .style('fill', d => d)
|
56 | .attr('x', 25)
|
57 | .attr('y', (d, i, j) => 48 * i / schemes[j].all.length - 1)
|
58 | .attr('width', 22)
|
59 | .attr('height', (d, i, j) => 48 / schemes[j].all.length - 1)
|
60 |
|
61 | _select(0)
|
62 | }
|