--- /dev/null
+# Base taken from https://github.com/material-components/material-components-web/blob/master/.stylelintrc.yaml
+#
+# For more information about Drupal standards that this configuration is trying
+# to follow please check
+#
+# - https://www.drupal.org/docs/develop/standards/css/css-formatting-guidelines
+# - https://www.drupal.org/docs/develop/standards/css/csscomb-settings-for-drupal-css-formatting-and-sort-tool
+
+# We are using https://github.com/stylelint/stylelint-config-standard/blob/master/index.js
+# as a base for our rules.
+extends: stylelint-config-standard
+ignoreFiles:
+ - node_modules/**/*
+plugins:
+ - stylelint-selector-bem-pattern
+ - stylelint-scss
+ - stylelint-order
+rules:
+ # Follow best practices
+ font-family-name-quotes: always-where-recommended
+ # http://stackoverflow.com/questions/2168855/is-quoting-the-value-of-url-really-necessary
+ function-url-quotes: never
+ # https://www.w3.org/TR/selectors/#attribute-selectors
+ # http://stackoverflow.com/q/3851091
+ selector-attribute-quotes: always
+ # Double-quotes are our convention throughout our codebase within (S)CSS.
+ # They also reflect how attribute strings are normally quoted within the DOM.
+ string-quotes: double
+ # Before getting a hard attack about the fact that we require proper CSS
+ # ordering please read next articles:
+ # - https://css-tricks.com/poll-results-how-do-you-order-your-css-properties/
+ # - https://www.drupal.org/docs/develop/standards/css/csscomb-settings-for-drupal-css-formatting-and-sort-tool
+ # Note that we do not follow exactly the same proposed standard for now like
+ # in csscomb ddo page.
+ #
+ # This order definition is taken from:
+ # - https://github.com/sasstools/sass-lint/blob/develop/lib/config/property-sort-orders/smacss.yml
+ order/declaration-block-properties-specified-order:
+ # Box
+
+ - display
+ - position
+ - top
+ - right
+ - bottom
+ - left
+
+ - flex
+ - flex-basis
+ - flex-direction
+ - flex-flow
+ - flex-grow
+ - flex-shrink
+ - flex-wrap
+ - align-content
+ - align-items
+ - align-self
+ - justify-content
+ - order
+
+ - width
+ - min-width
+ - max-width
+
+ - height
+ - min-height
+ - max-height
+
+ - margin
+ - margin-top
+ - margin-right
+ - margin-bottom
+ - margin-left
+
+ - padding
+ - padding-top
+ - padding-right
+ - padding-bottom
+ - padding-left
+
+ - float
+ - clear
+
+ - columns
+ - column-gap
+ - column-fill
+ - column-rule
+ - column-span
+ - column-count
+ - column-width
+
+ - transform
+ - transform-box
+ - transform-origin
+ - transform-style
+
+ - transition
+ - transition-delay
+ - transition-duration
+ - transition-property
+ - transition-timing-function
+
+ # Border
+
+ - border
+ - border-top
+ - border-right
+ - border-bottom
+ - border-left
+ - border-width
+ - border-top-width
+ - border-right-width
+ - border-bottom-width
+ - border-left-width
+
+ - border-style
+ - border-top-style
+ - border-right-style
+ - border-bottom-style
+ - border-left-style
+
+ - border-radius
+ - border-top-left-radius
+ - border-top-right-radius
+ - border-bottom-left-radius
+ - border-bottom-right-radius
+
+ - border-color
+ - border-top-color
+ - border-right-color
+ - border-bottom-color
+ - border-left-color
+
+ - outline
+ - outline-color
+ - outline-offset
+ - outline-style
+ - outline-width
+
+ # Background
+
+ - background
+ - background-attachment
+ - background-clip
+ - background-color
+ - background-image
+ - background-repeat
+ - background-position
+ - background-size
+
+ # Text
+
+ - color
+
+ - font
+ - font-family
+ - font-size
+ - font-smoothing
+ - font-style
+ - font-variant
+ - font-weight
+
+ - letter-spacing
+ - line-height
+ - list-style
+
+ - text-align
+ - text-decoration
+ - text-indent
+ - text-overflow
+ - text-rendering
+ - text-shadow
+ - text-transform
+ - text-wrap
+
+ - white-space
+ - word-spacing
+
+ # Other
+
+ - border-collapse
+ - border-spacing
+ - box-shadow
+ - caption-side
+ - content
+ - cursor
+ - empty-cells
+ - opacity
+ - overflow
+ - quotes
+ - speak
+ - table-layout
+ - vertical-align
+ - visibility
+ - z-index
+ declaration-property-unit-whitelist:
+ font-size:
+ - "rem"
+ - "px"
+ # The following prefix rules are enabled since we use autoprefixer.
+ at-rule-no-vendor-prefix: true
+ media-feature-name-no-vendor-prefix: true
+ selector-no-vendor-prefix: true
+ value-no-vendor-prefix: true
+ # Usually if you're nesting past 3 levels deep there's a problem.
+ max-nesting-depth: 3
+ # Because we adhere to BEM we can limit the amount of necessary compound
+ # selectors. Most should
+ # just be 1 level selector. However, modifiers can introduce an additional compound selector.
+ # Futhermore, generic qualifying selectors (e.g. `[dir="rtl"]`) can introduce yet another level.
+ selector-max-compound-selectors: 4
+ # For specificity: disallow IDs (0). Allow for complex combinations of classes, pseudo-classes,
+ # attribute modifiers based on selector-max-compound-selectors, plus an addition for
+ # pseudo-classes (4). Allow for pseudo-elements (1).
+ selector-max-specificity: 0,4,1
+ # Disallow "@extend" in scss.
+ # http://csswizardry.com/2016/02/mixins-better-for-performance/
+ # http://vanseodesign.com/css/sass-mixin-or-extend/
+ # Besides performance, @extend actually *changes* the selector precedence by creating a compound
+ # selector, which can lead to ambiguous results.
+ at-rule-blacklist:
+ - extend
+ # Extremely useful for typos, and anything emergent can be ignored by this rule
+ property-no-unknown:
+ - true
+ - ignoreProperties:
+ - contain
+ # There is no reason that a specific ID would be needed for UI components
+ selector-no-id: true
+ # Qualifying types are not needed when using a naming system like BEM
+ selector-no-qualifying-type: true
+ # In general, we should *never* be modifying elements within our components, since we can't
+ # predict the use cases in which users would add a certain type of element into a component.
+ # The only hard exception to this are `fieldset` elements, which can be disabled and in that case
+ # we want our UI components within that fieldset to be disabled as well.
+ # Other exceptions to this may be in packages/material-components-web, in which case this rule could
+ # be disabled for that file, with an explanation.
+ selector-no-type:
+ - true
+ - ignoreTypes:
+ - fieldset
+ # Styles for components should never need the universal selector.
+ selector-no-universal: true
+ # Ensure any defined symbols are prefixed with "mdc-"
+ # TODO: Remove "md-" pattern.
+ #custom-media-pattern: ^mdc?-.+
+ #custom-property-pattern: ^mdc?-.+
+ #selector-class-pattern:
+ # - ^mdc?-.+
+ # - resolveNestedSelectors: true
+ #selector-id-pattern: ^mdc?-.+
+ # Names are more semantic than numbers
+ font-weight-notation: named-where-possible
+ # http://www.paulirish.com/2010/the-protocol-relative-url/
+ function-url-no-scheme-relative: true
+ # @todo TODO: and FIXME: warnings are super useful because they remind us that
+ # we should address these within our codebase.
+ comment-word-blacklist:
+ -
+ - todo
+ - /^TODO:/
+ - /^FIXME:/
+ - severity: warning
+ # Our Drupal style guide is with leading zero.
+ # Leading zero presence does not matter http://hey.georgie.nu/leadingzero/.
+ number-leading-zero: always
+
+ # We use Harry Roberts' BEM dialect as our preferred way to format classes.
+ # See: http://csswizardry.com/2013/01/mindbemding-getting-your-head-round-bem-syntax/
+ # See: https://github.com/postcss/postcss-bem-linter/blob/c59db3f/lib/preset-patterns.js#L39
+ plugin/selector-bem-pattern:
+ componentName: ^[a-z]+(?:-[a-z]+)*$
+ # <namespace>-<block>__<element>*--<modifier>*[<attribute>]*
+ componentSelectors: ^\.paragraphs?-{componentName}(?:__[a-z]+(?:-[a-z]+)*)*(?:--[a-z]+(?:-[a-z]+)*)*(?:\[.+\])*$
+ ignoreSelectors:
+ - ^fieldset
+ - ^\[aria\-disabled=(?:.+)\]
+
+ # @todo - figure how we are going to use this SCSS naming patterns?
+ # SCSS naming patterns, just like our CSS conventions above.
+ # (note for $-vars we use a leading underscore for "private" variables)
+ #scss/dollar-variable-pattern:
+ # - ^_?mdc-.+
+ # -
+ # ignore: local
+ #scss/at-function-pattern: ^mdc-.+
+ #scss/at-mixin-pattern: ^mdc-.+
+ # Prevents unneeded nesting selectors
+ scss/selector-no-redundant-nesting-selector: true
+ # Since leading underscores are not needed, they can be omitted
+ scss/at-import-no-partial-leading-underscore: true
+ # Since mixins are explicit (`@include`) and parens are unnecessary for argumentless mixins, they
+ # can be omitted.
+ scss/at-mixin-no-argumentless-call-parentheses: true