rsuite
Version:
A suite of react components
91 lines (90 loc) • 3.14 kB
JavaScript
'use client';
import _extends from "@babel/runtime/helpers/esm/extends";
import React from 'react';
import Mark from "./Mark.js";
import Box from "../internals/Box/index.js";
import { forwardRef } from "../internals/utils/index.js";
import { useStyles } from "../internals/hooks/index.js";
import { precisionMath } from "./utils.js";
const Graduated = forwardRef((props, ref) => {
const {
as,
step,
min,
max,
count,
value,
classPrefix = 'slider',
className,
marks = [],
renderMark,
...rest
} = props;
const {
merge,
prefix,
cssVar
} = useStyles(classPrefix);
const activeIndexs = [];
let startIndex = 0;
let endIndex = 0;
if (Array.isArray(value)) {
const [start, end] = value;
startIndex = precisionMath(start / step - min / step);
endIndex = precisionMath(end / step - min / step);
activeIndexs.push(precisionMath(Math.ceil((start - min) / (max - min) * count)));
activeIndexs.push(precisionMath(Math.ceil((end - min) / (max - min) * count)));
} else {
endIndex = precisionMath(value / step - min / step);
activeIndexs.push(precisionMath(Math.ceil((value - min) / (max - min) * count)));
}
const graduatedItems = [];
// If custom marks are provided, use them
if (marks.length > 0) {
// Only create DOM nodes for the specific mark values
marks.forEach((mark, index) => {
// Calculate the position index for this mark
const markPosition = precisionMath((mark.value - min) / (max - min) * count);
graduatedItems.push(/*#__PURE__*/React.createElement("li", {
className: prefix('tick'),
key: `${mark.value}-${index}`,
"data-pass": markPosition >= startIndex && markPosition <= endIndex,
"data-active": activeIndexs.indexOf(markPosition) !== -1,
style: cssVar('tick-offset', `${(mark.value - min) / (max - min) * 100}%`)
}, /*#__PURE__*/React.createElement(Mark, {
mark: mark.value,
renderMark: () => mark.label || mark.value
})));
});
} else {
// Original implementation for when no custom marks are provided
for (let i = 0; i < count; i += 1) {
const mark = precisionMath(i * step + min);
const lastMark = Math.min(max, mark + step);
const last = i === count - 1;
graduatedItems.push(/*#__PURE__*/React.createElement("li", {
className: prefix('tick'),
"data-pass": i >= startIndex && i <= endIndex,
"data-active": activeIndexs.indexOf(i) !== -1,
key: i
}, /*#__PURE__*/React.createElement(Mark, {
mark: mark,
renderMark: renderMark
}), last ? /*#__PURE__*/React.createElement(Mark, {
mark: lastMark,
renderMark: renderMark,
last: last
}) : null));
}
}
const classes = merge(className, prefix('graduator'));
return /*#__PURE__*/React.createElement(Box, _extends({
as: as,
ref: ref,
className: classes
}, rest, {
"data-with-marks": marks.length > 0
}), /*#__PURE__*/React.createElement("ol", null, graduatedItems));
});
Graduated.displayName = 'Graduated';
export default Graduated;