@doenet/doenetml 0.6.0-alpha1

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 (549) hide show
  1. package/.prettierrc +3 -0
  2. package/LICENSE +661 -0
  3. package/README.md +146 -0
  4. package/cypress/e2e/ActivityViewer/activityVariants.cy.js +1770 -0
  5. package/cypress/e2e/ActivityViewer/compiledActivity.cy.js +83 -0
  6. package/cypress/e2e/ActivityViewer/relationshipsAmongPages.cy.js +697 -0
  7. package/cypress/e2e/answerValidation/errorinnumbers.cy.js +2125 -0
  8. package/cypress/e2e/answerValidation/factoring.cy.js +1945 -0
  9. package/cypress/e2e/answerValidation/factoringOldAlgorithm.cy.js +892 -0
  10. package/cypress/e2e/answerValidation/functionanswers.cy.js +314 -0
  11. package/cypress/e2e/answerValidation/matchingpatterns.cy.js +287 -0
  12. package/cypress/e2e/answerValidation/matchpartial.cy.js +6711 -0
  13. package/cypress/e2e/answerValidation/pointlocation.cy.js +3989 -0
  14. package/cypress/e2e/answerValidation/symbolicequality.cy.js +1893 -0
  15. package/cypress/e2e/answerValidation/videoProgress.cy.js +210 -0
  16. package/cypress/e2e/assignNames/basiccopy.cy.js +2376 -0
  17. package/cypress/e2e/assignNames/collections.cy.js +9247 -0
  18. package/cypress/e2e/assignNames/selects.cy.js +105 -0
  19. package/cypress/e2e/assignNames/sequences.cy.js +1964 -0
  20. package/cypress/e2e/baseComponent/basecomponentproperties.cy.js +999 -0
  21. package/cypress/e2e/baseComponent/doenetMLtext.cy.js +427 -0
  22. package/cypress/e2e/chemistry/atom.cy.js +201 -0
  23. package/cypress/e2e/chemistry/ion.cy.js +608 -0
  24. package/cypress/e2e/chemistry/ioniccompound.cy.js +133 -0
  25. package/cypress/e2e/dynamicalsystem/cobwebpolyline.cy.js +2653 -0
  26. package/cypress/e2e/dynamicalsystem/equilibriumcurve.cy.js +311 -0
  27. package/cypress/e2e/dynamicalsystem/equilibriumline.cy.js +279 -0
  28. package/cypress/e2e/dynamicalsystem/equilibriumpoint.cy.js +283 -0
  29. package/cypress/e2e/dynamicalsystem/odesystem.cy.js +1834 -0
  30. package/cypress/e2e/equality/mathexpressions.cy.js +948 -0
  31. package/cypress/e2e/graphing/graphreferences.cy.js +978 -0
  32. package/cypress/e2e/graphing/graphreferences2.cy.js +615 -0
  33. package/cypress/e2e/linearAlgebra/eigenDecomposition.cy.js +401 -0
  34. package/cypress/e2e/tagSpecific/angle.cy.js +3898 -0
  35. package/cypress/e2e/tagSpecific/animatefromsequence.cy.js +2306 -0
  36. package/cypress/e2e/tagSpecific/answer.cy.js +31647 -0
  37. package/cypress/e2e/tagSpecific/bestfitline.cy.js +612 -0
  38. package/cypress/e2e/tagSpecific/blockquote.cy.js +30 -0
  39. package/cypress/e2e/tagSpecific/boolean.cy.js +742 -0
  40. package/cypress/e2e/tagSpecific/booleaninput.cy.js +1283 -0
  41. package/cypress/e2e/tagSpecific/booleanlist.cy.js +588 -0
  42. package/cypress/e2e/tagSpecific/booleanoperators.cy.js +596 -0
  43. package/cypress/e2e/tagSpecific/booleanoperatorsonmath.cy.js +498 -0
  44. package/cypress/e2e/tagSpecific/callaction.cy.js +2835 -0
  45. package/cypress/e2e/tagSpecific/choiceinput.cy.js +3205 -0
  46. package/cypress/e2e/tagSpecific/circle.cy.js +22036 -0
  47. package/cypress/e2e/tagSpecific/codeeditor.cy.js +1995 -0
  48. package/cypress/e2e/tagSpecific/collect.cy.js +5035 -0
  49. package/cypress/e2e/tagSpecific/componentsize.cy.js +502 -0
  50. package/cypress/e2e/tagSpecific/conditionalcontent.cy.js +3495 -0
  51. package/cypress/e2e/tagSpecific/contentBrowser.cy.js +335 -0
  52. package/cypress/e2e/tagSpecific/contentpicker.cy.js +261 -0
  53. package/cypress/e2e/tagSpecific/copy.cy.js +12627 -0
  54. package/cypress/e2e/tagSpecific/copy2.cy.js +5698 -0
  55. package/cypress/e2e/tagSpecific/curve.bezier.cy.js +12440 -0
  56. package/cypress/e2e/tagSpecific/curve.cy.js +1716 -0
  57. package/cypress/e2e/tagSpecific/curve.function.cy.js +1471 -0
  58. package/cypress/e2e/tagSpecific/curve.parametrized.cy.js +920 -0
  59. package/cypress/e2e/tagSpecific/document.cy.js +234 -0
  60. package/cypress/e2e/tagSpecific/endpoint.cy.js +197 -0
  61. package/cypress/e2e/tagSpecific/evaluate.cy.js +8895 -0
  62. package/cypress/e2e/tagSpecific/extract.cy.js +2282 -0
  63. package/cypress/e2e/tagSpecific/feedback.cy.js +2941 -0
  64. package/cypress/e2e/tagSpecific/function.cy.js +9450 -0
  65. package/cypress/e2e/tagSpecific/functioniterates.cy.js +1178 -0
  66. package/cypress/e2e/tagSpecific/functionoperators.cy.js +4047 -0
  67. package/cypress/e2e/tagSpecific/graph.cy.js +2491 -0
  68. package/cypress/e2e/tagSpecific/group.cy.js +683 -0
  69. package/cypress/e2e/tagSpecific/hint.cy.js +204 -0
  70. package/cypress/e2e/tagSpecific/image.cy.js +770 -0
  71. package/cypress/e2e/tagSpecific/integer.cy.js +206 -0
  72. package/cypress/e2e/tagSpecific/label.cy.js +800 -0
  73. package/cypress/e2e/tagSpecific/legend.cy.js +1001 -0
  74. package/cypress/e2e/tagSpecific/line.cy.js +12167 -0
  75. package/cypress/e2e/tagSpecific/linesegment.cy.js +4749 -0
  76. package/cypress/e2e/tagSpecific/lorem.cy.js +289 -0
  77. package/cypress/e2e/tagSpecific/map.cy.js +4476 -0
  78. package/cypress/e2e/tagSpecific/matchespattern.cy.js +693 -0
  79. package/cypress/e2e/tagSpecific/math.cy.js +10990 -0
  80. package/cypress/e2e/tagSpecific/mathdisplay.cy.js +2689 -0
  81. package/cypress/e2e/tagSpecific/mathinput.cy.js +15628 -0
  82. package/cypress/e2e/tagSpecific/mathinputgraph.cy.js +566 -0
  83. package/cypress/e2e/tagSpecific/mathlist.cy.js +4073 -0
  84. package/cypress/e2e/tagSpecific/mathoperators.cy.js +13851 -0
  85. package/cypress/e2e/tagSpecific/matrix.cy.js +8825 -0
  86. package/cypress/e2e/tagSpecific/matrixinput.cy.js +16277 -0
  87. package/cypress/e2e/tagSpecific/module.cy.js +1771 -0
  88. package/cypress/e2e/tagSpecific/number.cy.js +2221 -0
  89. package/cypress/e2e/tagSpecific/numberlist.cy.js +1285 -0
  90. package/cypress/e2e/tagSpecific/p.cy.js +72 -0
  91. package/cypress/e2e/tagSpecific/paginator.cy.js +2983 -0
  92. package/cypress/e2e/tagSpecific/parabola.cy.js +14331 -0
  93. package/cypress/e2e/tagSpecific/paragraphmarkup.cy.js +104 -0
  94. package/cypress/e2e/tagSpecific/periodicset.cy.js +1439 -0
  95. package/cypress/e2e/tagSpecific/piecewisefunction.cy.js +1055 -0
  96. package/cypress/e2e/tagSpecific/pluralize.cy.js +274 -0
  97. package/cypress/e2e/tagSpecific/point.cy.js +8895 -0
  98. package/cypress/e2e/tagSpecific/point2.cy.js +10259 -0
  99. package/cypress/e2e/tagSpecific/polygon.cy.js +5039 -0
  100. package/cypress/e2e/tagSpecific/polyline.cy.js +4704 -0
  101. package/cypress/e2e/tagSpecific/problem.cy.js +2768 -0
  102. package/cypress/e2e/tagSpecific/ray.cy.js +10770 -0
  103. package/cypress/e2e/tagSpecific/rectangle.cy.js +2143 -0
  104. package/cypress/e2e/tagSpecific/ref.cy.js +420 -0
  105. package/cypress/e2e/tagSpecific/regularPolygon.cy.js +1006 -0
  106. package/cypress/e2e/tagSpecific/regularPolygon2.cy.js +100 -0
  107. package/cypress/e2e/tagSpecific/regularPolygon3.cy.js +777 -0
  108. package/cypress/e2e/tagSpecific/samplerandomnumbers.cy.js +3619 -0
  109. package/cypress/e2e/tagSpecific/sectioning.cy.js +3530 -0
  110. package/cypress/e2e/tagSpecific/select.cy.js +5376 -0
  111. package/cypress/e2e/tagSpecific/selectfromsequence.cy.js +3846 -0
  112. package/cypress/e2e/tagSpecific/selectrandomnumbers.cy.js +2914 -0
  113. package/cypress/e2e/tagSpecific/sequence.cy.js +2093 -0
  114. package/cypress/e2e/tagSpecific/shuffle.cy.js +490 -0
  115. package/cypress/e2e/tagSpecific/sidebyside.cy.js +8057 -0
  116. package/cypress/e2e/tagSpecific/singlecharactercomponents.cy.js +72 -0
  117. package/cypress/e2e/tagSpecific/slider.cy.js +914 -0
  118. package/cypress/e2e/tagSpecific/solution.cy.js +109 -0
  119. package/cypress/e2e/tagSpecific/solveequations.cy.js +1026 -0
  120. package/cypress/e2e/tagSpecific/sort.cy.js +1685 -0
  121. package/cypress/e2e/tagSpecific/spreadsheet.cy.js +5971 -0
  122. package/cypress/e2e/tagSpecific/subsetofreals.cy.js +2725 -0
  123. package/cypress/e2e/tagSpecific/substitute.cy.js +2646 -0
  124. package/cypress/e2e/tagSpecific/tabular.cy.js +36 -0
  125. package/cypress/e2e/tagSpecific/text.cy.js +975 -0
  126. package/cypress/e2e/tagSpecific/textinput.cy.js +2177 -0
  127. package/cypress/e2e/tagSpecific/textlist.cy.js +369 -0
  128. package/cypress/e2e/tagSpecific/triangle.cy.js +1936 -0
  129. package/cypress/e2e/tagSpecific/triggerset.cy.js +2023 -0
  130. package/cypress/e2e/tagSpecific/updatevalue.cy.js +3288 -0
  131. package/cypress/e2e/tagSpecific/vector.cy.js +20183 -0
  132. package/cypress/e2e/tagSpecific/video.cy.js +612 -0
  133. package/cypress/e2e/tagSpecific/when.cy.js +202 -0
  134. package/cypress/e2e/variants/specifysinglevariant.cy.js +6726 -0
  135. package/cypress/e2e/variants/uniquevariants.cy.js +4846 -0
  136. package/cypress/fixtures/example.json +5 -0
  137. package/cypress/support/commands.js +32 -0
  138. package/cypress/support/e2e.js +31 -0
  139. package/cypress.config.js +18 -0
  140. package/docs/codeSnippet.jsx +11 -0
  141. package/docs/index.html +133 -0
  142. package/docs/index.jsx +138 -0
  143. package/docs/prism.css +3 -0
  144. package/index.html +14 -0
  145. package/index.js +21 -0
  146. package/media/answer_example.png +0 -0
  147. package/media/graph_example.png +0 -0
  148. package/media/graph_markup_example.png +0 -0
  149. package/package.json +83 -0
  150. package/public/favicon.ico +0 -0
  151. package/public/fonts/files/open-sans-v18-latin-700.woff +0 -0
  152. package/public/fonts/files/open-sans-v18-latin-700.woff2 +0 -0
  153. package/public/fonts/files/open-sans-v18-latin-700italic.woff +0 -0
  154. package/public/fonts/files/open-sans-v18-latin-700italic.woff2 +0 -0
  155. package/public/fonts/files/open-sans-v18-latin-italic.woff +0 -0
  156. package/public/fonts/files/open-sans-v18-latin-italic.woff2 +0 -0
  157. package/public/fonts/files/open-sans-v18-latin-light-italic.woff +0 -0
  158. package/public/fonts/files/open-sans-v18-latin-light-italic.woff2 +0 -0
  159. package/public/fonts/files/open-sans-v18-latin-light.woff +0 -0
  160. package/public/fonts/files/open-sans-v18-latin-light.woff2 +0 -0
  161. package/public/fonts/files/open-sans-v18-latin-regular.woff +0 -0
  162. package/public/fonts/files/open-sans-v18-latin-regular.woff2 +0 -0
  163. package/src/Core/ComponentTypes.js +426 -0
  164. package/src/Core/Core.js +11852 -0
  165. package/src/Core/CoreWorker.js +127 -0
  166. package/src/Core/Dependencies.js +8226 -0
  167. package/src/Core/Numerics.js +473 -0
  168. package/src/Core/ParameterStack.js +36 -0
  169. package/src/Core/ReadOnlyProxyHandler.js +41 -0
  170. package/src/Core/StateProxyHandler.js +88 -0
  171. package/src/Core/components/Aliases.js +67 -0
  172. package/src/Core/components/Angle.js +758 -0
  173. package/src/Core/components/AnimateFromSequence.js +922 -0
  174. package/src/Core/components/Answer.js +2087 -0
  175. package/src/Core/components/AsList.js +83 -0
  176. package/src/Core/components/AttractTo.js +245 -0
  177. package/src/Core/components/AttractToAngles.js +262 -0
  178. package/src/Core/components/AttractToConstraint.js +104 -0
  179. package/src/Core/components/AttractToGrid.js +315 -0
  180. package/src/Core/components/Award.js +906 -0
  181. package/src/Core/components/BestFitLine.js +318 -0
  182. package/src/Core/components/BezierControls.js +719 -0
  183. package/src/Core/components/BlockQuote.js +35 -0
  184. package/src/Core/components/Boolean.js +500 -0
  185. package/src/Core/components/BooleanInput.js +330 -0
  186. package/src/Core/components/BooleanList.js +396 -0
  187. package/src/Core/components/BooleanOperators.js +35 -0
  188. package/src/Core/components/BooleanOperatorsOfMath.js +148 -0
  189. package/src/Core/components/CallAction.js +261 -0
  190. package/src/Core/components/Caption.js +73 -0
  191. package/src/Core/components/Case.js +56 -0
  192. package/src/Core/components/Cell.js +439 -0
  193. package/src/Core/components/CellBlock.js +64 -0
  194. package/src/Core/components/Chart.js +795 -0
  195. package/src/Core/components/Choice.js +266 -0
  196. package/src/Core/components/ChoiceInput.js +1407 -0
  197. package/src/Core/components/Circle.js +2884 -0
  198. package/src/Core/components/CodeEditor.js +647 -0
  199. package/src/Core/components/CodeViewer.js +294 -0
  200. package/src/Core/components/CollaborateGroupSetup.js +46 -0
  201. package/src/Core/components/CollaborateGroups.js +119 -0
  202. package/src/Core/components/Collect.js +850 -0
  203. package/src/Core/components/Column.js +608 -0
  204. package/src/Core/components/ConditionalContent.js +468 -0
  205. package/src/Core/components/ConsiderAsResponses.js +49 -0
  206. package/src/Core/components/ConstrainTo.js +161 -0
  207. package/src/Core/components/ConstrainToAngles.js +244 -0
  208. package/src/Core/components/ConstrainToGraph.js +142 -0
  209. package/src/Core/components/ConstrainToGrid.js +175 -0
  210. package/src/Core/components/ConstraintUnion.js +119 -0
  211. package/src/Core/components/Constraints.js +497 -0
  212. package/src/Core/components/ContentBrowser.js +441 -0
  213. package/src/Core/components/ContentPicker.js +263 -0
  214. package/src/Core/components/ControlVectors.js +25 -0
  215. package/src/Core/components/Coords.js +63 -0
  216. package/src/Core/components/Copy.js +3412 -0
  217. package/src/Core/components/Curve.js +4130 -0
  218. package/src/Core/components/CustomAttribute.js +175 -0
  219. package/src/Core/components/DataFrame.js +357 -0
  220. package/src/Core/components/DiscreteSimulationResultList.js +342 -0
  221. package/src/Core/components/DiscreteSimulationResultPolyline.js +581 -0
  222. package/src/Core/components/Divisions.js +55 -0
  223. package/src/Core/components/Document.js +888 -0
  224. package/src/Core/components/Embed.js +65 -0
  225. package/src/Core/components/Endpoint.js +62 -0
  226. package/src/Core/components/Evaluate.js +321 -0
  227. package/src/Core/components/Extract.js +656 -0
  228. package/src/Core/components/Extrema.js +556 -0
  229. package/src/Core/components/Feedback.js +200 -0
  230. package/src/Core/components/FeedbackDefinitions.js +97 -0
  231. package/src/Core/components/Figure.js +148 -0
  232. package/src/Core/components/Footnote.js +73 -0
  233. package/src/Core/components/Function.js +5344 -0
  234. package/src/Core/components/FunctionIterates.js +306 -0
  235. package/src/Core/components/FunctionOperators.js +702 -0
  236. package/src/Core/components/Graph.js +1679 -0
  237. package/src/Core/components/Group.js +7 -0
  238. package/src/Core/components/HasSameFactoring.js +407 -0
  239. package/src/Core/components/Hint.js +241 -0
  240. package/src/Core/components/Image.js +524 -0
  241. package/src/Core/components/Indexing.js +79 -0
  242. package/src/Core/components/IntComma.js +64 -0
  243. package/src/Core/components/Integer.js +81 -0
  244. package/src/Core/components/Intersection.js +328 -0
  245. package/src/Core/components/Interval.js +29 -0
  246. package/src/Core/components/Label.js +492 -0
  247. package/src/Core/components/Latex.js +104 -0
  248. package/src/Core/components/Legend.js +329 -0
  249. package/src/Core/components/Line.js +2040 -0
  250. package/src/Core/components/LineSegment.js +882 -0
  251. package/src/Core/components/Lists.js +180 -0
  252. package/src/Core/components/Lorem.js +249 -0
  253. package/src/Core/components/MMeMen.js +377 -0
  254. package/src/Core/components/Map.js +873 -0
  255. package/src/Core/components/Markers.js +101 -0
  256. package/src/Core/components/MatchesPattern.js +339 -0
  257. package/src/Core/components/Math.js +2552 -0
  258. package/src/Core/components/MathInput.js +948 -0
  259. package/src/Core/components/MathList.js +828 -0
  260. package/src/Core/components/MathOperators.js +1286 -0
  261. package/src/Core/components/Matrix.js +497 -0
  262. package/src/Core/components/MatrixInput.js +3157 -0
  263. package/src/Core/components/MdMdnMrow.js +394 -0
  264. package/src/Core/components/Module.js +16 -0
  265. package/src/Core/components/Number.js +1031 -0
  266. package/src/Core/components/NumberList.js +550 -0
  267. package/src/Core/components/Option.js +24 -0
  268. package/src/Core/components/P.js +71 -0
  269. package/src/Core/components/Paginator.js +338 -0
  270. package/src/Core/components/Panel.js +126 -0
  271. package/src/Core/components/Parabola.js +1561 -0
  272. package/src/Core/components/ParagraphMarkup.js +59 -0
  273. package/src/Core/components/Pegboard.js +43 -0
  274. package/src/Core/components/PeriodicSet.js +291 -0
  275. package/src/Core/components/PiecewiseFunction.js +832 -0
  276. package/src/Core/components/Pluralize.js +198 -0
  277. package/src/Core/components/Point.js +1295 -0
  278. package/src/Core/components/Polygon.js +408 -0
  279. package/src/Core/components/Polyline.js +841 -0
  280. package/src/Core/components/RandomizedTextList.js +225 -0
  281. package/src/Core/components/Ray.js +1737 -0
  282. package/src/Core/components/Rectangle.js +1535 -0
  283. package/src/Core/components/Ref.js +350 -0
  284. package/src/Core/components/RegionBetweenCurveXAxis.js +124 -0
  285. package/src/Core/components/RegionHalfPlane.js +107 -0
  286. package/src/Core/components/RegularPolygon.js +2118 -0
  287. package/src/Core/components/RenderDoenetML.js +181 -0
  288. package/src/Core/components/Row.js +780 -0
  289. package/src/Core/components/SampleRandomNumbers.js +653 -0
  290. package/src/Core/components/Sectioning.js +303 -0
  291. package/src/Core/components/Select.js +947 -0
  292. package/src/Core/components/SelectFromSequence.js +1242 -0
  293. package/src/Core/components/SelectRandomNumbers.js +225 -0
  294. package/src/Core/components/Sequence.js +444 -0
  295. package/src/Core/components/Setup.js +53 -0
  296. package/src/Core/components/Shuffle.js +470 -0
  297. package/src/Core/components/SideBySide.js +2130 -0
  298. package/src/Core/components/SingleCharacterComponents.js +41 -0
  299. package/src/Core/components/Slider.js +819 -0
  300. package/src/Core/components/SolutionContainer.js +67 -0
  301. package/src/Core/components/Solutions.js +334 -0
  302. package/src/Core/components/SolveEquations.js +568 -0
  303. package/src/Core/components/Sort.js +398 -0
  304. package/src/Core/components/Sources.js +108 -0
  305. package/src/Core/components/Split.js +205 -0
  306. package/src/Core/components/Spreadsheet.js +1507 -0
  307. package/src/Core/components/StyleDefinitions.js +111 -0
  308. package/src/Core/components/SubsetOfReals.js +348 -0
  309. package/src/Core/components/SubsetOfRealsInput.js +1474 -0
  310. package/src/Core/components/Substitute.js +496 -0
  311. package/src/Core/components/SummaryStatistics.js +652 -0
  312. package/src/Core/components/Table.js +145 -0
  313. package/src/Core/components/Tabular.js +384 -0
  314. package/src/Core/components/Template.js +360 -0
  315. package/src/Core/components/Text.js +341 -0
  316. package/src/Core/components/TextInput.js +566 -0
  317. package/src/Core/components/TextList.js +442 -0
  318. package/src/Core/components/TextListFromString.js +137 -0
  319. package/src/Core/components/TextOperatorsOfMath.js +21 -0
  320. package/src/Core/components/Triangle.js +280 -0
  321. package/src/Core/components/TriggerSet.js +189 -0
  322. package/src/Core/components/TupleList.js +43 -0
  323. package/src/Core/components/UpdateValue.js +435 -0
  324. package/src/Core/components/VariantControl.js +36 -0
  325. package/src/Core/components/Vector.js +2478 -0
  326. package/src/Core/components/Verbatim.js +125 -0
  327. package/src/Core/components/Video.js +673 -0
  328. package/src/Core/components/When.js +198 -0
  329. package/src/Core/components/abstract/AngleListComponent.js +140 -0
  330. package/src/Core/components/abstract/BaseComponent.js +1496 -0
  331. package/src/Core/components/abstract/BlockComponent.js +5 -0
  332. package/src/Core/components/abstract/BooleanBaseOperator.js +88 -0
  333. package/src/Core/components/abstract/BooleanBaseOperatorOfMath.js +100 -0
  334. package/src/Core/components/abstract/BooleanBaseOperatorOneInput.js +44 -0
  335. package/src/Core/components/abstract/ComponentSize.js +789 -0
  336. package/src/Core/components/abstract/ComponentWithSelectableType.js +537 -0
  337. package/src/Core/components/abstract/CompositeComponent.js +142 -0
  338. package/src/Core/components/abstract/ConstraintComponent.js +19 -0
  339. package/src/Core/components/abstract/FunctionBaseOperator.js +680 -0
  340. package/src/Core/components/abstract/GraphicalComponent.js +56 -0
  341. package/src/Core/components/abstract/InlineComponent.js +5 -0
  342. package/src/Core/components/abstract/InlineRenderInlineChildren.js +63 -0
  343. package/src/Core/components/abstract/Input.js +192 -0
  344. package/src/Core/components/abstract/IntervalListComponent.js +218 -0
  345. package/src/Core/components/abstract/LineListComponent.js +114 -0
  346. package/src/Core/components/abstract/MathBaseOperator.js +631 -0
  347. package/src/Core/components/abstract/MathBaseOperatorOneInput.js +112 -0
  348. package/src/Core/components/abstract/PointListComponent.js +238 -0
  349. package/src/Core/components/abstract/SectioningComponent.js +1262 -0
  350. package/src/Core/components/abstract/SingleCharacterInline.js +23 -0
  351. package/src/Core/components/abstract/TextBaseOperatorOfMath.js +47 -0
  352. package/src/Core/components/abstract/TextOrInline.js +66 -0
  353. package/src/Core/components/abstract/VariableName.js +31 -0
  354. package/src/Core/components/abstract/VariableNameList.js +83 -0
  355. package/src/Core/components/abstract/VectorListComponent.js +235 -0
  356. package/src/Core/components/chemistry/Atom.js +910 -0
  357. package/src/Core/components/chemistry/ElectronConfiguration.js +36 -0
  358. package/src/Core/components/chemistry/Ion.js +684 -0
  359. package/src/Core/components/chemistry/IonicCompound.js +189 -0
  360. package/src/Core/components/chemistry/OrbitalDiagram.js +175 -0
  361. package/src/Core/components/chemistry/OrbitalDiagramInput.js +753 -0
  362. package/src/Core/components/chemistry/index.js +6 -0
  363. package/src/Core/components/commonsugar/breakstrings.js +627 -0
  364. package/src/Core/components/commonsugar/lists.js +177 -0
  365. package/src/Core/components/dynamicalSystems/CobwebPolyline.js +913 -0
  366. package/src/Core/components/dynamicalSystems/EquilibriumCurve.js +95 -0
  367. package/src/Core/components/dynamicalSystems/EquilibriumLine.js +93 -0
  368. package/src/Core/components/dynamicalSystems/EquilibriumPoint.js +93 -0
  369. package/src/Core/components/dynamicalSystems/ODESystem.js +943 -0
  370. package/src/Core/components/dynamicalSystems/index.js +5 -0
  371. package/src/Core/components/linearAlgebra/EigenDecomposition.js +294 -0
  372. package/src/Core/utils/array.js +30 -0
  373. package/src/Core/utils/booleanLogic.js +965 -0
  374. package/src/Core/utils/checkEquality.js +818 -0
  375. package/src/Core/utils/cid.js +29 -0
  376. package/src/Core/utils/componentInfoObjects.js +100 -0
  377. package/src/Core/utils/constraints.js +23 -0
  378. package/src/Core/utils/copy.js +572 -0
  379. package/src/Core/utils/deepFunctions.js +173 -0
  380. package/src/Core/utils/descendants.js +252 -0
  381. package/src/Core/utils/enumeration.js +234 -0
  382. package/src/Core/utils/feedback.js +84 -0
  383. package/src/Core/utils/function.js +1343 -0
  384. package/src/Core/utils/graphical.js +196 -0
  385. package/src/Core/utils/label.js +396 -0
  386. package/src/Core/utils/math.js +1056 -0
  387. package/src/Core/utils/naming.js +45 -0
  388. package/src/Core/utils/periodicSetEquality.js +403 -0
  389. package/src/Core/utils/randomNumbers.js +70 -0
  390. package/src/Core/utils/retrieveMedia.js +98 -0
  391. package/src/Core/utils/retrieveTextFile.js +140 -0
  392. package/src/Core/utils/returnAllPossibleVariants.js +73 -0
  393. package/src/Core/utils/rounding.js +316 -0
  394. package/src/Core/utils/sequence.js +754 -0
  395. package/src/Core/utils/serializedStateProcessing.js +4049 -0
  396. package/src/Core/utils/size.js +22 -0
  397. package/src/Core/utils/stateVariables.js +138 -0
  398. package/src/Core/utils/style.js +535 -0
  399. package/src/Core/utils/subset-of-reals.js +796 -0
  400. package/src/Core/utils/table.js +41 -0
  401. package/src/Core/utils/text.js +16 -0
  402. package/src/Core/utils/triggering.js +167 -0
  403. package/src/Core/utils/variants.js +477 -0
  404. package/src/DoenetML.css +308 -0
  405. package/src/DoenetML.jsx +201 -0
  406. package/src/Parser/doenet.grammar +90 -0
  407. package/src/Parser/doenet.js +33 -0
  408. package/src/Parser/doenet.terms.js +20 -0
  409. package/src/Parser/parser.js +266 -0
  410. package/src/Parser/tokens.js +129 -0
  411. package/src/Tools/CodeMirror.jsx +440 -0
  412. package/src/Tools/DarkmodeController.jsx +21 -0
  413. package/src/Tools/Footers/MathInputSelector.jsx +34 -0
  414. package/src/Tools/Footers/VirtualKeyboard.jsx +751 -0
  415. package/src/Tools/cypressTest/CypressTest.jsx +341 -0
  416. package/src/Tools/cypressTest/index.html +102 -0
  417. package/src/Tools/cypressTest/index.jsx +40 -0
  418. package/src/Viewer/ActivityViewer.jsx +1461 -0
  419. package/src/Viewer/PageViewer.jsx +1329 -0
  420. package/src/Viewer/renderers/alert.jsx +17 -0
  421. package/src/Viewer/renderers/angle.jsx +209 -0
  422. package/src/Viewer/renderers/answer.jsx +206 -0
  423. package/src/Viewer/renderers/asList.jsx +25 -0
  424. package/src/Viewer/renderers/blockQuote.jsx +41 -0
  425. package/src/Viewer/renderers/boolean.jsx +17 -0
  426. package/src/Viewer/renderers/booleanInput.css +105 -0
  427. package/src/Viewer/renderers/booleanInput.jsx +636 -0
  428. package/src/Viewer/renderers/button.jsx +369 -0
  429. package/src/Viewer/renderers/c.jsx +17 -0
  430. package/src/Viewer/renderers/callAction.jsx +18 -0
  431. package/src/Viewer/renderers/cell.jsx +59 -0
  432. package/src/Viewer/renderers/chart.jsx +83 -0
  433. package/src/Viewer/renderers/choiceInput.css +223 -0
  434. package/src/Viewer/renderers/choiceInput.jsx +535 -0
  435. package/src/Viewer/renderers/circle.jsx +990 -0
  436. package/src/Viewer/renderers/cobwebPolyline.jsx +442 -0
  437. package/src/Viewer/renderers/codeEditor.jsx +248 -0
  438. package/src/Viewer/renderers/codeViewer.jsx +105 -0
  439. package/src/Viewer/renderers/containerBlock.jsx +41 -0
  440. package/src/Viewer/renderers/containerInline.jsx +17 -0
  441. package/src/Viewer/renderers/contentBrowser.jsx +159 -0
  442. package/src/Viewer/renderers/contentPicker.jsx +160 -0
  443. package/src/Viewer/renderers/curve.jsx +1072 -0
  444. package/src/Viewer/renderers/ellipsis.jsx +17 -0
  445. package/src/Viewer/renderers/em.jsx +17 -0
  446. package/src/Viewer/renderers/embed.jsx +110 -0
  447. package/src/Viewer/renderers/feedback.jsx +74 -0
  448. package/src/Viewer/renderers/figure.jsx +131 -0
  449. package/src/Viewer/renderers/footnote.jsx +52 -0
  450. package/src/Viewer/renderers/graph.jsx +925 -0
  451. package/src/Viewer/renderers/hint.jsx +142 -0
  452. package/src/Viewer/renderers/image.jsx +581 -0
  453. package/src/Viewer/renderers/jsxgraph-distrib/jsxgraphcore.mjs +2 -0
  454. package/src/Viewer/renderers/jsxgraph-distrib/jsxgraphcore.mjs.map +1 -0
  455. package/src/Viewer/renderers/label.jsx +470 -0
  456. package/src/Viewer/renderers/legend.jsx +306 -0
  457. package/src/Viewer/renderers/line.jsx +511 -0
  458. package/src/Viewer/renderers/lineSegment.jsx +754 -0
  459. package/src/Viewer/renderers/list.jsx +111 -0
  460. package/src/Viewer/renderers/lq.jsx +12 -0
  461. package/src/Viewer/renderers/lsq.jsx +12 -0
  462. package/src/Viewer/renderers/math.jsx +582 -0
  463. package/src/Viewer/renderers/mathInput.css +10 -0
  464. package/src/Viewer/renderers/mathInput.jsx +425 -0
  465. package/src/Viewer/renderers/mathInputog.jsx +534 -0
  466. package/src/Viewer/renderers/mathList.jsx +39 -0
  467. package/src/Viewer/renderers/matrixInput.jsx +317 -0
  468. package/src/Viewer/renderers/mdash.jsx +12 -0
  469. package/src/Viewer/renderers/nbsp.jsx +12 -0
  470. package/src/Viewer/renderers/ndash.jsx +12 -0
  471. package/src/Viewer/renderers/number.jsx +454 -0
  472. package/src/Viewer/renderers/numberList.jsx +35 -0
  473. package/src/Viewer/renderers/orbitalDiagram.jsx +247 -0
  474. package/src/Viewer/renderers/orbitalDiagramInput.jsx +450 -0
  475. package/src/Viewer/renderers/p.jsx +38 -0
  476. package/src/Viewer/renderers/paginatorControls.jsx +41 -0
  477. package/src/Viewer/renderers/pegboard.jsx +239 -0
  478. package/src/Viewer/renderers/point.jsx +649 -0
  479. package/src/Viewer/renderers/polygon.jsx +612 -0
  480. package/src/Viewer/renderers/polyline.jsx +608 -0
  481. package/src/Viewer/renderers/pre.jsx +34 -0
  482. package/src/Viewer/renderers/q.jsx +17 -0
  483. package/src/Viewer/renderers/ray.jsx +410 -0
  484. package/src/Viewer/renderers/ref.jsx +149 -0
  485. package/src/Viewer/renderers/regionBetweenCurveXAxis.jsx +182 -0
  486. package/src/Viewer/renderers/renderDoenetML.jsx +56 -0
  487. package/src/Viewer/renderers/row.jsx +31 -0
  488. package/src/Viewer/renderers/rq.jsx +12 -0
  489. package/src/Viewer/renderers/rsq.jsx +12 -0
  490. package/src/Viewer/renderers/section.jsx +427 -0
  491. package/src/Viewer/renderers/sideBySide.jsx +80 -0
  492. package/src/Viewer/renderers/slider.jsx +800 -0
  493. package/src/Viewer/renderers/solution.jsx +134 -0
  494. package/src/Viewer/renderers/spreadsheet.jsx +83 -0
  495. package/src/Viewer/renderers/sq.jsx +17 -0
  496. package/src/Viewer/renderers/styles/global.css +14 -0
  497. package/src/Viewer/renderers/subsetOfRealsInput.jsx +392 -0
  498. package/src/Viewer/renderers/summaryStatistics.jsx +83 -0
  499. package/src/Viewer/renderers/table.jsx +78 -0
  500. package/src/Viewer/renderers/tabular.jsx +58 -0
  501. package/src/Viewer/renderers/tag.jsx +26 -0
  502. package/src/Viewer/renderers/text.jsx +439 -0
  503. package/src/Viewer/renderers/textInput.jsx +774 -0
  504. package/src/Viewer/renderers/textList.jsx +30 -0
  505. package/src/Viewer/renderers/triggerSet.jsx +52 -0
  506. package/src/Viewer/renderers/updateValue.jsx +30 -0
  507. package/src/Viewer/renderers/utils/css.js +13 -0
  508. package/src/Viewer/renderers/utils/graph.js +159 -0
  509. package/src/Viewer/renderers/utils/offGraphIndicators.js +91 -0
  510. package/src/Viewer/renderers/vector.jsx +678 -0
  511. package/src/Viewer/renderers/video.jsx +494 -0
  512. package/src/Viewer/useDoenetRenderer.jsx +128 -0
  513. package/src/main.jsx +16 -0
  514. package/src/media/fonts/files/open-sans-v18-latin-700.woff +0 -0
  515. package/src/media/fonts/files/open-sans-v18-latin-700.woff2 +0 -0
  516. package/src/media/fonts/files/open-sans-v18-latin-700italic.woff +0 -0
  517. package/src/media/fonts/files/open-sans-v18-latin-700italic.woff2 +0 -0
  518. package/src/media/fonts/files/open-sans-v18-latin-italic.woff +0 -0
  519. package/src/media/fonts/files/open-sans-v18-latin-italic.woff2 +0 -0
  520. package/src/media/fonts/files/open-sans-v18-latin-light-italic.woff +0 -0
  521. package/src/media/fonts/files/open-sans-v18-latin-light-italic.woff2 +0 -0
  522. package/src/media/fonts/files/open-sans-v18-latin-light.woff +0 -0
  523. package/src/media/fonts/files/open-sans-v18-latin-light.woff2 +0 -0
  524. package/src/media/fonts/files/open-sans-v18-latin-regular.woff +0 -0
  525. package/src/media/fonts/files/open-sans-v18-latin-regular.woff2 +0 -0
  526. package/src/test/testCode.doenet +26 -0
  527. package/src/test/testViewer.jsx +158 -0
  528. package/src/uiComponents/ActionButton.jsx +157 -0
  529. package/src/uiComponents/ActionButtonGroup.jsx +93 -0
  530. package/src/uiComponents/Button.jsx +160 -0
  531. package/src/uiComponents/ButtonGroup.jsx +56 -0
  532. package/src/uiComponents/ToggleButton.jsx +194 -0
  533. package/src/uiComponents/ToggleButtonGroup.jsx +77 -0
  534. package/src/utils/activityUtils.js +713 -0
  535. package/src/utils/array.js +17 -0
  536. package/src/utils/cid.js +34 -0
  537. package/src/utils/componentInfoObjects.js +89 -0
  538. package/src/utils/deepFunctions.js +165 -0
  539. package/src/utils/enumeration.js +226 -0
  540. package/src/utils/math.js +624 -0
  541. package/src/utils/naming.js +44 -0
  542. package/src/utils/retrieveTextFile.js +156 -0
  543. package/src/utils/returnAllPossibleVariants.js +81 -0
  544. package/src/utils/sequence.js +715 -0
  545. package/src/utils/serialize.js +29 -0
  546. package/src/utils/serializedStateProcessing.js +2587 -0
  547. package/src/utils/subset-of-reals.js +783 -0
  548. package/src/utils/url.js +19 -0
  549. package/vite.config.js +14 -0
@@ -0,0 +1,2130 @@
1
+ import BlockComponent from "./abstract/BlockComponent";
2
+ import me from "math-expressions";
3
+
4
+ export class SideBySide extends BlockComponent {
5
+ constructor(args) {
6
+ super(args);
7
+
8
+ Object.assign(this.actions, {
9
+ recordVisibilityChange: this.recordVisibilityChange.bind(this),
10
+ });
11
+ }
12
+ static componentType = "sideBySide";
13
+ static renderChildren = true;
14
+
15
+ static createAttributesObject() {
16
+ let attributes = super.createAttributesObject();
17
+
18
+ attributes.width = {
19
+ createComponentOfType: "_componentSize",
20
+ };
21
+ attributes.widths = {
22
+ createComponentOfType: "_componentSizeList",
23
+ };
24
+
25
+ attributes.margins = {
26
+ createComponentOfType: "_componentSizeList",
27
+ };
28
+
29
+ attributes.valign = {
30
+ createComponentOfType: "text",
31
+ };
32
+ attributes.valigns = {
33
+ createComponentOfType: "textList",
34
+ };
35
+
36
+ return attributes;
37
+ }
38
+
39
+ static returnChildGroups() {
40
+ return [
41
+ {
42
+ group: "blocks",
43
+ componentTypes: ["_block"],
44
+ },
45
+ ];
46
+ }
47
+
48
+ static returnStateVariableDefinitions() {
49
+ let stateVariableDefinitions = super.returnStateVariableDefinitions();
50
+
51
+ stateVariableDefinitions.numPanels = {
52
+ forRenderer: true,
53
+ returnDependencies: () => ({
54
+ blockChildren: {
55
+ dependencyType: "child",
56
+ childGroups: ["blocks"],
57
+ skipComponentNames: true,
58
+ },
59
+ }),
60
+ definition({ dependencyValues }) {
61
+ return {
62
+ setValue: { numPanels: dependencyValues.blockChildren.length },
63
+ checkForActualChange: { numPanels: true },
64
+ };
65
+ },
66
+ };
67
+
68
+ // have separate state variable for essential widths so that
69
+ // if have a parent sbsgroup, can determine which widths have been changed
70
+ // and so should override the parent sbsGroup width
71
+ stateVariableDefinitions.essentialWidths = {
72
+ isArray: true,
73
+ entryPrefixes: ["essentialWidth"],
74
+ defaultValueByArrayKey: () => null,
75
+ hasEssential: true,
76
+ returnArraySizeDependencies: () => ({
77
+ numPanels: {
78
+ dependencyType: "stateVariable",
79
+ variableName: "numPanels",
80
+ },
81
+ }),
82
+ returnArraySize({ dependencyValues }) {
83
+ return [dependencyValues.numPanels];
84
+ },
85
+ returnArrayDependenciesByKey: () => ({}),
86
+ arrayDefinitionByKey({ arrayKeys }) {
87
+ let essentialWidths = {};
88
+ for (let arrayKey of arrayKeys) {
89
+ essentialWidths[arrayKey] = true;
90
+ }
91
+
92
+ return { useEssentialOrDefaultValue: { essentialWidths } };
93
+ },
94
+ inverseArrayDefinitionByKey({ desiredStateVariableValues }) {
95
+ let value = {};
96
+ for (let arrayKey in desiredStateVariableValues.essentialWidths) {
97
+ value[arrayKey] =
98
+ desiredStateVariableValues.essentialWidths[arrayKey];
99
+ }
100
+
101
+ return {
102
+ success: true,
103
+ instructions: [
104
+ {
105
+ setEssentialValue: "essentialWidths",
106
+ value,
107
+ },
108
+ ],
109
+ };
110
+ },
111
+ };
112
+
113
+ stateVariableDefinitions.allWidthsSpecified = {
114
+ additionalStateVariablesDefined: ["widthsAbsolute"],
115
+ returnDependencies() {
116
+ return {
117
+ numPanels: {
118
+ dependencyType: "stateVariable",
119
+ variableName: "numPanels",
120
+ },
121
+ widthAttr: {
122
+ dependencyType: "attributeComponent",
123
+ attributeName: "width",
124
+ variableNames: ["componentSize"],
125
+ },
126
+ widthsAttr: {
127
+ dependencyType: "attributeComponent",
128
+ attributeName: "widths",
129
+ variableNames: ["numComponents", "componentSizes"],
130
+ },
131
+ parentWidths: {
132
+ dependencyType: "parentStateVariable",
133
+ parentComponentType: "sbsGroup",
134
+ variableName: `specifiedWidths`,
135
+ },
136
+ parentWidthsAbsolute: {
137
+ dependencyType: "parentStateVariable",
138
+ parentComponentType: "sbsGroup",
139
+ variableName: `widthsAbsolute`,
140
+ },
141
+ essentialWidth: {
142
+ dependencyType: "stateVariable",
143
+ variableName: `essentialWidths`,
144
+ },
145
+ };
146
+ },
147
+ definition({ dependencyValues }) {
148
+ let allWidthsSpecified = [];
149
+ let widthsAbsolute = null;
150
+
151
+ let nWidthsSpecifiedFromAttrs;
152
+ let usingSingleWidth = false;
153
+
154
+ if (dependencyValues.widthsAttr !== null) {
155
+ nWidthsSpecifiedFromAttrs =
156
+ dependencyValues.widthsAttr.stateValues.numComponents;
157
+ } else if (dependencyValues.widthAttr !== null) {
158
+ nWidthsSpecifiedFromAttrs = dependencyValues.numPanels;
159
+ usingSingleWidth = true;
160
+ } else {
161
+ nWidthsSpecifiedFromAttrs = 0;
162
+ }
163
+
164
+ for (let ind = 0; ind < dependencyValues.numPanels; ind++) {
165
+ let thisAbsolute = null;
166
+
167
+ if (ind < nWidthsSpecifiedFromAttrs) {
168
+ if (usingSingleWidth) {
169
+ if (dependencyValues.widthAttr.stateValues.componentSize) {
170
+ allWidthsSpecified[ind] =
171
+ dependencyValues.widthAttr.stateValues.componentSize.size;
172
+ thisAbsolute = Boolean(
173
+ dependencyValues.widthAttr.stateValues.componentSize
174
+ .isAbsolute,
175
+ );
176
+ } else {
177
+ allWidthsSpecified[ind] = null;
178
+ }
179
+ } else {
180
+ if (dependencyValues.widthsAttr.stateValues.componentSizes[ind]) {
181
+ allWidthsSpecified[ind] =
182
+ dependencyValues.widthsAttr.stateValues.componentSizes[
183
+ ind
184
+ ].size;
185
+ thisAbsolute = Boolean(
186
+ dependencyValues.widthsAttr.stateValues.componentSizes[ind]
187
+ .isAbsolute,
188
+ );
189
+ } else {
190
+ allWidthsSpecified[ind] = null;
191
+ }
192
+ }
193
+ } else {
194
+ if (dependencyValues.parentWidths) {
195
+ if (dependencyValues.essentialWidth[ind] === null) {
196
+ allWidthsSpecified[ind] = dependencyValues.parentWidths[ind];
197
+ } else {
198
+ allWidthsSpecified[ind] = dependencyValues.essentialWidth[ind];
199
+ }
200
+ thisAbsolute = dependencyValues.parentWidthsAbsolute;
201
+ } else {
202
+ allWidthsSpecified[ind] = dependencyValues.essentialWidth[ind];
203
+ }
204
+ }
205
+
206
+ if (widthsAbsolute === null) {
207
+ widthsAbsolute = thisAbsolute;
208
+ } else if (thisAbsolute !== null && widthsAbsolute !== thisAbsolute) {
209
+ throw Error(
210
+ `SideBySide is not implemented for absolute measurements`,
211
+ );
212
+ throw Error(
213
+ `Cannot mix absolute and relative widths for sideBySide`,
214
+ );
215
+ }
216
+ }
217
+
218
+ // treat any non-numeric widths as being unspecified
219
+ allWidthsSpecified = allWidthsSpecified.map((x) =>
220
+ Number.isFinite(x) ? x : null,
221
+ );
222
+
223
+ return { setValue: { allWidthsSpecified, widthsAbsolute } };
224
+ },
225
+ };
226
+
227
+ stateVariableDefinitions.essentialMargins = {
228
+ isArray: true,
229
+ entryPrefixes: ["essentialMargin"],
230
+ hasEssential: true,
231
+ defaultValueByArrayKey: () => null,
232
+ returnArraySizeDependencies: () => ({}),
233
+ returnArraySize() {
234
+ return [2];
235
+ },
236
+ returnArrayDependenciesByKey: () => ({}),
237
+ arrayDefinitionByKey({ arrayKeys }) {
238
+ let essentialMargins = {};
239
+ for (let arrayKey of arrayKeys) {
240
+ essentialMargins[arrayKey] = true;
241
+ }
242
+
243
+ return { useEssentialOrDefaultValue: { essentialMargins } };
244
+ },
245
+ inverseArrayDefinitionByKey({ desiredStateVariableValues }) {
246
+ let value = {};
247
+ for (let arrayKey in desiredStateVariableValues.essentialMargins) {
248
+ value[arrayKey] =
249
+ desiredStateVariableValues.essentialMargins[arrayKey];
250
+ }
251
+
252
+ return {
253
+ success: true,
254
+ instructions: [
255
+ {
256
+ setEssentialValue: "essentialMargins",
257
+ value,
258
+ },
259
+ ],
260
+ };
261
+ },
262
+ };
263
+
264
+ stateVariableDefinitions.allMarginsSpecified = {
265
+ additionalStateVariablesDefined: ["marginsAbsolute"],
266
+ returnDependencies() {
267
+ return {
268
+ numPanels: {
269
+ dependencyType: "stateVariable",
270
+ variableName: "numPanels",
271
+ },
272
+ marginsAttr: {
273
+ dependencyType: "attributeComponent",
274
+ attributeName: "margins",
275
+ variableNames: ["numComponents", "componentSizes"],
276
+ },
277
+ parentMargins: {
278
+ dependencyType: "parentStateVariable",
279
+ parentComponentType: "sbsGroup",
280
+ variableName: `specifiedMargins`,
281
+ },
282
+ parentMarginsAbsolute: {
283
+ dependencyType: "parentStateVariable",
284
+ parentComponentType: "sbsGroup",
285
+ variableName: `marginsAbsolute`,
286
+ },
287
+ essentialMargins: {
288
+ dependencyType: "stateVariable",
289
+ variableName: `essentialMargins`,
290
+ },
291
+ };
292
+ },
293
+ definition({ dependencyValues }) {
294
+ let allMarginsSpecified = [];
295
+ let marginsAbsolute = null;
296
+
297
+ if (dependencyValues.marginsAttr === null) {
298
+ if (dependencyValues.parentMargins) {
299
+ marginsAbsolute = dependencyValues.parentMarginsAbsolute;
300
+ for (let ind = 0; ind < 2; ind++) {
301
+ if (dependencyValues.essentialMargins[ind] === null) {
302
+ allMarginsSpecified[ind] = dependencyValues.parentMargins[ind];
303
+ } else {
304
+ allMarginsSpecified[ind] =
305
+ dependencyValues.essentialMargins[ind];
306
+ }
307
+ }
308
+ } else {
309
+ for (let ind = 0; ind < 2; ind++) {
310
+ allMarginsSpecified[ind] = dependencyValues.essentialMargins[ind];
311
+ }
312
+ }
313
+ } else if (
314
+ dependencyValues.marginsAttr.stateValues.numComponents === 0
315
+ ) {
316
+ for (let ind = 0; ind < 2; ind++) {
317
+ allMarginsSpecified[ind] = dependencyValues.essentialMargins[ind];
318
+ }
319
+ } else if (
320
+ dependencyValues.marginsAttr.stateValues.numComponents === 1
321
+ ) {
322
+ let margin = null;
323
+ if (dependencyValues.marginsAttr.stateValues.componentSizes[0]) {
324
+ margin =
325
+ dependencyValues.marginsAttr.stateValues.componentSizes[0].size;
326
+ if (!Number.isFinite(margin)) {
327
+ margin = null;
328
+ }
329
+ marginsAbsolute = Boolean(
330
+ dependencyValues.marginsAttr.stateValues.componentSizes[0]
331
+ .isAbsolute,
332
+ );
333
+ }
334
+ allMarginsSpecified = [margin, margin];
335
+ } else {
336
+ if (dependencyValues.marginsAttr.stateValues.componentSizes[0]) {
337
+ // two (or more) components of marginsAttr
338
+ marginsAbsolute = Boolean(
339
+ dependencyValues.marginsAttr.stateValues.componentSizes[0]
340
+ .isAbsolute,
341
+ );
342
+ } else {
343
+ marginsAbsolute = false;
344
+ }
345
+ let secondMarginAbsolute;
346
+ if (dependencyValues.marginsAttr.stateValues.componentSizes[1]) {
347
+ secondMarginAbsolute = Boolean(
348
+ dependencyValues.marginsAttr.stateValues.componentSizes[1]
349
+ .isAbsolute,
350
+ );
351
+ } else {
352
+ secondMarginAbsolute = false;
353
+ }
354
+
355
+ if (secondMarginAbsolute !== marginsAbsolute) {
356
+ throw Error(
357
+ `SideBySide is not implemented for absolute measurements`,
358
+ );
359
+ throw Error(
360
+ `Cannot mix absolute and relative margins for sideBySide`,
361
+ );
362
+ }
363
+ allMarginsSpecified =
364
+ dependencyValues.marginsAttr.stateValues.componentSizes
365
+ .slice(0, 2)
366
+ .map((x) => (x && Number.isFinite(x.size) ? x.size : null));
367
+ }
368
+
369
+ return { setValue: { allMarginsSpecified, marginsAbsolute } };
370
+ },
371
+ };
372
+
373
+ stateVariableDefinitions.absoluteMeasurements = {
374
+ public: true,
375
+ shadowingInstructions: {
376
+ createComponentOfType: "boolean",
377
+ },
378
+ forRenderer: true,
379
+ returnDependencies: () => ({
380
+ widthsAbsolute: {
381
+ dependencyType: "stateVariable",
382
+ variableName: "widthsAbsolute",
383
+ },
384
+ marginsAbsolute: {
385
+ dependencyType: "stateVariable",
386
+ variableName: "marginsAbsolute",
387
+ },
388
+ }),
389
+ definition({ dependencyValues }) {
390
+ let absoluteMeasurements;
391
+ if (dependencyValues.widthsAbsolute === null) {
392
+ if (dependencyValues.marginsAbsolute === null) {
393
+ absoluteMeasurements = false;
394
+ } else {
395
+ absoluteMeasurements = dependencyValues.marginsAbsolute;
396
+ }
397
+ } else {
398
+ if (dependencyValues.marginsAbsolute === null) {
399
+ absoluteMeasurements = dependencyValues.widthsAbsolute;
400
+ } else {
401
+ if (
402
+ dependencyValues.widthsAbsolute !==
403
+ dependencyValues.marginsAbsolute
404
+ ) {
405
+ throw Error(
406
+ `SideBySide is not implemented for absolute measurements`,
407
+ );
408
+ throw Error(
409
+ `Cannot mix absolute and relative widths and margins for sideBySide`,
410
+ );
411
+ }
412
+ absoluteMeasurements = dependencyValues.widthsAbsolute;
413
+ }
414
+ }
415
+
416
+ if (absoluteMeasurements === true) {
417
+ throw Error(
418
+ `SideBySide is not implemented for absolute measurements`,
419
+ );
420
+ }
421
+
422
+ return { setValue: { absoluteMeasurements } };
423
+ },
424
+ };
425
+
426
+ stateVariableDefinitions.allWidths = {
427
+ additionalStateVariablesDefined: [
428
+ "allMargins",
429
+ {
430
+ variableName: "gapWidth",
431
+ public: true,
432
+ shadowingInstructions: {
433
+ createComponentOfType: "number",
434
+ },
435
+ forRenderer: true,
436
+ },
437
+ ],
438
+ returnDependencies: () => ({
439
+ numPanels: {
440
+ dependencyType: "stateVariable",
441
+ variableName: "numPanels",
442
+ },
443
+ allWidthsSpecified: {
444
+ dependencyType: "stateVariable",
445
+ variableName: "allWidthsSpecified",
446
+ },
447
+ allMarginsSpecified: {
448
+ dependencyType: "stateVariable",
449
+ variableName: "allMarginsSpecified",
450
+ },
451
+ absoluteMeasurements: {
452
+ dependencyType: "stateVariable",
453
+ variableName: "absoluteMeasurements",
454
+ },
455
+ }),
456
+ definition({ dependencyValues }) {
457
+ let gapWidth = 0;
458
+ let allWidths = [...dependencyValues.allWidthsSpecified];
459
+ let allMargins = [...dependencyValues.allMarginsSpecified];
460
+
461
+ let totalWidthSpecified = 0;
462
+ let nWidthsUndefined = 0;
463
+
464
+ for (let ind = 0; ind < dependencyValues.numPanels; ind++) {
465
+ let width = allWidths[ind];
466
+ if (width === null) {
467
+ nWidthsUndefined++;
468
+ } else {
469
+ totalWidthSpecified += width;
470
+ }
471
+ }
472
+
473
+ let totalMarginSpecified = 0;
474
+ let nMarginsUndefined = 0;
475
+
476
+ for (let ind = 0; ind < 2; ind++) {
477
+ let margin = allMargins[ind];
478
+ if (margin === null) {
479
+ nMarginsUndefined++;
480
+ } else {
481
+ totalMarginSpecified += margin;
482
+ }
483
+ }
484
+ totalMarginSpecified *= dependencyValues.numPanels;
485
+
486
+ if (!dependencyValues.absoluteMeasurements) {
487
+ if (totalWidthSpecified + totalMarginSpecified >= 100) {
488
+ // we are already over 100%
489
+ // anything null becomes width 0
490
+ // everything else is normalized to add up to 100
491
+
492
+ let normalization =
493
+ 100 / (totalWidthSpecified + totalMarginSpecified);
494
+ for (let ind = 0; ind < dependencyValues.numPanels; ind++) {
495
+ if (allWidths[ind] === null) {
496
+ allWidths[ind] = 0;
497
+ } else {
498
+ allWidths[ind] *= normalization;
499
+ }
500
+ }
501
+ for (let ind = 0; ind < 2; ind++) {
502
+ let margin = allMargins[ind];
503
+ if (margin === null) {
504
+ allMargins[ind] = 0;
505
+ } else {
506
+ allMargins[ind] *= normalization;
507
+ }
508
+ }
509
+ } else {
510
+ // since we are under 100%, we try the following to get to 100%
511
+ // 1. if there are any null widths,
512
+ // define them to be the same value that makes the total 100%
513
+ // and make any null margins be zero
514
+ // 2. else, if there are any null margins,
515
+ // define them to be the same value that makes the total 100%
516
+ // 3. else if there two or panels, set gapWidth to make the total 100%
517
+ // 4. else if there is one panel, expand the right margin
518
+ // 5. do nothing (child groups aren't matched)
519
+
520
+ if (nWidthsUndefined > 0) {
521
+ let newWidth =
522
+ (100 - (totalWidthSpecified + totalMarginSpecified)) /
523
+ nWidthsUndefined;
524
+ for (let ind = 0; ind < dependencyValues.numPanels; ind++) {
525
+ if (allWidths[ind] === null) {
526
+ allWidths[ind] = newWidth;
527
+ }
528
+ }
529
+
530
+ for (let ind = 0; ind < 2; ind++) {
531
+ let margin = allMargins[ind];
532
+ if (margin === null) {
533
+ allMargins[ind] = 0;
534
+ }
535
+ }
536
+ } else if (nMarginsUndefined > 0) {
537
+ let newMargin =
538
+ (100 - (totalWidthSpecified + totalMarginSpecified)) /
539
+ (nMarginsUndefined * dependencyValues.numPanels);
540
+ for (let ind = 0; ind < 2; ind++) {
541
+ if (allMargins[ind] === null) {
542
+ allMargins[ind] = newMargin;
543
+ }
544
+ }
545
+ } else if (dependencyValues.numPanels > 1) {
546
+ gapWidth =
547
+ (100 - (totalWidthSpecified + totalMarginSpecified)) /
548
+ (dependencyValues.numPanels - 1);
549
+ } else if (dependencyValues.numPanels === 1) {
550
+ allMargins[1] = 100 - (allMargins[0] + allWidths[0]);
551
+ } else {
552
+ console.warn(
553
+ "Invalid sideBySide, as it must have at least one block child",
554
+ );
555
+ }
556
+ }
557
+ } else {
558
+ // we won't reach here, as we throw an error about not implementing
559
+ // absolute measurements before get this far
560
+ }
561
+
562
+ return { setValue: { allWidths, allMargins, gapWidth } };
563
+ },
564
+ };
565
+
566
+ stateVariableDefinitions.widths = {
567
+ public: true,
568
+ isArray: true,
569
+ shadowingInstructions: {
570
+ createComponentOfType: "number",
571
+ },
572
+ entryPrefixes: ["width"],
573
+ forRenderer: true,
574
+ returnArraySizeDependencies: () => ({
575
+ numPanels: {
576
+ dependencyType: "stateVariable",
577
+ variableName: "numPanels",
578
+ },
579
+ }),
580
+ returnArraySize({ dependencyValues }) {
581
+ return [dependencyValues.numPanels];
582
+ },
583
+ returnArrayDependenciesByKey({ arrayKeys }) {
584
+ // Note: only the allWidths dependency is used to calculate widths
585
+ // The other dependencies are used in the inverse direction
586
+ // to facilitate single keys being changed at a time
587
+ let globalDependencies = {
588
+ allWidths: {
589
+ dependencyType: "stateVariable",
590
+ variableName: `allWidths`,
591
+ },
592
+ widthsAttr: {
593
+ dependencyType: "attributeComponent",
594
+ attributeName: "widths",
595
+ variableNames: [`numComponents`],
596
+ },
597
+ widthAttr: {
598
+ dependencyType: "attributeComponent",
599
+ attributeName: "width",
600
+ variableNames: ["componentSize"],
601
+ },
602
+ absoluteMeasurements: {
603
+ dependencyType: "stateVariable",
604
+ variableName: "absoluteMeasurements",
605
+ },
606
+ };
607
+
608
+ let dependenciesByKey = {};
609
+
610
+ for (let arrayKey of arrayKeys) {
611
+ let varEnding = Number(arrayKey) + 1;
612
+ dependenciesByKey[arrayKey] = {
613
+ widthsAttr: {
614
+ dependencyType: "attributeComponent",
615
+ attributeName: "widths",
616
+ variableNames: [`componentSize${varEnding}`],
617
+ },
618
+ essentialWidth: {
619
+ dependencyType: "stateVariable",
620
+ variableName: `essentialWidth${varEnding}`,
621
+ },
622
+ };
623
+ }
624
+ return { globalDependencies, dependenciesByKey };
625
+ },
626
+ arrayDefinitionByKey({ globalDependencyValues, arrayKeys }) {
627
+ let widths = {};
628
+ for (let arrayKey of arrayKeys) {
629
+ widths[arrayKey] = globalDependencyValues.allWidths[arrayKey];
630
+ }
631
+
632
+ return { setValue: { widths } };
633
+ },
634
+ inverseArrayDefinitionByKey({
635
+ desiredStateVariableValues,
636
+ dependencyNamesByKey,
637
+ dependencyValuesByKey,
638
+ globalDependencyValues,
639
+ arraySize,
640
+ }) {
641
+ let nWidthsSpecifiedFromAttrs;
642
+ let usingSingleWidth = false;
643
+
644
+ if (globalDependencyValues.widthsAttr !== null) {
645
+ nWidthsSpecifiedFromAttrs =
646
+ globalDependencyValues.widthsAttr.stateValues.numComponents;
647
+ } else if (globalDependencyValues.widthAttr !== null) {
648
+ nWidthsSpecifiedFromAttrs = arraySize[0];
649
+ usingSingleWidth = true;
650
+ } else {
651
+ nWidthsSpecifiedFromAttrs = 0;
652
+ }
653
+
654
+ let instructions = [];
655
+
656
+ for (let arrayKey in desiredStateVariableValues.widths) {
657
+ let arrayIndex = Number(arrayKey);
658
+
659
+ if (arrayIndex < nWidthsSpecifiedFromAttrs) {
660
+ if (usingSingleWidth) {
661
+ // last one wins
662
+ instructions.push({
663
+ setDependency: "widthAttr",
664
+ desiredValue: {
665
+ size: desiredStateVariableValues.widths[arrayKey],
666
+ isAbsolute: globalDependencyValues.absoluteMeasurements,
667
+ },
668
+ variableIndex: 0,
669
+ });
670
+ } else {
671
+ instructions.push({
672
+ setDependency: dependencyNamesByKey[arrayKey].widthsAttr,
673
+ desiredValue: {
674
+ size: desiredStateVariableValues.widths[arrayKey],
675
+ isAbsolute: globalDependencyValues.absoluteMeasurements,
676
+ },
677
+ variableIndex: 0,
678
+ });
679
+ }
680
+ } else {
681
+ instructions.push({
682
+ setDependency: dependencyNamesByKey[arrayKey].essentialWidth,
683
+ desiredValue: desiredStateVariableValues.widths[arrayKey],
684
+ });
685
+ }
686
+ }
687
+
688
+ return {
689
+ success: true,
690
+ instructions,
691
+ };
692
+ },
693
+ };
694
+
695
+ stateVariableDefinitions.margins = {
696
+ public: true,
697
+ isArray: true,
698
+ shadowingInstructions: {
699
+ createComponentOfType: "number",
700
+ },
701
+ entryPrefixes: ["margin"],
702
+ forRenderer: true,
703
+ returnArraySizeDependencies: () => ({}),
704
+ returnArraySize() {
705
+ return [2];
706
+ },
707
+ returnArrayDependenciesByKey({ arrayKeys }) {
708
+ // Note: only the allMargins dependency is used to calculate widths
709
+ // The other dependencies are used in the inverse direction
710
+ // to facilitate single keys being changed at a time
711
+ let globalDependencies = {
712
+ allMargins: {
713
+ dependencyType: "stateVariable",
714
+ variableName: `allMargins`,
715
+ },
716
+ marginsAttr: {
717
+ dependencyType: "attributeComponent",
718
+ attributeName: "margins",
719
+ variableNames: [
720
+ "componentSize1",
721
+ "componentSize2",
722
+ "numComponents",
723
+ ],
724
+ },
725
+ absoluteMeasurements: {
726
+ dependencyType: "stateVariable",
727
+ variableName: "absoluteMeasurements",
728
+ },
729
+ };
730
+
731
+ let dependenciesByKey = {};
732
+
733
+ for (let arrayKey of arrayKeys) {
734
+ let varEnding = Number(arrayKey) + 1;
735
+ dependenciesByKey[arrayKey] = {
736
+ essentialMargin: {
737
+ dependencyType: "stateVariable",
738
+ variableName: `essentialMargin${varEnding}`,
739
+ },
740
+ };
741
+ }
742
+ return { globalDependencies, dependenciesByKey };
743
+ },
744
+ arrayDefinitionByKey({ globalDependencyValues, arrayKeys }) {
745
+ let margins = {};
746
+ for (let arrayKey of arrayKeys) {
747
+ margins[arrayKey] = globalDependencyValues.allMargins[arrayKey];
748
+ }
749
+
750
+ return { setValue: { margins } };
751
+ },
752
+ inverseArrayDefinitionByKey({
753
+ desiredStateVariableValues,
754
+ globalDependencyValues,
755
+ dependencyNamesByKey,
756
+ }) {
757
+ let instructions = [];
758
+
759
+ if (globalDependencyValues.marginsAttr === null) {
760
+ for (let arrayKey in desiredStateVariableValues.margins) {
761
+ instructions.push({
762
+ setDependency: dependencyNamesByKey[arrayKey].essentialMargin,
763
+ desiredValue: desiredStateVariableValues.margins[arrayKey],
764
+ });
765
+ }
766
+ } else if (
767
+ !(
768
+ globalDependencyValues.marginsAttr.stateValues.componentSize1 &&
769
+ Number.isFinite(
770
+ globalDependencyValues.marginsAttr.stateValues.componentSize1
771
+ .size,
772
+ )
773
+ )
774
+ ) {
775
+ if ("0" in desiredStateVariableValues.margins) {
776
+ instructions.push({
777
+ setDependency: "marginsAttr",
778
+ desiredValue: {
779
+ size: desiredStateVariableValues.margins[0],
780
+ isAbsolute: globalDependencyValues.absoluteMeasurements,
781
+ },
782
+ variableIndex: 0,
783
+ });
784
+ } else {
785
+ // if didn't specify the first margin, then set the first margin
786
+ // to be equal to the second
787
+ // (since if we didn't overwrite the non-numeric first margin,
788
+ // the margins would still be null)
789
+ instructions.push({
790
+ setDependency: "marginsAttr",
791
+ desiredValue: {
792
+ size: desiredStateVariableValues.margins[1],
793
+ isAbsolute: globalDependencyValues.absoluteMeasurements,
794
+ },
795
+ variableIndex: 0,
796
+ });
797
+ }
798
+
799
+ if ("1" in desiredStateVariableValues.margins) {
800
+ if (
801
+ globalDependencyValues.marginsAttr.stateValues.numComponents > 1
802
+ ) {
803
+ instructions.push({
804
+ setDependency: "marginsAttr",
805
+ desiredValue: {
806
+ size: desiredStateVariableValues.margins[1],
807
+ isAbsolute: globalDependencyValues.absoluteMeasurements,
808
+ },
809
+ variableIndex: 1,
810
+ });
811
+ }
812
+ // if didn't have a second margin specified,
813
+ // then we are forced to be symmetric
814
+ }
815
+ } else {
816
+ let symmetricMargins =
817
+ globalDependencyValues.marginsAttr.stateValues.numComponents === 1;
818
+
819
+ for (let arrayKey in desiredStateVariableValues.margins) {
820
+ if (symmetricMargins) {
821
+ // last one wins
822
+ instructions.push({
823
+ setDependency: "marginsAttr",
824
+ desiredValue: {
825
+ size: desiredStateVariableValues.margins[arrayKey],
826
+ isAbsolute: globalDependencyValues.absoluteMeasurements,
827
+ },
828
+ variableIndex: 0,
829
+ });
830
+ } else {
831
+ let varEnding = Number(arrayKey) + 1;
832
+ instructions.push({
833
+ setDependency: "marginsAttr",
834
+ desiredValue: {
835
+ size: desiredStateVariableValues.margins[arrayKey],
836
+ isAbsolute: globalDependencyValues.absoluteMeasurements,
837
+ },
838
+ variableIndex: arrayKey,
839
+ });
840
+ }
841
+ }
842
+ }
843
+
844
+ return {
845
+ success: true,
846
+ instructions,
847
+ };
848
+ },
849
+ };
850
+
851
+ stateVariableDefinitions.essentialValigns = {
852
+ isArray: true,
853
+ entryPrefixes: ["essentialValign"],
854
+ defaultValueByArrayKey: () => null,
855
+ hasEssential: true,
856
+ returnArraySizeDependencies: () => ({
857
+ numPanels: {
858
+ dependencyType: "stateVariable",
859
+ variableName: "numPanels",
860
+ },
861
+ }),
862
+ returnArraySize({ dependencyValues }) {
863
+ return [dependencyValues.numPanels];
864
+ },
865
+ returnArrayDependenciesByKey: () => ({}),
866
+ arrayDefinitionByKey({ arrayKeys }) {
867
+ let essentialValigns = {};
868
+ for (let arrayKey of arrayKeys) {
869
+ essentialValigns[arrayKey] = true;
870
+ }
871
+
872
+ return { useEssentialOrDefaultValue: { essentialValigns } };
873
+ },
874
+ inverseArrayDefinitionByKey({ desiredStateVariableValues }) {
875
+ let value = {};
876
+ for (let arrayKey in desiredStateVariableValues.essentialValigns) {
877
+ value[arrayKey] =
878
+ desiredStateVariableValues.essentialValigns[arrayKey];
879
+ }
880
+
881
+ return {
882
+ success: true,
883
+ instructions: [
884
+ {
885
+ setEssentialValue: "essentialValigns",
886
+ value,
887
+ },
888
+ ],
889
+ };
890
+ },
891
+ };
892
+
893
+ stateVariableDefinitions.valigns = {
894
+ public: true,
895
+ isArray: true,
896
+ shadowingInstructions: {
897
+ createComponentOfType: "text",
898
+ },
899
+ entryPrefixes: ["valign"],
900
+ forRenderer: true,
901
+ returnArraySizeDependencies: () => ({
902
+ numPanels: {
903
+ dependencyType: "stateVariable",
904
+ variableName: "numPanels",
905
+ },
906
+ }),
907
+ returnArraySize({ dependencyValues }) {
908
+ return [dependencyValues.numPanels];
909
+ },
910
+ returnArrayDependenciesByKey({ arrayKeys }) {
911
+ let globalDependencies = {
912
+ valignAttr: {
913
+ dependencyType: "attributeComponent",
914
+ attributeName: "valign",
915
+ variableNames: ["value"],
916
+ },
917
+ valignsAttr: {
918
+ dependencyType: "attributeComponent",
919
+ attributeName: "valigns",
920
+ variableNames: ["numComponents"],
921
+ },
922
+ };
923
+ let dependenciesByKey = {};
924
+ for (let arrayKey of arrayKeys) {
925
+ let varEnding = Number(arrayKey) + 1;
926
+ dependenciesByKey[arrayKey] = {
927
+ valignsAttr: {
928
+ dependencyType: "attributeComponent",
929
+ attributeName: "valigns",
930
+ variableNames: [`text${varEnding}`],
931
+ },
932
+ parentValign: {
933
+ dependencyType: "parentStateVariable",
934
+ parentComponentType: "sbsGroup",
935
+ variableName: `valign${varEnding}`,
936
+ },
937
+ parentValignAbsolute: {
938
+ dependencyType: "parentStateVariable",
939
+ parentComponentType: "sbsGroup",
940
+ variableName: `valignAbsolute${varEnding}`,
941
+ },
942
+ essentialValign: {
943
+ dependencyType: "stateVariable",
944
+ variableName: `essentialValign${varEnding}`,
945
+ },
946
+ };
947
+ }
948
+ return { globalDependencies, dependenciesByKey };
949
+ },
950
+ arrayDefinitionByKey({
951
+ globalDependencyValues,
952
+ dependencyValuesByKey,
953
+ arrayKeys,
954
+ arraySize,
955
+ }) {
956
+ let valigns = {};
957
+
958
+ let nValignsSpecifiedFromAttrs;
959
+ let usingSingleValign = false;
960
+
961
+ if (globalDependencyValues.valignsAttr !== null) {
962
+ nValignsSpecifiedFromAttrs =
963
+ globalDependencyValues.valignsAttr.stateValues.numComponents;
964
+ } else if (globalDependencyValues.valignAttr !== null) {
965
+ nValignsSpecifiedFromAttrs = arraySize[0];
966
+ usingSingleValign = true;
967
+ } else {
968
+ nValignsSpecifiedFromAttrs = 0;
969
+ }
970
+
971
+ for (let arrayKey of arrayKeys) {
972
+ let arrayIndex = Number(arrayKey);
973
+
974
+ if (arrayIndex < nValignsSpecifiedFromAttrs) {
975
+ if (usingSingleValign) {
976
+ valigns[arrayKey] =
977
+ globalDependencyValues.valignAttr.stateValues.value.toLowerCase();
978
+ } else {
979
+ let varEnding = arrayIndex + 1;
980
+ valigns[arrayKey] =
981
+ dependencyValuesByKey[arrayKey].valignsAttr.stateValues[
982
+ `text${varEnding}`
983
+ ].toLowerCase();
984
+ }
985
+ if (!["top", "middle", "bottom"].includes(valigns[arrayKey])) {
986
+ valigns[arrayKey] = "top";
987
+ }
988
+ } else {
989
+ if (dependencyValuesByKey[arrayKey].parentValign) {
990
+ if (dependencyValuesByKey[arrayKey].essentialValign === null) {
991
+ valigns[arrayKey] =
992
+ dependencyValuesByKey[arrayKey].parentValign;
993
+ } else {
994
+ valigns[arrayKey] =
995
+ dependencyValuesByKey[arrayKey].essentialValign;
996
+ }
997
+ } else {
998
+ if (dependencyValuesByKey[arrayKey].essentialValign === null) {
999
+ valigns[arrayKey] = "top";
1000
+ } else {
1001
+ valigns[arrayKey] =
1002
+ dependencyValuesByKey[arrayKey].essentialValign;
1003
+ }
1004
+ }
1005
+ }
1006
+ }
1007
+
1008
+ return { setValue: { valigns } };
1009
+ },
1010
+ inverseArrayDefinitionByKey({
1011
+ desiredStateVariableValues,
1012
+ dependencyNamesByKey,
1013
+ globalDependencyValues,
1014
+ arraySize,
1015
+ }) {
1016
+ let nValignsSpecifiedFromAttrs;
1017
+ let usingSingleValign = false;
1018
+
1019
+ if (globalDependencyValues.valignsAttr !== null) {
1020
+ nValignsSpecifiedFromAttrs =
1021
+ globalDependencyValues.valignsAttr.stateValues.numComponents;
1022
+ } else if (globalDependencyValues.valignAttr !== null) {
1023
+ nValignsSpecifiedFromAttrs = arraySize[0];
1024
+ usingSingleValign = true;
1025
+ } else {
1026
+ nValignsSpecifiedFromAttrs = 0;
1027
+ }
1028
+
1029
+ let instructions = [];
1030
+
1031
+ for (let arrayKey in desiredStateVariableValues.valigns) {
1032
+ let desiredValue =
1033
+ desiredStateVariableValues.valigns[arrayKey].toLowerCase();
1034
+ if (!["top", "middle", "bottom"].includes(desiredValue)) {
1035
+ continue;
1036
+ }
1037
+
1038
+ let arrayIndex = Number(arrayKey);
1039
+
1040
+ if (arrayIndex < nValignsSpecifiedFromAttrs) {
1041
+ if (usingSingleValign) {
1042
+ // last one wins
1043
+ instructions.push({
1044
+ setDependency: "valignAttr",
1045
+ desiredValue,
1046
+ variableIndex: 0,
1047
+ });
1048
+ } else {
1049
+ instructions.push({
1050
+ setDependency: dependencyNamesByKey[arrayKey].valignsAttr,
1051
+ desiredValue,
1052
+ variableIndex: 0,
1053
+ });
1054
+ }
1055
+ } else {
1056
+ instructions.push({
1057
+ setDependency: dependencyNamesByKey[arrayKey].essentialValign,
1058
+ desiredValue,
1059
+ });
1060
+ }
1061
+ }
1062
+
1063
+ return {
1064
+ success: true,
1065
+ instructions,
1066
+ };
1067
+ },
1068
+ };
1069
+
1070
+ return stateVariableDefinitions;
1071
+ }
1072
+
1073
+ recordVisibilityChange({ isVisible, actionId }) {
1074
+ this.coreFunctions.requestRecordEvent({
1075
+ verb: "visibilityChanged",
1076
+ object: {
1077
+ componentName: this.componentName,
1078
+ componentType: this.componentType,
1079
+ },
1080
+ result: { isVisible },
1081
+ });
1082
+ this.coreFunctions.resolveAction({ actionId });
1083
+ }
1084
+ }
1085
+
1086
+ export class SbsGroup extends BlockComponent {
1087
+ constructor(args) {
1088
+ super(args);
1089
+
1090
+ Object.assign(this.actions, {
1091
+ recordVisibilityChange: this.recordVisibilityChange.bind(this),
1092
+ });
1093
+ }
1094
+ static componentType = "sbsGroup";
1095
+ static rendererType = "containerBlock";
1096
+ static renderChildren = true;
1097
+
1098
+ static createAttributesObject() {
1099
+ let attributes = super.createAttributesObject();
1100
+
1101
+ attributes.width = {
1102
+ createComponentOfType: "_componentSize",
1103
+ };
1104
+ attributes.widths = {
1105
+ createComponentOfType: "_componentSizeList",
1106
+ };
1107
+
1108
+ attributes.margins = {
1109
+ createComponentOfType: "_componentSizeList",
1110
+ };
1111
+
1112
+ attributes.valign = {
1113
+ createComponentOfType: "text",
1114
+ };
1115
+ attributes.valigns = {
1116
+ createComponentOfType: "textList",
1117
+ };
1118
+
1119
+ return attributes;
1120
+ }
1121
+
1122
+ static returnChildGroups() {
1123
+ return [
1124
+ {
1125
+ group: "sideBySides",
1126
+ componentTypes: ["sideBySide"],
1127
+ },
1128
+ ];
1129
+ }
1130
+
1131
+ static returnStateVariableDefinitions() {
1132
+ let stateVariableDefinitions = super.returnStateVariableDefinitions();
1133
+
1134
+ stateVariableDefinitions.maxNPanelsPerRow = {
1135
+ // forRenderer: true,
1136
+ returnDependencies: () => ({
1137
+ sideBySideChildren: {
1138
+ dependencyType: "child",
1139
+ childGroups: ["sideBySides"],
1140
+ variableNames: ["numPanels"],
1141
+ },
1142
+ }),
1143
+ definition({ dependencyValues }) {
1144
+ return {
1145
+ setValue: {
1146
+ maxNPanelsPerRow: me.math.max(
1147
+ dependencyValues.sideBySideChildren.map(
1148
+ (x) => x.stateValues.numPanels,
1149
+ ),
1150
+ ),
1151
+ },
1152
+ checkForActualChange: { maxNPanelsPerRow: true },
1153
+ };
1154
+ },
1155
+ };
1156
+
1157
+ stateVariableDefinitions.specifiedWidths = {
1158
+ additionalStateVariablesDefined: [
1159
+ {
1160
+ variableName: "widthsAbsoluteArray",
1161
+ isArray: true,
1162
+ },
1163
+ ],
1164
+ isArray: true,
1165
+ entryPrefixes: ["specifiedWidth"],
1166
+ hasEssential: true,
1167
+ defaultValueByArrayKey: () => null,
1168
+ returnArraySizeDependencies: () => ({
1169
+ maxNPanelsPerRow: {
1170
+ dependencyType: "stateVariable",
1171
+ variableName: "maxNPanelsPerRow",
1172
+ },
1173
+ }),
1174
+ returnArraySize({ dependencyValues }) {
1175
+ return [dependencyValues.maxNPanelsPerRow];
1176
+ },
1177
+ returnArrayDependenciesByKey({ arrayKeys }) {
1178
+ let globalDependencies = {
1179
+ widthAttr: {
1180
+ dependencyType: "attributeComponent",
1181
+ attributeName: "width",
1182
+ variableNames: ["componentSize"],
1183
+ },
1184
+ widthsAttr: {
1185
+ dependencyType: "attributeComponent",
1186
+ attributeName: "widths",
1187
+ variableNames: ["numComponents"],
1188
+ },
1189
+ };
1190
+ let dependenciesByKey = {};
1191
+ for (let arrayKey of arrayKeys) {
1192
+ let varEnding = Number(arrayKey) + 1;
1193
+ dependenciesByKey[arrayKey] = {
1194
+ widthsAttr: {
1195
+ dependencyType: "attributeComponent",
1196
+ attributeName: "widths",
1197
+ variableNames: [`componentSize${varEnding}`],
1198
+ },
1199
+ };
1200
+ }
1201
+ return { globalDependencies, dependenciesByKey };
1202
+ },
1203
+ arrayDefinitionByKey({
1204
+ globalDependencyValues,
1205
+ dependencyValuesByKey,
1206
+ arrayKeys,
1207
+ arraySize,
1208
+ }) {
1209
+ let specifiedWidths = {};
1210
+ let essentialSpecifiedWidths = {};
1211
+ let widthsAbsoluteArray = {};
1212
+
1213
+ let nWidthsSpecifiedFromAttrs;
1214
+ let usingSingleWidth = false;
1215
+
1216
+ if (globalDependencyValues.widthsAttr !== null) {
1217
+ nWidthsSpecifiedFromAttrs =
1218
+ globalDependencyValues.widthsAttr.stateValues.numComponents;
1219
+ } else if (globalDependencyValues.widthAttr !== null) {
1220
+ nWidthsSpecifiedFromAttrs = arraySize[0];
1221
+ usingSingleWidth = true;
1222
+ } else {
1223
+ nWidthsSpecifiedFromAttrs = 0;
1224
+ }
1225
+
1226
+ for (let arrayKey of arrayKeys) {
1227
+ let arrayIndex = Number(arrayKey);
1228
+
1229
+ if (arrayIndex < nWidthsSpecifiedFromAttrs) {
1230
+ if (usingSingleWidth) {
1231
+ if (globalDependencyValues.widthAttr.stateValues.componentSize) {
1232
+ specifiedWidths[arrayKey] =
1233
+ globalDependencyValues.widthAttr.stateValues.componentSize.size;
1234
+ widthsAbsoluteArray[arrayKey] =
1235
+ globalDependencyValues.widthAttr.stateValues.componentSize.isAbsolute;
1236
+ }
1237
+ } else {
1238
+ let varEnding = arrayIndex + 1;
1239
+ let widthComponentSize =
1240
+ dependencyValuesByKey[arrayKey].widthsAttr.stateValues[
1241
+ `componentSize${varEnding}`
1242
+ ];
1243
+
1244
+ if (widthComponentSize) {
1245
+ specifiedWidths[arrayKey] = widthComponentSize.size;
1246
+ widthsAbsoluteArray[arrayKey] = widthComponentSize.isAbsolute;
1247
+ }
1248
+ }
1249
+ } else {
1250
+ essentialSpecifiedWidths[arrayKey] = true;
1251
+ widthsAbsoluteArray[arrayKey] = null;
1252
+ }
1253
+ }
1254
+
1255
+ let result = { setValue: { widthsAbsoluteArray, specifiedWidths } };
1256
+
1257
+ if (Object.keys(essentialSpecifiedWidths).length > 0) {
1258
+ result.useEssentialOrDefaultValue = {
1259
+ specifiedWidths: essentialSpecifiedWidths,
1260
+ };
1261
+ }
1262
+
1263
+ return result;
1264
+ },
1265
+ inverseArrayDefinitionByKey({
1266
+ desiredStateVariableValues,
1267
+ dependencyNamesByKey,
1268
+ globalDependencyValues,
1269
+ stateValues,
1270
+ arraySize,
1271
+ }) {
1272
+ let nWidthsSpecified;
1273
+ let usingSingleWidth = false;
1274
+
1275
+ if (globalDependencyValues.widthsAttr !== null) {
1276
+ nWidthsSpecified =
1277
+ globalDependencyValues.widthsAttr.stateValues.numComponents;
1278
+ } else if (globalDependencyValues.widthAttr !== null) {
1279
+ nWidthsSpecified = arraySize[0];
1280
+ usingSingleWidth = true;
1281
+ } else {
1282
+ nWidthsSpecified = 0;
1283
+ }
1284
+
1285
+ let instructions = [];
1286
+
1287
+ for (let arrayKey in desiredStateVariableValues.specifiedWidths) {
1288
+ let arrayIndex = Number(arrayKey);
1289
+
1290
+ if (arrayIndex < nWidthsSpecified) {
1291
+ if (usingSingleWidth) {
1292
+ // last one wins
1293
+ instructions.push({
1294
+ setDependency: "widthAttr",
1295
+ desiredValue: {
1296
+ size: desiredStateVariableValues.specifiedWidths[arrayKey],
1297
+ isAbsolute: stateValues.widthsAbsolute,
1298
+ },
1299
+ variableIndex: 0,
1300
+ });
1301
+ } else {
1302
+ instructions.push({
1303
+ setDependency: dependencyNamesByKey[arrayKey].widthsAttr,
1304
+ desiredValue: {
1305
+ size: desiredStateVariableValues.specifiedWidths[arrayKey],
1306
+ isAbsolute: stateValues.widthsAbsolute,
1307
+ },
1308
+ variableIndex: 0,
1309
+ });
1310
+ }
1311
+ } else {
1312
+ instructions.push({
1313
+ setEssentialValue: "specifiedWidths",
1314
+ value: {
1315
+ [arrayKey]:
1316
+ desiredStateVariableValues.specifiedWidths[arrayKey],
1317
+ },
1318
+ });
1319
+ }
1320
+ }
1321
+
1322
+ return {
1323
+ success: true,
1324
+ instructions,
1325
+ };
1326
+ },
1327
+ };
1328
+
1329
+ stateVariableDefinitions.widthsAbsolute = {
1330
+ returnDependencies: () => ({
1331
+ widthsAbsoluteArray: {
1332
+ dependencyType: "stateVariable",
1333
+ variableName: "widthsAbsoluteArray",
1334
+ },
1335
+ }),
1336
+ definition({ dependencyValues }) {
1337
+ let widthsAbsolute = null;
1338
+
1339
+ for (let ind in dependencyValues.widthsAbsoluteArray) {
1340
+ let thisAbsolute = dependencyValues.widthsAbsoluteArray[ind];
1341
+ if (thisAbsolute !== null) {
1342
+ thisAbsolute = Boolean(thisAbsolute);
1343
+ if (widthsAbsolute === null) {
1344
+ widthsAbsolute = thisAbsolute;
1345
+ } else if (widthsAbsolute !== thisAbsolute) {
1346
+ throw Error(
1347
+ `SbsGroup is not implemented for absolute measurements`,
1348
+ );
1349
+ throw Error(
1350
+ `Cannot mix absolute and relative widths for sbsGroup`,
1351
+ );
1352
+ }
1353
+ }
1354
+ }
1355
+
1356
+ return { setValue: { widthsAbsolute } };
1357
+ },
1358
+ };
1359
+
1360
+ stateVariableDefinitions.specifiedMargins = {
1361
+ additionalStateVariablesDefined: [
1362
+ {
1363
+ variableName: "marginsAbsoluteArray",
1364
+ isArray: true,
1365
+ entryPrefixes: ["marginAbsolute"],
1366
+ },
1367
+ ],
1368
+ isArray: true,
1369
+ entryPrefixes: ["specifiedMargin"],
1370
+ hasEssential: true,
1371
+ defaultValueByArrayKey: () => null,
1372
+ returnArraySizeDependencies: () => ({}),
1373
+ returnArraySize() {
1374
+ return [2];
1375
+ },
1376
+ returnArrayDependenciesByKey({ arrayKeys }) {
1377
+ let globalDependencies = {
1378
+ marginsAttr: {
1379
+ dependencyType: "attributeComponent",
1380
+ attributeName: "margins",
1381
+ variableNames: [
1382
+ "componentSize1",
1383
+ "componentSize2",
1384
+ "numComponents",
1385
+ ],
1386
+ },
1387
+ };
1388
+
1389
+ return { globalDependencies };
1390
+ },
1391
+ arrayDefinitionByKey({
1392
+ dependencyValuesByKey,
1393
+ globalDependencyValues,
1394
+ arrayKeys,
1395
+ }) {
1396
+ let specifiedMargins = {};
1397
+ let essentialSpecifiedMargins = {};
1398
+ let marginsAbsoluteArray = {};
1399
+
1400
+ if (
1401
+ globalDependencyValues.marginsAttr === null ||
1402
+ globalDependencyValues.marginsAttr.stateValues.numComponents === 0
1403
+ ) {
1404
+ for (let arrayKey of arrayKeys) {
1405
+ essentialSpecifiedMargins[arrayKey] = true;
1406
+ marginsAbsoluteArray[arrayKey] = null;
1407
+ }
1408
+ } else if (
1409
+ globalDependencyValues.marginsAttr.stateValues.numComponents === 1
1410
+ ) {
1411
+ let margin = null,
1412
+ absolute = null;
1413
+ if (globalDependencyValues.marginsAttr.stateValues.componentSize1) {
1414
+ margin =
1415
+ globalDependencyValues.marginsAttr.stateValues.componentSize1
1416
+ .size;
1417
+ if (!Number.isFinite(margin)) {
1418
+ margin = null;
1419
+ }
1420
+ absolute = Boolean(
1421
+ globalDependencyValues.marginsAttr.stateValues.componentSize1
1422
+ .isAbsolute,
1423
+ );
1424
+ }
1425
+ for (let arrayKey of arrayKeys) {
1426
+ specifiedMargins[arrayKey] = margin;
1427
+ marginsAbsoluteArray[arrayKey] = absolute;
1428
+ }
1429
+ } else {
1430
+ // two (or more) components of marginsAttr
1431
+ for (let arrayKey of arrayKeys) {
1432
+ if (
1433
+ globalDependencyValues.marginsAttr.stateValues[
1434
+ `componentSize${Number(arrayKey) + 1}`
1435
+ ]
1436
+ ) {
1437
+ let margin =
1438
+ globalDependencyValues.marginsAttr.stateValues[
1439
+ `componentSize${Number(arrayKey) + 1}`
1440
+ ].size;
1441
+ if (!Number.isFinite(margin)) {
1442
+ margin = null;
1443
+ }
1444
+ let absolute = Boolean(
1445
+ globalDependencyValues.marginsAttr.stateValues[
1446
+ `componentSize${Number(arrayKey) + 1}`
1447
+ ].isAbsolute,
1448
+ );
1449
+
1450
+ specifiedMargins[arrayKey] = margin;
1451
+ marginsAbsoluteArray[arrayKey] = absolute;
1452
+ }
1453
+ }
1454
+ }
1455
+
1456
+ let result = { setValue: { marginsAbsoluteArray, specifiedMargins } };
1457
+
1458
+ if (Object.keys(essentialSpecifiedMargins).length > 0) {
1459
+ result.useEssentialOrDefaultValue = {
1460
+ specifiedMargins: essentialSpecifiedMargins,
1461
+ };
1462
+ }
1463
+
1464
+ return result;
1465
+ },
1466
+ async inverseArrayDefinitionByKey({
1467
+ desiredStateVariableValues,
1468
+ dependencyNamesByKey,
1469
+ globalDependencyValues,
1470
+ stateValues,
1471
+ }) {
1472
+ let instructions = [];
1473
+
1474
+ if (globalDependencyValues.marginsAttr === null) {
1475
+ instructions.push({
1476
+ setEssentialValue: "specifiedMargins",
1477
+ value: desiredStateVariableValues.specifiedMargins,
1478
+ });
1479
+ } else if (
1480
+ !(
1481
+ globalDependencyValues.marginsAttr.stateValues.componentSize1 &&
1482
+ Number.isFinite(
1483
+ globalDependencyValues.marginsAttr.stateValues.componentSize1
1484
+ .size,
1485
+ )
1486
+ )
1487
+ ) {
1488
+ if ("0" in desiredStateVariableValues.specifiedMargins) {
1489
+ instructions.push({
1490
+ setDependency: "marginsAttr",
1491
+ desiredValue: {
1492
+ size: desiredStateVariableValues.specifiedMargins[0],
1493
+ isAbsolute: await stateValues.marginsAbsolute,
1494
+ },
1495
+ variableIndex: 0,
1496
+ });
1497
+ } else {
1498
+ // if didn't specify the first margin, then set the first margin
1499
+ // to be equal to the second
1500
+ // (since if we didn't overwrite the non-numeric first margin,
1501
+ // the margins would still be null)
1502
+ instructions.push({
1503
+ setDependency: "marginsAttr",
1504
+ desiredValue: {
1505
+ size: desiredStateVariableValues.specifiedMargins[1],
1506
+ isAbsolute: await stateValues.marginsAbsolute,
1507
+ },
1508
+ variableIndex: 0,
1509
+ });
1510
+ }
1511
+
1512
+ if ("1" in desiredStateVariableValues.specifiedMargins) {
1513
+ if (
1514
+ globalDependencyValues.marginsAttr.stateValues.numComponents > 1
1515
+ ) {
1516
+ instructions.push({
1517
+ setDependency: "marginsAttr",
1518
+ desiredValue: {
1519
+ size: desiredStateVariableValues.specifiedMargins[1],
1520
+ isAbsolute: await stateValues.marginsAbsolute,
1521
+ },
1522
+ variableIndex: 1,
1523
+ });
1524
+ }
1525
+ // if didn't have a second margin specified,
1526
+ // then we are forced to be symmetric
1527
+ }
1528
+ } else {
1529
+ let symmetricMargins =
1530
+ globalDependencyValues.marginsAttr.stateValues.numComponents === 1;
1531
+
1532
+ for (let arrayKey in desiredStateVariableValues.specifiedMargins) {
1533
+ if (symmetricMargins) {
1534
+ // last one wins
1535
+ instructions.push({
1536
+ setDependency: "marginsAttr",
1537
+ desiredValue: {
1538
+ size: desiredStateVariableValues.specifiedMargins[arrayKey],
1539
+ isAbsolute: await stateValues.marginsAbsolute,
1540
+ },
1541
+ variableIndex: 0,
1542
+ });
1543
+ } else {
1544
+ instructions.push({
1545
+ setDependency: "marginsAttr",
1546
+ desiredValue: {
1547
+ size: desiredStateVariableValues.specifiedMargins[arrayKey],
1548
+ isAbsolute: await stateValues.marginsAbsolute,
1549
+ },
1550
+ variableIndex: arrayKey,
1551
+ });
1552
+ }
1553
+ }
1554
+ }
1555
+
1556
+ return {
1557
+ success: true,
1558
+ instructions,
1559
+ };
1560
+ },
1561
+ };
1562
+
1563
+ stateVariableDefinitions.marginsAbsolute = {
1564
+ returnDependencies: () => ({
1565
+ marginsAbsoluteArray: {
1566
+ dependencyType: "stateVariable",
1567
+ variableName: "marginsAbsoluteArray",
1568
+ },
1569
+ }),
1570
+ definition({ dependencyValues }) {
1571
+ let marginsAbsolute = null;
1572
+
1573
+ for (let ind in dependencyValues.marginsAbsoluteArray) {
1574
+ let thisAbsolute = dependencyValues.marginsAbsoluteArray[ind];
1575
+ if (thisAbsolute !== null) {
1576
+ thisAbsolute = Boolean(thisAbsolute);
1577
+ if (marginsAbsolute === null) {
1578
+ marginsAbsolute = thisAbsolute;
1579
+ } else if (marginsAbsolute !== thisAbsolute) {
1580
+ throw Error(
1581
+ `SbsGroup is not implemented for absolute measurements`,
1582
+ );
1583
+ throw Error(
1584
+ `Cannot mix absolute and relative margins for sbsGroup`,
1585
+ );
1586
+ }
1587
+ }
1588
+ }
1589
+
1590
+ return { setValue: { marginsAbsolute } };
1591
+ },
1592
+ };
1593
+
1594
+ stateVariableDefinitions.absoluteMeasurements = {
1595
+ public: true,
1596
+ shadowingInstructions: {
1597
+ createComponentOfType: "boolean",
1598
+ },
1599
+ // forRenderer: true,
1600
+ returnDependencies: () => ({
1601
+ widthsAbsolute: {
1602
+ dependencyType: "stateVariable",
1603
+ variableName: "widthsAbsolute",
1604
+ },
1605
+ marginsAbsolute: {
1606
+ dependencyType: "stateVariable",
1607
+ variableName: "marginsAbsolute",
1608
+ },
1609
+ }),
1610
+ definition({ dependencyValues }) {
1611
+ let absoluteMeasurements;
1612
+ if (dependencyValues.widthsAbsolute === null) {
1613
+ if (dependencyValues.marginsAbsolute === null) {
1614
+ absoluteMeasurements = false;
1615
+ } else {
1616
+ absoluteMeasurements = dependencyValues.marginsAbsolute;
1617
+ }
1618
+ } else {
1619
+ if (dependencyValues.marginsAbsolute === null) {
1620
+ absoluteMeasurements = dependencyValues.widthsAbsolute;
1621
+ } else {
1622
+ if (
1623
+ dependencyValues.widthsAbsolute !==
1624
+ dependencyValues.marginsAbsolute
1625
+ ) {
1626
+ throw Error(
1627
+ `SbsGroup is not implemented for absolute measurements`,
1628
+ );
1629
+ throw Error(
1630
+ `Cannot mix absolute and relative widths and margins for sbsGroup`,
1631
+ );
1632
+ }
1633
+ absoluteMeasurements = dependencyValues.widthsAbsolute;
1634
+ }
1635
+ }
1636
+
1637
+ if (absoluteMeasurements === true) {
1638
+ throw Error(`SbsGroup is not implemented for absolute measurements`);
1639
+ }
1640
+
1641
+ return { setValue: { absoluteMeasurements } };
1642
+ },
1643
+ };
1644
+
1645
+ stateVariableDefinitions.allWidths = {
1646
+ additionalStateVariablesDefined: [
1647
+ "allMargins",
1648
+ {
1649
+ variableName: "gapWidth",
1650
+ public: true,
1651
+ shadowingInstructions: {
1652
+ createComponentOfType: "number",
1653
+ },
1654
+ // forRenderer: true
1655
+ },
1656
+ ],
1657
+ returnDependencies: () => ({
1658
+ maxNPanelsPerRow: {
1659
+ dependencyType: "stateVariable",
1660
+ variableName: "maxNPanelsPerRow",
1661
+ },
1662
+ specifiedWidths: {
1663
+ dependencyType: "stateVariable",
1664
+ variableName: "specifiedWidths",
1665
+ },
1666
+ specifiedMargins: {
1667
+ dependencyType: "stateVariable",
1668
+ variableName: "specifiedMargins",
1669
+ },
1670
+ absoluteMeasurements: {
1671
+ dependencyType: "stateVariable",
1672
+ variableName: "absoluteMeasurements",
1673
+ },
1674
+ }),
1675
+ definition({ dependencyValues }) {
1676
+ let gapWidth = 0;
1677
+ let allWidths = [...dependencyValues.specifiedWidths];
1678
+ let allMargins = [...dependencyValues.specifiedMargins];
1679
+
1680
+ let totalWidthSpecified = 0;
1681
+ let nWidthsUndefined = 0;
1682
+
1683
+ for (let ind = 0; ind < dependencyValues.maxNPanelsPerRow; ind++) {
1684
+ let width = allWidths[ind];
1685
+ if (width === null) {
1686
+ nWidthsUndefined++;
1687
+ } else {
1688
+ totalWidthSpecified += width;
1689
+ }
1690
+ }
1691
+
1692
+ let totalMarginSpecified = 0;
1693
+ let nMarginsUndefined = 0;
1694
+
1695
+ for (let ind = 0; ind < 2; ind++) {
1696
+ let margin = allMargins[ind];
1697
+ if (margin === null) {
1698
+ nMarginsUndefined++;
1699
+ } else {
1700
+ totalMarginSpecified += margin;
1701
+ }
1702
+ }
1703
+ totalMarginSpecified *= dependencyValues.maxNPanelsPerRow;
1704
+
1705
+ if (!dependencyValues.absoluteMeasurements) {
1706
+ if (totalWidthSpecified + totalMarginSpecified >= 100) {
1707
+ // we are already over 100%
1708
+ // anything null becomes width 0
1709
+ // everything else is normalized to add up to 100
1710
+
1711
+ let normalization =
1712
+ 100 / (totalWidthSpecified + totalMarginSpecified);
1713
+ for (let ind = 0; ind < dependencyValues.maxNPanelsPerRow; ind++) {
1714
+ if (allWidths[ind] === null) {
1715
+ allWidths[ind] = 0;
1716
+ } else {
1717
+ allWidths[ind] *= normalization;
1718
+ }
1719
+ }
1720
+ for (let ind = 0; ind < 2; ind++) {
1721
+ let margin = allMargins[ind];
1722
+ if (margin === null) {
1723
+ allMargins[ind] = 0;
1724
+ } else {
1725
+ allMargins[ind] *= normalization;
1726
+ }
1727
+ }
1728
+ } else {
1729
+ // since we are under 100%, we try the following to get to 100%
1730
+ // 1. if there are any null widths,
1731
+ // define them to be the same value that makes the total 100%
1732
+ // and make any null margins be zero
1733
+ // 2. else, if there are any null margins,
1734
+ // define them to be the same value that makes the total 100%
1735
+ // 3. else if there two or panels, set gapWidth to make the total 100%
1736
+ // 4. else if there is one panel, expand the right margin
1737
+ // 5. do nothing (child groups aren't matched)
1738
+
1739
+ if (nWidthsUndefined > 0) {
1740
+ let newWidth =
1741
+ (100 - (totalWidthSpecified + totalMarginSpecified)) /
1742
+ nWidthsUndefined;
1743
+ for (
1744
+ let ind = 0;
1745
+ ind < dependencyValues.maxNPanelsPerRow;
1746
+ ind++
1747
+ ) {
1748
+ if (allWidths[ind] === null) {
1749
+ allWidths[ind] = newWidth;
1750
+ }
1751
+ }
1752
+
1753
+ for (let ind = 0; ind < 2; ind++) {
1754
+ let margin = allMargins[ind];
1755
+ if (margin === null) {
1756
+ allMargins[ind] = 0;
1757
+ }
1758
+ }
1759
+ } else if (nMarginsUndefined > 0) {
1760
+ let newMargin =
1761
+ (100 - (totalWidthSpecified + totalMarginSpecified)) /
1762
+ (nMarginsUndefined * dependencyValues.maxNPanelsPerRow);
1763
+ for (let ind = 0; ind < 2; ind++) {
1764
+ if (allMargins[ind] === null) {
1765
+ allMargins[ind] = newMargin;
1766
+ }
1767
+ }
1768
+ } else if (dependencyValues.maxNPanelsPerRow > 1) {
1769
+ gapWidth =
1770
+ (100 - (totalWidthSpecified + totalMarginSpecified)) /
1771
+ (dependencyValues.maxNPanelsPerRow - 1);
1772
+ } else if (dependencyValues.maxNPanelsPerRow === 1) {
1773
+ allMargins[1] = 100 - (allMargins[0] + allWidths[0]);
1774
+ } else {
1775
+ console.warn(
1776
+ "Invalid sideBySide, as it must have at least one block child",
1777
+ );
1778
+ }
1779
+ }
1780
+ } else {
1781
+ // we won't reach here, as we throw an error about not implementing
1782
+ // absolute measurements before get this far
1783
+ }
1784
+
1785
+ return { setValue: { allWidths, allMargins, gapWidth } };
1786
+ },
1787
+ };
1788
+
1789
+ stateVariableDefinitions.widths = {
1790
+ public: true,
1791
+ isArray: true,
1792
+ shadowingInstructions: {
1793
+ createComponentOfType: "number",
1794
+ },
1795
+ entryPrefixes: ["width"],
1796
+ // forRenderer: true,
1797
+ returnArraySizeDependencies: () => ({
1798
+ maxNPanelsPerRow: {
1799
+ dependencyType: "stateVariable",
1800
+ variableName: "maxNPanelsPerRow",
1801
+ },
1802
+ }),
1803
+ returnArraySize({ dependencyValues }) {
1804
+ return [dependencyValues.maxNPanelsPerRow];
1805
+ },
1806
+ returnArrayDependenciesByKey({ arrayKeys }) {
1807
+ let globalDependencies = {
1808
+ allWidths: {
1809
+ dependencyType: "stateVariable",
1810
+ variableName: `allWidths`,
1811
+ },
1812
+ };
1813
+
1814
+ // Note: the specifiedWidth dependency is used only in the inverse direction
1815
+ // to facilitate single keys being changed at a time
1816
+ let dependenciesByKey = {};
1817
+ for (let arrayKey of arrayKeys) {
1818
+ let varEnding = Number(arrayKey) + 1;
1819
+ dependenciesByKey[arrayKey] = {
1820
+ specifiedWidth: {
1821
+ dependencyType: "stateVariable",
1822
+ variableName: `specifiedWidth${varEnding}`,
1823
+ },
1824
+ };
1825
+ }
1826
+ return { globalDependencies, dependenciesByKey };
1827
+ },
1828
+ arrayDefinitionByKey({ globalDependencyValues, arrayKeys }) {
1829
+ let widths = {};
1830
+ for (let arrayKey of arrayKeys) {
1831
+ widths[arrayKey] = globalDependencyValues.allWidths[arrayKey];
1832
+ }
1833
+
1834
+ return { setValue: { widths } };
1835
+ },
1836
+ inverseArrayDefinitionByKey({
1837
+ desiredStateVariableValues,
1838
+ dependencyNamesByKey,
1839
+ }) {
1840
+ let instructions = [];
1841
+
1842
+ for (let arrayKey in desiredStateVariableValues.widths) {
1843
+ instructions.push({
1844
+ setDependency: dependencyNamesByKey[arrayKey].specifiedWidth,
1845
+ desiredValue: desiredStateVariableValues.widths[arrayKey],
1846
+ variableIndex: 0,
1847
+ });
1848
+ }
1849
+
1850
+ return {
1851
+ success: true,
1852
+ instructions,
1853
+ };
1854
+ },
1855
+ };
1856
+
1857
+ stateVariableDefinitions.margins = {
1858
+ public: true,
1859
+ isArray: true,
1860
+ shadowingInstructions: {
1861
+ createComponentOfType: "number",
1862
+ },
1863
+ entryPrefixes: ["margin"],
1864
+ // forRenderer: true,
1865
+ returnArraySizeDependencies: () => ({}),
1866
+ returnArraySize() {
1867
+ return [2];
1868
+ },
1869
+ returnArrayDependenciesByKey({ arrayKeys }) {
1870
+ let globalDependencies = {
1871
+ allMargins: {
1872
+ dependencyType: "stateVariable",
1873
+ variableName: `allMargins`,
1874
+ },
1875
+ };
1876
+
1877
+ // Note: the specifiedMargin dependency is used only in the inverse direction
1878
+ // to facilitate single keys being changed at a time
1879
+ let dependenciesByKey = {};
1880
+ for (let arrayKey of arrayKeys) {
1881
+ let varEnding = Number(arrayKey) + 1;
1882
+ dependenciesByKey[arrayKey] = {
1883
+ specifiedMargin: {
1884
+ dependencyType: "stateVariable",
1885
+ variableName: `specifiedMargin${varEnding}`,
1886
+ },
1887
+ };
1888
+ }
1889
+ return { globalDependencies, dependenciesByKey };
1890
+ },
1891
+ arrayDefinitionByKey({ globalDependencyValues, arrayKeys }) {
1892
+ let margins = {};
1893
+ for (let arrayKey of arrayKeys) {
1894
+ margins[arrayKey] = globalDependencyValues.allMargins[arrayKey];
1895
+ }
1896
+
1897
+ return { setValue: { margins } };
1898
+ },
1899
+ inverseArrayDefinitionByKey({
1900
+ desiredStateVariableValues,
1901
+ dependencyNamesByKey,
1902
+ }) {
1903
+ let instructions = [];
1904
+
1905
+ for (let arrayKey in desiredStateVariableValues.margins) {
1906
+ instructions.push({
1907
+ setDependency: dependencyNamesByKey[arrayKey].specifiedMargin,
1908
+ desiredValue: desiredStateVariableValues.margins[arrayKey],
1909
+ variableIndex: 0,
1910
+ });
1911
+ }
1912
+
1913
+ return {
1914
+ success: true,
1915
+ instructions,
1916
+ };
1917
+ },
1918
+ };
1919
+
1920
+ stateVariableDefinitions.valigns = {
1921
+ public: true,
1922
+ isArray: true,
1923
+ shadowingInstructions: {
1924
+ createComponentOfType: "text",
1925
+ },
1926
+ entryPrefixes: ["valign"],
1927
+ // forRenderer: true,
1928
+ hasEssential: true,
1929
+ defaultValueByArrayKey: () => "top",
1930
+ returnArraySizeDependencies: () => ({
1931
+ maxNPanelsPerRow: {
1932
+ dependencyType: "stateVariable",
1933
+ variableName: "maxNPanelsPerRow",
1934
+ },
1935
+ }),
1936
+ returnArraySize({ dependencyValues }) {
1937
+ return [dependencyValues.maxNPanelsPerRow];
1938
+ },
1939
+ returnArrayDependenciesByKey({ arrayKeys }) {
1940
+ let globalDependencies = {
1941
+ valignAttr: {
1942
+ dependencyType: "attributeComponent",
1943
+ attributeName: "valign",
1944
+ variableNames: ["value"],
1945
+ },
1946
+ valignsAttr: {
1947
+ dependencyType: "attributeComponent",
1948
+ attributeName: "valigns",
1949
+ variableNames: ["numComponents"],
1950
+ },
1951
+ };
1952
+ let dependenciesByKey = {};
1953
+ for (let arrayKey of arrayKeys) {
1954
+ let varEnding = Number(arrayKey) + 1;
1955
+ dependenciesByKey[arrayKey] = {
1956
+ valignsAttr: {
1957
+ dependencyType: "attributeComponent",
1958
+ attributeName: "valigns",
1959
+ variableNames: [`text${varEnding}`],
1960
+ },
1961
+ };
1962
+ }
1963
+ return { globalDependencies, dependenciesByKey };
1964
+ },
1965
+ arrayDefinitionByKey({
1966
+ globalDependencyValues,
1967
+ dependencyValuesByKey,
1968
+ arrayKeys,
1969
+ arraySize,
1970
+ }) {
1971
+ let valigns = {};
1972
+ let essentialValigns = {};
1973
+
1974
+ let nValignsSpecified;
1975
+ let usingSingleValign = false;
1976
+
1977
+ if (globalDependencyValues.valignsAttr !== null) {
1978
+ nValignsSpecified =
1979
+ globalDependencyValues.valignsAttr.stateValues.numComponents;
1980
+ } else if (globalDependencyValues.valignAttr !== null) {
1981
+ nValignsSpecified = arraySize[0];
1982
+ usingSingleValign = true;
1983
+ } else {
1984
+ nValignsSpecified = 0;
1985
+ }
1986
+
1987
+ for (let arrayKey of arrayKeys) {
1988
+ let arrayIndex = Number(arrayKey);
1989
+
1990
+ if (arrayIndex < nValignsSpecified) {
1991
+ if (usingSingleValign) {
1992
+ valigns[arrayKey] =
1993
+ globalDependencyValues.valignAttr.stateValues.value.toLowerCase();
1994
+ } else {
1995
+ let varEnding = arrayIndex + 1;
1996
+ valigns[arrayKey] =
1997
+ dependencyValuesByKey[arrayKey].valignsAttr.stateValues[
1998
+ `text${varEnding}`
1999
+ ].toLowerCase();
2000
+ }
2001
+ if (!["top", "middle", "bottom"].includes(valigns[arrayKey])) {
2002
+ valigns[arrayKey] = "top";
2003
+ }
2004
+ } else {
2005
+ essentialValigns[arrayKey] = true;
2006
+ }
2007
+ }
2008
+
2009
+ let result = {};
2010
+
2011
+ if (Object.keys(valigns).length > 0) {
2012
+ result.setValue = { valigns };
2013
+ }
2014
+ if (Object.keys(essentialValigns).length > 0) {
2015
+ result.useEssentialOrDefaultValue = { valigns: essentialValigns };
2016
+ }
2017
+
2018
+ return result;
2019
+ },
2020
+ inverseArrayDefinitionByKey({
2021
+ desiredStateVariableValues,
2022
+ dependencyNamesByKey,
2023
+ globalDependencyValues,
2024
+ arraySize,
2025
+ }) {
2026
+ let nValignsSpecified;
2027
+ let usingSingleValign = false;
2028
+
2029
+ if (globalDependencyValues.valignsAttr !== null) {
2030
+ nValignsSpecified =
2031
+ globalDependencyValues.valignsAttr.stateValues.numComponents;
2032
+ } else if (globalDependencyValues.valignAttr !== null) {
2033
+ nValignsSpecified = arraySize[0];
2034
+ usingSingleValign = true;
2035
+ } else {
2036
+ nValignsSpecified = 0;
2037
+ }
2038
+
2039
+ let instructions = [];
2040
+
2041
+ for (let arrayKey in desiredStateVariableValues.valigns) {
2042
+ let desiredValue =
2043
+ desiredStateVariableValues.valigns[arrayKey].toLowerCase();
2044
+ if (!["top", "middle", "bottom"].includes(desiredValue)) {
2045
+ continue;
2046
+ }
2047
+
2048
+ let arrayIndex = Number(arrayKey);
2049
+
2050
+ if (arrayIndex < nValignsSpecified) {
2051
+ if (usingSingleValign) {
2052
+ // last one wins
2053
+ instructions.push({
2054
+ setDependency: "valignAttr",
2055
+ desiredValue,
2056
+ variableIndex: 0,
2057
+ });
2058
+ } else {
2059
+ instructions.push({
2060
+ setDependency: dependencyNamesByKey[arrayKey].valignsAttr,
2061
+ desiredValue,
2062
+ variableIndex: 0,
2063
+ });
2064
+ }
2065
+ } else {
2066
+ instructions.push({
2067
+ setEssentialValue: "valigns",
2068
+ value: { [arrayKey]: desiredValue },
2069
+ });
2070
+ }
2071
+ }
2072
+
2073
+ return {
2074
+ success: true,
2075
+ instructions,
2076
+ };
2077
+ },
2078
+ };
2079
+
2080
+ return stateVariableDefinitions;
2081
+ }
2082
+
2083
+ recordVisibilityChange({ isVisible, actionId }) {
2084
+ this.coreFunctions.requestRecordEvent({
2085
+ verb: "visibilityChanged",
2086
+ object: {
2087
+ componentName: this.componentName,
2088
+ componentType: this.componentType,
2089
+ },
2090
+ result: { isVisible },
2091
+ });
2092
+ this.coreFunctions.resolveAction({ actionId });
2093
+ }
2094
+ }
2095
+
2096
+ export class Stack extends BlockComponent {
2097
+ constructor(args) {
2098
+ super(args);
2099
+
2100
+ Object.assign(this.actions, {
2101
+ recordVisibilityChange: this.recordVisibilityChange.bind(this),
2102
+ });
2103
+ }
2104
+ static componentType = "stack";
2105
+ static rendererType = "containerBlock";
2106
+ static renderChildren = true;
2107
+
2108
+ static includeBlankStringChildren = true;
2109
+
2110
+ static returnChildGroups() {
2111
+ return [
2112
+ {
2113
+ group: "anything",
2114
+ componentTypes: ["_base"],
2115
+ },
2116
+ ];
2117
+ }
2118
+
2119
+ recordVisibilityChange({ isVisible, actionId }) {
2120
+ this.coreFunctions.requestRecordEvent({
2121
+ verb: "visibilityChanged",
2122
+ object: {
2123
+ componentName: this.componentName,
2124
+ componentType: this.componentType,
2125
+ },
2126
+ result: { isVisible },
2127
+ });
2128
+ this.coreFunctions.resolveAction({ actionId });
2129
+ }
2130
+ }