@khanacademy/perseus 23.4.0 → 23.6.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 (27) hide show
  1. package/dist/components/input-with-examples.d.ts +0 -4
  2. package/dist/es/index.css +0 -17
  3. package/dist/es/index.js +276 -338
  4. package/dist/es/index.js.map +1 -1
  5. package/dist/index.css +0 -17
  6. package/dist/index.d.ts +2 -2
  7. package/dist/index.js +274 -333
  8. package/dist/index.js.map +1 -1
  9. package/dist/perseus-api.d.ts +2 -1
  10. package/dist/perseus-types.d.ts +16 -8
  11. package/dist/server-item-renderer.d.ts +2 -1
  12. package/dist/types.d.ts +1 -1
  13. package/dist/widgets/expression.d.ts +12 -6
  14. package/dist/widgets/interactive-graphs/graphs/sinusoid.d.ts +1 -1
  15. package/dist/widgets/interactive-graphs/graphs/use-draggable.d.ts +13 -0
  16. package/dist/widgets/interactive-graphs/interactive-graph-question-builder.d.ts +9 -3
  17. package/dist/widgets/interactive-graphs/{locked-ellipse.d.ts → locked-figures/locked-ellipse.d.ts} +1 -1
  18. package/dist/widgets/interactive-graphs/{locked-line.d.ts → locked-figures/locked-line.d.ts} +1 -1
  19. package/dist/widgets/interactive-graphs/{locked-point.d.ts → locked-figures/locked-point.d.ts} +1 -1
  20. package/dist/widgets/interactive-graphs/locked-figures/locked-polygon.d.ts +4 -0
  21. package/dist/widgets/interactive-graphs/{locked-vector.d.ts → locked-figures/locked-vector.d.ts} +1 -1
  22. package/dist/widgets/interactive-graphs/mafs-graph.d.ts +2 -1
  23. package/dist/widgets/interactive-graphs/reducer/initialize-graph-state.d.ts +3 -2
  24. package/dist/widgets/interactive-graphs/reducer/interactive-graph-action.d.ts +8 -1
  25. package/dist/widgets/label-image.d.ts +4 -2
  26. package/package.json +1 -1
  27. package/dist/components/math-output.d.ts +0 -27
@@ -98,11 +98,12 @@ export declare const ApiOptions: {
98
98
  linear?: boolean | undefined;
99
99
  quadratic?: boolean | undefined;
100
100
  sinusoid?: boolean | undefined;
101
- segment?: boolean | undefined;
102
101
  "linear-system"?: boolean | undefined;
103
102
  ray?: boolean | undefined;
103
+ segment?: boolean | undefined;
104
104
  } & {
105
105
  "interactive-graph-locked-features-m2"?: boolean | undefined;
106
+ "interactive-graph-locked-features-m2b"?: boolean | undefined;
106
107
  }) | undefined;
107
108
  } | undefined;
108
109
  onWidgetStartProps?: ((widgets: import("./perseus-types").PerseusWidgetsMap) => void) | undefined;
@@ -346,10 +346,10 @@ export type PerseusInteractiveGraphWidgetOptions = {
346
346
  correct: PerseusGraphType;
347
347
  lockedFigures?: ReadonlyArray<LockedFigure>;
348
348
  };
349
- declare const lockedFigureColorNames: readonly ["green", "grayH", "purple", "pink", "red"];
349
+ declare const lockedFigureColorNames: readonly ["blue", "green", "grayH", "purple", "pink", "orange", "red"];
350
350
  export type LockedFigureColor = (typeof lockedFigureColorNames)[number];
351
351
  export declare const lockedFigureColors: Record<LockedFigureColor, string>;
352
- export type LockedFigure = LockedPointType | LockedLineType | LockedEllipseType | LockedVectorType;
352
+ export type LockedFigure = LockedPointType | LockedLineType | LockedVectorType | LockedEllipseType | LockedPolygonType;
353
353
  export type LockedFigureType = LockedFigure["type"];
354
354
  export type LockedPointType = {
355
355
  type: "point";
@@ -366,21 +366,29 @@ export type LockedLineType = {
366
366
  showPoint1: boolean;
367
367
  showPoint2: boolean;
368
368
  };
369
- export type LockedEllipseFillType = "none" | "solid" | "translucent";
370
- export declare const lockedEllipseFillStyles: Record<LockedEllipseFillType, number>;
369
+ export type LockedVectorType = {
370
+ type: "vector";
371
+ points: [tail: Coord, tip: Coord];
372
+ color: LockedFigureColor;
373
+ };
374
+ export type LockedFigureFillType = "none" | "solid" | "translucent";
375
+ export declare const lockedFigureFillStyles: Record<LockedFigureFillType, number>;
371
376
  export type LockedEllipseType = {
372
377
  type: "ellipse";
373
378
  center: Coord;
374
379
  radius: [x: number, y: number];
375
380
  angle: number;
376
381
  color: LockedFigureColor;
377
- fillStyle: LockedEllipseFillType;
382
+ fillStyle: LockedFigureFillType;
378
383
  strokeStyle: "solid" | "dashed";
379
384
  };
380
- export type LockedVectorType = {
381
- type: "vector";
382
- points: [tail: Coord, tip: Coord];
385
+ export type LockedPolygonType = {
386
+ type: "polygon";
387
+ points: ReadonlyArray<Coord>;
383
388
  color: LockedFigureColor;
389
+ showVertices: boolean;
390
+ fillStyle: LockedFigureFillType;
391
+ strokeStyle: "solid" | "dashed";
384
392
  };
385
393
  export type PerseusGraphType = PerseusGraphTypeAngle | PerseusGraphTypeCircle | PerseusGraphTypeLinear | PerseusGraphTypeLinearSystem | PerseusGraphTypePoint | PerseusGraphTypePolygon | PerseusGraphTypeQuadratic | PerseusGraphTypeRay | PerseusGraphTypeSegment | PerseusGraphTypeSinusoid;
386
394
  export type PerseusGraphTypeCommon = {
@@ -145,11 +145,12 @@ declare const ref: React.ForwardRefExoticComponent<Omit<Pick<OwnProps & HOCProps
145
145
  linear?: boolean | undefined;
146
146
  quadratic?: boolean | undefined;
147
147
  sinusoid?: boolean | undefined;
148
- segment?: boolean | undefined;
149
148
  "linear-system"?: boolean | undefined;
150
149
  ray?: boolean | undefined;
150
+ segment?: boolean | undefined;
151
151
  } & {
152
152
  "interactive-graph-locked-features-m2"?: boolean | undefined;
153
+ "interactive-graph-locked-features-m2b"?: boolean | undefined;
153
154
  }) | undefined;
154
155
  } | undefined;
155
156
  onWidgetStartProps?: ((widgets: import("./perseus-types").PerseusWidgetsMap) => void) | undefined;
package/dist/types.d.ts CHANGED
@@ -78,7 +78,7 @@ type TrackInteractionArgs = {
78
78
  correct?: boolean;
79
79
  } & Partial<TrackingGradedGroupExtraArguments> & Partial<TrackingSequenceExtraArguments>;
80
80
  export declare const MafsGraphTypeFlags: readonly ["segment", "linear", "linear-system", "ray", "polygon", "circle", "quadratic", "sinusoid"];
81
- export declare const InteractiveGraphLockedFeaturesFlags: readonly ["interactive-graph-locked-features-m2"];
81
+ export declare const InteractiveGraphLockedFeaturesFlags: readonly ["interactive-graph-locked-features-m2", "interactive-graph-locked-features-m2b"];
82
82
  /**
83
83
  * APIOptions provides different ways to customize the behaviour of Perseus.
84
84
  *
@@ -139,11 +139,12 @@ declare const _default: Readonly<{
139
139
  linear?: boolean | undefined;
140
140
  quadratic?: boolean | undefined;
141
141
  sinusoid?: boolean | undefined;
142
- segment?: boolean | undefined;
143
142
  "linear-system"?: boolean | undefined;
144
143
  ray?: boolean | undefined;
144
+ segment?: boolean | undefined;
145
145
  } & {
146
146
  "interactive-graph-locked-features-m2"?: boolean | undefined;
147
+ "interactive-graph-locked-features-m2b"?: boolean | undefined;
147
148
  }) | undefined;
148
149
  } | undefined;
149
150
  onWidgetStartProps?: ((widgets: import("../perseus-types").PerseusWidgetsMap) => void) | undefined;
@@ -215,11 +216,12 @@ declare const _default: Readonly<{
215
216
  linear?: boolean | undefined;
216
217
  quadratic?: boolean | undefined;
217
218
  sinusoid?: boolean | undefined;
218
- segment?: boolean | undefined;
219
219
  "linear-system"?: boolean | undefined;
220
220
  ray?: boolean | undefined;
221
+ segment?: boolean | undefined;
221
222
  } & {
222
223
  "interactive-graph-locked-features-m2"?: boolean | undefined;
224
+ "interactive-graph-locked-features-m2b"?: boolean | undefined;
223
225
  }) | undefined;
224
226
  } | undefined;
225
227
  onWidgetStartProps?: ((widgets: import("../perseus-types").PerseusWidgetsMap) => void) | undefined;
@@ -291,11 +293,12 @@ declare const _default: Readonly<{
291
293
  linear?: boolean | undefined;
292
294
  quadratic?: boolean | undefined;
293
295
  sinusoid?: boolean | undefined;
294
- segment?: boolean | undefined;
295
296
  "linear-system"?: boolean | undefined;
296
297
  ray?: boolean | undefined;
298
+ segment?: boolean | undefined;
297
299
  } & {
298
300
  "interactive-graph-locked-features-m2"?: boolean | undefined;
301
+ "interactive-graph-locked-features-m2b"?: boolean | undefined;
299
302
  }) | undefined;
300
303
  } | undefined;
301
304
  onWidgetStartProps?: ((widgets: import("../perseus-types").PerseusWidgetsMap) => void) | undefined;
@@ -364,11 +367,12 @@ declare const _default: Readonly<{
364
367
  linear?: boolean | undefined;
365
368
  quadratic?: boolean | undefined;
366
369
  sinusoid?: boolean | undefined;
367
- segment?: boolean | undefined;
368
370
  "linear-system"?: boolean | undefined;
369
371
  ray?: boolean | undefined;
372
+ segment?: boolean | undefined;
370
373
  } & {
371
374
  "interactive-graph-locked-features-m2"?: boolean | undefined;
375
+ "interactive-graph-locked-features-m2b"?: boolean | undefined;
372
376
  }) | undefined;
373
377
  } | undefined;
374
378
  onWidgetStartProps?: ((widgets: import("../perseus-types").PerseusWidgetsMap) => void) | undefined;
@@ -440,11 +444,12 @@ declare const _default: Readonly<{
440
444
  linear?: boolean | undefined;
441
445
  quadratic?: boolean | undefined;
442
446
  sinusoid?: boolean | undefined;
443
- segment?: boolean | undefined;
444
447
  "linear-system"?: boolean | undefined;
445
448
  ray?: boolean | undefined;
449
+ segment?: boolean | undefined;
446
450
  } & {
447
451
  "interactive-graph-locked-features-m2"?: boolean | undefined;
452
+ "interactive-graph-locked-features-m2b"?: boolean | undefined;
448
453
  }) | undefined;
449
454
  } | undefined;
450
455
  onWidgetStartProps?: ((widgets: import("../perseus-types").PerseusWidgetsMap) => void) | undefined;
@@ -516,11 +521,12 @@ declare const _default: Readonly<{
516
521
  linear?: boolean | undefined;
517
522
  quadratic?: boolean | undefined;
518
523
  sinusoid?: boolean | undefined;
519
- segment?: boolean | undefined;
520
524
  "linear-system"?: boolean | undefined;
521
525
  ray?: boolean | undefined;
526
+ segment?: boolean | undefined;
522
527
  } & {
523
528
  "interactive-graph-locked-features-m2"?: boolean | undefined;
529
+ "interactive-graph-locked-features-m2b"?: boolean | undefined;
524
530
  }) | undefined;
525
531
  } | undefined;
526
532
  onWidgetStartProps?: ((widgets: import("../perseus-types").PerseusWidgetsMap) => void) | undefined;
@@ -10,5 +10,5 @@ export type SineCoefficient = {
10
10
  };
11
11
  export declare function SinusoidGraph(props: SinusoidGraphProps): JSX.Element;
12
12
  export declare const computeSine: (x: number, sinusoidCoefficients: SineCoefficient) => number;
13
- export declare const getSinusoidCoefficients: (coords: ReadonlyArray<Coord>) => SineCoefficient;
13
+ export declare const getSinusoidCoefficients: (coords: ReadonlyArray<Coord>) => SineCoefficient | undefined;
14
14
  export {};
@@ -0,0 +1,13 @@
1
+ import type { vec } from "mafs";
2
+ import type { RefObject } from "react";
3
+ type Params = {
4
+ gestureTarget: RefObject<Element>;
5
+ onMove: (point: vec.Vector2) => unknown;
6
+ point: vec.Vector2;
7
+ constrain: (point: vec.Vector2) => vec.Vector2;
8
+ };
9
+ type DragState = {
10
+ dragging: boolean;
11
+ };
12
+ export declare function useDraggable(params: Params): DragState;
13
+ export {};
@@ -1,4 +1,4 @@
1
- import type { LockedEllipseFillType, LockedFigureColor, PerseusRenderer } from "../../perseus-types";
1
+ import type { LockedFigureFillType, LockedFigureColor, PerseusRenderer } from "../../perseus-types";
2
2
  import type { vec } from "mafs";
3
3
  export declare function interactiveGraphQuestionBuilder(): InteractiveGraphQuestionBuilder;
4
4
  declare class InteractiveGraphQuestionBuilder {
@@ -24,13 +24,19 @@ declare class InteractiveGraphQuestionBuilder {
24
24
  withPolygon(snapTo: "grid" | "angles" | "sides"): InteractiveGraphQuestionBuilder;
25
25
  addLockedPointAt(x: number, y: number): InteractiveGraphQuestionBuilder;
26
26
  addLockedLine(point1: vec.Vector2, point2: vec.Vector2): InteractiveGraphQuestionBuilder;
27
+ addLockedVector(tail: vec.Vector2, tip: vec.Vector2, color?: LockedFigureColor): InteractiveGraphQuestionBuilder;
27
28
  addLockedEllipse(center: vec.Vector2, radius: [x: number, y: number], options?: {
28
29
  angle?: number;
29
30
  color?: LockedFigureColor;
30
- fillStyle?: LockedEllipseFillType;
31
+ fillStyle?: LockedFigureFillType;
32
+ strokeStyle?: "solid" | "dashed";
33
+ }): InteractiveGraphQuestionBuilder;
34
+ addLockedPolygon(points: vec.Vector2[], options?: {
35
+ color?: LockedFigureColor;
36
+ showVertices?: boolean;
37
+ fillStyle?: LockedFigureFillType;
31
38
  strokeStyle?: "solid" | "dashed";
32
39
  }): InteractiveGraphQuestionBuilder;
33
- addLockedVector(tail: vec.Vector2, tip: vec.Vector2, color?: LockedFigureColor): InteractiveGraphQuestionBuilder;
34
40
  private createLockedPoint;
35
41
  private addLockedFigure;
36
42
  }
@@ -1,4 +1,4 @@
1
1
  /// <reference types="react" />
2
- import { type LockedEllipseType } from "../../perseus-types";
2
+ import { type LockedEllipseType } from "../../../perseus-types";
3
3
  declare const LockedEllipse: (props: LockedEllipseType) => JSX.Element;
4
4
  export default LockedEllipse;
@@ -1,5 +1,5 @@
1
1
  /// <reference types="react" />
2
- import type { LockedLineType } from "../../perseus-types";
2
+ import type { LockedLineType } from "../../../perseus-types";
3
3
  import type { Interval } from "mafs";
4
4
  type Props = LockedLineType & {
5
5
  range: [Interval, Interval];
@@ -1,4 +1,4 @@
1
1
  /// <reference types="react" />
2
- import { type LockedPointType } from "../../perseus-types";
2
+ import { type LockedPointType } from "../../../perseus-types";
3
3
  declare const LockedPoint: (props: LockedPointType) => JSX.Element;
4
4
  export default LockedPoint;
@@ -0,0 +1,4 @@
1
+ /// <reference types="react" />
2
+ import type { LockedPolygonType } from "../../../perseus-types";
3
+ declare const LockedPolygon: (props: LockedPolygonType) => JSX.Element;
4
+ export default LockedPolygon;
@@ -1,4 +1,4 @@
1
1
  /// <reference types="react" />
2
- import type { LockedVectorType } from "../../perseus-types";
2
+ import type { LockedVectorType } from "../../../perseus-types";
3
3
  declare const LockedVector: (props: LockedVectorType) => JSX.Element;
4
4
  export default LockedVector;
@@ -1,13 +1,14 @@
1
1
  import * as React from "react";
2
2
  import { type InteractiveGraphAction } from "./reducer/interactive-graph-action";
3
3
  import type { InteractiveGraphState, InteractiveGraphProps } from "./types";
4
+ import type { PerseusGraphType } from "../../perseus-types";
4
5
  import type { Widget } from "../../renderer";
5
6
  import "mafs/core.css";
6
7
  import "./mafs-styles.css";
7
8
  export type StatefulMafsGraphProps = {
8
9
  box: [number, number];
9
10
  backgroundImage?: InteractiveGraphProps["backgroundImage"];
10
- graph: InteractiveGraphProps["graph"];
11
+ graph: PerseusGraphType;
11
12
  lockedFigures?: InteractiveGraphProps["lockedFigures"];
12
13
  range: InteractiveGraphProps["range"];
13
14
  snapStep: InteractiveGraphProps["snapStep"];
@@ -1,9 +1,10 @@
1
1
  import type { PerseusGraphType } from "../../../perseus-types";
2
2
  import type { InteractiveGraphState } from "../types";
3
3
  import type { Interval } from "mafs";
4
- export declare function initializeGraphState(params: {
4
+ export type InitializeGraphStateParams = {
5
5
  range: [x: Interval, y: Interval];
6
6
  step: [x: number, y: number];
7
7
  snapStep: [x: number, y: number];
8
8
  graph: PerseusGraphType;
9
- }): InteractiveGraphState;
9
+ };
10
+ export declare function initializeGraphState(params: InitializeGraphStateParams): InteractiveGraphState;
@@ -1,5 +1,12 @@
1
+ import type { InitializeGraphStateParams } from "./initialize-graph-state";
1
2
  import type { Interval, vec } from "mafs";
2
- export type InteractiveGraphAction = MoveControlPoint | MoveLine | MoveAll | MovePoint | MoveCenter | MoveRadiusPoint | ChangeSnapStep | ChangeRange;
3
+ export type InteractiveGraphAction = Reinitialize | MoveControlPoint | MoveLine | MoveAll | MovePoint | MoveCenter | MoveRadiusPoint | ChangeSnapStep | ChangeRange;
4
+ export declare const REINITIALIZE = "reinitialize";
5
+ export interface Reinitialize {
6
+ type: typeof REINITIALIZE;
7
+ params: InitializeGraphStateParams;
8
+ }
9
+ export declare function reinitialize(params: InitializeGraphStateParams): Reinitialize;
3
10
  export declare const MOVE_CONTROL_POINT = "move-control-point";
4
11
  export interface MoveControlPoint {
5
12
  type: typeof MOVE_CONTROL_POINT;
@@ -133,11 +133,12 @@ declare const _default: Readonly<{
133
133
  linear?: boolean | undefined;
134
134
  quadratic?: boolean | undefined;
135
135
  sinusoid?: boolean | undefined;
136
- segment?: boolean | undefined;
137
136
  "linear-system"?: boolean | undefined;
138
137
  ray?: boolean | undefined;
138
+ segment?: boolean | undefined;
139
139
  } & {
140
140
  "interactive-graph-locked-features-m2"?: boolean | undefined;
141
+ "interactive-graph-locked-features-m2b"?: boolean | undefined;
141
142
  }) | undefined;
142
143
  } | undefined;
143
144
  onWidgetStartProps?: ((widgets: import("..").PerseusWidgetsMap) => void) | undefined;
@@ -193,11 +194,12 @@ declare const _default: Readonly<{
193
194
  linear?: boolean | undefined;
194
195
  quadratic?: boolean | undefined;
195
196
  sinusoid?: boolean | undefined;
196
- segment?: boolean | undefined;
197
197
  "linear-system"?: boolean | undefined;
198
198
  ray?: boolean | undefined;
199
+ segment?: boolean | undefined;
199
200
  } & {
200
201
  "interactive-graph-locked-features-m2"?: boolean | undefined;
202
+ "interactive-graph-locked-features-m2b"?: boolean | undefined;
201
203
  }) | undefined;
202
204
  } | undefined;
203
205
  onWidgetStartProps?: ((widgets: import("..").PerseusWidgetsMap) => void) | undefined;
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "description": "Core Perseus API (includes renderers and widgets)",
4
4
  "author": "Khan Academy",
5
5
  "license": "MIT",
6
- "version": "23.4.0",
6
+ "version": "23.6.0",
7
7
  "publishConfig": {
8
8
  "access": "public"
9
9
  },
@@ -1,27 +0,0 @@
1
- import * as React from "react";
2
- type Props = {
3
- value: string | number;
4
- className?: string;
5
- labelText?: string;
6
- onFocus: () => void;
7
- onBlur: () => void;
8
- };
9
- type DefaultProps = Pick<Props, "value" | "onFocus" | "onBlur">;
10
- type State = {
11
- focused: boolean;
12
- selectorNamespace: string;
13
- };
14
- declare class MathOutput extends React.Component<Props, State> {
15
- static defaultProps: DefaultProps;
16
- state: State;
17
- _getInputClassName: () => string;
18
- _getDisplayValue: (arg1: string | number) => string;
19
- render(): React.ReactNode;
20
- getValue: () => string | number;
21
- focus: () => void;
22
- blur: () => void;
23
- _bindBlurHandler: () => void;
24
- _unbindBlurHandler: () => void;
25
- componentWillUnmount(): void;
26
- }
27
- export default MathOutput;