genStyleUtils.js 10 KB

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