-
-
Notifications
You must be signed in to change notification settings - Fork 9.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
UI: Fix keydown shortcut within shadow tree #24179
UI: Fix keydown shortcut within shadow tree #24179
Conversation
@@ -45,7 +45,7 @@ import type { StorySpecifier } from '../store/StoryIndexStore'; | |||
const globalWindow = globalThis; | |||
|
|||
function focusInInput(event: Event) { | |||
const target = event.target as Element; | |||
const target = event.composedPath()[0] as Element; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I figured I'd leave this here for future me:
https://developer.mozilla.org/en-US/docs/Web/API/Event/composedPath
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
FYI, I found this article to be really helpful on the topic of events and shadow dom
https://pm.dartus.fr/blog/a-complete-guide-on-shadow-dom-and-event-propagation/
code/lib/preview-api/src/modules/preview-web/PreviewWithSelection.tsx
Outdated
Show resolved
Hide resolved
…'t exist or returns an empty array
For the record, if the shadow root is With this implementation, the event will always be sent. |
@stropitek The custom web-component should maybe be stop the propagation of the event in that case, shouldn't it? |
Yes, a custom web-component can stop the propagation of the event to the host (storybook) by calling |
Closes #23790
What I did
I changed the part in the preview which checks if a keyboard event should be sent or not. Previously this was done using
event.target
, and I changed that to useevent.composedPath()[0]
instead, so that stories which render an input / textarea or contenteditable element within a shadow tree don't spuriously trigger storybook shortcuts.The linked issue has a reproducible example of the bug.
Checklist for Contributors
Testing
I made sure there are no regressions in the e2e tests and updated the unit tests. However I did not implement new tests for stories including a shadow tree. I wasn't sure how to go about this.
The changes in this PR are covered in the following automated tests:
Manual testing
I did not know how to manually test this in the storybook project directly. I use react and it would require to create a new react-only story and add the react-shadow dependency.
Instead, I checked my change manually within another project:
npm ci
npm run storybook
npx serve storybook-static
./storybook-static/sb-preview/runtime.js
, replacelet target = event.target;
withlet target = event.composedPath()[0]
s
does not toggle the sidebar as expected. When focused element is within the preview but not the input, types
does toggle the sidebar as expected.Documentation
MIGRATION.MD
Checklist for Maintainers
When this PR is ready for testing, make sure to add
ci:normal
,ci:merged
orci:daily
GH label to it to run a specific set of sandboxes. The particular set of sandboxes can be found incode/lib/cli/src/sandbox-templates.ts
Make sure this PR contains one of the labels below:
Available labels
bug
: Internal changes that fixes incorrect behavior.maintenance
: User-facing maintenance tasks.dependencies
: Upgrading (sometimes downgrading) dependencies.build
: Internal-facing build tooling & test updates. Will not show up in release changelog.cleanup
: Minor cleanup style change. Will not show up in release changelog.documentation
: Documentation only changes. Will not show up in release changelog.feature request
: Introducing a new feature.BREAKING CHANGE
: Changes that break compatibility in some way with current major version.other
: Changes that don't fit in the above categories.🦋 Canary release
This PR does not have a canary release associated. You can request a canary release of this pull request by mentioning the
@storybookjs/core
team here.core team members can create a canary release here or locally with
gh workflow run --repo storybookjs/storybook canary-release-pr.yml --field pr=<PR_NUMBER>