{"version":3,"file":"RangeSlider.cjs","names":[],"sources":["../../../src/components/RangeSlider/RangeSlider.tsx"],"sourcesContent":["/**\n * @tempest-limits props-count — min, max and step define the scale, value/onChange\n * the two thumbs, formatValue the readout, and label/helperText/disabled/className\n * the field around it. Same surface as Slider, one thumb more.\n */\nimport { useCallback, useMemo } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./RangeSlider.module.css\";\n\nexport type RangeValue = [number, number];\n\nexport interface RangeSliderProps {\n    value: RangeValue;\n    onChange: (value: RangeValue) => void;\n    min?: number;\n    max?: number;\n    step?: number;\n    label?: string;\n    helperText?: string;\n    disabled?: boolean;\n    /** Formatter for the value badge next to the label. Defaults to `min – max`. */\n    formatValue?: (value: RangeValue) => string;\n    /**\n     * Accessible name for the pair, for when the visible `label` block does not fit.\n     *\n     * Each thumb still gets its own suffixed name — `\"Preço (mínimo)\"` and\n     * `\"Preço (máximo)\"` — because a screen reader user moving between the two\n     * needs to know which end they are on. Takes precedence over `label`.\n     */\n    \"aria-label\"?: string;\n    className?: string;\n}\n\n/**\n * Dual-thumb range slider. Built on two native `<input type=\"range\">` so it\n * stays accessible and works with keyboards/screen readers without\n * heavyweight positioning libs. The active fill is positioned via percentages.\n */\nexport function RangeSlider({\n    value,\n    onChange,\n    min = 0,\n    max = 100,\n    step = 1,\n    label,\n    helperText,\n    disabled = false,\n    formatValue,\n    \"aria-label\": ariaLabel,\n    className,\n}: RangeSliderProps) {\n    const [low, high] = value;\n    const range = max - min;\n\n    const fillLeft = useMemo(() => ((low - min) / range) * 100, [low, min, range]);\n    const fillRight = useMemo(() => ((high - min) / range) * 100, [high, min, range]);\n\n    const valueText = formatValue?.(value) ?? `${low} – ${high}`;\n    const name = ariaLabel ?? label;\n\n    const handleLow = useCallback(\n        (event: React.ChangeEvent<HTMLInputElement>): void => {\n            const next = Math.min(Number(event.target.value), high);\n            onChange([next, high]);\n        },\n        [high, onChange],\n    );\n\n    const handleHigh = useCallback(\n        (event: React.ChangeEvent<HTMLInputElement>): void => {\n            const next = Math.max(Number(event.target.value), low);\n            onChange([low, next]);\n        },\n        [low, onChange],\n    );\n\n    return (\n        <div className={cn(styles.wrapper, className)}>\n            {label && (\n                <div className={styles.label}>\n                    <span>{label}</span>\n                    <span className={styles.value}>{valueText}</span>\n                </div>\n            )}\n            <div className={styles.field}>\n                <div className={styles.track} />\n                <div\n                    className={styles.fill}\n                    style={{ left: `${fillLeft}%`, right: `${100 - fillRight}%` }}\n                />\n                <input\n                    type=\"range\"\n                    className={styles.input}\n                    min={min}\n                    max={max}\n                    step={step}\n                    value={low}\n                    onChange={handleLow}\n                    disabled={disabled}\n                    aria-label={name ? `${name} (mínimo)` : \"Mínimo\"}\n                />\n                <input\n                    type=\"range\"\n                    className={styles.input}\n                    min={min}\n                    max={max}\n                    step={step}\n                    value={high}\n                    onChange={handleHigh}\n                    disabled={disabled}\n                    aria-label={name ? `${name} (máximo)` : \"Máximo\"}\n                />\n            </div>\n            {helperText && <span className={styles.helper}>{helperText}</span>}\n        </div>\n    );\n}\n"],"mappings":"kIAsCA,SAAgB,EAAY,CACxB,QACA,WACA,MAAM,EACN,MAAM,IACN,OAAO,EACP,QACA,aACA,WAAW,GACX,cACA,aAAc,EACd,aACiB,CACjB,GAAM,CAAC,EAAK,GAAQ,EACd,EAAQ,EAAM,EAEd,GAAA,EAAW,EAAA,QAAA,MAAgB,EAAM,GAAO,EAAS,IAAK,CAAC,EAAK,EAAK,CAAK,CAAC,EACvE,GAAA,EAAY,EAAA,QAAA,MAAgB,EAAO,GAAO,EAAS,IAAK,CAAC,EAAM,EAAK,CAAK,CAAC,EAE1E,EAAY,IAAc,CAAK,GAAK,GAAG,EAAI,KAAK,IAChD,EAAO,GAAa,EAEpB,GAAA,EAAY,EAAA,YAAA,CACb,GAAqD,CAElD,EAAS,CADI,KAAK,IAAI,OAAO,EAAM,OAAO,KAAK,EAAG,CACxC,EAAM,CAAI,CAAC,CACzB,EACA,CAAC,EAAM,CAAQ,CACnB,EAEM,GAAA,EAAa,EAAA,YAAA,CACd,GAAqD,CAClD,IAAM,EAAO,KAAK,IAAI,OAAO,EAAM,OAAO,KAAK,EAAG,CAAG,EACrD,EAAS,CAAC,EAAK,CAAI,CAAC,CACxB,EACA,CAAC,EAAK,CAAQ,CAClB,EAEA,OACI,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAA,GAAG,EAAA,QAAO,QAAS,CAAS,EAA5C,SAAA,CACK,IACG,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAA,QAAO,MAAvB,SAAA,EACI,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,CAAY,CAAA,GACnB,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,MAAQ,SAAA,CAAgB,CAAA,CAC/C,KAET,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAA,QAAO,MAAvB,SAAA,EACI,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAA,QAAO,KAAQ,CAAA,GAC/B,EAAA,EAAA,IAAA,CAAC,MAAD,CACI,UAAW,EAAA,QAAO,KAClB,MAAO,CAAE,KAAM,GAAG,EAAS,GAAI,MAAO,GAAG,IAAM,EAAU,EAAG,CAC/D,CAAA,GACD,EAAA,EAAA,IAAA,CAAC,QAAD,CACI,KAAK,QACL,UAAW,EAAA,QAAO,MACb,MACA,MACC,OACN,MAAO,EACP,SAAU,EACA,WACV,aAAY,EAAO,GAAG,EAAK,WAAa,QAC3C,CAAA,GACD,EAAA,EAAA,IAAA,CAAC,QAAD,CACI,KAAK,QACL,UAAW,EAAA,QAAO,MACb,MACA,MACC,OACN,MAAO,EACP,SAAU,EACA,WACV,aAAY,EAAO,GAAG,EAAK,WAAa,QAC3C,CAAA,CACA,IACJ,IAAc,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,OAAS,SAAA,CAAiB,CAAA,CAChE,GAEb"}