Animation for Clear Dead Frames button#3726
Animation for Clear Dead Frames button#3726RichDom2185 merged 61 commits intosource-academy:masterfrom
Conversation
Only dead frames disappear as of right now, for function objects and the rest, work to be done Animations : will be done by Keying!
function closure objects Generic Arrow Text (recursively automated) Arrays and hence pairs as well
Finally processed the logic by recomputing the envTree for the specific step when the toggle is on
Currently, the animations do not play. Putting these changes into a branch because I want to save these changes so that I can fully rewrite playClearDeadFramesAnim() while having a backup in case my new idea does not work.
After clicking Clear Dead Frames, frames that get shifted (to close gaps) now have an animation moving from their old position to their new position. To do: - animate other objects, not just frames - possibly cover up the "new frames" before the animation finishes
Now you cannot see the new frames before the frame shifting animation finishes.
Test code (for my own easy access):
function foo() {
function f(x) {
return y => x + 3;
}
return f;
}
foo()(4);
foo()(5);
To do:
- Make frame text (from bindings) move with the frame. This should be implemented with AnimatedTextComponent rather than AnimatedTextbox because there are multiple bindings per frame and the texts are linked to each binding rather than its frame.
- Consider whether the frame's name (text) should move along with the frame.
- Consider whether arrows should be animated (likely not, as the arrows can change shape so it might look weird / be hard to implement).
- Move function objects and arrays along with the frame.
commit 2979582 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Tue Mar 17 00:23:22 2026 +0000 chore(deps): update blueprintjs to v6.10.0 (source-academy#3673) * chore(deps): update blueprintjs to v6.10.0 * Update test snapshots --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Richard Dominick <34370238+RichDom2185@users.noreply.github.com> commit 9aef777 Author: Richard Dominick <34370238+RichDom2185@users.noreply.github.com> Date: Tue Mar 17 01:00:27 2026 +0800 Upgrade jsdom to v29 (source-academy#3672) * Upgrade jsdom to v29 * Update some snapshots * Fix tests * Increase test timeout commit 0ab537b Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Mar 16 16:06:50 2026 +0000 chore(deps): update dependency eslint-plugin-react-hooks to v7 (source-academy#3484) * chore(deps): update dependency eslint-plugin-react-hooks to v7 * Fix breaking changes --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Richard Dominick <34370238+RichDom2185@users.noreply.github.com> commit 5184d62 Author: Richard Dominick <34370238+RichDom2185@users.noreply.github.com> Date: Mon Mar 16 23:54:40 2026 +0800 Fix concurrent precache logic (source-academy#3671) * Create own copy of precaching-striping * Remove old version * Update SW * Fix `this` binding commit 2d06530 Author: Richard Dominick <34370238+RichDom2185@users.noreply.github.com> Date: Mon Mar 16 23:23:42 2026 +0800 Upgrade Vite/Vitest ecosystem dependencies to v8 (source-academy#3670) * Use modern `paths` format for tsconfig * Fix type imports * Upgrade Vite ecosystem to v8 * Fix missing await commit 4de3cfa Author: Richard Dominick <34370238+RichDom2185@users.noreply.github.com> Date: Mon Mar 16 23:19:34 2026 +0800 Concurrently precache assets (source-academy#3669) * Add precache-striping * Clean up rsbuild config * Remove now-unneeded Node polyfills * Fetch assets concurrently commit 01b028f Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Mar 16 22:50:53 2026 +0800 chore(deps): update dependency i18next to v25.8.18 (source-academy#3668) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 7e34573 Author: Richard Dominick <34370238+RichDom2185@users.noreply.github.com> Date: Mon Mar 16 22:45:11 2026 +0800 Group Renovate BlueprintJS updates (source-academy#3666) * Set up Renovate dep groups * Undo dev-deps groupign commit 07e9128 Author: Akshay-2007-1 <131676168+Akshay-2007-1@users.noreply.github.com> Date: Mon Mar 16 22:34:18 2026 +0800 CSE Machine : Fix nano bugs (source-academy#3667) * Fix nano bugs * Fix unnormalized line endings --------- Co-authored-by: Richard Dominick <34370238+RichDom2185@users.noreply.github.com> commit 5767324 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Mar 16 13:21:04 2026 +0000 chore(deps): update dependency react-i18next to v16.5.7 (source-academy#3664) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit c228254 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Mar 16 13:16:28 2026 +0000 chore(deps): update dependency @rsbuild/plugin-svgr to v1.3.1 (source-academy#3663) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 0095e10 Author: Richard Dominick <34370238+RichDom2185@users.noreply.github.com> Date: Mon Mar 16 21:12:49 2026 +0800 Upgrade React ecosystem dependencies to v19 (source-academy#3247) * Upgrade React ecosystem dependencies to v19 * Fix some breaking changes * Fix more breaking changes * Fix remaining codebase errors * Fix some test errors * Update AcademyNavigationBar.tsx * Fix remaining test error * Fix missed type bug * Remove deprecated react-test-renderer * Delete useless test * Update some snapshots * Update more snapshots * Fix some tests and snapshots * Update more snapshots * Update Repl tests * Update editor tests * Update lockfile post-merge * Fix JSX namespace errors * Update dependencies post-merge * Deduplicate dependencies * Update snapshots post-merge * Update lockfile post-merge * Update snapshots * Fix breaking type changes * Remove shallow render * Remove shallow render from tests * Remove unused import * Fix more tests * Clean up snapshots * Fix tests double render * Update snapshots * Replace react-sortable-hoc with dnd-kit * Update dep constraints * Install `@dnd-kit/core` * Migrate sortable list to dnd-kit * Fix tests rendering * Add TODOs * Address phantom dependency commit c928c31 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Mar 16 10:54:21 2026 +0000 chore(deps): update dependency sass to v1.98.0 (source-academy#3657) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 307a8d1 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Mar 16 10:50:20 2026 +0000 chore(deps): update dependency @rsbuild/plugin-sass to v1.5.1 (source-academy#3661) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit b132f3b Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Mar 16 10:46:40 2026 +0000 chore(deps): update dependency @rsbuild/plugin-react to v1.4.6 (source-academy#3660) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 9db226b Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Mar 16 10:42:57 2026 +0000 chore(deps): update dependency dompurify to v3.3.3 (source-academy#3658) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 298b27f Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Mar 16 18:37:22 2026 +0800 chore(deps): update dependency @sentry/react to v10.43.0 (source-academy#3656) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 7f33412 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Sun Mar 15 12:27:50 2026 +0000 chore(deps): update dependency typescript-eslint to v8.57.0 (source-academy#3654) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 20933ef Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Sun Mar 15 12:23:36 2026 +0000 chore(deps): update dependency react-simple-keyboard to v3.8.172 (source-academy#3655) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 93ec2a6 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Sun Mar 15 12:19:41 2026 +0000 chore(deps): update dependency eslint to v9.39.4 (source-academy#3649) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 0024c6a Author: Roger Zhang <rogerteo200@gmail.com> Date: Sun Mar 15 20:16:24 2026 +0800 QOL: Arrows bending too early or too late (source-academy#3653) * feat: colour-coding arrows * feat: removed colour-coding for arrows (all white), implemented feature where clicked arrows remain highlighted * fix: removed whitespace * fix: bugfix and linting * test2 * fix: Refactor arrow selection management and clean up code style * fix: ran linter * fix: snapshots * fix: change to american english for the word "color" * fix: faded arrows now stay faded * test * test * fix: prematurely terminating arrows * added global MinTerminalSegmentLength commit 4b9af0d Author: Akshay-2007-1 <131676168+Akshay-2007-1@users.noreply.github.com> Date: Fri Mar 13 17:56:39 2026 +0800 CSE Machine : Fixes Cache and Arrow displacement errors (source-academy#3650) * Fixed arrow change! * Fixed the cache difference issue * Fixed tsc error - II commit ff7ab4f Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Wed Mar 11 14:23:57 2026 +0800 chore(deps): update dependency react-i18next to v16.5.5 (source-academy#3648) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit b822ca5 Author: Ho Ke Ying <168710875+Oofky@users.noreply.github.com> Date: Wed Mar 11 01:09:26 2026 +0800 Changed hotkey for hulk mode (source-academy#3647) Changed from alt+shift+h to ctrl+alt+h commit 90066a6 Author: Akshay-2007-1 <131676168+Akshay-2007-1@users.noreply.github.com> Date: Tue Mar 10 20:54:53 2026 +0800 Hulk fix (source-academy#3600) * Hulk Fix! Initial commit * Changed the faded colours to fit Fits the green screen background better for a faded effect * Fixed the formatting! * Revert foreground colors For its intended use on dark backgrounds after chroma keying * Fixed formatting --------- Co-authored-by: Oofky <beensprouting@gmail.com> commit 797aecd Author: Akshay-2007-1 <131676168+Akshay-2007-1@users.noreply.github.com> Date: Tue Mar 10 14:31:17 2026 +0800 CSE Machine : Function Descriptions modification for Frame overlap (source-academy#3627) * Added the removeDeadFrames feature Only dead frames disappear as of right now, for function objects and the rest, work to be done Animations : will be done by Keying! * Added the functionality for toggle of dead vs ONLY live for function closure objects Generic Arrow Text (recursively automated) Arrays and hence pairs as well * Fix : Removed gaps Finally processed the logic by recomputing the envTree for the specific step when the toggle is on * Fix : CI format errors and made it from checkbox -> onClick button! * Fix : Toggle -> One time cleanup * Changed from Hide -> Clear and the icon * Fixed the following errors and implemented suggestions 1. Fixed the snapshot and lint erros 2. Added the disable feature (as suggested by @sayomaki) where to suggest that its CLEAR and not HIDE, we disable after pressing once!! 3. Changed all instances of hide to clear in our current implementation! * Fixed tsc error * Fixed the sentry bot suggestion * Fixed the error where the frames WERE not moving due to the Layout team's invariant! Now the frames do move by violating their invariant ONLY if the Clear mode is ON * Version 1 * Version 2 * Added the following functionalities 1. Capped out the func desc box's widths 2. Click to reveal FULL length descriptions in normal mode 3. Fixed gaps between the FRAMES in PRINTABLE mode * Fixed a bug where the gap between two frames was not dynamically being set and was capped out! 1. This makes every other test case which we have made look MUCH better! 2. Secondly, we also fixed a bug where recursive closure objects' description boxes' width and length was NOT being accounted for * Fixed format error * cse layout: normalize frame width accounting and add printable fn description spacing - normalize Frame width semantics: - totalWidth now represents only frame block width - totalDataWidth is computed as true overflow beyond frame right edge - remove pre-estimation path that double-counted spacing in some cases - update Level width derivation to include last frame totalDataWidth - improve printable mode readability for function descriptions: - add small vertical offset above printable fn description labels - add tiny bottom gap below printable fn description boxes - propagate new spacing to Binding and ArrayValue height calculations This reduces excessive horizontal gaps and mitigates small printable-mode overlaps between fn description boxes and nearby array/binding content. Also removed the excess frame offset width given for safety that was NOT dynamic! So now, the frame width gapping is dynamic! * Fixed format errors * Fixed sentry's bot error * Fixed source-academy#3639 by adding closing parantheses * Fix stationary x-coordinates for normal and printable modes: - Populates both Normal and Printable caches upfront in drawCse. - Removes redundant cache generation logic from redraw. - Prevents premature cache clearing in clearCse to maintain stability. * removed comments and console logs * Fixed format errors --------- Co-authored-by: Martin Henz <henz@comp.nus.edu.sg> Co-authored-by: Richard Dominick <34370238+RichDom2185@users.noreply.github.com> Co-authored-by: gigopogy <ethanlockzy@gmail.com> commit 3e7e0df Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Tue Mar 10 11:55:38 2026 +0800 chore(deps): update dependency react-simple-keyboard to v3.8.168 (source-academy#3644) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit e678e7e Author: Ho Ke Ying <168710875+Oofky@users.noreply.github.com> Date: Tue Mar 10 06:30:00 2026 +0800 Fixed liveness bug for null array units (source-academy#3642) * Fixed null array units liveness Fixed the issue where null array units sometimes still have the default stroke color, despite being dead * Fixed format errors --------- Co-authored-by: Martin Henz <henz@comp.nus.edu.sg> commit d331a5d Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Mar 9 20:28:37 2026 +0000 chore(deps): update dependency @swc/core to v1.15.18 (source-academy#3636) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit fbf7e64 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Mar 9 20:23:15 2026 +0000 chore(deps): update dependency i18next to v25.8.14 (source-academy#3640) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit e0649aa Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Mar 9 20:14:09 2026 +0000 chore(deps): update dependency dompurify to v3.3.2 [security] (source-academy#3635) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 2563a62 Author: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Date: Mon Mar 9 20:05:44 2026 +0000 chore(deps): update dependency @sentry/react to v10.41.0 (source-academy#3638) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> commit 094601a Author: Richard Dominick <34370238+RichDom2185@users.noreply.github.com> Date: Tue Mar 10 04:00:38 2026 +0800 Fix lockfile and other incorrect changes (source-academy#3643) * Revert some lockfile changes from 1088 * Bump Yarn to 4.13.0 * Fix snapshots commit 49dadc8 Author: Akshay-2007-1 <131676168+Akshay-2007-1@users.noreply.github.com> Date: Thu Mar 5 23:39:45 2026 +0800 CSE Machine : Fixed the NavBar (source-academy#3630) * Fixed the errors * Fixed format errors * Fixed inequality overlook
This reverts commit 516fd22.
Currently, binding values don't move, including texts. Only the text of keys move.
Test code (for my own easy access):
function foo() {
function f(x) {
function g() {
const y = list(1, 2);
return y;
}
return g;
}
return f;
}
foo()(4)();
foo()(5)();
New issue:
- For some reason, the array value in the above code disappears after clicking Clear Dead Frames, but it reappears if we click print mode.
To do:
- Make binding values move with the frame. This should be implemented for each type of value, for example array or func object or primitive text.
- Consider whether the frame's name (text) should move along with the frame.
- Consider whether arrows should be animated (likely not, as the arrows can change shape so it might look weird / be hard to implement).
- Move function objects and arrays along with the frame. (Ones that may not be binded, unless invisible bindings handle this)
Primitive text values now move with the frame! Fixed an issue where dummy bindings were appearing during the animation, which was unintended.
Saving this in case I want to revert while fixing major problem
Except ArrayNullUnit and text primitive values. Text primitive values have a weird offset that needs to be accounted for.
Test code (for my own easy access):
function foo() {
function f(x) {
let r = [1, 2, () => 2];
function g() {
const y = list(1, () => 2);
let k = [];
return () => y[0];
}
return g;
}
return f;
}
foo()(4)();
foo()(5)()();
TODO:
1. Create ArrayNullUnit animation
2. Fix text primitive values animation
3. Make arrows disappear during the animation, because animating the arrows is not a feasible idea
4. Possibly clean up the code, as currently there is a lot of repeated code
There was a problem hiding this comment.
Code Review
This pull request implements the "Clear Dead Frames" animation for the CSE Machine, which shifts frames, text, and function objects to close gaps when dead frames are removed. Key additions include the ClearDeadFramesAnimation component, a utility to compute coordinate changes between states, and an AnimatedFnObject for function visualizations. Review feedback identified a race condition in the animation execution logic, a bug in the cleanup of function covers, a potential out-of-bounds access in the coordinate calculation utility, and the presence of debug console logs.
There was a problem hiding this comment.
Code Review
This pull request introduces a new animation for the 'Clear Dead Frames' action in the CSE Machine, which visually shifts remaining frames to fill gaps. It includes a new ClearDeadFramesAnimation component, utility functions to calculate coordinate changes, and updates to the animation system to support hiding specific elements during transitions. Feedback focuses on architectural concerns regarding the monkey-patching of Layout.draw, the potential for UI crashes due to hard errors in layout calculations, and the use of unstable React keys. Additionally, a regression was noted where removing a KonvaGroup breaks image export functionality, and a known text misalignment issue remains to be addressed.
…mation.tsx Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
|
[This issue has been resolved already.] After some testing, I am finding that some function objects and array units sometimes look very thick/white when animated. Through console.log, I identified that they are being animated multiple times because the objects have been added to their respective arrays (fnAnimations and frameAnimations) multiple times. This is unintended and looks ugly. My laptop does not capture this very well on video, but it looks something like this (look at the function object in the middle): cdfa_repeated.mp4The code I used is: |
Yes, this seems to be some kind of optical illusion. If the eyeballs get drawn rapidly close to each other, the movement is interpreted by our eyes as "fat" circles. Not sure if we should worry about this. |
+ added defensive check as requested by sentry
I would argue that I don't think this is an optical illusion! This is because through checking console logs, I can confirm that there are multiple of the same animations playing (from the same origin position to the same destination position, of the same object). I've made a commit fixing this by checking for duplicates before creating the animation. It visually looks correct now (there is certainly a visible difference), as the function objects and arrays now have uniform line thickness when animated. So this issue is fixed. |
Ah ok. Great! |
Co-authored-by: Richard Dominick <34370238+RichDom2185@users.noreply.github.com>
More concise + documentation for the defensive check
Description
This PR introduces animations when Clear Dead Frames is pressed.
The rationale for this is: Previously, when Clear Dead Frames is pressed, live frames and objects simply snap to their new positions. This can cause confusion for students because if frames look the same, then students may be confused which frames moved where. These animations give students an idea of the frames and objects moved when dead frames are cleared.
Note that while in general, animations in the CSE machine only play when control and stash is switched on, this animation plays even when control and stash is switched off. This animation will play every time Clear Dead Frames is pressed.
Type of change
How to test
Notice that when Clear Dead Frames is pressed, an animation plays.
cleardeadframesanim.mp4
Checklist