{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"number-field","type":"registry:ui","title":"Number Field","description":"","dependencies":["@base-ui/react","class-variance-authority"],"registryDependencies":["label"],"files":[{"path":"number-field.tsx","type":"registry:ui","content":"\"use client\"\n\nimport type { ReactNode } from \"react\"\nimport { createContext, useContext, useId } from \"react\"\nimport { NumberField as NumberFieldPrimitive } from \"@base-ui/react/number-field\"\nimport type { VariantProps } from \"class-variance-authority\"\nimport { cva } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Label } from \"@/components/ui/label\"\nimport { IconPlaceholder } from \"@/app/(create)/components/icon-placeholder\"\n\nconst NumberFieldContext = createContext<{\n fieldId: string\n size: \"sm\" | \"default\" | \"lg\"\n} | null>(null)\n\nconst numberFieldGroupVariants = cva(\n \"relative flex w-full justify-between border border-input data-disabled:pointer-events-none data-disabled:opacity-50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive focus-within:has-aria-invalid:border-destructive focus-within:has-aria-invalid:ring-destructive/20 dark:focus-within:has-aria-invalid:ring-destructive/40 rounded-3xl bg-transparent dark:bg-input/30 transition-colors focus-within:border-ring focus-within:ring-ring/50 focus-within:ring-3\",\n {\n variants: {\n size: {\n sm: \"h-7 text-sm\",\n default: \"h-8 text-sm\",\n lg: \"h-9 text-sm\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n }\n)\n\nconst numberFieldButtonVariants = cva(\n \"relative flex shrink-0 cursor-pointer items-center justify-center transition-colors pointer-coarse:after:absolute pointer-coarse:after:size-full pointer-coarse:after:min-h-11 pointer-coarse:after:min-w-11 hover:bg-accent\",\n {\n variants: {\n size: {\n sm: \"px-1.5 ([class*='size-'])]:size-3.5 ([class*='size-'])]:size-3.5 [&_svg:not([class*='size-'])]:size-3.5 ([class*='size-'])]:size-3.5 ([class*='size-'])]:size-3 ([class*='size-'])]:size-3.5 ([class*='size-'])]:size-3.5\",\n default:\n \"px-2 ([class*='size-'])]:size-4 ([class*='size-'])]:size-4 [&_svg:not([class*='size-'])]:size-4 ([class*='size-'])]:size-4 ([class*='size-'])]:size-3.5 ([class*='size-'])]:size-4 ([class*='size-'])]:size-3.5\",\n lg: \"px-2.5 ([class*='size-'])]:size-4 ([class*='size-'])]:size-4 [&_svg:not([class*='size-'])]:size-4 ([class*='size-'])]:size-4 ([class*='size-'])]:size-3.5 ([class*='size-'])]:size-4 ([class*='size-'])]:size-3.5\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n }\n)\n\nconst numberFieldInputVariants = cva(\n \"w-full min-w-0 flex-1 bg-transparent text-center tabular-nums outline-none\",\n {\n variants: {\n size: {\n sm: \"px-2 py-0.5\",\n default: \"px-2.5 py-1\",\n lg: \"px-2.5 py-1.5\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n }\n)\n\nfunction NumberField({\n id,\n className,\n size = \"default\",\n ...props\n}: NumberFieldPrimitive.Root.Props &\n VariantProps) {\n const generatedId = useId()\n const fieldId = id ?? generatedId\n const sizeValue = size ?? \"default\"\n\n return (\n \n \n \n )\n}\n\nfunction NumberFieldGroup({\n className,\n size: sizeProp,\n ...props\n}: NumberFieldPrimitive.Group.Props &\n Partial>) {\n const context = useContext(NumberFieldContext)\n if (!context) {\n throw new Error(\n \"NumberFieldGroup must be used within a NumberField component.\"\n )\n }\n const size = sizeProp ?? context.size\n\n return (\n \n )\n}\n\nfunction NumberFieldDecrement({\n className,\n size: sizeProp,\n children,\n ...props\n}: NumberFieldPrimitive.Decrement.Props &\n Partial> & {\n children?: React.ReactNode\n }) {\n const context = useContext(NumberFieldContext)\n if (!context) {\n throw new Error(\n \"NumberFieldDecrement must be used within a NumberField component.\"\n )\n }\n const size = sizeProp ?? context.size\n\n return (\n \n {children ?? (\n \n )}\n \n )\n}\n\nfunction NumberFieldIncrement({\n className,\n size: sizeProp,\n children,\n ...props\n}: NumberFieldPrimitive.Increment.Props &\n Partial> & {\n children?: ReactNode\n }) {\n const context = useContext(NumberFieldContext)\n if (!context) {\n throw new Error(\n \"NumberFieldIncrement must be used within a NumberField component.\"\n )\n }\n const size = sizeProp ?? context.size\n\n return (\n \n {children ?? (\n \n )}\n \n )\n}\n\nfunction NumberFieldInput({\n className,\n size: sizeProp,\n ...props\n}: NumberFieldPrimitive.Input.Props &\n Partial>) {\n const context = useContext(NumberFieldContext)\n if (!context) {\n throw new Error(\n \"NumberFieldInput must be used within a NumberField component.\"\n )\n }\n const size = sizeProp ?? context.size\n\n return (\n \n )\n}\n\nfunction NumberFieldScrubArea({\n className,\n label,\n ...props\n}: NumberFieldPrimitive.ScrubArea.Props & {\n label: string\n}) {\n const context = useContext(NumberFieldContext)\n if (!context) {\n throw new Error(\n \"NumberFieldScrubArea must be used within a NumberField component for accessibility.\"\n )\n }\n\n return (\n \n \n \n \n \n \n )\n}\n\nfunction CursorGrowIcon(props: React.ComponentProps<\"svg\">) {\n return (\n \n \n \n )\n}\n\nexport {\n NumberField,\n NumberFieldScrubArea,\n NumberFieldDecrement,\n NumberFieldIncrement,\n NumberFieldGroup,\n NumberFieldInput,\n}","target":"components/neui/number-field.tsx"}]}