Skip to content

Commit d5a979a

Browse files
authored
Add dynamic keys on useMotion directives when calling apply() and other methods (#126)
1 parent c495943 commit d5a979a

26 files changed

Lines changed: 94 additions & 82 deletions

src/components/Motion.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@ export default defineComponent({
2020
},
2121
// Instance
2222
instance: {
23-
type: Object as PropType<MotionInstance>,
23+
type: Object as PropType<MotionInstance<string, MotionVariants<string>>>,
2424
required: false,
2525
},
2626
// Variants
2727
variants: {
28-
type: Object as PropType<MotionVariants>,
28+
type: Object as PropType<MotionVariants<string>>,
2929
required: false,
3030
},
3131
// Initial variant
@@ -74,7 +74,7 @@ export default defineComponent({
7474
const slots = useSlots()
7575

7676
// Instance map from component content
77-
const instances = reactive<{ [key: number]: MotionInstance<any> }>({})
77+
const instances = reactive<{ [key: number]: MotionInstance<string, MotionVariants<string>> }>({})
7878

7979
// Return empty component is `is` is absent
8080
if (!props.is && !slots.default) return () => h('div', {})
@@ -128,7 +128,7 @@ export default defineComponent({
128128

129129
// Replay animations on component update Vue
130130
if (process?.env?.NODE_ENV === 'development' || (process as any)?.dev) {
131-
const replayAnimation = (instance: MotionInstance<any>) => {
131+
const replayAnimation = (instance: MotionInstance<any, any>) => {
132132
if (instance.variants?.initial) instance.set('initial')
133133
setTimeout(() => {
134134
if (instance.variants?.enter) instance.apply('enter')

src/directive/index.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { Directive, DirectiveBinding, VNode } from 'vue'
1+
import type { Directive, DirectiveBinding, Ref, VNode } from 'vue'
22
import defu from 'defu'
33
import { ref, unref } from 'vue'
44
import { motionState } from '../features/state'
@@ -7,7 +7,7 @@ import { useMotion } from '../useMotion'
77
import { resolveVariants } from '../utils/directive'
88
import { variantToStyle } from '../utils/transform'
99

10-
export function directive(variants?: MotionVariants): Directive<HTMLElement | SVGElement> {
10+
export function directive<T extends string>(variants: MotionVariants<T> = {}): Directive<HTMLElement | SVGElement> {
1111
const register = (el: HTMLElement | SVGElement, binding: DirectiveBinding, node: VNode<any, HTMLElement | SVGElement, Record<string, any>>) => {
1212
// Get instance key if possible (binding value or element key in case of v-for's)
1313
const key = (binding.value && typeof binding.value === 'string' ? binding.value : node.key) as string
@@ -16,13 +16,13 @@ export function directive(variants?: MotionVariants): Directive<HTMLElement | SV
1616
if (key && motionState[key]) motionState[key].stop()
1717

1818
// Initialize variants with argument
19-
const variantsRef = ref<MotionVariants>(variants || {})
19+
const variantsRef = ref(variants) as Ref<MotionVariants<T>>
2020

2121
// Set variants from v-motion binding
2222
if (typeof binding.value === 'object') variantsRef.value = binding.value
2323

2424
// Resolve variants from node props
25-
resolveVariants(node, variantsRef)
25+
resolveVariants<T>(node, variantsRef)
2626

2727
// Create motion instance
2828
const motionInstance = useMotion(el, variantsRef)

src/features/eventListeners.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { computed, ref, unref, watch } from 'vue'
33
import type { MotionInstance, MotionVariants } from '../types'
44
import { supportsMouseEvents, supportsPointerEvents, supportsTouchEvents } from '../utils/events'
55

6-
export function registerEventListeners<T extends MotionVariants>({ target, state, variants, apply }: MotionInstance<T>) {
6+
export function registerEventListeners<T extends string, V extends MotionVariants<T>>({ target, state, variants, apply }: MotionInstance<T, V>) {
77
const _variants = unref(variants)
88

99
// State
@@ -37,6 +37,7 @@ export function registerEventListeners<T extends MotionVariants>({ target, state
3737
if (focused.value && _variants.focused) Object.assign(result, _variants.focused)
3838

3939
for (const key in result) {
40+
// @ts-expect-error - Fix errors later for typescript 5
4041
if (!mutableKeys.value.includes(key)) delete result[key]
4142
}
4243

src/features/lifeCycleHooks.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { unref, watch } from 'vue'
22
import type { MotionInstance, MotionVariants } from '../types'
33

4-
export function registerLifeCycleHooks<T extends MotionVariants>({ set, target, variants, variant }: MotionInstance<T>) {
4+
export function registerLifeCycleHooks<T extends string, V extends MotionVariants<T>>({ set, target, variants, variant }: MotionInstance<T, V>) {
55
const _variants = unref(variants)
66

77
watch(

src/features/state.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
import type { MotionInstanceBindings } from '../types'
1+
import type { MotionInstanceBindings, MotionVariants } from '../types'
22

3-
export const motionState: MotionInstanceBindings<any> = {}
3+
export const motionState: MotionInstanceBindings<string, MotionVariants<never>> = {}

src/features/syncVariants.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { watch } from 'vue'
22
import type { MotionInstance, MotionVariants } from '../types'
33

4-
export function registerVariantsSync<T extends MotionVariants>({ state, apply }: MotionInstance<T>) {
4+
export function registerVariantsSync<T extends string, V extends MotionVariants<T>>({ state, apply }: MotionInstance<T, V>) {
55
// Watch for variant changes and apply the new one
66
watch(
77
state,

src/features/visibilityHooks.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { useIntersectionObserver } from '@vueuse/core'
22
import { unref } from 'vue'
33
import type { MotionInstance, MotionVariants } from '../types'
44

5-
export function registerVisibilityHooks<T extends MotionVariants>({ target, variants, variant }: MotionInstance<T>) {
5+
export function registerVisibilityHooks<T extends string, V extends MotionVariants<T>>({ target, variants, variant }: MotionInstance<T, V>) {
66
const _variants = unref(variants)
77

88
// Bind intersection observer on target

src/nuxt/module.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { defu } from 'defu'
22
import { addImportsDir, addPlugin, createResolver, defineNuxtModule } from '@nuxt/kit'
33
import type { ModuleOptions as MotionModuleOpts } from '../types'
44

5-
export interface ModuleOptions extends MotionModuleOpts {}
5+
export interface ModuleOptions extends MotionModuleOpts<string> {}
66

77
export default defineNuxtModule<ModuleOptions>({
88
meta: {

src/plugin/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import type { MotionPluginOptions, MotionVariants } from '../types'
66
import { slugify } from '../utils/slugify'
77

88
export const MotionPlugin: Plugin = {
9-
install(app, options: MotionPluginOptions) {
9+
install(app, options: MotionPluginOptions<string>) {
1010
// Register default `v-motion` directive
1111
app.directive('motion', directive())
1212

@@ -30,7 +30,7 @@ export const MotionPlugin: Plugin = {
3030
// Loop on options, create a custom directive for each definition
3131
for (const key in options.directives) {
3232
// Get directive variants
33-
const variants = options.directives[key] as MotionVariants
33+
const variants = options.directives[key] as MotionVariants<any>
3434

3535
// Development warning, showing definitions missing `initial` key
3636
if (!variants.initial && __DEV__) {

src/presets/fade.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type { MotionVariants } from '../types'
22

3-
export const fade: MotionVariants = {
3+
export const fade: MotionVariants<never> = {
44
initial: {
55
opacity: 0,
66
},
@@ -9,7 +9,7 @@ export const fade: MotionVariants = {
99
},
1010
}
1111

12-
export const fadeVisible: MotionVariants = {
12+
export const fadeVisible: MotionVariants<never> = {
1313
initial: {
1414
opacity: 0,
1515
},
@@ -18,7 +18,7 @@ export const fadeVisible: MotionVariants = {
1818
},
1919
}
2020

21-
export const fadeVisibleOnce: MotionVariants = {
21+
export const fadeVisibleOnce: MotionVariants<never> = {
2222
initial: {
2323
opacity: 0,
2424
},

0 commit comments

Comments
 (0)