svger-cli 3.1.1 → 4.0.0

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 (724) hide show
  1. package/CHANGELOG.md +332 -0
  2. package/README.md +432 -25
  3. package/SECURITY.md +3 -3
  4. package/assets/svges/500px.svg +3 -0
  5. package/assets/svges/adobe.svg +3 -0
  6. package/assets/svges/adonis.svg +3 -0
  7. package/assets/svges/aeroplane-1.svg +3 -0
  8. package/assets/svges/agenda.svg +3 -0
  9. package/assets/svges/airbnb.svg +3 -0
  10. package/assets/svges/airtable.svg +3 -0
  11. package/assets/svges/alarm-1.svg +7 -0
  12. package/assets/svges/align-text-center.svg +6 -0
  13. package/assets/svges/align-text-left.svg +6 -0
  14. package/assets/svges/align-text-right.svg +6 -0
  15. package/assets/svges/alpinejs.svg +4 -0
  16. package/assets/svges/amazon-original.svg +5 -0
  17. package/assets/svges/amazon-pay.svg +7 -0
  18. package/assets/svges/amazon.svg +10 -0
  19. package/assets/svges/ambulance-1.svg +4 -0
  20. package/assets/svges/amd.svg +3 -0
  21. package/assets/svges/amex.svg +4 -0
  22. package/assets/svges/anchor.svg +3 -0
  23. package/assets/svges/android-old.svg +3 -0
  24. package/assets/svges/android.svg +3 -0
  25. package/assets/svges/angellist.svg +3 -0
  26. package/assets/svges/angle-double-down.svg +4 -0
  27. package/assets/svges/angle-double-left.svg +4 -0
  28. package/assets/svges/angle-double-right.svg +4 -0
  29. package/assets/svges/angle-double-up.svg +4 -0
  30. package/assets/svges/angular.svg +3 -0
  31. package/assets/svges/app-store.svg +3 -0
  32. package/assets/svges/apple-brand.svg +3 -0
  33. package/assets/svges/apple-music-alt.svg +3 -0
  34. package/assets/svges/apple-music.svg +3 -0
  35. package/assets/svges/apple-pay.svg +3 -0
  36. package/assets/svges/arc-browser.svg +6 -0
  37. package/assets/svges/arrow-all-direction.svg +6 -0
  38. package/assets/svges/arrow-angular-top-left.svg +3 -0
  39. package/assets/svges/arrow-angular-top-right.svg +3 -0
  40. package/assets/svges/arrow-both-direction-horizontal-1.svg +3 -0
  41. package/assets/svges/arrow-both-direction-vertical-1.svg +3 -0
  42. package/assets/svges/arrow-downward.svg +3 -0
  43. package/assets/svges/arrow-left-circle.svg +4 -0
  44. package/assets/svges/arrow-left.svg +3 -0
  45. package/assets/svges/arrow-right-circle.svg +4 -0
  46. package/assets/svges/arrow-right.svg +3 -0
  47. package/assets/svges/arrow-upward.svg +3 -0
  48. package/assets/svges/asana.svg +3 -0
  49. package/assets/svges/astro.svg +4 -0
  50. package/assets/svges/atlassian.svg +3 -0
  51. package/assets/svges/audi-alt.svg +3 -0
  52. package/assets/svges/audi.svg +3 -0
  53. package/assets/svges/aws.svg +3 -0
  54. package/assets/svges/azure.svg +3 -0
  55. package/assets/svges/badge-decagram-percent.svg +6 -0
  56. package/assets/svges/balloons.svg +3 -0
  57. package/assets/svges/ban-2.svg +3 -0
  58. package/assets/svges/bar-chart-4.svg +6 -0
  59. package/assets/svges/bar-chart-dollar.svg +6 -0
  60. package/assets/svges/basket-shopping-3.svg +5 -0
  61. package/assets/svges/beat.svg +3 -0
  62. package/assets/svges/behance.svg +5 -0
  63. package/assets/svges/bell-1.svg +3 -0
  64. package/assets/svges/bike.svg +6 -0
  65. package/assets/svges/bing.svg +5 -0
  66. package/assets/svges/bitbucket.svg +5 -0
  67. package/assets/svges/bitcoin.svg +5 -0
  68. package/assets/svges/bittorrent.svg +6 -0
  69. package/assets/svges/blogger-alt.svg +3 -0
  70. package/assets/svges/blogger.svg +3 -0
  71. package/assets/svges/bluetooth-logo.svg +3 -0
  72. package/assets/svges/bluetooth.svg +3 -0
  73. package/assets/svges/bmw.svg +7 -0
  74. package/assets/svges/board-writing-3.svg +3 -0
  75. package/assets/svges/bold.svg +3 -0
  76. package/assets/svges/bolt-2.svg +3 -0
  77. package/assets/svges/bolt-3.svg +3 -0
  78. package/assets/svges/book-1.svg +4 -0
  79. package/assets/svges/bookmark-1.svg +3 -0
  80. package/assets/svges/bookmark-circle.svg +4 -0
  81. package/assets/svges/books-2.svg +3 -0
  82. package/assets/svges/bootstrap-5-square.svg +3 -0
  83. package/assets/svges/bootstrap-5.svg +3 -0
  84. package/assets/svges/box-archive-1.svg +4 -0
  85. package/assets/svges/box-closed.svg +3 -0
  86. package/assets/svges/box-gift-1.svg +3 -0
  87. package/assets/svges/brave.svg +3 -0
  88. package/assets/svges/bricks.svg +3 -0
  89. package/assets/svges/bridge-3.svg +3 -0
  90. package/assets/svges/briefcase-1.svg +3 -0
  91. package/assets/svges/briefcase-2.svg +3 -0
  92. package/assets/svges/briefcase-plus-1.svg +4 -0
  93. package/assets/svges/brush-1-rotated.svg +3 -0
  94. package/assets/svges/brush-2.svg +3 -0
  95. package/assets/svges/btc.svg +3 -0
  96. package/assets/svges/bug-1.svg +3 -0
  97. package/assets/svges/buildings-1.svg +5 -0
  98. package/assets/svges/bulb-2.svg +3 -0
  99. package/assets/svges/bulb-4.svg +9 -0
  100. package/assets/svges/burger-1.svg +3 -0
  101. package/assets/svges/burger-drink.svg +4 -0
  102. package/assets/svges/bus-1.svg +5 -0
  103. package/assets/svges/busket-ball.svg +3 -0
  104. package/assets/svges/cake-1.svg +3 -0
  105. package/assets/svges/calculator-1.svg +8 -0
  106. package/assets/svges/calculator-2.svg +13 -0
  107. package/assets/svges/calendar-days.svg +9 -0
  108. package/assets/svges/camera-1.svg +4 -0
  109. package/assets/svges/camera-movie-1.svg +3 -0
  110. package/assets/svges/candy-cane-2.svg +3 -0
  111. package/assets/svges/candy-round-1.svg +3 -0
  112. package/assets/svges/canva.svg +3 -0
  113. package/assets/svges/capsule-1.svg +3 -0
  114. package/assets/svges/car-2.svg +5 -0
  115. package/assets/svges/car-4.svg +3 -0
  116. package/assets/svges/car-6.svg +5 -0
  117. package/assets/svges/caravan-1.svg +3 -0
  118. package/assets/svges/cart-1.svg +5 -0
  119. package/assets/svges/cart-2.svg +5 -0
  120. package/assets/svges/cash-app.svg +3 -0
  121. package/assets/svges/certificate-badge-1.svg +6 -0
  122. package/assets/svges/chat-bubble-2.svg +5 -0
  123. package/assets/svges/check-circle-1.svg +4 -0
  124. package/assets/svges/check-square-2.svg +4 -0
  125. package/assets/svges/check.svg +3 -0
  126. package/assets/svges/chevron-down-circle.svg +4 -0
  127. package/assets/svges/chevron-down.svg +3 -0
  128. package/assets/svges/chevron-left-circle.svg +4 -0
  129. package/assets/svges/chevron-left.svg +3 -0
  130. package/assets/svges/chevron-right-circle.svg +4 -0
  131. package/assets/svges/chevron-up-circle.svg +4 -0
  132. package/assets/svges/chevron-up.svg +3 -0
  133. package/assets/svges/chrome.svg +6 -0
  134. package/assets/svges/chromecast.svg +3 -0
  135. package/assets/svges/cisco.svg +3 -0
  136. package/assets/svges/claude.svg +3 -0
  137. package/assets/svges/clickup.svg +4 -0
  138. package/assets/svges/clipboard.svg +3 -0
  139. package/assets/svges/cloud-2.svg +3 -0
  140. package/assets/svges/cloud-bolt-1.svg +4 -0
  141. package/assets/svges/cloud-bolt-2.svg +4 -0
  142. package/assets/svges/cloud-check-circle.svg +5 -0
  143. package/assets/svges/cloud-download.svg +5 -0
  144. package/assets/svges/cloud-iot-2.svg +3 -0
  145. package/assets/svges/cloud-rain.svg +6 -0
  146. package/assets/svges/cloud-refresh-clockwise.svg +5 -0
  147. package/assets/svges/cloud-sun.svg +9 -0
  148. package/assets/svges/cloud-upload.svg +5 -0
  149. package/assets/svges/cloudflare.svg +3 -0
  150. package/assets/svges/code-1.svg +5 -0
  151. package/assets/svges/code-s.svg +5 -0
  152. package/assets/svges/codepen.svg +3 -0
  153. package/assets/svges/coffee-cup-2.svg +6 -0
  154. package/assets/svges/coinbase.svg +10 -0
  155. package/assets/svges/colour-palette-3.svg +7 -0
  156. package/assets/svges/comment-1-share.svg +4 -0
  157. package/assets/svges/comment-1-text.svg +5 -0
  158. package/assets/svges/comment-1.svg +3 -0
  159. package/assets/svges/compass-drafting-2.svg +3 -0
  160. package/assets/svges/connectdevelop.svg +3 -0
  161. package/assets/svges/copilot.svg +8 -0
  162. package/assets/svges/coral.svg +3 -0
  163. package/assets/svges/cpanel.svg +3 -0
  164. package/assets/svges/crane-4.svg +3 -0
  165. package/assets/svges/creative-commons.svg +4 -0
  166. package/assets/svges/credit-card-multiple.svg +3 -0
  167. package/assets/svges/crop-2.svg +3 -0
  168. package/assets/svges/crown-3.svg +3 -0
  169. package/assets/svges/css3.svg +3 -0
  170. package/assets/svges/dashboard-square-1.svg +6 -0
  171. package/assets/svges/database-2.svg +3 -0
  172. package/assets/svges/deno.svg +4 -0
  173. package/assets/svges/dev.svg +3 -0
  174. package/assets/svges/dialogflow.svg +4 -0
  175. package/assets/svges/diamonds-1.svg +3 -0
  176. package/assets/svges/diamonds-2.svg +3 -0
  177. package/assets/svges/digitalocean.svg +3 -0
  178. package/assets/svges/diners-club.svg +38 -0
  179. package/assets/svges/direction-ltr.svg +4 -0
  180. package/assets/svges/direction-rtl.svg +4 -0
  181. package/assets/svges/discord-chat.svg +5 -0
  182. package/assets/svges/discord.svg +3 -0
  183. package/assets/svges/discover.svg +3 -0
  184. package/assets/svges/docker.svg +3 -0
  185. package/assets/svges/dollar-circle.svg +4 -0
  186. package/assets/svges/dollar.svg +3 -0
  187. package/assets/svges/double-quotes-end-1.svg +4 -0
  188. package/assets/svges/download-1.svg +4 -0
  189. package/assets/svges/download-circle-1.svg +4 -0
  190. package/assets/svges/dribbble-symbol.svg +3 -0
  191. package/assets/svges/dribbble.svg +3 -0
  192. package/assets/svges/drizzle.svg +6 -0
  193. package/assets/svges/dropbox.svg +7 -0
  194. package/assets/svges/drupal.svg +3 -0
  195. package/assets/svges/dumbbell-1.svg +3 -0
  196. package/assets/svges/edge.svg +3 -0
  197. package/assets/svges/emoji-expressionless-flat-eyes.svg +6 -0
  198. package/assets/svges/emoji-expressionless.svg +6 -0
  199. package/assets/svges/emoji-grin.svg +6 -0
  200. package/assets/svges/emoji-sad.svg +6 -0
  201. package/assets/svges/emoji-smile-side.svg +6 -0
  202. package/assets/svges/emoji-smile-sunglass.svg +5 -0
  203. package/assets/svges/emoji-smile-tongue.svg +3 -0
  204. package/assets/svges/emoji-smile.svg +6 -0
  205. package/assets/svges/enter-down.svg +4 -0
  206. package/assets/svges/enter.svg +4 -0
  207. package/assets/svges/envato.svg +4 -0
  208. package/assets/svges/envelope-1.svg +3 -0
  209. package/assets/svges/eraser-1.svg +4 -0
  210. package/assets/svges/ethereum-logo.svg +4 -0
  211. package/assets/svges/euro.svg +3 -0
  212. package/assets/svges/exit-up.svg +4 -0
  213. package/assets/svges/exit.svg +4 -0
  214. package/assets/svges/expand-arrow-1.svg +3 -0
  215. package/assets/svges/expand-square-4.svg +6 -0
  216. package/assets/svges/expressjs.svg +4 -0
  217. package/assets/svges/eye.svg +4 -0
  218. package/assets/svges/facebook-messenger.svg +3 -0
  219. package/assets/svges/facebook-rounded.svg +4 -0
  220. package/assets/svges/facebook-square.svg +3 -0
  221. package/assets/svges/facebook.svg +3 -0
  222. package/assets/svges/facetime.svg +3 -0
  223. package/assets/svges/figma.svg +3 -0
  224. package/assets/svges/file-format-zip.svg +4 -0
  225. package/assets/svges/file-multiple.svg +4 -0
  226. package/assets/svges/file-pencil.svg +4 -0
  227. package/assets/svges/file-plus-circle.svg +5 -0
  228. package/assets/svges/file-question.svg +5 -0
  229. package/assets/svges/file-xmark.svg +4 -0
  230. package/assets/svges/firebase.svg +3 -0
  231. package/assets/svges/firefox.svg +3 -0
  232. package/assets/svges/firework-rocket-4.svg +3 -0
  233. package/assets/svges/fitbit.svg +3 -0
  234. package/assets/svges/flag-1.svg +3 -0
  235. package/assets/svges/flag-2.svg +3 -0
  236. package/assets/svges/flickr.svg +4 -0
  237. package/assets/svges/floppy-disk-1.svg +3 -0
  238. package/assets/svges/flower-2.svg +3 -0
  239. package/assets/svges/flutter.svg +3 -0
  240. package/assets/svges/folder-1.svg +3 -0
  241. package/assets/svges/ford.svg +3 -0
  242. package/assets/svges/framer.svg +3 -0
  243. package/assets/svges/funnel-1.svg +3 -0
  244. package/assets/svges/gallery.svg +4 -0
  245. package/assets/svges/game-pad-modern-1.svg +6 -0
  246. package/assets/svges/gatsby.svg +3 -0
  247. package/assets/svges/gauge-1.svg +5 -0
  248. package/assets/svges/gear-1.svg +4 -0
  249. package/assets/svges/gears-3.svg +6 -0
  250. package/assets/svges/gemini.svg +3 -0
  251. package/assets/svges/git.svg +3 -0
  252. package/assets/svges/github.svg +3 -0
  253. package/assets/svges/glass-juice-1.svg +3 -0
  254. package/assets/svges/globe-1.svg +3 -0
  255. package/assets/svges/globe-stand.svg +4 -0
  256. package/assets/svges/go.svg +7 -0
  257. package/assets/svges/goodreads.svg +3 -0
  258. package/assets/svges/google-cloud.svg +3 -0
  259. package/assets/svges/google-drive.svg +3 -0
  260. package/assets/svges/google-meet.svg +3 -0
  261. package/assets/svges/google-pay.svg +3 -0
  262. package/assets/svges/google-wallet.svg +3 -0
  263. package/assets/svges/google.svg +3 -0
  264. package/assets/svges/graduation-cap-1.svg +3 -0
  265. package/assets/svges/grammarly.svg +3 -0
  266. package/assets/svges/hacker-news.svg +3 -0
  267. package/assets/svges/hammer-1.svg +3 -0
  268. package/assets/svges/hammer-2.svg +3 -0
  269. package/assets/svges/hand-mic.svg +3 -0
  270. package/assets/svges/hand-shake.svg +3 -0
  271. package/assets/svges/hand-stop.svg +3 -0
  272. package/assets/svges/hand-taking-dollar.svg +4 -0
  273. package/assets/svges/hand-taking-leaf-1.svg +5 -0
  274. package/assets/svges/hand-taking-user.svg +5 -0
  275. package/assets/svges/hashnode.svg +3 -0
  276. package/assets/svges/hat-chef-3.svg +3 -0
  277. package/assets/svges/headphone-1.svg +3 -0
  278. package/assets/svges/heart.svg +3 -0
  279. package/assets/svges/helicopter-2.svg +4 -0
  280. package/assets/svges/helmet-safety-1.svg +3 -0
  281. package/assets/svges/hierarchy-1.svg +9 -0
  282. package/assets/svges/highlighter-1.svg +3 -0
  283. package/assets/svges/highlighter-2.svg +3 -0
  284. package/assets/svges/home-2.svg +3 -0
  285. package/assets/svges/hospital-2.svg +4 -0
  286. package/assets/svges/hourglass.svg +3 -0
  287. package/assets/svges/html5.svg +4 -0
  288. package/assets/svges/ibm.svg +3 -0
  289. package/assets/svges/id-card.svg +7 -0
  290. package/assets/svges/imdb.svg +7 -0
  291. package/assets/svges/indent.svg +8 -0
  292. package/assets/svges/info.svg +4 -0
  293. package/assets/svges/injection-1.svg +3 -0
  294. package/assets/svges/instagram-logotype.svg +3 -0
  295. package/assets/svges/instagram.svg +4 -0
  296. package/assets/svges/intel.svg +4 -0
  297. package/assets/svges/ios.svg +3 -0
  298. package/assets/svges/island-2.svg +4 -0
  299. package/assets/svges/jaguar.svg +3 -0
  300. package/assets/svges/jamstack.svg +3 -0
  301. package/assets/svges/java.svg +3 -0
  302. package/assets/svges/javascript.svg +3 -0
  303. package/assets/svges/jcb.svg +3 -0
  304. package/assets/svges/joomla.svg +6 -0
  305. package/assets/svges/jsfiddle.svg +4 -0
  306. package/assets/svges/key-1.svg +3 -0
  307. package/assets/svges/keyboard.svg +12 -0
  308. package/assets/svges/knife-fork-1.svg +5 -0
  309. package/assets/svges/kubernetes.svg +11 -0
  310. package/assets/svges/label-dollar-2.svg +4 -0
  311. package/assets/svges/laptop-2.svg +3 -0
  312. package/assets/svges/laptop-phone.svg +5 -0
  313. package/assets/svges/laravel.svg +3 -0
  314. package/assets/svges/layers-1.svg +4 -0
  315. package/assets/svges/layout-26.svg +3 -0
  316. package/assets/svges/layout-9.svg +3 -0
  317. package/assets/svges/leaf-1.svg +3 -0
  318. package/assets/svges/leaf-6.svg +4 -0
  319. package/assets/svges/lemon-squeezy.svg +6 -0
  320. package/assets/svges/life-guard-tube-1.svg +3 -0
  321. package/assets/svges/line-dashed.svg +5 -0
  322. package/assets/svges/line-dotted.svg +8 -0
  323. package/assets/svges/line-height.svg +7 -0
  324. package/assets/svges/line.svg +3 -0
  325. package/assets/svges/lineicons.svg +6 -0
  326. package/assets/svges/link-2-angular-right.svg +3 -0
  327. package/assets/svges/linkedin.svg +3 -0
  328. package/assets/svges/location-arrow-right.svg +3 -0
  329. package/assets/svges/locked-1.svg +4 -0
  330. package/assets/svges/locked-2.svg +4 -0
  331. package/assets/svges/loom.svg +3 -0
  332. package/assets/svges/magento.svg +4 -0
  333. package/assets/svges/magnet.svg +3 -0
  334. package/assets/svges/mailchimp.svg +3 -0
  335. package/assets/svges/map-marker-1.svg +6 -0
  336. package/assets/svges/map-marker-5.svg +4 -0
  337. package/assets/svges/map-pin-5.svg +3 -0
  338. package/assets/svges/markdown.svg +5 -0
  339. package/assets/svges/mastercard.svg +7 -0
  340. package/assets/svges/medium-alt.svg +3 -0
  341. package/assets/svges/medium.svg +3 -0
  342. package/assets/svges/megaphone-1.svg +3 -0
  343. package/assets/svges/menu-cheesburger.svg +8 -0
  344. package/assets/svges/menu-hamburger-1.svg +5 -0
  345. package/assets/svges/menu-meatballs-1.svg +5 -0
  346. package/assets/svges/menu-meatballs-2.svg +5 -0
  347. package/assets/svges/mercedes.svg +3 -0
  348. package/assets/svges/message-2-question.svg +5 -0
  349. package/assets/svges/message-2.svg +3 -0
  350. package/assets/svges/message-3-text.svg +5 -0
  351. package/assets/svges/meta-alt.svg +3 -0
  352. package/assets/svges/meta.svg +7 -0
  353. package/assets/svges/microphone-1.svg +4 -0
  354. package/assets/svges/microscope.svg +3 -0
  355. package/assets/svges/microsoft-edge.svg +5 -0
  356. package/assets/svges/microsoft-teams.svg +6 -0
  357. package/assets/svges/microsoft.svg +6 -0
  358. package/assets/svges/minus-circle.svg +4 -0
  359. package/assets/svges/minus.svg +3 -0
  360. package/assets/svges/mongodb.svg +3 -0
  361. package/assets/svges/monitor-code.svg +5 -0
  362. package/assets/svges/monitor-mac.svg +3 -0
  363. package/assets/svges/monitor.svg +3 -0
  364. package/assets/svges/moon-half-right-5.svg +3 -0
  365. package/assets/svges/mountains-2.svg +3 -0
  366. package/assets/svges/mouse-2.svg +3 -0
  367. package/assets/svges/mushroom-1.svg +3 -0
  368. package/assets/svges/mushroom-5.svg +6 -0
  369. package/assets/svges/music.svg +3 -0
  370. package/assets/svges/mysql.svg +3 -0
  371. package/assets/svges/nasa.svg +3 -0
  372. package/assets/svges/netflix.svg +3 -0
  373. package/assets/svges/netlify.svg +3 -0
  374. package/assets/svges/next-step-2.svg +3 -0
  375. package/assets/svges/nextjs.svg +3 -0
  376. package/assets/svges/nike.svg +3 -0
  377. package/assets/svges/nissan.svg +3 -0
  378. package/assets/svges/nodejs-alt.svg +3 -0
  379. package/assets/svges/nodejs.svg +3 -0
  380. package/assets/svges/notebook-1.svg +3 -0
  381. package/assets/svges/notion.svg +3 -0
  382. package/assets/svges/npm.svg +3 -0
  383. package/assets/svges/nuxt.svg +3 -0
  384. package/assets/svges/nvidia.svg +3 -0
  385. package/assets/svges/oculus.svg +4 -0
  386. package/assets/svges/open-ai.svg +3 -0
  387. package/assets/svges/opera-mini.svg +3 -0
  388. package/assets/svges/oracle.svg +3 -0
  389. package/assets/svges/outdent.svg +8 -0
  390. package/assets/svges/paddle.svg +3 -0
  391. package/assets/svges/page-break-1.svg +7 -0
  392. package/assets/svges/pagination.svg +7 -0
  393. package/assets/svges/paint-bucket.svg +3 -0
  394. package/assets/svges/paint-roller-1.svg +3 -0
  395. package/assets/svges/paperclip-1.svg +3 -0
  396. package/assets/svges/party-flags.svg +3 -0
  397. package/assets/svges/party-spray.svg +3 -0
  398. package/assets/svges/patreon.svg +3 -0
  399. package/assets/svges/pause.svg +4 -0
  400. package/assets/svges/payoneer.svg +4 -0
  401. package/assets/svges/paypal.svg +4 -0
  402. package/assets/svges/pen-to-square.svg +4 -0
  403. package/assets/svges/pencil-1.svg +3 -0
  404. package/assets/svges/pepsi.svg +4 -0
  405. package/assets/svges/phone.svg +4 -0
  406. package/assets/svges/photos.svg +4 -0
  407. package/assets/svges/php.svg +3 -0
  408. package/assets/svges/pie-chart-2.svg +3 -0
  409. package/assets/svges/pilcrow.svg +3 -0
  410. package/assets/svges/pimjo-logo.svg +9 -0
  411. package/assets/svges/pimjo-symbol.svg +3 -0
  412. package/assets/svges/pinterest.svg +3 -0
  413. package/assets/svges/pizza-2.svg +6 -0
  414. package/assets/svges/placeholder-dollar.svg +4 -0
  415. package/assets/svges/plantscale.svg +3 -0
  416. package/assets/svges/play-store.svg +3 -0
  417. package/assets/svges/play.svg +3 -0
  418. package/assets/svges/playstation.svg +5 -0
  419. package/assets/svges/plug-1.svg +3 -0
  420. package/assets/svges/plus-circle.svg +4 -0
  421. package/assets/svges/plus.svg +3 -0
  422. package/assets/svges/pnpm.svg +10 -0
  423. package/assets/svges/postgresql.svg +3 -0
  424. package/assets/svges/postman.svg +3 -0
  425. package/assets/svges/pound.svg +3 -0
  426. package/assets/svges/power-button.svg +4 -0
  427. package/assets/svges/previous-step-2.svg +3 -0
  428. package/assets/svges/printer.svg +3 -0
  429. package/assets/svges/prisma.svg +3 -0
  430. package/assets/svges/producthunt.svg +4 -0
  431. package/assets/svges/proton-mail-logo.svg +3 -0
  432. package/assets/svges/proton-mail-symbol.svg +3 -0
  433. package/assets/svges/python.svg +3 -0
  434. package/assets/svges/question-mark-circle.svg +5 -0
  435. package/assets/svges/question-mark.svg +4 -0
  436. package/assets/svges/quora.svg +4 -0
  437. package/assets/svges/radis.svg +3 -0
  438. package/assets/svges/react.svg +3 -0
  439. package/assets/svges/reddit.svg +6 -0
  440. package/assets/svges/refresh-circle-1-clockwise.svg +4 -0
  441. package/assets/svges/refresh-dollar-1.svg +5 -0
  442. package/assets/svges/refresh-user-1.svg +6 -0
  443. package/assets/svges/remix-js.svg +4 -0
  444. package/assets/svges/road-1.svg +6 -0
  445. package/assets/svges/rocket-5.svg +5 -0
  446. package/assets/svges/route-1.svg +7 -0
  447. package/assets/svges/rss-right.svg +6 -0
  448. package/assets/svges/ruler-1.svg +3 -0
  449. package/assets/svges/ruler-pen.svg +4 -0
  450. package/assets/svges/rupee.svg +3 -0
  451. package/assets/svges/safari.svg +35 -0
  452. package/assets/svges/sanity.svg +20 -0
  453. package/assets/svges/school-bench-1.svg +4 -0
  454. package/assets/svges/school-bench-2.svg +4 -0
  455. package/assets/svges/scissors-1-vertical.svg +4 -0
  456. package/assets/svges/scoter.svg +8 -0
  457. package/assets/svges/scroll-down-2.svg +6 -0
  458. package/assets/svges/search-1.svg +3 -0
  459. package/assets/svges/search-2.svg +4 -0
  460. package/assets/svges/search-minus.svg +4 -0
  461. package/assets/svges/search-plus.svg +4 -0
  462. package/assets/svges/search-text.svg +5 -0
  463. package/assets/svges/select-cursor-1.svg +10 -0
  464. package/assets/svges/seo-monitor.svg +6 -0
  465. package/assets/svges/service-bell-1.svg +3 -0
  466. package/assets/svges/share-1-circle.svg +4 -0
  467. package/assets/svges/share-1.svg +3 -0
  468. package/assets/svges/share-2.svg +4 -0
  469. package/assets/svges/shield-2-check.svg +4 -0
  470. package/assets/svges/shield-2.svg +3 -0
  471. package/assets/svges/shield-dollar.svg +4 -0
  472. package/assets/svges/shift-left.svg +4 -0
  473. package/assets/svges/shift-right.svg +4 -0
  474. package/assets/svges/ship-1.svg +5 -0
  475. package/assets/svges/shirt-1.svg +3 -0
  476. package/assets/svges/shopify.svg +3 -0
  477. package/assets/svges/shovel.svg +3 -0
  478. package/assets/svges/shuffle.svg +3 -0
  479. package/assets/svges/sign-post-left.svg +3 -0
  480. package/assets/svges/signal-app.svg +3 -0
  481. package/assets/svges/signs-post-2.svg +3 -0
  482. package/assets/svges/sketch.svg +3 -0
  483. package/assets/svges/skype.svg +3 -0
  484. package/assets/svges/slack.svg +10 -0
  485. package/assets/svges/slice-2.svg +3 -0
  486. package/assets/svges/sliders-horizontal-square-2.svg +7 -0
  487. package/assets/svges/slideshare.svg +5 -0
  488. package/assets/svges/snapchat.svg +3 -0
  489. package/assets/svges/sort-alphabetical.svg +5 -0
  490. package/assets/svges/sort-high-to-low.svg +7 -0
  491. package/assets/svges/soundcloud.svg +3 -0
  492. package/assets/svges/spacex.svg +4 -0
  493. package/assets/svges/spellcheck.svg +4 -0
  494. package/assets/svges/spinner-2-sacle.svg +10 -0
  495. package/assets/svges/spinner-3.svg +3 -0
  496. package/assets/svges/sports.svg +3 -0
  497. package/assets/svges/spotify-alt.svg +6 -0
  498. package/assets/svges/spotify.svg +3 -0
  499. package/assets/svges/squarespace.svg +3 -0
  500. package/assets/svges/stackoverflow.svg +8 -0
  501. package/assets/svges/stamp.svg +3 -0
  502. package/assets/svges/star-fat-half-2.svg +4 -0
  503. package/assets/svges/star-fat.svg +3 -0
  504. package/assets/svges/star-sharp-disabled.svg +4 -0
  505. package/assets/svges/statista.svg +3 -0
  506. package/assets/svges/steam.svg +5 -0
  507. package/assets/svges/stethoscope-1.svg +3 -0
  508. package/assets/svges/stopwatch.svg +5 -0
  509. package/assets/svges/storage-hdd-2.svg +4 -0
  510. package/assets/svges/strikethrough-1.svg +5 -0
  511. package/assets/svges/stripe.svg +9 -0
  512. package/assets/svges/stumbleupon.svg +3 -0
  513. package/assets/svges/sun-1.svg +11 -0
  514. package/assets/svges/supabase.svg +5 -0
  515. package/assets/svges/surfboard-2.svg +3 -0
  516. package/assets/svges/svelte.svg +3 -0
  517. package/assets/svges/swift.svg +3 -0
  518. package/assets/svges/tab.svg +4 -0
  519. package/assets/svges/tailwindcss.svg +3 -0
  520. package/assets/svges/target-user.svg +5 -0
  521. package/assets/svges/telegram.svg +3 -0
  522. package/assets/svges/telephone-1.svg +4 -0
  523. package/assets/svges/telephone-3.svg +5 -0
  524. package/assets/svges/tesla.svg +3 -0
  525. package/assets/svges/text-format-remove.svg +5 -0
  526. package/assets/svges/text-format.svg +5 -0
  527. package/assets/svges/text-paragraph.svg +6 -0
  528. package/assets/svges/thumbs-down-3.svg +3 -0
  529. package/assets/svges/thumbs-up-3.svg +3 -0
  530. package/assets/svges/ticket-1.svg +3 -0
  531. package/assets/svges/tickets-3.svg +7 -0
  532. package/assets/svges/tiktok-alt.svg +3 -0
  533. package/assets/svges/tiktok.svg +3 -0
  534. package/assets/svges/tower-broadcast-1.svg +7 -0
  535. package/assets/svges/toyota.svg +4 -0
  536. package/assets/svges/train-1.svg +4 -0
  537. package/assets/svges/train-3.svg +5 -0
  538. package/assets/svges/trash-3.svg +5 -0
  539. package/assets/svges/tree-2.svg +3 -0
  540. package/assets/svges/trees-3.svg +3 -0
  541. package/assets/svges/trello.svg +3 -0
  542. package/assets/svges/trend-down-1.svg +3 -0
  543. package/assets/svges/trend-up-1.svg +3 -0
  544. package/assets/svges/trophy-1.svg +3 -0
  545. package/assets/svges/trowel-1.svg +3 -0
  546. package/assets/svges/truck-delivery-1.svg +3 -0
  547. package/assets/svges/tumblr.svg +3 -0
  548. package/assets/svges/turborepo.svg +4 -0
  549. package/assets/svges/twitch.svg +3 -0
  550. package/assets/svges/twitter-old.svg +3 -0
  551. package/assets/svges/typescript.svg +3 -0
  552. package/assets/svges/uber-symbol.svg +3 -0
  553. package/assets/svges/uber.svg +3 -0
  554. package/assets/svges/ubuntu.svg +3 -0
  555. package/assets/svges/underline.svg +4 -0
  556. package/assets/svges/unlink-2-angular-eft.svg +8 -0
  557. package/assets/svges/unlocked-2.svg +4 -0
  558. package/assets/svges/unsplash.svg +4 -0
  559. package/assets/svges/upload-1.svg +4 -0
  560. package/assets/svges/upload-circle-1.svg +4 -0
  561. package/assets/svges/user-4.svg +4 -0
  562. package/assets/svges/user-multiple-4.svg +6 -0
  563. package/assets/svges/vector-nodes-6.svg +3 -0
  564. package/assets/svges/vector-nodes-7.svg +3 -0
  565. package/assets/svges/vercel.svg +3 -0
  566. package/assets/svges/vimeo.svg +3 -0
  567. package/assets/svges/visa.svg +3 -0
  568. package/assets/svges/vite.svg +6 -0
  569. package/assets/svges/vk.svg +3 -0
  570. package/assets/svges/vmware.svg +4 -0
  571. package/assets/svges/volkswagen.svg +8 -0
  572. package/assets/svges/volume-1.svg +5 -0
  573. package/assets/svges/volume-high.svg +6 -0
  574. package/assets/svges/volume-low.svg +4 -0
  575. package/assets/svges/volume-mute.svg +6 -0
  576. package/assets/svges/volume-off.svg +3 -0
  577. package/assets/svges/vs-code.svg +3 -0
  578. package/assets/svges/vuejs.svg +3 -0
  579. package/assets/svges/wallet-1.svg +3 -0
  580. package/assets/svges/watch-beat-1.svg +4 -0
  581. package/assets/svges/water-drop-1.svg +4 -0
  582. package/assets/svges/webflow.svg +3 -0
  583. package/assets/svges/webhooks.svg +3 -0
  584. package/assets/svges/wechat.svg +4 -0
  585. package/assets/svges/weight-machine-1.svg +4 -0
  586. package/assets/svges/whatsapp.svg +3 -0
  587. package/assets/svges/wheelbarrow-empty.svg +3 -0
  588. package/assets/svges/wheelchair-1.svg +3 -0
  589. package/assets/svges/windows.svg +6 -0
  590. package/assets/svges/wise.svg +3 -0
  591. package/assets/svges/wordpress.svg +3 -0
  592. package/assets/svges/www-cursor.svg +5 -0
  593. package/assets/svges/www.svg +4 -0
  594. package/assets/svges/x.svg +3 -0
  595. package/assets/svges/xampp.svg +5 -0
  596. package/assets/svges/xbox.svg +6 -0
  597. package/assets/svges/xmark-circle.svg +4 -0
  598. package/assets/svges/xmark.svg +3 -0
  599. package/assets/svges/xrp.svg +3 -0
  600. package/assets/svges/yahoo.svg +3 -0
  601. package/assets/svges/yarn.svg +4 -0
  602. package/assets/svges/ycombinator.svg +3 -0
  603. package/assets/svges/yen.svg +3 -0
  604. package/assets/svges/youtube-kids.svg +3 -0
  605. package/assets/svges/youtube-music.svg +4 -0
  606. package/assets/svges/youtube.svg +3 -0
  607. package/assets/svges/zapier.svg +3 -0
  608. package/assets/svges/zero-size.svg +6 -0
  609. package/assets/svges/zoom.svg +4 -0
  610. package/bin/test-svger.js +163 -0
  611. package/dist/__tests__/__mocks__/visual-diff.d.ts +7 -0
  612. package/dist/__tests__/__mocks__/visual-diff.js +13 -0
  613. package/dist/__tests__/fixtures.js +18 -18
  614. package/dist/cli.js +148 -2
  615. package/dist/config.js +4 -1
  616. package/dist/core/enhanced-plugin-manager.d.ts +107 -0
  617. package/dist/core/enhanced-plugin-manager.js +315 -0
  618. package/dist/core/error-handler.d.ts +1 -1
  619. package/dist/core/error-handler.js +14 -17
  620. package/dist/core/framework-templates.js +37 -47
  621. package/dist/core/logger.js +0 -1
  622. package/dist/core/performance-engine.js +10 -15
  623. package/dist/core/plugin-manager.js +4 -4
  624. package/dist/core/style-compiler.d.ts +0 -1
  625. package/dist/core/style-compiler.js +3 -6
  626. package/dist/index.d.ts +4 -0
  627. package/dist/index.js +4 -0
  628. package/dist/integrations/babel.d.ts +1 -1
  629. package/dist/integrations/babel.js +1 -1
  630. package/dist/integrations/jest-preset.js +1 -1
  631. package/dist/optimizers/advanced-stages.d.ts +40 -0
  632. package/dist/optimizers/advanced-stages.js +297 -0
  633. package/dist/optimizers/basic-cleaner.d.ts +68 -0
  634. package/dist/optimizers/basic-cleaner.js +198 -0
  635. package/dist/optimizers/collapse-useless-groups.d.ts +26 -0
  636. package/dist/optimizers/collapse-useless-groups.js +104 -0
  637. package/dist/optimizers/command-optimizer.d.ts +48 -0
  638. package/dist/optimizers/command-optimizer.js +299 -0
  639. package/dist/optimizers/index.d.ts +14 -0
  640. package/dist/optimizers/index.js +15 -0
  641. package/dist/optimizers/move-attrs-to-parent.d.ts +31 -0
  642. package/dist/optimizers/move-attrs-to-parent.js +115 -0
  643. package/dist/optimizers/numeric-optimizer.d.ts +43 -0
  644. package/dist/optimizers/numeric-optimizer.js +383 -0
  645. package/dist/optimizers/optimizer-pipeline.d.ts +39 -0
  646. package/dist/optimizers/optimizer-pipeline.js +81 -0
  647. package/dist/optimizers/path-deduplicator.d.ts +37 -0
  648. package/dist/optimizers/path-deduplicator.js +406 -0
  649. package/dist/optimizers/path-parser.d.ts +60 -0
  650. package/dist/optimizers/path-parser.js +428 -0
  651. package/dist/optimizers/path-shortener.d.ts +41 -0
  652. package/dist/optimizers/path-shortener.js +274 -0
  653. package/dist/optimizers/path-simplifier.d.ts +30 -0
  654. package/dist/optimizers/path-simplifier.js +326 -0
  655. package/dist/optimizers/remove-hidden-empty.d.ts +29 -0
  656. package/dist/optimizers/remove-hidden-empty.js +130 -0
  657. package/dist/optimizers/remove-unused-defs.d.ts +24 -0
  658. package/dist/optimizers/remove-unused-defs.js +132 -0
  659. package/dist/optimizers/shape-conversion.d.ts +74 -0
  660. package/dist/optimizers/shape-conversion.js +277 -0
  661. package/dist/optimizers/style-optimizer.d.ts +30 -0
  662. package/dist/optimizers/style-optimizer.js +324 -0
  663. package/dist/optimizers/svg-tree-parser.d.ts +55 -0
  664. package/dist/optimizers/svg-tree-parser.js +352 -0
  665. package/dist/optimizers/transform-collapsing.d.ts +38 -0
  666. package/dist/optimizers/transform-collapsing.js +444 -0
  667. package/dist/optimizers/transform-optimizer.d.ts +65 -0
  668. package/dist/optimizers/transform-optimizer.js +320 -0
  669. package/dist/optimizers/tree-serializer.d.ts +46 -0
  670. package/dist/optimizers/tree-serializer.js +190 -0
  671. package/dist/optimizers/tree-stages.d.ts +27 -0
  672. package/dist/optimizers/tree-stages.js +141 -0
  673. package/dist/optimizers/types.d.ts +207 -0
  674. package/dist/optimizers/types.js +122 -0
  675. package/dist/plugins/color-replacer.d.ts +39 -0
  676. package/dist/plugins/color-replacer.js +126 -0
  677. package/dist/plugins/gradient-optimizer.d.ts +33 -0
  678. package/dist/plugins/gradient-optimizer.js +197 -0
  679. package/dist/plugins/stroke-normalizer.d.ts +33 -0
  680. package/dist/plugins/stroke-normalizer.js +166 -0
  681. package/dist/plugins/watermark-remover.d.ts +32 -0
  682. package/dist/plugins/watermark-remover.js +133 -0
  683. package/dist/processors/svg-processor.d.ts +17 -2
  684. package/dist/processors/svg-processor.js +108 -32
  685. package/dist/services/config.d.ts +4 -0
  686. package/dist/services/config.js +62 -1
  687. package/dist/services/file-watcher.d.ts +1 -1
  688. package/dist/services/file-watcher.js +1 -1
  689. package/dist/services/svg-service.d.ts +4 -0
  690. package/dist/services/svg-service.js +41 -7
  691. package/dist/types/index.d.ts +1 -0
  692. package/dist/types/plugin-system.d.ts +153 -0
  693. package/dist/types/plugin-system.js +5 -0
  694. package/dist/utils/visual-diff.d.ts +150 -0
  695. package/dist/utils/visual-diff.js +247 -0
  696. package/dist/watch.js +0 -2
  697. package/docs/COMPLETE-ACHIEVEMENT-SUMMARY.md +401 -0
  698. package/docs/MIGRATION-4.0.0.md +271 -0
  699. package/docs/PIPELINE-INTEGRATION.md +406 -0
  700. package/docs/PLUGIN-DEVELOPMENT-GUIDE.md +807 -0
  701. package/docs/QUICK-REFERENCE.md +176 -0
  702. package/docs/SAMPLE-SVGS-TESTING.md +276 -0
  703. package/docs/archive/PHASE-1-ARCHITECTURE.md +345 -0
  704. package/docs/archive/PHASE-1-IMPLEMENTATION.md +307 -0
  705. package/docs/archive/PHASE-1-SUMMARY.md +298 -0
  706. package/docs/archive/PHASE-2-COMPLETE.md +207 -0
  707. package/docs/archive/PHASE-3-SUMMARY.md +149 -0
  708. package/docs/archive/PHASE-4.3-COMMAND-OPTIMIZER.md +323 -0
  709. package/docs/archive/PHASE-4.4-PATH-SIMPLIFICATION.md +81 -0
  710. package/docs/archive/PHASE-4.5-PATH-DEDUPLICATION.md +449 -0
  711. package/docs/archive/PHASE-5.1-SUCCESS-REPORT.md +207 -0
  712. package/docs/archive/PHASE-5.1-TRANSFORM-COLLAPSING.md +362 -0
  713. package/docs/archive/PHASE-6.1-SHAPE-CONVERSION-DESIGN.md +518 -0
  714. package/docs/archive/PHASE-6.2-PLUGIN-SYSTEM-STATUS.md +403 -0
  715. package/docs/archive/PHASE-6.3-FINAL-STATUS.md +193 -0
  716. package/docs/archive/PHASE-6.3-VALIDATION-PROGRESS.md +345 -0
  717. package/docs/archive/PHASE-6.3-VISUAL-DIFF-DESIGN.md +553 -0
  718. package/docs/archive/PHASE-6.3-VISUAL-DIFF-SUMMARY.md +367 -0
  719. package/docs/archive/PHASE-6.3-XML-SERIALIZATION-FIX.md +210 -0
  720. package/docs/archive/RELEASE-NOTES-3.2.0.md +344 -0
  721. package/docs/archive/RELEASE-PREP-3.2.0.md +376 -0
  722. package/docs/performance/PERFORMANCE-RESULTS.md +31 -0
  723. package/docs/performance/REAL-WORLD-BENCHMARKS.md +159 -0
  724. package/package.json +16 -6
@@ -0,0 +1,362 @@
1
+ # Phase 5.1: Transform Collapsing - Implementation Summary
2
+
3
+ **Status:** ✅ COMPLETE
4
+ **Date:** January 2025
5
+ **Files Created:** 1 (transform-collapsing.ts, 540 lines)
6
+ **Tests:** 8 comprehensive tests covering nested groups, coordinate baking, identity removal
7
+
8
+ ## 🎯 Objectives
9
+
10
+ Phase 5 goal: **"Eliminate redundant transforms. Superior to SVGO's cleanupTransforms; huge wins on exported Illustrator SVGs with nested groups."**
11
+
12
+ Phase 5.1 focuses on:
13
+ 1. **Propagate transforms down the tree** - Apply parent transforms to children
14
+ 2. **Bake into coordinates** - Apply transforms directly to rect/circle/line/polygon/polyline/path
15
+ 3. **Collapse nested groups** - Multiply parent and child transforms
16
+ 4. **Remove identity transforms** - Detect and remove no-op transforms (translate(0,0), scale(1), etc.)
17
+ 5. **Unwrap empty groups** - Remove single-child groups with no attributes
18
+
19
+ ## 📊 Results
20
+
21
+ ### Test Performance
22
+
23
+ | Test | Input | Output | Reduction | Stats | Description |
24
+ |------|-------|--------|-----------|-------|-------------|
25
+ | Test 1 | 139 bytes | 91 bytes | **34.5%** | 2 collapsed, 1 baked | Simple translate on rect |
26
+ | Test 2 | 185 bytes | 91 bytes | **50.8%** | 4 collapsed, 1 baked | Nested groups with transforms |
27
+ | Test 3 | 136 bytes | 80 bytes | **41.2%** | 2 collapsed, 1 baked | Uniform scale + translate on circle |
28
+ | Test 4 | 133 bytes | 86 bytes | **35.3%** | 2 collapsed, 1 baked | Translate on line |
29
+ | Test 5 | 131 bytes | 83 bytes | **36.6%** | 2 collapsed, 1 baked | Translate on polygon |
30
+ | Test 6 | 179 bytes | 123 bytes | **31.3%** | 2 identity removed | Identity transforms removed |
31
+ | Test 7 | 264 bytes | 238 bytes | **9.8%** | 4 collapsed | Illustrator-style nested (rotation) |
32
+ | Test 8 | 174 bytes | 159 bytes | **8.6%** | 4 baked | Multi-shape group |
33
+
34
+ ### Key Achievements
35
+
36
+ 1. **50.8% reduction on nested groups** - Collapsed 4 nested groups with transforms
37
+ 2. **41.2% reduction on circles** - Uniform scale + translate baked into coordinates
38
+ 3. **Identity transform removal** - Detected and removed no-op transforms
39
+ 4. **Clean output** - No empty `<g></g>` wrappers left behind
40
+ 5. **Multi-shape handling** - Applied transforms to all children when group can't collapse
41
+
42
+ ## 🏗️ Architecture
43
+
44
+ ### File Structure
45
+
46
+ ```
47
+ src/optimizers/transform-collapsing.ts (540 lines)
48
+ ├── Matrix operations
49
+ │ ├── multiplyMatrices() - Combine transformation matrices
50
+ │ ├── transformPoint() - Apply matrix to (x, y) point
51
+ │ └── getNodeTransform() - Parse and consolidate node's transform attribute
52
+ ├── Shape type checks
53
+ │ ├── isContainer() - Check if element is g/svg/symbol/defs/clipPath/mask
54
+ │ └── isShape() - Check if element is rect/circle/line/polygon/polyline/path
55
+ ├── Transform application
56
+ │ ├── applyTransformToRect() - Simple translate+scale only (no rotation/skew)
57
+ │ ├── applyTransformToCircle() - Uniform scale only (stays circle, not ellipse)
58
+ │ ├── applyTransformToLine() - Full transform support (both endpoints)
59
+ │ ├── applyTransformToPoints() - Polygon/polyline full transform (all points)
60
+ │ ├── applyTransformToPath() - Basic translate only (TODO: full path transformation)
61
+ │ └── applyTransformToShape() - Dispatch to appropriate handler
62
+ ├── Main optimization
63
+ │ ├── collapseTransforms() - Traverse tree, propagate transforms, collapse groups
64
+ │ └── unwrapGroups() - Remove single-child groups with no attributes
65
+ └── Pipeline integration
66
+ └── transformCollapsingStage() - Pipeline wrapper with stats
67
+ ```
68
+
69
+ ### Transform Application Logic
70
+
71
+ ```typescript
72
+ // Matrix multiplication: Combine parent and child transforms
73
+ finalMatrix = parent × child
74
+
75
+ // Shape-specific strategies:
76
+ - rect: Simple translate+scale only (no rotation/skew)
77
+ - circle: Uniform scale only (sx === sy, stays circular)
78
+ - line: Full transform on both endpoints
79
+ - polygon: Full transform on all points
80
+ - polyline: Full transform on all points
81
+ - path: Basic translate only (TODO: integrate path-parser for full support)
82
+ ```
83
+
84
+ ### Collapsing Strategy
85
+
86
+ ```typescript
87
+ 1. Traverse tree with parent transform matrix
88
+ 2. For each node:
89
+ a. Get node's transform
90
+ b. Multiply: combined = parent × node
91
+ c. If combined is identity:
92
+ - Remove transform attribute
93
+ - Continue with identity matrix
94
+ d. If node is shape:
95
+ - Try to bake combined transform into coordinates
96
+ - If successful, increment bakedTransforms
97
+ e. If node is single-child group:
98
+ - If child is container: merge transforms, move to child
99
+ - If child is shape: bake combined transform into child
100
+ - Remove group's transform
101
+ - Increment collapsedGroups
102
+ f. Otherwise, propagate combined transform to children
103
+ 3. After traversal:
104
+ - Unwrap single-child groups with no attributes
105
+ - Remove empty groups
106
+ ```
107
+
108
+ ## 🔧 Implementation Details
109
+
110
+ ### Matrix Operations
111
+
112
+ ```typescript
113
+ // Identity matrix: [a, b, c, d, e, f] = [1, 0, 0, 1, 0, 0]
114
+ const IDENTITY_MATRIX: Matrix = [1, 0, 0, 1, 0, 0];
115
+
116
+ // Matrix multiplication (order matters!)
117
+ // [a1 b1 c1 d1 e1 f1] × [a2 b2 c2 d2 e2 f2]
118
+ function multiplyMatrices(m1: Matrix, m2: Matrix): Matrix {
119
+ const [a1, b1, c1, d1, e1, f1] = m1;
120
+ const [a2, b2, c2, d2, e2, f2] = m2;
121
+ return [
122
+ a1 * a2 + b1 * c2,
123
+ a1 * b2 + b1 * d2,
124
+ c1 * a2 + d1 * c2,
125
+ c1 * b2 + d1 * d2,
126
+ e1 * a2 + f1 * c2 + e2,
127
+ e1 * b2 + f1 * d2 + f2,
128
+ ];
129
+ }
130
+
131
+ // Transform point: [x', y'] = matrix × [x, y]
132
+ function transformPoint(matrix: Matrix, x: number, y: number): [number, number] {
133
+ const [a, b, c, d, e, f] = matrix;
134
+ return [
135
+ a * x + c * y + e,
136
+ b * x + d * y + f,
137
+ ];
138
+ }
139
+ ```
140
+
141
+ ### Transform Parsing & Consolidation
142
+
143
+ ```typescript
144
+ // Reused from transform-optimizer.ts (exported functions):
145
+ - parseTransformList(transformStr) → Transform[]
146
+ - consolidateTransforms(transforms) → Matrix
147
+ - isIdentityMatrix(matrix) → boolean
148
+ - decomposeMatrix(matrix) → string (shortest representation)
149
+ ```
150
+
151
+ ### Group Unwrapping
152
+
153
+ ```typescript
154
+ // After transform collapsing, unwrap single-child groups with no attributes
155
+ unwrapGroups(root):
156
+ 1. Recurse to unwrap nested structures first
157
+ 2. For each child:
158
+ - If <g> with attrs.size === 0 and children.length === 1:
159
+ * Replace group with its child
160
+ * Increment collapsedGroups
161
+ 3. Replace node.children with unwrapped array
162
+ ```
163
+
164
+ ## 🎨 Example Transformations
165
+
166
+ ### Before → After (Test 2: Nested Groups)
167
+
168
+ ```xml
169
+ <!-- BEFORE: 185 bytes -->
170
+ <svg xmlns="http://www.w3.org/2000/svg">
171
+ <g transform="translate(10, 10)">
172
+ <g transform="translate(5, 5)">
173
+ <rect x="0" y="0" width="100" height="50"/>
174
+ </g>
175
+ </g>
176
+ </svg>
177
+
178
+ <!-- AFTER: 91 bytes (50.8% reduction) -->
179
+ <svg xmlns="http://www.w3.org/2000/svg">
180
+ <rect x="15" y="15" width="100" height="50"/>
181
+ </svg>
182
+ ```
183
+
184
+ **What happened:**
185
+ 1. Multiplied transforms: `translate(10,10) × translate(5,5) = translate(15,15)`
186
+ 2. Applied combined transform to rect: `x=0+15=15, y=0+15=15`
187
+ 3. Removed both group transforms
188
+ 4. Unwrapped both single-child groups (no attributes)
189
+ 5. Result: Clean rect, 4 groups collapsed, 1 transform baked
190
+
191
+ ### Before → After (Test 3: Scale + Translate on Circle)
192
+
193
+ ```xml
194
+ <!-- BEFORE: 136 bytes -->
195
+ <svg xmlns="http://www.w3.org/2000/svg">
196
+ <g transform="translate(50, 50) scale(2)">
197
+ <circle cx="25" cy="25" r="10"/>
198
+ </g>
199
+ </svg>
200
+
201
+ <!-- AFTER: 80 bytes (41.2% reduction) -->
202
+ <svg xmlns="http://www.w3.org/2000/svg">
203
+ <circle cx="100" cy="100" r="20"/>
204
+ </svg>
205
+ ```
206
+
207
+ **What happened:**
208
+ 1. Parsed transforms: `translate(50,50)` + `scale(2,2)`
209
+ 2. Applied to circle:
210
+ - `cx = 25*2 + 50 = 100`
211
+ - `cy = 25*2 + 50 = 100`
212
+ - `r = 10*2 = 20`
213
+ 3. Removed group transform
214
+ 4. Unwrapped single-child group
215
+
216
+ ### Before → After (Test 6: Identity Transform Removal)
217
+
218
+ ```xml
219
+ <!-- BEFORE: 179 bytes -->
220
+ <svg xmlns="http://www.w3.org/2000/svg">
221
+ <rect transform="translate(0, 0)" x="10" y="20" width="100" height="50"/>
222
+ <circle transform="scale(1)" cx="50" cy="50" r="20"/>
223
+ </svg>
224
+
225
+ <!-- AFTER: 123 bytes (31.3% reduction) -->
226
+ <svg xmlns="http://www.w3.org/2000/svg">
227
+ <rect x="10" y="20" width="100" height="50"/>
228
+ <circle cx="50" cy="50" r="20"/>
229
+ </svg>
230
+ ```
231
+
232
+ **What happened:**
233
+ 1. Detected `translate(0,0)` is identity matrix `[1,0,0,1,0,0]`
234
+ 2. Detected `scale(1)` is identity matrix `[1,0,0,1,0,0]`
235
+ 3. Removed both transform attributes
236
+ 4. Stats: 2 identity transforms removed
237
+
238
+ ## 🚧 Limitations & Future Work
239
+
240
+ ### Current Limitations
241
+
242
+ 1. **Rect rotation not supported** - Only simple translate+scale for rects (no rotation/skew)
243
+ - Reason: Rotation converts rect to path, which is more verbose
244
+ - Future: Consider rect-to-path conversion when beneficial
245
+
246
+ 2. **Path transforms limited** - Only basic translate on paths
247
+ - Reason: Full path transformation requires parsing path data
248
+ - Future: Integrate path-parser.ts for comprehensive path transformation
249
+
250
+ 3. **Repeated shapes not extracted** - `findRepeatedShapes()` commented out
251
+ - Reason: Requires `<defs>` + `<use>` generation logic
252
+ - Future: Implement `<use>` extraction for repeated transformed shapes
253
+
254
+ 4. **Complex rotations retained** - Test 7 shows rotation matrices kept on shapes
255
+ - Reason: Conservative approach to avoid visual changes
256
+ - Future: Better handling of rotation-heavy Illustrator exports
257
+
258
+ ### Planned Enhancements
259
+
260
+ 1. **Enhanced Path Transformation** (Phase 5.2)
261
+ - Integrate path-parser.ts for full path coordinate transformation
262
+ - Enable rotation/scale on paths
263
+ - Transform arc commands (A/a) properly
264
+
265
+ 2. **`<use>` Extraction** (Phase 5.3)
266
+ - Uncomment `findRepeatedShapes()`
267
+ - Generate `<defs>` for repeated shapes
268
+ - Replace duplicates with `<use xlink:href="#id" transform="..."/>`
269
+ - Huge wins on icon sets and repeated UI elements
270
+
271
+ 3. **Rect-to-Path Conversion** (Phase 5.4)
272
+ - When rect has rotation/skew, convert to path
273
+ - Compare byte sizes: transformed rect vs. path
274
+ - Choose smaller representation
275
+
276
+ 4. **Transform Propagation to Nested Paths** (Phase 5.5)
277
+ - Detect and propagate transforms deeper into nested structures
278
+ - Handle clipPath, mask, pattern transforms
279
+ - More aggressive collapsing for Illustrator exports
280
+
281
+ ## 📈 Performance Metrics
282
+
283
+ ### Compilation
284
+ - **Lines of Code:** 540 (transform-collapsing.ts)
285
+ - **Build Time:** ~2-3 seconds (clean build)
286
+ - **Dependencies:** svg-tree-parser, transform-optimizer (reused functions)
287
+ - **Lint Errors:** 0 (clean compilation)
288
+
289
+ ### Runtime Performance (8 tests)
290
+ - **Average Reduction:** 31.0% across all tests
291
+ - **Best Case:** 50.8% (nested groups, Test 2)
292
+ - **Worst Case:** 8.6% (multi-shape group, Test 8)
293
+ - **Complex Illustrator:** 9.8% (Test 7, rotation-heavy)
294
+
295
+ ### Comparison to Goals
296
+ - **Goal:** "Superior to SVGO's cleanupTransforms"
297
+ - **Achieved:**
298
+ - ✅ 50.8% reduction on nested groups
299
+ - ✅ Identity transform removal
300
+ - ✅ Group unwrapping (SVGO doesn't do this)
301
+ - ✅ Coordinate baking for rect/circle/line/polygon/polyline
302
+ - ⏳ Path transformation limited (future work)
303
+ - ⏳ `<use>` extraction not yet implemented
304
+
305
+ ## 🔗 Integration
306
+
307
+ ### Modified Files
308
+
309
+ 1. **transform-optimizer.ts**
310
+ - Exported `parseTransformList()` for reuse
311
+ - Exported `consolidateTransforms()` for matrix operations
312
+ - Exported `isIdentityMatrix()` for identity detection
313
+ - Exported `decomposeMatrix()` for transform serialization
314
+
315
+ ### New Files
316
+
317
+ 1. **transform-collapsing.ts** (540 lines)
318
+ - Main implementation of Phase 5.1
319
+ - Exports: `collapseTransforms()`, `transformCollapsingStage()`
320
+
321
+ ### Test Files
322
+
323
+ 1. **test-transform-collapsing.js** (8 tests)
324
+ - Test 1: Simple translate on rect
325
+ - Test 2: Nested groups with transforms
326
+ - Test 3: Uniform scale + translate on circle
327
+ - Test 4: Translate on line
328
+ - Test 5: Translate on polygon
329
+ - Test 6: Identity transform removal
330
+ - Test 7: Complex Illustrator-style nested groups (rotation)
331
+ - Test 8: Multi-shape group
332
+
333
+ ## 🎓 Lessons Learned
334
+
335
+ 1. **Matrix multiplication order matters** - `parent × child`, not `child × parent`
336
+ 2. **Shape-specific strategies** - Different shapes have different transform capabilities
337
+ 3. **Conservative rotation handling** - Keep rotation matrices on shapes to avoid visual changes
338
+ 4. **Group unwrapping is powerful** - Removing single-child groups saves 7-14 bytes each
339
+ 5. **Identity detection is critical** - Many SVG exports contain no-op transforms
340
+ 6. **Type safety pays off** - TypeScript caught several type mismatches during development
341
+
342
+ ## 🚀 Next Steps
343
+
344
+ 1. **Phase 5 Integration** - Wire transform-collapsing.ts into OptimizerPipeline
345
+ 2. **Benchmark vs SVGO** - Compare on Illustrator exports with nested groups
346
+ 3. **Enhanced Path Transform** - Integrate path-parser.ts for full path transformation
347
+ 4. **`<use>` Extraction** - Implement repeated shape extraction to `<defs>` + `<use>`
348
+ 5. **Phase 4 Continuation** - Complete path optimization (4.3, 4.4, 4.5)
349
+
350
+ ## 📝 Notes
351
+
352
+ - All 26+ initial compilation errors resolved
353
+ - Clean build with no TypeScript warnings
354
+ - Ready for pipeline integration
355
+ - Test suite comprehensive and passing
356
+ - Documentation complete
357
+
358
+ ---
359
+
360
+ **Phase 5.1: Transform Collapsing - ✅ COMPLETE**
361
+ **Target: Superior to SVGO's cleanupTransforms - 🎯 ON TRACK**
362
+ **Next: Phase 5 Integration → Wire into OptimizerPipeline**