@aegov/design-system-react
Version:
A design system for the Government of the United Arab Emirates. Extending the original design system released as @aegov/design-system, this is the package specefically created for the ReactJs enviornment.
127 lines (124 loc) • 5.19 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _react = _interopRequireDefault(require("react"));
var _reactSlider = require("@radix-ui/react-slider");
var _reactLabel = require("@radix-ui/react-label");
var _tailwindMerge = require("tailwind-merge");
var _zod = require("zod");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
const RangeSliderSchema = _zod.z.object({
value: _zod.z.number().optional(),
defaultValue: _zod.z.number().optional(),
min: _zod.z.number().optional(),
max: _zod.z.number().optional(),
step: _zod.z.number().optional(),
onValueChange: _zod.z.function().optional(),
onValueCommit: _zod.z.function().optional(),
disabled: _zod.z.boolean().optional(),
required: _zod.z.boolean().optional(),
name: _zod.z.string().optional(),
label: _zod.z.string().optional(),
helperText: _zod.z.string().optional(),
error: _zod.z.string().optional(),
size: _zod.z.enum(['sm', 'base', 'lg']).optional(),
variant: _zod.z.enum(['primary', 'secondary']).optional(),
className: _zod.z.string().optional()
});
const sizeStyles = {
sm: {
track: 'h-1',
thumb: 'h-3.5 w-3.5',
label: 'text-sm',
helperText: 'text-xs'
},
base: {
track: 'h-1.5',
thumb: 'h-4 w-4',
label: 'text-base',
helperText: 'text-sm'
},
lg: {
track: 'h-2',
thumb: 'h-5 w-5',
label: 'text-lg',
helperText: 'text-base'
}
};
const variantStyles = {
primary: {
track: 'bg-primary-100',
range: 'bg-primary-600',
thumb: 'border-primary-600 focus:ring-primary-500'
},
secondary: {
track: 'bg-secondary-100',
range: 'bg-secondary-800',
thumb: 'border-secondary-800 focus:ring-secondary-500'
}
};
const RangeSlider = /*#__PURE__*/_react.default.forwardRef((props, ref) => {
const {
value,
defaultValue = 20,
min = 0,
max = 100,
step = 1,
onValueChange,
onValueCommit,
disabled,
required,
name,
label,
helperText,
error,
size = 'base',
variant = 'primary',
className,
...rest
} = RangeSliderSchema.parse(props);
// Generate a unique ID for accessibility
const id = _react.default.useMemo(() => name || `range-${Math.random().toString(36).slice(2)}`, [name]);
// Convert single number to array for Radix UI Slider
const sliderValue = value !== undefined ? [value] : undefined;
const sliderDefaultValue = [defaultValue];
const handleValueChange = newValue => onValueChange?.(newValue[0]);
const handleValueCommit = newValue => onValueCommit?.(newValue[0]);
return /*#__PURE__*/_react.default.createElement("div", {
className: (0, _tailwindMerge.twMerge)('w-full', className)
}, label && /*#__PURE__*/_react.default.createElement(_reactLabel.Root, {
htmlFor: id,
className: (0, _tailwindMerge.twMerge)('mb-1.5 block font-medium text-gray-900', sizeStyles[size].label, error && 'text-red-600', required && 'after:ml-0.5 after:text-red-500 after:content-["*"]', disabled && 'opacity-50')
}, label), /*#__PURE__*/_react.default.createElement("div", {
className: "flex items-center gap-4"
}, /*#__PURE__*/_react.default.createElement(_reactSlider.Root, _extends({
ref: ref,
id: id,
value: sliderValue,
defaultValue: sliderDefaultValue,
min: min,
max: max,
step: step,
onValueChange: handleValueChange,
onValueCommit: handleValueCommit,
disabled: disabled,
name: name,
className: "relative flex w-full touch-none select-none items-center"
}, rest), /*#__PURE__*/_react.default.createElement(_reactSlider.Track, {
className: (0, _tailwindMerge.twMerge)('relative grow rounded-full', sizeStyles[size].track, variantStyles[variant].track, disabled && 'opacity-50')
}, /*#__PURE__*/_react.default.createElement(_reactSlider.Range, {
className: (0, _tailwindMerge.twMerge)('absolute rounded-full', sizeStyles[size].track, variantStyles[variant].range, disabled && 'opacity-50')
})), /*#__PURE__*/_react.default.createElement(_reactSlider.Thumb, {
className: (0, _tailwindMerge.twMerge)('block rounded-full border-2 bg-white shadow-sm transition-colors', 'focus:outline-none focus:ring-2 focus:ring-offset-2', 'disabled:pointer-events-none disabled:opacity-50', sizeStyles[size].thumb, variantStyles[variant].thumb)
})), /*#__PURE__*/_react.default.createElement("output", {
htmlFor: id,
className: (0, _tailwindMerge.twMerge)('w-12 text-right text-gray-900', sizeStyles[size].label, disabled && 'opacity-50')
}, value ?? defaultValue)), (helperText || error) && /*#__PURE__*/_react.default.createElement("p", {
className: (0, _tailwindMerge.twMerge)('mt-1.5', sizeStyles[size].helperText, error ? 'text-red-600' : 'text-gray-500')
}, error || helperText));
});
RangeSlider.displayName = 'RangeSlider';
var _default = exports.default = RangeSlider;