diff --git a/sass-style-guide.md b/sass-style-guide.md index 683dab5..354aa02 100644 --- a/sass-style-guide.md +++ b/sass-style-guide.md @@ -1,37 +1,24 @@ -## Where to place code? +# Sass Styleguide -### Order of rules within a Sass file +## Inhaltsverzeichnis -The order of style rules that should be applied depends on the type of stylesheet. +- [Einleitung](#einleitung) +- [Manifest-Datei](#manifest-datei) +- [Style-Definitionen](#style-definitionen) +- [Syntax und Formatierung](#syntax-und-formatierung) +- [Selektorregeln](#selektorregeln) +- [Coding Konventionen](#coding-konventionen) +- [Kommentare](#kommentare) +- [Linting](#linting) +- [EditorConfig](#editorconfig) -#### Content-driven style definitions +## Einleitung -* The easiest way to read and find specific content-driven style rules is to visually follow the order of the content on the rendered page. Iterate in this order: - 1. *Outside in*: Following ZASAF, you are likely to start with the page wrapper element. - 2. *Left-to-right*: Next, you start with the left-most element, followed by elements in the same (grid) row. - 3. *Top-to-bottom*: You go on top-to-bottom just how you would read that page -* Some things are shared, like a variable definition that is referred in multiple parts of your stylesheet. Just put it on top of the first block that uses it. A situation that you should avoid is sharing variables across files. If you cannot avoid that, put it on top of the file. -* Nestings within the namespace of an element start with pseudo classes, followed by pseudo elements, followed by modifiers, followed by direct children (`>`), followed by children further down the DOM tree (if even necessary). Example: +Bei der Arbeit an großen, langlebigen Projekten mit mehreren Entwicklern ist es wichtig, dass wir alle einheitlich arbeiten. Unsere oberste Prämisse sollte sein, dass unsere Stylesheets auf der einen Seite leicht pflegbar und skalierbar sind und auf der anderen Seite unser Code transparent und lesbar bleibt. Um dies zu erfüllen, helfen folgende Guidelines. - ``` sass - .main-navigation--item - &:hover - border-color: $color-border-loud - &::before - content: '*' - &.active - > .link - +text-navigation-active - > .link - display: block - padding: 5px 0 - .back-button - color: $color-button-unobtrusive - ``` +## Manifest-Datei -#### Component files, manifest and base files - -You should order your rules from generic to specific. Example: +Wir splitten unseren Sass-Code in viele kleine Partials auf, die thematisch in sich geschlossen sind. Das erhöht die Flexibilität, Lesbarkeit und Wartbarkeit. In unserer Manifest-Datei ordnen wir unsere Partials dann von generisch hin zu spezifisch. ``` sass // Reset Styles @@ -45,7 +32,6 @@ You should order your rules from generic to specific. Example: // Utility Imports //---------------- @import utilities/center -@import utilities/hide-text @import utilities/visually-hidden // Global Imports @@ -59,87 +45,111 @@ You should order your rules from generic to specific. Example: // Abstract Component Imports //--------------------------- -@import abstract-components/section-box +@import abstract-components/boundary-box +@import abstract-components/gradient-overlay // Generic Component Imports //-------------------------- @import generic-components/button -@import generic-components/skip-links +@import generic-components/data-table // Specific Component Imports //--------------------------- -@import specific-components/page/page-footer -@import specific-components/page/page-header +@import specific-components/company-search +@import specific-components/page-header ``` -#### Order of property value assignments within a rule - -If your setup is build on PostCSS, try [PostCSS Sorting](https://github.com/hudochenkov/postcss-sorting) in cunjunction with [SugarSS](https://github.com/postcss/sugarss). - -1. Display: - * visibility - * opacity - * display -2. Layout: - * flex, flex-direction, flex-wrap, align-items, justify-content … - * vertical-align - * position - * z-index - * top, right, bottom, left - * float - * clear - * overflow -3. Box-Model (box-sizing: border-box): - * width - * height - * margin - * border - * border-radius - * padding - * outline - * transform - * box-shadow -4. Typography: - * font - * line-height - * text-align - * text-decoration - * white-space -5. Colors: - * color - * fill - * background -6. Miscellaneous: - * cursor - * transition - * pointer-events - * … - -## Syntax conventions - -* We use the old **Sass indented** syntax because it is the more rigid syntax of **Sass** and facilitates code homogeneity. The best way to end the fight between different parenthesis placement practictioners is to simply remove parenthesis. ;) -* Be consistant with indentation – we’re using two spaces. -* Use english for naming things. The English language has proven itself among coders as the standard. -* Use lowercase for class names. -* Multi-word selectors are **separated by hyphens (`-`)**. This is consistent with general CSS conventions including CSS attribute names and Sass functions. -* Please place **empty lines only between blocks of code that are not nested**. If you are working on a part of the code you already know your way around. But it is important that you get a quick overview if the whole file is not familiar to you. Besides, it’s easier to recognize the nesting structure if nestings are in one block with the parent selector. -* Be consistent in declaration order, cluster related properties (see above). -* Be consistant with quotes – we’re using single quotes. -* Quote attribute values in selectors, e.g. `input[type='checkbox']`. -* Write one selector per line, one rule per line. -* Put a space after `:` in property declarations, e.g. `margin: 0` -* Include a space after each comma in comma-separated property or function values, e.g. `rgba(255, 255, 255, 0)`. -* Use rgb and rgba color codes, because most of us can envision what color results by mixing red, green and blue. - -It could be a quick-win to use [Sass Lint](https://github.com/sasstools/sass-lint) in your projects. - -## Coding conventions - -### Avoid dangerous selectors - -If a selector is too generic, it’s dangerous. In 99% of cases you have to overwrite this rule somewhere. Be more specific. Try using a class instead. (Exception: CSS-Resetstyles) - -**bad** +## Style-Definitionen + +Wann wird wo was definiert? Wir gehen inhaltsgetrieben vor, d.h. wir schreiben unseren Sass-Code in der Reihenfolge, wie die Elemente auf der gerenderten Seite erscheinen werden: + +1. **von außen nach innen**: ZASAF folgend beginnt man in der Regel mit dem Page-Wrapper-Element. +2. **von oben nach unten**: Danach unterteilt man sich die Seite in (horizontale) Sektionen und beginnt mit der ersten (page-header -> page-main -> page-footer). +3. **von links nach rechts**: In einer Sektion fängt man ganz links mit dem ersten Element an (Page-Header: Logo links -> Navigation in der Mitte -> Suche rechts). + +### Notationsreihenfolge innerhalb eines Elements + +Verschachtelungen innerhalb eines Elements beginnen mit Pseudoklassen, gefolgt von Pseudoelementen, gefolgt von Modifiern. Auf Kindelemente, sowohl direkte als auch tiefer im DOM verschachtelte, sollte weitestgehend verzichtet werden. Hierfür wäre es besser einen neuen Selektorblock zu erstellen (siehe Coding Konventionen unten). + +``` sass +.main-navigation--item + position: relative + &:hover + border-color: $color-border-loud + &::before + content: '*' + &.highlighted + background-color: $color-background-loud + +.main-navigation--link + display: block + padding: 5px 0 + .main-navigation--item.highlighted & + color: $color-text-inverted +``` + +## Syntax und Formatierung + +Die Basis eines gemeinsam gelebten Stils ist ein grundlegendes Set an Syntax- und Formatierungsregeln. Eine strikte Einhaltung bringt Effizienzpotenziale, weil man Code schneller lesen, verstehen und abgleichen kann. Es ist weniger wahrscheinlich, dass man Dinge übersieht oder missversteht und niemand verbringt Zeit damit, seinen Arbeitsbereich durch Umformatierungen »für sich einzurichten«. + +### Schreibweise + +- Einrückung: zwei Leerzeichen, keine Tabs +- Multi-Line-Stil: Ein Selektor pro Zeile, eine Deklaration pro Zeile +- Selektorverschachtelung: maximal drei Ebenen tief, nach Möglichkeit jedoch vermeiden und eine eigene Klasse für Elemente einer Komponente einführen +- Alle Bezeichnungen werden auf englisch und klein geschrieben. Setzt man mehrere Wörter zu einem Selektor zusammen, trennt man diese durch einen Bindestrich: `.data-table`. +- Wir verwenden einfache Anführungszeichen: `font-family: 'Andale Mono'`. +- Werte in Attributselektoren werden in Anführungszeichen gesetzt: `input[type='checkbox']`. +- Nach einem `:` hinter der CSS-Eigenschaft gehört ein Leerzeichen: `margin: 0` +- Nach einem `,` in einer kommaseparierten Liste gehört ein Leerzeichen: `rgba(255, 255, 255, 0.5)` +- Wir verwenden rgb und rgba Farbcodes, weil sich die meisten von uns vorstellen können, welche Farbe durch das Mischen von Rot, Grün und Blau zustande kommt. + +### Deklarationsreihenfolge + +Um nicht ständig nach einer CSS-Eigenschaft suchen zu müssen, verwenden wir eine feste Deklarationsreihenfolge. Sie ist in logische Blöcke gegliedert, die man sich im Detail in der [Linter-Config](https://github.com/zweitag/rails-project-template/blob/725fb08bad935e6ae560a92618b787da319e843a/.sass-lint.yml) ansehen kann. + +#### 1. Übergeordnetes + +- z.B. content, will-change + +#### 2. Allgemeine Sichtbarkeit + +- z.B. opacity, visibility, display + +#### 3. Layout-Mechanismen + +- Flexbox: z.B. justify-content, align-items, flex +- Grid: z.B. columns, column-gap, column-rule +- Table: z.B. table-layout, border-collapse, border-spacing +- List: z.B. list-style, counter-increment, counter-reset + +#### 4. Positionierung im Raum + +- z.B. float, position, vertical-align + +#### 5. Box Model inkl. Transformation + +- z.B. box-sizing, width, height, margin, border, padding, transform + +#### 6. Typografie + +- z.B. font, line-height, text-decoration, white-space, word-wrap + +#### 7. Farbe + +- z.B. fill, color, background + +#### 8. Rest + +- z.B. cursor, pointer-events, transition + +## Selektorregeln + +### Vermeide zu generische Selektoren + +In 99% der Fälle wird man generische Selektoren überschreiben (müssen), was zu mehr Code und einem erhöhtem Wartungsaufwand führt. Darum sei spezifischer und benutze stattdessen besser eine Klasse. (Ausnahme: CSS-Resetstyles) + +**schlecht** ``` sass header @@ -152,7 +162,7 @@ ul list-style-type: circle ``` -**good** +**gut** ``` sass .page-header @@ -165,11 +175,11 @@ ul list-style-type: circle ``` -### Avoid element selectors +### Vermeide Basiselementselektoren -Element selectors are expensive. Like the rule above, be more specific. Try using a class instead. Furthermore elements like `
` and `` should always have a class-attribute in your markup because otherwise they have no function anyway and you can waive them. +Basiselementselektoren sind schlecht (siehe Regel darüber) und erhöhen die Spezifität unnötigerweise. Auch hier sollte auf eine Klasse zurückgegriffen werden. Außerdem sollten Elemente wie `