Skip to content

Commit 1bf6e15

Browse files
committed
feat: add tooltip
1 parent c11b9ff commit 1bf6e15

File tree

6 files changed

+108
-19
lines changed

6 files changed

+108
-19
lines changed

src/App.vue

Lines changed: 37 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -102,25 +102,37 @@
102102
Brand color
103103
</div>
104104
<div class="flex items-center gap-3">
105-
<Button
106-
v-for="color in brandList"
107-
:key="color"
108-
variant="outline"
109-
size="icon"
110-
:class="
111-
cn(
112-
`rounded-full border-${color}-500 text-brand-foreground bg-${color}-500/20 hover:bg-${color}-500/50`,
113-
authBrandColor === color && `border-2`
114-
)
115-
"
116-
:style="{
117-
background: colord(colors[color]['500']).toRgbString(),
118-
borderColor: isDark
119-
? colord(colors[color]['200']).toRgbString()
120-
: colord(colors[color]['800']).toRgbString()
121-
}"
122-
@click="authBrandColor = color"
123-
/>
105+
<template v-for="color in brandList">
106+
<TooltipProvider>
107+
<Tooltip :delay-duration="0">
108+
<TooltipTrigger>
109+
<Button
110+
:key="color"
111+
variant="outline"
112+
size="icon"
113+
:class="
114+
cn(
115+
`rounded-full border-${color}-500 text-brand-foreground bg-${color}-500/20 hover:bg-${color}-500/50`,
116+
authBrandColor === color && `border-2`
117+
)
118+
"
119+
:style="{
120+
background: colord(
121+
colors[color]['500']
122+
).toRgbString(),
123+
borderColor: isDark
124+
? colord(colors[color]['200']).toRgbString()
125+
: colord(colors[color]['800']).toRgbString()
126+
}"
127+
@click="authBrandColor = color"
128+
/>
129+
</TooltipTrigger>
130+
<TooltipContent>
131+
{{ color.charAt(0).toUpperCase() + color.slice(1) }}
132+
</TooltipContent>
133+
</Tooltip>
134+
</TooltipProvider>
135+
</template>
124136
</div>
125137
</div>
126138

@@ -222,6 +234,12 @@ import { AuthViewType } from '@/types'
222234
import IconMenu from './components/IconMenu.vue'
223235
import IconPalette from './components/IconPalette.vue'
224236
import { Button } from '~/components/ui/button'
237+
import {
238+
Tooltip,
239+
TooltipContent,
240+
TooltipProvider,
241+
TooltipTrigger
242+
} from '~/components/ui/tooltip'
225243
import UserContextProvider, {
226244
useSupabaseUser
227245
} from '@/auth/UserContextProvider'

src/components/ui/tooltip/Tooltip.vue

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<script setup lang="ts">
2+
import { TooltipRoot, type TooltipRootEmits, type TooltipRootProps, useForwardPropsEmits } from 'radix-vue'
3+
4+
const props = defineProps<TooltipRootProps>()
5+
const emits = defineEmits<TooltipRootEmits>()
6+
7+
const forwarded = useForwardPropsEmits(props, emits)
8+
</script>
9+
10+
<template>
11+
<TooltipRoot v-bind="forwarded">
12+
<slot />
13+
</TooltipRoot>
14+
</template>
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<script setup lang="ts">
2+
import { cn } from '~/lib'
3+
import { TooltipContent, type TooltipContentEmits, type TooltipContentProps, TooltipPortal, useForwardPropsEmits } from 'radix-vue'
4+
import { computed, type HTMLAttributes } from 'vue'
5+
6+
defineOptions({
7+
inheritAttrs: false,
8+
})
9+
10+
const props = withDefaults(defineProps<TooltipContentProps & { class?: HTMLAttributes['class'] }>(), {
11+
sideOffset: 4,
12+
})
13+
14+
const emits = defineEmits<TooltipContentEmits>()
15+
16+
const delegatedProps = computed(() => {
17+
const { class: _, ...delegated } = props
18+
19+
return delegated
20+
})
21+
22+
const forwarded = useForwardPropsEmits(delegatedProps, emits)
23+
</script>
24+
25+
<template>
26+
<TooltipPortal>
27+
<TooltipContent v-bind="{ ...forwarded, ...$attrs }" :class="cn('z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2', props.class)">
28+
<slot />
29+
</TooltipContent>
30+
</TooltipPortal>
31+
</template>
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<script setup lang="ts">
2+
import { TooltipProvider, type TooltipProviderProps } from 'radix-vue'
3+
4+
const props = defineProps<TooltipProviderProps>()
5+
</script>
6+
7+
<template>
8+
<TooltipProvider v-bind="props">
9+
<slot />
10+
</TooltipProvider>
11+
</template>
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<script setup lang="ts">
2+
import { TooltipTrigger, type TooltipTriggerProps } from 'radix-vue'
3+
4+
const props = defineProps<TooltipTriggerProps>()
5+
</script>
6+
7+
<template>
8+
<TooltipTrigger v-bind="props">
9+
<slot />
10+
</TooltipTrigger>
11+
</template>

src/components/ui/tooltip/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export { default as Tooltip } from './Tooltip.vue'
2+
export { default as TooltipContent } from './TooltipContent.vue'
3+
export { default as TooltipProvider } from './TooltipProvider.vue'
4+
export { default as TooltipTrigger } from './TooltipTrigger.vue'

0 commit comments

Comments
 (0)