1 звезда на GitHub = 1 новый компонент.

Поставить звезду
Кнопкиbuttonpremium

Retro Shadow Button

Необруталистическая кнопка с жесткой тенью и физическим откликом при клике.

Живое превью

Использование

Скопируйте и вставьте этот код в ваш React-компонент:

tsx
import { RetroShadowButton } from 'react-component-kit-ui/buttons';

<RetroShadowButton variant="lime">Subscribe</RetroShadowButton>

Ручная установка

Если вы не используете пакет npm, создайте файл и вставьте следующий код: src/components/RetroShadowButton.tsx + RetroShadowButton.css:

RetroShadowButton.tsx
'use client';

import type { ElementType, HTMLAttributes, ReactNode } from 'react';
import './RetroShadowButton.css';

/**
 * RetroShadowButton — A sharp-edged neo-brutalist button with a thick solid block shadow.
 */
export interface RetroShadowButtonProps extends HTMLAttributes<HTMLElement> {
  href?: string;
  target?: string;
  rel?: string;
  type?: 'button' | 'submit' | 'reset';
  variant?: 'pink' | 'cyan' | 'yellow' | 'lime';
  size?: 'sm' | 'md' | 'lg';
  disabled?: boolean;
  children?: ReactNode;
}

export function RetroShadowButton({
  href,
  type = 'button',
  variant = 'pink',
  size = 'md',
  disabled = false,
  className,
  children,
  ...rest
}: RetroShadowButtonProps) {
  const Tag: ElementType = href ? 'a' : 'button';
  return (
    <Tag
      {...rest}
      href={href}
      type={href ? undefined : type}
      disabled={href ? undefined : disabled}
      aria-disabled={href && disabled ? true : undefined}
      className={['retro-shadow-btn', `retro-shadow-btn--${variant}`, `retro-shadow-btn--${size}`, className].filter(Boolean).join(' ')}
    >
      {children}
    </Tag>
  );
}

export default RetroShadowButton;
RetroShadowButton.css
/* RetroShadowButton — ported from astro-component-kit (buttons/RetroShadowButton.astro) */

.retro-shadow-btn {
  --btn-bg: #ff7eb3;
  --shadow-color: #000;
  --shadow-offset: 6px;
  
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: var(--btn-bg);
  color: #000;
  border: 3px solid #000;
  font-family: var(--font-sans, inherit);
  font-weight: 800;
  text-transform: uppercase;
  cursor: pointer;
  text-decoration: none;
  transition: all 0.1s;
  box-shadow: var(--shadow-offset) var(--shadow-offset) 0 var(--shadow-color);
  user-select: none;
  white-space: nowrap;
}

.retro-shadow-btn:hover:not(:disabled) {
  transform: translate(calc(var(--shadow-offset) * -0.2), calc(var(--shadow-offset) * -0.2));
  box-shadow: calc(var(--shadow-offset) * 1.2) calc(var(--shadow-offset) * 1.2) 0 var(--shadow-color);
}

.retro-shadow-btn:active:not(:disabled) {
  transform: translate(calc(var(--shadow-offset) * 0.5), calc(var(--shadow-offset) * 0.5));
  box-shadow: calc(var(--shadow-offset) * 0.5) calc(var(--shadow-offset) * 0.5) 0 var(--shadow-color);
}

.retro-shadow-btn:disabled {
  opacity: 0.6;
  cursor: not-allowed;
  filter: grayscale(0.5);
  box-shadow: 2px 2px 0 var(--shadow-color);
}

/* Variants (90s Palette) */
.retro-shadow-btn--pink { --btn-bg: #ff7eb3; }
.retro-shadow-btn--cyan { --btn-bg: #00f5ff; }
.retro-shadow-btn--yellow { --btn-bg: #fff01f; }
.retro-shadow-btn--lime { --btn-bg: #bfff00; }

/* Sizes */
.retro-shadow-btn--sm { padding: 0.4rem 1rem; font-size: 0.85rem; --shadow-offset: 4px; border-width: 2px; }
.retro-shadow-btn--md { padding: 0.7rem 1.6rem; font-size: 1rem; --shadow-offset: 6px; border-width: 3px; }
.retro-shadow-btn--lg { padding: 1rem 2.2rem; font-size: 1.2rem; --shadow-offset: 8px; border-width: 4px; }

Краткая информация

Категория
Кнопки
Имя файла
RetroShadowButton.tsx
Зависимости
Нет — чистый React + CSS
Теги
buttonpremium