quantity-input-basic
stackzero/quantity-input-basicFreeComponent
stackzero publishes no description for this item.
Install it
npx shadcn@latest add https://ui.stackzero.co/r/quantity-input-basic.jsonSource
1"use client";2import { cn } from "@/lib/utils";3import { Minus, Plus } from "lucide-react";4import { ChangeEvent, useState, useEffect } from "react";56interface QuantityInputBasicProps {7 quantity: number;8 min?: number;9 max?: number | null;10 step?: number;11 disabled?: boolean;12 onChange: (quantity: number) => void;13 className?: string;14}1516const QuantityInputBasic = ({17 className,18 disabled = false,19 max = null,20 min = 1,21 onChange,22 quantity,23 step = 1,24}: QuantityInputBasicProps) => {25 // Internal state to handle input field text during editing26 const [inputValue, setInputValue] = useState(quantity.toString());2728 // Update internal input value when external quantity prop changes29 useEffect(() => {30 setInputValue(quantity.toString());31 }, [quantity]);3233 const handleDecrease = () => {34 if (quantity - step >= min) {35 onChange(quantity - step);36 }37 };3839 const handleIncrease = () => {40 if (max === null || quantity + step <= max) {41 onChange(quantity + step);42 }43 };4445 const handleInputChange = (e: ChangeEvent<HTMLInputElement>) => {46 // Allow any input including empty string during editing47 setInputValue(e.target.value);4849 // If the input is a valid number, update the parent component50 const value = parseInt(e.target.value);51 if (!isNaN(value) && value >= min && (max === null || value <= max)) {52 onChange(value);53 }54 };5556 const handleBlur = () => {57 // When the field loses focus, ensure we have a valid value58 const value = parseInt(inputValue);59 if (isNaN(value) || value < min) {60 // If invalid or below min, reset to min61 setInputValue(min.toString());62 onChange(min);63 } else if (max !== null && value > max) {64 // If above max and max is defined, reset to max65 setInputValue(max.toString());66 onChange(max);67 } else {68 // Ensure the displayed value matches the actual value69 setInputValue(value.toString());70 onChange(value);71 }72 };7374 return (75 <div76 className={cn(77 "inline-flex cursor-pointer rounded-lg shadow-xs shadow-black/5",78 className79 )}80 >81 <button82 className={cn(83 "hover:bg-muted-foreground/10 flex cursor-pointer items-center justify-center rounded-s-lg border px-3 py-1 focus-visible:z-10 disabled:cursor-not-allowed disabled:opacity-50",84 disabled && "pointer-events-none"85 )}86 onClick={handleDecrease}87// … truncated
What it pulls in
npm packages
Files it writes
More from stackzero
All 112 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| face-rating-basicface-rating-basic | stackzero | Components | Free | 1 dep | |
| face-rating-gradientface-rating-gradient | stackzero | Components | Free | 2 deps | |
| image-carousel-basicimage-carousel-basic | stackzero | Components | Free | 5 deps | |
| image-viewer-basicimage-viewer-basic | stackzero | Components | Free | 3 deps | |
| image-viewer-basic-ex-01image-viewer-basic-ex-01 | stackzero | Components | Free | 1 dep | |
| image-viewer-basic-ex-02image-viewer-basic-ex-02 | stackzero | Components | Free | 1 dep | |
| image-viewer-motionimage-viewer-motion | stackzero | Components | Free | 4 deps | |
| image-viewer-motion-ex-01image-viewer-motion-ex-01 | stackzero | Components | Free | 1 dep |
