{"version":3,"file":"StepperInput.cjs","names":[],"sources":["../../../src/components/StepperInput/StepperInput.tsx"],"sourcesContent":["/**\n * @tempest-limits props-count — value/onChange/min/max/step is the numeric contract,\n * format renders it, labels names the increment and decrement buttons for screen\n * readers, and size/disabled/label/className are the field. The button labels cannot\n * be defaulted: they are the only text those buttons have.\n */\nimport { forwardRef } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { clamp } from \"@/utils/numbers\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./StepperInput.module.css\";\n\nexport interface StepperInputProps {\n    /** Current value. */\n    value: number;\n    /** Fires with the new value (already clamped to min/max). */\n    onChange: (value: number) => void;\n    /** Lower bound. Default `0`. */\n    min?: number;\n    /** Upper bound. Default `Number.POSITIVE_INFINITY`. */\n    max?: number;\n    /** Increment per click. Default `1`. */\n    step?: number;\n    /** Visual size. Default `\"md\"`. */\n    size?: \"sm\" | \"md\" | \"lg\";\n    /** Disable the whole control. */\n    disabled?: boolean;\n    /** Optional label rendered above. */\n    label?: ReactNode;\n    /** Optional formatter for the displayed value. */\n    format?: (value: number) => string;\n    /** Custom button labels for accessibility. */\n    labels?: { decrement: string; increment: string };\n    className?: string;\n}\n\n/**\n * Numeric +/− stepper. Common in checkout quantity selectors and admin\n * forms. Clamps to `[min, max]` and emits already-bounded values.\n *\n * @example\n * <StepperInput value={qty} onChange={setQty} min={1} max={10} />\n */\nexport const StepperInput = forwardRef<HTMLDivElement, StepperInputProps>(function StepperInput(\n    {\n        value,\n        onChange,\n        min = 0,\n        max = Number.POSITIVE_INFINITY,\n        step = 1,\n        size = \"md\",\n        disabled = false,\n        label,\n        format,\n        labels = { decrement: \"Diminuir\", increment: \"Aumentar\" },\n        className,\n    },\n    ref,\n) {\n    const decrement = (): void => {\n        if (disabled) return;\n        onChange(clamp(value - step, min, max));\n    };\n    const increment = (): void => {\n        if (disabled) return;\n        onChange(clamp(value + step, min, max));\n    };\n\n    const display = format ? format(value) : String(value);\n    const canDecrement = !disabled && value > min;\n    const canIncrement = !disabled && value < max;\n\n    return (\n        <div ref={ref} className={cn(styles.wrapper, className)}>\n            {label && <label className={styles.label}>{label}</label>}\n            <div className={cn(styles.row, styles[size], disabled && styles.disabled)}>\n                <button\n                    type=\"button\"\n                    className={styles.btn}\n                    aria-label={labels.decrement}\n                    onClick={decrement}\n                    disabled={!canDecrement}\n                >\n                    −\n                </button>\n                <span className={styles.value} role=\"status\" aria-live=\"polite\">\n                    {display}\n                </span>\n                <button\n                    type=\"button\"\n                    className={styles.btn}\n                    aria-label={labels.increment}\n                    onClick={increment}\n                    disabled={!canIncrement}\n                >\n                    +\n                </button>\n            </div>\n        </div>\n    );\n});\n"],"mappings":"wKA2CA,IAAa,GAAA,EAAe,EAAA,WAAA,CAA8C,SACtE,CACI,QACA,WACA,MAAM,EACN,MAAM,IACN,OAAO,EACP,OAAO,KACP,WAAW,GACX,QACA,SACA,SAAS,CAAE,UAAW,WAAY,UAAW,UAAW,EACxD,aAEJ,EACF,CACE,IAAM,MAAwB,CACtB,GACJ,EAAS,EAAA,MAAM,EAAQ,EAAM,EAAK,CAAG,CAAC,CAC1C,EACM,MAAwB,CACtB,GACJ,EAAS,EAAA,MAAM,EAAQ,EAAM,EAAK,CAAG,CAAC,CAC1C,EAEM,EAAU,EAAS,EAAO,CAAK,EAAI,OAAO,CAAK,EAC/C,EAAe,CAAC,GAAY,EAAQ,EACpC,EAAe,CAAC,GAAY,EAAQ,EAE1C,OACI,EAAA,EAAA,KAAA,CAAC,MAAD,CAAU,MAAK,UAAW,EAAA,GAAG,EAAA,QAAO,QAAS,CAAS,EAAtD,SAAA,CACK,IAAS,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,UAAW,EAAA,QAAO,MAAQ,SAAA,CAAa,CAAA,GACxD,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAA,GAAG,EAAA,QAAO,IAAK,EAAA,QAAO,GAAO,GAAY,EAAA,QAAO,QAAQ,EAAxE,SAAA,EACI,EAAA,EAAA,IAAA,CAAC,SAAD,CACI,KAAK,SACL,UAAW,EAAA,QAAO,IAClB,aAAY,EAAO,UACnB,QAAS,EACT,SAAU,CAAC,EACd,SAAA,GAEO,CAAA,GACR,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,MAAO,KAAK,SAAS,YAAU,SAClD,SAAA,CACC,CAAA,GACN,EAAA,EAAA,IAAA,CAAC,SAAD,CACI,KAAK,SACL,UAAW,EAAA,QAAO,IAClB,aAAY,EAAO,UACnB,QAAS,EACT,SAAU,CAAC,EACd,SAAA,GAEO,CAAA,CACP,CACJ,CAAA,CAAA,GAEb,CAAC"}