Skip to content
This repository was archived by the owner on Sep 20, 2024. It is now read-only.

Commit 60d9307

Browse files
committed
feat(toolip): manage transitions
1 parent 7e057a7 commit 60d9307

File tree

7 files changed

+102
-13
lines changed

7 files changed

+102
-13
lines changed

packages/c-tooltip/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
"dev": "tsup --watch"
3535
},
3636
"dependencies": {
37+
"@chakra-ui/c-motion": "workspace:*",
3738
"@chakra-ui/vue-composables": "workspace:*",
3839
"@chakra-ui/vue-system": "workspace:*",
3940
"@chakra-ui/vue-utils": "workspace:*",

packages/c-tooltip/src/c-tooltip-content.tsx

Lines changed: 55 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
1-
import { Teleport, computed, defineComponent, mergeProps } from "vue"
1+
import {
2+
Teleport,
3+
Transition,
4+
computed,
5+
defineComponent,
6+
mergeProps,
7+
withDirectives,
8+
} from "vue"
29
import { useTooltipContext } from "./tooltip.context"
310
import {
411
HTMLChakraProps,
@@ -9,6 +16,13 @@ import {
916
import { CTooltipPositioner } from "./c-tooltip-positioner"
1017
import { filterUndefined } from "@chakra-ui/utils"
1118
import { vueThemingProps } from "@chakra-ui/vue-utils"
19+
import { MotionDirective, useMotions } from "@vueuse/motion"
20+
import { TooltipVariants } from "./tooltip.transition"
21+
22+
const toVar = (value: string, fallback?: string) => ({
23+
var: value,
24+
varRef: fallback ? `var(${value}, ${fallback})` : `var(${value})`,
25+
})
1226

1327
export type CTooltipContentProps = HTMLChakraProps<"div">
1428
export const CTooltipContent = defineComponent({
@@ -27,17 +41,50 @@ export const CTooltipContent = defineComponent({
2741
})
2842
)
2943
const styles = useStyleConfig("Tooltip", themingProps.value)
44+
const contentStyles = computed(() => ({
45+
...styles.value,
46+
transformOrigin: toVar(
47+
"--transform-origin",
48+
api.value.positionerProps.style.transformOrigin
49+
).varRef,
50+
}))
51+
52+
/** Handles exit transition */
53+
const leaveTransition = (el: Element, done: VoidFunction) => {
54+
const motions = useMotions()
55+
const instance = motions[api.value.transitionId]
56+
instance?.leave(() => {
57+
done()
58+
})
59+
}
60+
61+
const enterTransition = (el: Element, done: VoidFunction) => {
62+
const motions = useMotions()
63+
const instance = motions[api.value.transitionId]
64+
requestAnimationFrame(async () => {
65+
instance?.stopTransitions()
66+
instance?.set("initial")
67+
await instance?.apply("enter")
68+
done()
69+
})
70+
}
3071

3172
return () => (
3273
<Teleport to="body">
3374
<CTooltipPositioner>
34-
<chakra.div
35-
__css={styles.value}
36-
{...api.value.contentProps}
37-
{...attrs}
38-
>
39-
{slots.default?.()}
40-
</chakra.div>
75+
<Transition onEnter={enterTransition} onLeave={leaveTransition}>
76+
{api.value.isOpen &&
77+
withDirectives(
78+
<chakra.div
79+
__css={contentStyles.value}
80+
{...api.value.contentProps}
81+
{...attrs}
82+
>
83+
{slots.default?.()}
84+
</chakra.div>,
85+
[[MotionDirective(TooltipVariants), api.value.transitionId]]
86+
)}
87+
</Transition>
4188
</CTooltipPositioner>
4289
</Teleport>
4390
)

packages/c-tooltip/src/c-tooltip.tsx

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@
88
* @see WAI-ARIA https://www.w3.org/TR/wai-aria-practices-1.2
99
*/
1010

11-
import { computed, defineComponent, h, Fragment, PropType } from "vue"
11+
import { computed, defineComponent, h, Fragment, PropType, watch } from "vue"
1212
import { TooltipProvider } from "./tooltip.context"
1313
import { useTooltip, UseTooltipProps } from "./use-tooltip"
1414
import type * as PP from "@zag-js/popper"
1515
import { filterUndefined } from "@chakra-ui/utils"
16+
import { useId } from "@chakra-ui/vue-composables"
17+
import { useMotions } from "@vueuse/motion"
1618

1719
type UseTooltipPropsContext = UseTooltipProps["context"]
1820

@@ -24,9 +26,11 @@ const VueTooltipProps = {
2426
},
2527
openDelay: {
2628
type: Number as PropType<CTooltipProps["openDelay"]>,
29+
default: 0,
2730
},
2831
closeDelay: {
2932
type: Number as PropType<CTooltipProps["closeDelay"]>,
33+
default: 0,
3034
},
3135
closeOnPointerDown: {
3236
type: Boolean as PropType<CTooltipProps["closeOnPointerDown"]>,
@@ -62,8 +66,16 @@ export const CTooltip = defineComponent({
6266
emit,
6367
}))
6468

69+
const transitionId = useId(undefined, "transition:toolip")
70+
6571
const api = useTooltip(tooltipProps.value)
66-
TooltipProvider(api)
72+
73+
const tooltipApi = computed(() => ({
74+
...api.value,
75+
transitionId: transitionId.value,
76+
}))
77+
78+
TooltipProvider(tooltipApi)
6779
return () => slots?.default?.()
6880
},
6981
})

packages/c-tooltip/src/tooltip.context.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
import type { connect } from "@zag-js/tooltip"
22
import type { ComputedRef } from "vue"
3-
import { createContext } from "@chakra-ui/vue-utils"
3+
import { AnyFn, createContext } from "@chakra-ui/vue-utils"
44
import type { UseTooltipReturn } from "./use-tooltip"
55

6+
export interface CTooltipContext extends ReturnType<typeof connect> {
7+
transitionId: string
8+
}
9+
610
export const [TooltipProvider, useTooltipContext] = createContext<
7-
ComputedRef<ReturnType<typeof connect>>
11+
ComputedRef<CTooltipContext>
812
>({
913
name: "CTooltipContext",
1014
strict: true,
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// import { TransitionDefaults } from "@chakra-ui/c-motion"
2+
import { MotionVariants } from "@vueuse/motion"
3+
4+
export const TooltipVariants: MotionVariants = {
5+
initial: { scale: 0.95, opacity: 0 },
6+
enter: {
7+
scale: 1,
8+
// transition: TransitionDefaults.enter,
9+
transition: {
10+
opacity: { easings: "easeOut", duration: 200 },
11+
scale: { duration: 200, ease: [0.175, 0.885, 0.4, 1.1] },
12+
},
13+
opacity: 1,
14+
},
15+
leave: {
16+
scale: 0.85,
17+
opacity: 0,
18+
transition: {
19+
opacity: { duration: 150, easings: "easeInOut" },
20+
scale: { duration: 200, easings: "easeInOut" },
21+
},
22+
},
23+
}

packages/c-tooltip/src/use-tooltip.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@ export const useTooltip = (props: UseTooltipProps) => {
2424
onClose() {
2525
emit("close")
2626
},
27+
closeDelay: 300,
2728
})
2829
)
29-
3030
return computed(() => connect(state.value, send, normalizeProps))
3131
}
3232

pnpm-lock.yaml

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)