From 7ec06528d905b57124b32b4ae7c6cf5877a8c03e Mon Sep 17 00:00:00 2001 From: Jordan Pittman Date: Mon, 10 Apr 2023 10:29:33 -0400 Subject: [PATCH] Don't scroll lock when transition isn't showing (#2422) * Add tests * Make transition initial state based on computed `show` prop * Update changelog --- .../src/components/dialog/dialog.test.tsx | 22 +++++++++++++++++ packages/@headlessui-vue/CHANGELOG.md | 1 + .../src/components/dialog/dialog.test.ts | 24 +++++++++++++++++++ .../src/components/transitions/transition.ts | 4 ++-- 4 files changed, 49 insertions(+), 2 deletions(-) diff --git a/packages/@headlessui-react/src/components/dialog/dialog.test.tsx b/packages/@headlessui-react/src/components/dialog/dialog.test.tsx index 82646e0..dafed13 100644 --- a/packages/@headlessui-react/src/components/dialog/dialog.test.tsx +++ b/packages/@headlessui-react/src/components/dialog/dialog.test.tsx @@ -440,6 +440,28 @@ describe('Rendering', () => { expect(document.documentElement.style.overflow).toBe('') }) ) + + it( + 'should not have a scroll lock when the transition marked as not shown', + suppressConsoleLogs(async () => { + function Example() { + return ( + + {}}> + + + + ) + } + + render() + + await nextFrame() + + // The overflow should NOT be there + expect(document.documentElement.style.overflow).toBe('') + }) + ) }) describe('Dialog.Overlay', () => { diff --git a/packages/@headlessui-vue/CHANGELOG.md b/packages/@headlessui-vue/CHANGELOG.md index 5786acf..4dd6dfa 100644 --- a/packages/@headlessui-vue/CHANGELOG.md +++ b/packages/@headlessui-vue/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fix focus styles showing up when using the mouse ([#2347](https://github.com/tailwindlabs/headlessui/pull/2347)) - Disable `ComboboxInput` when its `Combobox` is disabled ([#2375](https://github.com/tailwindlabs/headlessui/pull/2375)) - Add `FocusTrap` event listeners once document has loaded ([#2389](https://github.com/tailwindlabs/headlessui/pull/2389)) +- Don't scroll-lock `` when wrapping transition isn't showing ([#2422](https://github.com/tailwindlabs/headlessui/pull/2422)) ### Added diff --git a/packages/@headlessui-vue/src/components/dialog/dialog.test.ts b/packages/@headlessui-vue/src/components/dialog/dialog.test.ts index 079a2ac..c354945 100644 --- a/packages/@headlessui-vue/src/components/dialog/dialog.test.ts +++ b/packages/@headlessui-vue/src/components/dialog/dialog.test.ts @@ -615,6 +615,30 @@ describe('Rendering', () => { expect(document.documentElement.style.overflow).toBe('') }) ) + + it( + 'should not have a scroll lock when the transition marked as not shown', + suppressConsoleLogs(async () => { + renderTemplate({ + components: { + Dialog, + TransitionRoot, + }, + template: ` + + + + + + `, + }) + + await nextFrame() + + // The overflow should NOT be there + expect(document.documentElement.style.overflow).toBe('') + }) + ) }) describe('DialogOverlay', () => { diff --git a/packages/@headlessui-vue/src/components/transitions/transition.ts b/packages/@headlessui-vue/src/components/transitions/transition.ts index 89dcd74..b77706f 100644 --- a/packages/@headlessui-vue/src/components/transitions/transition.ts +++ b/packages/@headlessui-vue/src/components/transitions/transition.ts @@ -193,7 +193,6 @@ export let TransitionChild = defineComponent({ } let container = ref(null) - let state = ref(TreeStates.Visible) let strategy = computed(() => (props.unmount ? RenderStrategy.Unmount : RenderStrategy.Hidden)) expose({ el: container, $el: container }) @@ -201,6 +200,7 @@ export let TransitionChild = defineComponent({ let { show, appear } = useTransitionContext() let { register, unregister } = useParentNesting() + let state = ref(show.value ? TreeStates.Visible : TreeStates.Hidden) let initial = { value: true } let id = useId() @@ -228,7 +228,7 @@ export let TransitionChild = defineComponent({ if (!id) return // Make sure that we are visible - if (show && state.value !== TreeStates.Visible) { + if (show.value && state.value !== TreeStates.Visible) { state.value = TreeStates.Visible return }