@khanacademy/perseus 77.10.1 → 77.11.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 (38) hide show
  1. package/dist/es/index.css +1 -1
  2. package/dist/es/index.css.map +1 -1
  3. package/dist/es/index.js +21 -17
  4. package/dist/es/index.js.map +1 -1
  5. package/dist/es/strings.js +1 -1
  6. package/dist/es/strings.js.map +1 -1
  7. package/dist/index.css +1 -1
  8. package/dist/index.css.map +1 -1
  9. package/dist/index.js +21 -17
  10. package/dist/index.js.map +1 -1
  11. package/dist/server-item-renderer.d.ts +1 -1
  12. package/dist/strings.js +1 -1
  13. package/dist/strings.js.map +1 -1
  14. package/dist/testing/feature-flags-util.d.ts +0 -2
  15. package/dist/testing/item-flipbook/item-flipbook-model.d.ts +22 -0
  16. package/dist/testing/item-flipbook/item-flipbook-view-model.d.ts +57 -0
  17. package/dist/testing/item-flipbook/item-flipbook-view.d.ts +7 -0
  18. package/dist/testing/item-flipbook/item-flipbook.d.ts +2 -0
  19. package/dist/testing/item-flipbook/safe-parse-perseus-item.d.ts +2 -0
  20. package/dist/testing/item-renderer-hooks.d.ts +1 -1
  21. package/dist/widgets/dropdown/dropdown.d.ts +1 -1
  22. package/dist/widgets/expression/expression.d.ts +2 -2
  23. package/dist/widgets/interactive-graphs/graphs/components/movable-asymptote.d.ts +8 -0
  24. package/dist/widgets/interactive-graphs/graphs/components/movable-line/index.d.ts +2 -0
  25. package/dist/widgets/interactive-graphs/graphs/components/movable-line/line.d.ts +16 -0
  26. package/dist/widgets/interactive-graphs/graphs/components/movable-line/movable-line.d.ts +20 -0
  27. package/dist/widgets/interactive-graphs/graphs/components/{movable-line.d.ts → movable-line/util.d.ts} +0 -20
  28. package/dist/widgets/interactive-graphs/graphs/screenreader-text.d.ts +6 -0
  29. package/dist/widgets/interactive-graphs/graphs/utils.d.ts +8 -2
  30. package/dist/widgets/interactive-graphs/interactive-graph.d.ts +1 -1
  31. package/dist/widgets/interactive-graphs/point-labels.d.ts +2 -0
  32. package/dist/widgets/interactive-graphs/types.d.ts +46 -1
  33. package/dist/widgets/label-image/label-image.d.ts +1 -1
  34. package/dist/widgets/mock-widgets/mock-widget.d.ts +1 -1
  35. package/dist/widgets/numeric-input/numeric-input.class.d.ts +1 -1
  36. package/dist/widgets/numeric-input/numeric-input.d.ts +2 -2
  37. package/dist/widgets/table/table.d.ts +1 -1
  38. package/package.json +7 -7
@@ -0,0 +1,57 @@
1
+ import type { PerseusItem } from "@khanacademy/perseus-core";
2
+ export type NoItem = {
3
+ status: "no-item";
4
+ };
5
+ export type ParseError = {
6
+ status: "parse-error";
7
+ message: string;
8
+ };
9
+ export type Item = {
10
+ status: "item";
11
+ item: PerseusItem;
12
+ key: string;
13
+ };
14
+ /**
15
+ * The information displayed in the item display section of the UI. One of:
16
+ * - no item (if no data has been entered)
17
+ * - a parse error from the currently selected item
18
+ * - a valid item
19
+ */
20
+ export type ItemDisplay = NoItem | ParseError | Item;
21
+ export declare function noItem(): NoItem;
22
+ export declare function parseError(message: string): ParseError;
23
+ export declare function item(item: PerseusItem, key: string): Item;
24
+ export declare function isItem(itemDisplay: ItemDisplay): itemDisplay is Item;
25
+ export interface InputFieldChangeEvent {
26
+ target: {
27
+ value: string;
28
+ };
29
+ }
30
+ export interface InputField {
31
+ value: string;
32
+ onChange: (event: InputFieldChangeEvent) => void;
33
+ }
34
+ /**
35
+ * An abstract representation of the view. The ViewModel contains exactly the
36
+ * values that will be rendered in React components, but it has no dependency
37
+ * on React. This makes it easy to write tests that assert on exactly what the
38
+ * user will see, yet don't need to render components.
39
+ */
40
+ export interface ViewModel {
41
+ /**
42
+ * Input where the user can type in newline-separated Perseus item JSON
43
+ * objects to render.
44
+ */
45
+ itemJsonInput: InputField;
46
+ /**
47
+ * Displays and controls which Perseus item from the `itemJsonInput` is
48
+ * currently selected for display.
49
+ */
50
+ selectedItemNumber: InputField;
51
+ /** The number of items, formatted for display. */
52
+ totalItems: string;
53
+ nextItem: () => void;
54
+ previousItem: () => void;
55
+ /** The data that should be rendered for the currently selected item. */
56
+ itemDisplay: ItemDisplay;
57
+ }
@@ -0,0 +1,7 @@
1
+ import * as React from "react";
2
+ import type { ViewModel } from "./item-flipbook-view-model";
3
+ interface ViewProps {
4
+ viewModel: ViewModel;
5
+ }
6
+ export declare function ItemFlipbookView({ viewModel }: ViewProps): React.JSX.Element;
7
+ export {};
@@ -0,0 +1,2 @@
1
+ import * as React from "react";
2
+ export declare function ItemFlipbook(): React.JSX.Element;
@@ -0,0 +1,2 @@
1
+ import type { ParseFailureDetail, PerseusItem, Result } from "@khanacademy/perseus-core";
2
+ export declare function safeParsePerseusItem(data: unknown): Result<PerseusItem, ParseFailureDetail>;
@@ -39,7 +39,7 @@ export declare const useItemRenderer: (item: PerseusItem, apiOptions?: APIOption
39
39
  hintProgressColor?: string;
40
40
  canScrollPage?: boolean;
41
41
  editorChangeDelay?: number;
42
- flags?: Record<"image-widget-upgrade-gif-controls" | "input-number-to-numeric-input", boolean>;
42
+ flags?: Record<"input-number-to-numeric-input", boolean>;
43
43
  };
44
44
  toggleMobile: (isMobile: boolean) => void;
45
45
  toggleRtl: (isRtl: boolean) => void;
@@ -52,7 +52,7 @@ declare const _default: {
52
52
  hintProgressColor?: string;
53
53
  canScrollPage?: boolean;
54
54
  editorChangeDelay?: number;
55
- flags?: Record<"image-widget-upgrade-gif-controls" | "input-number-to-numeric-input", boolean>;
55
+ flags?: Record<"input-number-to-numeric-input", boolean>;
56
56
  }> & {
57
57
  baseElements: NonNullable<import("../..").APIOptions["baseElements"]>;
58
58
  canScrollPage: NonNullable<import("../..").APIOptions["canScrollPage"]>;
@@ -42,7 +42,7 @@ export declare const Expression: React.ForwardRefExoticComponent<PerseusExpressi
42
42
  hintProgressColor?: string;
43
43
  canScrollPage?: boolean;
44
44
  editorChangeDelay?: number;
45
- flags?: Record<"image-widget-upgrade-gif-controls" | "input-number-to-numeric-input", boolean>;
45
+ flags?: Record<"input-number-to-numeric-input", boolean>;
46
46
  }> & {
47
47
  baseElements: NonNullable<import("../..").APIOptions["baseElements"]>;
48
48
  canScrollPage: NonNullable<import("../..").APIOptions["canScrollPage"]>;
@@ -122,7 +122,7 @@ declare const _default: {
122
122
  hintProgressColor?: string;
123
123
  canScrollPage?: boolean;
124
124
  editorChangeDelay?: number;
125
- flags?: Record<"image-widget-upgrade-gif-controls" | "input-number-to-numeric-input", boolean>;
125
+ flags?: Record<"input-number-to-numeric-input", boolean>;
126
126
  }> & {
127
127
  baseElements: NonNullable<import("../..").APIOptions["baseElements"]>;
128
128
  canScrollPage: NonNullable<import("../..").APIOptions["canScrollPage"]>;
@@ -1,4 +1,5 @@
1
1
  import * as React from "react";
2
+ import type { AriaLive } from "../../types";
2
3
  import type { KeyboardMovementConstraint } from "../use-draggable";
3
4
  import type { vec } from "mafs";
4
5
  type Props = {
@@ -21,6 +22,13 @@ type Props = {
21
22
  orientation: "horizontal" | "vertical";
22
23
  /** Accessible label for the asymptote drag target. */
23
24
  ariaLabel: string;
25
+ /**
26
+ * Overrides the internal aria-live used to announce moves. Defaults to
27
+ * "polite".
28
+ * TODO(LEMS-4189): Remove once exponential is also wired to the announcer
29
+ * and the internal aria-live can be dropped.
30
+ */
31
+ ariaLive?: AriaLive;
24
32
  /**
25
33
  * Content rendered between the asymptote lines and the drag handle.
26
34
  * Use this to render the curve so it appears above the dashed line
@@ -0,0 +1,2 @@
1
+ export { MovableLine } from "./movable-line";
2
+ export { getMovableLineKeyboardConstraint, insetTipAlongRay, trimRange, } from "./util";
@@ -0,0 +1,16 @@
1
+ import * as React from "react";
2
+ import type { AriaLive } from "../../../types";
3
+ import type { vec } from "mafs";
4
+ export interface LineProps {
5
+ start: vec.Vector2;
6
+ end: vec.Vector2;
7
+ ariaLabel?: string;
8
+ ariaDescribedBy?: string;
9
+ ariaLive?: AriaLive;
10
+ extend?: undefined | {
11
+ start: boolean;
12
+ end: boolean;
13
+ };
14
+ onMove: (newStart: vec.Vector2) => unknown;
15
+ }
16
+ export declare const Line: (props: LineProps) => React.JSX.Element;
@@ -0,0 +1,20 @@
1
+ import * as React from "react";
2
+ import type { AriaLive } from "../../../types";
3
+ import type { vec } from "mafs";
4
+ export interface MovableLineProps {
5
+ points: Readonly<[vec.Vector2, vec.Vector2]>;
6
+ ariaLabels?: {
7
+ point1AriaLabel?: string;
8
+ point2AriaLabel?: string;
9
+ grabHandleAriaLabel?: string;
10
+ };
11
+ ariaDescribedBy?: string;
12
+ ariaLive?: AriaLive;
13
+ extend?: {
14
+ start: boolean;
15
+ end: boolean;
16
+ };
17
+ onMovePoint?: (endpointIndex: number, destination: vec.Vector2) => unknown;
18
+ onMoveLine?: (newStart: vec.Vector2) => unknown;
19
+ }
20
+ export declare const MovableLine: (props: MovableLineProps) => React.JSX.Element;
@@ -1,24 +1,5 @@
1
1
  import { vec } from "mafs";
2
- import * as React from "react";
3
- import type { AriaLive } from "../../types";
4
2
  import type { Interval } from "mafs";
5
- type Props = {
6
- points: Readonly<[vec.Vector2, vec.Vector2]>;
7
- ariaLabels?: {
8
- point1AriaLabel?: string;
9
- point2AriaLabel?: string;
10
- grabHandleAriaLabel?: string;
11
- };
12
- ariaDescribedBy?: string;
13
- ariaLive?: AriaLive;
14
- extend?: {
15
- start: boolean;
16
- end: boolean;
17
- };
18
- onMovePoint?: (endpointIndex: number, destination: vec.Vector2) => unknown;
19
- onMoveLine?: (newStart: vec.Vector2) => unknown;
20
- };
21
- export declare const MovableLine: (props: Props) => React.JSX.Element;
22
3
  export declare const getMovableLineKeyboardConstraint: (line: [vec.Vector2, vec.Vector2], snapStep: vec.Vector2, pointIndex: number) => {
23
4
  up: vec.Vector2;
24
5
  down: vec.Vector2;
@@ -33,4 +14,3 @@ export declare function trimRange(range: [Interval, Interval], graphDimensionsIn
33
14
  * viewport edge.
34
15
  */
35
16
  export declare function insetTipAlongRay(tail: vec.Vector2, tip: vec.Vector2, range: [Interval, Interval], graphDimensionsInPixels: vec.Vector2): vec.Vector2;
36
- export {};
@@ -1,7 +1,13 @@
1
1
  import type { InteractiveGraphStateAnnouncement } from "../types";
2
2
  import type { PerseusStrings } from "@khanacademy/perseus/strings";
3
+ import type { Coord } from "@khanacademy/perseus-core";
3
4
  export declare function getAnnouncementText(state: InteractiveGraphStateAnnouncement, strings: PerseusStrings, locale: string): string;
4
5
  export declare function srCircleRadiusPointLabel(x: number, y: number, centerX: number, strings: PerseusStrings, locale: string): string;
5
6
  export declare function srCircleCenterLabel(x: number, y: number, strings: PerseusStrings, locale: string): string;
7
+ type GraphLocations = "origin" | "x-axis" | "y-axis" | 1 | 2 | 3 | 4;
8
+ export declare function getCoordQuadrant(coord: Coord): GraphLocations;
9
+ export declare function getQuadraticVertexString(vertex: Coord, strings: PerseusStrings): string;
10
+ export declare function getQuadraticPointString(pointNumber: any, coord: Coord, strings: PerseusStrings, locale: string): string;
6
11
  export declare function srFormatNumber(a: number, locale: string, maximumFractionDigits?: number): string;
7
12
  export declare function getPiMultiple(a: number): string | null;
13
+ export {};
@@ -1,6 +1,7 @@
1
1
  import { vec } from "mafs";
2
2
  import type { PerseusStrings } from "../../../strings";
3
3
  import type { PairOfPoints } from "../types";
4
+ import type { QuadraticCoefficient } from "@khanacademy/kmath";
4
5
  import type { Coord } from "@khanacademy/perseus-core";
5
6
  import type { Interval } from "mafs";
6
7
  /**
@@ -14,9 +15,14 @@ export declare const getIntersectionOfRayWithBox: (initialPoint: vec.Vector2, th
14
15
  export declare function getArrayWithoutDuplicates(array: Array<Coord>): Array<Coord>;
15
16
  export declare function getSlopeStringForLine(line: PairOfPoints, strings: PerseusStrings): string;
16
17
  export declare function getInterceptStringForLine(line: PairOfPoints, strings: PerseusStrings, locale: string): string;
17
- export declare function getQuadraticVertexString(vertex: Coord, strings: PerseusStrings): string;
18
- export declare function getQuadraticPointString(pointNumber: any, coord: Coord, strings: PerseusStrings, locale: string): string;
19
18
  export declare function getQuadraticXIntercepts(a: number, b: number, c: number): number[];
19
+ /**
20
+ * Calculate the vertex of a quadratic from its coefficients.
21
+ *
22
+ * When a === 0 the parabola degenerates to a line and has no vertex, so
23
+ * we return undefined; otherwise the vertex is (-b/2a, c - b²/4a).
24
+ */
25
+ export declare function getQuadraticVertex(coeffs: QuadraticCoefficient): Coord | undefined;
20
26
  /**
21
27
  * Given a list of points, return the angle made by the point at index i
22
28
  * with the points at indices i - 1 and i + 1.
@@ -199,7 +199,7 @@ declare class InteractiveGraph extends React.Component<Props, State> {
199
199
  hintProgressColor?: string;
200
200
  canScrollPage?: boolean;
201
201
  editorChangeDelay?: number;
202
- flags?: Record<"image-widget-upgrade-gif-controls" | "input-number-to-numeric-input", boolean>;
202
+ flags?: Record<"input-number-to-numeric-input", boolean>;
203
203
  }> & {
204
204
  baseElements: NonNullable<import("../..").APIOptions["baseElements"]>;
205
205
  canScrollPage: NonNullable<import("../..").APIOptions["canScrollPage"]>;
@@ -0,0 +1,2 @@
1
+ export declare function resolveVisibleLabel(pointLabels: string[] | undefined, index: number): string | undefined;
2
+ export declare function getEffectivePointLabels(showPointLabels: boolean | undefined, pointLabels: string[] | undefined, count: number): string[] | undefined;
@@ -35,6 +35,14 @@ type MoveCenterAnnouncement = {
35
35
  x: number;
36
36
  y: number;
37
37
  };
38
+ type MoveQuadraticPointAnnouncement = {
39
+ type: "move-quadratic-point";
40
+ pointIndex: number;
41
+ pointLabel: string | number;
42
+ x: number;
43
+ y: number;
44
+ vertex: Coord | undefined;
45
+ };
38
46
  type MoveVectorPointAnnouncement = {
39
47
  type: "move-vector-point";
40
48
  pointIndex: number;
@@ -94,6 +102,42 @@ type MoveSinusoidPointAnnouncement = {
94
102
  y: number;
95
103
  otherY: number;
96
104
  };
105
+ type MoveExponentialPointAnnouncement = {
106
+ type: "move-exponential-point";
107
+ pointIndex: number;
108
+ pointLabel: string | number;
109
+ x: number;
110
+ y: number;
111
+ };
112
+ type MoveLogarithmPointAnnouncement = {
113
+ type: "move-logarithm-point";
114
+ pointIndex: number;
115
+ pointLabel: string | number;
116
+ x: number;
117
+ y: number;
118
+ };
119
+ type MoveExponentialAsymptoteAnnouncement = {
120
+ type: "move-exponential-asymptote";
121
+ asymptoteY: number;
122
+ };
123
+ type MoveTangentPointAnnouncement = {
124
+ type: "move-tangent-point";
125
+ pointIndex: number;
126
+ pointLabel: string | number;
127
+ x: number;
128
+ y: number;
129
+ };
130
+ type MoveLogarithmAsymptoteAnnouncement = {
131
+ type: "move-logarithm-asymptote";
132
+ asymptoteX: number;
133
+ };
134
+ type MoveAbsoluteValuePointAnnouncement = {
135
+ type: "move-absolute-value-point";
136
+ pointIndex: number;
137
+ pointLabel: string | number;
138
+ x: number;
139
+ y: number;
140
+ };
97
141
  type MoveAnglePointAnnouncement = {
98
142
  type: "move-angle-point";
99
143
  pointIndex: number;
@@ -107,10 +151,11 @@ type MovePolygonAnnouncement = {
107
151
  coords: ReadonlyArray<Coord>;
108
152
  pointLabels?: ReadonlyArray<string>;
109
153
  };
110
- export type InteractiveGraphStateAnnouncement = MovePointAnnouncement | MoveRadiusPointAnnouncement | MoveCenterAnnouncement | MoveVectorPointAnnouncement | MoveVectorLineAnnouncement | MoveSegmentPointAnnouncement | MoveSegmentLineAnnouncement | MoveLinearSystemPointAnnouncement | MoveLinearSystemLineAnnouncement | MoveRayPointAnnouncement | MoveRayLineAnnouncement | MoveLinearLineAnnouncement | MoveSinusoidPointAnnouncement | MoveAnglePointAnnouncement | MovePolygonAnnouncement;
154
+ export type InteractiveGraphStateAnnouncement = MovePointAnnouncement | MoveRadiusPointAnnouncement | MoveCenterAnnouncement | MoveQuadraticPointAnnouncement | MoveVectorPointAnnouncement | MoveVectorLineAnnouncement | MoveSegmentPointAnnouncement | MoveSegmentLineAnnouncement | MoveLinearSystemPointAnnouncement | MoveLinearSystemLineAnnouncement | MoveRayPointAnnouncement | MoveRayLineAnnouncement | MoveLinearLineAnnouncement | MoveSinusoidPointAnnouncement | MoveExponentialPointAnnouncement | MoveExponentialAsymptoteAnnouncement | MoveLogarithmPointAnnouncement | MoveLogarithmAsymptoteAnnouncement | MoveTangentPointAnnouncement | MoveAbsoluteValuePointAnnouncement | MoveAnglePointAnnouncement | MovePolygonAnnouncement;
111
155
  export interface InteractiveGraphStateCommon {
112
156
  hasBeenInteractedWith: boolean;
113
157
  pointLabels?: string[];
158
+ showPointLabels?: boolean;
114
159
  range: [xRange: Interval, yRange: Interval];
115
160
  snapStep: vec.Vector2;
116
161
  stateAnnouncement?: InteractiveGraphStateAnnouncement;
@@ -151,7 +151,7 @@ declare const _default: {
151
151
  hintProgressColor?: string;
152
152
  canScrollPage?: boolean;
153
153
  editorChangeDelay?: number;
154
- flags?: Record<"image-widget-upgrade-gif-controls" | "input-number-to-numeric-input", boolean>;
154
+ flags?: Record<"input-number-to-numeric-input", boolean>;
155
155
  }> & {
156
156
  baseElements: NonNullable<import("../..").APIOptions["baseElements"]>;
157
157
  canScrollPage: NonNullable<import("../..").APIOptions["canScrollPage"]>;
@@ -75,7 +75,7 @@ declare class MockWidgetComponent extends React.Component<Props> implements Widg
75
75
  hintProgressColor?: string;
76
76
  canScrollPage?: boolean;
77
77
  editorChangeDelay?: number;
78
- flags?: Record<"image-widget-upgrade-gif-controls" | "input-number-to-numeric-input", boolean>;
78
+ flags?: Record<"input-number-to-numeric-input", boolean>;
79
79
  }> & {
80
80
  baseElements: NonNullable<import("../..").APIOptions["baseElements"]>;
81
81
  canScrollPage: NonNullable<import("../..").APIOptions["canScrollPage"]>;
@@ -83,7 +83,7 @@ export declare class NumericInput extends React.Component<NumericInputProps> imp
83
83
  hintProgressColor?: string;
84
84
  canScrollPage?: boolean;
85
85
  editorChangeDelay?: number;
86
- flags?: Record<"image-widget-upgrade-gif-controls" | "input-number-to-numeric-input", boolean>;
86
+ flags?: Record<"input-number-to-numeric-input", boolean>;
87
87
  }> & {
88
88
  baseElements: NonNullable<import("../..").APIOptions["baseElements"]>;
89
89
  canScrollPage: NonNullable<import("../..").APIOptions["canScrollPage"]>;
@@ -45,7 +45,7 @@ export declare const NumericInputComponent: React.ForwardRefExoticComponent<impo
45
45
  hintProgressColor?: string;
46
46
  canScrollPage?: boolean;
47
47
  editorChangeDelay?: number;
48
- flags?: Record<"image-widget-upgrade-gif-controls" | "input-number-to-numeric-input", boolean>;
48
+ flags?: Record<"input-number-to-numeric-input", boolean>;
49
49
  }> & {
50
50
  baseElements: NonNullable<import("../..").APIOptions["baseElements"]>;
51
51
  canScrollPage: NonNullable<import("../..").APIOptions["canScrollPage"]>;
@@ -104,7 +104,7 @@ export declare const NumericInputComponent: React.ForwardRefExoticComponent<impo
104
104
  hintProgressColor?: string;
105
105
  canScrollPage?: boolean;
106
106
  editorChangeDelay?: number;
107
- flags?: Record<"image-widget-upgrade-gif-controls" | "input-number-to-numeric-input", boolean>;
107
+ flags?: Record<"input-number-to-numeric-input", boolean>;
108
108
  }> & {
109
109
  baseElements: NonNullable<import("../..").APIOptions["baseElements"]>;
110
110
  canScrollPage: NonNullable<import("../..").APIOptions["canScrollPage"]>;
@@ -83,7 +83,7 @@ declare class Table extends React.Component<Props> implements Widget {
83
83
  hintProgressColor?: string;
84
84
  canScrollPage?: boolean;
85
85
  editorChangeDelay?: number;
86
- flags?: Record<"image-widget-upgrade-gif-controls" | "input-number-to-numeric-input", boolean>;
86
+ flags?: Record<"input-number-to-numeric-input", boolean>;
87
87
  }> & {
88
88
  baseElements: NonNullable<import("../..").APIOptions["baseElements"]>;
89
89
  canScrollPage: NonNullable<import("../..").APIOptions["canScrollPage"]>;
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": "77.10.1",
6
+ "version": "77.11.0",
7
7
  "publishConfig": {
8
8
  "access": "public"
9
9
  },
@@ -43,12 +43,12 @@
43
43
  "tiny-invariant": "1.3.1",
44
44
  "uuid": "^10.0.0",
45
45
  "@khanacademy/kas": "2.2.3",
46
- "@khanacademy/keypad-context": "3.2.60",
47
- "@khanacademy/kmath": "2.4.18",
48
- "@khanacademy/math-input": "26.4.32",
49
- "@khanacademy/perseus-core": "27.3.0",
50
- "@khanacademy/perseus-linter": "5.0.15",
51
- "@khanacademy/perseus-score": "8.11.2",
46
+ "@khanacademy/keypad-context": "3.2.61",
47
+ "@khanacademy/kmath": "2.4.19",
48
+ "@khanacademy/math-input": "26.4.33",
49
+ "@khanacademy/perseus-core": "27.4.0",
50
+ "@khanacademy/perseus-linter": "5.1.0",
51
+ "@khanacademy/perseus-score": "8.11.3",
52
52
  "@khanacademy/perseus-utils": "2.1.5",
53
53
  "@khanacademy/pure-markdown": "2.2.8",
54
54
  "@khanacademy/simple-markdown": "2.2.3"