@khanacademy/perseus-core 36.1.0 → 38.0.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.
Files changed (61) hide show
  1. package/dist/data-schema.d.ts +9 -29
  2. package/dist/es/index.item-splitting.js +14 -10
  3. package/dist/es/index.item-splitting.js.map +1 -1
  4. package/dist/es/index.js +26 -20
  5. package/dist/es/index.js.map +1 -1
  6. package/dist/index.d.ts +9 -61
  7. package/dist/index.item-splitting.js +14 -10
  8. package/dist/index.item-splitting.js.map +1 -1
  9. package/dist/index.js +30 -19
  10. package/dist/index.js.map +1 -1
  11. package/dist/parse-perseus-json/perseus-parsers/categorizer-widget.d.ts +0 -1
  12. package/dist/parse-perseus-json/perseus-parsers/definition-widget.d.ts +0 -1
  13. package/dist/parse-perseus-json/perseus-parsers/dropdown-widget.d.ts +0 -1
  14. package/dist/parse-perseus-json/perseus-parsers/explanation-widget.d.ts +0 -1
  15. package/dist/parse-perseus-json/perseus-parsers/graded-group-set-widget.d.ts +0 -3
  16. package/dist/parse-perseus-json/perseus-parsers/graded-group-widget.d.ts +0 -6
  17. package/dist/parse-perseus-json/perseus-parsers/iframe-widget.d.ts +0 -1
  18. package/dist/parse-perseus-json/perseus-parsers/interaction-widget.d.ts +0 -1
  19. package/dist/parse-perseus-json/perseus-parsers/label-image-widget.d.ts +0 -1
  20. package/dist/parse-perseus-json/perseus-parsers/number-line-widget.d.ts +0 -1
  21. package/dist/parse-perseus-json/perseus-parsers/video-widget.d.ts +0 -1
  22. package/dist/utils/generators/table-widget-generator.d.ts +10 -0
  23. package/dist/utils/widget-prop-denylist.d.ts +5 -0
  24. package/dist/validation.types.d.ts +8 -228
  25. package/dist/widgets/categorizer/categorizer-util.d.ts +0 -1
  26. package/dist/widgets/categorizer/index.d.ts +0 -1
  27. package/dist/widgets/cs-program/index.d.ts +0 -1
  28. package/dist/widgets/definition/index.d.ts +0 -2
  29. package/dist/widgets/dropdown/dropdown-util.d.ts +0 -1
  30. package/dist/widgets/dropdown/index.d.ts +0 -1
  31. package/dist/widgets/explanation/index.d.ts +0 -2
  32. package/dist/widgets/expression/index.d.ts +0 -1
  33. package/dist/widgets/free-response/index.d.ts +0 -1
  34. package/dist/widgets/graded-group/index.d.ts +0 -2
  35. package/dist/widgets/graded-group-set/index.d.ts +0 -2
  36. package/dist/widgets/grapher/index.d.ts +0 -1
  37. package/dist/widgets/group/index.d.ts +0 -1
  38. package/dist/widgets/iframe/index.d.ts +0 -1
  39. package/dist/widgets/image/index.d.ts +0 -1
  40. package/dist/widgets/input-number/index.d.ts +0 -1
  41. package/dist/widgets/interaction/index.d.ts +0 -2
  42. package/dist/widgets/interactive-graph/index.d.ts +0 -1
  43. package/dist/widgets/label-image/index.d.ts +0 -1
  44. package/dist/widgets/label-image/label-image-util.d.ts +0 -1
  45. package/dist/widgets/matcher/index.d.ts +0 -1
  46. package/dist/widgets/matrix/index.d.ts +0 -1
  47. package/dist/widgets/measurer/index.d.ts +0 -2
  48. package/dist/widgets/number-line/index.d.ts +0 -1
  49. package/dist/widgets/number-line/number-line-util.d.ts +1 -1
  50. package/dist/widgets/numeric-input/index.d.ts +0 -1
  51. package/dist/widgets/orderer/index.d.ts +0 -1
  52. package/dist/widgets/orderer/orderer-util.d.ts +11 -1
  53. package/dist/widgets/phet-simulation/index.d.ts +0 -2
  54. package/dist/widgets/plotter/index.d.ts +0 -1
  55. package/dist/widgets/python-program/index.d.ts +0 -2
  56. package/dist/widgets/radio/index.d.ts +0 -1
  57. package/dist/widgets/sorter/index.d.ts +0 -1
  58. package/dist/widgets/sorter/sorter-util.d.ts +12 -1
  59. package/dist/widgets/table/index.d.ts +0 -1
  60. package/dist/widgets/video/index.d.ts +0 -2
  61. package/package.json +1 -1
package/dist/index.d.ts CHANGED
@@ -53,128 +53,68 @@ export { default as blankLogic } from "./widgets/blank";
53
53
  /** @hidden */
54
54
  export { default as categorizerLogic } from "./widgets/categorizer";
55
55
  /** @hidden */
56
- export type { CategorizerDefaultWidgetOptions } from "./widgets/categorizer";
57
- /** @hidden */
58
56
  export { default as csProgramLogic } from "./widgets/cs-program";
59
57
  /** @hidden */
60
- export type { CSProgramDefaultWidgetOptions } from "./widgets/cs-program";
61
- /** @hidden */
62
58
  export { default as definitionLogic } from "./widgets/definition";
63
59
  /** @hidden */
64
- export type { DefinitionDefaultWidgetOptions } from "./widgets/definition";
65
- /** @hidden */
66
60
  export { default as dropdownLogic } from "./widgets/dropdown";
67
61
  /** @hidden */
68
- export type { DropdownDefaultWidgetOptions } from "./widgets/dropdown";
69
- /** @hidden */
70
62
  export { default as explanationLogic } from "./widgets/explanation";
71
63
  /** @hidden */
72
- export type { ExplanationDefaultWidgetOptions } from "./widgets/explanation";
73
- /** @hidden */
74
64
  export { default as expressionLogic } from "./widgets/expression";
75
65
  /** @hidden */
76
- export type { ExpressionDefaultWidgetOptions } from "./widgets/expression";
77
- /** @hidden */
78
66
  export { default as deriveExtraKeys } from "./widgets/expression/derive-extra-keys";
79
67
  /** @hidden */
80
68
  export { default as gradedGroupLogic } from "./widgets/graded-group";
81
69
  /** @hidden */
82
70
  export { default as freeResponseLogic } from "./widgets/free-response";
83
71
  /** @hidden */
84
- export type { FreeResponseDefaultWidgetOptions } from "./widgets/free-response";
85
- /** @hidden */
86
- export type { GradedGroupDefaultWidgetOptions } from "./widgets/graded-group";
87
- /** @hidden */
88
72
  export { default as gradedGroupSetLogic } from "./widgets/graded-group-set";
89
73
  /** @hidden */
90
- export type { GradedGroupSetDefaultWidgetOptions } from "./widgets/graded-group-set";
91
- /** @hidden */
92
74
  export { default as grapherLogic } from "./widgets/grapher";
93
75
  /** @hidden */
94
- export type { GrapherDefaultWidgetOptions } from "./widgets/grapher";
95
- /** @hidden */
96
76
  export { default as groupLogic } from "./widgets/group";
97
77
  /** @hidden */
98
- export type { GroupDefaultWidgetOptions } from "./widgets/group";
99
- /** @hidden */
100
78
  export { default as iframeLogic } from "./widgets/iframe";
101
79
  /** @hidden */
102
- export type { IFrameDefaultWidgetOptions } from "./widgets/iframe";
103
- /** @hidden */
104
80
  export { default as imageLogic } from "./widgets/image";
105
81
  /** @hidden */
106
- export type { ImageDefaultWidgetOptions } from "./widgets/image";
107
- /** @hidden */
108
82
  export { default as inputNumberLogic } from "./widgets/input-number";
109
83
  /** @hidden */
110
- export type { InputNumberDefaultWidgetOptions } from "./widgets/input-number";
111
- /** @hidden */
112
84
  export { default as interactionLogic } from "./widgets/interaction";
113
85
  /** @hidden */
114
- export type { InteractionDefaultWidgetOptions } from "./widgets/interaction";
115
- /** @hidden */
116
86
  export { default as interactiveGraphLogic } from "./widgets/interactive-graph";
117
87
  /** @hidden */
118
- export type { InteractiveGraphDefaultWidgetOptions } from "./widgets/interactive-graph";
119
- /** @hidden */
120
88
  export { default as labelImageLogic } from "./widgets/label-image";
121
89
  /** @hidden */
122
- export type { LabelImageDefaultWidgetOptions } from "./widgets/label-image";
123
- /** @hidden */
124
90
  export { default as matcherLogic } from "./widgets/matcher";
125
91
  /** @hidden */
126
- export type { MatcherDefaultWidgetOptions } from "./widgets/matcher";
127
- /** @hidden */
128
92
  export { default as matrixLogic } from "./widgets/matrix";
129
93
  /** @hidden */
130
- export type { MatrixDefaultWidgetOptions } from "./widgets/matrix";
131
- /** @hidden */
132
94
  export { default as measurerLogic } from "./widgets/measurer";
133
95
  /** @hidden */
134
- export type { MeasurerDefaultWidgetOptions } from "./widgets/measurer";
135
- /** @hidden */
136
96
  export { default as numberLineLogic } from "./widgets/number-line";
137
97
  /** @hidden */
138
- export type { NumberLineDefaultWidgetOptions } from "./widgets/number-line";
139
- /** @hidden */
140
98
  export { default as numericInputLogic } from "./widgets/numeric-input";
141
99
  /** @hidden */
142
- export type { NumericInputDefaultWidgetOptions } from "./widgets/numeric-input";
143
- /** @hidden */
144
100
  export { default as ordererLogic } from "./widgets/orderer";
145
101
  /** @hidden */
146
- export type { OrdererDefaultWidgetOptions } from "./widgets/orderer";
147
- /** @hidden */
148
102
  export { default as phetSimulationLogic } from "./widgets/phet-simulation";
149
103
  /** @hidden */
150
- export type { PhetSimulationDefaultWidgetOptions } from "./widgets/phet-simulation";
151
- /** @hidden */
152
104
  export { default as plotterLogic } from "./widgets/plotter";
153
105
  /** @hidden */
154
- export type { PlotterDefaultWidgetOptions } from "./widgets/plotter";
155
- /** @hidden */
156
106
  export { default as pythonProgramLogic } from "./widgets/python-program";
157
107
  /** @hidden */
158
- export type { PythonProgramDefaultWidgetOptions } from "./widgets/python-program";
159
- /** @hidden */
160
108
  export { default as radioLogic } from "./widgets/radio";
161
109
  /** @hidden */
162
- export type { RadioDefaultWidgetOptions } from "./widgets/radio";
163
- /** @hidden */
164
110
  export { usesNumCorrect } from "./widgets/radio/radio-util";
165
111
  /** @hidden */
166
112
  export { default as sorterLogic } from "./widgets/sorter";
167
113
  /** @hidden */
168
- export type { SorterDefaultWidgetOptions } from "./widgets/sorter";
169
- /** @hidden */
170
114
  export { default as tableLogic } from "./widgets/table";
171
115
  /** @hidden */
172
- export type { TableDefaultWidgetOptions } from "./widgets/table";
173
- /** @hidden */
174
116
  export { default as videoLogic } from "./widgets/video";
175
117
  /** @hidden */
176
- export type { VideoDefaultWidgetOptions } from "./widgets/video";
177
- /** @hidden */
178
118
  export { convertGrapherOptionsToInteractiveGraph, convertGrapherUserInputToInteractiveGraph, convertInteractiveGraphUserInputToGrapher, } from "./widgets/grapher/to-interactive-graph";
179
119
  /** @hidden */
180
120
  export { applyDefaultsToWidgets, applyDefaultsToWidget, } from "./widgets/apply-defaults";
@@ -191,7 +131,7 @@ export type * from "./widgets/logic-export.types";
191
131
  /** @hidden */
192
132
  export * as CoreWidgetRegistry from "./widgets/core-widget-registry";
193
133
  /** @hidden */
194
- export { getOrdererPublicWidgetOptions } from "./widgets/orderer/orderer-util";
134
+ export { getOrdererPublicWidgetOptions, mergeCards, toCard, } from "./widgets/orderer/orderer-util";
195
135
  /** @hidden */
196
136
  export type { OrdererPublicWidgetOptions } from "./widgets/orderer/orderer-util";
197
137
  /** @hidden */
@@ -213,6 +153,8 @@ export type { GrapherPublicWidgetOptions } from "./widgets/grapher/grapher-util"
213
153
  /** @hidden */
214
154
  export { getGroupPublicWidgetOptions } from "./widgets/group/group-util";
215
155
  /** @hidden */
156
+ export type { GroupPublicWidgetOptions } from "./widgets/group/group-util";
157
+ /** @hidden */
216
158
  export { getInteractiveGraphPublicWidgetOptions, type InteractiveGraphPublicWidgetOptions, } from "./widgets/interactive-graph/interactive-graph-util";
217
159
  /** @hidden */
218
160
  export { getLabelImagePublicWidgetOptions } from "./widgets/label-image/label-image-util";
@@ -318,6 +260,12 @@ export { generateRadioOptions, generateRadioChoice, generateSimpleRadioQuestion,
318
260
  export { generateVideoWidget } from "./utils/generators/video-widget-generator";
319
261
  /** @hidden */
320
262
  export { generateSorterWidget, generateSorterOptions, } from "./utils/generators/sorter-widget-generator";
263
+ /** @hidden */
264
+ export { generateTableOptions } from "./utils/generators/table-widget-generator";
265
+ /** @hidden */
266
+ export { generateGrapherWidgetOptions } from "./utils/generators/grapher-widget-generator";
321
267
  export { getAnswersFromWidgets, injectWidgets, } from "./utils/extract-perseus-ai-data";
322
268
  /** @hidden */
323
269
  export { getPerseusAIData } from "./utils/extract-perseus-ai-data";
270
+ /** @hidden */
271
+ export { excludeDenylistKeys } from "./utils/widget-prop-denylist";
@@ -80,15 +80,15 @@ function toValidAlignment(alignment){switch(alignment){case "default":case "bloc
80
80
 
81
81
  const parseBlankWidget=parseWidget(constant("blank"),object({displayType:defaulted(enumeration("normal","superscript","subscript"),()=>"normal"),correctId:string}));
82
82
 
83
- const parseCategorizerWidget=parseWidget(constant("categorizer"),object({items:array(string),categories:array(string),randomizeItems:defaulted(boolean,()=>false),static:defaulted(boolean,()=>false),values:defaulted(array(defaulted(number,()=>0)),()=>[])}));
83
+ const parseCategorizerWidget=parseWidget(constant("categorizer"),object({items:array(string),categories:array(string),randomizeItems:defaulted(boolean,()=>false),values:defaulted(array(defaulted(number,()=>0)),()=>[])}));
84
84
 
85
85
  const parseCSProgramWidget=parseWidget(constant("cs-program"),object({programID:string,programType:any,settings:array(object({name:string,value:string})),showEditor:boolean,showButtons:boolean,height:number}));
86
86
 
87
- const parseDefinitionWidget=parseWidget(constant("definition"),object({togglePrompt:string,definition:string,static:defaulted(boolean,()=>false)}));
87
+ const parseDefinitionWidget=parseWidget(constant("definition"),object({togglePrompt:string,definition:string}));
88
88
 
89
- const parseDropdownWidget=parseWidget(constant("dropdown"),object({placeholder:defaulted(string,()=>""),ariaLabel:optional(string),visibleLabel:optional(string),static:defaulted(boolean,()=>false),choices:array(object({content:string,correct:defaulted(boolean,()=>false)}))}));
89
+ const parseDropdownWidget=parseWidget(constant("dropdown"),object({placeholder:defaulted(string,()=>""),ariaLabel:optional(string),visibleLabel:optional(string),choices:array(object({content:string,correct:defaulted(boolean,()=>false)}))}));
90
90
 
91
- const parseExplanationWidget=parseWidget(constant("explanation"),object({showPrompt:string,hidePrompt:string,explanation:string,widgets:defaulted((rawVal,ctx)=>parseWidgetsMap(rawVal,ctx),()=>({})),static:defaulted(boolean,()=>false)}));
91
+ const parseExplanationWidget=parseWidget(constant("explanation"),object({showPrompt:string,hidePrompt:string,explanation:string,widgets:defaulted((rawVal,ctx)=>parseWidgetsMap(rawVal,ctx),()=>({}))}));
92
92
 
93
93
  const KeypadKeys=["PLUS","MINUS","NEGATIVE","TIMES","DIVIDE","DECIMAL","PERIOD","PERCENT","CDOT","EQUAL","NEQ","GT","LT","GEQ","LEQ","FRAC_INCLUSIVE","FRAC_EXCLUSIVE","FRAC","EXP","EXP_2","EXP_3","SUB","SQRT","CUBE_ROOT","RADICAL","LEFT_PAREN","RIGHT_PAREN","LN","LOG","LOG_N","SIN","COS","TAN","PI","THETA","UP","RIGHT","DOWN","LEFT","BACKSPACE","DISMISS","JUMP_OUT_PARENTHESES","JUMP_OUT_EXPONENT","JUMP_OUT_BASE","JUMP_INTO_NUMERATOR","JUMP_OUT_NUMERATOR","JUMP_OUT_DENOMINATOR","NUM_0","NUM_1","NUM_2","NUM_3","NUM_4","NUM_5","NUM_6","NUM_7","NUM_8","NUM_9","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"];
94
94
 
@@ -104,7 +104,7 @@ const stringOrNumberOrNullOrUndefined=union(string).or(number).or(constant(null)
104
104
 
105
105
  const parseFreeResponseWidget=parseWidget(constant("free-response"),object({allowUnlimitedCharacters:boolean,characterLimit:number,placeholder:string,question:string,scoringCriteria:array(object({text:string}))}));
106
106
 
107
- const falseToNull=pipeParsers(constant(false)).then(convert(()=>null)).parser;const parseGradedGroupWidgetOptions=object({title:defaulted(string,()=>""),hasHint:optional(nullable(boolean)),hint:union(falseToNull).or(constant(null)).or(constant(undefined)).or((rawVal,ctx)=>parsePerseusRenderer(rawVal,ctx)).parser,content:string,widgets:(rawVal,ctx)=>parseWidgetsMap(rawVal,ctx),widgetEnabled:optional(nullable(boolean)),immutableWidgets:optional(nullable(boolean)),images:record(string,object({width:number,height:number}))});const parseGradedGroupWidget=parseWidget(constant("graded-group"),parseGradedGroupWidgetOptions);
107
+ const falseToNull=pipeParsers(constant(false)).then(convert(()=>null)).parser;const parseGradedGroupWidgetOptions=object({title:defaulted(string,()=>""),hint:union(falseToNull).or(constant(null)).or(constant(undefined)).or((rawVal,ctx)=>parsePerseusRenderer(rawVal,ctx)).parser,content:string,widgets:(rawVal,ctx)=>parseWidgetsMap(rawVal,ctx),images:record(string,object({width:number,height:number}))});const parseGradedGroupWidget=parseWidget(constant("graded-group"),parseGradedGroupWidgetOptions);
108
108
 
109
109
  const parseGradedGroupSetWidget=parseWidget(constant("graded-group-set"),object({gradedGroups:array(parseGradedGroupWidgetOptions)}));
110
110
 
@@ -114,7 +114,7 @@ const pairOfNumbers$3=pair(number,number);const pairOfPoints=pair(pairOfNumbers$
114
114
 
115
115
  const parseGroupWidget=parseWidget(constant("group"),(rawVal,ctx)=>parsePerseusRenderer(rawVal,ctx));
116
116
 
117
- const parseIframeWidget=parseWidget(constant("iframe"),object({url:string,settings:optional(array(object({name:string,value:string}))),width:union(number).or(string).parser,height:union(number).or(string).parser,allowFullScreen:defaulted(boolean,()=>false),allowTopNavigation:optional(boolean),static:defaulted(boolean,()=>false)}));
117
+ const parseIframeWidget=parseWidget(constant("iframe"),object({url:string,settings:optional(array(object({name:string,value:string}))),width:union(number).or(string).parser,height:union(number).or(string).parser,allowFullScreen:defaulted(boolean,()=>false),allowTopNavigation:optional(boolean)}));
118
118
 
119
119
  const stringToNumber=(rawValue,ctx)=>{if(typeof rawValue==="number"){return ctx.success(rawValue)}const parsedNumber=+rawValue;if(rawValue===""||isNaN(parsedNumber)){return ctx.failure("a number or numeric string",rawValue)}return ctx.success(parsedNumber)};
120
120
 
@@ -124,11 +124,11 @@ const pairOfNumbers$2=pair(number,number);const parseImageWidget=parseWidget(con
124
124
 
125
125
  const booleanToZero=(rawValue,ctx)=>{if(typeof rawValue==="boolean"){return ctx.success(0)}return ctx.failure("boolean",rawValue)};const parseMathFormat$1=enumeration("integer","mixed","improper","proper","decimal","percent","pi");const parseInputNumberWidgetV1=parseWidgetWithVersion(object({major:constant(1),minor:number}),constant("input-number"),object({size:string,coefficient:boolean,labelText:optional(string),textAlign:enumeration("left","center","right"),answers:array(object({value:optional(nullable(number)),status:string,message:string,answerForms:optional(array(parseMathFormat$1)),strict:boolean,maxError:optional(nullable(number)),simplify:enumeration("required","enforced","optional")}))}));function migrateV0ToV1$3(v0){const v1Options=convertInputNumberOptionsToNumericInput(v0.options);return {...v0,version:{major:1,minor:0},options:v1Options}}const parseInputNumberWidgetV0=parseWidgetWithVersion(defaulted(optional(object({major:constant(0),minor:number})),()=>undefined),constant("input-number"),object({answerType:optional(enumeration("number","decimal","integer","rational","improper","mixed","percent","pi")),inexact:optional(boolean),maxError:optional(union(number).or(string).parser),rightAlign:optional(boolean),simplify:enumeration("required","optional","enforced"),size:enumeration("normal","small"),value:defaulted(union(number).or(string).or(booleanToZero).parser,()=>0)}));function convertInputNumberOptionsToNumericInput(inputNumberOptions){return {coefficient:false,textAlign:inputNumberOptions.rightAlign?"right":"left",size:inputNumberOptions.size,answers:[{status:"correct",value:Number(inputNumberOptions.value),simplify:inputNumberOptions.simplify,message:"",maxError:getMaxError(inputNumberOptions),strict:true,answerForms:getAnswerForms(inputNumberOptions)}]}}function getMaxError(inputNumberOptions){if(!inputNumberOptions.inexact){return 0}if(inputNumberOptions.maxError==null){return undefined}return Number(inputNumberOptions.maxError)}const mathFormatsForAnswerType={number:[],decimal:["decimal"],integer:["integer"],rational:["integer","proper","improper","mixed"],improper:["integer","proper","improper"],mixed:["integer","proper","mixed"],percent:["integer","decimal","proper","improper","mixed","percent"],pi:["pi"]};function getAnswerForms(options){const value=Number(options.value);const{inexact}=options;const precision=1e10;const rounded=Math.round(value*precision)/precision;const answerType=options.answerType??"number";if(answerType==="number"&&!inexact&&!equalFloats(rounded,value)){return ["proper","improper","mixed"]}return mathFormatsForAnswerType[answerType]}function equalFloats(a,b){return Math.abs(a-b)<Math.pow(2,-42)}const parseInputNumberWidget=versionedWidgetOptions(1,parseInputNumberWidgetV1).withMigrationFrom(0,parseInputNumberWidgetV0,migrateV0ToV1$3).parser;
126
126
 
127
- const pairOfNumbers$1=pair(number,number);const stringOrEmpty=defaulted(string,()=>"");const parseKey=pipeParsers(optional(string)).then(convert(String)).parser;const parseFunctionElement=object({type:constant("function"),key:parseKey,options:object({value:string,funcName:string,rangeMin:string,rangeMax:string,color:string,strokeDasharray:string,strokeWidth:number})});const parseLabelElement=object({type:constant("label"),key:parseKey,options:object({label:string,color:string,coordX:string,coordY:string})});const parseLineElement=object({type:constant("line"),key:parseKey,options:object({color:string,startX:string,startY:string,endX:string,endY:string,strokeDasharray:string,strokeWidth:number,arrows:string})});const parseMovableLineElement=object({type:constant("movable-line"),key:parseKey,options:object({startX:string,startY:string,startSubscript:number,endX:string,endY:string,endSubscript:number,constraint:string,snap:number,constraintFn:string,constraintXMin:string,constraintXMax:string,constraintYMin:string,constraintYMax:string})});const parseMovablePointElement=object({type:constant("movable-point"),key:parseKey,options:object({startX:string,startY:string,varSubscript:number,constraint:string,snap:number,constraintFn:string,constraintXMin:stringOrEmpty,constraintXMax:stringOrEmpty,constraintYMin:stringOrEmpty,constraintYMax:stringOrEmpty})});const parseParametricElement=object({type:constant("parametric"),key:parseKey,options:object({x:string,y:string,rangeMin:string,rangeMax:string,color:string,strokeDasharray:string,strokeWidth:number})});const parsePointElement=object({type:constant("point"),key:parseKey,options:object({color:string,coordX:string,coordY:string})});const parseRectangleElement=object({type:constant("rectangle"),key:parseKey,options:object({color:string,coordX:string,coordY:string,width:string,height:string})});const parseInteractionWidget=parseWidget(constant("interaction"),object({static:defaulted(boolean,()=>false),graph:object({editableSettings:optional(array(enumeration("canvas","graph"))),box:pairOfNumbers$1,labels:array(string),range:pair(pairOfNumbers$1,pairOfNumbers$1),gridStep:pairOfNumbers$1,markings:enumeration("graph","grid","none","axes"),snapStep:optional(pairOfNumbers$1),valid:optional(union(boolean).or(string).parser),backgroundImage:optional(parsePerseusImageBackground),showProtractor:optional(boolean),showRuler:optional(boolean),rulerLabel:optional(string),rulerTicks:optional(number),tickStep:pairOfNumbers$1}),elements:array(discriminatedUnionOn("type").withBranch("function",parseFunctionElement).withBranch("label",parseLabelElement).withBranch("line",parseLineElement).withBranch("movable-line",parseMovableLineElement).withBranch("movable-point",parseMovablePointElement).withBranch("parametric",parseParametricElement).withBranch("point",parsePointElement).withBranch("rectangle",parseRectangleElement).parser)}));
127
+ const pairOfNumbers$1=pair(number,number);const stringOrEmpty=defaulted(string,()=>"");const parseKey=pipeParsers(optional(string)).then(convert(String)).parser;const parseFunctionElement=object({type:constant("function"),key:parseKey,options:object({value:string,funcName:string,rangeMin:string,rangeMax:string,color:string,strokeDasharray:string,strokeWidth:number})});const parseLabelElement=object({type:constant("label"),key:parseKey,options:object({label:string,color:string,coordX:string,coordY:string})});const parseLineElement=object({type:constant("line"),key:parseKey,options:object({color:string,startX:string,startY:string,endX:string,endY:string,strokeDasharray:string,strokeWidth:number,arrows:string})});const parseMovableLineElement=object({type:constant("movable-line"),key:parseKey,options:object({startX:string,startY:string,startSubscript:number,endX:string,endY:string,endSubscript:number,constraint:string,snap:number,constraintFn:string,constraintXMin:string,constraintXMax:string,constraintYMin:string,constraintYMax:string})});const parseMovablePointElement=object({type:constant("movable-point"),key:parseKey,options:object({startX:string,startY:string,varSubscript:number,constraint:string,snap:number,constraintFn:string,constraintXMin:stringOrEmpty,constraintXMax:stringOrEmpty,constraintYMin:stringOrEmpty,constraintYMax:stringOrEmpty})});const parseParametricElement=object({type:constant("parametric"),key:parseKey,options:object({x:string,y:string,rangeMin:string,rangeMax:string,color:string,strokeDasharray:string,strokeWidth:number})});const parsePointElement=object({type:constant("point"),key:parseKey,options:object({color:string,coordX:string,coordY:string})});const parseRectangleElement=object({type:constant("rectangle"),key:parseKey,options:object({color:string,coordX:string,coordY:string,width:string,height:string})});const parseInteractionWidget=parseWidget(constant("interaction"),object({graph:object({editableSettings:optional(array(enumeration("canvas","graph"))),box:pairOfNumbers$1,labels:array(string),range:pair(pairOfNumbers$1,pairOfNumbers$1),gridStep:pairOfNumbers$1,markings:enumeration("graph","grid","none","axes"),snapStep:optional(pairOfNumbers$1),valid:optional(union(boolean).or(string).parser),backgroundImage:optional(parsePerseusImageBackground),showProtractor:optional(boolean),showRuler:optional(boolean),rulerLabel:optional(string),rulerTicks:optional(number),tickStep:pairOfNumbers$1}),elements:array(discriminatedUnionOn("type").withBranch("function",parseFunctionElement).withBranch("label",parseLabelElement).withBranch("line",parseLineElement).withBranch("movable-line",parseMovableLineElement).withBranch("movable-point",parseMovablePointElement).withBranch("parametric",parseParametricElement).withBranch("point",parsePointElement).withBranch("rectangle",parseRectangleElement).parser)}));
128
128
 
129
129
  const pairOfNumbers=pair(number,number);const parsePerseusGraphTypeAngle=object({type:constant("angle"),showAngles:optional(boolean),allowReflexAngles:optional(boolean),angleOffsetDeg:optional(nullable(number)),snapDegrees:optional(number),match:optional(constant("congruent")),coords:optional(trio(pairOfNumbers,pairOfNumbers,pairOfNumbers)),startCoords:optional(trio(pairOfNumbers,pairOfNumbers,pairOfNumbers)),pointLabels:optional(trio(string,string,string)),showPointLabels:optional(boolean)});const parsePerseusGraphTypeCircle=object({type:constant("circle"),center:optional(pairOfNumbers),radius:optional(number),startCoords:optional(object({center:pairOfNumbers,radius:number})),pointLabels:optional(array(string)),showPointLabels:optional(boolean)});const parsePerseusGraphTypeLinear=object({type:constant("linear"),coords:optional(nullable(pair(pairOfNumbers,pairOfNumbers))),startCoords:optional(pair(pairOfNumbers,pairOfNumbers)),pointLabels:optional(pair(string,string)),showPointLabels:optional(boolean)});const parsePerseusGraphTypeLinearSystem=object({type:constant("linear-system"),coords:optional(nullable(array(pair(pairOfNumbers,pairOfNumbers)))),startCoords:optional(array(pair(pairOfNumbers,pairOfNumbers))),pointLabels:optional(array(string)),showPointLabels:optional(boolean)});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),pointLabels:optional(array(string)),showPointLabels:optional(boolean)});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))),pointLabels:optional(array(string)),showPointLabels:optional(boolean)});const parsePerseusGraphTypeQuadratic=object({type:constant("quadratic"),coords:optional(nullable(trio(pairOfNumbers,pairOfNumbers,pairOfNumbers))),startCoords:optional(trio(pairOfNumbers,pairOfNumbers,pairOfNumbers)),pointLabels:optional(trio(string,string,string)),showPointLabels:optional(boolean)});const parsePerseusGraphTypeRay=object({type:constant("ray"),coords:optional(nullable(pair(pairOfNumbers,pairOfNumbers))),startCoords:optional(pair(pairOfNumbers,pairOfNumbers)),pointLabels:optional(pair(string,string)),showPointLabels:optional(boolean)});const parsePerseusGraphTypeSegment=object({type:constant("segment"),numSegments:optional(number),coords:optional(nullable(array(pair(pairOfNumbers,pairOfNumbers)))),startCoords:optional(array(pair(pairOfNumbers,pairOfNumbers))),pointLabels:optional(array(string)),showPointLabels:optional(boolean)});const parsePerseusGraphTypeSinusoid=object({type:constant("sinusoid"),coords:optional(nullable(pair(pairOfNumbers,pairOfNumbers))),startCoords:optional(pair(pairOfNumbers,pairOfNumbers)),pointLabels:optional(array(string)),showPointLabels:optional(boolean)});const parsePerseusGraphTypeExponential=object({type:constant("exponential"),coords:optional(nullable(pair(pairOfNumbers,pairOfNumbers))),asymptote:optional(nullable(number)),startCoords:optional(object({coords:pair(pairOfNumbers,pairOfNumbers),asymptote:number})),pointLabels:optional(array(string)),showPointLabels:optional(boolean)});const parsePerseusGraphTypeAbsoluteValue=object({type:constant("absolute-value"),coords:optional(nullable(pair(pairOfNumbers,pairOfNumbers))),startCoords:optional(pair(pairOfNumbers,pairOfNumbers)),pointLabels:optional(pair(string,string)),showPointLabels:optional(boolean)});const parsePerseusGraphTypeTangent=object({type:constant("tangent"),coords:optional(nullable(pair(pairOfNumbers,pairOfNumbers))),startCoords:optional(pair(pairOfNumbers,pairOfNumbers)),pointLabels:optional(array(string)),showPointLabels:optional(boolean)});const parsePerseusGraphTypeLogarithm=object({type:constant("logarithm"),coords:optional(nullable(pair(pairOfNumbers,pairOfNumbers))),asymptote:optional(nullable(number)),startCoords:optional(object({coords:pair(pairOfNumbers,pairOfNumbers),asymptote:number})),pointLabels:optional(array(string)),showPointLabels:optional(boolean)});const parsePerseusGraphTypeVector=object({type:constant("vector"),coords:optional(nullable(pair(pairOfNumbers,pairOfNumbers))),startCoords:optional(pair(pairOfNumbers,pairOfNumbers)),match:optional(enumeration("exact","congruent"))});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).withBranch("vector",parsePerseusGraphTypeVector).parser;const parseLockedFigureColor=pipeParsers(enumeration("blue","gold","green","grayH","purple","pink","red","orange")).then(convert(color=>color==="orange"?"gold":color)).parser;const parseLockedFigureFillType=enumeration("none","white","translucent","solid");const parseLockedLineStyle=enumeration("solid","dashed");const parseLockedFigureStrokeStyle=enumeration("solid","dashed","none");const parseStrokeWeight=defaulted(enumeration("medium","thin","thick"),()=>"medium");const parseLockedLabelType=object({type:constant("label"),coord:pairOfNumbers,text:defaulted(string,()=>""),color:defaulted(parseLockedFigureColor,()=>"grayH"),size:defaulted(enumeration("small","medium","large"),()=>"medium")});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:parseLockedFigureStrokeStyle,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:parseLockedFigureStrokeStyle,weight:parseStrokeWeight,labels:defaulted(array(parseLockedLabelType),()=>[]),ariaLabel:optional(string)});const numberOrNegativeInfinity=union(number).or(constant(-Infinity)).parser;const numberOrPositiveInfinity=union(number).or(constant(Infinity)).parser;const parseLockedFunctionDomain=defaulted(pair(defaulted(numberOrNegativeInfinity,()=>-Infinity),defaulted(numberOrPositiveInfinity,()=>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=pipeParsers(enumeration("onAxis","alongEdge","",null,undefined)).then(convert(value=>value||"onAxis")).parser;const parseInteractiveGraphWidget=parseWidget(constant("interactive-graph"),object({step:pairOfNumbers,gridStep:optional(pairOfNumbers),snapStep:optional(pairOfNumbers),backgroundImage:defaulted(parsePerseusImageBackground,()=>({url:null})),markings:enumeration("graph","grid","none","axes"),labels:defaulted(array(string),()=>["$x$","$y$"]),labelLocation:parseLabelLocation,showProtractor:boolean,showRuler:optional(boolean),showTooltips:defaulted(boolean,()=>false),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})),showAxisTicks:defaulted(object({x:boolean,y:boolean}),()=>({x:true,y:true})),graph:defaulted(parsePerseusGraphType,()=>({type:"linear"})),correct:defaulted(parsePerseusGraphType,()=>({type:"linear"})),lockedFigures:defaulted(array(parseLockedFigure),()=>[]),fullGraphAriaLabel:optional(string),fullGraphAriaDescription:optional(string)}));
130
130
 
131
- 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)}));
131
+ 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}));
132
132
 
133
133
  const matcherOptions=object({labels:array(string),left:array(string),right:array(string),orderMatters:boolean,padding:boolean});function getDefaultOptions$1(){return {left:["$x$","$y$","$z$"],right:["$1$","$2$","$3$"],labels:["test","label"],orderMatters:false,padding:true}}const parseMatcherWidget=parseWidget(constant("matcher"),defaulted(matcherOptions,getDefaultOptions$1));
134
134
 
@@ -136,7 +136,7 @@ const numberOrStringOrNaN=union(number).or(string).or(constant(NaN)).parser;cons
136
136
 
137
137
  const parseMeasurerWidgetV1=parseWidgetWithVersion(object({major:constant(1),minor:number}),constant("measurer"),object({image:defaulted(parsePerseusImageBackground,()=>({url:null,top:0,left:0})),showProtractor:boolean,showRuler:boolean,rulerLabel:string,rulerTicks:number,rulerPixels:number,rulerLength:number,box:pair(number,number)}));const parseMeasurerWidgetV0=parseWidget(constant("measurer"),object({imageTop:number,imageLeft:number,imageUrl:optional(nullable(string)),showProtractor:boolean,showRuler:boolean,rulerLabel:string,rulerTicks:number,rulerPixels:number,rulerLength:number,box:pair(number,number)}));function migrateV0ToV1$2(v0){const{imageTop,imageLeft,imageUrl,...v1Options}=v0.options;return {...v0,version:{major:1,minor:0},options:{image:{top:imageTop,left:imageLeft,url:imageUrl},...v1Options}}}const parseMeasurerWidget=versionedWidgetOptions(1,parseMeasurerWidgetV1).withMigrationFrom(0,parseMeasurerWidgetV0,migrateV0ToV1$2).parser;
138
138
 
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:enumeration("decimal","improper","mixed","non-reduced"),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)}));
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:enumeration("decimal","improper","mixed","non-reduced"),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)}));
140
140
 
141
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 parseNumericInputAnswers=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}));const version1$1=object({major:constant(1),minor:number});const parseNumericInputWidgetV1=parseWidgetWithVersion(version1$1,constant("numeric-input"),object({answers:parseNumericInputAnswers,labelText:optional(string),size:string,coefficient:defaulted(boolean,()=>false),textAlign:defaulted(enumeration("left","right","center"),()=>"left")}));const version0$1=optional(object({major:constant(0),minor:number}));const parseNumericInputWidgetV0=parseWidgetWithVersion(version0$1,constant("numeric-input"),object({answers:parseNumericInputAnswers,labelText:optional(string),size:string,coefficient:defaulted(boolean,()=>false),rightAlign:optional(boolean)}));function migrateV0ToV1$1(widget){const{rightAlign,...options}=widget.options;return {...widget,version:{major:1,minor:0},options:{...options,textAlign:rightAlign?"right":"left"}}}const parseNumericInputWidget=versionedWidgetOptions(1,parseNumericInputWidgetV1).withMigrationFrom(0,parseNumericInputWidgetV0,migrateV0ToV1$1).parser;
142
142
 
@@ -156,7 +156,7 @@ const parseSorterWidget=parseWidget(constant("sorter"),object({correct:array(str
156
156
 
157
157
  const parseTableWidget=parseWidget(constant("table"),object({headers:array(string),rows:number,columns:number,answers:defaulted(array(array(string)),()=>[])}));
158
158
 
159
- const parseVideoWidget=parseWidget(constant("video"),object({location:string,static:optional(boolean)}));
159
+ const parseVideoWidget=parseWidget(constant("video"),object({location:string}));
160
160
 
161
161
  const parseStringToNonNegativeInt=(rawValue,ctx)=>{if(typeof rawValue!=="string"||!/^(0|[1-9][0-9]*)$/.test(rawValue)){return ctx.failure("a string representing a non-negative integer",rawValue)}return ctx.success(+rawValue)};const parseWidgetIdComponents=pair(string,parseStringToNonNegativeInt);
162
162
 
@@ -188,6 +188,10 @@ class Registry{throwIfUnregistered(){if(!this.anythingRegistered){throw new Erro
188
188
 
189
189
  const seededRNG=function(seed){let randomSeed=seed;return function(){let seed=randomSeed;seed=seed+0x7ed55d16+(seed<<12)&0xffffffff;seed=(seed^0xc761c23c^seed>>>19)&0xffffffff;seed=seed+0x165667b1+(seed<<5)&0xffffffff;seed=(seed+0xd3a2646c^seed<<9)&0xffffffff;seed=seed+0xfd7046c5+(seed<<3)&0xffffffff;seed=(seed^0xb55a4f09^seed>>>16)&0xffffffff;return (randomSeed=seed&0xfffffff)/0x10000000}};seededRNG(new Date().getTime()&0xffffffff);
190
190
 
191
+ function toCard(content){return {content,widgets:{},images:{}}}function getCategoryScore(content){if(/\d/.test(content)){return 0}if(/^\$?[a-zA-Z]+\$?$/.test(content)){return 2}return 1}function mergeCards(correctOptions,otherOptions){const allCards=[...correctOptions,...otherOptions];return [...new Set(allCards.map(card=>card.content))].filter(content=>content!=="").sort().sort((a,b)=>getCategoryScore(a)-getCategoryScore(b)).map(toCard)}
192
+
193
+ const defaultCorrectOptions=[toCard("$x$")];const defaultOtherOptions=[toCard("$y$")];({options:mergeCards(defaultCorrectOptions,defaultOtherOptions)});
194
+
191
195
  const defaultRows=4;const defaultColumns=1;new Array(defaultRows).fill(0).map(()=>new Array(defaultColumns).fill(""));
192
196
 
193
197
  const widgets=new Registry("Core widget registry");function getCurrentVersion(type){const widgetLogic=widgets.get(type);return widgetLogic?.version||{major:0,minor:0}}const getPublicWidgetOptionsFunction=type=>{return widgets.get(type)?.getPublicWidgetOptions??(i=>i)};function getDefaultWidgetOptions(type){const widgetLogic=widgets.get(type);return widgetLogic?.defaultWidgetOptions||{}}const getSupportedAlignments=type=>{const widgetLogic=widgets.get(type);if(!widgetLogic?.supportedAlignments?.[0]){return ["default"]}return widgetLogic?.supportedAlignments};