{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "z-button",
  "title": "Z Button",
  "dependencies": [],
  "devDependencies": [],
  "registryDependencies": [
    "https://ui.orchid.ai/r/orchid-foundation.json",
    "https://ui.orchid.ai/r/orchid-theme.json"
  ],
  "files": [
    {
      "path": "registry/ui/orchid/spectrum/atoms/z-button/z-button.tsx",
      "content": "\"use client\";\nimport { Link as RouterLink } from \"../../../adapters/navigation\";\nimport { Orchid } from \"../../../icons\";\nimport type { HeroIcon } from \"../../../lib/types\";\nimport { cn } from \"../../../lib/ui-utils\";\ntype ButtonVariant = 'primary' | 'secondary' | 'transparent';\ntype ButtonSize = 'xs' | 'sm' | 'md' | 'lg';\ntype Props = {\n    href?: string;\n    children?: React.ReactNode;\n    leading?: React.ReactNode;\n    trailing?: React.ReactNode;\n    leadingIcon?: HeroIcon;\n    trailingIcon?: HeroIcon;\n    size?: ButtonSize;\n    variant?: ButtonVariant;\n    onClick?: (e: React.MouseEvent<HTMLElement>) => void;\n    className?: string;\n    asChild?: boolean;\n    disabled?: boolean;\n    loading?: boolean;\n    prefetch?: boolean | 'auto';\n    pressed?: boolean;\n    tabIndex?: number;\n    title?: string;\n    type?: 'button' | 'submit' | 'reset';\n    ariaLabel?: string;\n    target?: React.HTMLAttributeAnchorTarget;\n    rel?: string;\n};\nconst sizeClasses: Record<ButtonSize, string> = {\n    xs: 'h-5 px-1',\n    sm: 'h-7 px-1.5',\n    md: 'h-8 px-2',\n    lg: 'h-9 px-3',\n};\nconst iconOnlySizeClasses: Record<ButtonSize, string> = {\n    xs: 'size-5 min-w-5 min-h-5',\n    sm: 'size-7 min-w-7 min-h-7',\n    md: 'size-8 min-w-8 min-h-8',\n    lg: 'size-9 min-w-9 min-h-9',\n};\nconst variantClasses: Record<ButtonVariant, string> = {\n    primary: 'bg-gradient-to-t from-surface to-surface border-neutral shadow-xs group-hover/button:to-surface-weak dark:group-hover/button:to-surface-strong inset-0',\n    secondary: 'bg-surface-weak border-transparent group-hover/button:bg-surface-strong group-hover/button:border-neutral group-hover/button:shadow-xs inset-0',\n    transparent: 'border-transparent bg-surface-strong opacity-0 group-hover/button:opacity-100 group-hover/button:blur-none group-hover/button:inset-0 inset-2 blur-sm',\n};\nconst variantActiveClasses: Record<ButtonVariant, string> = {\n    primary: 'inset-shadow-xs dark:inset-shadow-xs-strong shadow-none to-surface-subtle',\n    secondary: 'inset-shadow-xs dark:inset-shadow-xs-strong shadow-none bg-surface-strong',\n    transparent: 'inset-shadow-xs dark:inset-shadow-xs-strong shadow-none',\n};\nconst variantActiveCssClasses: Record<ButtonVariant, string> = {\n    primary: 'group-active/button:inset-shadow-xs dark:group-active/button:inset-shadow-xs-strong group-active/button:shadow-none group-active/button:to-surface-subtle',\n    secondary: 'group-active/button:inset-shadow-xs dark:group-active/button:inset-shadow-xs-strong group-active/button:shadow-none',\n    transparent: 'group-active/button:inset-shadow-xs dark:group-active/button:inset-shadow-xs-strong group-active/button:shadow-none',\n};\nconst variantTextClasses: Record<ButtonVariant, string> = {\n    primary: 'text-neutral',\n    secondary: 'text-neutral',\n    transparent: 'text-neutral-subtle group-hover/button:text-neutral',\n};\nfunction Button(props: Props & {\n    asChild?: boolean;\n}) {\n    const { asChild, prefetch: _prefetch, ...rest } = props;\n    if (asChild) {\n        return <div {...rest}/>;\n    }\n    else {\n        return <button {...rest}/>;\n    }\n}\nfunction LinkWrapper(props: Props & {\n    asChild?: boolean;\n    tabIndex?: number;\n    prefetch?: boolean | 'auto';\n}) {\n    const { asChild, prefetch, ...rest } = props;\n    if (asChild) {\n        return <div {...rest}/>;\n    }\n    else {\n        return (<RouterLink to={rest.href ?? ''} preload={prefetch === true ? 'intent' : false} {...rest}/>);\n    }\n}\nexport default function ZButton({ children, size = 'sm', variant = 'secondary', leading, trailing, leadingIcon, trailingIcon, onClick, className, href, asChild = false, disabled = false, loading = false, prefetch = false, pressed = false, tabIndex = 0, title, type = 'button', ariaLabel, target, rel, }: Props) {\n    const LeadingIcon = leadingIcon;\n    const TrailingIcon = trailingIcon;\n    const resolvedHref = href || undefined;\n    const isIconOnly = !children && !leading && !trailing && (LeadingIcon || TrailingIcon);\n    const Comp = resolvedHref ? LinkWrapper : Button;\n    return (<Comp href={resolvedHref} tabIndex={tabIndex} onClick={onClick} asChild={asChild} disabled={disabled} type={type} title={title} aria-label={ariaLabel} target={target} rel={rel} className={cn('group/button focus-visible:ring-neutral-strong relative inline-flex shrink-0 cursor-pointer rounded-lg whitespace-nowrap transition-transform outline-none select-none focus-visible:ring-2', disabled && 'pointer-events-none cursor-not-allowed opacity-50', loading && 'overflow-hidden', isIconOnly ? iconOnlySizeClasses[size] : sizeClasses[size], className)} prefetch={prefetch}>\n      {loading && (<div className=\"bg-surface-subtle absolute inset-0 z-20 flex items-center justify-center rounded-lg\">\n          <Orchid className=\"text-neutral-weak size-4 animate-spin\"/>\n        </div>)}\n      {!disabled && (<div className={cn('absolute rounded-lg border transition-transform', variantClasses[variant], pressed ? variantActiveClasses[variant] : variantActiveCssClasses[variant])}/>)}\n      <div className={cn('text-copy relative z-10 flex items-center gap-1', isIconOnly && 'w-full justify-center', variantTextClasses[variant])}>\n        {LeadingIcon && <LeadingIcon className=\"size-4 transition-transform\"/>}\n        {leading && <>{leading}</>}\n        {children && (<div className=\"text-copy px-0.5 leading-0 transition-transform\">{children}</div>)}\n        {trailing && <>{trailing}</>}\n        {TrailingIcon && <TrailingIcon className=\"size-4 transition-transform\"/>}\n      </div>\n    </Comp>);\n}\n",
      "type": "registry:ui",
      "target": "@ui/orchid/spectrum/atoms/z-button/z-button.tsx"
    }
  ],
  "type": "registry:ui"
}