diff --git a/docs/contribute/icons/design-principles.md b/docs/contribute/icons/design-principles.md index d9827d560..d79a0e91c 100644 --- a/docs/contribute/icons/design-principles.md +++ b/docs/contribute/icons/design-principles.md @@ -8,230 +8,190 @@ Lucide is designed as a consistent icon set, not just a collection of individual This guide explains the visual principles behind Lucide icons and how to apply them when designing new icons. -For concrete requirements such as canvas size, stroke width, spacing, and corner radii, see the [Icon Design Specification](./specification). +For concrete requirements, see the [Icon Design Specification](./specification). ## 1. Use a 24 × 24 pixel canvas -:::: example - Icons **must** be designed on a 24 × 24 pixel canvas. +:::: example ::: do ../../images/24px-24px.svg?raw=true Use a **24 × 24 pixel** canvas. ::: - ::: dont ../../images/24px-24px-violation.svg?raw=true Use a larger or smaller canvas, or one that's not square. ::: - :::: ## 2. Keep 1 pixel of safe zone -:::: example - Icons **must** have at least 1 pixel of padding between their strokes and the edge of the canvas. +:::: example ::: do ../../images/1px-padding.svg?raw=true Keep at least **1 pixel of padding** around the icon. ::: - -::: dont ../../images/0px-padding.svg?raw=true -Failing to keep this safe zone will result in trimmed visuals. +::: dont ../../images/1px-padding-violation.svg?raw=true +You must leave this safe zone, otherwise it might result in trimmed visuals. ::: - :::: ## 3. Use 2 pixel strokes -:::: example - Strokes **must** be 2 pixels wide. +:::: example ::: do ../../images/2px-stroke.svg?raw=true Use a **2 pixel stroke width**. ::: - ::: dont ../../images/2px-stroke-violation.svg?raw=true -Avoid thicker or thinner strokes. +Avoid **thicker or thinner** strokes, or **mixing stroke widths**. ::: - :::: - ## 4. Use round line joins -:::: example - Strokes **must** use round line joins. +:::: example ::: do ../../images/round-joints.svg?raw=true Use **round line joins**. ::: - ::: dont ../../images/round-joints-violation.svg?raw=true You **must not** use **miter or bevel** line joins. ::: - :::: +::: tip +Even though round line joins are used, you should still add corner rounding to most sharp corners. +::: + ## 5. Use round line caps -:::: example - Open paths **must** use round line caps. +:::: example ::: do ../../images/round-caps.svg?raw=true Use **round line caps** on open paths. ::: - ::: dont ../../images/round-caps-violation.svg?raw=true You **must not** use **butt or square** line caps. ::: - :::: ## 6. Use centered strokes -:::: example - Strokes **must** be centered on their paths. +:::: example ::: do ../../images/centered-strokes.svg?raw=true Keep strokes **centered** on their paths. ::: - ::: dont ../../images/centered-strokes-violation.svg?raw=true -You **must not** use **inside or outside** strokes. +You **must not** use **inside or outside** strokes, as they alter the intended appearance of line joins. ::: - :::: ## 7. Use consistent corner radii +Almost every sharp corner **should** be rounded. + :::: example - -Almost all sharp corners **should** be rounded: - ::: do ../../images/border-radius-correct.svg?raw=true -Use rounded corners. +Use **rounded corners**. ::: - ::: dont ../../images/border-radius-violation.svg?raw=true -Avoid sharp corners. +Avoid **sharp corners**. ::: - :::: -:::: example - The corner radius depends on the size of the element and the angle. For 90° angles you should: +:::: example ::: do ../../images/2px-border-radius.svg?raw=true Use a **2 pixel corner radius** for shapes that are at least 8 pixels wide or tall. ::: - ::: do ../../images/1px-border-radius.svg?raw=true Use a **1 pixel corner radius** for shapes smaller than 8 pixels. ::: - :::: +But there are always exceptions to the rule: + :::: example - -But there are always exceptions to the rule. - ::: do ../../images/border-radius-90deg.svg?raw=true -Diagonal lines meeting at a right angle are usually rounded to 2.41 pixels in order to be perfectly grid aligned. +Diagonal lines meeting at a right angle are usually rounded to **2.41 pixels** (1+√2) in order for the lines to be **perfectly grid aligned**. ::: - ::: do ../../images/border-radius-arbitrary.svg?raw=true -Even very sharp corners should have a minor amount of rounding applied, but how much exactly will vary on the geometry of the icon. +Even **very sharp corners** should have a _minor_ amount of rounding applied, but how much exactly will vary on the geometry of the icon. ::: - :::: +Avoid rounding corners **where multiple lines meet**. + :::: example - -Again, _almost_ every sharp corner should be rounded, but there are exceptions to the rule. - ::: do ../../images/border-radius-line-join.svg?raw=true -Keep corners sharp if multiple lines meet. +Keep corners sharp if multiple lines meet, this will ensure the icon scales in a consistent way. ::: - ::: dont ../../images/border-radius-line-join-violation.svg?raw=true -Make icons consistent at different scales by not rounding these corners. +Make icons consistent at different scales by **not rounding** corners where more than two lines meet. ::: - :::: ## 8. Keep 2 pixels of gap -:::: example - Distinct elements **must** have at least 2 pixels of visual spacing between them. +:::: example ::: do ../../images/2px-element-spacing.svg?raw=true Keep **2 pixels of spacing** between distinct elements. ::: - ::: dont ../../images/1px-element-spacing.svg?raw=true Never use gaps smaller than **2 pixels** between distinct elements. ::: - :::: -:::: example - This includes the inside of shapes, so most inner gaps **should** be at least 2 pixels wide. +:::: example ::: do ../../images/2px-inner-spacing.svg?raw=true Keep at least **2 pixels of spacing** inside shapes. ::: - ::: dont ../../images/1px-inner-spacing.svg?raw=true Avoid inner gaps smaller than **2 pixels**. ::: - :::: +You can also visualize this rule by trying to place a **2 pixel wide circle** within your shape. + :::: example - -You can visualize this by trying to place a 2 pixel wide circle within your shape. - ::: do ../../images/2px-inner-gap.svg?raw=true -If a **2 pixel wide circle** fits inside the shape without overlapping, the gap is wide enough. +If a **2 pixel wide circle** fits inside the shape without overlapping, the gap is **wide enough**. ::: - ::: dont ../../images/1px-inner-gap.svg?raw=true -If a **2 pixel wide circle** overlaps the shape, the inner gap should be wider. +If a **2 pixel wide circle** overlaps the shape, the inner gap should be **wider**. ::: - :::: - -:::: example - The 2 pixel spacing also applies when elements visually connect or intersect. +:::: example ::: dont ../../images/2px-element-spacing-connected.svg?raw=true -Maintain 2 pixels of spacing where elements visually connect. +Maintain 2 pixels of spacing where elements **visually connect**. ::: - ::: dont ../../images/2px-element-spacing-abrupt-cut.svg?raw=true -Avoid abrupt cuts where one element meets another. +Avoid **abrupt cuts** where one element meets another. ::: - :::: ## 9. Aim for uniform volume -:::: example - Icons should have a similar visual weight when viewed alongside each other. +:::: example + ::: do ../../images/visual-weight-consistent.svg?raw=true Match the visual weight of `circle` and `square`. ::: @@ -243,41 +203,33 @@ The second icon is **too large**, the fourth is **too small**. :::: ::: tip - The amount and distribution of strokes affect how heavy an icon appears. An icon with many closely spaced elements can appear much heavier than a simpler icon, even when both use the same stroke width. Place your icon next to `circle` or `square` and blur them. Your icon should not appear significantly lighter or darker than the reference icon. - ::: ## 10. Balance icons visually -:::: example - Icons should appear centered and balanced within the canvas. +:::: example ::: do ../../images/visually-centered-do.svg?raw=true Keep your icons visually centered. ::: - ::: dont ../../images/visually-centered-dont.svg?raw=true The optical volume of this icon is offset to the top left. ::: - :::: -:::: example Symmetrical icons should remain geometrically centered. +:::: example ::: do ../../images/visually-centered-symmetrical-do.svg?raw=true ::: - ::: dont ../../images/visually-centered-symmetrical-dont.svg?raw=true ::: - :::: - ::: tip Geometric centering does not always produce a visually centered icon. Asymmetrical shapes may need to be moved slightly to compensate for their visual center of gravity. @@ -286,18 +238,15 @@ Compare your icon with `circle` or `square` both side by side and vertically. If ## 11. Keep density low -:::: example - Lucide icons should have a similar visual density and level of detail. +:::: example ::: do ../../images/density-optimal.svg?raw=true Simplify complex subjects, preserving the features that make them identifiable. ::: - ::: dont ../../images/density-too-dense.svg?raw=true Avoid adding unnecessary details that make the design dense. ::: - :::: ::: tip @@ -310,17 +259,14 @@ View the icon at its intended size and try blurring it. Areas that become notice ## 12. Use smooth, simple curves - -:::: example - Curves should be smooth and use the simplest geometry that accurately describes the shape. +:::: example ::: do ../../images/curvature-smooth.svg?raw=true -Prefer simple arcs and quadratic curves where possible. +Prefer **simple arcs** and **quadratic curves** where possible. ::: - ::: dont ../../images/curvature-uneven.svg?raw=true -Avoid uneven or unnecessarily complex curves. +Avoid **uneven or unnecessarily complex** curves. ::: :::: @@ -332,8 +278,9 @@ Avoid unnecessary control points. They make shapes harder to maintain and can in ## 13. Design for the pixel grid -:::: example Lucide icons should appear sharp and intentional at small sizes, including on low-density displays. + +:::: example ::: do ../../images/pixel-perfection-ideal.svg?raw=true Align coordinates and the centers of arcs and other geometric elements to the pixel grid where possible. ::: @@ -342,39 +289,51 @@ Avoid placing geometry off the pixel grid without a visual reason. ::: :::: +:::: example +::: do ../../images/pixel-perfection-subelement-do.svg?raw=true +Also **align subelements** to the pixel grid. +::: +::: dont ../../images/pixel-perfection-subelement-dont.svg?raw=true +You **must not** place subelements off-grid, as they'll become blurry on low density displays. +::: +:::: + ::: tip Pixel alignment should support the overall appearance of the icon rather than come at the expense of recognizable shapes, smooth curves, or visual balance. ::: ## 14. Reuse established shapes -:::: example When creating variant icons, preserve the geometry of the base icon unless the new concept requires a change. + +:::: example ::: do ../../images/established-shapes-base-do.svg?raw=true -Reuse existing base icons exactly as they appear. +Reuse existing base icons **exactly as they appear**. ::: ::: dont ../../images/established-shapes-base-dont.svg?raw=true Avoid altering the **geometry, placement and orientation** of base shapes. ::: :::: -:::: example Related icons should share the same shapes and visual patterns wherever possible. + +:::: example ::: do ../../images/established-shapes-sub-do.svg?raw=true -Reuse elements from existing icons without change. +Reuse elements from existing icons **without change**. ::: ::: dont ../../images/established-shapes-sub-dont.svg?raw=true -Avoid creating new designs for existing elements. +Avoid creating **new designs for existing elements**. ::: :::: +Common modifiers and elements should behave and appear consistently across both icon sets and the library. + :::: example -Common modifiers and elements should behave consistently across both icon sets and the library. ::: do ../../images/established-shapes-consistency-do.svg?raw=true -Maintain consistency between the placement and size of addons. +Maintain consistency between the **placement and size** of addons. ::: ::: dont ../../images/established-shapes-consistency-dont.svg?raw=true -Avoid using irregular placements and sizes compared to existing icons. +Avoid using **irregular placements and sizes** compared to existing icons. ::: :::: @@ -399,4 +358,4 @@ When designing a Lucide icon: 9. **Align geometry to the pixel grid** where possible. 10. **Reuse established shapes and geometry** from existing Lucide icons. -When these guidelines conflict, prioritize **clarity, visual balance, and consistency with the rest of Lucide**. +When these guidelines conflict, you should prioritize **clarity, visual balance, and consistency** with the rest of the Lucide set. diff --git a/docs/images/0px-padding.svg b/docs/images/0px-padding.svg deleted file mode 100644 index 554fbca94..000000000 --- a/docs/images/0px-padding.svg +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/images/1px-element-spacing.svg b/docs/images/1px-element-spacing.svg index e7461269e..6a5a976f0 100644 --- a/docs/images/1px-element-spacing.svg +++ b/docs/images/1px-element-spacing.svg @@ -53,14 +53,14 @@ - - - + + + - - - + + + diff --git a/docs/images/1px-padding-violation.svg b/docs/images/1px-padding-violation.svg new file mode 100644 index 000000000..d9538fac6 --- /dev/null +++ b/docs/images/1px-padding-violation.svg @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/images/1px-padding.svg b/docs/images/1px-padding.svg index 4c08aafb9..313a8c5a3 100644 --- a/docs/images/1px-padding.svg +++ b/docs/images/1px-padding.svg @@ -1,57 +1,61 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + - - + + diff --git a/docs/images/2px-element-spacing-abrupt-cut.svg b/docs/images/2px-element-spacing-abrupt-cut.svg index d4923169a..183e66bc0 100644 --- a/docs/images/2px-element-spacing-abrupt-cut.svg +++ b/docs/images/2px-element-spacing-abrupt-cut.svg @@ -49,24 +49,24 @@ - - + + - - + + - - - - + + + + - - - - + + + + diff --git a/docs/images/2px-element-spacing-connected.svg b/docs/images/2px-element-spacing-connected.svg index 672e50969..a12017164 100644 --- a/docs/images/2px-element-spacing-connected.svg +++ b/docs/images/2px-element-spacing-connected.svg @@ -53,12 +53,12 @@ - - + + - - + + diff --git a/docs/images/2px-stroke-violation.svg b/docs/images/2px-stroke-violation.svg index 01c358173..7e2d935e3 100644 --- a/docs/images/2px-stroke-violation.svg +++ b/docs/images/2px-stroke-violation.svg @@ -48,10 +48,10 @@ - - - - + + + + diff --git a/docs/images/2px-stroke.svg b/docs/images/2px-stroke.svg index 21c7891bd..966b2aced 100644 --- a/docs/images/2px-stroke.svg +++ b/docs/images/2px-stroke.svg @@ -1,5 +1,5 @@ - + @@ -48,18 +48,18 @@ - - + + - + - + - + diff --git a/docs/images/centered-strokes-violation.svg b/docs/images/centered-strokes-violation.svg index f05831cb6..8975f9f98 100644 --- a/docs/images/centered-strokes-violation.svg +++ b/docs/images/centered-strokes-violation.svg @@ -52,17 +52,36 @@ + + - - + + + + + + + + + + + + + + + + + + + diff --git a/docs/images/curvature-smooth.svg b/docs/images/curvature-smooth.svg index f09da4098..ee39cb389 100644 --- a/docs/images/curvature-smooth.svg +++ b/docs/images/curvature-smooth.svg @@ -48,15 +48,14 @@ - - - + + + + + - - - diff --git a/docs/images/curvature-uneven.svg b/docs/images/curvature-uneven.svg index edf41cdea..d54e74dd9 100644 --- a/docs/images/curvature-uneven.svg +++ b/docs/images/curvature-uneven.svg @@ -47,16 +47,44 @@ - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - diff --git a/docs/images/established-shapes-base-do.svg b/docs/images/established-shapes-base-do.svg index 8b1caab9d..54fb7f61f 100644 --- a/docs/images/established-shapes-base-do.svg +++ b/docs/images/established-shapes-base-do.svg @@ -1,14 +1,18 @@ - + + - - - - - - - - - - + + + + + + + + + + + + + diff --git a/docs/images/established-shapes-base-dont.svg b/docs/images/established-shapes-base-dont.svg index 4eb7e0823..e286ea717 100644 --- a/docs/images/established-shapes-base-dont.svg +++ b/docs/images/established-shapes-base-dont.svg @@ -1,14 +1,18 @@ - + + - - - - - - - - - - + + + + + + + + + + + + + diff --git a/docs/images/established-shapes-consistency-do.svg b/docs/images/established-shapes-consistency-do.svg index 53e0c4e64..72574e46b 100644 --- a/docs/images/established-shapes-consistency-do.svg +++ b/docs/images/established-shapes-consistency-do.svg @@ -1,14 +1,18 @@ - - + + + - - - - - - - - - - + + + + + + + + + + + + + diff --git a/docs/images/established-shapes-consistency-dont.svg b/docs/images/established-shapes-consistency-dont.svg index 2700d4291..0bdfa9a56 100644 --- a/docs/images/established-shapes-consistency-dont.svg +++ b/docs/images/established-shapes-consistency-dont.svg @@ -1,12 +1,17 @@ - - + + + - - - - - - - - + + + + + + + + + + + + diff --git a/docs/images/established-shapes-sub-do.svg b/docs/images/established-shapes-sub-do.svg index 8b1caab9d..54fb7f61f 100644 --- a/docs/images/established-shapes-sub-do.svg +++ b/docs/images/established-shapes-sub-do.svg @@ -1,14 +1,18 @@ - + + - - - - - - - - - - + + + + + + + + + + + + + diff --git a/docs/images/established-shapes-sub-dont.svg b/docs/images/established-shapes-sub-dont.svg index c83a8d165..c70a99495 100644 --- a/docs/images/established-shapes-sub-dont.svg +++ b/docs/images/established-shapes-sub-dont.svg @@ -1,11 +1,16 @@ - + + - - - - - - - + + + + + + + + + + + diff --git a/docs/images/pixel-perfection-bad.svg b/docs/images/pixel-perfection-bad.svg index ecea4e1c9..bd6106cbe 100644 --- a/docs/images/pixel-perfection-bad.svg +++ b/docs/images/pixel-perfection-bad.svg @@ -1,10 +1,10 @@ - - - - - - + + + + + + @@ -53,28 +53,28 @@ - + + + + - - - - - - - - - - - - - - - - + - + + + + + + + + + + + + + diff --git a/docs/images/pixel-perfection-ideal.svg b/docs/images/pixel-perfection-ideal.svg index f3bd203a6..87f78abe3 100644 --- a/docs/images/pixel-perfection-ideal.svg +++ b/docs/images/pixel-perfection-ideal.svg @@ -1,10 +1,10 @@ - - - - - - + + + + + + @@ -54,32 +54,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/docs/images/pixel-perfection-subelement-do.svg b/docs/images/pixel-perfection-subelement-do.svg new file mode 100644 index 000000000..44290b5ea --- /dev/null +++ b/docs/images/pixel-perfection-subelement-do.svg @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/images/pixel-perfection-subelement-dont.svg b/docs/images/pixel-perfection-subelement-dont.svg new file mode 100644 index 000000000..6a005e4d8 --- /dev/null +++ b/docs/images/pixel-perfection-subelement-dont.svg @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +