UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

115 lines (114 loc) 4.57 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _react = _interopRequireDefault(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _componentHelper = require("../../shared/component-helper.js"); var _index = require("../../shared/index.js"); var _clamp = require("../../shared/helpers/clamp.js"); var _Text = require("./Text.js"); var _StarIcon, _span, _path; 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 MAX_ALLOWED = 20; function Rating(props) { const { value = 0, max = null, id = null, variant = 'stars', element: Element = 'span', className = null, style = null, srLabel = null, skeleton = null, ...rest } = props; const defaultMax = variant === 'progressive' ? 7 : 5; const resolvedMax = Number.isFinite(max) && max > 0 ? Math.floor(max) : defaultMax; if (resolvedMax > MAX_ALLOWED) { (0, _componentHelper.warn)(`Stat.Rating: max=${resolvedMax} exceeds the supported limit of ${MAX_ALLOWED}. The value will be clamped.`); } const clampedMax = Math.min(resolvedMax, MAX_ALLOWED); const safeValue = Number.isFinite(value) ? value : 0; const normalizedValue = (0, _clamp.clamp)(safeValue, 0, clampedMax); const labelValue = Number.isInteger(normalizedValue) ? String(normalizedValue) : String(parseFloat(normalizedValue.toFixed(2))); const { Stat: { rating: ratingTemplate = '%value of %max' } = {} } = (0, _index.useTranslation)(); const localizedRating = ratingTemplate.replace('%value', labelValue).replace('%max', String(clampedMax)); const label = srLabel ? `${(0, _componentHelper.convertJsxToString)(srLabel)} ${localizedRating}` : localizedRating; return _react.default.createElement(_Text.TextInternal, _extends({}, rest, { id: id, element: Element, className: (0, _classnames.default)(`dnb-stat dnb-stat__rating dnb-stat__rating--${variant}`, className), style: style, role: "img", "aria-label": label, skeleton: skeleton, skeletonMethod: "shape", textClassName: false }), variant === 'stars' ? _react.default.createElement("span", { className: "dnb-stat__rating-stars", "aria-hidden": true }, Array.from({ length: clampedMax }).map((_, index) => { const fill = (0, _clamp.clamp)(normalizedValue - index, 0, 1); return _react.default.createElement("span", { key: index, className: "dnb-stat__rating-star", style: { '--dnb-stat-rating-fill': `${fill * 100}%` }, "data-fill": fill.toFixed(2) }, _StarIcon || (_StarIcon = _react.default.createElement(StarIcon, { variant: "base" })), _span || (_span = _react.default.createElement("span", { className: "dnb-stat__rating-fill" }, _react.default.createElement(StarIcon, { variant: "active" })))); })) : _react.default.createElement("span", { className: "dnb-stat__rating-progressive", "aria-hidden": true }, Array.from({ length: clampedMax }).map((_, index) => { const fill = (0, _clamp.clamp)(normalizedValue - index, 0, 1); const stepHeight = clampedMax > 1 ? 0.25 + index / (clampedMax - 1) * 0.75 : 1; return _react.default.createElement("span", { key: index, className: "dnb-stat__rating-progressive-step dnb-stat__rating-progressive-step--base", style: { '--dnb-stat-rating-step-fill': `${fill * 100}%`, '--dnb-stat-rating-step-height': `${stepHeight}rem` }, "data-fill": fill.toFixed(2) }); }))); } const STAR_PATH = 'M5.9996 0L7.8546 3.95006L12 4.58343L9.0006 7.65834L9.708 12L5.9996 9.95006L2.2928 12L3.0002 7.65834L0 4.58343L4.1462 3.95006L5.9996 0Z'; function StarIcon({ variant }) { return _react.default.createElement("svg", { className: `dnb-stat__rating-icon dnb-stat__rating-icon--${variant}`, width: "12", height: "12", viewBox: "0 0 12 12", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, _path || (_path = _react.default.createElement("path", { fillRule: "evenodd", clipRule: "evenodd", d: STAR_PATH }))); } Rating._supportsSpacingProps = true; var _default = exports.default = Rating; //# sourceMappingURL=Rating.js.map