Slide Icon Button

A button with a sliding icon overlay that expands on hover, smoothly transitioning the icon while fading out the label for a clean, directional interaction.

Installation

npx shadcn@latest add https://fluxbuttons.vercel.app/r/slide-icon-button.json
slide-icon-button.tsx
"use client"

import * as React from "react"
import { cn } from "@/lib/utils"
import { ArrowLeft } from "lucide-react"

export interface SlideIconButtonProps
extends React.ButtonHTMLAttributes<HTMLButtonElement> {
slideColor?: string
icon?: React.ReactNode
direction?: "left" | "right"
}

const SlideIconButton = React.forwardRef<HTMLButtonElement, SlideIconButtonProps>(
(
  {
    className,
    children,
    slideColor = "#4ade80",
    icon,
    direction = "left",
    ...props
  },
  ref
) => {
  const isLeft = direction === "left"

  return (
    <button
      ref={ref}
      type="button"
      className={cn(
        "group relative h-12 overflow-hidden rounded-md",
        "bg-white backdrop-blur-md border border-black/10",
        "shadow-[0_4px_20px_rgba(0,0,0,0.08)]",
        "text-black font-semibold text-base",
        "transition-all duration-300 active:scale-[0.98]",
        "px-4",
        className
      )}
      {...props}
    >
     
      <div
        className={cn(
          "absolute top-1 bottom-1 z-10 flex items-center justify-center",
          "rounded-md transition-all duration-500 ease-[cubic-bezier(.22,1,.36,1)]",
          "group-hover:w-[calc(100%-8px)]",
          isLeft ? "left-1 w-12" : "right-1 w-12"
        )}
        style={{ backgroundColor: slideColor }}
      >
        <span className="transition-transform duration-300 group-hover:scale-110">
          {icon ? (
            icon
          ) : isLeft ? (
            <ArrowLeft className="w-5 h-5 text-black" />
          ) : (
            <svg viewBox="0 0 24 24" className="w-5 h-5 text-black">
              <path
                d="M5 12h14M13 5l7 7-7 7"
                stroke="currentColor"
                strokeWidth="2"
                fill="none"
                strokeLinecap="round"
                strokeLinejoin="round"
              />
            </svg>
          )}
        </span>
      </div>

      <span
        className={cn(
          "relative z-20 flex h-full items-center justify-center gap-6 whitespace-nowrap",
          "transition-opacity duration-300 group-hover:opacity-0"
        )}
      >
        {isLeft && (
          <span className="w-5 h-5 flex-shrink-0" />
        )}
        <span>{children || (isLeft ? "Go Back" : "Go Forward")}</span>
        {!isLeft && (
          <span className="w-5 h-5 flex-shrink-0" />
        )}
      </span>
    </button>
  )
}
)

SlideIconButton.displayName = "SlideIconButton"
export default SlideIconButton

Usage

usage.tsx
import SlideIconButtonPreview from "@/components/ui/slide-icon-button";

const SlideIconButtonPreview=()=>{
    return(
        <SlideIconButton >Hover Me</SlideIconButton>
    )
}
export default SlideIconButtonPreview

Examples

Icon

usage.tsx
import SlideIconButtonIcon from "@/components/ui/slide-icon-button";

const SlideIconButtonIcon=()=>{
    return(
        <SlideIconButton icon={<Instagram/>}>Instagram</SlideIconButton>
    )
}

export default SlideIconButtonIcon

Direction

usage.tsx
import SlideIconButton from "@/components/ui/slide-icon-button";

const SlideIconButtonPreviewDirection=()=>{
    return(
        <SlideIconButton direction="right">Hover Me </SlideIconButton>
    )
}

export default SlideIconButtonPreviewDirection

Slide Color

usage.tsx
import SlideIconButton from "@/components/ui/slide-icon-button";

const SlideIconButtonSlideColor = () => {
  return <SlideIconButton slideColor="#f87070ff">Hover Me</SlideIconButton>;
};

export default SlideIconButtonSlideColor

API Reference

Slide Icon Button

The Slide Icon Button component is a wrapper around the button element that adds a variety of styles and functionality.

Prop

Type

On this page