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,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tree-Based Optimization Stages
|
|
3
|
+
* Wrapper for tree-based optimizations in the optimizer pipeline
|
|
4
|
+
* Handles parse → optimize → serialize cycle
|
|
5
|
+
*/
|
|
6
|
+
import { parseSVG } from './svg-tree-parser.js';
|
|
7
|
+
import { serializeSVGMinified } from './tree-serializer.js';
|
|
8
|
+
import { removeUnusedDefsStage } from './remove-unused-defs.js';
|
|
9
|
+
import { collapseUselessGroupsStage } from './collapse-useless-groups.js';
|
|
10
|
+
import { moveAttributesToParentStage } from './move-attrs-to-parent.js';
|
|
11
|
+
import { removeHiddenAndEmptyElementsStage } from './remove-hidden-empty.js';
|
|
12
|
+
/**
|
|
13
|
+
* Tree-based optimization stage: Remove unused defs
|
|
14
|
+
*/
|
|
15
|
+
export async function treeRemoveUnusedDefsStage(svg, config) {
|
|
16
|
+
// Skip if not enabled for this level
|
|
17
|
+
if (config.level === 'none' || config.level === 'basic') {
|
|
18
|
+
return svg;
|
|
19
|
+
}
|
|
20
|
+
try {
|
|
21
|
+
const tree = parseSVG(svg);
|
|
22
|
+
if (!tree)
|
|
23
|
+
return svg;
|
|
24
|
+
const result = removeUnusedDefsStage(tree);
|
|
25
|
+
if (result.modified) {
|
|
26
|
+
return serializeSVGMinified(tree);
|
|
27
|
+
}
|
|
28
|
+
return svg;
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
console.warn('Tree optimization (remove-unused-defs) failed:', error);
|
|
32
|
+
return svg;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Tree-based optimization stage: Collapse useless groups
|
|
37
|
+
*/
|
|
38
|
+
export async function treeCollapseGroupsStage(svg, config) {
|
|
39
|
+
// Only enabled for aggressive and maximum
|
|
40
|
+
if (!config.collapseGroups) {
|
|
41
|
+
return svg;
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
const tree = parseSVG(svg);
|
|
45
|
+
if (!tree)
|
|
46
|
+
return svg;
|
|
47
|
+
const result = collapseUselessGroupsStage(tree);
|
|
48
|
+
if (result.modified) {
|
|
49
|
+
return serializeSVGMinified(tree);
|
|
50
|
+
}
|
|
51
|
+
return svg;
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
console.warn('Tree optimization (collapse-groups) failed:', error);
|
|
55
|
+
return svg;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Tree-based optimization stage: Move attributes to parent
|
|
60
|
+
*/
|
|
61
|
+
export async function treeMoveAttributesToParentStage(svg, config) {
|
|
62
|
+
// Only enabled for aggressive and maximum
|
|
63
|
+
if (config.level === 'none' || config.level === 'basic') {
|
|
64
|
+
return svg;
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
const tree = parseSVG(svg);
|
|
68
|
+
if (!tree)
|
|
69
|
+
return svg;
|
|
70
|
+
const result = moveAttributesToParentStage(tree);
|
|
71
|
+
if (result.modified) {
|
|
72
|
+
return serializeSVGMinified(tree);
|
|
73
|
+
}
|
|
74
|
+
return svg;
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
console.warn('Tree optimization (move-attrs-to-parent) failed:', error);
|
|
78
|
+
return svg;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Tree-based optimization stage: Remove hidden and empty elements
|
|
83
|
+
*/
|
|
84
|
+
export async function treeRemoveHiddenEmptyStage(svg, config) {
|
|
85
|
+
// Enabled for balanced and above
|
|
86
|
+
if (!config.removeHiddenElements) {
|
|
87
|
+
return svg;
|
|
88
|
+
}
|
|
89
|
+
try {
|
|
90
|
+
const tree = parseSVG(svg);
|
|
91
|
+
if (!tree)
|
|
92
|
+
return svg;
|
|
93
|
+
const result = removeHiddenAndEmptyElementsStage(tree);
|
|
94
|
+
if (result.modified) {
|
|
95
|
+
return serializeSVGMinified(tree);
|
|
96
|
+
}
|
|
97
|
+
return svg;
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
console.warn('Tree optimization (remove-hidden-empty) failed:', error);
|
|
101
|
+
return svg;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Combined tree-based optimization stage
|
|
106
|
+
* Applies all tree optimizations in one pass for efficiency
|
|
107
|
+
*/
|
|
108
|
+
export async function treeOptimizationStage(svg, config) {
|
|
109
|
+
// Skip tree optimizations for none and basic levels
|
|
110
|
+
if (config.level === 'none' || config.level === 'basic') {
|
|
111
|
+
return svg;
|
|
112
|
+
}
|
|
113
|
+
try {
|
|
114
|
+
const tree = parseSVG(svg);
|
|
115
|
+
if (!tree)
|
|
116
|
+
return svg;
|
|
117
|
+
let modified = false;
|
|
118
|
+
// Apply all tree-based optimizations
|
|
119
|
+
const stages = [
|
|
120
|
+
removeUnusedDefsStage,
|
|
121
|
+
removeHiddenAndEmptyElementsStage,
|
|
122
|
+
moveAttributesToParentStage,
|
|
123
|
+
collapseUselessGroupsStage,
|
|
124
|
+
];
|
|
125
|
+
for (const stage of stages) {
|
|
126
|
+
const result = stage(tree);
|
|
127
|
+
if (result.modified) {
|
|
128
|
+
modified = true;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// Serialize only if modified
|
|
132
|
+
if (modified) {
|
|
133
|
+
return serializeSVGMinified(tree);
|
|
134
|
+
}
|
|
135
|
+
return svg;
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
console.warn('Tree optimization failed:', error);
|
|
139
|
+
return svg;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for Advanced SVG Optimizer
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Optimization level enum
|
|
6
|
+
*/
|
|
7
|
+
export declare enum OptLevel {
|
|
8
|
+
NONE = "none",
|
|
9
|
+
BASIC = "basic",
|
|
10
|
+
BALANCED = "balanced",
|
|
11
|
+
AGGRESSIVE = "aggressive",
|
|
12
|
+
MAXIMUM = "maximum"
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Optimization configuration interface
|
|
16
|
+
*/
|
|
17
|
+
export interface OptConfig {
|
|
18
|
+
/**
|
|
19
|
+
* Optimization level
|
|
20
|
+
* @default 'balanced'
|
|
21
|
+
*/
|
|
22
|
+
level: OptLevel;
|
|
23
|
+
/**
|
|
24
|
+
* Float precision for decimal numbers (1-4)
|
|
25
|
+
* @default 3
|
|
26
|
+
*/
|
|
27
|
+
floatPrecision: 1 | 2 | 3 | 4;
|
|
28
|
+
/**
|
|
29
|
+
* Path simplification tolerance (0-1)
|
|
30
|
+
* Higher values = more aggressive simplification
|
|
31
|
+
* @default 0.5
|
|
32
|
+
*/
|
|
33
|
+
pathTolerance: number;
|
|
34
|
+
/**
|
|
35
|
+
* Remove viewBox attribute
|
|
36
|
+
* @default false
|
|
37
|
+
*/
|
|
38
|
+
removeViewBox: boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Remove unnecessary XML declarations and metadata
|
|
41
|
+
* @default true
|
|
42
|
+
*/
|
|
43
|
+
removeMetadata: boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Remove comments
|
|
46
|
+
* @default true
|
|
47
|
+
*/
|
|
48
|
+
removeComments: boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Normalize whitespace
|
|
51
|
+
* @default true
|
|
52
|
+
*/
|
|
53
|
+
normalizeWhitespace: boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Remove unnecessary attributes
|
|
56
|
+
* @default true
|
|
57
|
+
*/
|
|
58
|
+
removeUnnecessaryAttrs: boolean;
|
|
59
|
+
/**
|
|
60
|
+
* Convert colors to shortest form (#ffffff → #fff)
|
|
61
|
+
* @default true
|
|
62
|
+
*/
|
|
63
|
+
shortenColors: boolean;
|
|
64
|
+
/**
|
|
65
|
+
* Merge paths when possible
|
|
66
|
+
* @default false (basic/balanced), true (aggressive/maximum)
|
|
67
|
+
*/
|
|
68
|
+
mergePaths: boolean;
|
|
69
|
+
/**
|
|
70
|
+
* Remove hidden elements (opacity:0, display:none)
|
|
71
|
+
* @default false (basic), true (balanced+)
|
|
72
|
+
*/
|
|
73
|
+
removeHiddenElements: boolean;
|
|
74
|
+
/**
|
|
75
|
+
* Convert style attributes to presentation attributes
|
|
76
|
+
* @default false
|
|
77
|
+
*/
|
|
78
|
+
inlineStyles: boolean;
|
|
79
|
+
/**
|
|
80
|
+
* Remove empty containers (g, defs without children)
|
|
81
|
+
* @default true
|
|
82
|
+
*/
|
|
83
|
+
removeEmptyContainers: boolean;
|
|
84
|
+
/**
|
|
85
|
+
* Collapse useless groups
|
|
86
|
+
* @default false (basic/balanced), true (aggressive/maximum)
|
|
87
|
+
*/
|
|
88
|
+
collapseGroups: boolean;
|
|
89
|
+
/**
|
|
90
|
+
* Convert attributes to camelCase for React compatibility
|
|
91
|
+
* @default true
|
|
92
|
+
*/
|
|
93
|
+
reactCompatibility: boolean;
|
|
94
|
+
/**
|
|
95
|
+
* Sort attributes alphabetically
|
|
96
|
+
* @default false
|
|
97
|
+
*/
|
|
98
|
+
sortAttrs: boolean;
|
|
99
|
+
/**
|
|
100
|
+
* Remove DOCTYPE declarations
|
|
101
|
+
* @default true
|
|
102
|
+
*/
|
|
103
|
+
removeDoctype: boolean;
|
|
104
|
+
/**
|
|
105
|
+
* Remove XML processing instructions
|
|
106
|
+
* @default true
|
|
107
|
+
*/
|
|
108
|
+
removeXMLProcInst: boolean;
|
|
109
|
+
/**
|
|
110
|
+
* Enable numeric optimization (coordinate precision, etc.)
|
|
111
|
+
* @default true
|
|
112
|
+
*/
|
|
113
|
+
enableNumericOptimization: boolean;
|
|
114
|
+
/**
|
|
115
|
+
* Enable style optimization (color shortening, unit removal, etc.)
|
|
116
|
+
* @default true
|
|
117
|
+
*/
|
|
118
|
+
enableStyleOptimization: boolean;
|
|
119
|
+
/**
|
|
120
|
+
* Enable transform optimization (matrix simplification, etc.)
|
|
121
|
+
* @default false (basic/balanced), true (aggressive/maximum)
|
|
122
|
+
*/
|
|
123
|
+
enableTransformOptimization: boolean;
|
|
124
|
+
/**
|
|
125
|
+
* Enable transform collapsing (propagate, bake into coordinates, collapse groups)
|
|
126
|
+
* @default false (basic/balanced), true (aggressive/maximum)
|
|
127
|
+
*/
|
|
128
|
+
enableTransformCollapsing: boolean;
|
|
129
|
+
/**
|
|
130
|
+
* Enable path optimization (command merging, H/V conversion, etc.)
|
|
131
|
+
* @default false (basic/balanced), true (aggressive/maximum)
|
|
132
|
+
*/
|
|
133
|
+
enablePathOptimization: boolean;
|
|
134
|
+
/**
|
|
135
|
+
* Enable path simplification (Douglas-Peucker, Visvalingam-Whyatt)
|
|
136
|
+
* @default false (basic/balanced/aggressive), true (maximum)
|
|
137
|
+
*/
|
|
138
|
+
enablePathSimplification: boolean;
|
|
139
|
+
/**
|
|
140
|
+
* Enable shape conversion (rect/polygon/polyline → path)
|
|
141
|
+
* @default false (basic/balanced), true (aggressive/maximum)
|
|
142
|
+
*/
|
|
143
|
+
shapeConversion: boolean;
|
|
144
|
+
/**
|
|
145
|
+
* Minimum bytes to save for shape conversion
|
|
146
|
+
* @default 5 (aggressive), 0 (maximum)
|
|
147
|
+
*/
|
|
148
|
+
shapeConversionThreshold: number;
|
|
149
|
+
/**
|
|
150
|
+
* Optimization level for stage-based processing
|
|
151
|
+
* @default 'BALANCED'
|
|
152
|
+
*/
|
|
153
|
+
optimizationLevel: OptLevel;
|
|
154
|
+
/**
|
|
155
|
+
* Custom plugins (future extension point)
|
|
156
|
+
*/
|
|
157
|
+
plugins?: OptimizationPlugin[];
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Optimization plugin interface (for future extensibility)
|
|
161
|
+
*/
|
|
162
|
+
export interface OptimizationPlugin {
|
|
163
|
+
name: string;
|
|
164
|
+
stage: 'pre-parse' | 'tree' | 'post-serialize';
|
|
165
|
+
execute: (input: string | OptimizedTree, config: OptConfig) => string | OptimizedTree | Promise<string | OptimizedTree>;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Optimized tree node (lightweight virtual DOM)
|
|
169
|
+
*/
|
|
170
|
+
export interface OptimizedNode {
|
|
171
|
+
type: 'element' | 'text' | 'comment';
|
|
172
|
+
tagName?: string;
|
|
173
|
+
attributes?: Record<string, string>;
|
|
174
|
+
children?: OptimizedNode[];
|
|
175
|
+
textContent?: string;
|
|
176
|
+
commentText?: string;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Optimized tree structure
|
|
180
|
+
*/
|
|
181
|
+
export interface OptimizedTree {
|
|
182
|
+
root: OptimizedNode;
|
|
183
|
+
metadata: {
|
|
184
|
+
originalSize: number;
|
|
185
|
+
optimizedSize: number;
|
|
186
|
+
reductionPercent: number;
|
|
187
|
+
stages: string[];
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Optimization stage function type
|
|
192
|
+
*/
|
|
193
|
+
export type OptimizationStage = (svgString: string, config: OptConfig) => Promise<string> | string;
|
|
194
|
+
/**
|
|
195
|
+
* Optimization result
|
|
196
|
+
*/
|
|
197
|
+
export interface OptimizationResult {
|
|
198
|
+
optimizedSvg: string;
|
|
199
|
+
originalSize: number;
|
|
200
|
+
optimizedSize: number;
|
|
201
|
+
reductionPercent: number;
|
|
202
|
+
stagesApplied: string[];
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Get default optimization config based on level
|
|
206
|
+
*/
|
|
207
|
+
export declare function getDefaultOptConfig(level: OptLevel): OptConfig;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for Advanced SVG Optimizer
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Optimization level enum
|
|
6
|
+
*/
|
|
7
|
+
export var OptLevel;
|
|
8
|
+
(function (OptLevel) {
|
|
9
|
+
OptLevel["NONE"] = "none";
|
|
10
|
+
OptLevel["BASIC"] = "basic";
|
|
11
|
+
OptLevel["BALANCED"] = "balanced";
|
|
12
|
+
OptLevel["AGGRESSIVE"] = "aggressive";
|
|
13
|
+
OptLevel["MAXIMUM"] = "maximum";
|
|
14
|
+
})(OptLevel || (OptLevel = {}));
|
|
15
|
+
/**
|
|
16
|
+
* Get default optimization config based on level
|
|
17
|
+
*/
|
|
18
|
+
export function getDefaultOptConfig(level) {
|
|
19
|
+
const baseConfig = {
|
|
20
|
+
level,
|
|
21
|
+
floatPrecision: 3,
|
|
22
|
+
pathTolerance: 0.5,
|
|
23
|
+
removeViewBox: false,
|
|
24
|
+
removeMetadata: true,
|
|
25
|
+
removeComments: true,
|
|
26
|
+
normalizeWhitespace: true,
|
|
27
|
+
removeUnnecessaryAttrs: true,
|
|
28
|
+
shortenColors: true,
|
|
29
|
+
mergePaths: false,
|
|
30
|
+
removeHiddenElements: false,
|
|
31
|
+
inlineStyles: false,
|
|
32
|
+
removeEmptyContainers: true,
|
|
33
|
+
collapseGroups: false,
|
|
34
|
+
reactCompatibility: true,
|
|
35
|
+
sortAttrs: false,
|
|
36
|
+
removeDoctype: true,
|
|
37
|
+
removeXMLProcInst: true,
|
|
38
|
+
enableNumericOptimization: true,
|
|
39
|
+
enableStyleOptimization: true,
|
|
40
|
+
enableTransformOptimization: false,
|
|
41
|
+
enableTransformCollapsing: false,
|
|
42
|
+
enablePathOptimization: false,
|
|
43
|
+
enablePathSimplification: false,
|
|
44
|
+
shapeConversion: false,
|
|
45
|
+
shapeConversionThreshold: 5,
|
|
46
|
+
optimizationLevel: level,
|
|
47
|
+
};
|
|
48
|
+
switch (level) {
|
|
49
|
+
case OptLevel.NONE:
|
|
50
|
+
return {
|
|
51
|
+
...baseConfig,
|
|
52
|
+
removeMetadata: false,
|
|
53
|
+
removeComments: false,
|
|
54
|
+
normalizeWhitespace: false,
|
|
55
|
+
removeUnnecessaryAttrs: false,
|
|
56
|
+
shortenColors: false,
|
|
57
|
+
removeEmptyContainers: false,
|
|
58
|
+
removeDoctype: false,
|
|
59
|
+
removeXMLProcInst: false,
|
|
60
|
+
enableNumericOptimization: false,
|
|
61
|
+
enableStyleOptimization: false,
|
|
62
|
+
enableTransformOptimization: false,
|
|
63
|
+
enableTransformCollapsing: false,
|
|
64
|
+
enablePathOptimization: false,
|
|
65
|
+
enablePathSimplification: false,
|
|
66
|
+
};
|
|
67
|
+
case OptLevel.BASIC:
|
|
68
|
+
return baseConfig;
|
|
69
|
+
case OptLevel.BALANCED:
|
|
70
|
+
return {
|
|
71
|
+
...baseConfig,
|
|
72
|
+
removeHiddenElements: true,
|
|
73
|
+
floatPrecision: 3,
|
|
74
|
+
enableNumericOptimization: true,
|
|
75
|
+
enableStyleOptimization: true,
|
|
76
|
+
enableTransformOptimization: false,
|
|
77
|
+
enableTransformCollapsing: false,
|
|
78
|
+
enablePathOptimization: false,
|
|
79
|
+
};
|
|
80
|
+
case OptLevel.AGGRESSIVE:
|
|
81
|
+
return {
|
|
82
|
+
...baseConfig,
|
|
83
|
+
removeHiddenElements: true,
|
|
84
|
+
mergePaths: true,
|
|
85
|
+
collapseGroups: true,
|
|
86
|
+
floatPrecision: 2,
|
|
87
|
+
pathTolerance: 0.7,
|
|
88
|
+
sortAttrs: true,
|
|
89
|
+
enableNumericOptimization: true,
|
|
90
|
+
enableStyleOptimization: true,
|
|
91
|
+
enableTransformOptimization: true,
|
|
92
|
+
enableTransformCollapsing: true,
|
|
93
|
+
enablePathOptimization: true,
|
|
94
|
+
// DISABLED: Shape conversion conflicts with floatPrecision=2
|
|
95
|
+
// Causes visual regressions (coordinates get rounded before conversion)
|
|
96
|
+
shapeConversion: false,
|
|
97
|
+
shapeConversionThreshold: 5,
|
|
98
|
+
};
|
|
99
|
+
case OptLevel.MAXIMUM:
|
|
100
|
+
return {
|
|
101
|
+
...baseConfig,
|
|
102
|
+
removeHiddenElements: true,
|
|
103
|
+
mergePaths: true,
|
|
104
|
+
collapseGroups: true,
|
|
105
|
+
inlineStyles: true,
|
|
106
|
+
floatPrecision: 1,
|
|
107
|
+
pathTolerance: 0.9,
|
|
108
|
+
sortAttrs: true,
|
|
109
|
+
removeViewBox: false, // Keep viewBox even at maximum for compatibility
|
|
110
|
+
enableNumericOptimization: true,
|
|
111
|
+
enableStyleOptimization: true,
|
|
112
|
+
enableTransformOptimization: true,
|
|
113
|
+
enableTransformCollapsing: true,
|
|
114
|
+
enablePathOptimization: true,
|
|
115
|
+
enablePathSimplification: true,
|
|
116
|
+
shapeConversion: true,
|
|
117
|
+
shapeConversionThreshold: 0, // Convert even 1-byte savings
|
|
118
|
+
};
|
|
119
|
+
default:
|
|
120
|
+
return baseConfig;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Example Plugin: Color Replacer with Visual Validation
|
|
3
|
+
* Demonstrates Phase 6.2 plugin system with pipeline hooks
|
|
4
|
+
*/
|
|
5
|
+
import type { EnhancedPlugin } from '../types/plugin-system.js';
|
|
6
|
+
/**
|
|
7
|
+
* Color Replacer Plugin
|
|
8
|
+
* Replaces specified colors in SVG while ensuring visual quality
|
|
9
|
+
*/
|
|
10
|
+
export declare const colorReplacerPlugin: EnhancedPlugin;
|
|
11
|
+
/**
|
|
12
|
+
* Example usage:
|
|
13
|
+
*
|
|
14
|
+
* import { enhancedPluginManager } from './core/enhanced-plugin-manager.js';
|
|
15
|
+
* import { colorReplacerPlugin } from './plugins/color-replacer.js';
|
|
16
|
+
*
|
|
17
|
+
* // Register plugin
|
|
18
|
+
* await enhancedPluginManager.registerPlugin(colorReplacerPlugin);
|
|
19
|
+
*
|
|
20
|
+
* // Enable with options
|
|
21
|
+
* enhancedPluginManager.enablePlugin('color-replacer', {
|
|
22
|
+
* colors: {
|
|
23
|
+
* '#ff0000': '#00ff00', // Red → Green
|
|
24
|
+
* '#0000ff': '#ffff00', // Blue → Yellow
|
|
25
|
+
* },
|
|
26
|
+
* includeStyles: true,
|
|
27
|
+
* });
|
|
28
|
+
*
|
|
29
|
+
* // Process SVG through pipeline with visual validation
|
|
30
|
+
* const result = await enhancedPluginManager.processWithHooks(
|
|
31
|
+
* svgContent,
|
|
32
|
+
* config
|
|
33
|
+
* );
|
|
34
|
+
*
|
|
35
|
+
* // Check validation results
|
|
36
|
+
* if (result.validationResults.some(v => !v.validationPassed)) {
|
|
37
|
+
* console.error('Visual validation failed!');
|
|
38
|
+
* }
|
|
39
|
+
*/
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Example Plugin: Color Replacer with Visual Validation
|
|
3
|
+
* Demonstrates Phase 6.2 plugin system with pipeline hooks
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Color Replacer Plugin
|
|
7
|
+
* Replaces specified colors in SVG while ensuring visual quality
|
|
8
|
+
*/
|
|
9
|
+
export const colorReplacerPlugin = {
|
|
10
|
+
name: 'color-replacer',
|
|
11
|
+
version: '1.0.0',
|
|
12
|
+
description: 'Replace colors in SVG with visual validation',
|
|
13
|
+
author: 'svger-cli',
|
|
14
|
+
hooks: {
|
|
15
|
+
'after-parse': async (context) => {
|
|
16
|
+
const options = context.metadata.get('pluginOptions');
|
|
17
|
+
if (!options || !options.colors) {
|
|
18
|
+
return { content: context.content };
|
|
19
|
+
}
|
|
20
|
+
let modifiedContent = context.content;
|
|
21
|
+
// Replace colors
|
|
22
|
+
for (const [oldColor, newColor] of Object.entries(options.colors)) {
|
|
23
|
+
// Replace in fill attributes
|
|
24
|
+
const fillRegex = new RegExp(`fill=["']${escapeRegex(oldColor)}["']`, options.caseSensitive ? 'g' : 'gi');
|
|
25
|
+
modifiedContent = modifiedContent.replace(fillRegex, `fill="${newColor}"`);
|
|
26
|
+
// Replace in stroke attributes
|
|
27
|
+
const strokeRegex = new RegExp(`stroke=["']${escapeRegex(oldColor)}["']`, options.caseSensitive ? 'g' : 'gi');
|
|
28
|
+
modifiedContent = modifiedContent.replace(strokeRegex, `stroke="${newColor}"`);
|
|
29
|
+
// Replace in style attributes if enabled
|
|
30
|
+
if (options.includeStyles) {
|
|
31
|
+
const styleRegex = new RegExp(`(fill|stroke):\\s*${escapeRegex(oldColor)}`, options.caseSensitive ? 'g' : 'gi');
|
|
32
|
+
modifiedContent = modifiedContent.replace(styleRegex, `$1:${newColor}`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
content: modifiedContent,
|
|
37
|
+
metadata: {
|
|
38
|
+
colorsReplaced: Object.keys(options.colors).length,
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
// Enable visual validation - colors should change but structure stays the same
|
|
44
|
+
validation: {
|
|
45
|
+
enabled: true,
|
|
46
|
+
maxDiffPercent: 100, // Allow 100% color change, but structure must be identical
|
|
47
|
+
options: {
|
|
48
|
+
diff: {
|
|
49
|
+
threshold: 0.1, // Strict threshold for structural changes
|
|
50
|
+
includeAA: false,
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
configSchema: {
|
|
55
|
+
colors: {
|
|
56
|
+
type: 'object',
|
|
57
|
+
required: true,
|
|
58
|
+
description: 'Color mapping (old color → new color)',
|
|
59
|
+
},
|
|
60
|
+
includeStyles: {
|
|
61
|
+
type: 'boolean',
|
|
62
|
+
required: false,
|
|
63
|
+
default: false,
|
|
64
|
+
description: 'Whether to replace colors in style attributes',
|
|
65
|
+
},
|
|
66
|
+
caseSensitive: {
|
|
67
|
+
type: 'boolean',
|
|
68
|
+
required: false,
|
|
69
|
+
default: false,
|
|
70
|
+
description: 'Case-sensitive color matching',
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
validate(options) {
|
|
74
|
+
if (!options) {
|
|
75
|
+
return { valid: false, errors: ['Options are required'] };
|
|
76
|
+
}
|
|
77
|
+
if (!options.colors || typeof options.colors !== 'object') {
|
|
78
|
+
return {
|
|
79
|
+
valid: false,
|
|
80
|
+
errors: ['colors property is required and must be an object'],
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
if (Object.keys(options.colors).length === 0) {
|
|
84
|
+
return {
|
|
85
|
+
valid: false,
|
|
86
|
+
errors: ['At least one color mapping is required'],
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
return { valid: true, errors: [] };
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* Escape special regex characters
|
|
94
|
+
*/
|
|
95
|
+
function escapeRegex(str) {
|
|
96
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Example usage:
|
|
100
|
+
*
|
|
101
|
+
* import { enhancedPluginManager } from './core/enhanced-plugin-manager.js';
|
|
102
|
+
* import { colorReplacerPlugin } from './plugins/color-replacer.js';
|
|
103
|
+
*
|
|
104
|
+
* // Register plugin
|
|
105
|
+
* await enhancedPluginManager.registerPlugin(colorReplacerPlugin);
|
|
106
|
+
*
|
|
107
|
+
* // Enable with options
|
|
108
|
+
* enhancedPluginManager.enablePlugin('color-replacer', {
|
|
109
|
+
* colors: {
|
|
110
|
+
* '#ff0000': '#00ff00', // Red → Green
|
|
111
|
+
* '#0000ff': '#ffff00', // Blue → Yellow
|
|
112
|
+
* },
|
|
113
|
+
* includeStyles: true,
|
|
114
|
+
* });
|
|
115
|
+
*
|
|
116
|
+
* // Process SVG through pipeline with visual validation
|
|
117
|
+
* const result = await enhancedPluginManager.processWithHooks(
|
|
118
|
+
* svgContent,
|
|
119
|
+
* config
|
|
120
|
+
* );
|
|
121
|
+
*
|
|
122
|
+
* // Check validation results
|
|
123
|
+
* if (result.validationResults.some(v => !v.validationPassed)) {
|
|
124
|
+
* console.error('Visual validation failed!');
|
|
125
|
+
* }
|
|
126
|
+
*/
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gradient Optimizer Plugin
|
|
3
|
+
* Removes redundant gradient stops and optimizes gradient definitions
|
|
4
|
+
*
|
|
5
|
+
* Features:
|
|
6
|
+
* - Remove duplicate gradient stops
|
|
7
|
+
* - Merge gradients with identical stops
|
|
8
|
+
* - Remove unused gradient definitions
|
|
9
|
+
* - Optimize stop colors (round precision)
|
|
10
|
+
*
|
|
11
|
+
* Visual tolerance: 2% (gradients should look nearly identical)
|
|
12
|
+
*/
|
|
13
|
+
import type { EnhancedPlugin } from '../types/plugin-system.js';
|
|
14
|
+
/**
|
|
15
|
+
* Configuration for gradient optimizer
|
|
16
|
+
*/
|
|
17
|
+
export interface GradientOptimizerOptions {
|
|
18
|
+
/** Remove duplicate stops (default: true) */
|
|
19
|
+
removeDuplicates?: boolean;
|
|
20
|
+
/** Merge identical gradients (default: true) */
|
|
21
|
+
mergeIdentical?: boolean;
|
|
22
|
+
/** Remove unused gradients (default: true) */
|
|
23
|
+
removeUnused?: boolean;
|
|
24
|
+
/** Color precision (number of decimals, default: 2) */
|
|
25
|
+
colorPrecision?: number;
|
|
26
|
+
/** Offset precision (number of decimals, default: 2) */
|
|
27
|
+
offsetPrecision?: number;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Gradient Optimizer Plugin
|
|
31
|
+
*/
|
|
32
|
+
export declare const gradientOptimizerPlugin: EnhancedPlugin;
|
|
33
|
+
export default gradientOptimizerPlugin;
|