@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
@@ -53,10 +53,6 @@ export const EquationContent = ({
53
53
  }: EquationContentProps) => {
54
54
  const t = useText()
55
55
  const modePreset = useFluencySolvingPreset({ mode })
56
- const labelColor = status ? STATUS_COLOR[status] : COLORS.NEUTRAL_7
57
- const labelText = status
58
- ? t(STATUS_LABELS[status], { answer: correctAnswer })
59
- : t('student.fluency.typeYourAnswer')
60
56
  const answerAreaColor =
61
57
  status === AttemptStatus.INCORRECT ? COLORS.PRIMARY_RED : modePreset.colors.accent
62
58
 
@@ -65,9 +61,14 @@ export const EquationContent = ({
65
61
 
66
62
  return (
67
63
  <>
68
- <Typography variant={HeadingVariants.H9} style={[styles.cardLabel, { color: labelColor }]}>
69
- {labelText}
70
- </Typography>
64
+ {status && (
65
+ <Typography
66
+ variant={HeadingVariants.H9}
67
+ style={[styles.cardLabel, { color: STATUS_COLOR[status] }]}
68
+ >
69
+ {t(STATUS_LABELS[status], { answer: correctAnswer })}
70
+ </Typography>
71
+ )}
71
72
  <View style={styles.equationRow}>
72
73
  <Typography style={styles.number}>{leftOperand}</Typography>
73
74
  <Typography style={[styles.number, { color: modePreset.colors.accent }]}>
@@ -107,7 +108,10 @@ const styles = StyleSheet.create({
107
108
  flexDirection: 'row',
108
109
  alignItems: 'center',
109
110
  gap: SPACING[300],
110
- marginTop: SPACING[600],
111
+ // The answer input hangs ~16px below the number row; counting that here
112
+ // makes the row's measured box match its visual extent, so the parent
113
+ // centers the equation accurately at any card height (visual or mastered).
114
+ paddingBottom: SPACING[400],
111
115
  },
112
116
  number: {
113
117
  fontSize: 75,
@@ -45,7 +45,11 @@ export const FluencyCardDeck = ({
45
45
  <Animated.View style={[styles.card, styles.cardMid, snapStyles.mid]} />
46
46
 
47
47
  <Animated.View style={[styles.card, styles.cardNear, snapStyles.near]}>
48
- <FluencyEquationCard cardContent={backingCardContent} readOnly />
48
+ <FluencyEquationCard
49
+ cardContent={backingCardContent}
50
+ readOnly
51
+ showVisual={!!exitingCardContent}
52
+ />
49
53
  </Animated.View>
50
54
 
51
55
  {!exitingCardContent && (
@@ -92,6 +96,7 @@ const styles = StyleSheet.create({
92
96
  height: 260,
93
97
  borderRadius: BORDER_RADIUS[400],
94
98
  backgroundColor: COLORS.NEUTRAL_1,
99
+ overflow: 'hidden',
95
100
  ...SHADOWS[5],
96
101
  },
97
102
  cardFar: {
@@ -1,6 +1,9 @@
1
1
  import React from 'react'
2
+ import { View, StyleSheet } from 'react-native'
3
+ import { SPACING } from '@magmamath/react-native-ui'
2
4
 
3
5
  import { EquationContent } from './EquationContent'
6
+ import { FactVisual, renderFact, toFactPresentation, VISUAL_COLORS } from '../../../visual-scaffolding'
4
7
  import type { FluencyCardDisplayContent, SolvingFact } from '../../../shared/fluencySolving.types'
5
8
  import type { AttemptStatus, FluencyMode } from '../../../shared/fluency.constants'
6
9
 
@@ -14,6 +17,10 @@ type FluencyEquationCardProps = {
14
17
  cardContent: FluencyCardDisplayContent
15
18
  readOnly?: boolean
16
19
  status?: AttemptStatus
20
+ // Whether to render the visual. The deck enables it on the active card, the
21
+ // exiting card, and the backing card *while it steps up*, so the visual is
22
+ // present as fast as the equation (no pop-in after the swipe).
23
+ showVisual?: boolean
17
24
  onAnswerChange?: (text: string) => void
18
25
  }
19
26
 
@@ -32,20 +39,65 @@ export const FluencyEquationCard = ({
32
39
  cardContent,
33
40
  readOnly = false,
34
41
  status,
42
+ showVisual = true,
35
43
  onAnswerChange,
36
44
  }: FluencyEquationCardProps) => {
37
- const equation = getDisplayedEquation(cardContent.fact)
45
+ const { fact } = cardContent
46
+ const equation = getDisplayedEquation(fact)
47
+
48
+ const presentation = fact && showVisual ? toFactPresentation(fact) : null
49
+ const spec = presentation ? renderFact(presentation) : null
50
+ const colors = presentation ? VISUAL_COLORS[presentation.operation] : null
51
+ // Narrow away the "none" variant (L4/L5 → no visual).
52
+ const visualSpec = spec && spec.kind !== 'none' ? spec : null
38
53
 
39
54
  return (
40
- <EquationContent
41
- leftOperand={equation.leftOperand}
42
- rightOperand={equation.rightOperand}
43
- mode={equation.mode}
44
- value={cardContent.answer}
45
- readOnly={readOnly}
46
- status={status}
47
- correctAnswer={cardContent.fact?.answer}
48
- onChange={onAnswerChange}
49
- />
55
+ <View style={styles.body}>
56
+ {visualSpec && colors && (
57
+ <View style={[styles.visualZone, { backgroundColor: colors.bg }]}>
58
+ <FactVisual spec={visualSpec} colors={colors} />
59
+ </View>
60
+ )}
61
+ <View style={styles.eqZone}>
62
+ <EquationContent
63
+ leftOperand={equation.leftOperand}
64
+ rightOperand={equation.rightOperand}
65
+ mode={equation.mode}
66
+ value={cardContent.answer}
67
+ readOnly={readOnly}
68
+ status={status}
69
+ correctAnswer={fact?.answer}
70
+ onChange={onAnswerChange}
71
+ />
72
+ </View>
73
+ </View>
50
74
  )
51
75
  }
76
+
77
+ const styles = StyleSheet.create({
78
+ body: {
79
+ flex: 1,
80
+ alignSelf: 'stretch',
81
+ },
82
+ // Tinted top zone (background set per operation), ~40% of the card height.
83
+ // Clips oversized visuals so the fixed-size card never grows.
84
+ visualZone: {
85
+ flex: 4,
86
+ alignSelf: 'stretch',
87
+ alignItems: 'center',
88
+ justifyContent: 'center',
89
+ overflow: 'hidden',
90
+ paddingVertical: SPACING[200],
91
+ paddingHorizontal: SPACING[400],
92
+ },
93
+ // White equation zone, ~60% of the card height. The equation is centered so
94
+ // it keeps whitespace above and below (and clears the negative-margin answer
95
+ // input under the card's overflow:hidden clip).
96
+ eqZone: {
97
+ flex: 6,
98
+ alignSelf: 'stretch',
99
+ alignItems: 'center',
100
+ justifyContent: 'center',
101
+ paddingHorizontal: SPACING[400],
102
+ },
103
+ })
@@ -13,6 +13,7 @@ import {
13
13
  Typography,
14
14
  } from '@magmamath/react-native-ui'
15
15
  import { useFluencySolvingPreset } from '../../../hooks/useFluencySolvingPreset'
16
+ import { FluencySolvingProgress } from './FluencySolvingProgress'
16
17
  import { XCloseIcon } from '../../../../../shared/icons/XCloseIcon'
17
18
 
18
19
  type FluencySolvingHeaderProps = {
@@ -39,6 +40,9 @@ export const FluencySolvingHeader = ({ onClosePress }: FluencySolvingHeaderProps
39
40
  <Typography variant={HeadingVariants.H4} style={styles.title}>
40
41
  {modePreset.label}
41
42
  </Typography>
43
+ <View style={styles.progress} pointerEvents="none">
44
+ <FluencySolvingProgress />
45
+ </View>
42
46
  </View>
43
47
  )
44
48
  }
@@ -54,6 +58,11 @@ const styles = StyleSheet.create({
54
58
  backgroundColor: COLORS.NEUTRAL_1,
55
59
  ...SHADOWS[1],
56
60
  },
61
+ progress: {
62
+ ...StyleSheet.absoluteFillObject,
63
+ alignItems: 'center',
64
+ justifyContent: 'center',
65
+ },
57
66
  operatorBadge: {
58
67
  width: 32,
59
68
  height: 32,
@@ -50,8 +50,6 @@ const styles = StyleSheet.create({
50
50
  container: {
51
51
  flexDirection: 'row',
52
52
  gap: SPACING[500],
53
- paddingHorizontal: SPACING[600],
54
- paddingVertical: 14,
55
53
  justifyContent: 'center',
56
54
  alignItems: 'center',
57
55
  },
@@ -1,6 +1,7 @@
1
1
  export * from './shared/fluency.constants'
2
2
  export * from './shared/fluency.types'
3
3
  export * from './shared/fluency.helpers'
4
+ export * from './visual-scaffolding'
4
5
  export { Fluency } from './components/Fluency'
5
6
  export { FluencySolving } from './components/FluencySolving'
6
7
  export { FluencyModel } from './model/FluencyModel'
@@ -0,0 +1,64 @@
1
+ // Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
2
+
3
+ exports[`L1 — DiscreteCounterGrid (box 0) addition 6 + 9 → two ten-frames, a tone-A + b tone-B 1`] = `
4
+ {
5
+ "kind": "grid",
6
+ "layout": {
7
+ "a": 6,
8
+ "b": 9,
9
+ "capacity": 10,
10
+ "type": "tenframes",
11
+ },
12
+ "left": 6,
13
+ "level": "L1",
14
+ "operation": "addition",
15
+ "right": 9,
16
+ }
17
+ `;
18
+
19
+ exports[`L2 — RelationalBlock (box 1) addition → bond with empty sum (top) node 1`] = `
20
+ {
21
+ "kind": "relational",
22
+ "left": 6,
23
+ "level": "L2",
24
+ "model": {
25
+ "bottomLeft": 6,
26
+ "bottomRight": 9,
27
+ "top": null,
28
+ "type": "bond",
29
+ },
30
+ "operation": "addition",
31
+ "right": 9,
32
+ }
33
+ `;
34
+
35
+ exports[`L3 — DynamicNumberLine (box 2) addition 7 + 6 → bridges 10 (7→10→13), end tick hidden 1`] = `
36
+ {
37
+ "hi": 13,
38
+ "hiddenTick": 13,
39
+ "jumps": [
40
+ {
41
+ "from": 7,
42
+ "label": "+3",
43
+ "to": 10,
44
+ },
45
+ {
46
+ "from": 10,
47
+ "label": "+3",
48
+ "to": 13,
49
+ },
50
+ ],
51
+ "kind": "line",
52
+ "left": 7,
53
+ "level": "L3",
54
+ "lo": 0,
55
+ "operation": "addition",
56
+ "right": 6,
57
+ "ticks": [
58
+ 0,
59
+ 7,
60
+ 10,
61
+ 13,
62
+ ],
63
+ }
64
+ `;
@@ -0,0 +1,192 @@
1
+ import { renderFact, levelForBox, hasVisual } from '../renderFact'
2
+ import type { FactPresentation } from '../types'
3
+
4
+ describe('levelForBox', () => {
5
+ it.each([
6
+ [0, 'L1'],
7
+ [1, 'L2'],
8
+ [2, 'L3'],
9
+ [3, 'L4'],
10
+ [4, 'L5'],
11
+ ] as const)('box %i → %s', (box, level) => {
12
+ expect(levelForBox(box)).toBe(level)
13
+ })
14
+ })
15
+
16
+ const fact = (
17
+ p: Partial<FactPresentation> & Pick<FactPresentation, 'operation'>,
18
+ ): FactPresentation => ({ left: 0, right: 0, box: 0, ...p })
19
+
20
+ describe('L1 — DiscreteCounterGrid (box 0)', () => {
21
+ it('addition 6 + 9 → two ten-frames, a tone-A + b tone-B', () => {
22
+ const spec = renderFact(fact({ operation: 'addition', left: 6, right: 9, box: 0 }))
23
+ expect(spec).toMatchSnapshot()
24
+ if (spec.kind !== 'grid' || spec.layout.type !== 'tenframes') throw new Error('expected tenframes')
25
+ expect(spec.layout.a).toBe(6)
26
+ expect(spec.layout.b).toBe(9)
27
+ expect(spec.layout.capacity).toBe(10)
28
+ })
29
+
30
+ it('subtraction 15 − 9 → fill 15, strike last 9', () => {
31
+ const spec = renderFact(fact({ operation: 'subtraction', left: 15, right: 9, box: 0 }))
32
+ if (spec.kind !== 'grid' || spec.layout.type !== 'tenframes_takeaway') throw new Error('bad')
33
+ expect(spec.layout.total).toBe(15)
34
+ expect(spec.layout.removed).toBe(9)
35
+ })
36
+
37
+ it('multiplication 3 × 4 → 3 groups of 4', () => {
38
+ const spec = renderFact(fact({ operation: 'multiplication', left: 3, right: 4, box: 0 }))
39
+ if (spec.kind !== 'grid' || spec.layout.type !== 'groups') throw new Error('expected groups')
40
+ expect(spec.layout.groupCount).toBe(3)
41
+ expect(spec.layout.perGroup).toBe(4)
42
+ })
43
+
44
+ it('division 12 ÷ 4 → 3 clusters of 4', () => {
45
+ const spec = renderFact(fact({ operation: 'division', left: 12, right: 4, box: 0 }))
46
+ if (spec.kind !== 'grid' || spec.layout.type !== 'groups') throw new Error('expected groups')
47
+ expect(spec.layout.groupCount).toBe(3)
48
+ expect(spec.layout.perGroup).toBe(4)
49
+ })
50
+ })
51
+
52
+ describe('L2 — RelationalBlock (box 1)', () => {
53
+ it('addition → bond with empty sum (top) node', () => {
54
+ const spec = renderFact(fact({ operation: 'addition', left: 6, right: 9, box: 1 }))
55
+ expect(spec).toMatchSnapshot()
56
+ if (spec.kind !== 'relational' || spec.model.type !== 'bond') throw new Error('expected bond')
57
+ expect(spec.model.top).toBeNull()
58
+ expect(spec.model.bottomLeft).toBe(6)
59
+ expect(spec.model.bottomRight).toBe(9)
60
+ })
61
+
62
+ it('subtraction → bond with empty part (bottom-right) node', () => {
63
+ const spec = renderFact(fact({ operation: 'subtraction', left: 15, right: 9, box: 1 }))
64
+ if (spec.kind !== 'relational' || spec.model.type !== 'bond') throw new Error('expected bond')
65
+ expect(spec.model.top).toBe(15)
66
+ expect(spec.model.bottomLeft).toBe(9)
67
+ expect(spec.model.bottomRight).toBeNull()
68
+ })
69
+
70
+ it('multiplication (box 1) → number line: three +4 hops, end hidden', () => {
71
+ const spec = renderFact(fact({ operation: 'multiplication', left: 3, right: 4, box: 1 }))
72
+ if (spec.kind !== 'line') throw new Error('expected line')
73
+ expect(spec.jumps.map((j) => j.to)).toEqual([4, 8, 12])
74
+ expect(spec.ticks).toEqual([0, 4, 8, 12])
75
+ expect(spec.hiddenTick).toBe(12)
76
+ })
77
+
78
+ it('division (box 1) → quotative bars: 3 groups of 4 spanning 12', () => {
79
+ const spec = renderFact(fact({ operation: 'division', left: 12, right: 4, box: 1 }))
80
+ if (spec.kind !== 'bars') throw new Error('expected bars')
81
+ expect(spec.total).toBe(12)
82
+ expect(spec.segment).toBe(4)
83
+ expect(spec.segmentCount).toBe(3)
84
+ })
85
+ })
86
+
87
+ describe('L3 — DynamicNumberLine (box 2)', () => {
88
+ it('addition 7 + 6 → bridges 10 (7→10→13), end tick hidden', () => {
89
+ const spec = renderFact(fact({ operation: 'addition', left: 7, right: 6, box: 2 }))
90
+ expect(spec).toMatchSnapshot()
91
+ if (spec.kind !== 'line') throw new Error('expected line')
92
+ expect(spec.jumps).toEqual([
93
+ { from: 7, to: 10, label: '+3' },
94
+ { from: 10, to: 13, label: '+3' },
95
+ ])
96
+ expect(spec.ticks).toEqual([0, 7, 10, 13])
97
+ expect(spec.hiddenTick).toBe(13)
98
+ })
99
+
100
+ it('addition 4 + 3 → single jump, no bridge', () => {
101
+ const spec = renderFact(fact({ operation: 'addition', left: 4, right: 3, box: 2 }))
102
+ if (spec.kind !== 'line') throw new Error('expected line')
103
+ expect(spec.jumps).toEqual([{ from: 4, to: 7, label: '+3' }])
104
+ expect(spec.ticks).toEqual([0, 4, 7])
105
+ })
106
+
107
+ it('subtraction 13 − 5 → backward, bridges 10 (13→10→8)', () => {
108
+ const spec = renderFact(fact({ operation: 'subtraction', left: 13, right: 5, box: 2 }))
109
+ if (spec.kind !== 'line') throw new Error('expected line')
110
+ expect(spec.jumps).toEqual([
111
+ { from: 13, to: 10, label: '−3' },
112
+ { from: 10, to: 8, label: '−2' },
113
+ ])
114
+ expect(spec.lo).toBe(8)
115
+ expect(spec.hi).toBe(13)
116
+ expect(spec.hiddenTick).toBe(8)
117
+ })
118
+
119
+ it('addition 8 + 15 → bridges every ten (8→10→20→23)', () => {
120
+ const spec = renderFact(fact({ operation: 'addition', left: 8, right: 15, box: 2 }))
121
+ if (spec.kind !== 'line') throw new Error('expected line')
122
+ expect(spec.jumps).toEqual([
123
+ { from: 8, to: 10, label: '+2' },
124
+ { from: 10, to: 20, label: '+10' },
125
+ { from: 20, to: 23, label: '+3' },
126
+ ])
127
+ expect(spec.ticks).toEqual([0, 8, 10, 20, 23])
128
+ expect(spec.hiddenTick).toBe(23)
129
+ })
130
+
131
+ it('subtraction 23 − 15 → steps back through every ten (23→20→10→8)', () => {
132
+ const spec = renderFact(fact({ operation: 'subtraction', left: 23, right: 15, box: 2 }))
133
+ if (spec.kind !== 'line') throw new Error('expected line')
134
+ expect(spec.jumps).toEqual([
135
+ { from: 23, to: 20, label: '−3' },
136
+ { from: 20, to: 10, label: '−10' },
137
+ { from: 10, to: 8, label: '−2' },
138
+ ])
139
+ expect(spec.ticks).toEqual([8, 10, 20, 23])
140
+ expect(spec.hiddenTick).toBe(8)
141
+ })
142
+
143
+ it('multiplication (box 2) → area model with empty center (first factor = vertical side)', () => {
144
+ const spec = renderFact(fact({ operation: 'multiplication', left: 3, right: 4, box: 2 }))
145
+ if (spec.kind !== 'relational' || spec.model.type !== 'area') throw new Error('expected area')
146
+ // "3×4" = 3 rows of 4: left (3) → height (side), right (4) → width (top).
147
+ expect(spec.model.top).toBe(4)
148
+ expect(spec.model.side).toBe(3)
149
+ expect(spec.model.center).toBeNull()
150
+ })
151
+
152
+ it('division (box 2) → area model with empty side, dividend in center', () => {
153
+ const spec = renderFact(fact({ operation: 'division', left: 12, right: 4, box: 2 }))
154
+ if (spec.kind !== 'relational' || spec.model.type !== 'area') throw new Error('expected area')
155
+ expect(spec.model.top).toBe(4)
156
+ expect(spec.model.side).toBeNull()
157
+ expect(spec.model.center).toBe(12)
158
+ })
159
+ })
160
+
161
+ describe('L4 / L5 — no visual', () => {
162
+ it.each([3, 4] as const)('box %i → none', (box) => {
163
+ const spec = renderFact(fact({ operation: 'multiplication', left: 7, right: 8, box }))
164
+ expect(spec.kind).toBe('none')
165
+ expect(hasVisual(fact({ operation: 'multiplication', left: 7, right: 8, box }))).toBe(false)
166
+ })
167
+ })
168
+
169
+ describe('orientation matches the prompt', () => {
170
+ it('3×4 ≠ 4×3 as L1 groups (first factor = number of groups)', () => {
171
+ const a = renderFact(fact({ operation: 'multiplication', left: 3, right: 4, box: 0 }))
172
+ const b = renderFact(fact({ operation: 'multiplication', left: 4, right: 3, box: 0 }))
173
+ if (a.kind !== 'grid' || a.layout.type !== 'groups') throw new Error('bad')
174
+ if (b.kind !== 'grid' || b.layout.type !== 'groups') throw new Error('bad')
175
+ expect([a.layout.groupCount, a.layout.perGroup]).toEqual([3, 4])
176
+ expect([b.layout.groupCount, b.layout.perGroup]).toEqual([4, 3])
177
+ })
178
+ })
179
+
180
+ describe('defensive guards', () => {
181
+ it('subtracting more than the minuend clamps removed', () => {
182
+ const spec = renderFact(fact({ operation: 'subtraction', left: 3, right: 9, box: 0 }))
183
+ if (spec.kind !== 'grid' || spec.layout.type !== 'tenframes_takeaway') throw new Error('bad')
184
+ expect(spec.layout.removed).toBe(3)
185
+ })
186
+
187
+ it('division by zero does not throw', () => {
188
+ const spec = renderFact(fact({ operation: 'division', left: 8, right: 0, box: 0 }))
189
+ if (spec.kind !== 'grid' || spec.layout.type !== 'groups') throw new Error('bad')
190
+ expect(spec.layout.groupCount).toBe(0)
191
+ })
192
+ })
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Adapts the fluency model's `SolvingFact` (the shape held in
3
+ * `FluencyModel.solving.$current`) to the pure `FactPresentation` contract.
4
+ *
5
+ * The picker has already resolved the presented direction, so `numbers` is in
6
+ * prompt order: numbers[0] = left, numbers[1] = right. `mode` is the operation
7
+ * (its enum values match `Operation` exactly), and `box` is the Leitner box.
8
+ */
9
+ import { FluencyMode } from '../shared/fluency.constants'
10
+ import type { SolvingFact } from '../shared/fluencySolving.types'
11
+ import type { FactPresentation, Operation } from './types'
12
+
13
+ const MODE_TO_OPERATION: Record<FluencyMode, Operation> = {
14
+ [FluencyMode.ADDITION]: 'addition',
15
+ [FluencyMode.SUBTRACTION]: 'subtraction',
16
+ [FluencyMode.MULTIPLICATION]: 'multiplication',
17
+ [FluencyMode.DIVISION]: 'division',
18
+ }
19
+
20
+ const clampBox = (box: number): FactPresentation['box'] => {
21
+ const clamped = Math.max(0, Math.min(4, Math.round(box)))
22
+ return clamped as FactPresentation['box']
23
+ }
24
+
25
+ export function toFactPresentation(fact: SolvingFact): FactPresentation {
26
+ const [left, right] = fact.numbers
27
+ return {
28
+ operation: MODE_TO_OPERATION[fact.mode],
29
+ left,
30
+ right,
31
+ box: clampBox(fact.box),
32
+ }
33
+ }