@pie-lib/graphing 2.34.2-next.0 → 2.36.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.
Files changed (155) hide show
  1. package/CHANGELOG.md +16 -6
  2. package/lib/axis/arrow.js +19 -55
  3. package/lib/axis/arrow.js.map +1 -1
  4. package/lib/axis/axes.js +104 -186
  5. package/lib/axis/axes.js.map +1 -1
  6. package/lib/axis/index.js +1 -6
  7. package/lib/axis/index.js.map +1 -1
  8. package/lib/bg.js +21 -49
  9. package/lib/bg.js.map +1 -1
  10. package/lib/container/actions.js +2 -8
  11. package/lib/container/actions.js.map +1 -1
  12. package/lib/container/index.js +14 -59
  13. package/lib/container/index.js.map +1 -1
  14. package/lib/container/marks.js +1 -6
  15. package/lib/container/marks.js.map +1 -1
  16. package/lib/container/middleware.js +2 -8
  17. package/lib/container/middleware.js.map +1 -1
  18. package/lib/container/reducer.js +1 -8
  19. package/lib/container/reducer.js.map +1 -1
  20. package/lib/coordinates-label.js +23 -55
  21. package/lib/coordinates-label.js.map +1 -1
  22. package/lib/graph-with-controls.js +120 -184
  23. package/lib/graph-with-controls.js.map +1 -1
  24. package/lib/graph.js +59 -116
  25. package/lib/graph.js.map +1 -1
  26. package/lib/grid-setup.js +174 -224
  27. package/lib/grid-setup.js.map +1 -1
  28. package/lib/grid.js +28 -73
  29. package/lib/grid.js.map +1 -1
  30. package/lib/index.js +1 -13
  31. package/lib/index.js.map +1 -1
  32. package/lib/key-legend.js +41 -85
  33. package/lib/key-legend.js.map +1 -1
  34. package/lib/label-svg-icon.js +1 -7
  35. package/lib/label-svg-icon.js.map +1 -1
  36. package/lib/labels.js +61 -119
  37. package/lib/labels.js.map +1 -1
  38. package/lib/mark-label.js +113 -163
  39. package/lib/mark-label.js.map +1 -1
  40. package/lib/toggle-bar.js +158 -242
  41. package/lib/toggle-bar.js.map +1 -1
  42. package/lib/tool-menu.js +16 -48
  43. package/lib/tool-menu.js.map +1 -1
  44. package/lib/tools/absolute/component.js +4 -10
  45. package/lib/tools/absolute/component.js.map +1 -1
  46. package/lib/tools/absolute/index.js +3 -16
  47. package/lib/tools/absolute/index.js.map +1 -1
  48. package/lib/tools/circle/bg-circle.js +42 -92
  49. package/lib/tools/circle/bg-circle.js.map +1 -1
  50. package/lib/tools/circle/component.js +79 -165
  51. package/lib/tools/circle/component.js.map +1 -1
  52. package/lib/tools/circle/index.js +3 -13
  53. package/lib/tools/circle/index.js.map +1 -1
  54. package/lib/tools/exponential/component.js +4 -10
  55. package/lib/tools/exponential/component.js.map +1 -1
  56. package/lib/tools/exponential/index.js +3 -18
  57. package/lib/tools/exponential/index.js.map +1 -1
  58. package/lib/tools/index.js +3 -16
  59. package/lib/tools/index.js.map +1 -1
  60. package/lib/tools/line/component.js +27 -48
  61. package/lib/tools/line/component.js.map +1 -1
  62. package/lib/tools/line/index.js +1 -6
  63. package/lib/tools/line/index.js.map +1 -1
  64. package/lib/tools/parabola/component.js +4 -10
  65. package/lib/tools/parabola/component.js.map +1 -1
  66. package/lib/tools/parabola/index.js +3 -16
  67. package/lib/tools/parabola/index.js.map +1 -1
  68. package/lib/tools/point/component.js +24 -71
  69. package/lib/tools/point/component.js.map +1 -1
  70. package/lib/tools/point/index.js +3 -11
  71. package/lib/tools/point/index.js.map +1 -1
  72. package/lib/tools/polygon/component.js +82 -183
  73. package/lib/tools/polygon/component.js.map +1 -1
  74. package/lib/tools/polygon/index.js +6 -23
  75. package/lib/tools/polygon/index.js.map +1 -1
  76. package/lib/tools/polygon/line.js +48 -91
  77. package/lib/tools/polygon/line.js.map +1 -1
  78. package/lib/tools/polygon/polygon.js +65 -98
  79. package/lib/tools/polygon/polygon.js.map +1 -1
  80. package/lib/tools/ray/component.js +41 -60
  81. package/lib/tools/ray/component.js.map +1 -1
  82. package/lib/tools/ray/index.js +1 -6
  83. package/lib/tools/ray/index.js.map +1 -1
  84. package/lib/tools/segment/component.js +25 -43
  85. package/lib/tools/segment/component.js.map +1 -1
  86. package/lib/tools/segment/index.js +1 -6
  87. package/lib/tools/segment/index.js.map +1 -1
  88. package/lib/tools/shared/arrow-head.js +69 -28
  89. package/lib/tools/shared/arrow-head.js.map +1 -1
  90. package/lib/tools/shared/icons/CorrectSVG.js +3 -8
  91. package/lib/tools/shared/icons/CorrectSVG.js.map +1 -1
  92. package/lib/tools/shared/icons/IncorrectSVG.js +3 -8
  93. package/lib/tools/shared/icons/IncorrectSVG.js.map +1 -1
  94. package/lib/tools/shared/icons/MissingSVG.js +3 -8
  95. package/lib/tools/shared/icons/MissingSVG.js.map +1 -1
  96. package/lib/tools/shared/line/index.js +126 -187
  97. package/lib/tools/shared/line/index.js.map +1 -1
  98. package/lib/tools/shared/line/line-path.js +70 -100
  99. package/lib/tools/shared/line/line-path.js.map +1 -1
  100. package/lib/tools/shared/line/with-root-edge.js +21 -55
  101. package/lib/tools/shared/line/with-root-edge.js.map +1 -1
  102. package/lib/tools/shared/point/arrow-point.js +23 -62
  103. package/lib/tools/shared/point/arrow-point.js.map +1 -1
  104. package/lib/tools/shared/point/arrow.js +24 -52
  105. package/lib/tools/shared/point/arrow.js.map +1 -1
  106. package/lib/tools/shared/point/base-point.js +54 -72
  107. package/lib/tools/shared/point/base-point.js.map +1 -1
  108. package/lib/tools/shared/point/index.js +22 -57
  109. package/lib/tools/shared/point/index.js.map +1 -1
  110. package/lib/tools/shared/styles.js +10 -38
  111. package/lib/tools/shared/styles.js.map +1 -1
  112. package/lib/tools/shared/types.js +2 -9
  113. package/lib/tools/shared/types.js.map +1 -1
  114. package/lib/tools/sine/component.js +8 -19
  115. package/lib/tools/sine/component.js.map +1 -1
  116. package/lib/tools/sine/index.js +3 -16
  117. package/lib/tools/sine/index.js.map +1 -1
  118. package/lib/tools/vector/component.js +24 -44
  119. package/lib/tools/vector/component.js.map +1 -1
  120. package/lib/tools/vector/index.js +1 -6
  121. package/lib/tools/vector/index.js.map +1 -1
  122. package/lib/undo-redo.js +29 -69
  123. package/lib/undo-redo.js.map +1 -1
  124. package/lib/use-debounce.js +4 -11
  125. package/lib/use-debounce.js.map +1 -1
  126. package/lib/utils.js +51 -128
  127. package/lib/utils.js.map +1 -1
  128. package/package.json +16 -13
  129. package/src/axis/arrow.jsx +7 -12
  130. package/src/axis/axes.jsx +40 -45
  131. package/src/coordinates-label.jsx +13 -18
  132. package/src/graph-with-controls.jsx +52 -59
  133. package/src/grid-setup.jsx +210 -206
  134. package/src/grid.jsx +1 -3
  135. package/src/key-legend.jsx +52 -56
  136. package/src/labels.jsx +21 -30
  137. package/src/mark-label.jsx +83 -81
  138. package/src/toggle-bar.jsx +155 -166
  139. package/src/tools/circle/bg-circle.jsx +20 -28
  140. package/src/tools/circle/component.jsx +28 -63
  141. package/src/tools/line/component.jsx +22 -15
  142. package/src/tools/polygon/component.jsx +1 -2
  143. package/src/tools/polygon/line.jsx +28 -32
  144. package/src/tools/polygon/polygon.jsx +52 -45
  145. package/src/tools/ray/component.jsx +38 -25
  146. package/src/tools/segment/component.jsx +19 -18
  147. package/src/tools/shared/arrow-head.jsx +60 -7
  148. package/src/tools/shared/line/index.jsx +39 -2
  149. package/src/tools/shared/line/line-path.jsx +54 -58
  150. package/src/tools/shared/point/arrow-point.jsx +10 -24
  151. package/src/tools/shared/point/arrow.jsx +5 -11
  152. package/src/tools/shared/point/base-point.jsx +42 -19
  153. package/src/tools/shared/point/index.jsx +27 -44
  154. package/src/tools/vector/component.jsx +11 -16
  155. 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 { withStyles } from '@material-ui/core/styles';
7
- import classNames from 'classnames';
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, classes, correctness, disabled, graphProps, from, to, ...rest } = props;
19
+ const { className, correctness, disabled, graphProps, from, to, ...rest } = props;
19
20
  const { scale } = graphProps;
20
21
 
21
22
  return (
22
- <line
23
+ <StyledLineRoot
23
24
  stroke="green"
24
- strokeWidth="6"
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={classNames(classes.line, disabled && classes.disabledSecondary, classes[correctness], 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 StyledLine = withStyles(lineStyles)(Line);
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
- export const ArrowHead = ({ size, transform, points }) => (
5
- <polygon points={points || `0,0 ${size},${size / 2} 0,${size}`} transform={transform} />
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
- <marker
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
- className={className}
81
+ disabled={isDisabled}
82
+ correctness={parsedCorrectness}
32
83
  >
33
- <ArrowHead size={size} />
34
- </marker>
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
- <g>
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
- </g>
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 { withStyles } from '@material-ui/core/styles';
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, classes, className, disabled, correctness, from, to, graphProps, isDragging, ...rest } = this.props;
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
- <vx.LinePath
75
+ <StyledDrawLine
36
76
  data={data}
37
- className={classNames(
38
- classes.drawLine,
39
- disabled && classes.disabledSecondary,
40
- classes[correctness],
41
- className,
42
- )}
77
+ className={className}
78
+ disabled={disabled}
79
+ correctness={correctness}
43
80
  {...rest}
44
81
  />
45
- <vx.LinePath
82
+ <StyledLine
46
83
  data={data}
47
- className={classNames(
48
- classes.line,
49
- isDragging && classes.dragging,
50
- disabled && classes.disabledSecondary,
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 dragging = () => ({
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 { classes, className, x, y, disabled, correctness, graphProps, from, to, ...rest } = this.props;
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
- let points = '';
33
+ const angle = from && to ? getAngleDeg(from.x, from.y, to.x, to.y) : 0;
41
34
 
42
- if (isEqual(from, to)) {
43
- points = '0,0 0,0 0,0';
44
- } else {
45
- points = `0,0 ${arrowDimensions.vector},${arrowDimensions.vector * 2}
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 default class Arrow extends React.Component {
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 { classes, angle, className, x, y, disabled, correctness, graphProps, ...rest } = this.props;
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}, ${scaledY + size / 2}`;
29
+ ${scaledX - size},${scaledY + size / 2}`;
33
30
 
34
31
  return (
35
- <g
36
- className={classNames(classes.point, disabled && classes.disabledSecondary, classes[correctness], className)}
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
- constructor(props) {
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
- <g
84
- className={classNames(classes.point, disabled && classes.disabledSecondary, classes[correctness], className)}
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
- </g>
117
+ </StyledPointGroup>
95
118
  </>
96
119
  );
97
120
  }