UNPKG

@retailmenot/anchor

Version:

A React UI Library by RetailMeNot

148 lines (119 loc) 5.79 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } var __chunk_1 = require('./anchor-chunk-24f232e7.js'); var __chunk_2 = require('./anchor-chunk-9d9a5df6.js'); var React = require('react'); var classNames = _interopDefault(require('classnames')); var styled = require('@xstyled/styled-components'); var styled__default = _interopDefault(styled); var system = require('@xstyled/system'); function _templateObject5() { var data = __chunk_1._taggedTemplateLiteral(["\n pointer-events: none;\n background: ", ";\n animation: ", " 2s ease-in-out\n infinite;\n\n // hide all children\n && * {\n visibility: hidden;\n opacity: 0;\n }\n "]); _templateObject5 = function _templateObject5() { return data; }; return data; } function _templateObject4() { var data = __chunk_1._taggedTemplateLiteral(["\n // its all one word technically, so we want to make sure\n // it can be broken up into multiple lines\n word-break: break-all;\n white-space: normal;\n\n // smoothing can make it appear as though theres\n // a gap between the block characters\n -webkit-font-smoothing: none;\n -moz-osx-font-smoothing: auto;\n\n color: ", ";\n animation: ", " 2s\n ease-in-out infinite;\n "]); _templateObject4 = function _templateObject4() { return data; }; return data; } function _templateObject3() { var data = __chunk_1._taggedTemplateLiteral(["\n box-sizing: border-box;\n ", "\n ", "\n ", "\n ", "\n ", "\n\n ", "\n"]); _templateObject3 = function _templateObject3() { return data; }; return data; } function _templateObject2() { var data = __chunk_1._taggedTemplateLiteral(["\n 0% { background: ", "; }\n 50% { background: ", "; }\n 100% { background: ", "; }\n"]); _templateObject2 = function _templateObject2() { return data; }; return data; } function _templateObject() { var data = __chunk_1._taggedTemplateLiteral(["\n 0% { color: ", "; }\n 50% { color: ", "; }\n 100% { color: ", "; }\n"]); _templateObject = function _templateObject() { return data; }; return data; } var SKELETON_KEY = 'skeleton'; var SKELETON_THEME = { variants: { base: { colorStart: '#E7E7E7', colorEnd: '#D3D3D3' } } }; var colorVariant = system.variant({ key: "".concat(SKELETON_KEY, ".variants"), prop: 'variant', "default": 'base', variants: SKELETON_THEME.variants }); var colorKeyframe = function colorKeyframe(start, end) { return styled.keyframes(_templateObject(), start, end, start); }; var bgKeyframe = function bgKeyframe(start, end) { return styled.keyframes(_templateObject2(), start, end, start); }; var StyledSkeleton = styled__default('span')(_templateObject3(), system.borderRadius, system.space, system.layout, system.fontSize, system.lineHeight, function (_ref) { var textOnly = _ref.textOnly, colorStart = _ref.colorStart, colorEnd = _ref.colorEnd; return textOnly ? styled.css(_templateObject4(), colorStart, colorKeyframe(colorStart, colorEnd)) : styled.css(_templateObject5(), colorStart, bgKeyframe(colorStart, colorEnd)); }); var Skeleton = function Skeleton(_a) { var className = _a.className, children = _a.children, display = _a.display, textLength = _a.textLength, _a$textChar = _a.textChar, textChar = _a$textChar === void 0 ? '▆' : _a$textChar, _a$blockRatio = _a.blockRatio, blockRatio = _a$blockRatio === void 0 ? 1 / 2.15 : _a$blockRatio, _a$loading = _a.loading, loading = _a$loading === void 0 ? true : _a$loading, colorStart = _a.colorStart, colorEnd = _a.colorEnd, props = __chunk_2.__rest(_a, ["className", "children", "display", "textLength", "textChar", "blockRatio", "loading", "colorStart", "colorEnd"]); if (!loading) { return typeof children === 'undefined' ? null : children; } var theme = React.useContext(styled.ThemeContext); var _colorVariant = colorVariant(Object.assign(Object.assign({}, props), { theme: theme })), themeStart = _colorVariant.colorStart, themeEnd = _colorVariant.colorEnd; // Keyframes don't play nice with prop functions, so we're manually // calculating the raw color value from the theme before plugging it in var startValue = system.th.color(colorStart || themeStart)({ theme: theme }); var endValue = system.th.color(colorEnd || themeEnd)({ theme: theme }); var onlyChild = React.Children.count(children) === 1 && React.Children.toArray(children)[0]; // We're removing duplicate white space because they don't show up in html var childText = typeof onlyChild === 'string' && onlyChild.replace(/\s\s+/g, ' '); var length = textLength || childText && childText.length; var blockText = length && Array(Math.ceil(length * blockRatio) + 1).join(textChar); var textOnly = !!blockText; return React.createElement(StyledSkeleton, Object.assign({ className: classNames('anchor-skeleton', className), display: display || (textOnly ? 'inherit' : 'inline-block'), textOnly: textOnly, colorStart: startValue, colorEnd: endValue }, props), blockText || children); }; exports.Skeleton = Skeleton; exports.SKELETON_KEY = SKELETON_KEY; exports.SKELETON_THEME = SKELETON_THEME; //# sourceMappingURL=skeleton.js.map