@khanacademy/perseus-editor 2.15.3 → 2.15.5

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 (61) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/dist/editor-page.d.ts +4 -10
  3. package/dist/editor.d.ts +2 -2
  4. package/dist/es/index.js +362 -360
  5. package/dist/es/index.js.map +1 -1
  6. package/dist/index.js +426 -425
  7. package/dist/index.js.map +1 -1
  8. package/dist/widgets/interaction-editor/function-editor.d.ts +26 -0
  9. package/dist/widgets/interaction-editor/index.d.ts +2 -0
  10. package/dist/widgets/interaction-editor/label-editor.d.ts +22 -0
  11. package/dist/widgets/interaction-editor/line-editor.d.ts +30 -0
  12. package/dist/widgets/interaction-editor/movable-line-editor.d.ts +32 -0
  13. package/dist/widgets/interaction-editor/movable-point-editor.d.ts +28 -0
  14. package/dist/widgets/interaction-editor/parametric-editor.d.ts +28 -0
  15. package/dist/widgets/interaction-editor/point-editor.d.ts +20 -0
  16. package/dist/widgets/interaction-editor/rectangle-editor.d.ts +24 -0
  17. package/dist/widgets/interactive-graph-editor.d.ts +92 -92
  18. package/package.json +2 -2
  19. package/src/__stories__/editor-page.stories.tsx +65 -0
  20. package/src/__stories__/editor.stories.tsx +2 -4
  21. package/src/editor-page.tsx +5 -11
  22. package/src/editor.tsx +2 -2
  23. package/src/widgets/__stories__/categorizer-editor.stories.tsx +24 -0
  24. package/src/widgets/__stories__/definition-editor.stories.tsx +18 -0
  25. package/src/widgets/__stories__/dropdown-editor.stories.tsx +18 -0
  26. package/src/widgets/__stories__/explanation-editor.stories.tsx +18 -0
  27. package/src/widgets/__stories__/input-number-editor.stories.tsx +18 -0
  28. package/src/widgets/__stories__/interaction-editor.stories.tsx +24 -0
  29. package/src/widgets/__stories__/matcher-editor.stories.tsx +18 -0
  30. package/src/widgets/__stories__/number-line-editor.stories.tsx +18 -0
  31. package/src/widgets/__stories__/numeric-input-editor.stories.tsx +18 -0
  32. package/src/widgets/__stories__/radio-editor.stories.tsx +3 -3
  33. package/src/widgets/__stories__/sorter-editor.stories.tsx +18 -0
  34. package/src/widgets/__tests__/categorizer-editor.test.tsx +51 -0
  35. package/src/widgets/__tests__/definition-editor.test.tsx +41 -0
  36. package/src/widgets/__tests__/dropdown-editor.test.tsx +57 -0
  37. package/src/widgets/__tests__/explanation-editor.test.tsx +59 -0
  38. package/src/widgets/__tests__/input-number-editor.test.tsx +128 -0
  39. package/src/widgets/__tests__/matcher-editor.test.tsx +47 -0
  40. package/src/widgets/__tests__/number-line-editor.test.tsx +144 -0
  41. package/src/widgets/__tests__/numeric-input-editor.test.tsx +177 -0
  42. package/src/widgets/__tests__/radio-editor.test.tsx +118 -0
  43. package/src/widgets/__tests__/sorter-editor.test.tsx +55 -0
  44. package/src/widgets/dropdown-editor.tsx +1 -0
  45. package/src/widgets/input-number-editor.tsx +2 -0
  46. package/src/widgets/interaction-editor/function-editor.tsx +111 -0
  47. package/src/widgets/interaction-editor/index.ts +3 -0
  48. package/src/widgets/{interaction-editor.tsx → interaction-editor/interaction-editor.tsx} +14 -768
  49. package/src/widgets/interaction-editor/label-editor.tsx +91 -0
  50. package/src/widgets/interaction-editor/line-editor.tsx +129 -0
  51. package/src/widgets/interaction-editor/movable-line-editor.tsx +125 -0
  52. package/src/widgets/interaction-editor/movable-point-editor.tsx +92 -0
  53. package/src/widgets/interaction-editor/parametric-editor.tsx +122 -0
  54. package/src/widgets/interaction-editor/point-editor.tsx +79 -0
  55. package/src/widgets/interaction-editor/rectangle-editor.tsx +105 -0
  56. package/src/widgets/number-line-editor.tsx +16 -5
  57. package/src/widgets/numeric-input-editor.tsx +2 -0
  58. package/tsconfig-build.tsbuildinfo +1 -1
  59. package/dist/widgets/{interaction → interaction-editor}/constraint-editor.d.ts +0 -0
  60. package/dist/widgets/{interaction-editor.d.ts → interaction-editor/interaction-editor.d.ts} +1 -1
  61. /package/src/widgets/{interaction → interaction-editor}/constraint-editor.tsx +0 -0
@@ -1,26 +1,27 @@
1
1
  /* eslint-disable @khanacademy/ts-no-error-suppressions */
2
- /* eslint-disable @babel/no-invalid-this, react/no-unsafe, react/sort-comp */
2
+ /* eslint-disable @babel/no-invalid-this, react/no-unsafe */
3
3
  import {
4
- components,
5
4
  Changeable,
6
5
  Dependencies,
7
6
  EditorJsonify,
8
- KhanColors,
9
7
  Util,
10
- ArrowPicker,
11
- ColorPicker,
12
- DashPicker,
13
8
  ElementContainer,
14
9
  } from "@khanacademy/perseus";
15
10
  import PropTypes from "prop-types";
16
11
  import * as React from "react";
17
12
  import _ from "underscore";
18
13
 
19
- import GraphSettings from "../components/graph-settings";
14
+ import GraphSettings from "../../components/graph-settings";
20
15
 
21
- import ConstraintEditor from "./interaction/constraint-editor";
16
+ import FunctionEditor from "./function-editor";
17
+ import LabelEditor from "./label-editor";
18
+ import LineEditor from "./line-editor";
19
+ import MovableLineEditor from "./movable-line-editor";
20
+ import MovablePointEditor from "./movable-point-editor";
21
+ import ParametricEditor from "./parametric-editor";
22
+ import PointEditor from "./point-editor";
23
+ import RectangleEditor from "./rectangle-editor";
22
24
 
23
- const {MathInput, NumberInput, TextInput} = components;
24
25
  const {getDependencies} = Dependencies;
25
26
  const {unescapeMathMode} = Util;
26
27
 
@@ -39,761 +40,6 @@ const defaultInteractionProps = {
39
40
  elements: [],
40
41
  } as const;
41
42
 
42
- type PointEditorProps = any;
43
-
44
- //
45
- // Editor for non-interactive points
46
- //
47
- // TODO(eater): Factor this out
48
- //
49
- class PointEditor extends React.Component<PointEditorProps> {
50
- static propTypes = {
51
- ...Changeable.propTypes,
52
- coordX: PropTypes.string,
53
- coordY: PropTypes.string,
54
- color: PropTypes.string,
55
- };
56
-
57
- static defaultProps = {
58
- coordX: "0",
59
- coordY: "0",
60
- color: KhanColors.BLACK,
61
- };
62
-
63
- render(): React.ReactNode {
64
- const {TeX} = getDependencies();
65
- const analyticsStub = {onAnalyticsEvent: () => Promise.resolve()};
66
-
67
- return (
68
- <div className="graph-settings">
69
- <div className="perseus-widget-row">
70
- Coordinate: <TeX>\Large(</TeX>
71
- <MathInput
72
- buttonsVisible="never"
73
- value={this.props.coordX}
74
- // @ts-expect-error - TS2554 - Expected 3 arguments, but got 1.
75
- onChange={this.change("coordX")}
76
- analytics={analyticsStub}
77
- />
78
- <TeX>,</TeX>{" "}
79
- <MathInput
80
- buttonsVisible="never"
81
- value={this.props.coordY}
82
- // @ts-expect-error - TS2554 - Expected 3 arguments, but got 1.
83
- onChange={this.change("coordY")}
84
- analytics={analyticsStub}
85
- />
86
- <TeX>\Large)</TeX>
87
- </div>
88
- <div className="perseus-widget-row">
89
- <ColorPicker
90
- value={this.props.color}
91
- // @ts-expect-error - TS2554 - Expected 3 arguments, but got 1.
92
- onChange={this.change("color")}
93
- />
94
- </div>
95
- </div>
96
- );
97
- }
98
-
99
- change: (arg1: any, arg2: any, arg3: any) => any = (...args) => {
100
- return Changeable.change.apply(this, args);
101
- };
102
-
103
- serialize = () => {
104
- return EditorJsonify.serialize.call(this);
105
- };
106
- }
107
-
108
- type LineEditorProps = any;
109
-
110
- //
111
- // Editor for non-interactive line segments
112
- //
113
- // TODO(eater): Factor this out
114
- //
115
- class LineEditor extends React.Component<LineEditorProps> {
116
- static propTypes = {
117
- ...Changeable.propTypes,
118
- startX: PropTypes.string,
119
- startY: PropTypes.string,
120
- endX: PropTypes.string,
121
- endY: PropTypes.string,
122
- color: PropTypes.string,
123
- strokeDasharray: PropTypes.string,
124
- arrows: PropTypes.string,
125
- strokeWidth: PropTypes.number,
126
- };
127
-
128
- static defaultProps = {
129
- startX: "-5",
130
- startY: "5",
131
- endX: "5",
132
- endY: "5",
133
- color: KhanColors.BLACK,
134
- strokeDasharray: "",
135
- arrows: "",
136
- strokeWidth: 2,
137
- };
138
-
139
- render(): React.ReactNode {
140
- const {TeX} = getDependencies();
141
- const analyticsStub = {onAnalyticsEvent: () => Promise.resolve()};
142
-
143
- return (
144
- <div className="graph-settings">
145
- <div className="perseus-widget-row">
146
- Start: <TeX>\Large(</TeX>
147
- <MathInput
148
- buttonsVisible="never"
149
- value={this.props.startX}
150
- // @ts-expect-error - TS2554 - Expected 3 arguments, but got 1.
151
- onChange={this.change("startX")}
152
- analytics={analyticsStub}
153
- />
154
- <TeX>,</TeX>{" "}
155
- <MathInput
156
- buttonsVisible="never"
157
- value={this.props.startY}
158
- // @ts-expect-error - TS2554 - Expected 3 arguments, but got 1.
159
- onChange={this.change("startY")}
160
- analytics={analyticsStub}
161
- />
162
- <TeX>\Large)</TeX>
163
- </div>
164
- <div className="perseus-widget-row">
165
- End: <TeX>\Large(</TeX>
166
- <MathInput
167
- buttonsVisible="never"
168
- value={this.props.endX}
169
- // @ts-expect-error - TS2554 - Expected 3 arguments, but got 1.
170
- onChange={this.change("endX")}
171
- analytics={analyticsStub}
172
- />
173
- <TeX>,</TeX>{" "}
174
- <MathInput
175
- buttonsVisible="never"
176
- value={this.props.endY}
177
- // @ts-expect-error - TS2554 - Expected 3 arguments, but got 1.
178
- onChange={this.change("endY")}
179
- analytics={analyticsStub}
180
- />
181
- <TeX>\Large)</TeX>
182
- </div>
183
- <div className="perseus-widget-row">
184
- <ColorPicker
185
- value={this.props.color}
186
- // @ts-expect-error - TS2554 - Expected 3 arguments, but got 1.
187
- onChange={this.change("color")}
188
- />
189
- </div>
190
- <div className="perseus-widget-row">
191
- <DashPicker
192
- value={this.props.strokeDasharray}
193
- // @ts-expect-error - TS2554 - Expected 3 arguments, but got 1.
194
- onChange={this.change("strokeDasharray")}
195
- />
196
- &nbsp; &nbsp;
197
- <ArrowPicker
198
- value={this.props.arrows}
199
- // @ts-expect-error - TS2554 - Expected 3 arguments, but got 1.
200
- onChange={this.change("arrows")}
201
- />
202
- </div>
203
- <div className="perseus-widget-row">
204
- <div className="perseus-widget-left-col">
205
- Width:{" "}
206
- <NumberInput
207
- value={this.props.strokeWidth}
208
- placeholder={2}
209
- // @ts-expect-error - TS2554 - Expected 3 arguments, but got 1.
210
- onChange={this.change("strokeWidth")}
211
- />
212
- </div>
213
- </div>
214
- </div>
215
- );
216
- }
217
-
218
- change: (arg1: any, arg2: any, arg3: any) => any = (...args) => {
219
- return Changeable.change.apply(this, args);
220
- };
221
-
222
- serialize = () => {
223
- return EditorJsonify.serialize.call(this);
224
- };
225
- }
226
-
227
- type MovablePointEditorProps = any;
228
-
229
- //
230
- // Editor for interactive movable points
231
- //
232
- // TODO(eater): Factor this out
233
- // TODO(eater): Rethink how constraints are represented
234
- //
235
- class MovablePointEditor extends React.Component<MovablePointEditorProps> {
236
- static propTypes = {
237
- ...Changeable.propTypes,
238
- startX: PropTypes.string,
239
- startY: PropTypes.string,
240
- constraint: PropTypes.string,
241
- snap: PropTypes.number,
242
- constraintFn: PropTypes.string,
243
- };
244
-
245
- static defaultProps = {
246
- startX: "0",
247
- startY: "0",
248
- constraint: "none",
249
- snap: 0.5,
250
- constraintFn: "0",
251
- constraintXMin: "-10",
252
- constraintXMax: "10",
253
- constraintYMin: "-10",
254
- constraintYMax: "10",
255
- };
256
-
257
- render(): React.ReactNode {
258
- const {TeX} = getDependencies();
259
- const analyticsStub = {onAnalyticsEvent: () => Promise.resolve()};
260
-
261
- return (
262
- <div className="graph-settings">
263
- <div className="perseus-widget-row">
264
- Start: <TeX>\Large(</TeX>
265
- <MathInput
266
- buttonsVisible="never"
267
- value={this.props.startX}
268
- onChange={this.change("startX")}
269
- analytics={analyticsStub}
270
- />
271
- <TeX>,</TeX>{" "}
272
- <MathInput
273
- buttonsVisible="never"
274
- value={this.props.startY}
275
- onChange={this.change("startY")}
276
- analytics={analyticsStub}
277
- />
278
- <TeX>\Large)</TeX>
279
- </div>
280
- <div className="perseus-widget-row">
281
- Update <TeX>(x_n, y_n)</TeX> for <TeX>n =</TeX>{" "}
282
- <NumberInput
283
- value={this.props.varSubscript}
284
- placeholder={0}
285
- onChange={this.change("varSubscript")}
286
- />
287
- </div>
288
- {/* @ts-expect-error - TS2769 - No overload matches this call. */}
289
- <ConstraintEditor {...this.props} />
290
- </div>
291
- );
292
- }
293
-
294
- change = (...args) => {
295
- return Changeable.change.apply(this, args);
296
- };
297
-
298
- serialize = () => {
299
- return EditorJsonify.serialize.call(this);
300
- };
301
- }
302
-
303
- type MovableLineEditorProps = any;
304
-
305
- //
306
- // Editor for interactive movable line segments
307
- //
308
- // TODO(eater): Factor this out
309
- // TODO(eater): Rethink how constraints are represented
310
- //
311
- class MovableLineEditor extends React.Component<MovableLineEditorProps> {
312
- static propTypes = {
313
- ...Changeable.propTypes,
314
- startX: PropTypes.string,
315
- startY: PropTypes.string,
316
- endX: PropTypes.string,
317
- endY: PropTypes.string,
318
- constraint: PropTypes.string,
319
- snap: PropTypes.number,
320
- constraintFn: PropTypes.string,
321
- };
322
-
323
- static defaultProps = {
324
- startX: "-5",
325
- startY: "5",
326
- endX: "5",
327
- endY: "5",
328
- constraint: "none",
329
- snap: 0.5,
330
- constraintFn: "0",
331
- constraintXMin: "-10",
332
- constraintXMax: "10",
333
- constraintYMin: "-10",
334
- constraintYMax: "10",
335
- };
336
-
337
- render(): React.ReactNode {
338
- const {TeX} = getDependencies();
339
- const analyticsStub = {onAnalyticsEvent: () => Promise.resolve()};
340
-
341
- return (
342
- <div className="graph-settings">
343
- Initial position:
344
- <div className="perseus-widget-row">
345
- Start: <TeX>\Large(</TeX>
346
- <MathInput
347
- buttonsVisible="never"
348
- value={this.props.startX}
349
- onChange={this.change("startX")}
350
- analytics={analyticsStub}
351
- />
352
- <TeX>,</TeX>{" "}
353
- <MathInput
354
- buttonsVisible="never"
355
- value={this.props.startY}
356
- onChange={this.change("startY")}
357
- analytics={analyticsStub}
358
- />
359
- <TeX>\Large)</TeX>
360
- </div>
361
- <div className="perseus-widget-row">
362
- End: <TeX>\Large(</TeX>
363
- <MathInput
364
- buttonsVisible="never"
365
- value={this.props.endX}
366
- onChange={this.change("endX")}
367
- analytics={analyticsStub}
368
- />
369
- <TeX>,</TeX>{" "}
370
- <MathInput
371
- buttonsVisible="never"
372
- value={this.props.endY}
373
- onChange={this.change("endY")}
374
- analytics={analyticsStub}
375
- />
376
- <TeX>\Large)</TeX>
377
- </div>
378
- <div className="perseus-widget-row">
379
- Start updates <TeX>(x_n, y_n)</TeX> for <TeX>n =</TeX>
380
- <NumberInput
381
- value={this.props.startSubscript}
382
- placeholder={0}
383
- onChange={this.change("startSubscript")}
384
- />
385
- </div>
386
- <div className="perseus-widget-row">
387
- End updates <TeX>(x_m, y_m)</TeX> for <TeX>m =</TeX>
388
- <NumberInput
389
- value={this.props.endSubscript}
390
- placeholder={0}
391
- onChange={this.change("endSubscript")}
392
- />
393
- </div>
394
- <div className="perseus-widget-row">
395
- All constraints are applied to the start point.
396
- </div>
397
- {/* @ts-expect-error - TS2769 - No overload matches this call. */}
398
- <ConstraintEditor {...this.props} />
399
- </div>
400
- );
401
- }
402
-
403
- change = (...args) => {
404
- return Changeable.change.apply(this, args);
405
- };
406
-
407
- serialize = () => {
408
- return EditorJsonify.serialize.call(this);
409
- };
410
- }
411
-
412
- type FunctionEditorProps = any;
413
-
414
- //
415
- // Editor for function plots
416
- //
417
- // TODO(eater): Factor this out
418
- //
419
- class FunctionEditor extends React.Component<FunctionEditorProps> {
420
- static propTypes = {
421
- ...Changeable.propTypes,
422
- value: PropTypes.string,
423
- rangeMin: PropTypes.string,
424
- rangeMax: PropTypes.string,
425
- color: PropTypes.string,
426
- strokeDashArray: PropTypes.string,
427
- strokeWidth: PropTypes.number,
428
- };
429
-
430
- static defaultProps = {
431
- value: "x",
432
- rangeMin: "-10",
433
- rangeMax: "10",
434
- color: KhanColors.BLUE,
435
- strokeDasharray: "",
436
- strokeWidth: 2,
437
- };
438
-
439
- render(): React.ReactNode {
440
- const {TeX} = getDependencies();
441
- const analyticsStub = {onAnalyticsEvent: () => Promise.resolve()};
442
-
443
- return (
444
- <div className="graph-settings">
445
- <div className="perseus-widget-row">
446
- <TeX>{this.props.funcName + "(x)="}</TeX>{" "}
447
- <MathInput
448
- buttonsVisible="never"
449
- value={this.props.value}
450
- // @ts-expect-error - TS2554 - Expected 3 arguments, but got 1.
451
- onChange={this.change("value")}
452
- analytics={analyticsStub}
453
- />
454
- </div>
455
- <div className="perseus-widget-row">
456
- Range: <TeX>\Large(</TeX>
457
- <MathInput
458
- buttonsVisible="never"
459
- value={this.props.rangeMin}
460
- // @ts-expect-error - TS2554 - Expected 3 arguments, but got 1.
461
- onChange={this.change("rangeMin")}
462
- analytics={analyticsStub}
463
- />
464
- <TeX>,</TeX>{" "}
465
- <MathInput
466
- buttonsVisible="never"
467
- value={this.props.rangeMax}
468
- // @ts-expect-error - TS2554 - Expected 3 arguments, but got 1.
469
- onChange={this.change("rangeMax")}
470
- analytics={analyticsStub}
471
- />
472
- <TeX>\Large)</TeX>
473
- </div>
474
- <div className="perseus-widget-row">
475
- <ColorPicker
476
- value={this.props.color}
477
- // @ts-expect-error - TS2554 - Expected 3 arguments, but got 1.
478
- onChange={this.change("color")}
479
- />
480
- </div>
481
- <div className="perseus-widget-row">
482
- <DashPicker
483
- value={this.props.strokeDasharray}
484
- // @ts-expect-error - TS2554 - Expected 3 arguments, but got 1.
485
- onChange={this.change("strokeDasharray")}
486
- />
487
- </div>
488
- <div className="perseus-widget-row">
489
- <div className="perseus-widget-left-col">
490
- Width:{" "}
491
- <NumberInput
492
- value={this.props.strokeWidth}
493
- placeholder={2}
494
- // @ts-expect-error - TS2554 - Expected 3 arguments, but got 1.
495
- onChange={this.change("strokeWidth")}
496
- />
497
- </div>
498
- </div>
499
- </div>
500
- );
501
- }
502
-
503
- change: (arg1: any, arg2: any, arg3: any) => any = (...args) => {
504
- return Changeable.change.apply(this, args);
505
- };
506
-
507
- serialize = () => {
508
- return EditorJsonify.serialize.call(this);
509
- };
510
- }
511
-
512
- type ParametricEditorProps = any;
513
-
514
- //
515
- // Editor for parametric plots
516
- //
517
- // TODO(eater): Factor this out
518
- //
519
- class ParametricEditor extends React.Component<ParametricEditorProps> {
520
- static propTypes = {
521
- ...Changeable.propTypes,
522
- x: PropTypes.string,
523
- y: PropTypes.string,
524
- rangeMin: PropTypes.string,
525
- rangeMax: PropTypes.string,
526
- color: PropTypes.string,
527
- strokeDashArray: PropTypes.string,
528
- strokeWidth: PropTypes.number,
529
- };
530
-
531
- static defaultProps = {
532
- x: "cos(t)",
533
- y: "sin(t)",
534
- rangeMin: "0",
535
- rangeMax: "2\\pi",
536
- color: KhanColors.BLUE,
537
- strokeDasharray: "",
538
- strokeWidth: 2,
539
- };
540
-
541
- render(): React.ReactNode {
542
- const {TeX} = getDependencies();
543
- const analyticsStub = {onAnalyticsEvent: () => Promise.resolve()};
544
-
545
- return (
546
- <div className="graph-settings">
547
- <div className="perseus-widget-row">
548
- <TeX>X(t) =</TeX>{" "}
549
- <MathInput
550
- buttonsVisible="never"
551
- value={this.props.x}
552
- // @ts-expect-error - TS2554 - Expected 3 arguments, but got 1.
553
- onChange={this.change("x")}
554
- analytics={analyticsStub}
555
- />
556
- </div>
557
- <div className="perseus-widget-row">
558
- <TeX>Y(t) =</TeX>{" "}
559
- <MathInput
560
- buttonsVisible="never"
561
- value={this.props.y}
562
- // @ts-expect-error - TS2554 - Expected 3 arguments, but got 1.
563
- onChange={this.change("y")}
564
- analytics={analyticsStub}
565
- />
566
- </div>
567
- <div className="perseus-widget-row">
568
- Range: <TeX>\Large(</TeX>
569
- <MathInput
570
- buttonsVisible="never"
571
- value={this.props.rangeMin}
572
- // @ts-expect-error - TS2554 - Expected 3 arguments, but got 1.
573
- onChange={this.change("rangeMin")}
574
- analytics={analyticsStub}
575
- />
576
- <TeX>,</TeX>{" "}
577
- <MathInput
578
- buttonsVisible="never"
579
- value={this.props.rangeMax}
580
- // @ts-expect-error - TS2554 - Expected 3 arguments, but got 1.
581
- onChange={this.change("rangeMax")}
582
- analytics={analyticsStub}
583
- />
584
- <TeX>\Large)</TeX>
585
- </div>
586
- <div className="perseus-widget-row">
587
- <ColorPicker
588
- value={this.props.color}
589
- // @ts-expect-error - TS2554 - Expected 3 arguments, but got 1.
590
- onChange={this.change("color")}
591
- />
592
- </div>
593
- <div className="perseus-widget-row">
594
- <DashPicker
595
- value={this.props.strokeDasharray}
596
- // @ts-expect-error - TS2554 - Expected 3 arguments, but got 1.
597
- onChange={this.change("strokeDasharray")}
598
- />
599
- </div>
600
- <div className="perseus-widget-row">
601
- <div className="perseus-widget-left-col">
602
- Width:{" "}
603
- <NumberInput
604
- value={this.props.strokeWidth}
605
- placeholder={2}
606
- // @ts-expect-error - TS2554 - Expected 3 arguments, but got 1.
607
- onChange={this.change("strokeWidth")}
608
- />
609
- </div>
610
- </div>
611
- </div>
612
- );
613
- }
614
-
615
- change: (arg1: any, arg2: any, arg3: any) => any = (...args) => {
616
- return Changeable.change.apply(this, args);
617
- };
618
-
619
- serialize = () => {
620
- return EditorJsonify.serialize.call(this);
621
- };
622
- }
623
-
624
- type LabelEditorProps = any;
625
-
626
- //
627
- // Editor for labels
628
- //
629
- // TODO(eater): Factor this out maybe?
630
- // TODO(eater): Add text direction
631
- //
632
- class LabelEditor extends React.Component<LabelEditorProps> {
633
- static propTypes = {
634
- ...Changeable.propTypes,
635
- color: PropTypes.string,
636
- coordX: PropTypes.string,
637
- coordY: PropTypes.string,
638
- label: PropTypes.string,
639
- };
640
-
641
- static defaultProps = {
642
- coordX: "0",
643
- coordY: "0",
644
- color: KhanColors.BLACK,
645
- label: "\\phi",
646
- };
647
-
648
- render(): React.ReactNode {
649
- const {TeX} = getDependencies();
650
- const analyticsStub = {onAnalyticsEvent: () => Promise.resolve()};
651
-
652
- return (
653
- <div className="graph-settings">
654
- <div className="perseus-widget-row">
655
- <TextInput
656
- value={this.props.label}
657
- // @ts-expect-error - TS2554 - Expected 3 arguments, but got 1.
658
- onChange={this.change("label")}
659
- style={{
660
- width: "100%",
661
- }}
662
- />
663
- </div>
664
- <div className="perseus-widget-row">
665
- Location: <TeX>\Large(</TeX>
666
- <MathInput
667
- buttonsVisible="never"
668
- value={this.props.coordX}
669
- // @ts-expect-error - TS2554 - Expected 3 arguments, but got 1.
670
- onChange={this.change("coordX")}
671
- analytics={analyticsStub}
672
- />
673
- <TeX>,</TeX>{" "}
674
- <MathInput
675
- buttonsVisible="never"
676
- value={this.props.coordY}
677
- // @ts-expect-error - TS2554 - Expected 3 arguments, but got 1.
678
- onChange={this.change("coordY")}
679
- analytics={analyticsStub}
680
- />
681
- <TeX>\Large)</TeX>
682
- </div>
683
- <div className="perseus-widget-row">
684
- <ColorPicker
685
- value={this.props.color}
686
- // @ts-expect-error - TS2554 - Expected 3 arguments, but got 1.
687
- onChange={this.change("color")}
688
- />
689
- </div>
690
- </div>
691
- );
692
- }
693
-
694
- change: (arg1: any, arg2: any, arg3: any) => any = (...args) => {
695
- return Changeable.change.apply(this, args);
696
- };
697
-
698
- serialize = () => {
699
- return EditorJsonify.serialize.call(this);
700
- };
701
- }
702
-
703
- type RectangleEditorProps = any;
704
-
705
- //
706
- // Editor for rectangles
707
- //
708
- // TODO(eater): Factor this out maybe?
709
- //
710
- class RectangleEditor extends React.Component<RectangleEditorProps> {
711
- static propTypes = {
712
- ...Changeable.propTypes,
713
- color: PropTypes.string,
714
- coordX: PropTypes.string,
715
- coordY: PropTypes.string,
716
- height: PropTypes.string,
717
- width: PropTypes.string,
718
- };
719
-
720
- static defaultProps = {
721
- coordX: "-5",
722
- coordY: "5",
723
- width: "2",
724
- height: "3",
725
- color: KhanColors.LIGHT_BLUE,
726
- };
727
-
728
- render(): React.ReactNode {
729
- const {TeX} = getDependencies();
730
- const analyticsStub = {onAnalyticsEvent: () => Promise.resolve()};
731
-
732
- return (
733
- <div className="graph-settings">
734
- <div className="perseus-widget-row">
735
- Bottom left: <TeX>\Large(</TeX>
736
- <MathInput
737
- buttonsVisible="never"
738
- value={this.props.coordX}
739
- // @ts-expect-error - TS2554 - Expected 3 arguments, but got 1.
740
- onChange={this.change("coordX")}
741
- analytics={analyticsStub}
742
- />
743
- <TeX>,</TeX>{" "}
744
- <MathInput
745
- buttonsVisible="never"
746
- value={this.props.coordY}
747
- // @ts-expect-error - TS2554 - Expected 3 arguments, but got 1.
748
- onChange={this.change("coordY")}
749
- analytics={analyticsStub}
750
- />
751
- <TeX>\Large)</TeX>
752
- </div>
753
- <div className="perseus-widget-row">
754
- Width:{" "}
755
- <MathInput
756
- buttonsVisible="never"
757
- value={this.props.width}
758
- // @ts-expect-error - TS2554 - Expected 3 arguments, but got 1.
759
- onChange={this.change("width")}
760
- analytics={analyticsStub}
761
- />
762
- </div>
763
- <div className="perseus-widget-row">
764
- Height:{" "}
765
- <MathInput
766
- buttonsVisible="never"
767
- value={this.props.height}
768
- // @ts-expect-error - TS2554 - Expected 3 arguments, but got 1.
769
- onChange={this.change("height")}
770
- analytics={analyticsStub}
771
- />
772
- </div>
773
- <div className="perseus-widget-row">
774
- <ColorPicker
775
- value={this.props.color}
776
- lightColors={true}
777
- // @ts-expect-error - TS2554 - Expected 3 arguments, but got 1.
778
- onChange={this.change("color")}
779
- />
780
- </div>
781
- <div className="perseus-widget-row">
782
- You want a border? Sorry, draw your own.
783
- </div>
784
- </div>
785
- );
786
- }
787
-
788
- change: (arg1: any, arg2: any, arg3: any) => any = (...args) => {
789
- return Changeable.change.apply(this, args);
790
- };
791
-
792
- serialize = () => {
793
- return EditorJsonify.serialize.call(this);
794
- };
795
- }
796
-
797
43
  type InteractionEditorProps = any;
798
44
  type InteractionEditorState = any;
799
45
 
@@ -956,6 +202,10 @@ class InteractionEditor extends React.Component<
956
202
  return Changeable.change.apply(this, args);
957
203
  };
958
204
 
205
+ serialize: () => any = () => {
206
+ return EditorJsonify.serialize.call(this);
207
+ };
208
+
959
209
  render(): React.ReactNode {
960
210
  const {TeX} = getDependencies();
961
211
 
@@ -1487,10 +737,6 @@ class InteractionEditor extends React.Component<
1487
737
  );
1488
738
  /* eslint-enable max-len */
1489
739
  }
1490
-
1491
- serialize: () => any = () => {
1492
- return EditorJsonify.serialize.call(this);
1493
- };
1494
740
  }
1495
741
 
1496
742
  export default InteractionEditor;