react-native-nano-icons 0.1.2 → 0.1.4

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.
Files changed (91) hide show
  1. package/README.md +20 -164
  2. package/android/build.gradle +28 -0
  3. package/android/src/main/java/com/nanoicons/NanoIconView.kt +78 -0
  4. package/android/src/main/java/com/nanoicons/NanoIconViewManager.kt +84 -0
  5. package/android/src/main/java/com/nanoicons/NanoIconsPackage.kt +22 -0
  6. package/ios/NanoIconView.h +4 -0
  7. package/ios/NanoIconView.mm +286 -0
  8. package/lib/commonjs/cli/build.js +1 -1
  9. package/lib/commonjs/cli/config.d.ts +2 -2
  10. package/lib/commonjs/cli/config.js +7 -6
  11. package/lib/commonjs/scripts/cli.js +15 -5
  12. package/lib/commonjs/src/core/font/compile.d.ts +13 -2
  13. package/lib/commonjs/src/core/font/compile.js +49 -46
  14. package/lib/commonjs/src/core/pipeline/managers.js +19 -3
  15. package/lib/commonjs/src/core/pipeline/run.js +121 -32
  16. package/lib/commonjs/src/core/svg/layers.d.ts +16 -0
  17. package/lib/commonjs/src/core/svg/layers.js +27 -0
  18. package/lib/commonjs/src/core/svg/svg_dom.d.ts +29 -1
  19. package/lib/commonjs/src/core/svg/svg_dom.js +78 -2
  20. package/lib/commonjs/src/core/svg/svg_pathops.d.ts +11 -0
  21. package/lib/commonjs/src/core/svg/svg_pathops.js +209 -19
  22. package/lib/commonjs/src/core/types.d.ts +30 -15
  23. package/lib/module/core/font/compile.js +52 -41
  24. package/lib/module/core/font/compile.js.map +1 -1
  25. package/lib/module/core/pipeline/managers.js +17 -3
  26. package/lib/module/core/pipeline/managers.js.map +1 -1
  27. package/lib/module/core/pipeline/run.js +131 -44
  28. package/lib/module/core/pipeline/run.js.map +1 -1
  29. package/lib/module/core/shims/picosvg-0.22.3-py3-none-any.whl +0 -0
  30. package/lib/module/core/svg/layers.js +34 -0
  31. package/lib/module/core/svg/layers.js.map +1 -1
  32. package/lib/module/core/svg/svg_dom.js +91 -4
  33. package/lib/module/core/svg/svg_dom.js.map +1 -1
  34. package/lib/module/core/svg/svg_pathops.js +203 -19
  35. package/lib/module/core/svg/svg_pathops.js.map +1 -1
  36. package/lib/module/createNanoIconsSet.js +3 -79
  37. package/lib/module/createNanoIconsSet.js.map +1 -1
  38. package/lib/module/createNanoIconsSet.native.js +108 -0
  39. package/lib/module/createNanoIconsSet.native.js.map +1 -0
  40. package/lib/module/createNanoIconsSet.shared.js +91 -0
  41. package/lib/module/createNanoIconsSet.shared.js.map +1 -0
  42. package/lib/module/index.js +1 -2
  43. package/lib/module/index.js.map +1 -1
  44. package/lib/module/specs/NanoIconViewNativeComponent.ts +15 -0
  45. package/lib/module/types.js +4 -0
  46. package/lib/module/types.js.map +1 -0
  47. package/lib/module/utils/shallowEqualColor.js +15 -0
  48. package/lib/module/utils/shallowEqualColor.js.map +1 -0
  49. package/lib/typescript/src/core/font/compile.d.ts +13 -2
  50. package/lib/typescript/src/core/font/compile.d.ts.map +1 -1
  51. package/lib/typescript/src/core/pipeline/managers.d.ts.map +1 -1
  52. package/lib/typescript/src/core/pipeline/run.d.ts.map +1 -1
  53. package/lib/typescript/src/core/svg/layers.d.ts +16 -0
  54. package/lib/typescript/src/core/svg/layers.d.ts.map +1 -1
  55. package/lib/typescript/src/core/svg/svg_dom.d.ts +29 -1
  56. package/lib/typescript/src/core/svg/svg_dom.d.ts.map +1 -1
  57. package/lib/typescript/src/core/svg/svg_pathops.d.ts +11 -0
  58. package/lib/typescript/src/core/svg/svg_pathops.d.ts.map +1 -1
  59. package/lib/typescript/src/core/types.d.ts +30 -15
  60. package/lib/typescript/src/core/types.d.ts.map +1 -1
  61. package/lib/typescript/src/createNanoIconsSet.d.ts +5 -18
  62. package/lib/typescript/src/createNanoIconsSet.d.ts.map +1 -1
  63. package/lib/typescript/src/createNanoIconsSet.native.d.ts +7 -0
  64. package/lib/typescript/src/createNanoIconsSet.native.d.ts.map +1 -0
  65. package/lib/typescript/src/createNanoIconsSet.shared.d.ts +11 -0
  66. package/lib/typescript/src/createNanoIconsSet.shared.d.ts.map +1 -0
  67. package/lib/typescript/src/index.d.ts.map +1 -1
  68. package/lib/typescript/src/specs/NanoIconViewNativeComponent.d.ts +14 -0
  69. package/lib/typescript/src/specs/NanoIconViewNativeComponent.d.ts.map +1 -0
  70. package/lib/typescript/src/types.d.ts +19 -0
  71. package/lib/typescript/src/types.d.ts.map +1 -0
  72. package/lib/typescript/src/utils/shallowEqualColor.d.ts +4 -0
  73. package/lib/typescript/src/utils/shallowEqualColor.d.ts.map +1 -0
  74. package/package.json +22 -5
  75. package/react-native-nano-icons.podspec +18 -0
  76. package/scripts/cli.ts +14 -5
  77. package/src/core/font/compile.ts +65 -61
  78. package/src/core/pipeline/managers.ts +26 -3
  79. package/src/core/pipeline/run.ts +156 -38
  80. package/src/core/shims/picosvg-0.22.3-py3-none-any.whl +0 -0
  81. package/src/core/svg/layers.ts +44 -0
  82. package/src/core/svg/svg_dom.ts +96 -4
  83. package/src/core/svg/svg_pathops.ts +245 -27
  84. package/src/core/types.ts +21 -10
  85. package/src/createNanoIconsSet.native.tsx +140 -0
  86. package/src/createNanoIconsSet.shared.tsx +121 -0
  87. package/src/createNanoIconsSet.tsx +7 -126
  88. package/src/index.ts +1 -2
  89. package/src/specs/NanoIconViewNativeComponent.ts +15 -0
  90. package/src/types.ts +27 -0
  91. package/src/utils/shallowEqualColor.ts +17 -0
@@ -1,13 +1,75 @@
1
1
  "use strict";
2
2
 
3
- import fs from 'node:fs';
4
3
  import fsp from 'node:fs/promises';
5
4
  import path from 'node:path';
6
- import { compileTtfFromGlyphSVGs } from '../font/compile.js';
7
- import { picoFromFile } from './managers.js';
8
- import { ensureDir, ensureEmptyDir } from './config.js';
9
- import { parseFlattenedSvg, preprocessSvg, shouldSkipPath, validateSvg } from '../svg/svg_dom.js';
10
- import { computePlacement, writeLayerSvg } from '../svg/layers.js';
5
+ import { compileTtfFromGlyphs, parseCompileTtfFromGlyphsError } from '../font/compile.js';
6
+ import { picoFromFile, PathKitManager } from './managers.js';
7
+ import { ensureDir } from './config.js';
8
+ import { parseFlattenedSvg, preprocessSvg, shouldSkipPath, validateSvg, extractOriginalEvenoddDs, restoreOriginalEvenoddDs } from '../svg/svg_dom.js';
9
+ import { computePlacement, transformPathForFont } from '../svg/layers.js';
10
+ import { convertEvenoddToWinding } from '../svg/svg_pathops.js';
11
+
12
+ // ---------------------------------------------------------------------------
13
+ // Same-color path merging
14
+ // ---------------------------------------------------------------------------
15
+
16
+ /**
17
+ * Concatenate multiple SVG path `d` strings into a single compound path.
18
+ * This preserves the exact geometry of each path (no boolean operations)
19
+ * while combining them into one glyph. Under nonzero winding, this renders
20
+ * identically to drawing each path separately with the same color.
21
+ */
22
+ function concatPathDs(ds) {
23
+ if (ds.length === 0) return null;
24
+ if (ds.length === 1) return ds[0];
25
+ return ds.join(' ');
26
+ }
27
+
28
+ /**
29
+ * Merge consecutive same-color paths into single compound paths via boolean UNION.
30
+ * Preserves z-order: only merges runs of adjacent paths with identical fill color.
31
+ */
32
+ function mergeSameColorPaths(paths, logger) {
33
+ if (paths.length <= 1) return paths;
34
+ const result = [];
35
+ let i = 0;
36
+ while (i < paths.length) {
37
+ const fill = paths[i].fill;
38
+
39
+ // Find consecutive run of same fill that are all mergeable.
40
+ // Paths converted from evenodd have compound hole structure and must not
41
+ // be merged — their CW hole contours would cancel CCW contours from
42
+ // adjacent paths, producing incorrect fill.
43
+ let j = i + 1;
44
+ if (!paths[i].noMerge) {
45
+ while (j < paths.length && paths[j].fill === fill && !paths[j].noMerge) {
46
+ j++;
47
+ }
48
+ }
49
+ if (j - i === 1) {
50
+ result.push(paths[i]);
51
+ } else {
52
+ const group = paths.slice(i, j);
53
+ const merged = concatPathDs(group.map(p => p.d));
54
+ if (merged) {
55
+ logger?.info(` ⊕ Merged ${group.length} same-color paths (fill=${fill})`);
56
+ result.push({
57
+ d: merged,
58
+ fill
59
+ });
60
+ } else {
61
+ result.push(...group);
62
+ }
63
+ }
64
+ i = j;
65
+ }
66
+ return result;
67
+ }
68
+
69
+ // ---------------------------------------------------------------------------
70
+ // Pipeline
71
+ // ---------------------------------------------------------------------------
72
+
11
73
  /**
12
74
  * Run the font pipeline with given config and paths.
13
75
  * Uses the singleton Pyodide/PathKit instance (initialized on first call).
@@ -16,19 +78,21 @@ export async function runPipeline(config, paths, options) {
16
78
  const startTime = Date.now();
17
79
  const logger = options?.logger;
18
80
  logger?.update(`Building "${config.fontFamily}"…`);
19
- ensureEmptyDir(paths.tempDir);
20
81
  ensureDir(paths.outputDir);
21
82
  const files = (await fsp.readdir(paths.inputDir)).filter(f => f.toLowerCase().endsWith('.svg'));
22
83
  const glyphMap = {
23
- meta: {
24
- fontFamily: config.fontFamily,
25
- upm: config.upm,
26
- safeZone: config.safeZone,
27
- startUnicode: config.startUnicode
84
+ m: {
85
+ f: config.fontFamily,
86
+ u: config.upm,
87
+ z: config.safeZone,
88
+ s: config.startUnicode
28
89
  },
29
- icons: {}
90
+ i: {}
30
91
  };
31
92
  let currentUnicode = config.startUnicode;
93
+ const codepointToIcon = new Map();
94
+ const allGlyphs = [];
95
+ const PathKit = await PathKitManager.getInstance();
32
96
  for (const file of files) {
33
97
  const iconName = path.parse(file).name;
34
98
  const filePath = path.join(paths.inputDir, file);
@@ -40,8 +104,37 @@ export async function runPipeline(config, paths, options) {
40
104
  continue;
41
105
  }
42
106
  const preprocessed = preprocessSvg(rawContent);
107
+
108
+ // Preserve original evenodd `d` strings BEFORE picosvg processes them.
109
+ // Picosvg's simplify (via our PathKit shim) can drop contours from
110
+ // multi-subpath evenodd paths — we restore the originals after.
111
+ const originalEvenoddDs = extractOriginalEvenoddDs(preprocessed);
43
112
  const flattenedSvg = await picoFromFile(filePath, preprocessed);
44
- const parsed = parseFlattenedSvg(flattenedSvg);
113
+ const parsed = parseFlattenedSvg(flattenedSvg, {
114
+ onSanitize: original => {
115
+ logger?.info(` ⚠ Sanitized path in "${file}": path was missing initial moveto (prepended M from endpoint)`);
116
+ logger?.info(` Original: ${original.slice(0, 80)}…`);
117
+ }
118
+ });
119
+
120
+ // Restore original evenodd path data (undamaged by picosvg's simplify),
121
+ // then convert to nonzero winding with our containment-based algorithm.
122
+ // Mark as noMerge — compound paths with holes must stay separate so their
123
+ // CW hole contours don't cancel adjacent paths' CCW contours.
124
+ if (originalEvenoddDs.length > 0) {
125
+ restoreOriginalEvenoddDs(parsed.paths, originalEvenoddDs);
126
+ }
127
+ for (const p of parsed.paths) {
128
+ if (p.fillRule === 'evenodd') {
129
+ logger?.info(` ↻ Converting evenodd path to nonzero winding in "${file}"`);
130
+ p.d = convertEvenoddToWinding(PathKit, p.d);
131
+ delete p.fillRule;
132
+ p.noMerge = true;
133
+ }
134
+ }
135
+
136
+ // Merge consecutive same-color paths into single compound glyphs
137
+ const mergedPaths = mergeSameColorPaths(parsed.paths, logger);
45
138
  const {
46
139
  vx,
47
140
  vy,
@@ -54,56 +147,50 @@ export async function runPipeline(config, paths, options) {
54
147
  safeZone: config.safeZone,
55
148
  viewBox: parsed.viewBox
56
149
  });
57
- const entry = {
58
- adv,
59
- layers: []
60
- };
61
- for (const p of parsed.paths) {
150
+ const layers = [];
151
+ for (const p of mergedPaths) {
62
152
  if (shouldSkipPath(p.d, p.fill)) continue;
63
153
  const cp = currentUnicode++;
64
- await writeLayerSvg({
65
- tempDir: paths.tempDir,
66
- upm: config.upm,
67
- adv,
154
+ codepointToIcon.set(cp, iconName);
155
+ const fontD = transformPathForFont(PathKit, p.d, {
68
156
  vx,
69
157
  vy,
70
158
  scale,
71
159
  xOff,
72
160
  yOff,
73
- d: p.d,
74
- codepoint: cp
161
+ upm: config.upm
75
162
  });
76
- entry.layers.push({
163
+ allGlyphs.push({
77
164
  codepoint: cp,
78
- color: p.fill || 'black'
165
+ advanceWidth: adv,
166
+ d: fontD
79
167
  });
168
+ layers.push([cp, p.fill || 'black']);
80
169
  }
81
- if (entry.layers.length > 0) {
82
- glyphMap.icons[iconName] = entry;
170
+ if (layers.length > 0) {
171
+ glyphMap.i[iconName] = [adv, layers];
83
172
  }
84
173
  }
85
174
  const glyphmapPath = path.join(paths.outputDir, `${config.fontFamily}.glyphmap.json`);
86
175
  if (options?.inputHash) {
87
- glyphMap.meta.hash = options.inputHash;
176
+ glyphMap.m.h = options.inputHash;
88
177
  }
89
- await fsp.writeFile(glyphmapPath, JSON.stringify(glyphMap, null, 2), 'utf8');
178
+ await fsp.writeFile(glyphmapPath, JSON.stringify(glyphMap), 'utf8');
90
179
  logger?.info(`Compiling TTF…`);
91
180
  const ttfPath = path.join(paths.outputDir, `${config.fontFamily}.ttf`);
92
- await compileTtfFromGlyphSVGs({
93
- glyphDir: paths.tempDir,
94
- outTtfPath: ttfPath,
95
- fontName: config.fontFamily,
96
- upm: config.upm,
97
- ascent: config.upm,
98
- descent: 0
99
- });
100
- if (fs.existsSync(paths.tempDir)) {
101
- fs.rmSync(paths.tempDir, {
102
- recursive: true,
103
- force: true
181
+ try {
182
+ await compileTtfFromGlyphs({
183
+ glyphs: allGlyphs,
184
+ outTtfPath: ttfPath,
185
+ fontName: config.fontFamily,
186
+ upm: config.upm,
187
+ ascent: config.upm,
188
+ descent: 0
104
189
  });
190
+ } catch (err) {
191
+ parseCompileTtfFromGlyphsError(err, codepointToIcon);
105
192
  }
106
- const iconCount = Object.keys(glyphMap.icons).length;
193
+ const iconCount = Object.keys(glyphMap.i).length;
107
194
  const elapsed = Date.now() - startTime;
108
195
  logger?.succeed(`Built ${config.fontFamily}.ttf [${iconCount} icon${iconCount === 1 ? '' : 's'} in ${elapsed}ms]`);
109
196
  return {
@@ -1 +1 @@
1
- {"version":3,"names":["fs","fsp","path","compileTtfFromGlyphSVGs","picoFromFile","ensureDir","ensureEmptyDir","parseFlattenedSvg","preprocessSvg","shouldSkipPath","validateSvg","computePlacement","writeLayerSvg","runPipeline","config","paths","options","startTime","Date","now","logger","update","fontFamily","tempDir","outputDir","files","readdir","inputDir","filter","f","toLowerCase","endsWith","glyphMap","meta","upm","safeZone","startUnicode","icons","currentUnicode","file","iconName","parse","name","filePath","join","info","rawContent","readFile","validation","valid","warn","reason","preprocessed","flattenedSvg","parsed","vx","vy","scale","xOff","yOff","adv","viewBox","entry","layers","p","d","fill","cp","codepoint","push","color","length","glyphmapPath","inputHash","hash","writeFile","JSON","stringify","ttfPath","glyphDir","outTtfPath","fontName","ascent","descent","existsSync","rmSync","recursive","force","iconCount","Object","keys","elapsed","succeed"],"sourceRoot":"../../../../src","sources":["core/pipeline/run.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["fsp","path","compileTtfFromGlyphs","parseCompileTtfFromGlyphsError","picoFromFile","PathKitManager","ensureDir","parseFlattenedSvg","preprocessSvg","shouldSkipPath","validateSvg","extractOriginalEvenoddDs","restoreOriginalEvenoddDs","computePlacement","transformPathForFont","convertEvenoddToWinding","concatPathDs","ds","length","join","mergeSameColorPaths","paths","logger","result","i","fill","j","noMerge","push","group","slice","merged","map","p","d","info","runPipeline","config","options","startTime","Date","now","update","fontFamily","outputDir","files","readdir","inputDir","filter","f","toLowerCase","endsWith","glyphMap","m","u","upm","z","safeZone","s","startUnicode","currentUnicode","codepointToIcon","Map","allGlyphs","PathKit","getInstance","file","iconName","parse","name","filePath","rawContent","readFile","validation","valid","warn","reason","preprocessed","originalEvenoddDs","flattenedSvg","parsed","onSanitize","original","fillRule","mergedPaths","vx","vy","scale","xOff","yOff","adv","viewBox","layers","cp","set","fontD","codepoint","advanceWidth","glyphmapPath","inputHash","h","writeFile","JSON","stringify","ttfPath","glyphs","outTtfPath","fontName","ascent","descent","err","iconCount","Object","keys","elapsed","succeed"],"sourceRoot":"../../../../src","sources":["core/pipeline/run.ts"],"mappings":"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","ignoreList":[]}
@@ -48,4 +48,38 @@ export async function writeLayerSvg(opts) {
48
48
  </svg>`.trim();
49
49
  await fsp.writeFile(path.join(opts.tempDir, `u${hex}.svg`), layerSvg, 'utf8');
50
50
  }
51
+
52
+ /**
53
+ * Transform an SVG path `d` string from source SVG coordinates into font
54
+ * glyph coordinates (Y-up, with placement scaling and centering applied).
55
+ *
56
+ * Combines placement transform (translate + scale + translate) with the
57
+ * SVG→font Y-axis flip into a single affine transform applied via PathKit.
58
+ */
59
+ export function transformPathForFont(PathKit, d, opts) {
60
+ const {
61
+ vx,
62
+ vy,
63
+ scale,
64
+ xOff,
65
+ yOff,
66
+ upm
67
+ } = opts;
68
+ const p = PathKit.FromSVGString(d);
69
+ if (!p) return d;
70
+
71
+ // Combined affine: placement + Y-flip for font coordinates.
72
+ // x' = scale * (x - vx) + xOff
73
+ // y' = upm - (scale * (y - vy) + yOff)
74
+ //
75
+ // SkMatrix row-major: [scaleX, skewX, transX, skewY, scaleY, transY, 0,0,1]
76
+ const scaleX = scale;
77
+ const scaleY = -scale;
78
+ const transX = xOff - vx * scale;
79
+ const transY = upm - yOff + vy * scale;
80
+ p.transform(scaleX, 0, transX, 0, scaleY, transY, 0, 0, 1);
81
+ const result = p.toSVGString();
82
+ p.delete?.();
83
+ return result;
84
+ }
51
85
  //# sourceMappingURL=layers.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["fsp","path","roundInt","n","Math","round","computePlacement","opts","vx","vy","vw","vh","viewBox","safeVh","scale","safeZone","totalPadding","upm","scaledW","scaledH","adv","max","xOff","yOff","writeLayerSvg","hex","codepoint","toString","padStart","layerSvg","d","trim","writeFile","join","tempDir"],"sourceRoot":"../../../../src","sources":["core/svg/layers.ts"],"mappings":";;AAAA,OAAOA,GAAG,MAAM,kBAAkB;AAClC,OAAOC,IAAI,MAAM,WAAW;AAE5B,SAASC,QAAQA,CAACC,CAAS,EAAU;EACnC,OAAOC,IAAI,CAACC,KAAK,CAACF,CAAC,CAAC;AACtB;AAEA,OAAO,SAASG,gBAAgBA,CAACC,IAIhC,EAAE;EACD,MAAM,CAACC,EAAE,EAAEC,EAAE,EAAEC,EAAE,EAAEC,EAAE,CAAC,GAAGJ,IAAI,CAACK,OAAO;;EAErC;EACA,MAAMC,MAAM,GAAGF,EAAE,KAAK,CAAC,GAAG,CAAC,GAAGA,EAAE;;EAEhC;EACA,MAAMG,KAAK,GAAGP,IAAI,CAACQ,QAAQ,GAAGF,MAAM;EAEpC,MAAMG,YAAY,GAAG,CAACT,IAAI,CAACU,GAAG,GAAGV,IAAI,CAACQ,QAAQ,IAAI,CAAC;;EAEnD;EACA,MAAMG,OAAO,GAAGR,EAAE,GAAGI,KAAK;EAC1B,MAAMK,OAAO,GAAGR,EAAE,GAAGG,KAAK,CAAC,CAAC;;EAE5B;EACA;EACA,MAAMM,GAAG,GAAGhB,IAAI,CAACiB,GAAG,CAAC,CAAC,EAAEnB,QAAQ,CAACgB,OAAO,GAAGF,YAAY,GAAG,CAAC,CAAC,CAAC;;EAE7D;EACA;EACA,MAAMM,IAAI,GAAG,CAACF,GAAG,GAAGF,OAAO,IAAI,CAAC;EAChC,MAAMK,IAAI,GAAG,CAAChB,IAAI,CAACU,GAAG,GAAGE,OAAO,IAAI,CAAC,CAAC,CAAC;;EAEvC,OAAO;IAAEX,EAAE;IAAEC,EAAE;IAAEK,KAAK;IAAEQ,IAAI;IAAEC,IAAI;IAAEH;EAAI,CAAC;AAC3C;AAEA,OAAO,eAAeI,aAAaA,CAACjB,IAWnC,EAAiB;EAChB,MAAMkB,GAAG,GAAGlB,IAAI,CAACmB,SAAS,CAACC,QAAQ,CAAC,EAAE,CAAC,CAACC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;EAExD,MAAMC,QAAQ,GAAG;AACnB,wBAAwBtB,IAAI,CAACa,GAAG,IAC5Bb,IAAI,CAACU,GAAG;AACZ,qBACqBV,IAAI,CAACa,GAAG,aAAab,IAAI,CAACU,GAAG;AAClD,gCAAgCV,IAAI,CAACe,IAAI,KAAKf,IAAI,CAACgB,IAAI,WACnDhB,IAAI,CAACO,KAAK,eACG,CAACP,IAAI,CAACC,EAAE,KAAK,CAACD,IAAI,CAACE,EAAE;AACtC,mBAAmBF,IAAI,CAACuB,CAAC;AACzB;AACA,WAAW,CAACC,IAAI,CAAC,CAAC;EAEhB,MAAM/B,GAAG,CAACgC,SAAS,CAAC/B,IAAI,CAACgC,IAAI,CAAC1B,IAAI,CAAC2B,OAAO,EAAE,IAAIT,GAAG,MAAM,CAAC,EAAEI,QAAQ,EAAE,MAAM,CAAC;AAC/E","ignoreList":[]}
1
+ {"version":3,"names":["fsp","path","roundInt","n","Math","round","computePlacement","opts","vx","vy","vw","vh","viewBox","safeVh","scale","safeZone","totalPadding","upm","scaledW","scaledH","adv","max","xOff","yOff","writeLayerSvg","hex","codepoint","toString","padStart","layerSvg","d","trim","writeFile","join","tempDir","transformPathForFont","PathKit","p","FromSVGString","scaleX","scaleY","transX","transY","transform","result","toSVGString","delete"],"sourceRoot":"../../../../src","sources":["core/svg/layers.ts"],"mappings":"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","ignoreList":[]}
@@ -20,33 +20,80 @@ export function calculateOpColor(fill, opacity, el) {
20
20
  const finalAlpha = +(a * opacity).toFixed(4);
21
21
  return `rgba(${r},${g},${b},${finalAlpha})`;
22
22
  }
23
+
24
+ /**
25
+ * If a flattened path lost its initial moveto (e.g. picosvg dropped an empty
26
+ * `Mx y z` subpath), prepend `M` using the path's last coordinate pair.
27
+ * For closed icon shapes the endpoint equals the start point.
28
+ */
29
+ export function sanitizePathData(d) {
30
+ const trimmed = d.trim();
31
+ if (!trimmed || /^[Mm]/.test(trimmed)) {
32
+ return {
33
+ d: trimmed,
34
+ sanitized: false
35
+ };
36
+ }
37
+
38
+ // Strip trailing close commands, then grab the last two numbers as x,y
39
+ const withoutClose = trimmed.replace(/[Zz]\s*$/, '');
40
+ const nums = withoutClose.match(/-?\d+(?:\.\d+)?/g);
41
+ if (!nums || nums.length < 2) {
42
+ return {
43
+ d: trimmed,
44
+ sanitized: false
45
+ };
46
+ }
47
+ const x = nums[nums.length - 2];
48
+ const y = nums[nums.length - 1];
49
+ return {
50
+ d: `M${x},${y} ${trimmed}`,
51
+ sanitized: true
52
+ };
53
+ }
23
54
  export const parsePath = p => {
24
55
  const d = p.getAttribute('d') ?? '';
25
56
  const op = p.getAttribute('opacity');
26
57
  const fillOp = p.getAttribute('fill-opacity');
27
58
  const fill = p.getAttribute('fill');
59
+ // picosvg may drop fill-rule but preserve clip-rule; treat either as evenodd
60
+ const fillRule = p.getAttribute('fill-rule') === 'evenodd' || p.getAttribute('clip-rule') === 'evenodd' ? 'evenodd' : undefined;
28
61
  if (op !== null || fillOp !== null) {
29
62
  const opVal = op !== null ? parseFloat(op) : 1;
30
63
  const fillOpVal = fillOp !== null ? parseFloat(fillOp) : 1;
31
64
  const combinedOpacity = opVal * fillOpVal;
32
65
  return {
33
66
  d,
34
- fill: calculateOpColor(fill, combinedOpacity, p)
67
+ fill: calculateOpColor(fill, combinedOpacity, p),
68
+ fillRule
35
69
  };
36
70
  }
37
71
  return {
38
72
  d,
39
- fill
73
+ fill,
74
+ fillRule
40
75
  };
41
76
  };
42
- export function parseFlattenedSvg(flattenedSvg) {
77
+ export function parseFlattenedSvg(flattenedSvg, options) {
43
78
  const dom = new JSDOM(flattenedSvg);
44
79
  const doc = dom.window.document;
45
80
  const svgEl = doc.querySelector('svg');
46
81
  const viewBoxRaw = svgEl?.getAttribute('viewBox')?.split(/\s+/).map(Number) ?? [0, 0, 100, 100];
47
82
  const viewBox = viewBoxRaw.length === 4 && viewBoxRaw.every(n => Number.isFinite(n)) ? [viewBoxRaw[0], viewBoxRaw[1], viewBoxRaw[2], viewBoxRaw[3]] : [0, 0, 100, 100];
48
83
  const pathEls = Array.from(doc.querySelectorAll('path'));
49
- const paths = pathEls.map(parsePath).filter(p => p.d.trim() !== '');
84
+ const paths = pathEls.map(parsePath).filter(p => p.d.trim() !== '').map(p => {
85
+ const {
86
+ d,
87
+ sanitized
88
+ } = sanitizePathData(p.d);
89
+ if (sanitized) {
90
+ options?.onSanitize?.(p.d);
91
+ }
92
+ return {
93
+ ...p,
94
+ d
95
+ };
96
+ });
50
97
  return {
51
98
  viewBox,
52
99
  paths
@@ -75,6 +122,46 @@ export function validateSvg(content) {
75
122
  };
76
123
  }
77
124
 
125
+ /**
126
+ * Extract the original `d` strings of evenodd paths from the raw SVG
127
+ * BEFORE picosvg processes it. Picosvg's simplify (via our PathKit shim)
128
+ * can drop contours from multi-subpath evenodd paths, so we preserve
129
+ * the originals and apply our own winding conversion later.
130
+ *
131
+ * Returns one `d` string per evenodd path, in document order.
132
+ */
133
+ export function extractOriginalEvenoddDs(svgContent) {
134
+ if (!/<[^>]*fill-rule\s*=\s*["']evenodd/i.test(svgContent)) {
135
+ return [];
136
+ }
137
+ const dom = new JSDOM(svgContent, {
138
+ contentType: 'image/svg+xml'
139
+ });
140
+ const doc = dom.window.document;
141
+ const results = [];
142
+ const pathEls = doc.querySelectorAll('path[fill-rule="evenodd"], path[clip-rule="evenodd"]');
143
+ for (const el of pathEls) {
144
+ const d = el.getAttribute('d');
145
+ if (d) results.push(d);
146
+ }
147
+ return results;
148
+ }
149
+
150
+ /**
151
+ * Replace picosvg's (potentially damaged) evenodd path data with the
152
+ * preserved originals. Matches by position: the Nth evenodd path in
153
+ * the parsed output gets the Nth original `d` string.
154
+ */
155
+ export function restoreOriginalEvenoddDs(paths, originalDs) {
156
+ let oi = 0;
157
+ for (const p of paths) {
158
+ if (p.fillRule === 'evenodd' && oi < originalDs.length) {
159
+ p.d = originalDs[oi];
160
+ oi++;
161
+ }
162
+ }
163
+ }
164
+
78
165
  // ensure the svg has a xmlns attribute
79
166
  export function preprocessSvg(content) {
80
167
  if (/xmlns\s*=/.test(content)) return content;
@@ -1 +1 @@
1
- {"version":3,"names":["JSDOM","parseColor","resolveInheritedFill","el","current","parentElement","fill","getAttribute","calculateOpColor","opacity","resolvedFill","r","g","b","a","finalAlpha","toFixed","parsePath","p","d","op","fillOp","opVal","parseFloat","fillOpVal","combinedOpacity","parseFlattenedSvg","flattenedSvg","dom","doc","window","document","svgEl","querySelector","viewBoxRaw","split","map","Number","viewBox","length","every","n","isFinite","pathEls","Array","from","querySelectorAll","paths","filter","trim","shouldSkipPath","f","toLowerCase","validateSvg","content","test","valid","reason","preprocessSvg","replace"],"sourceRoot":"../../../../src","sources":["core/svg/svg_dom.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["JSDOM","parseColor","resolveInheritedFill","el","current","parentElement","fill","getAttribute","calculateOpColor","opacity","resolvedFill","r","g","b","a","finalAlpha","toFixed","sanitizePathData","d","trimmed","trim","test","sanitized","withoutClose","replace","nums","match","length","x","y","parsePath","p","op","fillOp","fillRule","undefined","opVal","parseFloat","fillOpVal","combinedOpacity","parseFlattenedSvg","flattenedSvg","options","dom","doc","window","document","svgEl","querySelector","viewBoxRaw","split","map","Number","viewBox","every","n","isFinite","pathEls","Array","from","querySelectorAll","paths","filter","onSanitize","shouldSkipPath","f","toLowerCase","validateSvg","content","valid","reason","extractOriginalEvenoddDs","svgContent","contentType","results","push","restoreOriginalEvenoddDs","originalDs","oi","preprocessSvg"],"sourceRoot":"../../../../src","sources":["core/svg/svg_dom.ts"],"mappings":"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","ignoreList":[]}