icons.cjs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. 'use strict';
  2. const iconSet_getIcon = require('../icon-set/get-icon.cjs');
  3. const icon_defaults = require('../icon/defaults.cjs');
  4. const css_common = require('./common.cjs');
  5. const css_format = require('./format.cjs');
  6. require('../icon/merge.cjs');
  7. require('../icon/transformations.cjs');
  8. require('../icon-set/tree.cjs');
  9. require('../svg/html.cjs');
  10. require('../svg/size.cjs');
  11. require('../svg/url.cjs');
  12. require('../icon/square.cjs');
  13. require('../svg/build.cjs');
  14. require('../customisations/defaults.cjs');
  15. require('../svg/defs.cjs');
  16. const commonSelector = ".icon--{prefix}";
  17. const iconSelector = ".icon--{prefix}--{name}";
  18. const contentSelector = ".icon--{prefix}--{name}::after";
  19. const defaultSelectors = {
  20. commonSelector,
  21. iconSelector,
  22. overrideSelector: commonSelector + iconSelector
  23. };
  24. function getIconsCSSData(iconSet, names, options = {}) {
  25. const css = [];
  26. const errors = [];
  27. const palette = options.color ? true : void 0;
  28. let mode = options.mode || typeof palette === "boolean" && (palette ? "background" : "mask");
  29. if (!mode) {
  30. for (let i = 0; i < names.length; i++) {
  31. const name = names[i];
  32. const icon = iconSet_getIcon.getIconData(iconSet, name);
  33. if (icon) {
  34. const body = options.customise ? options.customise(icon.body, name) : icon.body;
  35. mode = body.includes("currentColor") ? "mask" : "background";
  36. break;
  37. }
  38. }
  39. if (!mode) {
  40. mode = "mask";
  41. errors.push(
  42. "/* cannot detect icon mode: not set in options and icon set is missing info, rendering as " + mode + " */"
  43. );
  44. }
  45. }
  46. let varName = options.varName;
  47. if (varName === void 0 && mode === "mask") {
  48. varName = "svg";
  49. }
  50. const newOptions = {
  51. ...options,
  52. // Override mode and varName
  53. mode,
  54. varName
  55. };
  56. const { commonSelector: commonSelector2, iconSelector: iconSelector2, overrideSelector } = newOptions.iconSelector ? newOptions : defaultSelectors;
  57. const iconSelectorWithPrefix = iconSelector2.replace(
  58. /{prefix}/g,
  59. iconSet.prefix
  60. );
  61. const commonRules = {
  62. ...options.rules,
  63. ...css_common.getCommonCSSRules(newOptions)
  64. };
  65. const hasCommonRules = commonSelector2 && commonSelector2 !== iconSelector2;
  66. const commonSelectors = /* @__PURE__ */ new Set();
  67. if (hasCommonRules) {
  68. css.push({
  69. selector: commonSelector2.replace(/{prefix}/g, iconSet.prefix),
  70. rules: commonRules
  71. });
  72. }
  73. for (let i = 0; i < names.length; i++) {
  74. const name = names[i];
  75. const iconData = iconSet_getIcon.getIconData(iconSet, name);
  76. if (!iconData) {
  77. errors.push("/* Could not find icon: " + name + " */");
  78. continue;
  79. }
  80. const body = options.customise ? options.customise(iconData.body, name) : iconData.body;
  81. const rules = css_common.generateItemCSSRules(
  82. {
  83. ...icon_defaults.defaultIconProps,
  84. ...iconData,
  85. body
  86. },
  87. newOptions
  88. );
  89. let requiresOverride = false;
  90. if (hasCommonRules && overrideSelector) {
  91. for (const key in rules) {
  92. if (key in commonRules) {
  93. requiresOverride = true;
  94. }
  95. }
  96. }
  97. const selector = (requiresOverride && overrideSelector ? overrideSelector.replace(/{prefix}/g, iconSet.prefix) : iconSelectorWithPrefix).replace(/{name}/g, name);
  98. css.push({
  99. selector,
  100. rules
  101. });
  102. if (!hasCommonRules) {
  103. commonSelectors.add(selector);
  104. }
  105. }
  106. const result = {
  107. css,
  108. errors
  109. };
  110. if (!hasCommonRules && commonSelectors.size) {
  111. const selector = Array.from(commonSelectors).join(
  112. newOptions.format === "compressed" ? "," : ", "
  113. );
  114. result.common = {
  115. selector,
  116. rules: commonRules
  117. };
  118. }
  119. return result;
  120. }
  121. function getIconsCSS(iconSet, names, options = {}) {
  122. const { css, errors, common } = getIconsCSSData(iconSet, names, options);
  123. if (common) {
  124. if (css.length === 1 && css[0].selector === common.selector) {
  125. css[0].rules = {
  126. // Common first, override later
  127. ...common.rules,
  128. ...css[0].rules
  129. };
  130. } else {
  131. css.unshift(common);
  132. }
  133. }
  134. return css_format.formatCSS(css, options.format) + (errors.length ? "\n" + errors.join("\n") + "\n" : "");
  135. }
  136. function getIconsContentCSS(iconSet, names, options) {
  137. const errors = [];
  138. const css = [];
  139. const iconSelectorWithPrefix = (options.iconSelector ?? contentSelector).replace(/{prefix}/g, iconSet.prefix);
  140. for (let i = 0; i < names.length; i++) {
  141. const name = names[i];
  142. const iconData = iconSet_getIcon.getIconData(iconSet, name);
  143. if (!iconData) {
  144. errors.push("/* Could not find icon: " + name + " */");
  145. continue;
  146. }
  147. const body = options.customise ? options.customise(iconData.body, name) : iconData.body;
  148. const content = css_common.generateItemContent(
  149. {
  150. ...icon_defaults.defaultIconProps,
  151. ...iconData,
  152. body
  153. },
  154. options
  155. );
  156. const selector = iconSelectorWithPrefix.replace(/{name}/g, name);
  157. css.push({
  158. selector,
  159. rules: {
  160. ...options.rules,
  161. content
  162. }
  163. });
  164. }
  165. return css_format.formatCSS(css, options.format) + (errors.length ? "\n" + errors.join("\n") + "\n" : "");
  166. }
  167. exports.getIconsCSS = getIconsCSS;
  168. exports.getIconsCSSData = getIconsCSSData;
  169. exports.getIconsContentCSS = getIconsContentCSS;