DECK // NEXTUI
Button
Skate deck art button with primary, secondary, and ghost variants in three sizes. Rough-cut clip-path corners, spray-paint orange accent. Renders as a Next.js Link when an href is provided.
$
Or install the base component for free:
Live Preview
Open full demoUsage
TSX
<Button variant="primary" size="md">Get started</Button>Variants
<Button variant="primary">Get started</Button>
<Button variant="secondary">Learn more</Button>
<Button variant="ghost">Cancel</Button>
<Button variant="primary" size="sm">Apply</Button>
<Button variant="primary" size="lg">Sign up</Button>
Source
TSX
import Link from 'next/link'
import { cn } from '@/lib/utils'
interface ButtonBaseProps {
variant?: 'primary' | 'secondary' | 'ghost'
size?: 'sm' | 'md' | 'lg'
className?: string
children: React.ReactNode
}
type ButtonAsButton = ButtonBaseProps &
Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, keyof ButtonBaseProps> & {
href?: never
}
type ButtonAsLink = ButtonBaseProps & {
href: string
}
type ButtonProps = ButtonAsButton | ButtonAsLink
const SIZE_CLASSES: Record<NonNullable<ButtonBaseProps['size']>, string> = {
sm: 'btn-sm',
md: 'btn-md',
lg: 'btn-lg',
}
const VARIANT_CLASSES: Record<NonNullable<ButtonBaseProps['variant']>, string> = {
primary: 'btn-primary',
secondary: 'btn-secondary',
ghost: 'btn-ghost',
}
export function Button({
children,
variant = 'primary',
size = 'md',
className,
...props
}: ButtonProps): React.JSX.Element {
const classes = cn('btn-base', SIZE_CLASSES[size], VARIANT_CLASSES[variant], className)
if ('href' in props && props.href !== undefined) {
const { href, ...linkProps } = props
return (
<Link href={href} className={classes} {...linkProps}>
{children}
</Link>
)
}
const { type = 'button', ...buttonProps } = props as React.ButtonHTMLAttributes<HTMLButtonElement>
return (
<button type={type} className={classes} {...buttonProps}>
{children}
</button>
)
}
Works withNext.js 15React 19Tailwind v4TypeScript 5
More from DECK // NEXT
Badge
Spray-paint styled badge with four color variants: orange, yellow, ink, and dim. Suited for category labels, tags, and status indicators.
Text
Polymorphic text primitive with body, caption, label, and code variants. IBM Plex Mono body font. Renders as p, span, or div via the `as` prop.
Card
Composable card with Card, CardHeader, CardBody, and CardFooter sub-components. Dark woodgrain surfaces with spray-paint accent borders.