diff --git a/src/components/features/ToolbarButton.tsx b/src/components/features/ToolbarButton.tsx index ed6c67d469..33fff63f6a 100644 --- a/src/components/features/ToolbarButton.tsx +++ b/src/components/features/ToolbarButton.tsx @@ -6,6 +6,8 @@ import { } from "@fortawesome/react-fontawesome"; import { IconDefinition } from "@fortawesome/pro-solid-svg-icons"; +import { Tooltip } from "~/components/ui"; + export interface ToolbarButtonProps extends ButtonHTMLAttributes { active?: boolean; @@ -13,11 +15,13 @@ export interface ToolbarButtonProps export const ToolbarButton = ({ icon, + tooltip, onClick, buttonProps = {}, iconProps, }: { icon: IconDefinition; + tooltip?: string; onClick?: MouseEventHandler; buttonProps?: ToolbarButtonProps; iconProps?: Omit; @@ -35,7 +39,8 @@ export const ToolbarButton = ({ active && "pointer-events-none text-primary ", customButtonClassNames, ); - return ( + + const Button = ( ); + if (tooltip) { + return {Button}; + } + return Button; }; diff --git a/src/components/features/ToolbarImage/data.ts b/src/components/features/ToolbarImage/data.ts index 2d9d3b9acd..e6b8a0916d 100644 --- a/src/components/features/ToolbarImage/data.ts +++ b/src/components/features/ToolbarImage/data.ts @@ -12,25 +12,31 @@ export const ToolbarImageButtonData = [ { name: ToolbarImageButtonNames.MOVE, icon: faArrowsUpDownLeftRight, + tooltip: "Move", }, { name: ToolbarImageButtonNames.ROTATE, icon: faArrowsRotate, + tooltip: "Rotate", }, { name: ToolbarImageButtonNames.AI_STYLIZE, icon: faHatWitch, + tooltip: "AI Stylize", }, { name: ToolbarImageButtonNames.MOVE_LAYER_UP, icon: faArrowUpFromLine, + tooltip: "Move Layer Up", }, { name: ToolbarImageButtonNames.MOVE_LAYER_DOWN, icon: faArrowDownFromLine, + tooltip: "Move Layer Down", }, { name: ToolbarImageButtonNames.DELETE, icon: faTrashCan, + tooltip: "Delete", }, ]; diff --git a/src/components/features/ToolbarImage/index.tsx b/src/components/features/ToolbarImage/index.tsx index cd9446aedd..31c987273e 100644 --- a/src/components/features/ToolbarImage/index.tsx +++ b/src/components/features/ToolbarImage/index.tsx @@ -35,6 +35,7 @@ export const ToolbarImage = ({ disabled, buttonsProps }: ToolbarImageProps) => { return ( diff --git a/src/components/ui/Tooltip.tsx b/src/components/ui/Tooltip.tsx new file mode 100644 index 0000000000..30472eb9d6 --- /dev/null +++ b/src/components/ui/Tooltip.tsx @@ -0,0 +1,28 @@ +import { cloneElement, ReactElement, JSXElementConstructor } from "react"; +import { twMerge } from "tailwind-merge"; + +export const Tooltip = ({ + tip, + children, +}: { + tip: string; + children: ReactElement>; +}) => { + const clonedChildren = cloneElement(children, { + tooltip: tip, + className: twMerge( + "before:w-0 before:h-0 before:absolute", + "before:left-1/2 before:bottom-full before:mb-[1px] before:-translate-x-1/2 before:z-50", + "before:border-l-8 before:border-l-transparent", + "before:border-r-8 before:border-r-transparent", + "before:border-t-8 before:border-t-white", + "after:absolute after:left-1/2 after:bottom-full after:-translate-x-1/2 after:z-40 ", + "after:content-[attr(tooltip)] after:text-black after:text-nowrap", + "after:rounded-xl after:border after:border-ui-border after:bg-ui-panel after:px-2 after:py-1 after:mb-2 after:shadow-xl", + "after:hidden before:hidden hover:after:block hover:before:block", + "relative", + children.props.className, + ), + }); + return clonedChildren; +}; diff --git a/src/components/ui/index.ts b/src/components/ui/index.ts index 540a31bc9c..fd5527f7c3 100644 --- a/src/components/ui/index.ts +++ b/src/components/ui/index.ts @@ -5,3 +5,4 @@ export * from "./LoadingSpinner"; export * from "./PanelBottom"; export * from "./PanelRight"; export * from "./Spinner"; +export * from "./Tooltip";