Buttons buttonglassgradientanimated

Glass Button

A premium button with glassmorphism effect, gradient border and smooth hover animations.

Preview

Usage

Copy the full block below to use this component with its imports.

astro
---
import { GlassButton } from 'astro-component-kit';
---

<div class="button-group">
  <GlassButton variant="primary">Explore Now</GlassButton>
  <GlassButton variant="secondary">View Docs</GlassButton>
  <GlassButton variant="ghost">Learn More</GlassButton>
</div>
--- import { GlassButton } from 'astro-component-kit'; --- <div class="button-group"> <GlassButton variant="primary">Explore Now</GlassButton> <GlassButton variant="secondary">View Docs</GlassButton> <GlassButton variant="ghost">Learn More</GlassButton> </div>

Manual Installation

If you are not using the npm package, create a new file src/components/lib/GlassButton.astro and paste the following code:

astro
---
interface Props {
  href?: string;
  type?: 'button' | 'submit' | 'reset';
  variant?: 'primary' | 'secondary' | 'ghost';
  size?: 'sm' | 'md' | 'lg';
  disabled?: boolean;
}

const { href, type = 'button', variant = 'primary', size = 'md', disabled = false } = Astro.props;
const Tag = href ? 'a' : 'button';
---
<Tag 
  href={href} 
  type={href ? undefined : type}
  disabled={disabled} 
  class={`glass-btn glass-btn--${variant} glass-btn--${size}`}
>
  <span class="glass-btn__shimmer"></span>
  <span class="glass-btn__content">
    <slot />
  </span>
</Tag>

<style>
  .glass-btn {
    --btn-bg: rgba(255, 255, 255, 0.05);
    --btn-border: rgba(255, 255, 255, 0.1);
    --btn-text: var(--c-text-1, #d4d4d4);
    --btn-glow: rgba(184, 134, 11, 0);
    
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 0.6rem;
    font-family: var(--font-sans, inherit);
    font-weight: 600;
    letter-spacing: 0.02em;
    border-radius: var(--r-md, 12px);
    cursor: pointer;
    text-decoration: none;
    border: 1px solid var(--btn-border);
    background: var(--btn-bg);
    backdrop-filter: blur(12px);
    -webkit-backdrop-filter: blur(12px);
    position: relative;
    transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
    white-space: nowrap;
    user-select: none;
    overflow: hidden;
    color: var(--btn-text);
  }

  /* Shimmer Effect */
  .glass-btn__shimmer {
    position: absolute;
    inset: 0;
    background: linear-gradient(
      90deg,
      transparent,
      rgba(255, 255, 255, 0.05),
      rgba(255, 255, 255, 0.15),
      rgba(255, 255, 255, 0.05),
      transparent
    );
    transform: translateX(-100%);
    transition: transform 0.6s ease;
    pointer-events: none;
  }

  .glass-btn:hover:not(:disabled) .glass-btn__shimmer {
    transform: translateX(100%);
  }

  /* Glass Border Glow */
  .glass-btn::after {
    content: '';
    position: absolute;
    inset: 0;
    border-radius: inherit;
    padding: 1px;
    background: linear-gradient(135deg, rgba(255,255,255,0.2), transparent, rgba(255,255,255,0.05));
    -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
    -webkit-mask-composite: xor;
    mask-composite: exclude;
    pointer-events: none;
    opacity: 0.5;
    transition: opacity 0.3s ease;
  }

  .glass-btn:hover:not(:disabled)::after {
    opacity: 1;
  }

  .glass-btn:hover:not(:disabled) {
    transform: translateY(-2px);
    border-color: rgba(255, 255, 255, 0.2);
    box-shadow: 0 10px 30px -10px var(--btn-glow);
  }

  .glass-btn:active:not(:disabled) {
    transform: translateY(0) scale(0.98);
  }

  .glass-btn:disabled {
    opacity: 0.4;
    cursor: not-allowed;
    filter: grayscale(1);
  }

  /* Variants */
  .glass-btn--primary {
    --btn-bg: linear-gradient(135deg, rgba(184, 134, 11, 0.7), rgba(212, 160, 23, 0.7));
    --btn-text: #0a0a0a;
    --btn-glow: rgba(184, 134, 11, 0.4);
    border-color: rgba(255, 255, 255, 0.1);
  }

  .glass-btn--secondary {
    --btn-bg: rgba(255, 255, 255, 0.03);
    --btn-glow: rgba(255, 255, 255, 0.1);
  }

  .glass-btn--ghost {
    --btn-bg: transparent;
    --btn-text: var(--c-primary-light, #d4a017);
    --btn-border: rgba(184, 134, 11, 0.25);
    --btn-glow: rgba(184, 134, 11, 0.15);
    backdrop-filter: none;
  }

  .glass-btn--ghost:hover:not(:disabled) {
    background: rgba(184, 134, 11, 0.08);
    border-color: rgba(184, 134, 11, 0.4);
  }

  /* Sizes */
  .glass-btn--sm { padding: 0.45rem 1.1rem; font-size: 0.85rem; }
  .glass-btn--md { padding: 0.75rem 1.6rem; font-size: 0.95rem; }
  .glass-btn--lg { padding: 1.1rem 2.4rem; font-size: 1.1rem; }
</style>
--- interface Props { href?: string; type?: 'button' | 'submit' | 'reset'; variant?: 'primary' | 'secondary' | 'ghost'; size?: 'sm' | 'md' | 'lg'; disabled?: boolean; } const { href, type = 'button', variant = 'primary', size = 'md', disabled = false } = Astro.props; const Tag = href ? 'a' : 'button'; --- <Tag href={href} type={href ? undefined : type} disabled={disabled} class={`glass-btn glass-btn--${variant} glass-btn--${size}`} > <span class="glass-btn__shimmer"></span> <span class="glass-btn__content"> <slot /> </span> </Tag> <style> .glass-btn { --btn-bg: rgba(255, 255, 255, 0.05); --btn-border: rgba(255, 255, 255, 0.1); --btn-text: var(--c-text-1, #d4d4d4); --btn-glow: rgba(184, 134, 11, 0); display: inline-flex; align-items: center; justify-content: center; gap: 0.6rem; font-family: var(--font-sans, inherit); font-weight: 600; letter-spacing: 0.02em; border-radius: var(--r-md, 12px); cursor: pointer; text-decoration: none; border: 1px solid var(--btn-border); background: var(--btn-bg); backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); position: relative; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); white-space: nowrap; user-select: none; overflow: hidden; color: var(--btn-text); } /* Shimmer Effect */ .glass-btn__shimmer { position: absolute; inset: 0; background: linear-gradient( 90deg, transparent, rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0.05), transparent ); transform: translateX(-100%); transition: transform 0.6s ease; pointer-events: none; } .glass-btn:hover:not(:disabled) .glass-btn__shimmer { transform: translateX(100%); } /* Glass Border Glow */ .glass-btn::after { content: ''; position: absolute; inset: 0; border-radius: inherit; padding: 1px; background: linear-gradient(135deg, rgba(255,255,255,0.2), transparent, rgba(255,255,255,0.05)); -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); -webkit-mask-composite: xor; mask-composite: exclude; pointer-events: none; opacity: 0.5; transition: opacity 0.3s ease; } .glass-btn:hover:not(:disabled)::after { opacity: 1; } .glass-btn:hover:not(:disabled) { transform: translateY(-2px); border-color: rgba(255, 255, 255, 0.2); box-shadow: 0 10px 30px -10px var(--btn-glow); } .glass-btn:active:not(:disabled) { transform: translateY(0) scale(0.98); } .glass-btn:disabled { opacity: 0.4; cursor: not-allowed; filter: grayscale(1); } /* Variants */ .glass-btn--primary { --btn-bg: linear-gradient(135deg, rgba(184, 134, 11, 0.7), rgba(212, 160, 23, 0.7)); --btn-text: #0a0a0a; --btn-glow: rgba(184, 134, 11, 0.4); border-color: rgba(255, 255, 255, 0.1); } .glass-btn--secondary { --btn-bg: rgba(255, 255, 255, 0.03); --btn-glow: rgba(255, 255, 255, 0.1); } .glass-btn--ghost { --btn-bg: transparent; --btn-text: var(--c-primary-light, #d4a017); --btn-border: rgba(184, 134, 11, 0.25); --btn-glow: rgba(184, 134, 11, 0.15); backdrop-filter: none; } .glass-btn--ghost:hover:not(:disabled) { background: rgba(184, 134, 11, 0.08); border-color: rgba(184, 134, 11, 0.4); } /* Sizes */ .glass-btn--sm { padding: 0.45rem 1.1rem; font-size: 0.85rem; } .glass-btn--md { padding: 0.75rem 1.6rem; font-size: 0.95rem; } .glass-btn--lg { padding: 1.1rem 2.4rem; font-size: 1.1rem; } </style>

Quick Info

Category
Buttons
Filename
GlassButton.astro
Dependencies
None — pure Astro + CSS
Tags
buttonglassgradientanimated