版博士V2.0程序
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 

123 строки
3.6 KiB

  1. import { getIconData } from '../icon-set/get-icon.mjs';
  2. import { defaultIconProps } from '../icon/defaults.mjs';
  3. import { getCommonCSSRules, generateItemCSSRules } from './common.mjs';
  4. import { formatCSS } from './format.mjs';
  5. import '../icon/merge.mjs';
  6. import '../icon/transformations.mjs';
  7. import '../icon-set/tree.mjs';
  8. import '../svg/html.mjs';
  9. import '../svg/size.mjs';
  10. import '../svg/url.mjs';
  11. const commonSelector = ".icon--{prefix}";
  12. const iconSelector = ".icon--{prefix}--{name}";
  13. const defaultSelectors = {
  14. commonSelector,
  15. iconSelector,
  16. overrideSelector: commonSelector + iconSelector
  17. };
  18. function getIconsCSSData(iconSet, names, options = {}) {
  19. const css = [];
  20. const errors = [];
  21. const palette = options.color ? true : iconSet.info?.palette;
  22. let mode = options.mode || typeof palette === "boolean" && (palette ? "background" : "mask");
  23. if (!mode) {
  24. for (let i = 0; i < names.length; i++) {
  25. const icon = getIconData(iconSet, names[i]);
  26. if (icon) {
  27. mode = icon.body.includes("currentColor") ? "mask" : "background";
  28. break;
  29. }
  30. }
  31. if (!mode) {
  32. mode = "mask";
  33. errors.push(
  34. "/* cannot detect icon mode: not set in options and icon set is missing info, rendering as " + mode + " */"
  35. );
  36. }
  37. }
  38. let varName = options.varName;
  39. if (varName === void 0 && mode === "mask") {
  40. varName = "svg";
  41. }
  42. const newOptions = {
  43. ...options,
  44. // Override mode and varName
  45. mode,
  46. varName
  47. };
  48. const { commonSelector: commonSelector2, iconSelector: iconSelector2, overrideSelector } = newOptions.iconSelector ? newOptions : defaultSelectors;
  49. const iconSelectorWithPrefix = iconSelector2.replace(
  50. /{prefix}/g,
  51. iconSet.prefix
  52. );
  53. const commonRules = getCommonCSSRules(newOptions);
  54. const hasCommonRules = commonSelector2 && commonSelector2 !== iconSelector2;
  55. const commonSelectors = /* @__PURE__ */ new Set();
  56. if (hasCommonRules) {
  57. css.push({
  58. selector: commonSelector2.replace(/{prefix}/g, iconSet.prefix),
  59. rules: commonRules
  60. });
  61. }
  62. for (let i = 0; i < names.length; i++) {
  63. const name = names[i];
  64. const iconData = getIconData(iconSet, name);
  65. if (!iconData) {
  66. errors.push("/* Could not find icon: " + name + " */");
  67. continue;
  68. }
  69. const rules = generateItemCSSRules(
  70. { ...defaultIconProps, ...iconData },
  71. newOptions
  72. );
  73. let requiresOverride = false;
  74. if (hasCommonRules && overrideSelector) {
  75. for (const key in rules) {
  76. if (key in commonRules) {
  77. requiresOverride = true;
  78. }
  79. }
  80. }
  81. const selector = (requiresOverride && overrideSelector ? overrideSelector.replace(/{prefix}/g, iconSet.prefix) : iconSelectorWithPrefix).replace(/{name}/g, name);
  82. css.push({
  83. selector,
  84. rules
  85. });
  86. if (!hasCommonRules) {
  87. commonSelectors.add(selector);
  88. }
  89. }
  90. const result = {
  91. css,
  92. errors
  93. };
  94. if (!hasCommonRules && commonSelectors.size) {
  95. const selector = Array.from(commonSelectors).join(
  96. newOptions.format === "compressed" ? "," : ", "
  97. );
  98. result.common = {
  99. selector,
  100. rules: commonRules
  101. };
  102. }
  103. return result;
  104. }
  105. function getIconsCSS(iconSet, names, options = {}) {
  106. const { css, errors, common } = getIconsCSSData(iconSet, names, options);
  107. if (common) {
  108. if (css.length === 1 && css[0].selector === common.selector) {
  109. css[0].rules = {
  110. // Common first, override later
  111. ...common.rules,
  112. ...css[0].rules
  113. };
  114. } else {
  115. css.unshift(common);
  116. }
  117. }
  118. return formatCSS(css, options.format) + (errors.length ? "\n" + errors.join("\n") + "\n" : "");
  119. }
  120. export { getIconsCSS, getIconsCSSData };