From c766125fe85f8e2e5106bb6364b709b2955db341 Mon Sep 17 00:00:00 2001 From: chapoi <101828855+chapoi@users.noreply.github.com> Date: Wed, 22 Nov 2023 16:04:19 +0100 Subject: [PATCH] UX: add BEM documentation to styleguide (#24512) * UX: add BEM documentation to styleguide * grammar fix Co-authored-by: Jarek Radosz * typo fix Co-authored-by: Jarek Radosz * add another hierarchy layer --------- Co-authored-by: Jarek Radosz --- .../discourse/templates/styleguide/index.hbs | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/plugins/styleguide/assets/javascripts/discourse/templates/styleguide/index.hbs b/plugins/styleguide/assets/javascripts/discourse/templates/styleguide/index.hbs index e0fe882bc2e..7d2b8c4e905 100644 --- a/plugins/styleguide/assets/javascripts/discourse/templates/styleguide/index.hbs +++ b/plugins/styleguide/assets/javascripts/discourse/templates/styleguide/index.hbs @@ -2,4 +2,84 @@
{{i18n "styleguide.welcome"}}
+

Syntax

+

BEM

+

+ The guidelines outlines below strive to bring structure and consistency to + our classnames. Additionally, with this approach the nesting of css is + firmly reduced. BEM stands for: +

    +
  • Block
  • +
  • Element
  • +
  • Modifier
  • +
+

+

We use a slightly modified version of the BEM classname format.

+

Block

+ For example + d-modal +

A block is a standalone component. Blocks can be used within blocks. It + should be a "top-level" element, which could be used in its entirety in + another place of the app. It has no dependencies on any parent class.

+

Element

+ For example + d-modal__header +

+ An element is a part of a block that can not be used outside that context. + They because it depends on the parent class and can not be used standalone + outside this context. In the example above, an element with class + d-modal__header + will only work within the d-modal block, but not when placed elsewhere. +

+

Modifiers

+ Examples + --success, + --large,--inline, + --highlighted +

+ A modifier is used mainly for changing the appearance, if different than the + default. It is less than an element, and has no html structure of it own. + Meaning, it can only exist when applied to an element (or potentially a + block). +

+

In classic BEM, a modifier looks like: + d-modal__header--success. This can quickly turn into very + verbose HTML. Imagine an already long block-element name, for example: + +

+ class="chat-message-creator__search-container" +

+ + With classic BEM and 2 modifiers, it would look like this: + +

+ class="chat-message-creator__search-container + chat-message-creator__search-container--highlighted + chat-message-creator__search-container--inline" +

+ + To avoid this, we decouple our modifiers from the BE parts of the classnames + and use them as separate classes. So in the previous case with 2 modifiers + this turns into: +

+ class="chat-message-creator__search-container --highlighted + --inline" +

+ + which is far more readable. +

+ +

Special modifiers

+ Some special prefixes are useful to identify modifiers as temporary states or + condition. These are: +
    +
  • is-foo = example: is-open
  • +
  • has-foo = example: has-errors
  • +
+ +

In Code

+

Even though the BEM convention avoids nesting, we can use SCSS to write the + code nested. This is to taste, but I find it easier to read and write, + because it will keep all relevant elements and modifiers grouped together + and avoids unnecessary repetition of the block class.

\ No newline at end of file