@frontify/fondue 12.2.3 → 12.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Slider/Slider.es.js.map +1 -1
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.umd.js.map +1 -1
- package/dist/packages/charts/style.css +2 -2
- package/dist/packages/components/style.css +1 -1
- package/dist/packages/tokens/style.css +1 -1
- package/dist/packages/tokens/tailwind.config.js +1 -1
- package/dist/style.css +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Slider.es.js","sources":["../../../src/components/Slider/Slider.tsx"],"sourcesContent":["/* (c) Copyright Frontify Ltd., all rights reserved. */\n\nimport {\n type AriaAttributes,\n type KeyboardEvent,\n type MouseEvent,\n type TouchEvent,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react';\n\nimport { TextInput, TextInputType } from '@components/TextInput';\nimport { useMemoizedId } from '@hooks/useMemoizedId';\nimport { debounce } from '@utilities/debounce';\nimport { merge } from '@utilities/merge';\nimport { clamp } from '@utilities/number';\nimport { Validation } from '@utilities/validation';\n\ntype BaseSliderProps = {\n id?: string;\n label?: string;\n value?: number;\n min?: number;\n max?: number;\n showMinMax?: boolean;\n step?: number;\n stepMultiplier?: number;\n onError?: (errorCode: SliderError) => void;\n onChange: (value: SliderValue) => void;\n valueSuffix?: string;\n disabled?: boolean;\n 'data-test-id'?: string;\n};\n\nexport type SliderValue = {\n raw: number;\n withSuffix: string;\n};\n\nexport type SliderProps = BaseSliderProps &\n Pick<AriaAttributes, 'aria-label'> &\n Pick<AriaAttributes, 'aria-labelledby'>;\n\nexport enum SliderError {\n MinMax = 'MinMax',\n ValueOutOfRange = 'ValueOutOfRange',\n ValueNaN = 'ValueNaN',\n}\n\nexport const MIN_DEFAULT_VALUE = 0;\nexport const MAX_DEFAULT_VALUE = 100;\nexport const STEP_DEFAULT_VALUE = 1;\nexport const STEP_MULTIPLIER_DEFAULT_VALUE = 5;\nexport const ARIA_LABEL_DEFAULT_VALUE = 'Slider text input';\nconst DEBOUNCE_INTERVAL = 3;\nconst INCREMENT_KEYS = ['ArrowUp', 'ArrowRight'];\nconst DECREMENT_KEYS = ['ArrowDown', 'ArrowLeft'];\nconst LIMITS_KEYS = ['Home', 'End'];\n\nexport const Slider = ({\n id: propId,\n label,\n value: propValue,\n min = MIN_DEFAULT_VALUE,\n max = MAX_DEFAULT_VALUE,\n showMinMax = false,\n step = STEP_DEFAULT_VALUE,\n stepMultiplier = STEP_MULTIPLIER_DEFAULT_VALUE,\n valueSuffix = '',\n onError,\n onChange,\n 'aria-label': ariaLabel = ARIA_LABEL_DEFAULT_VALUE,\n 'aria-labelledby': ariaLabelledBy,\n disabled = false,\n 'data-test-id': dataTestId = 'fondue-slider',\n}: SliderProps) => {\n const [value, setValue] = useState<number>();\n const [valueWithSuffix, setValueWithSuffix] = useState('');\n const [error, setError] = useState<SliderError>();\n const [percentagePosition, setPercentagePosition] = useState<number>();\n const [sliderRef, setSliderRef] = useState<HTMLButtonElement | null>(null);\n const [isMouseOver, setIsMouseOver] = useState(false);\n const [isDragging, setIsDragging] = useState(false);\n const id = useMemoizedId(propId);\n\n const onInputChange = (inputValue: string) => {\n // make sure the suffix will be added to the input field\n setValueWithSuffix(`${inputValue.replace(valueSuffix, '')}${valueSuffix}`);\n };\n\n const updateThumbPosition = useCallback(\n ({ clientX, rawValue }: { clientX?: number; rawValue?: number }) => {\n if (!sliderRef) {\n return;\n }\n\n const range = max - min;\n const sliderPosition = sliderRef.getBoundingClientRect().x;\n const trackSize = sliderRef.clientWidth;\n\n let percentage;\n if (clientX !== undefined) {\n const mousePosition = clientX;\n const positionInPixels = mousePosition - sliderPosition;\n percentage = positionInPixels / trackSize;\n } else {\n // if raw value, update thumb position independently of steps\n percentage = ((rawValue ?? min) - min) / range;\n setPercentagePosition(clamp(percentage, 0, 1) * 100);\n return;\n }\n\n const newPosition = clamp(percentage, 0, 1);\n const totalSteps = range / step;\n const stepValue = clamp(Math.round(newPosition * totalSteps) * step + min, min, max);\n setPercentagePosition(((stepValue - min) / range) * 100);\n setValueWithSuffix(`${stepValue}${valueSuffix}`);\n },\n [sliderRef, max, min, step, valueSuffix],\n );\n\n const onDrag = useMemo(\n () =>\n !sliderRef\n ? () => {}\n : debounce((event: Event & { clientX: number; touches: [{ clientX: number }] }) => {\n if (disabled) {\n return;\n }\n updateThumbPosition({\n clientX: event.clientX ?? event.touches[0].clientX,\n });\n }, DEBOUNCE_INTERVAL),\n [updateThumbPosition, sliderRef, disabled],\n );\n\n const stopDrag = useCallback(() => {\n if (!sliderRef) {\n return;\n }\n\n setIsDragging(false);\n window.removeEventListener('mousemove', onDrag);\n window.removeEventListener('touchmove', onDrag);\n window.removeEventListener('mouseup', stopDrag);\n }, [sliderRef, onDrag]);\n\n const startDrag = (event: MouseEvent<HTMLButtonElement> | TouchEvent<HTMLButtonElement>) => {\n if (!sliderRef || disabled) {\n return;\n }\n\n setIsDragging(true);\n\n updateThumbPosition({\n clientX: (event as MouseEvent).clientX ?? (event as TouchEvent).touches[0].clientX,\n });\n\n window.addEventListener('mousemove', onDrag);\n window.addEventListener('touchmove', onDrag);\n window.addEventListener('mouseup', stopDrag);\n };\n\n const onKeyDown = (event: KeyboardEvent<HTMLButtonElement>) => {\n if (\n ![...INCREMENT_KEYS, ...DECREMENT_KEYS, ...LIMITS_KEYS].includes(event.key) ||\n value === undefined ||\n disabled\n ) {\n return;\n }\n\n event.preventDefault();\n\n let variation = 0;\n let rawValue = 0;\n if (DECREMENT_KEYS.includes(event.key)) {\n variation = -step;\n } else if (INCREMENT_KEYS.includes(event.key)) {\n variation = step;\n }\n\n if (!LIMITS_KEYS.includes(event.key)) {\n variation *= event.shiftKey ? stepMultiplier : 1;\n rawValue = clamp(Math.floor(value / step) * step + variation, min, max);\n } else {\n rawValue = event.key === 'Home' ? min : max;\n }\n\n setValue(rawValue);\n setValueWithSuffix(`${rawValue}${valueSuffix}`);\n };\n\n const onMouseOver = () => {\n if (disabled) {\n return;\n }\n\n setIsMouseOver(true);\n };\n\n const onMouseOut = () => {\n if (disabled) {\n return;\n }\n\n setIsMouseOver(false);\n };\n\n const onFocus = () => {\n if (disabled) {\n return;\n }\n\n setIsDragging(true);\n };\n\n const onBlur = () => {\n if (disabled) {\n return;\n }\n\n setIsDragging(false);\n };\n\n // This side effect will handle the initial property values\n // and their changes\n useEffect(() => {\n if (!sliderRef) {\n return;\n }\n\n if (min > max) {\n setError(SliderError.MinMax);\n return;\n }\n\n const raw = propValue ?? min;\n\n setValue(raw);\n setValueWithSuffix(`${raw}${valueSuffix}`);\n updateThumbPosition({ rawValue: raw });\n }, [sliderRef, updateThumbPosition, min, max, propValue, valueSuffix]);\n\n useEffect(() => {\n if (!valueWithSuffix) {\n return;\n }\n\n const valueWithoutSuffix = valueWithSuffix.replace(valueSuffix, '');\n const rawValue = +valueWithoutSuffix;\n\n if (Number.isNaN(rawValue) || !valueWithoutSuffix) {\n setValue(undefined);\n setError(SliderError.ValueNaN);\n return;\n }\n\n if (rawValue < min || rawValue > max) {\n setValue(undefined);\n setError(SliderError.ValueOutOfRange);\n return;\n }\n\n setError(undefined);\n setValue(rawValue);\n }, [valueWithSuffix, valueSuffix, min, max]);\n\n useEffect(() => {\n if (error || value === undefined || !valueWithSuffix) {\n return;\n }\n\n const valueWithoutSuffix = valueWithSuffix.replace(valueSuffix, '');\n const rawValue = +valueWithoutSuffix;\n\n // don't call onChange if value is invalid or different\n // than the value in the text field\n if (Number.isNaN(rawValue) || value !== rawValue) {\n return;\n }\n\n updateThumbPosition({ rawValue: value });\n if (!disabled) {\n onChange({\n raw: value,\n withSuffix: valueWithSuffix.replace(valueSuffix, '') + valueSuffix,\n });\n }\n }, [value, valueWithSuffix, valueSuffix, error, onChange, updateThumbPosition, disabled]);\n\n useEffect(() => {\n if (error && onError) {\n onError(error);\n }\n }, [error, onError]);\n\n return (\n <div className=\"tw-flex tw-flex-col\" data-test-id={dataTestId} id={id}>\n <label\n id={`${id}-label`}\n htmlFor={id}\n className={merge([!label && 'tw-hidden', disabled && 'tw-text-text-disabled'])}\n data-test-id={`${dataTestId}-label`}\n >\n {label}\n </label>\n <div className=\"tw-flex\">\n <div className={merge(['tw-flex-1 tw-flex tw-items-center'])}>\n {showMinMax && (\n <div className={merge(['tw-mr-3', disabled && 'tw-text-text-disabled'])}>\n {min}\n {valueSuffix}\n </div>\n )}\n <button\n ref={setSliderRef}\n data-test-id={`${dataTestId}-interactive`}\n className=\"tw-flex-1 tw-relative tw-h-full tw-cursor-pointer disabled:tw-cursor-default tw-outline-none\"\n onMouseOver={onMouseOver}\n onMouseOut={onMouseOut}\n onFocus={onFocus}\n onBlur={onBlur}\n onMouseDown={startDrag}\n onMouseUp={stopDrag}\n onTouchStart={startDrag}\n onTouchEnd={stopDrag}\n onKeyDown={onKeyDown}\n disabled={disabled}\n >\n <span className=\"tw-absolute tw-block tw-top-1/2 tw--translate-y-1/2 tw-w-full tw-h-1 tw-rounded-sm tw-bg-box-neutral tw-flex-1\"></span>\n {percentagePosition !== undefined && (\n <span\n role=\"slider\"\n aria-valuenow={value}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-label={ariaLabel}\n aria-labelledby={label ? `${id}-label` : ariaLabelledBy}\n data-test-id={`${dataTestId}-track`}\n className={merge([\n 'tw-absolute tw-block tw-top-1/2 tw--translate-y-1/2 tw-origin-left tw-w-full tw-h-1 tw-rounded-sm tw-bg-box-neutral-strong tw-flex-1',\n disabled && 'tw-bg-box-neutral',\n ])}\n style={{ width: `${percentagePosition}%` }}\n ></span>\n )}\n <span\n className={merge([\n 'tw-absolute tw-block tw-top-1/2 tw--translate-y-1/2 tw--translate-x-1/2 tw-w-5 tw-h-5',\n 'after:tw-absolute after:tw-block after:tw-top-1/2 after:tw-left-1/2 after:tw--translate-y-1/2 after:tw--translate-x-1/2 after:tw-w-5 after:tw-h-5 after:tw-bg-base after:tw-rounded-full after:tw-border after:tw-border-line-strong',\n isMouseOver && !isDragging && 'after:tw-shadow',\n isDragging &&\n \"after:tw-border-line-xx-strong before:tw-content-[''] before:tw-opacity-25 before:tw-top-1/2 before:tw--translate-y-1/2 before:tw--translate-x-1/2 before:tw-left-1/2 before:tw-block before:tw-rounded-full before:tw-absolute before:tw-z-0 before:tw-w-9 before:tw-h-9 before:tw-bg-box-neutral-strong\",\n disabled && 'after:tw-bg-box-neutral after:tw-border-line-weak',\n ])}\n style={{ left: `${percentagePosition}%` }}\n ></span>\n </button>\n {showMinMax && (\n <div className={merge(['tw-ml-3', disabled && 'tw-text-text-disabled'])}>\n {max}\n {valueSuffix}\n </div>\n )}\n <div className=\"tw-w-16 tw-ml-3\">\n <TextInput\n id={`${id}-text-input`}\n value={valueWithSuffix}\n placeholder={ariaLabel}\n aria-labelledby={label ? `${id}-label` : ariaLabelledBy}\n type={TextInputType.Text}\n validation={error ? Validation.Error : Validation.Default}\n onChange={onInputChange}\n disabled={disabled}\n />\n </div>\n </div>\n </div>\n </div>\n );\n};\nSlider.displayName = 'FondueSlider';\n"],"names":["SliderError","MIN_DEFAULT_VALUE","MAX_DEFAULT_VALUE","STEP_DEFAULT_VALUE","STEP_MULTIPLIER_DEFAULT_VALUE","ARIA_LABEL_DEFAULT_VALUE","DEBOUNCE_INTERVAL","INCREMENT_KEYS","DECREMENT_KEYS","LIMITS_KEYS","Slider","propId","label","propValue","min","max","showMinMax","step","stepMultiplier","valueSuffix","onError","onChange","ariaLabel","ariaLabelledBy","disabled","dataTestId","value","setValue","useState","valueWithSuffix","setValueWithSuffix","error","setError","percentagePosition","setPercentagePosition","sliderRef","setSliderRef","isMouseOver","setIsMouseOver","isDragging","setIsDragging","id","useMemoizedId","onInputChange","inputValue","updateThumbPosition","useCallback","clientX","rawValue","range","sliderPosition","trackSize","percentage","clamp","newPosition","totalSteps","stepValue","onDrag","useMemo","debounce","event","stopDrag","startDrag","onKeyDown","variation","onMouseOver","onMouseOut","onFocus","onBlur","useEffect","raw","valueWithoutSuffix","jsx","merge","jsxs","TextInput","TextInputType","Validation"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Slider.es.js","sources":["../../../src/components/Slider/Slider.tsx"],"sourcesContent":["/* (c) Copyright Frontify Ltd., all rights reserved. */\n\nimport {\n type AriaAttributes,\n type KeyboardEvent,\n type MouseEvent,\n type TouchEvent,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react';\n\nimport { TextInput, TextInputType } from '@components/TextInput';\nimport { useMemoizedId } from '@hooks/useMemoizedId';\nimport { debounce } from '@utilities/debounce';\nimport { merge } from '@utilities/merge';\nimport { clamp } from '@utilities/number';\nimport { Validation } from '@utilities/validation';\n\ntype BaseSliderProps = {\n id?: string;\n label?: string;\n value?: number;\n min?: number;\n max?: number;\n showMinMax?: boolean;\n step?: number;\n stepMultiplier?: number;\n onError?: (errorCode: SliderError) => void;\n onChange: (value: SliderValue) => void;\n valueSuffix?: string;\n disabled?: boolean;\n 'data-test-id'?: string;\n};\n\nexport type SliderValue = {\n raw: number;\n withSuffix: string;\n};\n\nexport type SliderProps = BaseSliderProps &\n Pick<AriaAttributes, 'aria-label'> &\n Pick<AriaAttributes, 'aria-labelledby'>;\n\nexport enum SliderError {\n MinMax = 'MinMax',\n ValueOutOfRange = 'ValueOutOfRange',\n ValueNaN = 'ValueNaN',\n}\n\nexport const MIN_DEFAULT_VALUE = 0;\nexport const MAX_DEFAULT_VALUE = 100;\nexport const STEP_DEFAULT_VALUE = 1;\nexport const STEP_MULTIPLIER_DEFAULT_VALUE = 5;\nexport const ARIA_LABEL_DEFAULT_VALUE = 'Slider text input';\nconst DEBOUNCE_INTERVAL = 3;\nconst INCREMENT_KEYS = ['ArrowUp', 'ArrowRight'];\nconst DECREMENT_KEYS = ['ArrowDown', 'ArrowLeft'];\nconst LIMITS_KEYS = ['Home', 'End'];\n\n/**\n * @deprecated Use `Slider` from `@frontify/fondue/components` instead. Also check {@link https://github.com/Frontify/fondue/blob/main/packages/components/MIGRATING.md#slider the migration guide}.\n */\nexport const Slider = ({\n id: propId,\n label,\n value: propValue,\n min = MIN_DEFAULT_VALUE,\n max = MAX_DEFAULT_VALUE,\n showMinMax = false,\n step = STEP_DEFAULT_VALUE,\n stepMultiplier = STEP_MULTIPLIER_DEFAULT_VALUE,\n valueSuffix = '',\n onError,\n onChange,\n 'aria-label': ariaLabel = ARIA_LABEL_DEFAULT_VALUE,\n 'aria-labelledby': ariaLabelledBy,\n disabled = false,\n 'data-test-id': dataTestId = 'fondue-slider',\n}: SliderProps) => {\n const [value, setValue] = useState<number>();\n const [valueWithSuffix, setValueWithSuffix] = useState('');\n const [error, setError] = useState<SliderError>();\n const [percentagePosition, setPercentagePosition] = useState<number>();\n const [sliderRef, setSliderRef] = useState<HTMLButtonElement | null>(null);\n const [isMouseOver, setIsMouseOver] = useState(false);\n const [isDragging, setIsDragging] = useState(false);\n const id = useMemoizedId(propId);\n\n const onInputChange = (inputValue: string) => {\n // make sure the suffix will be added to the input field\n setValueWithSuffix(`${inputValue.replace(valueSuffix, '')}${valueSuffix}`);\n };\n\n const updateThumbPosition = useCallback(\n ({ clientX, rawValue }: { clientX?: number; rawValue?: number }) => {\n if (!sliderRef) {\n return;\n }\n\n const range = max - min;\n const sliderPosition = sliderRef.getBoundingClientRect().x;\n const trackSize = sliderRef.clientWidth;\n\n let percentage;\n if (clientX !== undefined) {\n const mousePosition = clientX;\n const positionInPixels = mousePosition - sliderPosition;\n percentage = positionInPixels / trackSize;\n } else {\n // if raw value, update thumb position independently of steps\n percentage = ((rawValue ?? min) - min) / range;\n setPercentagePosition(clamp(percentage, 0, 1) * 100);\n return;\n }\n\n const newPosition = clamp(percentage, 0, 1);\n const totalSteps = range / step;\n const stepValue = clamp(Math.round(newPosition * totalSteps) * step + min, min, max);\n setPercentagePosition(((stepValue - min) / range) * 100);\n setValueWithSuffix(`${stepValue}${valueSuffix}`);\n },\n [sliderRef, max, min, step, valueSuffix],\n );\n\n const onDrag = useMemo(\n () =>\n !sliderRef\n ? () => {}\n : debounce((event: Event & { clientX: number; touches: [{ clientX: number }] }) => {\n if (disabled) {\n return;\n }\n updateThumbPosition({\n clientX: event.clientX ?? event.touches[0].clientX,\n });\n }, DEBOUNCE_INTERVAL),\n [updateThumbPosition, sliderRef, disabled],\n );\n\n const stopDrag = useCallback(() => {\n if (!sliderRef) {\n return;\n }\n\n setIsDragging(false);\n window.removeEventListener('mousemove', onDrag);\n window.removeEventListener('touchmove', onDrag);\n window.removeEventListener('mouseup', stopDrag);\n }, [sliderRef, onDrag]);\n\n const startDrag = (event: MouseEvent<HTMLButtonElement> | TouchEvent<HTMLButtonElement>) => {\n if (!sliderRef || disabled) {\n return;\n }\n\n setIsDragging(true);\n\n updateThumbPosition({\n clientX: (event as MouseEvent).clientX ?? (event as TouchEvent).touches[0].clientX,\n });\n\n window.addEventListener('mousemove', onDrag);\n window.addEventListener('touchmove', onDrag);\n window.addEventListener('mouseup', stopDrag);\n };\n\n const onKeyDown = (event: KeyboardEvent<HTMLButtonElement>) => {\n if (\n ![...INCREMENT_KEYS, ...DECREMENT_KEYS, ...LIMITS_KEYS].includes(event.key) ||\n value === undefined ||\n disabled\n ) {\n return;\n }\n\n event.preventDefault();\n\n let variation = 0;\n let rawValue = 0;\n if (DECREMENT_KEYS.includes(event.key)) {\n variation = -step;\n } else if (INCREMENT_KEYS.includes(event.key)) {\n variation = step;\n }\n\n if (!LIMITS_KEYS.includes(event.key)) {\n variation *= event.shiftKey ? stepMultiplier : 1;\n rawValue = clamp(Math.floor(value / step) * step + variation, min, max);\n } else {\n rawValue = event.key === 'Home' ? min : max;\n }\n\n setValue(rawValue);\n setValueWithSuffix(`${rawValue}${valueSuffix}`);\n };\n\n const onMouseOver = () => {\n if (disabled) {\n return;\n }\n\n setIsMouseOver(true);\n };\n\n const onMouseOut = () => {\n if (disabled) {\n return;\n }\n\n setIsMouseOver(false);\n };\n\n const onFocus = () => {\n if (disabled) {\n return;\n }\n\n setIsDragging(true);\n };\n\n const onBlur = () => {\n if (disabled) {\n return;\n }\n\n setIsDragging(false);\n };\n\n // This side effect will handle the initial property values\n // and their changes\n useEffect(() => {\n if (!sliderRef) {\n return;\n }\n\n if (min > max) {\n setError(SliderError.MinMax);\n return;\n }\n\n const raw = propValue ?? min;\n\n setValue(raw);\n setValueWithSuffix(`${raw}${valueSuffix}`);\n updateThumbPosition({ rawValue: raw });\n }, [sliderRef, updateThumbPosition, min, max, propValue, valueSuffix]);\n\n useEffect(() => {\n if (!valueWithSuffix) {\n return;\n }\n\n const valueWithoutSuffix = valueWithSuffix.replace(valueSuffix, '');\n const rawValue = +valueWithoutSuffix;\n\n if (Number.isNaN(rawValue) || !valueWithoutSuffix) {\n setValue(undefined);\n setError(SliderError.ValueNaN);\n return;\n }\n\n if (rawValue < min || rawValue > max) {\n setValue(undefined);\n setError(SliderError.ValueOutOfRange);\n return;\n }\n\n setError(undefined);\n setValue(rawValue);\n }, [valueWithSuffix, valueSuffix, min, max]);\n\n useEffect(() => {\n if (error || value === undefined || !valueWithSuffix) {\n return;\n }\n\n const valueWithoutSuffix = valueWithSuffix.replace(valueSuffix, '');\n const rawValue = +valueWithoutSuffix;\n\n // don't call onChange if value is invalid or different\n // than the value in the text field\n if (Number.isNaN(rawValue) || value !== rawValue) {\n return;\n }\n\n updateThumbPosition({ rawValue: value });\n if (!disabled) {\n onChange({\n raw: value,\n withSuffix: valueWithSuffix.replace(valueSuffix, '') + valueSuffix,\n });\n }\n }, [value, valueWithSuffix, valueSuffix, error, onChange, updateThumbPosition, disabled]);\n\n useEffect(() => {\n if (error && onError) {\n onError(error);\n }\n }, [error, onError]);\n\n return (\n <div className=\"tw-flex tw-flex-col\" data-test-id={dataTestId} id={id}>\n <label\n id={`${id}-label`}\n htmlFor={id}\n className={merge([!label && 'tw-hidden', disabled && 'tw-text-text-disabled'])}\n data-test-id={`${dataTestId}-label`}\n >\n {label}\n </label>\n <div className=\"tw-flex\">\n <div className={merge(['tw-flex-1 tw-flex tw-items-center'])}>\n {showMinMax && (\n <div className={merge(['tw-mr-3', disabled && 'tw-text-text-disabled'])}>\n {min}\n {valueSuffix}\n </div>\n )}\n <button\n ref={setSliderRef}\n data-test-id={`${dataTestId}-interactive`}\n className=\"tw-flex-1 tw-relative tw-h-full tw-cursor-pointer disabled:tw-cursor-default tw-outline-none\"\n onMouseOver={onMouseOver}\n onMouseOut={onMouseOut}\n onFocus={onFocus}\n onBlur={onBlur}\n onMouseDown={startDrag}\n onMouseUp={stopDrag}\n onTouchStart={startDrag}\n onTouchEnd={stopDrag}\n onKeyDown={onKeyDown}\n disabled={disabled}\n >\n <span className=\"tw-absolute tw-block tw-top-1/2 tw--translate-y-1/2 tw-w-full tw-h-1 tw-rounded-sm tw-bg-box-neutral tw-flex-1\"></span>\n {percentagePosition !== undefined && (\n <span\n role=\"slider\"\n aria-valuenow={value}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-label={ariaLabel}\n aria-labelledby={label ? `${id}-label` : ariaLabelledBy}\n data-test-id={`${dataTestId}-track`}\n className={merge([\n 'tw-absolute tw-block tw-top-1/2 tw--translate-y-1/2 tw-origin-left tw-w-full tw-h-1 tw-rounded-sm tw-bg-box-neutral-strong tw-flex-1',\n disabled && 'tw-bg-box-neutral',\n ])}\n style={{ width: `${percentagePosition}%` }}\n ></span>\n )}\n <span\n className={merge([\n 'tw-absolute tw-block tw-top-1/2 tw--translate-y-1/2 tw--translate-x-1/2 tw-w-5 tw-h-5',\n 'after:tw-absolute after:tw-block after:tw-top-1/2 after:tw-left-1/2 after:tw--translate-y-1/2 after:tw--translate-x-1/2 after:tw-w-5 after:tw-h-5 after:tw-bg-base after:tw-rounded-full after:tw-border after:tw-border-line-strong',\n isMouseOver && !isDragging && 'after:tw-shadow',\n isDragging &&\n \"after:tw-border-line-xx-strong before:tw-content-[''] before:tw-opacity-25 before:tw-top-1/2 before:tw--translate-y-1/2 before:tw--translate-x-1/2 before:tw-left-1/2 before:tw-block before:tw-rounded-full before:tw-absolute before:tw-z-0 before:tw-w-9 before:tw-h-9 before:tw-bg-box-neutral-strong\",\n disabled && 'after:tw-bg-box-neutral after:tw-border-line-weak',\n ])}\n style={{ left: `${percentagePosition}%` }}\n ></span>\n </button>\n {showMinMax && (\n <div className={merge(['tw-ml-3', disabled && 'tw-text-text-disabled'])}>\n {max}\n {valueSuffix}\n </div>\n )}\n <div className=\"tw-w-16 tw-ml-3\">\n <TextInput\n id={`${id}-text-input`}\n value={valueWithSuffix}\n placeholder={ariaLabel}\n aria-labelledby={label ? `${id}-label` : ariaLabelledBy}\n type={TextInputType.Text}\n validation={error ? Validation.Error : Validation.Default}\n onChange={onInputChange}\n disabled={disabled}\n />\n </div>\n </div>\n </div>\n </div>\n );\n};\nSlider.displayName = 'FondueSlider';\n"],"names":["SliderError","MIN_DEFAULT_VALUE","MAX_DEFAULT_VALUE","STEP_DEFAULT_VALUE","STEP_MULTIPLIER_DEFAULT_VALUE","ARIA_LABEL_DEFAULT_VALUE","DEBOUNCE_INTERVAL","INCREMENT_KEYS","DECREMENT_KEYS","LIMITS_KEYS","Slider","propId","label","propValue","min","max","showMinMax","step","stepMultiplier","valueSuffix","onError","onChange","ariaLabel","ariaLabelledBy","disabled","dataTestId","value","setValue","useState","valueWithSuffix","setValueWithSuffix","error","setError","percentagePosition","setPercentagePosition","sliderRef","setSliderRef","isMouseOver","setIsMouseOver","isDragging","setIsDragging","id","useMemoizedId","onInputChange","inputValue","updateThumbPosition","useCallback","clientX","rawValue","range","sliderPosition","trackSize","percentage","clamp","newPosition","totalSteps","stepValue","onDrag","useMemo","debounce","event","stopDrag","startDrag","onKeyDown","variation","onMouseOver","onMouseOut","onFocus","onBlur","useEffect","raw","valueWithoutSuffix","jsx","merge","jsxs","TextInput","TextInputType","Validation"],"mappings":"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"}
|