@cyberalien/svg-utils 1.2.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,6 @@
1
1
  import { stringifyCSSAnimationFrames, stringifyCSSRules } from "../../css/stringify.js";
2
2
  import { minifyCSS } from "../../css/minify.js";
3
+ import { expandSVGCSSIconSetFallback } from "./minify/expand.js";
3
4
 
4
5
  function minifyRules(value) {
5
6
  return (value ? minifyCSS(typeof value === "string" ? value : stringifyCSSRules(value)) : void 0) || void 0;
@@ -15,12 +16,19 @@ function stringifyObject(data) {
15
16
  * Add icon to an icon set
16
17
  */
17
18
  function addIconToSVGCSSIconSet(iconSet, iconName, icon) {
18
- iconSet.icons[iconName] = {
19
+ const iconData = {
19
20
  content: icon.content,
20
- fallback: icon.fallback,
21
21
  states: icon.states,
22
22
  viewBox: icon.viewBox
23
23
  };
24
+ let fallback = icon.fallback;
25
+ if (fallback) {
26
+ const fallbackPrefix = iconSet.fallbackPrefix ?? "";
27
+ if (fallbackPrefix) if (fallback.startsWith(fallbackPrefix)) fallback = fallback.slice(fallbackPrefix.length);
28
+ else expandSVGCSSIconSetFallback(iconSet);
29
+ iconData.fallback = fallback;
30
+ }
31
+ iconSet.icons[iconName] = iconData;
24
32
  const { classes, animations, statefulClasses, keyframes } = icon;
25
33
  const classNames = new Set([...Object.keys(classes || {}), ...Object.keys(statefulClasses || {})]);
26
34
  for (const className of classNames) if (!iconSet.classes?.[className]) {
@@ -2,7 +2,10 @@
2
2
  * Create an empty icon set
3
3
  */
4
4
  function createEmptySVGCSSIconSet() {
5
- return { icons: Object.create(null) };
5
+ return {
6
+ version: 1,
7
+ icons: Object.create(null)
8
+ };
6
9
  }
7
10
 
8
11
  export { createEmptySVGCSSIconSet };
@@ -6,7 +6,7 @@ function getSVGCSSIconFromIconSet(iconSet, name) {
6
6
  const fullName = iconSet.aliases?.[name] || name;
7
7
  const data = iconSet.icons[fullName];
8
8
  if (!data) return;
9
- const { viewBoxes, css, fallbackPrefix = "", fallbackSuffix = "" } = iconSet;
9
+ const { viewBoxes, css, fallbackPrefix = "" } = iconSet;
10
10
  let viewBox = data.viewBox;
11
11
  if (typeof viewBox === "number") viewBox = viewBoxes?.[viewBox];
12
12
  if (!viewBox) return;
@@ -67,7 +67,7 @@ function getSVGCSSIconFromIconSet(iconSet, name) {
67
67
  content,
68
68
  viewBox,
69
69
  states,
70
- fallback: typeof data.fallback === "string" ? `${fallbackPrefix}${data.fallback}${fallbackSuffix}` : void 0
70
+ fallback: typeof data.fallback === "string" ? `${fallbackPrefix}${data.fallback}` : void 0
71
71
  };
72
72
  let _key;
73
73
  for (_key in classes) {
@@ -3,8 +3,12 @@ import { SVGCSSIconSet, SVGCSSIconSetClassData } from "../types.js";
3
3
  * Expand class content from icon set
4
4
  */
5
5
  declare function expandSVGCSSIconSetClass(css: Required<SVGCSSIconSet>['css'], classContent: SVGCSSIconSetClassData): void;
6
+ /**
7
+ * Expand fallback prefix
8
+ */
9
+ declare function expandSVGCSSIconSetFallback(iconSet: SVGCSSIconSet): void;
6
10
  /**
7
11
  * Unminify icon set
8
12
  */
9
13
  declare function expandSVGCSSIconSet(iconSet: SVGCSSIconSet): void;
10
- export { expandSVGCSSIconSet, expandSVGCSSIconSetClass };
14
+ export { expandSVGCSSIconSet, expandSVGCSSIconSetClass, expandSVGCSSIconSetFallback };
@@ -13,10 +13,25 @@ function expandSVGCSSIconSetClass(css, classContent) {
13
13
  }
14
14
  }
15
15
  /**
16
+ * Expand fallback prefix
17
+ */
18
+ function expandSVGCSSIconSetFallback(iconSet) {
19
+ const fallbackPrefix = iconSet.fallbackPrefix ?? "";
20
+ if (fallbackPrefix) {
21
+ delete iconSet.fallbackPrefix;
22
+ for (const iconName in iconSet.icons) {
23
+ const icon = iconSet.icons[iconName];
24
+ const fallback = icon.fallback;
25
+ if (fallback) icon.fallback = fallbackPrefix + fallback;
26
+ }
27
+ }
28
+ }
29
+ /**
16
30
  * Unminify icon set
17
31
  */
18
32
  function expandSVGCSSIconSet(iconSet) {
19
33
  const { viewBoxes, statesList, css } = iconSet;
34
+ expandSVGCSSIconSetFallback(iconSet);
20
35
  if (viewBoxes || statesList) {
21
36
  for (const iconName in iconSet.icons) {
22
37
  const icon = iconSet.icons[iconName];
@@ -32,4 +47,4 @@ function expandSVGCSSIconSet(iconSet) {
32
47
  }
33
48
  }
34
49
 
35
- export { expandSVGCSSIconSet, expandSVGCSSIconSetClass };
50
+ export { expandSVGCSSIconSet, expandSVGCSSIconSetClass, expandSVGCSSIconSetFallback };
@@ -42,6 +42,33 @@ function minifySVGCSSIconSet(iconSet) {
42
42
  map.set(value, index);
43
43
  });
44
44
  }
45
+ if (!iconSet.fallbackPrefix) {
46
+ let commonPrefix;
47
+ for (const iconName in iconSet.icons) {
48
+ const fallback = iconSet.icons[iconName].fallback;
49
+ if (fallback) {
50
+ const parts = fallback.split(":");
51
+ if (parts.length !== 2) {
52
+ commonPrefix = null;
53
+ break;
54
+ }
55
+ const prefix = parts[0];
56
+ if (commonPrefix === void 0) commonPrefix = prefix;
57
+ else if (commonPrefix !== prefix) {
58
+ commonPrefix = null;
59
+ break;
60
+ }
61
+ }
62
+ }
63
+ if (commonPrefix) {
64
+ iconSet.fallbackPrefix = `${commonPrefix}:`;
65
+ for (const iconName in iconSet.icons) {
66
+ const icon = iconSet.icons[iconName];
67
+ const fallback = icon.fallback;
68
+ if (fallback) icon.fallback = fallback.slice(commonPrefix.length + 1);
69
+ }
70
+ }
71
+ }
45
72
  for (const iconName in iconSet.icons) {
46
73
  const icon = iconSet.icons[iconName];
47
74
  const viewBoxValue = icon.viewBox;
@@ -35,8 +35,8 @@ interface SVGCSSIconSetSharedData {
35
35
  * Does not include metadata
36
36
  */
37
37
  interface SVGCSSIconSet extends SVGCSSIconSetSharedData {
38
+ version: 1;
38
39
  fallbackPrefix?: string;
39
- fallbackSuffix?: string;
40
40
  icons: Record<string, SVGCSSIconSetIcon>;
41
41
  aliases?: Record<string, string>;
42
42
  }
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "type": "module",
4
4
  "description": "Common functions for working with SVG used by various packages.",
5
5
  "author": "Vjacheslav Trushkin",
6
- "version": "1.2.0",
6
+ "version": "1.2.1",
7
7
  "license": "MIT",
8
8
  "bugs": "https://github.com/cyberalien/svg-utils/issues",
9
9
  "homepage": "https://cyberalien.dev/",