←
Vintage Leather & Brass Button

Vintage Leather & Brass Button

Heritage Leather

Luxury embossed heritage leather & brass button with 6px bottom tactile bevel lip, recessed enclosure tray, and filigree scrollwork corner flourishes.

Interactive Playground & Studio

Live Controls
vintage-leather-cta.tsx
Hover or click to interact
Customizer
PRESETS & VARIATIONS

All Variants & Themes

Click to test interactive spring physics on every theme

Heritage Brasstheme="heritage"

1:1 reference design with embossed cowhide leather & brass lip.

UI Pirate Bronzetheme="uipirate"

Signature magma orange leather with filigree corner ornaments.

Obsidian Platinumtheme="obsidian"

Stealth midnight black leather with platinum bevel edging.

Emerald Imperialtheme="emerald"

Royal jade leather with golden scrollwork corner flourishes.

Ruby Royaltytheme="ruby"

Deep burgundy wine leather with gilded golden tactile bevel.

Silver Armourtheme="silver"

Medieval steel & silver chassis with filigree corner ornaments.

Features & Physics

✓Embossed heritage leather texture with brass lip
✓Filigree scrollwork corner ornaments
✓Recessed enclosure tray with tactile 3D bevel
✓6 Luxury artisanal themes

Code & Integration

Customized live with your active playground prop settings:

"use client";

import React, { useState } from "react";
import { motion } from "framer-motion";

export type VintageLeatherTheme = "heritage" | "uipirate" | "obsidian" | "emerald" | "ruby" | "silver";
export type VintageLeatherSize = "xs" | "sm" | "md" | "lg" | "xl";

export interface VintageLeatherCTAProps {
  label?: string;
  theme?: VintageLeatherTheme;
  size?: VintageLeatherSize;
  showOrnaments?: boolean;
  onClick?: () => void;
  className?: string;
}

export function VintageLeatherCTA({
  label = "Shop ties",
  theme = "heritage",
  size = "md",
  showOrnaments = true,
  onClick,
  className = "",
}: VintageLeatherCTAProps) {
  const [isHovered, setIsHovered] = useState(false);
  const [isPressed, setIsPressed] = useState(false);

  const themeConfig = {
    heritage: {
      bg: "bg-gradient-to-b from-[#B4986C] via-[#94774B] to-[#715428]",
      border: "border-[#C9B086]/60",
      text: "text-[#3D260D]",
      shadow: "shadow-[0_8px_16px_rgba(113,84,40,0.3),inset_0_2px_0_rgba(255,255,255,0.4)]",
    },
    uipirate: {
      bg: "bg-gradient-to-b from-[#FF5B04] via-[#D94500] to-[#A33000]",
      border: "border-orange-400/60",
      text: "text-white",
      shadow: "shadow-[0_8px_16px_rgba(255,91,4,0.35),inset_0_2px_0_rgba(255,255,255,0.4)]",
    },
    obsidian: {
      bg: "bg-gradient-to-b from-[#2A2D35] via-[#1A1C22] to-[#0E1014]",
      border: "border-white/20",
      text: "text-[#E6C687]",
      shadow: "shadow-[0_8px_16px_rgba(0,0,0,0.6),inset_0_2px_0_rgba(255,255,255,0.2)]",
    },
  }[theme as "heritage" | "uipirate" | "obsidian"] || {
    bg: "bg-gradient-to-b from-[#B4986C] via-[#94774B] to-[#715428]",
    border: "border-[#C9B086]/60",
    text: "text-[#3D260D]",
    shadow: "shadow-[0_8px_16px_rgba(113,84,40,0.3),inset_0_2px_0_rgba(255,255,255,0.4)]",
  };

  return (
    <motion.button
      type="button"
      onClick={onClick}
      onMouseEnter={() => setIsHovered(true)}
      onMouseLeave={() => {
        setIsHovered(false);
        setIsPressed(false);
      }}
      onMouseDown={() => setIsPressed(true)}
      onMouseUp={() => setIsPressed(false)}
      animate={{
        y: isPressed ? 2 : isHovered ? -3 : 0,
        scale: isPressed ? 0.98 : 1,
      }}
      transition={{ type: "spring", stiffness: 450, damping: 25 }}
      className={`relative px-8 py-3.5 rounded-[18px] ${themeConfig.bg} ${themeConfig.border} border ${themeConfig.shadow} ${themeConfig.text} font-serif font-bold text-sm tracking-wide cursor-pointer focus:outline-none select-none ${className}`}
    >
      <span className="relative z-10 uppercase tracking-widest">{label}</span>
    </motion.button>
  );
}

Peer Dependencies

Requires Framer Motion and Tailwind CSS for spring physics and layout tokens:

npm install framer-motion clsx lucide-react tailwind-merge

API & Props Reference

PropTypeDefaultDescription
labelstring"Shop ties"Artisanal CTA label.
theme"heritage" | "uipirate" | "obsidian" | "emerald" | "ruby" | "silver""heritage"Leather color palette.
size"xs" | "sm" | "md" | "lg" | "xl""md"Size dimensions.
showOrnamentsbooleantrueWhether to display the decorative filigree scrollwork corner flourishes.