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

Rework Sass-Styleguide #2

Merged
merged 22 commits into from
Sep 7, 2017
Merged

Rework Sass-Styleguide #2

merged 22 commits into from
Sep 7, 2017

Conversation

rastersysteme
Copy link
Contributor

No description provided.

@rastersysteme rastersysteme self-assigned this Jun 21, 2017
@rastersysteme
Copy link
Contributor Author

@ChristianPeters Ich habe das ganze ein wenig angepasst und erweitert. Magst du schon mal drüber schauen und mir Feedback geben bzw. sagen, was dir noch fehlt?

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 unterschiedlicher Fähigkeiten 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 aber transparent und lesbar bleibt. Um dies zu erfüllen, helfen folgende Empfehlungen.
Copy link
Member

@ChristianPeters ChristianPeters Jun 21, 2017

Choose a reason for hiding this comment

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

  • Bei "unterschiedlicher Fähigkeiten" könnte man sich angegriffen fühlen: "Oh, meint er mich damit, bin ich ihm nicht gut genug? "

  • warum "aber transparent und lesbar"?

  • Empfehlungen? Wenn du das so sagst, ist es auch in Ordnung es anders zu machen. "Guidelines"?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

@ChristianPeters Ich wollte ein deutsches Wort für Guidelines nehmen und da klang Empfehlungen freundlicher als Handlungsanweisungen. Was hältst du von Richtlinien oder Vorgaben?

Copy link
Member

Choose a reason for hiding this comment

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

Wir nutzen in unserem Sprachgebrauch doch auch das englische Wort "Guidelines". Richtlinien wäre die beste Übersetzung, aber das ist weniger positiv konnotiert.


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.
Copy link
Member

@ChristianPeters ChristianPeters Jun 21, 2017

Choose a reason for hiding this comment

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

  • Was für ein Page-Wrapper-Element? Das kommt doch noch aus meinem alten System, darüber hat in diesen Guidelines ja noch niemand etwas gesagt.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

@ChristianPeters Es gibt in der Regel immer ein Page-Wrapper-Element, in das die Komponenten gepackt werden. Bei mir ist das .page.

Copy link
Member

Choose a reason for hiding this comment

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

Aber das steht ja nur in einer gesonderten Page-Komponente und es trifft nicht mehr auf spezifische Komponenten zu. Aber okay, man versteht das Prinzip.

&.highlight
bacground-color: $color-background-loud

.main-navigation--item
Copy link
Member

@ChristianPeters ChristianPeters Jun 21, 2017

Choose a reason for hiding this comment

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

  • Wie jetzt, ein zweiter Block zu .main-navigation--item?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Copy/Paste-Fehler :/

border-color: $color-border-loud
&::before
content: '*'
&.highlight
Copy link
Member

@ChristianPeters ChristianPeters Jun 21, 2017

Choose a reason for hiding this comment

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

  • Das ist doch ein Modifier, oder? Dann sollte er .highlighted heißen.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Good catch!

.main-navigation--item
display: block
padding: 5px 0
.highlight > &
Copy link
Member

@ChristianPeters ChristianPeters Jun 21, 2017

Choose a reason for hiding this comment

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

  • Was ist .highlight? Es klingt inhaltlich wie ein Modifier und sollte dann nicht allene stehen.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

@ChristianPeters Ja, .highlighted ist ein Modifier. Aber warum darf er nicht alleine stehen?

Variante 1:

.main-navigation--item
  &.highlighted
    bacground-color: $color-background-loud

.main-navigation--link
  .highlighted > &
    color: $color-text-inverted

vs.

Variante 2:

.main-navigation--item
  &.highlighted
    bacground-color: $color-background-loud

.main-navigation--link
  .main-navigation--item.highlighted > &
    color: $color-text-inverted

vs.

Variante 3:

.main-navigation--item
  &.highlighted
    bacground-color: $color-background-loud
    .main-navigation--link
      color: $color-text-inverted

.main-navigation--link

Bei Variante 3 steht die Eigenschaft nicht beim Link, wo sie meines Erachtens hingehört. Daher ist das die schlechteste Vorgehensweise. Bei Variante 2 überqualifiziere ich den Selektor, den ich später im CSS nicht brauche. Daher bin ich für Variante 1.

Copy link
Member

Choose a reason for hiding this comment

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

Das ist eine Grundregel von Modifiern, s. https://github.com/zweitag/html-css-guidelines/blob/master/README.md#modifier:

steht nie alleine, sondern ist nur in Verbindung mit der Komponente eindeutig

Ein Modifier an sich ist eben nicht eindeutig. Es können viele Dinge .highlighted sein. Nun ist die .main-navigation immer sehr hoch in der Seitenhierarchie angesiedelt. Aber nimm eine beliebige Liste, die gehighlightete Einträge enthalten kann, die wiederum Inhalt enthalten kann, der gehighlighted sein kann:

%ul.articles-list
  %li.articles-list--item.highlighted
    %h3 Hitlers geheimes Silberbesteck gefunden
    %ul.tag-cloud
      %li.tag-cloud--item.highlighted
        %a.tag-cloud--link Hitler
      %li.tag-cloud--item
        %a.tag-cloud--link Sommerflautenunfug
  %li.articles-list--item.highlighted
    %h3 Große Dürre: Werden wir alle sterben?
    %ul.tag-cloud
      %li.tag-cloud--item
        %a.tag-cloud--link Wetter
      %li.tag-cloud--item
        %a.tag-cloud--link Sommerflautenunfug

Wenn du jetzt schreibst…:

.tag-cloud--link
  &.highlighted
    background-color: yellow

… dann sind in obigem Beispiel alle Tag-Cloud-Links gelb hinterlegt, obwohl es nur der mit "Hitler" sein sollte.

Daher die Regel: Modifier dürfen nie alleine stehen. Alternativ müsste man es m.M.n. so machen wie BEM und %a.tag-cloud--link.tag-cloud--link__highlighted schreiben oder sowas.

Copy link
Member

Choose a reason for hiding this comment

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

Variante 2 ist für mich die richtige, da der Selektor demnach nicht überqualifiziert ist. Zu Variante 3 gebe ich dir Recht, finde ich auch ungünstiger.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Die Grundregel

steht nie alleine, sondern ist nur in Verbindung mit der Komponente eindeutig

habe ich eher so verstanden, dass ich folgendes nicht machen darf:

.highlighted
  background-color: yellow

In meinem Beispiel steht .highlighted demnach auch nicht alleine, sondern bezieht das Nachfahrenelement mit ein. Apropos, Ich nehme an, in deinem obigen Sass-Beispiel meinst du eigentlich:

.tag-cloud--link
  .highlighted &
    background-color: yellow

In dem Fall versteh ich deinen Einwand, das wäre Mist. Wenn du dir mein Beispiel oben aber nochmal näher anschaust, dann habe ich ein > benutzt, was das Problem löst.

Ich finde übrigens auch, dass

.tag-cloud--link
  .tag-cloud--item.highlighted &
    background-color: yellow

schwerer zu lesen ist. Der Modifier, auf den es mir letztendlich ankommt, geht unter.

Und ja, an dieser Stelle wünscht man sich BEM. Hier würde der hervorgehobene Link eindeutig mittels tag-cloud__link--highlighted selektiert werden können. Ach, wie war das nochmal mit CSS Modules? ;)

Copy link
Member

Choose a reason for hiding this comment

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

Okay, > löst genau dieses Problem hier technisch. Aber wie einfach ist das mal zu übersehen oder zu vergessen? Auch wenn es dir nicht passieren würde, es ist schon subtil und wenn man sich der Tragweite nicht bewusst es, kommt der Autor nicht drauf es zu schreiben und ein Reviewer übersieht es vielleicht beim Durchgucken.

Und was machst du, wenn da mehrere Elemente noch dazwischenstehen?

Hier bin ich der Meinung, dass du hier zu sehr für diesen Fall optimierst zu einem hohen Preis. Einfache Regeln sind sehr wertvoll. "darf nie" ist sehr viel einfacher als "soll nicht, es sei denn …".
Wenn du schon zustimmst, dass man sich an dieser Stelle BEM wünscht, dann spricht das doch auch für die explizitere Variante 2?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Auch wenn ich aufgrund von Lesbarkeit und weniger CSS-Code immer noch meine Variante bevorzuge, so ist das Argument mit den Elementen dazwischen kein so schlechtes wenn ich ehrlich bin. Ich könnte jetzt zwar ausholen und sagen, dann muss man eben die Architektur umstricken, aber das führt zu weit. Ich will endlich fertig werden hier. Daher können wir es gern zu handhaben. Ich würde den PR #3 gleich mergen.

Copy link
Member

Choose a reason for hiding this comment

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

Es geht mir vor allem darum, das System nicht zu kompliziert zu machen. Je ausgefeilter das Regelwerk desto unwahrscheinlicher ist eine 100%-Einhaltung durch alle Anwender.

Wenn in einer Diskussion eine Tradeoff-Entscheidung zwischen mehreren Varianten getroffen werden muss (Explizierung dessen was gemeint ist vs. dadurch entstehendes visuelles Rauschen), und die unterschiedlichen Positionen aus einer anderen Gewichtung der Präferenzen entsteht, find ich es gut, wenn im Zweifel die einfachere Lösung gewinnt.

Und hier würde ich sagen: "Bei Modifier immer Selektor von der modifizierten Komponente davor" ist einfacher als wenn man darauf achten muss, Kindselektoren einsetzbar zu machen.


It’s the typographic standard to use number keywords. Also it’s shorter and saves some bits.
Die Zahlen 100, 200 … 900 sind typografischer Standard. Außerdem sind sie kürzer und sparen ein paar Bits ein. ;)
Copy link
Member

@ChristianPeters ChristianPeters Jun 21, 2017

Choose a reason for hiding this comment

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

  • Das 1 Zeichen ist lächerlich. An anderer Stelle erlauben wir uns viel inperformantere Praktiken, die auch nicht Erwähnung finden. Triftiger ist doch das Argument, dass man mit der Zahlen-Darstellung besser differenzieren kann und auch nicht mal "bold" und mal "600" schreiben möchte.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

OK.


We want to make it easy for others to find their way through stylesheets. Therefore, we group rules and give them a title by writing a comment. We distinguish 3 types of comments:
Zum Testen unseres Sass-Codes benutzen wir [Sass Lint](https://github.com/sasstools/sass-lint). Der Linter sollte am Ende keine Fehler oder Warnungen ausspucken.
Copy link
Member

@ChristianPeters ChristianPeters Jun 21, 2017

Choose a reason for hiding this comment

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

  • Ende = Projektende = Projekt wird übergeben oder eingestampft und dann ist es uns eh egal? :) Hier sind genauere Richtlinien von Nöten, wann der Linter ohne Fehler und wann ohne Warnungen durchzulaufen hat plus Best Practices

Copy link
Contributor Author

Choose a reason for hiding this comment

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

@ChristianPeters Hierüber hatten wir ja schon gesprochen, Stichwort Commit-Hook/CI-Test. Ich kann den letzten Satz auch erstmal streichen, wenn du dich so sehr daran störst. Bez. der Richtlinie könnte man natürlich einfach sagen, dass es zu keinem Zeitpunkt Fehler oder Warnungen geben darf (wobei mich mich gerade frage, wozu dann überhaupt Warnungen!?).

//=============
Möchte man eine einzelne Zeile in einem Block kommentieren, so setzt man den Kommentar ans Ende der Deklaration:

```
Copy link
Member

@ChristianPeters ChristianPeters Jun 21, 2017

Choose a reason for hiding this comment

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

  • Syntax-Highlighting fehlt


.photo-gallery
```
Copy link
Member

@ChristianPeters ChristianPeters Jun 21, 2017

Choose a reason for hiding this comment

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

  • Syntax-Highlighting fehlt


// Video Styles
//=============
## Editorconfig
Copy link
Member

@ChristianPeters ChristianPeters Jun 21, 2017

Choose a reason for hiding this comment

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

  • Typo: EditorConfig

@rastersysteme
Copy link
Contributor Author

@ChristianPeters Ich bin mit dem ersten Einarbeiten deines Feedbacks durch, habe hier und da aber noch Rückfragen bzw. Disksussionsbedarf. ;)

&::before
content: '*'
&.highlighted
bacground-color: $color-background-loud
Copy link
Member

@ChristianPeters ChristianPeters Sep 6, 2017

Choose a reason for hiding this comment

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

  • Typo

.main-navigation--item
display: block
padding: 5px 0
.highlight > &
Copy link
Member

Choose a reason for hiding this comment

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

Okay, > löst genau dieses Problem hier technisch. Aber wie einfach ist das mal zu übersehen oder zu vergessen? Auch wenn es dir nicht passieren würde, es ist schon subtil und wenn man sich der Tragweite nicht bewusst es, kommt der Autor nicht drauf es zu schreiben und ein Reviewer übersieht es vielleicht beim Durchgucken.

Und was machst du, wenn da mehrere Elemente noch dazwischenstehen?

Hier bin ich der Meinung, dass du hier zu sehr für diesen Fall optimierst zu einem hohen Preis. Einfache Regeln sind sehr wertvoll. "darf nie" ist sehr viel einfacher als "soll nicht, es sei denn …".
Wenn du schon zustimmst, dass man sich an dieser Stelle BEM wünscht, dann spricht das doch auch für die explizitere Variante 2?

Copy link
Member

@ChristianPeters ChristianPeters left a comment

Choose a reason for hiding this comment

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

Es sind noch 2 Themen und 2 kleine To-Dos offen:

Themen:

  1. Modifier dürfen nie alleine stehen – oder manchmal doch?
  2. Linter: Verwendungsregel und -hilfe (Config)

Offene To-Dos:

  • "Guidelines" statt "Empfehlungen"
  • Typo (s.o.)

@rastersysteme
Copy link
Contributor Author

@ChristianPeters

Linter: Verwendungsregel und -hilfe (Config)

Das würde ich im Sass Linting PR im anderen Repo gern abhandeln. Dort ist ja auch noch ein Kommentar von dir offen, den ich angehen muss. Wenn das für dich OK ist, kannst du den hier gern mergen.

.main-navigation--link
display: block
padding: 5px 0
.highlighted > &
Copy link
Member

@ChristianPeters ChristianPeters Sep 6, 2017

Choose a reason for hiding this comment

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

  • Änderst du das dann bitte noch?

//--------------------
.photo-contest-panel
Zum Testen unseres Sass-Codes benutzen wir [Sass Lint](https://github.com/sasstools/sass-lint). Der Linter sollte am Ende keine Fehler oder Warnungen ausspucken.
Copy link
Member

@ChristianPeters ChristianPeters Sep 6, 2017

Choose a reason for hiding this comment

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

  • Nach wie vor ist noch undefiniert, wann gelintet werden soll. Das steht auch im Rails Template PR nicht. Wann machst du das denn? Hast du einen Pre-Commit-Hook? Gibt's nen Tool, um es als PR-Check hinzuzufügen?
  • Hier fehlt dann auch noch der Link zur Config

@rastersysteme
Copy link
Contributor Author

Derzeit linte ich meine Sass-Dateien automatisch in Sublime Text, damit sie noch vor dem Comitten korrekt ins Repo wandern. Man könnte auch überlegen, ob man Travis das testen lässt. Was ist da deine Präferenz?

@ChristianPeters
Copy link
Member

Derzeit linte ich meine Sass-Dateien automatisch in Sublime Text, damit sie noch vor dem Comitten korrekt ins Repo wandern. Man könnte auch überlegen, ob man Travis das testen lässt. Was ist da deine Präferenz?

Ich glaube, man braucht beides: sowohl eine lokale Lösung, zumindest für Frontendler, damit die Fehler frühestmöglich erkannt werden als auch einen PR-Check, um sicherzugehen, dass keine Violations in Master kommen.

PR-Check könnte Travis CI sein oder ein extra Dienst, der die Violations z.B. als Kommentare an entsprechende Code-Zeilen schreibt. Ich glaube, das ist im Endeffekt praktischer als ein failender Travis-Build. Kostet mit ca. 10$/Repo aber auch ordentlich. Primärer Anbieter wäre https://houndci.com/, nicht wirklich günstigere Alternative https://sideci.com/ und dann noch das "Ungetüm" CodeClimate.

@hzeus @stsc3000 Wie weit seid ihr damit bei Ruby?

@rastersysteme Willst du vielleicht mal bei DZF die TravisCI-Konfig ausprobieren? Vielleicht kommen wir ja auch damit aus.

@hzeus
Copy link
Member

hzeus commented Sep 7, 2017

Wir haben bei Ruby noch keine eine automatisierte PR-Lösung geplant, das läuft im Moment noch auf freiwilliger Basis auf den Entwickler-Rechnern.

Wenn ihr für sass eine Lösung sucht, wäre es natürlich sinnvoll, wenn die direkt beides kann.

@rastersysteme
Copy link
Contributor Author

rastersysteme commented Sep 7, 2017

Mein Vorschlag wäre auch Hound CI. So hätte man auch eine Lösung für Rubocop.
Ich kann das aber gern einmal bei DZF mit Travis ausprobieren.

@rastersysteme rastersysteme merged commit 28e3fd5 into master Sep 7, 2017
@rastersysteme rastersysteme deleted the rework-sass-style-guide branch September 7, 2017 13:50
@ChristianPeters
Copy link
Member

Okay, kann jetzt gemergt werden.

  • Die Struktur des Repos ist aber dadurch noch nicht ganz im Reinen. Wir haben auf der Startseite auch noch Selector Best Practices. Ich denke, es muss nicht alles hier in der einen Datei sein.

  • Bei den Selector Best Practices verweisen wir noch auf externe Links. Darüber hatten wir ja mal gesprochen, oder? Während ich es gut finde, Räder nicht neu zu erfinden, sollte man doch auch Content lieber im Sinne eines Zitats übernehmen, wo dann aber auch klar ist, was davon gutgeheißen wird und was nicht. Die Quelle sollte dann freilich verlinkt werden.

Ich lege dafür mal Issues an.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants