• Stars
    star
    413
  • Rank 104,227 (Top 3 %)
  • Language
  • License
    MIT License
  • Created almost 9 years ago
  • Updated over 8 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

๐Ÿ“– Opinionated CSS styleguide for scalable applications

css

Opinionated CSS styleguide for scalable applications

This guide was heavily inspired by experiments, awesome people like @fat and @necolas and awesome projects made by Google, Airbnb and Medium.

Table of Contents

  1. Terminology 1. Rule Declaration 1. Selectors 1. Properties
  2. [Formatting] (#formatting) 1. [Spacing] (#spacing) 1. [Nesting] (#nesting) 1. [Quotes] (#quotes) 1. [Comments] (#comments)
  3. [Syntax] (#syntax) 1. [Components] (#components) 1. [Descendants] (#descendants) 1. [Modifiers] (#modifiers) 1. [States] (#states)

Terminology

The following are some terms used throughout this styleguide.

Rule declaration

A โ€œrule declarationโ€ is the name given to a selector (or a group of selectors) with an accompanying group of properties. Here's an example:

.avatar {
  font-size: 18px;
  line-height: 1.2;
}

Selectors

In a rule declaration, โ€œselectorsโ€ are the bits that determine which elements in the DOM tree will be styled by the defined properties. Selectors can match HTML elements, as well as an element's class, ID, or any of its attributes. Here are some examples of selectors:

.avatar {
  font-size: 20px;
}

#id {
  font-size: 20px;
}

Properties

Finally, properties are what give the selected elements of a rule declaration their style. Properties are key-value pairs, and a rule declaration can contain one or more property declarations. Property declarations look like this:

.avatar {
  background: rgb(255,255,255);
  color: rgb(33,33,33);
}

Formatting

The following are some high level page formatting style rules.

Spacing

CSS rules should be comma separated and leave on a new line:

/* wrong */
.avatar, .tweet {

}
/* right */
.avatar, 
.tweet {

}

Properties should use a space after : but not before:

/* wrong */
.avatar {
  font-size : 12px;
}

.tweet {
  font-size:12px;
}
/* right */
.avatar {
  font-size: 12px;
}

Rule declarations should have one property per line:

/* wrong */
.avatar {
  font-size: 12px; letter-spacing: 2px;
}
/* right */
.avatar {
  font-size: 12px; 
  letter-spacing: 2px;
}

Declaration should be separated by two new lines:

/* wrong */
.avatar {
  font-size: 12px;
}
.tweet {
  letter-spacing: 2px;
}
/* right */
.avatar {
  font-size: 12px;
}

.tweet {
  letter-spacing: 2px;
}

Nesting

Do not nest elements. Keep nesting to pseudo-classes and direct interactions with the parent element. Although nesting is a powerful feature provided by several preprocessors and plugins, it can easily get out of control and generate a terrible css ouput with high specificity or spoil the code legibility.

/* wrong */
.avatar {
  font-size: 12px;
  
  &:hover {
    font-size: 11px;
  }
  
  &__link {
    color: rgb(210,210,22);
  }

  &__photo {
    height: 20px;
  }
}
/* right */
.avatar {
  font-size: 12px;
  
  &:hover {
    font-size: 11px;
  }
}

.avatar__link {
  color: rgb(210,22,221);
}

.avatar__photo {
  height: 20px;
}

Nesting can also be used to when an element is dependent of a parent's modifier. This helps to keep all code related to an element on the same block.

.avatar {
  font-size: 12px;
}

.avatar__photo {
  height: 20px;
  
  .avatar--big & {
    height: 40px;
  }
}

Quotes

Quotes are optional in CSS. You should use single quotes as it is visually clearer that the string is not a selector or a style property.

/* wrong */
.avatar {
  background-image: url(/img/you.jpg);
  font-family: Helvetica Neue Light, Helvetica Neue, Helvetica, Arial;
}
/* right */
.avatar {
  background-image: url('/img/you.jpg');
  font-family: 'Helvetica Neue Light', 'Helvetica Neue', Helvetica, Arial;
}

Comments

Avoid comments as hard as you can. Comments are not easily mantainable and are usually used to supress application design mistakes. Leave comments only to things that are really not straightforward such as browser-specific hacks. Put comments on their own lines to describe content below them.

/* wrong */
.avatar {
  height: 200px; /* this is the height of the container*/
  background-color: rgb(221,33,21); /* brand color */
}
/* right */
.avatar {
  height: 20px;
  
  /* this is a hack to fix click behavior on Safari 6.0 */
  pointer-events: none;
}

Syntax

Syntax: <component-name>[--modifier-name|__descendant-name]

Component driven development offers several benefits when reading and writing HTML and CSS:

  • It helps to distinguish between the classes for the root of the component, descendant elements, and modifications.
  • It keeps the specificity of selectors low.
  • It helps to decouple presentation semantics from document semantics.

You can think of components as custom elements that enclose specific semantics, styling, and behaviour.

Components

Syntax: component-name

The component's name must be written in kebab case.

.my-component {
  font-size: 20px;
}
<article class="my-component"></article>

Descendants

Syntax: component-name__descendant-name

A component descendant is a class that is attached to a descendant node of a component. It's responsible for applying presentation directly to the descendant on behalf of a particular component. Descendant names must be written in kebab case.

<article class="tweet">
  <header class="tweet__header">
    <img class="tweet__avatar" src="{$src}" alt="{$alt}">
    โ€ฆ
  </header>
  <div class="tweet__body">
    โ€ฆ
  </div>
</article>

Modifiers

Syntax: component-name--modifier-name

A component modifier is a class that modifies the presentation of the base component in some form. Modifier names must be written in kebab case and be separated from the component name by two hyphens. The class should be included in the HTML in addition to the base component class.

.btn {
  padding: 20px 10px;
}

.btn--primary { 
  background: rgb(148,146,231);
}
<button class="btn btn--primary">โ€ฆ</button>

States

Syntax: component-name.is-state-of-component

Use is-stateName for state-based modifications of components. The state name must be kebab case. Never style these classes directly; they should always be used as an adjoining class.

JS can add/remove these classes. This means that the same state names can be used in multiple contexts, but every component must define its own styles for the state (as they are scoped to the component).

.tweet { 
  height: 90px;
}

.tweet.is-expanded { 
  height: 200px;
}
<article class="tweet is-expanded"></article>

License

MIT ยฉ 2016

More Repositories

1

react-voice-components

Set of React components that use the Web Speech API to bring voice experience to React applications
JavaScript
194
star
2

lint-diff

๐Ÿ’… Run eslint only in the changed parts of the code
JavaScript
114
star
3

arturia

๐ŸŽน arturia - a fully functional recreation of Arturia's MiniLab 3 MIDI controller made with CSS and JavaScript
TypeScript
108
star
4

vim-javascript-snippets

๐Ÿ”ง JavaScript & NodeJS Snippets for Vim
67
star
5

silverplate

๐ŸŒ Front-end boilerplate with Webpack, Hot Reload, Tree-Shaking and React
JavaScript
64
star
6

babelfish

๐Ÿก Straightforward library for translations and dictionaries
JavaScript
47
star
7

payment-request

๐Ÿ’ธ Implementation of Payment Request Api using pagarme
JavaScript
17
star
8

169254

๐Ÿ“Ÿ A simple API that simulate AWS EC2's metadata endpoint
Go
16
star
9

talks

โšก Lightning Talks
8
star
10

dotfiles

๐Ÿ”ง General-purpose dotfiles for terraforming your brand-new OS.
Shell
7
star
11

nosce

๐Ÿ“ฏ Get metadata information of your EC2 instances
Go
6
star
12

pagarme-github-challenge

๐Ÿ‘ทThis was a challenge I did in 2015 to be part of Pagar.me's Front-end Team
JavaScript
5
star
13

lando

โ˜„๏ธ Functional library utility for modern javascript
JavaScript
4
star
14

stripe

๐Ÿ’ธ Stripe's Checkout in React
JavaScript
4
star
15

wifi-password

Get your wifi's password in Fish Shell
Shell
3
star
16

vault

๐Ÿฆ Manage credentials securely using AWS KMS and AWS DynamoDB
2
star
17

dungeon

๐Ÿ‰ An attempt at a dungeon rogue-like deck game
Reason
2
star
18

react-deckset

๐Ÿ“ฐ Create beautiful presentations written in markdown
1
star
19

hackerrank

๐Ÿ“€ h4ck1ng ๐Ÿ“€
Go
1
star
20

brastemp

๐Ÿ“ฆ Proof-of-concept of a cluster infrastructure to deploy containers in the cloud.
HCL
1
star
21

hashi

๐Ÿ“Ÿ Proof-of-concept of a Hashicorp cluster infrastructure (Terraform, Consul, Nomad and Packer)
1
star
22

webhulk

๐Ÿ’ช A lightweight API for managing webhooks
Go
1
star