{ "$schema": "https://blode.co/ui/schema/registry-item.json", "name": "input-group", "title": "Input Group", "author": "Matthew Blode", "description": "A wrapper that combines an input with addons like icons or buttons.", "registryDependencies": ["button", "input", "textarea"], "files": [ { "path": "ui/input-group.tsx", "content": "\"use client\";\n\nimport { cva } from \"class-variance-authority\";\nimport type { VariantProps } from \"class-variance-authority\";\nimport type * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport { Textarea } from \"@/components/ui/textarea\";\n\nconst InputGroup = ({ className, ...props }: React.ComponentProps<\"fieldset\">) => (\n [data-align=block-end]]:h-auto has-[>[data-align=block-start]]:h-auto has-[>textarea]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:flex-col has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot][aria-invalid=true]]:border-destructive has-disabled:bg-input/50 has-disabled:opacity-50 has-[[data-slot=input-group-control]:focus-visible]:ring-3 has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot][aria-invalid=true]]:ring-3 has-[[data-slot][aria-invalid=true]]:ring-destructive/20 dark:bg-input/30 dark:has-disabled:bg-input/80 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40\",\n className,\n )}\n data-slot=\"input-group\"\n {...props}\n />\n);\n\nconst inputGroupAddonVariants = cva(\n \"flex h-auto cursor-text select-none items-center justify-center gap-2 py-1.5 font-medium text-muted-foreground text-sm group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4\",\n {\n defaultVariants: {\n align: \"inline-start\",\n },\n variants: {\n align: {\n \"block-end\":\n \"order-last w-full justify-start px-2.5 pb-2 group-has-[>input]/input-group:pb-2 [.border-t]:pt-2\",\n \"block-start\":\n \"order-first w-full justify-start px-2.5 pt-2 group-has-[>input]/input-group:pt-2 [.border-b]:pb-2\",\n \"inline-end\":\n \"order-last shrink-0 whitespace-nowrap pr-[var(--field-padding-x)] has-[>button]:mr-[-0.3rem] has-[>kbd]:mr-[-0.15rem]\",\n \"inline-start\":\n \"order-first shrink-0 whitespace-nowrap pl-[var(--field-padding-x)] has-[>button]:ml-[-0.3rem] has-[>kbd]:ml-[-0.15rem]\",\n },\n },\n },\n);\n\nconst InputGroupAddon = ({\n className,\n align = \"inline-start\",\n ...props\n}: React.ComponentProps<\"fieldset\"> & VariantProps) => (\n \n);\n\nconst inputGroupButtonVariants = cva(\"flex items-center gap-2 text-sm shadow-none\", {\n defaultVariants: {\n size: \"xs\",\n },\n variants: {\n size: {\n \"icon-sm\": \"size-8 p-0 has-[>svg]:p-0\",\n \"icon-xs\": \"size-6 rounded-[calc(var(--radius)-3px)] p-0 has-[>svg]:p-0\",\n sm: \"\",\n xs: \"h-6 gap-1 rounded-[calc(var(--radius)-3px)] px-1.5 [&>svg:not([class*='size-'])]:size-3.5\",\n },\n },\n});\n\nconst InputGroupButton = ({\n className,\n type = \"button\",\n variant = \"ghost\",\n size = \"xs\",\n ...props\n}: Omit, \"size\" | \"type\"> &\n VariantProps & {\n type?: \"button\" | \"submit\" | \"reset\";\n }) => (\n \n);\n\nconst InputGroupText = ({ className, ...props }: React.ComponentProps<\"span\">) => (\n \n);\n\nconst InputGroupInput = ({ className, ...props }: React.ComponentProps<\"input\">) => (\n [data-align=block-end]]/input-group:pt-3 group-has-[>[data-align=inline-end]]/input-group:pr-1.5 group-has-[>[data-align=block-start]]/input-group:pb-3 group-has-[>[data-align=inline-start]]/input-group:pl-1.5 aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent\",\n className,\n )}\n data-slot=\"input-group-control\"\n {...props}\n />\n);\n\nconst InputGroupTextarea = ({ className, ...props }: React.ComponentProps<\"textarea\">) => (\n [data-align=block-end]]/input-group:pt-3 group-has-[>[data-align=block-start]]/input-group:pb-3 aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent\",\n className,\n )}\n data-slot=\"input-group-control\"\n {...props}\n />\n);\n\nexport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupText,\n InputGroupInput,\n InputGroupTextarea,\n};\n", "type": "registry:ui", "target": "" } ], "type": "registry:ui" }