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

[WIP] Spacing doc draft #103

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
Open
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
108 changes: 108 additions & 0 deletions docs/spacing.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
# Spacing

Careful spacing is key for the user to understand connections and hierarchies between elements, and for an interface to feel pleasant.

## Scale

Primer follows a base-8 scale, as it allows for significant flexibility when defining a variety of spacing values within an interface.

The possible values are: 0, 4, 8, 16, 24, 32, 40, 48

For very small components where 8 pixel spacing is too large, you can use 4 pixels.

## Responsive breakpoints

You can define different spacing values for different breakpoints, so the interface can better adapt to the available space.

`[Example: component with larger margin around it in large screen, vs smaller margin in small screen]`
Copy link
Member Author

@yaili yaili Sep 9, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TODO: Find example component

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You could reference the general spacing of the entire page? Padding/margin around most pages reduces at smaller screen sizes. I can try to think of some other examples, too.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks @colinkeany that's a good idea for now, do you know a page that would be better to use as an example? maybe something with not too much going on? 🤔

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The issues page might be a good option? https://github.com/issues


In code, margins can be defined per breakpoint, where different breakpoints have a different margin applied.

`[Example: mb-sm-2 mb-md-3 mb-lg-4]`

## Applying spacing

The general rule when using Primer is to apply spacing in increments of 8 pixels, as provided by the spacing utilities.

In some cases, for very small components and in denser areas of the UI, you can use 4 pixels.

`[Example: text and icon button]`
Copy link
Member Author

@yaili yaili Sep 9, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TODO: image of text + icon button with redlines to indicate 4px space.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ashygee will create this


Primer components have padding built-in, so in most cases you’ll only need to consider vertical spacing *between* components.

In some cases, the spacing values inside components don't follow the values in the scale, but the total size of the component should always follow the scale.

`[Example: the padding inside a button may be 3px or 5px but the total height is 32px]`
Copy link
Member Author

@yaili yaili Sep 9, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TODO: add image of a component with irregular padding values where total height follows the scale.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ashygee use large button as example


**Do:**
- Use the spacing values available in Primer.

**Don’t:**
- Don't apply custom spacing values.

yaili marked this conversation as resolved.
Show resolved Hide resolved
## Relationships

Elements that are close together are perceived as being related or part of the same group, while elements that are far apart from each other feel unrelated.

`[Examples: cancel, save buttons; repo top nav buttons]`
Copy link
Member Author

@yaili yaili Sep 9, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TODO: Find an example of together and distant

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can use the header and indicate repo name / social buttons / tabs as 3 different groups.


## Alignment

As a general rule, elements should align to other elements' outer box, and not try to align to the content within a box.
yaili marked this conversation as resolved.
Show resolved Hide resolved

`[Example: text outside and above a table/list should align to the edge of the table (and not to the content within the rows]`
Copy link
Member Author

@yaili yaili Sep 9, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TODO: Add image of text above a list, and redline the alignment.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.


## Hierarchy

Do: Add more white space around components that are more important.

`[Examples: titles]`
Copy link
Member Author

@yaili yaili Sep 9, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TODO: Add image of page titles.


Note: Editorial content can have more generous spacing.

`[Examples: first use cards, new features cards]`
Copy link
Member Author

@yaili yaili Sep 9, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TODO: example of editorial card.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.


## Consistency

Do: Apply the same spacing values to similar components.

`[Example: all items in the sidebar have the same vertical distance]`
Copy link
Member Author

@yaili yaili Sep 9, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TODO: redline vertical spacing between repo homepage sidebar elements.


## Density

`[Examples: ]`
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@vdepizzol can you think of one example of high density components (or areas of a page) and one of low density?


## Optical adjustments

In some cases, optical adjustments may break from the scale.

`[Example: avatar on commits in repo landing page align optically with file icons below]`
Copy link
Member Author

@yaili yaili Sep 9, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TODO: image of avatar + file icons alignment with redlines to show how it breaks


## Common spacing values
yaili marked this conversation as resolved.
Show resolved Hide resolved

yaili marked this conversation as resolved.
Show resolved Hide resolved
Small components usually have 8px between them. In some cases, for very small buttons, you can use 4px.

`[Example: buttons side by side, labels, icon+text]`
Copy link
Member Author

@yaili yaili Sep 9, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TODO: image of buttons side by side, and of icon+text button, redlines with values.

Copy link
Member Author

@yaili yaili Sep 25, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Examples: side by side (separate) buttons it's 8px, and select field with save/delete button it's 4px (example in user settings)


The most common value when stacking components vertically is 16px.

`[Example: issue header above first comment, sidebar, stacked boxes]`
Copy link
Member Author

@yaili yaili Sep 9, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TODO: Image of stacked boxes at the bottom of pull requests comments tab.


Generally, Primer elements have "squished" padding, where the vertical padding is smaller than the horizontal padding.

`[Example: squished padding element, like a button.]`
Copy link
Member Author

@yaili yaili Sep 9, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TODO: Image of a representative squished element, ideally something else than a button so it's not always the same example. Ideas: a row, or tabs.


## Learn more about spacing
If you’d like to read more about spacing in UI design, we recommend:
yaili marked this conversation as resolved.
Show resolved Hide resolved

- [Elements of design](https://www.invisionapp.com/design-defined/elements-of-design/)
- [Design principles – Gestalt, white space and perception](https://manifesto.co.uk/design-principles-gestalt-white-space-perception/)
- The Principle of spacing in UI design, [Part 1](https://medium.com/dwarves-design/the-principle-of-spacing-in-ui-design-part-1-3354d0d65e51) and [Part 2](https://medium.com/dwarves-design/the-principle-of-spacing-part-2-e3cf31b909fa)

## Related

- [Primer CSS - Support - Spacing](https://primer.style/css/support/spacing)
- [Primer CSS - Utilities - Padding](https://primer.style/css/utilities/padding)
- [Primer CSS - Utilities - Margin](https://primer.style/css/utilities/margin)
- [Primer CSS - Utilities - Borders](https://primer.style/css/utilities/borders)
- [Primer Primitives - Spacing](https://github.com/primer/primitives/blob/master/primitives/spacing.ts)