genStyleUtils.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. "use strict";
  2. var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
  3. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
  4. Object.defineProperty(exports, "__esModule", {
  5. value: true
  6. });
  7. exports.default = void 0;
  8. var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
  9. var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
  10. var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
  11. var _objectSpread3 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  12. var _react = _interopRequireDefault(require("react"));
  13. var _cssinjs = require("@ant-design/cssinjs");
  14. var _calc = _interopRequireDefault(require("./calc"));
  15. var _getCompVarPrefix = _interopRequireDefault(require("./getCompVarPrefix"));
  16. var _getComponentToken = _interopRequireDefault(require("./getComponentToken"));
  17. var _getDefaultComponentToken = _interopRequireDefault(require("./getDefaultComponentToken"));
  18. var _maxmin = _interopRequireDefault(require("./maxmin"));
  19. var _statistic = _interopRequireWildcard(require("./statistic"));
  20. var _useUniqueMemo = _interopRequireDefault(require("../_util/hooks/useUniqueMemo"));
  21. var _useCSP = _interopRequireDefault(require("../hooks/useCSP"));
  22. function genStyleUtils(config) {
  23. // Dependency inversion for preparing basic config.
  24. var _config$useCSP = config.useCSP,
  25. useCSP = _config$useCSP === void 0 ? _useCSP.default : _config$useCSP,
  26. useToken = config.useToken,
  27. usePrefix = config.usePrefix,
  28. getResetStyles = config.getResetStyles,
  29. getCommonStyle = config.getCommonStyle,
  30. getCompUnitless = config.getCompUnitless;
  31. function genStyleHooks(component, styleFn, getDefaultToken, options) {
  32. var componentName = Array.isArray(component) ? component[0] : component;
  33. function prefixToken(key) {
  34. return "".concat(String(componentName)).concat(key.slice(0, 1).toUpperCase()).concat(key.slice(1));
  35. }
  36. // Fill unitless
  37. var originUnitless = (options === null || options === void 0 ? void 0 : options.unitless) || {};
  38. var originCompUnitless = typeof getCompUnitless === 'function' ? getCompUnitless(component) : {};
  39. var compUnitless = (0, _objectSpread3.default)((0, _objectSpread3.default)({}, originCompUnitless), {}, (0, _defineProperty2.default)({}, prefixToken('zIndexPopup'), true));
  40. Object.keys(originUnitless).forEach(function (key) {
  41. compUnitless[prefixToken(key)] = originUnitless[key];
  42. });
  43. // Options
  44. var mergedOptions = (0, _objectSpread3.default)((0, _objectSpread3.default)({}, options), {}, {
  45. unitless: compUnitless,
  46. prefixToken: prefixToken
  47. });
  48. // Hooks
  49. var useStyle = genComponentStyleHook(component, styleFn, getDefaultToken, mergedOptions);
  50. var useCSSVar = genCSSVarRegister(componentName, getDefaultToken, mergedOptions);
  51. return function (prefixCls) {
  52. var rootCls = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : prefixCls;
  53. var _useStyle = useStyle(prefixCls, rootCls),
  54. _useStyle2 = (0, _slicedToArray2.default)(_useStyle, 2),
  55. hashId = _useStyle2[1];
  56. var _useCSSVar = useCSSVar(rootCls),
  57. _useCSSVar2 = (0, _slicedToArray2.default)(_useCSSVar, 2),
  58. wrapCSSVar = _useCSSVar2[0],
  59. cssVarCls = _useCSSVar2[1];
  60. return [wrapCSSVar, hashId, cssVarCls];
  61. };
  62. }
  63. function genCSSVarRegister(component, getDefaultToken, options) {
  64. var compUnitless = options.unitless,
  65. _options$injectStyle = options.injectStyle,
  66. injectStyle = _options$injectStyle === void 0 ? true : _options$injectStyle,
  67. prefixToken = options.prefixToken,
  68. ignore = options.ignore;
  69. var CSSVarRegister = function CSSVarRegister(_ref) {
  70. var rootCls = _ref.rootCls,
  71. _ref$cssVar = _ref.cssVar,
  72. cssVar = _ref$cssVar === void 0 ? {} : _ref$cssVar;
  73. var _useToken = useToken(),
  74. realToken = _useToken.realToken;
  75. (0, _cssinjs.useCSSVarRegister)({
  76. path: [component],
  77. prefix: cssVar.prefix,
  78. key: cssVar.key,
  79. unitless: compUnitless,
  80. ignore: ignore,
  81. token: realToken,
  82. scope: rootCls
  83. }, function () {
  84. var defaultToken = (0, _getDefaultComponentToken.default)(component, realToken, getDefaultToken);
  85. var componentToken = (0, _getComponentToken.default)(component, realToken, defaultToken, {
  86. deprecatedTokens: options === null || options === void 0 ? void 0 : options.deprecatedTokens
  87. });
  88. Object.keys(defaultToken).forEach(function (key) {
  89. componentToken[prefixToken(key)] = componentToken[key];
  90. delete componentToken[key];
  91. });
  92. return componentToken;
  93. });
  94. return null;
  95. };
  96. var useCSSVar = function useCSSVar(rootCls) {
  97. var _useToken2 = useToken(),
  98. cssVar = _useToken2.cssVar;
  99. return [function (node) {
  100. return injectStyle && cssVar ? /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(CSSVarRegister, {
  101. rootCls: rootCls,
  102. cssVar: cssVar,
  103. component: component
  104. }), node) : node;
  105. }, cssVar === null || cssVar === void 0 ? void 0 : cssVar.key];
  106. };
  107. return useCSSVar;
  108. }
  109. function genComponentStyleHook(componentName, styleFn, getDefaultToken) {
  110. var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
  111. var cells = Array.isArray(componentName) ? componentName : [componentName, componentName];
  112. var _cells = (0, _slicedToArray2.default)(cells, 1),
  113. component = _cells[0];
  114. var concatComponent = cells.join('-');
  115. var mergedLayer = config.layer || {
  116. name: 'antd'
  117. };
  118. // Return new style hook
  119. return function (prefixCls) {
  120. var rootCls = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : prefixCls;
  121. var _useToken3 = useToken(),
  122. theme = _useToken3.theme,
  123. realToken = _useToken3.realToken,
  124. hashId = _useToken3.hashId,
  125. token = _useToken3.token,
  126. cssVar = _useToken3.cssVar;
  127. var _usePrefix = usePrefix(),
  128. rootPrefixCls = _usePrefix.rootPrefixCls,
  129. iconPrefixCls = _usePrefix.iconPrefixCls;
  130. var csp = useCSP();
  131. var type = cssVar ? 'css' : 'js';
  132. // Use unique memo to share the result across all instances
  133. var calc = (0, _useUniqueMemo.default)(function () {
  134. var unitlessCssVar = new Set();
  135. if (cssVar) {
  136. Object.keys(options.unitless || {}).forEach(function (key) {
  137. // Some component proxy the AliasToken (e.g. Image) and some not (e.g. Modal)
  138. // We should both pass in `unitlessCssVar` to make sure the CSSVar can be unitless.
  139. unitlessCssVar.add((0, _cssinjs.token2CSSVar)(key, cssVar.prefix));
  140. unitlessCssVar.add((0, _cssinjs.token2CSSVar)(key, (0, _getCompVarPrefix.default)(component, cssVar.prefix)));
  141. });
  142. }
  143. return (0, _calc.default)(type, unitlessCssVar);
  144. }, [type, component, cssVar === null || cssVar === void 0 ? void 0 : cssVar.prefix]);
  145. var _genMaxMin = (0, _maxmin.default)(type),
  146. max = _genMaxMin.max,
  147. min = _genMaxMin.min;
  148. // Shared config
  149. var sharedConfig = {
  150. theme: theme,
  151. token: token,
  152. hashId: hashId,
  153. nonce: function nonce() {
  154. return csp.nonce;
  155. },
  156. clientOnly: options.clientOnly,
  157. layer: mergedLayer,
  158. // antd is always at top of styles
  159. order: options.order || -999
  160. };
  161. // This if statement is safe, as it will only be used if the generator has the function. It's not dynamic.
  162. if (typeof getResetStyles === 'function') {
  163. // Generate style for all need reset tags.
  164. (0, _cssinjs.useStyleRegister)((0, _objectSpread3.default)((0, _objectSpread3.default)({}, sharedConfig), {}, {
  165. clientOnly: false,
  166. path: ['Shared', rootPrefixCls]
  167. }), function () {
  168. return getResetStyles(token, {
  169. prefix: {
  170. rootPrefixCls: rootPrefixCls,
  171. iconPrefixCls: iconPrefixCls
  172. },
  173. csp: csp
  174. });
  175. });
  176. }
  177. var wrapSSR = (0, _cssinjs.useStyleRegister)((0, _objectSpread3.default)((0, _objectSpread3.default)({}, sharedConfig), {}, {
  178. path: [concatComponent, prefixCls, iconPrefixCls]
  179. }), function () {
  180. if (options.injectStyle === false) {
  181. return [];
  182. }
  183. var _statisticToken = (0, _statistic.default)(token),
  184. proxyToken = _statisticToken.token,
  185. flush = _statisticToken.flush;
  186. var defaultComponentToken = (0, _getDefaultComponentToken.default)(component, realToken, getDefaultToken);
  187. var componentCls = ".".concat(prefixCls);
  188. var componentToken = (0, _getComponentToken.default)(component, realToken, defaultComponentToken, {
  189. deprecatedTokens: options.deprecatedTokens
  190. });
  191. if (cssVar && defaultComponentToken && (0, _typeof2.default)(defaultComponentToken) === 'object') {
  192. Object.keys(defaultComponentToken).forEach(function (key) {
  193. defaultComponentToken[key] = "var(".concat((0, _cssinjs.token2CSSVar)(key, (0, _getCompVarPrefix.default)(component, cssVar.prefix)), ")");
  194. });
  195. }
  196. var mergedToken = (0, _statistic.merge)(proxyToken, {
  197. componentCls: componentCls,
  198. prefixCls: prefixCls,
  199. iconCls: ".".concat(iconPrefixCls),
  200. antCls: ".".concat(rootPrefixCls),
  201. calc: calc,
  202. // @ts-ignore
  203. max: max,
  204. // @ts-ignore
  205. min: min
  206. }, cssVar ? defaultComponentToken : componentToken);
  207. var styleInterpolation = styleFn(mergedToken, {
  208. hashId: hashId,
  209. prefixCls: prefixCls,
  210. rootPrefixCls: rootPrefixCls,
  211. iconPrefixCls: iconPrefixCls
  212. });
  213. flush(component, componentToken);
  214. var commonStyle = typeof getCommonStyle === 'function' ? getCommonStyle(mergedToken, prefixCls, rootCls, options.resetFont) : null;
  215. return [options.resetStyle === false ? null : commonStyle, styleInterpolation];
  216. });
  217. return [wrapSSR, hashId];
  218. };
  219. }
  220. function genSubStyleComponent(componentName, styleFn, getDefaultToken) {
  221. var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
  222. var useStyle = genComponentStyleHook(componentName, styleFn, getDefaultToken, (0, _objectSpread3.default)({
  223. resetStyle: false,
  224. // Sub Style should default after root one
  225. order: -998
  226. }, options));
  227. var StyledComponent = function StyledComponent(_ref2) {
  228. var prefixCls = _ref2.prefixCls,
  229. _ref2$rootCls = _ref2.rootCls,
  230. rootCls = _ref2$rootCls === void 0 ? prefixCls : _ref2$rootCls;
  231. useStyle(prefixCls, rootCls);
  232. return null;
  233. };
  234. if (process.env.NODE_ENV !== 'production') {
  235. StyledComponent.displayName = "SubStyle_".concat(String(Array.isArray(componentName) ? componentName.join('.') : componentName));
  236. }
  237. return StyledComponent;
  238. }
  239. return {
  240. genStyleHooks: genStyleHooks,
  241. genSubStyleComponent: genSubStyleComponent,
  242. genComponentStyleHook: genComponentStyleHook
  243. };
  244. }
  245. var _default = exports.default = genStyleUtils;