@wordpress/components
Version:
UI components for WordPress.
111 lines (108 loc) • 2.53 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = RangeRail;
var _i18n = require("@wordpress/i18n");
var _mark = _interopRequireDefault(require("./mark"));
var _rangeControlStyles = require("./styles/range-control-styles");
var _jsxRuntime = require("react/jsx-runtime");
var _react = require("react");
/**
* WordPress dependencies
*/
/**
* Internal dependencies
*/
function RangeRail(props) {
const {
disabled = false,
marks = false,
min = 0,
max = 100,
step = 1,
value = 0,
...restProps
} = props;
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_rangeControlStyles.Rail, {
disabled: disabled,
...restProps
}), marks && /*#__PURE__*/(0, _jsxRuntime.jsx)(Marks, {
disabled: disabled,
marks: marks,
min: min,
max: max,
step: step,
value: value
})]
});
}
function Marks(props) {
const {
disabled = false,
marks = false,
min = 0,
max = 100,
step: stepProp = 1,
value = 0
} = props;
const step = stepProp === 'any' ? 1 : stepProp;
const marksData = useMarks({
marks,
min,
max,
step,
value
});
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_rangeControlStyles.MarksWrapper, {
"aria-hidden": "true",
className: "components-range-control__marks",
children: marksData.map(mark => /*#__PURE__*/(0, _react.createElement)(_mark.default, {
...mark,
key: mark.key,
"aria-hidden": "true",
disabled: disabled
}))
});
}
function useMarks({
marks,
min = 0,
max = 100,
step = 1,
value = 0
}) {
if (!marks) {
return [];
}
const range = max - min;
if (!Array.isArray(marks)) {
marks = [];
const count = 1 + Math.round(range / step);
while (count > marks.push({
value: step * marks.length + min
})) {}
}
const placedMarks = [];
marks.forEach((mark, index) => {
if (mark.value < min || mark.value > max) {
return;
}
const key = `mark-${index}`;
const isFilled = mark.value <= value;
const offset = `${(mark.value - min) / range * 100}%`;
const offsetStyle = {
[(0, _i18n.isRTL)() ? 'right' : 'left']: offset
};
placedMarks.push({
...mark,
isFilled,
key,
style: offsetStyle
});
});
return placedMarks;
}
//# sourceMappingURL=rail.js.map