@khanacademy/perseus 8.0.0 → 9.0.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 (39) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/article-renderer.d.ts +2 -1
  3. package/dist/dependencies.d.ts +7 -1
  4. package/dist/es/index.js +66 -29
  5. package/dist/es/index.js.map +1 -1
  6. package/dist/index.js +66 -29
  7. package/dist/index.js.map +1 -1
  8. package/dist/interaction-tracker.d.ts +3 -3
  9. package/dist/item-renderer.d.ts +2 -1
  10. package/dist/multi-items/multi-renderer.d.ts +2 -1
  11. package/dist/perseus-api.d.ts +1 -1
  12. package/dist/renderer.d.ts +1 -1
  13. package/dist/server-item-renderer.d.ts +3 -1
  14. package/dist/types.d.ts +29 -9
  15. package/dist/widgets/expression.d.ts +409 -12
  16. package/dist/widgets/graded-group.d.ts +2 -2
  17. package/dist/widgets/sequence.d.ts +2 -2
  18. package/package.json +3 -3
  19. package/src/__stories__/article-renderer.stories.tsx +35 -2
  20. package/src/__testdata__/article-renderer.testdata.ts +71 -0
  21. package/src/__tests__/item-renderer.test.tsx +12 -1
  22. package/src/__tests__/server-item-renderer.test.tsx +9 -1
  23. package/src/article-renderer.tsx +38 -30
  24. package/src/dependencies.ts +16 -1
  25. package/src/interaction-tracker.ts +3 -3
  26. package/src/item-renderer.tsx +62 -44
  27. package/src/multi-items/__tests__/multi-renderer.test.tsx +6 -1
  28. package/src/multi-items/multi-renderer.tsx +16 -4
  29. package/src/renderer.tsx +1 -1
  30. package/src/server-item-renderer.tsx +21 -16
  31. package/src/types.ts +49 -13
  32. package/src/widgets/__stories__/definition.stories.tsx +8 -1
  33. package/src/widgets/__stories__/expression.stories.tsx +2 -2
  34. package/src/widgets/__tests__/{expression.test.ts → expression.test.tsx} +73 -8
  35. package/src/widgets/__tests__/renderQuestion.tsx +26 -18
  36. package/src/widgets/expression.tsx +82 -48
  37. package/src/widgets/graded-group.tsx +11 -2
  38. package/src/widgets/sequence.tsx +10 -2
  39. package/tsconfig-build.tsbuildinfo +1 -1
@@ -2,10 +2,10 @@ import type { APIOptions, Tracking } from "./types";
2
2
  /**
3
3
  * Wrapper for the trackInteraction apiOption.
4
4
  */
5
- declare class InteractionTracker {
5
+ declare class InteractionTracker<T> {
6
6
  _tracked: boolean;
7
7
  setting: Tracking;
8
- track: (extraData?: any) => void;
8
+ track: (extraData?: T) => void;
9
9
  trackApi: any;
10
10
  widgetID: string;
11
11
  widgetType: string;
@@ -18,6 +18,6 @@ declare class InteractionTracker {
18
18
  * @param extraData Any extra data to track about the event.
19
19
  * @private
20
20
  */
21
- _track: (extraData: Record<string, any>) => void;
21
+ _track: (extraData: T) => void;
22
22
  }
23
23
  export default InteractionTracker;
@@ -3,7 +3,7 @@ import HintsRenderer from "./hints-renderer";
3
3
  import Renderer from "./renderer";
4
4
  import type { KeypadProps } from "./mixins/provide-keypad";
5
5
  import type { PerseusItem } from "./perseus-types";
6
- import type { APIOptions, FocusPath, LinterContextProps } from "./types";
6
+ import type { APIOptions, FocusPath, LinterContextProps, PerseusDependenciesV2 } from "./types";
7
7
  import type { KEScore } from "@khanacademy/perseus-core";
8
8
  type Props = // These props are used by the ProvideKeypad mixin.
9
9
  KeypadProps & {
@@ -23,6 +23,7 @@ KeypadProps & {
23
23
  savedState: any;
24
24
  linterContext: LinterContextProps;
25
25
  legacyPerseusLint?: ReadonlyArray<string>;
26
+ dependencies: PerseusDependenciesV2;
26
27
  };
27
28
  type DefaultProps = {
28
29
  apiOptions: Props["apiOptions"];
@@ -1,7 +1,7 @@
1
1
  import * as React from "react";
2
2
  import Renderer from "../renderer";
3
3
  import type { Widget } from "../renderer";
4
- import type { APIOptions, FilterCriterion } from "../types";
4
+ import type { APIOptions, FilterCriterion, PerseusDependenciesV2 } from "../types";
5
5
  import type { Item, ContentNode, HintNode, TagsNode } from "./item-types";
6
6
  import type { Shape, ArrayShape } from "./shape-types";
7
7
  import type { Tree } from "./tree-types";
@@ -47,6 +47,7 @@ type Props = {
47
47
  onInteractWithWidget?: (id: string) => void;
48
48
  apiOptions?: APIOptions;
49
49
  reviewMode?: boolean | null | undefined;
50
+ dependencies: PerseusDependenciesV2;
50
51
  };
51
52
  type State = {
52
53
  rendererDataTree: RendererDataTree | null | undefined;
@@ -83,7 +83,7 @@ export declare const ApiOptions: {
83
83
  type: string;
84
84
  id: string;
85
85
  correct?: boolean | undefined;
86
- } & Record<string, unknown>) => void) | undefined;
86
+ } & Partial<import("./types").TrackingGradedGroupExtraArguments> & Partial<import("./types").TrackingSequenceExtraArguments>) => void) | undefined;
87
87
  customKeypad?: boolean | undefined;
88
88
  useV2Keypad?: boolean | undefined;
89
89
  nativeKeypadProxy?: ((blur: () => void) => import("@khanacademy/math-input").KeypadAPI) | undefined;
@@ -93,7 +93,7 @@ declare class Renderer extends React.Component<Props, State> {
93
93
  _currentFocus: FocusPath | null | undefined;
94
94
  _foundTextNodes: boolean;
95
95
  _interactionTrackers: {
96
- [id: string]: InteractionTracker;
96
+ [id: string]: InteractionTracker<any>;
97
97
  };
98
98
  _isMounted: boolean;
99
99
  _isTwoColumn: boolean;
@@ -9,7 +9,7 @@
9
9
  import * as React from "react";
10
10
  import Renderer from "./renderer";
11
11
  import type { KeypadProps } from "./mixins/provide-keypad";
12
- import type { APIOptions, FocusPath } from "./types";
12
+ import type { APIOptions, FocusPath, PerseusDependenciesV2 } from "./types";
13
13
  import type { RendererInterface, KEScore } from "@khanacademy/perseus-core";
14
14
  type OwnProps = // These props are used by the ProvideKeypad mixin.
15
15
  KeypadProps & {
@@ -22,6 +22,7 @@ KeypadProps & {
22
22
  problemNum?: number;
23
23
  reviewMode?: boolean;
24
24
  keypadElement?: any | null | undefined;
25
+ dependencies: PerseusDependenciesV2;
25
26
  };
26
27
  type HOCProps = {
27
28
  onRendered: (isRendered: boolean) => void;
@@ -110,5 +111,6 @@ declare const ref: React.ForwardRefExoticComponent<Omit<KeypadProps & {
110
111
  problemNum?: number | undefined;
111
112
  reviewMode?: boolean | undefined;
112
113
  keypadElement?: any | null | undefined;
114
+ dependencies: PerseusDependenciesV2;
113
115
  } & HOCProps, "onRendered"> & React.RefAttributes<ServerItemRenderer>>;
114
116
  export default ref;
package/dist/types.d.ts CHANGED
@@ -4,10 +4,11 @@ import type { Item } from "./multi-items/item-types";
4
4
  import type { PerseusWidget } from "./perseus-types";
5
5
  import type { SizeClass } from "./util/sizing-utils";
6
6
  import type { KeypadAPI } from "@khanacademy/math-input";
7
- import type { SendEventFn } from "@khanacademy/perseus-core";
7
+ import type { AnalyticsEventHandlerFn } from "@khanacademy/perseus-core";
8
8
  import type { Result } from "@khanacademy/wonder-blocks-data";
9
9
  import type * as React from "react";
10
10
  export type FocusPath = ReadonlyArray<string> | null | undefined;
11
+ type Empty = Record<never, never>;
11
12
  export type Dimensions = {
12
13
  width?: number;
13
14
  height?: number;
@@ -75,6 +76,11 @@ export type ImageUploader = (file: string, callback: (url: string) => unknown) =
75
76
  export type WidgetSize = "normal" | "small" | "mini";
76
77
  export type Path = ReadonlyArray<string>;
77
78
  type StubTagEditorType = any;
79
+ type TrackInteractionArgs = {
80
+ type: string;
81
+ id: string;
82
+ correct?: boolean;
83
+ } & Partial<TrackingGradedGroupExtraArguments> & Partial<TrackingSequenceExtraArguments>;
78
84
  export type APIOptions = Readonly<{
79
85
  isArticle?: boolean;
80
86
  onInputError?: (widgetId: any, value: string, message?: string | null | undefined) => unknown;
@@ -92,11 +98,7 @@ export type APIOptions = Readonly<{
92
98
  Link: React.ComponentType<any>;
93
99
  };
94
100
  imagePreloader?: (dimensions: Dimensions) => React.ReactNode;
95
- trackInteraction?: (args: {
96
- type: string;
97
- id: string;
98
- correct?: boolean;
99
- } & Record<string, unknown>) => void;
101
+ trackInteraction?: (args: TrackInteractionArgs) => void;
100
102
  customKeypad?: boolean;
101
103
  useV2Keypad?: boolean;
102
104
  nativeKeypadProxy?: (blur: () => void) => KeypadAPI;
@@ -161,7 +163,6 @@ export type PerseusDependencies = {
161
163
  TeX: React.ComponentType<TeXProps>;
162
164
  staticUrl: StaticUrlFn;
163
165
  InitialRequestUrl: InitialRequestUrlInterface;
164
- analytics: SendEventFn;
165
166
  useVideo(id: string, kind: VideoKind): Result<{
166
167
  video: VideoData | null | undefined;
167
168
  }>;
@@ -170,6 +171,19 @@ export type PerseusDependencies = {
170
171
  kaLocale: string;
171
172
  isMobile: boolean;
172
173
  };
174
+ /**
175
+ * The modern iteration of Perseus Depedndencies. These dependencies are
176
+ * provided to Perseus through its entrypoints (for example:
177
+ * ServerItemRenderer) and then attached to the DependenciesContext so they are
178
+ * available anywhere down the React render tree.
179
+ *
180
+ * Prefer using this type over `PerseusDependencies` when possible.
181
+ */
182
+ export type PerseusDependenciesV2 = {
183
+ analytics: {
184
+ onAnalyticsEvent: AnalyticsEventHandlerFn;
185
+ };
186
+ };
173
187
  export type APIOptionsWithDefaults = Readonly<APIOptions & {
174
188
  GroupMetadataEditor: NonNullable<APIOptions["GroupMetadataEditor"]>;
175
189
  baseElements: NonNullable<APIOptions["baseElements"]>;
@@ -195,6 +209,12 @@ export type LinterContextProps = {
195
209
  stack: ReadonlyArray<string>;
196
210
  };
197
211
  export type Tracking = "" | "all";
212
+ export type TrackingGradedGroupExtraArguments = {
213
+ status: "correct" | "incorrect" | "invalid";
214
+ };
215
+ export type TrackingSequenceExtraArguments = {
216
+ visible: number;
217
+ };
198
218
  export type Alignment = "default" | "block" | "inline-block" | "inline" | "float-left" | "float-right" | "full-width";
199
219
  type WidgetOptions = any;
200
220
  export type WidgetTransform = (arg1: WidgetOptions, problemNumber?: number) => any;
@@ -220,7 +240,7 @@ export type WidgetExports<T extends React.ComponentType<any> = React.ComponentTy
220
240
  }>;
221
241
  export type WidgetInfo = PerseusWidget;
222
242
  export type FilterCriterion = string | ((id: string, widgetInfo: WidgetInfo, widget?: Widget | null | undefined) => boolean);
223
- export type WidgetProps<RenderProps, Rubric> = RenderProps & {
243
+ export type WidgetProps<RenderProps, Rubric, TrackingExtraArgs = Empty> = RenderProps & {
224
244
  widgetId: string;
225
245
  alignment: string | null | undefined;
226
246
  static: boolean | null | undefined;
@@ -233,7 +253,7 @@ export type WidgetProps<RenderProps, Rubric> = RenderProps & {
233
253
  findWidgets: (arg1: FilterCriterion) => ReadonlyArray<Widget>;
234
254
  reviewModeRubric: Rubric;
235
255
  onChange: ChangeHandler;
236
- trackInteraction: (extraData?: any) => void;
256
+ trackInteraction: (extraData?: TrackingExtraArgs) => void;
237
257
  isLastUsedWidget: boolean;
238
258
  linterContext: LinterContextProps;
239
259
  containerSizeClass: SizeClass;
@@ -1,11 +1,20 @@
1
+ import { KeypadType } from "@khanacademy/math-input";
1
2
  import * as React from "react";
3
+ import { useDependencies } from "../dependencies";
2
4
  import type { PerseusExpressionWidgetOptions } from "../perseus-types";
3
5
  import type { PerseusScore, WidgetProps } from "../types";
4
6
  import type { Keys as Key } from "@khanacademy/math-input";
5
7
  type InputPath = ReadonlyArray<string>;
6
8
  type Rubric = PerseusExpressionWidgetOptions;
9
+ type RenderProps = {
10
+ buttonSets: PerseusExpressionWidgetOptions["buttonSets"];
11
+ buttonsVisible?: PerseusExpressionWidgetOptions["buttonsVisible"];
12
+ functions: PerseusExpressionWidgetOptions["functions"];
13
+ times: PerseusExpressionWidgetOptions["times"];
14
+ keypadConfiguration: ReturnType<typeof keypadConfigurationForProps>;
15
+ };
7
16
  type ExternalProps = WidgetProps<RenderProps, Rubric>;
8
- export type Props = ExternalProps & {
17
+ export type Props = ExternalProps & ReturnType<typeof useDependencies> & {
9
18
  apiOptions: NonNullable<ExternalProps["apiOptions"]>;
10
19
  buttonSets: NonNullable<ExternalProps["buttonSets"]>;
11
20
  functions: NonNullable<ExternalProps["functions"]>;
@@ -56,22 +65,219 @@ export declare class Expression extends React.Component<Props, ExpressionState>
56
65
  getInputPaths: () => ReadonlyArray<ReadonlyArray<any>>;
57
66
  getGrammarTypeForPath: (inputPath: string) => string;
58
67
  setInputValue: (path: string, newValue: string, cb: () => void) => void;
68
+ sendExpressionEvaluatedEvent(result: "correct" | "incorrect" | "invalid"): void;
59
69
  render(): React.ReactNode | React.ReactElement<React.ComponentProps<"div">>;
60
70
  }
61
- type RenderProps = {
62
- buttonSets: any;
63
- buttonsVisible?: "always" | "focused" | "never";
64
- functions: ReadonlyArray<string>;
65
- keypadConfiguration: {
66
- extraKeys: ReadonlyArray<any | string>;
67
- keypadType: any;
68
- };
69
- times: boolean;
71
+ /**
72
+ * Determine the keypad configuration parameters for the input, based on the
73
+ * provided properties.
74
+ *
75
+ * There are two configuration parameters to be passed to the keypad:
76
+ * (1) The keypad type. For the Expression widget, we always use the
77
+ * Expression keypad.
78
+ * (2) The extra keys; namely, any variables or constants (like Pi) that need
79
+ * to be included as keys on the keypad. These are scraped from the answer
80
+ * forms.
81
+ */
82
+ declare const keypadConfigurationForProps: (widgetOptions: PerseusExpressionWidgetOptions) => {
83
+ keypadType: KeypadType;
84
+ extraKeys: string[];
70
85
  };
71
86
  declare const _default: Readonly<{
72
87
  name: string;
73
88
  displayName: string;
74
- getWidget?: (() => typeof Expression) | undefined;
89
+ getWidget?: (() => React.ForwardRefExoticComponent<Omit<Pick<RenderProps & {
90
+ widgetId: string;
91
+ alignment: string | null | undefined;
92
+ static: boolean | null | undefined;
93
+ problemNum: number | null | undefined;
94
+ apiOptions: Readonly<Readonly<{
95
+ isArticle?: boolean | undefined;
96
+ onInputError?: ((widgetId: any, value: string, message?: string | null | undefined) => unknown) | undefined;
97
+ onFocusChange?: ((newFocusPath: import("../types").FocusPath, oldFocusPath: import("../types").FocusPath, keypadElement?: HTMLElement | undefined, focusedElement?: HTMLElement | undefined) => unknown) | undefined;
98
+ GroupMetadataEditor?: React.ComponentType<any> | undefined;
99
+ showAlignmentOptions?: boolean | undefined;
100
+ readOnly?: boolean | undefined;
101
+ answerableCallback?: ((arg1: boolean) => unknown) | undefined;
102
+ getAnotherHint?: (() => unknown) | undefined;
103
+ interactionCallback?: (() => unknown) | undefined;
104
+ groupAnnotator?: ((groupNumber: number, widgetId: string) => React.ReactNode) | undefined;
105
+ imagePlaceholder?: React.ReactNode;
106
+ widgetPlaceholder?: React.ReactNode;
107
+ baseElements?: {
108
+ Link: React.ComponentType<any>;
109
+ } | undefined;
110
+ imagePreloader?: ((dimensions: import("../types").Dimensions) => React.ReactNode) | undefined;
111
+ trackInteraction?: ((args: {
112
+ type: string;
113
+ id: string;
114
+ correct?: boolean | undefined;
115
+ } & Partial<import("../types").TrackingGradedGroupExtraArguments> & Partial<import("../types").TrackingSequenceExtraArguments>) => void) | undefined;
116
+ customKeypad?: boolean | undefined;
117
+ useV2Keypad?: boolean | undefined;
118
+ nativeKeypadProxy?: ((blur: () => void) => import("@khanacademy/math-input").KeypadAPI) | undefined;
119
+ isMobile?: boolean | undefined;
120
+ setDrawingAreaAvailable?: ((arg1: boolean) => unknown) | undefined;
121
+ useDraftEditor?: boolean | undefined;
122
+ hintProgressColor?: string | undefined;
123
+ canScrollPage?: boolean | undefined;
124
+ inModal?: boolean | undefined;
125
+ crossOutEnabled?: boolean | undefined;
126
+ editorChangeDelay?: number | undefined;
127
+ }> & {
128
+ GroupMetadataEditor: NonNullable<React.ComponentType<any> | undefined>;
129
+ baseElements: {
130
+ Link: React.ComponentType<any>;
131
+ };
132
+ canScrollPage: NonNullable<boolean | undefined>;
133
+ crossOutEnabled: NonNullable<boolean | undefined>;
134
+ editorChangeDelay: number;
135
+ groupAnnotator: (groupNumber: number, widgetId: string) => React.ReactNode;
136
+ inModal: NonNullable<boolean | undefined>;
137
+ isArticle: NonNullable<boolean | undefined>;
138
+ isMobile: NonNullable<boolean | undefined>;
139
+ useV2Keypad: NonNullable<boolean | undefined>;
140
+ onFocusChange: (newFocusPath: import("../types").FocusPath, oldFocusPath: import("../types").FocusPath, keypadElement?: HTMLElement | undefined, focusedElement?: HTMLElement | undefined) => unknown;
141
+ onInputError: (widgetId: any, value: string, message?: string | null | undefined) => unknown;
142
+ readOnly: NonNullable<boolean | undefined>;
143
+ setDrawingAreaAvailable: (arg1: boolean) => unknown;
144
+ showAlignmentOptions: NonNullable<boolean | undefined>;
145
+ useDraftEditor: NonNullable<boolean | undefined>;
146
+ }>;
147
+ keypadElement?: any;
148
+ questionCompleted?: boolean | undefined;
149
+ onFocus: (blurPath: import("../types").FocusPath) => void;
150
+ onBlur: (blurPath: import("../types").FocusPath) => void;
151
+ findWidgets: (arg1: import("../types").FilterCriterion) => readonly any[];
152
+ reviewModeRubric: PerseusExpressionWidgetOptions;
153
+ onChange: import("../types").ChangeHandler;
154
+ trackInteraction: (extraData?: {} | undefined) => void;
155
+ isLastUsedWidget: boolean;
156
+ linterContext: import("../types").LinterContextProps;
157
+ containerSizeClass: import("../util/sizing-utils").SizeClass;
158
+ } & import("../types").PerseusDependenciesV2 & {
159
+ apiOptions: Readonly<Readonly<{
160
+ isArticle?: boolean | undefined;
161
+ onInputError?: ((widgetId: any, value: string, message?: string | null | undefined) => unknown) | undefined;
162
+ onFocusChange?: ((newFocusPath: import("../types").FocusPath, oldFocusPath: import("../types").FocusPath, keypadElement?: HTMLElement | undefined, focusedElement?: HTMLElement | undefined) => unknown) | undefined;
163
+ GroupMetadataEditor?: React.ComponentType<any> | undefined;
164
+ showAlignmentOptions?: boolean | undefined;
165
+ readOnly?: boolean | undefined;
166
+ answerableCallback?: ((arg1: boolean) => unknown) | undefined;
167
+ getAnotherHint?: (() => unknown) | undefined;
168
+ interactionCallback?: (() => unknown) | undefined;
169
+ groupAnnotator?: ((groupNumber: number, widgetId: string) => React.ReactNode) | undefined;
170
+ imagePlaceholder?: React.ReactNode;
171
+ widgetPlaceholder?: React.ReactNode;
172
+ baseElements?: {
173
+ Link: React.ComponentType<any>;
174
+ } | undefined;
175
+ imagePreloader?: ((dimensions: import("../types").Dimensions) => React.ReactNode) | undefined;
176
+ trackInteraction?: ((args: {
177
+ type: string;
178
+ id: string;
179
+ correct?: boolean | undefined;
180
+ } & Partial<import("../types").TrackingGradedGroupExtraArguments> & Partial<import("../types").TrackingSequenceExtraArguments>) => void) | undefined;
181
+ customKeypad?: boolean | undefined;
182
+ useV2Keypad?: boolean | undefined;
183
+ nativeKeypadProxy?: ((blur: () => void) => import("@khanacademy/math-input").KeypadAPI) | undefined;
184
+ isMobile?: boolean | undefined;
185
+ setDrawingAreaAvailable?: ((arg1: boolean) => unknown) | undefined;
186
+ useDraftEditor?: boolean | undefined;
187
+ hintProgressColor?: string | undefined;
188
+ canScrollPage?: boolean | undefined;
189
+ inModal?: boolean | undefined;
190
+ crossOutEnabled?: boolean | undefined;
191
+ editorChangeDelay?: number | undefined;
192
+ }> & {
193
+ GroupMetadataEditor: NonNullable<React.ComponentType<any> | undefined>;
194
+ baseElements: {
195
+ Link: React.ComponentType<any>;
196
+ };
197
+ canScrollPage: NonNullable<boolean | undefined>;
198
+ crossOutEnabled: NonNullable<boolean | undefined>;
199
+ editorChangeDelay: number;
200
+ groupAnnotator: (groupNumber: number, widgetId: string) => React.ReactNode;
201
+ inModal: NonNullable<boolean | undefined>;
202
+ isArticle: NonNullable<boolean | undefined>;
203
+ isMobile: NonNullable<boolean | undefined>;
204
+ useV2Keypad: NonNullable<boolean | undefined>;
205
+ onFocusChange: (newFocusPath: import("../types").FocusPath, oldFocusPath: import("../types").FocusPath, keypadElement?: HTMLElement | undefined, focusedElement?: HTMLElement | undefined) => unknown;
206
+ onInputError: (widgetId: any, value: string, message?: string | null | undefined) => unknown;
207
+ readOnly: NonNullable<boolean | undefined>;
208
+ setDrawingAreaAvailable: (arg1: boolean) => unknown;
209
+ showAlignmentOptions: NonNullable<boolean | undefined>;
210
+ useDraftEditor: NonNullable<boolean | undefined>;
211
+ }>;
212
+ buttonSets: readonly string[];
213
+ functions: readonly string[];
214
+ linterContext: import("../types").LinterContextProps;
215
+ onBlur: (blurPath: import("../types").FocusPath) => void;
216
+ onFocus: (blurPath: import("../types").FocusPath) => void;
217
+ times: boolean;
218
+ value: string;
219
+ }, "static" | "trackInteraction" | "onChange" | "problemNum" | "questionCompleted" | "keypadElement" | "alignment" | "findWidgets" | "buttonsVisible" | "containerSizeClass" | "widgetId" | "keypadConfiguration" | "reviewModeRubric" | "isLastUsedWidget" | "analytics"> & {
220
+ value?: string | undefined;
221
+ onFocus?: ((blurPath: import("../types").FocusPath) => void) | undefined;
222
+ onBlur?: ((blurPath: import("../types").FocusPath) => void) | undefined;
223
+ linterContext?: import("../types").LinterContextProps | undefined;
224
+ apiOptions?: Readonly<Readonly<{
225
+ isArticle?: boolean | undefined;
226
+ onInputError?: ((widgetId: any, value: string, message?: string | null | undefined) => unknown) | undefined;
227
+ onFocusChange?: ((newFocusPath: import("../types").FocusPath, oldFocusPath: import("../types").FocusPath, keypadElement?: HTMLElement | undefined, focusedElement?: HTMLElement | undefined) => unknown) | undefined;
228
+ GroupMetadataEditor?: React.ComponentType<any> | undefined;
229
+ showAlignmentOptions?: boolean | undefined;
230
+ readOnly?: boolean | undefined;
231
+ answerableCallback?: ((arg1: boolean) => unknown) | undefined;
232
+ getAnotherHint?: (() => unknown) | undefined;
233
+ interactionCallback?: (() => unknown) | undefined;
234
+ groupAnnotator?: ((groupNumber: number, widgetId: string) => React.ReactNode) | undefined;
235
+ imagePlaceholder?: React.ReactNode;
236
+ widgetPlaceholder?: React.ReactNode;
237
+ baseElements?: {
238
+ Link: React.ComponentType<any>;
239
+ } | undefined;
240
+ imagePreloader?: ((dimensions: import("../types").Dimensions) => React.ReactNode) | undefined;
241
+ trackInteraction?: ((args: {
242
+ type: string;
243
+ id: string;
244
+ correct?: boolean | undefined;
245
+ } & Partial<import("../types").TrackingGradedGroupExtraArguments> & Partial<import("../types").TrackingSequenceExtraArguments>) => void) | undefined;
246
+ customKeypad?: boolean | undefined;
247
+ useV2Keypad?: boolean | undefined;
248
+ nativeKeypadProxy?: ((blur: () => void) => import("@khanacademy/math-input").KeypadAPI) | undefined;
249
+ isMobile?: boolean | undefined;
250
+ setDrawingAreaAvailable?: ((arg1: boolean) => unknown) | undefined;
251
+ useDraftEditor?: boolean | undefined;
252
+ hintProgressColor?: string | undefined;
253
+ canScrollPage?: boolean | undefined;
254
+ inModal?: boolean | undefined;
255
+ crossOutEnabled?: boolean | undefined;
256
+ editorChangeDelay?: number | undefined;
257
+ }> & {
258
+ GroupMetadataEditor: NonNullable<React.ComponentType<any> | undefined>;
259
+ baseElements: {
260
+ Link: React.ComponentType<any>;
261
+ };
262
+ canScrollPage: NonNullable<boolean | undefined>;
263
+ crossOutEnabled: NonNullable<boolean | undefined>;
264
+ editorChangeDelay: number;
265
+ groupAnnotator: (groupNumber: number, widgetId: string) => React.ReactNode;
266
+ inModal: NonNullable<boolean | undefined>;
267
+ isArticle: NonNullable<boolean | undefined>;
268
+ isMobile: NonNullable<boolean | undefined>;
269
+ useV2Keypad: NonNullable<boolean | undefined>;
270
+ onFocusChange: (newFocusPath: import("../types").FocusPath, oldFocusPath: import("../types").FocusPath, keypadElement?: HTMLElement | undefined, focusedElement?: HTMLElement | undefined) => unknown;
271
+ onInputError: (widgetId: any, value: string, message?: string | null | undefined) => unknown;
272
+ readOnly: NonNullable<boolean | undefined>;
273
+ setDrawingAreaAvailable: (arg1: boolean) => unknown;
274
+ showAlignmentOptions: NonNullable<boolean | undefined>;
275
+ useDraftEditor: NonNullable<boolean | undefined>;
276
+ }> | undefined;
277
+ times?: boolean | undefined;
278
+ buttonSets?: readonly string[] | undefined;
279
+ functions?: readonly string[] | undefined;
280
+ } & {}, "analytics"> & React.RefAttributes<Expression>>) | undefined;
75
281
  accessible?: boolean | ((props: any) => boolean) | undefined;
76
282
  hidden?: boolean | undefined;
77
283
  version?: import("../types").Version | undefined;
@@ -86,6 +292,197 @@ declare const _default: Readonly<{
86
292
  propUpgrades?: {
87
293
  [key: string]: (arg1: any) => any;
88
294
  } | undefined;
89
- widget: typeof Expression;
295
+ widget: React.ForwardRefExoticComponent<Omit<Pick<RenderProps & {
296
+ widgetId: string;
297
+ alignment: string | null | undefined;
298
+ static: boolean | null | undefined;
299
+ problemNum: number | null | undefined;
300
+ apiOptions: Readonly<Readonly<{
301
+ isArticle?: boolean | undefined;
302
+ onInputError?: ((widgetId: any, value: string, message?: string | null | undefined) => unknown) | undefined;
303
+ onFocusChange?: ((newFocusPath: import("../types").FocusPath, oldFocusPath: import("../types").FocusPath, keypadElement?: HTMLElement | undefined, focusedElement?: HTMLElement | undefined) => unknown) | undefined;
304
+ GroupMetadataEditor?: React.ComponentType<any> | undefined;
305
+ showAlignmentOptions?: boolean | undefined;
306
+ readOnly?: boolean | undefined;
307
+ answerableCallback?: ((arg1: boolean) => unknown) | undefined;
308
+ getAnotherHint?: (() => unknown) | undefined;
309
+ interactionCallback?: (() => unknown) | undefined;
310
+ groupAnnotator?: ((groupNumber: number, widgetId: string) => React.ReactNode) | undefined;
311
+ imagePlaceholder?: React.ReactNode;
312
+ widgetPlaceholder?: React.ReactNode;
313
+ baseElements?: {
314
+ Link: React.ComponentType<any>;
315
+ } | undefined;
316
+ imagePreloader?: ((dimensions: import("../types").Dimensions) => React.ReactNode) | undefined;
317
+ trackInteraction?: ((args: {
318
+ type: string;
319
+ id: string;
320
+ correct?: boolean | undefined;
321
+ } & Partial<import("../types").TrackingGradedGroupExtraArguments> & Partial<import("../types").TrackingSequenceExtraArguments>) => void) | undefined;
322
+ customKeypad?: boolean | undefined;
323
+ useV2Keypad?: boolean | undefined;
324
+ nativeKeypadProxy?: ((blur: () => void) => import("@khanacademy/math-input").KeypadAPI) | undefined;
325
+ isMobile?: boolean | undefined;
326
+ setDrawingAreaAvailable?: ((arg1: boolean) => unknown) | undefined;
327
+ useDraftEditor?: boolean | undefined;
328
+ hintProgressColor?: string | undefined;
329
+ canScrollPage?: boolean | undefined;
330
+ inModal?: boolean | undefined;
331
+ crossOutEnabled?: boolean | undefined;
332
+ editorChangeDelay?: number | undefined;
333
+ }> & {
334
+ GroupMetadataEditor: NonNullable<React.ComponentType<any> | undefined>;
335
+ baseElements: {
336
+ Link: React.ComponentType<any>;
337
+ };
338
+ canScrollPage: NonNullable<boolean | undefined>;
339
+ crossOutEnabled: NonNullable<boolean | undefined>;
340
+ editorChangeDelay: number;
341
+ groupAnnotator: (groupNumber: number, widgetId: string) => React.ReactNode;
342
+ inModal: NonNullable<boolean | undefined>;
343
+ isArticle: NonNullable<boolean | undefined>;
344
+ isMobile: NonNullable<boolean | undefined>;
345
+ useV2Keypad: NonNullable<boolean | undefined>;
346
+ onFocusChange: (newFocusPath: import("../types").FocusPath, oldFocusPath: import("../types").FocusPath, keypadElement?: HTMLElement | undefined, focusedElement?: HTMLElement | undefined) => unknown;
347
+ onInputError: (widgetId: any, value: string, message?: string | null | undefined) => unknown;
348
+ readOnly: NonNullable<boolean | undefined>;
349
+ setDrawingAreaAvailable: (arg1: boolean) => unknown;
350
+ showAlignmentOptions: NonNullable<boolean | undefined>;
351
+ useDraftEditor: NonNullable<boolean | undefined>;
352
+ }>;
353
+ keypadElement?: any;
354
+ questionCompleted?: boolean | undefined;
355
+ onFocus: (blurPath: import("../types").FocusPath) => void;
356
+ onBlur: (blurPath: import("../types").FocusPath) => void;
357
+ findWidgets: (arg1: import("../types").FilterCriterion) => readonly any[];
358
+ reviewModeRubric: PerseusExpressionWidgetOptions;
359
+ onChange: import("../types").ChangeHandler;
360
+ trackInteraction: (extraData?: {} | undefined) => void;
361
+ isLastUsedWidget: boolean;
362
+ linterContext: import("../types").LinterContextProps;
363
+ containerSizeClass: import("../util/sizing-utils").SizeClass;
364
+ } & import("../types").PerseusDependenciesV2 & {
365
+ apiOptions: Readonly<Readonly<{
366
+ isArticle?: boolean | undefined;
367
+ onInputError?: ((widgetId: any, value: string, message?: string | null | undefined) => unknown) | undefined;
368
+ onFocusChange?: ((newFocusPath: import("../types").FocusPath, oldFocusPath: import("../types").FocusPath, keypadElement?: HTMLElement | undefined, focusedElement?: HTMLElement | undefined) => unknown) | undefined;
369
+ GroupMetadataEditor?: React.ComponentType<any> | undefined;
370
+ showAlignmentOptions?: boolean | undefined;
371
+ readOnly?: boolean | undefined;
372
+ answerableCallback?: ((arg1: boolean) => unknown) | undefined;
373
+ getAnotherHint?: (() => unknown) | undefined;
374
+ interactionCallback?: (() => unknown) | undefined;
375
+ groupAnnotator?: ((groupNumber: number, widgetId: string) => React.ReactNode) | undefined;
376
+ imagePlaceholder?: React.ReactNode;
377
+ widgetPlaceholder?: React.ReactNode;
378
+ baseElements?: {
379
+ Link: React.ComponentType<any>;
380
+ } | undefined;
381
+ imagePreloader?: ((dimensions: import("../types").Dimensions) => React.ReactNode) | undefined;
382
+ trackInteraction?: ((args: {
383
+ type: string;
384
+ id: string;
385
+ correct?: boolean | undefined;
386
+ } & Partial<import("../types").TrackingGradedGroupExtraArguments> & Partial<import("../types").TrackingSequenceExtraArguments>) => void) | undefined;
387
+ customKeypad?: boolean | undefined;
388
+ useV2Keypad?: boolean | undefined;
389
+ nativeKeypadProxy?: ((blur: () => void) => import("@khanacademy/math-input").KeypadAPI) | undefined;
390
+ isMobile?: boolean | undefined;
391
+ setDrawingAreaAvailable?: ((arg1: boolean) => unknown) | undefined;
392
+ useDraftEditor?: boolean | undefined;
393
+ hintProgressColor?: string | undefined;
394
+ canScrollPage?: boolean | undefined;
395
+ inModal?: boolean | undefined;
396
+ crossOutEnabled?: boolean | undefined;
397
+ editorChangeDelay?: number | undefined;
398
+ }> & {
399
+ GroupMetadataEditor: NonNullable<React.ComponentType<any> | undefined>;
400
+ baseElements: {
401
+ Link: React.ComponentType<any>;
402
+ };
403
+ canScrollPage: NonNullable<boolean | undefined>;
404
+ crossOutEnabled: NonNullable<boolean | undefined>;
405
+ editorChangeDelay: number;
406
+ groupAnnotator: (groupNumber: number, widgetId: string) => React.ReactNode;
407
+ inModal: NonNullable<boolean | undefined>;
408
+ isArticle: NonNullable<boolean | undefined>;
409
+ isMobile: NonNullable<boolean | undefined>;
410
+ useV2Keypad: NonNullable<boolean | undefined>;
411
+ onFocusChange: (newFocusPath: import("../types").FocusPath, oldFocusPath: import("../types").FocusPath, keypadElement?: HTMLElement | undefined, focusedElement?: HTMLElement | undefined) => unknown;
412
+ onInputError: (widgetId: any, value: string, message?: string | null | undefined) => unknown;
413
+ readOnly: NonNullable<boolean | undefined>;
414
+ setDrawingAreaAvailable: (arg1: boolean) => unknown;
415
+ showAlignmentOptions: NonNullable<boolean | undefined>;
416
+ useDraftEditor: NonNullable<boolean | undefined>;
417
+ }>;
418
+ buttonSets: readonly string[];
419
+ functions: readonly string[];
420
+ linterContext: import("../types").LinterContextProps;
421
+ onBlur: (blurPath: import("../types").FocusPath) => void;
422
+ onFocus: (blurPath: import("../types").FocusPath) => void;
423
+ times: boolean;
424
+ value: string;
425
+ }, "static" | "trackInteraction" | "onChange" | "problemNum" | "questionCompleted" | "keypadElement" | "alignment" | "findWidgets" | "buttonsVisible" | "containerSizeClass" | "widgetId" | "keypadConfiguration" | "reviewModeRubric" | "isLastUsedWidget" | "analytics"> & {
426
+ value?: string | undefined;
427
+ onFocus?: ((blurPath: import("../types").FocusPath) => void) | undefined;
428
+ onBlur?: ((blurPath: import("../types").FocusPath) => void) | undefined;
429
+ linterContext?: import("../types").LinterContextProps | undefined;
430
+ apiOptions?: Readonly<Readonly<{
431
+ isArticle?: boolean | undefined;
432
+ onInputError?: ((widgetId: any, value: string, message?: string | null | undefined) => unknown) | undefined;
433
+ onFocusChange?: ((newFocusPath: import("../types").FocusPath, oldFocusPath: import("../types").FocusPath, keypadElement?: HTMLElement | undefined, focusedElement?: HTMLElement | undefined) => unknown) | undefined;
434
+ GroupMetadataEditor?: React.ComponentType<any> | undefined;
435
+ showAlignmentOptions?: boolean | undefined;
436
+ readOnly?: boolean | undefined;
437
+ answerableCallback?: ((arg1: boolean) => unknown) | undefined;
438
+ getAnotherHint?: (() => unknown) | undefined;
439
+ interactionCallback?: (() => unknown) | undefined;
440
+ groupAnnotator?: ((groupNumber: number, widgetId: string) => React.ReactNode) | undefined;
441
+ imagePlaceholder?: React.ReactNode;
442
+ widgetPlaceholder?: React.ReactNode;
443
+ baseElements?: {
444
+ Link: React.ComponentType<any>;
445
+ } | undefined;
446
+ imagePreloader?: ((dimensions: import("../types").Dimensions) => React.ReactNode) | undefined;
447
+ trackInteraction?: ((args: {
448
+ type: string;
449
+ id: string;
450
+ correct?: boolean | undefined;
451
+ } & Partial<import("../types").TrackingGradedGroupExtraArguments> & Partial<import("../types").TrackingSequenceExtraArguments>) => void) | undefined;
452
+ customKeypad?: boolean | undefined;
453
+ useV2Keypad?: boolean | undefined;
454
+ nativeKeypadProxy?: ((blur: () => void) => import("@khanacademy/math-input").KeypadAPI) | undefined;
455
+ isMobile?: boolean | undefined;
456
+ setDrawingAreaAvailable?: ((arg1: boolean) => unknown) | undefined;
457
+ useDraftEditor?: boolean | undefined;
458
+ hintProgressColor?: string | undefined;
459
+ canScrollPage?: boolean | undefined;
460
+ inModal?: boolean | undefined;
461
+ crossOutEnabled?: boolean | undefined;
462
+ editorChangeDelay?: number | undefined;
463
+ }> & {
464
+ GroupMetadataEditor: NonNullable<React.ComponentType<any> | undefined>;
465
+ baseElements: {
466
+ Link: React.ComponentType<any>;
467
+ };
468
+ canScrollPage: NonNullable<boolean | undefined>;
469
+ crossOutEnabled: NonNullable<boolean | undefined>;
470
+ editorChangeDelay: number;
471
+ groupAnnotator: (groupNumber: number, widgetId: string) => React.ReactNode;
472
+ inModal: NonNullable<boolean | undefined>;
473
+ isArticle: NonNullable<boolean | undefined>;
474
+ isMobile: NonNullable<boolean | undefined>;
475
+ useV2Keypad: NonNullable<boolean | undefined>;
476
+ onFocusChange: (newFocusPath: import("../types").FocusPath, oldFocusPath: import("../types").FocusPath, keypadElement?: HTMLElement | undefined, focusedElement?: HTMLElement | undefined) => unknown;
477
+ onInputError: (widgetId: any, value: string, message?: string | null | undefined) => unknown;
478
+ readOnly: NonNullable<boolean | undefined>;
479
+ setDrawingAreaAvailable: (arg1: boolean) => unknown;
480
+ showAlignmentOptions: NonNullable<boolean | undefined>;
481
+ useDraftEditor: NonNullable<boolean | undefined>;
482
+ }> | undefined;
483
+ times?: boolean | undefined;
484
+ buttonSets?: readonly string[] | undefined;
485
+ functions?: readonly string[] | undefined;
486
+ } & {}, "analytics"> & React.RefAttributes<Expression>>;
90
487
  }>;
91
488
  export default _default;