# 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/properties-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-max-id: 0
  # 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-max-type:
    - 0
    - ignoreTypes:
        - fieldset
  # Styles for components should never need the universal selector.
  selector-max-universal: 0
  # 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-argumentless-call-parentheses: never
