@khanacademy/perseus 8.0.0 → 10.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 (60) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/dist/article-renderer.d.ts +2 -1
  3. package/dist/components/info-tip.d.ts +2 -1
  4. package/dist/components/input-with-examples.d.ts +1 -1
  5. package/dist/components/sortable.d.ts +1 -1
  6. package/dist/dependencies.d.ts +7 -1
  7. package/dist/es/index.css +3 -5
  8. package/dist/es/index.js +72 -45
  9. package/dist/es/index.js.map +1 -1
  10. package/dist/hint-renderer.d.ts +2 -1
  11. package/dist/hints-renderer.d.ts +2 -1
  12. package/dist/index.css +3 -5
  13. package/dist/index.d.ts +1 -1
  14. package/dist/index.js +72 -46
  15. package/dist/index.js.map +1 -1
  16. package/dist/interaction-tracker.d.ts +3 -3
  17. package/dist/item-renderer.d.ts +3 -1
  18. package/dist/multi-items/multi-renderer.d.ts +4 -2
  19. package/dist/perseus-api.d.ts +1 -1
  20. package/dist/renderer.d.ts +4 -9
  21. package/dist/server-item-renderer.d.ts +3 -1
  22. package/dist/types.d.ts +30 -15
  23. package/dist/widget-container.d.ts +2 -1
  24. package/dist/widgets/expression.d.ts +409 -12
  25. package/dist/widgets/graded-group.d.ts +2 -2
  26. package/dist/widgets/grapher.d.ts +2 -1
  27. package/dist/widgets/passage-ref.d.ts +2 -1
  28. package/dist/widgets/sequence.d.ts +2 -2
  29. package/package.json +3 -3
  30. package/src/__stories__/article-renderer.stories.tsx +35 -2
  31. package/src/__testdata__/article-renderer.testdata.ts +71 -0
  32. package/src/__tests__/item-renderer.test.tsx +12 -1
  33. package/src/__tests__/renderer.test.tsx +0 -2
  34. package/src/__tests__/server-item-renderer.test.tsx +11 -5
  35. package/src/article-renderer.tsx +38 -30
  36. package/src/components/info-tip.tsx +3 -4
  37. package/src/components/input-with-examples.tsx +1 -1
  38. package/src/components/sortable.tsx +1 -1
  39. package/src/dependencies.ts +16 -1
  40. package/src/hint-renderer.tsx +2 -1
  41. package/src/hints-renderer.tsx +2 -9
  42. package/src/index.ts +0 -1
  43. package/src/interaction-tracker.ts +3 -3
  44. package/src/item-renderer.tsx +57 -44
  45. package/src/multi-items/__tests__/multi-renderer.test.tsx +6 -1
  46. package/src/multi-items/multi-renderer.tsx +18 -11
  47. package/src/renderer.tsx +4 -4
  48. package/src/server-item-renderer.tsx +21 -17
  49. package/src/types.ts +50 -21
  50. package/src/widget-container.tsx +2 -1
  51. package/src/widgets/__stories__/definition.stories.tsx +8 -1
  52. package/src/widgets/__stories__/expression.stories.tsx +2 -2
  53. package/src/widgets/__tests__/{expression.test.ts → expression.test.tsx} +73 -8
  54. package/src/widgets/__tests__/renderQuestion.tsx +29 -29
  55. package/src/widgets/expression.tsx +77 -48
  56. package/src/widgets/graded-group.tsx +11 -2
  57. package/src/widgets/grapher.tsx +4 -12
  58. package/src/widgets/passage-ref.tsx +1 -1
  59. package/src/widgets/sequence.tsx +10 -2
  60. package/tsconfig-build.tsbuildinfo +1 -1
@@ -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("@khanacademy/perseus-linter").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("@khanacademy/perseus-linter").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" | "buttonsVisible" | "containerSizeClass" | "widgetId" | "findWidgets" | "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("@khanacademy/perseus-linter").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("@khanacademy/perseus-linter").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("@khanacademy/perseus-linter").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" | "buttonsVisible" | "containerSizeClass" | "widgetId" | "findWidgets" | "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("@khanacademy/perseus-linter").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;
@@ -1,6 +1,6 @@
1
1
  import * as React from "react";
2
2
  import type { PerseusGradedGroupWidgetOptions } from "../perseus-types";
3
- import type { WidgetProps } from "../types";
3
+ import type { TrackingGradedGroupExtraArguments, WidgetProps } from "../types";
4
4
  import type { ANSWER_BAR_STATES } from "./graded-group-answer-bar";
5
5
  declare const GRADING_STATUSES: {
6
6
  readonly ungraded: "ungraded";
@@ -10,7 +10,7 @@ declare const GRADING_STATUSES: {
10
10
  };
11
11
  type Rubric = PerseusGradedGroupWidgetOptions;
12
12
  type RenderProps = PerseusGradedGroupWidgetOptions;
13
- type Props = WidgetProps<RenderProps, Rubric> & {
13
+ type Props = WidgetProps<RenderProps, Rubric, TrackingGradedGroupExtraArguments> & {
14
14
  inGradedGroupSet?: boolean;
15
15
  onNextQuestion?: () => unknown;
16
16
  };
@@ -4,6 +4,7 @@ import type { Coord } from "../interactive2/types";
4
4
  import type { PerseusGrapherWidgetOptions } from "../perseus-types";
5
5
  import type { PerseusScore, WidgetProps } from "../types";
6
6
  import type { GridDimensions } from "../util";
7
+ import type { PropsFor } from "@khanacademy/wonder-blocks-core";
7
8
  type UserInput = any;
8
9
  type RenderProps = {
9
10
  availableTypes: PerseusGrapherWidgetOptions["availableTypes"];
@@ -30,7 +31,7 @@ declare class Grapher extends React.Component<Props> {
30
31
  box: NonNullable<Props["graph"]["box"]>;
31
32
  gridStep: NonNullable<Props["graph"]["gridStep"]>;
32
33
  }): ReadonlyArray<GridDimensions>;
33
- _calculateMobileTickStep(gridStep: JSX.LibraryManagedAttributes<typeof Graphie, Required<React.ComponentProps<typeof Graphie>>>["gridStep"], step: JSX.LibraryManagedAttributes<typeof Graphie, Required<React.ComponentProps<typeof Graphie>>>["step"], ranges: JSX.LibraryManagedAttributes<typeof Graphie, Required<React.ComponentProps<typeof Graphie>>>["ranges"]): any;
34
+ _calculateMobileTickStep(gridStep: NonNullable<PropsFor<typeof Graphie>["gridStep"]>, step: NonNullable<PropsFor<typeof Graphie>["step"]>, ranges: NonNullable<PropsFor<typeof Graphie>["ranges"]>): any;
34
35
  _setupGraphie: (arg1: any, arg2: any) => void;
35
36
  showHairlines: (arg1: Coord) => void;
36
37
  hideHairlines: () => void;
@@ -1,6 +1,7 @@
1
1
  import * as React from "react";
2
2
  import type { PerseusPassageRefWidgetOptions } from "../perseus-types";
3
- import type { ChangeFn, PerseusScore, WidgetProps, LinterContextProps } from "../types";
3
+ import type { ChangeFn, PerseusScore, WidgetProps } from "../types";
4
+ import type { LinterContextProps } from "@khanacademy/perseus-linter";
4
5
  type UserInput = RenderProps & {
5
6
  static: boolean | null | undefined;
6
7
  reviewModeRubric: Rubric;
@@ -1,8 +1,8 @@
1
1
  import * as React from "react";
2
2
  import type { PerseusSequenceWidgetOptions } from "../perseus-types";
3
- import type { WidgetProps } from "../types";
3
+ import type { TrackingSequenceExtraArguments, WidgetProps } from "../types";
4
4
  type Rubric = PerseusSequenceWidgetOptions;
5
- type ExternalProps = WidgetProps<PerseusSequenceWidgetOptions, Rubric>;
5
+ type ExternalProps = WidgetProps<PerseusSequenceWidgetOptions, Rubric, TrackingSequenceExtraArguments>;
6
6
  type Props = ExternalProps;
7
7
  type DefaultProps = {
8
8
  json: Props["json"];
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": "8.0.0",
6
+ "version": "10.0.0",
7
7
  "publishConfig": {
8
8
  "access": "public"
9
9
  },
@@ -23,8 +23,8 @@
23
23
  "dependencies": {
24
24
  "@khanacademy/kas": "^0.3.1",
25
25
  "@khanacademy/kmath": "^0.1.2",
26
- "@khanacademy/math-input": "^9.0.0",
27
- "@khanacademy/perseus-core": "0.1.1",
26
+ "@khanacademy/math-input": "^10.0.1",
27
+ "@khanacademy/perseus-core": "0.2.0",
28
28
  "@khanacademy/perseus-linter": "^0.3.2",
29
29
  "@khanacademy/pure-markdown": "^0.2.4",
30
30
  "@khanacademy/simple-markdown": "^0.10.0"
@@ -1,6 +1,11 @@
1
1
  import React from "react";
2
2
 
3
- import {passageArticle} from "../__testdata__/article-renderer.testdata";
3
+ import {storybookDependenciesV2} from "../../../../testing/test-dependencies";
4
+ import {
5
+ singleSectionArticle,
6
+ multiSectionArticle,
7
+ passageArticle,
8
+ } from "../__testdata__/article-renderer.testdata";
4
9
  import ArticleRenderer from "../article-renderer";
5
10
 
6
11
  export default {
@@ -12,6 +17,34 @@ export default {
12
17
  },
13
18
  };
14
19
 
20
+ export const ASingleSectionArticle = (args: {
21
+ useNewStyles;
22
+ }): React.ReactElement => {
23
+ return (
24
+ <ArticleRenderer
25
+ json={singleSectionArticle}
26
+ dependencies={storybookDependenciesV2}
27
+ useNewStyles={args.useNewStyles}
28
+ />
29
+ );
30
+ };
31
+
32
+ export const BMultiSectionArticle = (args: {
33
+ useNewStyles;
34
+ }): React.ReactElement => {
35
+ return (
36
+ <ArticleRenderer
37
+ json={multiSectionArticle}
38
+ dependencies={storybookDependenciesV2}
39
+ useNewStyles={args.useNewStyles}
40
+ />
41
+ );
42
+ };
43
+
15
44
  export const PassageArticle = ({useNewStyles}): any => (
16
- <ArticleRenderer json={passageArticle} useNewStyles={useNewStyles} />
45
+ <ArticleRenderer
46
+ json={passageArticle}
47
+ dependencies={storybookDependenciesV2}
48
+ useNewStyles={useNewStyles}
49
+ />
17
50
  );