chadtmiller.com/pds.js
An atproto PDS in JavaScript, for Cloudflare Workers and Node
0
0
import { cva } from 'class-variance-authority';
import { cn } from '#/lib/utils.js';
const buttonVariants = cva(
"inline-flex shrink-0 cursor-pointer items-center justify-center gap-2 rounded-xl text-sm font-semibold whitespace-nowrap transition-all outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/30 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
{
variants: {
variant: {
default: 'bg-primary text-primary-foreground hover:bg-primary/90',
destructive:
'bg-destructive text-primary-foreground hover:bg-destructive/90 focus-visible:ring-destructive/30',
outline:
'border border-input bg-background hover:bg-accent hover:text-accent-foreground',
secondary:
'bg-secondary text-secondary-foreground hover:bg-secondary/80',
ghost: 'hover:bg-accent hover:text-accent-foreground',
link: 'text-primary underline-offset-4 hover:underline',
// A card-shaped button: the surface and hover of a tile, with layout
// (direction, padding) left to the caller.
tile: 'w-full rounded-2xl border border-border bg-muted text-left hover:border-input hover:bg-accent',
// A full-width dashed affordance, e.g. "add a passkey".
dashed:
'w-full rounded-2xl border border-border border-dashed bg-transparent text-faint hover:border-ring hover:text-key',
},
size: {
default: 'h-9 px-4 py-2 has-[>svg]:px-3',
xs: "h-6 gap-1 px-2 text-xs has-[>svg]:px-1.5 [&_svg:not([class*='size-'])]:size-3",
sm: 'h-8 gap-1.5 px-3 has-[>svg]:px-2.5',
lg: 'h-10 px-6 has-[>svg]:px-4',
// A prominent header/action pill.
pill: 'h-11 px-5 text-[13px] font-extrabold',
// A full-width block CTA, the same height as an input.
block: 'h-11 w-full',
// A free-height surface sized by its own padding (tiles, dashed).
surface: 'h-auto',
icon: 'size-9',
'icon-xs': "size-6 [&_svg:not([class*='size-'])]:size-3",
'icon-sm': 'size-8',
'icon-lg': 'size-10',
},
},
defaultVariants: {
variant: 'default',
size: 'default',
},
},
);
function Button({
className,
variant = 'default',
size = 'default',
type = 'button',
...props
}) {
return (
<button
type={type}
data-slot="button"
data-variant={variant}
data-size={size}
className={cn(buttonVariants({ variant, size, className }))}
{...props}
/>
);
}
export { Button, buttonVariants };