{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "button",
  "type": "registry:ui",
  "title": "Button",
  "description": "Compact expedition button (28–44px, 6–9px radii, hover lift). Mountain names plus shadcn aliases and daisyUI colors.",
  "dependencies": [
    "@radix-ui/react-slot",
    "class-variance-authority"
  ],
  "devDependencies": [],
  "registryDependencies": [
    "https://8848.aayurtshrestha.com.np/r/utils.json",
    "https://8848.aayurtshrestha.com.np/r/spinner.json"
  ],
  "files": [
    {
      "path": "button.tsx",
      "content": "\"use client\";\n\nimport * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"@/lib/utils\";\nimport { Spinner } from \"@/components/ui/spinner\";\n\n/**\n * Button — 8848 spec: thin borders + compact sizing + restrained blue\n * + hover lift + 2px focus ring + whitespace.\n *\n * Sizes (h / px / radius / text):\n * - xs: 28px / 10px / 6px / 12px\n * - sm: 32px / 12px / 6px / 13px\n * - md (default): 36px / 14px / 7px / 14px\n * - lg: 40px / 16px / 8px / 15px\n * - xl: 44px / 20px / 9px / 16px\n *\n * Elevation (contrast/surface, not shadow):\n * ghost → outline → secondary → primary → summit\n *\n * Hover: translateY(-1px) + subtle shadow. Active: translateY(0).\n * Focus: 2px ring, 2px offset. Disabled: 50% opacity, no elevation.\n *\n * Mountain names: hiker, climber, summit, trail, base-camp, ridge.\n * shadcn aliases: default, secondary, outline, ghost, destructive, link.\n * daisyUI colors: info, success, warning.\n * daisyUI modifiers: shape (square, circle), wide, block.\n */\nconst buttonVariants = cva(\n  \"inline-flex cursor-pointer items-center justify-center whitespace-nowrap text-sm font-medium transition-all duration-normal ease-smooth hover:-translate-y-px focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 active:translate-y-0 disabled:pointer-events-none disabled:opacity-50 disabled:shadow-none disabled:hover:translate-y-0 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n  {\n    variants: {\n      variant: {\n        hiker:\n          \"border border-border bg-slate-100 text-slate-900 shadow-basecamp hover:shadow-trail dark:bg-slate-800 dark:text-slate-100 dark:hover:bg-slate-700\",\n        climber:\n          \"border border-alpine-700/40 bg-alpine-500 text-white shadow-basecamp hover:bg-alpine-600 hover:shadow-trail active:bg-alpine-700 dark:border-alpine-400/40 dark:bg-alpine-400 dark:hover:bg-alpine-300 dark:active:bg-alpine-500\",\n        summit:\n          \"border border-sunrise-700/40 bg-sunrise-500 text-slate-950 shadow-basecamp hover:bg-sunrise-600 hover:shadow-trail active:bg-sunrise-700 dark:border-sunrise-400/40 dark:text-white\",\n        trail:\n          \"border border-input bg-transparent hover:bg-slate-100 active:bg-slate-200 dark:hover:bg-slate-800 dark:active:bg-slate-700\",\n        \"base-camp\": \"bg-transparent hover:bg-muted active:bg-muted dark:hover:bg-muted dark:active:bg-muted\",\n        ridge:\n          \"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40\",\n        default:\n          \"border border-alpine-700/40 bg-alpine-500 text-white shadow-basecamp hover:bg-alpine-600 hover:shadow-trail active:bg-alpine-700 dark:border-alpine-400/40 dark:bg-alpine-400 dark:hover:bg-alpine-300 dark:active:bg-alpine-500\",\n        secondary:\n          \"border border-border bg-secondary text-secondary-foreground hover:bg-[color-mix(in_oklab,var(--color-secondary),var(--color-foreground)_5%)] aria-expanded:bg-secondary aria-expanded:text-secondary-foreground\",\n        outline:\n          \"border border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50\",\n        ghost:\n          \"bg-transparent hover:bg-muted hover:text-foreground active:bg-muted dark:hover:bg-muted dark:active:bg-muted\",\n        destructive:\n          \"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40\",\n        link: \"text-alpine-600 underline-offset-4 hover:translate-y-0 hover:underline dark:text-alpine-400\",\n        info: \"border border-alpine-700/40 bg-alpine-600 text-white shadow-basecamp hover:bg-alpine-700 hover:shadow-trail active:bg-alpine-800\",\n        success:\n          \"border border-green-800/40 bg-green-600 text-white shadow-basecamp hover:bg-green-700 hover:shadow-trail active:bg-green-800\",\n        warning:\n          \"border border-amber-600/40 bg-amber-400 text-amber-950 shadow-basecamp hover:bg-amber-500 hover:shadow-trail active:bg-amber-600\",\n      },\n      size: {\n        xs: \"h-7 rounded-[6px] px-2.5 text-xs gap-1\",\n        sm: \"h-8 rounded-[6px] px-3 text-[13px] gap-1.5 has-[[data-icon=inline-start]]:pl-2 has-[[data-icon=inline-end]]:pr-2\",\n        md: \"h-9 rounded-[7px] px-3.5 text-sm gap-2\",\n        default: \"h-9 rounded-[7px] px-3.5 text-sm gap-2\",\n        lg: \"h-10 rounded-[8px] px-4 text-[15px] gap-2\",\n        xl: \"h-11 rounded-[9px] px-5 text-base gap-2\",\n        icon: \"h-9 w-9 rounded-[7px]\",\n        \"icon-xs\": \"size-7 rounded-[6px]\",\n        \"icon-sm\": \"size-8 rounded-[6px]\",\n        \"icon-lg\": \"size-10 rounded-[8px]\",\n      },\n      shape: {\n        default: \"\",\n        square: \"aspect-square p-0\",\n        circle: \"aspect-square rounded-summit p-0\",\n      },\n      wide: {\n        true: \"w-64 max-w-full\",\n      },\n      block: {\n        true: \"w-full\",\n      },\n      elevation: {\n        none: \"\",\n        raised: \"shadow-ridge hover:shadow-summit transition-shadow duration-normal\",\n        floating: \"shadow-summit hover:shadow-expedition transition-shadow duration-normal\",\n      },\n    },\n    defaultVariants: {\n      variant: \"hiker\",\n      size: \"md\",\n      elevation: \"none\",\n    },\n  }\n);\n\nexport interface ButtonProps\n  extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n    VariantProps<typeof buttonVariants> {\n  asChild?: boolean;\n  loading?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n  ({ className, variant, size, shape, wide, block, elevation, asChild = false, loading, disabled, children, ...props }, ref) => {\n    const Comp = asChild ? Slot : \"button\";\n    return (\n      <Comp\n        className={cn(buttonVariants({ variant, size, shape, wide, block, elevation, className }))}\n        ref={ref}\n        disabled={disabled || loading}\n        aria-busy={loading}\n        {...props}\n      >\n        {loading && <Spinner size=\"sm\" tone=\"inherit\" data-icon=\"inline-start\" />}\n        {children}\n      </Comp>\n    );\n  }\n);\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };\n",
      "type": "registry:ui",
      "target": "components/ui/button.tsx"
    },
    {
      "path": "spinner.tsx",
      "content": "\"use client\";\n\nimport * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"@/lib/utils\";\nimport { LoaderCircle } from \"lucide-react\";\n\nconst spinnerVariants = cva(\"animate-spin\", {\n  variants: {\n    size: {\n      xs: \"h-3 w-3\",\n      sm: \"h-4 w-4\",\n      md: \"h-6 w-6\",\n      lg: \"h-8 w-8\",\n      xl: \"h-10 w-10\",\n    },\n    tone: {\n      inherit: \"text-current\",\n      alpine: \"text-alpine-500 dark:text-alpine-400\",\n      slate: \"text-slate-400 dark:text-slate-500\",\n      white: \"text-white\",\n    },\n  },\n  defaultVariants: {\n    size: \"md\",\n    tone: \"alpine\",\n  },\n});\n\nexport interface SpinnerProps\n  extends Omit<React.HTMLAttributes<HTMLSpanElement>, \"children\">,\n    VariantProps<typeof spinnerVariants> {\n  label?: string;\n}\n\nconst Spinner = React.forwardRef<HTMLSpanElement, SpinnerProps>(\n  ({ className, size, tone, label = \"Loading\", ...props }, ref) => (\n    <span\n      ref={ref}\n      role=\"status\"\n      aria-label={label}\n      className={cn(\"inline-flex shrink-0 items-center justify-center\", className)}\n      {...props}\n    >\n      <LoaderCircle aria-hidden=\"true\" className={cn(spinnerVariants({ size, tone }))} />\n    </span>\n  )\n);\nSpinner.displayName = \"Spinner\";\n\nexport { Spinner, spinnerVariants };\nexport type { SpinnerProps as SpinnerPropsType };\n",
      "type": "registry:ui",
      "target": "components/ui/spinner.tsx"
    }
  ]
}
