К основному содержанию
скилл CX Codex

scss-best-practices — скилл для Claude Code: как установить

Скилл задаёт правила вёрстки на SCSS: структуру файлов 7-1, правила вложенности селекторов, систему переменных и соглашения БЭМ. Помогает агенту писать чистые стили.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add Mindrally/skills --skill scss-best-practices -a claude-code
Открыть на GitHub

Что делает scss-best-practices

Скилл обучает ИИ-агента писать стили по архитектуре 7-1 с директориями abstracts, base, components, layout, pages, themes и vendors. Модули собираются через современный синтаксис @use в main.scss. Стили компонентов оформляются строго по методологии БЭМ: блоки, элементы через два подчёркивания и модификаторы через два дефиса.

В правилах зафиксирован лимит вложенности: не глубже трёх уровней. Это предотвращает войну специфичности в CSS. Селекторы дальше четвёртого уровня агент будет выносить отдельно.

Инструкции также задают шкалы для отступов с базовым шагом 8px, z-index, скруглений, теней и адаптивных точек от 576px до 1400px. В набор входят готовые миксины для центрирования во flexbox, обрезки текста и доступности, включая класс visually-hidden и фокус по focus-visible.

Какие задачи решает

  • организовать структуру файлов SCSS по архитектуре 7-1
  • ограничить глубину вложенности селекторов тремя уровнями
  • внедрить правила БЭМ для компонентов
  • настроить единую сетку отступов и z-index через переменные

Примеры запросов агенту

  • Сверстай компонент карточки товара по БЭМ и правилам SCSS
  • Разбей текущую папку со стилями по архитектуре 7-1 через @use
  • Добавь адаптивный миксин для контрольных точек от 576px до 1400px

Как установить scss-best-practices

1Через Skills CLI (Vercel)

npx skills add Mindrally/skills --skill scss-best-practices -a claude-code

2Вручную: положить файлы

~/.claude/skills/scss-best-practices/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/scss-best-practices/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Вопросы о scss-best-practices

Как установить scss-best-practices в Claude Code?

Выполните в терминале команду npx skills add Mindrally/skills --skill scss-best-practices -a claude-code. Также файл инструкции можно поместить напрямую в ~/.claude/skills/scss-best-practices/SKILL.md.

Что делает скилл scss-best-practices?

Он направляет ИИ-агента при написании стилей, требуя соблюдения архитектуры 7-1, синтаксиса @use, именования по БЭМ и семантических переменных.

Какое максимальное ограничение по вложенности селекторов задаёт скилл?

Максимальная глубина вложенности ограничена тремя уровнями. Скилл запрещает делать селекторы глубже, чтобы избежать проблем со специфичностью CSS.

Исходный текст

SKILL.md · Apache-2.0
---
name: scss-best-practices
description: SCSS/Sassy CSS best practices and coding guidelines for maintainable, scalable stylesheets
metadata:
  maintainer: Mindrally
  source: https://github.com/Mindrally/skills
---

# SCSS Best Practices

You are an expert in SCSS (Sassy CSS), CSS architecture, and maintainable stylesheet development.

## Key Principles

- Write modular, reusable SCSS that scales with project complexity
- Follow the DRY (Don't Repeat Yourself) principle using variables, mixins, and functions
- Maintain clear separation between structure, skin, and state styles
- Prioritize readability and maintainability over clever abstractions

## File Organization

### Architecture Pattern (7-1 Pattern)
```
scss/
├── abstracts/
│   ├── _variables.scss    # Global variables
│   ├── _functions.scss    # SCSS functions
│   ├── _mixins.scss       # Reusable mixins
│   └── _placeholders.scss # Extendable placeholders
├── base/
│   ├── _reset.scss        # CSS reset/normalize
│   ├── _typography.scss   # Typography rules
│   └── _base.scss         # Base element styles
├── components/
│   ├── _buttons.scss      # Button components
│   ├── _cards.scss        # Card components
│   └── _forms.scss        # Form components
├── layout/
│   ├── _header.scss       # Header layout
│   ├── _footer.scss       # Footer layout
│   ├── _grid.scss         # Grid system
│   └── _navigation.scss   # Navigation layout
├── pages/
│   ├── _home.scss         # Home page specific
│   └── _contact.scss      # Contact page specific
├── themes/
│   └── _default.scss      # Default theme
├── vendors/
│   └── _bootstrap.scss    # Third-party overrides
└── main.scss              # Main manifest file
```

### Import Order
```scss
// main.scss
@use 'abstracts/variables';
@use 'abstracts/functions';
@use 'abstracts/mixins';
@use 'abstracts/placeholders';

@use 'vendors/normalize';

@use 'base/reset';
@use 'base/typography';
@use 'base/base';

@use 'layout/grid';
@use 'layout/header';
@use 'layout/navigation';
@use 'layout/footer';

@use 'components/buttons';
@use 'components/cards';
@use 'components/forms';

@use 'pages/home';

@use 'themes/default';
```

## Variables

### Naming Convention
```scss
// Use semantic, descriptive names
// Format: $category-property-variant

// Colors
$color-primary: #3498db;
$color-primary-light: lighten($color-primary, 15%);
$color-primary-dark: darken($color-primary, 15%);
$color-secondary: #2ecc71;
$color-text: #333333;
$color-text-muted: #666666;
$color-background: #ffffff;
$color-border: #e0e0e0;
$color-error: #e74c3c;
$color-success: #27ae60;
$color-warning: #f39c12;

// Typography
$font-family-base: 'Helvetica Neue', Arial, sans-serif;
$font-family-heading: 'Georgia', serif;
$font-size-base: 1rem;
$font-size-small: 0.875rem;
$font-size-large: 1.25rem;
$font-weight-normal: 400;
$font-weight-bold: 700;
$line-height-base: 1.5;

// Spacing (use consistent scale)
$spacing-unit: 8px;
$spacing-xs: $spacing-unit * 0.5;  // 4px
$spacing-sm: $spacing-unit;        // 8px
$spacing-md: $spacing-unit * 2;    // 16px
$spacing-lg: $spacing-unit * 3;    // 24px
$spacing-xl: $spacing-unit * 4;    // 32px
$spacing-xxl: $spacing-unit * 6;   // 48px

// Breakpoints
$breakpoint-sm: 576px;
$breakpoint-md: 768px;
$breakpoint-lg: 992px;
$breakpoint-xl: 1200px;
$breakpoint-xxl: 1400px;

// Z-index scale
$z-index-dropdown: 1000;
$z-index-sticky: 1020;
$z-index-fixed: 1030;
$z-index-modal-backdrop: 1040;
$z-index-modal: 1050;
$z-index-popover: 1060;
$z-index-tooltip: 1070;

// Transitions
$transition-base: 0.3s ease;
$transition-fast: 0.15s ease;
$transition-slow: 0.5s ease;

// Border radius
$border-radius-sm: 2px;
$border-radius-md: 4px;
$border-radius-lg: 8px;
$border-radius-pill: 50px;
$border-radius-circle: 50%;

// Shadows
$shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
$shadow-md: 0 4px 6px rgba(0, 0, 0, 0.1);
$shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1);
$shadow-xl: 0 20px 25px rgba(0, 0, 0, 0.15);
```

### Maps for Related Values
```scss
// Use maps for grouped values
$colors: (
  'primary': #3498db,
  'secondary': #2ecc71,
  'danger': #e74c3c,
  'warning': #f39c12,
  'info': #17a2b8,
  'success': #27ae60
);

$breakpoints: (
  'sm': 576px,
  'md': 768px,
  'lg': 992px,
  'xl': 1200px,
  'xxl': 1400px
);

// Access with map-get
.element {
  color: map-get($colors, 'primary');
}
```

## Mixins

### Responsive Breakpoints
```scss
@mixin respond-to($breakpoint) {
  @if map-has-key($breakpoints, $breakpoint) {
    @media (min-width: map-get($breakpoints, $breakpoint)) {
      @content;
    }
  } @else {
    @warn "Unknown breakpoint: #{$breakpoint}";
  }
}

// Usage
.element {
  width: 100%;

  @include respond-to('md') {
    width: 50%;
  }

  @include respond-to('lg') {
    width: 33.333%;
  }
}
```

### Flexbox Utilities
```scss
@mixin flex-center {
  display: flex;
  align-items: center;
  justify-content: center;
}

@mixin flex-between {
  display: flex;
  align-items: center;
  justify-content: space-between;
}

@mixin flex-column {
  display: flex;
  flex-direction: column;
}
```

### Typography
```scss
@mixin font-size($size, $line-height: null) {
  font-size: $size;
  @if $line-height {
    line-height: $line-height;
  }
}

@mixin truncate($lines: 1) {
  @if $lines == 1 {
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  } @else {
    display: -webkit-box;
    -webkit-line-clamp: $lines;
    -webkit-box-orient: vertical;
    overflow: hidden;
  }
}
```

### Accessibility
```scss
@mixin visually-hidden {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

@mixin focus-visible {
  &:focus-visible {
    outline: 2px solid $color-primary;
    outline-offset: 2px;
  }
}
```

## BEM Naming Convention

### Structure
```scss
// Block: Standalone component
// Element: Part of block (block__element)
// Modifier: Variant (block--modifier or block__element--modifier)

.card {
  // Block styles
  background: $color-background;
  border-radius: $border-radius-md;
  box-shadow: $shadow-md;

  // Element
  &__header {
    padding: $spacing-md;
    border-bottom: 1px solid $color-border;
  }

  &__title {
    margin: 0;
    font-size: $font-size-large;
    font-weight: $font-weight-bold;
  }

  &__body {
    padding: $spacing-md;
  }

  &__footer {
    padding: $spacing-md;
    border-top: 1px solid $color-border;
  }

  // Modifier
  &--featured {
    border: 2px solid $color-primary;
  }

  &--compact {
    .card__header,
    .card__body,
    .card__footer {
      padding: $spacing-sm;
    }
  }
}
```

## Nesting Rules

### Maximum Nesting Depth
```scss
// BAD: Too deep nesting
.nav {
  .nav-list {
    .nav-item {
      .nav-link {
        .nav-icon {
          // 5 levels deep - avoid this
        }
      }
    }
  }
}

// GOOD: Keep nesting to 3 levels maximum
.nav {
  // Level 1
}

.nav__list {
  // Level 1
}

.nav__item {
  // Level 1
}

.nav__link {
  color: $color-text;

  &:hover,
  &:focus {
    // Level 2 - acceptable for states
    color: $color-primary;
  }

  &--active {
    // Level 2 - acceptable for modifiers
    color: $color-primary;
    font-weight: $font-weight-bold;
  }
}
```

### Acceptable Nesting
```scss
.component {
  // Direct child pseudo-elements
  &::before,
  &::after {
    content: '';
  }

  // State modifiers
  &:hover,
  &:focus,
  &:active {
    // State styles
  }

  // BEM modifiers
  &--variant {
    // Modifier styles
  }

  // Media queries
  @include respond-to('md') {
    // Responsive styles
  }
}
```

## Functions

### Color Functions
```scss
@function tint($color, $percentage) {
  @return mix(white, $color, $percentage);
}

@function shade($color, $percentage) {
  @return mix(black, $color, $percentage);
}

// Usage
.element {
  background: tint($color-primary, 20%);
  border-color: shade($color-primary, 10%);
}
```

### Unit Conversion
```scss
@function px-to-rem($px, $base: 16) {
  @return ($px / $base) * 1rem;
}

@function rem-to-px($rem, $base: 16) {
  @return ($rem / 1rem) * $base * 1px;
}

// Usage
.element {
  font-size: px-to-rem(18); // 1.125rem
  padding: px-to-rem(24);   // 1.5rem
}
```

### Spacing Function
```scss
@function spacing($multiplier) {
  @return $spacing-unit * $multiplier;
}

// Usage
.element {
  margin-bottom: spacing(2); // 16px
  padding: spacing(3);       // 24px
}
```

## Extend and Placeholders

### Use Placeholders Over Classes
```scss
// Define placeholder
%button-base {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: $spacing-sm $spacing-md;
  border: none;
  border-radius: $border-radius-md;
  font-family: inherit;
  font-size: $font-size-base;
  font-weight: $font-weight-bold;
  text-decoration: none;
  cursor: pointer;
  transition: all $transition-base;

  &:disabled {
    opacity: 0.5;
    cursor: not-allowed;
  }
}

// Extend placeholder
.btn-primary {
  @extend %button-base;
  background: $color-primary;
  color: white;

  &:hover:not(:disabled) {
    background: darken($color-primary, 10%);
  }
}

.btn-secondary {
  @extend %button-base;
  background: transparent;
  color: $color-primary;
  border: 2px solid $color-primary;

  &:hover:not(:disabled) {
    background: $color-primary;
    color: white;
  }
}
```

## Loops and Iteration

### Generate Utility Classes
```scss
// Spacing utilities
$spacing-directions: (
  '': '',
  't': '-top',
  'r': '-right',
  'b': '-bottom',
  'l': '-left',
  'x': '-inline',
  'y': '-block'
);

@each $abbr, $direction in $spacing-directions {
  @for $i from 0 through 8 {
    .m#{$abbr}-#{$i} {
      margin#{$direction}: spacing($i);
    }
    .p#{$abbr}-#{$i} {
      padding#{$direction}: spacing($i);
    }
  }
}

// Color utilities
@each $name, $color in $colors {
  .text-#{$name} {
    color: $color;
  }
  .bg-#{$name} {
    background-color: $color;
  }
  .border-#{$name} {
    border-color: $color;
  }
}
```

## Performance Best Practices

- Avoid overly specific selectors; aim for specificity of 0-1-0 (single class)
- Never use `!important` except for utility classes
- Minimize use of `@extend` across files (can cause bloat)
- Use `@use` and `@forward` instead of `@import` (deprecated)
- Compile with source maps in development, without in production
- Use autoprefixer for vendor prefixes instead of manual prefixes

## Modern SCSS Features

### Module System
```scss
// _variables.scss
$primary: #3498db;

// _mixins.scss
@use 'variables' as vars;

@mixin themed-button {
  background: vars.$primary;
}

// main.scss
@use 'mixins';

.button {
  @include mixins.themed-button;
}
```

### Built-in Modules
```scss
@use 'sass:math';
@use 'sass:color';
@use 'sass:list';
@use 'sass:map';
@use 'sass:string';

.element {
  width: math.div(100%, 3);
  background: color.adjust($color-primary, $lightness: 10%);
}
```

## Code Style

- Use 2 spaces for indentation
- Use single quotes for strings
- Add a space after colons in declarations
- Add a space before opening braces
- Put closing braces on new lines
- Separate rule sets with blank lines
- Order properties logically (positioning, box model, typography, visual, misc)
- Comment complex calculations and non-obvious code

© Mindrally · Apache-2.0 · Mindrally/skills

Похожие скиллы

Всё по теме «Фронтенд и UI» →
converting-css-modules-to-tailwind spencerpauly Переводит компонент с CSS Modules на утилитарные классы Tailwind: разбирает styles.xxx, чистит импорты и удаляет файл модуля. CX Codex +1 392установок liquid-theme-standards benjaminsehl Скилл задаёт правила вёрстки и клиентских скриптов для тем Shopify. Помогает писать предсказуемый код в файлах .liquid и ресурсах ассетов. CX Codex +1 2 900установок css-architecture aj-geddes Скилл для ИИ-агента, который помогает разложить CSS по методологиям BEM, SMACSS и CSS-in-JS. Пригодится, когда стили в проекте растут быстрее, чем вы успеваете их переименовывать. CX Codex +1 959установок tailwind-4 prowler-cloud Скилл ведёт агента по стилизации на Tailwind CSS 4: что писать в className, когда нужен style, а когда cn(). Пригодится, если в проекте есть CSS-переменные и условные классы. CX Codex +1 612установок react-container-presentation-component официальный github Скилл создаёт React-компонент по паттерну Container/Presentation и раскладывает файлы по соглашениям TypeScript, Storybook и SCSS. 65установок shiny-bslib-theming Garrick Aden-Buie (@gadenbuie) Скилл для оформления Shiny-приложений через bslib и Bootstrap 5: пресеты, цвета, шрифты, тёмный режим и живую подстройку темы. CX Codex +1 746установок

Из того же набора236

scrapy-web-scraping Скилл для ИИ-агента, который ведёт разработку краулеров на Scrapy: пауки, извлечение данных, пайплайны и настройки продакшена. CX Codex +1 2 000установок deep-learning-pytorch Помогает агенту писать и проверять код для обучения моделей, LLM и диффузионных пайплайнов на PyTorch. Пригодится для разработки и оценки моделей, а также создания демо на Gradio. CX Codex +1 1 800установок puppeteer-automation Скилл для браузерной автоматизации на Puppeteer: навигация, клики, скриншоты, PDF и перехват сетевых запросов в headless Chrome. CX Codex +1 1 800установок htmx Правила разработки на HTMX: агент пишет разметку с hx-атрибутами и отдаёт с сервера только нужные фрагменты HTML. CX Codex +1 1 700установок jwt-security Скилл задаёт агенту правила создания, проверки и хранения JWT: белый список алгоритмов, обязательные claim-ы, короткие сроки жизни токенов. CX Codex +1 1 600установок flask-python Набор правил по Flask для ИИ-ассистентов. Задаёт паттерны фабрики приложений, синтаксис Marshmallow и организацию маршрутов через блюпринты. CX Codex +1 1 500установок postgresql-best-practices Скилл с правилами разработки на PostgreSQL: типы данных, схема, индексы, разбор планов запросов и обслуживание базы. CX Codex +1 1 500установок tailwindcss Задаёт агенту стиль работы с TailwindCSS: утилитарные классы прямо в разметке, мобильный первым, тёмная тема через вариант dark:. CX Codex +1 1 500установок

Спонсоры проекта

Компании, которые помогают держать аналитику открытой