Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion apps/ui/public/r/number-field.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
"files": [
{
"path": "registry/default/ui/number-field.tsx",
"content": "\"use client\";\n\nimport { NumberField as NumberFieldPrimitive } from \"@base-ui/react/number-field\";\nimport { MinusIcon, PlusIcon } from \"lucide-react\";\nimport * as React from \"react\";\nimport { cn } from \"@/registry/default/lib/utils\";\nimport { Label } from \"@/registry/default/ui/label\";\n\nexport const NumberFieldContext: React.Context<{\n fieldId: string;\n} | null> = React.createContext<{\n fieldId: string;\n} | null>(null);\n\nexport function NumberField({\n id,\n className,\n size = \"default\",\n ...props\n}: NumberFieldPrimitive.Root.Props & {\n size?: \"sm\" | \"default\" | \"lg\";\n}): React.ReactElement {\n const generatedId = React.useId();\n const fieldId = id ?? generatedId;\n\n return (\n <NumberFieldContext.Provider value={{ fieldId }}>\n <NumberFieldPrimitive.Root\n className={cn(\"flex w-full flex-col items-start gap-2\", className)}\n data-size={size}\n data-slot=\"number-field\"\n id={fieldId}\n {...props}\n />\n </NumberFieldContext.Provider>\n );\n}\n\nexport function NumberFieldGroup({\n className,\n ...props\n}: NumberFieldPrimitive.Group.Props): React.ReactElement {\n return (\n <NumberFieldPrimitive.Group\n className={cn(\n \"relative flex w-full justify-between rounded-lg border border-input bg-background not-dark:bg-clip-padding text-base text-foreground shadow-xs/5 ring-ring/24 transition-shadow before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] not-data-disabled:not-focus-within:not-aria-invalid:before:shadow-[0_1px_--theme(--color-black/4%)] focus-within:border-ring focus-within:ring-[3px] has-aria-invalid:border-destructive/36 focus-within:has-aria-invalid:border-destructive/64 focus-within:has-aria-invalid:ring-destructive/16 data-disabled:pointer-events-none data-disabled:opacity-64 sm:text-sm dark:bg-input/32 dark:has-aria-invalid:ring-destructive/24 dark:not-data-disabled:not-focus-within:not-aria-invalid:before:shadow-[0_-1px_--theme(--color-white/6%)] [&_svg:not([class*='size-'])]:size-4.5 sm:[&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0 [[data-disabled],:focus-within,[aria-invalid]]:shadow-none\",\n className,\n )}\n data-slot=\"number-field-group\"\n {...props}\n />\n );\n}\n\nexport function NumberFieldDecrement({\n className,\n ...props\n}: NumberFieldPrimitive.Decrement.Props): React.ReactElement {\n return (\n <NumberFieldPrimitive.Decrement\n className={cn(\n \"relative flex shrink-0 cursor-pointer items-center justify-center rounded-s-[calc(var(--radius-lg)-1px)] in-data-[size=sm]:px-[calc(--spacing(2.5)-1px)] px-[calc(--spacing(3)-1px)] 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 className,\n )}\n data-slot=\"number-field-decrement\"\n {...props}\n >\n <MinusIcon />\n </NumberFieldPrimitive.Decrement>\n );\n}\n\nexport function NumberFieldIncrement({\n className,\n ...props\n}: NumberFieldPrimitive.Increment.Props): React.ReactElement {\n return (\n <NumberFieldPrimitive.Increment\n className={cn(\n \"relative flex shrink-0 cursor-pointer items-center justify-center rounded-e-[calc(var(--radius-lg)-1px)] in-data-[size=sm]:px-[calc(--spacing(2.5)-1px)] px-[calc(--spacing(3)-1px)] 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 className,\n )}\n data-slot=\"number-field-increment\"\n {...props}\n >\n <PlusIcon />\n </NumberFieldPrimitive.Increment>\n );\n}\n\nexport function NumberFieldInput({\n className,\n ...props\n}: NumberFieldPrimitive.Input.Props): React.ReactElement {\n return (\n <NumberFieldPrimitive.Input\n className={cn(\n \"h-8.5 in-data-[size=lg]:h-9.5 in-data-[size=sm]:h-7.5 w-full min-w-0 grow bg-transparent in-data-[size=sm]:px-[calc(--spacing(2.5)-1px)] px-[calc(--spacing(3)-1px)] text-center text-foreground tabular-nums in-data-[size=lg]:leading-9.5 in-data-[size=sm]:leading-7.5 leading-8.5 outline-none sm:h-7.5 sm:in-data-[size=lg]:h-8.5 sm:in-data-[size=sm]:h-6.5 sm:in-data-[size=lg]:leading-8.5 sm:in-data-[size=sm]:leading-8.5 sm:leading-7.5\",\n className,\n )}\n data-slot=\"number-field-input\"\n {...props}\n />\n );\n}\n\nexport function NumberFieldScrubArea({\n className,\n label,\n ...props\n}: NumberFieldPrimitive.ScrubArea.Props & {\n label: string;\n}): React.ReactElement {\n const context = React.useContext(NumberFieldContext);\n\n if (!context) {\n throw new Error(\n \"NumberFieldScrubArea must be used within a NumberField component for accessibility.\",\n );\n }\n\n return (\n <NumberFieldPrimitive.ScrubArea\n className={cn(\"flex cursor-ew-resize\", className)}\n data-slot=\"number-field-scrub-area\"\n {...props}\n >\n <Label className=\"cursor-ew-resize\" htmlFor={context.fieldId}>\n {label}\n </Label>\n <NumberFieldPrimitive.ScrubAreaCursor className=\"drop-shadow-[0_1px_1px_#0008] filter\">\n <CursorGrowIcon />\n </NumberFieldPrimitive.ScrubAreaCursor>\n </NumberFieldPrimitive.ScrubArea>\n );\n}\n\nexport function CursorGrowIcon(\n props: React.ComponentProps<\"svg\">,\n): React.ReactElement {\n return (\n <svg\n aria-hidden=\"true\"\n fill=\"black\"\n height=\"14\"\n stroke=\"white\"\n viewBox=\"0 0 24 14\"\n width=\"26\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path d=\"M19.5 5.5L6.49737 5.51844V2L1 6.9999L6.5 12L6.49737 8.5L19.5 8.5V12L25 6.9999L19.5 2V5.5Z\" />\n </svg>\n );\n}\n\nexport { NumberFieldPrimitive };\n",
"content": "\"use client\";\n\nimport { NumberField as NumberFieldPrimitive } from \"@base-ui/react/number-field\";\nimport { MinusIcon, PlusIcon } from \"lucide-react\";\nimport * as React from \"react\";\nimport { cn } from \"@/registry/default/lib/utils\";\nimport { Label } from \"@/registry/default/ui/label\";\n\nexport const NumberFieldContext: React.Context<{\n fieldId: string;\n} | null> = React.createContext<{\n fieldId: string;\n} | null>(null);\n\nexport function NumberField({\n id,\n className,\n size = \"default\",\n ...props\n}: NumberFieldPrimitive.Root.Props & {\n size?: \"sm\" | \"default\" | \"lg\";\n}): React.ReactElement {\n const generatedId = React.useId();\n const fieldId = id ?? generatedId;\n\n return (\n <NumberFieldContext.Provider value={{ fieldId }}>\n <NumberFieldPrimitive.Root\n className={cn(\"flex w-full flex-col items-start gap-2\", className)}\n data-size={size}\n data-slot=\"number-field\"\n id={fieldId}\n {...props}\n />\n </NumberFieldContext.Provider>\n );\n}\n\nexport function NumberFieldGroup({\n className,\n ...props\n}: NumberFieldPrimitive.Group.Props): React.ReactElement {\n return (\n <NumberFieldPrimitive.Group\n className={cn(\n \"relative flex w-full justify-between rounded-lg border border-input bg-background not-dark:bg-clip-padding text-base text-foreground shadow-xs/5 ring-ring/24 transition-shadow before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] not-data-disabled:not-focus-within:not-aria-invalid:before:shadow-[0_1px_--theme(--color-black/4%)] focus-within:border-ring focus-within:ring-[3px] has-aria-invalid:border-destructive/36 focus-within:has-aria-invalid:border-destructive/64 focus-within:has-aria-invalid:ring-destructive/16 data-disabled:pointer-events-none data-disabled:opacity-64 sm:text-sm dark:bg-input/32 dark:has-aria-invalid:ring-destructive/24 dark:not-data-disabled:not-focus-within:not-aria-invalid:before:shadow-[0_-1px_--theme(--color-white/6%)] [&_svg:not([class*='size-'])]:size-4.5 sm:[&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0 [[data-disabled],:focus-within,[aria-invalid]]:shadow-none\",\n className,\n )}\n data-slot=\"number-field-group\"\n {...props}\n />\n );\n}\n\nexport function NumberFieldDecrement({\n className,\n ...props\n}: NumberFieldPrimitive.Decrement.Props): React.ReactElement {\n return (\n <NumberFieldPrimitive.Decrement\n className={cn(\n \"relative flex shrink-0 cursor-pointer items-center justify-center rounded-s-[calc(var(--radius-lg)-1px)] in-data-[size=sm]:px-[calc(--spacing(2.5)-1px)] px-[calc(--spacing(3)-1px)] 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 className,\n )}\n data-slot=\"number-field-decrement\"\n {...props}\n >\n <MinusIcon />\n </NumberFieldPrimitive.Decrement>\n );\n}\n\nexport function NumberFieldIncrement({\n className,\n ...props\n}: NumberFieldPrimitive.Increment.Props): React.ReactElement {\n return (\n <NumberFieldPrimitive.Increment\n className={cn(\n \"relative flex shrink-0 cursor-pointer items-center justify-center rounded-e-[calc(var(--radius-lg)-1px)] in-data-[size=sm]:px-[calc(--spacing(2.5)-1px)] px-[calc(--spacing(3)-1px)] 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 className,\n )}\n data-slot=\"number-field-increment\"\n {...props}\n >\n <PlusIcon />\n </NumberFieldPrimitive.Increment>\n );\n}\n\nexport function NumberFieldInput({\n className,\n ...props\n}: NumberFieldPrimitive.Input.Props): React.ReactElement {\n return (\n <NumberFieldPrimitive.Input\n className={cn(\n \"h-8.5 in-data-[size=lg]:h-9.5 in-data-[size=sm]:h-7.5 w-full min-w-0 grow bg-transparent in-data-[size=sm]:px-[calc(--spacing(2.5)-1px)] px-[calc(--spacing(3)-1px)] text-center text-foreground tabular-nums in-data-[size=lg]:leading-9.5 in-data-[size=sm]:leading-7.5 leading-8.5 outline-none sm:h-7.5 sm:in-data-[size=lg]:h-8.5 sm:in-data-[size=sm]:h-6.5 sm:in-data-[size=lg]:leading-8.5 sm:in-data-[size=sm]:leading-6.5 sm:leading-7.5\",\n className,\n )}\n data-slot=\"number-field-input\"\n {...props}\n />\n );\n}\n\nexport function NumberFieldScrubArea({\n className,\n label,\n ...props\n}: NumberFieldPrimitive.ScrubArea.Props & {\n label: string;\n}): React.ReactElement {\n const context = React.useContext(NumberFieldContext);\n\n if (!context) {\n throw new Error(\n \"NumberFieldScrubArea must be used within a NumberField component for accessibility.\",\n );\n }\n\n return (\n <NumberFieldPrimitive.ScrubArea\n className={cn(\"flex cursor-ew-resize\", className)}\n data-slot=\"number-field-scrub-area\"\n {...props}\n >\n <Label className=\"cursor-ew-resize\" htmlFor={context.fieldId}>\n {label}\n </Label>\n <NumberFieldPrimitive.ScrubAreaCursor className=\"drop-shadow-[0_1px_1px_#0008] filter\">\n <CursorGrowIcon />\n </NumberFieldPrimitive.ScrubAreaCursor>\n </NumberFieldPrimitive.ScrubArea>\n );\n}\n\nexport function CursorGrowIcon(\n props: React.ComponentProps<\"svg\">,\n): React.ReactElement {\n return (\n <svg\n aria-hidden=\"true\"\n fill=\"black\"\n height=\"14\"\n stroke=\"white\"\n viewBox=\"0 0 24 14\"\n width=\"26\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path d=\"M19.5 5.5L6.49737 5.51844V2L1 6.9999L6.5 12L6.49737 8.5L19.5 8.5V12L25 6.9999L19.5 2V5.5Z\" />\n </svg>\n );\n}\n\nexport { NumberFieldPrimitive };\n",
"type": "registry:ui"
}
],
Expand Down
2 changes: 1 addition & 1 deletion apps/ui/registry/default/ui/number-field.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ export function NumberFieldInput({
return (
<NumberFieldPrimitive.Input
className={cn(
"h-8.5 in-data-[size=lg]:h-9.5 in-data-[size=sm]:h-7.5 w-full min-w-0 grow bg-transparent in-data-[size=sm]:px-[calc(--spacing(2.5)-1px)] px-[calc(--spacing(3)-1px)] text-center text-foreground tabular-nums in-data-[size=lg]:leading-9.5 in-data-[size=sm]:leading-7.5 leading-8.5 outline-none sm:h-7.5 sm:in-data-[size=lg]:h-8.5 sm:in-data-[size=sm]:h-6.5 sm:in-data-[size=lg]:leading-8.5 sm:in-data-[size=sm]:leading-8.5 sm:leading-7.5",
"h-8.5 in-data-[size=lg]:h-9.5 in-data-[size=sm]:h-7.5 w-full min-w-0 grow bg-transparent in-data-[size=sm]:px-[calc(--spacing(2.5)-1px)] px-[calc(--spacing(3)-1px)] text-center text-foreground tabular-nums in-data-[size=lg]:leading-9.5 in-data-[size=sm]:leading-7.5 leading-8.5 outline-none sm:h-7.5 sm:in-data-[size=lg]:h-8.5 sm:in-data-[size=sm]:h-6.5 sm:in-data-[size=lg]:leading-8.5 sm:in-data-[size=sm]:leading-6.5 sm:leading-7.5",
className,
)}
data-slot="number-field-input"
Expand Down
2 changes: 1 addition & 1 deletion packages/ui/src/components/number-field.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ export function NumberFieldInput({
return (
<NumberFieldPrimitive.Input
className={cn(
"h-8.5 in-data-[size=lg]:h-9.5 in-data-[size=sm]:h-7.5 w-full min-w-0 grow bg-transparent in-data-[size=sm]:px-[calc(--spacing(2.5)-1px)] px-[calc(--spacing(3)-1px)] text-center text-foreground tabular-nums in-data-[size=lg]:leading-9.5 in-data-[size=sm]:leading-7.5 leading-8.5 outline-none sm:h-7.5 sm:in-data-[size=lg]:h-8.5 sm:in-data-[size=sm]:h-6.5 sm:in-data-[size=lg]:leading-8.5 sm:in-data-[size=sm]:leading-8.5 sm:leading-7.5",
"h-8.5 in-data-[size=lg]:h-9.5 in-data-[size=sm]:h-7.5 w-full min-w-0 grow bg-transparent in-data-[size=sm]:px-[calc(--spacing(2.5)-1px)] px-[calc(--spacing(3)-1px)] text-center text-foreground tabular-nums in-data-[size=lg]:leading-9.5 in-data-[size=sm]:leading-7.5 leading-8.5 outline-none sm:h-7.5 sm:in-data-[size=lg]:h-8.5 sm:in-data-[size=sm]:h-6.5 sm:in-data-[size=lg]:leading-8.5 sm:in-data-[size=sm]:leading-6.5 sm:leading-7.5",
className,
)}
data-slot="number-field-input"
Expand Down
Loading