Skip to content

Commit

Permalink
add tooltip component and new sponsors to the readme file
Browse files Browse the repository at this point in the history
  • Loading branch information
piotrkulpinski committed Jul 24, 2024
1 parent d2a0006 commit cdd48fa
Show file tree
Hide file tree
Showing 7 changed files with 220 additions and 1 deletion.
11 changes: 10 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,16 @@ OpenAlternative is an GPL-3.0-licensed open source project with its ongoing deve

<p align="center">
<a target="_blank" href="https://preline.co">
<img alt="sponsor preline" src="https://openalternative.co/sponsors/preline.svg" width="140">
<img alt="Sponsor – PrelineUI" src="https://openalternative.co/sponsors/preline.svg" height="32">
</a>
<a target="_blank" href="https://efficient.link/ea/openalternative">
<img alt="Sponsor – Efficient App" src="https://openalternative.co/sponsors/efficient.svg" height="32">
</a>
<a target="_blank" href="https://kulp.in/screenshotone">
<img alt="Sponsor – ScreenshotOne" src="https://openalternative.co/sponsors/screenshotone.svg" height="32">
</a>
<a target="_blank" href="https://apitoolkit.io">
<img alt="Sponsor – APItoolkit" src="https://openalternative.co/sponsors/apitoolkit.svg" height="32">
</a>
</p>

Expand Down
112 changes: 112 additions & 0 deletions app/components/Tooltip.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
import * as TooltipPrimitive from "@radix-ui/react-tooltip"
import type { ComponentPropsWithoutRef, ElementRef, ReactNode } from "react"
import { forwardRef } from "react"
import { VariantProps, cva, cx } from "~/utils/cva"

export const tooltipVariants = cva({
base: [
"z-50 px-2.5 py-1 min-h-6 max-w-[12rem] inline-flex items-center gap-2 rounded-md bg-background text-sm/tight text-pretty font-medium invert pointer-events-none outline-none select-none shadow-[hsl(206_22%_7%_/_35%)_0px_10px_38px_-10px,_hsl(206_22%_7%_/_20%)_0px_10px_20px_-15px] will-change-[transform,opacity]",
"animate-in fade-in-0 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 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",
],

variants: {
align: {
start: "text-start",
center: "text-center",
end: "text-end",
},
},

defaultVariants: {
align: "center",
},
})

export const tooltipArrowVariants = cva({
base: "w-2 h-1 block fill-background",
})

export type TooltipElement = ElementRef<typeof TooltipPrimitive.Trigger>
export type TooltipProps = ComponentPropsWithoutRef<typeof TooltipPrimitive.Root> &
ComponentPropsWithoutRef<typeof TooltipContent> & {
tooltip: ReactNode
}

export const TooltipProvider = TooltipPrimitive.Provider
export const TooltipRoot = TooltipPrimitive.Root
export const TooltipTrigger = TooltipPrimitive.Trigger
export const TooltipPortal = TooltipPrimitive.Portal

export const TooltipContent = forwardRef<
ElementRef<typeof TooltipPrimitive.Content>,
ComponentPropsWithoutRef<typeof TooltipPrimitive.Content> & VariantProps<typeof tooltipVariants>
>((props, ref) => {
const {
children,
className,
align = "center",
collisionPadding = 5,
sideOffset = 4,
...rest
} = props

return (
<TooltipPrimitive.Content
ref={ref}
align={align}
collisionPadding={collisionPadding}
sideOffset={sideOffset}
className={cx(tooltipVariants({ align, className }))}
{...rest}
>
{children}
<TooltipArrow />
</TooltipPrimitive.Content>
)
})
TooltipContent.displayName = TooltipPrimitive.Content.displayName

export const TooltipArrow = forwardRef<
ElementRef<typeof TooltipPrimitive.Arrow>,
ComponentPropsWithoutRef<typeof TooltipPrimitive.Arrow> &
VariantProps<typeof tooltipArrowVariants>
>(({ className, ...props }, ref) => (
<TooltipPrimitive.Arrow
ref={ref}
className={cx(tooltipArrowVariants({ className }))}
{...props}
/>
))
TooltipArrow.displayName = TooltipPrimitive.Arrow.displayName

export const TooltipBase = forwardRef<TooltipElement, TooltipProps>((props, ref) => {
const { children, className, delayDuration = 0, tooltip, ...rest } = props

if (!tooltip) {
return children
}

return (
<TooltipPrimitive.Provider disableHoverableContent>
<TooltipPrimitive.Root delayDuration={delayDuration}>
<TooltipPrimitive.Trigger ref={ref} className={className} asChild>
{children}
</TooltipPrimitive.Trigger>

<TooltipPrimitive.Portal>
<TooltipContent {...rest}>{tooltip}</TooltipContent>
</TooltipPrimitive.Portal>
</TooltipPrimitive.Root>
</TooltipPrimitive.Provider>
)
})
TooltipBase.displayName = "Tooltip"

export const Tooltip = Object.assign(TooltipBase, {
Provider: TooltipProvider,
Root: TooltipRoot,
Trigger: TooltipTrigger,
Portal: TooltipPortal,
Content: TooltipContent,
Arrow: TooltipArrow,
})
Binary file modified bun.lockb
Binary file not shown.
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
"@radix-ui/react-dropdown-menu": "^2.0.6",
"@radix-ui/react-slider": "^1.1.2",
"@radix-ui/react-slot": "^1.0.2",
"@radix-ui/react-tooltip": "^1.1.2",
"@remix-run/node": "^2.10.0",
"@remix-run/react": "^2.10.0",
"@remix-run/serve": "^2.10.0",
Expand Down
Loading

0 comments on commit cdd48fa

Please sign in to comment.