@khanacademy/perseus-core 24.0.0 → 24.1.1

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.
package/dist/index.d.ts CHANGED
@@ -1,149 +1,297 @@
1
1
  export type { PerseusAnalyticsEvent, AnalyticsEventHandlerFn } from "./analytics";
2
+ /** @hidden */
2
3
  export type { RendererInterface, MarkerType, InteractiveMarkerType, Relationship, Alignment, RecursiveReadonly, } from "./types";
3
- export type { KeypadKey, KeypadConfiguration, KeypadContextRendererInterface, } from "./keypad";
4
+ export type { KeypadKey } from "./keypad";
5
+ /** @hidden */
6
+ export type { KeypadConfiguration, KeypadContextRendererInterface, } from "./keypad";
4
7
  export type { ErrorKind } from "./error/errors";
8
+ /** @hidden */
5
9
  export { default as ErrorCodes, type ErrorCode } from "./error-codes";
10
+ /** @hidden */
6
11
  export type { FunctionTypeMappingKeys } from "./utils/grapher-util";
12
+ /** @hidden */
7
13
  export type { Coords } from "./utils/grapher-types";
8
14
  export type * from "./validation.types";
15
+ /** @hidden */
9
16
  export { default as getMatrixSize } from "./utils/get-matrix-size";
17
+ /** @hidden */
10
18
  export { default as getDecimalSeparator } from "./utils/get-decimal-separator";
19
+ /** @hidden */
11
20
  export { getDivideSymbol } from "./utils/get-divide-symbol";
21
+ /** @hidden */
12
22
  export { getDivideSymbolForTex } from "./utils/get-divide-symbol";
23
+ /** @hidden */
13
24
  export { approximateEqual, approximateDeepEqual } from "./utils/equality";
14
- export { addWidget, getWidgetIdsFromContent, getWidgetIdsFromContentByType, } from "./utils/widget-id-utils";
25
+ export { addWidget, getWidgetIdsFromContent } from "./utils/widget-id-utils";
26
+ /** @hidden */
27
+ export { getWidgetIdsFromContentByType } from "./utils/widget-id-utils";
28
+ /** @hidden */
15
29
  export { default as deepClone } from "./utils/deep-clone";
30
+ /** @hidden */
16
31
  export * as GrapherUtil from "./utils/grapher-util";
17
32
  export { generateTestPerseusItem, generateTestPerseusRenderer, } from "./utils/test-utils";
18
33
  export { itemHasRationales } from "./utils/item-has-rationales";
34
+ /** @hidden */
19
35
  export { itemHasHints } from "./utils/item-has-hints";
36
+ /** @hidden */
20
37
  export { makeSafeUrl } from "./utils/make-safe-url";
21
38
  export { removeOrphanedWidgetsFromPerseusItem } from "./utils/remove-orphaned-widgets";
22
- export { parseAndMigratePerseusItem, parseAndMigratePerseusArticle, parseAndMigrateUserInputMap, parseAndMigratePerseusRenderer, type ParseFailureDetail, } from "./parse-perseus-json";
23
- export { isSuccess, isFailure, type Result, type Success, type Failure, } from "./parse-perseus-json/result";
39
+ export { parseAndMigratePerseusItem, parseAndMigratePerseusArticle, } from "./parse-perseus-json";
40
+ /** @hidden */
41
+ export { parseAndMigrateUserInputMap, parseAndMigratePerseusRenderer, type ParseFailureDetail, } from "./parse-perseus-json";
42
+ export { isSuccess, isFailure } from "./parse-perseus-json/result";
43
+ export { type Result, type Success, type Failure, } from "./parse-perseus-json/result";
44
+ /** @hidden */
24
45
  export { libVersion } from "./version";
25
46
  export { Errors } from "./error/errors";
26
47
  export { PerseusError } from "./error/perseus-error";
27
48
  export * from "./data-schema";
49
+ /** @hidden */
28
50
  export { pluck, mapObject } from "./utils/objective_";
51
+ /** @hidden */
29
52
  export { default as categorizerLogic } from "./widgets/categorizer";
53
+ /** @hidden */
30
54
  export type { CategorizerDefaultWidgetOptions } from "./widgets/categorizer";
55
+ /** @hidden */
31
56
  export { default as csProgramLogic } from "./widgets/cs-program";
57
+ /** @hidden */
32
58
  export type { CSProgramDefaultWidgetOptions } from "./widgets/cs-program";
59
+ /** @hidden */
33
60
  export { default as definitionLogic } from "./widgets/definition";
61
+ /** @hidden */
34
62
  export type { DefinitionDefaultWidgetOptions } from "./widgets/definition";
63
+ /** @hidden */
35
64
  export { default as dropdownLogic } from "./widgets/dropdown";
65
+ /** @hidden */
36
66
  export type { DropdownDefaultWidgetOptions } from "./widgets/dropdown";
67
+ /** @hidden */
37
68
  export { default as explanationLogic } from "./widgets/explanation";
69
+ /** @hidden */
38
70
  export type { ExplanationDefaultWidgetOptions } from "./widgets/explanation";
71
+ /** @hidden */
39
72
  export { default as expressionLogic } from "./widgets/expression";
73
+ /** @hidden */
40
74
  export type { ExpressionDefaultWidgetOptions } from "./widgets/expression";
75
+ /** @hidden */
41
76
  export { default as deriveExtraKeys } from "./widgets/expression/derive-extra-keys";
77
+ /** @hidden */
42
78
  export { default as gradedGroupLogic } from "./widgets/graded-group";
79
+ /** @hidden */
43
80
  export { default as freeResponseLogic } from "./widgets/free-response";
81
+ /** @hidden */
44
82
  export type { FreeResponseDefaultWidgetOptions } from "./widgets/free-response";
83
+ /** @hidden */
45
84
  export type { GradedGroupDefaultWidgetOptions } from "./widgets/graded-group";
85
+ /** @hidden */
46
86
  export { default as gradedGroupSetLogic } from "./widgets/graded-group-set";
87
+ /** @hidden */
47
88
  export type { GradedGroupSetDefaultWidgetOptions } from "./widgets/graded-group-set";
89
+ /** @hidden */
48
90
  export { default as grapherLogic } from "./widgets/grapher";
91
+ /** @hidden */
49
92
  export type { GrapherDefaultWidgetOptions } from "./widgets/grapher";
93
+ /** @hidden */
50
94
  export { default as groupLogic } from "./widgets/group";
95
+ /** @hidden */
51
96
  export type { GroupDefaultWidgetOptions } from "./widgets/group";
97
+ /** @hidden */
52
98
  export { default as iframeLogic } from "./widgets/iframe";
99
+ /** @hidden */
53
100
  export type { IFrameDefaultWidgetOptions } from "./widgets/iframe";
101
+ /** @hidden */
54
102
  export { default as imageLogic } from "./widgets/image";
103
+ /** @hidden */
55
104
  export type { ImageDefaultWidgetOptions } from "./widgets/image";
105
+ /** @hidden */
56
106
  export { default as inputNumberLogic } from "./widgets/input-number";
107
+ /** @hidden */
57
108
  export type { InputNumberDefaultWidgetOptions } from "./widgets/input-number";
109
+ /** @hidden */
58
110
  export { default as interactionLogic } from "./widgets/interaction";
111
+ /** @hidden */
59
112
  export type { InteractionDefaultWidgetOptions } from "./widgets/interaction";
113
+ /** @hidden */
60
114
  export { default as interactiveGraphLogic } from "./widgets/interactive-graph";
115
+ /** @hidden */
61
116
  export type { InteractiveGraphDefaultWidgetOptions } from "./widgets/interactive-graph";
117
+ /** @hidden */
62
118
  export { default as labelImageLogic } from "./widgets/label-image";
119
+ /** @hidden */
63
120
  export type { LabelImageDefaultWidgetOptions } from "./widgets/label-image";
121
+ /** @hidden */
64
122
  export { default as matcherLogic } from "./widgets/matcher";
123
+ /** @hidden */
65
124
  export type { MatcherDefaultWidgetOptions } from "./widgets/matcher";
125
+ /** @hidden */
66
126
  export { default as matrixLogic } from "./widgets/matrix";
127
+ /** @hidden */
67
128
  export type { MatrixDefaultWidgetOptions } from "./widgets/matrix";
129
+ /** @hidden */
68
130
  export { default as measurerLogic } from "./widgets/measurer";
131
+ /** @hidden */
69
132
  export type { MeasurerDefaultWidgetOptions } from "./widgets/measurer";
133
+ /** @hidden */
70
134
  export { default as numberLineLogic } from "./widgets/number-line";
135
+ /** @hidden */
71
136
  export type { NumberLineDefaultWidgetOptions } from "./widgets/number-line";
137
+ /** @hidden */
72
138
  export { default as numericInputLogic } from "./widgets/numeric-input";
139
+ /** @hidden */
73
140
  export type { NumericInputDefaultWidgetOptions } from "./widgets/numeric-input";
141
+ /** @hidden */
74
142
  export { default as ordererLogic } from "./widgets/orderer";
143
+ /** @hidden */
75
144
  export type { OrdererDefaultWidgetOptions } from "./widgets/orderer";
145
+ /** @hidden */
76
146
  export { default as phetSimulationLogic } from "./widgets/phet-simulation";
147
+ /** @hidden */
77
148
  export type { PhetSimulationDefaultWidgetOptions } from "./widgets/phet-simulation";
149
+ /** @hidden */
78
150
  export { default as plotterLogic } from "./widgets/plotter";
151
+ /** @hidden */
79
152
  export type { PlotterDefaultWidgetOptions } from "./widgets/plotter";
153
+ /** @hidden */
80
154
  export { default as pythonProgramLogic } from "./widgets/python-program";
155
+ /** @hidden */
81
156
  export type { PythonProgramDefaultWidgetOptions } from "./widgets/python-program";
157
+ /** @hidden */
82
158
  export { default as radioLogic } from "./widgets/radio";
159
+ /** @hidden */
83
160
  export type { RadioDefaultWidgetOptions } from "./widgets/radio";
161
+ /** @hidden */
84
162
  export { usesNumCorrect } from "./widgets/radio/radio-util";
163
+ /** @hidden */
85
164
  export { default as sorterLogic } from "./widgets/sorter";
165
+ /** @hidden */
86
166
  export type { SorterDefaultWidgetOptions } from "./widgets/sorter";
167
+ /** @hidden */
87
168
  export { default as tableLogic } from "./widgets/table";
169
+ /** @hidden */
88
170
  export type { TableDefaultWidgetOptions } from "./widgets/table";
171
+ /** @hidden */
89
172
  export { default as videoLogic } from "./widgets/video";
173
+ /** @hidden */
90
174
  export type { VideoDefaultWidgetOptions } from "./widgets/video";
175
+ /** @hidden */
91
176
  export { applyDefaultsToWidgets, applyDefaultsToWidget, } from "./widgets/apply-defaults";
177
+ /** @hidden */
92
178
  export { default as getDefaultAnswerArea } from "./utils/get-default-answer-area";
179
+ /** @hidden */
93
180
  export { getDefaultFigureForType } from "./utils/get-default-figure-for-type";
94
- export { default as splitPerseusItem, splitPerseusItemJSON, } from "./utils/split-perseus-item";
181
+ export { default as splitPerseusItem } from "./utils/split-perseus-item";
182
+ /** @hidden */
183
+ export { splitPerseusItemJSON } from "./utils/split-perseus-item";
184
+ /** @hidden */
95
185
  export { default as Registry } from "./utils/registry";
96
186
  export type * from "./widgets/logic-export.types";
187
+ /** @hidden */
97
188
  export * as CoreWidgetRegistry from "./widgets/core-widget-registry";
189
+ /** @hidden */
98
190
  export { getOrdererPublicWidgetOptions } from "./widgets/orderer/orderer-util";
191
+ /** @hidden */
99
192
  export type { OrdererPublicWidgetOptions } from "./widgets/orderer/orderer-util";
193
+ /** @hidden */
100
194
  export { getCategorizerPublicWidgetOptions } from "./widgets/categorizer/categorizer-util";
195
+ /** @hidden */
101
196
  export type { CategorizerPublicWidgetOptions } from "./widgets/categorizer/categorizer-util";
197
+ /** @hidden */
102
198
  export { getCSProgramPublicWidgetOptions } from "./widgets/cs-program/cs-program-util";
199
+ /** @hidden */
103
200
  export { getExpressionPublicWidgetOptions } from "./widgets/expression/expression-util";
201
+ /** @hidden */
104
202
  export { getFreeResponsePublicWidgetOptions } from "./widgets/free-response/free-response-util";
203
+ /** @hidden */
105
204
  export type { ExpressionPublicWidgetOptions } from "./widgets/expression/expression-util";
205
+ /** @hidden */
106
206
  export { getGrapherPublicWidgetOptions } from "./widgets/grapher/grapher-util";
207
+ /** @hidden */
107
208
  export type { GrapherPublicWidgetOptions } from "./widgets/grapher/grapher-util";
209
+ /** @hidden */
108
210
  export { getGroupPublicWidgetOptions } from "./widgets/group/group-util";
211
+ /** @hidden */
109
212
  export { getInteractiveGraphPublicWidgetOptions, type InteractiveGraphPublicWidgetOptions, } from "./widgets/interactive-graph/interactive-graph-util";
213
+ /** @hidden */
110
214
  export { getLabelImagePublicWidgetOptions } from "./widgets/label-image/label-image-util";
215
+ /** @hidden */
111
216
  export { getSorterPublicWidgetOptions, shuffleSorter, } from "./widgets/sorter/sorter-util";
217
+ /** @hidden */
112
218
  export type { SorterPublicWidgetOptions } from "./widgets/sorter/sorter-util";
219
+ /** @hidden */
113
220
  export type { LabelImagePublicWidgetOptions } from "./widgets/label-image/label-image-util";
221
+ /** @hidden */
114
222
  export type { LabelImageMarkerPublicData } from "./widgets/label-image/label-image-util";
223
+ /** @hidden */
115
224
  export { getDropdownPublicWidgetOptions } from "./widgets/dropdown/dropdown-util";
225
+ /** @hidden */
116
226
  export type { DropdownPublicWidgetOptions } from "./widgets/dropdown/dropdown-util";
227
+ /** @hidden */
117
228
  export { getNumericInputPublicWidgetOptions } from "./widgets/numeric-input/numeric-input-util";
229
+ /** @hidden */
118
230
  export { getNumberLinePublicWidgetOptions } from "./widgets/number-line/number-line-util";
231
+ /** @hidden */
119
232
  export type { NumberLinePublicWidgetOptions } from "./widgets/number-line/number-line-util";
233
+ /** @hidden */
120
234
  export { getRadioPublicWidgetOptions } from "./widgets/radio/radio-util";
235
+ /** @hidden */
121
236
  export type { RadioPublicWidgetOptions } from "./widgets/radio/radio-util";
237
+ /** @hidden */
122
238
  export { deriveNumCorrect } from "./widgets/radio/derive-num-correct";
239
+ /** @hidden */
123
240
  export { getTablePublicWidgetOptions } from "./widgets/table/table-util";
241
+ /** @hidden */
124
242
  export { getIFramePublicWidgetOptions } from "./widgets/iframe/iframe-util";
243
+ /** @hidden */
125
244
  export { getMatrixPublicWidgetOptions } from "./widgets/matrix/matrix-util";
245
+ /** @hidden */
126
246
  export type { MatrixPublicWidgetOptions } from "./widgets/matrix/matrix-util";
247
+ /** @hidden */
127
248
  export { getPlotterPublicWidgetOptions } from "./widgets/plotter/plotter-util";
249
+ /** @hidden */
128
250
  export type { PlotterPublicWidgetOptions } from "./widgets/plotter/plotter-util";
251
+ /** @hidden */
129
252
  export { getMatcherPublicWidgetOptions, shuffleMatcher, } from "./widgets/matcher/matcher-util";
253
+ /** @hidden */
130
254
  export type { MatcherPublicWidgetOptions } from "./widgets/matcher/matcher-util";
255
+ /** @hidden */
131
256
  export { shuffle, seededRNG, random } from "./utils/random-util";
132
- export { default as PerseusFeatureFlags, isFeatureOn } from "./feature-flags";
257
+ export { default as PerseusFeatureFlags } from "./feature-flags";
258
+ /** @hidden */
259
+ export { isFeatureOn } from "./feature-flags";
260
+ /** @hidden */
133
261
  export { traverse } from "./traversal";
134
- export { isItemAccessible, violatingWidgets } from "./accessibility";
262
+ export { isItemAccessible } from "./accessibility";
263
+ /** @hidden */
264
+ export { violatingWidgets } from "./accessibility";
265
+ /** @hidden */
135
266
  export { isLabeledSVG, getRealImageUrl, getBaseUrl, getSvgUrl, getDataUrl, getImageSizeModern, } from "./utils/util.graphie";
267
+ /** @hidden */
136
268
  export { generateDefinitionOptions, generateDefinitionWidget, } from "./utils/generators/definition-widget-generator";
269
+ /** @hidden */
137
270
  export { generateDropdownOptions, generateDropdownWidget, } from "./utils/generators/dropdown-widget-generator";
271
+ /** @hidden */
138
272
  export { generateExplanationOptions, generateExplanationWidget, } from "./utils/generators/explanation-widget-generator";
273
+ /** @hidden */
139
274
  export { generateExpressionOptions, generateExpressionAnswerForm, generateExpressionWidget, } from "./utils/generators/expression-widget-generator";
275
+ /** @hidden */
140
276
  export { generateFreeResponseOptions, generateFreeResponseWidget, } from "./utils/generators/free-response-widget-generator";
277
+ /** @hidden */
141
278
  export { generateGradedGroupOptions, generateGradedGroupWidget, } from "./utils/generators/graded-group-widget-generator";
279
+ /** @hidden */
142
280
  export { generateGradedGroupSetWidget } from "./utils/generators/graded-group-set-widget-generator";
281
+ /** @hidden */
143
282
  export { generateGroupOptions, generateGroupWidget, } from "./utils/generators/group-widget-generator";
283
+ /** @hidden */
144
284
  export { generateImageOptions, generateImageWidget, } from "./utils/generators/image-widget-generator";
145
- export { generateInteractiveGraphOptions, generateIGAngleGraph, generateIGCircleGraph, generateIGLinearGraph, generateIGLinearSystemGraph, generateIGNoneGraph, generateIGPointGraph, generateIGPolygonGraph, generateIGQuadraticGraph, generateIGRayGraph, generateIGSegmentGraph, generateIGSinusoidGraph, generateIGTangentGraph, generateIGLockedPoint, generateIGLockedLine, generateIGLockedVector, generateIGLockedEllipse, generateIGLockedPolygon, generateIGLockedFunction, generateIGLockedLabel, generateInteractiveGraphWidget, } from "./utils/generators/interactive-graph-widget-generator";
146
- export { generateNumericInputOptions, generateNumericInputAnswer, generateNumericInputWidget, } from "./utils/generators/numeric-input-widget-generator";
147
- export { generateRadioOptions, generateRadioWidget, generateRadioChoice, generateSimpleRadioQuestion, generateSimpleRadioItem, } from "./utils/generators/radio-widget-generator";
285
+ /** @hidden */
286
+ export { generateInteractiveGraphOptions, generateIGAngleGraph, generateIGCircleGraph, generateIGLinearGraph, generateIGLinearSystemGraph, generateIGLogarithmGraph, generateIGNoneGraph, generateIGPointGraph, generateIGPolygonGraph, generateIGQuadraticGraph, generateIGRayGraph, generateIGSegmentGraph, generateIGSinusoidGraph, generateIGTangentGraph, generateIGLockedPoint, generateIGLockedLine, generateIGLockedVector, generateIGLockedEllipse, generateIGLockedPolygon, generateIGLockedFunction, generateIGLockedLabel, generateInteractiveGraphWidget, } from "./utils/generators/interactive-graph-widget-generator";
287
+ export { generateNumericInputWidget } from "./utils/generators/numeric-input-widget-generator";
288
+ /** @hidden */
289
+ export { generateNumericInputOptions, generateNumericInputAnswer, } from "./utils/generators/numeric-input-widget-generator";
290
+ export { generateRadioWidget } from "./utils/generators/radio-widget-generator";
291
+ /** @hidden */
292
+ export { generateRadioOptions, generateRadioChoice, generateSimpleRadioQuestion, generateSimpleRadioItem, } from "./utils/generators/radio-widget-generator";
293
+ /** @hidden */
148
294
  export { generateVideoWidget } from "./utils/generators/video-widget-generator";
149
- export { getAnswersFromWidgets, injectWidgets, getPerseusAIData, } from "./utils/extract-perseus-ai-data";
295
+ export { getAnswersFromWidgets, injectWidgets, } from "./utils/extract-perseus-ai-data";
296
+ /** @hidden */
297
+ export { getPerseusAIData } from "./utils/extract-perseus-ai-data";
@@ -124,7 +124,7 @@ const pairOfNumbers$1=pair(number,number);const stringOrEmpty=defaulted(string,(
124
124
 
125
125
  const lockedFigureColorNames=["blue","green","grayH","purple","pink","orange","red"];const plotterPlotTypes=["bar","line","pic","histogram","dotplot"];
126
126
 
127
- const pairOfNumbers=pair(number,number);const parsePerseusGraphTypeAngle=object({type:constant("angle"),showAngles:optional(boolean),allowReflexAngles:optional(boolean),angleOffsetDeg:optional(number),snapDegrees:optional(number),match:optional(constant("congruent")),coords:optional(trio(pairOfNumbers,pairOfNumbers,pairOfNumbers)),startCoords:optional(trio(pairOfNumbers,pairOfNumbers,pairOfNumbers))});const parsePerseusGraphTypeCircle=object({type:constant("circle"),center:optional(pairOfNumbers),radius:optional(number),startCoords:optional(object({center:pairOfNumbers,radius:number}))});const parsePerseusGraphTypeLinear=object({type:constant("linear"),coords:optional(nullable(pair(pairOfNumbers,pairOfNumbers))),startCoords:optional(pair(pairOfNumbers,pairOfNumbers))});const parsePerseusGraphTypeLinearSystem=object({type:constant("linear-system"),coords:optional(nullable(array(pair(pairOfNumbers,pairOfNumbers)))),startCoords:optional(array(pair(pairOfNumbers,pairOfNumbers)))});const parsePerseusGraphTypeNone=object({type:constant("none")});const parsePerseusGraphTypePoint=object({type:constant("point"),numPoints:optional(union(number).or(constant("unlimited")).parser),coords:optional(nullable(array(pairOfNumbers))),startCoords:optional(array(pairOfNumbers)),coord:optional(pairOfNumbers)});const parsePerseusGraphTypePolygon=object({type:constant("polygon"),numSides:optional(union(number).or(constant("unlimited")).parser),showAngles:optional(boolean),showSides:optional(boolean),snapTo:optional(enumeration("grid","angles","sides")),match:optional(enumeration("similar","congruent","approx","exact")),startCoords:optional(array(pairOfNumbers)),coords:optional(nullable(array(pairOfNumbers)))});const parsePerseusGraphTypeQuadratic=object({type:constant("quadratic"),coords:optional(nullable(trio(pairOfNumbers,pairOfNumbers,pairOfNumbers))),startCoords:optional(trio(pairOfNumbers,pairOfNumbers,pairOfNumbers))});const parsePerseusGraphTypeRay=object({type:constant("ray"),coords:optional(nullable(pair(pairOfNumbers,pairOfNumbers))),startCoords:optional(pair(pairOfNumbers,pairOfNumbers))});const parsePerseusGraphTypeSegment=object({type:constant("segment"),numSegments:optional(number),coords:optional(nullable(array(pair(pairOfNumbers,pairOfNumbers)))),startCoords:optional(array(pair(pairOfNumbers,pairOfNumbers)))});const parsePerseusGraphTypeSinusoid=object({type:constant("sinusoid"),coords:optional(nullable(array(pairOfNumbers))),startCoords:optional(array(pairOfNumbers))});const parsePerseusGraphTypeExponential=object({type:constant("exponential"),coords:optional(nullable(array(pairOfNumbers))),asymptote:optional(nullable(number)),startCoords:optional(object({coords:pair(pairOfNumbers,pairOfNumbers),asymptote:number}))});const parsePerseusGraphTypeAbsoluteValue=object({type:constant("absolute-value"),coords:optional(nullable(pair(pairOfNumbers,pairOfNumbers))),startCoords:optional(pair(pairOfNumbers,pairOfNumbers))});const parsePerseusGraphTypeTangent=object({type:constant("tangent"),coords:optional(nullable(array(pairOfNumbers))),startCoords:optional(array(pairOfNumbers))});const parsePerseusGraphType=discriminatedUnionOn("type").withBranch("absolute-value",parsePerseusGraphTypeAbsoluteValue).withBranch("angle",parsePerseusGraphTypeAngle).withBranch("circle",parsePerseusGraphTypeCircle).withBranch("exponential",parsePerseusGraphTypeExponential).withBranch("linear",parsePerseusGraphTypeLinear).withBranch("linear-system",parsePerseusGraphTypeLinearSystem).withBranch("none",parsePerseusGraphTypeNone).withBranch("point",parsePerseusGraphTypePoint).withBranch("polygon",parsePerseusGraphTypePolygon).withBranch("quadratic",parsePerseusGraphTypeQuadratic).withBranch("ray",parsePerseusGraphTypeRay).withBranch("segment",parsePerseusGraphTypeSegment).withBranch("sinusoid",parsePerseusGraphTypeSinusoid).withBranch("tangent",parsePerseusGraphTypeTangent).parser;const parseLockedFigureColor=enumeration(...lockedFigureColorNames);const parseLockedFigureFillType=enumeration("none","white","translucent","solid");const parseLockedLineStyle=enumeration("solid","dashed");const parseStrokeWeight=defaulted(enumeration("medium","thin","thick"),()=>"medium");const parseLockedLabelType=object({type:constant("label"),coord:pairOfNumbers,text:string,color:parseLockedFigureColor,size:enumeration("small","medium","large")});const parseLockedPointType=object({type:constant("point"),coord:pairOfNumbers,color:parseLockedFigureColor,filled:boolean,labels:defaulted(array(parseLockedLabelType),()=>[]),ariaLabel:optional(string)});const parseLockedLineType=object({type:constant("line"),kind:enumeration("line","ray","segment"),points:pair(parseLockedPointType,parseLockedPointType),color:parseLockedFigureColor,lineStyle:parseLockedLineStyle,showPoint1:defaulted(boolean,()=>false),showPoint2:defaulted(boolean,()=>false),weight:parseStrokeWeight,labels:defaulted(array(parseLockedLabelType),()=>[]),ariaLabel:optional(string)});const parseLockedVectorType=object({type:constant("vector"),points:pair(pairOfNumbers,pairOfNumbers),color:parseLockedFigureColor,weight:parseStrokeWeight,labels:defaulted(array(parseLockedLabelType),()=>[]),ariaLabel:optional(string)});const parseLockedEllipseType=object({type:constant("ellipse"),center:pairOfNumbers,radius:pairOfNumbers,angle:number,color:parseLockedFigureColor,fillStyle:parseLockedFigureFillType,strokeStyle:parseLockedLineStyle,weight:parseStrokeWeight,labels:defaulted(array(parseLockedLabelType),()=>[]),ariaLabel:optional(string)});const parseLockedPolygonType=object({type:constant("polygon"),points:array(pairOfNumbers),color:parseLockedFigureColor,showVertices:boolean,fillStyle:parseLockedFigureFillType,strokeStyle:parseLockedLineStyle,weight:parseStrokeWeight,labels:defaulted(array(parseLockedLabelType),()=>[]),ariaLabel:optional(string)});const parseLockedFunctionDomain=defaulted(pair(defaulted(number,()=>-Infinity),defaulted(number,()=>Infinity)),()=>[-Infinity,Infinity]);const parseLockedFunctionType=object({type:constant("function"),color:parseLockedFigureColor,strokeStyle:parseLockedLineStyle,weight:parseStrokeWeight,equation:string,directionalAxis:enumeration("x","y"),domain:parseLockedFunctionDomain,labels:defaulted(array(parseLockedLabelType),()=>[]),ariaLabel:optional(string)});const parseLockedFigure=discriminatedUnionOn("type").withBranch("point",parseLockedPointType).withBranch("line",parseLockedLineType).withBranch("vector",parseLockedVectorType).withBranch("ellipse",parseLockedEllipseType).withBranch("polygon",parseLockedPolygonType).withBranch("function",parseLockedFunctionType).withBranch("label",parseLockedLabelType).parser;const parseLabelLocation=union(enumeration("onAxis","alongEdge")).or(pipeParsers(constant("")).then(convert(()=>"onAxis")).parser).parser;const parseInteractiveGraphWidget=parseWidget(constant("interactive-graph"),object({step:pairOfNumbers,gridStep:optional(pairOfNumbers),snapStep:optional(pairOfNumbers),backgroundImage:optional(parsePerseusImageBackground),markings:enumeration("graph","grid","none","axes"),labels:optional(array(string)),labelLocation:optional(parseLabelLocation),showProtractor:boolean,showRuler:optional(boolean),showTooltips:optional(boolean),rulerLabel:optional(string),rulerTicks:optional(number),range:pair(pairOfNumbers,pairOfNumbers),showAxisArrows:defaulted(object({xMin:boolean,xMax:boolean,yMin:boolean,yMax:boolean}),()=>({xMin:true,xMax:true,yMin:true,yMax:true})),graph:defaulted(parsePerseusGraphType,()=>({type:"linear"})),correct:defaulted(parsePerseusGraphType,()=>({type:"linear"})),lockedFigures:defaulted(array(parseLockedFigure),()=>[]),fullGraphAriaLabel:optional(string),fullGraphAriaDescription:optional(string)}));
127
+ const pairOfNumbers=pair(number,number);const parsePerseusGraphTypeAngle=object({type:constant("angle"),showAngles:optional(boolean),allowReflexAngles:optional(boolean),angleOffsetDeg:optional(number),snapDegrees:optional(number),match:optional(constant("congruent")),coords:optional(trio(pairOfNumbers,pairOfNumbers,pairOfNumbers)),startCoords:optional(trio(pairOfNumbers,pairOfNumbers,pairOfNumbers))});const parsePerseusGraphTypeCircle=object({type:constant("circle"),center:optional(pairOfNumbers),radius:optional(number),startCoords:optional(object({center:pairOfNumbers,radius:number}))});const parsePerseusGraphTypeLinear=object({type:constant("linear"),coords:optional(nullable(pair(pairOfNumbers,pairOfNumbers))),startCoords:optional(pair(pairOfNumbers,pairOfNumbers))});const parsePerseusGraphTypeLinearSystem=object({type:constant("linear-system"),coords:optional(nullable(array(pair(pairOfNumbers,pairOfNumbers)))),startCoords:optional(array(pair(pairOfNumbers,pairOfNumbers)))});const parsePerseusGraphTypeNone=object({type:constant("none")});const parsePerseusGraphTypePoint=object({type:constant("point"),numPoints:optional(union(number).or(constant("unlimited")).parser),coords:optional(nullable(array(pairOfNumbers))),startCoords:optional(array(pairOfNumbers)),coord:optional(pairOfNumbers)});const parsePerseusGraphTypePolygon=object({type:constant("polygon"),numSides:optional(union(number).or(constant("unlimited")).parser),showAngles:optional(boolean),showSides:optional(boolean),snapTo:optional(enumeration("grid","angles","sides")),match:optional(enumeration("similar","congruent","approx","exact")),startCoords:optional(array(pairOfNumbers)),coords:optional(nullable(array(pairOfNumbers)))});const parsePerseusGraphTypeQuadratic=object({type:constant("quadratic"),coords:optional(nullable(trio(pairOfNumbers,pairOfNumbers,pairOfNumbers))),startCoords:optional(trio(pairOfNumbers,pairOfNumbers,pairOfNumbers))});const parsePerseusGraphTypeRay=object({type:constant("ray"),coords:optional(nullable(pair(pairOfNumbers,pairOfNumbers))),startCoords:optional(pair(pairOfNumbers,pairOfNumbers))});const parsePerseusGraphTypeSegment=object({type:constant("segment"),numSegments:optional(number),coords:optional(nullable(array(pair(pairOfNumbers,pairOfNumbers)))),startCoords:optional(array(pair(pairOfNumbers,pairOfNumbers)))});const parsePerseusGraphTypeSinusoid=object({type:constant("sinusoid"),coords:optional(nullable(array(pairOfNumbers))),startCoords:optional(array(pairOfNumbers))});const parsePerseusGraphTypeExponential=object({type:constant("exponential"),coords:optional(nullable(array(pairOfNumbers))),asymptote:optional(nullable(number)),startCoords:optional(object({coords:pair(pairOfNumbers,pairOfNumbers),asymptote:number}))});const parsePerseusGraphTypeAbsoluteValue=object({type:constant("absolute-value"),coords:optional(nullable(pair(pairOfNumbers,pairOfNumbers))),startCoords:optional(pair(pairOfNumbers,pairOfNumbers))});const parsePerseusGraphTypeTangent=object({type:constant("tangent"),coords:optional(nullable(array(pairOfNumbers))),startCoords:optional(array(pairOfNumbers))});const parsePerseusGraphTypeLogarithm=object({type:constant("logarithm"),coords:optional(nullable(array(pairOfNumbers))),asymptote:optional(nullable(number)),startCoords:optional(object({coords:pair(pairOfNumbers,pairOfNumbers),asymptote:number}))});const parsePerseusGraphType=discriminatedUnionOn("type").withBranch("absolute-value",parsePerseusGraphTypeAbsoluteValue).withBranch("angle",parsePerseusGraphTypeAngle).withBranch("circle",parsePerseusGraphTypeCircle).withBranch("exponential",parsePerseusGraphTypeExponential).withBranch("linear",parsePerseusGraphTypeLinear).withBranch("linear-system",parsePerseusGraphTypeLinearSystem).withBranch("none",parsePerseusGraphTypeNone).withBranch("point",parsePerseusGraphTypePoint).withBranch("polygon",parsePerseusGraphTypePolygon).withBranch("quadratic",parsePerseusGraphTypeQuadratic).withBranch("ray",parsePerseusGraphTypeRay).withBranch("segment",parsePerseusGraphTypeSegment).withBranch("sinusoid",parsePerseusGraphTypeSinusoid).withBranch("tangent",parsePerseusGraphTypeTangent).withBranch("logarithm",parsePerseusGraphTypeLogarithm).parser;const parseLockedFigureColor=enumeration(...lockedFigureColorNames);const parseLockedFigureFillType=enumeration("none","white","translucent","solid");const parseLockedLineStyle=enumeration("solid","dashed");const parseStrokeWeight=defaulted(enumeration("medium","thin","thick"),()=>"medium");const parseLockedLabelType=object({type:constant("label"),coord:pairOfNumbers,text:string,color:parseLockedFigureColor,size:enumeration("small","medium","large")});const parseLockedPointType=object({type:constant("point"),coord:pairOfNumbers,color:parseLockedFigureColor,filled:boolean,labels:defaulted(array(parseLockedLabelType),()=>[]),ariaLabel:optional(string)});const parseLockedLineType=object({type:constant("line"),kind:enumeration("line","ray","segment"),points:pair(parseLockedPointType,parseLockedPointType),color:parseLockedFigureColor,lineStyle:parseLockedLineStyle,showPoint1:defaulted(boolean,()=>false),showPoint2:defaulted(boolean,()=>false),weight:parseStrokeWeight,labels:defaulted(array(parseLockedLabelType),()=>[]),ariaLabel:optional(string)});const parseLockedVectorType=object({type:constant("vector"),points:pair(pairOfNumbers,pairOfNumbers),color:parseLockedFigureColor,weight:parseStrokeWeight,labels:defaulted(array(parseLockedLabelType),()=>[]),ariaLabel:optional(string)});const parseLockedEllipseType=object({type:constant("ellipse"),center:pairOfNumbers,radius:pairOfNumbers,angle:number,color:parseLockedFigureColor,fillStyle:parseLockedFigureFillType,strokeStyle:parseLockedLineStyle,weight:parseStrokeWeight,labels:defaulted(array(parseLockedLabelType),()=>[]),ariaLabel:optional(string)});const parseLockedPolygonType=object({type:constant("polygon"),points:array(pairOfNumbers),color:parseLockedFigureColor,showVertices:boolean,fillStyle:parseLockedFigureFillType,strokeStyle:parseLockedLineStyle,weight:parseStrokeWeight,labels:defaulted(array(parseLockedLabelType),()=>[]),ariaLabel:optional(string)});const parseLockedFunctionDomain=defaulted(pair(defaulted(number,()=>-Infinity),defaulted(number,()=>Infinity)),()=>[-Infinity,Infinity]);const parseLockedFunctionType=object({type:constant("function"),color:parseLockedFigureColor,strokeStyle:parseLockedLineStyle,weight:parseStrokeWeight,equation:string,directionalAxis:enumeration("x","y"),domain:parseLockedFunctionDomain,labels:defaulted(array(parseLockedLabelType),()=>[]),ariaLabel:optional(string)});const parseLockedFigure=discriminatedUnionOn("type").withBranch("point",parseLockedPointType).withBranch("line",parseLockedLineType).withBranch("vector",parseLockedVectorType).withBranch("ellipse",parseLockedEllipseType).withBranch("polygon",parseLockedPolygonType).withBranch("function",parseLockedFunctionType).withBranch("label",parseLockedLabelType).parser;const parseLabelLocation=union(enumeration("onAxis","alongEdge")).or(pipeParsers(constant("")).then(convert(()=>"onAxis")).parser).parser;const parseInteractiveGraphWidget=parseWidget(constant("interactive-graph"),object({step:pairOfNumbers,gridStep:optional(pairOfNumbers),snapStep:optional(pairOfNumbers),backgroundImage:optional(parsePerseusImageBackground),markings:enumeration("graph","grid","none","axes"),labels:optional(array(string)),labelLocation:optional(parseLabelLocation),showProtractor:boolean,showRuler:optional(boolean),showTooltips:optional(boolean),rulerLabel:optional(string),rulerTicks:optional(number),range:pair(pairOfNumbers,pairOfNumbers),showAxisArrows:defaulted(object({xMin:boolean,xMax:boolean,yMin:boolean,yMax:boolean}),()=>({xMin:true,xMax:true,yMin:true,yMax:true})),graph:defaulted(parsePerseusGraphType,()=>({type:"linear"})),correct:defaulted(parsePerseusGraphType,()=>({type:"linear"})),lockedFigures:defaulted(array(parseLockedFigure),()=>[]),fullGraphAriaLabel:optional(string),fullGraphAriaDescription:optional(string)}));
128
128
 
129
129
  const parseLabelImageWidget=parseWidget(constant("label-image"),object({choices:array(string),imageUrl:string,imageAlt:string,imageHeight:number,imageWidth:number,markers:array(object({answers:defaulted(array(string),()=>[]),label:string,x:number,y:number})),hideChoicesFromInstructions:boolean,multipleAnswers:boolean,static:defaulted(boolean,()=>false)}));
130
130
 
@@ -138,7 +138,7 @@ const parseMoleculeRendererWidget=parseWidget(constant("molecule-renderer"),obje
138
138
 
139
139
  const emptyStringToNull=pipeParsers(constant("")).then(convert(()=>null)).parser;const parseNumberLineWidget=parseWidget(constant("number-line"),object({range:array(number),labelRange:array(nullable(union(number).or(emptyStringToNull).parser)),labelStyle:string,labelTicks:boolean,isTickCtrl:defaulted(boolean,()=>false),isInequality:defaulted(boolean,()=>false),divisionRange:array(number),numDivisions:optional(nullable(number)),snapDivisions:defaulted(number,()=>2),tickStep:optional(nullable(number)),correctRel:defaulted(optional(enumeration("eq","lt","gt","le","ge")),()=>undefined),correctX:defaulted(nullable(number),()=>null),initialX:optional(nullable(number)),showTooltips:optional(boolean),static:defaulted(boolean,()=>false)}));
140
140
 
141
- const parseMathFormat=enumeration("integer","mixed","improper","proper","decimal","percent","pi");const parseSimplify=pipeParsers(union(constant(null)).or(constant(undefined)).or(boolean).or(constant("true")).or(constant("required")).or(constant("correct")).or(constant("enforced")).or(constant("optional")).or(constant("accepted")).parser).then(convert(deprecatedSimplifyValuesToRequired)).parser;function deprecatedSimplifyValuesToRequired(simplify){switch(simplify){case "enforced":case "required":case "optional":return simplify;default:return "required"}}const parseNumericInputWidget=parseWidget(constant("numeric-input"),object({answers:array(object({message:defaulted(string,()=>""),value:optional(nullable(number)),status:string,answerForms:defaulted(optional(array(parseMathFormat)),()=>undefined),strict:defaulted(boolean,()=>false),maxError:optional(nullable(number)),simplify:parseSimplify})),labelText:optional(string),size:string,coefficient:defaulted(boolean,()=>false),rightAlign:optional(boolean),static:defaulted(boolean,()=>false),answerForms:optional(array(object({name:parseMathFormat,simplify:parseSimplify})))}));
141
+ const parseMathFormat=enumeration("integer","mixed","improper","proper","decimal","percent","pi");const parseSimplify=pipeParsers(union(constant(null)).or(constant(undefined)).or(boolean).or(constant("true")).or(constant("required")).or(constant("correct")).or(constant("enforced")).or(constant("optional")).or(constant("accepted")).parser).then(convert(deprecatedSimplifyValuesToRequired)).parser;function deprecatedSimplifyValuesToRequired(simplify){switch(simplify){case "enforced":case "required":case "optional":return simplify;default:return "required"}}const parseNumericInputWidget=parseWidget(constant("numeric-input"),object({answers:array(object({message:defaulted(string,()=>""),value:optional(nullable(number)),status:string,answerForms:defaulted(optional(array(parseMathFormat)),()=>undefined),strict:defaulted(boolean,()=>false),maxError:optional(nullable(number)),simplify:parseSimplify})),labelText:optional(string),size:string,coefficient:defaulted(boolean,()=>false),rightAlign:optional(boolean),static:defaulted(boolean,()=>false)}));
142
142
 
143
143
  function parseRenderer(rawValue,ctx){return parsePerseusRenderer(rawValue,ctx)}const largeToAuto=(height,ctx)=>{if(height==="large"){return ctx.success("auto")}return ctx.success(height)};const parseOrdererWidget=parseWidget(constant("orderer"),object({options:defaulted(array(parseRenderer),()=>[]),correctOptions:defaulted(array(parseRenderer),()=>[]),otherOptions:defaulted(array(parseRenderer),()=>[]),height:pipeParsers(enumeration("normal","auto","large")).then(largeToAuto).parser,layout:defaulted(enumeration("horizontal","vertical"),()=>"horizontal")}));
144
144