{ "syntax": "scss", "plugins": [ "stylelint-selector-bem-pattern", "stylelint-order" ], "rules": { # Проверка совпадения селектора и имени файла, БЭМ-ошибок # https://github.com/postcss/postcss-bem-linter#custom-patterns "plugin/selector-bem-pattern": [{ "implicitComponents": true, "componentName": "[-a-z]+", "componentSelectors": { "initial": "^(\\.{componentName}(__[a-z]+|--[-a-z0-9]+|__[-a-z]+--[-a-z0-9]+|.[-a-z]+|__[a-z]+.[-a-z]+)?)$", "combined": "^.+$" }, "ignoreSelectors": [ "^\\.(no-)?js(-modal-open)?$", "a(\\[[a-z]+|:[a-z]+)?", "h[1-6]", "pre", "blockquote", "thead", "tr", "img", "img", "p", "table", "^&:empty", "#{\\$[-a-z]+}__[-a-z]+", "^\\*$" ], }, { "severity": "warning", "message": "Селектор не из имени файла или БЭМ-ошибка" }], # Проверка очередности в контексте селектора # https://github.com/hudochenkov/stylelint-order/blob/master/rules/order/README.md "order/order": [ # Кастомные свойства "custom-properties", # Инклуды примесей { "type": "at-rule", "name": "include", }, # Свойства "declarations", # Медиаусловия { "type": "at-rule", "name": "media", }, # Псевдоселекторы и псевдоэлементы { "type": "rule", "selector": "^&:\\w+$" }, # Сторонние вложенные селекторы { "type": "rule", "selector": "^\\.[-_a-zA-Z0-9]+" }, # Элементы блока { "type": "rule", "selector": "^&__[-a-z0-9]+" }, # Модификаторы блока { "type": "rule", "selector": "^&--[-a-z0-9]+" }, ], # Проверка очередности правил # https://github.com/hudochenkov/stylelint-order/blob/master/rules/properties-order/README.md "order/properties-order": [[ { "properties": [ "content", "box-sizing", "display", "flex", "flex-wrap", "flex-basis", "flex-direction", "flex-flow", "flex-grow", "flex-shrink", "align-content", "align-items", "align-self", "justify-content", "order", "grid", "grid-area", "grid-auto-*", "grid-column", "grid-column-*", "grid-gap", "grid-row", "grid-row-*", "grid-template", "grid-template-*", "position", "z-index", "top", "right", "bottom", "left", "width", "min-width", "max-width", "height", "min-height", "max-height", "overflow", "overflow-*", "margin", "margin-*", "border", "border-*", "padding", "padding-*", ] }, { # "emptyLineBefore": "always", "properties": [ "transform", "transform-*", "backface-visibility", "perspective", "perspective-origin", "transition", "transition-*", "animation", "animation-*", ] }, ], { "severity": "warning", } ], # http://stylelint.io/user-guide/rules/ "color-hex-case": ["lower", { "severity": "warning", "message": "HEX цвета буквами строчными указывать следует" }], "color-named": ["never", { "message": "Цвета ключевыми словами нельзя писать" }], "color-no-invalid-hex": [true, { "message": "HEX цвета правильно написаны быть должны" }], "font-family-name-quotes": ["always-where-recommended", { "message": "В кавычки шрифта название брать следует" }], "font-family-no-duplicate-names": [true, { "message": "Шрифтов название повторять не следует" }], "font-family-no-missing-generic-family-keyword": [true, { "message": "Указанием sans-serif/serif... это заканчиваться должно" }], "font-weight-notation": ["numeric", { "message": "Плотность — цифрой: https://goo.gl/58eKi7", ignore: ["relative"] }], # "function-calc-no-invalid": [true, { # "message": "Для calc() некорректен синтаксис этот" # }], "function-calc-no-unspaced-operator": [true, { "message": "Для calc() пробелы вокруг операторов нужны" }], "function-linear-gradient-no-nonstandard-direction": [true, { "message": "Синтаксис градиентов стандартен: https://goo.gl/ba4HEc" }], "function-comma-space-after": ["always", { "message": "После запятой пробел необходим" }], "function-comma-space-before": ["never", { "message": "Перед запятой пробела быть не должно" }], "function-comma-newline-before": ["never-multi-line", { "message": "Переноса перед запятой быть не должно" }], "function-comma-newline-after": ["never-multi-line", { "message": "Переноса после запятой быть не должно" }], "function-parentheses-newline-inside": ["never-multi-line", { "message": "Переноса после скобки быть не должно" }], "function-max-empty-lines": [0, { "message": "Пустые строки в функциях нужно убрать" }], "function-name-case": ["lower", { "message": "Функций имена строчными буквами набирать следует" }], "function-whitespace-after": ["always", { "message": "Всегда нужны пробелы между функциями" }], "function-url-scheme-whitelist": [["data", "/^https/"], { "message": "Картинки фоновые только data: URL и по https хочешь ты" }], "number-leading-zero": ["always", { "message": "Нуль перед точкой явно указать следует" }], "number-max-precision": [6, { "message": "Максимум 6 символов после точки в десятичной дроби" }], "number-no-trailing-zeros": [true, { "message": "Лишний (необязательный) нуль в дроби" }], "string-no-newline": [true, { "message": "В строчных данных не должно быть переносов" }], "string-quotes": ["single", { "message": "Кавычки одиночные в стилях на проекте у нас" }], "length-zero-no-unit": [true, { "message": "Нулю не нужны измерения единицы" }], "time-min-milliseconds": [100, { "message": "Время менее 100мс — нет смысла использовать" }], "unit-case": ["lower", { "message": "Измерения единицы буквами строчными надобно" }], "value-keyword-case": ["lower", { "message": "Значения свойств буквами строчными надобно", "ignoreProperties": ["/font-/", ] }], "unit-no-unknown": [true, { "message": "Нет единиц измерения таких" }], "value-no-vendor-prefix": [true, { "message": "Вендорные префиксы в значениях использовать не следует" }], "property-no-vendor-prefix": [true, { "message": "Свойства с вендорными префиксами использовать не следует" }], "value-list-comma-newline-after": ["always-multi-line", { "message": "Значения свойств переносов иметь не должны" }], "value-list-comma-newline-before": ["never-multi-line", { "message": "Значения свойств переносов иметь не должны" }], "value-list-comma-space-after": ["always-single-line", { "message": "В значениях после запятой пробел необходим" }], "value-list-comma-space-before": ["never", { "message": "В значениях перед запятой пробел запрещен" }], "property-blacklist": [["text-rendering", ], { "message": "Свойство из чёрного списка" }], "property-case": ["lower", { "message": "Свойств значение буквами строчными указывать следует" }], "property-no-unknown": [true, { "message": "Такого свойства нет" }], "declaration-bang-space-after": ["never", { "message": "После знака восклицательного пробел убрать следует" }], "declaration-bang-space-before": ["always", { "message": "Перед знаком восклицательным пробел оставить хочешь ты" }], "declaration-colon-newline-after": ["always-multi-line", { "message": "Для свойств множественных каждое — на строке своей быть должно" }], "declaration-colon-space-after": ["always-single-line", { "message": "Правило задавая, один пробел после двоеточия ставь" }], "declaration-colon-space-before": ["never", { "message": "Правило задавая, пробел перед двоеточием не используй" }], "declaration-no-important": [true, { # "severity": "warning", "message": "!important с опаской применять следует" }], "declaration-property-unit-blacklist": [{ "font-size": ["pt"], "/^animation/": ["ms"], "/^padding/": ["%"] }, { "message": "Для этого свойства данные единицы измерения в чёрном списке" }], # "declaration-property-value-blacklist": [{ # "transform": ["/scale3d/", "/rotate3d/", "/translate3d/"], # "position": ["fixed"], # "color": ["/^green/"], # }, { # "message": "Для этого свойства значение это в чёрном списке" # }], "unit-blacklist": [["mm","cm","in","pc",], { "message": "Запрещены единицы измерения эти" }], "declaration-block-no-duplicate-properties": [true, { "message": "Правила повторять не следует" }], "declaration-block-no-shorthand-property-overrides": [true, { "message": "Свойство это неочевидно перебивает другое для селектора этого" }], "declaration-block-semicolon-newline-after": ["always", { "message": "После точки с запятой строки перенос необходим" }], "declaration-block-single-line-max-declarations": [1, { "message": "На строке одной правилу одному место есть только" }], "declaration-block-trailing-semicolon": ["always", { "message": "Свойство каждое точкой с запятой заканчивать хочешь ты" }], "block-closing-brace-empty-line-before": ["never", { "message": "Перед «}» пустой строки быть не должно" }], "block-closing-brace-newline-after": ["always", { "message": "После «}» переносу строки быть должно" }], "block-closing-brace-newline-before": ["always", { "message": "Перед «}» переносу строки быть должно" }], # "block-no-empty": [true, { # "severity": "warning", # "message": "Пустые блоки писать не следует" # }], "block-opening-brace-newline-after": ["always", { "message": "После «{» перенос строки быть должен" }], "block-opening-brace-space-before": ["always", { "message": "Перед «{» один пробел нужен" }], "selector-attribute-brackets-space-inside": ["never", { "message": "В селекторе атрибута пробел использовать не следует" }], "selector-attribute-operator-space-after": ["never", { "message": "В селекторе атрибута пробел писать не должен ты" }], "selector-attribute-operator-space-before": ["never", { "message": "В селекторе атрибута пробел писать не должен ты" }], "selector-attribute-quotes": ["always", { "message": "В селекторе атрибута кавычки писать должен ты" }], "selector-combinator-space-after": ["always", { "message": "После комбинатора в селекторе пробел нужен" }], "selector-combinator-space-before": ["always", { "message": "Перед комбинатором в селекторе пробел нужен" }], "selector-attribute-operator-blacklist": [["id"], { "message": "По ID джедай стилизовать не должен" }], "selector-max-compound-selectors": [3, { "severity": "warning", "message": "Селектор более чем 3-составной не хочешь ты" }], "selector-no-qualifying-type": [true, { "severity": "warning", "message": "Возможно, перенасыщенный селектор (использован селектор типа)", ignore: ["attribute"] }], "selector-pseudo-class-case": ["lower", { "message": "Псевдоклассы набирать буквами строчными надо" }], "selector-pseudo-class-no-unknown": [true, { "message": "Псевдокласса такого существование сомнительно" }], "selector-pseudo-class-parentheses-space-inside": ["never", { "message": "Внутри скобок в псевдоселекторах пробелы ставить не следует" }], "selector-pseudo-element-case": ["lower", { "message": "Псевдоэлементы набирать буквами строчными надо" }], "selector-pseudo-element-no-unknown": [true, { "message": "Псевдоэлемента такого на светлой строне силы нет" }], "selector-type-case": ["lower", { "message": "Селекторы буквами строчными набирать следует" }], "selector-type-no-unknown": [true, { "message": "Селектора такого на светлой стороне силы нет" }], "selector-max-empty-lines": [0, { "message": "Пустые строки в селекторах недопустимы" }], "selector-list-comma-newline-after": ["always", { "message": "После запятой перенос строки ставить нужно" }], "selector-list-comma-newline-before": ["never-multi-line", { "message": "Перед запятой переноса строки быть не должно" }], "selector-list-comma-space-after": ["always-single-line", { "message": "После запятой пробел быть должен" }], "selector-list-comma-space-before": ["never", { "message": "Перед запятой пробела быть не должно" }], "rule-empty-line-before": ["always", { "message": "Перед селектором вложенным строку пустую оставь", ignore: ["after-comment"] }], "media-feature-colon-space-after": ["always", { "message": "В @media после «:» пробелы необходимы" }], "media-feature-colon-space-before": ["never", { "message": "В @media перед «:» пробелов быть не должно" }], "media-feature-name-case": ["lower", { "message": "Строчные буквы использовать следует" }], "media-feature-name-no-vendor-prefix": [true, { "severity": "warning", "message": "Использовать вендорные префиксы не следует" }], "media-feature-parentheses-space-inside": ["never", { "message": "Пробелы после «(» и перед «)» нельзя использовать" }], "media-feature-range-operator-space-after": ["always", { "message": "Пробел после оператора диапазона ставить следует" }], "media-feature-range-operator-space-before": ["always", { "message": "Пробел перед оператором диапазона ставить следует" }], "at-rule-blacklist": [["extend", ], { "message": "В чёрном списке @-правило это" }], "at-rule-empty-line-before": ["always", { "message": "Перед @-правилами строку пустую оставь (кроме @import и @include)", ignoreAtRules: ["import", "include", "function", "return", "if", "else"], ignore: ["after-comment"] }], "at-rule-name-case": ["lower", { "message": "@-правила буквами строчными набирать следует" }], "at-rule-name-space-after": ["always", { "message": "После @-правила пробел ставить следует" }], "at-rule-no-unknown": [true, { "message": "Неизвестное @-правило", ignoreAtRules: [ "/^at-/", "/^mixin/", "/^include/", "/^if/", "/^else/", "/^function/", "/^return/", "/^each/", "/^while/", ] }], "at-rule-no-vendor-prefix": [true, { "message": "Для @-правил вендорные префиксы использовать не следует" }], "at-rule-semicolon-newline-after": ["always", { "message": "В @-правилах после ; новая строка быть должна" }], "at-rule-semicolon-space-before": ["never", { "message": "В @-правилах перед ; пробелов быть не должно" }], "comment-empty-line-before": ["always", { "message": "Перед комментом пустая строка требуется", except: ["first-nested"], ignore: ["stylelint-commands"] }], "comment-no-empty": [true, { "message": "Пустой коммент убрать нужно" }], "comment-whitespace-inside": ["always", { "message": "В комменте пробелы в начале о конце нужны" }], "comment-word-blacklist": [ [/((Х|х)+уй|(Х|х)уе|(Х|х)уё|(Б|б)ляд|(М|м)уда|(П|п)идо|(П|п)еди|(П|п)еде|(^|\s)+(Б|б)ля)/], { "message": "Комментарий херовый, при себе оставь его" }], "indentation": [2, { "message": "Использовать пробела два для отступов должен ты" }], "max-empty-lines": [3, { "message": "Максимум линий пустых допустимо: 3" }], "max-nesting-depth": [3, { "message": "Вложения боле 3 уровней — на тёмную сторону путь", "severity": "warning", "ignore": ["blockless-at-rules"] }], "no-duplicate-selectors": [true, { "message": "Селекторы дублировать не хочешь ты" }], "no-eol-whitespace": [true, { "message": "Пустые символы в конце строки. Используй https://goo.gl/Co2tZ8" }], "no-extra-semicolons": [true, { "message": "Две точки с запятой подряд не хочешь ты" }], "no-missing-end-of-source-newline": [true, { "message": "Файл пустой строкой кончаться должен: https://goo.gl/Co2tZ8" }], "media-feature-name-no-unknown": [true, { "message": "Медиаусловия такого на светлой стороне силы нет" }], "keyframe-declaration-no-important": [true, { "message": "!important в keyframe некоторыми браузерами игнорируется" }], # "no-descending-specificity": [true, { # "message": "Менее специфичный селектор, чем написанный выше" # }], "no-duplicate-at-import-rules": [true, { "message": "Повторный импорт файла не хочешь ты" }], "no-empty-source": [true, { "message": "Пустые файлы не хочешь ты" }], "shorthand-property-no-redundant-values": [true, { "message": "В значении свойства избыточность лишняя, короче можно написать" }], "selector-combinator-blacklist": [[">", ], { "severity": "warning", "message": "Комбинатор > опасно связывает CSS с DOM" }], "selector-max-attribute": [1, { # "severity": "warning", "message": "Атрибутов в селекторе более одного использовать не стоит" }], "selector-max-type": [2, { # "severity": "warning", "message": "Селекторов по тегу более двух использовать не стоит" }], "selector-max-class": [2, { # "severity": "warning", "message": "Классов в селекторе более двух использовать не стоит" }], "selector-max-combinators": [2, { # "severity": "warning", "message": "Комбинаторов в селекторе более двух использовать не стоит" }], # "selector-nested-pattern": ["^(&|\\.\\w+\\s+&)(__\\w|--\\w)?", { # "message": "Вкладывать такой селектор нельзя" # }], "selector-pseudo-class-blacklist": [["/^nth-/", ], { # "severity": "warning", "message": "Псевдокласс такой использовать не стоит" }], "value-list-max-empty-lines": [0, { "message": "Пустые строки в значениях свойств недопустимы" }], "declaration-block-semicolon-newline-before": ["never-multi-line", { "message": "Перенос перед символом ; недопустим" }], "declaration-block-semicolon-space-before": ["never", { "message": "Пробел перед символом ; недопустим" }], "selector-descendant-combinator-no-non-space": [true, { "message": "Комбинированные селекторы одним пробелом разделять следует" }], "linebreaks": ["unix", { "severity": "warning", "message": "Окончания строк должны быть LF. Настроить редактор следует" }], } }