Skip to content

Commit 8154563

Browse files
committed
add prefers-reduced-motion support
1 parent 588451f commit 8154563

File tree

3 files changed

+38
-5
lines changed

3 files changed

+38
-5
lines changed

src/index.ts

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import { onBeforeUnmount, unref, watch, type CSSProperties } from 'vue'
22

3-
import { mergeDefined, isSSR } from './utils'
3+
import { mergeDefined, isSSR, isReducedMotion } from './utils'
44
import { CAPTURE_DELTA_FRAME_COUNT, defaultOptions } from './constants'
55

66
import type { UseFixedHeaderOptions, MaybeTemplateRef } from './types'
77

88
export function useFixedHeader(
99
target: MaybeTemplateRef,
10-
options: Partial<UseFixedHeaderOptions> = defaultOptions
10+
options: Partial<UseFixedHeaderOptions> = defaultOptions,
1111
) {
1212
const mergedOptions = mergeDefined(defaultOptions, options)
1313

@@ -115,12 +115,21 @@ export function useFixedHeader(
115115

116116
function onVisible() {
117117
removeAriaHidden()
118-
setStyles({ ...mergedOptions.enterStyles, visibility: '' as CSSProperties['visibility'] })
118+
119+
setStyles({
120+
...mergedOptions.enterStyles,
121+
visibility: '' as CSSProperties['visibility'],
122+
...(isReducedMotion() ? { transition: 'none' } : {}),
123+
})
119124
}
120125

121126
function onHidden() {
122127
setAriaHidden()
123-
setStyles(mergedOptions.leaveStyles)
128+
129+
setStyles({
130+
...mergedOptions.leaveStyles,
131+
...(isReducedMotion() ? { transition: 'none' } : {}),
132+
})
124133
}
125134

126135
// Scroll
@@ -300,7 +309,7 @@ export function useFixedHeader(
300309

301310
onCleanup(cleanListeners)
302311
},
303-
{ immediate: true, flush: 'post' }
312+
{ immediate: true, flush: 'post' },
304313
)
305314

306315
watch(mergedOptions.watch, toggleListeners, { flush: 'post' })

src/utils.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,9 @@ export function mergeDefined<T>(defaults: Required<T>, options: T): Required<T>
1111
}
1212

1313
export const isSSR = typeof window === 'undefined'
14+
15+
export function isReducedMotion() {
16+
if (isSSR) return false
17+
18+
return window.matchMedia('(prefers-reduced-motion: reduce)').matches
19+
}

tests/reduced-motion.cy.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
describe('prefers-reduced-motion', () => {
2+
beforeEach(() => {
3+
cy.stub(window, 'matchMedia').withArgs('(prefers-reduced-motion: reduce)').returns({
4+
matches: true,
5+
})
6+
})
7+
8+
it('Shold not add transition', () => {
9+
cy.mountApp()
10+
.scrollToHide()
11+
.get('header')
12+
.should('have.css', 'transition', 'none 0s ease 0s')
13+
14+
.scrollToShow()
15+
.get('header')
16+
.should('have.css', 'transition', 'none 0s ease 0s')
17+
})
18+
})

0 commit comments

Comments
 (0)