@pie-lib/graphing 2.34.2-next.0 → 2.35.0-mui-update.0
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.
- package/CHANGELOG.md +10 -8
- package/lib/axis/arrow.js +19 -55
- package/lib/axis/arrow.js.map +1 -1
- package/lib/axis/axes.js +104 -186
- package/lib/axis/axes.js.map +1 -1
- package/lib/axis/index.js +1 -6
- package/lib/axis/index.js.map +1 -1
- package/lib/bg.js +21 -49
- package/lib/bg.js.map +1 -1
- package/lib/container/actions.js +2 -8
- package/lib/container/actions.js.map +1 -1
- package/lib/container/index.js +14 -59
- package/lib/container/index.js.map +1 -1
- package/lib/container/marks.js +1 -6
- package/lib/container/marks.js.map +1 -1
- package/lib/container/middleware.js +2 -8
- package/lib/container/middleware.js.map +1 -1
- package/lib/container/reducer.js +1 -8
- package/lib/container/reducer.js.map +1 -1
- package/lib/coordinates-label.js +23 -55
- package/lib/coordinates-label.js.map +1 -1
- package/lib/graph-with-controls.js +113 -183
- package/lib/graph-with-controls.js.map +1 -1
- package/lib/graph.js +59 -116
- package/lib/graph.js.map +1 -1
- package/lib/grid-setup.js +161 -223
- package/lib/grid-setup.js.map +1 -1
- package/lib/grid.js +28 -73
- package/lib/grid.js.map +1 -1
- package/lib/index.js +1 -13
- package/lib/index.js.map +1 -1
- package/lib/key-legend.js +41 -85
- package/lib/key-legend.js.map +1 -1
- package/lib/label-svg-icon.js +1 -7
- package/lib/label-svg-icon.js.map +1 -1
- package/lib/labels.js +61 -119
- package/lib/labels.js.map +1 -1
- package/lib/mark-label.js +113 -163
- package/lib/mark-label.js.map +1 -1
- package/lib/toggle-bar.js +158 -242
- package/lib/toggle-bar.js.map +1 -1
- package/lib/tool-menu.js +16 -48
- package/lib/tool-menu.js.map +1 -1
- package/lib/tools/absolute/component.js +4 -10
- package/lib/tools/absolute/component.js.map +1 -1
- package/lib/tools/absolute/index.js +3 -16
- package/lib/tools/absolute/index.js.map +1 -1
- package/lib/tools/circle/bg-circle.js +42 -92
- package/lib/tools/circle/bg-circle.js.map +1 -1
- package/lib/tools/circle/component.js +79 -165
- package/lib/tools/circle/component.js.map +1 -1
- package/lib/tools/circle/index.js +3 -13
- package/lib/tools/circle/index.js.map +1 -1
- package/lib/tools/exponential/component.js +4 -10
- package/lib/tools/exponential/component.js.map +1 -1
- package/lib/tools/exponential/index.js +3 -18
- package/lib/tools/exponential/index.js.map +1 -1
- package/lib/tools/index.js +3 -16
- package/lib/tools/index.js.map +1 -1
- package/lib/tools/line/component.js +27 -48
- package/lib/tools/line/component.js.map +1 -1
- package/lib/tools/line/index.js +1 -6
- package/lib/tools/line/index.js.map +1 -1
- package/lib/tools/parabola/component.js +4 -10
- package/lib/tools/parabola/component.js.map +1 -1
- package/lib/tools/parabola/index.js +3 -16
- package/lib/tools/parabola/index.js.map +1 -1
- package/lib/tools/point/component.js +24 -71
- package/lib/tools/point/component.js.map +1 -1
- package/lib/tools/point/index.js +3 -11
- package/lib/tools/point/index.js.map +1 -1
- package/lib/tools/polygon/component.js +82 -183
- package/lib/tools/polygon/component.js.map +1 -1
- package/lib/tools/polygon/index.js +6 -23
- package/lib/tools/polygon/index.js.map +1 -1
- package/lib/tools/polygon/line.js +48 -91
- package/lib/tools/polygon/line.js.map +1 -1
- package/lib/tools/polygon/polygon.js +65 -98
- package/lib/tools/polygon/polygon.js.map +1 -1
- package/lib/tools/ray/component.js +41 -60
- package/lib/tools/ray/component.js.map +1 -1
- package/lib/tools/ray/index.js +1 -6
- package/lib/tools/ray/index.js.map +1 -1
- package/lib/tools/segment/component.js +25 -43
- package/lib/tools/segment/component.js.map +1 -1
- package/lib/tools/segment/index.js +1 -6
- package/lib/tools/segment/index.js.map +1 -1
- package/lib/tools/shared/arrow-head.js +69 -28
- package/lib/tools/shared/arrow-head.js.map +1 -1
- package/lib/tools/shared/icons/CorrectSVG.js +3 -8
- package/lib/tools/shared/icons/CorrectSVG.js.map +1 -1
- package/lib/tools/shared/icons/IncorrectSVG.js +3 -8
- package/lib/tools/shared/icons/IncorrectSVG.js.map +1 -1
- package/lib/tools/shared/icons/MissingSVG.js +3 -8
- package/lib/tools/shared/icons/MissingSVG.js.map +1 -1
- package/lib/tools/shared/line/index.js +126 -187
- package/lib/tools/shared/line/index.js.map +1 -1
- package/lib/tools/shared/line/line-path.js +70 -100
- package/lib/tools/shared/line/line-path.js.map +1 -1
- package/lib/tools/shared/line/with-root-edge.js +21 -55
- package/lib/tools/shared/line/with-root-edge.js.map +1 -1
- package/lib/tools/shared/point/arrow-point.js +23 -62
- package/lib/tools/shared/point/arrow-point.js.map +1 -1
- package/lib/tools/shared/point/arrow.js +24 -52
- package/lib/tools/shared/point/arrow.js.map +1 -1
- package/lib/tools/shared/point/base-point.js +54 -72
- package/lib/tools/shared/point/base-point.js.map +1 -1
- package/lib/tools/shared/point/index.js +22 -57
- package/lib/tools/shared/point/index.js.map +1 -1
- package/lib/tools/shared/styles.js +10 -38
- package/lib/tools/shared/styles.js.map +1 -1
- package/lib/tools/shared/types.js +2 -9
- package/lib/tools/shared/types.js.map +1 -1
- package/lib/tools/sine/component.js +8 -19
- package/lib/tools/sine/component.js.map +1 -1
- package/lib/tools/sine/index.js +3 -16
- package/lib/tools/sine/index.js.map +1 -1
- package/lib/tools/vector/component.js +24 -44
- package/lib/tools/vector/component.js.map +1 -1
- package/lib/tools/vector/index.js +1 -6
- package/lib/tools/vector/index.js.map +1 -1
- package/lib/undo-redo.js +29 -69
- package/lib/undo-redo.js.map +1 -1
- package/lib/use-debounce.js +4 -11
- package/lib/use-debounce.js.map +1 -1
- package/lib/utils.js +51 -128
- package/lib/utils.js.map +1 -1
- package/package.json +15 -13
- package/src/axis/arrow.jsx +7 -12
- package/src/axis/axes.jsx +40 -45
- package/src/coordinates-label.jsx +13 -18
- package/src/graph-with-controls.jsx +52 -59
- package/src/grid-setup.jsx +204 -206
- package/src/grid.jsx +1 -3
- package/src/key-legend.jsx +52 -56
- package/src/labels.jsx +21 -30
- package/src/mark-label.jsx +83 -81
- package/src/toggle-bar.jsx +155 -166
- package/src/tools/circle/bg-circle.jsx +20 -28
- package/src/tools/circle/component.jsx +28 -63
- package/src/tools/line/component.jsx +22 -15
- package/src/tools/polygon/component.jsx +1 -2
- package/src/tools/polygon/line.jsx +28 -32
- package/src/tools/polygon/polygon.jsx +52 -45
- package/src/tools/ray/component.jsx +38 -25
- package/src/tools/segment/component.jsx +19 -18
- package/src/tools/shared/arrow-head.jsx +60 -7
- package/src/tools/shared/line/index.jsx +39 -2
- package/src/tools/shared/line/line-path.jsx +54 -58
- package/src/tools/shared/point/arrow-point.jsx +10 -24
- package/src/tools/shared/point/arrow.jsx +5 -11
- package/src/tools/shared/point/base-point.jsx +42 -19
- package/src/tools/shared/point/index.jsx +27 -44
- package/src/tools/vector/component.jsx +11 -16
- package/src/undo-redo.jsx +19 -21
|
@@ -1,32 +1,35 @@
|
|
|
1
1
|
import { lineToolComponent, lineBase, styles } from '../shared/line';
|
|
2
2
|
import React from 'react';
|
|
3
3
|
import PropTypes from 'prop-types';
|
|
4
|
-
|
|
5
4
|
import { types } from '@pie-lib/plot';
|
|
6
|
-
import {
|
|
7
|
-
|
|
5
|
+
import { styled } from '@mui/material/styles';
|
|
6
|
+
|
|
7
|
+
const StyledLineRoot = styled('line')(({ theme, disabled, correctness }) => ({
|
|
8
|
+
...styles.line(theme),
|
|
9
|
+
...(disabled && {
|
|
10
|
+
...styles.disabled(theme),
|
|
11
|
+
...styles.disabledSecondary(theme),
|
|
12
|
+
}),
|
|
13
|
+
...(correctness === 'correct' && styles.correct(theme, 'stroke')),
|
|
14
|
+
...(correctness === 'incorrect' && styles.incorrect(theme, 'stroke')),
|
|
15
|
+
...(correctness === 'missing' && styles.missing(theme, 'stroke')),
|
|
16
|
+
}));
|
|
8
17
|
|
|
9
|
-
const lineStyles = (theme) => ({
|
|
10
|
-
line: styles.line(theme),
|
|
11
|
-
disabled: styles.disabled(theme),
|
|
12
|
-
disabledSecondary: styles.disabledSecondary(theme),
|
|
13
|
-
correct: styles.correct(theme, 'stroke'),
|
|
14
|
-
incorrect: styles.incorrect(theme, 'stroke'),
|
|
15
|
-
missing: styles.missing(theme, 'stroke'),
|
|
16
|
-
});
|
|
17
18
|
export const Line = (props) => {
|
|
18
|
-
const { className,
|
|
19
|
+
const { className, correctness, disabled, graphProps, from, to, ...rest } = props;
|
|
19
20
|
const { scale } = graphProps;
|
|
20
21
|
|
|
21
22
|
return (
|
|
22
|
-
<
|
|
23
|
+
<StyledLineRoot
|
|
23
24
|
stroke="green"
|
|
24
|
-
strokeWidth=
|
|
25
|
+
strokeWidth={6}
|
|
25
26
|
x1={scale.x(from.x)}
|
|
26
27
|
y1={scale.y(from.y)}
|
|
27
28
|
x2={scale.x(to.x)}
|
|
28
29
|
y2={scale.y(to.y)}
|
|
29
|
-
className={
|
|
30
|
+
className={className}
|
|
31
|
+
disabled={disabled}
|
|
32
|
+
correctness={correctness}
|
|
30
33
|
{...rest}
|
|
31
34
|
/>
|
|
32
35
|
);
|
|
@@ -34,7 +37,6 @@ export const Line = (props) => {
|
|
|
34
37
|
|
|
35
38
|
Line.propTypes = {
|
|
36
39
|
className: PropTypes.string,
|
|
37
|
-
classes: PropTypes.object,
|
|
38
40
|
correctness: PropTypes.string,
|
|
39
41
|
disabled: PropTypes.bool,
|
|
40
42
|
graphProps: PropTypes.any,
|
|
@@ -42,8 +44,7 @@ Line.propTypes = {
|
|
|
42
44
|
to: types.PointType,
|
|
43
45
|
};
|
|
44
46
|
|
|
45
|
-
const
|
|
46
|
-
const Segment = lineBase(StyledLine);
|
|
47
|
+
const Segment = lineBase(Line);
|
|
47
48
|
const Component = lineToolComponent(Segment);
|
|
48
49
|
|
|
49
50
|
export default Component;
|
|
@@ -1,13 +1,56 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import PropTypes from 'prop-types';
|
|
3
|
+
import { styled } from '@mui/material/styles';
|
|
4
|
+
import { color } from '@pie-lib/render-ui';
|
|
3
5
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
+
const StyledArrowHead = styled('polygon')(({ disabled, correctness }) => ({
|
|
7
|
+
fill: color.defaults.BLACK,
|
|
8
|
+
...(disabled && {
|
|
9
|
+
fill: color.disabled(),
|
|
10
|
+
}),
|
|
11
|
+
...(correctness === 'correct' && {
|
|
12
|
+
fill: color.correctWithIcon(),
|
|
13
|
+
}),
|
|
14
|
+
...(correctness === 'incorrect' && {
|
|
15
|
+
fill: color.incorrectWithIcon(),
|
|
16
|
+
}),
|
|
17
|
+
...(correctness === 'missing' && {
|
|
18
|
+
fill: color.missingWithIcon(),
|
|
19
|
+
}),
|
|
20
|
+
}));
|
|
21
|
+
|
|
22
|
+
const StyledMarker = styled('marker')(({ disabled, correctness }) => ({
|
|
23
|
+
'& polygon': {
|
|
24
|
+
fill: color.defaults.BLACK,
|
|
25
|
+
...(disabled && {
|
|
26
|
+
fill: color.disabled(),
|
|
27
|
+
}),
|
|
28
|
+
...(correctness === 'correct' && {
|
|
29
|
+
fill: color.correctWithIcon(),
|
|
30
|
+
}),
|
|
31
|
+
...(correctness === 'incorrect' && {
|
|
32
|
+
fill: color.incorrectWithIcon(),
|
|
33
|
+
}),
|
|
34
|
+
...(correctness === 'missing' && {
|
|
35
|
+
fill: color.missingWithIcon(),
|
|
36
|
+
}),
|
|
37
|
+
},
|
|
38
|
+
}));
|
|
39
|
+
|
|
40
|
+
export const ArrowHead = ({ size, transform, points, disabled, correctness }) => (
|
|
41
|
+
<StyledArrowHead
|
|
42
|
+
points={points || `0,0 ${size},${size / 2} 0,${size}`}
|
|
43
|
+
transform={transform}
|
|
44
|
+
disabled={disabled}
|
|
45
|
+
correctness={correctness}
|
|
46
|
+
/>
|
|
6
47
|
);
|
|
7
48
|
ArrowHead.propTypes = {
|
|
8
49
|
points: PropTypes.string,
|
|
9
50
|
size: PropTypes.number,
|
|
10
51
|
transform: PropTypes.string,
|
|
52
|
+
disabled: PropTypes.bool,
|
|
53
|
+
correctness: PropTypes.string,
|
|
11
54
|
};
|
|
12
55
|
ArrowHead.defaultProps = {
|
|
13
56
|
points: '',
|
|
@@ -18,9 +61,16 @@ export const genUid = () => {
|
|
|
18
61
|
const v = (Math.random() * 1000).toFixed(0);
|
|
19
62
|
return `arrow-${v}`;
|
|
20
63
|
};
|
|
21
|
-
export const ArrowMarker = ({ id, size, className }) => {
|
|
64
|
+
export const ArrowMarker = ({ id, size, className, disabled, correctness }) => {
|
|
65
|
+
// Parse styling info from className if provided (for backward compatibility)
|
|
66
|
+
const isDisabled = disabled || className?.includes('disabled');
|
|
67
|
+
const parsedCorrectness = correctness ||
|
|
68
|
+
(className?.includes('incorrect') ? 'incorrect' :
|
|
69
|
+
className?.includes('correct') ? 'correct' :
|
|
70
|
+
className?.includes('missing') ? 'missing' : null);
|
|
71
|
+
|
|
22
72
|
return (
|
|
23
|
-
<
|
|
73
|
+
<StyledMarker
|
|
24
74
|
id={id}
|
|
25
75
|
viewBox={`0 0 ${size} ${size}`}
|
|
26
76
|
refX={size / 2}
|
|
@@ -28,16 +78,19 @@ export const ArrowMarker = ({ id, size, className }) => {
|
|
|
28
78
|
markerWidth={size}
|
|
29
79
|
markerHeight={size}
|
|
30
80
|
orient="auto-start-reverse"
|
|
31
|
-
|
|
81
|
+
disabled={isDisabled}
|
|
82
|
+
correctness={parsedCorrectness}
|
|
32
83
|
>
|
|
33
|
-
<ArrowHead size={size} />
|
|
34
|
-
</
|
|
84
|
+
<ArrowHead size={size} disabled={isDisabled} correctness={parsedCorrectness} />
|
|
85
|
+
</StyledMarker>
|
|
35
86
|
);
|
|
36
87
|
};
|
|
37
88
|
ArrowMarker.propTypes = {
|
|
38
89
|
id: PropTypes.string,
|
|
39
90
|
size: PropTypes.number,
|
|
40
91
|
className: PropTypes.string,
|
|
92
|
+
disabled: PropTypes.bool,
|
|
93
|
+
correctness: PropTypes.string,
|
|
41
94
|
};
|
|
42
95
|
ArrowMarker.defaultProps = {
|
|
43
96
|
size: 5,
|
|
@@ -10,6 +10,43 @@ import MarkLabel from '../../../mark-label';
|
|
|
10
10
|
import isEmpty from 'lodash/isEmpty';
|
|
11
11
|
import { color } from '@pie-lib/render-ui';
|
|
12
12
|
import { getMiddleOfTwoPoints, equalPoints, sameAxes } from '../../../utils';
|
|
13
|
+
import { styled } from '@mui/material/styles';
|
|
14
|
+
|
|
15
|
+
const StyledLineGroup = styled('g')(({ disabled, correctness }) => ({
|
|
16
|
+
'& line': {
|
|
17
|
+
fill: 'transparent',
|
|
18
|
+
stroke: color.defaults.BLACK,
|
|
19
|
+
strokeWidth: 3,
|
|
20
|
+
transition: 'stroke 200ms ease-in, stroke-width 200ms ease-in',
|
|
21
|
+
'&:hover': {
|
|
22
|
+
strokeWidth: 6,
|
|
23
|
+
stroke: color.defaults.PRIMARY_DARK,
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
...(disabled && {
|
|
27
|
+
'& line': {
|
|
28
|
+
...disabledSecondary('stroke'),
|
|
29
|
+
strokeWidth: 2,
|
|
30
|
+
},
|
|
31
|
+
}),
|
|
32
|
+
...(correctness === 'correct' && {
|
|
33
|
+
'& line': {
|
|
34
|
+
...correct('stroke'),
|
|
35
|
+
},
|
|
36
|
+
}),
|
|
37
|
+
...(correctness === 'incorrect' && {
|
|
38
|
+
'& line': {
|
|
39
|
+
...incorrect('stroke'),
|
|
40
|
+
},
|
|
41
|
+
}),
|
|
42
|
+
...(correctness === 'missing' && {
|
|
43
|
+
'& line': {
|
|
44
|
+
...missing('stroke'),
|
|
45
|
+
strokeWidth: 1,
|
|
46
|
+
strokeDasharray: '4 3',
|
|
47
|
+
},
|
|
48
|
+
}),
|
|
49
|
+
}));
|
|
13
50
|
|
|
14
51
|
export const lineTool = (type, Component) => () => ({
|
|
15
52
|
type,
|
|
@@ -350,7 +387,7 @@ export const lineBase = (Comp, opts) => {
|
|
|
350
387
|
}
|
|
351
388
|
|
|
352
389
|
return (
|
|
353
|
-
<
|
|
390
|
+
<StyledLineGroup disabled={disabled} correctness={correctness}>
|
|
354
391
|
{to && (
|
|
355
392
|
<DraggableComp
|
|
356
393
|
from={from}
|
|
@@ -387,7 +424,7 @@ export const lineBase = (Comp, opts) => {
|
|
|
387
424
|
/>
|
|
388
425
|
)}
|
|
389
426
|
{toLabelNode}
|
|
390
|
-
</
|
|
427
|
+
</StyledLineGroup>
|
|
391
428
|
);
|
|
392
429
|
}
|
|
393
430
|
}
|
|
@@ -1,16 +1,56 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import PropTypes from 'prop-types';
|
|
3
|
-
import {
|
|
3
|
+
import { styled } from '@mui/material/styles';
|
|
4
4
|
import { types } from '@pie-lib/plot';
|
|
5
|
-
import classNames from 'classnames';
|
|
6
5
|
import { disabled, correct, incorrect, missing, disabledSecondary } from '../styles';
|
|
7
6
|
import * as vx from '@vx/shape';
|
|
8
7
|
import { color } from '@pie-lib/render-ui';
|
|
9
8
|
|
|
9
|
+
const dragging = () => ({
|
|
10
|
+
strokeWidth: 4,
|
|
11
|
+
stroke: color.defaults.BLACK,
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
const StyledDrawLine = styled(vx.LinePath)(({ theme, disabled: isDisabled, correctness }) => ({
|
|
15
|
+
fill: 'none',
|
|
16
|
+
strokeWidth: 2,
|
|
17
|
+
stroke: color.black(),
|
|
18
|
+
...(isDisabled && {
|
|
19
|
+
...disabledSecondary('stroke'),
|
|
20
|
+
strokeWidth: 2,
|
|
21
|
+
}),
|
|
22
|
+
...(correctness === 'correct' && correct('stroke')),
|
|
23
|
+
...(correctness === 'incorrect' && incorrect('stroke')),
|
|
24
|
+
...(correctness === 'missing' && {
|
|
25
|
+
...missing('stroke'),
|
|
26
|
+
strokeWidth: 1,
|
|
27
|
+
strokeDasharray: '4 3',
|
|
28
|
+
}),
|
|
29
|
+
}));
|
|
30
|
+
|
|
31
|
+
const StyledLine = styled(vx.LinePath)(({ theme, disabled: isDisabled, correctness, isDragging }) => ({
|
|
32
|
+
strokeWidth: 3,
|
|
33
|
+
fill: 'none',
|
|
34
|
+
transition: 'stroke-width 200ms ease-in, stroke 200ms ease-in',
|
|
35
|
+
stroke: 'transparent',
|
|
36
|
+
'&:hover': dragging(theme),
|
|
37
|
+
...(isDragging && dragging(theme)),
|
|
38
|
+
...(isDisabled && {
|
|
39
|
+
...disabled('stroke'),
|
|
40
|
+
strokeWidth: 2,
|
|
41
|
+
}),
|
|
42
|
+
...(correctness === 'correct' && correct('stroke')),
|
|
43
|
+
...(correctness === 'incorrect' && incorrect('stroke')),
|
|
44
|
+
...(correctness === 'missing' && {
|
|
45
|
+
...missing('stroke'),
|
|
46
|
+
strokeWidth: 1,
|
|
47
|
+
strokeDasharray: '4 3',
|
|
48
|
+
}),
|
|
49
|
+
}));
|
|
50
|
+
|
|
10
51
|
export class RawLinePath extends React.Component {
|
|
11
52
|
static propTypes = {
|
|
12
53
|
className: PropTypes.string,
|
|
13
|
-
classes: PropTypes.object,
|
|
14
54
|
data: PropTypes.arrayOf(PropTypes.arrayOf(PropTypes.number)),
|
|
15
55
|
graphProps: types.GraphPropsType.isRequired,
|
|
16
56
|
disabled: PropTypes.bool,
|
|
@@ -27,30 +67,24 @@ export class RawLinePath extends React.Component {
|
|
|
27
67
|
|
|
28
68
|
render() {
|
|
29
69
|
/* eslint-disable no-unused-vars */
|
|
30
|
-
const { data,
|
|
70
|
+
const { data, className, disabled, correctness, from, to, graphProps, isDragging, ...rest } = this.props;
|
|
31
71
|
/* eslint-enable */
|
|
32
72
|
|
|
33
73
|
return (
|
|
34
74
|
<React.Fragment>
|
|
35
|
-
<
|
|
75
|
+
<StyledDrawLine
|
|
36
76
|
data={data}
|
|
37
|
-
className={
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
classes[correctness],
|
|
41
|
-
className,
|
|
42
|
-
)}
|
|
77
|
+
className={className}
|
|
78
|
+
disabled={disabled}
|
|
79
|
+
correctness={correctness}
|
|
43
80
|
{...rest}
|
|
44
81
|
/>
|
|
45
|
-
<
|
|
82
|
+
<StyledLine
|
|
46
83
|
data={data}
|
|
47
|
-
className={
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
classes[correctness],
|
|
52
|
-
className,
|
|
53
|
-
)}
|
|
84
|
+
className={className}
|
|
85
|
+
isDragging={isDragging}
|
|
86
|
+
disabled={disabled}
|
|
87
|
+
correctness={correctness}
|
|
54
88
|
{...rest}
|
|
55
89
|
/>
|
|
56
90
|
</React.Fragment>
|
|
@@ -58,42 +92,4 @@ export class RawLinePath extends React.Component {
|
|
|
58
92
|
}
|
|
59
93
|
}
|
|
60
94
|
|
|
61
|
-
const
|
|
62
|
-
strokeWidth: 4,
|
|
63
|
-
stroke: color.defaults.BLACK,
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
export const LinePath = withStyles((theme) => ({
|
|
67
|
-
drawLine: {
|
|
68
|
-
fill: 'none',
|
|
69
|
-
strokeWidth: 2,
|
|
70
|
-
stroke: color.black(),
|
|
71
|
-
},
|
|
72
|
-
line: {
|
|
73
|
-
strokeWidth: 3,
|
|
74
|
-
fill: 'none',
|
|
75
|
-
transition: 'stroke-width 200ms ease-in, stroke 200ms ease-in',
|
|
76
|
-
stroke: 'transparent',
|
|
77
|
-
'&:hover': dragging(theme),
|
|
78
|
-
},
|
|
79
|
-
dragging: dragging(theme),
|
|
80
|
-
disabled: {
|
|
81
|
-
...disabled('stroke'),
|
|
82
|
-
strokeWidth: 2,
|
|
83
|
-
},
|
|
84
|
-
disabledSecondary: {
|
|
85
|
-
...disabledSecondary('stroke'),
|
|
86
|
-
strokeWidth: 2,
|
|
87
|
-
},
|
|
88
|
-
correct: {
|
|
89
|
-
...correct('stroke'),
|
|
90
|
-
},
|
|
91
|
-
incorrect: {
|
|
92
|
-
...incorrect('stroke'),
|
|
93
|
-
},
|
|
94
|
-
missing: {
|
|
95
|
-
...missing('stroke'),
|
|
96
|
-
strokeWidth: 1,
|
|
97
|
-
strokeDasharray: '4 3',
|
|
98
|
-
},
|
|
99
|
-
}))(RawLinePath);
|
|
95
|
+
export const LinePath = RawLinePath;
|
|
@@ -1,18 +1,15 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import PropTypes from 'prop-types';
|
|
3
|
-
import classNames from 'classnames';
|
|
4
3
|
import { types } from '@pie-lib/plot';
|
|
5
|
-
import isEqual from 'lodash/isEqual';
|
|
6
4
|
import { getAngleDeg, arrowDimensions } from '../../../utils';
|
|
7
5
|
|
|
8
6
|
export class RawArrow extends React.Component {
|
|
9
7
|
static propTypes = {
|
|
10
|
-
classes: PropTypes.object,
|
|
11
8
|
className: PropTypes.string,
|
|
12
9
|
correctness: PropTypes.string,
|
|
13
10
|
disabled: PropTypes.bool,
|
|
14
|
-
x: PropTypes.number,
|
|
15
|
-
y: PropTypes.number,
|
|
11
|
+
x: PropTypes.number.isRequired,
|
|
12
|
+
y: PropTypes.number.isRequired,
|
|
16
13
|
from: PropTypes.shape({
|
|
17
14
|
x: PropTypes.number,
|
|
18
15
|
y: PropTypes.number,
|
|
@@ -30,32 +27,21 @@ export class RawArrow extends React.Component {
|
|
|
30
27
|
};
|
|
31
28
|
|
|
32
29
|
render() {
|
|
33
|
-
const {
|
|
34
|
-
// x & y are the initial coordinates for the arrow
|
|
35
|
-
// from & to are used only to calculate the angle that the arrow should be rotated with
|
|
36
|
-
|
|
30
|
+
const { className, x, y, disabled, correctness, graphProps, from, to, ...rest } = this.props;
|
|
37
31
|
const { scale } = graphProps;
|
|
38
|
-
const angle = getAngleDeg(from.x, from.y, to.x, to.y);
|
|
39
32
|
|
|
40
|
-
|
|
33
|
+
const angle = from && to ? getAngleDeg(from.x, from.y, to.x, to.y) : 0;
|
|
41
34
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
-${arrowDimensions.vector},${arrowDimensions.vector * 2}`;
|
|
47
|
-
}
|
|
35
|
+
const points =
|
|
36
|
+
from && to && (from.x !== to.x || from.y !== to.y)
|
|
37
|
+
? `0,0 ${arrowDimensions.vector},${arrowDimensions.vector * 2} -${arrowDimensions.vector},${arrowDimensions.vector * 2}`
|
|
38
|
+
: '0,0 0,0 0,0';
|
|
48
39
|
|
|
49
40
|
return (
|
|
50
|
-
<g
|
|
51
|
-
className={classNames(classes.point, disabled && classes.disabledSecondary, classes[correctness], className)}
|
|
52
|
-
{...rest}
|
|
53
|
-
>
|
|
41
|
+
<g className={className} {...rest}>
|
|
54
42
|
<polygon
|
|
55
43
|
points={points}
|
|
56
|
-
transform={`
|
|
57
|
-
translate(${scale.x(x)}, ${scale.y(y)})
|
|
58
|
-
rotate(${angle} 0 0)`}
|
|
44
|
+
transform={`translate(${scale.x(x)}, ${scale.y(y)}) rotate(${angle} 0 0)`}
|
|
59
45
|
/>
|
|
60
46
|
</g>
|
|
61
47
|
);
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import PropTypes from 'prop-types';
|
|
3
|
-
import classNames from 'classnames';
|
|
4
3
|
import { types } from '@pie-lib/plot';
|
|
5
4
|
import { ArrowHead } from '../arrow-head';
|
|
6
5
|
import { thinnerShapesNeeded } from '../../../utils';
|
|
7
6
|
|
|
8
|
-
export
|
|
7
|
+
export class BaseArrow extends React.Component {
|
|
9
8
|
static propTypes = {
|
|
10
|
-
classes: PropTypes.object,
|
|
11
9
|
className: PropTypes.string,
|
|
12
10
|
correctness: PropTypes.string,
|
|
13
11
|
disabled: PropTypes.bool,
|
|
@@ -18,8 +16,7 @@ export default class Arrow extends React.Component {
|
|
|
18
16
|
};
|
|
19
17
|
|
|
20
18
|
render() {
|
|
21
|
-
const {
|
|
22
|
-
|
|
19
|
+
const { className, angle, x, y, disabled, correctness, graphProps, ...rest } = this.props;
|
|
23
20
|
const size = thinnerShapesNeeded(graphProps) ? 12 : 14;
|
|
24
21
|
const { scale } = graphProps;
|
|
25
22
|
|
|
@@ -29,14 +26,11 @@ export default class Arrow extends React.Component {
|
|
|
29
26
|
const transform = `rotate(${-angle}, ${scaledX},${scaledY})`;
|
|
30
27
|
const points = `${scaledX},${scaledY}
|
|
31
28
|
${scaledX - size},${scaledY - size / 2}
|
|
32
|
-
${scaledX - size}
|
|
29
|
+
${scaledX - size},${scaledY + size / 2}`;
|
|
33
30
|
|
|
34
31
|
return (
|
|
35
|
-
<g
|
|
36
|
-
|
|
37
|
-
{...rest}
|
|
38
|
-
>
|
|
39
|
-
<ArrowHead size={size} transform={transform} points={points} />
|
|
32
|
+
<g className={className} {...rest}>
|
|
33
|
+
<ArrowHead size={size} transform={transform} points={points} correctness={correctness} />
|
|
40
34
|
</g>
|
|
41
35
|
);
|
|
42
36
|
}
|
|
@@ -1,35 +1,58 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import PropTypes from 'prop-types';
|
|
3
|
-
import classNames from 'classnames';
|
|
4
3
|
import { types } from '@pie-lib/plot';
|
|
5
|
-
import CoordinatesLabel from '../../../coordinates-label';
|
|
6
4
|
import ReactDOM from 'react-dom';
|
|
5
|
+
import { styled } from '@mui/material/styles';
|
|
6
|
+
|
|
7
|
+
import CoordinatesLabel from '../../../coordinates-label';
|
|
7
8
|
import { thinnerShapesNeeded } from '../../../utils';
|
|
8
9
|
import MissingSVG from '../icons/MissingSVG';
|
|
9
10
|
import CorrectSVG from '../icons/CorrectSVG';
|
|
10
11
|
import IncorrectSVG from '../icons/IncorrectSVG';
|
|
12
|
+
import * as styles from '../styles';
|
|
13
|
+
|
|
14
|
+
const StyledPointGroup = styled('g')(({ disabled, correctness }) => ({
|
|
15
|
+
cursor: 'pointer',
|
|
16
|
+
'& circle': {
|
|
17
|
+
fill: 'currentColor',
|
|
18
|
+
},
|
|
19
|
+
...(disabled && {
|
|
20
|
+
...styles.disabled('fill'),
|
|
21
|
+
...styles.disabled('color'),
|
|
22
|
+
}),
|
|
23
|
+
...(correctness === 'correct' && {
|
|
24
|
+
...styles.correct('fill'),
|
|
25
|
+
...styles.correct('color'),
|
|
26
|
+
}),
|
|
27
|
+
...(correctness === 'incorrect' && {
|
|
28
|
+
...styles.incorrect('fill'),
|
|
29
|
+
...styles.incorrect('color'),
|
|
30
|
+
}),
|
|
31
|
+
...(correctness === 'missing' && {
|
|
32
|
+
...styles.missing('fill'),
|
|
33
|
+
...styles.missing('color'),
|
|
34
|
+
}),
|
|
35
|
+
}));
|
|
11
36
|
|
|
12
37
|
export class RawBp extends React.Component {
|
|
13
38
|
static propTypes = {
|
|
14
|
-
classes: PropTypes.object,
|
|
15
39
|
className: PropTypes.string,
|
|
16
40
|
coordinatesOnHover: PropTypes.bool,
|
|
17
41
|
correctness: PropTypes.string,
|
|
18
42
|
disabled: PropTypes.bool,
|
|
19
43
|
labelNode: PropTypes.object,
|
|
20
|
-
x: PropTypes.number,
|
|
21
|
-
y: PropTypes.number,
|
|
44
|
+
x: PropTypes.number.isRequired,
|
|
45
|
+
y: PropTypes.number.isRequired,
|
|
22
46
|
graphProps: types.GraphPropsType.isRequired,
|
|
47
|
+
onClick: PropTypes.func,
|
|
48
|
+
onTouchStart: PropTypes.func,
|
|
49
|
+
onTouchEnd: PropTypes.func,
|
|
23
50
|
};
|
|
24
51
|
|
|
25
|
-
|
|
26
|
-
super(props);
|
|
27
|
-
this.state = { showCoordinates: false };
|
|
28
|
-
}
|
|
52
|
+
state = { showCoordinates: false };
|
|
29
53
|
|
|
30
54
|
render() {
|
|
31
55
|
const {
|
|
32
|
-
classes,
|
|
33
56
|
className,
|
|
34
57
|
coordinatesOnHover,
|
|
35
58
|
x,
|
|
@@ -38,19 +61,16 @@ export class RawBp extends React.Component {
|
|
|
38
61
|
correctness,
|
|
39
62
|
graphProps,
|
|
40
63
|
labelNode,
|
|
41
|
-
// we need to remove style from props
|
|
42
|
-
// eslint-disable-next-line no-unused-vars,react/prop-types
|
|
43
|
-
style,
|
|
44
64
|
onClick,
|
|
45
|
-
// Refactored RawBp component by isolating onTouchStart and onTouchEnd handlers to the outer circle, resolving erratic touch event behavior.
|
|
46
|
-
// Remaining props are now applied only to the inner circle for improved event handling consistency.
|
|
47
65
|
onTouchStart,
|
|
48
66
|
onTouchEnd,
|
|
49
67
|
...rest
|
|
50
68
|
} = this.props;
|
|
69
|
+
|
|
51
70
|
const { showCoordinates } = this.state;
|
|
52
71
|
const { scale } = graphProps;
|
|
53
72
|
const r = thinnerShapesNeeded(graphProps) ? 5 : 7;
|
|
73
|
+
|
|
54
74
|
let SvgComponent;
|
|
55
75
|
switch (correctness) {
|
|
56
76
|
case 'missing':
|
|
@@ -64,11 +84,11 @@ export class RawBp extends React.Component {
|
|
|
64
84
|
break;
|
|
65
85
|
default:
|
|
66
86
|
SvgComponent = null;
|
|
67
|
-
break;
|
|
68
87
|
}
|
|
69
88
|
|
|
70
89
|
return (
|
|
71
90
|
<>
|
|
91
|
+
{/* Outer invisible circle for easier touch/click */}
|
|
72
92
|
<circle
|
|
73
93
|
style={{ fill: 'transparent', cursor: 'pointer', pointerEvents: 'all' }}
|
|
74
94
|
r={r * 3}
|
|
@@ -80,8 +100,11 @@ export class RawBp extends React.Component {
|
|
|
80
100
|
onTouchEnd={onTouchEnd}
|
|
81
101
|
onClick={onClick}
|
|
82
102
|
/>
|
|
83
|
-
|
|
84
|
-
|
|
103
|
+
{/* Actual point */}
|
|
104
|
+
<StyledPointGroup
|
|
105
|
+
className={className}
|
|
106
|
+
disabled={disabled}
|
|
107
|
+
correctness={correctness}
|
|
85
108
|
onMouseEnter={() => this.setState({ showCoordinates: true })}
|
|
86
109
|
onMouseLeave={() => this.setState({ showCoordinates: false })}
|
|
87
110
|
>
|
|
@@ -91,7 +114,7 @@ export class RawBp extends React.Component {
|
|
|
91
114
|
coordinatesOnHover &&
|
|
92
115
|
showCoordinates &&
|
|
93
116
|
ReactDOM.createPortal(<CoordinatesLabel graphProps={graphProps} x={x} y={y} />, labelNode)}
|
|
94
|
-
</
|
|
117
|
+
</StyledPointGroup>
|
|
95
118
|
</>
|
|
96
119
|
);
|
|
97
120
|
}
|