svger-cli 3.1.0 → 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.
- package/CHANGELOG.md +399 -0
- package/README.md +448 -37
- package/SECURITY.md +3 -3
- package/assets/svges/500px.svg +3 -0
- package/assets/svges/adobe.svg +3 -0
- package/assets/svges/adonis.svg +3 -0
- package/assets/svges/aeroplane-1.svg +3 -0
- package/assets/svges/agenda.svg +3 -0
- package/assets/svges/airbnb.svg +3 -0
- package/assets/svges/airtable.svg +3 -0
- package/assets/svges/alarm-1.svg +7 -0
- package/assets/svges/align-text-center.svg +6 -0
- package/assets/svges/align-text-left.svg +6 -0
- package/assets/svges/align-text-right.svg +6 -0
- package/assets/svges/alpinejs.svg +4 -0
- package/assets/svges/amazon-original.svg +5 -0
- package/assets/svges/amazon-pay.svg +7 -0
- package/assets/svges/amazon.svg +10 -0
- package/assets/svges/ambulance-1.svg +4 -0
- package/assets/svges/amd.svg +3 -0
- package/assets/svges/amex.svg +4 -0
- package/assets/svges/anchor.svg +3 -0
- package/assets/svges/android-old.svg +3 -0
- package/assets/svges/android.svg +3 -0
- package/assets/svges/angellist.svg +3 -0
- package/assets/svges/angle-double-down.svg +4 -0
- package/assets/svges/angle-double-left.svg +4 -0
- package/assets/svges/angle-double-right.svg +4 -0
- package/assets/svges/angle-double-up.svg +4 -0
- package/assets/svges/angular.svg +3 -0
- package/assets/svges/app-store.svg +3 -0
- package/assets/svges/apple-brand.svg +3 -0
- package/assets/svges/apple-music-alt.svg +3 -0
- package/assets/svges/apple-music.svg +3 -0
- package/assets/svges/apple-pay.svg +3 -0
- package/assets/svges/arc-browser.svg +6 -0
- package/assets/svges/arrow-all-direction.svg +6 -0
- package/assets/svges/arrow-angular-top-left.svg +3 -0
- package/assets/svges/arrow-angular-top-right.svg +3 -0
- package/assets/svges/arrow-both-direction-horizontal-1.svg +3 -0
- package/assets/svges/arrow-both-direction-vertical-1.svg +3 -0
- package/assets/svges/arrow-downward.svg +3 -0
- package/assets/svges/arrow-left-circle.svg +4 -0
- package/assets/svges/arrow-left.svg +3 -0
- package/assets/svges/arrow-right-circle.svg +4 -0
- package/assets/svges/arrow-right.svg +3 -0
- package/assets/svges/arrow-upward.svg +3 -0
- package/assets/svges/asana.svg +3 -0
- package/assets/svges/astro.svg +4 -0
- package/assets/svges/atlassian.svg +3 -0
- package/assets/svges/audi-alt.svg +3 -0
- package/assets/svges/audi.svg +3 -0
- package/assets/svges/aws.svg +3 -0
- package/assets/svges/azure.svg +3 -0
- package/assets/svges/badge-decagram-percent.svg +6 -0
- package/assets/svges/balloons.svg +3 -0
- package/assets/svges/ban-2.svg +3 -0
- package/assets/svges/bar-chart-4.svg +6 -0
- package/assets/svges/bar-chart-dollar.svg +6 -0
- package/assets/svges/basket-shopping-3.svg +5 -0
- package/assets/svges/beat.svg +3 -0
- package/assets/svges/behance.svg +5 -0
- package/assets/svges/bell-1.svg +3 -0
- package/assets/svges/bike.svg +6 -0
- package/assets/svges/bing.svg +5 -0
- package/assets/svges/bitbucket.svg +5 -0
- package/assets/svges/bitcoin.svg +5 -0
- package/assets/svges/bittorrent.svg +6 -0
- package/assets/svges/blogger-alt.svg +3 -0
- package/assets/svges/blogger.svg +3 -0
- package/assets/svges/bluetooth-logo.svg +3 -0
- package/assets/svges/bluetooth.svg +3 -0
- package/assets/svges/bmw.svg +7 -0
- package/assets/svges/board-writing-3.svg +3 -0
- package/assets/svges/bold.svg +3 -0
- package/assets/svges/bolt-2.svg +3 -0
- package/assets/svges/bolt-3.svg +3 -0
- package/assets/svges/book-1.svg +4 -0
- package/assets/svges/bookmark-1.svg +3 -0
- package/assets/svges/bookmark-circle.svg +4 -0
- package/assets/svges/books-2.svg +3 -0
- package/assets/svges/bootstrap-5-square.svg +3 -0
- package/assets/svges/bootstrap-5.svg +3 -0
- package/assets/svges/box-archive-1.svg +4 -0
- package/assets/svges/box-closed.svg +3 -0
- package/assets/svges/box-gift-1.svg +3 -0
- package/assets/svges/brave.svg +3 -0
- package/assets/svges/bricks.svg +3 -0
- package/assets/svges/bridge-3.svg +3 -0
- package/assets/svges/briefcase-1.svg +3 -0
- package/assets/svges/briefcase-2.svg +3 -0
- package/assets/svges/briefcase-plus-1.svg +4 -0
- package/assets/svges/brush-1-rotated.svg +3 -0
- package/assets/svges/brush-2.svg +3 -0
- package/assets/svges/btc.svg +3 -0
- package/assets/svges/bug-1.svg +3 -0
- package/assets/svges/buildings-1.svg +5 -0
- package/assets/svges/bulb-2.svg +3 -0
- package/assets/svges/bulb-4.svg +9 -0
- package/assets/svges/burger-1.svg +3 -0
- package/assets/svges/burger-drink.svg +4 -0
- package/assets/svges/bus-1.svg +5 -0
- package/assets/svges/busket-ball.svg +3 -0
- package/assets/svges/cake-1.svg +3 -0
- package/assets/svges/calculator-1.svg +8 -0
- package/assets/svges/calculator-2.svg +13 -0
- package/assets/svges/calendar-days.svg +9 -0
- package/assets/svges/camera-1.svg +4 -0
- package/assets/svges/camera-movie-1.svg +3 -0
- package/assets/svges/candy-cane-2.svg +3 -0
- package/assets/svges/candy-round-1.svg +3 -0
- package/assets/svges/canva.svg +3 -0
- package/assets/svges/capsule-1.svg +3 -0
- package/assets/svges/car-2.svg +5 -0
- package/assets/svges/car-4.svg +3 -0
- package/assets/svges/car-6.svg +5 -0
- package/assets/svges/caravan-1.svg +3 -0
- package/assets/svges/cart-1.svg +5 -0
- package/assets/svges/cart-2.svg +5 -0
- package/assets/svges/cash-app.svg +3 -0
- package/assets/svges/certificate-badge-1.svg +6 -0
- package/assets/svges/chat-bubble-2.svg +5 -0
- package/assets/svges/check-circle-1.svg +4 -0
- package/assets/svges/check-square-2.svg +4 -0
- package/assets/svges/check.svg +3 -0
- package/assets/svges/chevron-down-circle.svg +4 -0
- package/assets/svges/chevron-down.svg +3 -0
- package/assets/svges/chevron-left-circle.svg +4 -0
- package/assets/svges/chevron-left.svg +3 -0
- package/assets/svges/chevron-right-circle.svg +4 -0
- package/assets/svges/chevron-up-circle.svg +4 -0
- package/assets/svges/chevron-up.svg +3 -0
- package/assets/svges/chrome.svg +6 -0
- package/assets/svges/chromecast.svg +3 -0
- package/assets/svges/cisco.svg +3 -0
- package/assets/svges/claude.svg +3 -0
- package/assets/svges/clickup.svg +4 -0
- package/assets/svges/clipboard.svg +3 -0
- package/assets/svges/cloud-2.svg +3 -0
- package/assets/svges/cloud-bolt-1.svg +4 -0
- package/assets/svges/cloud-bolt-2.svg +4 -0
- package/assets/svges/cloud-check-circle.svg +5 -0
- package/assets/svges/cloud-download.svg +5 -0
- package/assets/svges/cloud-iot-2.svg +3 -0
- package/assets/svges/cloud-rain.svg +6 -0
- package/assets/svges/cloud-refresh-clockwise.svg +5 -0
- package/assets/svges/cloud-sun.svg +9 -0
- package/assets/svges/cloud-upload.svg +5 -0
- package/assets/svges/cloudflare.svg +3 -0
- package/assets/svges/code-1.svg +5 -0
- package/assets/svges/code-s.svg +5 -0
- package/assets/svges/codepen.svg +3 -0
- package/assets/svges/coffee-cup-2.svg +6 -0
- package/assets/svges/coinbase.svg +10 -0
- package/assets/svges/colour-palette-3.svg +7 -0
- package/assets/svges/comment-1-share.svg +4 -0
- package/assets/svges/comment-1-text.svg +5 -0
- package/assets/svges/comment-1.svg +3 -0
- package/assets/svges/compass-drafting-2.svg +3 -0
- package/assets/svges/connectdevelop.svg +3 -0
- package/assets/svges/copilot.svg +8 -0
- package/assets/svges/coral.svg +3 -0
- package/assets/svges/cpanel.svg +3 -0
- package/assets/svges/crane-4.svg +3 -0
- package/assets/svges/creative-commons.svg +4 -0
- package/assets/svges/credit-card-multiple.svg +3 -0
- package/assets/svges/crop-2.svg +3 -0
- package/assets/svges/crown-3.svg +3 -0
- package/assets/svges/css3.svg +3 -0
- package/assets/svges/dashboard-square-1.svg +6 -0
- package/assets/svges/database-2.svg +3 -0
- package/assets/svges/deno.svg +4 -0
- package/assets/svges/dev.svg +3 -0
- package/assets/svges/dialogflow.svg +4 -0
- package/assets/svges/diamonds-1.svg +3 -0
- package/assets/svges/diamonds-2.svg +3 -0
- package/assets/svges/digitalocean.svg +3 -0
- package/assets/svges/diners-club.svg +38 -0
- package/assets/svges/direction-ltr.svg +4 -0
- package/assets/svges/direction-rtl.svg +4 -0
- package/assets/svges/discord-chat.svg +5 -0
- package/assets/svges/discord.svg +3 -0
- package/assets/svges/discover.svg +3 -0
- package/assets/svges/docker.svg +3 -0
- package/assets/svges/dollar-circle.svg +4 -0
- package/assets/svges/dollar.svg +3 -0
- package/assets/svges/double-quotes-end-1.svg +4 -0
- package/assets/svges/download-1.svg +4 -0
- package/assets/svges/download-circle-1.svg +4 -0
- package/assets/svges/dribbble-symbol.svg +3 -0
- package/assets/svges/dribbble.svg +3 -0
- package/assets/svges/drizzle.svg +6 -0
- package/assets/svges/dropbox.svg +7 -0
- package/assets/svges/drupal.svg +3 -0
- package/assets/svges/dumbbell-1.svg +3 -0
- package/assets/svges/edge.svg +3 -0
- package/assets/svges/emoji-expressionless-flat-eyes.svg +6 -0
- package/assets/svges/emoji-expressionless.svg +6 -0
- package/assets/svges/emoji-grin.svg +6 -0
- package/assets/svges/emoji-sad.svg +6 -0
- package/assets/svges/emoji-smile-side.svg +6 -0
- package/assets/svges/emoji-smile-sunglass.svg +5 -0
- package/assets/svges/emoji-smile-tongue.svg +3 -0
- package/assets/svges/emoji-smile.svg +6 -0
- package/assets/svges/enter-down.svg +4 -0
- package/assets/svges/enter.svg +4 -0
- package/assets/svges/envato.svg +4 -0
- package/assets/svges/envelope-1.svg +3 -0
- package/assets/svges/eraser-1.svg +4 -0
- package/assets/svges/ethereum-logo.svg +4 -0
- package/assets/svges/euro.svg +3 -0
- package/assets/svges/exit-up.svg +4 -0
- package/assets/svges/exit.svg +4 -0
- package/assets/svges/expand-arrow-1.svg +3 -0
- package/assets/svges/expand-square-4.svg +6 -0
- package/assets/svges/expressjs.svg +4 -0
- package/assets/svges/eye.svg +4 -0
- package/assets/svges/facebook-messenger.svg +3 -0
- package/assets/svges/facebook-rounded.svg +4 -0
- package/assets/svges/facebook-square.svg +3 -0
- package/assets/svges/facebook.svg +3 -0
- package/assets/svges/facetime.svg +3 -0
- package/assets/svges/figma.svg +3 -0
- package/assets/svges/file-format-zip.svg +4 -0
- package/assets/svges/file-multiple.svg +4 -0
- package/assets/svges/file-pencil.svg +4 -0
- package/assets/svges/file-plus-circle.svg +5 -0
- package/assets/svges/file-question.svg +5 -0
- package/assets/svges/file-xmark.svg +4 -0
- package/assets/svges/firebase.svg +3 -0
- package/assets/svges/firefox.svg +3 -0
- package/assets/svges/firework-rocket-4.svg +3 -0
- package/assets/svges/fitbit.svg +3 -0
- package/assets/svges/flag-1.svg +3 -0
- package/assets/svges/flag-2.svg +3 -0
- package/assets/svges/flickr.svg +4 -0
- package/assets/svges/floppy-disk-1.svg +3 -0
- package/assets/svges/flower-2.svg +3 -0
- package/assets/svges/flutter.svg +3 -0
- package/assets/svges/folder-1.svg +3 -0
- package/assets/svges/ford.svg +3 -0
- package/assets/svges/framer.svg +3 -0
- package/assets/svges/funnel-1.svg +3 -0
- package/assets/svges/gallery.svg +4 -0
- package/assets/svges/game-pad-modern-1.svg +6 -0
- package/assets/svges/gatsby.svg +3 -0
- package/assets/svges/gauge-1.svg +5 -0
- package/assets/svges/gear-1.svg +4 -0
- package/assets/svges/gears-3.svg +6 -0
- package/assets/svges/gemini.svg +3 -0
- package/assets/svges/git.svg +3 -0
- package/assets/svges/github.svg +3 -0
- package/assets/svges/glass-juice-1.svg +3 -0
- package/assets/svges/globe-1.svg +3 -0
- package/assets/svges/globe-stand.svg +4 -0
- package/assets/svges/go.svg +7 -0
- package/assets/svges/goodreads.svg +3 -0
- package/assets/svges/google-cloud.svg +3 -0
- package/assets/svges/google-drive.svg +3 -0
- package/assets/svges/google-meet.svg +3 -0
- package/assets/svges/google-pay.svg +3 -0
- package/assets/svges/google-wallet.svg +3 -0
- package/assets/svges/google.svg +3 -0
- package/assets/svges/graduation-cap-1.svg +3 -0
- package/assets/svges/grammarly.svg +3 -0
- package/assets/svges/hacker-news.svg +3 -0
- package/assets/svges/hammer-1.svg +3 -0
- package/assets/svges/hammer-2.svg +3 -0
- package/assets/svges/hand-mic.svg +3 -0
- package/assets/svges/hand-shake.svg +3 -0
- package/assets/svges/hand-stop.svg +3 -0
- package/assets/svges/hand-taking-dollar.svg +4 -0
- package/assets/svges/hand-taking-leaf-1.svg +5 -0
- package/assets/svges/hand-taking-user.svg +5 -0
- package/assets/svges/hashnode.svg +3 -0
- package/assets/svges/hat-chef-3.svg +3 -0
- package/assets/svges/headphone-1.svg +3 -0
- package/assets/svges/heart.svg +3 -0
- package/assets/svges/helicopter-2.svg +4 -0
- package/assets/svges/helmet-safety-1.svg +3 -0
- package/assets/svges/hierarchy-1.svg +9 -0
- package/assets/svges/highlighter-1.svg +3 -0
- package/assets/svges/highlighter-2.svg +3 -0
- package/assets/svges/home-2.svg +3 -0
- package/assets/svges/hospital-2.svg +4 -0
- package/assets/svges/hourglass.svg +3 -0
- package/assets/svges/html5.svg +4 -0
- package/assets/svges/ibm.svg +3 -0
- package/assets/svges/id-card.svg +7 -0
- package/assets/svges/imdb.svg +7 -0
- package/assets/svges/indent.svg +8 -0
- package/assets/svges/info.svg +4 -0
- package/assets/svges/injection-1.svg +3 -0
- package/assets/svges/instagram-logotype.svg +3 -0
- package/assets/svges/instagram.svg +4 -0
- package/assets/svges/intel.svg +4 -0
- package/assets/svges/ios.svg +3 -0
- package/assets/svges/island-2.svg +4 -0
- package/assets/svges/jaguar.svg +3 -0
- package/assets/svges/jamstack.svg +3 -0
- package/assets/svges/java.svg +3 -0
- package/assets/svges/javascript.svg +3 -0
- package/assets/svges/jcb.svg +3 -0
- package/assets/svges/joomla.svg +6 -0
- package/assets/svges/jsfiddle.svg +4 -0
- package/assets/svges/key-1.svg +3 -0
- package/assets/svges/keyboard.svg +12 -0
- package/assets/svges/knife-fork-1.svg +5 -0
- package/assets/svges/kubernetes.svg +11 -0
- package/assets/svges/label-dollar-2.svg +4 -0
- package/assets/svges/laptop-2.svg +3 -0
- package/assets/svges/laptop-phone.svg +5 -0
- package/assets/svges/laravel.svg +3 -0
- package/assets/svges/layers-1.svg +4 -0
- package/assets/svges/layout-26.svg +3 -0
- package/assets/svges/layout-9.svg +3 -0
- package/assets/svges/leaf-1.svg +3 -0
- package/assets/svges/leaf-6.svg +4 -0
- package/assets/svges/lemon-squeezy.svg +6 -0
- package/assets/svges/life-guard-tube-1.svg +3 -0
- package/assets/svges/line-dashed.svg +5 -0
- package/assets/svges/line-dotted.svg +8 -0
- package/assets/svges/line-height.svg +7 -0
- package/assets/svges/line.svg +3 -0
- package/assets/svges/lineicons.svg +6 -0
- package/assets/svges/link-2-angular-right.svg +3 -0
- package/assets/svges/linkedin.svg +3 -0
- package/assets/svges/location-arrow-right.svg +3 -0
- package/assets/svges/locked-1.svg +4 -0
- package/assets/svges/locked-2.svg +4 -0
- package/assets/svges/loom.svg +3 -0
- package/assets/svges/magento.svg +4 -0
- package/assets/svges/magnet.svg +3 -0
- package/assets/svges/mailchimp.svg +3 -0
- package/assets/svges/map-marker-1.svg +6 -0
- package/assets/svges/map-marker-5.svg +4 -0
- package/assets/svges/map-pin-5.svg +3 -0
- package/assets/svges/markdown.svg +5 -0
- package/assets/svges/mastercard.svg +7 -0
- package/assets/svges/medium-alt.svg +3 -0
- package/assets/svges/medium.svg +3 -0
- package/assets/svges/megaphone-1.svg +3 -0
- package/assets/svges/menu-cheesburger.svg +8 -0
- package/assets/svges/menu-hamburger-1.svg +5 -0
- package/assets/svges/menu-meatballs-1.svg +5 -0
- package/assets/svges/menu-meatballs-2.svg +5 -0
- package/assets/svges/mercedes.svg +3 -0
- package/assets/svges/message-2-question.svg +5 -0
- package/assets/svges/message-2.svg +3 -0
- package/assets/svges/message-3-text.svg +5 -0
- package/assets/svges/meta-alt.svg +3 -0
- package/assets/svges/meta.svg +7 -0
- package/assets/svges/microphone-1.svg +4 -0
- package/assets/svges/microscope.svg +3 -0
- package/assets/svges/microsoft-edge.svg +5 -0
- package/assets/svges/microsoft-teams.svg +6 -0
- package/assets/svges/microsoft.svg +6 -0
- package/assets/svges/minus-circle.svg +4 -0
- package/assets/svges/minus.svg +3 -0
- package/assets/svges/mongodb.svg +3 -0
- package/assets/svges/monitor-code.svg +5 -0
- package/assets/svges/monitor-mac.svg +3 -0
- package/assets/svges/monitor.svg +3 -0
- package/assets/svges/moon-half-right-5.svg +3 -0
- package/assets/svges/mountains-2.svg +3 -0
- package/assets/svges/mouse-2.svg +3 -0
- package/assets/svges/mushroom-1.svg +3 -0
- package/assets/svges/mushroom-5.svg +6 -0
- package/assets/svges/music.svg +3 -0
- package/assets/svges/mysql.svg +3 -0
- package/assets/svges/nasa.svg +3 -0
- package/assets/svges/netflix.svg +3 -0
- package/assets/svges/netlify.svg +3 -0
- package/assets/svges/next-step-2.svg +3 -0
- package/assets/svges/nextjs.svg +3 -0
- package/assets/svges/nike.svg +3 -0
- package/assets/svges/nissan.svg +3 -0
- package/assets/svges/nodejs-alt.svg +3 -0
- package/assets/svges/nodejs.svg +3 -0
- package/assets/svges/notebook-1.svg +3 -0
- package/assets/svges/notion.svg +3 -0
- package/assets/svges/npm.svg +3 -0
- package/assets/svges/nuxt.svg +3 -0
- package/assets/svges/nvidia.svg +3 -0
- package/assets/svges/oculus.svg +4 -0
- package/assets/svges/open-ai.svg +3 -0
- package/assets/svges/opera-mini.svg +3 -0
- package/assets/svges/oracle.svg +3 -0
- package/assets/svges/outdent.svg +8 -0
- package/assets/svges/paddle.svg +3 -0
- package/assets/svges/page-break-1.svg +7 -0
- package/assets/svges/pagination.svg +7 -0
- package/assets/svges/paint-bucket.svg +3 -0
- package/assets/svges/paint-roller-1.svg +3 -0
- package/assets/svges/paperclip-1.svg +3 -0
- package/assets/svges/party-flags.svg +3 -0
- package/assets/svges/party-spray.svg +3 -0
- package/assets/svges/patreon.svg +3 -0
- package/assets/svges/pause.svg +4 -0
- package/assets/svges/payoneer.svg +4 -0
- package/assets/svges/paypal.svg +4 -0
- package/assets/svges/pen-to-square.svg +4 -0
- package/assets/svges/pencil-1.svg +3 -0
- package/assets/svges/pepsi.svg +4 -0
- package/assets/svges/phone.svg +4 -0
- package/assets/svges/photos.svg +4 -0
- package/assets/svges/php.svg +3 -0
- package/assets/svges/pie-chart-2.svg +3 -0
- package/assets/svges/pilcrow.svg +3 -0
- package/assets/svges/pimjo-logo.svg +9 -0
- package/assets/svges/pimjo-symbol.svg +3 -0
- package/assets/svges/pinterest.svg +3 -0
- package/assets/svges/pizza-2.svg +6 -0
- package/assets/svges/placeholder-dollar.svg +4 -0
- package/assets/svges/plantscale.svg +3 -0
- package/assets/svges/play-store.svg +3 -0
- package/assets/svges/play.svg +3 -0
- package/assets/svges/playstation.svg +5 -0
- package/assets/svges/plug-1.svg +3 -0
- package/assets/svges/plus-circle.svg +4 -0
- package/assets/svges/plus.svg +3 -0
- package/assets/svges/pnpm.svg +10 -0
- package/assets/svges/postgresql.svg +3 -0
- package/assets/svges/postman.svg +3 -0
- package/assets/svges/pound.svg +3 -0
- package/assets/svges/power-button.svg +4 -0
- package/assets/svges/previous-step-2.svg +3 -0
- package/assets/svges/printer.svg +3 -0
- package/assets/svges/prisma.svg +3 -0
- package/assets/svges/producthunt.svg +4 -0
- package/assets/svges/proton-mail-logo.svg +3 -0
- package/assets/svges/proton-mail-symbol.svg +3 -0
- package/assets/svges/python.svg +3 -0
- package/assets/svges/question-mark-circle.svg +5 -0
- package/assets/svges/question-mark.svg +4 -0
- package/assets/svges/quora.svg +4 -0
- package/assets/svges/radis.svg +3 -0
- package/assets/svges/react.svg +3 -0
- package/assets/svges/reddit.svg +6 -0
- package/assets/svges/refresh-circle-1-clockwise.svg +4 -0
- package/assets/svges/refresh-dollar-1.svg +5 -0
- package/assets/svges/refresh-user-1.svg +6 -0
- package/assets/svges/remix-js.svg +4 -0
- package/assets/svges/road-1.svg +6 -0
- package/assets/svges/rocket-5.svg +5 -0
- package/assets/svges/route-1.svg +7 -0
- package/assets/svges/rss-right.svg +6 -0
- package/assets/svges/ruler-1.svg +3 -0
- package/assets/svges/ruler-pen.svg +4 -0
- package/assets/svges/rupee.svg +3 -0
- package/assets/svges/safari.svg +35 -0
- package/assets/svges/sanity.svg +20 -0
- package/assets/svges/school-bench-1.svg +4 -0
- package/assets/svges/school-bench-2.svg +4 -0
- package/assets/svges/scissors-1-vertical.svg +4 -0
- package/assets/svges/scoter.svg +8 -0
- package/assets/svges/scroll-down-2.svg +6 -0
- package/assets/svges/search-1.svg +3 -0
- package/assets/svges/search-2.svg +4 -0
- package/assets/svges/search-minus.svg +4 -0
- package/assets/svges/search-plus.svg +4 -0
- package/assets/svges/search-text.svg +5 -0
- package/assets/svges/select-cursor-1.svg +10 -0
- package/assets/svges/seo-monitor.svg +6 -0
- package/assets/svges/service-bell-1.svg +3 -0
- package/assets/svges/share-1-circle.svg +4 -0
- package/assets/svges/share-1.svg +3 -0
- package/assets/svges/share-2.svg +4 -0
- package/assets/svges/shield-2-check.svg +4 -0
- package/assets/svges/shield-2.svg +3 -0
- package/assets/svges/shield-dollar.svg +4 -0
- package/assets/svges/shift-left.svg +4 -0
- package/assets/svges/shift-right.svg +4 -0
- package/assets/svges/ship-1.svg +5 -0
- package/assets/svges/shirt-1.svg +3 -0
- package/assets/svges/shopify.svg +3 -0
- package/assets/svges/shovel.svg +3 -0
- package/assets/svges/shuffle.svg +3 -0
- package/assets/svges/sign-post-left.svg +3 -0
- package/assets/svges/signal-app.svg +3 -0
- package/assets/svges/signs-post-2.svg +3 -0
- package/assets/svges/sketch.svg +3 -0
- package/assets/svges/skype.svg +3 -0
- package/assets/svges/slack.svg +10 -0
- package/assets/svges/slice-2.svg +3 -0
- package/assets/svges/sliders-horizontal-square-2.svg +7 -0
- package/assets/svges/slideshare.svg +5 -0
- package/assets/svges/snapchat.svg +3 -0
- package/assets/svges/sort-alphabetical.svg +5 -0
- package/assets/svges/sort-high-to-low.svg +7 -0
- package/assets/svges/soundcloud.svg +3 -0
- package/assets/svges/spacex.svg +4 -0
- package/assets/svges/spellcheck.svg +4 -0
- package/assets/svges/spinner-2-sacle.svg +10 -0
- package/assets/svges/spinner-3.svg +3 -0
- package/assets/svges/sports.svg +3 -0
- package/assets/svges/spotify-alt.svg +6 -0
- package/assets/svges/spotify.svg +3 -0
- package/assets/svges/squarespace.svg +3 -0
- package/assets/svges/stackoverflow.svg +8 -0
- package/assets/svges/stamp.svg +3 -0
- package/assets/svges/star-fat-half-2.svg +4 -0
- package/assets/svges/star-fat.svg +3 -0
- package/assets/svges/star-sharp-disabled.svg +4 -0
- package/assets/svges/statista.svg +3 -0
- package/assets/svges/steam.svg +5 -0
- package/assets/svges/stethoscope-1.svg +3 -0
- package/assets/svges/stopwatch.svg +5 -0
- package/assets/svges/storage-hdd-2.svg +4 -0
- package/assets/svges/strikethrough-1.svg +5 -0
- package/assets/svges/stripe.svg +9 -0
- package/assets/svges/stumbleupon.svg +3 -0
- package/assets/svges/sun-1.svg +11 -0
- package/assets/svges/supabase.svg +5 -0
- package/assets/svges/surfboard-2.svg +3 -0
- package/assets/svges/svelte.svg +3 -0
- package/assets/svges/swift.svg +3 -0
- package/assets/svges/tab.svg +4 -0
- package/assets/svges/tailwindcss.svg +3 -0
- package/assets/svges/target-user.svg +5 -0
- package/assets/svges/telegram.svg +3 -0
- package/assets/svges/telephone-1.svg +4 -0
- package/assets/svges/telephone-3.svg +5 -0
- package/assets/svges/tesla.svg +3 -0
- package/assets/svges/text-format-remove.svg +5 -0
- package/assets/svges/text-format.svg +5 -0
- package/assets/svges/text-paragraph.svg +6 -0
- package/assets/svges/thumbs-down-3.svg +3 -0
- package/assets/svges/thumbs-up-3.svg +3 -0
- package/assets/svges/ticket-1.svg +3 -0
- package/assets/svges/tickets-3.svg +7 -0
- package/assets/svges/tiktok-alt.svg +3 -0
- package/assets/svges/tiktok.svg +3 -0
- package/assets/svges/tower-broadcast-1.svg +7 -0
- package/assets/svges/toyota.svg +4 -0
- package/assets/svges/train-1.svg +4 -0
- package/assets/svges/train-3.svg +5 -0
- package/assets/svges/trash-3.svg +5 -0
- package/assets/svges/tree-2.svg +3 -0
- package/assets/svges/trees-3.svg +3 -0
- package/assets/svges/trello.svg +3 -0
- package/assets/svges/trend-down-1.svg +3 -0
- package/assets/svges/trend-up-1.svg +3 -0
- package/assets/svges/trophy-1.svg +3 -0
- package/assets/svges/trowel-1.svg +3 -0
- package/assets/svges/truck-delivery-1.svg +3 -0
- package/assets/svges/tumblr.svg +3 -0
- package/assets/svges/turborepo.svg +4 -0
- package/assets/svges/twitch.svg +3 -0
- package/assets/svges/twitter-old.svg +3 -0
- package/assets/svges/typescript.svg +3 -0
- package/assets/svges/uber-symbol.svg +3 -0
- package/assets/svges/uber.svg +3 -0
- package/assets/svges/ubuntu.svg +3 -0
- package/assets/svges/underline.svg +4 -0
- package/assets/svges/unlink-2-angular-eft.svg +8 -0
- package/assets/svges/unlocked-2.svg +4 -0
- package/assets/svges/unsplash.svg +4 -0
- package/assets/svges/upload-1.svg +4 -0
- package/assets/svges/upload-circle-1.svg +4 -0
- package/assets/svges/user-4.svg +4 -0
- package/assets/svges/user-multiple-4.svg +6 -0
- package/assets/svges/vector-nodes-6.svg +3 -0
- package/assets/svges/vector-nodes-7.svg +3 -0
- package/assets/svges/vercel.svg +3 -0
- package/assets/svges/vimeo.svg +3 -0
- package/assets/svges/visa.svg +3 -0
- package/assets/svges/vite.svg +6 -0
- package/assets/svges/vk.svg +3 -0
- package/assets/svges/vmware.svg +4 -0
- package/assets/svges/volkswagen.svg +8 -0
- package/assets/svges/volume-1.svg +5 -0
- package/assets/svges/volume-high.svg +6 -0
- package/assets/svges/volume-low.svg +4 -0
- package/assets/svges/volume-mute.svg +6 -0
- package/assets/svges/volume-off.svg +3 -0
- package/assets/svges/vs-code.svg +3 -0
- package/assets/svges/vuejs.svg +3 -0
- package/assets/svges/wallet-1.svg +3 -0
- package/assets/svges/watch-beat-1.svg +4 -0
- package/assets/svges/water-drop-1.svg +4 -0
- package/assets/svges/webflow.svg +3 -0
- package/assets/svges/webhooks.svg +3 -0
- package/assets/svges/wechat.svg +4 -0
- package/assets/svges/weight-machine-1.svg +4 -0
- package/assets/svges/whatsapp.svg +3 -0
- package/assets/svges/wheelbarrow-empty.svg +3 -0
- package/assets/svges/wheelchair-1.svg +3 -0
- package/assets/svges/windows.svg +6 -0
- package/assets/svges/wise.svg +3 -0
- package/assets/svges/wordpress.svg +3 -0
- package/assets/svges/www-cursor.svg +5 -0
- package/assets/svges/www.svg +4 -0
- package/assets/svges/x.svg +3 -0
- package/assets/svges/xampp.svg +5 -0
- package/assets/svges/xbox.svg +6 -0
- package/assets/svges/xmark-circle.svg +4 -0
- package/assets/svges/xmark.svg +3 -0
- package/assets/svges/xrp.svg +3 -0
- package/assets/svges/yahoo.svg +3 -0
- package/assets/svges/yarn.svg +4 -0
- package/assets/svges/ycombinator.svg +3 -0
- package/assets/svges/yen.svg +3 -0
- package/assets/svges/youtube-kids.svg +3 -0
- package/assets/svges/youtube-music.svg +4 -0
- package/assets/svges/youtube.svg +3 -0
- package/assets/svges/zapier.svg +3 -0
- package/assets/svges/zero-size.svg +6 -0
- package/assets/svges/zoom.svg +4 -0
- package/bin/test-svger.js +163 -0
- package/dist/__tests__/__mocks__/visual-diff.d.ts +7 -0
- package/dist/__tests__/__mocks__/visual-diff.js +13 -0
- package/dist/__tests__/fixtures.js +18 -18
- package/dist/cli.js +148 -2
- package/dist/config.js +4 -1
- package/dist/core/enhanced-plugin-manager.d.ts +107 -0
- package/dist/core/enhanced-plugin-manager.js +315 -0
- package/dist/core/error-handler.d.ts +1 -1
- package/dist/core/error-handler.js +14 -17
- package/dist/core/framework-templates.js +37 -47
- package/dist/core/logger.js +0 -1
- package/dist/core/performance-engine.js +10 -15
- package/dist/core/plugin-manager.js +4 -4
- package/dist/core/style-compiler.d.ts +0 -1
- package/dist/core/style-compiler.js +3 -6
- package/dist/index.d.ts +4 -0
- package/dist/index.js +4 -0
- package/dist/integrations/babel.d.ts +1 -1
- package/dist/integrations/babel.js +31 -12
- package/dist/integrations/jest-preset.js +1 -1
- package/dist/integrations/rollup.js +29 -10
- package/dist/integrations/vite.js +29 -14
- package/dist/integrations/webpack.d.ts +1 -0
- package/dist/integrations/webpack.js +29 -10
- package/dist/optimizers/advanced-stages.d.ts +40 -0
- package/dist/optimizers/advanced-stages.js +297 -0
- package/dist/optimizers/basic-cleaner.d.ts +68 -0
- package/dist/optimizers/basic-cleaner.js +198 -0
- package/dist/optimizers/collapse-useless-groups.d.ts +26 -0
- package/dist/optimizers/collapse-useless-groups.js +104 -0
- package/dist/optimizers/command-optimizer.d.ts +48 -0
- package/dist/optimizers/command-optimizer.js +299 -0
- package/dist/optimizers/index.d.ts +14 -0
- package/dist/optimizers/index.js +15 -0
- package/dist/optimizers/move-attrs-to-parent.d.ts +31 -0
- package/dist/optimizers/move-attrs-to-parent.js +115 -0
- package/dist/optimizers/numeric-optimizer.d.ts +43 -0
- package/dist/optimizers/numeric-optimizer.js +383 -0
- package/dist/optimizers/optimizer-pipeline.d.ts +39 -0
- package/dist/optimizers/optimizer-pipeline.js +81 -0
- package/dist/optimizers/path-deduplicator.d.ts +37 -0
- package/dist/optimizers/path-deduplicator.js +406 -0
- package/dist/optimizers/path-parser.d.ts +60 -0
- package/dist/optimizers/path-parser.js +428 -0
- package/dist/optimizers/path-shortener.d.ts +41 -0
- package/dist/optimizers/path-shortener.js +274 -0
- package/dist/optimizers/path-simplifier.d.ts +30 -0
- package/dist/optimizers/path-simplifier.js +326 -0
- package/dist/optimizers/remove-hidden-empty.d.ts +29 -0
- package/dist/optimizers/remove-hidden-empty.js +130 -0
- package/dist/optimizers/remove-unused-defs.d.ts +24 -0
- package/dist/optimizers/remove-unused-defs.js +132 -0
- package/dist/optimizers/shape-conversion.d.ts +74 -0
- package/dist/optimizers/shape-conversion.js +277 -0
- package/dist/optimizers/style-optimizer.d.ts +30 -0
- package/dist/optimizers/style-optimizer.js +324 -0
- package/dist/optimizers/svg-tree-parser.d.ts +55 -0
- package/dist/optimizers/svg-tree-parser.js +352 -0
- package/dist/optimizers/transform-collapsing.d.ts +38 -0
- package/dist/optimizers/transform-collapsing.js +444 -0
- package/dist/optimizers/transform-optimizer.d.ts +65 -0
- package/dist/optimizers/transform-optimizer.js +320 -0
- package/dist/optimizers/tree-serializer.d.ts +46 -0
- package/dist/optimizers/tree-serializer.js +190 -0
- package/dist/optimizers/tree-stages.d.ts +27 -0
- package/dist/optimizers/tree-stages.js +141 -0
- package/dist/optimizers/types.d.ts +207 -0
- package/dist/optimizers/types.js +122 -0
- package/dist/plugins/color-replacer.d.ts +39 -0
- package/dist/plugins/color-replacer.js +126 -0
- package/dist/plugins/gradient-optimizer.d.ts +33 -0
- package/dist/plugins/gradient-optimizer.js +197 -0
- package/dist/plugins/stroke-normalizer.d.ts +33 -0
- package/dist/plugins/stroke-normalizer.js +166 -0
- package/dist/plugins/watermark-remover.d.ts +32 -0
- package/dist/plugins/watermark-remover.js +133 -0
- package/dist/processors/svg-processor.d.ts +17 -2
- package/dist/processors/svg-processor.js +108 -32
- package/dist/services/config.d.ts +4 -0
- package/dist/services/config.js +62 -1
- package/dist/services/file-watcher.d.ts +1 -1
- package/dist/services/file-watcher.js +1 -1
- package/dist/services/svg-service.d.ts +6 -0
- package/dist/services/svg-service.js +66 -16
- package/dist/types/index.d.ts +1 -0
- package/dist/types/plugin-system.d.ts +153 -0
- package/dist/types/plugin-system.js +5 -0
- package/dist/utils/visual-diff.d.ts +150 -0
- package/dist/utils/visual-diff.js +247 -0
- package/dist/watch.js +0 -2
- package/docs/COMPLETE-ACHIEVEMENT-SUMMARY.md +401 -0
- package/docs/MIGRATION-4.0.0.md +271 -0
- package/docs/PIPELINE-INTEGRATION.md +406 -0
- package/docs/PLUGIN-DEVELOPMENT-GUIDE.md +807 -0
- package/docs/QUICK-REFERENCE.md +176 -0
- package/docs/SAMPLE-SVGS-TESTING.md +276 -0
- package/docs/archive/PHASE-1-ARCHITECTURE.md +345 -0
- package/docs/archive/PHASE-1-IMPLEMENTATION.md +307 -0
- package/docs/archive/PHASE-1-SUMMARY.md +298 -0
- package/docs/archive/PHASE-2-COMPLETE.md +207 -0
- package/docs/archive/PHASE-3-SUMMARY.md +149 -0
- package/docs/archive/PHASE-4.3-COMMAND-OPTIMIZER.md +323 -0
- package/docs/archive/PHASE-4.4-PATH-SIMPLIFICATION.md +81 -0
- package/docs/archive/PHASE-4.5-PATH-DEDUPLICATION.md +449 -0
- package/docs/archive/PHASE-5.1-SUCCESS-REPORT.md +207 -0
- package/docs/archive/PHASE-5.1-TRANSFORM-COLLAPSING.md +362 -0
- package/docs/archive/PHASE-6.1-SHAPE-CONVERSION-DESIGN.md +518 -0
- package/docs/archive/PHASE-6.2-PLUGIN-SYSTEM-STATUS.md +403 -0
- package/docs/archive/PHASE-6.3-FINAL-STATUS.md +193 -0
- package/docs/archive/PHASE-6.3-VALIDATION-PROGRESS.md +345 -0
- package/docs/archive/PHASE-6.3-VISUAL-DIFF-DESIGN.md +553 -0
- package/docs/archive/PHASE-6.3-VISUAL-DIFF-SUMMARY.md +367 -0
- package/docs/archive/PHASE-6.3-XML-SERIALIZATION-FIX.md +210 -0
- package/docs/archive/RELEASE-NOTES-3.2.0.md +344 -0
- package/docs/archive/RELEASE-PREP-3.2.0.md +376 -0
- package/docs/performance/PERFORMANCE-RESULTS.md +31 -0
- package/docs/performance/REAL-WORLD-BENCHMARKS.md +159 -0
- package/package.json +16 -6
- package/DEVELOPMENT.md +0 -353
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 3: Numeric & Attribute Optimizer
|
|
3
|
+
*
|
|
4
|
+
* Responsibilities:
|
|
5
|
+
* 1. Round floating-point numbers with configurable precision
|
|
6
|
+
* 2. Optimize color representations (#RRGGBB → #RGB, named → hex)
|
|
7
|
+
* 3. Remove default/unnecessary attributes
|
|
8
|
+
* 4. Shorten numeric values (remove trailing zeros, unnecessary decimals)
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* SVG default attribute values by element type
|
|
12
|
+
* Only remove if value matches default exactly
|
|
13
|
+
*/
|
|
14
|
+
const SVG_DEFAULTS = {
|
|
15
|
+
'*': {
|
|
16
|
+
// Universal defaults
|
|
17
|
+
fill: 'black',
|
|
18
|
+
'fill-opacity': '1',
|
|
19
|
+
'fill-rule': 'nonzero',
|
|
20
|
+
stroke: 'none',
|
|
21
|
+
'stroke-width': '1',
|
|
22
|
+
'stroke-opacity': '1',
|
|
23
|
+
'stroke-linecap': 'butt',
|
|
24
|
+
'stroke-linejoin': 'miter',
|
|
25
|
+
'stroke-miterlimit': '4',
|
|
26
|
+
opacity: '1',
|
|
27
|
+
visibility: 'visible',
|
|
28
|
+
display: 'inline',
|
|
29
|
+
},
|
|
30
|
+
text: {
|
|
31
|
+
'font-size': '16',
|
|
32
|
+
'font-family': 'sans-serif',
|
|
33
|
+
'text-anchor': 'start',
|
|
34
|
+
},
|
|
35
|
+
path: {
|
|
36
|
+
'fill-rule': 'nonzero',
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Named CSS colors that can be shortened
|
|
41
|
+
* Maps long color names to shorter hex equivalents
|
|
42
|
+
*/
|
|
43
|
+
const NAMED_COLOR_SHORTCUTS = {
|
|
44
|
+
// Short hex is shorter than name
|
|
45
|
+
white: '#fff',
|
|
46
|
+
black: '#000',
|
|
47
|
+
red: '#f00',
|
|
48
|
+
lime: '#0f0',
|
|
49
|
+
blue: '#00f',
|
|
50
|
+
yellow: '#ff0',
|
|
51
|
+
cyan: '#0ff',
|
|
52
|
+
magenta: '#f0f',
|
|
53
|
+
silver: '#c0c0c0',
|
|
54
|
+
gray: '#808080',
|
|
55
|
+
maroon: '#800000',
|
|
56
|
+
olive: '#808000',
|
|
57
|
+
green: '#008000',
|
|
58
|
+
purple: '#800080',
|
|
59
|
+
teal: '#008080',
|
|
60
|
+
navy: '#000080',
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Hex colors that can use named equivalents (if shorter)
|
|
64
|
+
* Reverse of above - maps hex to name when name is shorter
|
|
65
|
+
*/
|
|
66
|
+
const HEX_TO_NAME = {
|
|
67
|
+
'#f0ffff': 'azure',
|
|
68
|
+
'#f5f5dc': 'beige',
|
|
69
|
+
'#ffe4c4': 'bisque',
|
|
70
|
+
'#a52a2a': 'brown',
|
|
71
|
+
'#ff7f50': 'coral',
|
|
72
|
+
'#ffd700': 'gold',
|
|
73
|
+
'#808080': 'gray',
|
|
74
|
+
'#008000': 'green',
|
|
75
|
+
'#4b0082': 'indigo',
|
|
76
|
+
'#fffff0': 'ivory',
|
|
77
|
+
'#f0e68c': 'khaki',
|
|
78
|
+
'#faf0e6': 'linen',
|
|
79
|
+
'#800000': 'maroon',
|
|
80
|
+
'#000080': 'navy',
|
|
81
|
+
'#808000': 'olive',
|
|
82
|
+
'#ffa500': 'orange',
|
|
83
|
+
'#da70d6': 'orchid',
|
|
84
|
+
'#cd853f': 'peru',
|
|
85
|
+
'#ffc0cb': 'pink',
|
|
86
|
+
'#dda0dd': 'plum',
|
|
87
|
+
'#800080': 'purple',
|
|
88
|
+
'#f00': 'red',
|
|
89
|
+
'#fa8072': 'salmon',
|
|
90
|
+
'#a0522d': 'sienna',
|
|
91
|
+
'#c0c0c0': 'silver',
|
|
92
|
+
'#fffafa': 'snow',
|
|
93
|
+
'#d2b48c': 'tan',
|
|
94
|
+
'#008080': 'teal',
|
|
95
|
+
'#ff6347': 'tomato',
|
|
96
|
+
'#ee82ee': 'violet',
|
|
97
|
+
'#f5deb3': 'wheat',
|
|
98
|
+
};
|
|
99
|
+
/**
|
|
100
|
+
* Round a number to specified decimal places
|
|
101
|
+
* Removes trailing zeros and unnecessary decimal point
|
|
102
|
+
*/
|
|
103
|
+
export function roundNumber(value, precision) {
|
|
104
|
+
if (!isFinite(value)) {
|
|
105
|
+
return String(value);
|
|
106
|
+
}
|
|
107
|
+
// Round to precision
|
|
108
|
+
const multiplier = Math.pow(10, precision);
|
|
109
|
+
const rounded = Math.round(value * multiplier) / multiplier;
|
|
110
|
+
// Convert to string and remove trailing zeros
|
|
111
|
+
let result = rounded.toFixed(precision);
|
|
112
|
+
// Remove trailing zeros after decimal point
|
|
113
|
+
if (result.includes('.')) {
|
|
114
|
+
result = result.replace(/\.?0+$/, '');
|
|
115
|
+
}
|
|
116
|
+
// Handle negative zero
|
|
117
|
+
if (result === '-0') {
|
|
118
|
+
result = '0';
|
|
119
|
+
}
|
|
120
|
+
return result;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Optimize a numeric string value
|
|
124
|
+
* Removes unnecessary decimals, trailing zeros, etc.
|
|
125
|
+
*/
|
|
126
|
+
export function optimizeNumericString(value, precision) {
|
|
127
|
+
// Try to parse as number
|
|
128
|
+
const num = parseFloat(value);
|
|
129
|
+
if (isNaN(num)) {
|
|
130
|
+
return value;
|
|
131
|
+
}
|
|
132
|
+
return roundNumber(num, precision);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Convert rgb(r, g, b) to hex
|
|
136
|
+
*/
|
|
137
|
+
function rgbToHex(r, g, b) {
|
|
138
|
+
const toHex = (n) => {
|
|
139
|
+
const hex = Math.round(n).toString(16);
|
|
140
|
+
return hex.length === 1 ? '0' + hex : hex;
|
|
141
|
+
};
|
|
142
|
+
return '#' + toHex(r) + toHex(g) + toHex(b);
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Shorten hex color #RRGGBB to #RGB if possible
|
|
146
|
+
*/
|
|
147
|
+
function shortenHexColor(hex) {
|
|
148
|
+
// Match #RRGGBB format
|
|
149
|
+
const match = hex.match(/^#([0-9a-f]{6})$/i);
|
|
150
|
+
if (!match) {
|
|
151
|
+
return hex;
|
|
152
|
+
}
|
|
153
|
+
const [, rrggbb] = match;
|
|
154
|
+
const r1 = rrggbb[0];
|
|
155
|
+
const r2 = rrggbb[1];
|
|
156
|
+
const g1 = rrggbb[2];
|
|
157
|
+
const g2 = rrggbb[3];
|
|
158
|
+
const b1 = rrggbb[4];
|
|
159
|
+
const b2 = rrggbb[5];
|
|
160
|
+
// Can shorten if each pair has identical digits
|
|
161
|
+
if (r1 === r2 && g1 === g2 && b1 === b2) {
|
|
162
|
+
return `#${r1}${g1}${b1}`.toLowerCase();
|
|
163
|
+
}
|
|
164
|
+
return hex.toLowerCase();
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Optimize color value to shortest representation
|
|
168
|
+
* Handles: named colors, hex colors, rgb() notation
|
|
169
|
+
*/
|
|
170
|
+
export function optimizeColor(color) {
|
|
171
|
+
const trimmed = color.trim().toLowerCase();
|
|
172
|
+
// Handle named colors → hex
|
|
173
|
+
if (NAMED_COLOR_SHORTCUTS[trimmed]) {
|
|
174
|
+
return NAMED_COLOR_SHORTCUTS[trimmed];
|
|
175
|
+
}
|
|
176
|
+
// Handle rgb(r, g, b) notation
|
|
177
|
+
const rgbMatch = trimmed.match(/^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/);
|
|
178
|
+
if (rgbMatch) {
|
|
179
|
+
const r = parseInt(rgbMatch[1], 10);
|
|
180
|
+
const g = parseInt(rgbMatch[2], 10);
|
|
181
|
+
const b = parseInt(rgbMatch[3], 10);
|
|
182
|
+
const hex = rgbToHex(r, g, b);
|
|
183
|
+
return shortenHexColor(hex);
|
|
184
|
+
}
|
|
185
|
+
// Handle rgba with alpha=1 (can drop alpha)
|
|
186
|
+
const rgbaMatch = trimmed.match(/^rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*1(\.0*)?\s*\)$/);
|
|
187
|
+
if (rgbaMatch) {
|
|
188
|
+
const r = parseInt(rgbaMatch[1], 10);
|
|
189
|
+
const g = parseInt(rgbaMatch[2], 10);
|
|
190
|
+
const b = parseInt(rgbaMatch[3], 10);
|
|
191
|
+
const hex = rgbToHex(r, g, b);
|
|
192
|
+
return shortenHexColor(hex);
|
|
193
|
+
}
|
|
194
|
+
// Handle hex colors
|
|
195
|
+
if (trimmed.startsWith('#')) {
|
|
196
|
+
const shortened = shortenHexColor(trimmed);
|
|
197
|
+
// Check if a named color is shorter
|
|
198
|
+
const named = HEX_TO_NAME[shortened];
|
|
199
|
+
if (named && named.length < shortened.length) {
|
|
200
|
+
return named;
|
|
201
|
+
}
|
|
202
|
+
return shortened;
|
|
203
|
+
}
|
|
204
|
+
// Return as-is if no optimization possible
|
|
205
|
+
return color;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Check if attribute value is the default for the element
|
|
209
|
+
*/
|
|
210
|
+
function isDefaultValue(elementTag, attrName, attrValue) {
|
|
211
|
+
// Check element-specific defaults
|
|
212
|
+
const elementDefaults = SVG_DEFAULTS[elementTag];
|
|
213
|
+
if (elementDefaults && elementDefaults[attrName] === attrValue) {
|
|
214
|
+
return true;
|
|
215
|
+
}
|
|
216
|
+
// Check universal defaults
|
|
217
|
+
const universalDefaults = SVG_DEFAULTS['*'];
|
|
218
|
+
if (universalDefaults && universalDefaults[attrName] === attrValue) {
|
|
219
|
+
return true;
|
|
220
|
+
}
|
|
221
|
+
return false;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Optimize a single attribute value
|
|
225
|
+
*/
|
|
226
|
+
function optimizeAttributeValue(attrName, attrValue, config) {
|
|
227
|
+
// Color attributes
|
|
228
|
+
const colorAttrs = new Set([
|
|
229
|
+
'fill',
|
|
230
|
+
'stroke',
|
|
231
|
+
'stop-color',
|
|
232
|
+
'flood-color',
|
|
233
|
+
'lighting-color',
|
|
234
|
+
]);
|
|
235
|
+
if (colorAttrs.has(attrName)) {
|
|
236
|
+
return optimizeColor(attrValue);
|
|
237
|
+
}
|
|
238
|
+
// Numeric attributes
|
|
239
|
+
const numericAttrs = new Set([
|
|
240
|
+
'x',
|
|
241
|
+
'y',
|
|
242
|
+
'cx',
|
|
243
|
+
'cy',
|
|
244
|
+
'r',
|
|
245
|
+
'rx',
|
|
246
|
+
'ry',
|
|
247
|
+
'width',
|
|
248
|
+
'height',
|
|
249
|
+
'x1',
|
|
250
|
+
'y1',
|
|
251
|
+
'x2',
|
|
252
|
+
'y2',
|
|
253
|
+
'stroke-width',
|
|
254
|
+
'font-size',
|
|
255
|
+
'opacity',
|
|
256
|
+
'fill-opacity',
|
|
257
|
+
'stroke-opacity',
|
|
258
|
+
'offset',
|
|
259
|
+
]);
|
|
260
|
+
if (numericAttrs.has(attrName)) {
|
|
261
|
+
return optimizeNumericString(attrValue, config.floatPrecision);
|
|
262
|
+
}
|
|
263
|
+
// Path data (d attribute) - special handling
|
|
264
|
+
if (attrName === 'd') {
|
|
265
|
+
return optimizePathData(attrValue, config.floatPrecision);
|
|
266
|
+
}
|
|
267
|
+
// Points attribute (for polygon/polyline)
|
|
268
|
+
if (attrName === 'points') {
|
|
269
|
+
return optimizePointsData(attrValue, config.floatPrecision);
|
|
270
|
+
}
|
|
271
|
+
// ViewBox
|
|
272
|
+
if (attrName === 'viewBox') {
|
|
273
|
+
return optimizeViewBox(attrValue, config.floatPrecision);
|
|
274
|
+
}
|
|
275
|
+
return attrValue;
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Optimize path data (d attribute)
|
|
279
|
+
* Rounds numbers, removes unnecessary spaces
|
|
280
|
+
*/
|
|
281
|
+
function optimizePathData(pathData, precision) {
|
|
282
|
+
// Replace all numbers with optimized versions
|
|
283
|
+
return pathData.replace(/-?[\d.]+/g, match => {
|
|
284
|
+
const num = parseFloat(match);
|
|
285
|
+
if (isNaN(num)) {
|
|
286
|
+
return match;
|
|
287
|
+
}
|
|
288
|
+
return roundNumber(num, precision);
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Optimize points data (for polygon/polyline)
|
|
293
|
+
*/
|
|
294
|
+
function optimizePointsData(points, precision) {
|
|
295
|
+
// Split by whitespace and/or commas
|
|
296
|
+
const coords = points.split(/[\s,]+/).filter(Boolean);
|
|
297
|
+
// Optimize each coordinate
|
|
298
|
+
const optimized = coords.map(coord => {
|
|
299
|
+
const num = parseFloat(coord);
|
|
300
|
+
if (isNaN(num)) {
|
|
301
|
+
return coord;
|
|
302
|
+
}
|
|
303
|
+
return roundNumber(num, precision);
|
|
304
|
+
});
|
|
305
|
+
// Join with spaces (shortest separator)
|
|
306
|
+
return optimized.join(' ');
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Optimize viewBox attribute
|
|
310
|
+
*/
|
|
311
|
+
function optimizeViewBox(viewBox, precision) {
|
|
312
|
+
const values = viewBox.split(/[\s,]+/).filter(Boolean);
|
|
313
|
+
const optimized = values.map(val => {
|
|
314
|
+
const num = parseFloat(val);
|
|
315
|
+
if (isNaN(num)) {
|
|
316
|
+
return val;
|
|
317
|
+
}
|
|
318
|
+
return roundNumber(num, precision);
|
|
319
|
+
});
|
|
320
|
+
return optimized.join(' ');
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Remove default and unnecessary attributes from a node
|
|
324
|
+
*/
|
|
325
|
+
function removeDefaultAttributes(node) {
|
|
326
|
+
let removedCount = 0;
|
|
327
|
+
const attrsToRemove = [];
|
|
328
|
+
for (const [name, value] of node.attrs) {
|
|
329
|
+
if (isDefaultValue(node.tag, name, value)) {
|
|
330
|
+
attrsToRemove.push(name);
|
|
331
|
+
removedCount++;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
// Remove marked attributes
|
|
335
|
+
for (const name of attrsToRemove) {
|
|
336
|
+
node.attrs.delete(name);
|
|
337
|
+
}
|
|
338
|
+
return removedCount;
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Optimize all numeric values and attributes in the tree
|
|
342
|
+
*/
|
|
343
|
+
export function optimizeNumericValues(root, config) {
|
|
344
|
+
let optimizedAttributes = 0;
|
|
345
|
+
let removedDefaults = 0;
|
|
346
|
+
// Traverse tree
|
|
347
|
+
const traverse = (node) => {
|
|
348
|
+
// Optimize attribute values
|
|
349
|
+
for (const [name, value] of node.attrs) {
|
|
350
|
+
const optimized = optimizeAttributeValue(name, value, config);
|
|
351
|
+
if (optimized !== value) {
|
|
352
|
+
node.attrs.set(name, optimized);
|
|
353
|
+
optimizedAttributes++;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
// Remove default attributes
|
|
357
|
+
if (config.removeUnnecessaryAttrs) {
|
|
358
|
+
const removed = removeDefaultAttributes(node);
|
|
359
|
+
removedDefaults += removed;
|
|
360
|
+
}
|
|
361
|
+
// Recurse to children
|
|
362
|
+
for (const child of node.children) {
|
|
363
|
+
if (child.type === 'element') {
|
|
364
|
+
traverse(child);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
};
|
|
368
|
+
traverse(root);
|
|
369
|
+
return {
|
|
370
|
+
optimizedAttributes,
|
|
371
|
+
removedDefaults,
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Numeric optimization stage for pipeline
|
|
376
|
+
*/
|
|
377
|
+
export function numericOptimizationStage(root, config) {
|
|
378
|
+
const stats = optimizeNumericValues(root, config);
|
|
379
|
+
return {
|
|
380
|
+
modified: stats.optimizedAttributes > 0 || stats.removedDefaults > 0,
|
|
381
|
+
stats,
|
|
382
|
+
};
|
|
383
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Advanced SVG Optimizer Pipeline
|
|
3
|
+
* Pluggable stage-based optimization system
|
|
4
|
+
*/
|
|
5
|
+
import type { OptConfig, OptimizationStage, OptimizationResult } from './types.js';
|
|
6
|
+
import { OptLevel } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* SVG Optimizer Pipeline
|
|
9
|
+
* Orchestrates optimization stages in a composable manner
|
|
10
|
+
*/
|
|
11
|
+
export declare class OptimizerPipeline {
|
|
12
|
+
private stages;
|
|
13
|
+
private config;
|
|
14
|
+
constructor(config?: Partial<OptConfig>);
|
|
15
|
+
/**
|
|
16
|
+
* Register an optimization stage
|
|
17
|
+
*/
|
|
18
|
+
registerStage(name: string, fn: OptimizationStage): this;
|
|
19
|
+
/**
|
|
20
|
+
* Execute optimization pipeline
|
|
21
|
+
*/
|
|
22
|
+
optimize(svgString: string): Promise<OptimizationResult>;
|
|
23
|
+
/**
|
|
24
|
+
* Get current configuration
|
|
25
|
+
*/
|
|
26
|
+
getConfig(): OptConfig;
|
|
27
|
+
/**
|
|
28
|
+
* Update configuration
|
|
29
|
+
*/
|
|
30
|
+
updateConfig(config: Partial<OptConfig>): void;
|
|
31
|
+
/**
|
|
32
|
+
* Clear all registered stages
|
|
33
|
+
*/
|
|
34
|
+
clearStages(): void;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Create a pre-configured optimizer pipeline based on optimization level
|
|
38
|
+
*/
|
|
39
|
+
export declare function createOptimizerPipeline(level?: OptLevel): OptimizerPipeline;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Advanced SVG Optimizer Pipeline
|
|
3
|
+
* Pluggable stage-based optimization system
|
|
4
|
+
*/
|
|
5
|
+
import { OptLevel, getDefaultOptConfig } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* SVG Optimizer Pipeline
|
|
8
|
+
* Orchestrates optimization stages in a composable manner
|
|
9
|
+
*/
|
|
10
|
+
export class OptimizerPipeline {
|
|
11
|
+
stages = [];
|
|
12
|
+
config;
|
|
13
|
+
constructor(config) {
|
|
14
|
+
const level = config?.level || OptLevel.BALANCED;
|
|
15
|
+
this.config = {
|
|
16
|
+
...getDefaultOptConfig(level),
|
|
17
|
+
...config,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Register an optimization stage
|
|
22
|
+
*/
|
|
23
|
+
registerStage(name, fn) {
|
|
24
|
+
this.stages.push({ name, fn });
|
|
25
|
+
return this;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Execute optimization pipeline
|
|
29
|
+
*/
|
|
30
|
+
async optimize(svgString) {
|
|
31
|
+
const originalSize = Buffer.byteLength(svgString, 'utf8');
|
|
32
|
+
let optimizedSvg = svgString;
|
|
33
|
+
const stagesApplied = [];
|
|
34
|
+
// Execute each stage sequentially
|
|
35
|
+
for (const stage of this.stages) {
|
|
36
|
+
try {
|
|
37
|
+
const result = await stage.fn(optimizedSvg, this.config);
|
|
38
|
+
optimizedSvg = result;
|
|
39
|
+
stagesApplied.push(stage.name);
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
console.warn(`⚠️ Stage "${stage.name}" failed, skipping:`, error.message);
|
|
43
|
+
// Continue with other stages even if one fails
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const optimizedSize = Buffer.byteLength(optimizedSvg, 'utf8');
|
|
47
|
+
const reductionPercent = ((originalSize - optimizedSize) / originalSize) * 100;
|
|
48
|
+
return {
|
|
49
|
+
optimizedSvg,
|
|
50
|
+
originalSize,
|
|
51
|
+
optimizedSize,
|
|
52
|
+
reductionPercent,
|
|
53
|
+
stagesApplied,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Get current configuration
|
|
58
|
+
*/
|
|
59
|
+
getConfig() {
|
|
60
|
+
return { ...this.config };
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Update configuration
|
|
64
|
+
*/
|
|
65
|
+
updateConfig(config) {
|
|
66
|
+
this.config = { ...this.config, ...config };
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Clear all registered stages
|
|
70
|
+
*/
|
|
71
|
+
clearStages() {
|
|
72
|
+
this.stages = [];
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Create a pre-configured optimizer pipeline based on optimization level
|
|
77
|
+
*/
|
|
78
|
+
export function createOptimizerPipeline(level = OptLevel.BALANCED) {
|
|
79
|
+
const config = getDefaultOptConfig(level);
|
|
80
|
+
return new OptimizerPipeline(config);
|
|
81
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 4.5: Path Merging + <use> Extraction
|
|
3
|
+
*
|
|
4
|
+
* The ultimate optimization for icon libraries and sprite sheets with repeated shapes.
|
|
5
|
+
* Detects identical shapes and extracts them to <defs> with <use> references.
|
|
6
|
+
*
|
|
7
|
+
* Target: 70-80% reduction on icon sets with duplicates (Material Icons, Font Awesome, etc.)
|
|
8
|
+
*
|
|
9
|
+
* Features:
|
|
10
|
+
* 1. Identical shape detection using path hash + style signature
|
|
11
|
+
* 2. Extract repeated shapes to <defs> and replace with <use>
|
|
12
|
+
* 3. Merge adjacent paths with identical styling
|
|
13
|
+
* 4. Transform-aware deduplication
|
|
14
|
+
* 5. Minimum occurrence threshold (only extract if used 2+ times)
|
|
15
|
+
*
|
|
16
|
+
* This is the crowning achievement that makes svger-cli unbeatable.
|
|
17
|
+
*/
|
|
18
|
+
import type { OptConfig } from './types.js';
|
|
19
|
+
/**
|
|
20
|
+
* Extract repeated shapes to <defs> and replace with <use>
|
|
21
|
+
*/
|
|
22
|
+
export declare function extractRepeatedShapes(svgContent: string, config: OptConfig): {
|
|
23
|
+
result: string;
|
|
24
|
+
shapesExtracted: number;
|
|
25
|
+
bytesReduced: number;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Merge adjacent paths with identical styling
|
|
29
|
+
*/
|
|
30
|
+
export declare function mergeAdjacentPaths(svgContent: string): {
|
|
31
|
+
result: string;
|
|
32
|
+
pathsMerged: number;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Combined path merging and <use> extraction stage
|
|
36
|
+
*/
|
|
37
|
+
export declare function pathDeduplicationStage(svg: string, config: OptConfig): Promise<string>;
|