Skip to content

Conversation

@nishasy
Copy link
Contributor

@nishasy nishasy commented Oct 31, 2025

Summary:

The old zoom service is a huge pain to work with. It's super old and very
non-modern-reacty.

I'm replacing it here with Wonder Blocks modal so that the zoom feature can be
easier to work with and maintain.

This is a prerequisite for making the graphies focusable and zoomable since the
old zoom service was trying to do too much with the image ref, making it impossible
to zoom in on graphies with their labels.

NOTE: The nice little transition is unfortunately gone with this approach. But I got
confirmation from our designer that we can go with this for now, and we can add
in transitions once WB Modal supports it next year.

Issue: https://khanacademy.atlassian.net/browse/LEMS-3689

Test plan:

Storybook
/?path=/story/widgets-image-widget-demo--image-with-different-sizes

Before

Screen.Recording.2025-10-30.at.5.14.11.PM.mov

After

Screen.Recording.2025-10-30.at.5.15.18.PM.mov

@nishasy nishasy self-assigned this Oct 31, 2025
@github-actions
Copy link
Contributor

github-actions bot commented Oct 31, 2025

🗄️ Schema Change: No Changes ✅

@github-actions
Copy link
Contributor

github-actions bot commented Oct 31, 2025

Size Change: -2.09 kB (-0.42%)

Total Size: 497 kB

Filename Size Change
packages/perseus-editor/dist/es/index.js 97.9 kB +41 B (+0.04%)
packages/perseus/dist/es/index.js 202 kB -2.13 kB (-1.04%)
ℹ️ View Unchanged
Filename Size
packages/kas/dist/es/index.js 20.8 kB
packages/keypad-context/dist/es/index.js 1 kB
packages/kmath/dist/es/index.js 5.98 kB
packages/math-input/dist/es/index.js 99.2 kB
packages/math-input/dist/es/strings.js 1.61 kB
packages/perseus-core/dist/es/index.item-splitting.js 13.1 kB
packages/perseus-core/dist/es/index.js 22.4 kB
packages/perseus-linter/dist/es/index.js 7.68 kB
packages/perseus-score/dist/es/index.js 9.2 kB
packages/perseus-utils/dist/es/index.js 403 B
packages/perseus/dist/es/strings.js 7.73 kB
packages/pure-markdown/dist/es/index.js 1.39 kB
packages/simple-markdown/dist/es/index.js 6.71 kB

compressed-size-action

@github-actions
Copy link
Contributor

github-actions bot commented Oct 31, 2025

🛠️ Item Splitting: No Changes ✅

@github-actions
Copy link
Contributor

github-actions bot commented Oct 31, 2025

npm Snapshot: Published

Good news!! We've packaged up the latest commit from this PR (aa8d559) and published it to npm. You
can install it using the tag PR3009.

Example:

pnpm add @khanacademy/perseus@PR3009

If you are working in Khan Academy's frontend, you can run the below command.

./dev/tools/bump_perseus_version.ts -t PR3009

If you are working in Khan Academy's webapp, you can run the below command.

./dev/tools/bump_perseus_version.js -t PR3009

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Deleted zoom code

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if not yet in our decision page, please add the decision why it this is removed

@nishasy nishasy requested review from a team, SonicScrewdriver and jeremywiebe November 12, 2025 20:07
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed these cypress tests now that the unit tests cover the same thing.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

do we want to retain the testing but updated logic?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We had a meeting about this last week when you were gone. We're going to move away from using cypress within the perseus repo altogether.

Cypress in frontend is still used though.

@nishasy nishasy marked this pull request as ready for review November 12, 2025 20:13
Copy link
Contributor

@ivyolamit ivyolamit left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@nishasy overall code looks good. Just one comment for code changes on removing unused css styling. The rest are question and non-blocking comment.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

do we want to retain the testing but updated logic?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if not yet in our decision page, please add the decision why it this is removed

@nishasy
Copy link
Contributor Author

nishasy commented Nov 13, 2025

Note to self: DO NOT LAND UNTIL QA IS COMPLETE

Copy link
Member

@catandthemachines catandthemachines left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you so much for this improvement, it's so much cleaner and easier to read compared to the old zoom code. I had one question on the "closing dialog when image is clicked", but it's non blocking.

Thanks Nisha!

@@ -0,0 +1,14 @@
.contentWrapper {
/* Undo the ModalContent padding so that the image takes up the whole modal. */
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for these comments!

line-height: 1.5;
margin: 0;
}
/* Derived from the MIT-licensed zoom.js:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yay!!

<SvgImage
src={imageDescription.url}
allowZoom={false}
// Don't allow zooming on an image that's being
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: I'd move it above the property like other comments for consistency

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh idk how that happened haha

expect(screen.getByRole("dialog")).toBeVisible();
});

it("closes the modal when the image is clicked", async () => {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Question, was that in the old experience? Why should the modal close if the image is clicked? What if someone wants to copy the image or look at more closely? Closing on clicking the image seem odd.

Non-blocking and ignore me if design prefers this.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I was just trying to get it as close to the old experience as possible. You can see that in prod (Image article).

The old experience closed the modal with a click, space, enter, or escape anywhere within the zoomed view. This doesn't stop right-clicking. It also manually handles control+click/command+click to open the image in a new tab (which I manually implemented in the new experience too).

@nishasy nishasy merged commit 8d3beb2 into main Nov 20, 2025
11 checks passed
@nishasy nishasy deleted the image-replace-zoom-with-modal branch November 20, 2025 21:55
nishasy added a commit that referenced this pull request Nov 20, 2025
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to main, this PR will
be updated.


# Releases
## @khanacademy/[email protected]

### Minor Changes

- [#3037](#3037)
[`39c890acc5`](39c890a)
Thanks [@nishasy](https://github.com/nishasy)! - [Image] | (UX) | Allow
zooming on Graphie images


- [#3009](#3009)
[`8d3beb2743`](8d3beb2)
Thanks [@nishasy](https://github.com/nishasy)! - [Image] | (DX) | Remove
ZoomService in favor of WB Modal

### Patch Changes

- [#3044](#3044)
[`78e15ef4e6`](78e15ef)
Thanks [@nishasy](https://github.com/nishasy)! - [Image] | (UX) | Image
zoom fixes - remove scrolling for portrait images, command click on main
image instead of zoomed image


- [#3043](#3043)
[`98245b0f3a`](98245b0)
Thanks [@ivyolamit](https://github.com/ivyolamit)! - Fix bottom margin
when rendering in mobile

- Updated dependencies
\[[`ceb7a70bfa`](ceb7a70),
[`fc6273b10d`](fc6273b),
[`18261c3294`](18261c3)]:
    -   @khanacademy/[email protected]
    -   @khanacademy/[email protected]

## @khanacademy/[email protected]

### Minor Changes

- [#3047](#3047)
[`b84bc99def`](b84bc99)
Thanks [@nishasy](https://github.com/nishasy)! - Add Issues Panel to
Article Editor


- [#2992](#2992)
[`fc6273b10d`](fc6273b)
Thanks [@nishasy](https://github.com/nishasy)! - Add radio and
expression save wanrnings to the perseus linter. Add a callback for
issues changed to item-editor.tsx.


- [#3037](#3037)
[`39c890acc5`](39c890a)
Thanks [@nishasy](https://github.com/nishasy)! - [Image] | (UX) | Allow
zooming on Graphie images

### Patch Changes

- [#3044](#3044)
[`78e15ef4e6`](78e15ef)
Thanks [@nishasy](https://github.com/nishasy)! - [Image] | (UX) | Image
zoom fixes - remove scrolling for portrait images, command click on main
image instead of zoomed image


- [#3049](#3049)
[`18261c3294`](18261c3)
Thanks [@nishasy](https://github.com/nishasy)! - Add Free Response
widget save warnings to perseus linter

- Updated dependencies
\[[`ceb7a70bfa`](ceb7a70),
[`78e15ef4e6`](78e15ef),
[`fc6273b10d`](fc6273b),
[`39c890acc5`](39c890a),
[`8d3beb2743`](8d3beb2),
[`98245b0f3a`](98245b0),
[`18261c3294`](18261c3)]:
    -   @khanacademy/[email protected]
    -   @khanacademy/[email protected]
    -   @khanacademy/[email protected]

## @khanacademy/[email protected]

### Minor Changes

- [#2992](#2992)
[`fc6273b10d`](fc6273b)
Thanks [@nishasy](https://github.com/nishasy)! - Add radio and
expression save wanrnings to the perseus linter. Add a callback for
issues changed to item-editor.tsx.


- [#3049](#3049)
[`18261c3294`](18261c3)
Thanks [@nishasy](https://github.com/nishasy)! - Add Free Response
widget save warnings to perseus linter

## @khanacademy/[email protected]

### Patch Changes

- [#3054](#3054)
[`ceb7a70bfa`](ceb7a70)
Thanks [@ivyolamit](https://github.com/ivyolamit)! - Add tabs and icon
button package in math-input
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants