@semcore/d3-chart 2.0.10 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +113 -0
  3. package/lib/cjs/Area.js +70 -29
  4. package/lib/cjs/Area.js.map +1 -1
  5. package/lib/cjs/Bar.js +6 -4
  6. package/lib/cjs/Bar.js.map +1 -1
  7. package/lib/cjs/Bubble.js +1 -0
  8. package/lib/cjs/Bubble.js.map +1 -1
  9. package/lib/cjs/Donut.js +120 -44
  10. package/lib/cjs/Donut.js.map +1 -1
  11. package/lib/cjs/Dots.js +24 -25
  12. package/lib/cjs/Dots.js.map +1 -1
  13. package/lib/cjs/GroupBar.js +7 -7
  14. package/lib/cjs/GroupBar.js.map +1 -1
  15. package/lib/cjs/Line.js +4 -2
  16. package/lib/cjs/Line.js.map +1 -1
  17. package/lib/cjs/ReferenceLine.js +258 -0
  18. package/lib/cjs/ReferenceLine.js.map +1 -0
  19. package/lib/cjs/ResponsiveContainer.js +1 -1
  20. package/lib/cjs/ResponsiveContainer.js.map +1 -1
  21. package/lib/cjs/ScatterPlot.js +1 -0
  22. package/lib/cjs/ScatterPlot.js.map +1 -1
  23. package/lib/cjs/StackBar.js +6 -6
  24. package/lib/cjs/StackedArea.js +7 -7
  25. package/lib/cjs/Tooltip.js +3 -2
  26. package/lib/cjs/Tooltip.js.map +1 -1
  27. package/lib/cjs/createElement.js +4 -3
  28. package/lib/cjs/createElement.js.map +1 -1
  29. package/lib/cjs/index.js +8 -0
  30. package/lib/cjs/index.js.map +1 -1
  31. package/lib/cjs/style/dot.shadow.css +10 -5
  32. package/lib/cjs/style/reference-line.shadow.css +37 -0
  33. package/lib/cjs/types/Area.d.ts +1 -0
  34. package/lib/cjs/types/Bar.d.ts +4 -0
  35. package/lib/cjs/types/Bubble.d.ts +6 -1
  36. package/lib/cjs/types/Donut.d.ts +4 -0
  37. package/lib/cjs/types/ReferenceLine.d.ts +31 -0
  38. package/lib/cjs/types/Tooltip.d.ts +5 -3
  39. package/lib/cjs/types/index.d.ts +3 -0
  40. package/lib/es6/Area.js +68 -27
  41. package/lib/es6/Area.js.map +1 -1
  42. package/lib/es6/Bar.js +6 -4
  43. package/lib/es6/Bar.js.map +1 -1
  44. package/lib/es6/Bubble.js +1 -0
  45. package/lib/es6/Bubble.js.map +1 -1
  46. package/lib/es6/Donut.js +114 -44
  47. package/lib/es6/Donut.js.map +1 -1
  48. package/lib/es6/Dots.js +24 -23
  49. package/lib/es6/Dots.js.map +1 -1
  50. package/lib/es6/GroupBar.js +7 -7
  51. package/lib/es6/GroupBar.js.map +1 -1
  52. package/lib/es6/Line.js +4 -2
  53. package/lib/es6/Line.js.map +1 -1
  54. package/lib/es6/ReferenceLine.js +244 -0
  55. package/lib/es6/ReferenceLine.js.map +1 -0
  56. package/lib/es6/ResponsiveContainer.js +1 -1
  57. package/lib/es6/ResponsiveContainer.js.map +1 -1
  58. package/lib/es6/ScatterPlot.js +1 -0
  59. package/lib/es6/ScatterPlot.js.map +1 -1
  60. package/lib/es6/StackBar.js +6 -6
  61. package/lib/es6/StackedArea.js +7 -7
  62. package/lib/es6/Tooltip.js +3 -2
  63. package/lib/es6/Tooltip.js.map +1 -1
  64. package/lib/es6/createElement.js +3 -3
  65. package/lib/es6/createElement.js.map +1 -1
  66. package/lib/es6/index.js +1 -0
  67. package/lib/es6/index.js.map +1 -1
  68. package/lib/es6/style/dot.shadow.css +10 -5
  69. package/lib/es6/style/reference-line.shadow.css +37 -0
  70. package/lib/es6/types/Area.d.ts +1 -0
  71. package/lib/es6/types/Bar.d.ts +4 -0
  72. package/lib/es6/types/Bubble.d.ts +6 -1
  73. package/lib/es6/types/Donut.d.ts +4 -0
  74. package/lib/es6/types/ReferenceLine.d.ts +31 -0
  75. package/lib/es6/types/Tooltip.d.ts +5 -3
  76. package/lib/es6/types/index.d.ts +3 -0
  77. package/lib/types/Area.d.ts +1 -0
  78. package/lib/types/Bar.d.ts +4 -0
  79. package/lib/types/Bubble.d.ts +6 -1
  80. package/lib/types/Donut.d.ts +4 -0
  81. package/lib/types/ReferenceLine.d.ts +31 -0
  82. package/lib/types/Tooltip.d.ts +5 -3
  83. package/lib/types/index.d.ts +3 -0
  84. package/package.json +12 -12
  85. package/src/Area.jsx +41 -8
  86. package/src/Bar.jsx +6 -5
  87. package/src/Bubble.jsx +1 -0
  88. package/src/Donut.jsx +96 -29
  89. package/src/Dots.jsx +11 -14
  90. package/src/GroupBar.jsx +1 -1
  91. package/src/Line.jsx +2 -1
  92. package/src/ReferenceLine.jsx +146 -0
  93. package/src/ResponsiveContainer.jsx +1 -1
  94. package/src/ScatterPlot.jsx +1 -0
  95. package/src/Tooltip.jsx +2 -3
  96. package/src/createElement.jsx +4 -2
  97. package/src/index.js +1 -0
  98. package/src/style/dot.shadow.css +10 -5
  99. package/src/style/reference-line.shadow.css +37 -0
  100. package/src/types/Area.d.ts +1 -0
  101. package/src/types/Bar.d.ts +4 -0
  102. package/src/types/Bubble.d.ts +6 -1
  103. package/src/types/Donut.d.ts +4 -0
  104. package/src/types/ReferenceLine.d.ts +31 -0
  105. package/src/types/Tooltip.d.ts +5 -3
  106. package/src/types/index.d.ts +3 -0
package/src/Donut.jsx CHANGED
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import React, { useEffect, useState } from 'react';
2
2
  import { arc, pie } from 'd3-shape';
3
3
  import { Component, sstyled } from '@semcore/core';
4
4
  import canUseDOM from '@semcore/utils/lib/canUseDOM';
@@ -13,7 +13,7 @@ import style from './style/donut.shadow.css';
13
13
 
14
14
  const DEFAULT_INSTANCE = Symbol('DEFAULT_INSTANCE');
15
15
 
16
- function animationInitialPie({ halfsize, d3Arc, arcs }) {
16
+ function animationInitialPie({ halfsize, d3Arc, d3ArcOut, arcs, activeIndexPie }) {
17
17
  return function (_, ind) {
18
18
  const d = arcs[ind];
19
19
  if (!d) return () => '';
@@ -22,7 +22,7 @@ function animationInitialPie({ halfsize, d3Arc, arcs }) {
22
22
  return function (t) {
23
23
  d.startAngle = iStart(t);
24
24
  d.endAngle = iEnd(t);
25
- return d3Arc(d);
25
+ return ind === activeIndexPie ? d3ArcOut(d) : d3Arc(d);
26
26
  };
27
27
  };
28
28
  }
@@ -84,6 +84,11 @@ class DonutRoot extends Component {
84
84
  const d3Arc = arc()
85
85
  .outerRadius(getOuterRadius({ size, halfsize, outerRadius }))
86
86
  .innerRadius(innerRadius > increaseFactor ? innerRadius - increaseFactor : innerRadius);
87
+
88
+ const d3ArcOut = arc()
89
+ .outerRadius(getOuterRadius({ size, halfsize, outerRadius }) + increaseFactor)
90
+ .innerRadius(innerRadius > increaseFactor ? innerRadius - increaseFactor : innerRadius);
91
+
87
92
  let d3Pie = pie()
88
93
  .sort(null)
89
94
  .value(([, value]) => value);
@@ -95,6 +100,7 @@ class DonutRoot extends Component {
95
100
  return {
96
101
  d3Pie,
97
102
  d3Arc,
103
+ d3ArcOut,
98
104
  duration: 500,
99
105
  };
100
106
  };
@@ -105,6 +111,7 @@ class DonutRoot extends Component {
105
111
  }
106
112
 
107
113
  virtualElement = canUseDOM() ? document.createElement('div') : {};
114
+ activeIndexPie = undefined;
108
115
 
109
116
  generateGetBoundingClientRect(x = 0, y = 0) {
110
117
  return () => ({ width: 0, height: 0, top: y, right: x, bottom: y, left: x });
@@ -137,41 +144,67 @@ class DonutRoot extends Component {
137
144
  return d3Pie(pieData);
138
145
  }
139
146
 
140
- bindHandlerTooltip = (visible, props) => ({ clientX: x, clientY: y }) => {
141
- const { eventEmitter } = this.asProps;
142
- this.virtualElement.getBoundingClientRect = this.generateGetBoundingClientRect(x, y);
143
- this.virtualElement[CONSTANT.VIRTUAL_ELEMENT] = true;
144
- eventEmitter.emit('onTooltipVisible', visible, props, this.virtualElement);
145
- };
147
+ bindHandlerTooltip =
148
+ (visible, props) =>
149
+ ({ clientX: x, clientY: y }) => {
150
+ const { eventEmitter } = this.asProps;
151
+ this.virtualElement.getBoundingClientRect = this.generateGetBoundingClientRect(x, y);
152
+ this.virtualElement[CONSTANT.VIRTUAL_ELEMENT] = true;
153
+ eventEmitter.emit('onTooltipVisible', visible, props, this.virtualElement);
154
+ };
146
155
 
147
- getPieProps(props) {
148
- let { d3Arc, duration, innerRadius } = this.asProps;
156
+ animationActivePie = (props) => {
157
+ let { duration, innerRadius } = this.asProps;
158
+ const { active, data, selector } = props;
149
159
  innerRadius = innerRadius > increaseFactor ? innerRadius - increaseFactor : innerRadius;
150
160
  const outerRadius = getOuterRadius(this.asProps);
161
+ active
162
+ ? animationHoverPie({
163
+ d: data,
164
+ selector: `#${this.id} ${selector}`,
165
+ duration: duration === 0 ? 0 : 300,
166
+ innerRadius,
167
+ outerRadius: [outerRadius, outerRadius + increaseFactor],
168
+ })
169
+ : animationHoverPie({
170
+ d: data,
171
+ selector: `#${this.id} ${selector}`,
172
+ duration: duration === 0 ? 0 : 300,
173
+ innerRadius,
174
+ outerRadius: [outerRadius + increaseFactor, outerRadius],
175
+ });
176
+ };
177
+
178
+ getPieProps(props, ind) {
179
+ const { d3Arc, d3ArcOut } = this.asProps;
180
+ const { active } = props;
151
181
  const data = this.arcs.find((arc) => arc.data[0] === props.dataKey);
182
+ if (active) {
183
+ this.activeIndexPie = ind;
184
+ }
152
185
 
153
186
  return {
154
187
  data,
155
188
  d3Arc,
189
+ d3ArcOut,
190
+ $animationActivePie: this.animationActivePie,
156
191
  onMouseMove: this.bindHandlerTooltip(true, props),
157
192
  onMouseLeave: this.bindHandlerTooltip(false, props),
158
193
  onMouseOver: (e) => {
159
- animationHoverPie({
160
- d: data,
161
- selector: `#${this.id} [d="${e.target.getAttribute('d')}"]`,
162
- duration: duration === 0 ? 0 : 300,
163
- innerRadius,
164
- outerRadius: [outerRadius, outerRadius + increaseFactor],
165
- });
194
+ !active &&
195
+ this.animationActivePie({
196
+ active: true,
197
+ data,
198
+ selector: `[d="${e.target.getAttribute('d')}"]`,
199
+ });
166
200
  },
167
201
  onMouseOut: (e) => {
168
- animationHoverPie({
169
- d: data,
170
- selector: `#${this.id} [d="${e.target.getAttribute('d')}"]`,
171
- duration: duration === 0 ? 0 : 300,
172
- innerRadius,
173
- outerRadius: [outerRadius + increaseFactor, outerRadius],
174
- });
202
+ !active &&
203
+ this.animationActivePie({
204
+ active: false,
205
+ data,
206
+ selector: `[d="${e.target.getAttribute('d')}"]`,
207
+ });
175
208
  },
176
209
  };
177
210
  }
@@ -197,8 +230,9 @@ class DonutRoot extends Component {
197
230
  }
198
231
 
199
232
  componentDidMount() {
200
- const { duration, d3Arc, halfsize } = this.asProps;
233
+ const { duration, d3Arc, halfsize, d3ArcOut } = this.asProps;
201
234
  const arcs = this.arcs;
235
+
202
236
  if (duration > 0) {
203
237
  transition()
204
238
  .selection()
@@ -208,7 +242,16 @@ class DonutRoot extends Component {
208
242
  })
209
243
  .transition()
210
244
  .duration(duration)
211
- .attrTween('d', animationInitialPie({ halfsize, d3Arc, arcs }));
245
+ .attrTween(
246
+ 'd',
247
+ animationInitialPie({
248
+ halfsize,
249
+ d3Arc,
250
+ d3ArcOut,
251
+ arcs,
252
+ activeIndexPie: this.activeIndexPie,
253
+ }),
254
+ );
212
255
  }
213
256
  }
214
257
 
@@ -229,8 +272,32 @@ class DonutRoot extends Component {
229
272
  }
230
273
  }
231
274
 
232
- function Pie({ Element: SPie, styles, d3Arc, data, color }) {
233
- return sstyled(styles)(<SPie render="path" color={color} d={d3Arc(data)} />);
275
+ function Pie({
276
+ Element: SPie,
277
+ styles,
278
+ d3Arc,
279
+ data,
280
+ color,
281
+ $animationActivePie,
282
+ active,
283
+ d3ArcOut,
284
+ ...other
285
+ }) {
286
+ const [isMount, setIsMount] = useState(false);
287
+ useEffect(() => {
288
+ //you should't run animation for first render
289
+ if (!isMount) {
290
+ setIsMount(true);
291
+ return;
292
+ }
293
+ if (active !== undefined && active !== null) {
294
+ //name must unique on page
295
+ $animationActivePie({ ...other, active, data, selector: `[name="${other.name}"]` });
296
+ }
297
+ }, [active]);
298
+ return sstyled(styles)(
299
+ <SPie render="path" color={color} d={active ? d3ArcOut(data) : d3Arc(data)} />,
300
+ );
234
301
  }
235
302
 
236
303
  function EmptyData({ Element: SEmptyData, styles, d3Arc, color }) {
package/src/Dots.jsx CHANGED
@@ -3,11 +3,12 @@ import React, { useCallback, useEffect, useState } from 'react';
3
3
  import { sstyled } from '@semcore/core';
4
4
  import { eventToPoint, invert } from './utils';
5
5
  import createElement from './createElement';
6
- import { FadeInOut } from '@semcore/animation';
7
6
  import trottle from '@semcore/utils/lib/rafTrottle';
8
7
 
9
8
  import style from './style/dot.shadow.css';
10
9
 
10
+ const EXCLUDE_PROPS = ['data', 'scale', 'value', 'display'];
11
+
11
12
  function Dots(props) {
12
13
  const {
13
14
  Element: SDot,
@@ -24,6 +25,7 @@ function Dots(props) {
24
25
  scale,
25
26
  duration = 500,
26
27
  } = props;
28
+ const SDots = 'g';
27
29
  const bisect = bisector((d) => d[x]).center;
28
30
  const [activeIndex, setActiveIndex] = useState(null);
29
31
 
@@ -59,27 +61,22 @@ function Dots(props) {
59
61
  unsubscribeMouseMoveRoot();
60
62
  unsubscribeMouseLeaveRoot();
61
63
  };
62
- }, [eventEmitter, data, x, y]);
63
-
64
- const renderCircle = useCallback(
65
- React.forwardRef((props, ref) => {
66
- return <FadeInOut ref={ref} tag="circle" {...props} />;
67
- }),
68
- [props],
69
- );
64
+ }, [eventEmitter, scale, data, x, y]);
70
65
 
71
- return data.reduce((acc, d, i) => {
66
+ const dots = data.reduce((acc, d, i) => {
72
67
  const isPrev = d3.defined()(data[i - 1] || {});
73
68
  const isNext = d3.defined()(data[i + 1] || {});
74
69
  const active = i === activeIndex;
70
+ const visible = display || i === activeIndex || (!isPrev && !isNext);
75
71
  if (!d3.defined()(d)) return acc;
72
+ if (!visible) return acc;
76
73
  acc.push(
77
74
  sstyled(styles)(
78
75
  <SDot
79
76
  key={i}
80
- render={renderCircle}
81
- visible={display || i === activeIndex || (!isPrev && !isNext)}
82
- __excludeProps={['data', 'scale', 'value', 'display']}
77
+ render="circle"
78
+ visible={visible}
79
+ __excludeProps={EXCLUDE_PROPS}
83
80
  value={d}
84
81
  index={i}
85
82
  cx={d3.x()(d)}
@@ -87,12 +84,12 @@ function Dots(props) {
87
84
  active={active}
88
85
  hide={hide}
89
86
  color={color}
90
- use:duration={`${duration}ms`}
91
87
  />,
92
88
  ),
93
89
  );
94
90
  return acc;
95
91
  }, []);
92
+ return sstyled(styles)(<SDots use:duration={`${duration}ms`}>{dots}</SDots>);
96
93
  }
97
94
 
98
95
  Dots.style = style;
package/src/GroupBar.jsx CHANGED
@@ -14,7 +14,7 @@ class GroupBarRoot extends Component {
14
14
 
15
15
  getScaleGroup() {
16
16
  const { Children, scale, scaleGroup, x } = this.asProps;
17
- // TODO: классный костыль =)
17
+ // TODO: love that hack (by lsroman)
18
18
  const xyScale = x ? scale[0] : scale[1];
19
19
 
20
20
  if (scaleGroup) return scaleGroup;
package/src/Line.jsx CHANGED
@@ -27,12 +27,13 @@ class LineRoot extends Component {
27
27
  };
28
28
 
29
29
  getDotsProps() {
30
- const { x, y, d3, color } = this.asProps;
30
+ const { x, y, d3, color, duration } = this.asProps;
31
31
  return {
32
32
  x,
33
33
  y,
34
34
  d3,
35
35
  color,
36
+ duration,
36
37
  };
37
38
  }
38
39
 
@@ -0,0 +1,146 @@
1
+ import React from 'react';
2
+ import { Component, sstyled } from '@semcore/core';
3
+ import createElement from './createElement';
4
+ import { scaleOfBandwidth } from './utils';
5
+
6
+ import style from './style/reference-line.shadow.css';
7
+
8
+ const MAP_ORIENTATION = {
9
+ left: 'vertical',
10
+ right: 'vertical',
11
+ top: 'horizontal',
12
+ bottom: 'horizontal',
13
+ };
14
+
15
+ const MAP_POSITION_LINE = {
16
+ vertical: ([xScale, yScale], value) => {
17
+ const yRange = yScale.range();
18
+ const x = scaleOfBandwidth(xScale, value);
19
+ return {
20
+ x: x,
21
+ y: yRange[1],
22
+ width: 0.1,
23
+ height: yRange[0] - yRange[1],
24
+ };
25
+ },
26
+ horizontal: ([xScale, yScale], value) => {
27
+ const xRange = xScale.range();
28
+ const y = scaleOfBandwidth(yScale, value);
29
+ return {
30
+ x: xRange[0],
31
+ y: y,
32
+ width: xRange[1] - xRange[0],
33
+ height: 0.1,
34
+ };
35
+ },
36
+ };
37
+
38
+ const OFFSET_TITLE = 10;
39
+ const MAP_POSITION_TITlE = {
40
+ left: ([xScale, yScale], value) => {
41
+ const yRange = yScale.range();
42
+ const x = scaleOfBandwidth(xScale, value);
43
+ return {
44
+ x: x - OFFSET_TITLE,
45
+ y: (yRange[0] + yRange[1]) / 2,
46
+ };
47
+ },
48
+ right: ([xScale, yScale], value) => {
49
+ const yRange = yScale.range();
50
+ const x = scaleOfBandwidth(xScale, value);
51
+ return {
52
+ x: x + OFFSET_TITLE,
53
+ y: (yRange[0] + yRange[1]) / 2,
54
+ };
55
+ },
56
+ top: ([xScale, yScale], value) => {
57
+ const xRange = xScale.range();
58
+ const y = scaleOfBandwidth(yScale, value);
59
+ return {
60
+ x: (xRange[1] + xRange[0]) / 2,
61
+ y: y - OFFSET_TITLE,
62
+ };
63
+ },
64
+ bottom: ([xScale, yScale], value) => {
65
+ const xRange = xScale.range();
66
+ const y = scaleOfBandwidth(yScale, value);
67
+ return {
68
+ x: (xRange[1] + xRange[0]) / 2,
69
+ y: y + OFFSET_TITLE,
70
+ };
71
+ },
72
+ };
73
+
74
+ class ReferenceLineRoot extends Component {
75
+ static displayName = 'ReferenceLine';
76
+ static style = style;
77
+ static defaultProps = {
78
+ position: 'left',
79
+ };
80
+
81
+ getTitleProps() {
82
+ const { position, value } = this.asProps;
83
+ return { position, value };
84
+ }
85
+
86
+ getBackgroundProps() {
87
+ const { position, value } = this.asProps;
88
+ return { position, value };
89
+ }
90
+
91
+ render() {
92
+ const SReferenceLine = this.Element;
93
+ const { title, scale, position, value, color, styles } = this.asProps;
94
+ const pos = MAP_POSITION_LINE[MAP_ORIENTATION[position]];
95
+
96
+ return sstyled(styles)(
97
+ <>
98
+ <SReferenceLine
99
+ render="rect"
100
+ __excludeProps={['data', 'scale', 'format', 'value', 'color']}
101
+ stroke={color}
102
+ {...pos(scale, value)}
103
+ />
104
+ {title && <ReferenceLine.Title>{title}</ReferenceLine.Title>}
105
+ </>,
106
+ );
107
+ }
108
+ }
109
+
110
+ function Title(props) {
111
+ const { Element: STitle, styles, scale, position, value } = props;
112
+ const { x, y } = MAP_POSITION_TITlE[position](scale, value);
113
+
114
+ const sstyles = sstyled(styles);
115
+ const sTitleStyles = sstyles.cn('STitle', {
116
+ 'transform-origin': `${x.toFixed(2)}px ${y.toFixed(2)}px`,
117
+ });
118
+
119
+ return sstyled(styles)(
120
+ <STitle
121
+ render="text"
122
+ childrenPosition="inside"
123
+ className={sTitleStyles.className}
124
+ style={sTitleStyles.style}
125
+ position={position}
126
+ x={x}
127
+ y={y}
128
+ />,
129
+ );
130
+ }
131
+
132
+ function Background(props) {
133
+ const { Element: SBackground, styles, scale, position, value } = props;
134
+ const pos = MAP_POSITION_LINE[MAP_ORIENTATION[position]];
135
+
136
+ return sstyled(styles)(
137
+ <SBackground render="rect" childrenPosition="inside" {...pos(scale, value)} />,
138
+ );
139
+ }
140
+
141
+ const ReferenceLine = createElement(ReferenceLineRoot, {
142
+ Title,
143
+ Background,
144
+ });
145
+
146
+ export default ReferenceLine;
@@ -61,7 +61,7 @@ class ResponsiveContainerRoot extends Component {
61
61
 
62
62
  componentDidMount() {
63
63
  if (this.$container) {
64
- // TODO ускорить можно?
64
+ // TODO: may be we can increase perfomance here? (by lsroman)
65
65
  this.observer.observe(this.$container);
66
66
  }
67
67
  }
@@ -66,6 +66,7 @@ class ScatterPlotRoot extends Component {
66
66
  >
67
67
  <SScatterPlot
68
68
  id={`${uid}${i}`}
69
+ index={i}
69
70
  render="circle"
70
71
  clipPath={`url(#${uid})`}
71
72
  cx={xScale(d[x]) + offset[0]}
package/src/Tooltip.jsx CHANGED
@@ -39,7 +39,6 @@ class TooltipRoot extends Component {
39
39
  (visible, data, node) => {
40
40
  this.setState(
41
41
  {
42
- // TODO: тут бага если одно поля нету,то оно не перезапишет стейт
43
42
  ...data,
44
43
  $visible: visible,
45
44
  },
@@ -124,8 +123,8 @@ function Dot(props) {
124
123
  const SDotGroup = Root;
125
124
  const SDot = Box;
126
125
  return sstyled(styles)(
127
- <SDotGroup render={Box}>
128
- <SDot __excludeProps={['data', 'scale']} color={resolveColor(color)} />
126
+ <SDotGroup render={Box} __excludeProps={['data', 'scale']}>
127
+ <SDot color={resolveColor(color)} />
129
128
  <Children />
130
129
  </SDotGroup>,
131
130
  );
@@ -7,10 +7,12 @@ import propsForElement from '@semcore/utils/lib/propsForElement';
7
7
  import getOriginChildren from '@semcore/utils/lib/getOriginChildren';
8
8
  import hoistNonReactStatics from 'hoist-non-react-statics';
9
9
 
10
+ const EXCLUDE_PROPS = ['data', 'scale'];
11
+
10
12
  function createElementRender() {
11
13
  const Element = React.forwardRef(function (
12
14
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
13
- { render, tag, childrenPosition = 'below', x: xS, y: yS, ...source },
15
+ { render, childrenPosition = 'below', x: xS, y: yS, ...source },
14
16
  ref,
15
17
  ) {
16
18
  const {
@@ -61,7 +63,7 @@ function createElementRender() {
61
63
  <Tag
62
64
  {...propsForElement(
63
65
  {
64
- __excludeProps: ['data', 'scale'],
66
+ __excludeProps: EXCLUDE_PROPS,
65
67
  ...mergedProps,
66
68
  },
67
69
  Tag,
package/src/index.js CHANGED
@@ -19,6 +19,7 @@ export { default as Venn } from './Venn';
19
19
  export { default as Tooltip } from './Tooltip';
20
20
 
21
21
  export { default as ResponsiveContainer } from './ResponsiveContainer';
22
+ export { default as ReferenceLine } from './ReferenceLine';
22
23
 
23
24
  export { HoverLine, HoverRect } from './Hover';
24
25
 
@@ -1,20 +1,21 @@
1
1
  @import '@semcore/utils/style/var.css';
2
2
  @import '@semcore/d3-chart/src/style/var.css';
3
3
 
4
+ SDots {
5
+ & SDot {
6
+ transition-duration: var(--duration);
7
+ }
8
+ }
9
+
4
10
  SDot {
5
11
  stroke-width: 2px;
6
12
  stroke: #fff;
7
13
  r: 6px;
8
14
  fill: var(--blue-03);
9
15
  transition-property: cx, cy;
10
- transition-duration: var(--duration);
11
16
  transition-timing-function: ease-in-out;
12
17
  }
13
18
 
14
- SDot[color] {
15
- fill: var(--color);
16
- }
17
-
18
19
  SDot[hide] {
19
20
  display: none;
20
21
  }
@@ -22,3 +23,7 @@ SDot[hide] {
22
23
  SDot[active] {
23
24
  r: 8px;
24
25
  }
26
+
27
+ SDot[color] {
28
+ fill: var(--color);
29
+ }
@@ -0,0 +1,37 @@
1
+ @import '@semcore/utils/style/var.css';
2
+
3
+ SReferenceLine {
4
+ fill: none;
5
+ stroke: var(--gray-300);
6
+ }
7
+
8
+ STitle {
9
+ font-size: var(--fs-100);
10
+ fill: var(--gray-500);
11
+ transform-origin: var(--transform-origin);
12
+ }
13
+
14
+ STitle[position='top'] {
15
+ text-anchor: middle;
16
+ }
17
+
18
+ STitle[position='bottom'] {
19
+ text-anchor: middle;
20
+ alignment-baseline: hanging;
21
+ }
22
+
23
+ STitle[position='right'] {
24
+ transform: rotate(-90deg);
25
+ alignment-baseline: middle;
26
+ text-anchor: middle;
27
+ }
28
+
29
+ STitle[position='left'] {
30
+ transform: rotate(-90deg);
31
+ text-anchor: middle;
32
+ alignment-baseline: middle;
33
+ }
34
+
35
+ SBackground {
36
+ fill: color-mod(var(--gray-200) a(20%));
37
+ }
@@ -42,6 +42,7 @@ export interface IAreaNullProps extends IContext {
42
42
  declare const Area: (<T>(props: CProps<IAreaProps & T>) => ReturnEl) & {
43
43
  Dots: <T>(props: CProps<IAreaDotsProps & T, IAreaDotsContext>) => ReturnEl;
44
44
  Null: <T>(props: CProps<IAreaNullProps & T>) => ReturnEl;
45
+ Line: <T>(props: CProps<IContext & T>) => ReturnEl;
45
46
  };
46
47
 
47
48
  export default Area;
@@ -19,6 +19,10 @@ export interface IBarProps extends IContext {
19
19
  * @default 2
20
20
  */
21
21
  r?: number | number[];
22
+ /** Minimal height
23
+ * @default 4
24
+ */
25
+ hMin?: number;
22
26
  }
23
27
 
24
28
  export interface IBarContext {
@@ -22,6 +22,11 @@ export interface IBubbleProps extends IContext {
22
22
  duration?: number;
23
23
  }
24
24
 
25
- declare const Bubble: <T>(props: CProps<IBubbleProps & T>) => ReturnEl;
25
+ export interface IBubbleContext {
26
+ /** Index element of data */
27
+ index: number;
28
+ }
29
+
30
+ declare const Bubble: <T>(props: CProps<IBubbleProps & T, IBubbleContext>) => ReturnEl;
26
31
 
27
32
  export default Bubble;
@@ -27,6 +27,10 @@ export interface IPieProps extends IContext {
27
27
  @default #50aef4
28
28
  **/
29
29
  color?: string;
30
+ /**
31
+ * Active sector
32
+ * */
33
+ active?: boolean;
30
34
  }
31
35
 
32
36
  export interface IEmptyDataProps extends IContext {}
@@ -0,0 +1,31 @@
1
+ import { CProps, ReturnEl } from '@semcore/core';
2
+ import IContext from './context';
3
+
4
+ export interface IReferenceLineProps extends IContext {
5
+ /** The position of the title relative reference line
6
+ * @default 'left' */
7
+ position?: 'top' | 'right' | 'bottom' | 'left';
8
+ /** Value element of data */
9
+ value: any;
10
+ }
11
+
12
+ export interface IReferenceLineTitleProps extends IContext {
13
+ /** The position of the axis relative reference line */
14
+ position?: 'top' | 'right' | 'bottom' | 'left';
15
+ /** Value element of data */
16
+ value: any;
17
+ }
18
+
19
+ export interface IReferenceLineBackgroundProps extends IContext {
20
+ /** The position of the axis relative reference line */
21
+ position?: 'top' | 'right' | 'bottom' | 'left';
22
+ /** Value element of data */
23
+ value: any;
24
+ }
25
+
26
+ declare const ReferenceLine: (<T>(props: CProps<IReferenceLineProps & T>) => ReturnEl) & {
27
+ Title: <T>(props: CProps<IReferenceLineTitleProps & T>) => ReturnEl;
28
+ Background: <T>(props: CProps<IReferenceLineBackgroundProps & T>) => ReturnEl;
29
+ };
30
+
31
+ export default ReferenceLine;