Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Flatten icons #2135

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open

feat: Flatten icons #2135

wants to merge 3 commits into from

Conversation

baarde
Copy link

@baarde baarde commented May 6, 2024

Related to #1687.

What is the purpose of this pull request?

  • New Icon
  • Bug fix
  • New Feature
  • Documentation update
  • Other:

Description

This PR modify the package build scripts to flatten the exported SVG icons.

While source icons are made up of several shapes (<line>, <rect>, <circle>, etc), all the shapes now get converted to <path> and merged together in a single <path> element during the build.

As mentioned in #1687, this has two benefits:

  • Overlaps are no longer visible when using semi-transparent colors.
  • The size of the build output is decreased by ~13%.

Implementation

We use the Convert Shape to Path and Merge Paths SVGO plugins to convert shapes to paths and merge the paths together. Currently SVGO cannot optimize rectangles with rounded corners (svg/svgo#1963), so this PR includes a custom plugin to do that.

Impact on icon size

In most cases, converting shapes to <path> reduce the icon's size, especially for icons made up of many shapes (e.g. sliders-horizontal.svg). In some cases, we observe a small increase of the size (e.g. layout-grid.svg), because circles and rounded rectangles are more compact than paths. Overall the output size is reduced by ~13%.

Impact on the build time

One would assume that processing each icon for every build target would be bad for the build time. However, I haven't observed any significant increase of the average build time on my machine (it actually went slightly down).

Impact on icon appearance

Icons should appear the same. However there are two noticeable differences.

  1. When using a semi-transparent stroke color, the icon now has a consistent appearance instead of showing overlaps.
    lucide-overlaps

  2. Edges are a little bit smoother in places where several shapes converge. This isn't visible to the naked eye.
    lucide-edges

Before Submitting

@jguddas
Copy link
Member

jguddas commented May 6, 2024

This is pretty breaking changish.

@wellguimaraes
Copy link

Any chance this one will be merged/published before 1.0?

@karsa-mistmere
Copy link
Member

@wellguimaraes: Not sure if we should do this before v1.0, as @jguddas has stated this could potentially break a lot of apps that currently rely on the unflattened paths (e.g. to animate or fill only certain parts of icons). 🤔

This enables the implementation of additional optimizations without modifying the original SVG files.
Transform shapes to paths and merge all paths together. This reduces the icon size and solves the issue of overlapping strokes when using a transparent color.
Add a custom plugin to convert rectangles with rounded corners to paths. Hopefully, this may be removed when svg/svgo#1963 or another similar PR is merged in SVGO.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

5 participants