@magmamath/students-features 1.8.0 → 1.8.1-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (428) hide show
  1. package/dist/commonjs/features/fluency/components/FluencySolving.js +2 -2
  2. package/dist/commonjs/features/fluency/components/FluencySolving.js.map +1 -1
  3. package/dist/commonjs/features/fluency/components/fluency-solving/components/DebugBoxIndicator.js +48 -0
  4. package/dist/commonjs/features/fluency/components/fluency-solving/components/DebugBoxIndicator.js.map +1 -0
  5. package/dist/commonjs/features/fluency/components/fluency-solving/components/EquationContent.js +9 -8
  6. package/dist/commonjs/features/fluency/components/fluency-solving/components/EquationContent.js.map +1 -1
  7. package/dist/commonjs/features/fluency/components/fluency-solving/components/FluencyCardDeck.js +3 -1
  8. package/dist/commonjs/features/fluency/components/fluency-solving/components/FluencyCardDeck.js.map +1 -1
  9. package/dist/commonjs/features/fluency/components/fluency-solving/components/FluencyEquationCard.js +63 -10
  10. package/dist/commonjs/features/fluency/components/fluency-solving/components/FluencyEquationCard.js.map +1 -1
  11. package/dist/commonjs/features/fluency/components/fluency-solving/components/FluencySolvingHeader.js +10 -0
  12. package/dist/commonjs/features/fluency/components/fluency-solving/components/FluencySolvingHeader.js.map +1 -1
  13. package/dist/commonjs/features/fluency/components/fluency-solving/components/FluencySolvingProgress.js +0 -2
  14. package/dist/commonjs/features/fluency/components/fluency-solving/components/FluencySolvingProgress.js.map +1 -1
  15. package/dist/commonjs/features/fluency/index.js +12 -0
  16. package/dist/commonjs/features/fluency/index.js.map +1 -1
  17. package/dist/commonjs/features/fluency/visual-scaffolding/adapter.js +36 -0
  18. package/dist/commonjs/features/fluency/visual-scaffolding/adapter.js.map +1 -0
  19. package/dist/commonjs/features/fluency/visual-scaffolding/components/DiscreteCounterGrid.js +232 -0
  20. package/dist/commonjs/features/fluency/visual-scaffolding/components/DiscreteCounterGrid.js.map +1 -0
  21. package/dist/commonjs/features/fluency/visual-scaffolding/components/Dot.js +51 -0
  22. package/dist/commonjs/features/fluency/visual-scaffolding/components/Dot.js.map +1 -0
  23. package/dist/commonjs/features/fluency/visual-scaffolding/components/DynamicNumberLine.js +104 -0
  24. package/dist/commonjs/features/fluency/visual-scaffolding/components/DynamicNumberLine.js.map +1 -0
  25. package/dist/commonjs/features/fluency/visual-scaffolding/components/FactVisual.js +75 -0
  26. package/dist/commonjs/features/fluency/visual-scaffolding/components/FactVisual.js.map +1 -0
  27. package/dist/commonjs/features/fluency/visual-scaffolding/components/QuotativeBars.js +91 -0
  28. package/dist/commonjs/features/fluency/visual-scaffolding/components/QuotativeBars.js.map +1 -0
  29. package/dist/commonjs/features/fluency/visual-scaffolding/components/RelationalBlock.js +279 -0
  30. package/dist/commonjs/features/fluency/visual-scaffolding/components/RelationalBlock.js.map +1 -0
  31. package/dist/commonjs/features/fluency/visual-scaffolding/components/visualColors.js +44 -0
  32. package/dist/commonjs/features/fluency/visual-scaffolding/components/visualColors.js.map +1 -0
  33. package/dist/commonjs/features/fluency/visual-scaffolding/index.js +73 -0
  34. package/dist/commonjs/features/fluency/visual-scaffolding/index.js.map +1 -0
  35. package/dist/commonjs/features/fluency/visual-scaffolding/renderFact.js +276 -0
  36. package/dist/commonjs/features/fluency/visual-scaffolding/renderFact.js.map +1 -0
  37. package/dist/commonjs/features/fluency/visual-scaffolding/types.js +2 -0
  38. package/dist/commonjs/features/fluency/visual-scaffolding/types.js.map +1 -0
  39. package/dist/commonjs/features/fluency-teacher/assets/{DivisionIcon.js → SortDefaultIcon.js} +8 -11
  40. package/dist/commonjs/features/fluency-teacher/assets/SortDefaultIcon.js.map +1 -0
  41. package/dist/commonjs/features/fluency-teacher/components/FluencyTeacher.js +3 -4
  42. package/dist/commonjs/features/fluency-teacher/components/FluencyTeacher.js.map +1 -1
  43. package/dist/commonjs/features/fluency-teacher/components/drawer/DrawerHeader.js +43 -48
  44. package/dist/commonjs/features/fluency-teacher/components/drawer/DrawerHeader.js.map +1 -1
  45. package/dist/commonjs/features/fluency-teacher/components/drawer/DrawerMasteryLegend.js +80 -0
  46. package/dist/commonjs/features/fluency-teacher/components/drawer/DrawerMasteryLegend.js.map +1 -0
  47. package/dist/commonjs/features/fluency-teacher/components/drawer/DrawerMatrixes.js +28 -11
  48. package/dist/commonjs/features/fluency-teacher/components/drawer/DrawerMatrixes.js.map +1 -1
  49. package/dist/commonjs/features/fluency-teacher/components/drawer/DrawerOperatorBox.js +44 -27
  50. package/dist/commonjs/features/fluency-teacher/components/drawer/DrawerOperatorBox.js.map +1 -1
  51. package/dist/commonjs/features/fluency-teacher/components/drawer/DrawerOperatorStatCard.js +40 -47
  52. package/dist/commonjs/features/fluency-teacher/components/drawer/DrawerOperatorStatCard.js.map +1 -1
  53. package/dist/commonjs/features/fluency-teacher/components/drawer/DrawerStats.js +24 -14
  54. package/dist/commonjs/features/fluency-teacher/components/drawer/DrawerStats.js.map +1 -1
  55. package/dist/commonjs/features/fluency-teacher/components/drawer/FluencyTeacherDrawer.js +6 -6
  56. package/dist/commonjs/features/fluency-teacher/components/drawer/FluencyTeacherDrawer.js.map +1 -1
  57. package/dist/commonjs/features/fluency-teacher/components/matrix/DrawerMatrix.js.map +1 -1
  58. package/dist/commonjs/features/fluency-teacher/components/matrix/MatrixCell.js +16 -2
  59. package/dist/commonjs/features/fluency-teacher/components/matrix/MatrixCell.js.map +1 -1
  60. package/dist/commonjs/features/fluency-teacher/components/matrix/MatrixRow.js +2 -1
  61. package/dist/commonjs/features/fluency-teacher/components/matrix/MatrixRow.js.map +1 -1
  62. package/dist/commonjs/features/fluency-teacher/components/table/AllPupilsTableRow.js +41 -15
  63. package/dist/commonjs/features/fluency-teacher/components/table/AllPupilsTableRow.js.map +1 -1
  64. package/dist/commonjs/features/fluency-teacher/components/table/AverageSortButton.js +62 -6
  65. package/dist/commonjs/features/fluency-teacher/components/table/AverageSortButton.js.map +1 -1
  66. package/dist/commonjs/features/fluency-teacher/components/table/FluencyTeacherStudentsTable.js +40 -42
  67. package/dist/commonjs/features/fluency-teacher/components/table/FluencyTeacherStudentsTable.js.map +1 -1
  68. package/dist/commonjs/features/fluency-teacher/components/table/OperatorBadge.js +16 -25
  69. package/dist/commonjs/features/fluency-teacher/components/table/OperatorBadge.js.map +1 -1
  70. package/dist/commonjs/features/fluency-teacher/components/table/TableColumnSortButton.js +40 -30
  71. package/dist/commonjs/features/fluency-teacher/components/table/TableColumnSortButton.js.map +1 -1
  72. package/dist/commonjs/features/fluency-teacher/components/table/TableRow.js +72 -59
  73. package/dist/commonjs/features/fluency-teacher/components/table/TableRow.js.map +1 -1
  74. package/dist/commonjs/features/fluency-teacher/components/table/TableRowAverageProgress.js +71 -0
  75. package/dist/commonjs/features/fluency-teacher/components/table/TableRowAverageProgress.js.map +1 -0
  76. package/dist/commonjs/features/fluency-teacher/context/TeacherFluencyContext.js.map +1 -1
  77. package/dist/commonjs/features/fluency-teacher/fluencyTeacher.constants.js +38 -103
  78. package/dist/commonjs/features/fluency-teacher/fluencyTeacher.constants.js.map +1 -1
  79. package/dist/commonjs/features/fluency-teacher/fluencyTeacher.helpers.js +10 -52
  80. package/dist/commonjs/features/fluency-teacher/fluencyTeacher.helpers.js.map +1 -1
  81. package/dist/commonjs/features/fluency-teacher/hooks/useDrawerGrid.js +2 -3
  82. package/dist/commonjs/features/fluency-teacher/hooks/useDrawerGrid.js.map +1 -1
  83. package/dist/commonjs/features/fluency-teacher/hooks/useDrawerMatrix.js.map +1 -1
  84. package/dist/commonjs/features/fluency-teacher/model/TeacherFluencyFiltersModel.js +1 -2
  85. package/dist/commonjs/features/fluency-teacher/model/TeacherFluencyFiltersModel.js.map +1 -1
  86. package/dist/commonjs/features/fluency-teacher/model/TeacherFluencyModel.js +0 -9
  87. package/dist/commonjs/features/fluency-teacher/model/TeacherFluencyModel.js.map +1 -1
  88. package/dist/module/features/fluency/components/FluencySolving.js +2 -2
  89. package/dist/module/features/fluency/components/FluencySolving.js.map +1 -1
  90. package/dist/module/features/fluency/components/fluency-solving/components/DebugBoxIndicator.js +43 -0
  91. package/dist/module/features/fluency/components/fluency-solving/components/DebugBoxIndicator.js.map +1 -0
  92. package/dist/module/features/fluency/components/fluency-solving/components/EquationContent.js +9 -8
  93. package/dist/module/features/fluency/components/fluency-solving/components/EquationContent.js.map +1 -1
  94. package/dist/module/features/fluency/components/fluency-solving/components/FluencyCardDeck.js +3 -1
  95. package/dist/module/features/fluency/components/fluency-solving/components/FluencyCardDeck.js.map +1 -1
  96. package/dist/module/features/fluency/components/fluency-solving/components/FluencyEquationCard.js +64 -11
  97. package/dist/module/features/fluency/components/fluency-solving/components/FluencyEquationCard.js.map +1 -1
  98. package/dist/module/features/fluency/components/fluency-solving/components/FluencySolvingHeader.js +10 -0
  99. package/dist/module/features/fluency/components/fluency-solving/components/FluencySolvingHeader.js.map +1 -1
  100. package/dist/module/features/fluency/components/fluency-solving/components/FluencySolvingProgress.js +0 -2
  101. package/dist/module/features/fluency/components/fluency-solving/components/FluencySolvingProgress.js.map +1 -1
  102. package/dist/module/features/fluency/index.js +1 -0
  103. package/dist/module/features/fluency/index.js.map +1 -1
  104. package/dist/module/features/fluency/visual-scaffolding/adapter.js +31 -0
  105. package/dist/module/features/fluency/visual-scaffolding/adapter.js.map +1 -0
  106. package/dist/module/features/fluency/visual-scaffolding/components/DiscreteCounterGrid.js +225 -0
  107. package/dist/module/features/fluency/visual-scaffolding/components/DiscreteCounterGrid.js.map +1 -0
  108. package/dist/module/features/fluency/visual-scaffolding/components/Dot.js +45 -0
  109. package/dist/module/features/fluency/visual-scaffolding/components/Dot.js.map +1 -0
  110. package/dist/module/features/fluency/visual-scaffolding/components/DynamicNumberLine.js +96 -0
  111. package/dist/module/features/fluency/visual-scaffolding/components/DynamicNumberLine.js.map +1 -0
  112. package/dist/module/features/fluency/visual-scaffolding/components/FactVisual.js +69 -0
  113. package/dist/module/features/fluency/visual-scaffolding/components/FactVisual.js.map +1 -0
  114. package/dist/module/features/fluency/visual-scaffolding/components/QuotativeBars.js +83 -0
  115. package/dist/module/features/fluency/visual-scaffolding/components/QuotativeBars.js.map +1 -0
  116. package/dist/module/features/fluency/visual-scaffolding/components/RelationalBlock.js +272 -0
  117. package/dist/module/features/fluency/visual-scaffolding/components/RelationalBlock.js.map +1 -0
  118. package/dist/module/features/fluency/visual-scaffolding/components/visualColors.js +41 -0
  119. package/dist/module/features/fluency/visual-scaffolding/components/visualColors.js.map +1 -0
  120. package/dist/module/features/fluency/visual-scaffolding/index.js +8 -0
  121. package/dist/module/features/fluency/visual-scaffolding/index.js.map +1 -0
  122. package/dist/module/features/fluency/visual-scaffolding/renderFact.js +269 -0
  123. package/dist/module/features/fluency/visual-scaffolding/renderFact.js.map +1 -0
  124. package/dist/module/features/fluency/visual-scaffolding/types.js +2 -0
  125. package/dist/module/features/fluency/visual-scaffolding/types.js.map +1 -0
  126. package/dist/module/features/fluency-teacher/assets/SortDefaultIcon.js +23 -0
  127. package/dist/module/features/fluency-teacher/assets/SortDefaultIcon.js.map +1 -0
  128. package/dist/module/features/fluency-teacher/components/FluencyTeacher.js +3 -4
  129. package/dist/module/features/fluency-teacher/components/FluencyTeacher.js.map +1 -1
  130. package/dist/module/features/fluency-teacher/components/drawer/DrawerHeader.js +44 -49
  131. package/dist/module/features/fluency-teacher/components/drawer/DrawerHeader.js.map +1 -1
  132. package/dist/module/features/fluency-teacher/components/drawer/DrawerMasteryLegend.js +74 -0
  133. package/dist/module/features/fluency-teacher/components/drawer/DrawerMasteryLegend.js.map +1 -0
  134. package/dist/module/features/fluency-teacher/components/drawer/DrawerMatrixes.js +31 -14
  135. package/dist/module/features/fluency-teacher/components/drawer/DrawerMatrixes.js.map +1 -1
  136. package/dist/module/features/fluency-teacher/components/drawer/DrawerOperatorBox.js +45 -28
  137. package/dist/module/features/fluency-teacher/components/drawer/DrawerOperatorBox.js.map +1 -1
  138. package/dist/module/features/fluency-teacher/components/drawer/DrawerOperatorStatCard.js +41 -48
  139. package/dist/module/features/fluency-teacher/components/drawer/DrawerOperatorStatCard.js.map +1 -1
  140. package/dist/module/features/fluency-teacher/components/drawer/DrawerStats.js +27 -17
  141. package/dist/module/features/fluency-teacher/components/drawer/DrawerStats.js.map +1 -1
  142. package/dist/module/features/fluency-teacher/components/drawer/FluencyTeacherDrawer.js +6 -6
  143. package/dist/module/features/fluency-teacher/components/drawer/FluencyTeacherDrawer.js.map +1 -1
  144. package/dist/module/features/fluency-teacher/components/matrix/DrawerMatrix.js.map +1 -1
  145. package/dist/module/features/fluency-teacher/components/matrix/MatrixCell.js +17 -3
  146. package/dist/module/features/fluency-teacher/components/matrix/MatrixCell.js.map +1 -1
  147. package/dist/module/features/fluency-teacher/components/matrix/MatrixRow.js +2 -1
  148. package/dist/module/features/fluency-teacher/components/matrix/MatrixRow.js.map +1 -1
  149. package/dist/module/features/fluency-teacher/components/table/AllPupilsTableRow.js +42 -16
  150. package/dist/module/features/fluency-teacher/components/table/AllPupilsTableRow.js.map +1 -1
  151. package/dist/module/features/fluency-teacher/components/table/AverageSortButton.js +63 -7
  152. package/dist/module/features/fluency-teacher/components/table/AverageSortButton.js.map +1 -1
  153. package/dist/module/features/fluency-teacher/components/table/FluencyTeacherStudentsTable.js +42 -44
  154. package/dist/module/features/fluency-teacher/components/table/FluencyTeacherStudentsTable.js.map +1 -1
  155. package/dist/module/features/fluency-teacher/components/table/OperatorBadge.js +16 -25
  156. package/dist/module/features/fluency-teacher/components/table/OperatorBadge.js.map +1 -1
  157. package/dist/module/features/fluency-teacher/components/table/TableColumnSortButton.js +42 -32
  158. package/dist/module/features/fluency-teacher/components/table/TableColumnSortButton.js.map +1 -1
  159. package/dist/module/features/fluency-teacher/components/table/TableRow.js +75 -62
  160. package/dist/module/features/fluency-teacher/components/table/TableRow.js.map +1 -1
  161. package/dist/module/features/fluency-teacher/components/table/TableRowAverageProgress.js +65 -0
  162. package/dist/module/features/fluency-teacher/components/table/TableRowAverageProgress.js.map +1 -0
  163. package/dist/module/features/fluency-teacher/context/TeacherFluencyContext.js.map +1 -1
  164. package/dist/module/features/fluency-teacher/fluencyTeacher.constants.js +37 -102
  165. package/dist/module/features/fluency-teacher/fluencyTeacher.constants.js.map +1 -1
  166. package/dist/module/features/fluency-teacher/fluencyTeacher.helpers.js +8 -43
  167. package/dist/module/features/fluency-teacher/fluencyTeacher.helpers.js.map +1 -1
  168. package/dist/module/features/fluency-teacher/hooks/useDrawerGrid.js +2 -3
  169. package/dist/module/features/fluency-teacher/hooks/useDrawerGrid.js.map +1 -1
  170. package/dist/module/features/fluency-teacher/hooks/useDrawerMatrix.js.map +1 -1
  171. package/dist/module/features/fluency-teacher/model/TeacherFluencyFiltersModel.js +1 -2
  172. package/dist/module/features/fluency-teacher/model/TeacherFluencyFiltersModel.js.map +1 -1
  173. package/dist/module/features/fluency-teacher/model/TeacherFluencyModel.js +0 -9
  174. package/dist/module/features/fluency-teacher/model/TeacherFluencyModel.js.map +1 -1
  175. package/dist/typescript/commonjs/features/fluency/components/fluency-solving/components/DebugBoxIndicator.d.ts +3 -0
  176. package/dist/typescript/commonjs/features/fluency/components/fluency-solving/components/DebugBoxIndicator.d.ts.map +1 -0
  177. package/dist/typescript/commonjs/features/fluency/components/fluency-solving/components/EquationContent.d.ts.map +1 -1
  178. package/dist/typescript/commonjs/features/fluency/components/fluency-solving/components/FluencyCardDeck.d.ts.map +1 -1
  179. package/dist/typescript/commonjs/features/fluency/components/fluency-solving/components/FluencyEquationCard.d.ts +2 -1
  180. package/dist/typescript/commonjs/features/fluency/components/fluency-solving/components/FluencyEquationCard.d.ts.map +1 -1
  181. package/dist/typescript/commonjs/features/fluency/components/fluency-solving/components/FluencySolvingHeader.d.ts.map +1 -1
  182. package/dist/typescript/commonjs/features/fluency/index.d.ts +1 -0
  183. package/dist/typescript/commonjs/features/fluency/index.d.ts.map +1 -1
  184. package/dist/typescript/commonjs/features/fluency/visual-scaffolding/__tests__/renderFact.test.d.ts +2 -0
  185. package/dist/typescript/commonjs/features/fluency/visual-scaffolding/__tests__/renderFact.test.d.ts.map +1 -0
  186. package/dist/typescript/commonjs/features/fluency/visual-scaffolding/adapter.d.ts +4 -0
  187. package/dist/typescript/commonjs/features/fluency/visual-scaffolding/adapter.d.ts.map +1 -0
  188. package/dist/typescript/commonjs/features/fluency/visual-scaffolding/components/DiscreteCounterGrid.d.ts +10 -0
  189. package/dist/typescript/commonjs/features/fluency/visual-scaffolding/components/DiscreteCounterGrid.d.ts.map +1 -0
  190. package/dist/typescript/commonjs/features/fluency/visual-scaffolding/components/Dot.d.ts +10 -0
  191. package/dist/typescript/commonjs/features/fluency/visual-scaffolding/components/Dot.d.ts.map +1 -0
  192. package/dist/typescript/commonjs/features/fluency/visual-scaffolding/components/DynamicNumberLine.d.ts +10 -0
  193. package/dist/typescript/commonjs/features/fluency/visual-scaffolding/components/DynamicNumberLine.d.ts.map +1 -0
  194. package/dist/typescript/commonjs/features/fluency/visual-scaffolding/components/FactVisual.d.ts +10 -0
  195. package/dist/typescript/commonjs/features/fluency/visual-scaffolding/components/FactVisual.d.ts.map +1 -0
  196. package/dist/typescript/commonjs/features/fluency/visual-scaffolding/components/QuotativeBars.d.ts +10 -0
  197. package/dist/typescript/commonjs/features/fluency/visual-scaffolding/components/QuotativeBars.d.ts.map +1 -0
  198. package/dist/typescript/commonjs/features/fluency/visual-scaffolding/components/RelationalBlock.d.ts +10 -0
  199. package/dist/typescript/commonjs/features/fluency/visual-scaffolding/components/RelationalBlock.d.ts.map +1 -0
  200. package/dist/typescript/commonjs/features/fluency/visual-scaffolding/components/visualColors.d.ts +16 -0
  201. package/dist/typescript/commonjs/features/fluency/visual-scaffolding/components/visualColors.d.ts.map +1 -0
  202. package/dist/typescript/commonjs/features/fluency/visual-scaffolding/index.d.ts +6 -0
  203. package/dist/typescript/commonjs/features/fluency/visual-scaffolding/index.d.ts.map +1 -0
  204. package/dist/typescript/commonjs/features/fluency/visual-scaffolding/renderFact.d.ts +23 -0
  205. package/dist/typescript/commonjs/features/fluency/visual-scaffolding/renderFact.d.ts.map +1 -0
  206. package/dist/typescript/commonjs/features/fluency/visual-scaffolding/types.d.ts +103 -0
  207. package/dist/typescript/commonjs/features/fluency/visual-scaffolding/types.d.ts.map +1 -0
  208. package/dist/typescript/commonjs/features/fluency-teacher/assets/SortDefaultIcon.d.ts +4 -0
  209. package/dist/typescript/commonjs/features/fluency-teacher/assets/SortDefaultIcon.d.ts.map +1 -0
  210. package/dist/typescript/commonjs/features/fluency-teacher/components/drawer/DrawerHeader.d.ts.map +1 -1
  211. package/dist/typescript/commonjs/features/fluency-teacher/components/drawer/DrawerMasteryLegend.d.ts +3 -0
  212. package/dist/typescript/commonjs/features/fluency-teacher/components/drawer/DrawerMasteryLegend.d.ts.map +1 -0
  213. package/dist/typescript/commonjs/features/fluency-teacher/components/drawer/DrawerMatrixes.d.ts.map +1 -1
  214. package/dist/typescript/commonjs/features/fluency-teacher/components/drawer/DrawerOperatorBox.d.ts +4 -1
  215. package/dist/typescript/commonjs/features/fluency-teacher/components/drawer/DrawerOperatorBox.d.ts.map +1 -1
  216. package/dist/typescript/commonjs/features/fluency-teacher/components/drawer/DrawerOperatorStatCard.d.ts +4 -6
  217. package/dist/typescript/commonjs/features/fluency-teacher/components/drawer/DrawerOperatorStatCard.d.ts.map +1 -1
  218. package/dist/typescript/commonjs/features/fluency-teacher/components/drawer/DrawerStats.d.ts.map +1 -1
  219. package/dist/typescript/commonjs/features/fluency-teacher/components/drawer/FluencyTeacherDrawer.d.ts.map +1 -1
  220. package/dist/typescript/commonjs/features/fluency-teacher/components/matrix/DrawerMatrix.d.ts +2 -3
  221. package/dist/typescript/commonjs/features/fluency-teacher/components/matrix/DrawerMatrix.d.ts.map +1 -1
  222. package/dist/typescript/commonjs/features/fluency-teacher/components/matrix/MatrixCell.d.ts +5 -6
  223. package/dist/typescript/commonjs/features/fluency-teacher/components/matrix/MatrixCell.d.ts.map +1 -1
  224. package/dist/typescript/commonjs/features/fluency-teacher/components/matrix/MatrixHeaderRow.d.ts +1 -2
  225. package/dist/typescript/commonjs/features/fluency-teacher/components/matrix/MatrixHeaderRow.d.ts.map +1 -1
  226. package/dist/typescript/commonjs/features/fluency-teacher/components/matrix/MatrixRow.d.ts +3 -5
  227. package/dist/typescript/commonjs/features/fluency-teacher/components/matrix/MatrixRow.d.ts.map +1 -1
  228. package/dist/typescript/commonjs/features/fluency-teacher/components/table/AllPupilsTableRow.d.ts.map +1 -1
  229. package/dist/typescript/commonjs/features/fluency-teacher/components/table/AverageSortButton.d.ts +1 -2
  230. package/dist/typescript/commonjs/features/fluency-teacher/components/table/AverageSortButton.d.ts.map +1 -1
  231. package/dist/typescript/commonjs/features/fluency-teacher/components/table/FluencyTeacherStudentsTable.d.ts.map +1 -1
  232. package/dist/typescript/commonjs/features/fluency-teacher/components/table/OperatorBadge.d.ts +4 -5
  233. package/dist/typescript/commonjs/features/fluency-teacher/components/table/OperatorBadge.d.ts.map +1 -1
  234. package/dist/typescript/commonjs/features/fluency-teacher/components/table/TableColumnSortButton.d.ts +6 -7
  235. package/dist/typescript/commonjs/features/fluency-teacher/components/table/TableColumnSortButton.d.ts.map +1 -1
  236. package/dist/typescript/commonjs/features/fluency-teacher/components/table/TableRow.d.ts +3 -4
  237. package/dist/typescript/commonjs/features/fluency-teacher/components/table/TableRow.d.ts.map +1 -1
  238. package/dist/typescript/commonjs/features/fluency-teacher/components/table/TableRowAverageProgress.d.ts +7 -0
  239. package/dist/typescript/commonjs/features/fluency-teacher/components/table/TableRowAverageProgress.d.ts.map +1 -0
  240. package/dist/typescript/commonjs/features/fluency-teacher/context/TeacherFluencyContext.d.ts +0 -1
  241. package/dist/typescript/commonjs/features/fluency-teacher/context/TeacherFluencyContext.d.ts.map +1 -1
  242. package/dist/typescript/commonjs/features/fluency-teacher/fluencyTeacher.constants.d.ts +3 -16
  243. package/dist/typescript/commonjs/features/fluency-teacher/fluencyTeacher.constants.d.ts.map +1 -1
  244. package/dist/typescript/commonjs/features/fluency-teacher/fluencyTeacher.helpers.d.ts +4 -11
  245. package/dist/typescript/commonjs/features/fluency-teacher/fluencyTeacher.helpers.d.ts.map +1 -1
  246. package/dist/typescript/commonjs/features/fluency-teacher/fluencyTeacher.types.d.ts +6 -35
  247. package/dist/typescript/commonjs/features/fluency-teacher/fluencyTeacher.types.d.ts.map +1 -1
  248. package/dist/typescript/commonjs/features/fluency-teacher/hooks/useDrawerGrid.d.ts +12 -1
  249. package/dist/typescript/commonjs/features/fluency-teacher/hooks/useDrawerGrid.d.ts.map +1 -1
  250. package/dist/typescript/commonjs/features/fluency-teacher/hooks/useDrawerMatrix.d.ts +3 -3
  251. package/dist/typescript/commonjs/features/fluency-teacher/hooks/useDrawerMatrix.d.ts.map +1 -1
  252. package/dist/typescript/commonjs/features/fluency-teacher/model/TeacherFluencyFiltersModel.d.ts +0 -1
  253. package/dist/typescript/commonjs/features/fluency-teacher/model/TeacherFluencyFiltersModel.d.ts.map +1 -1
  254. package/dist/typescript/commonjs/features/fluency-teacher/model/TeacherFluencyModel.d.ts.map +1 -1
  255. package/dist/typescript/module/features/fluency/components/fluency-solving/components/DebugBoxIndicator.d.ts +3 -0
  256. package/dist/typescript/module/features/fluency/components/fluency-solving/components/DebugBoxIndicator.d.ts.map +1 -0
  257. package/dist/typescript/module/features/fluency/components/fluency-solving/components/EquationContent.d.ts.map +1 -1
  258. package/dist/typescript/module/features/fluency/components/fluency-solving/components/FluencyCardDeck.d.ts.map +1 -1
  259. package/dist/typescript/module/features/fluency/components/fluency-solving/components/FluencyEquationCard.d.ts +2 -1
  260. package/dist/typescript/module/features/fluency/components/fluency-solving/components/FluencyEquationCard.d.ts.map +1 -1
  261. package/dist/typescript/module/features/fluency/components/fluency-solving/components/FluencySolvingHeader.d.ts.map +1 -1
  262. package/dist/typescript/module/features/fluency/index.d.ts +1 -0
  263. package/dist/typescript/module/features/fluency/index.d.ts.map +1 -1
  264. package/dist/typescript/module/features/fluency/visual-scaffolding/__tests__/renderFact.test.d.ts +2 -0
  265. package/dist/typescript/module/features/fluency/visual-scaffolding/__tests__/renderFact.test.d.ts.map +1 -0
  266. package/dist/typescript/module/features/fluency/visual-scaffolding/adapter.d.ts +4 -0
  267. package/dist/typescript/module/features/fluency/visual-scaffolding/adapter.d.ts.map +1 -0
  268. package/dist/typescript/module/features/fluency/visual-scaffolding/components/DiscreteCounterGrid.d.ts +10 -0
  269. package/dist/typescript/module/features/fluency/visual-scaffolding/components/DiscreteCounterGrid.d.ts.map +1 -0
  270. package/dist/typescript/module/features/fluency/visual-scaffolding/components/Dot.d.ts +10 -0
  271. package/dist/typescript/module/features/fluency/visual-scaffolding/components/Dot.d.ts.map +1 -0
  272. package/dist/typescript/module/features/fluency/visual-scaffolding/components/DynamicNumberLine.d.ts +10 -0
  273. package/dist/typescript/module/features/fluency/visual-scaffolding/components/DynamicNumberLine.d.ts.map +1 -0
  274. package/dist/typescript/module/features/fluency/visual-scaffolding/components/FactVisual.d.ts +10 -0
  275. package/dist/typescript/module/features/fluency/visual-scaffolding/components/FactVisual.d.ts.map +1 -0
  276. package/dist/typescript/module/features/fluency/visual-scaffolding/components/QuotativeBars.d.ts +10 -0
  277. package/dist/typescript/module/features/fluency/visual-scaffolding/components/QuotativeBars.d.ts.map +1 -0
  278. package/dist/typescript/module/features/fluency/visual-scaffolding/components/RelationalBlock.d.ts +10 -0
  279. package/dist/typescript/module/features/fluency/visual-scaffolding/components/RelationalBlock.d.ts.map +1 -0
  280. package/dist/typescript/module/features/fluency/visual-scaffolding/components/visualColors.d.ts +16 -0
  281. package/dist/typescript/module/features/fluency/visual-scaffolding/components/visualColors.d.ts.map +1 -0
  282. package/dist/typescript/module/features/fluency/visual-scaffolding/index.d.ts +6 -0
  283. package/dist/typescript/module/features/fluency/visual-scaffolding/index.d.ts.map +1 -0
  284. package/dist/typescript/module/features/fluency/visual-scaffolding/renderFact.d.ts +23 -0
  285. package/dist/typescript/module/features/fluency/visual-scaffolding/renderFact.d.ts.map +1 -0
  286. package/dist/typescript/module/features/fluency/visual-scaffolding/types.d.ts +103 -0
  287. package/dist/typescript/module/features/fluency/visual-scaffolding/types.d.ts.map +1 -0
  288. package/dist/typescript/module/features/fluency-teacher/assets/SortDefaultIcon.d.ts +4 -0
  289. package/dist/typescript/module/features/fluency-teacher/assets/SortDefaultIcon.d.ts.map +1 -0
  290. package/dist/typescript/module/features/fluency-teacher/components/drawer/DrawerHeader.d.ts.map +1 -1
  291. package/dist/typescript/module/features/fluency-teacher/components/drawer/DrawerMasteryLegend.d.ts +3 -0
  292. package/dist/typescript/module/features/fluency-teacher/components/drawer/DrawerMasteryLegend.d.ts.map +1 -0
  293. package/dist/typescript/module/features/fluency-teacher/components/drawer/DrawerMatrixes.d.ts.map +1 -1
  294. package/dist/typescript/module/features/fluency-teacher/components/drawer/DrawerOperatorBox.d.ts +4 -1
  295. package/dist/typescript/module/features/fluency-teacher/components/drawer/DrawerOperatorBox.d.ts.map +1 -1
  296. package/dist/typescript/module/features/fluency-teacher/components/drawer/DrawerOperatorStatCard.d.ts +4 -6
  297. package/dist/typescript/module/features/fluency-teacher/components/drawer/DrawerOperatorStatCard.d.ts.map +1 -1
  298. package/dist/typescript/module/features/fluency-teacher/components/drawer/DrawerStats.d.ts.map +1 -1
  299. package/dist/typescript/module/features/fluency-teacher/components/drawer/FluencyTeacherDrawer.d.ts.map +1 -1
  300. package/dist/typescript/module/features/fluency-teacher/components/matrix/DrawerMatrix.d.ts +2 -3
  301. package/dist/typescript/module/features/fluency-teacher/components/matrix/DrawerMatrix.d.ts.map +1 -1
  302. package/dist/typescript/module/features/fluency-teacher/components/matrix/MatrixCell.d.ts +5 -6
  303. package/dist/typescript/module/features/fluency-teacher/components/matrix/MatrixCell.d.ts.map +1 -1
  304. package/dist/typescript/module/features/fluency-teacher/components/matrix/MatrixHeaderRow.d.ts +1 -2
  305. package/dist/typescript/module/features/fluency-teacher/components/matrix/MatrixHeaderRow.d.ts.map +1 -1
  306. package/dist/typescript/module/features/fluency-teacher/components/matrix/MatrixRow.d.ts +3 -5
  307. package/dist/typescript/module/features/fluency-teacher/components/matrix/MatrixRow.d.ts.map +1 -1
  308. package/dist/typescript/module/features/fluency-teacher/components/table/AllPupilsTableRow.d.ts.map +1 -1
  309. package/dist/typescript/module/features/fluency-teacher/components/table/AverageSortButton.d.ts +1 -2
  310. package/dist/typescript/module/features/fluency-teacher/components/table/AverageSortButton.d.ts.map +1 -1
  311. package/dist/typescript/module/features/fluency-teacher/components/table/FluencyTeacherStudentsTable.d.ts.map +1 -1
  312. package/dist/typescript/module/features/fluency-teacher/components/table/OperatorBadge.d.ts +4 -5
  313. package/dist/typescript/module/features/fluency-teacher/components/table/OperatorBadge.d.ts.map +1 -1
  314. package/dist/typescript/module/features/fluency-teacher/components/table/TableColumnSortButton.d.ts +6 -7
  315. package/dist/typescript/module/features/fluency-teacher/components/table/TableColumnSortButton.d.ts.map +1 -1
  316. package/dist/typescript/module/features/fluency-teacher/components/table/TableRow.d.ts +3 -4
  317. package/dist/typescript/module/features/fluency-teacher/components/table/TableRow.d.ts.map +1 -1
  318. package/dist/typescript/module/features/fluency-teacher/components/table/TableRowAverageProgress.d.ts +7 -0
  319. package/dist/typescript/module/features/fluency-teacher/components/table/TableRowAverageProgress.d.ts.map +1 -0
  320. package/dist/typescript/module/features/fluency-teacher/context/TeacherFluencyContext.d.ts +0 -1
  321. package/dist/typescript/module/features/fluency-teacher/context/TeacherFluencyContext.d.ts.map +1 -1
  322. package/dist/typescript/module/features/fluency-teacher/fluencyTeacher.constants.d.ts +3 -16
  323. package/dist/typescript/module/features/fluency-teacher/fluencyTeacher.constants.d.ts.map +1 -1
  324. package/dist/typescript/module/features/fluency-teacher/fluencyTeacher.helpers.d.ts +4 -11
  325. package/dist/typescript/module/features/fluency-teacher/fluencyTeacher.helpers.d.ts.map +1 -1
  326. package/dist/typescript/module/features/fluency-teacher/fluencyTeacher.types.d.ts +6 -35
  327. package/dist/typescript/module/features/fluency-teacher/fluencyTeacher.types.d.ts.map +1 -1
  328. package/dist/typescript/module/features/fluency-teacher/hooks/useDrawerGrid.d.ts +12 -1
  329. package/dist/typescript/module/features/fluency-teacher/hooks/useDrawerGrid.d.ts.map +1 -1
  330. package/dist/typescript/module/features/fluency-teacher/hooks/useDrawerMatrix.d.ts +3 -3
  331. package/dist/typescript/module/features/fluency-teacher/hooks/useDrawerMatrix.d.ts.map +1 -1
  332. package/dist/typescript/module/features/fluency-teacher/model/TeacherFluencyFiltersModel.d.ts +0 -1
  333. package/dist/typescript/module/features/fluency-teacher/model/TeacherFluencyFiltersModel.d.ts.map +1 -1
  334. package/dist/typescript/module/features/fluency-teacher/model/TeacherFluencyModel.d.ts.map +1 -1
  335. package/package.json +1 -1
  336. package/src/features/fluency/components/FluencySolving.tsx +2 -2
  337. package/src/features/fluency/components/fluency-solving/components/DebugBoxIndicator.tsx +40 -0
  338. package/src/features/fluency/components/fluency-solving/components/EquationContent.tsx +12 -8
  339. package/src/features/fluency/components/fluency-solving/components/FluencyCardDeck.tsx +6 -1
  340. package/src/features/fluency/components/fluency-solving/components/FluencyEquationCard.tsx +63 -11
  341. package/src/features/fluency/components/fluency-solving/components/FluencySolvingHeader.tsx +9 -0
  342. package/src/features/fluency/components/fluency-solving/components/FluencySolvingProgress.tsx +0 -2
  343. package/src/features/fluency/index.ts +1 -0
  344. package/src/features/fluency/visual-scaffolding/__tests__/__snapshots__/renderFact.test.ts.snap +64 -0
  345. package/src/features/fluency/visual-scaffolding/__tests__/renderFact.test.ts +192 -0
  346. package/src/features/fluency/visual-scaffolding/adapter.ts +33 -0
  347. package/src/features/fluency/visual-scaffolding/components/DiscreteCounterGrid.tsx +222 -0
  348. package/src/features/fluency/visual-scaffolding/components/Dot.tsx +36 -0
  349. package/src/features/fluency/visual-scaffolding/components/DynamicNumberLine.tsx +98 -0
  350. package/src/features/fluency/visual-scaffolding/components/FactVisual.tsx +61 -0
  351. package/src/features/fluency/visual-scaffolding/components/QuotativeBars.tsx +92 -0
  352. package/src/features/fluency/visual-scaffolding/components/RelationalBlock.tsx +225 -0
  353. package/src/features/fluency/visual-scaffolding/components/visualColors.ts +45 -0
  354. package/src/features/fluency/visual-scaffolding/index.ts +5 -0
  355. package/src/features/fluency/visual-scaffolding/renderFact.ts +219 -0
  356. package/src/features/fluency/visual-scaffolding/types.ts +108 -0
  357. package/src/features/fluency-teacher/assets/SortDefaultIcon.tsx +10 -0
  358. package/src/features/fluency-teacher/components/FluencyTeacher.tsx +3 -3
  359. package/src/features/fluency-teacher/components/drawer/DrawerHeader.tsx +35 -37
  360. package/src/features/fluency-teacher/components/drawer/DrawerMasteryLegend.tsx +63 -0
  361. package/src/features/fluency-teacher/components/drawer/DrawerMatrixes.tsx +32 -13
  362. package/src/features/fluency-teacher/components/drawer/DrawerOperatorBox.tsx +40 -20
  363. package/src/features/fluency-teacher/components/drawer/DrawerOperatorStatCard.tsx +35 -35
  364. package/src/features/fluency-teacher/components/drawer/DrawerStats.tsx +28 -16
  365. package/src/features/fluency-teacher/components/drawer/FluencyTeacherDrawer.tsx +5 -4
  366. package/src/features/fluency-teacher/components/matrix/DrawerMatrix.tsx +2 -3
  367. package/src/features/fluency-teacher/components/matrix/MatrixCell.tsx +16 -7
  368. package/src/features/fluency-teacher/components/matrix/MatrixHeaderRow.tsx +1 -1
  369. package/src/features/fluency-teacher/components/matrix/MatrixRow.tsx +4 -4
  370. package/src/features/fluency-teacher/components/table/AllPupilsTableRow.tsx +40 -13
  371. package/src/features/fluency-teacher/components/table/AverageSortButton.tsx +62 -8
  372. package/src/features/fluency-teacher/components/table/FluencyTeacherStudentsTable.tsx +35 -49
  373. package/src/features/fluency-teacher/components/table/OperatorBadge.tsx +11 -18
  374. package/src/features/fluency-teacher/components/table/TableColumnSortButton.tsx +49 -28
  375. package/src/features/fluency-teacher/components/table/TableRow.tsx +64 -65
  376. package/src/features/fluency-teacher/components/table/TableRowAverageProgress.tsx +65 -0
  377. package/src/features/fluency-teacher/context/TeacherFluencyContext.ts +0 -1
  378. package/src/features/fluency-teacher/fluencyTeacher.constants.ts +40 -138
  379. package/src/features/fluency-teacher/fluencyTeacher.helpers.ts +10 -82
  380. package/src/features/fluency-teacher/fluencyTeacher.types.ts +6 -39
  381. package/src/features/fluency-teacher/hooks/useDrawerGrid.ts +7 -4
  382. package/src/features/fluency-teacher/hooks/useDrawerMatrix.ts +3 -4
  383. package/src/features/fluency-teacher/model/TeacherFluencyFiltersModel.ts +5 -8
  384. package/src/features/fluency-teacher/model/TeacherFluencyModel.ts +0 -8
  385. package/dist/commonjs/features/fluency-teacher/assets/DivisionIcon.js.map +0 -1
  386. package/dist/commonjs/features/fluency-teacher/components/matrix/MatrixLegend.js +0 -83
  387. package/dist/commonjs/features/fluency-teacher/components/matrix/MatrixLegend.js.map +0 -1
  388. package/dist/commonjs/features/fluency-teacher/components/table/AverageCell.js +0 -55
  389. package/dist/commonjs/features/fluency-teacher/components/table/AverageCell.js.map +0 -1
  390. package/dist/commonjs/features/fluency-teacher/components/table/SortOrderCarets.js +0 -40
  391. package/dist/commonjs/features/fluency-teacher/components/table/SortOrderCarets.js.map +0 -1
  392. package/dist/commonjs/features/fluency-teacher/components/table/tableCell.styles.js +0 -45
  393. package/dist/commonjs/features/fluency-teacher/components/table/tableCell.styles.js.map +0 -1
  394. package/dist/module/features/fluency-teacher/assets/DivisionIcon.js +0 -26
  395. package/dist/module/features/fluency-teacher/assets/DivisionIcon.js.map +0 -1
  396. package/dist/module/features/fluency-teacher/components/matrix/MatrixLegend.js +0 -77
  397. package/dist/module/features/fluency-teacher/components/matrix/MatrixLegend.js.map +0 -1
  398. package/dist/module/features/fluency-teacher/components/table/AverageCell.js +0 -49
  399. package/dist/module/features/fluency-teacher/components/table/AverageCell.js.map +0 -1
  400. package/dist/module/features/fluency-teacher/components/table/SortOrderCarets.js +0 -34
  401. package/dist/module/features/fluency-teacher/components/table/SortOrderCarets.js.map +0 -1
  402. package/dist/module/features/fluency-teacher/components/table/tableCell.styles.js +0 -42
  403. package/dist/module/features/fluency-teacher/components/table/tableCell.styles.js.map +0 -1
  404. package/dist/typescript/commonjs/features/fluency-teacher/assets/DivisionIcon.d.ts +0 -4
  405. package/dist/typescript/commonjs/features/fluency-teacher/assets/DivisionIcon.d.ts.map +0 -1
  406. package/dist/typescript/commonjs/features/fluency-teacher/components/matrix/MatrixLegend.d.ts +0 -10
  407. package/dist/typescript/commonjs/features/fluency-teacher/components/matrix/MatrixLegend.d.ts.map +0 -1
  408. package/dist/typescript/commonjs/features/fluency-teacher/components/table/AverageCell.d.ts +0 -9
  409. package/dist/typescript/commonjs/features/fluency-teacher/components/table/AverageCell.d.ts.map +0 -1
  410. package/dist/typescript/commonjs/features/fluency-teacher/components/table/SortOrderCarets.d.ts +0 -9
  411. package/dist/typescript/commonjs/features/fluency-teacher/components/table/SortOrderCarets.d.ts.map +0 -1
  412. package/dist/typescript/commonjs/features/fluency-teacher/components/table/tableCell.styles.d.ts +0 -35
  413. package/dist/typescript/commonjs/features/fluency-teacher/components/table/tableCell.styles.d.ts.map +0 -1
  414. package/dist/typescript/module/features/fluency-teacher/assets/DivisionIcon.d.ts +0 -4
  415. package/dist/typescript/module/features/fluency-teacher/assets/DivisionIcon.d.ts.map +0 -1
  416. package/dist/typescript/module/features/fluency-teacher/components/matrix/MatrixLegend.d.ts +0 -10
  417. package/dist/typescript/module/features/fluency-teacher/components/matrix/MatrixLegend.d.ts.map +0 -1
  418. package/dist/typescript/module/features/fluency-teacher/components/table/AverageCell.d.ts +0 -9
  419. package/dist/typescript/module/features/fluency-teacher/components/table/AverageCell.d.ts.map +0 -1
  420. package/dist/typescript/module/features/fluency-teacher/components/table/SortOrderCarets.d.ts +0 -9
  421. package/dist/typescript/module/features/fluency-teacher/components/table/SortOrderCarets.d.ts.map +0 -1
  422. package/dist/typescript/module/features/fluency-teacher/components/table/tableCell.styles.d.ts +0 -35
  423. package/dist/typescript/module/features/fluency-teacher/components/table/tableCell.styles.d.ts.map +0 -1
  424. package/src/features/fluency-teacher/assets/DivisionIcon.tsx +0 -20
  425. package/src/features/fluency-teacher/components/matrix/MatrixLegend.tsx +0 -81
  426. package/src/features/fluency-teacher/components/table/AverageCell.tsx +0 -45
  427. package/src/features/fluency-teacher/components/table/SortOrderCarets.tsx +0 -37
  428. package/src/features/fluency-teacher/components/table/tableCell.styles.ts +0 -39
@@ -0,0 +1,222 @@
1
+ import React, { useState } from 'react'
2
+ import { View, StyleSheet, type LayoutChangeEvent } from 'react-native'
3
+ import { COLORS, SPACING, BORDER_RADIUS } from '@magmamath/react-native-ui'
4
+
5
+ import { Dot } from './Dot'
6
+ import type { GridSpec, TokenTone } from '../types'
7
+ import type { VisualColors } from './visualColors'
8
+
9
+ const CELL_SIZE = 24
10
+ const CELL_GAP = 4
11
+ const FRAME_COLUMNS = 5
12
+ const TOKEN_SIZE = 14
13
+ const GROUP_COLUMNS = 5
14
+ const GROUP_PADDING = SPACING[200]
15
+ const GROUP_BORDER = 2
16
+ // Wide enough to fit GROUP_COLUMNS dots per row (incl. padding + border, border-box),
17
+ // so a group of five fills one row like the ten-frame instead of wrapping at four.
18
+ const GROUP_MAX_WIDTH = GROUP_COLUMNS * (TOKEN_SIZE + CELL_GAP) + 2 * GROUP_PADDING + 2 * GROUP_BORDER
19
+ // Max groups per row; groups are split into balanced rows (10 → 5+5, 20 → 5×4).
20
+ const GROUPS_PER_ROW_MAX = 5
21
+
22
+ // Budget the grid is allowed to occupy in the visual zone; bigger facts (e.g.
23
+ // 9 × 9 → many groups) are scaled down uniformly to fit rather than overflowing.
24
+ const FIT_W = 500
25
+ const FIT_H = 92
26
+
27
+ type Size = { width: number; height: number }
28
+
29
+ type DiscreteCounterGridProps = {
30
+ spec: GridSpec
31
+ colors: VisualColors
32
+ }
33
+
34
+ // L1 — renders absolute, discrete quantities to build a conceptual baseline.
35
+ export const DiscreteCounterGrid = ({ spec, colors }: DiscreteCounterGridProps) => {
36
+ const { layout } = spec
37
+ const [size, setSize] = useState<Size | null>(null)
38
+
39
+ const measure = (event: LayoutChangeEvent) => {
40
+ const { width, height } = event.nativeEvent.layout
41
+ setSize((prev) => (prev?.width === width && prev?.height === height ? prev : { width, height }))
42
+ }
43
+
44
+ // Shrink only when the natural size exceeds the budget; otherwise render 1:1.
45
+ const scale =
46
+ size && size.width > 0 && size.height > 0
47
+ ? Math.min(1, FIT_W / size.width, FIT_H / size.height)
48
+ : 1
49
+
50
+ const content = ((): React.ReactNode => {
51
+ switch (layout.type) {
52
+ case 'tenframes': {
53
+ // Pour `a` tone-A tokens then `b` tone-B tokens into the frame, filling it
54
+ // up; a second frame appears only once the sum spills past ten.
55
+ const total = layout.a + layout.b
56
+ const frameCount = total > layout.capacity ? 2 : 1
57
+ const cells = Array.from(
58
+ { length: layout.capacity * frameCount },
59
+ (_, i): TokenTone | null => {
60
+ if (i < layout.a) return 'a'
61
+ if (i < total) return 'b'
62
+ return null
63
+ },
64
+ )
65
+ return (
66
+ <View style={styles.frameRow}>
67
+ {Array.from({ length: frameCount }, (_, f) => (
68
+ <TenFrame
69
+ key={f}
70
+ tones={cells.slice(f * layout.capacity, (f + 1) * layout.capacity)}
71
+ colors={colors}
72
+ />
73
+ ))}
74
+ </View>
75
+ )
76
+ }
77
+ case 'tenframes_takeaway': {
78
+ // Fill `total` tokens (striking the last `removed`); a second frame shows
79
+ // only when the minuend spills past ten, matching the addition frames.
80
+ const frameCount = layout.total > layout.capacity ? 2 : 1
81
+ const cells = Array.from(
82
+ { length: layout.capacity * frameCount },
83
+ (_, i): TokenTone | null => {
84
+ if (i >= layout.total) return null
85
+ return i >= layout.total - layout.removed ? 'gone' : 'a'
86
+ },
87
+ )
88
+ return (
89
+ <View style={styles.frameRow}>
90
+ {Array.from({ length: frameCount }, (_, f) => (
91
+ <TenFrame
92
+ key={f}
93
+ tones={cells.slice(f * layout.capacity, (f + 1) * layout.capacity)}
94
+ colors={colors}
95
+ />
96
+ ))}
97
+ </View>
98
+ )
99
+ }
100
+ case 'array':
101
+ return (
102
+ <View style={styles.array}>
103
+ {Array.from({ length: layout.rows }, (_, r) => (
104
+ <View key={r} style={styles.arrayRow}>
105
+ {Array.from({ length: layout.cols }, (_, c) => (
106
+ <Dot key={c} color={colors.accent} size={TOKEN_SIZE} />
107
+ ))}
108
+ </View>
109
+ ))}
110
+ </View>
111
+ )
112
+ case 'groups': {
113
+ const rowCount = Math.max(1, Math.ceil(layout.groupCount / GROUPS_PER_ROW_MAX))
114
+ const perRow = Math.ceil(layout.groupCount / rowCount)
115
+ return (
116
+ <View style={styles.groupGrid}>
117
+ {Array.from({ length: rowCount }, (_, r) => (
118
+ <View key={r} style={styles.groupRow}>
119
+ {Array.from({ length: Math.min(perRow, layout.groupCount - r * perRow) }, (_, g) => (
120
+ <View key={g} style={[styles.group, { borderColor: colors.mid }]}>
121
+ {Array.from({ length: layout.perGroup }, (_, d) => (
122
+ <Dot key={d} color={colors.accent} size={TOKEN_SIZE} />
123
+ ))}
124
+ </View>
125
+ ))}
126
+ </View>
127
+ ))}
128
+ </View>
129
+ )
130
+ }
131
+ }
132
+ })()
133
+
134
+ return (
135
+ <View onLayout={measure} style={[styles.fit, { transform: [{ scale }] }]}>
136
+ {content}
137
+ </View>
138
+ )
139
+ }
140
+
141
+ type TenFrameProps = {
142
+ tones: Array<TokenTone | null>
143
+ colors: VisualColors
144
+ }
145
+
146
+ const TONE_COLOR = (tone: Exclude<TokenTone, 'gone'>, colors: VisualColors): string =>
147
+ tone === 'a' ? colors.accent : colors.mid
148
+
149
+ const TenFrame = ({ tones, colors }: TenFrameProps) => {
150
+ return (
151
+ <View style={styles.frame}>
152
+ {tones.map((tone, i) => (
153
+ <View key={i} style={styles.cell}>
154
+ {tone === 'gone' && <Dot color={colors.accent} strike size={TOKEN_SIZE} />}
155
+ {(tone === 'a' || tone === 'b') && (
156
+ <Dot color={TONE_COLOR(tone, colors)} size={TOKEN_SIZE} />
157
+ )}
158
+ </View>
159
+ ))}
160
+ </View>
161
+ )
162
+ }
163
+
164
+ const styles = StyleSheet.create({
165
+ // Measures its natural size; transform-scales down to the budget if it overflows.
166
+ fit: {
167
+ alignItems: 'center',
168
+ },
169
+ groupGrid: {
170
+ gap: SPACING[200],
171
+ alignItems: 'center',
172
+ },
173
+ frameRow: {
174
+ flexDirection: 'row',
175
+ gap: SPACING[300],
176
+ alignItems: 'center',
177
+ flexWrap: 'wrap',
178
+ justifyContent: 'center',
179
+ },
180
+ frame: {
181
+ width: FRAME_COLUMNS * CELL_SIZE + (FRAME_COLUMNS - 1) * CELL_GAP,
182
+ flexDirection: 'row',
183
+ flexWrap: 'wrap',
184
+ gap: CELL_GAP,
185
+ },
186
+ cell: {
187
+ width: CELL_SIZE,
188
+ height: CELL_SIZE,
189
+ borderRadius: 4,
190
+ borderWidth: 1.5,
191
+ borderColor: COLORS.NEUTRAL_5,
192
+ alignItems: 'center',
193
+ justifyContent: 'center',
194
+ },
195
+ array: {
196
+ gap: CELL_GAP + 2,
197
+ alignItems: 'center',
198
+ },
199
+ arrayRow: {
200
+ flexDirection: 'row',
201
+ gap: CELL_GAP + 2,
202
+ },
203
+ groupRow: {
204
+ flexDirection: 'row',
205
+ flexWrap: 'wrap',
206
+ gap: SPACING[200],
207
+ justifyContent: 'center',
208
+ alignItems: 'center',
209
+ },
210
+ group: {
211
+ flexDirection: 'row',
212
+ flexWrap: 'wrap',
213
+ // Shrink to fit the dots it holds (a single dot gets a small box); cap at
214
+ // five columns so larger groups wrap instead of stretching.
215
+ maxWidth: GROUP_MAX_WIDTH,
216
+ gap: CELL_GAP,
217
+ padding: GROUP_PADDING,
218
+ borderWidth: GROUP_BORDER,
219
+ borderRadius: BORDER_RADIUS[200],
220
+ backgroundColor: COLORS.NEUTRAL_2,
221
+ },
222
+ })
@@ -0,0 +1,36 @@
1
+ import React from 'react'
2
+ import { View, StyleSheet } from 'react-native'
3
+ import { COLORS } from '@magmamath/react-native-ui'
4
+
5
+ export const DOT_SIZE = 12
6
+
7
+ type DotProps = {
8
+ color: string
9
+ // Taken-away token: keep the fill, overlay a 45° strikethrough.
10
+ strike?: boolean
11
+ size?: number
12
+ }
13
+
14
+ // Shared quantity primitive: a filled circle.
15
+ export const Dot = ({ color, strike = false, size = DOT_SIZE }: DotProps) => {
16
+ const circle = { width: size, height: size, borderRadius: size / 2 }
17
+ return (
18
+ <View style={[circle, { backgroundColor: color }]}>
19
+ {strike && <View style={styles.strike} />}
20
+ </View>
21
+ )
22
+ }
23
+
24
+ const styles = StyleSheet.create({
25
+ strike: {
26
+ position: 'absolute',
27
+ top: '50%',
28
+ left: '-15%',
29
+ width: '130%',
30
+ height: 2,
31
+ marginTop: -1, // pull up half the height so the bar is centered, not top-aligned
32
+ borderRadius: 1, // round the stroke ends
33
+ backgroundColor: COLORS.NEUTRAL_10,
34
+ transform: [{ rotate: '-45deg' }],
35
+ },
36
+ })
@@ -0,0 +1,98 @@
1
+ import React from 'react'
2
+ import { View, StyleSheet } from 'react-native'
3
+ import Svg, { Line, Path, Circle, Text as SvgText } from 'react-native-svg'
4
+ import { COLORS, FONT_FAMILY } from '@magmamath/react-native-ui'
5
+
6
+ import type { LineSpec } from '../types'
7
+ import type { VisualColors } from './visualColors'
8
+
9
+ const VB_W = 560
10
+ const VB_H = 110
11
+ const PAD_X = 22
12
+ const BASE_Y = 74
13
+ const ARC_H = 56
14
+
15
+ type DynamicNumberLineProps = {
16
+ spec: LineSpec
17
+ colors: VisualColors
18
+ }
19
+
20
+ // L3 — addition jumps forward, subtraction backward; both bridge through every
21
+ // ten (jumps land on each multiple of 10 crossed). Multiplication skip-counts.
22
+ export const DynamicNumberLine = ({ spec, colors }: DynamicNumberLineProps) => {
23
+ const span = spec.hi - spec.lo
24
+ const denom = span === 0 ? 1 : span
25
+ const x = (v: number) => PAD_X + ((v - spec.lo) / denom) * (VB_W - 2 * PAD_X)
26
+
27
+ return (
28
+ <View style={styles.wrapper}>
29
+ <Svg width="100%" height="100%" viewBox={`0 0 ${VB_W} ${VB_H}`} preserveAspectRatio="xMidYMid meet">
30
+ <Line
31
+ x1={PAD_X - 14}
32
+ y1={BASE_Y}
33
+ x2={VB_W - PAD_X + 14}
34
+ y2={BASE_Y}
35
+ stroke={COLORS.NEUTRAL_5}
36
+ strokeWidth={3}
37
+ strokeLinecap="round"
38
+ />
39
+
40
+ {spec.ticks.map((value) => (
41
+ <React.Fragment key={`t${value}`}>
42
+ <Line x1={x(value)} y1={BASE_Y - 6} x2={x(value)} y2={BASE_Y + 6} stroke={COLORS.NEUTRAL_6} strokeWidth={3} />
43
+ <SvgText
44
+ x={x(value)}
45
+ y={BASE_Y + 25}
46
+ fontSize={20}
47
+ fontWeight="700"
48
+ fontFamily={FONT_FAMILY.buenosAires}
49
+ fill={COLORS.NEUTRAL_8}
50
+ textAnchor="middle"
51
+ >
52
+ {value === spec.hiddenTick ? '?' : value}
53
+ </SvgText>
54
+ </React.Fragment>
55
+ ))}
56
+
57
+ {spec.jumps.map((jump, i) => {
58
+ const midX = (x(jump.from) + x(jump.to)) / 2
59
+ return (
60
+ <React.Fragment key={`j${i}`}>
61
+ <Path
62
+ d={`M ${x(jump.from)} ${BASE_Y - 4} Q ${midX} ${BASE_Y - ARC_H - 12} ${x(jump.to)} ${BASE_Y - 4}`}
63
+ stroke={colors.accent}
64
+ strokeWidth={4}
65
+ fill="none"
66
+ />
67
+ <Circle cx={x(jump.to)} cy={BASE_Y} r={6.5} fill={colors.accent} />
68
+ <SvgText
69
+ x={midX}
70
+ y={BASE_Y - ARC_H - 1}
71
+ fontSize={20}
72
+ fontWeight="800"
73
+ fontFamily={FONT_FAMILY.buenosAires}
74
+ fill={colors.dark}
75
+ textAnchor="middle"
76
+ >
77
+ {jump.label}
78
+ </SvgText>
79
+ </React.Fragment>
80
+ )
81
+ })}
82
+
83
+ {spec.jumps.length > 0 && (
84
+ <Circle cx={x(spec.jumps[0].from)} cy={BASE_Y} r={6.5} fill={colors.accent} />
85
+ )}
86
+ </Svg>
87
+ </View>
88
+ )
89
+ }
90
+
91
+ const styles = StyleSheet.create({
92
+ wrapper: {
93
+ width: '100%',
94
+ maxWidth: VB_W,
95
+ aspectRatio: VB_W / VB_H,
96
+ alignSelf: 'center',
97
+ },
98
+ })
@@ -0,0 +1,61 @@
1
+ import React from 'react'
2
+ import { View, StyleSheet } from 'react-native'
3
+
4
+ import type { VisualSpec } from '../types'
5
+ import { DiscreteCounterGrid } from './DiscreteCounterGrid'
6
+ import { RelationalBlock } from './RelationalBlock'
7
+ import { DynamicNumberLine } from './DynamicNumberLine'
8
+ import { QuotativeBars } from './QuotativeBars'
9
+ import type { VisualColors } from './visualColors'
10
+
11
+ type FactVisualProps = {
12
+ spec: VisualSpec
13
+ colors: VisualColors
14
+ }
15
+
16
+ // Text alternative for the decorative-supportive visual.
17
+ const labelFor = (spec: VisualSpec): string => {
18
+ switch (spec.kind) {
19
+ case 'grid':
20
+ case 'relational':
21
+ case 'line':
22
+ case 'bars':
23
+ return `${spec.left} ${spec.operation} ${spec.right}`
24
+ case 'none':
25
+ return ''
26
+ }
27
+ }
28
+
29
+ const renderVisual = (spec: VisualSpec, colors: VisualColors) => {
30
+ switch (spec.kind) {
31
+ case 'grid':
32
+ return <DiscreteCounterGrid spec={spec} colors={colors} />
33
+ case 'relational':
34
+ return <RelationalBlock spec={spec} colors={colors} />
35
+ case 'line':
36
+ return <DynamicNumberLine spec={spec} colors={colors} />
37
+ case 'bars':
38
+ return <QuotativeBars spec={spec} colors={colors} />
39
+ case 'none':
40
+ return null
41
+ }
42
+ }
43
+
44
+ // Renders the scaffold for the current spec. Whether a visual shows at all is
45
+ // decided by the card (none at L4/L5); this component just draws it.
46
+ export const FactVisual = ({ spec, colors }: FactVisualProps) => {
47
+ if (spec.kind === 'none') return null
48
+
49
+ return (
50
+ <View style={styles.container} accessible accessibilityLabel={labelFor(spec)}>
51
+ {renderVisual(spec, colors)}
52
+ </View>
53
+ )
54
+ }
55
+
56
+ const styles = StyleSheet.create({
57
+ container: {
58
+ alignItems: 'center',
59
+ justifyContent: 'center',
60
+ },
61
+ })
@@ -0,0 +1,92 @@
1
+ import React from 'react'
2
+ import { View, StyleSheet } from 'react-native'
3
+ import Svg, { Rect, Path, Text as SvgText } from 'react-native-svg'
4
+ import { COLORS, FONT_FAMILY } from '@magmamath/react-native-ui'
5
+
6
+ import type { BarSpec } from '../types'
7
+ import type { VisualColors } from './visualColors'
8
+
9
+ const VB_W = 480
10
+ const VB_H = 98
11
+ const PAD_X = 24
12
+ const BAR_Y = 12
13
+ const BAR_H = 46
14
+ const BRACKET_Y = BAR_Y + BAR_H + 8
15
+
16
+ type QuotativeBarsProps = {
17
+ spec: BarSpec
18
+ colors: VisualColors
19
+ }
20
+
21
+ // L2 (division) — quotative model: the dividend bar is cut into equal groups of
22
+ // the divisor; counting the groups gives the quotient (the answer).
23
+ export const QuotativeBars = ({ spec, colors }: QuotativeBarsProps) => {
24
+ const segments = Math.max(1, spec.segmentCount)
25
+ const barW = VB_W - 2 * PAD_X
26
+ const segW = barW / segments
27
+
28
+ return (
29
+ <View style={styles.wrapper}>
30
+ <Svg width="100%" height="100%" viewBox={`0 0 ${VB_W} ${VB_H}`} preserveAspectRatio="xMidYMid meet">
31
+ {Array.from({ length: segments }, (_, i) => {
32
+ const x = PAD_X + i * segW
33
+ return (
34
+ <React.Fragment key={i}>
35
+ <Rect
36
+ x={x}
37
+ y={BAR_Y}
38
+ width={segW}
39
+ height={BAR_H}
40
+ rx={6}
41
+ fill={i % 2 === 0 ? colors.bg : colors.mid}
42
+ stroke={colors.accent}
43
+ strokeWidth={2.5}
44
+ />
45
+ <SvgText
46
+ x={x + segW / 2}
47
+ y={BAR_Y + BAR_H / 2 + 7}
48
+ fontSize={20}
49
+ fontWeight="700"
50
+ fontFamily={FONT_FAMILY.buenosAires}
51
+ fill={colors.dark}
52
+ textAnchor="middle"
53
+ >
54
+ {spec.segment}
55
+ </SvgText>
56
+ </React.Fragment>
57
+ )
58
+ })}
59
+
60
+ {/* Bracket spanning the whole bar, drawn as one continuous line. */}
61
+ <Path
62
+ d={`M ${PAD_X} ${BRACKET_Y} L ${PAD_X} ${BRACKET_Y + 6} L ${VB_W - PAD_X} ${BRACKET_Y + 6} L ${VB_W - PAD_X} ${BRACKET_Y}`}
63
+ fill="none"
64
+ stroke={COLORS.NEUTRAL_6}
65
+ strokeWidth={2.5}
66
+ strokeLinecap="round"
67
+ strokeLinejoin="round"
68
+ />
69
+ <SvgText
70
+ x={VB_W / 2}
71
+ y={BRACKET_Y + 20}
72
+ fontSize={15}
73
+ fontWeight="700"
74
+ fontFamily={FONT_FAMILY.buenosAires}
75
+ fill={COLORS.NEUTRAL_8}
76
+ textAnchor="middle"
77
+ >
78
+ {spec.total}
79
+ </SvgText>
80
+ </Svg>
81
+ </View>
82
+ )
83
+ }
84
+
85
+ const styles = StyleSheet.create({
86
+ wrapper: {
87
+ width: '100%',
88
+ maxWidth: VB_W,
89
+ aspectRatio: VB_W / VB_H,
90
+ alignSelf: 'center',
91
+ },
92
+ })