number-field
9ui/number-fieldFreeComponent
9ui publishes no description for this item.
Live preview
live · rendered by the registry
Rendered by 9ui on their own page — this is the component running, not a screenshot of it.Install it
npx shadcn@latest add https://9ui.dev/r/number-field.jsonSource
1import * as React from "react"2import { NumberField as BaseNumberField } from "@base-ui/react/number-field"3import { MinusIcon, MoveHorizontalIcon, PlusIcon } from "lucide-react"45import { cn } from "@/lib/utils"67type NumberFieldContextType = {8 id: string9}1011const NumberFieldContext = React.createContext<NumberFieldContextType | null>(12 null13)1415const useNumberField = () => {16 const context = React.useContext(NumberFieldContext)1718 if (!context) {19 throw new Error("useNumberField must be used within a NumberField")20 }2122 return context23}2425function NumberField({26 id,27 className,28 children,29 ...props30}: React.ComponentProps<typeof BaseNumberField.Root>) {31 let fieldId = React.useId()3233 if (id) {34 fieldId = id35 }3637 const controllerClassName =38 "hover:border-ring/70 bg-input flex size-9 items-center justify-center border transition-colors select-none data-disabled:opacity-50 data-disabled:pointer-events-none"3940 return (41 <NumberFieldContext.Provider value={{ id: fieldId }}>42 <BaseNumberField.Root43 id={fieldId}44 className={cn("flex flex-col items-start gap-1", className)}45 data-slot="number-field"46 {...props}47 >48 {children}49 <BaseNumberField.Group className="text-foreground flex rounded-md shadow-xs transition-shadow">50 <BaseNumberField.Decrement51 className={cn(controllerClassName, "rounded-l-md")}52 data-slot="number-field-decrement"53 >54 <MinusIcon />55 </BaseNumberField.Decrement>56 <BaseNumberField.Input57 className="hover:border-ring/70 h-9 w-20 border-y text-center text-sm tabular-nums transition-colors focus:z-1 focus:outline-[3px] focus:-outline-offset-1 data-disabled:pointer-events-none data-disabled:opacity-50"58 data-slot="number-field-input"59 />60 <BaseNumberField.Increment61 className={cn(controllerClassName, "rounded-r-md")}62 data-slot="number-field-increment"63 >64 <PlusIcon />65 </BaseNumberField.Increment>66 </BaseNumberField.Group>67 </BaseNumberField.Root>68 </NumberFieldContext.Provider>69 )70}7172function NumberFieldScrubArea({73 className,74 ...props75}: React.ComponentProps<typeof BaseNumberField.ScrubArea>) {76 const { id: fieldId } = useNumberField()7778 return (79 <BaseNumberField.ScrubArea80 className={cn("cursor-ew-resize", className)}81 data-slot="number-field-scrub-area"82 {...props}83 >84 <label85 htmlFor={fieldId}86 className="text-foreground cursor-ew-resize text-sm font-medium"87 data-slot="number-field-label"88 >89 Amount90 </label>91// … truncated
Files it writes
More from 9ui
All 56 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| accordionaccordion | 9ui | Components | Free | no deps | |
| alertalert | 9ui | Components | Free | no deps | |
| alert-dialogalert-dialog | 9ui | Components | Free | no deps | |
| aspect-ratioaspect-ratio | 9ui | Components | Free | no deps | |
| autocompleteautocomplete | 9ui | Components | Free | no deps | |
| avataravatar | 9ui | Components | Free | no deps | |
| badgebadge | 9ui | Components | Free | no deps | |
| breadcrumbsbreadcrumbs | 9ui | Components | Free | no deps |
