UNPKG

@chakra-ui/core

Version:

Responsive and accessible React UI components built with React and Emotion

131 lines (99 loc) 4.67 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); exports.__esModule = true; exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose")); var _taggedTemplateLiteralLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteralLoose")); var _react = require("react"); var _ThemeProvider = require("../ThemeProvider"); var _ColorModeProvider = require("../ColorModeProvider"); var _core = require("@emotion/core"); var _Box = _interopRequireDefault(require("../Box")); function _templateObject4() { var data = (0, _taggedTemplateLiteralLoose2["default"])(["\n animation: ", " ", "s;\n"]); _templateObject4 = function _templateObject4() { return data; }; return data; } function _templateObject3() { var data = (0, _taggedTemplateLiteralLoose2["default"])(["\nfrom { opacity: 0; }\nto { opacity: 1; }\n"]); _templateObject3 = function _templateObject3() { return data; }; return data; } function _templateObject2() { var data = (0, _taggedTemplateLiteralLoose2["default"])(["\n border-color: ", " !important;\n box-shadow: none !important;\n opacity: 0.7;\n // do not !important this for Firefox support\n background: ", ";\n\n // Prevent background color from extending to the border and overlappping\n background-clip: padding-box !important;\n cursor: default;\n\n // Transparent text will occupy space but be invisible to the user\n color: transparent !important;\n animation: ", "s linear infinite alternate\n ", ";\n pointer-events: none;\n user-select: none;\n\n // Make pseudo-elements (CSS icons) and children invisible\n &::before,\n &::after,\n * {\n visibility: hidden !important;\n }\n"]); _templateObject2 = function _templateObject2() { return data; }; return data; } function _templateObject() { var data = (0, _taggedTemplateLiteralLoose2["default"])(["\nfrom {\n border-color: ", ";\n background: ", ";\n}\n\nto {\n border-color: ", ";\n background: ", ";\n}\n"]); _templateObject = function _templateObject() { return data; }; return data; } var skeletonGlow = function skeletonGlow(colorStart, colorEnd) { return (0, _core.keyframes)(_templateObject(), colorStart, colorStart, colorEnd, colorEnd); }; var getStyle = function getStyle(_ref) { var colorStart = _ref.colorStart, colorEnd = _ref.colorEnd, speed = _ref.speed; return (0, _core.css)(_templateObject2(), colorStart, colorStart, speed, skeletonGlow(colorStart, colorEnd)); }; var fadeIn = (0, _core.keyframes)(_templateObject3()); var fadeInCss = function fadeInCss(duration) { return (0, _core.css)(_templateObject4(), fadeIn, duration); }; var Skeleton = function Skeleton(props) { var _useTheme = (0, _ThemeProvider.useTheme)(), colors = _useTheme.colors; var _useColorMode = (0, _ColorModeProvider.useColorMode)(), colorMode = _useColorMode.colorMode; var defaultStart = { light: colors.gray[100], dark: colors.gray[800] }; var defaultEnd = { light: colors.gray[400], dark: colors.gray[600] }; var _props$colorStart = props.colorStart, colorStart = _props$colorStart === void 0 ? defaultStart[colorMode] : _props$colorStart, _props$colorEnd = props.colorEnd, colorEnd = _props$colorEnd === void 0 ? defaultEnd[colorMode] : _props$colorEnd, _props$isLoaded = props.isLoaded, isLoaded = _props$isLoaded === void 0 ? false : _props$isLoaded, _props$fadeInDuration = props.fadeInDuration, fadeInDuration = _props$fadeInDuration === void 0 ? 0.4 : _props$fadeInDuration, _props$speed = props.speed, speed = _props$speed === void 0 ? 0.8 : _props$speed, rest = (0, _objectWithoutPropertiesLoose2["default"])(props, ["colorStart", "colorEnd", "isLoaded", "fadeInDuration", "speed"]); var fadeInStyle = (0, _react.useMemo)(function () { return fadeInCss(fadeInDuration); }, [fadeInDuration]); var skeletonStyle = (0, _react.useMemo)(function () { return getStyle({ colorStart: colorStart, colorEnd: colorEnd, speed: speed }); }, [colorStart, colorEnd, speed]); if (isLoaded) { return (0, _core.jsx)(_Box["default"], (0, _extends2["default"])({ css: fadeInStyle }, rest)); } return (0, _core.jsx)(_Box["default"], (0, _extends2["default"])({ css: skeletonStyle, borderRadius: "2px" }, rest)); }; var _default = Skeleton; exports["default"] = _default;