Узнайте, как структурировать ваши SCSS-файлы и использовать переменные Bootstrap по всему Angular-проекту для масштабируемых и настраиваемых дизайн-систем.

В предыдущей части мы рассмотрели, как настроить UI-библиотеку в проекте, используя Bootstrap в качестве примера. Результатом стал новый проект Angular с установленным пакетом NG Bootstrap и возможностью добавлять или удалять выбранные компоненты.

SCSS variables

Структура ваших стилей

Обычно я использую следующую структуру глобальных стилей в проекте. Такой подход обеспечивает гибкую, читаемую и легкую в поддержке систему стилей — что критично для крупных проектов, которые могут длиться месяцами или даже годами:

/src
  /styles
    /common
    /components
    /forms
    /mixins
    /variables
    /vendor
    ├── app.scss
    ├── vendor.scss
  styles.scss

Разберём каждую папку:

  • Common: содержит типографику, подключённые шрифты, иконки и базовые стили, используемые по всему проекту (например, container.scss или helpers.scss).

  • Components: хранит стили, относящиеся к конкретным компонентам.

  • Forms: включает стили для элементов форм, которые требуют дополнительной кастомизации помимо того, что можно сделать с помощью переменных Bootstrap.

  • Mixins: содержит миксины для переиспользуемых паттернов. Папка необязательна, если вы не используете их.

  • Variables: хранит переменные Bootstrap и любые другие переменные, необходимые для проекта.

  • Vendor: содержит измененные компоненты Bootstrap, которые нельзя настроить только через переменные.

Мы подробно рассмотрим каждую из них в следующих статьях. Пока все папки, кроме variables, следует оставить пустыми.


Переменные Bootstrap

Ключевая часть нашей настройки — файл с переменными Bootstrap. Как и многие другие CSS-фреймворки, Bootstrap имеет большое количество внутренних переменных, которые являются фундаментом их дизайн-системы. Это позволяет кастомизировать множество элементов без написания дополнительного CSS-кода. Файл с переменными содержит более 1000 значений для компонентов, что позволяет гибко их изменять.

Пример — фрагмент с настройками стилей кнопок. Здесь можно кастомизировать цвета, отступы, размеры шрифта и другие параметры:

// Buttons
//
// For each of Bootstrap's buttons, define text, background, and border color.

// scss-docs-start btn-variables
$btn-color:                   var(--#{$prefix}body-color) !default;
$btn-padding-y:               $input-btn-padding-y !default;
$btn-padding-x:               $input-btn-padding-x !default;
$btn-font-family:             $input-btn-font-family !default;
$btn-font-size:               $input-btn-font-size !default;
$btn-line-height:             $input-btn-line-height !default;
$btn-white-space:             null !default; // Set to `nowrap` to prevent text wrapping

$btn-padding-y-sm:            $input-btn-padding-y-sm !default;
$btn-padding-x-sm:            $input-btn-padding-x-sm !default;
$btn-font-size-sm:            $input-btn-font-size-sm !default;

$btn-padding-y-lg:            $input-btn-padding-y-lg !default;
$btn-padding-x-lg:            $input-btn-padding-x-lg !default;
$btn-font-size-lg:            $input-btn-font-size-lg !default;

$btn-border-width:            $input-btn-border-width !default;

Добавление переменных Bootstrap в проект

Чтобы использовать переменные Bootstrap, скопируйте файл _variables.scss из пакета Bootstrap:

/node_modules/bootstrap/scss/_variables.scss

Переименуйте его и поместите в:

/src/styles/variables/_bootstrap.scss

Важный момент: удалите все флаги !default после копирования файла. Эти флаги мешают перезаписыванию переменных и не дадут вашим изменениям вступить в силу. Подробнее об этом можно прочитать в официальной документации Sass.

Далее обновите vendor.scss:

...
@import 'bootstrap/scss/functions';
@import 'bootstrap/scss/variables';
// @import 'bootstrap/scss/variables-dark';
@import 'bootstrap/scss/maps';
@import 'bootstrap/scss/mixins';
@import 'bootstrap/scss/utilities';

// custom variables
@import 'variables/_bootstrap';
...

Таким образом, мы сначала импортируем дефолтные переменные Bootstrap, чтобы сохранить совместимость с будущими версиями, а затем импортируем собственный файл _bootstrap.scss для их переопределения.


Кастомизация переменных Bootstrap

Давайте попробуем поменять основной цвет проекта. В файле _bootstrap.scss  измените следующее:

...
$primary: $red; // поменяйте значение с $blue на $red 
$secondary: $gray-600;
$success: $green;
...
Кнопка Primary
Кнопка Primary

Теперь фон кнопки Primary поменялся с синего на красный без дополнительных стилей. Более того, вся дизайн-система поменялась соответствующе — обновились состояния кнопок hoveractivedisabled, а также все компоненты Bootstrap (input, checkbox, datepicker и др.), которые используют переменную $primary.


Стили компонентов Angular

В Angular каждый компонент может иметь не только HTML-шаблон, но и собственные CSS-стили, написанные на SCSS или LESS. Стили, определённые в файле компонента, применяются только к нему и не влияют на глобальные стили или другие страницы.

Однако, при построении дизайн-системы важно переиспользовать SCSS-переменные по всему проекту. В нашем случае важно, чтобы переменные Bootstrap были доступны внутри стилей компонентов. Это позволит менять внешний вид проекта через переменные, а не писать новый CSS-код.

Для этого импортируйте файл с переменными в SCSS-файл компонента:

@import 'variables/bootstrap';

// вы можете использовать переменные Bootstrap внутри своего компонента
.hero {
  background-color: $primary;    
  color: $white;    
  padding: 20px;
}

Чтобы не использовать относительные пути при импортах, обновите angular.json:

"build": {  
  ...  
  "options": {    
    ...    
    "stylePreprocessorOptions": {      
      "includePaths": [        
        "src/styles/"      
      ],    
    }    
    ...  
  }
}

Теперь обновите styles.scss:

@import 'vendor.scss';
@import 'app.scss';

После этого вы сможете использовать переменные Bootstrap в любом Angular-компоненте без указания относительных путей.


Использование того же подхода в NX

Для проектов, использующих архитектуру NX, настройка похожа, но с некоторыми нюансами. Вместо хранения стилей в папке приложения, создайте отдельную общую библиотеку для стилей и обновите project.json.

NX — это мощный монорепозиторный фреймворк для управления несколькими приложениями в одном репозитории. Он предоставляет инструменты для шаринга кода, оптимизированной сборки и модульной архитектуры, что делает его отличным выбором для крупных проектов Angular.

"build": {  
  ...  
  "options": {    
    ...    
    "stylePreprocessorOptions": {      
      "includePaths": [        
        // ui-styles — название библиотеки со стилями        
        "libs/ui-styles/src/lib"      
      ],    
    }    
    ...  
  }
}

Таким образом, стили и переменные можно переиспользовать в нескольких приложениях или библиотеках внутри рабочего пространства NX.


Заключение

В этой статье мы рассмотрели, как использовать переменные Bootstrap в вашем проекте. В итоге, вы получили:

  1. Структурированный подход к организации стилей.

  2. Единый файл для управления переменными Bootstrap, упрощающий кастомизацию.

  3. Возможность использовать Bootstrap-переменные внутри стилей компонентов Angular.

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