@carbon/react
Version:
React components for the Carbon Design System
107 lines (98 loc) • 3.55 kB
JavaScript
/**
* Copyright IBM Corp. 2016, 2023
*
* This source code is licensed under the Apache-2.0 license found in the
* LICENSE file in the root directory of this source tree.
*/
;
Object.defineProperty(exports, '__esModule', { value: true });
var _rollupPluginBabelHelpers = require('../../_virtual/_rollupPluginBabelHelpers.js');
var PropTypes = require('prop-types');
var React = require('react');
var cx = require('classnames');
var usePrefix = require('../../internal/usePrefix.js');
var useIsomorphicEffect = require('../../internal/useIsomorphicEffect.js');
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
var PropTypes__default = /*#__PURE__*/_interopDefaultLegacy(PropTypes);
var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
var cx__default = /*#__PURE__*/_interopDefaultLegacy(cx);
const randoms = [0.973051493507435, 0.15334737213558558, 0.5671034553053769];
function getRandomInt(min, max, n) {
return Math.floor(randoms[n % 3] * (max - min + 1)) + min;
}
const SkeletonText = ({
paragraph = false,
lineCount = 3,
width = '100%',
heading = false,
className = '',
...rest
}) => {
const prefix = usePrefix.usePrefix();
const skeletonTextClasses = cx__default["default"]({
[`${prefix}--skeleton__text`]: true,
[`${prefix}--skeleton__heading`]: heading,
[className]: className
});
const widthNum = parseInt(width, 10);
const widthPx = width.includes('px');
const widthPercent = width.includes('%');
let lineCountNumber = 1;
if (paragraph) {
lineCountNumber = lineCount;
}
const refs = React.useRef([]);
useIsomorphicEffect["default"](() => {
refs.current.map((item, j) => {
const randomPercentWidth = getRandomInt(0, 75, j) + 'px';
const randomPxWidth = getRandomInt(Math.max(widthNum - 75, 0), widthNum, j) + 'px';
if (item) {
if (widthPercent && paragraph) {
item.style.width = `calc(${width} - ${randomPercentWidth})`;
} else if (widthPx && paragraph) {
item.style.width = randomPxWidth;
} else {
item.style.width = width;
}
}
});
}, [lineCountNumber, paragraph, refs, width, widthNum, widthPercent, widthPx]);
const lines = [];
for (let i = 0; i < lineCountNumber; i++) {
lines.push(/*#__PURE__*/React__default["default"].createElement("p", _rollupPluginBabelHelpers["extends"]({
className: skeletonTextClasses,
key: i,
ref: el => {
refs.current = [...refs.current, el];
}
}, rest)));
}
if (lineCountNumber !== 1) {
return /*#__PURE__*/React__default["default"].createElement("div", null, lines);
}
// eslint-disable-next-line react/jsx-no-useless-fragment
return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, lines);
};
SkeletonText.propTypes = {
/**
* Specify an optional className to be applied to the container node
*/
className: PropTypes__default["default"].string,
/**
* generates skeleton text at a larger size
*/
heading: PropTypes__default["default"].bool,
/**
* the number of lines shown if paragraph is true
*/
lineCount: PropTypes__default["default"].number,
/**
* will generate multiple lines of text
*/
paragraph: PropTypes__default["default"].bool,
/**
* width (in px or %) of single line of text or max-width of paragraph lines
*/
width: PropTypes__default["default"].string
};
exports["default"] = SkeletonText;