{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "input-group",
  "title": "Input Group",
  "description": "A input-group component.",
  "dependencies": [
    "class-variance-authority"
  ],
  "registryDependencies": [
    "@cubby-ui/button",
    "@cubby-ui/input",
    "@cubby-ui/textarea"
  ],
  "files": [
    {
      "path": "registry/default/input-group/input-group.tsx",
      "content": "\"use client\";\r\n\r\nimport * as React from \"react\";\r\nimport { cva, type VariantProps } from \"class-variance-authority\";\r\n\r\nimport { cn } from \"@/lib/utils\";\r\nimport { Button } from \"@/registry/default/button/button\";\r\nimport { Input, type InputProps } from \"@/registry/default/input/input\";\r\nimport { Textarea } from \"@/registry/default/textarea/textarea\";\r\n\r\nconst inputGroupVariants = cva(\r\n  [\r\n    \"group/input-group relative flex w-full items-center rounded-lg border bg-clip-padding\",\r\n    \"min-w-0 has-[>textarea]:h-auto\",\r\n\r\n    // Variants based on alignment.\r\n    \"has-[>[data-align=inline-start]]:[&>input]:pl-2\",\r\n    \"has-[>[data-align=inline-end]]:[&>input]:pr-2\",\r\n    \"has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>[data-align=block-start]]:[&>input]:pb-3\",\r\n    \"has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-end]]:[&>input]:pt-3\",\r\n\r\n    // Focus state.\r\n    \"has-[[data-slot=input-group-control]:focus-visible]:outline-ring/50 has-[[data-slot=input-group-control]:focus-visible]:outline-2 has-[[data-slot=input-group-control]:focus-visible]:outline-offset-2 has-[[data-slot=input-group-control]:focus-visible]:outline-solid\",\r\n\r\n    // Error state.\r\n    \"has-[[data-slot][aria-invalid=true]]:outline-destructive/50 has-[[data-slot][aria-invalid=true]]:outline-2 has-[[data-slot][aria-invalid=true]]:outline-offset-2 has-[[data-slot][aria-invalid=true]]:outline-solid\",\r\n\r\n    // Transition outline\r\n    \"outline-0 outline-offset-0 outline-transparent transition-[outline-width,outline-offset,outline-color] duration-100 ease-out\",\r\n  ],\r\n  {\r\n    variants: {\r\n      variant: {\r\n        // Opaque \"lifted\" bg — use on the page or any non-elevated substrate.\r\n        default: \"bg-input\",\r\n        // Translucent overlay — use inside Cards, Dialogs, or any surface\r\n        // where the opaque default would collapse into its parent.\r\n        elevated: \"bg-input-elevated\",\r\n      },\r\n    },\r\n    defaultVariants: {\r\n      variant: \"default\",\r\n    },\r\n  },\r\n);\r\n\r\nfunction InputGroup({\r\n  className,\r\n  variant,\r\n  ...props\r\n}: React.ComponentProps<\"div\"> & VariantProps<typeof inputGroupVariants>) {\r\n  return (\r\n    <div\r\n      data-slot=\"input-group\"\r\n      role=\"group\"\r\n      className={cn(inputGroupVariants({ variant }), className)}\r\n      {...props}\r\n    />\r\n  );\r\n}\r\n\r\nconst inputGroupAddonVariants = cva(\r\n  \"text-muted-foreground flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium select-none [&>svg:not([class*='size-'])]:size-4 [&>kbd]:rounded-[calc(var(--radius)-5px)] group-has-[[data-slot=input-group-control]:disabled]/input-group:opacity-60\",\r\n  {\r\n    variants: {\r\n      align: {\r\n        \"inline-start\":\r\n          \"order-first pl-3 has-[>button]:ml-[-0.45rem] has-[>kbd]:ml-[-0.35rem]\",\r\n        \"inline-end\":\r\n          \"order-last pr-3 has-[>button]:mr-[-0.45rem] has-[>kbd]:mr-[-0.35rem]\",\r\n        \"block-start\":\r\n          \"order-first w-full justify-start px-3 pt-3 [.border-b]:pb-3 group-has-[>input]/input-group:pt-2.5\",\r\n        \"block-end\":\r\n          \"order-last w-full justify-start px-3 pb-3 [.border-t]:pt-3 group-has-[>input]/input-group:pb-2.5\",\r\n      },\r\n    },\r\n    defaultVariants: {\r\n      align: \"inline-start\",\r\n    },\r\n  },\r\n);\r\n\r\nfunction InputGroupAddon({\r\n  className,\r\n  align = \"inline-start\",\r\n  ...props\r\n}: React.ComponentProps<\"div\"> & VariantProps<typeof inputGroupAddonVariants>) {\r\n  return (\r\n    <div\r\n      role=\"group\"\r\n      data-slot=\"input-group-addon\"\r\n      data-align={align}\r\n      className={cn(inputGroupAddonVariants({ align }), className)}\r\n      onClick={(e) => {\r\n        if ((e.target as HTMLElement).closest(\"button\")) {\r\n          return;\r\n        }\r\n        e.currentTarget.parentElement?.querySelector(\"input\")?.focus();\r\n      }}\r\n      {...props}\r\n    />\r\n  );\r\n}\r\n\r\n// Sizes here are deliberately smaller than the standalone Button's — the button\r\n// must fit inside the input's border and track the input's height, not the\r\n// viewport. Note the name collision: `xs` here is 24px vs the Button's 32px.\r\n// Intentional; don't \"reconcile\" them with the Button scale.\r\nconst inputGroupButtonVariants = cva(\r\n  \"text-sm shadow-none flex gap-2 items-center min-h-0\",\r\n  {\r\n    variants: {\r\n      size: {\r\n        xs: \"h-6 sm:h-6 gap-1 px-2 rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-3.5 has-[>svg]:px-2\",\r\n        sm: \"h-8 sm:h-8 px-2 gap-1.5 rounded-[calc(var(--radius)-5px)] has-[>svg]:px-2\",\r\n        icon_xs:\r\n          \"size-6 sm:size-6 rounded-[calc(var(--radius)-5px)] p-0 has-[>svg]:p-0\",\r\n        icon_sm: \"size-8 sm:size-8 p-0 has-[>svg]:p-0\",\r\n      },\r\n    },\r\n    defaultVariants: {\r\n      size: \"xs\",\r\n    },\r\n  },\r\n);\r\n\r\nfunction InputGroupButton({\r\n  className,\r\n  variant = \"ghost\",\r\n  size = \"xs\",\r\n  ...props\r\n}: Omit<React.ComponentProps<typeof Button>, \"size\"> &\r\n  VariantProps<typeof inputGroupButtonVariants>) {\r\n  return (\r\n    <Button\r\n      data-size={size}\r\n      variant={variant}\r\n      className={cn(inputGroupButtonVariants({ size }), className)}\r\n      {...props}\r\n    />\r\n  );\r\n}\r\n\r\nfunction InputGroupText({ className, ...props }: React.ComponentProps<\"span\">) {\r\n  return (\r\n    <span\r\n      className={cn(\r\n        \"text-muted-foreground flex items-center gap-2 text-sm [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4\",\r\n        className,\r\n      )}\r\n      {...props}\r\n    />\r\n  );\r\n}\r\n\r\nexport type InputGroupInputProps = InputProps;\r\n\r\nfunction InputGroupInput({ className, size, ...props }: InputGroupInputProps) {\r\n  return (\r\n    <Input\r\n      data-slot=\"input-group-control\"\r\n      size={size}\r\n      className={cn(\r\n        \"flex-1 rounded-none border-0 bg-transparent shadow-none focus-visible:outline-0 aria-invalid:outline-0 dark:bg-transparent\",\r\n        className,\r\n      )}\r\n      {...props}\r\n    />\r\n  );\r\n}\r\n\r\nfunction InputGroupTextarea({\r\n  className,\r\n  ...props\r\n}: React.ComponentProps<typeof Textarea>) {\r\n  return (\r\n    <Textarea\r\n      data-slot=\"input-group-control\"\r\n      className={cn(\r\n        \"flex-1 resize-none rounded-none border-0 bg-transparent py-3 shadow-none focus-visible:outline-0 aria-invalid:outline-0 dark:bg-transparent\",\r\n        className,\r\n      )}\r\n      {...props}\r\n    />\r\n  );\r\n}\r\n\r\nexport {\r\n  InputGroup,\r\n  InputGroupAddon,\r\n  InputGroupButton,\r\n  InputGroupText,\r\n  InputGroupInput,\r\n  InputGroupTextarea,\r\n};\r\n",
      "type": "registry:ui",
      "target": "components/ui/cubby-ui/input-group.tsx"
    }
  ],
  "type": "registry:ui"
}